| { |
| "$schema": "http://json-schema.org/draft-07/schema#", |
| "$id": "https://airflow.apache.com/schemas/serialized-dags.json", |
| "definitions": { |
| "datetime": { |
| "description": "A date time, stored as fractional seconds since the epoch", |
| "type": "number" |
| }, |
| "timedelta": { |
| "type": "number", |
| "minimum": 0 |
| }, |
| "typed_timedelta": { |
| "type": "object", |
| "properties": { |
| "__type": { |
| "type": "string", |
| "const": "timedelta" |
| }, |
| "__var": { "$ref": "#/definitions/timedelta" } |
| }, |
| "required": [ |
| "__type", |
| "__var" |
| ], |
| "additionalProperties": false |
| }, |
| "typed_relativedelta": { |
| "type": "object", |
| "description": "A dateutil.relativedelta.relativedelta object", |
| "properties": { |
| "__type": { |
| "type": "string", |
| "const": "relativedelta" |
| }, |
| "__var": { |
| "type": "object", |
| "properties": { |
| "weekday": { |
| "type": "array", |
| "items": { "type": "integer" }, |
| "minItems": 1, |
| "maxItems": 2 |
| } |
| }, |
| "additionalProperties": { "type": "integer" } |
| } |
| } |
| }, |
| "timezone": { |
| "anyOf": [ |
| { "type": "string" }, |
| { "type": "integer" } |
| ] |
| }, |
| "asset_definition": { |
| "type": "object", |
| "properties": { |
| "uri": { "type": "string" }, |
| "name": { "type": "string" }, |
| "group": { "type": "string" }, |
| "extra": { |
| "anyOf": [ |
| {"type": "null"}, |
| { "$ref": "#/definitions/dict" } |
| ] |
| }, |
| "watchers": { |
| "type": "array", |
| "items": { "$ref": "#/definitions/trigger" } |
| } |
| }, |
| "required": [ "uri", "extra" ] |
| }, |
| "asset": { |
| "type": "object", |
| "properties": { |
| "uri": { "type": "string" }, |
| "extra": { |
| "anyOf": [ |
| {"type": "null"}, |
| { "$ref": "#/definitions/dict" } |
| ] |
| } |
| }, |
| "required": [ "uri", "extra" ] |
| }, |
| "typed_asset": { |
| "type": "object", |
| "properties": { |
| "__type": { |
| "type": "string", |
| "constant": "asset" |
| }, |
| "__var": { "$ref": "#/definitions/asset" } |
| }, |
| "required": [ |
| "__type", |
| "__var" |
| ], |
| "additionalProperties": false |
| }, |
| "typed_asset_cond": { |
| "type": "object", |
| "properties": { |
| "__type": { |
| "anyOf": [{ |
| "type": "string", |
| "constant": "asset_or" |
| }, |
| { |
| "type": "string", |
| "constant": "asset_and" |
| } |
| ] |
| }, |
| "__var": { |
| "type": "array", |
| "items": { |
| "anyOf": [ |
| {"$ref": "#/definitions/typed_asset"}, |
| { "$ref": "#/definitions/typed_asset_cond"} |
| ] |
| } |
| } |
| }, |
| "required": [ |
| "__type", |
| "__var" |
| ], |
| "additionalProperties": false |
| }, |
| "trigger": { |
| "type": "object", |
| "properties": { |
| "classpath": { "type": "string" }, |
| "kwargs": { "$ref": "#/definitions/dict" } |
| }, |
| "required": [ "classpath", "kwargs" ] |
| }, |
| "dict": { |
| "description": "A python dictionary containing values of any type", |
| "type": "object" |
| }, |
| "arg_binding": { |
| "$comment": "One captured TaskFlow call argument of a @task.stub task. Materialized directly by _serialize_node, so it stays plain JSON with no {__type, __var} encoding. The object stays open so future binding fields keep validating on older cores", |
| "type": "object", |
| "properties": { |
| "name": { "type": "string" }, |
| "kind": { "type": "string", "enum": [ "xcom", "literal" ] }, |
| "value_schema": { "type": "object" }, |
| "task_id": { "type": "string" }, |
| "value": {}, |
| "from_default": { "type": "boolean" } |
| }, |
| "required": [ "name", "kind" ] |
| }, |
| "color": { |
| "type": "string", |
| "pattern": "^#[a-fA-F0-9]{3,6}$" |
| }, |
| "extra_links": { |
| "type": "array", |
| "items": { |
| "type": "object", |
| "minProperties": 1, |
| "maxProperties": 1 |
| } |
| }, |
| "dag_dependencies": { |
| "type": "array", |
| "items": { |
| "type": "object" |
| } |
| }, |
| "dag": { |
| "type": "object", |
| "properties": { |
| "params": { "$ref": "#/definitions/params" }, |
| "dag_id": { "type": "string" }, |
| "tasks": { "$ref": "#/definitions/tasks" }, |
| "timezone": { "$ref": "#/definitions/timezone" }, |
| "owner_links": { "type": "object" }, |
| "timetable": { |
| "type": "object", |
| "properties": { |
| "type": { "type": "string" }, |
| "value": { "$ref": "#/definitions/dict" } |
| } |
| }, |
| "catchup": { "type": "boolean" }, |
| "allowed_run_types": { |
| "anyOf": [ |
| { "type": "array", "items": { "type": "string" } }, |
| { "type": "null" } |
| ] |
| }, |
| "fail_fast": { "type": "boolean", "default": false }, |
| "fileloc": { "type" : "string"}, |
| "relative_fileloc": { "type" : "string"}, |
| "bundle_name": { "anyOf": [{ "type": "null" }, { "type": "string" }] }, |
| "_processor_dags_folder": { |
| "anyOf": [ |
| { "type": "null" }, |
| { "type": "string" } |
| ] |
| }, |
| "dag_display_name": { "type" : "string"}, |
| "description": { "type" : "string"}, |
| "deadline": { |
| "anyOf": [ |
| { "$ref": "#/definitions/dict" }, |
| { |
| "type": "array", |
| "items": { "$ref": "#/definitions/dict" } |
| }, |
| { |
| "$comment": "Once persisted, a Dag's deadline alerts live as rows in the deadline_alert table and the serialized Dag keeps only a list of UUID strings referencing them (see SerializedDagModel._generate_deadline_uuids). This branch lets the stored form validate at any lifecycle stage, not only before the dict->UUID rewrite.", |
| "type": "array", |
| "items": { "type": "string", |
| "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" |
| } |
| }, |
| { "type": "null" } |
| ] |
| }, |
| "_concurrency": { "type" : "number"}, |
| "max_active_tasks": { "type" : "number" }, |
| "max_active_runs": { "type" : "number" }, |
| "max_consecutive_failed_dag_runs": { "type" : "number" }, |
| "default_args": { "$ref": "#/definitions/dict" }, |
| "start_date": { "$ref": "#/definitions/datetime" }, |
| "end_date": { "$ref": "#/definitions/datetime" }, |
| "dagrun_timeout": { "$ref": "#/definitions/timedelta" }, |
| "doc_md": { "type" : "string"}, |
| "access_control": {"$ref": "#/definitions/dict" }, |
| "is_paused_upon_creation": { "type": "boolean" }, |
| "has_on_success_callback": { "type": "boolean", "default": false }, |
| "has_on_failure_callback": { "type": "boolean", "default": false }, |
| "render_template_as_native_obj": { "type": "boolean", "default": false }, |
| "tags": { "type": "array" }, |
| "task_group": {"anyOf": [ |
| { "type": "null" }, |
| { "$ref": "#/definitions/task_group" } |
| ]}, |
| "edge_info": { "$ref": "#/definitions/edge_info" }, |
| "dag_dependencies": { "$ref": "#/definitions/dag_dependencies" }, |
| "disable_bundle_versioning": {"type": "boolean" }, |
| "rerun_with_latest_version": {"type": ["boolean", "null"], "default": null} |
| }, |
| "required": [ |
| "dag_id", |
| "fileloc", |
| "tasks" |
| ], |
| "additionalProperties": false |
| }, |
| "tasks": { |
| "type": "array", |
| "items": { |
| "type": "object", |
| "required": [ "__type", "__var" ], |
| "properties": { |
| "__type": { "const": "operator" }, |
| "__var": { |
| "type": "object", |
| "required": [ "task_id" ], |
| "properties": { "task_id": { "type": "string" } } |
| } |
| } |
| } |
| }, |
| "params": { |
| "type": "array", |
| "prefixItems": [ |
| { "type": "string" }, |
| { "$ref": "#/definitions/param" } |
| ], |
| "unevaluatedItems": false |
| }, |
| "param": { |
| "$comment": "A param for a dag / operator", |
| "type": "object", |
| "required": [ |
| "__class", |
| "default" |
| ], |
| "properties": { |
| "__class": { "type": "string" }, |
| "default": {}, |
| "description": {"anyOf": [{"type":"string"}, {"type":"null"}]}, |
| "schema": { "$ref": "#/definitions/dict" } |
| } |
| }, |
| "operator": { |
| "$comment": "A task/operator in a DAG", |
| "type": "object", |
| "required": [ |
| "task_type", |
| "_task_module", |
| "task_id", |
| "ui_color", |
| "ui_fgcolor", |
| "template_fields" |
| ], |
| "properties": { |
| "task_type": { "type": "string", "default": "BaseOperator"}, |
| "_task_module": { "type": "string" }, |
| "_operator_extra_links": { "$ref": "#/definitions/extra_links" }, |
| "task_id": { "type": "string" }, |
| "_task_display_name": { "type": "string" }, |
| "owner": { "type": "string", "default": "airflow" }, |
| "start_date": { "$ref": "#/definitions/datetime" }, |
| "end_date": { "$ref": "#/definitions/datetime" }, |
| "trigger_rule": { "type": "string", "default": "all_success" }, |
| "depends_on_past": { "type": "boolean", "default": false }, |
| "ignore_first_depends_on_past": { "type": "boolean", "default": false }, |
| "wait_for_past_depends_before_skipping": { "type": "boolean", "default": false }, |
| "wait_for_downstream": { "type": "boolean", "default": false }, |
| "retries": { "type": "number", "default": 0 }, |
| "queue": { "type": "string", "default": "default" }, |
| "pool": { "type": "string", "default": "default_pool" }, |
| "pool_slots": { "type": "number", "default": 1 }, |
| "execution_timeout": { "$ref": "#/definitions/timedelta" }, |
| "retry_delay": { "$ref": "#/definitions/timedelta", "default": 300.0 }, |
| "retry_exponential_backoff": { "type": "number", "default": 0 }, |
| "max_retry_delay": { "$ref": "#/definitions/timedelta" }, |
| "params": { "$ref": "#/definitions/params" }, |
| "priority_weight": { "type": "number", "default": 1 }, |
| "weight_rule": { "type": "string", "default": "downstream" }, |
| "executor": { "type": "string" }, |
| "executor_config": { "$ref": "#/definitions/dict" }, |
| "do_xcom_push": { "type": "boolean", "default": true }, |
| "returns_dag_result": { "type": "boolean", "default": false }, |
| "email_on_failure": { "type": "boolean", "default": true }, |
| "email_on_retry": { "type": "boolean", "default": true }, |
| "ui_color": { "type": "string", "default": "#fff" }, |
| "ui_fgcolor": { "type": "string", "default": "#000" }, |
| "template_fields": { |
| "type": "array", |
| "items": { "type": "string" }, |
| "default": [] |
| }, |
| "template_ext": {"type": "array", "default": []}, |
| "template_fields_renderers": {"$ref": "#/definitions/dict", "default": {}}, |
| "downstream_task_ids": { |
| "type": "array", |
| "items": { "type": "string" }, |
| "default": [] |
| }, |
| "doc": { "type": "string" }, |
| "doc_md": { "type": "string" }, |
| "doc_json": { "type": "string" }, |
| "doc_yaml": { "type": "string" }, |
| "doc_rst": { "type": "string" }, |
| "_logger_name": { "type": "string" }, |
| "_needs_expansion": { "type": "boolean"}, |
| "_is_mapped": { "const": true, "$comment": "only present when True", "default": false }, |
| "_is_sensor": { "const": true, "$comment": "only present when True", "default": false }, |
| "partial_kwargs": { "type": "object" }, |
| "_disallow_kwargs_override": { "type": "boolean"}, |
| "_expand_input_attr": { "type": "string" }, |
| "map_index_template": { "type": "string" }, |
| "allow_nested_operators": { "type": "boolean", "default": true }, |
| "render_template_as_native_obj": { "anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null }, |
| "inlets": {"type": "array", "default": []}, |
| "outlets": {"type": "array", "default": []}, |
| "has_on_execute_callback": {"type": "boolean", "default": false}, |
| "has_on_failure_callback": {"type": "boolean", "default": false}, |
| "has_on_skipped_callback": {"type": "boolean", "default": false}, |
| "has_on_success_callback": {"type": "boolean", "default": false}, |
| "has_on_retry_callback": {"type": "boolean", "default": false}, |
| "multiple_outputs": {"type": "boolean", "default": false}, |
| "start_from_trigger": {"type": "boolean", "default": false}, |
| "start_trigger_args": {"type": "object", "default": null}, |
| "is_setup": {"type": "boolean", "default": false}, |
| "is_teardown": {"type": "boolean", "default": false}, |
| "on_failure_fail_dagrun": {"type": "boolean", "default": false}, |
| "max_active_tis_per_dag": {"type": "integer"}, |
| "max_active_tis_per_dagrun": {"type": "integer"}, |
| "_arg_bindings": { |
| "$comment": "Used for mixed-language tasks (the @task.stub operator) or tasks defined in a non-Python SDK Dag", |
| "type": "array", |
| "items": { "$ref": "#/definitions/arg_binding" } |
| } |
| }, |
| "dependencies": { |
| "expand_input": ["partial_kwargs", "_is_mapped"], |
| "partial_kwargs": ["expand_input", "_is_mapped"], |
| "_is_mapped": ["expand_input", "partial_kwargs"] |
| }, |
| "additionalProperties": true |
| }, |
| "task_group": { |
| "$comment": "A TaskGroup containing tasks", |
| "type": "object", |
| "required": [ |
| "_group_id", |
| "group_display_name", |
| "prefix_group_id", |
| "children", |
| "tooltip", |
| "ui_color", |
| "ui_fgcolor", |
| "upstream_group_ids", |
| "downstream_group_ids", |
| "upstream_task_ids", |
| "downstream_task_ids" |
| ], |
| "properties": { |
| "_group_id": {"anyOf": [{"type": "null"}, { "type": "string" }]}, |
| "group_display_name": {"type": "string" }, |
| "is_mapped": { "type": "boolean" }, |
| "loop": { |
| "type": "object", |
| "required": ["max_iterations", "has_until", "terminal_task_id", "gate_task_id"], |
| "properties": { |
| "max_iterations": { "type": "integer", "minimum": 1 }, |
| "has_until": { "type": "boolean" }, |
| "terminal_task_id": { "type": "string" }, |
| "gate_task_id": { "type": "string" } |
| }, |
| "additionalProperties": false |
| }, |
| "prefix_group_id": { "type": "boolean" }, |
| "children": { "$ref": "#/definitions/dict" }, |
| "tooltip": { "type": "string" }, |
| "doc_md": { |
| "anyOf": [ |
| { "type": "string" }, |
| { "type": "null" } |
| ]}, |
| "ui_color": { "type": "string" }, |
| "ui_fgcolor": { "type": "string" }, |
| "upstream_group_ids": { |
| "type": "array", |
| "items": { "type": "string" } |
| }, |
| "downstream_group_ids": { |
| "type": "array", |
| "items": { "type": "string" } |
| }, |
| "upstream_task_ids": { |
| "type": "array", |
| "items": { "type": "string" } |
| }, |
| "downstream_task_ids": { |
| "type": "array", |
| "items": { "type": "string" } |
| } |
| }, |
| "additionalProperties": false |
| }, |
| "edge_info": { |
| "$comment": "Metadata about DAG edges", |
| "type": "object", |
| "additionalProperties": { |
| "type": "object", |
| "additionalProperties": { |
| "type": "object", |
| "properties": { |
| "label": { "type": "string" } |
| }, |
| "required": ["label"], |
| "additionalProperties": false |
| } |
| } |
| } |
| }, |
| |
| "type": "object", |
| "allOf": [ |
| { |
| "type": "object", |
| "properties": { |
| "__version": { |
| "type": "integer", |
| "exclusiveMinimum": 0 |
| }, |
| "dag": { "$ref": "#/definitions/dag" }, |
| "client_defaults": { |
| "type": "object", |
| "description": "SDK-specific default values that differ from schema defaults", |
| "properties": { |
| "tasks": { |
| "type": "object", |
| "description": "Task-level default overrides" |
| } |
| }, |
| "additionalProperties": false |
| } |
| }, |
| "additionalProperties": false, |
| "required": [ "__version", "dag" ] |
| } |
| ] |
| } |