This is an automated email from the ASF dual-hosted git repository. ash pushed a commit to branch v2-0-test in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 5dd51dc903933457e3f2978c22d8e0f98eb24ff1 Author: Ephraim Anierobi <[email protected]> AuthorDate: Wed Mar 3 15:39:02 2021 +0100 Bugfix: Fix wrong output of tags and owners in dag detail API endpoint (#14490) * fix wrong output of tags and owners in dag detail endpoint * fixup! fix wrong output of tags and owners in dag detail endpoint * fixup! fixup! fix wrong output of tags and owners in dag detail endpoint (cherry picked from commit 4424d10f05fa268b54c81ef8b96a0745643690b6) --- airflow/api_connexion/schemas/dag_schema.py | 36 ++++++++++++++++------ tests/api_connexion/endpoints/test_dag_endpoint.py | 28 ++++++++++------- tests/api_connexion/schemas/test_dag_schema.py | 3 +- 3 files changed, 46 insertions(+), 21 deletions(-) diff --git a/airflow/api_connexion/schemas/dag_schema.py b/airflow/api_connexion/schemas/dag_schema.py index b15fbd6..aabd215 100644 --- a/airflow/api_connexion/schemas/dag_schema.py +++ b/airflow/api_connexion/schemas/dag_schema.py @@ -21,6 +21,7 @@ from itsdangerous import URLSafeSerializer from marshmallow import Schema, fields from marshmallow_sqlalchemy import SQLAlchemySchema, auto_field +from airflow import DAG from airflow.api_connexion.schemas.common_schema import ScheduleIntervalSchema, TimeDeltaSchema, TimezoneField from airflow.configuration import conf from airflow.models.dag import DagModel, DagTag @@ -73,15 +74,32 @@ class DAGSchema(SQLAlchemySchema): class DAGDetailSchema(DAGSchema): """DAG details""" - timezone = TimezoneField(dump_only=True) - catchup = fields.Boolean(dump_only=True) - orientation = fields.String(dump_only=True) - concurrency = fields.Integer(dump_only=True) - start_date = fields.DateTime(dump_only=True) - dag_run_timeout = fields.Nested(TimeDeltaSchema, dump_only=True, attribute="dagrun_timeout") - doc_md = fields.String(dump_only=True) - default_view = fields.String(dump_only=True) - params = fields.Dict(dump_only=True) + owners = fields.Method("get_owners", dump_only=True) + timezone = TimezoneField() + catchup = fields.Boolean() + orientation = fields.String() + concurrency = fields.Integer() + start_date = fields.DateTime() + dag_run_timeout = fields.Nested(TimeDeltaSchema, attribute="dagrun_timeout") + doc_md = fields.String() + default_view = fields.String() + params = fields.Dict() + tags = fields.Method("get_tags", dump_only=True) + + @staticmethod + def get_tags(obj: DAG): + """Dumps tags as objects""" + tags = obj.tags + if tags: + return [DagTagSchema().dump(dict(name=tag)) for tag in tags] + return [] + + @staticmethod + def get_owners(obj: DAG): + """Convert owners attribute to DAG representation""" + if not getattr(obj, 'owner', None): + return [] + return obj.owner.split(",") class DAGCollection(NamedTuple): diff --git a/tests/api_connexion/endpoints/test_dag_endpoint.py b/tests/api_connexion/endpoints/test_dag_endpoint.py index 146720c..6041b5f 100644 --- a/tests/api_connexion/endpoints/test_dag_endpoint.py +++ b/tests/api_connexion/endpoints/test_dag_endpoint.py @@ -75,7 +75,13 @@ class TestDagEndpoint(unittest.TestCase): access_control={'TestGranularDag': [permissions.ACTION_CAN_EDIT, permissions.ACTION_CAN_READ]}, ) - with DAG(cls.dag_id, start_date=datetime(2020, 6, 15), doc_md="details", params={"foo": 1}) as dag: + with DAG( + cls.dag_id, + start_date=datetime(2020, 6, 15), + doc_md="details", + params={"foo": 1}, + tags=['example'], + ) as dag: DummyOperator(task_id=cls.task_id) with DAG(cls.dag2_id, start_date=datetime(2020, 6, 15)) as dag2: # no doc_md @@ -212,7 +218,7 @@ class TestGetDagDetails(TestDagEndpoint): "is_paused": None, "is_subdag": False, "orientation": "LR", - "owners": [], + "owners": ['airflow'], "params": {"foo": 1}, "schedule_interval": { "__type": "TimeDelta", @@ -221,7 +227,7 @@ class TestGetDagDetails(TestDagEndpoint): "seconds": 0, }, "start_date": "2020-06-15T00:00:00+00:00", - "tags": None, + "tags": [{'name': 'example'}], "timezone": "Timezone('UTC')", } assert response.json == expected @@ -244,7 +250,7 @@ class TestGetDagDetails(TestDagEndpoint): "is_paused": None, "is_subdag": False, "orientation": "LR", - "owners": [], + "owners": ['airflow'], "params": {}, "schedule_interval": { "__type": "TimeDelta", @@ -253,7 +259,7 @@ class TestGetDagDetails(TestDagEndpoint): "seconds": 0, }, "start_date": "2020-06-15T00:00:00+00:00", - "tags": None, + "tags": [], "timezone": "Timezone('UTC')", } assert response.json == expected @@ -276,7 +282,7 @@ class TestGetDagDetails(TestDagEndpoint): "is_paused": None, "is_subdag": False, "orientation": "LR", - "owners": [], + "owners": ['airflow'], "params": {}, "schedule_interval": { "__type": "TimeDelta", @@ -285,7 +291,7 @@ class TestGetDagDetails(TestDagEndpoint): "seconds": 0, }, "start_date": None, - "tags": None, + "tags": [], "timezone": "Timezone('UTC')", } assert response.json == expected @@ -313,7 +319,7 @@ class TestGetDagDetails(TestDagEndpoint): "is_paused": None, "is_subdag": False, "orientation": "LR", - "owners": [], + "owners": ['airflow'], "params": {"foo": 1}, "schedule_interval": { "__type": "TimeDelta", @@ -322,7 +328,7 @@ class TestGetDagDetails(TestDagEndpoint): "seconds": 0, }, "start_date": "2020-06-15T00:00:00+00:00", - "tags": None, + "tags": [{'name': 'example'}], "timezone": "Timezone('UTC')", } response = client.get( @@ -349,11 +355,11 @@ class TestGetDagDetails(TestDagEndpoint): 'is_paused': None, 'is_subdag': False, 'orientation': 'LR', - 'owners': [], + 'owners': ['airflow'], "params": {"foo": 1}, 'schedule_interval': {'__type': 'TimeDelta', 'days': 1, 'microseconds': 0, 'seconds': 0}, 'start_date': '2020-06-15T00:00:00+00:00', - 'tags': None, + 'tags': [{'name': 'example'}], 'timezone': "Timezone('UTC')", } assert response.json == expected diff --git a/tests/api_connexion/schemas/test_dag_schema.py b/tests/api_connexion/schemas/test_dag_schema.py index 2811bf3..96aba1f 100644 --- a/tests/api_connexion/schemas/test_dag_schema.py +++ b/tests/api_connexion/schemas/test_dag_schema.py @@ -107,6 +107,7 @@ class TestDAGDetailSchema: orientation="LR", default_view="duration", params={"foo": 1}, + tags=['example1', 'example2'], ) schema = DAGDetailSchema() expected = { @@ -126,7 +127,7 @@ class TestDAGDetailSchema: 'params': {'foo': 1}, 'schedule_interval': {'__type': 'TimeDelta', 'days': 1, 'seconds': 0, 'microseconds': 0}, 'start_date': '2020-06-19T00:00:00+00:00', - 'tags': None, + 'tags': [{'name': "example1"}, {'name': "example2"}], 'timezone': "Timezone('UTC')", } assert schema.dump(dag) == expected
