# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

"""
    Airflow API (Stable)

    # Overview  To facilitate management, Apache Airflow supports a range of REST API endpoints across its objects. This section provides an overview of the API design, methods, and supported use cases.  Most of the endpoints accept `JSON` as input and return `JSON` responses. This means that you must usually add the following headers to your request: ``` Content-type: application/json Accept: application/json ```  ## Resources  The term `resource` refers to a single type of object in the Airflow metadata. An API is broken up by its endpoint's corresponding resource. The name of a resource is typically plural and expressed in camelCase. Example: `dagRuns`.  Resource names are used as part of endpoint URLs, as well as in API parameters and responses.  ## CRUD Operations  The platform supports **C**reate, **R**ead, **U**pdate, and **D**elete operations on most resources. You can review the standards for these operations and their standard parameters below.  Some endpoints have special behavior as exceptions.  ### Create  To create a resource, you typically submit an HTTP `POST` request with the resource's required metadata in the request body. The response returns a `201 Created` response code upon success with the resource's metadata, including its internal `id`, in the response body.  ### Read  The HTTP `GET` request can be used to read a resource or to list a number of resources.  A resource's `id` can be submitted in the request parameters to read a specific resource. The response usually returns a `200 OK` response code upon success, with the resource's metadata in the response body.  If a `GET` request does not include a specific resource `id`, it is treated as a list request. The response usually returns a `200 OK` response code upon success, with an object containing a list of resources' metadata in the response body.  When reading resources, some common query parameters are usually available. e.g.: ``` v1/connections?limit=25&offset=25 ```  |Query Parameter|Type|Description| |---------------|----|-----------| |limit|integer|Maximum number of objects to fetch. Usually 25 by default| |offset|integer|Offset after which to start returning objects. For use with limit query parameter.|  ### Update  Updating a resource requires the resource `id`, and is typically done using an HTTP `PATCH` request, with the fields to modify in the request body. The response usually returns a `200 OK` response code upon success, with information about the modified resource in the response body.  ### Delete  Deleting a resource requires the resource `id` and is typically executing via an HTTP `DELETE` request. The response usually returns a `204 No Content` response code upon success.  ## Conventions  - Resource names are plural and expressed in camelCase. - Names are consistent between URL parameter name and field name.  - Field names are in snake_case. ```json {     \"name\": \"string\",     \"slots\": 0,     \"occupied_slots\": 0,     \"used_slots\": 0,     \"queued_slots\": 0,     \"open_slots\": 0 } ```  ### Update Mask  Update mask is available as a query parameter in patch endpoints. It is used to notify the API which fields you want to update. Using `update_mask` makes it easier to update objects by helping the server know which fields to update in an object instead of updating all fields. The update request ignores any fields that aren't specified in the field mask, leaving them with their current values.  Example: ```   resource = request.get('/resource/my-id').json()   resource['my_field'] = 'new-value'   request.patch('/resource/my-id?update_mask=my_field', data=json.dumps(resource)) ```  ## Versioning and Endpoint Lifecycle  - API versioning is not synchronized to specific releases of the Apache Airflow. - APIs are designed to be backward compatible. - Any changes to the API will first go through a deprecation phase.  # Trying the API  You can use a third party client, such as [curl](https://curl.haxx.se/), [HTTPie](https://httpie.org/), [Postman](https://www.postman.com/) or [the Insomnia rest client](https://insomnia.rest/) to test the Apache Airflow API.  Note that you will need to pass credentials data.  For e.g., here is how to pause a DAG with [curl](https://curl.haxx.se/), when basic authorization is used: ```bash curl -X PATCH 'https://example.com/api/v1/dags/{dag_id}?update_mask=is_paused' \\ -H 'Content-Type: application/json' \\ --user \"username:password\" \\ -d '{     \"is_paused\": true }' ```  Using a graphical tool such as [Postman](https://www.postman.com/) or [Insomnia](https://insomnia.rest/), it is possible to import the API specifications directly:  1. Download the API specification by clicking the **Download** button at top of this document 2. Import the JSON specification in the graphical tool of your choice.   - In *Postman*, you can click the **import** button at the top   - With *Insomnia*, you can just drag-and-drop the file on the UI  Note that with *Postman*, you can also generate code snippets by selecting a request and clicking on the **Code** button.  ## Enabling CORS  [Cross-origin resource sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is a browser security feature that restricts HTTP requests that are initiated from scripts running in the browser.  For details on enabling/configuring CORS, see [Enabling CORS](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html).  # Authentication  To be able to meet the requirements of many organizations, Airflow supports many authentication methods, and it is even possible to add your own method.  If you want to check which auth backend is currently set, you can use `airflow config get-value api auth_backends` command as in the example below. ```bash $ airflow config get-value api auth_backends airflow.api.auth.backend.basic_auth ``` The default is to deny all requests.  For details on configuring the authentication, see [API Authorization](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html).  # Errors  We follow the error response format proposed in [RFC 7807](https://tools.ietf.org/html/rfc7807) also known as Problem Details for HTTP APIs. As with our normal API responses, your client must be prepared to gracefully handle additional members of the response.  ## Unauthenticated  This indicates that the request has not been applied because it lacks valid authentication credentials for the target resource. Please check that you have valid credentials.  ## PermissionDenied  This response means that the server understood the request but refuses to authorize it because it lacks sufficient rights to the resource. It happens when you do not have the necessary permission to execute the action you performed. You need to get the appropriate permissions in other to resolve this error.  ## BadRequest  This response means that the server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). To resolve this, please ensure that your syntax is correct.  ## NotFound  This client error response indicates that the server cannot find the requested resource.  ## MethodNotAllowed  Indicates that the request method is known by the server but is not supported by the target resource.  ## NotAcceptable  The target resource does not have a current representation that would be acceptable to the user agent, according to the proactive negotiation header fields received in the request, and the server is unwilling to supply a default representation.  ## AlreadyExists  The request could not be completed due to a conflict with the current state of the target resource, e.g. the resource it tries to create already exists.  ## Unknown  This means that the server encountered an unexpected condition that prevented it from fulfilling the request.   # noqa: E501

    The version of the OpenAPI document: 2.3.0
    Contact: dev@airflow.apache.org
    Generated by: https://openapi-generator.tech
"""


import re  # noqa: F401
import sys  # noqa: F401

from airflow_client.client.model_utils import (  # noqa: F401
    ApiTypeError,
    ModelComposed,
    ModelNormal,
    ModelSimple,
    cached_property,
    change_keys_js_to_python,
    convert_js_args_to_python_args,
    date,
    datetime,
    file_type,
    none_type,
    validate_get_composed_info,
)
from ..model_utils import OpenApiModel
from airflow_client.client.exceptions import ApiAttributeError


def lazy_import():
    from airflow_client.client.model.class_reference import ClassReference
    from airflow_client.client.model.color import Color
    from airflow_client.client.model.dag import DAG
    from airflow_client.client.model.task_extra_links import TaskExtraLinks
    from airflow_client.client.model.time_delta import TimeDelta
    from airflow_client.client.model.trigger_rule import TriggerRule
    from airflow_client.client.model.weight_rule import WeightRule
    globals()['ClassReference'] = ClassReference
    globals()['Color'] = Color
    globals()['DAG'] = DAG
    globals()['TaskExtraLinks'] = TaskExtraLinks
    globals()['TimeDelta'] = TimeDelta
    globals()['TriggerRule'] = TriggerRule
    globals()['WeightRule'] = WeightRule


class Task(ModelNormal):
    """NOTE: This class is auto generated by OpenAPI Generator.
    Ref: https://openapi-generator.tech

    Do not edit the class manually.

    Attributes:
      allowed_values (dict): The key is the tuple path to the attribute
          and the for var_name this is (var_name,). The value is a dict
          with a capitalized key describing the allowed value and an allowed
          value. These dicts store the allowed enum values.
      attribute_map (dict): The key is attribute name
          and the value is json key in definition.
      discriminator_value_class_map (dict): A dict to go from the discriminator
          variable value to the discriminator class name.
      validations (dict): The key is the tuple path to the attribute
          and the for var_name this is (var_name,). The value is a dict
          that stores validations for max_length, min_length, max_items,
          min_items, exclusive_maximum, inclusive_maximum, exclusive_minimum,
          inclusive_minimum, and regex.
      additional_properties_type (tuple): A tuple of classes accepted
          as additional properties values.
    """

    allowed_values = {
    }

    validations = {
    }

    @cached_property
    def additional_properties_type():
        """
        This must be a method because a model may have properties that are
        of type self, this must run after the class is loaded
        """
        lazy_import()
        return (bool, date, datetime, dict, float, int, list, str, none_type,)  # noqa: E501

    _nullable = False

    @cached_property
    def openapi_types():
        """
        This must be a method because a model may have properties that are
        of type self, this must run after the class is loaded

        Returns
            openapi_types (dict): The key is attribute name
                and the value is attribute type.
        """
        lazy_import()
        return {
            'class_ref': (ClassReference,),  # noqa: E501
            'task_id': (str,),  # noqa: E501
            'owner': (str,),  # noqa: E501
            'start_date': (datetime,),  # noqa: E501
            'end_date': (datetime, none_type,),  # noqa: E501
            'trigger_rule': (TriggerRule,),  # noqa: E501
            'extra_links': ([TaskExtraLinks],),  # noqa: E501
            'depends_on_past': (bool,),  # noqa: E501
            'is_mapped': (bool,),  # noqa: E501
            'wait_for_downstream': (bool,),  # noqa: E501
            'retries': (float,),  # noqa: E501
            'queue': (str, none_type,),  # noqa: E501
            'pool': (str,),  # noqa: E501
            'pool_slots': (float,),  # noqa: E501
            'execution_timeout': (TimeDelta,),  # noqa: E501
            'retry_delay': (TimeDelta,),  # noqa: E501
            'retry_exponential_backoff': (bool,),  # noqa: E501
            'priority_weight': (float,),  # noqa: E501
            'weight_rule': (WeightRule,),  # noqa: E501
            'ui_color': (Color,),  # noqa: E501
            'ui_fgcolor': (Color,),  # noqa: E501
            'template_fields': ([str],),  # noqa: E501
            'sub_dag': (DAG,),  # noqa: E501
            'downstream_task_ids': ([str],),  # noqa: E501
        }

    @cached_property
    def discriminator():
        return None


    attribute_map = {
        'class_ref': 'class_ref',  # noqa: E501
        'task_id': 'task_id',  # noqa: E501
        'owner': 'owner',  # noqa: E501
        'start_date': 'start_date',  # noqa: E501
        'end_date': 'end_date',  # noqa: E501
        'trigger_rule': 'trigger_rule',  # noqa: E501
        'extra_links': 'extra_links',  # noqa: E501
        'depends_on_past': 'depends_on_past',  # noqa: E501
        'is_mapped': 'is_mapped',  # noqa: E501
        'wait_for_downstream': 'wait_for_downstream',  # noqa: E501
        'retries': 'retries',  # noqa: E501
        'queue': 'queue',  # noqa: E501
        'pool': 'pool',  # noqa: E501
        'pool_slots': 'pool_slots',  # noqa: E501
        'execution_timeout': 'execution_timeout',  # noqa: E501
        'retry_delay': 'retry_delay',  # noqa: E501
        'retry_exponential_backoff': 'retry_exponential_backoff',  # noqa: E501
        'priority_weight': 'priority_weight',  # noqa: E501
        'weight_rule': 'weight_rule',  # noqa: E501
        'ui_color': 'ui_color',  # noqa: E501
        'ui_fgcolor': 'ui_fgcolor',  # noqa: E501
        'template_fields': 'template_fields',  # noqa: E501
        'sub_dag': 'sub_dag',  # noqa: E501
        'downstream_task_ids': 'downstream_task_ids',  # noqa: E501
    }

    read_only_vars = {
        'task_id',  # noqa: E501
        'owner',  # noqa: E501
        'start_date',  # noqa: E501
        'end_date',  # noqa: E501
        'extra_links',  # noqa: E501
        'depends_on_past',  # noqa: E501
        'is_mapped',  # noqa: E501
        'wait_for_downstream',  # noqa: E501
        'retries',  # noqa: E501
        'queue',  # noqa: E501
        'pool',  # noqa: E501
        'pool_slots',  # noqa: E501
        'retry_exponential_backoff',  # noqa: E501
        'priority_weight',  # noqa: E501
        'template_fields',  # noqa: E501
        'downstream_task_ids',  # noqa: E501
    }

    _composed_schemas = {}

    @classmethod
    @convert_js_args_to_python_args
    def _from_openapi_data(cls, *args, **kwargs):  # noqa: E501
        """Task - a model defined in OpenAPI

        Keyword Args:
            _check_type (bool): if True, values for parameters in openapi_types
                                will be type checked and a TypeError will be
                                raised if the wrong type is input.
                                Defaults to True
            _path_to_item (tuple/list): This is a list of keys or values to
                                drill down to the model in received_data
                                when deserializing a response
            _spec_property_naming (bool): True if the variable names in the input data
                                are serialized names, as specified in the OpenAPI document.
                                False if the variable names in the input data
                                are pythonic names, e.g. snake case (default)
            _configuration (Configuration): the instance to use when
                                deserializing a file_type parameter.
                                If passed, type conversion is attempted
                                If omitted no type conversion is done.
            _visited_composed_classes (tuple): This stores a tuple of
                                classes that we have traveled through so that
                                if we see that class again we will not use its
                                discriminator again.
                                When traveling through a discriminator, the
                                composed schema that is
                                is traveled through is added to this set.
                                For example if Animal has a discriminator
                                petType and we pass in "Dog", and the class Dog
                                allOf includes Animal, we move through Animal
                                once using the discriminator, and pick Dog.
                                Then in Dog, we will make an instance of the
                                Animal class but this time we won't travel
                                through its discriminator because we passed in
                                _visited_composed_classes = (Animal,)
            class_ref (ClassReference): [optional]  # noqa: E501
            task_id (str): [optional]  # noqa: E501
            owner (str): [optional]  # noqa: E501
            start_date (datetime): [optional]  # noqa: E501
            end_date (datetime, none_type): [optional]  # noqa: E501
            trigger_rule (TriggerRule): [optional]  # noqa: E501
            extra_links ([TaskExtraLinks]): [optional]  # noqa: E501
            depends_on_past (bool): [optional]  # noqa: E501
            is_mapped (bool): [optional]  # noqa: E501
            wait_for_downstream (bool): [optional]  # noqa: E501
            retries (float): [optional]  # noqa: E501
            queue (str, none_type): [optional]  # noqa: E501
            pool (str): [optional]  # noqa: E501
            pool_slots (float): [optional]  # noqa: E501
            execution_timeout (TimeDelta): [optional]  # noqa: E501
            retry_delay (TimeDelta): [optional]  # noqa: E501
            retry_exponential_backoff (bool): [optional]  # noqa: E501
            priority_weight (float): [optional]  # noqa: E501
            weight_rule (WeightRule): [optional]  # noqa: E501
            ui_color (Color): [optional]  # noqa: E501
            ui_fgcolor (Color): [optional]  # noqa: E501
            template_fields ([str]): [optional]  # noqa: E501
            sub_dag (DAG): [optional]  # noqa: E501
            downstream_task_ids ([str]): [optional]  # noqa: E501
        """

        _check_type = kwargs.pop('_check_type', True)
        _spec_property_naming = kwargs.pop('_spec_property_naming', False)
        _path_to_item = kwargs.pop('_path_to_item', ())
        _configuration = kwargs.pop('_configuration', None)
        _visited_composed_classes = kwargs.pop('_visited_composed_classes', ())

        self = super(OpenApiModel, cls).__new__(cls)

        if args:
            raise ApiTypeError(
                "Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % (
                    args,
                    self.__class__.__name__,
                ),
                path_to_item=_path_to_item,
                valid_classes=(self.__class__,),
            )

        self._data_store = {}
        self._check_type = _check_type
        self._spec_property_naming = _spec_property_naming
        self._path_to_item = _path_to_item
        self._configuration = _configuration
        self._visited_composed_classes = _visited_composed_classes + (self.__class__,)

        for var_name, var_value in kwargs.items():
            if var_name not in self.attribute_map and \
                        self._configuration is not None and \
                        self._configuration.discard_unknown_keys and \
                        self.additional_properties_type is None:
                # discard variable.
                continue
            setattr(self, var_name, var_value)
        return self

    required_properties = set([
        '_data_store',
        '_check_type',
        '_spec_property_naming',
        '_path_to_item',
        '_configuration',
        '_visited_composed_classes',
    ])

    @convert_js_args_to_python_args
    def __init__(self, *args, **kwargs):  # noqa: E501
        """Task - a model defined in OpenAPI

        Keyword Args:
            _check_type (bool): if True, values for parameters in openapi_types
                                will be type checked and a TypeError will be
                                raised if the wrong type is input.
                                Defaults to True
            _path_to_item (tuple/list): This is a list of keys or values to
                                drill down to the model in received_data
                                when deserializing a response
            _spec_property_naming (bool): True if the variable names in the input data
                                are serialized names, as specified in the OpenAPI document.
                                False if the variable names in the input data
                                are pythonic names, e.g. snake case (default)
            _configuration (Configuration): the instance to use when
                                deserializing a file_type parameter.
                                If passed, type conversion is attempted
                                If omitted no type conversion is done.
            _visited_composed_classes (tuple): This stores a tuple of
                                classes that we have traveled through so that
                                if we see that class again we will not use its
                                discriminator again.
                                When traveling through a discriminator, the
                                composed schema that is
                                is traveled through is added to this set.
                                For example if Animal has a discriminator
                                petType and we pass in "Dog", and the class Dog
                                allOf includes Animal, we move through Animal
                                once using the discriminator, and pick Dog.
                                Then in Dog, we will make an instance of the
                                Animal class but this time we won't travel
                                through its discriminator because we passed in
                                _visited_composed_classes = (Animal,)
            class_ref (ClassReference): [optional]  # noqa: E501
            task_id (str): [optional]  # noqa: E501
            owner (str): [optional]  # noqa: E501
            start_date (datetime): [optional]  # noqa: E501
            end_date (datetime, none_type): [optional]  # noqa: E501
            trigger_rule (TriggerRule): [optional]  # noqa: E501
            extra_links ([TaskExtraLinks]): [optional]  # noqa: E501
            depends_on_past (bool): [optional]  # noqa: E501
            is_mapped (bool): [optional]  # noqa: E501
            wait_for_downstream (bool): [optional]  # noqa: E501
            retries (float): [optional]  # noqa: E501
            queue (str, none_type): [optional]  # noqa: E501
            pool (str): [optional]  # noqa: E501
            pool_slots (float): [optional]  # noqa: E501
            execution_timeout (TimeDelta): [optional]  # noqa: E501
            retry_delay (TimeDelta): [optional]  # noqa: E501
            retry_exponential_backoff (bool): [optional]  # noqa: E501
            priority_weight (float): [optional]  # noqa: E501
            weight_rule (WeightRule): [optional]  # noqa: E501
            ui_color (Color): [optional]  # noqa: E501
            ui_fgcolor (Color): [optional]  # noqa: E501
            template_fields ([str]): [optional]  # noqa: E501
            sub_dag (DAG): [optional]  # noqa: E501
            downstream_task_ids ([str]): [optional]  # noqa: E501
        """

        _check_type = kwargs.pop('_check_type', True)
        _spec_property_naming = kwargs.pop('_spec_property_naming', False)
        _path_to_item = kwargs.pop('_path_to_item', ())
        _configuration = kwargs.pop('_configuration', None)
        _visited_composed_classes = kwargs.pop('_visited_composed_classes', ())

        if args:
            raise ApiTypeError(
                "Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % (
                    args,
                    self.__class__.__name__,
                ),
                path_to_item=_path_to_item,
                valid_classes=(self.__class__,),
            )

        self._data_store = {}
        self._check_type = _check_type
        self._spec_property_naming = _spec_property_naming
        self._path_to_item = _path_to_item
        self._configuration = _configuration
        self._visited_composed_classes = _visited_composed_classes + (self.__class__,)

        for var_name, var_value in kwargs.items():
            if var_name not in self.attribute_map and \
                        self._configuration is not None and \
                        self._configuration.discard_unknown_keys and \
                        self.additional_properties_type is None:
                # discard variable.
                continue
            setattr(self, var_name, var_value)
            if var_name in self.read_only_vars:
                raise ApiAttributeError(f"`{var_name}` is a read-only attribute. Use `from_openapi_data` to instantiate "
                                     f"class with read only attributes.")
