From e563162fb47364178afb185d6d2e436789be5b98 Mon Sep 17 00:00:00 2001 From: Kaxil Naik Date: Tue, 28 Aug 2018 13:26:05 +0100 Subject: [PATCH 1/9] [AIRFLOW-2993] s3_to_sftp and sftp_to_s3 operators (#3828) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [AIRFLOW-XXX] Remove residual line in Changelog (#3814) [AIRFLOW-2993] s3_to_sftp and sftp_to_s3 operators (#3828) [AIRFLOW-2709] Improve error handling in Databricks hook (#3570) * Use float for default value * Use status code to determine whether an error is retryable * Fix wrong type in assertion * Fix style to prevent lines from exceeding 90 characters * Fix wrong way of checking exception type [AIRFLOW-2854] kubernetes_pod_operator add more configuration items (#3697) * kubernetes_pod_operator add more configuration items * fix test_kubernetes_pod_operator test_faulty_service_account failure case * fix review comment issues * pod_operator add hostnetwork config * add doc example [AIRFLOW-2994] Fix command status check in Qubole Check operator (#3790) [AIRFLOW-2928] Use uuid4 instead of uuid1 (#3779) for better randomness. [AIRFLOW-2949] Add syntax highlight for single quote strings (#3795) * AIRFLOW-2949: Add syntax highlight for single quote strings * AIRFLOW-2949: Also updated new UI main.css [AIRFLOW-2948] Arg check & better doc - SSHOperator & SFTPOperator (#3793) There may be different combinations of arguments, and some processings are being done 'silently', while users may not be fully aware of them. For example - User only needs to provide either `ssh_hook` or `ssh_conn_id`, while this is not clear in doc - if both provided, `ssh_conn_id` will be ignored. - if `remote_host` is provided, it will replace the `remote_host` which wasndefined in `ssh_hook` or predefined in the connection of `ssh_conn_id` These should be documented clearly to ensure it's transparent to the users. log.info() should also be used to remind users and provide clear logs. In addition, add instance check for ssh_hook to ensure it is of the correct type (SSHHook). Tests are updated for this PR. [AIRFLOW-XXX] Fix Broken Link in CONTRIBUTING.md [AIRFLOW-2980] ReadTheDocs - Fix Missing API Reference [AIRFLOW-2984] Convert operator dates to UTC (#3822) Tasks can have start_dates or end_dates separately from the DAG. These need to be converted to UTC otherwise we cannot use them for calculation the next execution date. [AIRFLOW-2779] Make GHE auth third party licensed (#3803) This reinstates the original license. [AIRFLOW-XXX] Add Format to list of companies (#3824) [AIRFLOW-2900] Show code for packaged DAGs (#3749) [AIRFLOW-2983] Add prev_ds_nodash and next_ds_nodash macro (#3821) [AIRFLOW-XXX] Fix Docstrings for Operators (#3820) [AIRFLOW-2951] Update dag_run table end_date when state change (#3798) The existing airflow only change dag_run table end_date value when a user teminate a dag in web UI. The end_date will not be updated if airflow detected a dag finished and updated its state. This commit add end_date update in DagRun's set_state function to make up tho problem mentioned above. [AIRFLOW-2145] fix deadlock on clearing running TI (#3657) a `shutdown` task is not considered be `unfinished`, so a dag run can deadlock when all `unfinished` downstreams are all waiting on a task that's in the `shutdown` state. fix this by considering `shutdown` to be `unfinished`, since it's not truly a terminal state [AIRFLOW-XXX] Fix typo in docstring of gcs_to_bq (#3833) [AIRFLOW-2476] Allow tabulate up to 0.8.2 (#3835) [AIRFLOW-XXX] Fix typos in faq.rst (#3837) [AIRFLOW-2979] Make celery_result_backend conf Backwards compatible (#3832) (#2806) Renamed `celery_result_backend` to `result_backend` and broke backwards compatibility. [AIRFLOW-2866] Fix missing CSRF token head when using RBAC UI (#3804) [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) [AIRFLOW-208] Add badge to show supported Python versions (#3839) [AIRFLOW-3007] Update backfill example in Scheduler docs The scheduler docs at https://airflow.apache.org/scheduler.html#backfill-and-catchup use deprecated way of passing `schedule_interval`. `schedule_interval` should be pass to DAG as a separate parameter and not as a default arg. [AIRFLOW-3005] Replace 'Airbnb Airflow' with 'Apache Airflow' (#3845) [AIRFLOW-3002] Fix variable & tests in GoogleCloudBucketHelper (#3843) [AIRFLOW-2991] Log path to driver output after Dataproc job (#3827) [AIRFLOW-XXX] Fix python3 and flake8 errors in dev/airflow-jira This is a script that checks if the Jira's marked as fixed in a release are actually merged in - getting this working is helpful to me in preparing 1.10.1 [AIRFLOW-3006] Add note on using None for schedule_interval [AIRFLOW-3003] Pull the krb5 image instead of building (#3844) Pull the image instead of building it, this will speed up the CI process since we don't have to build it every time. [AIRFLOW-2883] Add import and export for pool cli using JSON [AIRFLOW-2847] Remove legacy imports support for plugins (#3692) [AIRFLOW-1998] Implemented DatabricksRunNowOperator for jobs/run-now … (#3813) Add functionality to kick of a Databricks job right away. * Per feedback: fixed a documentation error, reintegrated the execute and on_kill onto the objects. * Fixed a documentation issue. [AIRFLOW-3021] Add Censys to who uses Airflow list > Censys > Find and analyze every reachable server and device on the Internet > https://censys.io/ closes AIRFLOW-3021 https://issues.apache.org/jira/browse/AIRFLOW-3021 [AIRFLOW-3018] Fix Minor issues in Documentation Add Branch to Company List [AIRFLOW-3023] Fix docstring datatypes [AIRFLOW-3008] Move Kubernetes example DAGs to contrib [AIRFLOW-2997] Support cluster fields in bigquery (#3838) This adds a cluster_fields argument to the bigquery hook, GCS to bigquery operator and bigquery query operators. This field requests that bigquery store the result of the query/load operation sorted according to the specified fields (the order of fields given is significant). [AIRFLOW-XXX] Redirect FAQ `airflow[crypto]` to How-to Guides. [AIRFLOW-XXX] Remove redundant space in Kerberos (#3866) [AIRFLOW-3028] Update Text & Images in Readme.md [AIRFLOW-1917] Trim extra newline and trailing whitespace from log (#3862) [AIRFLOW-2985] Operators for S3 object copying/deleting (#3823) 1. Copying: Under the hood, it's `boto3.client.copy_object()`. It can only handle the situation in which the S3 connection used can access both source and destination bucket/key. 2. Deleting: 2.1 Under the hood, it's `boto3.client.delete_objects()`. It supports either deleting one single object or multiple objects. 2.2 If users try to delete a non-existent object, the request will still succeed, but there will be an entry 'Errors' in the response. There may also be other reasons which may cause similar 'Errors' ( request itself would succeed without explicit exception). So an argument `silent_on_errors` is added to let users decide if this sort of 'Errors' should fail the operator. The corresponding methods are added into S3Hook, and these two operators are 'wrappers' of these methods. [AIRFLOW-3030] Fix CLI docs (#3872) [AIRFLOW-XXX] Update kubernetes.rst docs (#3875) Update kubernetes.rst with correct KubernetesPodOperator inputs for the volumes. [AIRFLOW-XXX] Add Enigma to list of companies [AIRFLOW-2965] CLI tool to show the next execution datetime Cover different cases - schedule_interval is "@once" or None, then following_schedule method would always return None - If dag is paused, print reminder - If latest_execution_date is not found, print warning saying not applicable. [AIRFLOW-XXX] Add Bombora Inc using Airflow [AIRFLOW-2156] Parallelize Celery Executor task state fetching (#3830) [AIRFLOW-XXX] Move Dag level access control out of 1.10 section (#3882) It isn't in 1.10 (and wasn't in this section when the PR was created). [AIRFLOW-3040] Enable ProBot to clean up stale Pull Requests (#3883) [AIRFLOW-3012] Fix Bug when passing emails for SLA [AIRFLOW-2797] Create Google Dataproc cluster with custom image (#3871) [AIRFLOW-XXX] Updated README to include CAVA Addressed comments in PR with appropriate refactoring of s3-sftp operators. Added s3-sftp operator links [AIRFLOW-2993] s3_to_sftp and sftp_to_s3 operators #3828 Rearranged input parameters for sftp_to_s3_operator. [AIRFLOW-2988] Run specifically python2 for dataflow (#3826) Apache beam does not yet support python3, so it's best to run dataflow jobs with python2 specifically until python3 support is complete (BEAM-1251), in case if the user's 'python' in PATH is python3. [AIRFLOW-3035] Allow custom 'job_error_states' in dataproc ops (#3884) Allow caller to pass in custom list of Dataproc job states into the DataProc*Operator classes that should result in the _DataProcJob.raise_error() method raising an Exception. [AIRFLOW-3034]: Readme updates : Add Slack & Twitter, remove Gitter [AIRFLOW-3056] Add happn to Airflow user list [AIRFLOW-3052] Add logo options to Airflow (#3892) [AIRFLOW-3060] DAG context manager fails to exit properly in certain circumstances [AIRFLOW-2524] Add SageMaker Batch Inference (#3767) * Fix for comments * Fix sensor test * Update non_terminal_states and failed_states to static variables of SageMakerHook Add SageMaker Transform Operator & Sensor Co-authored-by: srrajeev-aws [AIRFLOW-2772] Fix Bug in BigQuery hook for Partitioned Table (#3901) [AIRFLOW-XXX] Added Jeitto as one of happy Airflow users! (#3902) [AIRFLOW-XXX] Add Jeitto as one happy Airflow user! [AIRFLOW-3044] Dataflow operators accept templated job_name param (#3887) * Default value of new job_name param is templated task_id, to match the existing behavior as much as possible. * Change expected value in test_mlengine_operator_utils.py to match default for new job_name param. [AIRFLOW-2707] Validate task_log_reader on upgrade from <=1.9 (#3881) We changed the default logging config and config from 1.9 to 1.10, but anyone who upgrades and has an existing airflow.cfg won't know they need to change this value - instead they will get nothing displayed in the UI (ajax request fails) and see "'NoneType' object has no attribute 'read'" in the error log. This validates that config section at start up, and seamlessly upgrades the old previous value. [AIRFLOW-3025] Enable specifying dns and dns_search options for DockerOperator (#3860) Enable specifying dns and dns_search options for DockerOperator [AIRFLOW-1298] Clear UPSTREAM_FAILED using the clean cli (#3886) * [AIRFLOW-1298] Fix 'clear only_failed' * [AIRFLOW-1298] Fix 'clear only_failed' [AIRFLOW-3059] Log how many rows are read from Postgres (#3905) To know how many data is being read from Postgres, it is nice to log this to the Airflow log. Previously when there was no data, it would still create a single file. This is not something that we want, and therefore we've changed this behaviour. Refactored the tests to make use of Postgres itself since we have it running. This makes the tests more realistic, instead of mocking everything. [AIRFLOW-XXX] Fix typo in docs/timezone.rst (#3904) [AIRFLOW-3070] Refine web UI authentication-related docs (#3863) [AIRFLOW-3068] Remove deprecated imports [AIRFLOW-3036] Add relevant ECS options to ECS operator. (#3908) The ECS operator currently supports only a subset of available options for running ECS tasks. This patch adds all ECS options that could be relevant to airflow; options that wouldn't make sense here, like `count`, were skipped. [AIRFLOW-1195] Add feature to clear tasks in Parent Dag (#3907) [AIRFLOW-3073] Add note-Profiling feature not supported in new webserver (#3909) Adhoc queries and Charts features are no longer supported in new FAB-based webserver and UI. But this is not mentioned at all in the doc "Data Profiling" (https://airflow.incubator.apache.org/profiling.html) This commit adds a note to remind users for this. [AIRFLOW-XXX] Fix SlackWebhookOperator docs (#3915) The docs refer to `conn_id` while the actual argument is `http_conn_id`. [AIRFLOW-1441] Fix inconsistent tutorial code (#2466) [AIRFLOW-XXX] Add 90 Seconds to companies [AIRFLOW-3096] Reduce DaysUntilStale for probot/stale [AIRFLOW-3096] Further reduce DaysUntilStale for probo/stale [AIRFLOW-3072] Assign permission get_logs_with_metadata to viewer role (#3913) [AIRFLOW-3090] Demote dag start/stop log messages to debug (#3920) [AIRFLOW-2407] Use feature detection for reload() (#3298) * [AIRFLOW-2407] Use feature detection for reload() [Use feature detection instead of version detection](https://docs.python.org/3/howto/pyporting.html#use-feature-detection-instead-of-version-detection) is a Python porting best practice that avoids a flake8 undefined name error... flake8 testing of https://github.com/apache/incubator-airflow on Python 3.6.3 [AIRFLOW-2747] Explicit re-schedule of sensors (#3596) * [AIRFLOW-2747] Explicit re-schedule of sensors Add `mode` property to sensors. If set to `reschedule` an AirflowRescheduleException is raised instead of sleeping which sets the task back to state `NONE`. Reschedules are recorded in new `task_schedule` table and visualized in the Gantt view. New TI dependency checks if a sensor task is ready to be re-scheduled. * Reformat sqlalchemy imports * Make `_handle_reschedule` private * Remove print * Add comment * Add comment * Don't record reschule request in test mode [AIRFLOW-XXX] Fix a wrong sample bash command, a display issue & a few typos (#3924) [AIRFLOW-3090] Make No tasks to consider for execution debug (#3923) During normal operation, it is not necessary to see the message. This can only be useful when debugging an issue. AIRFLOW-2952 Fix Kubernetes CI (#3922) The current dockerised CI pipeline doesn't run minikube and the Kubernetes integration tests. This starts a Kubernetes cluster using minikube and runs k8s integration tests using docker-compose. [AIRFLOW-2918] Fix Flake8 violations (#3931) [AIRFLOW-3076] Remove preloading of MySQL testdata (#3911) One of the things for tests is being self contained. This means that it should not depend on anything external, such as loading data. This PR will use the setUp and tearDown to load the data into MySQL and remove it afterwards. This removes the actual bash mysql commands and will make it easier to dockerize the whole testsuite in the future [AIRFLOW-2887] Added BigQueryCreateEmptyDatasetOperator and create_emty_dataset to bigquery_hook (#3876) [AIRFLOW-2918] Remove unused imports [AIRFLOW-3099] Stop Missing Section Errors for optional sections (#3934) [AIRFLOW-3090] Specify path of key file in log message (#3921) [AIRFLOW-3067] Display www_rbac Flask flash msg properly (#3903) The Flask flash messages are not displayed properly. When we don't give a category for a flash message, defautl value will be 'message'. In some cases, we specify 'error' category. Using Flask-AppBuilder, the flash message will be given a CSS class 'alert-[category]'. But We don't have 'alert-message' or 'alert-error' in the current 'bootstrap-theme.css' file. This makes the the flash messages in www_rbac UI come with no background color. This commit addresses this issue by adding 'alert-message' (using specs of existing CSS class 'alert-info') and 'alert-error' (using specs of existing CSS class 'alert-danger') into 'bootstrap-theme.css'. [AIRFLOW-3109] Bugfix to allow user/op roles to clear task intance via UI by default add show statements to hql filtering. [AIRFLOW-3051] Change CLI to make users ops similar to connections The ability to manipulate users from the command line is a bit clunky. Currently 'airflow create_user' and 'airflow delete_user' and 'airflow list_users'. It seems that these ought to be made more like connections, so that it becomes 'airflow users list ...', 'airflow users delete ...' and 'airflow users create ...' [AIRFLOW-3009] Import Hashable from collection.abc to fix Python 3.7 deprecation warning (#3849) [AIRFLOW-XXX] Add Tesla as an Apache Airflow user (#3947) [AIRFLOW-3111] Fix instructions in UPDATING.md and remove comment (#3944) artifacts in default_airflow.cfg - fixed incorrect instructions in UPDATING.md regarding core.log_filename_template and elasticsearch.elasticsearch_log_id_template - removed comments referencing "additional curly braces" from default_airflow.cfg since they're irrelevant to the rendered airflow.cfg [AIRFLOW-3117] Add instructions to allow GPL dependency (#3949) The installation instructions failed to mention how to proceed with the GPL dependency. For those who are not concerned by GPL, it is useful to know how to proceed with GPL dependency. [AIRFLOW-XXX] Add Square to the companies lists [AIRFLOW-XXX] Add Fathom Health to readme [AIRFLOW-XXX] Pin Click to 6.7 to Fix CI (#3962) [AIRFLOW-XXX] Fix SlackWebhookOperator execute method comment (#3963) [AIRFLOW-3100][AIRFLOW-3101] Improve docker compose local testing (#3933) [AIRFLOW-3127] Fix out-dated doc for Celery SSL (#3967) Now in `airflow.cfg`, for Celery-SSL, the item names are "ssl_active", "ssl_key", "ssl_cert", and "ssl_cacert". (since PR https://github.com/apache/incubator-airflow/pull/2806/files) But in the documentation https://airflow.incubator.apache.org/security.html?highlight=celery or https://github.com/apache/incubator-airflow/blob/master/docs/security.rst, it's "CELERY_SSL_ACTIVE", "CELERY_SSL_KEY", "CELERY_SSL_CERT", and "CELERY_SSL_CACERT", which is out-dated and may confuse readers. [AIRFLOW-XXX] Fix PythonVirtualenvOperator tests (#3968) The recent update to the CI image changed the default python from python2 to python3. The PythonVirtualenvOperator tests expected python2 as default and fail due to serialisation errors. [AIRFLOW-2952] Fix Kubernetes CI (#3957) - Update outdated cli command to create user - Remove `airflow/example_dags_kubernetes` as the dag already exists in `contrib/example_dags/` - Update the path to copy K8s dags [AIRFLOW-3104] Add .airflowignore info into doc (#3939) .airflowignore is a nice feature, but it was not mentioned at all in the documentation. [AIRFLOW-3130] Add CLI docs for users command [AIRFLOW-XXX] Add Delete for CLI Example in UPDATING.md [AIRFLOW-3123] Use a stack for DAG context management (#3956) [AIRFLOW-3125] Monitor Task Instances creation rates (#3966) Montor Task Instances creation rates by Operator type. These stats can provide some visibility on how much workload Airflow is getting. They can be used for resource allocation in the long run (i.e. to determine when we should scale up workers) and debugging in scenarios like the creation rate of certain type of Task Instances spikes. [AIRFLOW-3129] Backfill mysql hook unit tests. (#3970) [AIRFLOW-3124] Fix RBAC webserver debug mode (#3958) [AIRFLOW-XXX] Add Compass to companies list (#3972) We're using Airflow at Compass now. [AIRFLOW-XXX] Speed up DagBagTest cases (#3974) I noticed that many of the tests of DagBags operate on a specific DAG only, and don't need to load the example or test dags. By not loading the dags we don't need to this shaves about 10-20s of test time. [AIRFLOW-2912] Add Deploy and Delete operators for GCF (#3969) Both Deploy and Delete operators interact with Google Cloud Functions to manage functions. Both are idempotent and make use of GcfHook - hook that encapsulates communication with GCP over GCP API. [AIRFLOW-1390] Update Alembic to 0.9 (#3935) [AIRFLOW-2238] Update PR tool to remove outdated info (#3978) [AIRFLOW-XXX] Don't spam test logs with "bad cron expression" messages (#3973) We needed these test dags to check the behaviour of invalid cron expressions, but by default we were loading them every time we create a DagBag (which many, many tests to). Instead we ignore these known-bad dags by default, and the test checking those (tests/models.py:DagBagTest.test_process_file_cron_validity_check) is already explicitly processing those DAGs directly, so it remains tested. [AIRFLOW-XXX] Fix undocumented params in S3_hook Some function parameters were undocumented. Additional docstrings were added for clarity. [AIRFLOW-3079] Improve migration scripts to support MSSQL Server (#3964) There were two problems for MSSQL. First, 'timestamp' data type in MSSQL Server is essentially a row-id, and not a timezone enabled date/time stamp. Second, alembic creates invalid SQL when applying the 0/1 constraint to boolean values. MSSQL should enforce this constraint by simply asserting a boolean value. [AIRFLOW-XXX] Add DoorDash to README.md (#3980) DoorDash uses Airflow https://softwareengineeringdaily.com/2018/09/28/doordash/ [AIRFLOW-3062] Add Qubole in integration docs (#3946) [AIRFLOW-3129] Improve test coverage of airflow.models. (#3982) [AIRFLOW-2574] Cope with '%' in SQLA DSN when running migrations (#3787) Alembic uses a ConfigParser like Airflow does, and "%% is a special value in there, so we need to escape it. As per the Alembic docs: > Note that this value is passed to ConfigParser.set, which supports > variable interpolation using pyformat (e.g. `%(some_value)s`). A raw > percent sign not part of an interpolation symbol must therefore be > escaped, e.g. `%%` [AIRFLOW-3137] Make ProxyFix middleware optional. (#3983) The ProxyFix middleware should only be used when airflow is running behind a trusted proxy. This patch adds a `USE_PROXY_FIX` flag that defaults to `False`. [AIRFLOW-3004] Add config disabling scheduler cron (#3899) [AIRFLOW-3103][AIRFLOW-3147] Update flask-appbuilder (#3937) [AIRFLOW-2993] s3_to_sftp and sftp_to_s3 operators #3828 Added apply_default decorator. Added test for operators [AIRFLOW-XXX] Fixing the issue in Documentation (#3998) Fixing the operator name from DataFlowOperation to DataFlowJavaOperator in Documentation [AIRFLOW-3088] Include slack-compatible emoji image [AIRFLOW-3161] fix TaskInstance log link in RBAC UI [AIRFLOW-3148] Remove unnecessary arg "parameters" in RedshiftToS3Transfer (#3995) "Parameters" are used to help render the SQL command. But in this operator, only "schema" and "table" are needed. There is no SQL command to render. By checking the code,we can also find argument "parameters" is never really used. (Fix a minor issue in the docstring as well) [AIRFLOW-3159] Update GCS logging docs for latest code (#3952) Formatted code [AIRFLOW-XXX] Fixing the issue in Documentation (#3998) Fixing the operator name from DataFlowOperation to DataFlowJavaOperator in Documentation [AIRFLOW-3088] Include slack-compatible emoji image [AIRFLOW-3161] fix TaskInstance log link in RBAC UI [AIRFLOW-3148] Remove unnecessary arg "parameters" in RedshiftToS3Transfer (#3995) "Parameters" are used to help render the SQL command. But in this operator, only "schema" and "table" are needed. There is no SQL command to render. By checking the code,we can also find argument "parameters" is never really used. (Fix a minor issue in the docstring as well) [AIRFLOW-3159] Update GCS logging docs for latest code (#3952) [AIRFLOW-2930] Fix celery excecutor scheduler crash (#3784) Caused by an update in PR #3740. execute_command.apply_async(args=command, ...) -command is a list of short unicode strings and the above code pass multiple arguments to a function defined as taking only one argument. -command = ["airflow", "run", "dag323",...] -args = command = ["airflow", "run", "dag323", ...] -execute_command("airflow","run","dag3s3", ...) will be error and exit. [AIRFLOW-2854] kubernetes_pod_operator add more configuration items (#3697) * kubernetes_pod_operator add more configuration items * fix test_kubernetes_pod_operator test_faulty_service_account failure case * fix review comment issues * pod_operator add hostnetwork config * add doc example [AIRFLOW-2994] Fix command status check in Qubole Check operator (#3790) [AIRFLOW-2949] Add syntax highlight for single quote strings (#3795) * AIRFLOW-2949: Add syntax highlight for single quote strings * AIRFLOW-2949: Also updated new UI main.css [AIRFLOW-2948] Arg check & better doc - SSHOperator & SFTPOperator (#3793) There may be different combinations of arguments, and some processings are being done 'silently', while users may not be fully aware of them. For example - User only needs to provide either `ssh_hook` or `ssh_conn_id`, while this is not clear in doc - if both provided, `ssh_conn_id` will be ignored. - if `remote_host` is provided, it will replace the `remote_host` which wasndefined in `ssh_hook` or predefined in the connection of `ssh_conn_id` These should be documented clearly to ensure it's transparent to the users. log.info() should also be used to remind users and provide clear logs. In addition, add instance check for ssh_hook to ensure it is of the correct type (SSHHook). Tests are updated for this PR. [AIRFLOW-XXX] Fix Broken Link in CONTRIBUTING.md [AIRFLOW-2980] ReadTheDocs - Fix Missing API Reference [AIRFLOW-2779] Make GHE auth third party licensed (#3803) This reinstates the original license. [AIRFLOW-XXX] Add Format to list of companies (#3824) [AIRFLOW-2900] Show code for packaged DAGs (#3749) [AIRFLOW-2983] Add prev_ds_nodash and next_ds_nodash macro (#3821) [AIRFLOW-2951] Update dag_run table end_date when state change (#3798) The existing airflow only change dag_run table end_date value when a user teminate a dag in web UI. The end_date will not be updated if airflow detected a dag finished and updated its state. This commit add end_date update in DagRun's set_state function to make up tho problem mentioned above. [AIRFLOW-2145] fix deadlock on clearing running TI (#3657) a `shutdown` task is not considered be `unfinished`, so a dag run can deadlock when all `unfinished` downstreams are all waiting on a task that's in the `shutdown` state. fix this by considering `shutdown` to be `unfinished`, since it's not truly a terminal state [AIRFLOW-XXX] Fix typo in docstring of gcs_to_bq (#3833) [AIRFLOW-2476] Allow tabulate up to 0.8.2 (#3835) [AIRFLOW-XXX] Fix typos in faq.rst (#3837) [AIRFLOW-2979] Make celery_result_backend conf Backwards compatible (#3832) (#2806) Renamed `celery_result_backend` to `result_backend` and broke backwards compatibility. [AIRFLOW-2866] Fix missing CSRF token head when using RBAC UI (#3804) [AIRFLOW-3007] Update backfill example in Scheduler docs The scheduler docs at https://airflow.apache.org/scheduler.html#backfill-and-catchup use deprecated way of passing `schedule_interval`. `schedule_interval` should be pass to DAG as a separate parameter and not as a default arg. [AIRFLOW-3005] Replace 'Airbnb Airflow' with 'Apache Airflow' (#3845) [AIRFLOW-3002] Fix variable & tests in GoogleCloudBucketHelper (#3843) [AIRFLOW-2991] Log path to driver output after Dataproc job (#3827) [AIRFLOW-XXX] Fix python3 and flake8 errors in dev/airflow-jira This is a script that checks if the Jira's marked as fixed in a release are actually merged in - getting this working is helpful to me in preparing 1.10.1 [AIRFLOW-2883] Add import and export for pool cli using JSON [AIRFLOW-3021] Add Censys to who uses Airflow list > Censys > Find and analyze every reachable server and device on the Internet > https://censys.io/ closes AIRFLOW-3021 https://issues.apache.org/jira/browse/AIRFLOW-3021 Add Branch to Company List [AIRFLOW-3008] Move Kubernetes example DAGs to contrib [AIRFLOW-2997] Support cluster fields in bigquery (#3838) This adds a cluster_fields argument to the bigquery hook, GCS to bigquery operator and bigquery query operators. This field requests that bigquery store the result of the query/load operation sorted according to the specified fields (the order of fields given is significant). [AIRFLOW-XXX] Redirect FAQ `airflow[crypto]` to How-to Guides. [AIRFLOW-XXX] Remove redundant space in Kerberos (#3866) [AIRFLOW-3028] Update Text & Images in Readme.md [AIRFLOW-1917] Trim extra newline and trailing whitespace from log (#3862) [AIRFLOW-2985] Operators for S3 object copying/deleting (#3823) 1. Copying: Under the hood, it's `boto3.client.copy_object()`. It can only handle the situation in which the S3 connection used can access both source and destination bucket/key. 2. Deleting: 2.1 Under the hood, it's `boto3.client.delete_objects()`. It supports either deleting one single object or multiple objects. 2.2 If users try to delete a non-existent object, the request will still succeed, but there will be an entry 'Errors' in the response. There may also be other reasons which may cause similar 'Errors' ( request itself would succeed without explicit exception). So an argument `silent_on_errors` is added to let users decide if this sort of 'Errors' should fail the operator. The corresponding methods are added into S3Hook, and these two operators are 'wrappers' of these methods. [AIRFLOW-3030] Fix CLI docs (#3872) [AIRFLOW-XXX] Update kubernetes.rst docs (#3875) Update kubernetes.rst with correct KubernetesPodOperator inputs for the volumes. [AIRFLOW-XXX] Add Enigma to list of companies [AIRFLOW-2965] CLI tool to show the next execution datetime Cover different cases - schedule_interval is "@once" or None, then following_schedule method would always return None - If dag is paused, print reminder - If latest_execution_date is not found, print warning saying not applicable. [AIRFLOW-XXX] Add Bombora Inc using Airflow [AIRFLOW-XXX] Move Dag level access control out of 1.10 section (#3882) It isn't in 1.10 (and wasn't in this section when the PR was created). [AIRFLOW-3012] Fix Bug when passing emails for SLA [AIRFLOW-2797] Create Google Dataproc cluster with custom image (#3871) [AIRFLOW-XXX] Updated README to include CAVA [AIRFLOW-3035] Allow custom 'job_error_states' in dataproc ops (#3884) Allow caller to pass in custom list of Dataproc job states into the DataProc*Operator classes that should result in the _DataProcJob.raise_error() method raising an Exception. [AIRFLOW-3034]: Readme updates : Add Slack & Twitter, remove Gitter [AIRFLOW-3056] Add happn to Airflow user list [AIRFLOW-3052] Add logo options to Airflow (#3892) [AIRFLOW-2524] Add SageMaker Batch Inference (#3767) * Fix for comments * Fix sensor test * Update non_terminal_states and failed_states to static variables of SageMakerHook Add SageMaker Transform Operator & Sensor Co-authored-by: srrajeev-aws [AIRFLOW-XXX] Added Jeitto as one of happy Airflow users! (#3902) [AIRFLOW-XXX] Add Jeitto as one happy Airflow user! [AIRFLOW-3044] Dataflow operators accept templated job_name param (#3887) * Default value of new job_name param is templated task_id, to match the existing behavior as much as possible. * Change expected value in test_mlengine_operator_utils.py to match default for new job_name param. [AIRFLOW-2707] Validate task_log_reader on upgrade from <=1.9 (#3881) We changed the default logging config and config from 1.9 to 1.10, but anyone who upgrades and has an existing airflow.cfg won't know they need to change this value - instead they will get nothing displayed in the UI (ajax request fails) and see "'NoneType' object has no attribute 'read'" in the error log. This validates that config section at start up, and seamlessly upgrades the old previous value. [AIRFLOW-3025] Enable specifying dns and dns_search options for DockerOperator (#3860) Enable specifying dns and dns_search options for DockerOperator [AIRFLOW-1298] Clear UPSTREAM_FAILED using the clean cli (#3886) * [AIRFLOW-1298] Fix 'clear only_failed' * [AIRFLOW-1298] Fix 'clear only_failed' [AIRFLOW-3059] Log how many rows are read from Postgres (#3905) To know how many data is being read from Postgres, it is nice to log this to the Airflow log. Previously when there was no data, it would still create a single file. This is not something that we want, and therefore we've changed this behaviour. Refactored the tests to make use of Postgres itself since we have it running. This makes the tests more realistic, instead of mocking everything. [AIRFLOW-XXX] Fix typo in docs/timezone.rst (#3904) [AIRFLOW-3068] Remove deprecated imports [AIRFLOW-3036] Add relevant ECS options to ECS operator. (#3908) The ECS operator currently supports only a subset of available options for running ECS tasks. This patch adds all ECS options that could be relevant to airflow; options that wouldn't make sense here, like `count`, were skipped. [AIRFLOW-1195] Add feature to clear tasks in Parent Dag (#3907) [AIRFLOW-3073] Add note-Profiling feature not supported in new webserver (#3909) Adhoc queries and Charts features are no longer supported in new FAB-based webserver and UI. But this is not mentioned at all in the doc "Data Profiling" (https://airflow.incubator.apache.org/profiling.html) This commit adds a note to remind users for this. [AIRFLOW-XXX] Fix SlackWebhookOperator docs (#3915) The docs refer to `conn_id` while the actual argument is `http_conn_id`. [AIRFLOW-1441] Fix inconsistent tutorial code (#2466) [AIRFLOW-XXX] Add 90 Seconds to companies [AIRFLOW-3096] Further reduce DaysUntilStale for probo/stale [AIRFLOW-3072] Assign permission get_logs_with_metadata to viewer role (#3913) [AIRFLOW-3090] Demote dag start/stop log messages to debug (#3920) [AIRFLOW-2407] Use feature detection for reload() (#3298) * [AIRFLOW-2407] Use feature detection for reload() [Use feature detection instead of version detection](https://docs.python.org/3/howto/pyporting.html#use-feature-detection-instead-of-version-detection) is a Python porting best practice that avoids a flake8 undefined name error... flake8 testing of https://github.com/apache/incubator-airflow on Python 3.6.3 [AIRFLOW-XXX] Fix a wrong sample bash command, a display issue & a few typos (#3924) [AIRFLOW-3090] Make No tasks to consider for execution debug (#3923) During normal operation, it is not necessary to see the message. This can only be useful when debugging an issue. AIRFLOW-2952 Fix Kubernetes CI (#3922) The current dockerised CI pipeline doesn't run minikube and the Kubernetes integration tests. This starts a Kubernetes cluster using minikube and runs k8s integration tests using docker-compose. [AIRFLOW-2918] Fix Flake8 violations (#3931) [AIRFLOW-3076] Remove preloading of MySQL testdata (#3911) One of the things for tests is being self contained. This means that it should not depend on anything external, such as loading data. This PR will use the setUp and tearDown to load the data into MySQL and remove it afterwards. This removes the actual bash mysql commands and will make it easier to dockerize the whole testsuite in the future [AIRFLOW-2918] Remove unused imports [AIRFLOW-3099] Stop Missing Section Errors for optional sections (#3934) [AIRFLOW-3090] Specify path of key file in log message (#3921) [AIRFLOW-3067] Display www_rbac Flask flash msg properly (#3903) The Flask flash messages are not displayed properly. When we don't give a category for a flash message, defautl value will be 'message'. In some cases, we specify 'error' category. Using Flask-AppBuilder, the flash message will be given a CSS class 'alert-[category]'. But We don't have 'alert-message' or 'alert-error' in the current 'bootstrap-theme.css' file. This makes the the flash messages in www_rbac UI come with no background color. This commit addresses this issue by adding 'alert-message' (using specs of existing CSS class 'alert-info') and 'alert-error' (using specs of existing CSS class 'alert-danger') into 'bootstrap-theme.css'. [AIRFLOW-3109] Bugfix to allow user/op roles to clear task intance via UI by default add show statements to hql filtering. [AIRFLOW-3051] Change CLI to make users ops similar to connections The ability to manipulate users from the command line is a bit clunky. Currently 'airflow create_user' and 'airflow delete_user' and 'airflow list_users'. It seems that these ought to be made more like connections, so that it becomes 'airflow users list ...', 'airflow users delete ...' and 'airflow users create ...' [AIRFLOW-3009] Import Hashable from collection.abc to fix Python 3.7 deprecation warning (#3849) [AIRFLOW-XXX] Add Tesla as an Apache Airflow user (#3947) [AIRFLOW-3111] Fix instructions in UPDATING.md and remove comment (#3944) artifacts in default_airflow.cfg - fixed incorrect instructions in UPDATING.md regarding core.log_filename_template and elasticsearch.elasticsearch_log_id_template - removed comments referencing "additional curly braces" from default_airflow.cfg since they're irrelevant to the rendered airflow.cfg [AIRFLOW-3117] Add instructions to allow GPL dependency (#3949) The installation instructions failed to mention how to proceed with the GPL dependency. For those who are not concerned by GPL, it is useful to know how to proceed with GPL dependency. [AIRFLOW-XXX] Add Square to the companies lists [AIRFLOW-XXX] Add Fathom Health to readme [AIRFLOW-XXX] Pin Click to 6.7 to Fix CI (#3962) [AIRFLOW-XXX] Fix SlackWebhookOperator execute method comment (#3963) [AIRFLOW-3100][AIRFLOW-3101] Improve docker compose local testing (#3933) [AIRFLOW-3127] Fix out-dated doc for Celery SSL (#3967) Now in `airflow.cfg`, for Celery-SSL, the item names are "ssl_active", "ssl_key", "ssl_cert", and "ssl_cacert". (since PR https://github.com/apache/incubator-airflow/pull/2806/files) But in the documentation https://airflow.incubator.apache.org/security.html?highlight=celery or https://github.com/apache/incubator-airflow/blob/master/docs/security.rst, it's "CELERY_SSL_ACTIVE", "CELERY_SSL_KEY", "CELERY_SSL_CERT", and "CELERY_SSL_CACERT", which is out-dated and may confuse readers. [AIRFLOW-XXX] Fix PythonVirtualenvOperator tests (#3968) The recent update to the CI image changed the default python from python2 to python3. The PythonVirtualenvOperator tests expected python2 as default and fail due to serialisation errors. [AIRFLOW-2952] Fix Kubernetes CI (#3957) - Update outdated cli command to create user - Remove `airflow/example_dags_kubernetes` as the dag already exists in `contrib/example_dags/` - Update the path to copy K8s dags [AIRFLOW-3104] Add .airflowignore info into doc (#3939) .airflowignore is a nice feature, but it was not mentioned at all in the documentation. [AIRFLOW-XXX] Add Delete for CLI Example in UPDATING.md [AIRFLOW-3123] Use a stack for DAG context management (#3956) [AIRFLOW-3125] Monitor Task Instances creation rates (#3966) Montor Task Instances creation rates by Operator type. These stats can provide some visibility on how much workload Airflow is getting. They can be used for resource allocation in the long run (i.e. to determine when we should scale up workers) and debugging in scenarios like the creation rate of certain type of Task Instances spikes. [AIRFLOW-3129] Backfill mysql hook unit tests. (#3970) [AIRFLOW-3124] Fix RBAC webserver debug mode (#3958) [AIRFLOW-XXX] Add Compass to companies list (#3972) We're using Airflow at Compass now. [AIRFLOW-XXX] Speed up DagBagTest cases (#3974) I noticed that many of the tests of DagBags operate on a specific DAG only, and don't need to load the example or test dags. By not loading the dags we don't need to this shaves about 10-20s of test time. [AIRFLOW-2912] Add Deploy and Delete operators for GCF (#3969) Both Deploy and Delete operators interact with Google Cloud Functions to manage functions. Both are idempotent and make use of GcfHook - hook that encapsulates communication with GCP over GCP API. [AIRFLOW-1390] Update Alembic to 0.9 (#3935) [AIRFLOW-2238] Update PR tool to remove outdated info (#3978) [AIRFLOW-XXX] Don't spam test logs with "bad cron expression" messages (#3973) We needed these test dags to check the behaviour of invalid cron expressions, but by default we were loading them every time we create a DagBag (which many, many tests to). Instead we ignore these known-bad dags by default, and the test checking those (tests/models.py:DagBagTest.test_process_file_cron_validity_check) is already explicitly processing those DAGs directly, so it remains tested. [AIRFLOW-XXX] Fix undocumented params in S3_hook Some function parameters were undocumented. Additional docstrings were added for clarity. [AIRFLOW-3079] Improve migration scripts to support MSSQL Server (#3964) There were two problems for MSSQL. First, 'timestamp' data type in MSSQL Server is essentially a row-id, and not a timezone enabled date/time stamp. Second, alembic creates invalid SQL when applying the 0/1 constraint to boolean values. MSSQL should enforce this constraint by simply asserting a boolean value. [AIRFLOW-XXX] Add DoorDash to README.md (#3980) DoorDash uses Airflow https://softwareengineeringdaily.com/2018/09/28/doordash/ [AIRFLOW-3062] Add Qubole in integration docs (#3946) [AIRFLOW-3129] Improve test coverage of airflow.models. (#3982) [AIRFLOW-2574] Cope with '%' in SQLA DSN when running migrations (#3787) Alembic uses a ConfigParser like Airflow does, and "%% is a special value in there, so we need to escape it. As per the Alembic docs: > Note that this value is passed to ConfigParser.set, which supports > variable interpolation using pyformat (e.g. `%(some_value)s`). A raw > percent sign not part of an interpolation symbol must therefore be > escaped, e.g. `%%` [AIRFLOW-3137] Make ProxyFix middleware optional. (#3983) The ProxyFix middleware should only be used when airflow is running behind a trusted proxy. This patch adds a `USE_PROXY_FIX` flag that defaults to `False`. [AIRFLOW-3004] Add config disabling scheduler cron (#3899) [AIRFLOW-3103][AIRFLOW-3147] Update flask-appbuilder (#3937) [AIRFLOW-XXX] Fixing the issue in Documentation (#3998) Fixing the operator name from DataFlowOperation to DataFlowJavaOperator in Documentation [AIRFLOW-3088] Include slack-compatible emoji image [AIRFLOW-3161] fix TaskInstance log link in RBAC UI [AIRFLOW-3148] Remove unnecessary arg "parameters" in RedshiftToS3Transfer (#3995) "Parameters" are used to help render the SQL command. But in this operator, only "schema" and "table" are needed. There is no SQL command to render. By checking the code,we can also find argument "parameters" is never really used. (Fix a minor issue in the docstring as well) [AIRFLOW-3159] Update GCS logging docs for latest code (#3952) Reformmatted to flaskdiff requirements. [AIRFLOW-XXX] Remove residual line in Changelog (#3814) [AIRFLOW-2930] Fix celery excecutor scheduler crash (#3784) Caused by an update in PR #3740. execute_command.apply_async(args=command, ...) -command is a list of short unicode strings and the above code pass multiple arguments to a function defined as taking only one argument. -command = ["airflow", "run", "dag323",...] -args = command = ["airflow", "run", "dag323", ...] -execute_command("airflow","run","dag3s3", ...) will be error and exit. [AIRFLOW-2854] kubernetes_pod_operator add more configuration items (#3697) * kubernetes_pod_operator add more configuration items * fix test_kubernetes_pod_operator test_faulty_service_account failure case * fix review comment issues * pod_operator add hostnetwork config * add doc example [AIRFLOW-2994] Fix command status check in Qubole Check operator (#3790) [AIRFLOW-2949] Add syntax highlight for single quote strings (#3795) * AIRFLOW-2949: Add syntax highlight for single quote strings * AIRFLOW-2949: Also updated new UI main.css [AIRFLOW-2948] Arg check & better doc - SSHOperator & SFTPOperator (#3793) There may be different combinations of arguments, and some processings are being done 'silently', while users may not be fully aware of them. For example - User only needs to provide either `ssh_hook` or `ssh_conn_id`, while this is not clear in doc - if both provided, `ssh_conn_id` will be ignored. - if `remote_host` is provided, it will replace the `remote_host` which wasndefined in `ssh_hook` or predefined in the connection of `ssh_conn_id` These should be documented clearly to ensure it's transparent to the users. log.info() should also be used to remind users and provide clear logs. In addition, add instance check for ssh_hook to ensure it is of the correct type (SSHHook). Tests are updated for this PR. [AIRFLOW-XXX] Fix Broken Link in CONTRIBUTING.md [AIRFLOW-2980] ReadTheDocs - Fix Missing API Reference [AIRFLOW-2779] Make GHE auth third party licensed (#3803) This reinstates the original license. [AIRFLOW-XXX] Add Format to list of companies (#3824) [AIRFLOW-2900] Show code for packaged DAGs (#3749) [AIRFLOW-2983] Add prev_ds_nodash and next_ds_nodash macro (#3821) [AIRFLOW-2951] Update dag_run table end_date when state change (#3798) The existing airflow only change dag_run table end_date value when a user teminate a dag in web UI. The end_date will not be updated if airflow detected a dag finished and updated its state. This commit add end_date update in DagRun's set_state function to make up tho problem mentioned above. [AIRFLOW-2145] fix deadlock on clearing running TI (#3657) a `shutdown` task is not considered be `unfinished`, so a dag run can deadlock when all `unfinished` downstreams are all waiting on a task that's in the `shutdown` state. fix this by considering `shutdown` to be `unfinished`, since it's not truly a terminal state [AIRFLOW-XXX] Fix typo in docstring of gcs_to_bq (#3833) [AIRFLOW-2476] Allow tabulate up to 0.8.2 (#3835) [AIRFLOW-XXX] Fix typos in faq.rst (#3837) [AIRFLOW-2979] Make celery_result_backend conf Backwards compatible (#3832) (#2806) Renamed `celery_result_backend` to `result_backend` and broke backwards compatibility. [AIRFLOW-2866] Fix missing CSRF token head when using RBAC UI (#3804) [AIRFLOW-3007] Update backfill example in Scheduler docs The scheduler docs at https://airflow.apache.org/scheduler.html#backfill-and-catchup use deprecated way of passing `schedule_interval`. `schedule_interval` should be pass to DAG as a separate parameter and not as a default arg. [AIRFLOW-3005] Replace 'Airbnb Airflow' with 'Apache Airflow' (#3845) [AIRFLOW-3002] Fix variable & tests in GoogleCloudBucketHelper (#3843) [AIRFLOW-2991] Log path to driver output after Dataproc job (#3827) [AIRFLOW-XXX] Fix python3 and flake8 errors in dev/airflow-jira This is a script that checks if the Jira's marked as fixed in a release are actually merged in - getting this working is helpful to me in preparing 1.10.1 [AIRFLOW-2883] Add import and export for pool cli using JSON [AIRFLOW-3021] Add Censys to who uses Airflow list > Censys > Find and analyze every reachable server and device on the Internet > https://censys.io/ closes AIRFLOW-3021 https://issues.apache.org/jira/browse/AIRFLOW-3021 Add Branch to Company List [AIRFLOW-3008] Move Kubernetes example DAGs to contrib [AIRFLOW-2997] Support cluster fields in bigquery (#3838) This adds a cluster_fields argument to the bigquery hook, GCS to bigquery operator and bigquery query operators. This field requests that bigquery store the result of the query/load operation sorted according to the specified fields (the order of fields given is significant). [AIRFLOW-XXX] Redirect FAQ `airflow[crypto]` to How-to Guides. [AIRFLOW-XXX] Remove redundant space in Kerberos (#3866) [AIRFLOW-3028] Update Text & Images in Readme.md [AIRFLOW-1917] Trim extra newline and trailing whitespace from log (#3862) [AIRFLOW-2985] Operators for S3 object copying/deleting (#3823) 1. Copying: Under the hood, it's `boto3.client.copy_object()`. It can only handle the situation in which the S3 connection used can access both source and destination bucket/key. 2. Deleting: 2.1 Under the hood, it's `boto3.client.delete_objects()`. It supports either deleting one single object or multiple objects. 2.2 If users try to delete a non-existent object, the request will still succeed, but there will be an entry 'Errors' in the response. There may also be other reasons which may cause similar 'Errors' ( request itself would succeed without explicit exception). So an argument `silent_on_errors` is added to let users decide if this sort of 'Errors' should fail the operator. The corresponding methods are added into S3Hook, and these two operators are 'wrappers' of these methods. [AIRFLOW-3030] Fix CLI docs (#3872) [AIRFLOW-XXX] Update kubernetes.rst docs (#3875) Update kubernetes.rst with correct KubernetesPodOperator inputs for the volumes. [AIRFLOW-XXX] Add Enigma to list of companies [AIRFLOW-2965] CLI tool to show the next execution datetime Cover different cases - schedule_interval is "@once" or None, then following_schedule method would always return None - If dag is paused, print reminder - If latest_execution_date is not found, print warning saying not applicable. [AIRFLOW-XXX] Add Bombora Inc using Airflow [AIRFLOW-XXX] Move Dag level access control out of 1.10 section (#3882) It isn't in 1.10 (and wasn't in this section when the PR was created). [AIRFLOW-3012] Fix Bug when passing emails for SLA [AIRFLOW-2797] Create Google Dataproc cluster with custom image (#3871) [AIRFLOW-XXX] Updated README to include CAVA [AIRFLOW-3035] Allow custom 'job_error_states' in dataproc ops (#3884) Allow caller to pass in custom list of Dataproc job states into the DataProc*Operator classes that should result in the _DataProcJob.raise_error() method raising an Exception. [AIRFLOW-3034]: Readme updates : Add Slack & Twitter, remove Gitter [AIRFLOW-3056] Add happn to Airflow user list [AIRFLOW-3052] Add logo options to Airflow (#3892) [AIRFLOW-2524] Add SageMaker Batch Inference (#3767) * Fix for comments * Fix sensor test * Update non_terminal_states and failed_states to static variables of SageMakerHook Add SageMaker Transform Operator & Sensor Co-authored-by: srrajeev-aws [AIRFLOW-XXX] Added Jeitto as one of happy Airflow users! (#3902) [AIRFLOW-XXX] Add Jeitto as one happy Airflow user! [AIRFLOW-3044] Dataflow operators accept templated job_name param (#3887) * Default value of new job_name param is templated task_id, to match the existing behavior as much as possible. * Change expected value in test_mlengine_operator_utils.py to match default for new job_name param. [AIRFLOW-2707] Validate task_log_reader on upgrade from <=1.9 (#3881) We changed the default logging config and config from 1.9 to 1.10, but anyone who upgrades and has an existing airflow.cfg won't know they need to change this value - instead they will get nothing displayed in the UI (ajax request fails) and see "'NoneType' object has no attribute 'read'" in the error log. This validates that config section at start up, and seamlessly upgrades the old previous value. [AIRFLOW-3025] Enable specifying dns and dns_search options for DockerOperator (#3860) Enable specifying dns and dns_search options for DockerOperator [AIRFLOW-1298] Clear UPSTREAM_FAILED using the clean cli (#3886) * [AIRFLOW-1298] Fix 'clear only_failed' * [AIRFLOW-1298] Fix 'clear only_failed' [AIRFLOW-3059] Log how many rows are read from Postgres (#3905) To know how many data is being read from Postgres, it is nice to log this to the Airflow log. Previously when there was no data, it would still create a single file. This is not something that we want, and therefore we've changed this behaviour. Refactored the tests to make use of Postgres itself since we have it running. This makes the tests more realistic, instead of mocking everything. [AIRFLOW-XXX] Fix typo in docs/timezone.rst (#3904) [AIRFLOW-3068] Remove deprecated imports [AIRFLOW-3036] Add relevant ECS options to ECS operator. (#3908) The ECS operator currently supports only a subset of available options for running ECS tasks. This patch adds all ECS options that could be relevant to airflow; options that wouldn't make sense here, like `count`, were skipped. [AIRFLOW-1195] Add feature to clear tasks in Parent Dag (#3907) [AIRFLOW-3073] Add note-Profiling feature not supported in new webserver (#3909) Adhoc queries and Charts features are no longer supported in new FAB-based webserver and UI. But this is not mentioned at all in the doc "Data Profiling" (https://airflow.incubator.apache.org/profiling.html) This commit adds a note to remind users for this. [AIRFLOW-XXX] Fix SlackWebhookOperator docs (#3915) The docs refer to `conn_id` while the actual argument is `http_conn_id`. [AIRFLOW-1441] Fix inconsistent tutorial code (#2466) [AIRFLOW-XXX] Add 90 Seconds to companies [AIRFLOW-3096] Further reduce DaysUntilStale for probo/stale [AIRFLOW-3072] Assign permission get_logs_with_metadata to viewer role (#3913) [AIRFLOW-3090] Demote dag start/stop log messages to debug (#3920) [AIRFLOW-2407] Use feature detection for reload() (#3298) * [AIRFLOW-2407] Use feature detection for reload() [Use feature detection instead of version detection](https://docs.python.org/3/howto/pyporting.html#use-feature-detection-instead-of-version-detection) is a Python porting best practice that avoids a flake8 undefined name error... flake8 testing of https://github.com/apache/incubator-airflow on Python 3.6.3 [AIRFLOW-XXX] Fix a wrong sample bash command, a display issue & a few typos (#3924) [AIRFLOW-3090] Make No tasks to consider for execution debug (#3923) During normal operation, it is not necessary to see the message. This can only be useful when debugging an issue. AIRFLOW-2952 Fix Kubernetes CI (#3922) The current dockerised CI pipeline doesn't run minikube and the Kubernetes integration tests. This starts a Kubernetes cluster using minikube and runs k8s integration tests using docker-compose. [AIRFLOW-2918] Fix Flake8 violations (#3931) [AIRFLOW-3076] Remove preloading of MySQL testdata (#3911) One of the things for tests is being self contained. This means that it should not depend on anything external, such as loading data. This PR will use the setUp and tearDown to load the data into MySQL and remove it afterwards. This removes the actual bash mysql commands and will make it easier to dockerize the whole testsuite in the future [AIRFLOW-2918] Remove unused imports [AIRFLOW-3099] Stop Missing Section Errors for optional sections (#3934) [AIRFLOW-3090] Specify path of key file in log message (#3921) [AIRFLOW-3067] Display www_rbac Flask flash msg properly (#3903) The Flask flash messages are not displayed properly. When we don't give a category for a flash message, defautl value will be 'message'. In some cases, we specify 'error' category. Using Flask-AppBuilder, the flash message will be given a CSS class 'alert-[category]'. But We don't have 'alert-message' or 'alert-error' in the current 'bootstrap-theme.css' file. This makes the the flash messages in www_rbac UI come with no background color. This commit addresses this issue by adding 'alert-message' (using specs of existing CSS class 'alert-info') and 'alert-error' (using specs of existing CSS class 'alert-danger') into 'bootstrap-theme.css'. [AIRFLOW-3109] Bugfix to allow user/op roles to clear task intance via UI by default add show statements to hql filtering. [AIRFLOW-3051] Change CLI to make users ops similar to connections The ability to manipulate users from the command line is a bit clunky. Currently 'airflow create_user' and 'airflow delete_user' and 'airflow list_users'. It seems that these ought to be made more like connections, so that it becomes 'airflow users list ...', 'airflow users delete ...' and 'airflow users create ...' [AIRFLOW-3009] Import Hashable from collection.abc to fix Python 3.7 deprecation warning (#3849) [AIRFLOW-XXX] Add Tesla as an Apache Airflow user (#3947) [AIRFLOW-3111] Fix instructions in UPDATING.md and remove comment (#3944) artifacts in default_airflow.cfg - fixed incorrect instructions in UPDATING.md regarding core.log_filename_template and elasticsearch.elasticsearch_log_id_template - removed comments referencing "additional curly braces" from default_airflow.cfg since they're irrelevant to the rendered airflow.cfg [AIRFLOW-3117] Add instructions to allow GPL dependency (#3949) The installation instructions failed to mention how to proceed with the GPL dependency. For those who are not concerned by GPL, it is useful to know how to proceed with GPL dependency. [AIRFLOW-XXX] Add Square to the companies lists [AIRFLOW-XXX] Add Fathom Health to readme [AIRFLOW-XXX] Pin Click to 6.7 to Fix CI (#3962) [AIRFLOW-XXX] Fix SlackWebhookOperator execute method comment (#3963) [AIRFLOW-3100][AIRFLOW-3101] Improve docker compose local testing (#3933) [AIRFLOW-3127] Fix out-dated doc for Celery SSL (#3967) Now in `airflow.cfg`, for Celery-SSL, the item names are "ssl_active", "ssl_key", "ssl_cert", and "ssl_cacert". (since PR https://github.com/apache/incubator-airflow/pull/2806/files) But in the documentation https://airflow.incubator.apache.org/security.html?highlight=celery or https://github.com/apache/incubator-airflow/blob/master/docs/security.rst, it's "CELERY_SSL_ACTIVE", "CELERY_SSL_KEY", "CELERY_SSL_CERT", and "CELERY_SSL_CACERT", which is out-dated and may confuse readers. [AIRFLOW-XXX] Fix PythonVirtualenvOperator tests (#3968) The recent update to the CI image changed the default python from python2 to python3. The PythonVirtualenvOperator tests expected python2 as default and fail due to serialisation errors. [AIRFLOW-2952] Fix Kubernetes CI (#3957) - Update outdated cli command to create user - Remove `airflow/example_dags_kubernetes` as the dag already exists in `contrib/example_dags/` - Update the path to copy K8s dags [AIRFLOW-3104] Add .airflowignore info into doc (#3939) .airflowignore is a nice feature, but it was not mentioned at all in the documentation. [AIRFLOW-XXX] Add Delete for CLI Example in UPDATING.md [AIRFLOW-3123] Use a stack for DAG context management (#3956) [AIRFLOW-3125] Monitor Task Instances creation rates (#3966) Montor Task Instances creation rates by Operator type. These stats can provide some visibility on how much workload Airflow is getting. They can be used for resource allocation in the long run (i.e. to determine when we should scale up workers) and debugging in scenarios like the creation rate of certain type of Task Instances spikes. [AIRFLOW-3129] Backfill mysql hook unit tests. (#3970) [AIRFLOW-3124] Fix RBAC webserver debug mode (#3958) [AIRFLOW-XXX] Add Compass to companies list (#3972) We're using Airflow at Compass now. [AIRFLOW-XXX] Speed up DagBagTest cases (#3974) I noticed that many of the tests of DagBags operate on a specific DAG only, and don't need to load the example or test dags. By not loading the dags we don't need to this shaves about 10-20s of test time. [AIRFLOW-2912] Add Deploy and Delete operators for GCF (#3969) Both Deploy and Delete operators interact with Google Cloud Functions to manage functions. Both are idempotent and make use of GcfHook - hook that encapsulates communication with GCP over GCP API. [AIRFLOW-1390] Update Alembic to 0.9 (#3935) [AIRFLOW-2238] Update PR tool to remove outdated info (#3978) [AIRFLOW-XXX] Don't spam test logs with "bad cron expression" messages (#3973) We needed these test dags to check the behaviour of invalid cron expressions, but by default we were loading them every time we create a DagBag (which many, many tests to). Instead we ignore these known-bad dags by default, and the test checking those (tests/models.py:DagBagTest.test_process_file_cron_validity_check) is already explicitly processing those DAGs directly, so it remains tested. [AIRFLOW-XXX] Fix undocumented params in S3_hook Some function parameters were undocumented. Additional docstrings were added for clarity. [AIRFLOW-3079] Improve migration scripts to support MSSQL Server (#3964) There were two problems for MSSQL. First, 'timestamp' data type in MSSQL Server is essentially a row-id, and not a timezone enabled date/time stamp. Second, alembic creates invalid SQL when applying the 0/1 constraint to boolean values. MSSQL should enforce this constraint by simply asserting a boolean value. [AIRFLOW-XXX] Add DoorDash to README.md (#3980) DoorDash uses Airflow https://softwareengineeringdaily.com/2018/09/28/doordash/ [AIRFLOW-3062] Add Qubole in integration docs (#3946) [AIRFLOW-3129] Improve test coverage of airflow.models. (#3982) [AIRFLOW-2574] Cope with '%' in SQLA DSN when running migrations (#3787) Alembic uses a ConfigParser like Airflow does, and "%% is a special value in there, so we need to escape it. As per the Alembic docs: > Note that this value is passed to ConfigParser.set, which supports > variable interpolation using pyformat (e.g. `%(some_value)s`). A raw > percent sign not part of an interpolation symbol must therefore be > escaped, e.g. `%%` [AIRFLOW-3137] Make ProxyFix middleware optional. (#3983) The ProxyFix middleware should only be used when airflow is running behind a trusted proxy. This patch adds a `USE_PROXY_FIX` flag that defaults to `False`. [AIRFLOW-3004] Add config disabling scheduler cron (#3899) [AIRFLOW-3103][AIRFLOW-3147] Update flask-appbuilder (#3937) [AIRFLOW-XXX] Fixing the issue in Documentation (#3998) Fixing the operator name from DataFlowOperation to DataFlowJavaOperator in Documentation [AIRFLOW-3088] Include slack-compatible emoji image [AIRFLOW-3161] fix TaskInstance log link in RBAC UI [AIRFLOW-3148] Remove unnecessary arg "parameters" in RedshiftToS3Transfer (#3995) "Parameters" are used to help render the SQL command. But in this operator, only "schema" and "table" are needed. There is no SQL command to render. By checking the code,we can also find argument "parameters" is never really used. (Fix a minor issue in the docstring as well) [AIRFLOW-3159] Update GCS logging docs for latest code (#3952) [AIRFLOW-XXX] Fix airflow.models.DAG docstring mistake Closes #4004 from Sambeth/sambeth Updated the tests written for s3/sftp operators Fixed the flask diff errors. Fixed aws connection test Fixed flask diff errors. Updated test_s3_to_sftp_operator with correct class name. Fixed test_s3_to_sftp_operator error reported in travis. Fixed test_s3_to_sftp_operator error reported in travis. Changed default values for s3_to_sftp_operator Updated test for checking for sftp file content. Fixed flask diff error. [AIRFLOW-XXX] Adding Home Depot as users of Apache airflow (#4013) * Adding Home Depot as users of Apache airflow [AIRFLOW-XXX] Added ThoughtWorks as user of Airflow in README (#4012) [AIRFLOW-XXX] Added DataCamp to list of companies in README (#4009) [AIRFLOW-3165] Document interpolation of '%' and warn (#4007) [AIRFLOW-3099] Complete list of optional airflow.cfg sections (#4002) [AIRFLOW-3162] Fix HttpHook URL parse error when port is specified (#4001) [AIRFLOW-3055] add get_dataset and get_datasets_list to bigquery_hook (#3894) * [AIRFLOW-3055] add get_dataset and get_datasets_list to bigquery_hook --- .github/stale.yml | 55 ++ .readthedocs.yml | 9 +- .travis.yml | 32 +- CHANGELOG.txt | 1 - CONTRIBUTING.md | 11 +- LICENSE | 1 + NOTICE | 5 + README.md | 47 +- UPDATING.md | 65 +- airflow/__init__.py | 13 - airflow/api/common/experimental/mark_tasks.py | 1 + airflow/bin/cli.py | 334 +++++++--- airflow/config_templates/default_airflow.cfg | 17 +- airflow/config_templates/default_test.cfg | 1 + airflow/configuration.py | 1 + .../auth/backends/github_enterprise_auth.py | 27 +- airflow/contrib/auth/backends/google_auth.py | 3 + .../contrib/auth/backends/kerberos_auth.py | 5 +- airflow/contrib/auth/backends/ldap_auth.py | 5 +- .../contrib/auth/backends/password_auth.py | 5 +- .../contrib/example_dags/__init__.py | 2 +- .../example_gcp_function_delete.py | 58 ++ .../example_gcp_function_deploy_delete.py | 113 ++++ .../example_kubernetes_annotation.py | 0 .../example_kubernetes_executor.py | 0 .../example_kubernetes_operator.py | 3 +- .../example_dags/example_twitter_README.md | 2 +- .../contrib/executors/kubernetes_executor.py | 2 +- airflow/contrib/hooks/__init__.py | 51 -- airflow/contrib/hooks/aws_hook.py | 9 +- airflow/contrib/hooks/azure_data_lake_hook.py | 2 +- airflow/contrib/hooks/azure_fileshare_hook.py | 8 +- airflow/contrib/hooks/bigquery_hook.py | 496 ++++++++++---- airflow/contrib/hooks/cassandra_hook.py | 4 +- airflow/contrib/hooks/databricks_hook.py | 84 ++- airflow/contrib/hooks/datadog_hook.py | 16 +- airflow/contrib/hooks/gcp_api_base_hook.py | 6 +- airflow/contrib/hooks/gcp_container_hook.py | 5 + airflow/contrib/hooks/gcp_dataflow_hook.py | 40 +- airflow/contrib/hooks/gcp_dataproc_hook.py | 36 +- airflow/contrib/hooks/gcp_function_hook.py | 195 ++++++ airflow/contrib/hooks/gcp_mlengine_hook.py | 2 +- airflow/contrib/hooks/gcp_pubsub_hook.py | 34 +- airflow/contrib/hooks/gcs_hook.py | 71 +- airflow/contrib/hooks/jira_hook.py | 2 +- airflow/contrib/hooks/redis_hook.py | 2 +- airflow/contrib/hooks/sagemaker_hook.py | 83 ++- airflow/contrib/hooks/segment_hook.py | 2 +- airflow/contrib/hooks/wasb_hook.py | 4 +- airflow/contrib/hooks/winrm_hook.py | 26 +- .../kubernetes_request_factory.py | 5 + .../pod_request_factory.py | 2 + airflow/contrib/kubernetes/pod.py | 4 +- airflow/contrib/kubernetes/pod_generator.py | 2 +- airflow/contrib/kubernetes/pod_launcher.py | 11 +- airflow/contrib/operators/__init__.py | 34 - .../contrib/operators/awsbatch_operator.py | 16 +- .../operators/bigquery_check_operator.py | 20 +- .../contrib/operators/bigquery_get_data.py | 12 +- .../contrib/operators/bigquery_operator.py | 249 ++++--- .../bigquery_table_delete_operator.py | 8 +- .../contrib/operators/bigquery_to_bigquery.py | 10 +- airflow/contrib/operators/bigquery_to_gcs.py | 18 +- airflow/contrib/operators/cassandra_to_gcs.py | 14 +- .../contrib/operators/databricks_operator.py | 320 +++++++-- .../contrib/operators/dataflow_operator.py | 240 +++---- .../contrib/operators/dataproc_operator.py | 284 +++++--- .../operators/datastore_export_operator.py | 8 +- .../operators/datastore_import_operator.py | 8 +- airflow/contrib/operators/ecs_operator.py | 52 +- .../operators/emr_add_steps_operator.py | 2 +- .../operators/emr_create_job_flow_operator.py | 2 +- .../emr_terminate_job_flow_operator.py | 2 +- airflow/contrib/operators/file_to_gcs.py | 12 +- .../operators/gcp_container_operator.py | 221 +++---- .../operators/gcp_function_operator.py | 563 ++++++++++++++++ .../operators/gcs_download_operator.py | 12 +- .../contrib/operators/gcs_list_operator.py | 10 +- airflow/contrib/operators/gcs_operator.py | 12 +- airflow/contrib/operators/gcs_to_bq.py | 40 +- airflow/contrib/operators/gcs_to_gcs.py | 21 +- airflow/contrib/operators/gcs_to_s3.py | 24 +- .../operators/jenkins_job_trigger_operator.py | 6 +- .../operators/kubernetes_pod_operator.py | 16 +- .../contrib/operators/mlengine_operator.py | 73 +- .../operators/mlengine_operator_utils.py | 18 +- airflow/contrib/operators/mysql_to_gcs.py | 12 +- .../operators/postgres_to_gcs_operator.py | 66 +- airflow/contrib/operators/pubsub_operator.py | 44 +- .../operators/qubole_check_operator.py | 4 +- .../operators/s3_copy_object_operator.py | 93 +++ .../operators/s3_delete_objects_operator.py | 85 +++ airflow/contrib/operators/s3_list_operator.py | 22 +- .../contrib/operators/s3_to_gcs_operator.py | 30 +- .../contrib/operators/s3_to_sftp_operator.py | 85 +++ .../sagemaker_create_training_job_operator.py | 8 +- ...sagemaker_create_transform_job_operator.py | 132 ++++ .../sagemaker_create_tuning_job_operator.py | 8 +- .../operators/segment_track_event_operator.py | 8 +- airflow/contrib/operators/sftp_operator.py | 22 +- .../contrib/operators/sftp_to_s3_operator.py | 90 +++ .../operators/slack_webhook_operator.py | 6 +- .../contrib/operators/snowflake_operator.py | 6 +- airflow/contrib/operators/ssh_operator.py | 22 +- airflow/contrib/operators/vertica_operator.py | 2 +- airflow/contrib/sensors/bash_sensor.py | 4 +- airflow/contrib/sensors/bigquery_sensor.py | 10 +- .../sensors/cassandra_record_sensor.py | 4 +- .../contrib/sensors/cassandra_table_sensor.py | 4 +- airflow/contrib/sensors/datadog_sensor.py | 2 +- .../contrib/sensors/emr_job_flow_sensor.py | 2 +- airflow/contrib/sensors/emr_step_sensor.py | 4 +- airflow/contrib/sensors/file_sensor.py | 4 +- airflow/contrib/sensors/gcs_sensor.py | 24 +- airflow/contrib/sensors/mongo_sensor.py | 4 +- airflow/contrib/sensors/pubsub_sensor.py | 8 +- airflow/contrib/sensors/qubole_sensor.py | 40 +- airflow/contrib/sensors/redis_key_sensor.py | 4 +- .../sensors/sagemaker_training_sensor.py | 6 +- .../sensors/sagemaker_transform_sensor.py | 69 ++ .../sensors/sagemaker_tuning_sensor.py | 8 +- .../contrib/task_runner/cgroup_task_runner.py | 2 +- airflow/default_login.py | 3 + airflow/exceptions.py | 11 + airflow/executors/celery_executor.py | 117 +++- airflow/executors/local_executor.py | 6 +- airflow/hooks/S3_hook.py | 104 ++- airflow/hooks/__init__.py | 64 -- airflow/hooks/druid_hook.py | 2 +- airflow/hooks/hdfs_hook.py | 4 +- airflow/hooks/hive_hooks.py | 33 +- airflow/hooks/http_hook.py | 6 +- airflow/hooks/slack_hook.py | 4 +- airflow/jobs.py | 8 +- airflow/logging_config.py | 33 + airflow/macros/__init__.py | 17 - airflow/macros/hive.py | 6 +- .../0a2a5b66e19d_add_task_reschedule_table.py | 91 +++ .../0e2a74e0fc9f_add_time_zone_awareness.py | 6 +- ...4_add_kubernetes_resource_checkpointing.py | 17 +- ...5c0_add_kubernetes_scheduler_uniqueness.py | 17 +- airflow/models.py | 307 ++++++--- airflow/operators/__init__.py | 90 --- airflow/operators/bash_operator.py | 2 +- airflow/operators/check_operator.py | 4 +- airflow/operators/docker_operator.py | 12 +- airflow/operators/druid_check_operator.py | 4 +- airflow/operators/email_operator.py | 8 +- airflow/operators/hive_operator.py | 12 +- airflow/operators/hive_to_samba_operator.py | 6 +- airflow/operators/http_operator.py | 6 +- airflow/operators/jdbc_operator.py | 2 +- airflow/operators/mssql_operator.py | 6 +- airflow/operators/mysql_operator.py | 4 +- airflow/operators/oracle_operator.py | 3 +- airflow/operators/pig_operator.py | 6 +- airflow/operators/postgres_operator.py | 4 +- airflow/operators/presto_check_operator.py | 10 +- airflow/operators/redshift_to_s3_operator.py | 29 +- .../operators/s3_file_transform_operator.py | 22 +- airflow/operators/s3_to_hive_operator.py | 14 +- airflow/operators/s3_to_redshift_operator.py | 26 +- airflow/operators/slack_operator.py | 18 +- airflow/operators/sqlite_operator.py | 4 +- airflow/sensors/__init__.py | 46 -- airflow/sensors/base_sensor_operator.py | 56 +- airflow/sensors/external_task_sensor.py | 4 +- airflow/sensors/hive_partition_sensor.py | 4 +- airflow/sensors/http_sensor.py | 6 +- airflow/sensors/s3_key_sensor.py | 14 +- airflow/sensors/s3_prefix_sensor.py | 16 +- airflow/sensors/sql_sensor.py | 2 +- airflow/ti_deps/dep_context.py | 16 +- airflow/ti_deps/deps/ready_to_reschedule.py | 69 ++ airflow/ti_deps/deps/trigger_rule_dep.py | 12 +- airflow/utils/dag_processing.py | 4 +- airflow/utils/db.py | 10 +- airflow/utils/email.py | 7 +- airflow/utils/helpers.py | 118 ---- airflow/utils/log/gcs_task_handler.py | 6 +- airflow/utils/log/logging_mixin.py | 2 +- airflow/utils/log/s3_task_handler.py | 6 +- airflow/utils/log/wasb_task_handler.py | 6 +- airflow/utils/operator_resources.py | 4 +- airflow/utils/state.py | 2 +- airflow/www/app.py | 9 +- airflow/www/static/gantt-chart-d3v2.js | 2 +- airflow/www/static/main.css | 1 + airflow/www/utils.py | 30 +- airflow/www/views.py | 57 +- .../www_rbac/api/experimental/endpoints.py | 1 + airflow/www_rbac/app.py | 3 +- airflow/www_rbac/decorators.py | 2 +- airflow/www_rbac/security.py | 8 +- .../www_rbac/static/css/bootstrap-theme.css | 22 + airflow/www_rbac/static/css/main.css | 1 + .../www_rbac/static/js/{clock.js => base.js} | 7 + .../www_rbac/static/js/gantt-chart-d3v2.js | 2 +- .../templates/appbuilder/baselayout.html | 4 +- .../templates/appbuilder/navbar_right.html | 2 +- airflow/www_rbac/utils.py | 20 + airflow/www_rbac/views.py | 70 +- airflow/www_rbac/webpack.config.js | 2 +- dev/README.md | 6 +- dev/airflow-jira | 61 +- docs/code.rst | 15 +- docs/concepts.rst | 35 +- docs/conf.py | 5 +- docs/faq.rst | 14 +- docs/howto/executor/use-celery.rst | 2 +- docs/howto/manage-connections.rst | 6 +- docs/howto/operator.rst | 120 ++++ docs/howto/secure-connections.rst | 2 +- docs/howto/write-logs.rst | 67 +- docs/img/code.png | Bin 218215 -> 285906 bytes docs/img/context.png | Bin 238360 -> 149588 bytes docs/img/dags.png | Bin 115068 -> 217069 bytes docs/img/duration.png | Bin 254497 -> 250846 bytes docs/img/gantt.png | Bin 213845 -> 121795 bytes docs/img/graph.png | Bin 333294 -> 152205 bytes .../logos/airflow_1200x315_transparent.png | Bin 0 -> 20480 bytes docs/img/logos/airflow_2040x1370_black.png | Bin 0 -> 94208 bytes .../airflow_2040x1370_blue_name_spin_o_3d.png | Bin 0 -> 225280 bytes .../logos/airflow_3600x944_transparent.png | Bin 0 -> 49152 bytes .../logos/airflow_64x64_emoji_transparent.png | Bin 0 -> 4453 bytes ...w_960x560_blue_name_spin_o_transparent.png | Bin 0 -> 12288 bytes .../img/logos/airflow_960x560_transparent.png | Bin 0 -> 20480 bytes ...irflow_960x560_transparent_mod_concept.png | Bin 0 -> 20480 bytes .../airflow_blue_name_spin_o_transparent.svg | 136 ++++ .../logos/airflow_transparent_dark_gray.svg | 152 +++++ docs/img/logos/airflow_transparent_gray.svg | 156 +++++ docs/img/tree.png | Bin 163147 -> 128024 bytes docs/installation.rst | 5 +- docs/integration.rst | 77 +++ docs/kubernetes.rst | 9 +- docs/profiling.rst | 6 + docs/scheduler.rst | 14 +- docs/security.rst | 21 +- docs/timezone.rst | 69 +- docs/tutorial.rst | 10 +- docs/ui.rst | 2 +- run_unit_tests.sh | 4 - scripts/ci/2-setup-kdc.sh | 2 +- scripts/ci/4-load-data.sh | 29 - scripts/ci/5-run-tests.sh | 17 +- scripts/ci/airflow_travis.cfg | 1 + scripts/ci/data/baby_names.csv | 54 -- scripts/ci/data/mysql_schema.sql | 27 - scripts/ci/docker-compose-kubernetes.yml | 28 + scripts/ci/docker-compose.yml | 4 +- scripts/ci/krb5/krb-conf/server/kdc.conf | 30 - .../ci/krb5/{krb-conf/client => }/krb5.conf | 8 +- scripts/ci/krb5/start_kdc.sh | 41 -- scripts/ci/krb5/supervisord.conf | 43 -- .../docker/airflow-test-env-init.sh | 3 +- scripts/ci/kubernetes/docker/build.sh | 10 +- scripts/ci/kubernetes/kube/airflow.yaml | 1 - scripts/ci/kubernetes/kube/configmaps.yaml | 6 +- scripts/ci/kubernetes/kube/deploy.sh | 2 + .../ci/kubernetes/minikube/start_minikube.sh | 5 +- scripts/ci/kubernetes/setup_kubernetes.sh | 1 - scripts/ci/run-ci.sh | 16 +- scripts/perf/dags/perf_dag_1.py | 4 +- scripts/perf/dags/perf_dag_2.py | 4 +- scripts/perf/scheduler_ops_metrics.py | 7 +- setup.cfg | 2 +- setup.py | 10 +- tests/cli/__init__.py | 4 +- tests/cli/test_cli.py | 96 ++- tests/configuration.py | 4 +- tests/contrib/__init__.py | 8 +- tests/contrib/hooks/__init__.py | 4 +- tests/contrib/hooks/test_aws_dynamodb_hook.py | 4 +- tests/contrib/hooks/test_aws_hook.py | 4 +- tests/contrib/hooks/test_aws_lambda_hook.py | 5 +- tests/contrib/hooks/test_bigquery_hook.py | 410 +++++++++++- tests/contrib/hooks/test_databricks_hook.py | 253 ++++++- .../hooks/test_discord_webhook_hook.py | 4 +- tests/contrib/hooks/test_emr_hook.py | 4 +- tests/contrib/hooks/test_ftp_hook.py | 12 +- tests/contrib/hooks/test_gcp_dataflow_hook.py | 53 +- tests/contrib/hooks/test_gcp_dataproc_hook.py | 55 +- tests/contrib/hooks/test_gcp_pubsub_hook.py | 4 +- tests/contrib/hooks/test_jdbc_hook.py | 4 +- tests/contrib/hooks/test_jira_hook.py | 4 +- tests/contrib/hooks/test_redis_hook.py | 4 +- tests/contrib/hooks/test_redshift_hook.py | 4 +- tests/contrib/hooks/test_sagemaker_hook.py | 93 +++ tests/contrib/hooks/test_sftp_hook.py | 4 +- .../contrib/hooks/test_slack_webhook_hook.py | 4 +- tests/contrib/hooks/test_snowflake_hook.py | 4 +- tests/contrib/hooks/test_spark_jdbc_hook.py | 4 +- tests/contrib/hooks/test_spark_sql_hook.py | 2 - tests/contrib/hooks/test_sqoop_hook.py | 4 +- tests/contrib/hooks/test_wasb_hook.py | 4 +- tests/contrib/hooks/test_zendesk_hook.py | 4 +- .../minikube/test_kubernetes_executor.py | 24 +- .../minikube/test_kubernetes_pod_operator.py | 62 +- tests/contrib/operators/__init__.py | 4 +- .../operators/test_awsbatch_operator.py | 4 +- .../operators/test_bigquery_operator.py | 25 +- .../operators/test_databricks_operator.py | 321 +++++++-- .../operators/test_dataflow_operator.py | 96 ++- .../operators/test_dataproc_operator.py | 50 +- .../test_discord_webhook_operator.py | 4 +- .../contrib/operators/test_druid_operator.py | 4 +- tests/contrib/operators/test_ecs_operator.py | 49 +- .../operators/test_emr_add_steps_operator.py | 4 +- .../test_emr_create_job_flow_operator.py | 4 +- .../test_emr_terminate_job_flow_operator.py | 4 +- tests/contrib/operators/test_file_to_wasb.py | 4 +- .../operators/test_gcp_function_operator.py | 624 ++++++++++++++++++ .../operators/test_gcs_download_operator.py | 4 +- .../operators/test_gcs_list_operator.py | 4 +- .../operators/test_gcs_to_s3_operator.py | 4 +- .../operators/test_hipchat_operator.py | 4 +- .../test_hive_to_dynamodb_operator.py | 4 +- .../operators/test_jenkins_operator.py | 4 +- .../operators/test_jira_operator_test.py | 4 +- .../operators/test_mlengine_operator_utils.py | 2 +- .../operators/test_mysql_to_gcs_operator.py | 4 +- .../test_postgres_to_gcs_operator.py | 101 +-- .../contrib/operators/test_pubsub_operator.py | 4 +- .../operators/test_qubole_check_operator.py | 29 +- .../operators/test_s3_copy_object_operator.py | 89 +++ .../test_s3_delete_objects_operator.py | 85 +++ .../operators/test_s3_list_operator.py | 4 +- .../operators/test_s3_to_gcs_operator.py | 8 +- .../operators/test_s3_to_sftp_operator.py | 167 +++++ tests/contrib/operators/test_sftp_operator.py | 80 ++- .../operators/test_sftp_to_s3_operator.py | 144 ++++ .../operators/test_slack_webhook_operator.py | 4 +- .../operators/test_snowflake_operator.py | 4 +- .../operators/test_spark_jdbc_operator.py | 4 +- .../operators/test_spark_sql_operator.py | 4 +- .../operators/test_spark_submit_operator.py | 4 +- .../contrib/operators/test_sqoop_operator.py | 4 +- tests/contrib/operators/test_ssh_operator.py | 60 ++ tests/contrib/sensors/__init__.py | 4 +- .../test_aws_redshift_cluster_sensor.py | 4 +- tests/contrib/sensors/test_bash_sensor.py | 4 +- tests/contrib/sensors/test_datadog_sensor.py | 4 +- tests/contrib/sensors/test_emr_base_sensor.py | 4 +- .../sensors/test_emr_job_flow_sensor.py | 4 +- tests/contrib/sensors/test_emr_step_sensor.py | 4 +- tests/contrib/sensors/test_file_sensor.py | 4 +- tests/contrib/sensors/test_ftp_sensor.py | 4 +- tests/contrib/sensors/test_hdfs_sensor.py | 4 +- .../contrib/sensors/test_jira_sensor_test.py | 4 +- tests/contrib/sensors/test_pubsub_sensor.py | 4 +- tests/contrib/sensors/test_qubole_sensor.py | 4 +- tests/contrib/sensors/test_redis_sensor.py | 4 +- .../test_sagemaker_transform_sensor.py | 118 ++++ tests/contrib/sensors/test_sftp_sensor.py | 4 +- tests/contrib/sensors/test_wasb_sensor.py | 4 +- tests/contrib/utils/__init__.py | 4 +- tests/core.py | 150 ++++- tests/dags/.airflowignore | 1 + tests/dags/no_dags.py | 4 +- tests/dags/test_backfill_pooled_tasks.py | 4 +- tests/dags/test_cli_triggered_dags.py | 4 +- tests/dags/test_default_impersonation.py | 4 +- tests/dags/test_double_trigger.py | 4 +- tests/dags/test_impersonation.py | 4 +- tests/dags/test_impersonation_custom.py | 4 +- tests/dags/test_impersonation_subdag.py | 4 +- tests/dags/test_issue_1225.py | 4 +- tests/dags/test_latest_runs.py | 4 +- tests/dags/test_mark_success.py | 4 +- tests/dags/test_no_impersonation.py | 4 +- tests/dags/test_on_kill.py | 4 +- tests/dags/test_retry_handling_job.py | 4 +- tests/dags/test_scheduler_dags.py | 4 +- tests/dags_with_system_exit/a_system_exit.py | 4 +- .../b_test_scheduler_dags.py | 4 +- tests/dags_with_system_exit/c_system_exit.py | 4 +- tests/executors/__init__.py | 6 +- tests/executors/dask_executor.py | 4 +- tests/executors/test_base_executor.py | 4 +- tests/executors/test_celery_executor.py | 29 +- tests/executors/test_executor.py | 4 +- tests/executors/test_local_executor.py | 4 +- tests/hooks/test_http_hook.py | 35 + tests/hooks/test_mysql_hook.py | 86 +++ tests/hooks/test_postgres_hook.py | 27 +- tests/impersonation.py | 4 +- tests/jobs.py | 73 +- tests/macros/__init__.py | 4 +- tests/macros/test_hive.py | 6 +- tests/models.py | 476 +++++++++++-- tests/operators/__init__.py | 12 +- tests/operators/docker_operator.py | 8 +- tests/operators/latest_only_operator.py | 6 +- tests/operators/operators.py | 113 +++- tests/operators/s3_to_hive_operator.py | 4 +- tests/operators/slack_operator.py | 4 +- tests/operators/test_check_operator.py | 4 +- .../operators/test_redshift_to_s3_operator.py | 4 +- .../test_s3_file_transform_operator.py | 4 +- .../operators/test_s3_to_redshift_operator.py | 4 +- ...sagemaker_create_transform_job_operator.py | 140 ++++ tests/operators/test_virtualenv_operator.py | 38 +- tests/plugins/test_plugin.py | 4 +- tests/plugins_manager.py | 7 +- tests/security/__init__.py | 6 +- tests/security/kerberos.py | 4 +- tests/sensors/__init__.py | 4 +- tests/sensors/test_base_sensor.py | 303 ++++++++- tests/sensors/test_external_task_sensor.py | 4 +- tests/sensors/test_hdfs_sensor.py | 4 +- tests/sensors/test_http_sensor.py | 10 +- tests/sensors/test_sql_sensor.py | 4 +- tests/sensors/test_timedelta_sensor.py | 4 +- tests/sensors/test_timeout_sensor.py | 4 +- tests/test_logging_config.py | 41 +- tests/test_utils/__init__.py | 4 +- tests/test_utils/reset_warning_registry.py | 4 +- tests/ti_deps/__init__.py | 4 +- tests/ti_deps/contexts/__init__.py | 4 +- tests/ti_deps/deps/__init__.py | 4 +- tests/ti_deps/deps/fake_models.py | 4 +- .../deps/test_dag_ti_slots_available_dep.py | 4 +- tests/ti_deps/deps/test_dag_unpaused_dep.py | 4 +- tests/ti_deps/deps/test_dagrun_exists_dep.py | 4 +- .../deps/test_not_in_retry_period_dep.py | 4 +- tests/ti_deps/deps/test_not_running_dep.py | 4 +- tests/ti_deps/deps/test_not_skipped_dep.py | 4 +- tests/ti_deps/deps/test_prev_dagrun_dep.py | 4 +- .../deps/test_ready_to_reschedule_dep.py | 94 +++ .../deps/test_runnable_exec_date_dep.py | 4 +- tests/ti_deps/deps/test_task_concurrency.py | 5 +- tests/ti_deps/deps/test_trigger_rule_dep.py | 4 +- tests/ti_deps/deps/test_valid_state_dep.py | 4 +- tests/utils.py | 4 +- tests/utils/__init__.py | 4 +- tests/utils/log/__init__.py | 4 +- tests/utils/log/test_es_task_handler.py | 4 +- .../utils/log/test_file_processor_handler.py | 4 +- tests/utils/test_cli_util.py | 4 +- tests/utils/test_compression.py | 4 +- tests/utils/test_dag_processing.py | 4 +- tests/utils/test_dates.py | 4 +- tests/utils/test_db.py | 39 +- tests/utils/test_decorators.py | 4 +- .../Dockerfile => tests/utils/test_email.py | 44 +- tests/utils/test_helpers.py | 4 +- tests/utils/test_json.py | 4 +- tests/utils/test_log_handlers.py | 4 +- tests/utils/test_logging_mixin.py | 8 +- tests/utils/test_module_loading.py | 4 +- tests/utils/test_net.py | 4 +- tests/utils/test_timezone.py | 4 +- tests/utils/test_trigger_rule.py | 4 +- tests/utils/test_weight_rule.py | 4 +- tests/www/__init__.py | 4 +- tests/www/api/__init__.py | 4 +- tests/www/api/experimental/__init__.py | 4 +- tests/www/api/experimental/test_endpoints.py | 4 +- .../experimental/test_kerberos_endpoints.py | 5 +- .../experimental/test_password_endpoints.py | 3 - tests/www/test_utils.py | 40 +- tests/www/test_validators.py | 4 +- tests/www/test_views.py | 4 +- tests/www_rbac/test_security.py | 6 +- tests/www_rbac/test_utils.py | 35 + tests/www_rbac/test_views.py | 55 ++ tox.ini | 9 +- 467 files changed, 10833 insertions(+), 3197 deletions(-) create mode 100644 .github/stale.yml rename scripts/ci/krb5/krb-conf/server/kadm5.acl => airflow/contrib/example_dags/__init__.py (97%) create mode 100644 airflow/contrib/example_dags/example_gcp_function_delete.py create mode 100644 airflow/contrib/example_dags/example_gcp_function_deploy_delete.py rename airflow/{ => contrib}/example_dags/example_kubernetes_annotation.py (100%) rename airflow/{ => contrib}/example_dags/example_kubernetes_executor.py (100%) rename airflow/{ => contrib}/example_dags/example_kubernetes_operator.py (97%) create mode 100644 airflow/contrib/hooks/gcp_function_hook.py create mode 100644 airflow/contrib/operators/gcp_function_operator.py create mode 100644 airflow/contrib/operators/s3_copy_object_operator.py create mode 100644 airflow/contrib/operators/s3_delete_objects_operator.py create mode 100644 airflow/contrib/operators/s3_to_sftp_operator.py create mode 100644 airflow/contrib/operators/sagemaker_create_transform_job_operator.py create mode 100644 airflow/contrib/operators/sftp_to_s3_operator.py create mode 100644 airflow/contrib/sensors/sagemaker_transform_sensor.py create mode 100644 airflow/migrations/versions/0a2a5b66e19d_add_task_reschedule_table.py create mode 100644 airflow/ti_deps/deps/ready_to_reschedule.py rename airflow/www_rbac/static/js/{clock.js => base.js} (84%) create mode 100644 docs/img/logos/airflow_1200x315_transparent.png create mode 100644 docs/img/logos/airflow_2040x1370_black.png create mode 100644 docs/img/logos/airflow_2040x1370_blue_name_spin_o_3d.png create mode 100644 docs/img/logos/airflow_3600x944_transparent.png create mode 100644 docs/img/logos/airflow_64x64_emoji_transparent.png create mode 100644 docs/img/logos/airflow_960x560_blue_name_spin_o_transparent.png create mode 100644 docs/img/logos/airflow_960x560_transparent.png create mode 100644 docs/img/logos/airflow_960x560_transparent_mod_concept.png create mode 100644 docs/img/logos/airflow_blue_name_spin_o_transparent.svg create mode 100644 docs/img/logos/airflow_transparent_dark_gray.svg create mode 100644 docs/img/logos/airflow_transparent_gray.svg delete mode 100755 scripts/ci/4-load-data.sh delete mode 100644 scripts/ci/data/baby_names.csv delete mode 100644 scripts/ci/data/mysql_schema.sql create mode 100644 scripts/ci/docker-compose-kubernetes.yml delete mode 100644 scripts/ci/krb5/krb-conf/server/kdc.conf rename scripts/ci/krb5/{krb-conf/client => }/krb5.conf (92%) delete mode 100755 scripts/ci/krb5/start_kdc.sh delete mode 100644 scripts/ci/krb5/supervisord.conf create mode 100644 tests/contrib/operators/test_gcp_function_operator.py create mode 100644 tests/contrib/operators/test_s3_copy_object_operator.py create mode 100644 tests/contrib/operators/test_s3_delete_objects_operator.py create mode 100644 tests/contrib/operators/test_s3_to_sftp_operator.py create mode 100644 tests/contrib/operators/test_sftp_to_s3_operator.py create mode 100644 tests/contrib/sensors/test_sagemaker_transform_sensor.py create mode 100644 tests/dags/.airflowignore create mode 100644 tests/operators/test_sagemaker_create_transform_job_operator.py create mode 100644 tests/ti_deps/deps/test_ready_to_reschedule_dep.py rename scripts/ci/krb5/Dockerfile => tests/utils/test_email.py (50%) diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000000000..734dda6598df2 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,55 @@ +# Configuration for probot-stale - https://github.com/probot/stale + +# Number of days of inactivity before an Issue or Pull Request becomes stale +daysUntilStale: 45 + +# Number of days of inactivity before an Issue or Pull Request with the stale label is closed. +# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. +daysUntilClose: 7 + +# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable +exemptLabels: + - pinned + - security + - "[Status] Maybe Later" + +# Set to true to ignore issues in a project (defaults to false) +exemptProjects: false + +# Set to true to ignore issues in a milestone (defaults to false) +exemptMilestones: false + +# Label to use when marking as stale +staleLabel: stale + +# Comment to post when marking as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. + +# Comment to post when removing the stale label. +# unmarkComment: > +# Your comment here. + +# Comment to post when closing a stale Issue or Pull Request. +# closeComment: > +# Your comment here. + +# Limit the number of actions per hour, from 1-30. Default is 30 +limitPerRun: 30 + +# Limit to only `issues` or `pulls` +# only: issues + +# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': +# pulls: +# daysUntilStale: 30 +# markComment: > +# This pull request has been automatically marked as stale because it has not had +# recent activity. It will be closed if no further activity occurs. Thank you +# for your contributions. + +# issues: +# exemptLabels: +# - confirmed diff --git a/.readthedocs.yml b/.readthedocs.yml index c6a4da8d690c8..87fb227d81cb5 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -19,7 +19,14 @@ python: pip_install: true extra_requirements: + - all_dbs + - databricks - doc - docker - - gcp_api - emr + - gcp_api + - s3 + - salesforce + - sendgrid + - ssh + - slack diff --git a/.travis.yml b/.travis.yml index 5bd750453a563..dd493363ab1e7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,23 +26,24 @@ env: - TRAVIS_CACHE=$HOME/.travis_cache/ matrix: - TOX_ENV=flake8 - - TOX_ENV=py27-backend_mysql - - TOX_ENV=py27-backend_sqlite - - TOX_ENV=py27-backend_postgres - - TOX_ENV=py35-backend_mysql PYTHON_VERSION=3 - - TOX_ENV=py35-backend_sqlite PYTHON_VERSION=3 - - TOX_ENV=py35-backend_postgres PYTHON_VERSION=3 - - TOX_ENV=py27-backend_postgres KUBERNETES_VERSION=v1.9.0 - - TOX_ENV=py35-backend_postgres KUBERNETES_VERSION=v1.10.0 PYTHON_VERSION=3 + - TOX_ENV=py27-backend_mysql-env_docker + - TOX_ENV=py27-backend_sqlite-env_docker + - TOX_ENV=py27-backend_postgres-env_docker + - TOX_ENV=py35-backend_mysql-env_docker PYTHON_VERSION=3 + - TOX_ENV=py35-backend_sqlite-env_docker PYTHON_VERSION=3 + - TOX_ENV=py35-backend_postgres-env_docker PYTHON_VERSION=3 + - TOX_ENV=py27-backend_postgres-env_kubernetes KUBERNETES_VERSION=v1.9.0 + - TOX_ENV=py35-backend_postgres-env_kubernetes KUBERNETES_VERSION=v1.10.0 PYTHON_VERSION=3 + cache: directories: - $HOME/.wheelhouse/ - $HOME/.cache/pip - $HOME/.travis_cache/ before_install: - - sudo ls -lh $HOME/.cache/pip/ - - sudo rm -rf $HOME/.cache/pip/* $HOME/.wheelhouse/* - - sudo chown -R travis:travis $HOME/.cache/pip + # Required for K8s v1.10.x. See + # https://github.com/kubernetes/kubernetes/issues/61058#issuecomment-372764783 + - if [ ! -z "$KUBERNETES_VERSION" ]; then sudo mount --make-shared / && sudo service docker restart; fi install: # Use recent docker-compose version - sudo rm /usr/local/bin/docker-compose @@ -50,5 +51,12 @@ install: - chmod +x docker-compose - sudo mv docker-compose /usr/local/bin - pip install --upgrade pip + - if [ ! -z "$KUBERNETES_VERSION" ]; then ./scripts/ci/kubernetes/setup_kubernetes.sh; fi script: - - docker-compose --log-level ERROR -f scripts/ci/docker-compose.yml run airflow-testing /app/scripts/ci/run-ci.sh + - if [ -z "$KUBERNETES_VERSION" ]; then docker-compose --log-level ERROR -f scripts/ci/docker-compose.yml run airflow-testing /app/scripts/ci/run-ci.sh; fi + - if [ ! -z "$KUBERNETES_VERSION" ]; then + ./scripts/ci/kubernetes/kube/deploy.sh && + MINIKUBE_IP=$(minikube ip) docker-compose --log-level ERROR -f scripts/ci/docker-compose.yml -f scripts/ci/docker-compose-kubernetes.yml run airflow-testing /app/scripts/ci/run-ci.sh; + fi +before_cache: + - sudo chown -R travis:travis $HOME/.cache/pip $HOME/.wheelhouse/ diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 06d5aed3f1011..b4ee1755b467a 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -780,7 +780,6 @@ AIRFLOW 1.10.0, 2018-08-03 [AIRFLOW-1609] Fix gitignore to ignore all venvs [AIRFLOW-1601] Add configurable task cleanup time ->>>>>>> 862ad8b9... [AIRFLOW-XXX] Update changelog for 1.10 AIRFLOW 1.9.0, 2018-01-02 ------------------------- diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index beaf609b5a836..f114c66585342 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -88,7 +88,7 @@ There are three ways to setup an Apache Airflow development environment. 1. Using tools and libraries installed directly on your system. Install Python (2.7.x or 3.4.x), MySQL, and libxml by using system-level package - managers like yum, apt-get for Linux, or Homebrew for Mac OS at first. Refer to the [base CI Dockerfile](https://github.com/apache/incubator-airflow-ci/blob/master/Dockerfile.base) for + managers like yum, apt-get for Linux, or Homebrew for Mac OS at first. Refer to the [base CI Dockerfile](https://github.com/apache/incubator-airflow-ci/blob/master/Dockerfile) for a comprehensive list of required packages. Then install python development requirements. It is usually best to work in a virtualenv: @@ -146,9 +146,18 @@ There are three ways to setup an Apache Airflow development environment. # From the container pip install -e .[devel] # Run all the tests with python and mysql through tox + pip install tox tox -e py35-backend_mysql ``` + If you wish to run individual tests inside of docker enviroment you can do as follows: + + ```bash + # From the container (with your desired enviroment) with druid hook + tox -e py35-backend_mysql -- tests/hooks/test_druid_hook.py + ``` + + ### Running unit tests To run tests locally, once your unit test environment is setup (directly on your diff --git a/LICENSE b/LICENSE index f2c490e99b0b3..68ca6b6117c19 100644 --- a/LICENSE +++ b/LICENSE @@ -220,6 +220,7 @@ at licenses/LICENSE-[project].txt. (ALv2 License) hue (https://github.com/cloudera/hue/) (ALv2 License) jqclock (https://github.com/JohnRDOrazio/jQuery-Clock-Plugin) (ALv2 License) bootstrap3-typeahead (https://github.com/bassjobsen/Bootstrap-3-Typeahead) + (ALv2 License) airflow.contrib.auth.backends.github_enterprise_auth ======================================================================== MIT licenses diff --git a/NOTICE b/NOTICE index 544c0807667fb..99069f7a40bce 100644 --- a/NOTICE +++ b/NOTICE @@ -13,6 +13,11 @@ is subject to the terms and conditions of their respective licenses. See the LICENSE file for a list of subcomponents and dependencies and their respective licenses. +airflow.contrib.auth.backends.github_enterprise_auth: +----------------------------------------------------- + +* Copyright 2015 Matthew Pelland (matt@pelland.io) + hue: ----- This product contains a modified portion of 'Hue' developed by Cloudera, Inc. diff --git a/README.md b/README.md index 275f6cc6004ef..9d1da1e49c725 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,21 @@ -# Airflow +# Apache Airflow (Incubating) [![PyPI version](https://badge.fury.io/py/apache-airflow.svg)](https://badge.fury.io/py/apache-airflow) [![Build Status](https://travis-ci.org/apache/incubator-airflow.svg?branch=master)](https://travis-ci.org/apache/incubator-airflow) [![Coverage Status](https://img.shields.io/codecov/c/github/apache/incubator-airflow/master.svg)](https://codecov.io/github/apache/incubator-airflow?branch=master) [![Documentation Status](https://readthedocs.org/projects/airflow/badge/?version=latest)](https://airflow.readthedocs.io/en/latest/?badge=latest) [![License](http://img.shields.io/:license-Apache%202-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0.txt) -[![Join the chat at https://gitter.im/apache/incubator-airflow](https://badges.gitter.im/apache/incubator-airflow.svg)](https://gitter.im/apache/incubator-airflow?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/apache-airflow.svg)](https://pypi.org/project/apache-airflow/) +[![Twitter Follow](https://img.shields.io/twitter/follow/ApacheAirflow.svg?style=social&label=Follow)](https://twitter.com/ApacheAirflow) -_NOTE: The transition from 1.8.0 (or before) to 1.8.1 (or after) requires uninstalling Airflow before installing the new version. The package name was changed from `airflow` to `apache-airflow` as of version 1.8.1._ +_NOTE: The transition from 1.8.0 (or before) to 1.8.1 (or after) requires uninstalling Apache Airflow before installing the new version. The package name was changed from `airflow` to `apache-airflow` as of version 1.8.1._ -Airflow is a platform to programmatically author, schedule, and monitor -workflows. +Apache Airflow (or simply Airflow) is a platform to programmatically author, schedule, and monitor workflows. When workflows are defined as code, they become more maintainable, versionable, testable, and collaborative. -Use Airflow to author workflows as directed acyclic graphs (DAGs) of tasks. -The Airflow scheduler executes your tasks on an array of workers while -following the specified dependencies. Rich command line utilities make -performing complex surgeries on DAGs a snap. The rich user interface -makes it easy to visualize pipelines running in production, -monitor progress, and troubleshoot issues when needed. +Use Airflow to author workflows as directed acyclic graphs (DAGs) of tasks. The Airflow scheduler executes your tasks on an array of workers while following the specified dependencies. Rich command line utilities make performing complex surgeries on DAGs a snap. The rich user interface makes it easy to visualize pipelines running in production, monitor progress, and troubleshoot issues when needed. ## Getting started @@ -50,7 +45,7 @@ unit of work and continuity. - **Dynamic**: Airflow pipelines are configuration as code (Python), allowing for dynamic pipeline generation. This allows for writing code that instantiates pipelines dynamically. - **Extensible**: Easily define your own operators, executors and extend the library so that it fits the level of abstraction that suits your environment. - **Elegant**: Airflow pipelines are lean and explicit. Parameterizing your scripts is built into the core of Airflow using the powerful **Jinja** templating engine. -- **Scalable**: Airflow has a modular architecture and uses a message queue to orchestrate an arbitrary number of workers. Airflow is ready to scale to infinity. +- **Scalable**: Airflow has a modular architecture and uses a message queue to orchestrate an arbitrary number of workers. ## User Interface @@ -84,9 +79,9 @@ unit of work and continuity. Want to help build Apache Airflow? Check out our [contributing documentation](https://github.com/apache/incubator-airflow/blob/master/CONTRIBUTING.md). -## Who uses Airflow? +## Who uses Apache Airflow? -As the Airflow community grows, we'd like to keep track of who is using +As the Apache Airflow community grows, we'd like to keep track of who is using the platform. Please send a PR with your company name and @githubhandle if you may. @@ -94,6 +89,7 @@ Currently **officially** using Airflow: 1. [6play](https://www.6play.fr) [[@lemourA](https://github.com/lemoura), [@achaussende](https://github.com/achaussende), [@d-nguyen](https://github.com/d-nguyen), [@julien-gm](https://github.com/julien-gm)] 1. [8fit](https://8fit.com/) [[@nicor88](https://github.com/nicor88), [@frnzska](https://github.com/frnzska)] +1. [90 Seconds](https://90seconds.tv/) [[@aaronmak](https://github.com/aaronmak)] 1. [AdBOOST](https://www.adboost.sk) [[AdBOOST](https://github.com/AdBOOST)] 1. [Agari](https://github.com/agaridata) [[@r39132](https://github.com/r39132)] 1. [Airbnb](http://airbnb.io/) [[@mistercrunch](https://github.com/mistercrunch), [@artwr](https://github.com/artwr)] @@ -121,11 +117,15 @@ Currently **officially** using Airflow: 1. [Bluecore](https://www.bluecore.com) [[@JLDLaughlin](https://github.com/JLDLaughlin)] 1. [Boda Telecom Suite - CE](https://github.com/bodastage/bts-ce) [[@erssebaggala](https://github.com/erssebaggala), [@bodastage](https://github.com/bodastage)] 1. [Bodastage Solutions](http://bodastage.com) [[@erssebaggala](https://github.com/erssebaggala), [@bodastage](https://github.com/bodastage)] +1. [Bombora Inc](https://bombora.com/) [[@jeffkpayne](https://github.com/jeffkpayne), [@TheOriginalAlex](https://github.com/TheOriginalAlex)] 1. [Bonnier Broadcasting](http://www.bonnierbroadcasting.com) [[@wileeam](https://github.com/wileeam)] 1. [BounceX](http://www.bouncex.com) [[@JoshFerge](https://github.com/JoshFerge), [@hudsonrio](https://github.com/hudsonrio), [@ronniekritou](https://github.com/ronniekritou)] +1. [Branch](https://branch.io) [[@sdebarshi](https://github.com/sdebarshi), [@dmitrig01](https://github.com/dmitrig01)] 1. [California Data Collaborative](https://github.com/California-Data-Collaborative) powered by [ARGO Labs](http://www.argolabs.org) 1. [Carbonite](https://www.carbonite.com) [[@ajbosco](https://github.com/ajbosco)] +1. [CAVA](https://www.cava.com) [[@minh5](http://github.com/minh5)] 1. [Celect](http://www.celect.com) [[@superdosh](https://github.com/superdosh) & [@chadcelect](https://github.com/chadcelect)] +1. [Censys](https://censys.io) [[@zakird](https://github.com/zakird), [@dadrian](https://github.com/dadrian), & [@andrewsardone](https://github.com/andrewsardone)] 1. [Change.org](https://www.change.org) [[@change](https://github.com/change), [@vijaykramesh](https://github.com/vijaykramesh)] 1. [Checkr](https://checkr.com) [[@tongboh](https://github.com/tongboh)] 1. [Children's Hospital of Philadelphia Division of Genomic Diagnostics](http://www.chop.edu/centers-programs/division-genomic-diagnostics) [[@genomics-geek]](https://github.com/genomics-geek/) @@ -135,6 +135,7 @@ Currently **officially** using Airflow: 1. [Clover Health](https://www.cloverhealth.com) [[@gwax](https://github.com/gwax) & [@vansivallab](https://github.com/vansivallab)] 1. [Chartboost](https://www.chartboost.com) [[@cgelman](https://github.com/cgelman) & [@dclubb](https://github.com/dclubb)] 1. [Collectivehealth Inc.](https://www.collectivehealth.com) [@retornam](https://github.com/retornam) +1. [Compass](https://www.compass.com) [[@wdhorton](https://github.com/wdhorton)] 1. [ContaAzul](https://www.contaazul.com) [[@bern4rdelli](https://github.com/bern4rdelli), [@renanleme](https://github.com/renanleme) & [@sabino](https://github.com/sabino)] 1. [Cotap](https://github.com/cotap/) [[@maraca](https://github.com/maraca) & [@richardchew](https://github.com/richardchew)] 1. [Craig@Work](https://www.craigatwork.com) @@ -144,15 +145,20 @@ Currently **officially** using Airflow: 1. [Custom Ink](https://www.customink.com/) [[@david-dalisay](https://github.com/david-dalisay), [@dmartin11](https://github.com/dmartin11) & [@mpeteuil](https://github.com/mpeteuil)] 1. [Dailymotion](http://www.dailymotion.com/fr) [[@germaintanguy](https://github.com/germaintanguy) & [@hc](https://github.com/hc)] 1. [Data Reply](https://www.datareply.co.uk/) [[@kaxil](https://github.com/kaxil)] +1. [DataCamp](https://datacamp.com/) [[@dgrtwo](https://github.com/dgrtwo)] 1. [DataFox](https://www.datafox.com/) [[@sudowork](https://github.com/sudowork)] 1. [Digital First Media](http://www.digitalfirstmedia.com/) [[@duffn](https://github.com/duffn) & [@mschmo](https://github.com/mschmo) & [@seanmuth](https://github.com/seanmuth)] 1. [DocuTAP](https://www.docutap.com/) [[@jshvrsn](https://github.com/jshvrsn) & [@lhvphan](https://github.com/lhvphan) & [@cloneluke](https://github.com/cloneluke)] +1. [DoorDash](https://www.doordash.com/) 1. [Dotmodus](http://dotmodus.com) [[@dannylee12](https://github.com/dannylee12)] 1. [Drivy](https://www.drivy.com) [[@AntoineAugusti](https://github.com/AntoineAugusti)] 1. [Easy Taxi](http://www.easytaxi.com/) [[@caique-lima](https://github.com/caique-lima) & [@WesleyBatista](https://github.com/WesleyBatista) & [@diraol](https://github.com/diraol)] +1. [Enigma](https://www.enigma.com) [[@hydrosquall](https://github.com/hydrosquall)] 1. [eRevalue](https://www.datamaran.com) [[@hamedhsn](https://github.com/hamedhsn)] 1. [evo.company](https://evo.company/) [[@orhideous](https://github.com/orhideous)] +1. [Fathom Health](https://www.fathomhealth.co/) 1. [Flipp](https://www.flipp.com) [[@sethwilsonwishabi](https://github.com/sethwilsonwishabi)] +1. [Format](https://www.format.com) [[@format](https://github.com/4ormat) & [@jasonicarter](https://github.com/jasonicarter)] 1. [FreshBooks](https://github.com/freshbooks) [[@DinoCow](https://github.com/DinoCow)] 1. [Fundera](https://fundera.com) [[@andyxhadji](https://github.com/andyxhadji)] 1. [G Adventures](https://gadventures.com) [[@samuelmullin](https://github.com/samuelmullin)] @@ -168,6 +174,7 @@ Currently **officially** using Airflow: 1. [Gusto](https://gusto.com) [[@frankhsu](https://github.com/frankhsu)] 1. [Handshake](https://joinhandshake.com/) [[@mhickman](https://github.com/mhickman)] 1. [Handy](http://www.handy.com/careers/73115?gh_jid=73115&gh_src=o5qcxn) [[@marcintustin](https://github.com/marcintustin) / [@mtustin-handy](https://github.com/mtustin-handy)] +1. [happn](https://www.happn.com) [[@PierreCORBEL](https://github.com/PierreCORBEL)] 1. [HBC Digital](http://tech.hbc.com) [[@tmccartan](https://github.com/tmccartan) & [@dmateusp](https://github.com/dmateusp)] 1. [HBO](http://www.hbo.com/)[[@yiwang](https://github.com/yiwang)] 1. [Healthjump](http://www.healthjump.com/) [[@miscbits](https://github.com/miscbits)] @@ -184,6 +191,7 @@ Currently **officially** using Airflow: 1. [Intercom](http://www.intercom.com/) [[@fox](https://github.com/fox) & [@paulvic](https://github.com/paulvic)] 1. [Investorise](https://investorise.com/) [[@svenvarkel](https://github.com/svenvarkel)] 1. [Jampp](https://github.com/jampp) +1. [Jeitto](https://www.jeitto.com.br) [[@BrennerPablo](https://github.com/BrennerPablo) & [@ds-mauri](https://github.com/ds-mauri)] 1. [JobTeaser](https://www.jobteaser.com) [[@stefani75](https://github.com/stefani75) & [@knil-sama](https://github.com/knil-sama)] 1. [Kalibrr](https://www.kalibrr.com/) [[@charlesverdad](https://github.com/charlesverdad)] 1. [Karmic](https://karmiclabs.com) [[@hyw](https://github.com/hyw)] @@ -250,10 +258,14 @@ Currently **officially** using Airflow: 1. [Stackspace](https://beta.stackspace.io/) 1. [Stripe](https://stripe.com) [[@jbalogh](https://github.com/jbalogh)] 1. [Strongmind](https://www.strongmind.com) [[@tomchapin](https://github.com/tomchapin) & [@wongstein](https://github.com/wongstein)] +1. [Square](https://squareup.com/) 1. [Tails.com](https://tails.com/) [[@alanmcruickshank](https://github.com/alanmcruickshank)] +1. [Tesla](https://www.tesla.com/) [[@thoralf-gutierrez](https://github.com/thoralf-gutierrez)] +1. [The Home Depot](https://www.homedepot.com/)[[@apekshithr](https://github.com/apekshithr)] 1. [THE ICONIC](https://www.theiconic.com.au/) [[@revathijay](https://github.com/revathijay)] [[@ilikedata](https://github.com/ilikedata)] 1. [Thinking Machines](https://thinkingmachin.es) [[@marksteve](https://github.com/marksteve)] 1. [Thinknear](https://www.thinknear.com/) [[@d3cay1](https://github.com/d3cay1), [@ccson](https://github.com/ccson), & [@ababian](https://github.com/ababian)] +1. [ThoughtWorks](https://www.thoughtworks.com/) [[@sann3](https://github.com/sann3)] 1. [Thumbtack](https://www.thumbtack.com/) [[@natekupp](https://github.com/natekupp)] 1. [Tictail](https://tictail.com/) 1. [Tile](https://tile.com/) [[@ranjanmanish](https://github.com/ranjanmanish)] @@ -285,10 +297,9 @@ Currently **officially** using Airflow: 1. [Zymergen](https://www.zymergen.com/) 1. [99](https://99taxis.com) [[@fbenevides](https://github.com/fbenevides), [@gustavoamigo](https://github.com/gustavoamigo) & [@mmmaia](https://github.com/mmmaia)] -## Who Maintains Airflow? +## Who Maintains Apache Airflow? -Airflow is the work of the -[community](https://github.com/apache/incubator-airflow/graphs/contributors), +Airflow is the work of the [community](https://github.com/apache/incubator-airflow/graphs/contributors), but the [core committers/maintainers](https://people.apache.org/committers-by-project.html#airflow) are responsible for reviewing and merging PRs as well as steering conversation around new feature requests. If you would like to become a maintainer, please review the Apache Airflow @@ -297,6 +308,6 @@ If you would like to become a maintainer, please review the Apache Airflow ## Links - [Documentation](https://airflow.incubator.apache.org/) -- [Chat](https://gitter.im/apache/incubator-airflow) +- [Chat](https://apache-airflow-slack.herokuapp.com/) - [Apache Airflow Incubation Status](http://incubator.apache.org/projects/airflow.html) - [More](https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+Links) diff --git a/UPDATING.md b/UPDATING.md index 78b8327f05560..74337f3fe88de 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -12,11 +12,62 @@ so you might need to update your config. `task_runner = StandardTaskRunner` +### DAG level Access Control for new RBAC UI + +Extend and enhance new Airflow RBAC UI to support DAG level ACL. Each dag now has two permissions(one for write, one for read) associated('can_dag_edit', 'can_dag_read'). +The admin will create new role, associate the dag permission with the target dag and assign that role to users. That user can only access / view the certain dags on the UI +that he has permissions on. If a new role wants to access all the dags, the admin could associate dag permissions on an artificial view(``all_dags``) with that role. + +We also provide a new cli command(``sync_perm``) to allow admin to auto sync permissions. + + ### min_file_parsing_loop_time config option temporarily disabled The scheduler.min_file_parsing_loop_time config option has been temporarily removed due to some bugs. +### new `sync_parallelism` config option in celery section + +The new `sync_parallelism` config option will control how many processes CeleryExecutor will use to +fetch celery task state in parallel. Default value is max(1, number of cores - 1) + +### CLI Changes + +The ability to manipulate users from the command line has been changed. 'airflow create_user' and 'airflow delete_user' and 'airflow list_users' has been grouped to a single command `airflow users` with optional flags `--create`, `--list` and `--delete`. + +Example Usage: + +To create a new user: +```bash +airflow users --create --username jondoe --lastname doe --firstname jon --email jdoe@apache.org --role Viewer --password test +``` + +To list users: +```bash +airflow users --list +``` + +To delete a user: +```bash +airflow users --delete --username jondoe +``` + +### Custom auth backends interface change + +We have updated the version of flask-login we depend upon, and as a result any +custom auth backends might need a small change: `is_active`, +`is_authenticated`, and `is_anonymous` should now be properties. What this means is if +previously you had this in your user class + + def is_active(self): + return self.active + +then you need to change it like this + + @property + def is_active(self): + return self.active + ## Airflow 1.10 Installation and upgrading requires setting `SLUGIFY_USES_TEXT_UNIDECODE=yes` in your environment or @@ -27,14 +78,6 @@ dependency (python-nvd3 -> python-slugify -> unidecode). The method name was changed to be compatible with the Python 3.7 async/await keywords -### DAG level Access Control for new RBAC UI - -Extend and enhance new Airflow RBAC UI to support DAG level ACL. Each dag now has two permissions(one for write, one for read) associated('can_dag_edit', 'can_dag_read'). -The admin will create new role, associate the dag permission with the target dag and assign that role to users. That user can only access / view the certain dags on the UI -that he has permissions on. If a new role wants to access all the dags, the admin could associate dag permissions on an artificial view(``all_dags``) with that role. - -We also provide a new cli command(``sync_perm``) to allow admin to auto sync permissions. - ### Setting UTF-8 as default mime_charset in email utils ### Add a configuration variable(default_dag_run_display_number) to control numbers of dag run for display @@ -128,11 +171,11 @@ With Airflow 1.9 or lower, `FILENAME_TEMPLATE`, `PROCESSOR_FILENAME_TEMPLATE`, ` ``` [core] fab_logging_level = WARN -log_filename_template = {{{{ ti.dag_id }}}}/{{{{ ti.task_id }}}}/{{{{ ts }}}}/{{{{ try_number }}}}.log -log_processor_filename_template = {{{{ filename }}}}.log +log_filename_template = {{ ti.dag_id }}/{{ ti.task_id }}/{{ ts }}/{{ try_number }}.log +log_processor_filename_template = {{ filename }}.log [elasticsearch] -elasticsearch_log_id_template = {{dag_id}}-{{task_id}}-{{execution_date}}-{{try_number}} +elasticsearch_log_id_template = {dag_id}-{task_id}-{execution_date}-{try_number} elasticsearch_end_of_log_mark = end_of_log ``` diff --git a/airflow/__init__.py b/airflow/__init__.py index d010fe4c74840..9d071a347c429 100644 --- a/airflow/__init__.py +++ b/airflow/__init__.py @@ -79,16 +79,3 @@ class AirflowViewPlugin(BaseView): class AirflowMacroPlugin(object): def __init__(self, namespace): self.namespace = namespace - - -from airflow import operators # noqa: E402 -from airflow import sensors # noqa: E402 -from airflow import hooks # noqa: E402 -from airflow import executors # noqa: E402 -from airflow import macros # noqa: E402 - -operators._integrate_plugins() -sensors._integrate_plugins() # noqa: E402 -hooks._integrate_plugins() -executors._integrate_plugins() -macros._integrate_plugins() diff --git a/airflow/api/common/experimental/mark_tasks.py b/airflow/api/common/experimental/mark_tasks.py index 88c5275f5a4e8..2fac1254cd698 100644 --- a/airflow/api/common/experimental/mark_tasks.py +++ b/airflow/api/common/experimental/mark_tasks.py @@ -208,6 +208,7 @@ def _set_dag_run_state(dag_id, execution_date, state, session=None): dr.state = state if state == State.RUNNING: dr.start_date = timezone.utcnow() + dr.end_date = None else: dr.end_date = timezone.utcnow() session.commit() diff --git a/airflow/bin/cli.py b/airflow/bin/cli.py index e22427cf40e9e..6cbda705f1f76 100644 --- a/airflow/bin/cli.py +++ b/airflow/bin/cli.py @@ -80,6 +80,11 @@ log = LoggingMixin().log +DAGS_FOLDER = settings.DAGS_FOLDER + +if "BUILDING_AIRFLOW_DOCS" in os.environ: + DAGS_FOLDER = '[AIRFLOW_HOME]/dags' + def sigint_handler(sig, frame): sys.exit(0) @@ -133,7 +138,7 @@ def setup_locations(process, pid=None, stdout=None, stderr=None, log=None): def process_subdir(subdir): if subdir: - subdir = subdir.replace('DAGS_FOLDER', settings.DAGS_FOLDER) + subdir = subdir.replace('DAGS_FOLDER', DAGS_FOLDER) subdir = os.path.abspath(os.path.expanduser(subdir)) return subdir @@ -267,6 +272,7 @@ def _tabulate(pools): tablefmt="fancy_grid") try: + imp = getattr(args, 'import') if args.get is not None: pools = [api_client.get_pool(name=args.get)] elif args.set: @@ -275,6 +281,14 @@ def _tabulate(pools): description=args.set[2])] elif args.delete: pools = [api_client.delete_pool(name=args.delete)] + elif imp: + if os.path.exists(imp): + pools = pool_import_helper(imp) + else: + print("Missing pools file.") + pools = api_client.get_pools() + elif args.export: + pools = pool_export_helper(args.export) else: pools = api_client.get_pools() except (AirflowException, IOError) as err: @@ -283,6 +297,43 @@ def _tabulate(pools): log.info(_tabulate(pools=pools)) +def pool_import_helper(filepath): + with open(filepath, 'r') as poolfile: + pl = poolfile.read() + try: + d = json.loads(pl) + except Exception as e: + print("Please check the validity of the json file: " + str(e)) + else: + try: + pools = [] + n = 0 + for k, v in d.items(): + if isinstance(v, dict) and len(v) == 2: + pools.append(api_client.create_pool(name=k, + slots=v["slots"], + description=v["description"])) + n += 1 + else: + pass + except Exception: + pass + finally: + print("{} of {} pool(s) successfully updated.".format(n, len(d))) + return pools + + +def pool_export_helper(filepath): + pool_dict = {} + pools = api_client.get_pools() + for pool in pools: + pool_dict[pool[0]] = {"slots": pool[1], "description": pool[2]} + with open(filepath, 'w') as poolfile: + poolfile.write(json.dumps(pool_dict, sort_keys=True, indent=4)) + print("{} pools successfully exported to {}".format(len(pool_dict), filepath)) + return pools + + @cli_utils.action_logging def variables(args): if args.get: @@ -437,6 +488,24 @@ def _run(args, dag, ti): @cli_utils.action_logging def run(args, dag=None): + # Optional sections won't log an error if they're missing in airflow.cfg. + OPTIONAL_AIRFLOW_CFG_SECTIONS = [ + 'atlas', + 'celery', + 'celery_broker_transport_options', + 'dask', + 'elasticsearch', + 'github_enterprise', + 'hive', + 'kerberos', + 'kubernetes', + 'kubernetes_node_selectors', + 'kubernetes_secrets', + 'ldap', + 'lineage', + 'mesos', + ] + if dag: args.dag_id = dag.dag_id @@ -459,9 +528,15 @@ def run(args, dag=None): try: conf.set(section, option, value) except NoSectionError: - log.error('Section {section} Option {option} ' - 'does not exist in the config!'.format(section=section, - option=option)) + no_section_msg = ( + 'Section {section} Option {option} ' + 'does not exist in the config!' + ).format(section=section, option=option) + + if section in OPTIONAL_AIRFLOW_CFG_SECTIONS: + log.debug(no_section_msg) + else: + log.error(no_section_msg) settings.configure_vars() @@ -551,6 +626,31 @@ def dag_state(args): print(dr[0].state if len(dr) > 0 else None) +@cli_utils.action_logging +def next_execution(args): + """ + Returns the next execution datetime of a DAG at the command line. + >>> airflow next_execution tutorial + 2018-08-31 10:38:00 + """ + dag = get_dag(args) + + if dag.is_paused: + print("[INFO] Please be reminded this DAG is PAUSED now.") + + if dag.latest_execution_date: + next_execution_dttm = dag.following_schedule(dag.latest_execution_date) + + if next_execution_dttm is None: + print("[WARN] No following schedule can be found. " + + "This DAG may have schedule interval '@once' or `None`.") + + print(next_execution_dttm) + else: + print("[WARN] Only applicable when there is execution record found for the DAG.") + print(None) + + @cli_utils.action_logging def list_dags(args): dagbag = DagBag(process_subdir(args.subdir)) @@ -629,7 +729,9 @@ def clear(args): only_failed=args.only_failed, only_running=args.only_running, confirm_prompt=not args.no_confirm, - include_subdags=not args.exclude_subdags) + include_subdags=not args.exclude_subdags, + include_parentdag=not args.exclude_parentdag, + ) def get_num_ready_workers_running(gunicorn_master_proc): @@ -783,8 +885,12 @@ def webserver(args): print( "Starting the web server on port {0} and host {1}.".format( args.port, args.hostname)) - app = create_app_rbac(conf) if settings.RBAC else create_app(conf) - app.run(debug=True, port=args.port, host=args.hostname, + if settings.RBAC: + app, _ = create_app_rbac(conf, testing=conf.get('core', 'unit_test_mode')) + else: + app = create_app(conf, testing=conf.get('core', 'unit_test_mode')) + app.run(debug=True, use_reloader=False if app.config['TESTING'] else True, + port=args.port, host=args.hostname, ssl_context=(ssl_cert, ssl_key) if ssl_cert and ssl_key else None) else: os.environ['SKIP_DAGS_PARSING'] = 'True' @@ -1260,74 +1366,75 @@ def kerberos(args): # noqa @cli_utils.action_logging -def create_user(args): - fields = { - 'role': args.role, - 'username': args.username, - 'email': args.email, - 'firstname': args.firstname, - 'lastname': args.lastname, - } - empty_fields = [k for k, v in fields.items() if not v] - if empty_fields: - raise SystemExit('Required arguments are missing: {}.'.format( - ', '.join(empty_fields))) - - appbuilder = cached_appbuilder() - role = appbuilder.sm.find_role(args.role) - if not role: - raise SystemExit('{} is not a valid role.'.format(args.role)) - - if args.use_random_password: - password = ''.join(random.choice(string.printable) for _ in range(16)) - elif args.password: - password = args.password - else: - password = getpass.getpass('Password:') - password_confirmation = getpass.getpass('Repeat for confirmation:') - if password != password_confirmation: - raise SystemExit('Passwords did not match!') +def users(args): + if args.list: + + appbuilder = cached_appbuilder() + users = appbuilder.sm.get_all_users() + fields = ['id', 'username', 'email', 'first_name', 'last_name', 'roles'] + users = [[user.__getattribute__(field) for field in fields] for user in users] + msg = tabulate(users, [field.capitalize().replace('_', ' ') for field in fields], + tablefmt="fancy_grid") + if sys.version_info[0] < 3: + msg = msg.encode('utf-8') + print(msg) - if appbuilder.sm.find_user(args.username): - print('{} already exist in the db'.format(args.username)) return - user = appbuilder.sm.add_user(args.username, args.firstname, args.lastname, - args.email, role, password) - if user: - print('{} user {} created.'.format(args.role, args.username)) - else: - raise SystemExit('Failed to create user.') + if args.create: + fields = { + 'role': args.role, + 'username': args.username, + 'email': args.email, + 'firstname': args.firstname, + 'lastname': args.lastname, + } + empty_fields = [k for k, v in fields.items() if not v] + if empty_fields: + raise SystemExit('Required arguments are missing: {}.'.format( + ', '.join(empty_fields))) -@cli_utils.action_logging -def delete_user(args): - if not args.username: - raise SystemExit('Required arguments are missing: username') + appbuilder = cached_appbuilder() + role = appbuilder.sm.find_role(args.role) + if not role: + raise SystemExit('{} is not a valid role.'.format(args.role)) + + if args.use_random_password: + password = ''.join(random.choice(string.printable) for _ in range(16)) + elif args.password: + password = args.password + else: + password = getpass.getpass('Password:') + password_confirmation = getpass.getpass('Repeat for confirmation:') + if password != password_confirmation: + raise SystemExit('Passwords did not match!') - appbuilder = cached_appbuilder() + if appbuilder.sm.find_user(args.username): + print('{} already exist in the db'.format(args.username)) + return + user = appbuilder.sm.add_user(args.username, args.firstname, args.lastname, + args.email, role, password) + if user: + print('{} user {} created.'.format(args.role, args.username)) + else: + raise SystemExit('Failed to create user.') - try: - u = next(u for u in appbuilder.sm.get_all_users() if u.username == args.username) - except StopIteration: - raise SystemExit('{} is not a valid user.'.format(args.username)) + if args.delete: + if not args.username: + raise SystemExit('Required arguments are missing: username') - if appbuilder.sm.del_register_user(u): - print('User {} deleted.'.format(args.username)) - else: - raise SystemExit('Failed to delete user.') + appbuilder = cached_appbuilder() + try: + u = next(u for u in appbuilder.sm.get_all_users() + if u.username == args.username) + except StopIteration: + raise SystemExit('{} is not a valid user.'.format(args.username)) -@cli_utils.action_logging -def list_users(args): - appbuilder = cached_appbuilder() - users = appbuilder.sm.get_all_users() - fields = ['id', 'username', 'email', 'first_name', 'last_name', 'roles'] - users = [[user.__getattribute__(field) for field in fields] for user in users] - msg = tabulate(users, [field.capitalize().replace('_', ' ') for field in fields], - tablefmt="fancy_grid") - if sys.version_info[0] < 3: - msg = msg.encode('utf-8') - print(msg) + if appbuilder.sm.del_register_user(u): + print('User {} deleted.'.format(args.username)) + else: + raise SystemExit('Failed to delete user.') @cli_utils.action_logging @@ -1410,8 +1517,10 @@ class CLIFactory(object): "The regex to filter specific task_ids to backfill (optional)"), 'subdir': Arg( ("-sd", "--subdir"), - "File location or directory from which to look for the dag", - default=settings.DAGS_FOLDER), + "File location or directory from which to look for the dag. " + "Defaults to '[AIRFLOW_HOME]/dags' where [AIRFLOW_HOME] is the " + "value you set for 'AIRFLOW_HOME' config you set in 'airflow.cfg' ", + default=DAGS_FOLDER), 'start_date': Arg( ("-s", "--start_date"), "Override start_date YYYY-MM-DD", type=parsedate), @@ -1438,10 +1547,6 @@ class CLIFactory(object): "Do not prompt to confirm reset. Use with care!", "store_true", default=False), - 'username': Arg( - ('-u', '--username',), - help='Username of the user', - type=str), # list_dag_runs 'no_backfill': Arg( @@ -1526,6 +1631,10 @@ class CLIFactory(object): 'exclude_subdags': Arg( ("-x", "--exclude_subdags"), "Exclude subdags", "store_true"), + 'exclude_parentdag': Arg( + ("-xp", "--exclude_parentdag"), + "Exclude ParentDAGS if the task cleared is a part of a SubDAG", + "store_true"), 'dag_regex': Arg( ("-dx", "--dag_regex"), "Search dag_id as regex instead of exact string", "store_true"), @@ -1551,6 +1660,14 @@ class CLIFactory(object): ("-x", "--delete"), metavar="NAME", help="Delete a pool"), + 'pool_import': Arg( + ("-i", "--import"), + metavar="FILEPATH", + help="Import pool from JSON file"), + 'pool_export': Arg( + ("-e", "--export"), + metavar="FILEPATH", + help="Export pool to JSON file"), # variables 'set': Arg( ("-s", "--set"), @@ -1785,33 +1902,52 @@ class CLIFactory(object): ('--conn_extra',), help='Connection `Extra` field, optional when adding a connection', type=str), - # create_user - 'role': Arg( - ('-r', '--role',), - help='Role of the user. Existing roles include Admin, ' - 'User, Op, Viewer, and Public', + # users + 'username': Arg( + ('--username',), + help='Username of the user, required to create/delete a user', type=str), 'firstname': Arg( - ('-f', '--firstname',), - help='First name of the user', + ('--firstname',), + help='First name of the user, required to create a user', type=str), 'lastname': Arg( - ('-l', '--lastname',), - help='Last name of the user', + ('--lastname',), + help='Last name of the user, required to create a user', + type=str), + 'role': Arg( + ('--role',), + help='Role of the user. Existing roles include Admin, ' + 'User, Op, Viewer, and Public. Required to create a user', type=str), 'email': Arg( - ('-e', '--email',), - help='Email of the user', + ('--email',), + help='Email of the user, required to create a user', type=str), 'password': Arg( - ('-p', '--password',), - help='Password of the user', + ('--password',), + help='Password of the user, required to create a user ' + 'without --use_random_password', type=str), 'use_random_password': Arg( ('--use_random_password',), - help='Do not prompt for password. Use random string instead', + help='Do not prompt for password. Use random string instead.' + ' Required to create a user without --password ', default=False, action='store_true'), + 'list_users': Arg( + ('-l', '--list'), + help='List all users', + action='store_true'), + 'create_user': Arg( + ('-c', '--create'), + help='Create a user', + action='store_true'), + 'delete_user': Arg( + ('-d', '--delete'), + help='Delete a user', + action='store_true'), + } subparsers = ( { @@ -1820,7 +1956,7 @@ class CLIFactory(object): "If reset_dag_run option is used," " backfill will first prompt users whether airflow " "should clear all the previous dag_run and task_instances " - "within the backfill date range." + "within the backfill date range. " "If rerun_failed_tasks is used, backfill " "will auto re-run the previous failed task instances" " within the backfill date range.", @@ -1850,7 +1986,7 @@ class CLIFactory(object): 'args': ( 'dag_id', 'task_regex', 'start_date', 'end_date', 'subdir', 'upstream', 'downstream', 'no_confirm', 'only_failed', - 'only_running', 'exclude_subdags', 'dag_regex'), + 'only_running', 'exclude_subdags', 'exclude_parentdag', 'dag_regex'), }, { 'func': pause, 'help': "Pause a DAG", @@ -1870,7 +2006,7 @@ class CLIFactory(object): }, { 'func': pool, 'help': "CRUD operations on pools", - "args": ('pool_set', 'pool_get', 'pool_delete'), + "args": ('pool_set', 'pool_get', 'pool_delete', 'pool_import', 'pool_export'), }, { 'func': variables, 'help': "CRUD operations on variables", @@ -1969,23 +2105,21 @@ class CLIFactory(object): 'args': ('list_connections', 'add_connection', 'delete_connection', 'conn_id', 'conn_uri', 'conn_extra') + tuple(alternative_conn_specs), }, { - 'func': create_user, - 'help': "Create an account for the Web UI", - 'args': ('role', 'username', 'email', 'firstname', 'lastname', + 'func': users, + 'help': "List/Create/Delete users", + 'args': ('list_users', 'create_user', 'delete_user', + 'username', 'email', 'firstname', 'lastname', 'role', 'password', 'use_random_password'), - }, { - 'func': delete_user, - 'help': "Delete an account for the Web UI", - 'args': ('username',), - }, { - 'func': list_users, - 'help': "List accounts for the Web UI", - 'args': tuple(), }, { 'func': sync_perm, 'help': "Update existing role's permissions.", 'args': tuple(), + }, + { + 'func': next_execution, + 'help': "Get the next execution datetime of a DAG.", + 'args': ('dag_id', 'subdir') } ) subparsers_dict = {sp['func'].__name__: sp for sp in subparsers} diff --git a/airflow/config_templates/default_airflow.cfg b/airflow/config_templates/default_airflow.cfg index 18c486cb1ea39..b572dbb2f76d0 100644 --- a/airflow/config_templates/default_airflow.cfg +++ b/airflow/config_templates/default_airflow.cfg @@ -62,12 +62,10 @@ fab_logging_level = WARN logging_config_class = # Log format -# we need to escape the curly braces by adding an additional curly brace log_format = [%%(asctime)s] {{%%(filename)s:%%(lineno)d}} %%(levelname)s - %%(message)s simple_log_format = %%(asctime)s %%(levelname)s - %%(message)s # Log filename format -# we need to escape the curly braces by adding an additional curly brace log_filename_template = {{{{ ti.dag_id }}}}/{{{{ ti.task_id }}}}/{{{{ ts }}}}/{{{{ try_number }}}}.log log_processor_filename_template = {{{{ filename }}}}.log @@ -265,6 +263,9 @@ access_logfile = - error_logfile = - # Expose the configuration file in the web server +# This is only applicable for the flask-admin based web UI (non FAB-based). +# In the FAB-based web UI with RBAC feature, +# access to configuration is controlled by role permissions. expose_config = False # Set to true to turn on authentication: @@ -313,6 +314,9 @@ navbar_color = #007A87 # Default dagrun to show in UI default_dag_run_display_number = 25 +# Enable werkzeug `ProxyFix` middleware +enable_proxy_fix = False + [email] email_backend = airflow.utils.email.send_email_smtp @@ -380,6 +384,10 @@ flower_port = 5555 # Default queue that tasks get assigned to and that worker listen on. default_queue = default +# How many processes CeleryExecutor uses to sync task state. +# 0 means to use max(1, number of cores - 1) processes. +sync_parallelism = 0 + # Import path for celery configuration options celery_config_options = airflow.config_templates.default_celery.DEFAULT_CELERY_CONFIG @@ -480,6 +488,10 @@ max_threads = 2 authenticate = False +# Turn off scheduler use of cron intervals by setting this to False. +# DAGs submitted manually in the web UI or with trigger_dag will still run. +use_job_schedule = True + [ldap] # set this to ldaps://: uri = @@ -554,7 +566,6 @@ hide_sensitive_variable_fields = True [elasticsearch] elasticsearch_host = -# we need to escape the curly braces by adding an additional curly brace elasticsearch_log_id_template = {{dag_id}}-{{task_id}}-{{execution_date}}-{{try_number}} elasticsearch_end_of_log_mark = end_of_log diff --git a/airflow/config_templates/default_test.cfg b/airflow/config_templates/default_test.cfg index 06937452b0a4f..f9279cce54c76 100644 --- a/airflow/config_templates/default_test.cfg +++ b/airflow/config_templates/default_test.cfg @@ -97,6 +97,7 @@ result_backend = db+mysql://airflow:airflow@localhost:3306/airflow flower_host = 0.0.0.0 flower_port = 5555 default_queue = default +sync_parallelism = 0 [mesos] master = localhost:5050 diff --git a/airflow/configuration.py b/airflow/configuration.py index 9e80648c74ec0..33376285be483 100644 --- a/airflow/configuration.py +++ b/airflow/configuration.py @@ -139,6 +139,7 @@ class AirflowConfigParser(ConfigParser): 'celery': { # Remove these keys in Airflow 1.11 'worker_concurrency': 'celeryd_concurrency', + 'result_backend': 'celery_result_backend', 'broker_url': 'celery_broker_url', 'ssl_active': 'celery_ssl_active', 'ssl_cert': 'celery_ssl_cert', diff --git a/airflow/contrib/auth/backends/github_enterprise_auth.py b/airflow/contrib/auth/backends/github_enterprise_auth.py index 08fa0d7929d2c..e1b8b133425fe 100644 --- a/airflow/contrib/auth/backends/github_enterprise_auth.py +++ b/airflow/contrib/auth/backends/github_enterprise_auth.py @@ -1,21 +1,19 @@ # -*- coding: utf-8 -*- # -# 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 +# See the NOTICE file distributed with this work for additional information +# regarding copyright ownership. +# +# Licensed 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. +# 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. import flask_login # Need to expose these downstream @@ -43,14 +41,17 @@ class GHEUser(models.User): def __init__(self, user): self.user = user + @property def is_active(self): """Required by flask_login""" return True + @property def is_authenticated(self): """Required by flask_login""" return True + @property def is_anonymous(self): """Required by flask_login""" return False diff --git a/airflow/contrib/auth/backends/google_auth.py b/airflow/contrib/auth/backends/google_auth.py index 08b29e383a76a..bc7d552f59e93 100644 --- a/airflow/contrib/auth/backends/google_auth.py +++ b/airflow/contrib/auth/backends/google_auth.py @@ -42,14 +42,17 @@ class GoogleUser(models.User): def __init__(self, user): self.user = user + @property def is_active(self): """Required by flask_login""" return True + @property def is_authenticated(self): """Required by flask_login""" return True + @property def is_anonymous(self): """Required by flask_login""" return False diff --git a/airflow/contrib/auth/backends/kerberos_auth.py b/airflow/contrib/auth/backends/kerberos_auth.py index 4a019eb131f56..e3500c93170a5 100644 --- a/airflow/contrib/auth/backends/kerberos_auth.py +++ b/airflow/contrib/auth/backends/kerberos_auth.py @@ -71,14 +71,17 @@ def authenticate(username, password): return + @property def is_active(self): """Required by flask_login""" return True + @property def is_authenticated(self): """Required by flask_login""" return True + @property def is_anonymous(self): """Required by flask_login""" return False @@ -108,7 +111,7 @@ def load_user(userid, session=None): @provide_session def login(self, request, session=None): - if current_user.is_authenticated(): + if current_user.is_authenticated: flash("You are already logged in") return redirect(url_for('index')) diff --git a/airflow/contrib/auth/backends/ldap_auth.py b/airflow/contrib/auth/backends/ldap_auth.py index a949e89a77b9e..fefc389e489d3 100644 --- a/airflow/contrib/auth/backends/ldap_auth.py +++ b/airflow/contrib/auth/backends/ldap_auth.py @@ -235,14 +235,17 @@ def try_login(username, password): log.info("Password incorrect for user %s", username) raise AuthenticationError("Invalid username or password") + @property def is_active(self): """Required by flask_login""" return True + @property def is_authenticated(self): """Required by flask_login""" return True + @property def is_anonymous(self): """Required by flask_login""" return False @@ -273,7 +276,7 @@ def load_user(userid, session=None): @provide_session def login(self, request, session=None): - if current_user.is_authenticated(): + if current_user.is_authenticated: flash("You are already logged in") return redirect(url_for('admin.index')) diff --git a/airflow/contrib/auth/backends/password_auth.py b/airflow/contrib/auth/backends/password_auth.py index 879aaa142a4db..55f5daf8fdf76 100644 --- a/airflow/contrib/auth/backends/password_auth.py +++ b/airflow/contrib/auth/backends/password_auth.py @@ -71,14 +71,17 @@ def password(self, plaintext): def authenticate(self, plaintext): return check_password_hash(self._password, plaintext) + @property def is_active(self): """Required by flask_login""" return True + @property def is_authenticated(self): """Required by flask_login""" return True + @property def is_anonymous(self): """Required by flask_login""" return False @@ -137,7 +140,7 @@ def authenticate(session, username, password): @provide_session def login(self, request, session=None): - if current_user.is_authenticated(): + if current_user.is_authenticated: flash("You are already logged in") return redirect(url_for('admin.index')) diff --git a/scripts/ci/krb5/krb-conf/server/kadm5.acl b/airflow/contrib/example_dags/__init__.py similarity index 97% rename from scripts/ci/krb5/krb-conf/server/kadm5.acl rename to airflow/contrib/example_dags/__init__.py index 41d17385ff144..114d189da14ab 100644 --- a/scripts/ci/krb5/krb-conf/server/kadm5.acl +++ b/airflow/contrib/example_dags/__init__.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -15,4 +16,3 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -*/admin@TEST.LOCAL * diff --git a/airflow/contrib/example_dags/example_gcp_function_delete.py b/airflow/contrib/example_dags/example_gcp_function_delete.py new file mode 100644 index 0000000000000..30f5369af60ef --- /dev/null +++ b/airflow/contrib/example_dags/example_gcp_function_delete.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# +# 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. + +""" +Example Airflow DAG that deletes a Google Cloud Function. +This DAG relies on the following Airflow variables +https://airflow.apache.org/concepts.html#variables +* PROJECT_ID - Google Cloud Project where the Cloud Function exists. +* LOCATION - Google Cloud Functions region where the function exists. +* ENTRYPOINT - Name of the executable function in the source code. +""" + +import datetime + +import airflow +from airflow import models +from airflow.contrib.operators.gcp_function_operator import GcfFunctionDeleteOperator + +# [START howto_operator_gcf_delete_args] +PROJECT_ID = models.Variable.get('PROJECT_ID', '') +LOCATION = models.Variable.get('LOCATION', '') +ENTRYPOINT = models.Variable.get('ENTRYPOINT', '') +# A fully-qualified name of the function to delete + +FUNCTION_NAME = 'projects/{}/locations/{}/functions/{}'.format(PROJECT_ID, LOCATION, + ENTRYPOINT) +default_args = { + 'start_date': airflow.utils.dates.days_ago(1) +} +# [END howto_operator_gcf_delete_args] + +with models.DAG( + 'example_gcp_function_delete', + default_args=default_args, + schedule_interval=datetime.timedelta(days=1) +) as dag: + # [START howto_operator_gcf_delete] + t1 = GcfFunctionDeleteOperator( + task_id="gcf_delete_task", + name=FUNCTION_NAME + ) + # [END howto_operator_gcf_delete] diff --git a/airflow/contrib/example_dags/example_gcp_function_deploy_delete.py b/airflow/contrib/example_dags/example_gcp_function_deploy_delete.py new file mode 100644 index 0000000000000..a0e44957b9204 --- /dev/null +++ b/airflow/contrib/example_dags/example_gcp_function_deploy_delete.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +# +# 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. + +""" +Example Airflow DAG that creates a Google Cloud Function and then deletes it. + +This DAG relies on the following Airflow variables +https://airflow.apache.org/concepts.html#variables +* PROJECT_ID - Google Cloud Project to use for the Cloud Function. +* LOCATION - Google Cloud Functions region where the function should be + created. +* SOURCE_ARCHIVE_URL - Path to the zipped source in Google Cloud Storage +or + * SOURCE_UPLOAD_URL - Generated upload URL for the zipped source + or + * ZIP_PATH - Local path to the zipped source archive +or +* SOURCE_REPOSITORY - The URL pointing to the hosted repository where the function is +defined in a supported Cloud Source Repository URL format +https://cloud.google.com/functions/docs/reference/rest/v1/projects.locations.functions#SourceRepository +* ENTRYPOINT - Name of the executable function in the source code. +""" + +import datetime + +from airflow import models +from airflow.contrib.operators.gcp_function_operator \ + import GcfFunctionDeployOperator, GcfFunctionDeleteOperator +from airflow.utils import dates + +# [START howto_operator_gcf_deploy_variables] +PROJECT_ID = models.Variable.get('PROJECT_ID', '') +LOCATION = models.Variable.get('LOCATION', '') +SOURCE_ARCHIVE_URL = models.Variable.get('SOURCE_ARCHIVE_URL', '') +SOURCE_UPLOAD_URL = models.Variable.get('SOURCE_UPLOAD_URL', '') +SOURCE_REPOSITORY = models.Variable.get('SOURCE_REPOSITORY', '') +ZIP_PATH = models.Variable.get('ZIP_PATH', '') +ENTRYPOINT = models.Variable.get('ENTRYPOINT', '') +FUNCTION_NAME = 'projects/{}/locations/{}/functions/{}'.format(PROJECT_ID, LOCATION, + ENTRYPOINT) +RUNTIME = 'nodejs6' +VALIDATE_BODY = models.Variable.get('VALIDATE_BODY', True) + +# [END howto_operator_gcf_deploy_variables] + +# [START howto_operator_gcf_deploy_body] +body = { + "name": FUNCTION_NAME, + "entryPoint": ENTRYPOINT, + "runtime": RUNTIME, + "httpsTrigger": {} +} +# [END howto_operator_gcf_deploy_body] + +# [START howto_operator_gcf_deploy_args] +default_args = { + 'start_date': dates.days_ago(1), + 'project_id': PROJECT_ID, + 'location': LOCATION, + 'body': body, + 'validate_body': VALIDATE_BODY +} +# [END howto_operator_gcf_deploy_args] + +# [START howto_operator_gcf_deploy_variants] +if SOURCE_ARCHIVE_URL: + body['sourceArchiveUrl'] = SOURCE_ARCHIVE_URL +elif SOURCE_REPOSITORY: + body['sourceRepository'] = { + 'url': SOURCE_REPOSITORY + } +elif ZIP_PATH: + body['sourceUploadUrl'] = '' + default_args['zip_path'] = ZIP_PATH +elif SOURCE_UPLOAD_URL: + body['sourceUploadUrl'] = SOURCE_UPLOAD_URL +else: + raise Exception("Please provide one of the source_code parameters") +# [END howto_operator_gcf_deploy_variants] + + +with models.DAG( + 'example_gcp_function_deploy_delete', + default_args=default_args, + schedule_interval=datetime.timedelta(days=1) +) as dag: + # [START howto_operator_gcf_deploy] + deploy_task = GcfFunctionDeployOperator( + task_id="gcf_deploy_task", + name=FUNCTION_NAME + ) + # [END howto_operator_gcf_deploy] + delete_task = GcfFunctionDeleteOperator( + task_id="gcf_delete_task", + name=FUNCTION_NAME + ) + deploy_task >> delete_task diff --git a/airflow/example_dags/example_kubernetes_annotation.py b/airflow/contrib/example_dags/example_kubernetes_annotation.py similarity index 100% rename from airflow/example_dags/example_kubernetes_annotation.py rename to airflow/contrib/example_dags/example_kubernetes_annotation.py diff --git a/airflow/example_dags/example_kubernetes_executor.py b/airflow/contrib/example_dags/example_kubernetes_executor.py similarity index 100% rename from airflow/example_dags/example_kubernetes_executor.py rename to airflow/contrib/example_dags/example_kubernetes_executor.py diff --git a/airflow/example_dags/example_kubernetes_operator.py b/airflow/contrib/example_dags/example_kubernetes_operator.py similarity index 97% rename from airflow/example_dags/example_kubernetes_operator.py rename to airflow/contrib/example_dags/example_kubernetes_operator.py index e8d35c4c5bf66..4b3f54bd04ef9 100644 --- a/airflow/example_dags/example_kubernetes_operator.py +++ b/airflow/contrib/example_dags/example_kubernetes_operator.py @@ -48,7 +48,8 @@ in_cluster=False, task_id="task", get_logs=True, - dag=dag) + dag=dag, + is_delete_operator_pod=False) except ImportError as e: log.warn("Could not import KubernetesPodOperator: " + str(e)) diff --git a/airflow/contrib/example_dags/example_twitter_README.md b/airflow/contrib/example_dags/example_twitter_README.md index d7218bbfc29de..0f3aededd481d 100644 --- a/airflow/contrib/example_dags/example_twitter_README.md +++ b/airflow/contrib/example_dags/example_twitter_README.md @@ -33,6 +33,6 @@ CREATE TABLE toTwitter_A(id BIGINT, id_str STRING When you review the code for the DAG, you will notice that these tasks are generated using for loop. These two for loops could be combined into one loop. However, in most cases, you will be running different analysis on your incoming incoming and outgoing tweets, and hence they are kept separated in this example. Final step is a running the broker script, brokerapi.py, which will run queries in Hive and store the summarized data to MySQL in our case. To connect to Hive, pyhs2 library is extremely useful and easy to use. To insert data into MySQL from Python, sqlalchemy is also a good one to use. -I hope you find this tutorial useful. If you have question feel free to ask me on [Twitter](https://twitter.com/EkhtiarSyed) or via the live Airflow chatroom room in [Gitter](https://gitter.im/airbnb/airflow).

+I hope you find this tutorial useful. If you have question feel free to ask me on [Twitter](https://twitter.com/EkhtiarSyed) or via the live Airflow chatroom room in [Gitter](https://gitter.im/apache/incubator-airflow).

-Ekhtiar Syed Last Update: 8-April-2016 diff --git a/airflow/contrib/executors/kubernetes_executor.py b/airflow/contrib/executors/kubernetes_executor.py index 66c600ba651bc..de1f9f4235d11 100644 --- a/airflow/contrib/executors/kubernetes_executor.py +++ b/airflow/contrib/executors/kubernetes_executor.py @@ -433,7 +433,7 @@ def _label_safe_datestring_to_datetime(string): "_", let's replace ":" with "_" - :param string: string + :param string: str :return: datetime.datetime object """ return parser.parse(string.replace('_plus_', '+').replace("_", ":")) diff --git a/airflow/contrib/hooks/__init__.py b/airflow/contrib/hooks/__init__.py index 6c31842578a34..b7f8352944d3f 100644 --- a/airflow/contrib/hooks/__init__.py +++ b/airflow/contrib/hooks/__init__.py @@ -17,54 +17,3 @@ # specific language governing permissions and limitations # under the License. # - - -# Contrib hooks are not imported by default. They should be accessed -# directly: from airflow.contrib.hooks.hook_module import Hook - - -import sys -import os - -# ------------------------------------------------------------------------ -# -# #TODO #FIXME Airflow 2.0 -# -# Old import machinary below. -# -# This is deprecated but should be kept until Airflow 2.0 -# for compatibility. -# -# ------------------------------------------------------------------------ -_hooks = { - 'docker_hook': ['DockerHook'], - 'ftp_hook': ['FTPHook'], - 'ftps_hook': ['FTPSHook'], - 'vertica_hook': ['VerticaHook'], - 'ssh_hook': ['SSHHook'], - 'winrm_hook': ['WinRMHook'], - 'sftp_hook': ['SFTPHook'], - 'bigquery_hook': ['BigQueryHook'], - 'qubole_hook': ['QuboleHook'], - 'gcs_hook': ['GoogleCloudStorageHook'], - 'datastore_hook': ['DatastoreHook'], - 'gcp_cloudml_hook': ['CloudMLHook'], - 'redshift_hook': ['RedshiftHook'], - 'gcp_dataproc_hook': ['DataProcHook'], - 'gcp_dataflow_hook': ['DataFlowHook'], - 'spark_submit_operator': ['SparkSubmitOperator'], - 'cloudant_hook': ['CloudantHook'], - 'fs_hook': ['FSHook'], - 'wasb_hook': ['WasbHook'], - 'gcp_pubsub_hook': ['PubSubHook'], - 'jenkins_hook': ['JenkinsHook'], - 'aws_dynamodb_hook': ['AwsDynamoDBHook'], - 'azure_data_lake_hook': ['AzureDataLakeHook'], - 'azure_fileshare_hook': ['AzureFileShareHook'], -} - - -if not os.environ.get('AIRFLOW_USE_NEW_IMPORTS', False): - from airflow.utils.helpers import AirflowImporter - - airflow_importer = AirflowImporter(sys.modules[__name__], _hooks) diff --git a/airflow/contrib/hooks/aws_hook.py b/airflow/contrib/hooks/aws_hook.py index 8ca1f3d744a53..448de63ffe989 100644 --- a/airflow/contrib/hooks/aws_hook.py +++ b/airflow/contrib/hooks/aws_hook.py @@ -84,8 +84,9 @@ class AwsHook(BaseHook): This class is a thin wrapper around the boto3 python library. """ - def __init__(self, aws_conn_id='aws_default'): + def __init__(self, aws_conn_id='aws_default', verify=None): self.aws_conn_id = aws_conn_id + self.verify = verify def _get_credentials(self, region_name): aws_access_key_id = None @@ -162,12 +163,14 @@ def _get_credentials(self, region_name): def get_client_type(self, client_type, region_name=None): session, endpoint_url = self._get_credentials(region_name) - return session.client(client_type, endpoint_url=endpoint_url) + return session.client(client_type, endpoint_url=endpoint_url, + verify=self.verify) def get_resource_type(self, resource_type, region_name=None): session, endpoint_url = self._get_credentials(region_name) - return session.resource(resource_type, endpoint_url=endpoint_url) + return session.resource(resource_type, endpoint_url=endpoint_url, + verify=self.verify) def get_session(self, region_name=None): """Get the underlying boto3.session.""" diff --git a/airflow/contrib/hooks/azure_data_lake_hook.py b/airflow/contrib/hooks/azure_data_lake_hook.py index 1a02d78f27b72..74ae1948099e8 100644 --- a/airflow/contrib/hooks/azure_data_lake_hook.py +++ b/airflow/contrib/hooks/azure_data_lake_hook.py @@ -59,7 +59,7 @@ def check_for_file(self, file_path): :param file_path: Path and name of the file. :type file_path: str :return: True if the file exists, False otherwise. - :rtype bool + :rtype: bool """ try: files = self.connection.glob(file_path, details=False, invalidate_cache=True) diff --git a/airflow/contrib/hooks/azure_fileshare_hook.py b/airflow/contrib/hooks/azure_fileshare_hook.py index d4066ee549f3f..8afa1540d78b4 100644 --- a/airflow/contrib/hooks/azure_fileshare_hook.py +++ b/airflow/contrib/hooks/azure_fileshare_hook.py @@ -56,7 +56,7 @@ def check_for_directory(self, share_name, directory_name, **kwargs): `FileService.exists()` takes. :type kwargs: object :return: True if the file exists, False otherwise. - :rtype bool + :rtype: bool """ return self.connection.exists(share_name, directory_name, **kwargs) @@ -75,7 +75,7 @@ def check_for_file(self, share_name, directory_name, file_name, **kwargs): `FileService.exists()` takes. :type kwargs: object :return: True if the file exists, False otherwise. - :rtype bool + :rtype: bool """ return self.connection.exists(share_name, directory_name, file_name, **kwargs) @@ -92,7 +92,7 @@ def list_directories_and_files(self, share_name, directory_name=None, **kwargs): `FileService.list_directories_and_files()` takes. :type kwargs: object :return: A list of files and directories - :rtype list + :rtype: list """ return self.connection.list_directories_and_files(share_name, directory_name, @@ -110,7 +110,7 @@ def create_directory(self, share_name, directory_name, **kwargs): `FileService.create_directory()` takes. :type kwargs: object :return: A list of files and directories - :rtype list + :rtype: list """ return self.connection.create_directory(share_name, directory_name, **kwargs) diff --git a/airflow/contrib/hooks/bigquery_hook.py b/airflow/contrib/hooks/bigquery_hook.py index e4c0653bfe278..dba4618e35905 100644 --- a/airflow/contrib/hooks/bigquery_hook.py +++ b/airflow/contrib/hooks/bigquery_hook.py @@ -24,6 +24,7 @@ import time from builtins import range +from copy import deepcopy from past.builtins import basestring @@ -93,13 +94,13 @@ def get_pandas_df(self, sql, parameters=None, dialect=None): https://github.com/pydata/pandas/issues/6900 :param sql: The BigQuery SQL to execute. - :type sql: string + :type sql: str :param parameters: The parameters to render the SQL query with (not used, leave to override superclass method) :type parameters: mapping or iterable :param dialect: Dialect of BigQuery SQL – legacy SQL or standard SQL defaults to use `self.use_legacy_sql` if not specified - :type dialect: string in {'legacy', 'standard'} + :type dialect: str in {'legacy', 'standard'} """ if dialect is None: dialect = 'legacy' if self.use_legacy_sql else 'standard' @@ -116,12 +117,12 @@ def table_exists(self, project_id, dataset_id, table_id): :param project_id: The Google cloud project in which to look for the table. The connection supplied to the hook must provide access to the specified project. - :type project_id: string + :type project_id: str :param dataset_id: The name of the dataset in which to look for the table. - :type dataset_id: string + :type dataset_id: str :param table_id: The name of the table to check the existence of. - :type table_id: string + :type table_id: str """ service = self.get_service() try: @@ -195,10 +196,19 @@ class BigQueryBaseCursor(LoggingMixin): PEP 249 cursor isn't needed. """ - def __init__(self, service, project_id, use_legacy_sql=True): + def __init__(self, + service, + project_id, + use_legacy_sql=True, + api_resource_configs=None): + self.service = service self.project_id = project_id self.use_legacy_sql = use_legacy_sql + if api_resource_configs: + _validate_value("api_resource_configs", api_resource_configs, dict) + self.api_resource_configs = api_resource_configs \ + if api_resource_configs else {} self.running_job_id = None def create_empty_table(self, @@ -238,8 +248,7 @@ def create_empty_table(self, :return: """ - if time_partitioning is None: - time_partitioning = dict() + project_id = project_id if project_id is not None else self.project_id table_resource = { @@ -304,7 +313,7 @@ def create_external_table(self, table name to create external table. If is not included, project will be the project defined in the connection json. - :type external_project_dataset_table: string + :type external_project_dataset_table: str :param schema_fields: The schema field list as defined here: https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#resource :type schema_fields: list @@ -313,7 +322,7 @@ def create_external_table(self, per-object name can be used. :type source_uris: list :param source_format: File format to export. - :type source_format: string + :type source_format: str :param autodetect: Try to detect schema and format options automatically. Any option specified explicitly will be honored. :type autodetect: bool @@ -322,7 +331,7 @@ def create_external_table(self, The default value is NONE. This setting is ignored for Google Cloud Bigtable, Google Cloud Datastore backups and Avro formats. - :type compression: string + :type compression: str :param ignore_unknown_values: [Optional] Indicates if BigQuery should allow extra values that are not represented in the table schema. If true, the extra values are ignored. If false, records with extra columns @@ -335,13 +344,13 @@ def create_external_table(self, :param skip_leading_rows: Number of rows to skip when loading from a CSV. :type skip_leading_rows: int :param field_delimiter: The delimiter to use when loading from a CSV. - :type field_delimiter: string + :type field_delimiter: str :param quote_character: The value that is used to quote data sections in a CSV file. - :type quote_character: string + :type quote_character: str :param allow_quoted_newlines: Whether to allow quoted newlines (true) or not (false). - :type allow_quoted_newlines: boolean + :type allow_quoted_newlines: bool :param allow_jagged_rows: Accept rows that are missing trailing optional columns. The missing values are treated as nulls. If false, records with missing trailing columns are treated as bad records, and if there are too many bad @@ -473,11 +482,11 @@ def create_external_table(self, def run_query(self, bql=None, sql=None, - destination_dataset_table=False, + destination_dataset_table=None, write_disposition='WRITE_EMPTY', allow_large_results=False, - flatten_results=False, - udf_config=False, + flatten_results=None, + udf_config=None, use_legacy_sql=None, maximum_billing_tier=None, maximum_bytes_billed=None, @@ -486,7 +495,9 @@ def run_query(self, labels=None, schema_update_options=(), priority='INTERACTIVE', - time_partitioning=None): + time_partitioning=None, + api_resource_configs=None, + cluster_fields=None): """ Executes a BigQuery SQL query. Optionally persists results in a BigQuery table. See here: @@ -497,31 +508,38 @@ def run_query(self, :param bql: (Deprecated. Use `sql` parameter instead) The BigQuery SQL to execute. - :type bql: string + :type bql: str :param sql: The BigQuery SQL to execute. - :type sql: string + :type sql: str :param destination_dataset_table: The dotted . BigQuery table to save the query results. - :type destination_dataset_table: string + :type destination_dataset_table: str :param write_disposition: What to do if the table already exists in BigQuery. - :type write_disposition: string + :type write_disposition: str :param allow_large_results: Whether to allow large results. - :type allow_large_results: boolean + :type allow_large_results: bool :param flatten_results: If true and query uses legacy SQL dialect, flattens all nested and repeated fields in the query results. ``allowLargeResults`` must be true if this is set to false. For standard SQL queries, this flag is ignored and results are never flattened. - :type flatten_results: boolean + :type flatten_results: bool :param udf_config: The User Defined Function configuration for the query. See https://cloud.google.com/bigquery/user-defined-functions for details. :param use_legacy_sql: Whether to use legacy SQL (true) or standard SQL (false). If `None`, defaults to `self.use_legacy_sql`. - :type use_legacy_sql: boolean + :type use_legacy_sql: bool + :param api_resource_configs: a dictionary that contain params + 'configuration' applied for Google BigQuery Jobs API: + https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs + for example, {'query': {'useQueryCache': False}}. You could use it + if you need to provide some params that are not supported by the + BigQueryHook like args. + :type api_resource_configs: dict :type udf_config: list :param maximum_billing_tier: Positive integer that serves as a multiplier of the basic price. - :type maximum_billing_tier: integer + :type maximum_billing_tier: int :param maximum_bytes_billed: Limits the bytes billed for this job. Queries that will have bytes billed beyond this limit will fail (without incurring a charge). If unspecified, this will be @@ -529,7 +547,7 @@ def run_query(self, :type maximum_bytes_billed: float :param create_disposition: Specifies whether the job is allowed to create new tables. - :type create_disposition: string + :type create_disposition: str :param query_params a dictionary containing query parameter types and values, passed to BigQuery :type query_params: dict @@ -542,20 +560,32 @@ def run_query(self, :param priority: Specifies a priority for the query. Possible values include INTERACTIVE and BATCH. The default value is INTERACTIVE. - :type priority: string + :type priority: str :param time_partitioning: configure optional time partitioning fields i.e. - partition by field, type and - expiration as per API specifications. Note that 'field' is not available in - conjunction with dataset.table$partition. + partition by field, type and expiration as per API specifications. :type time_partitioning: dict - + :param cluster_fields: Request that the result of this query be stored sorted + by one or more columns. This is only available in combination with + time_partitioning. The order of columns given determines the sort order. + :type cluster_fields: list of str """ - # TODO remove `bql` in Airflow 2.0 - Jira: [AIRFLOW-2513] - if time_partitioning is None: - time_partitioning = {} + if not api_resource_configs: + api_resource_configs = self.api_resource_configs + else: + _validate_value('api_resource_configs', + api_resource_configs, dict) + configuration = deepcopy(api_resource_configs) + if 'query' not in configuration: + configuration['query'] = {} + + else: + _validate_value("api_resource_configs['query']", + configuration['query'], dict) + sql = bql if sql is None else sql + # TODO remove `bql` in Airflow 2.0 - Jira: [AIRFLOW-2513] if bql: import warnings warnings.warn('Deprecated parameter `bql` used in ' @@ -566,95 +596,113 @@ def run_query(self, 'Airflow.', category=DeprecationWarning) - if sql is None: - raise TypeError('`BigQueryBaseCursor.run_query` missing 1 required ' - 'positional argument: `sql`') + if sql is None and not configuration['query'].get('query', None): + raise TypeError('`BigQueryBaseCursor.run_query` ' + 'missing 1 required positional argument: `sql`') # BigQuery also allows you to define how you want a table's schema to change # as a side effect of a query job # for more details: # https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.query.schemaUpdateOptions + allowed_schema_update_options = [ 'ALLOW_FIELD_ADDITION', "ALLOW_FIELD_RELAXATION" ] - if not set(allowed_schema_update_options).issuperset( - set(schema_update_options)): - raise ValueError( - "{0} contains invalid schema update options. " - "Please only use one or more of the following options: {1}" - .format(schema_update_options, allowed_schema_update_options)) - if use_legacy_sql is None: - use_legacy_sql = self.use_legacy_sql + if not set(allowed_schema_update_options + ).issuperset(set(schema_update_options)): + raise ValueError("{0} contains invalid schema update options. " + "Please only use one or more of the following " + "options: {1}" + .format(schema_update_options, + allowed_schema_update_options)) - configuration = { - 'query': { - 'query': sql, - 'useLegacySql': use_legacy_sql, - 'maximumBillingTier': maximum_billing_tier, - 'maximumBytesBilled': maximum_bytes_billed, - 'priority': priority - } - } + if schema_update_options: + if write_disposition not in ["WRITE_APPEND", "WRITE_TRUNCATE"]: + raise ValueError("schema_update_options is only " + "allowed if write_disposition is " + "'WRITE_APPEND' or 'WRITE_TRUNCATE'.") if destination_dataset_table: - if '.' not in destination_dataset_table: - raise ValueError( - 'Expected destination_dataset_table name in the format of ' - '.
. Got: {}'.format( - destination_dataset_table)) destination_project, destination_dataset, destination_table = \ _split_tablename(table_input=destination_dataset_table, default_project_id=self.project_id) - configuration['query'].update({ - 'allowLargeResults': allow_large_results, - 'flattenResults': flatten_results, - 'writeDisposition': write_disposition, - 'createDisposition': create_disposition, - 'destinationTable': { - 'projectId': destination_project, - 'datasetId': destination_dataset, - 'tableId': destination_table, - } - }) - if udf_config: - if not isinstance(udf_config, list): - raise TypeError("udf_config argument must have a type 'list'" - " not {}".format(type(udf_config))) - configuration['query'].update({ - 'userDefinedFunctionResources': udf_config - }) - if query_params: - if self.use_legacy_sql: - raise ValueError("Query parameters are not allowed when using " - "legacy SQL") - else: - configuration['query']['queryParameters'] = query_params + destination_dataset_table = { + 'projectId': destination_project, + 'datasetId': destination_dataset, + 'tableId': destination_table, + } - if labels: - configuration['labels'] = labels + if cluster_fields: + cluster_fields = {'fields': cluster_fields} + + query_param_list = [ + (sql, 'query', None, str), + (priority, 'priority', 'INTERACTIVE', str), + (use_legacy_sql, 'useLegacySql', self.use_legacy_sql, bool), + (query_params, 'queryParameters', None, dict), + (udf_config, 'userDefinedFunctionResources', None, list), + (maximum_billing_tier, 'maximumBillingTier', None, int), + (maximum_bytes_billed, 'maximumBytesBilled', None, float), + (time_partitioning, 'timePartitioning', {}, dict), + (schema_update_options, 'schemaUpdateOptions', None, tuple), + (destination_dataset_table, 'destinationTable', None, dict), + (cluster_fields, 'clustering', None, dict), + ] - time_partitioning = _cleanse_time_partitioning( - destination_dataset_table, - time_partitioning - ) - if time_partitioning: - configuration['query'].update({ - 'timePartitioning': time_partitioning - }) + for param_tuple in query_param_list: - if schema_update_options: - if write_disposition not in ["WRITE_APPEND", "WRITE_TRUNCATE"]: - raise ValueError("schema_update_options is only " - "allowed if write_disposition is " - "'WRITE_APPEND' or 'WRITE_TRUNCATE'.") - else: - self.log.info( - "Adding experimental " - "'schemaUpdateOptions': {0}".format(schema_update_options)) - configuration['query'][ - 'schemaUpdateOptions'] = schema_update_options + param, param_name, param_default, param_type = param_tuple + + if param_name not in configuration['query'] and param in [None, {}, ()]: + if param_name == 'timePartitioning': + param_default = _cleanse_time_partitioning( + destination_dataset_table, time_partitioning) + param = param_default + + if param not in [None, {}, ()]: + _api_resource_configs_duplication_check( + param_name, param, configuration['query']) + + configuration['query'][param_name] = param + + # check valid type of provided param, + # it last step because we can get param from 2 sources, + # and first of all need to find it + + _validate_value(param_name, configuration['query'][param_name], + param_type) + + if param_name == 'schemaUpdateOptions' and param: + self.log.info("Adding experimental 'schemaUpdateOptions': " + "{0}".format(schema_update_options)) + + if param_name == 'destinationTable': + for key in ['projectId', 'datasetId', 'tableId']: + if key not in configuration['query']['destinationTable']: + raise ValueError( + "Not correct 'destinationTable' in " + "api_resource_configs. 'destinationTable' " + "must be a dict with {'projectId':'', " + "'datasetId':'', 'tableId':''}") + + configuration['query'].update({ + 'allowLargeResults': allow_large_results, + 'flattenResults': flatten_results, + 'writeDisposition': write_disposition, + 'createDisposition': create_disposition, + }) + + if 'useLegacySql' in configuration['query'] and \ + 'queryParameters' in configuration['query']: + raise ValueError("Query parameters are not allowed " + "when using legacy SQL") + + if labels: + _api_resource_configs_duplication_check( + 'labels', labels, configuration) + configuration['labels'] = labels return self.run_with_configuration(configuration) @@ -677,20 +725,20 @@ def run_extract( # noqa :param source_project_dataset_table: The dotted .
BigQuery table to use as the source data. - :type source_project_dataset_table: string + :type source_project_dataset_table: str :param destination_cloud_storage_uris: The destination Google Cloud Storage URI (e.g. gs://some-bucket/some-file.txt). Follows convention defined here: https://cloud.google.com/bigquery/exporting-data-from-bigquery#exportingmultiple :type destination_cloud_storage_uris: list :param compression: Type of compression to use. - :type compression: string + :type compression: str :param export_format: File format to export. - :type export_format: string + :type export_format: str :param field_delimiter: The delimiter to use when extracting to a CSV. - :type field_delimiter: string + :type field_delimiter: str :param print_header: Whether to print a header for a CSV file extract. - :type print_header: boolean + :type print_header: bool :param labels: a dictionary containing labels for the job/query, passed to BigQuery :type labels: dict @@ -749,11 +797,11 @@ def run_copy(self, :type source_project_dataset_tables: list|string :param destination_project_dataset_table: The destination BigQuery table. Format is: (project:|project.).
- :type destination_project_dataset_table: string + :type destination_project_dataset_table: str :param write_disposition: The write disposition if the table already exists. - :type write_disposition: string + :type write_disposition: str :param create_disposition: The create disposition if the table doesn't exist. - :type create_disposition: string + :type create_disposition: str :param labels a dictionary containing labels for the job/query, passed to BigQuery :type labels: dict @@ -815,7 +863,8 @@ def run_load(self, allow_jagged_rows=False, schema_update_options=(), src_fmt_configs=None, - time_partitioning=None): + time_partitioning=None, + cluster_fields=None): """ Executes a BigQuery load command to load data from Google Cloud Storage to BigQuery. See here: @@ -830,7 +879,7 @@ def run_load(self, project defined in the connection json. If a partition is specified the operator will automatically append the data, create a new partition or create a new DAY partitioned table. - :type destination_project_dataset_table: string + :type destination_project_dataset_table: str :param schema_fields: The schema field list as defined here: https://cloud.google.com/bigquery/docs/reference/v2/jobs#configuration.load :type schema_fields: list @@ -839,21 +888,21 @@ def run_load(self, per-object name can be used. :type source_uris: list :param source_format: File format to export. - :type source_format: string + :type source_format: str :param create_disposition: The create disposition if the table doesn't exist. - :type create_disposition: string + :type create_disposition: str :param skip_leading_rows: Number of rows to skip when loading from a CSV. :type skip_leading_rows: int :param write_disposition: The write disposition if the table already exists. - :type write_disposition: string + :type write_disposition: str :param field_delimiter: The delimiter to use when loading from a CSV. - :type field_delimiter: string + :type field_delimiter: str :param max_bad_records: The maximum number of bad records that BigQuery can ignore when running the job. :type max_bad_records: int :param quote_character: The value that is used to quote data sections in a CSV file. - :type quote_character: string + :type quote_character: str :param ignore_unknown_values: [Optional] Indicates if BigQuery should allow extra values that are not represented in the table schema. If true, the extra values are ignored. If false, records with extra columns @@ -862,7 +911,7 @@ def run_load(self, :type ignore_unknown_values: bool :param allow_quoted_newlines: Whether to allow quoted newlines (true) or not (false). - :type allow_quoted_newlines: boolean + :type allow_quoted_newlines: bool :param allow_jagged_rows: Accept rows that are missing trailing optional columns. The missing values are treated as nulls. If false, records with missing trailing columns are treated as bad records, and if there are too many bad @@ -875,10 +924,12 @@ def run_load(self, :param src_fmt_configs: configure optional fields specific to the source format :type src_fmt_configs: dict :param time_partitioning: configure optional time partitioning fields i.e. - partition by field, type and - expiration as per API specifications. Note that 'field' is not available in - conjunction with dataset.table$partition. + partition by field, type and expiration as per API specifications. :type time_partitioning: dict + :param cluster_fields: Request that the result of this load be stored sorted + by one or more columns. This is only available in combination with + time_partitioning. The order of columns given determines the sort order. + :type cluster_fields: list of str """ # bigquery only allows certain source formats @@ -888,8 +939,7 @@ def run_load(self, # https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.query.tableDefinitions.(key).sourceFormat if src_fmt_configs is None: src_fmt_configs = {} - if time_partitioning is None: - time_partitioning = {} + source_format = source_format.upper() allowed_formats = [ "CSV", "NEWLINE_DELIMITED_JSON", "AVRO", "GOOGLE_SHEETS", @@ -910,7 +960,7 @@ def run_load(self, if not set(allowed_schema_update_options).issuperset( set(schema_update_options)): raise ValueError( - "{0} contains invalid schema update options. " + "{0} contains invalid schema update options." "Please only use one or more of the following options: {1}" .format(schema_update_options, allowed_schema_update_options)) @@ -943,6 +993,9 @@ def run_load(self, 'timePartitioning': time_partitioning }) + if cluster_fields: + configuration['load'].update({'clustering': {'fields': cluster_fields}}) + if schema_fields: configuration['load']['schema'] = {'fields': schema_fields} @@ -1164,13 +1217,9 @@ def run_table_delete(self, deletion_dataset_table, :type deletion_dataset_table: str :param ignore_if_missing: if True, then return success even if the requested table does not exist. - :type ignore_if_missing: boolean + :type ignore_if_missing: bool :return: """ - if '.' not in deletion_dataset_table: - raise ValueError( - 'Expected deletion_dataset_table name in the format of ' - '.
. Got: {}'.format(deletion_dataset_table)) deletion_project, deletion_dataset, deletion_table = \ _split_tablename(table_input=deletion_dataset_table, default_project_id=self.project_id) @@ -1301,6 +1350,72 @@ def run_grant_dataset_view_access(self, view_project, view_dataset, view_table, source_project, source_dataset) return source_dataset_resource + def create_empty_dataset(self, dataset_id="", project_id="", + dataset_reference=None): + """ + Create a new empty dataset: + https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets/insert + + :param project_id: The name of the project where we want to create + an empty a dataset. Don't need to provide, if projectId in dataset_reference. + :type project_id: str + :param dataset_id: The id of dataset. Don't need to provide, + if datasetId in dataset_reference. + :type dataset_id: str + :param dataset_reference: Dataset reference that could be provided + with request body. More info: + https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#resource + :type dataset_reference: dict + """ + + if dataset_reference: + _validate_value('dataset_reference', dataset_reference, dict) + else: + dataset_reference = {} + + if "datasetReference" not in dataset_reference: + dataset_reference["datasetReference"] = {} + + if not dataset_reference["datasetReference"].get("datasetId") and not dataset_id: + raise ValueError( + "{} not provided datasetId. Impossible to create dataset") + + dataset_required_params = [(dataset_id, "datasetId", ""), + (project_id, "projectId", self.project_id)] + for param_tuple in dataset_required_params: + param, param_name, param_default = param_tuple + if param_name not in dataset_reference['datasetReference']: + if param_default and not param: + self.log.info("{} was not specified. Will be used default " + "value {}.".format(param_name, + param_default)) + param = param_default + dataset_reference['datasetReference'].update( + {param_name: param}) + elif param: + _api_resource_configs_duplication_check( + param_name, param, + dataset_reference['datasetReference'], 'dataset_reference') + + dataset_id = dataset_reference.get("datasetReference").get("datasetId") + dataset_project_id = dataset_reference.get("datasetReference").get( + "projectId") + + self.log.info('Creating Dataset: %s in project: %s ', dataset_id, + dataset_project_id) + + try: + self.service.datasets().insert( + projectId=dataset_project_id, + body=dataset_reference).execute() + self.log.info('Dataset created successfully: In project %s ' + 'Dataset %s', dataset_project_id, dataset_id) + + except HttpError as err: + raise AirflowException( + 'BigQuery job failed. Error was: {}'.format(err.content) + ) + def delete_dataset(self, project_id, dataset_id): """ Delete a dataset of Big query in your project. @@ -1326,6 +1441,86 @@ def delete_dataset(self, project_id, dataset_id): 'BigQuery job failed. Error was: {}'.format(err.content) ) + def get_dataset(self, dataset_id, project_id=None): + """ + Method returns dataset_resource if dataset exist + and raised 404 error if dataset does not exist + + :param dataset_id: The BigQuery Dataset ID + :type dataset_id: str + :param project_id: The GCP Project ID + :type project_id: str + :return: dataset_resource + + .. seealso:: + For more information, see Dataset Resource content: + https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#resource + """ + + if not dataset_id or not isinstance(dataset_id, str): + raise ValueError("dataset_id argument must be provided and has " + "a type 'str'. You provided: {}".format(dataset_id)) + + dataset_project_id = project_id if project_id else self.project_id + + try: + dataset_resource = self.service.datasets().get( + datasetId=dataset_id, projectId=dataset_project_id).execute() + self.log.info("Dataset Resource: {}".format(dataset_resource)) + except HttpError as err: + raise AirflowException( + 'BigQuery job failed. Error was: {}'.format(err.content)) + + return dataset_resource + + def get_datasets_list(self, project_id=None): + """ + Method returns full list of BigQuery datasets in the current project + + .. seealso:: + For more information, see: + https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets/list + + :param project_id: Google Cloud Project for which you + try to get all datasets + :type project_id: str + :return: datasets_list + + Example of returned datasets_list: :: + + { + "kind":"bigquery#dataset", + "location":"US", + "id":"your-project:dataset_2_test", + "datasetReference":{ + "projectId":"your-project", + "datasetId":"dataset_2_test" + } + }, + { + "kind":"bigquery#dataset", + "location":"US", + "id":"your-project:dataset_1_test", + "datasetReference":{ + "projectId":"your-project", + "datasetId":"dataset_1_test" + } + } + ] + """ + dataset_project_id = project_id if project_id else self.project_id + + try: + datasets_list = self.service.datasets().list( + projectId=dataset_project_id).execute()['datasets'] + self.log.info("Datasets List: {}".format(datasets_list)) + + except HttpError as err: + raise AirflowException( + 'BigQuery job failed. Error was: {}'.format(err.content)) + + return datasets_list + class BigQueryCursor(BigQueryBaseCursor): """ @@ -1366,7 +1561,7 @@ def execute(self, operation, parameters=None): Executes a BigQuery query, and returns the job ID. :param operation: The query to execute. - :type operation: string + :type operation: str :param parameters: Parameters to substitute into the query. :type parameters: dict """ @@ -1379,7 +1574,7 @@ def executemany(self, operation, seq_of_parameters): Execute a BigQuery query multiple times with different parameters. :param operation: The query to execute. - :type operation: string + :type operation: str :param seq_of_parameters: List of dictionary parameters to substitute into the query. :type seq_of_parameters: list @@ -1536,6 +1731,12 @@ def _bq_cast(string_field, bq_type): def _split_tablename(table_input, default_project_id, var_name=None): + + if '.' not in table_input: + raise ValueError( + 'Expected deletion_dataset_table name in the format of ' + '.
. Got: {}'.format(table_input)) + if not default_project_id: raise ValueError("INTERNAL: No default project is specified") @@ -1597,13 +1798,30 @@ def var_print(var_name): def _cleanse_time_partitioning(destination_dataset_table, time_partitioning_in): # if it is a partitioned table ($ is in the table name) add partition load option + + if time_partitioning_in is None: + time_partitioning_in = {} + time_partitioning_out = {} if destination_dataset_table and '$' in destination_dataset_table: - if time_partitioning_in.get('field'): - raise ValueError( - "Cannot specify field partition and partition name" - "(dataset.table$partition) at the same time") time_partitioning_out['type'] = 'DAY' - time_partitioning_out.update(time_partitioning_in) return time_partitioning_out + + +def _validate_value(key, value, expected_type): + """ function to check expected type and raise + error if type is not correct """ + if not isinstance(value, expected_type): + raise TypeError("{} argument must have a type {} not {}".format( + key, expected_type, type(value))) + + +def _api_resource_configs_duplication_check(key, value, config_dict, + config_dict_name='api_resource_configs'): + if key in config_dict and value != config_dict[key]: + raise ValueError("Values of {param_name} param are duplicated. " + "{dict_name} contained {param_name} param " + "in `query` config and {param_name} was also provided " + "with arg to run_query() method. Please remove duplicates." + .format(param_name=key, dict_name=config_dict_name)) diff --git a/airflow/contrib/hooks/cassandra_hook.py b/airflow/contrib/hooks/cassandra_hook.py index 0e0b47708d5a5..2c744fe9b11a8 100644 --- a/airflow/contrib/hooks/cassandra_hook.py +++ b/airflow/contrib/hooks/cassandra_hook.py @@ -164,7 +164,7 @@ def table_exists(self, table): :param table: Target Cassandra table. Use dot notation to target a specific keyspace. - :type table: string + :type table: str """ keyspace = self.keyspace if '.' in table: @@ -179,7 +179,7 @@ def record_exists(self, table, keys): :param table: Target Cassandra table. Use dot notation to target a specific keyspace. - :type table: string + :type table: str :param keys: The keys and their values to check the existence. :type keys: dict """ diff --git a/airflow/contrib/hooks/databricks_hook.py b/airflow/contrib/hooks/databricks_hook.py index 54f00e00907c0..13885bb4e1b64 100644 --- a/airflow/contrib/hooks/databricks_hook.py +++ b/airflow/contrib/hooks/databricks_hook.py @@ -24,6 +24,7 @@ from airflow.hooks.base_hook import BaseHook from requests import exceptions as requests_exceptions from requests.auth import AuthBase +from time import sleep from airflow.utils.log.logging_mixin import LoggingMixin @@ -32,7 +33,11 @@ except ImportError: import urlparse +RESTART_CLUSTER_ENDPOINT = ("POST", "api/2.0/clusters/restart") +START_CLUSTER_ENDPOINT = ("POST", "api/2.0/clusters/start") +TERMINATE_CLUSTER_ENDPOINT = ("POST", "api/2.0/clusters/delete") +RUN_NOW_ENDPOINT = ('POST', 'api/2.0/jobs/run-now') SUBMIT_RUN_ENDPOINT = ('POST', 'api/2.0/jobs/runs/submit') GET_RUN_ENDPOINT = ('GET', 'api/2.0/jobs/runs/get') CANCEL_RUN_ENDPOINT = ('POST', 'api/2.0/jobs/runs/cancel') @@ -47,16 +52,20 @@ def __init__( self, databricks_conn_id='databricks_default', timeout_seconds=180, - retry_limit=3): + retry_limit=3, + retry_delay=1.0): """ :param databricks_conn_id: The name of the databricks connection to use. - :type databricks_conn_id: string + :type databricks_conn_id: str :param timeout_seconds: The amount of time in seconds the requests library will wait before timing-out. :type timeout_seconds: int :param retry_limit: The number of times to retry the connection in case of service outages. :type retry_limit: int + :param retry_delay: The number of seconds to wait between retries (it + might be a floating point number). + :type retry_delay: float """ self.databricks_conn_id = databricks_conn_id self.databricks_conn = self.get_connection(databricks_conn_id) @@ -64,6 +73,7 @@ def __init__( if retry_limit < 1: raise ValueError('Retry limit must be greater than equal to 1') self.retry_limit = retry_limit + self.retry_delay = retry_delay @staticmethod def _parse_host(host): @@ -119,7 +129,8 @@ def _do_api_call(self, endpoint_info, json): else: raise AirflowException('Unexpected HTTP Method: ' + method) - for attempt_num in range(1, self.retry_limit + 1): + attempt_num = 1 + while True: try: response = request_func( url, @@ -127,21 +138,41 @@ def _do_api_call(self, endpoint_info, json): auth=auth, headers=USER_AGENT_HEADER, timeout=self.timeout_seconds) - if response.status_code == requests.codes.ok: - return response.json() - else: + response.raise_for_status() + return response.json() + except requests_exceptions.RequestException as e: + if not _retryable_error(e): # In this case, the user probably made a mistake. # Don't retry. raise AirflowException('Response: {0}, Status Code: {1}'.format( - response.content, response.status_code)) - except (requests_exceptions.ConnectionError, - requests_exceptions.Timeout) as e: - self.log.error( - 'Attempt %s API Request to Databricks failed with reason: %s', - attempt_num, e - ) - raise AirflowException(('API requests to Databricks failed {} times. ' + - 'Giving up.').format(self.retry_limit)) + e.response.content, e.response.status_code)) + + self._log_request_error(attempt_num, e) + + if attempt_num == self.retry_limit: + raise AirflowException(('API requests to Databricks failed {} times. ' + + 'Giving up.').format(self.retry_limit)) + + attempt_num += 1 + sleep(self.retry_delay) + + def _log_request_error(self, attempt_num, error): + self.log.error( + 'Attempt %s API Request to Databricks failed with reason: %s', + attempt_num, error + ) + + def run_now(self, json): + """ + Utility function to call the ``api/2.0/jobs/run-now`` endpoint. + + :param json: The data used in the body of the request to the ``run-now`` endpoint. + :type json: dict + :return: the run_id as a string + :rtype: str + """ + response = self._do_api_call(RUN_NOW_ENDPOINT, json) + return response['run_id'] def submit_run(self, json): """ @@ -150,7 +181,7 @@ def submit_run(self, json): :param json: The data used in the body of the request to the ``submit`` endpoint. :type json: dict :return: the run_id as a string - :rtype: string + :rtype: str """ response = self._do_api_call(SUBMIT_RUN_ENDPOINT, json) return response['run_id'] @@ -174,6 +205,27 @@ def cancel_run(self, run_id): json = {'run_id': run_id} self._do_api_call(CANCEL_RUN_ENDPOINT, json) + def restart_cluster(self, json): + self._do_api_call(RESTART_CLUSTER_ENDPOINT, json) + + def start_cluster(self, json): + self._do_api_call(START_CLUSTER_ENDPOINT, json) + + def terminate_cluster(self, json): + self._do_api_call(TERMINATE_CLUSTER_ENDPOINT, json) + + +def _retryable_error(exception): + return isinstance(exception, requests_exceptions.ConnectionError) \ + or isinstance(exception, requests_exceptions.Timeout) \ + or exception.response is not None and exception.response.status_code >= 500 + + +def _retryable_error(exception): + return isinstance(exception, requests_exceptions.ConnectionError) \ + or isinstance(exception, requests_exceptions.Timeout) \ + or exception.response is not None and exception.response.status_code >= 500 + RUN_LIFE_CYCLE_STATES = [ 'PENDING', diff --git a/airflow/contrib/hooks/datadog_hook.py b/airflow/contrib/hooks/datadog_hook.py index 3dfeb781aefe0..f00e49b097ffe 100644 --- a/airflow/contrib/hooks/datadog_hook.py +++ b/airflow/contrib/hooks/datadog_hook.py @@ -35,7 +35,7 @@ class DatadogHook(BaseHook, LoggingMixin): Airflow runs. :param datadog_conn_id: The connection to datadog, containing metadata for api keys. - :param datadog_conn_id: string + :param datadog_conn_id: str """ def __init__(self, datadog_conn_id='datadog_default'): conn = self.get_connection(datadog_conn_id) @@ -71,9 +71,9 @@ def send_metric(self, metric_name, datapoint, tags=None): Sends a single datapoint metric to DataDog :param metric_name: The name of the metric - :type metric_name: string + :type metric_name: str :param datapoint: A single integer or float related to the metric - :type datapoint: integer or float + :type datapoint: int or float :param tags: A list of tags associated with the metric :type tags: list """ @@ -95,7 +95,7 @@ def query_metric(self, function applied to it and returns the results. :param query: The datadog query to execute (see datadog docs) - :type query: string + :type query: str :param from_seconds_ago: How many seconds ago to start querying for. :type from_seconds_ago: int :param to_seconds_ago: Up to how many seconds ago to query for. @@ -118,16 +118,16 @@ def post_event(self, title, text, tags=None, alert_type=None, aggregation_key=No alerting itself. :param title: The title of the event - :type title: string + :type title: str :param text: The body of the event (more information) - :type text: string + :type text: str :param tags: List of string tags to apply to the event :type tags: list :param alert_type: The alert type for the event, one of ["error", "warning", "info", "success"] - :type alert_type: string + :type alert_type: str :param aggregation_key: Key that can be used to aggregate this event in a stream - :type aggregation_key: string + :type aggregation_key: str """ response = api.Event.create( title=title, diff --git a/airflow/contrib/hooks/gcp_api_base_hook.py b/airflow/contrib/hooks/gcp_api_base_hook.py index 053494743f064..72d8e483a74df 100644 --- a/airflow/contrib/hooks/gcp_api_base_hook.py +++ b/airflow/contrib/hooks/gcp_api_base_hook.py @@ -58,11 +58,11 @@ class GoogleCloudBaseHook(BaseHook, LoggingMixin): def __init__(self, gcp_conn_id='google_cloud_default', delegate_to=None): """ :param gcp_conn_id: The connection ID to use when fetching connection info. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ self.gcp_conn_id = gcp_conn_id self.delegate_to = delegate_to @@ -87,7 +87,7 @@ def _get_credentials(self): elif key_path: # Get credentials from a JSON file. if key_path.endswith('.json'): - self.log.info('Getting connection using a JSON key file.') + self.log.debug('Getting connection using JSON key file %s' % key_path) credentials = ( google.oauth2.service_account.Credentials.from_service_account_file( key_path, scopes=scopes) diff --git a/airflow/contrib/hooks/gcp_container_hook.py b/airflow/contrib/hooks/gcp_container_hook.py index e5fbda138e0fa..3934f07a957f0 100644 --- a/airflow/contrib/hooks/gcp_container_hook.py +++ b/airflow/contrib/hooks/gcp_container_hook.py @@ -48,6 +48,7 @@ def __init__(self, project_id, location): def _dict_to_proto(py_dict, proto): """ Converts a python dictionary to the proto supplied + :param py_dict: The dictionary to convert :type py_dict: dict :param proto: The proto object to merge with dictionary @@ -63,6 +64,7 @@ def wait_for_operation(self, operation): """ Given an operation, continuously fetches the status from Google Cloud until either completion or an error occurring + :param operation: The Operation to wait for :type operation: A google.cloud.container_V1.gapic.enums.Operator :return: A new, updated operation fetched from Google Cloud @@ -83,6 +85,7 @@ def wait_for_operation(self, operation): def get_operation(self, operation_name): """ Fetches the operation from Google Cloud + :param operation_name: Name of operation to fetch :type operation_name: str :return: The new, updated operation from Google Cloud @@ -98,6 +101,7 @@ def _append_label(cluster_proto, key, val): Labels must fit the regex [a-z]([-a-z0-9]*[a-z0-9])? (current airflow version string follows semantic versioning spec: x.y.z). + :param cluster_proto: The proto to append resource_label airflow version to :type cluster_proto: google.cloud.container_v1.types.Cluster :param key: The key label @@ -196,6 +200,7 @@ def create_cluster(self, cluster, retry=DEFAULT, timeout=DEFAULT): def get_cluster(self, name, retry=DEFAULT, timeout=DEFAULT): """ Gets details of specified cluster + :param name: The name of the cluster to retrieve :type name: str :param retry: A retry object used to retry requests. If None is specified, diff --git a/airflow/contrib/hooks/gcp_dataflow_hook.py b/airflow/contrib/hooks/gcp_dataflow_hook.py index 8c9b7423e0e6d..4fdb07c74d2ce 100644 --- a/airflow/contrib/hooks/gcp_dataflow_hook.py +++ b/airflow/contrib/hooks/gcp_dataflow_hook.py @@ -190,11 +190,9 @@ def get_conn(self): return build( 'dataflow', 'v1b3', http=http_authorized, cache_discovery=False) - def _start_dataflow(self, task_id, variables, name, - command_prefix, label_formatter): + def _start_dataflow(self, variables, name, command_prefix, label_formatter): variables = self._set_variables(variables) - cmd = command_prefix + self._build_cmd(task_id, variables, - label_formatter) + cmd = command_prefix + self._build_cmd(variables, label_formatter) job_id = _Dataflow(cmd).wait_for_done() _DataflowJob(self.get_conn(), variables['project'], name, variables['region'], @@ -208,9 +206,9 @@ def _set_variables(variables): variables['region'] = DEFAULT_DATAFLOW_LOCATION return variables - def start_java_dataflow(self, task_id, variables, dataflow, job_class=None, + def start_java_dataflow(self, job_name, variables, dataflow, job_class=None, append_job_name=True): - name = self._build_dataflow_job_name(task_id, append_job_name) + name = self._build_dataflow_job_name(job_name, append_job_name) variables['jobName'] = name def label_formatter(labels_dict): @@ -218,46 +216,44 @@ def label_formatter(labels_dict): json.dumps(labels_dict).replace(' ', ''))] command_prefix = (["java", "-cp", dataflow, job_class] if job_class else ["java", "-jar", dataflow]) - self._start_dataflow(task_id, variables, name, - command_prefix, label_formatter) + self._start_dataflow(variables, name, command_prefix, label_formatter) - def start_template_dataflow(self, task_id, variables, parameters, dataflow_template, + def start_template_dataflow(self, job_name, variables, parameters, dataflow_template, append_job_name=True): - name = self._build_dataflow_job_name(task_id, append_job_name) + name = self._build_dataflow_job_name(job_name, append_job_name) self._start_template_dataflow( name, variables, parameters, dataflow_template) - def start_python_dataflow(self, task_id, variables, dataflow, py_options, + def start_python_dataflow(self, job_name, variables, dataflow, py_options, append_job_name=True): - name = self._build_dataflow_job_name(task_id, append_job_name) + name = self._build_dataflow_job_name(job_name, append_job_name) variables['job_name'] = name def label_formatter(labels_dict): return ['--labels={}={}'.format(key, value) for key, value in labels_dict.items()] - self._start_dataflow(task_id, variables, name, - ["python"] + py_options + [dataflow], + self._start_dataflow(variables, name, ["python2"] + py_options + [dataflow], label_formatter) @staticmethod - def _build_dataflow_job_name(task_id, append_job_name=True): - task_id = str(task_id).replace('_', '-') + def _build_dataflow_job_name(job_name, append_job_name=True): + base_job_name = str(job_name).replace('_', '-') - if not re.match(r"^[a-z]([-a-z0-9]*[a-z0-9])?$", task_id): + if not re.match(r"^[a-z]([-a-z0-9]*[a-z0-9])?$", base_job_name): raise ValueError( 'Invalid job_name ({}); the name must consist of' 'only the characters [-a-z0-9], starting with a ' - 'letter and ending with a letter or number '.format(task_id)) + 'letter and ending with a letter or number '.format(base_job_name)) if append_job_name: - job_name = task_id + "-" + str(uuid.uuid1())[:8] + safe_job_name = base_job_name + "-" + str(uuid.uuid4())[:8] else: - job_name = task_id + safe_job_name = base_job_name - return job_name + return safe_job_name @staticmethod - def _build_cmd(task_id, variables, label_formatter): + def _build_cmd(variables, label_formatter): command = ["--runner=DataflowRunner"] if variables is not None: for attr, value in variables.items(): diff --git a/airflow/contrib/hooks/gcp_dataproc_hook.py b/airflow/contrib/hooks/gcp_dataproc_hook.py index 57c48bde59328..ca86f087950ee 100644 --- a/airflow/contrib/hooks/gcp_dataproc_hook.py +++ b/airflow/contrib/hooks/gcp_dataproc_hook.py @@ -28,7 +28,8 @@ class _DataProcJob(LoggingMixin): - def __init__(self, dataproc_api, project_id, job, region='global'): + def __init__(self, dataproc_api, project_id, job, region='global', + job_error_states=None): self.dataproc_api = dataproc_api self.project_id = project_id self.region = region @@ -37,6 +38,7 @@ def __init__(self, dataproc_api, project_id, job, region='global'): region=self.region, body=job).execute() self.job_id = self.job['reference']['jobId'] + self.job_error_states = job_error_states self.log.info( 'DataProc job %s is %s', self.job_id, str(self.job['status']['state']) @@ -49,19 +51,23 @@ def wait_for_done(self): region=self.region, jobId=self.job_id).execute(num_retries=5) if 'ERROR' == self.job['status']['state']: - print(str(self.job)) self.log.error('DataProc job %s has errors', self.job_id) self.log.error(self.job['status']['details']) self.log.debug(str(self.job)) + self.log.info('Driver output location: %s', + self.job['driverOutputResourceUri']) return False if 'CANCELLED' == self.job['status']['state']: - print(str(self.job)) self.log.warning('DataProc job %s is cancelled', self.job_id) if 'details' in self.job['status']: self.log.warning(self.job['status']['details']) self.log.debug(str(self.job)) + self.log.info('Driver output location: %s', + self.job['driverOutputResourceUri']) return False if 'DONE' == self.job['status']['state']: + self.log.info('Driver output location: %s', + self.job['driverOutputResourceUri']) return True self.log.debug( 'DataProc job %s is %s', @@ -70,10 +76,15 @@ def wait_for_done(self): time.sleep(5) def raise_error(self, message=None): - if 'ERROR' == self.job['status']['state']: - if message is None: - message = "Google DataProc job has error" - raise Exception(message + ": " + str(self.job['status']['details'])) + job_state = self.job['status']['state'] + # We always consider ERROR to be an error state. + if ((self.job_error_states and job_state in self.job_error_states) + or 'ERROR' == job_state): + ex_message = message or ("Google DataProc job has state: %s" % job_state) + ex_details = (str(self.job['status']['details']) + if 'details' in self.job['status'] + else "No details available") + raise Exception(ex_message + ": " + ex_details) def get(self): return self.job @@ -81,7 +92,7 @@ def get(self): class _DataProcJobBuilder: def __init__(self, project_id, task_id, cluster_name, job_type, properties): - name = task_id + "_" + str(uuid.uuid1())[:8] + name = task_id + "_" + str(uuid.uuid4())[:8] self.job_type = job_type self.job = { "job": { @@ -141,7 +152,7 @@ def set_python_main(self, main): self.job["job"][self.job_type]["mainPythonFileUri"] = main def set_job_name(self, name): - self.job["job"]["reference"]["jobId"] = name + "_" + str(uuid.uuid1())[:8] + self.job["job"]["reference"]["jobId"] = name + "_" + str(uuid.uuid4())[:8] def build(self): return self.job @@ -216,10 +227,11 @@ def get_cluster(self, project_id, region, cluster_name): clusterName=cluster_name ).execute(num_retries=5) - def submit(self, project_id, job, region='global'): - submitted = _DataProcJob(self.get_conn(), project_id, job, region) + def submit(self, project_id, job, region='global', job_error_states=None): + submitted = _DataProcJob(self.get_conn(), project_id, job, region, + job_error_states=job_error_states) if not submitted.wait_for_done(): - submitted.raise_error('DataProcTask has errors') + submitted.raise_error() def create_job_template(self, task_id, cluster_name, job_type, properties): return _DataProcJobBuilder(self.project_id, task_id, cluster_name, diff --git a/airflow/contrib/hooks/gcp_function_hook.py b/airflow/contrib/hooks/gcp_function_hook.py new file mode 100644 index 0000000000000..d2da19285ab13 --- /dev/null +++ b/airflow/contrib/hooks/gcp_function_hook.py @@ -0,0 +1,195 @@ +# -*- coding: utf-8 -*- +# +# 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. + +import time +import requests +from googleapiclient.discovery import build + +from airflow import AirflowException +from airflow.contrib.hooks.gcp_api_base_hook import GoogleCloudBaseHook + +# Number of retries - used by googleapiclient method calls to perform retries +# For requests that are "retriable" +NUM_RETRIES = 5 + +# Time to sleep between active checks of the operation results +TIME_TO_SLEEP_IN_SECONDS = 1 + + +# noinspection PyAbstractClass +class GcfHook(GoogleCloudBaseHook): + """ + Hook for Google Cloud Functions APIs. + """ + _conn = None + + def __init__(self, + api_version, + gcp_conn_id='google_cloud_default', + delegate_to=None): + super(GcfHook, self).__init__(gcp_conn_id, delegate_to) + self.api_version = api_version + + def get_conn(self): + """ + Retrieves connection to cloud functions. + + :return: Google Cloud Function services object + :rtype: dict + """ + if not self._conn: + http_authorized = self._authorize() + self._conn = build('cloudfunctions', self.api_version, + http=http_authorized, cache_discovery=False) + return self._conn + + def get_function(self, name): + """ + Returns the function with a given name. + + :param name: name of the function + :type name: str + :return: a CloudFunction object representing the function + :rtype: dict + """ + return self.get_conn().projects().locations().functions().get( + name=name).execute(num_retries=NUM_RETRIES) + + def list_functions(self, full_location): + """ + Lists all functions created in the location. + + :param full_location: full location including project. On the form + of /projects//location/ + :type full_location: str + :return: array of CloudFunction objects - representing functions in the location + :rtype: [dict] + """ + list_response = self.get_conn().projects().locations().functions().list( + parent=full_location).execute(num_retries=NUM_RETRIES) + return list_response.get("functions", []) + + def create_new_function(self, full_location, body): + """ + Creates new cloud function in location given with body specified. + + :param full_location: full location including project. On the form + of /projects//location/ + :type full_location: str + :param body: body required by the cloud function insert API + :type body: dict + :return: response returned by the operation + :rtype: dict + """ + response = self.get_conn().projects().locations().functions().create( + location=full_location, + body=body + ).execute(num_retries=NUM_RETRIES) + operation_name = response["name"] + return self._wait_for_operation_to_complete(operation_name) + + def update_function(self, name, body, update_mask): + """ + Updates cloud function according to the update mask specified. + + :param name: name of the function + :type name: str + :param body: body required by the cloud function patch API + :type body: str + :param update_mask: update mask - array of fields that should be patched + :type update_mask: [str] + :return: response returned by the operation + :rtype: dict + """ + response = self.get_conn().projects().locations().functions().patch( + updateMask=",".join(update_mask), + name=name, + body=body + ).execute(num_retries=NUM_RETRIES) + operation_name = response["name"] + return self._wait_for_operation_to_complete(operation_name) + + def upload_function_zip(self, parent, zip_path): + """ + Uploads zip file with sources. + + :param parent: project and location in which signed upload URL should be generated + in the form of /projects//location/ + :type parent: str + :param zip_path: path of the file to upload (should point to valid .zip file) + :type zip_path: str + :return: Upload URL that was returned by generateUploadUrl method + """ + response = self.get_conn().projects().locations().functions().generateUploadUrl( + parent=parent + ).execute(num_retries=NUM_RETRIES) + upload_url = response.get('uploadUrl') + with open(zip_path, 'rb') as fp: + requests.put( + url=upload_url, + data=fp.read(), + # Those two headers needs to be specified according to: + # https://cloud.google.com/functions/docs/reference/rest/v1/projects.locations.functions/generateUploadUrl + # nopep8 + headers={ + 'Content-type': 'application/zip', + 'x-goog-content-length-range': '0,104857600', + } + ) + return upload_url + + def delete_function(self, name): + """ + Deletes cloud function specified by name. + + :param name: name of the function + :type name: str + :return: response returned by the operation + :rtype: dict + """ + response = self.get_conn().projects().locations().functions().delete( + name=name).execute(num_retries=NUM_RETRIES) + operation_name = response["name"] + return self._wait_for_operation_to_complete(operation_name) + + def _wait_for_operation_to_complete(self, operation_name): + """ + Waits for the named operation to complete - checks status of the + asynchronous call. + + :param operation_name: name of the operation + :type operation_name: str + :return: response returned by the operation + :rtype: dict + :exception: AirflowException in case error is returned + """ + service = self.get_conn() + while True: + operation_response = service.operations().get( + name=operation_name, + ).execute(num_retries=NUM_RETRIES) + if operation_response.get("done"): + response = operation_response.get("response") + error = operation_response.get("error") + # Note, according to documentation always either response or error is + # set when "done" == True + if error: + raise AirflowException(str(error)) + return response + time.sleep(TIME_TO_SLEEP_IN_SECONDS) diff --git a/airflow/contrib/hooks/gcp_mlengine_hook.py b/airflow/contrib/hooks/gcp_mlengine_hook.py index b9f1008fa7fde..9c255dbe8018f 100644 --- a/airflow/contrib/hooks/gcp_mlengine_hook.py +++ b/airflow/contrib/hooks/gcp_mlengine_hook.py @@ -63,7 +63,7 @@ def create_job(self, project_id, job, use_existing_job_fn=None): :param project_id: The Google Cloud project id within which MLEngine job will be launched. - :type project_id: string + :type project_id: str :param job: MLEngine Job object that should be provided to the MLEngine API, such as: :: diff --git a/airflow/contrib/hooks/gcp_pubsub_hook.py b/airflow/contrib/hooks/gcp_pubsub_hook.py index 1d55d5d487237..bf33a9b6bcff4 100644 --- a/airflow/contrib/hooks/gcp_pubsub_hook.py +++ b/airflow/contrib/hooks/gcp_pubsub_hook.py @@ -60,10 +60,10 @@ def publish(self, project, topic, messages): """Publishes messages to a Pub/Sub topic. :param project: the GCP project ID in which to publish - :type project: string + :type project: str :param topic: the Pub/Sub topic to which to publish; do not include the ``projects/{project}/topics/`` prefix. - :type topic: string + :type topic: str :param messages: messages to publish; if the data field in a message is set, it should already be base64 encoded. :type messages: list of PubSub messages; see @@ -84,10 +84,10 @@ def create_topic(self, project, topic, fail_if_exists=False): :param project: the GCP project ID in which to create the topic - :type project: string + :type project: str :param topic: the Pub/Sub topic name to create; do not include the ``projects/{project}/topics/`` prefix. - :type topic: string + :type topic: str :param fail_if_exists: if set, raise an exception if the topic already exists :type fail_if_exists: bool @@ -112,10 +112,10 @@ def delete_topic(self, project, topic, fail_if_not_exists=False): """Deletes a Pub/Sub topic if it exists. :param project: the GCP project ID in which to delete the topic - :type project: string + :type project: str :param topic: the Pub/Sub topic name to delete; do not include the ``projects/{project}/topics/`` prefix. - :type topic: string + :type topic: str :param fail_if_not_exists: if set, raise an exception if the topic does not exist :type fail_if_not_exists: bool @@ -142,17 +142,17 @@ def create_subscription(self, topic_project, topic, subscription=None, :param topic_project: the GCP project ID of the topic that the subscription will be bound to. - :type topic_project: string + :type topic_project: str :param topic: the Pub/Sub topic name that the subscription will be bound to create; do not include the ``projects/{project}/subscriptions/`` prefix. - :type topic: string + :type topic: str :param subscription: the Pub/Sub subscription name. If empty, a random name will be generated using the uuid module - :type subscription: string + :type subscription: str :param subscription_project: the GCP project ID where the subscription will be created. If unspecified, ``topic_project`` will be used. - :type subscription_project: string + :type subscription_project: str :param ack_deadline_secs: Number of seconds that a subscriber has to acknowledge each message pulled from the subscription :type ack_deadline_secs: int @@ -161,7 +161,7 @@ def create_subscription(self, topic_project, topic, subscription=None, :type fail_if_exists: bool :return: subscription name which will be the system-generated value if the ``subscription`` parameter is not supplied - :rtype: string + :rtype: str """ service = self.get_conn() full_topic = _format_topic(topic_project, topic) @@ -197,10 +197,10 @@ def delete_subscription(self, project, subscription, """Deletes a Pub/Sub subscription, if it exists. :param project: the GCP project ID where the subscription exists - :type project: string + :type project: str :param subscription: the Pub/Sub subscription name to delete; do not include the ``projects/{project}/subscriptions/`` prefix. - :type subscription: string + :type subscription: str :param fail_if_not_exists: if set, raise an exception if the topic does not exist :type fail_if_not_exists: bool @@ -228,10 +228,10 @@ def pull(self, project, subscription, max_messages, """Pulls up to ``max_messages`` messages from Pub/Sub subscription. :param project: the GCP project ID where the subscription exists - :type project: string + :type project: str :param subscription: the Pub/Sub subscription name to pull from; do not include the 'projects/{project}/topics/' prefix. - :type subscription: string + :type subscription: str :param max_messages: The maximum number of messages to return from the Pub/Sub API. :type max_messages: int @@ -265,10 +265,10 @@ def acknowledge(self, project, subscription, ack_ids): :param project: the GCP project name or ID in which to create the topic - :type project: string + :type project: str :param subscription: the Pub/Sub subscription name to delete; do not include the 'projects/{project}/topics/' prefix. - :type subscription: string + :type subscription: str :param ack_ids: List of ReceivedMessage ackIds from a previous pull response :type ack_ids: list diff --git a/airflow/contrib/hooks/gcs_hook.py b/airflow/contrib/hooks/gcs_hook.py index 3d42ec4426dee..6cfa1cf565084 100644 --- a/airflow/contrib/hooks/gcs_hook.py +++ b/airflow/contrib/hooks/gcs_hook.py @@ -57,14 +57,15 @@ def copy(self, source_bucket, source_object, destination_bucket=None, source bucket/object is used, but not both. :param source_bucket: The bucket of the object to copy from. - :type source_bucket: string + :type source_bucket: str :param source_object: The object to copy. - :type source_object: string + :type source_object: str :param destination_bucket: The destination of the object to copied to. Can be omitted; then the same bucket is used. - :type destination_bucket: string + :type destination_bucket: str :param destination_object: The (renamed) path of the object if given. Can be omitted; then the same name is used. + :type destination_object: str """ destination_bucket = destination_bucket or source_bucket destination_object = destination_object or source_object @@ -102,11 +103,11 @@ def rewrite(self, source_bucket, source_object, destination_bucket, destination_object can be omitted, in which case source_object is used. :param source_bucket: The bucket of the object to copy from. - :type source_bucket: string + :type source_bucket: str :param source_object: The object to copy. - :type source_object: string + :type source_object: str :param destination_bucket: The destination of the object to copied to. - :type destination_bucket: string + :type destination_bucket: str :param destination_object: The (renamed) path of the object if given. Can be omitted; then the same name is used. """ @@ -150,11 +151,11 @@ def download(self, bucket, object, filename=None): Get a file from Google Cloud Storage. :param bucket: The bucket to fetch from. - :type bucket: string + :type bucket: str :param object: The object to fetch. - :type object: string + :type object: str :param filename: If set, a local file path where the file should be written to. - :type filename: string + :type filename: str """ service = self.get_conn() downloaded_file_bytes = service \ @@ -176,13 +177,13 @@ def upload(self, bucket, object, filename, mime_type='application/octet-stream') Uploads a local file to Google Cloud Storage. :param bucket: The bucket to upload to. - :type bucket: string + :type bucket: str :param object: The object name to set when uploading the local file. - :type object: string + :type object: str :param filename: The local file path to the file to be uploaded. - :type filename: string + :type filename: str :param mime_type: The MIME type to set when uploading the file. - :type mime_type: string + :type mime_type: str """ service = self.get_conn() media = MediaFileUpload(filename, mime_type) @@ -203,10 +204,10 @@ def exists(self, bucket, object): Checks for the existence of a file in Google Cloud Storage. :param bucket: The Google cloud storage bucket where the object is. - :type bucket: string + :type bucket: str :param object: The name of the object to check in the Google cloud storage bucket. - :type object: string + :type object: str """ service = self.get_conn() try: @@ -226,10 +227,10 @@ def is_updated_after(self, bucket, object, ts): Checks if an object is updated in Google Cloud Storage. :param bucket: The Google cloud storage bucket where the object is. - :type bucket: string + :type bucket: str :param object: The name of the object to check in the Google cloud storage bucket. - :type object: string + :type object: str :param ts: The timestamp to check against. :type ts: datetime """ @@ -265,11 +266,11 @@ def delete(self, bucket, object, generation=None): parameter is used. :param bucket: name of the bucket, where the object resides - :type bucket: string + :type bucket: str :param object: name of the object to delete - :type object: string + :type object: str :param generation: if present, permanently delete the object of this generation - :type generation: string + :type generation: str :return: True if succeeded """ service = self.get_conn() @@ -290,16 +291,16 @@ def list(self, bucket, versions=None, maxResults=None, prefix=None, delimiter=No List all objects from the bucket with the give string prefix in name :param bucket: bucket name - :type bucket: string + :type bucket: str :param versions: if true, list all versions of the objects - :type versions: boolean + :type versions: bool :param maxResults: max count of items to return in a single page of responses - :type maxResults: integer + :type maxResults: int :param prefix: prefix string which filters objects whose name begin with this prefix - :type prefix: string + :type prefix: str :param delimiter: filters objects based on the delimiter (for e.g '.csv') - :type delimiter: string + :type delimiter: str :return: a stream of object names matching the filtering criteria """ service = self.get_conn() @@ -343,9 +344,9 @@ def get_size(self, bucket, object): Gets the size of a file in Google Cloud Storage. :param bucket: The Google cloud storage bucket where the object is. - :type bucket: string + :type bucket: str :param object: The name of the object to check in the Google cloud storage bucket. - :type object: string + :type object: str """ self.log.info('Checking the file size of object: %s in bucket: %s', @@ -374,10 +375,10 @@ def get_crc32c(self, bucket, object): Gets the CRC32c checksum of an object in Google Cloud Storage. :param bucket: The Google cloud storage bucket where the object is. - :type bucket: string + :type bucket: str :param object: The name of the object to check in the Google cloud storage bucket. - :type object: string + :type object: str """ self.log.info('Retrieving the crc32c checksum of ' 'object: %s in bucket: %s', object, bucket) @@ -401,10 +402,10 @@ def get_md5hash(self, bucket, object): Gets the MD5 hash of an object in Google Cloud Storage. :param bucket: The Google cloud storage bucket where the object is. - :type bucket: string + :type bucket: str :param object: The name of the object to check in the Google cloud storage bucket. - :type object: string + :type object: str """ self.log.info('Retrieving the MD5 hash of ' 'object: %s in bucket: %s', object, bucket) @@ -439,7 +440,7 @@ def create_bucket(self, https://cloud.google.com/storage/docs/bucketnaming.html#requirements :param bucket_name: The name of the bucket. - :type bucket_name: string + :type bucket_name: str :param storage_class: This defines how objects in the bucket are stored and determines the SLA and the cost of storage. Values include @@ -450,7 +451,7 @@ def create_bucket(self, - ``COLDLINE``. If this value is not specified when the bucket is created, it will default to STANDARD. - :type storage_class: string + :type storage_class: str :param location: The location of the bucket. Object data for objects in the bucket resides in physical storage within this region. Defaults to US. @@ -458,9 +459,9 @@ def create_bucket(self, .. seealso:: https://developers.google.com/storage/docs/bucket-locations - :type location: string + :type location: str :param project_id: The ID of the GCP Project. - :type project_id: string + :type project_id: str :param labels: User-provided labels, in key/value pairs. :type labels: dict :return: If successful, it returns the ``id`` of the bucket. diff --git a/airflow/contrib/hooks/jira_hook.py b/airflow/contrib/hooks/jira_hook.py index c6806d935acf2..a56c414dceb54 100644 --- a/airflow/contrib/hooks/jira_hook.py +++ b/airflow/contrib/hooks/jira_hook.py @@ -29,7 +29,7 @@ class JiraHook(BaseHook, LoggingMixin): Jira interaction hook, a Wrapper around JIRA Python SDK. :param jira_conn_id: reference to a pre-defined Jira Connection - :type jira_conn_id: string + :type jira_conn_id: str """ def __init__(self, jira_conn_id='jira_default', diff --git a/airflow/contrib/hooks/redis_hook.py b/airflow/contrib/hooks/redis_hook.py index 1de75dbca905f..650cc9308be91 100644 --- a/airflow/contrib/hooks/redis_hook.py +++ b/airflow/contrib/hooks/redis_hook.py @@ -88,6 +88,6 @@ def key_exists(self, key): Checks if a key exists in Redis database :param key: The key to check the existence. - :type key: string + :type key: str """ return self.get_conn().exists(key) diff --git a/airflow/contrib/hooks/sagemaker_hook.py b/airflow/contrib/hooks/sagemaker_hook.py index 09993f96d8738..bc096ff55fccd 100644 --- a/airflow/contrib/hooks/sagemaker_hook.py +++ b/airflow/contrib/hooks/sagemaker_hook.py @@ -31,6 +31,8 @@ class SageMakerHook(AwsHook): sagemaker_conn_id is required for using the config stored in db for training/tuning """ + non_terminal_states = {'InProgress', 'Stopping', 'Stopped'} + failed_states = {'Failed'} def __init__(self, sagemaker_conn_id=None, @@ -96,12 +98,12 @@ def check_status(self, non_terminal_states, describe_function, *args): """ :param non_terminal_states: the set of non_terminal states - :type non_terminal_states: dict + :type non_terminal_states: set :param failed_state: the set of failed states - :type failed_state: dict + :type failed_state: set :param key: the key of the response dict that points to the state - :type key: string + :type key: str :param describe_function: the function used to retrieve the status :type describe_function: python callable :param args: the arguments for the function @@ -177,7 +179,7 @@ def create_training_job(self, training_job_config, wait_for_completion=True): :param training_job_config: the config for training :type training_job_config: dict :param wait_for_completion: if the program should keep running until job finishes - :param wait_for_completion: bool + :type wait_for_completion: bool :return: A dict that contains ARN of the training job. """ if self.use_db_config: @@ -194,8 +196,8 @@ def create_training_job(self, training_job_config, wait_for_completion=True): response = self.conn.create_training_job( **training_job_config) if wait_for_completion: - self.check_status(['InProgress', 'Stopping', 'Stopped'], - ['Failed'], + self.check_status(SageMakerHook.non_terminal_states, + SageMakerHook.failed_states, 'TrainingJobStatus', self.describe_training_job, training_job_config['TrainingJobName']) @@ -213,8 +215,8 @@ def create_tuning_job(self, tuning_job_config, wait_for_completion=True): if self.use_db_config: if not self.sagemaker_conn_id: raise AirflowException( - "sagemaker connection id must be present to \ - read sagemaker tunning job configuration.") + "SageMaker connection id must be present to \ + read SageMaker tunning job configuration.") sagemaker_conn = self.get_connection(self.sagemaker_conn_id) @@ -226,17 +228,63 @@ def create_tuning_job(self, tuning_job_config, wait_for_completion=True): response = self.conn.create_hyper_parameter_tuning_job( **tuning_job_config) if wait_for_completion: - self.check_status(['InProgress', 'Stopping', 'Stopped'], - ['Failed'], + self.check_status(SageMakerHook.non_terminal_states, + SageMakerHook.failed_states, 'HyperParameterTuningJobStatus', self.describe_tuning_job, tuning_job_config['HyperParameterTuningJobName']) return response + def create_transform_job(self, transform_job_config, wait_for_completion=True): + """ + Create a transform job + :param transform_job_config: the config for transform job + :type transform_job_config: dict + :param wait_for_completion: + if the program should keep running until job finishes + :type wait_for_completion: bool + :return: A dict that contains ARN of the transform job. + """ + if self.use_db_config: + if not self.sagemaker_conn_id: + raise AirflowException( + "SageMaker connection id must be present to \ + read SageMaker transform job configuration.") + + sagemaker_conn = self.get_connection(self.sagemaker_conn_id) + + config = sagemaker_conn.extra_dejson.copy() + transform_job_config.update(config) + + self.check_for_url(transform_job_config + ['TransformInput']['DataSource'] + ['S3DataSource']['S3Uri']) + + response = self.conn.create_transform_job( + **transform_job_config) + if wait_for_completion: + self.check_status(SageMakerHook.non_terminal_states, + SageMakerHook.failed_states, + 'TransformJobStatus', + self.describe_transform_job, + transform_job_config['TransformJobName']) + return response + + def create_model(self, model_config): + """ + Create a model job + :param model_config: the config for model + :type model_config: dict + :return: A dict that contains ARN of the model. + """ + + return self.conn.create_model( + **model_config) + def describe_training_job(self, training_job_name): """ :param training_job_name: the name of the training job - :type training_job_name: string + :type training_job_name: str Return the training job info associated with the current job_name :return: A dict contains all the training job info """ @@ -245,7 +293,7 @@ def describe_training_job(self, training_job_name): def describe_tuning_job(self, tuning_job_name): """ - :param tuning_job_name: the name of the training job + :param tuning_job_name: the name of the tuning job :type tuning_job_name: string Return the tuning job info associated with the current job_name :return: A dict contains all the tuning job info @@ -253,3 +301,14 @@ def describe_tuning_job(self, tuning_job_name): return self.conn\ .describe_hyper_parameter_tuning_job( HyperParameterTuningJobName=tuning_job_name) + + def describe_transform_job(self, transform_job_name): + """ + :param transform_job_name: the name of the transform job + :type transform_job_name: string + Return the transform job info associated with the current job_name + :return: A dict contains all the transform job info + """ + return self.conn\ + .describe_transform_job( + TransformJobName=transform_job_name) diff --git a/airflow/contrib/hooks/segment_hook.py b/airflow/contrib/hooks/segment_hook.py index 874d35d0743b9..01613f2adee8e 100644 --- a/airflow/contrib/hooks/segment_hook.py +++ b/airflow/contrib/hooks/segment_hook.py @@ -54,7 +54,7 @@ def __init__( :type segment_conn_id: str :param segment_debug_mode: Determines whether Segment should run in debug mode. Defaults to False - :type segment_debug_mode: boolean + :type segment_debug_mode: bool .. note:: You must include a JSON structure in the `Extras` field. We need a user's security token to connect to Segment. diff --git a/airflow/contrib/hooks/wasb_hook.py b/airflow/contrib/hooks/wasb_hook.py index 1d73abd78b3dd..130c19469bd08 100644 --- a/airflow/contrib/hooks/wasb_hook.py +++ b/airflow/contrib/hooks/wasb_hook.py @@ -58,7 +58,7 @@ def check_for_blob(self, container_name, blob_name, **kwargs): `BlockBlobService.exists()` takes. :type kwargs: object :return: True if the blob exists, False otherwise. - :rtype bool + :rtype: bool """ return self.connection.exists(container_name, blob_name, **kwargs) @@ -74,7 +74,7 @@ def check_for_prefix(self, container_name, prefix, **kwargs): `BlockBlobService.list_blobs()` takes. :type kwargs: object :return: True if blobs matching the prefix exist, False otherwise. - :rtype bool + :rtype: bool """ matches = self.connection.list_blobs(container_name, prefix, num_results=1, **kwargs) diff --git a/airflow/contrib/hooks/winrm_hook.py b/airflow/contrib/hooks/winrm_hook.py index 1dd02f9951fde..5cc24cb7ad75f 100644 --- a/airflow/contrib/hooks/winrm_hook.py +++ b/airflow/contrib/hooks/winrm_hook.py @@ -36,36 +36,36 @@ class WinRMHook(BaseHook, LoggingMixin): :param ssh_conn_id: connection id from airflow Connections from where all the required parameters can be fetched like username and password. Thought the priority is given to the param passed during init - :type ssh_conn_id: string + :type ssh_conn_id: str :param endpoint: When set to `None`, endpoint will be constructed like this: 'http://{remote_host}:{remote_port}/wsman' - :type endpoint: string + :type endpoint: str :param remote_host: Remote host to connect to. Ignored if `endpoint` is not `None`. - :type remote_host: string + :type remote_host: str :param remote_port: Remote port to connect to. Ignored if `endpoint` is not `None`. :type remote_port: int :param transport: transport type, one of 'plaintext' (default), 'kerberos', 'ssl', 'ntlm', 'credssp' - :type transport: string + :type transport: str :param username: username to connect to the remote_host - :type username: string + :type username: str :param password: password of the username to connect to the remote_host - :type password: string + :type password: str :param service: the service name, default is HTTP - :type service: string + :type service: str :param keytab: the path to a keytab file if you are using one - :type keytab: string + :type keytab: str :param ca_trust_path: Certification Authority trust path - :type ca_trust_path: string + :type ca_trust_path: str :param cert_pem: client authentication certificate file path in PEM format - :type cert_pem: string + :type cert_pem: str :param cert_key_pem: client authentication certificate key file path in PEM format - :type cert_key_pem: string + :type cert_key_pem: str :param server_cert_validation: whether server certificate should be validated on Python versions that suppport it; one of 'validate' (default), 'ignore' - :type server_cert_validation: string + :type server_cert_validation: str :param kerberos_delegation: if True, TGT is sent to target server to allow multiple hops :type kerberos_delegation: bool @@ -80,7 +80,7 @@ class WinRMHook(BaseHook, LoggingMixin): :type operation_timeout_sec: int :param kerberos_hostname_override: the hostname to use for the kerberos exchange (defaults to the hostname in the endpoint URL) - :type kerberos_hostname_override: string + :type kerberos_hostname_override: str :param message_encryption_enabled: Will encrypt the WinRM messages if set to True and the transport auth supports message encryption (Default True). :type message_encryption_enabled: bool diff --git a/airflow/contrib/kubernetes/kubernetes_request_factory/kubernetes_request_factory.py b/airflow/contrib/kubernetes/kubernetes_request_factory/kubernetes_request_factory.py index 27e0ebd29c0a3..97bcdf2abc9ea 100644 --- a/airflow/contrib/kubernetes/kubernetes_request_factory/kubernetes_request_factory.py +++ b/airflow/contrib/kubernetes/kubernetes_request_factory/kubernetes_request_factory.py @@ -175,6 +175,11 @@ def extract_service_account_name(pod, req): if pod.service_account_name: req['spec']['serviceAccountName'] = pod.service_account_name + @staticmethod + def extract_hostnetwork(pod, req): + if pod.hostnetwork: + req['spec']['hostNetwork'] = pod.hostnetwork + @staticmethod def extract_image_pull_secrets(pod, req): if pod.image_pull_secrets: diff --git a/airflow/contrib/kubernetes/kubernetes_request_factory/pod_request_factory.py b/airflow/contrib/kubernetes/kubernetes_request_factory/pod_request_factory.py index 95d6c829dec59..877d7aafe2b2e 100644 --- a/airflow/contrib/kubernetes/kubernetes_request_factory/pod_request_factory.py +++ b/airflow/contrib/kubernetes/kubernetes_request_factory/pod_request_factory.py @@ -59,6 +59,7 @@ def create(self, pod): self.extract_image_pull_secrets(pod, req) self.extract_annotations(pod, req) self.extract_affinity(pod, req) + self.extract_hostnetwork(pod, req) return req @@ -116,4 +117,5 @@ def create(self, pod): self.extract_image_pull_secrets(pod, req) self.extract_annotations(pod, req) self.extract_affinity(pod, req) + self.extract_hostnetwork(pod, req) return req diff --git a/airflow/contrib/kubernetes/pod.py b/airflow/contrib/kubernetes/pod.py index 6fcf354459b80..221c8f4180ef8 100644 --- a/airflow/contrib/kubernetes/pod.py +++ b/airflow/contrib/kubernetes/pod.py @@ -77,7 +77,8 @@ def __init__( service_account_name=None, resources=None, annotations=None, - affinity=None + affinity=None, + hostnetwork=False ): self.image = image self.envs = envs or {} @@ -98,3 +99,4 @@ def __init__( self.resources = resources or Resources() self.annotations = annotations or {} self.affinity = affinity or {} + self.hostnetwork = hostnetwork or False diff --git a/airflow/contrib/kubernetes/pod_generator.py b/airflow/contrib/kubernetes/pod_generator.py index 6d8d83ef054a9..bee7f5b9572a0 100644 --- a/airflow/contrib/kubernetes/pod_generator.py +++ b/airflow/contrib/kubernetes/pod_generator.py @@ -149,7 +149,7 @@ def make_pod(self, namespace, image, pod_id, cmds, arguments, labels): return Pod( namespace=namespace, - name=pod_id + "-" + str(uuid.uuid1())[:8], + name=pod_id + "-" + str(uuid.uuid4())[:8], image=image, cmds=cmds, args=arguments, diff --git a/airflow/contrib/kubernetes/pod_launcher.py b/airflow/contrib/kubernetes/pod_launcher.py index 42f2bfea8adec..8c8d949107494 100644 --- a/airflow/contrib/kubernetes/pod_launcher.py +++ b/airflow/contrib/kubernetes/pod_launcher.py @@ -22,7 +22,7 @@ from datetime import datetime as dt from airflow.contrib.kubernetes.kubernetes_request_factory import \ pod_request_factory as pod_factory -from kubernetes import watch +from kubernetes import watch, client from kubernetes.client.rest import ApiException from kubernetes.stream import stream as kubernetes_stream from airflow import AirflowException @@ -59,6 +59,15 @@ def run_pod_async(self, pod): raise return resp + def delete_pod(self, pod): + try: + self._client.delete_namespaced_pod( + pod.name, pod.namespace, body=client.V1DeleteOptions()) + except ApiException as e: + # If the pod is already deleted + if e.status != 404: + raise + def run_pod(self, pod, startup_timeout=120, get_logs=True): # type: (Pod) -> (State, result) """ diff --git a/airflow/contrib/operators/__init__.py b/airflow/contrib/operators/__init__.py index 247ec5941f7ad..b7f8352944d3f 100644 --- a/airflow/contrib/operators/__init__.py +++ b/airflow/contrib/operators/__init__.py @@ -17,37 +17,3 @@ # specific language governing permissions and limitations # under the License. # - - -# Contrib operators are not imported by default. They should be accessed -# directly: from airflow.contrib.operators.operator_module import Operator - - -import sys -import os - -# ------------------------------------------------------------------------ -# -# #TODO #FIXME Airflow 2.0 -# -# Old import machinary below. -# -# This is deprecated but should be kept until Airflow 2.0 -# for compatibility. -# -# ------------------------------------------------------------------------ -_operators = { - 'ssh_operator': ['SSHOperator'], - 'winrm_operator': ['WinRMOperator'], - 'vertica_operator': ['VerticaOperator'], - 'vertica_to_hive': ['VerticaToHiveTransfer'], - 'qubole_operator': ['QuboleOperator'], - 'spark_submit_operator': ['SparkSubmitOperator'], - 'file_to_wasb': ['FileToWasbOperator'], - 'fs_operator': ['FileSensor'], - 'hive_to_dynamodb': ['HiveToDynamoDBTransferOperator'] -} - -if not os.environ.get('AIRFLOW_USE_NEW_IMPORTS', False): - from airflow.utils.helpers import AirflowImporter - airflow_importer = AirflowImporter(sys.modules[__name__], _operators) diff --git a/airflow/contrib/operators/awsbatch_operator.py b/airflow/contrib/operators/awsbatch_operator.py index 50c6c2c319717..3c778e6e685cc 100644 --- a/airflow/contrib/operators/awsbatch_operator.py +++ b/airflow/contrib/operators/awsbatch_operator.py @@ -42,18 +42,20 @@ class AWSBatchOperator(BaseOperator): :type job_definition: str :param job_queue: the queue name on AWS Batch :type job_queue: str - :param: overrides: the same parameter that boto3 will receive on - containerOverrides (templated): - http://boto3.readthedocs.io/en/latest/reference/services/batch.html#submit_job - :type: overrides: dict - :param max_retries: exponential backoff retries while waiter is not merged, 4200 = 48 hours + :param overrides: the same parameter that boto3 will receive on + containerOverrides (templated): + http://boto3.readthedocs.io/en/latest/reference/services/batch.html#submit_job + :type overrides: dict + :param max_retries: exponential backoff retries while waiter is not + merged, 4200 = 48 hours :type max_retries: int :param aws_conn_id: connection id of AWS credentials / region name. If None, - credential boto3 strategy will be used - (http://boto3.readthedocs.io/en/latest/guide/configuration.html). + credential boto3 strategy will be used + (http://boto3.readthedocs.io/en/latest/guide/configuration.html). :type aws_conn_id: str :param region_name: region name to use in AWS Hook. Override the region_name in connection (if provided) + :type region_name: str """ ui_color = '#c3dae0' diff --git a/airflow/contrib/operators/bigquery_check_operator.py b/airflow/contrib/operators/bigquery_check_operator.py index a9c493f4fd418..247a1ae7fba1b 100644 --- a/airflow/contrib/operators/bigquery_check_operator.py +++ b/airflow/contrib/operators/bigquery_check_operator.py @@ -52,12 +52,12 @@ class BigQueryCheckOperator(CheckOperator): without stopping the progress of the DAG. :param sql: the sql to be executed - :type sql: string + :type sql: str :param bigquery_conn_id: reference to the BigQuery database - :type bigquery_conn_id: string + :type bigquery_conn_id: str :param use_legacy_sql: Whether to use legacy SQL (true) - or standard SQL (false). - :type use_legacy_sql: boolean + or standard SQL (false). + :type use_legacy_sql: bool """ @apply_defaults @@ -81,10 +81,10 @@ class BigQueryValueCheckOperator(ValueCheckOperator): Performs a simple value check using sql code. :param sql: the sql to be executed - :type sql: string + :type sql: str :param use_legacy_sql: Whether to use legacy SQL (true) - or standard SQL (false). - :type use_legacy_sql: boolean + or standard SQL (false). + :type use_legacy_sql: bool """ @apply_defaults @@ -113,7 +113,7 @@ class BigQueryIntervalCheckOperator(IntervalCheckOperator): This method constructs a query like so :: SELECT {metrics_threshold_dict_key} FROM {table} - WHERE {date_filter_column}= + WHERE {date_filter_column}= :param table: the table name :type table: str @@ -125,8 +125,8 @@ class BigQueryIntervalCheckOperator(IntervalCheckOperator): between the current day, and the prior days_back. :type metrics_threshold: dict :param use_legacy_sql: Whether to use legacy SQL (true) - or standard SQL (false). - :type use_legacy_sql: boolean + or standard SQL (false). + :type use_legacy_sql: bool """ @apply_defaults diff --git a/airflow/contrib/operators/bigquery_get_data.py b/airflow/contrib/operators/bigquery_get_data.py index ab8f71b717716..f5e6e50f066d5 100644 --- a/airflow/contrib/operators/bigquery_get_data.py +++ b/airflow/contrib/operators/bigquery_get_data.py @@ -51,21 +51,21 @@ class BigQueryGetDataOperator(BaseOperator): ) :param dataset_id: The dataset ID of the requested table. (templated) - :type destination_dataset_table: string + :type dataset_id: str :param table_id: The table ID of the requested table. (templated) - :type table_id: string + :type table_id: str :param max_results: The maximum number of records (rows) to be fetched from the table. (templated) - :type max_results: string + :type max_results: str :param selected_fields: List of fields to return (comma-separated). If unspecified, all fields are returned. - :type selected_fields: string + :type selected_fields: str :param bigquery_conn_id: reference to a specific BigQuery hook. - :type bigquery_conn_id: string + :type bigquery_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ template_fields = ('dataset_id', 'table_id', 'max_results') ui_color = '#e4f0e8' diff --git a/airflow/contrib/operators/bigquery_operator.py b/airflow/contrib/operators/bigquery_operator.py index 09f442ae7b1a6..9386e57c0780f 100644 --- a/airflow/contrib/operators/bigquery_operator.py +++ b/airflow/contrib/operators/bigquery_operator.py @@ -41,40 +41,47 @@ class BigQueryOperator(BaseOperator): :param destination_dataset_table: A dotted (.|:).
that, if set, will store the results of the query. (templated) - :type destination_dataset_table: string + :type destination_dataset_table: str :param write_disposition: Specifies the action that occurs if the destination table already exists. (default: 'WRITE_EMPTY') - :type write_disposition: string + :type write_disposition: str :param create_disposition: Specifies whether the job is allowed to create new tables. (default: 'CREATE_IF_NEEDED') - :type create_disposition: string + :type create_disposition: str :param allow_large_results: Whether to allow large results. - :type allow_large_results: boolean + :type allow_large_results: bool :param flatten_results: If true and query uses legacy SQL dialect, flattens all nested and repeated fields in the query results. ``allow_large_results`` must be ``true`` if this is set to ``false``. For standard SQL queries, this flag is ignored and results are never flattened. - :type flatten_results: boolean + :type flatten_results: bool :param bigquery_conn_id: reference to a specific BigQuery hook. - :type bigquery_conn_id: string + :type bigquery_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param udf_config: The User Defined Function configuration for the query. See https://cloud.google.com/bigquery/user-defined-functions for details. :type udf_config: list :param use_legacy_sql: Whether to use legacy SQL (true) or standard SQL (false). - :type use_legacy_sql: boolean + :type use_legacy_sql: bool :param maximum_billing_tier: Positive integer that serves as a multiplier of the basic price. Defaults to None, in which case it uses the value set in the project. - :type maximum_billing_tier: integer + :type maximum_billing_tier: int :param maximum_bytes_billed: Limits the bytes billed for this job. Queries that will have bytes billed beyond this limit will fail (without incurring a charge). If unspecified, this will be set to your project default. :type maximum_bytes_billed: float + :param api_resource_configs: a dictionary that contain params + 'configuration' applied for Google BigQuery Jobs API: + https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs + for example, {'query': {'useQueryCache': False}}. You could use it + if you need to provide some params that are not supported by BigQueryOperator + like args. + :type api_resource_configs: dict :param schema_update_options: Allows the schema of the destination table to be updated as a side effect of the load job. :type schema_update_options: tuple @@ -87,12 +94,14 @@ class BigQueryOperator(BaseOperator): :param priority: Specifies a priority for the query. Possible values include INTERACTIVE and BATCH. The default value is INTERACTIVE. - :type priority: string + :type priority: str :param time_partitioning: configure optional time partitioning fields i.e. - partition by field, type and - expiration as per API specifications. Note that 'field' is not available in - conjunction with dataset.table$partition. + partition by field, type and expiration as per API specifications. :type time_partitioning: dict + :param cluster_fields: Request that the result of this query be stored sorted + by one or more columns. This is only available in conjunction with + time_partitioning. The order of columns given determines the sort order. + :type cluster_fields: list of str """ template_fields = ('bql', 'sql', 'destination_dataset_table', 'labels') @@ -106,7 +115,7 @@ def __init__(self, destination_dataset_table=False, write_disposition='WRITE_EMPTY', allow_large_results=False, - flatten_results=False, + flatten_results=None, bigquery_conn_id='bigquery_default', delegate_to=None, udf_config=False, @@ -118,7 +127,9 @@ def __init__(self, query_params=None, labels=None, priority='INTERACTIVE', - time_partitioning={}, + time_partitioning=None, + api_resource_configs=None, + cluster_fields=None, *args, **kwargs): super(BigQueryOperator, self).__init__(*args, **kwargs) @@ -140,7 +151,11 @@ def __init__(self, self.labels = labels self.bq_cursor = None self.priority = priority - self.time_partitioning = time_partitioning + if time_partitioning is None: + self.time_partitioning = {} + if api_resource_configs is None: + self.api_resource_configs = {} + self.cluster_fields = cluster_fields # TODO remove `bql` in Airflow 2.0 if self.bql: @@ -179,7 +194,9 @@ def execute(self, context): labels=self.labels, schema_update_options=self.schema_update_options, priority=self.priority, - time_partitioning=self.time_partitioning + time_partitioning=self.time_partitioning, + api_resource_configs=self.api_resource_configs, + cluster_fields=self.cluster_fields, ) def on_kill(self): @@ -201,11 +218,11 @@ class BigQueryCreateEmptyTableOperator(BaseOperator): You can also create a table without schema. :param project_id: The project to create the table into. (templated) - :type project_id: string + :type project_id: str :param dataset_id: The dataset to create the table into. (templated) - :type dataset_id: string + :type dataset_id: str :param table_id: The Name of the table to be created. (templated) - :type table_id: string + :type table_id: str :param schema_fields: If set, the schema field list as defined here: https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.load.schema @@ -218,7 +235,7 @@ class BigQueryCreateEmptyTableOperator(BaseOperator): :param gcs_schema_object: Full path to the JSON file containing schema (templated). For example: ``gs://test-bucket/dir1/dir2/employee_schema.json`` - :type gcs_schema_object: string + :type gcs_schema_object: str :param time_partitioning: configure optional time partitioning fields i.e. partition by field, type and expiration as per API specifications. @@ -226,57 +243,57 @@ class BigQueryCreateEmptyTableOperator(BaseOperator): https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#timePartitioning :type time_partitioning: dict :param bigquery_conn_id: Reference to a specific BigQuery hook. - :type bigquery_conn_id: string + :type bigquery_conn_id: str :param google_cloud_storage_conn_id: Reference to a specific Google cloud storage hook. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string - :param labels a dictionary containing labels for the table, passed to BigQuery + :type delegate_to: str + :param labels: a dictionary containing labels for the table, passed to BigQuery + + **Example (with schema JSON in GCS)**: :: + + CreateTable = BigQueryCreateEmptyTableOperator( + task_id='BigQueryCreateEmptyTableOperator_task', + dataset_id='ODS', + table_id='Employees', + project_id='internal-gcp-project', + gcs_schema_object='gs://schema-bucket/employee_schema.json', + bigquery_conn_id='airflow-service-account', + google_cloud_storage_conn_id='airflow-service-account' + ) + + **Corresponding Schema file** (``employee_schema.json``): :: + + [ + { + "mode": "NULLABLE", + "name": "emp_name", + "type": "STRING" + }, + { + "mode": "REQUIRED", + "name": "salary", + "type": "INTEGER" + } + ] + + **Example (with schema in the DAG)**: :: + + CreateTable = BigQueryCreateEmptyTableOperator( + task_id='BigQueryCreateEmptyTableOperator_task', + dataset_id='ODS', + table_id='Employees', + project_id='internal-gcp-project', + schema_fields=[{"name": "emp_name", "type": "STRING", "mode": "REQUIRED"}, + {"name": "salary", "type": "INTEGER", "mode": "NULLABLE"}], + bigquery_conn_id='airflow-service-account', + google_cloud_storage_conn_id='airflow-service-account' + ) :type labels: dict - **Example (with schema JSON in GCS)**: :: - - CreateTable = BigQueryCreateEmptyTableOperator( - task_id='BigQueryCreateEmptyTableOperator_task', - dataset_id='ODS', - table_id='Employees', - project_id='internal-gcp-project', - gcs_schema_object='gs://schema-bucket/employee_schema.json', - bigquery_conn_id='airflow-service-account', - google_cloud_storage_conn_id='airflow-service-account' - ) - - **Corresponding Schema file** (``employee_schema.json``): :: - - [ - { - "mode": "NULLABLE", - "name": "emp_name", - "type": "STRING" - }, - { - "mode": "REQUIRED", - "name": "salary", - "type": "INTEGER" - } - ] - - **Example (with schema in the DAG)**: :: - - CreateTable = BigQueryCreateEmptyTableOperator( - task_id='BigQueryCreateEmptyTableOperator_task', - dataset_id='ODS', - table_id='Employees', - project_id='internal-gcp-project', - schema_fields=[{"name": "emp_name", "type": "STRING", "mode": "REQUIRED"}, - {"name": "salary", "type": "INTEGER", "mode": "NULLABLE"}], - bigquery_conn_id='airflow-service-account', - google_cloud_storage_conn_id='airflow-service-account' - ) - """ template_fields = ('dataset_id', 'table_id', 'project_id', 'gcs_schema_object', 'labels') @@ -350,15 +367,15 @@ class BigQueryCreateExternalTableOperator(BaseOperator): Google cloud storage must be a JSON file with the schema fields in it. :param bucket: The bucket to point the external table to. (templated) - :type bucket: string + :type bucket: str :param source_objects: List of Google cloud storage URIs to point table to. (templated) If source_format is 'DATASTORE_BACKUP', the list must only contain a single URI. - :type object: list + :type source_objects: list :param destination_project_dataset_table: The dotted (.).
BigQuery table to load data into (templated). If is not included, project will be the project defined in the connection json. - :type destination_project_dataset_table: string + :type destination_project_dataset_table: str :param schema_fields: If set, the schema field list as defined here: https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.load.schema @@ -371,26 +388,26 @@ class BigQueryCreateExternalTableOperator(BaseOperator): :type schema_fields: list :param schema_object: If set, a GCS object path pointing to a .json file that contains the schema for the table. (templated) - :param schema_object: string + :type schema_object: str :param source_format: File format of the data. - :type source_format: string + :type source_format: str :param compression: [Optional] The compression type of the data source. Possible values include GZIP and NONE. The default value is NONE. This setting is ignored for Google Cloud Bigtable, Google Cloud Datastore backups and Avro formats. - :type compression: string + :type compression: str :param skip_leading_rows: Number of rows to skip when loading from a CSV. :type skip_leading_rows: int :param field_delimiter: The delimiter to use for the CSV. - :type field_delimiter: string + :type field_delimiter: str :param max_bad_records: The maximum number of bad records that BigQuery can ignore when running the job. :type max_bad_records: int :param quote_character: The value that is used to quote data sections in a CSV file. - :type quote_character: string + :type quote_character: str :param allow_quoted_newlines: Whether to allow quoted newlines (true) or not (false). - :type allow_quoted_newlines: boolean + :type allow_quoted_newlines: bool :param allow_jagged_rows: Accept rows that are missing trailing optional columns. The missing values are treated as nulls. If false, records with missing trailing columns are treated as bad records, and if there are too many bad records, an @@ -398,14 +415,14 @@ class BigQueryCreateExternalTableOperator(BaseOperator): for other formats. :type allow_jagged_rows: bool :param bigquery_conn_id: Reference to a specific BigQuery hook. - :type bigquery_conn_id: string + :type bigquery_conn_id: str :param google_cloud_storage_conn_id: Reference to a specific Google cloud storage hook. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param src_fmt_configs: configure optional fields specific to the source format :type src_fmt_configs: dict :param labels a dictionary containing labels for the table, passed to BigQuery @@ -505,18 +522,17 @@ class BigQueryDeleteDatasetOperator(BaseOperator): This operator deletes an existing dataset from your Project in Big query. https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets/delete :param project_id: The project id of the dataset. - :type project_id: string + :type project_id: str :param dataset_id: The dataset to be deleted. - :type dataset_id: string + :type dataset_id: str **Example**: :: - delete_temp_data = BigQueryDeleteDatasetOperator( - dataset_id = 'temp-dataset', - project_id = 'temp-project', - bigquery_conn_id='_my_gcp_conn_', - task_id='Deletetemp', - dag=dag) + delete_temp_data = BigQueryDeleteDatasetOperator(dataset_id = 'temp-dataset', + project_id = 'temp-project', + bigquery_conn_id='_my_gcp_conn_', + task_id='Deletetemp', + dag=dag) """ template_fields = ('dataset_id', 'project_id') @@ -550,3 +566,66 @@ def execute(self, context): project_id=self.project_id, dataset_id=self.dataset_id ) + + +class BigQueryCreateEmptyDatasetOperator(BaseOperator): + """" + This operator is used to create new dataset for your Project in Big query. + https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#resource + + :param project_id: The name of the project where we want to create the dataset. + Don't need to provide, if projectId in dataset_reference. + :type project_id: str + :param dataset_id: The id of dataset. Don't need to provide, + if datasetId in dataset_reference. + :type dataset_id: str + :param dataset_reference: Dataset reference that could be provided with request body. + More info: + https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#resource + :type dataset_reference: dict + + **Example**: :: + + create_new_dataset = BigQueryCreateEmptyDatasetOperator( + dataset_id = 'new-dataset', + project_id = 'my-project', + dataset_reference = {"friendlyName": "New Dataset"} + bigquery_conn_id='_my_gcp_conn_', + task_id='newDatasetCreator', + dag=dag) + + """ + + template_fields = ('dataset_id', 'project_id') + ui_color = '#f0eee4' + + @apply_defaults + def __init__(self, + dataset_id, + project_id=None, + dataset_reference=None, + bigquery_conn_id='bigquery_default', + delegate_to=None, + *args, **kwargs): + self.dataset_id = dataset_id + self.project_id = project_id + self.bigquery_conn_id = bigquery_conn_id + self.dataset_reference = dataset_reference if dataset_reference else {} + self.delegate_to = delegate_to + + self.log.info('Dataset id: %s', self.dataset_id) + self.log.info('Project id: %s', self.project_id) + + super(BigQueryCreateEmptyDatasetOperator, self).__init__(*args, **kwargs) + + def execute(self, context): + bq_hook = BigQueryHook(bigquery_conn_id=self.bigquery_conn_id, + delegate_to=self.delegate_to) + + conn = bq_hook.get_conn() + cursor = conn.cursor() + + cursor.create_empty_dataset( + project_id=self.project_id, + dataset_id=self.dataset_id, + dataset_reference=self.dataset_reference) diff --git a/airflow/contrib/operators/bigquery_table_delete_operator.py b/airflow/contrib/operators/bigquery_table_delete_operator.py index a16107d8c41ec..45c481454e475 100644 --- a/airflow/contrib/operators/bigquery_table_delete_operator.py +++ b/airflow/contrib/operators/bigquery_table_delete_operator.py @@ -29,16 +29,16 @@ class BigQueryTableDeleteOperator(BaseOperator): :param deletion_dataset_table: A dotted (.|:).
that indicates which table will be deleted. (templated) - :type deletion_dataset_table: string + :type deletion_dataset_table: str :param bigquery_conn_id: reference to a specific BigQuery hook. - :type bigquery_conn_id: string + :type bigquery_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param ignore_if_missing: if True, then return success even if the requested table does not exist. - :type ignore_if_missing: boolean + :type ignore_if_missing: bool """ template_fields = ('deletion_dataset_table',) ui_color = '#ffd1dc' diff --git a/airflow/contrib/operators/bigquery_to_bigquery.py b/airflow/contrib/operators/bigquery_to_bigquery.py index 3a0b44db60580..2073cadef126c 100644 --- a/airflow/contrib/operators/bigquery_to_bigquery.py +++ b/airflow/contrib/operators/bigquery_to_bigquery.py @@ -38,17 +38,17 @@ class BigQueryToBigQueryOperator(BaseOperator): :type source_project_dataset_tables: list|string :param destination_project_dataset_table: The destination BigQuery table. Format is: (project:|project.).
(templated) - :type destination_project_dataset_table: string + :type destination_project_dataset_table: str :param write_disposition: The write disposition if the table already exists. - :type write_disposition: string + :type write_disposition: str :param create_disposition: The create disposition if the table doesn't exist. - :type create_disposition: string + :type create_disposition: str :param bigquery_conn_id: reference to a specific BigQuery hook. - :type bigquery_conn_id: string + :type bigquery_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param labels: a dictionary containing labels for the job/query, passed to BigQuery :type labels: dict diff --git a/airflow/contrib/operators/bigquery_to_gcs.py b/airflow/contrib/operators/bigquery_to_gcs.py index 278b20804747c..ec6b937d218b2 100644 --- a/airflow/contrib/operators/bigquery_to_gcs.py +++ b/airflow/contrib/operators/bigquery_to_gcs.py @@ -31,29 +31,29 @@ class BigQueryToCloudStorageOperator(BaseOperator): https://cloud.google.com/bigquery/docs/reference/v2/jobs :param source_project_dataset_table: The dotted - (.|:).
BigQuery table to use as the source - data. If is not included, project will be the project + ``(.|:).
`` BigQuery table to use as the + source data. If is not included, project will be the project defined in the connection json. (templated) - :type source_project_dataset_table: string + :type source_project_dataset_table: str :param destination_cloud_storage_uris: The destination Google Cloud Storage URI (e.g. gs://some-bucket/some-file.txt). (templated) Follows convention defined here: https://cloud.google.com/bigquery/exporting-data-from-bigquery#exportingmultiple :type destination_cloud_storage_uris: list :param compression: Type of compression to use. - :type compression: string + :type compression: str :param export_format: File format to export. - :type field_delimiter: string + :type export_format: str :param field_delimiter: The delimiter to use when extracting to a CSV. - :type field_delimiter: string + :type field_delimiter: str :param print_header: Whether to print a header for a CSV file extract. - :type print_header: boolean + :type print_header: bool :param bigquery_conn_id: reference to a specific BigQuery hook. - :type bigquery_conn_id: string + :type bigquery_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param labels: a dictionary containing labels for the job/query, passed to BigQuery :type labels: dict diff --git a/airflow/contrib/operators/cassandra_to_gcs.py b/airflow/contrib/operators/cassandra_to_gcs.py index 211444b96d1b9..95107a497fd61 100644 --- a/airflow/contrib/operators/cassandra_to_gcs.py +++ b/airflow/contrib/operators/cassandra_to_gcs.py @@ -60,18 +60,18 @@ def __init__(self, **kwargs): """ :param cql: The CQL to execute on the Cassandra table. - :type cql: string + :type cql: str :param bucket: The bucket to upload to. - :type bucket: string + :type bucket: str :param filename: The filename to use as the object name when uploading to Google cloud storage. A {} should be specified in the filename to allow the operator to inject file numbers in cases where the file is split due to size. - :type filename: string + :type filename: str :param schema_filename: If set, the filename to use as the object name when uploading a .json file containing the BigQuery schema fields for the table that was dumped from MySQL. - :type schema_filename: string + :type schema_filename: str :param approx_max_file_size_bytes: This operator supports the ability to split large table dumps into multiple files (see notes in the filenamed param docs above). Google cloud storage allows for files @@ -79,14 +79,14 @@ def __init__(self, file size of the splits. :type approx_max_file_size_bytes: long :param cassandra_conn_id: Reference to a specific Cassandra hook. - :type cassandra_conn_id: string + :type cassandra_conn_id: str :param google_cloud_storage_conn_id: Reference to a specific Google cloud storage hook. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ super(CassandraToGoogleCloudStorageOperator, self).__init__(*args, **kwargs) self.cql = cql diff --git a/airflow/contrib/operators/databricks_operator.py b/airflow/contrib/operators/databricks_operator.py index 7b8d522dba85b..3ebc729f7842a 100644 --- a/airflow/contrib/operators/databricks_operator.py +++ b/airflow/contrib/operators/databricks_operator.py @@ -30,9 +30,69 @@ XCOM_RUN_PAGE_URL_KEY = 'run_page_url' +def _deep_string_coerce(content, json_path='json'): + """ + Coerces content or all values of content if it is a dict to a string. The + function will throw if content contains non-string or non-numeric types. + + The reason why we have this function is because the ``self.json`` field must be a + dict with only string values. This is because ``render_template`` will fail + for numerical values. + """ + c = _deep_string_coerce + if isinstance(content, six.string_types): + return content + elif isinstance(content, six.integer_types + (float,)): + # Databricks can tolerate either numeric or string types in the API backend. + return str(content) + elif isinstance(content, (list, tuple)): + return [c(e, '{0}[{1}]'.format(json_path, i)) for i, e in enumerate(content)] + elif isinstance(content, dict): + return {k: c(v, '{0}[{1}]'.format(json_path, k)) + for k, v in list(content.items())} + else: + param_type = type(content) + msg = 'Type {0} used for parameter {1} is not a number or a string' \ + .format(param_type, json_path) + raise AirflowException(msg) + + +def _handle_databricks_operator_execution(operator, hook, log, context): + """ + Handles the Airflow + Databricks lifecycle logic for a Databricks operator + :param operator: Databricks operator being handled + :param context: Airflow context + """ + if operator.do_xcom_push: + context['ti'].xcom_push(key=XCOM_RUN_ID_KEY, value=operator.run_id) + log.info('Run submitted with run_id: %s', operator.run_id) + run_page_url = hook.get_run_page_url(operator.run_id) + if operator.do_xcom_push: + context['ti'].xcom_push(key=XCOM_RUN_PAGE_URL_KEY, value=run_page_url) + + log.info('View run status, Spark UI, and logs at %s', run_page_url) + while True: + run_state = hook.get_run_state(operator.run_id) + if run_state.is_terminal: + if run_state.is_successful: + log.info('%s completed successfully.', operator.task_id) + log.info('View run status, Spark UI, and logs at %s', run_page_url) + return + else: + error_message = '{t} failed with terminal state: {s}'.format( + t=operator.task_id, + s=run_state) + raise AirflowException(error_message) + else: + log.info('%s in run state: %s', operator.task_id, run_state) + log.info('View run status, Spark UI, and logs at %s', run_page_url) + log.info('Sleeping for %s seconds.', operator.polling_period_seconds) + time.sleep(operator.polling_period_seconds) + + class DatabricksSubmitRunOperator(BaseOperator): """ - Submits an Spark job run to Databricks using the + Submits a Spark job run to Databricks using the `api/2.0/jobs/runs/submit `_ API endpoint. @@ -119,7 +179,7 @@ class DatabricksSubmitRunOperator(BaseOperator): :param existing_cluster_id: ID for existing cluster on which to run this task. *EITHER* ``new_cluster`` *OR* ``existing_cluster_id`` should be specified. This field will be templated. - :type existing_cluster_id: string + :type existing_cluster_id: str :param libraries: Libraries which this run will use. This field will be templated. @@ -130,7 +190,7 @@ class DatabricksSubmitRunOperator(BaseOperator): By default this will be set to the Airflow ``task_id``. This ``task_id`` is a required parameter of the superclass ``BaseOperator``. This field will be templated. - :type run_name: string + :type run_name: str :param timeout_seconds: The timeout for this run. By default a value of 0 is used which means to have no timeout. This field will be templated. @@ -139,15 +199,18 @@ class DatabricksSubmitRunOperator(BaseOperator): By default and in the common case this will be ``databricks_default``. To use token based authentication, provide the key ``token`` in the extra field for the connection. - :type databricks_conn_id: string + :type databricks_conn_id: str :param polling_period_seconds: Controls the rate which we poll for the result of this run. By default the operator will poll every 30 seconds. :type polling_period_seconds: int :param databricks_retry_limit: Amount of times retry if the Databricks backend is unreachable. Its value must be greater than or equal to 1. :type databricks_retry_limit: int + :param databricks_retry_delay: Number of seconds to wait between retries (it + might be a floating point number). + :type databricks_retry_delay: float :param do_xcom_push: Whether we should push run_id and run_page_url to xcom. - :type do_xcom_push: boolean + :type do_xcom_push: bool """ # Used in airflow.models.BaseOperator template_fields = ('json',) @@ -168,6 +231,7 @@ def __init__( databricks_conn_id='databricks_default', polling_period_seconds=30, databricks_retry_limit=3, + databricks_retry_delay=1, do_xcom_push=False, **kwargs): """ @@ -178,6 +242,7 @@ def __init__( self.databricks_conn_id = databricks_conn_id self.polling_period_seconds = polling_period_seconds self.databricks_retry_limit = databricks_retry_limit + self.databricks_retry_delay = databricks_retry_delay if spark_jar_task is not None: self.json['spark_jar_task'] = spark_jar_task if notebook_task is not None: @@ -195,72 +260,213 @@ def __init__( if 'run_name' not in self.json: self.json['run_name'] = run_name or kwargs['task_id'] - self.json = self._deep_string_coerce(self.json) + self.json = _deep_string_coerce(self.json) # This variable will be used in case our task gets killed. self.run_id = None self.do_xcom_push = do_xcom_push - def _deep_string_coerce(self, content, json_path='json'): - """ - Coerces content or all values of content if it is a dict to a string. The - function will throw if content contains non-string or non-numeric types. + def get_hook(self): + return DatabricksHook( + self.databricks_conn_id, + retry_limit=self.databricks_retry_limit, + retry_delay=self.databricks_retry_delay) + + def execute(self, context): + hook = self.get_hook() + self.run_id = hook.submit_run(self.json) + _handle_databricks_operator_execution(self, hook, self.log, context) + + def on_kill(self): + hook = self.get_hook() + hook.cancel_run(self.run_id) + self.log.info( + 'Task: %s with run_id: %s was requested to be cancelled.', + self.task_id, self.run_id + ) + + +class DatabricksRunNowOperator(BaseOperator): + """ + Runs an existing Spark job run to Databricks using the + `api/2.0/jobs/run-now + `_ + API endpoint. + + There are two ways to instantiate this operator. + + In the first way, you can take the JSON payload that you typically use + to call the ``api/2.0/jobs/run-now`` endpoint and pass it directly + to our ``DatabricksRunNowOperator`` through the ``json`` parameter. + For example :: + json = { + "job_id": 42, + "notebook_params": { + "dry-run": "true", + "oldest-time-to-consider": "1457570074236" + } + } + + notebook_run = DatabricksRunNowOperator(task_id='notebook_run', json=json) + + Another way to accomplish the same thing is to use the named parameters + of the ``DatabricksRunNowOperator`` directly. Note that there is exactly + one named parameter for each top level parameter in the ``run-now`` + endpoint. In this method, your code would look like this: :: + + job_id=42 + + notebook_params = { + "dry-run": "true", + "oldest-time-to-consider": "1457570074236" + } + + python_params = ["douglas adams", "42"] + + spark_submit_params = ["--class", "org.apache.spark.examples.SparkPi"] + + notebook_run = DatabricksRunNowOperator( + job_id=job_id, + notebook_params=notebook_params, + python_params=python_params, + spark_submit_params=spark_submit_params + ) + + In the case where both the json parameter **AND** the named parameters + are provided, they will be merged together. If there are conflicts during the merge, + the named parameters will take precedence and override the top level ``json`` keys. + + Currently the named parameters that ``DatabricksRunNowOperator`` supports are + - ``job_id`` + - ``json`` + - ``notebook_params`` + - ``python_params`` + - ``spark_submit_params`` + + + :param job_id: the job_id of the existing Databricks job. + This field will be templated. + .. seealso:: + https://docs.databricks.com/api/latest/jobs.html#run-now + :type job_id: str + :param json: A JSON object containing API parameters which will be passed + directly to the ``api/2.0/jobs/run-now`` endpoint. The other named parameters + (i.e. ``notebook_params``, ``spark_submit_params``..) to this operator will + be merged with this json dictionary if they are provided. + If there are conflicts during the merge, the named parameters will + take precedence and override the top level json keys. (templated) + + .. seealso:: + For more information about templating see :ref:`jinja-templating`. + https://docs.databricks.com/api/latest/jobs.html#run-now + :type json: dict + :param notebook_params: A dict from keys to values for jobs with notebook task, + e.g. "notebook_params": {"name": "john doe", "age": "35"}. + The map is passed to the notebook and will be accessible through the + dbutils.widgets.get function. See Widgets for more information. + If not specified upon run-now, the triggered run will use the + job’s base parameters. notebook_params cannot be + specified in conjunction with jar_params. The json representation + of this field (i.e. {"notebook_params":{"name":"john doe","age":"35"}}) + cannot exceed 10,000 bytes. + This field will be templated. + + .. seealso:: + https://docs.databricks.com/user-guide/notebooks/widgets.html + :type notebook_params: dict + :param python_params: A list of parameters for jobs with python tasks, + e.g. "python_params": ["john doe", "35"]. + The parameters will be passed to python file as command line parameters. + If specified upon run-now, it would overwrite the parameters specified in + job setting. + The json representation of this field (i.e. {"python_params":["john doe","35"]}) + cannot exceed 10,000 bytes. + This field will be templated. + + .. seealso:: + https://docs.databricks.com/api/latest/jobs.html#run-now + :type python_params: array of strings + :param spark_submit_params: A list of parameters for jobs with spark submit task, + e.g. "spark_submit_params": ["--class", "org.apache.spark.examples.SparkPi"]. + The parameters will be passed to spark-submit script as command line parameters. + If specified upon run-now, it would overwrite the parameters specified + in job setting. + The json representation of this field cannot exceed 10,000 bytes. + This field will be templated. + .. seealso:: + https://docs.databricks.com/api/latest/jobs.html#run-now + :type spark_submit_params: array of strings + :param timeout_seconds: The timeout for this run. By default a value of 0 is used + which means to have no timeout. + This field will be templated. + :type timeout_seconds: int32 + :param databricks_conn_id: The name of the Airflow connection to use. + By default and in the common case this will be ``databricks_default``. To use + token based authentication, provide the key ``token`` in the extra field for the + connection. + :type databricks_conn_id: str + :param polling_period_seconds: Controls the rate which we poll for the result of + this run. By default the operator will poll every 30 seconds. + :type polling_period_seconds: int + :param databricks_retry_limit: Amount of times retry if the Databricks backend is + unreachable. Its value must be greater than or equal to 1. + :type databricks_retry_limit: int + :param do_xcom_push: Whether we should push run_id and run_page_url to xcom. + :type do_xcom_push: bool + """ + # Used in airflow.models.BaseOperator + template_fields = ('json',) + # Databricks brand color (blue) under white text + ui_color = '#1CB1C2' + ui_fgcolor = '#fff' + + def __init__( + self, + job_id, + json=None, + notebook_params=None, + python_params=None, + spark_submit_params=None, + databricks_conn_id='databricks_default', + polling_period_seconds=30, + databricks_retry_limit=3, + databricks_retry_delay=1, + do_xcom_push=False, + **kwargs): - The reason why we have this function is because the ``self.json`` field must be a - dict with only string values. This is because ``render_template`` will fail - for numerical values. """ - c = self._deep_string_coerce - if isinstance(content, six.string_types): - return content - elif isinstance(content, six.integer_types + (float,)): - # Databricks can tolerate either numeric or string types in the API backend. - return str(content) - elif isinstance(content, (list, tuple)): - return [c(e, '{0}[{1}]'.format(json_path, i)) for i, e in enumerate(content)] - elif isinstance(content, dict): - return {k: c(v, '{0}[{1}]'.format(json_path, k)) - for k, v in list(content.items())} - else: - param_type = type(content) - msg = 'Type {0} used for parameter {1} is not a number or a string'\ - .format(param_type, json_path) - raise AirflowException(msg) + Creates a new ``DatabricksRunNowOperator``. + """ + super(DatabricksRunNowOperator, self).__init__(**kwargs) + self.json = json or {} + self.databricks_conn_id = databricks_conn_id + self.polling_period_seconds = polling_period_seconds + self.databricks_retry_limit = databricks_retry_limit + self.databricks_retry_delay = databricks_retry_delay - def _log_run_page_url(self, url): - self.log.info('View run status, Spark UI, and logs at %s', url) + if job_id is not None: + self.json['job_id'] = job_id + if notebook_params is not None: + self.json['notebook_params'] = notebook_params + if python_params is not None: + self.json['python_params'] = python_params + if spark_submit_params is not None: + self.json['spark_submit_params'] = spark_submit_params + + self.json = _deep_string_coerce(self.json) + # This variable will be used in case our task gets killed. + self.run_id = None + self.do_xcom_push = do_xcom_push def get_hook(self): return DatabricksHook( self.databricks_conn_id, - retry_limit=self.databricks_retry_limit) + retry_limit=self.databricks_retry_limit, + retry_delay=self.databricks_retry_delay) def execute(self, context): hook = self.get_hook() - self.run_id = hook.submit_run(self.json) - if self.do_xcom_push: - context['ti'].xcom_push(key=XCOM_RUN_ID_KEY, value=self.run_id) - self.log.info('Run submitted with run_id: %s', self.run_id) - run_page_url = hook.get_run_page_url(self.run_id) - if self.do_xcom_push: - context['ti'].xcom_push(key=XCOM_RUN_PAGE_URL_KEY, value=run_page_url) - self._log_run_page_url(run_page_url) - while True: - run_state = hook.get_run_state(self.run_id) - if run_state.is_terminal: - if run_state.is_successful: - self.log.info('%s completed successfully.', self.task_id) - self._log_run_page_url(run_page_url) - return - else: - error_message = '{t} failed with terminal state: {s}'.format( - t=self.task_id, - s=run_state) - raise AirflowException(error_message) - else: - self.log.info('%s in run state: %s', self.task_id, run_state) - self._log_run_page_url(run_page_url) - self.log.info('Sleeping for %s seconds.', self.polling_period_seconds) - time.sleep(self.polling_period_seconds) + self.run_id = hook.run_now(self.json) + _handle_databricks_operator_execution(self, hook, self.log, context) def on_kill(self): hook = self.get_hook() diff --git a/airflow/contrib/operators/dataflow_operator.py b/airflow/contrib/operators/dataflow_operator.py index 3a6980cefaeae..5378735f94d61 100644 --- a/airflow/contrib/operators/dataflow_operator.py +++ b/airflow/contrib/operators/dataflow_operator.py @@ -16,7 +16,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. - +import os import re import uuid import copy @@ -33,6 +33,43 @@ class DataFlowJavaOperator(BaseOperator): Start a Java Cloud DataFlow batch job. The parameters of the operation will be passed to the job. + .. seealso:: + For more detail on job submission have a look at the reference: + https://cloud.google.com/dataflow/pipelines/specifying-exec-params + + :param jar: The reference to a self executing DataFlow jar (templated). + :type jar: str + :param job_name: The 'jobName' to use when executing the DataFlow job + (templated). This ends up being set in the pipeline options, so any entry + with key ``'jobName'`` in ``options`` will be overwritten. + :type job_name: str + :param dataflow_default_options: Map of default job options. + :type dataflow_default_options: dict + :param options: Map of job specific options. + :type options: dict + :param gcp_conn_id: The connection ID to use connecting to Google Cloud + Platform. + :type gcp_conn_id: str + :param delegate_to: The account to impersonate, if any. + For this to work, the service account making the request must have + domain-wide delegation enabled. + :type delegate_to: str + :param poll_sleep: The time in seconds to sleep between polling Google + Cloud Platform for the dataflow job status while the job is in the + JOB_STATE_RUNNING state. + :type poll_sleep: int + :param job_class: The name of the dataflow job class to be executued, it + is often not the main class configured in the dataflow jar file. + :type job_class: str + + ``jar``, ``options``, and ``job_name`` are templated so you can use variables in them. + + Note that both + ``dataflow_default_options`` and ``options`` will be merged to specify pipeline + execution parameter, and ``dataflow_default_options`` is expected to save + high-level options, for instances, project and zone information, which + apply to all dataflow operators in the DAG. + It's a good practice to define dataflow_* parameters in the default_args of the dag like the project, zone and staging location. @@ -53,7 +90,7 @@ class DataFlowJavaOperator(BaseOperator): .. code-block:: python - t1 = DataFlowOperation( + t1 = DataFlowJavaOperator( task_id='datapflow_example', jar='{{var.value.gcp_dataflow_base}}pipeline/build/libs/pipeline-example-1.0.jar', options={ @@ -66,15 +103,15 @@ class DataFlowJavaOperator(BaseOperator): gcp_conn_id='gcp-airflow-service-account', dag=my-dag) - Both ``jar`` and ``options`` are templated so you can use variables in them. """ - template_fields = ['options', 'jar'] + template_fields = ['options', 'jar', 'job_name'] ui_color = '#0273d4' @apply_defaults def __init__( self, jar, + job_name='{{task.task_id}}', dataflow_default_options=None, options=None, gcp_conn_id='google_cloud_default', @@ -83,39 +120,6 @@ def __init__( job_class=None, *args, **kwargs): - """ - Create a new DataFlowJavaOperator. Note that both - dataflow_default_options and options will be merged to specify pipeline - execution parameter, and dataflow_default_options is expected to save - high-level options, for instances, project and zone information, which - apply to all dataflow operators in the DAG. - - - .. seealso:: - For more detail on job submission have a look at the reference: - https://cloud.google.com/dataflow/pipelines/specifying-exec-params - - :param jar: The reference to a self executing DataFlow jar. - :type jar: string - :param dataflow_default_options: Map of default job options. - :type dataflow_default_options: dict - :param options: Map of job specific options. - :type options: dict - :param gcp_conn_id: The connection ID to use connecting to Google Cloud - Platform. - :type gcp_conn_id: string - :param delegate_to: The account to impersonate, if any. - For this to work, the service account making the request must have - domain-wide delegation enabled. - :type delegate_to: string - :param poll_sleep: The time in seconds to sleep between polling Google - Cloud Platform for the dataflow job status while the job is in the - JOB_STATE_RUNNING state. - :type poll_sleep: int - :param job_class: The name of the dataflow job class to be executued, it - is often not the main class configured in the dataflow jar file. - :type job_class: string - """ super(DataFlowJavaOperator, self).__init__(*args, **kwargs) dataflow_default_options = dataflow_default_options or {} @@ -125,6 +129,7 @@ def __init__( self.gcp_conn_id = gcp_conn_id self.delegate_to = delegate_to self.jar = jar + self.job_name = job_name self.dataflow_default_options = dataflow_default_options self.options = options self.poll_sleep = poll_sleep @@ -141,7 +146,7 @@ def execute(self, context): dataflow_options = copy.copy(self.dataflow_default_options) dataflow_options.update(self.options) - hook.start_java_dataflow(self.task_id, dataflow_options, + hook.start_java_dataflow(self.job_name, dataflow_options, self.jar, self.job_class) @@ -149,6 +154,27 @@ class DataflowTemplateOperator(BaseOperator): """ Start a Templated Cloud DataFlow batch job. The parameters of the operation will be passed to the job. + + :param template: The reference to the DataFlow template. + :type template: str + :param job_name: The 'jobName' to use when executing the DataFlow template + (templated). + :param dataflow_default_options: Map of default job environment options. + :type dataflow_default_options: dict + :param parameters: Map of job specific parameters for the template. + :type parameters: dict + :param gcp_conn_id: The connection ID to use connecting to Google Cloud + Platform. + :type gcp_conn_id: str + :param delegate_to: The account to impersonate, if any. + For this to work, the service account making the request must have + domain-wide delegation enabled. + :type delegate_to: str + :param poll_sleep: The time in seconds to sleep between polling Google + Cloud Platform for the dataflow job status while the job is in the + JOB_STATE_RUNNING state. + :type poll_sleep: int + It's a good practice to define dataflow_* parameters in the default_args of the dag like the project, zone and staging location. @@ -183,16 +209,27 @@ class DataflowTemplateOperator(BaseOperator): gcp_conn_id='gcp-airflow-service-account', dag=my-dag) - ``template``, ``dataflow_default_options`` and ``parameters`` are templated so you can - use variables in them. + ``template``, ``dataflow_default_options``, ``parameters``, and ``job_name`` are + templated so you can use variables in them. + + Note that ``dataflow_default_options`` is expected to save high-level options + for project information, which apply to all dataflow operators in the DAG. + + .. seealso:: + https://cloud.google.com/dataflow/docs/reference/rest/v1b3 + /LaunchTemplateParameters + https://cloud.google.com/dataflow/docs/reference/rest/v1b3/RuntimeEnvironment + For more detail on job template execution have a look at the reference: + https://cloud.google.com/dataflow/docs/templates/executing-templates """ - template_fields = ['parameters', 'dataflow_default_options', 'template'] + template_fields = ['parameters', 'dataflow_default_options', 'template', 'job_name'] ui_color = '#0273d4' @apply_defaults def __init__( self, template, + job_name='{{task.task_id}}', dataflow_default_options=None, parameters=None, gcp_conn_id='google_cloud_default', @@ -200,36 +237,6 @@ def __init__( poll_sleep=10, *args, **kwargs): - """ - Create a new DataflowTemplateOperator. Note that - dataflow_default_options is expected to save high-level options - for project information, which apply to all dataflow operators in the DAG. - - .. seealso:: - https://cloud.google.com/dataflow/docs/reference/rest/v1b3 - /LaunchTemplateParameters - https://cloud.google.com/dataflow/docs/reference/rest/v1b3/RuntimeEnvironment - For more detail on job template execution have a look at the reference: - https://cloud.google.com/dataflow/docs/templates/executing-templates - - :param template: The reference to the DataFlow template. - :type template: string - :param dataflow_default_options: Map of default job environment options. - :type dataflow_default_options: dict - :param parameters: Map of job specific parameters for the template. - :type parameters: dict - :param gcp_conn_id: The connection ID to use connecting to Google Cloud - Platform. - :type gcp_conn_id: string - :param delegate_to: The account to impersonate, if any. - For this to work, the service account making the request must have - domain-wide delegation enabled. - :type delegate_to: string - :param poll_sleep: The time in seconds to sleep between polling Google - Cloud Platform for the dataflow job status while the job is in the - JOB_STATE_RUNNING state. - :type poll_sleep: int - """ super(DataflowTemplateOperator, self).__init__(*args, **kwargs) dataflow_default_options = dataflow_default_options or {} @@ -240,6 +247,7 @@ def __init__( self.dataflow_default_options = dataflow_default_options self.poll_sleep = poll_sleep self.template = template + self.job_name = job_name self.parameters = parameters def execute(self, context): @@ -247,18 +255,54 @@ def execute(self, context): delegate_to=self.delegate_to, poll_sleep=self.poll_sleep) - hook.start_template_dataflow(self.task_id, self.dataflow_default_options, + hook.start_template_dataflow(self.job_name, self.dataflow_default_options, self.parameters, self.template) class DataFlowPythonOperator(BaseOperator): + """ + Launching Cloud Dataflow jobs written in python. Note that both + dataflow_default_options and options will be merged to specify pipeline + execution parameter, and dataflow_default_options is expected to save + high-level options, for instances, project and zone information, which + apply to all dataflow operators in the DAG. - template_fields = ['options', 'dataflow_default_options'] + .. seealso:: + For more detail on job submission have a look at the reference: + https://cloud.google.com/dataflow/pipelines/specifying-exec-params + + :param py_file: Reference to the python dataflow pipleline file.py, e.g., + /some/local/file/path/to/your/python/pipeline/file. + :type py_file: str + :param job_name: The 'job_name' to use when executing the DataFlow job + (templated). This ends up being set in the pipeline options, so any entry + with key ``'jobName'`` or ``'job_name'`` in ``options`` will be overwritten. + :type job_name: str + :param py_options: Additional python options. + :type pyt_options: list of strings, e.g., ["-m", "-v"]. + :param dataflow_default_options: Map of default job options. + :type dataflow_default_options: dict + :param options: Map of job specific options. + :type options: dict + :param gcp_conn_id: The connection ID to use connecting to Google Cloud + Platform. + :type gcp_conn_id: str + :param delegate_to: The account to impersonate, if any. + For this to work, the service account making the request must have + domain-wide delegation enabled. + :type delegate_to: str + :param poll_sleep: The time in seconds to sleep between polling Google + Cloud Platform for the dataflow job status while the job is in the + JOB_STATE_RUNNING state. + :type poll_sleep: int + """ + template_fields = ['options', 'dataflow_default_options', 'job_name'] @apply_defaults def __init__( self, py_file, + job_name='{{task.task_id}}', py_options=None, dataflow_default_options=None, options=None, @@ -267,41 +311,11 @@ def __init__( poll_sleep=10, *args, **kwargs): - """ - Create a new DataFlowPythonOperator. Note that both - dataflow_default_options and options will be merged to specify pipeline - execution parameter, and dataflow_default_options is expected to save - high-level options, for instances, project and zone information, which - apply to all dataflow operators in the DAG. - .. seealso:: - For more detail on job submission have a look at the reference: - https://cloud.google.com/dataflow/pipelines/specifying-exec-params - - :param py_file: Reference to the python dataflow pipleline file.py, e.g., - /some/local/file/path/to/your/python/pipeline/file. - :type py_file: string - :param py_options: Additional python options. - :type pyt_options: list of strings, e.g., ["-m", "-v"]. - :param dataflow_default_options: Map of default job options. - :type dataflow_default_options: dict - :param options: Map of job specific options. - :type options: dict - :param gcp_conn_id: The connection ID to use connecting to Google Cloud - Platform. - :type gcp_conn_id: string - :param delegate_to: The account to impersonate, if any. - For this to work, the service account making the request must have - domain-wide delegation enabled. - :type delegate_to: string - :param poll_sleep: The time in seconds to sleep between polling Google - Cloud Platform for the dataflow job status while the job is in the - JOB_STATE_RUNNING state. - :type poll_sleep: int - """ super(DataFlowPythonOperator, self).__init__(*args, **kwargs) self.py_file = py_file + self.job_name = job_name self.py_options = py_options or [] self.dataflow_default_options = dataflow_default_options or {} self.options = options or {} @@ -327,7 +341,7 @@ def execute(self, context): formatted_options = {camel_to_snake(key): dataflow_options[key] for key in dataflow_options} hook.start_python_dataflow( - self.task_id, formatted_options, + self.job_name, formatted_options, self.py_file, self.py_options) @@ -348,9 +362,9 @@ def google_cloud_to_local(self, file_name): will be returned immediately. :param file_name: The full path of input file. - :type file_name: string + :type file_name: str :return: The full path of local file. - :type: string + :type: str """ if not file_name.startswith('gs://'): return file_name @@ -358,19 +372,19 @@ def google_cloud_to_local(self, file_name): # Extracts bucket_id and object_id by first removing 'gs://' prefix and # then split the remaining by path delimiter '/'. path_components = file_name[self.GCS_PREFIX_LENGTH:].split('/') - if path_components < 2: + if len(path_components) < 2: raise Exception( - 'Invalid Google Cloud Storage (GCS) object path: {}.' + 'Invalid Google Cloud Storage (GCS) object path: {}' .format(file_name)) bucket_id = path_components[0] object_id = '/'.join(path_components[1:]) - local_file = '/tmp/dataflow{}-{}'.format(str(uuid.uuid1())[:8], + local_file = '/tmp/dataflow{}-{}'.format(str(uuid.uuid4())[:8], path_components[-1]) - file_size = self._gcs_hook.download(bucket_id, object_id, local_file) + self._gcs_hook.download(bucket_id, object_id, local_file) - if file_size > 0: + if os.stat(local_file).st_size > 0: return local_file raise Exception( - 'Failed to download Google Cloud Storage GCS object: {}' + 'Failed to download Google Cloud Storage (GCS) object: {}' .format(file_name)) diff --git a/airflow/contrib/operators/dataproc_operator.py b/airflow/contrib/operators/dataproc_operator.py index 6dfa2da095e38..49e24a3df24c1 100644 --- a/airflow/contrib/operators/dataproc_operator.py +++ b/airflow/contrib/operators/dataproc_operator.py @@ -48,37 +48,49 @@ class DataprocClusterCreateOperator(BaseOperator): parameters detailed in the link are available as a parameter to this operator. :param cluster_name: The name of the DataProc cluster to create. (templated) - :type cluster_name: string + :type cluster_name: str :param project_id: The ID of the google cloud project in which to create the cluster. (templated) - :type project_id: string + :type project_id: str :param num_workers: The # of workers to spin up :type num_workers: int :param storage_bucket: The storage bucket to use, setting to None lets dataproc generate a custom one for you - :type storage_bucket: string + :type storage_bucket: str :param init_actions_uris: List of GCS uri's containing dataproc initialization scripts :type init_actions_uris: list[string] :param init_action_timeout: Amount of time executable scripts in init_actions_uris has to complete - :type init_action_timeout: string + :type init_action_timeout: str :param metadata: dict of key-value google compute engine metadata entries to add to all instances :type metadata: dict :param image_version: the version of software inside the Dataproc cluster - :type image_version: string + :type image_version: str + :param custom_image: custom Dataproc image for more info see + https://cloud.google.com/dataproc/docs/guides/dataproc-images + :type: custom_image: str :param properties: dict of properties to set on config files (e.g. spark-defaults.conf), see - https://cloud.google.com/dataproc/docs/reference/rest/v1/ \ - projects.regions.clusters#SoftwareConfig + https://cloud.google.com/dataproc/docs/reference/rest/v1/projects.regions.clusters#SoftwareConfig :type properties: dict :param master_machine_type: Compute engine machine type to use for the master node - :type master_machine_type: string + :type master_machine_type: str + :param master_disk_type: Type of the boot disk for the master node + (default is ``pd-standard``). + Valid values: ``pd-ssd`` (Persistent Disk Solid State Drive) or + ``pd-standard`` (Persistent Disk Hard Disk Drive). + :type master_disk_type: str :param master_disk_size: Disk size for the master node :type master_disk_size: int :param worker_machine_type: Compute engine machine type to use for the worker nodes - :type worker_machine_type: string + :type worker_machine_type: str + :param worker_disk_type: Type of the boot disk for the worker node + (default is ``pd-standard``). + Valid values: ``pd-ssd`` (Persistent Disk Solid State Drive) or + ``pd-standard`` (Persistent Disk Hard Disk Drive). + :type worker_disk_type: str :param worker_disk_size: Disk size for the worker nodes :type worker_disk_size: int :param num_preemptible_workers: The # of preemptible worker nodes to spin up @@ -86,13 +98,13 @@ class DataprocClusterCreateOperator(BaseOperator): :param labels: dict of labels to add to the cluster :type labels: dict :param zone: The zone where the cluster will be located. (templated) - :type zone: string + :type zone: str :param network_uri: The network uri to be used for machine communication, cannot be specified with subnetwork_uri - :type network_uri: string + :type network_uri: str :param subnetwork_uri: The subnetwork uri to be used for machine communication, cannot be specified with network_uri - :type subnetwork_uri: string + :type subnetwork_uri: str :param internal_ip_only: If true, all instances in the cluster will only have internal IP addresses. This can only be enabled for subnetwork enabled networks @@ -100,14 +112,15 @@ class DataprocClusterCreateOperator(BaseOperator): :param tags: The GCE tags to add to all instances :type tags: list[string] :param region: leave as 'global', might become relevant in the future. (templated) + :type region: str :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param service_account: The service account of the dataproc instances. - :type service_account: string + :type service_account: str :param service_account_scopes: The URIs of service account scopes to be included. :type service_account_scopes: list[string] :param idle_delete_ttl: The longest duration that cluster would keep alive while @@ -138,11 +151,14 @@ def __init__(self, init_actions_uris=None, init_action_timeout="10m", metadata=None, + custom_image=None, image_version=None, properties=None, master_machine_type='n1-standard-4', + master_disk_type='pd-standard', master_disk_size=500, worker_machine_type='n1-standard-4', + worker_disk_type='pd-standard', worker_disk_size=500, num_preemptible_workers=0, labels=None, @@ -168,11 +184,14 @@ def __init__(self, self.init_actions_uris = init_actions_uris self.init_action_timeout = init_action_timeout self.metadata = metadata + self.custom_image = custom_image self.image_version = image_version self.properties = properties self.master_machine_type = master_machine_type + self.master_disk_type = master_disk_type self.master_disk_size = master_disk_size self.worker_machine_type = worker_machine_type + self.worker_disk_type = worker_disk_type self.worker_disk_size = worker_disk_size self.labels = labels self.zone = zone @@ -187,6 +206,9 @@ def __init__(self, self.auto_delete_time = auto_delete_time self.auto_delete_ttl = auto_delete_ttl + assert not (self.custom_image and self.image_version), \ + "custom_image and image_version can't be both set" + def _get_cluster_list_for_project(self, service): result = service.projects().regions().clusters().list( projectId=self.project_id, @@ -272,6 +294,7 @@ def _build_cluster_data(self): 'numInstances': 1, 'machineTypeUri': master_type_uri, 'diskConfig': { + 'bootDiskType': self.master_disk_type, 'bootDiskSizeGb': self.master_disk_size } }, @@ -279,6 +302,7 @@ def _build_cluster_data(self): 'numInstances': self.num_workers, 'machineTypeUri': worker_type_uri, 'diskConfig': { + 'bootDiskType': self.worker_disk_type, 'bootDiskSizeGb': self.worker_disk_size } }, @@ -292,6 +316,7 @@ def _build_cluster_data(self): 'numInstances': self.num_preemptible_workers, 'machineTypeUri': worker_type_uri, 'diskConfig': { + 'bootDiskType': self.worker_disk_type, 'bootDiskSizeGb': self.worker_disk_size }, 'isPreemptible': True @@ -321,6 +346,12 @@ def _build_cluster_data(self): cluster_data['config']['gceClusterConfig']['tags'] = self.tags if self.image_version: cluster_data['config']['softwareConfig']['imageVersion'] = self.image_version + elif self.custom_image: + custom_image_url = 'https://www.googleapis.com/compute/beta/projects/' \ + '{}/global/images/{}'.format(self.project_id, + self.custom_image) + cluster_data['config']['masterConfig']['imageUri'] = custom_image_url + cluster_data['config']['workerConfig']['imageUri'] = custom_image_url if self.properties: cluster_data['config']['softwareConfig']['properties'] = self.properties if self.idle_delete_ttl: @@ -395,39 +426,39 @@ class DataprocClusterScaleOperator(BaseOperator): **Example**: :: - t1 = DataprocClusterScaleOperator( - task_id='dataproc_scale', - project_id='my-project', - cluster_name='cluster-1', - num_workers=10, - num_preemptible_workers=10, - graceful_decommission_timeout='1h' - dag=dag) + t1 = DataprocClusterScaleOperator( + task_id='dataproc_scale', + project_id='my-project', + cluster_name='cluster-1', + num_workers=10, + num_preemptible_workers=10, + graceful_decommission_timeout='1h', + dag=dag) .. seealso:: For more detail on about scaling clusters have a look at the reference: https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/scaling-clusters :param cluster_name: The name of the cluster to scale. (templated) - :type cluster_name: string + :type cluster_name: str :param project_id: The ID of the google cloud project in which the cluster runs. (templated) - :type project_id: string + :type project_id: str :param region: The region for the dataproc cluster. (templated) - :type region: string + :type region: str :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param num_workers: The new number of workers :type num_workers: int :param num_preemptible_workers: The new number of preemptible workers :type num_preemptible_workers: int :param graceful_decommission_timeout: Timeout for graceful YARN decomissioning. Maximum value is 1d - :type graceful_decommission_timeout: string + :type graceful_decommission_timeout: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ template_fields = ['cluster_name', 'project_id', 'region'] @@ -543,18 +574,18 @@ class DataprocClusterDeleteOperator(BaseOperator): cluster is destroyed. :param cluster_name: The name of the cluster to create. (templated) - :type cluster_name: string + :type cluster_name: str :param project_id: The ID of the google cloud project in which the cluster runs. (templated) - :type project_id: string + :type project_id: str :param region: leave as 'global', might become relevant in the future. (templated) - :type region: string + :type region: str :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ template_fields = ['cluster_name', 'project_id', 'region'] @@ -645,18 +676,18 @@ class DataProcPigOperator(BaseOperator): :param query: The query or reference to the query file (pg or pig extension). (templated) - :type query: string + :type query: str :param query_uri: The uri of a pig script on Cloud Storage. - :type query_uri: string + :type query_uri: str :param variables: Map of named parameters for the query. (templated) :type variables: dict :param job_name: The job name used in the DataProc cluster. This name by default is the task_id appended with the execution data, but can be templated. The name will always be appended with a random number to avoid name clashes. (templated) - :type job_name: string + :type job_name: str :param cluster_name: The name of the DataProc cluster. (templated) - :type cluster_name: string + :type cluster_name: str :param dataproc_pig_properties: Map for the Pig properties. Ideal to put in default arguments :type dataproc_pig_properties: dict @@ -664,18 +695,25 @@ class DataProcPigOperator(BaseOperator): UDFs and libs) and are ideal to put in default arguments. :type dataproc_pig_jars: list :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param region: The specified region where the dataproc cluster is created. - :type region: string + :type region: str + :param job_error_states: Job states that should be considered error states. + Any states in this list will result in an error being raised and failure of the + task. Eg, if the ``CANCELLED`` state should also be considered a task failure, + pass in ``['ERROR', 'CANCELLED']``. Possible values are currently only + ``'ERROR'`` and ``'CANCELLED'``, but could change in the future. Defaults to + ``['ERROR']``. + :type job_error_states: list :var dataproc_job_id: The actual "jobId" as submitted to the Dataproc API. This is useful for identifying or linking to the job in the Google Cloud Console Dataproc UI, as the actual "jobId" submitted to the Dataproc API is appended with an 8 character random string. - :vartype dataproc_job_id: string + :vartype dataproc_job_id: str """ template_fields = ['query', 'variables', 'job_name', 'cluster_name', 'dataproc_jars'] template_ext = ('.pg', '.pig',) @@ -694,6 +732,7 @@ def __init__( gcp_conn_id='google_cloud_default', delegate_to=None, region='global', + job_error_states=['ERROR'], *args, **kwargs): @@ -708,6 +747,7 @@ def __init__( self.dataproc_properties = dataproc_pig_properties self.dataproc_jars = dataproc_pig_jars self.region = region + self.job_error_states = job_error_states def execute(self, context): hook = DataProcHook(gcp_conn_id=self.gcp_conn_id, @@ -726,7 +766,7 @@ def execute(self, context): job_to_submit = job.build() self.dataproc_job_id = job_to_submit["job"]["reference"]["jobId"] - hook.submit(hook.project_id, job_to_submit, self.region) + hook.submit(hook.project_id, job_to_submit, self.region, self.job_error_states) class DataProcHiveOperator(BaseOperator): @@ -734,17 +774,17 @@ class DataProcHiveOperator(BaseOperator): Start a Hive query Job on a Cloud DataProc cluster. :param query: The query or reference to the query file (q extension). - :type query: string + :type query: str :param query_uri: The uri of a hive script on Cloud Storage. - :type query_uri: string + :type query_uri: str :param variables: Map of named parameters for the query. :type variables: dict :param job_name: The job name used in the DataProc cluster. This name by default is the task_id appended with the execution data, but can be templated. The name will always be appended with a random number to avoid name clashes. - :type job_name: string + :type job_name: str :param cluster_name: The name of the DataProc cluster. - :type cluster_name: string + :type cluster_name: str :param dataproc_hive_properties: Map for the Pig properties. Ideal to put in default arguments :type dataproc_hive_properties: dict @@ -752,18 +792,25 @@ class DataProcHiveOperator(BaseOperator): UDFs and libs) and are ideal to put in default arguments. :type dataproc_hive_jars: list :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param region: The specified region where the dataproc cluster is created. - :type region: string + :type region: str + :param job_error_states: Job states that should be considered error states. + Any states in this list will result in an error being raised and failure of the + task. Eg, if the ``CANCELLED`` state should also be considered a task failure, + pass in ``['ERROR', 'CANCELLED']``. Possible values are currently only + ``'ERROR'`` and ``'CANCELLED'``, but could change in the future. Defaults to + ``['ERROR']``. + :type job_error_states: list :var dataproc_job_id: The actual "jobId" as submitted to the Dataproc API. This is useful for identifying or linking to the job in the Google Cloud Console Dataproc UI, as the actual "jobId" submitted to the Dataproc API is appended with an 8 character random string. - :vartype dataproc_job_id: string + :vartype dataproc_job_id: str """ template_fields = ['query', 'variables', 'job_name', 'cluster_name', 'dataproc_jars'] template_ext = ('.q',) @@ -782,6 +829,7 @@ def __init__( gcp_conn_id='google_cloud_default', delegate_to=None, region='global', + job_error_states=['ERROR'], *args, **kwargs): @@ -796,6 +844,7 @@ def __init__( self.dataproc_properties = dataproc_hive_properties self.dataproc_jars = dataproc_hive_jars self.region = region + self.job_error_states = job_error_states def execute(self, context): hook = DataProcHook(gcp_conn_id=self.gcp_conn_id, @@ -815,7 +864,7 @@ def execute(self, context): job_to_submit = job.build() self.dataproc_job_id = job_to_submit["job"]["reference"]["jobId"] - hook.submit(hook.project_id, job_to_submit, self.region) + hook.submit(hook.project_id, job_to_submit, self.region, self.job_error_states) class DataProcSparkSqlOperator(BaseOperator): @@ -823,18 +872,18 @@ class DataProcSparkSqlOperator(BaseOperator): Start a Spark SQL query Job on a Cloud DataProc cluster. :param query: The query or reference to the query file (q extension). (templated) - :type query: string + :type query: str :param query_uri: The uri of a spark sql script on Cloud Storage. - :type query_uri: string + :type query_uri: str :param variables: Map of named parameters for the query. (templated) :type variables: dict :param job_name: The job name used in the DataProc cluster. This name by default is the task_id appended with the execution data, but can be templated. The name will always be appended with a random number to avoid name clashes. (templated) - :type job_name: string + :type job_name: str :param cluster_name: The name of the DataProc cluster. (templated) - :type cluster_name: string + :type cluster_name: str :param dataproc_spark_properties: Map for the Pig properties. Ideal to put in default arguments :type dataproc_spark_properties: dict @@ -842,18 +891,25 @@ class DataProcSparkSqlOperator(BaseOperator): for UDFs and libs) and are ideal to put in default arguments. :type dataproc_spark_jars: list :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param region: The specified region where the dataproc cluster is created. - :type region: string + :type region: str + :param job_error_states: Job states that should be considered error states. + Any states in this list will result in an error being raised and failure of the + task. Eg, if the ``CANCELLED`` state should also be considered a task failure, + pass in ``['ERROR', 'CANCELLED']``. Possible values are currently only + ``'ERROR'`` and ``'CANCELLED'``, but could change in the future. Defaults to + ``['ERROR']``. + :type job_error_states: list :var dataproc_job_id: The actual "jobId" as submitted to the Dataproc API. This is useful for identifying or linking to the job in the Google Cloud Console Dataproc UI, as the actual "jobId" submitted to the Dataproc API is appended with an 8 character random string. - :vartype dataproc_job_id: string + :vartype dataproc_job_id: str """ template_fields = ['query', 'variables', 'job_name', 'cluster_name', 'dataproc_jars'] template_ext = ('.q',) @@ -872,6 +928,7 @@ def __init__( gcp_conn_id='google_cloud_default', delegate_to=None, region='global', + job_error_states=['ERROR'], *args, **kwargs): @@ -886,6 +943,7 @@ def __init__( self.dataproc_properties = dataproc_spark_properties self.dataproc_jars = dataproc_spark_jars self.region = region + self.job_error_states = job_error_states def execute(self, context): hook = DataProcHook(gcp_conn_id=self.gcp_conn_id, @@ -905,7 +963,7 @@ def execute(self, context): job_to_submit = job.build() self.dataproc_job_id = job_to_submit["job"]["reference"]["jobId"] - hook.submit(hook.project_id, job_to_submit, self.region) + hook.submit(hook.project_id, job_to_submit, self.region, self.job_error_states) class DataProcSparkOperator(BaseOperator): @@ -914,10 +972,10 @@ class DataProcSparkOperator(BaseOperator): :param main_jar: URI of the job jar provisioned on Cloud Storage. (use this or the main_class, not both together). - :type main_jar: string + :type main_jar: str :param main_class: Name of the job class. (use this or the main_jar, not both together). - :type main_class: string + :type main_class: str :param arguments: Arguments for the job. (templated) :type arguments: list :param archives: List of archived files that will be unpacked in the work @@ -929,9 +987,9 @@ class DataProcSparkOperator(BaseOperator): name by default is the task_id appended with the execution data, but can be templated. The name will always be appended with a random number to avoid name clashes. (templated) - :type job_name: string + :type job_name: str :param cluster_name: The name of the DataProc cluster. (templated) - :type cluster_name: string + :type cluster_name: str :param dataproc_spark_properties: Map for the Pig properties. Ideal to put in default arguments :type dataproc_spark_properties: dict @@ -939,18 +997,25 @@ class DataProcSparkOperator(BaseOperator): for UDFs and libs) and are ideal to put in default arguments. :type dataproc_spark_jars: list :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param region: The specified region where the dataproc cluster is created. - :type region: string + :type region: str + :param job_error_states: Job states that should be considered error states. + Any states in this list will result in an error being raised and failure of the + task. Eg, if the ``CANCELLED`` state should also be considered a task failure, + pass in ``['ERROR', 'CANCELLED']``. Possible values are currently only + ``'ERROR'`` and ``'CANCELLED'``, but could change in the future. Defaults to + ``['ERROR']``. + :type job_error_states: list :var dataproc_job_id: The actual "jobId" as submitted to the Dataproc API. This is useful for identifying or linking to the job in the Google Cloud Console Dataproc UI, as the actual "jobId" submitted to the Dataproc API is appended with an 8 character random string. - :vartype dataproc_job_id: string + :vartype dataproc_job_id: str """ template_fields = ['arguments', 'job_name', 'cluster_name', 'dataproc_jars'] @@ -971,6 +1036,7 @@ def __init__( gcp_conn_id='google_cloud_default', delegate_to=None, region='global', + job_error_states=['ERROR'], *args, **kwargs): @@ -987,6 +1053,7 @@ def __init__( self.dataproc_properties = dataproc_spark_properties self.dataproc_jars = dataproc_spark_jars self.region = region + self.job_error_states = job_error_states def execute(self, context): hook = DataProcHook(gcp_conn_id=self.gcp_conn_id, @@ -1004,7 +1071,7 @@ def execute(self, context): job_to_submit = job.build() self.dataproc_job_id = job_to_submit["job"]["reference"]["jobId"] - hook.submit(hook.project_id, job_to_submit, self.region) + hook.submit(hook.project_id, job_to_submit, self.region, self.job_error_states) class DataProcHadoopOperator(BaseOperator): @@ -1013,10 +1080,10 @@ class DataProcHadoopOperator(BaseOperator): :param main_jar: URI of the job jar provisioned on Cloud Storage. (use this or the main_class, not both together). - :type main_jar: string + :type main_jar: str :param main_class: Name of the job class. (use this or the main_jar, not both together). - :type main_class: string + :type main_class: str :param arguments: Arguments for the job. (templated) :type arguments: list :param archives: List of archived files that will be unpacked in the work @@ -1028,9 +1095,9 @@ class DataProcHadoopOperator(BaseOperator): name by default is the task_id appended with the execution data, but can be templated. The name will always be appended with a random number to avoid name clashes. (templated) - :type job_name: string + :type job_name: str :param cluster_name: The name of the DataProc cluster. (templated) - :type cluster_name: string + :type cluster_name: str :param dataproc_hadoop_properties: Map for the Pig properties. Ideal to put in default arguments :type dataproc_hadoop_properties: dict @@ -1038,18 +1105,25 @@ class DataProcHadoopOperator(BaseOperator): for UDFs and libs) and are ideal to put in default arguments. :type dataproc_hadoop_jars: list :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param region: The specified region where the dataproc cluster is created. - :type region: string + :type region: str + :param job_error_states: Job states that should be considered error states. + Any states in this list will result in an error being raised and failure of the + task. Eg, if the ``CANCELLED`` state should also be considered a task failure, + pass in ``['ERROR', 'CANCELLED']``. Possible values are currently only + ``'ERROR'`` and ``'CANCELLED'``, but could change in the future. Defaults to + ``['ERROR']``. + :type job_error_states: list :var dataproc_job_id: The actual "jobId" as submitted to the Dataproc API. This is useful for identifying or linking to the job in the Google Cloud Console Dataproc UI, as the actual "jobId" submitted to the Dataproc API is appended with an 8 character random string. - :vartype dataproc_job_id: string + :vartype dataproc_job_id: str """ template_fields = ['arguments', 'job_name', 'cluster_name', 'dataproc_jars'] @@ -1070,6 +1144,7 @@ def __init__( gcp_conn_id='google_cloud_default', delegate_to=None, region='global', + job_error_states=['ERROR'], *args, **kwargs): @@ -1086,6 +1161,7 @@ def __init__( self.dataproc_properties = dataproc_hadoop_properties self.dataproc_jars = dataproc_hadoop_jars self.region = region + self.job_error_states = job_error_states def execute(self, context): hook = DataProcHook(gcp_conn_id=self.gcp_conn_id, @@ -1103,17 +1179,16 @@ def execute(self, context): job_to_submit = job.build() self.dataproc_job_id = job_to_submit["job"]["reference"]["jobId"] - hook.submit(hook.project_id, job_to_submit, self.region) + hook.submit(hook.project_id, job_to_submit, self.region, self.job_error_states) class DataProcPySparkOperator(BaseOperator): - # TODO Add docs around dataproc_job_id. """ Start a PySpark Job on a Cloud DataProc cluster. :param main: [Required] The Hadoop Compatible Filesystem (HCFS) URI of the main Python file to use as the driver. Must be a .py file. - :type main: string + :type main: str :param arguments: Arguments for the job. (templated) :type arguments: list :param archives: List of archived files that will be unpacked in the work @@ -1128,9 +1203,9 @@ class DataProcPySparkOperator(BaseOperator): name by default is the task_id appended with the execution data, but can be templated. The name will always be appended with a random number to avoid name clashes. (templated) - :type job_name: string + :type job_name: str :param cluster_name: The name of the DataProc cluster. - :type cluster_name: string + :type cluster_name: str :param dataproc_pyspark_properties: Map for the Pig properties. Ideal to put in default arguments :type dataproc_pyspark_properties: dict @@ -1138,18 +1213,25 @@ class DataProcPySparkOperator(BaseOperator): for UDFs and libs) and are ideal to put in default arguments. :type dataproc_pyspark_jars: list :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param region: The specified region where the dataproc cluster is created. - :type region: string + :type region: str + :param job_error_states: Job states that should be considered error states. + Any states in this list will result in an error being raised and failure of the + task. Eg, if the ``CANCELLED`` state should also be considered a task failure, + pass in ``['ERROR', 'CANCELLED']``. Possible values are currently only + ``'ERROR'`` and ``'CANCELLED'``, but could change in the future. Defaults to + ``['ERROR']``. + :type job_error_states: list :var dataproc_job_id: The actual "jobId" as submitted to the Dataproc API. This is useful for identifying or linking to the job in the Google Cloud Console Dataproc UI, as the actual "jobId" submitted to the Dataproc API is appended with an 8 character random string. - :vartype dataproc_job_id: string + :vartype dataproc_job_id: str """ template_fields = ['arguments', 'job_name', 'cluster_name', 'dataproc_jars'] @@ -1158,7 +1240,7 @@ class DataProcPySparkOperator(BaseOperator): @staticmethod def _generate_temp_filename(filename): dt = time.strftime('%Y%m%d%H%M%S') - return "{}_{}_{}".format(dt, str(uuid.uuid1())[:8], ntpath.basename(filename)) + return "{}_{}_{}".format(dt, str(uuid.uuid4())[:8], ntpath.basename(filename)) """ Upload a local file to a Google Cloud Storage bucket @@ -1197,6 +1279,7 @@ def __init__( gcp_conn_id='google_cloud_default', delegate_to=None, region='global', + job_error_states=['ERROR'], *args, **kwargs): @@ -1213,6 +1296,7 @@ def __init__( self.dataproc_properties = dataproc_pyspark_properties self.dataproc_jars = dataproc_pyspark_jars self.region = region + self.job_error_states = job_error_states def execute(self, context): hook = DataProcHook( @@ -1243,7 +1327,7 @@ def execute(self, context): job_to_submit = job.build() self.dataproc_job_id = job_to_submit["job"]["reference"]["jobId"] - hook.submit(hook.project_id, job_to_submit, self.region) + hook.submit(hook.project_id, job_to_submit, self.region, self.job_error_states) class DataprocWorkflowTemplateBaseOperator(BaseOperator): @@ -1283,18 +1367,18 @@ class DataprocWorkflowTemplateInstantiateOperator(DataprocWorkflowTemplateBaseOp https://cloud.google.com/dataproc/docs/reference/rest/v1beta2/projects.regions.workflowTemplates/instantiate :param template_id: The id of the template. (templated) - :type template_id: string + :type template_id: str :param project_id: The ID of the google cloud project in which the template runs - :type project_id: string + :type project_id: str :param region: leave as 'global', might become relevant in the future - :type region: string + :type region: str :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ template_fields = ['template_id'] @@ -1312,7 +1396,7 @@ def start(self): .instantiate( name=('projects/%s/regions/%s/workflowTemplates/%s' % (self.project_id, self.region, self.template_id)), - body={'instanceId': str(uuid.uuid1())}) + body={'instanceId': str(uuid.uuid4())}) .execute()) @@ -1330,15 +1414,15 @@ class DataprocWorkflowTemplateInstantiateInlineOperator( :type template: map :param project_id: The ID of the google cloud project in which the template runs - :type project_id: string + :type project_id: str :param region: leave as 'global', might become relevant in the future - :type region: string + :type region: str :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ template_fields = ['template'] @@ -1355,6 +1439,6 @@ def start(self): self.hook.get_conn().projects().regions().workflowTemplates() .instantiateInline( parent='projects/%s/regions/%s' % (self.project_id, self.region), - instanceId=str(uuid.uuid1()), + instanceId=str(uuid.uuid4()), body=self.template) .execute()) diff --git a/airflow/contrib/operators/datastore_export_operator.py b/airflow/contrib/operators/datastore_export_operator.py index f6dc7cc571b41..9d95eadc74822 100644 --- a/airflow/contrib/operators/datastore_export_operator.py +++ b/airflow/contrib/operators/datastore_export_operator.py @@ -29,19 +29,19 @@ class DatastoreExportOperator(BaseOperator): Export entities from Google Cloud Datastore to Cloud Storage :param bucket: name of the cloud storage bucket to backup data - :type bucket: string + :type bucket: str :param namespace: optional namespace path in the specified Cloud Storage bucket to backup data. If this namespace does not exist in GCS, it will be created. :type namespace: str :param datastore_conn_id: the name of the Datastore connection id to use - :type datastore_conn_id: string + :type datastore_conn_id: str :param cloud_storage_conn_id: the name of the cloud storage connection id to force-write backup - :type cloud_storage_conn_id: string + :type cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param entity_filter: description of what data from the project is included in the export, refer to https://cloud.google.com/datastore/docs/reference/rest/Shared.Types/EntityFilter diff --git a/airflow/contrib/operators/datastore_import_operator.py b/airflow/contrib/operators/datastore_import_operator.py index 401d36e05b7a8..c79767f35e9cd 100644 --- a/airflow/contrib/operators/datastore_import_operator.py +++ b/airflow/contrib/operators/datastore_import_operator.py @@ -28,10 +28,10 @@ class DatastoreImportOperator(BaseOperator): Import entities from Cloud Storage to Google Cloud Datastore :param bucket: container in Cloud Storage to store data - :type bucket: string + :type bucket: str :param file: path of the backup metadata file in the specified Cloud Storage bucket. It should have the extension .overall_export_metadata - :type file: string + :type file: str :param namespace: optional namespace of the backup metadata file in the specified Cloud Storage bucket. :type namespace: str @@ -42,11 +42,11 @@ class DatastoreImportOperator(BaseOperator): :param labels: client-assigned labels for cloud storage :type labels: dict :param datastore_conn_id: the name of the connection id to use - :type datastore_conn_id: string + :type datastore_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param polling_interval_in_seconds: number of seconds to wait before polling for execution status again :type polling_interval_in_seconds: int diff --git a/airflow/contrib/operators/ecs_operator.py b/airflow/contrib/operators/ecs_operator.py index 319441d297af5..8bad285ffd8c1 100644 --- a/airflow/contrib/operators/ecs_operator.py +++ b/airflow/contrib/operators/ecs_operator.py @@ -33,17 +33,27 @@ class ECSOperator(BaseOperator): :type task_definition: str :param cluster: the cluster name on EC2 Container Service :type cluster: str - :param: overrides: the same parameter that boto3 will receive (templated): - http://boto3.readthedocs.org/en/latest/reference/services/ecs.html#ECS.Client.run_task - :type: overrides: dict + :param overrides: the same parameter that boto3 will receive (templated): + http://boto3.readthedocs.org/en/latest/reference/services/ecs.html#ECS.Client.run_task + :type overrides: dict :param aws_conn_id: connection id of AWS credentials / region name. If None, - credential boto3 strategy will be used - (http://boto3.readthedocs.io/en/latest/guide/configuration.html). + credential boto3 strategy will be used + (http://boto3.readthedocs.io/en/latest/guide/configuration.html). :type aws_conn_id: str :param region_name: region name to use in AWS Hook. Override the region_name in connection (if provided) + :type region_name: str :param launch_type: the launch type on which to run your task ('EC2' or 'FARGATE') - :type: launch_type: str + :type launch_type: str + :param group: the name of the task group associated with the task + :type group: str + :param placement_constraints: an array of placement constraint objects to use for + the task + :type placement_constraints: list + :param platform_version: the platform version on which your task is running + :type platform_version: str + :param network_configuration: the network configuration for the task + :type network_configuration: dict """ ui_color = '#f0ede4' @@ -53,7 +63,9 @@ class ECSOperator(BaseOperator): @apply_defaults def __init__(self, task_definition, cluster, overrides, - aws_conn_id=None, region_name=None, launch_type='EC2', **kwargs): + aws_conn_id=None, region_name=None, launch_type='EC2', + group=None, placement_constraints=None, platform_version='LATEST', + network_configuration=None, **kwargs): super(ECSOperator, self).__init__(**kwargs) self.aws_conn_id = aws_conn_id @@ -62,6 +74,10 @@ def __init__(self, task_definition, cluster, overrides, self.cluster = cluster self.overrides = overrides self.launch_type = launch_type + self.group = group + self.placement_constraints = placement_constraints + self.platform_version = platform_version + self.network_configuration = network_configuration self.hook = self.get_hook() @@ -77,13 +93,21 @@ def execute(self, context): region_name=self.region_name ) - response = self.client.run_task( - cluster=self.cluster, - taskDefinition=self.task_definition, - overrides=self.overrides, - startedBy=self.owner, - launchType=self.launch_type - ) + run_opts = { + 'cluster': self.cluster, + 'taskDefinition': self.task_definition, + 'overrides': self.overrides, + 'startedBy': self.owner, + 'launchType': self.launch_type, + 'platformVersion': self.platform_version, + } + if self.group is not None: + run_opts['group'] = self.group + if self.placement_constraints is not None: + run_opts['placementConstraints'] = self.placement_constraints + if self.network_configuration is not None: + run_opts['networkConfiguration'] = self.network_configuration + response = self.client.run_task(**run_opts) failures = response['failures'] if len(failures) > 0: diff --git a/airflow/contrib/operators/emr_add_steps_operator.py b/airflow/contrib/operators/emr_add_steps_operator.py index 2f2f4afcecb4f..959543e617422 100644 --- a/airflow/contrib/operators/emr_add_steps_operator.py +++ b/airflow/contrib/operators/emr_add_steps_operator.py @@ -27,7 +27,7 @@ class EmrAddStepsOperator(BaseOperator): An operator that adds steps to an existing EMR job_flow. :param job_flow_id: id of the JobFlow to add steps to. (templated) - :type job_flow_name: str + :type job_flow_id: str :param aws_conn_id: aws connection to uses :type aws_conn_id: str :param steps: boto3 style steps to be added to the jobflow. (templated) diff --git a/airflow/contrib/operators/emr_create_job_flow_operator.py b/airflow/contrib/operators/emr_create_job_flow_operator.py index 1e0dfc386f11f..42886d60064ea 100644 --- a/airflow/contrib/operators/emr_create_job_flow_operator.py +++ b/airflow/contrib/operators/emr_create_job_flow_operator.py @@ -33,7 +33,7 @@ class EmrCreateJobFlowOperator(BaseOperator): :param emr_conn_id: emr connection to use :type emr_conn_id: str :param job_flow_overrides: boto3 style arguments to override - emr_connection extra. (templated) + emr_connection extra. (templated) :type steps: dict """ template_fields = ['job_flow_overrides'] diff --git a/airflow/contrib/operators/emr_terminate_job_flow_operator.py b/airflow/contrib/operators/emr_terminate_job_flow_operator.py index d2657338424ce..8e4c0687ccc15 100644 --- a/airflow/contrib/operators/emr_terminate_job_flow_operator.py +++ b/airflow/contrib/operators/emr_terminate_job_flow_operator.py @@ -27,7 +27,7 @@ class EmrTerminateJobFlowOperator(BaseOperator): Operator to terminate EMR JobFlows. :param job_flow_id: id of the JobFlow to terminate. (templated) - :type job_flow_name: str + :type job_flow_id: str :param aws_conn_id: aws connection to uses :type aws_conn_id: str """ diff --git a/airflow/contrib/operators/file_to_gcs.py b/airflow/contrib/operators/file_to_gcs.py index 807385b43c3a7..a392a168918b0 100644 --- a/airflow/contrib/operators/file_to_gcs.py +++ b/airflow/contrib/operators/file_to_gcs.py @@ -28,17 +28,17 @@ class FileToGoogleCloudStorageOperator(BaseOperator): Uploads a file to Google Cloud Storage :param src: Path to the local file. (templated) - :type src: string + :type src: str :param dst: Destination path within the specified bucket. (templated) - :type dst: string + :type dst: str :param bucket: The bucket to upload to. (templated) - :type bucket: string + :type bucket: str :param google_cloud_storage_conn_id: The Airflow connection ID to upload with - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param mime_type: The mime-type string - :type mime_type: string + :type mime_type: str :param delegate_to: The account to impersonate, if any - :type delegate_to: string + :type delegate_to: str """ template_fields = ('src', 'dst', 'bucket') diff --git a/airflow/contrib/operators/gcp_container_operator.py b/airflow/contrib/operators/gcp_container_operator.py index c99f2a93f2c59..fda4d44b9dca9 100644 --- a/airflow/contrib/operators/gcp_container_operator.py +++ b/airflow/contrib/operators/gcp_container_operator.py @@ -29,6 +29,36 @@ class GKEClusterDeleteOperator(BaseOperator): + """ + Deletes the cluster, including the Kubernetes endpoint and all worker nodes. + + To delete a certain cluster, you must specify the ``project_id``, the ``name`` + of the cluster, the ``location`` that the cluster is in, and the ``task_id``. + + **Operator Creation**: :: + + operator = GKEClusterDeleteOperator( + task_id='cluster_delete', + project_id='my-project', + location='cluster-location' + name='cluster-name') + + .. seealso:: + For more detail about deleting clusters have a look at the reference: + https://google-cloud-python.readthedocs.io/en/latest/container/gapic/v1/api.html#google.cloud.container_v1.ClusterManagerClient.delete_cluster + + :param project_id: The Google Developers Console [project ID or project number] + :type project_id: str + :param name: The name of the resource to delete, in this case cluster name + :type name: str + :param location: The name of the Google Compute Engine zone in which the cluster + resides. + :type location: str + :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. + :type gcp_conn_id: str + :param api_version: The api version to use + :type api_version: str + """ template_fields = ['project_id', 'gcp_conn_id', 'name', 'location', 'api_version'] @apply_defaults @@ -40,37 +70,6 @@ def __init__(self, api_version='v2', *args, **kwargs): - """ - Deletes the cluster, including the Kubernetes endpoint and all worker nodes. - - - To delete a certain cluster, you must specify the ``project_id``, the ``name`` - of the cluster, the ``location`` that the cluster is in, and the ``task_id``. - - **Operator Creation**: :: - - operator = GKEClusterDeleteOperator( - task_id='cluster_delete', - project_id='my-project', - location='cluster-location' - name='cluster-name') - - .. seealso:: - For more detail about deleting clusters have a look at the reference: - https://google-cloud-python.readthedocs.io/en/latest/container/gapic/v1/api.html#google.cloud.container_v1.ClusterManagerClient.delete_cluster - - :param project_id: The Google Developers Console [project ID or project number] - :type project_id: str - :param name: The name of the resource to delete, in this case cluster name - :type name: str - :param location: The name of the Google Compute Engine zone in which the cluster - resides. - :type location: str - :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: str - :param api_version: The api version to use - :type api_version: str - """ super(GKEClusterDeleteOperator, self).__init__(*args, **kwargs) self.project_id = project_id @@ -93,6 +92,48 @@ def execute(self, context): class GKEClusterCreateOperator(BaseOperator): + """ + Create a Google Kubernetes Engine Cluster of specified dimensions + The operator will wait until the cluster is created. + + The **minimum** required to define a cluster to create is: + + ``dict()`` :: + cluster_def = {'name': 'my-cluster-name', + 'initial_node_count': 1} + + or + + ``Cluster`` proto :: + from google.cloud.container_v1.types import Cluster + + cluster_def = Cluster(name='my-cluster-name', initial_node_count=1) + + **Operator Creation**: :: + + operator = GKEClusterCreateOperator( + task_id='cluster_create', + project_id='my-project', + location='my-location' + body=cluster_def) + + .. seealso:: + For more detail on about creating clusters have a look at the reference: + https://google-cloud-python.readthedocs.io/en/latest/container/gapic/v1/types.html#google.cloud.container_v1.types.Cluster + + :param project_id: The Google Developers Console [project ID or project number] + :type project_id: str + :param location: The name of the Google Compute Engine zone in which the cluster + resides. + :type location: str + :param body: The Cluster definition to create, can be protobuf or python dict, if + dict it must match protobuf message Cluster + :type body: dict or google.cloud.container_v1.types.Cluster + :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. + :type gcp_conn_id: str + :param api_version: The api version to use + :type api_version: str + """ template_fields = ['project_id', 'gcp_conn_id', 'location', 'api_version', 'body'] @apply_defaults @@ -104,48 +145,6 @@ def __init__(self, api_version='v2', *args, **kwargs): - """ - Create a Google Kubernetes Engine Cluster of specified dimensions - The operator will wait until the cluster is created. - - The **minimum** required to define a cluster to create is: - - ``dict()`` :: - cluster_def = {'name': 'my-cluster-name', - 'initial_node_count': 1} - - or - - ``Cluster`` proto :: - from google.cloud.container_v1.types import Cluster - - cluster_def = Cluster(name='my-cluster-name', initial_node_count=1) - - **Operator Creation**: :: - - operator = GKEClusterCreateOperator( - task_id='cluster_create', - project_id='my-project', - location='my-location' - body=cluster_def) - - .. seealso:: - For more detail on about creating clusters have a look at the reference: - https://google-cloud-python.readthedocs.io/en/latest/container/gapic/v1/types.html#google.cloud.container_v1.types.Cluster - - :param project_id: The Google Developers Console [project ID or project number] - :type project_id: str - :param location: The name of the Google Compute Engine zone in which the cluster - resides. - :type location: str - :param body: The Cluster definition to create, can be protobuf or python dict, if - dict it must match protobuf message Cluster - :type body: dict or google.cloud.container_v1.types.Cluster - :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: str - :param api_version: The api version to use - :type api_version: str - """ super(GKEClusterCreateOperator, self).__init__(*args, **kwargs) if body is None: @@ -184,6 +183,44 @@ def execute(self, context): class GKEPodOperator(KubernetesPodOperator): + """ + Executes a task in a Kubernetes pod in the specified Google Kubernetes + Engine cluster + + This Operator assumes that the system has gcloud installed and either + has working default application credentials or has configured a + connection id with a service account. + + The **minimum** required to define a cluster to create are the variables + ``task_id``, ``project_id``, ``location``, ``cluster_name``, ``name``, + ``namespace``, and ``image`` + + **Operator Creation**: :: + + operator = GKEPodOperator(task_id='pod_op', + project_id='my-project', + location='us-central1-a', + cluster_name='my-cluster-name', + name='task-name', + namespace='default', + image='perl') + + .. seealso:: + For more detail about application authentication have a look at the reference: + https://cloud.google.com/docs/authentication/production#providing_credentials_to_your_application + + :param project_id: The Google Developers Console project id + :type project_id: str + :param location: The name of the Google Kubernetes Engine zone in which the + cluster resides, e.g. 'us-central1-a' + :type location: str + :param cluster_name: The name of the Google Kubernetes Engine cluster the pod + should be spawned in + :type cluster_name: str + :param gcp_conn_id: The google cloud connection id to use. This allows for + users to specify a service account. + :type gcp_conn_id: str + """ template_fields = ('project_id', 'location', 'cluster_name') + KubernetesPodOperator.template_fields @@ -195,44 +232,6 @@ def __init__(self, gcp_conn_id='google_cloud_default', *args, **kwargs): - """ - Executes a task in a Kubernetes pod in the specified Google Kubernetes - Engine cluster - - This Operator assumes that the system has gcloud installed and either - has working default application credentials or has configured a - connection id with a service account. - - The **minimum** required to define a cluster to create are the variables - ``task_id``, ``project_id``, ``location``, ``cluster_name``, ``name``, - ``namespace``, and ``image`` - - **Operator Creation**: :: - - operator = GKEPodOperator(task_id='pod_op', - project_id='my-project', - location='us-central1-a', - cluster_name='my-cluster-name', - name='task-name', - namespace='default', - image='perl') - - .. seealso:: - For more detail about application authentication have a look at the reference: - https://cloud.google.com/docs/authentication/production#providing_credentials_to_your_application - - :param project_id: The Google Developers Console project id - :type project_id: str - :param location: The name of the Google Kubernetes Engine zone in which the - cluster resides, e.g. 'us-central1-a' - :type location: str - :param cluster_name: The name of the Google Kubernetes Engine cluster the pod - should be spawned in - :type cluster_name: str - :param gcp_conn_id: The google cloud connection id to use. This allows for - users to specify a service account. - :type gcp_conn_id: str - """ super(GKEPodOperator, self).__init__(*args, **kwargs) self.project_id = project_id self.location = location diff --git a/airflow/contrib/operators/gcp_function_operator.py b/airflow/contrib/operators/gcp_function_operator.py new file mode 100644 index 0000000000000..4455307c93259 --- /dev/null +++ b/airflow/contrib/operators/gcp_function_operator.py @@ -0,0 +1,563 @@ +# -*- coding: utf-8 -*- +# +# 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. +import re + +from googleapiclient.errors import HttpError + +from airflow import AirflowException, LoggingMixin +from airflow.version import version +from airflow.models import BaseOperator +from airflow.contrib.hooks.gcp_function_hook import GcfHook +from airflow.utils.decorators import apply_defaults + +# TODO: This whole section should be extracted later to contrib/tools/field_validator.py + +COMPOSITE_FIELD_TYPES = ['union', 'dict'] + + +class FieldValidationException(AirflowException): + """ + Thrown when validation finds dictionary field not valid according to specification. + """ + + def __init__(self, message): + super(FieldValidationException, self).__init__(message) + + +class ValidationSpecificationException(AirflowException): + """ + Thrown when validation specification is wrong + (rather than dictionary being validated). + This should only happen during development as ideally + specification itself should not be invalid ;) . + """ + + def __init__(self, message): + super(ValidationSpecificationException, self).__init__(message) + + +# TODO: make better description, add some examples +# TODO: move to contrib/utils folder when we reuse it. +class BodyFieldValidator(LoggingMixin): + """ + Validates correctness of request body according to specification. + The specification can describe various type of + fields including custom validation, and union of fields. This validator is meant + to be reusable by various operators + in the near future, but for now it is left as part of the Google Cloud Function, + so documentation about the + validator is not yet complete. To see what kind of specification can be used, + please take a look at + gcp_function_operator.CLOUD_FUNCTION_VALIDATION which specifies validation + for GCF deploy operator. + + :param validation_specs: dictionary describing validation specification + :type validation_specs: [dict] + :param api_version: Version of the api used (for example v1) + :type api_version: str + + """ + def __init__(self, validation_specs, api_version): + # type: ([dict], str) -> None + super(BodyFieldValidator, self).__init__() + self._validation_specs = validation_specs + self._api_version = api_version + + @staticmethod + def _get_field_name_with_parent(field_name, parent): + if parent: + return parent + '.' + field_name + return field_name + + @staticmethod + def _sanity_checks(children_validation_specs, field_type, full_field_path, + regexp, custom_validation, value): + # type: (dict, str, str, str, function, object) -> None + if value is None and field_type != 'union': + raise FieldValidationException( + "The required body field '{}' is missing. Please add it.". + format(full_field_path)) + if regexp and field_type: + raise ValidationSpecificationException( + "The validation specification entry '{}' has both type and regexp. " + "The regexp is only allowed without type (i.e. assume type is 'str' " + "that can be validated with regexp)".format(full_field_path)) + if children_validation_specs and field_type not in COMPOSITE_FIELD_TYPES: + raise ValidationSpecificationException( + "Nested fields are specified in field '{}' of type '{}'. " + "Nested fields are only allowed for fields of those types: ('{}').". + format(full_field_path, field_type, COMPOSITE_FIELD_TYPES)) + if custom_validation and field_type: + raise ValidationSpecificationException( + "The validation specification field '{}' has both type and " + "custom_validation. Custom validation is only allowed without type.". + format(full_field_path)) + + @staticmethod + def _validate_regexp(full_field_path, regexp, value): + # type: (str, str, str) -> None + if not re.match(regexp, value): + # Note matching of only the beginning as we assume the regexps all-or-nothing + raise FieldValidationException( + "The body field '{}' of value '{}' does not match the field " + "specification regexp: '{}'.". + format(full_field_path, value, regexp)) + + def _validate_dict(self, children_validation_specs, full_field_path, value): + # type: (dict, str, dict) -> None + for child_validation_spec in children_validation_specs: + self._validate_field(validation_spec=child_validation_spec, + dictionary_to_validate=value, + parent=full_field_path) + for field_name in value.keys(): + if field_name not in [spec['name'] for spec in children_validation_specs]: + self.log.warning( + "The field '{}' is in the body, but is not specified in the " + "validation specification '{}'. " + "This might be because you are using newer API version and " + "new field names defined for that version. Then the warning " + "can be safely ignored, or you might want to upgrade the operator" + "to the version that supports the new API version.".format( + self._get_field_name_with_parent(field_name, full_field_path), + children_validation_specs)) + + def _validate_union(self, children_validation_specs, full_field_path, + dictionary_to_validate): + # type: (dict, str, dict) -> None + field_found = False + found_field_name = None + for child_validation_spec in children_validation_specs: + # Forcing optional so that we do not have to type optional = True + # in specification for all union fields + new_field_found = self._validate_field( + validation_spec=child_validation_spec, + dictionary_to_validate=dictionary_to_validate, + parent=full_field_path, + force_optional=True) + field_name = child_validation_spec['name'] + if new_field_found and field_found: + raise FieldValidationException( + "The mutually exclusive fields '{}' and '{}' belonging to the " + "union '{}' are both present. Please remove one". + format(field_name, found_field_name, full_field_path)) + if new_field_found: + field_found = True + found_field_name = field_name + if not field_found: + self.log.warning( + "There is no '{}' union defined in the body {}. " + "Validation expected one of '{}' but could not find any. It's possible " + "that you are using newer API version and there is another union variant " + "defined for that version. Then the warning can be safely ignored, " + "or you might want to upgrade the operator to the version that " + "supports the new API version.".format( + full_field_path, + dictionary_to_validate, + [field['name'] for field in children_validation_specs])) + + def _validate_field(self, validation_spec, dictionary_to_validate, parent=None, + force_optional=False): + """ + Validates if field is OK. + :param validation_spec: specification of the field + :type validation_spec: dict + :param dictionary_to_validate: dictionary where the field should be present + :type dictionary_to_validate: dict + :param parent: full path of parent field + :type parent: str + :param force_optional: forces the field to be optional + (all union fields have force_optional set to True) + :type force_optional: bool + :return: True if the field is present + """ + field_name = validation_spec['name'] + field_type = validation_spec.get('type') + optional = validation_spec.get('optional') + regexp = validation_spec.get('regexp') + children_validation_specs = validation_spec.get('fields') + required_api_version = validation_spec.get('api_version') + custom_validation = validation_spec.get('custom_validation') + + full_field_path = self._get_field_name_with_parent(field_name=field_name, + parent=parent) + if required_api_version and required_api_version != self._api_version: + self.log.debug( + "Skipping validation of the field '{}' for API version '{}' " + "as it is only valid for API version '{}'". + format(field_name, self._api_version, required_api_version)) + return False + value = dictionary_to_validate.get(field_name) + + if (optional or force_optional) and value is None: + self.log.debug("The optional field '{}' is missing. That's perfectly OK.". + format(full_field_path)) + return False + + # Certainly down from here the field is present (value is not None) + # so we should only return True from now on + + self._sanity_checks(children_validation_specs=children_validation_specs, + field_type=field_type, + full_field_path=full_field_path, + regexp=regexp, + custom_validation=custom_validation, + value=value) + + if regexp: + self._validate_regexp(full_field_path, regexp, value) + elif field_type == 'dict': + if not isinstance(value, dict): + raise FieldValidationException( + "The field '{}' should be dictionary type according to " + "specification '{}' but it is '{}'". + format(full_field_path, validation_spec, value)) + if children_validation_specs is None: + self.log.debug( + "The dict field '{}' has no nested fields defined in the " + "specification '{}'. That's perfectly ok - it's content will " + "not be validated." + .format(full_field_path, validation_spec)) + else: + self._validate_dict(children_validation_specs, full_field_path, value) + elif field_type == 'union': + if not children_validation_specs: + raise ValidationSpecificationException( + "The union field '{}' has no nested fields " + "defined in specification '{}'. Unions should have at least one " + "nested field defined.".format(full_field_path, validation_spec)) + self._validate_union(children_validation_specs, full_field_path, + dictionary_to_validate) + elif custom_validation: + try: + custom_validation(value) + except Exception as e: + raise FieldValidationException( + "Error while validating custom field '{}' specified by '{}': '{}'". + format(full_field_path, validation_spec, e)) + elif field_type is None: + self.log.debug("The type of field '{}' is not specified in '{}'. " + "Not validating its content.". + format(full_field_path, validation_spec)) + else: + raise ValidationSpecificationException( + "The field '{}' is of type '{}' in specification '{}'." + "This type is unknown to validation!".format( + full_field_path, field_type, validation_spec)) + return True + + def validate(self, body_to_validate): + """ + Validates if the body (dictionary) follows specification that the validator was + instantiated with. Raises ValidationSpecificationException or + ValidationFieldException in case of problems with specification or the + body not conforming to the specification respectively. + :param body_to_validate: body that must follow the specification + :type body_to_validate: dict + :return: None + """ + try: + for validation_spec in self._validation_specs: + self._validate_field(validation_spec=validation_spec, + dictionary_to_validate=body_to_validate) + except FieldValidationException as e: + raise FieldValidationException( + "There was an error when validating: field '{}': '{}'". + format(body_to_validate, e)) + +# TODO End of field validator to be extracted + + +def _validate_available_memory_in_mb(value): + if int(value) <= 0: + raise FieldValidationException("The available memory has to be greater than 0") + + +def _validate_max_instances(value): + if int(value) <= 0: + raise FieldValidationException( + "The max instances parameter has to be greater than 0") + + +CLOUD_FUNCTION_VALIDATION = [ + dict(name="name", regexp="^.+$"), + dict(name="description", regexp="^.+$", optional=True), + dict(name="entryPoint", regexp=r'^.+$', optional=True), + dict(name="runtime", regexp=r'^.+$', optional=True), + dict(name="timeout", regexp=r'^.+$', optional=True), + dict(name="availableMemoryMb", custom_validation=_validate_available_memory_in_mb, + optional=True), + dict(name="labels", optional=True), + dict(name="environmentVariables", optional=True), + dict(name="network", regexp=r'^.+$', optional=True), + dict(name="maxInstances", optional=True, custom_validation=_validate_max_instances), + + dict(name="source_code", type="union", fields=[ + dict(name="sourceArchiveUrl", regexp=r'^.+$'), + dict(name="sourceRepositoryUrl", regexp=r'^.+$', api_version='v1beta2'), + dict(name="sourceRepository", type="dict", fields=[ + dict(name="url", regexp=r'^.+$') + ]), + dict(name="sourceUploadUrl") + ]), + + dict(name="trigger", type="union", fields=[ + dict(name="httpsTrigger", type="dict", fields=[ + # This dict should be empty at input (url is added at output) + ]), + dict(name="eventTrigger", type="dict", fields=[ + dict(name="eventType", regexp=r'^.+$'), + dict(name="resource", regexp=r'^.+$'), + dict(name="service", regexp=r'^.+$', optional=True), + dict(name="failurePolicy", type="dict", optional=True, fields=[ + dict(name="retry", type="dict", optional=True) + ]) + ]) + ]), +] + + +class GcfFunctionDeployOperator(BaseOperator): + """ + Create a function in Google Cloud Functions. + + :param project_id: Project ID that the operator works on + :type project_id: str + :param location: Region where the operator operates on + :type location: str + :param body: Body of the cloud function definition. The body must be a CloudFunction + dictionary as described in: + https://cloud.google.com/functions/docs/reference/rest/v1/projects.locations.functions + (note that different API versions require different + variants of the CloudFunction dictionary) + :type body: dict or google.cloud.functions.v1.CloudFunction + :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. + :type gcp_conn_id: str + :param api_version: Version of the API used (for example v1). + :type api_version: str + :param zip_path: Path to zip file containing source code of the function. If it is + set, then sourceUploadUrl should not be specified in the body (or it should + be empty), then the zip file will be uploaded using upload URL generated + via generateUploadUrl from cloud functions API + :type zip_path: str + :param validate_body: If set to False, no body validation is performed. + :type validate_body: bool + """ + + @apply_defaults + def __init__(self, + project_id, + location, + body, + gcp_conn_id='google_cloud_default', + api_version='v1', + zip_path=None, + validate_body=True, + *args, **kwargs): + self.project_id = project_id + self.location = location + self.full_location = 'projects/{}/locations/{}'.format(self.project_id, + self.location) + self.body = body + self.gcp_conn_id = gcp_conn_id + self.api_version = api_version + self.zip_path = zip_path + self.zip_path_preprocessor = ZipPathPreprocessor(body, zip_path) + self.validate_body = validate_body + self._field_validator = BodyFieldValidator(CLOUD_FUNCTION_VALIDATION, + api_version=api_version) + self._hook = GcfHook(gcp_conn_id=self.gcp_conn_id, api_version=self.api_version) + self._validate_inputs() + super(GcfFunctionDeployOperator, self).__init__(*args, **kwargs) + + def _validate_inputs(self): + if not self.project_id: + raise AirflowException("The required parameter 'project_id' is missing") + if not self.location: + raise AirflowException("The required parameter 'location' is missing") + if not self.body: + raise AirflowException("The required parameter 'body' is missing") + self.zip_path_preprocessor.preprocess_body() + + def _validate_all_body_fields(self): + self._field_validator.validate(self.body) + + def _create_new_function(self): + self._hook.create_new_function(self.full_location, self.body) + + def _update_function(self): + self._hook.update_function(self.body['name'], self.body, self.body.keys()) + + def _check_if_function_exists(self): + name = self.body.get('name') + if not name: + raise FieldValidationException("The 'name' field should be present in " + "body: '{}'.".format(self.body)) + try: + self._hook.get_function(name) + except HttpError as e: + status = e.resp.status + if status == 404: + return False + raise e + return True + + def _upload_source_code(self): + return self._hook.upload_function_zip(parent=self.full_location, + zip_path=self.zip_path) + + def _set_airflow_version_label(self): + if 'labels' not in self.body.keys(): + self.body['labels'] = {} + self.body['labels'].update( + {'airflow-version': 'v' + version.replace('.', '-').replace('+', '-')}) + + def execute(self, context): + if self.zip_path_preprocessor.should_upload_function(): + self.body[SOURCE_UPLOAD_URL] = self._upload_source_code() + if self.validate_body: + self._validate_all_body_fields() + self._set_airflow_version_label() + if not self._check_if_function_exists(): + self._create_new_function() + else: + self._update_function() + + +SOURCE_ARCHIVE_URL = 'sourceArchiveUrl' +SOURCE_UPLOAD_URL = 'sourceUploadUrl' +SOURCE_REPOSITORY = 'sourceRepository' +ZIP_PATH = 'zip_path' + + +class ZipPathPreprocessor: + """ + Pre-processes zip path parameter. + + Responsible for checking if the zip path parameter is correctly specified in + relation with source_code body fields. Non empty zip path parameter is special because + it is mutually exclusive with sourceArchiveUrl and sourceRepository body fields. + It is also mutually exclusive with non-empty sourceUploadUrl. + The pre-process modifies sourceUploadUrl body field in special way when zip_path + is not empty. An extra step is run when execute method is called and sourceUploadUrl + field value is set in the body with the value returned by generateUploadUrl Cloud + Function API method. + + :param body: Body passed to the create/update method calls. + :type body: dict + :param zip_path: path to the zip file containing source code. + :type body: dict + + """ + upload_function = None + + def __init__(self, body, zip_path): + self.body = body + self.zip_path = zip_path + + @staticmethod + def _is_present_and_empty(dictionary, field): + return field in dictionary and not dictionary[field] + + def _verify_upload_url_and_no_zip_path(self): + if self._is_present_and_empty(self.body, SOURCE_UPLOAD_URL): + if not self.zip_path: + raise AirflowException( + "Parameter '{}' is empty in the body and argument '{}' " + "is missing or empty. You need to have non empty '{}' " + "when '{}' is present and empty.". + format(SOURCE_UPLOAD_URL, ZIP_PATH, ZIP_PATH, SOURCE_UPLOAD_URL)) + + def _verify_upload_url_and_zip_path(self): + if SOURCE_UPLOAD_URL in self.body and self.zip_path: + if not self.body[SOURCE_UPLOAD_URL]: + self.upload_function = True + else: + raise AirflowException("Only one of '{}' in body or '{}' argument " + "allowed. Found both." + .format(SOURCE_UPLOAD_URL, ZIP_PATH)) + + def _verify_archive_url_and_zip_path(self): + if SOURCE_ARCHIVE_URL in self.body and self.zip_path: + raise AirflowException("Only one of '{}' in body or '{}' argument " + "allowed. Found both." + .format(SOURCE_ARCHIVE_URL, ZIP_PATH)) + + def should_upload_function(self): + if self.upload_function is None: + raise AirflowException('validate() method has to be invoked before ' + 'should_upload_function') + return self.upload_function + + def preprocess_body(self): + self._verify_archive_url_and_zip_path() + self._verify_upload_url_and_zip_path() + self._verify_upload_url_and_no_zip_path() + if self.upload_function is None: + self.upload_function = False + + +FUNCTION_NAME_PATTERN = '^projects/[^/]+/locations/[^/]+/functions/[^/]+$' +FUNCTION_NAME_COMPILED_PATTERN = re.compile(FUNCTION_NAME_PATTERN) + + +class GcfFunctionDeleteOperator(BaseOperator): + """ + Delete a function with specified name from Google Cloud Functions. + + :param name: A fully-qualified function name, matching + the pattern: `^projects/[^/]+/locations/[^/]+/functions/[^/]+$` + :type name: str + :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. + :type gcp_conn_id: str + :param api_version: Version of the API used (for example v1). + :type api_version: str + """ + + @apply_defaults + def __init__(self, + name, + gcp_conn_id='google_cloud_default', + api_version='v1', + *args, **kwargs): + self.name = name + self.gcp_conn_id = gcp_conn_id + self.api_version = api_version + self._validate_inputs() + self.hook = GcfHook(gcp_conn_id=self.gcp_conn_id, api_version=self.api_version) + super(GcfFunctionDeleteOperator, self).__init__(*args, **kwargs) + + def _validate_inputs(self): + if not self.name: + raise AttributeError('Empty parameter: name') + else: + pattern = FUNCTION_NAME_COMPILED_PATTERN + if not pattern.match(self.name): + raise AttributeError( + 'Parameter name must match pattern: {}'.format(FUNCTION_NAME_PATTERN)) + + def execute(self, context): + try: + return self.hook.delete_function(self.name) + except HttpError as e: + status = e.resp.status + if status == 404: + self.log.info('The function does not exist in this project') + else: + self.log.error('An error occurred. Exiting.') + raise e diff --git a/airflow/contrib/operators/gcs_download_operator.py b/airflow/contrib/operators/gcs_download_operator.py index ce272aedd501c..1d168d4660722 100644 --- a/airflow/contrib/operators/gcs_download_operator.py +++ b/airflow/contrib/operators/gcs_download_operator.py @@ -29,26 +29,26 @@ class GoogleCloudStorageDownloadOperator(BaseOperator): Downloads a file from Google Cloud Storage. :param bucket: The Google cloud storage bucket where the object is. (templated) - :type bucket: string + :type bucket: str :param object: The name of the object to download in the Google cloud storage bucket. (templated) - :type object: string + :type object: str :param filename: The file path on the local file system (where the operator is being executed) that the file should be downloaded to. (templated) If no filename passed, the downloaded data will not be stored on the local file system. - :type filename: string + :type filename: str :param store_to_xcom_key: If this param is set, the operator will push the contents of the downloaded file to XCom with the key set in this parameter. If not set, the downloaded data will not be pushed to XCom. (templated) - :type store_to_xcom_key: string + :type store_to_xcom_key: str :param google_cloud_storage_conn_id: The connection ID to use when connecting to Google cloud storage. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ template_fields = ('bucket', 'object', 'filename', 'store_to_xcom_key',) ui_color = '#f0eee4' diff --git a/airflow/contrib/operators/gcs_list_operator.py b/airflow/contrib/operators/gcs_list_operator.py index 6474453afabec..7b37b269a6035 100644 --- a/airflow/contrib/operators/gcs_list_operator.py +++ b/airflow/contrib/operators/gcs_list_operator.py @@ -30,21 +30,21 @@ class GoogleCloudStorageListOperator(BaseOperator): `xcom` in the downstream task. :param bucket: The Google cloud storage bucket to find the objects. (templated) - :type bucket: string + :type bucket: str :param prefix: Prefix string which filters objects whose name begin with this prefix. (templated) - :type prefix: string + :type prefix: str :param delimiter: The delimiter by which you want to filter the objects. (templated) For e.g to lists the CSV files from in a directory in GCS you would use delimiter='.csv'. - :type delimiter: string + :type delimiter: str :param google_cloud_storage_conn_id: The connection ID to use when connecting to Google cloud storage. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str **Example**: The following Operator would list all the Avro files from ``sales/sales-2017`` diff --git a/airflow/contrib/operators/gcs_operator.py b/airflow/contrib/operators/gcs_operator.py index ef5e8de5043f3..c685722185fa3 100644 --- a/airflow/contrib/operators/gcs_operator.py +++ b/airflow/contrib/operators/gcs_operator.py @@ -33,7 +33,7 @@ class GoogleCloudStorageCreateBucketOperator(BaseOperator): https://cloud.google.com/storage/docs/bucketnaming.html#requirements :param bucket_name: The name of the bucket. (templated) - :type bucket_name: string + :type bucket_name: str :param storage_class: This defines how objects in the bucket are stored and determines the SLA and the cost of storage (templated). Values include @@ -44,7 +44,7 @@ class GoogleCloudStorageCreateBucketOperator(BaseOperator): - ``COLDLINE``. If this value is not specified when the bucket is created, it will default to STANDARD. - :type storage_class: string + :type storage_class: str :param location: The location of the bucket. (templated) Object data for objects in the bucket resides in physical storage within this region. Defaults to US. @@ -52,18 +52,18 @@ class GoogleCloudStorageCreateBucketOperator(BaseOperator): .. seealso:: https://developers.google.com/storage/docs/bucket-locations - :type location: string + :type location: str :param project_id: The ID of the GCP Project. (templated) - :type project_id: string + :type project_id: str :param labels: User-provided labels, in key/value pairs. :type labels: dict :param google_cloud_storage_conn_id: The connection ID to use when connecting to Google cloud storage. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str **Example**: The following Operator would create a new bucket ``test-bucket`` diff --git a/airflow/contrib/operators/gcs_to_bq.py b/airflow/contrib/operators/gcs_to_bq.py index fb27e8f205661..39dff216061b1 100644 --- a/airflow/contrib/operators/gcs_to_bq.py +++ b/airflow/contrib/operators/gcs_to_bq.py @@ -35,42 +35,42 @@ class GoogleCloudStorageToBigQueryOperator(BaseOperator): Google cloud storage must be a JSON file with the schema fields in it. :param bucket: The bucket to load from. (templated) - :type bucket: string + :type bucket: str :param source_objects: List of Google cloud storage URIs to load from. (templated) If source_format is 'DATASTORE_BACKUP', the list must only contain a single URI. - :type object: list + :type source_objects: list of str :param destination_project_dataset_table: The dotted (.).
BigQuery table to load data into. If is not included, project will be the project defined in the connection json. (templated) - :type destination_project_dataset_table: string + :type destination_project_dataset_table: str :param schema_fields: If set, the schema field list as defined here: https://cloud.google.com/bigquery/docs/reference/v2/jobs#configuration.load Should not be set when source_format is 'DATASTORE_BACKUP'. :type schema_fields: list :param schema_object: If set, a GCS object path pointing to a .json file that contains the schema for the table. (templated) - :param schema_object: string + :type schema_object: str :param source_format: File format to export. - :type source_format: string + :type source_format: str :param compression: [Optional] The compression type of the data source. Possible values include GZIP and NONE. The default value is NONE. This setting is ignored for Google Cloud Bigtable, Google Cloud Datastore backups and Avro formats. - :type compression: string + :type compression: str :param create_disposition: The create disposition if the table doesn't exist. - :type create_disposition: string + :type create_disposition: str :param skip_leading_rows: Number of rows to skip when loading from a CSV. :type skip_leading_rows: int :param write_disposition: The write disposition if the table already exists. - :type write_disposition: string + :type write_disposition: str :param field_delimiter: The delimiter to use when loading from a CSV. - :type field_delimiter: string + :type field_delimiter: str :param max_bad_records: The maximum number of bad records that BigQuery can ignore when running the job. :type max_bad_records: int :param quote_character: The value that is used to quote data sections in a CSV file. - :type quote_character: string + :type quote_character: str :param ignore_unknown_values: [Optional] Indicates if BigQuery should allow extra values that are not represented in the table schema. If true, the extra values are ignored. If false, records with extra columns @@ -78,7 +78,7 @@ class GoogleCloudStorageToBigQueryOperator(BaseOperator): invalid error is returned in the job result. :type ignore_unknown_values: bool :param allow_quoted_newlines: Whether to allow quoted newlines (true) or not (false). - :type allow_quoted_newlines: boolean + :type allow_quoted_newlines: bool :param allow_jagged_rows: Accept rows that are missing trailing optional columns. The missing values are treated as nulls. If false, records with missing trailing columns are treated as bad records, and if there are too many bad records, an @@ -91,16 +91,16 @@ class GoogleCloudStorageToBigQueryOperator(BaseOperator): execute() command, which in turn gets stored in XCom for future operators to use. This can be helpful with incremental loads--during future executions, you can pick up from the max ID. - :type max_id_key: string + :type max_id_key: str :param bigquery_conn_id: Reference to a specific BigQuery hook. - :type bigquery_conn_id: string + :type bigquery_conn_id: str :param google_cloud_storage_conn_id: Reference to a specific Google cloud storage hook. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param schema_update_options: Allows the schema of the destination table to be updated as a side effect of the load job. :type schema_update_options: list @@ -114,6 +114,11 @@ class GoogleCloudStorageToBigQueryOperator(BaseOperator): Note that 'field' is not available in concurrency with dataset.table$partition. :type time_partitioning: dict + :param cluster_fields: Request that the result of this load be stored sorted + by one or more columns. This is only available in conjunction with + time_partitioning. The order of columns given determines the sort order. + Not applicable for external tables. + :type cluster_fields: list of str """ template_fields = ('bucket', 'source_objects', 'schema_object', 'destination_project_dataset_table') @@ -146,6 +151,7 @@ def __init__(self, src_fmt_configs=None, external_table=False, time_partitioning=None, + cluster_fields=None, *args, **kwargs): super(GoogleCloudStorageToBigQueryOperator, self).__init__(*args, **kwargs) @@ -183,6 +189,7 @@ def __init__(self, self.schema_update_options = schema_update_options self.src_fmt_configs = src_fmt_configs self.time_partitioning = time_partitioning + self.cluster_fields = cluster_fields def execute(self, context): bq_hook = BigQueryHook(bigquery_conn_id=self.bigquery_conn_id, @@ -238,7 +245,8 @@ def execute(self, context): allow_jagged_rows=self.allow_jagged_rows, schema_update_options=self.schema_update_options, src_fmt_configs=self.src_fmt_configs, - time_partitioning=self.time_partitioning) + time_partitioning=self.time_partitioning, + cluster_fields=self.cluster_fields) if self.max_id_key: cursor.execute('SELECT MAX({}) FROM {}'.format( diff --git a/airflow/contrib/operators/gcs_to_gcs.py b/airflow/contrib/operators/gcs_to_gcs.py index 256685f90b2e1..12fbff5276e4c 100644 --- a/airflow/contrib/operators/gcs_to_gcs.py +++ b/airflow/contrib/operators/gcs_to_gcs.py @@ -28,7 +28,7 @@ class GoogleCloudStorageToGoogleCloudStorageOperator(BaseOperator): :param source_bucket: The source Google cloud storage bucket where the object is. (templated) - :type source_bucket: string + :type source_bucket: str :param source_object: The source name of the object to copy in the Google cloud storage bucket. (templated) If wildcards are used in this argument: @@ -36,33 +36,32 @@ class GoogleCloudStorageToGoogleCloudStorageOperator(BaseOperator): bucket. The wildcard can appear inside the object name or at the end of the object name. Appending a wildcard to the bucket name is unsupported. - :type source_object: string + :type source_object: str :param destination_bucket: The destination Google cloud storage bucket - where the object should be. (templated) - :type destination_bucket: string + where the object should be. (templated) + :type destination_bucket: str :param destination_object: The destination name of the object in the destination Google cloud storage bucket. (templated) If a wildcard is supplied in the source_object argument, this is the prefix that will be prepended to the final destination objects' paths. Note that the source path's part before the wildcard will be removed; if it needs to be retained it should be appended to destination_object. - For example, with prefix ``foo/*`` and destination_object `'blah/``, the + For example, with prefix ``foo/*`` and destination_object ``blah/``, the file ``foo/baz`` will be copied to ``blah/baz``; to retain the prefix write the destination_object as e.g. ``blah/foo``, in which case the copied file will be named ``blah/foo/baz``. - :type destination_object: string + :type destination_object: str :param move_object: When move object is True, the object is moved instead - of copied to the new location. - This is the equivalent of a mv command as opposed to a - cp command. + of copied to the new location. This is the equivalent of a mv command + as opposed to a cp command. :type move_object: bool :param google_cloud_storage_conn_id: The connection ID to use when connecting to Google cloud storage. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str **Examples**: The following Operator would copy a single file named diff --git a/airflow/contrib/operators/gcs_to_s3.py b/airflow/contrib/operators/gcs_to_s3.py index a87aa3af5c531..d8b180c81a939 100644 --- a/airflow/contrib/operators/gcs_to_s3.py +++ b/airflow/contrib/operators/gcs_to_s3.py @@ -28,25 +28,35 @@ class GoogleCloudStorageToS3Operator(GoogleCloudStorageListOperator): Synchronizes a Google Cloud Storage bucket with an S3 bucket. :param bucket: The Google Cloud Storage bucket to find the objects. (templated) - :type bucket: string + :type bucket: str :param prefix: Prefix string which filters objects whose name begin with this prefix. (templated) - :type prefix: string + :type prefix: str :param delimiter: The delimiter by which you want to filter the objects. (templated) For e.g to lists the CSV files from in a directory in GCS you would use delimiter='.csv'. - :type delimiter: string + :type delimiter: str :param google_cloud_storage_conn_id: The connection ID to use when connecting to Google Cloud Storage. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param dest_aws_conn_id: The destination S3 connection :type dest_aws_conn_id: str :param dest_s3_key: The base S3 key to be used to store the files. (templated) :type dest_s3_key: str + :parame dest_verify: Whether or not to verify SSL certificates for S3 connection. + By default SSL certificates are verified. + You can provide the following values: + - False: do not validate SSL certificates. SSL will still be used + (unless use_ssl is False), but SSL certificates will not be + verified. + - path/to/cert/bundle.pem: A filename of the CA cert bundle to uses. + You can specify this argument if you want to use a different + CA cert bundle than the one used by botocore. + :type dest_verify: bool or str """ template_fields = ('bucket', 'prefix', 'delimiter', 'dest_s3_key') ui_color = '#f0eee4' @@ -60,6 +70,7 @@ def __init__(self, delegate_to=None, dest_aws_conn_id=None, dest_s3_key=None, + dest_verify=None, replace=False, *args, **kwargs): @@ -75,12 +86,13 @@ def __init__(self, ) self.dest_aws_conn_id = dest_aws_conn_id self.dest_s3_key = dest_s3_key + self.dest_verify = dest_verify self.replace = replace def execute(self, context): # use the super to list all files in an Google Cloud Storage bucket files = super(GoogleCloudStorageToS3Operator, self).execute(context) - s3_hook = S3Hook(aws_conn_id=self.dest_aws_conn_id) + s3_hook = S3Hook(aws_conn_id=self.dest_aws_conn_id, verify=self.dest_verify) if not self.replace: # if we are not replacing -> list all files in the S3 bucket diff --git a/airflow/contrib/operators/jenkins_job_trigger_operator.py b/airflow/contrib/operators/jenkins_job_trigger_operator.py index 37185f3e13f42..3e1aba0c1bb26 100644 --- a/airflow/contrib/operators/jenkins_job_trigger_operator.py +++ b/airflow/contrib/operators/jenkins_job_trigger_operator.py @@ -95,11 +95,11 @@ class JenkinsJobTriggerOperator(BaseOperator): version >= 0.4.15 to communicate with jenkins server. You'll also need to configure a Jenkins connection in the connections screen. :param jenkins_connection_id: The jenkins connection to use for this job - :type jenkins_connection_id: string + :type jenkins_connection_id: str :param job_name: The name of the job to trigger - :type job_name: string + :type job_name: str :param parameters: The parameters block to provide to jenkins. (templated) - :type parameters: string + :type parameters: str :param sleep_time: How long will the operator sleep between each status request for the job (min 1, default 10) :type sleep_time: int diff --git a/airflow/contrib/operators/kubernetes_pod_operator.py b/airflow/contrib/operators/kubernetes_pod_operator.py index fb905622d8a47..d3c396e668361 100644 --- a/airflow/contrib/operators/kubernetes_pod_operator.py +++ b/airflow/contrib/operators/kubernetes_pod_operator.py @@ -65,7 +65,7 @@ class KubernetesPodOperator(BaseOperator): :type in_cluster: bool :param cluster_context: context that points to kubernetes cluster. Ignored when in_cluster is True. If None, current-context is used. - :type cluster_context: string + :type cluster_context: str :param get_logs: get the stdout of the container as logs of the tasks :type get_logs: bool :param affinity: A dict containing a group of affinity scheduling rules @@ -102,6 +102,7 @@ def execute(self, context): labels=self.labels, ) + pod.service_account_name = self.service_account_name pod.secrets = self.secrets pod.envs = self.env_vars pod.image_pull_policy = self.image_pull_policy @@ -109,6 +110,7 @@ def execute(self, context): pod.resources = self.resources pod.affinity = self.affinity pod.node_selectors = self.node_selectors + pod.hostnetwork = self.hostnetwork launcher = pod_launcher.PodLauncher(kube_client=client, extract_xcom=self.xcom_push) @@ -116,6 +118,10 @@ def execute(self, context): pod, startup_timeout=self.startup_timeout_seconds, get_logs=self.get_logs) + + if self.is_delete_operator_pod: + launcher.delete_pod(pod) + if final_state != State.SUCCESS: raise AirflowException( 'Pod returned a failure: {state}'.format(state=final_state) @@ -148,6 +154,10 @@ def __init__(self, config_file=None, xcom_push=False, node_selectors=None, + image_pull_secrets=None, + service_account_name="default", + is_delete_operator_pod=False, + hostnetwork=False, *args, **kwargs): super(KubernetesPodOperator, self).__init__(*args, **kwargs) @@ -172,3 +182,7 @@ def __init__(self, self.xcom_push = xcom_push self.resources = resources or Resources() self.config_file = config_file + self.image_pull_secrets = image_pull_secrets + self.service_account_name = service_account_name + self.is_delete_operator_pod = is_delete_operator_pod + self.hostnetwork = hostnetwork diff --git a/airflow/contrib/operators/mlengine_operator.py b/airflow/contrib/operators/mlengine_operator.py index 8e75b3c608238..8091ceefff236 100644 --- a/airflow/contrib/operators/mlengine_operator.py +++ b/airflow/contrib/operators/mlengine_operator.py @@ -19,7 +19,7 @@ from airflow.contrib.hooks.gcp_mlengine_hook import MLEngineHook from airflow.exceptions import AirflowException -from airflow.operators import BaseOperator +from airflow.models import BaseOperator from airflow.utils.decorators import apply_defaults from airflow.utils.log.logging_mixin import LoggingMixin @@ -94,16 +94,16 @@ class MLEngineBatchPredictionOperator(BaseOperator): :param project_id: The Google Cloud project name where the prediction job is submitted. (templated) - :type project_id: string + :type project_id: str :param job_id: A unique id for the prediction job on Google Cloud ML Engine. (templated) - :type job_id: string + :type job_id: str :param data_format: The format of the input data. It will default to 'DATA_FORMAT_UNSPECIFIED' if is not provided or is not one of ["TEXT", "TF_RECORD", "TF_RECORD_GZIP"]. - :type data_format: string + :type data_format: str :param input_paths: A list of GCS paths of input data for batch prediction. Accepting wildcard operator *, but only at the end. (templated) @@ -111,28 +111,28 @@ class MLEngineBatchPredictionOperator(BaseOperator): :param output_path: The GCS path where the prediction results are written to. (templated) - :type output_path: string + :type output_path: str :param region: The Google Compute Engine region to run the prediction job in. (templated) - :type region: string + :type region: str :param model_name: The Google Cloud ML Engine model to use for prediction. If version_name is not provided, the default version of this model will be used. Should not be None if version_name is provided. Should be None if uri is provided. (templated) - :type model_name: string + :type model_name: str :param version_name: The Google Cloud ML Engine model version to use for prediction. Should be None if uri is provided. (templated) - :type version_name: string + :type version_name: str :param uri: The GCS path of the saved model to use for prediction. Should be None if model_name is provided. It should be a GCS path pointing to a tensorflow SavedModel. (templated) - :type uri: string + :type uri: str :param max_worker_count: The maximum number of workers to be used for parallel processing. Defaults to 10 if not specified. @@ -140,16 +140,16 @@ class MLEngineBatchPredictionOperator(BaseOperator): :param runtime_version: The Google Cloud ML Engine runtime version to use for batch prediction. - :type runtime_version: string + :type runtime_version: str :param gcp_conn_id: The connection ID used for connection to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have doamin-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str Raises: ``ValueError``: if a unique model/version origin cannot be determined. @@ -281,8 +281,7 @@ class MLEngineModelOperator(BaseOperator): :param project_id: The Google Cloud project name to which MLEngine model belongs. (templated) - :type project_id: string - + :type project_id: str :param model: A dictionary containing the information about the model. If the `operation` is `create`, then the `model` parameter should contain all the information about this model such as `name`. @@ -290,19 +289,17 @@ class MLEngineModelOperator(BaseOperator): If the `operation` is `get`, the `model` parameter should contain the `name` of the model. :type model: dict - :param operation: The operation to perform. Available operations are: * ``create``: Creates a new model as provided by the `model` parameter. * ``get``: Gets a particular model where the name is specified in `model`. - + :type operation: str :param gcp_conn_id: The connection ID to use when fetching connection info. - :type gcp_conn_id: string - + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ template_fields = [ @@ -342,17 +339,17 @@ class MLEngineVersionOperator(BaseOperator): :param project_id: The Google Cloud project name to which MLEngine model belongs. - :type project_id: string + :type project_id: str :param model_name: The name of the Google Cloud ML Engine model that the version belongs to. (templated) - :type model_name: string + :type model_name: str :param version_name: A name to use for the version being operated upon. If not None and the `version` argument is None or does not have a value for the `name` key, then this will be populated in the payload for the `name` key. (templated) - :type version_name: string + :type version_name: str :param version: A dictionary containing the information about the version. If the `operation` is `create`, `version` should contain all the @@ -381,15 +378,15 @@ class MLEngineVersionOperator(BaseOperator): model specified by `model_name`). The name of the version should be specified in the `version` parameter. - :type operation: string + :type operation: str :param gcp_conn_id: The connection ID to use when fetching connection info. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ template_fields = [ @@ -450,56 +447,56 @@ class MLEngineTrainingOperator(BaseOperator): :param project_id: The Google Cloud project name within which MLEngine training job should run (templated). - :type project_id: string + :type project_id: str :param job_id: A unique templated id for the submitted Google MLEngine training job. (templated) - :type job_id: string + :type job_id: str :param package_uris: A list of package locations for MLEngine training job, which should include the main training program + any additional dependencies. (templated) - :type package_uris: string + :type package_uris: str :param training_python_module: The Python module name to run within MLEngine training job after installing 'package_uris' packages. (templated) - :type training_python_module: string + :type training_python_module: str :param training_args: A list of templated command line arguments to pass to the MLEngine training program. (templated) - :type training_args: string + :type training_args: str :param region: The Google Compute Engine region to run the MLEngine training job in (templated). - :type region: string + :type region: str :param scale_tier: Resource tier for MLEngine training job. (templated) - :type scale_tier: string + :type scale_tier: str :param runtime_version: The Google Cloud ML runtime version to use for training. (templated) - :type runtime_version: string + :type runtime_version: str :param python_version: The version of Python used in training. (templated) - :type python_version: string + :type python_version: str :param job_dir: A Google Cloud Storage path in which to store training outputs and other data needed for training. (templated) - :type job_dir: string + :type job_dir: str :param gcp_conn_id: The connection ID to use when fetching connection info. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param mode: Can be one of 'DRY_RUN'/'CLOUD'. In 'DRY_RUN' mode, no real training job will be launched, but the MLEngine training job request will be printed out. In 'CLOUD' mode, a real MLEngine training job creation request will be issued. - :type mode: string + :type mode: str """ template_fields = [ diff --git a/airflow/contrib/operators/mlengine_operator_utils.py b/airflow/contrib/operators/mlengine_operator_utils.py index 60001daea4d0f..c2951b715d337 100644 --- a/airflow/contrib/operators/mlengine_operator_utils.py +++ b/airflow/contrib/operators/mlengine_operator_utils.py @@ -108,16 +108,16 @@ def validate_err_and_count(summary): :param task_prefix: a prefix for the tasks. Only alphanumeric characters and hyphen are allowed (no underscores), since this will be used as dataflow job name, which doesn't allow other characters. - :type task_prefix: string + :type task_prefix: str :param data_format: either of 'TEXT', 'TF_RECORD', 'TF_RECORD_GZIP' - :type data_format: string + :type data_format: str :param input_paths: a list of input paths to be sent to BatchPrediction. :type input_paths: list of strings :param prediction_path: GCS path to put the prediction results in. - :type prediction_path: string + :type prediction_path: str :param metric_fn_and_keys: a tuple of metric_fn and metric_keys: - metric_fn is a function that accepts a dictionary (for an instance), @@ -132,17 +132,17 @@ def validate_err_and_count(summary): :param batch_prediction_job_id: the id to use for the Cloud ML Batch prediction job. Passed directly to the MLEngineBatchPredictionOperator as the job_id argument. - :type batch_prediction_job_id: string + :type batch_prediction_job_id: str :param project_id: the Google Cloud Platform project id in which to execute Cloud ML Batch Prediction and Dataflow jobs. If None, then the `dag`'s `default_args['project_id']` will be used. - :type project_id: string + :type project_id: str :param region: the Google Cloud Platform region in which to execute Cloud ML Batch Prediction and Dataflow jobs. If None, then the `dag`'s `default_args['region']` will be used. - :type region: string + :type region: str :param dataflow_options: options to run Dataflow jobs. If None, then the `dag`'s `default_args['dataflow_default_options']` will be used. @@ -152,19 +152,19 @@ def validate_err_and_count(summary): tensorflow.estimator.export_savedmodel(). It cannot be used with model_name or version_name below. See MLEngineBatchPredictionOperator for more detail. - :type model_uri: string + :type model_uri: str :param model_name: Used to indicate a model to use for prediction. Can be used in combination with version_name, but cannot be used together with model_uri. See MLEngineBatchPredictionOperator for more detail. If None, then the `dag`'s `default_args['model_name']` will be used. - :type model_name: string + :type model_name: str :param version_name: Used to indicate a model version to use for prediction, in combination with model_name. Cannot be used together with model_uri. See MLEngineBatchPredictionOperator for more detail. If None, then the `dag`'s `default_args['version_name']` will be used. - :type version_name: string + :type version_name: str :param dag: The `DAG` to use for all Operators. :type dag: airflow.DAG diff --git a/airflow/contrib/operators/mysql_to_gcs.py b/airflow/contrib/operators/mysql_to_gcs.py index eb47465e8e8ec..d9fc932ff58dd 100644 --- a/airflow/contrib/operators/mysql_to_gcs.py +++ b/airflow/contrib/operators/mysql_to_gcs.py @@ -58,18 +58,18 @@ def __init__(self, **kwargs): """ :param sql: The SQL to execute on the MySQL table. - :type sql: string + :type sql: str :param bucket: The bucket to upload to. - :type bucket: string + :type bucket: str :param filename: The filename to use as the object name when uploading to Google cloud storage. A {} should be specified in the filename to allow the operator to inject file numbers in cases where the file is split due to size. - :type filename: string + :type filename: str :param schema_filename: If set, the filename to use as the object name when uploading a .json file containing the BigQuery schema fields for the table that was dumped from MySQL. - :type schema_filename: string + :type schema_filename: str :param approx_max_file_size_bytes: This operator supports the ability to split large table dumps into multiple files (see notes in the filenamed param docs above). Google cloud storage allows for files @@ -77,10 +77,10 @@ def __init__(self, file size of the splits. :type approx_max_file_size_bytes: long :param mysql_conn_id: Reference to a specific MySQL hook. - :type mysql_conn_id: string + :type mysql_conn_id: str :param google_cloud_storage_conn_id: Reference to a specific Google cloud storage hook. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param schema: The schema to use, if any. Should be a list of dict or a str. Pass a string if using Jinja template, otherwise, pass a list of dict. Examples could be seen: https://cloud.google.com/bigquery/docs diff --git a/airflow/contrib/operators/postgres_to_gcs_operator.py b/airflow/contrib/operators/postgres_to_gcs_operator.py index 88b4d00e39790..78da78ee2f20d 100644 --- a/airflow/contrib/operators/postgres_to_gcs_operator.py +++ b/airflow/contrib/operators/postgres_to_gcs_operator.py @@ -56,18 +56,18 @@ def __init__(self, **kwargs): """ :param sql: The SQL to execute on the Postgres table. - :type sql: string + :type sql: str :param bucket: The bucket to upload to. - :type bucket: string + :type bucket: str :param filename: The filename to use as the object name when uploading to Google Cloud Storage. A {} should be specified in the filename to allow the operator to inject file numbers in cases where the file is split due to size. - :type filename: string + :type filename: str :param schema_filename: If set, the filename to use as the object name when uploading a .json file containing the BigQuery schema fields for the table that was dumped from Postgres. - :type schema_filename: string + :type schema_filename: str :param approx_max_file_size_bytes: This operator supports the ability to split large table dumps into multiple files (see notes in the filenamed param docs above). Google Cloud Storage allows for files @@ -75,10 +75,10 @@ def __init__(self, file size of the splits. :type approx_max_file_size_bytes: long :param postgres_conn_id: Reference to a specific Postgres hook. - :type postgres_conn_id: string + :type postgres_conn_id: str :param google_cloud_storage_conn_id: Reference to a specific Google cloud storage hook. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. @@ -133,28 +133,38 @@ def _write_local_data_files(self, cursor): contain the data for the GCS objects. """ schema = list(map(lambda schema_tuple: schema_tuple[0], cursor.description)) - file_no = 0 - tmp_file_handle = NamedTemporaryFile(delete=True) - tmp_file_handles = {self.filename.format(file_no): tmp_file_handle} - - for row in cursor: - # Convert datetime objects to utc seconds, and decimals to floats - row = map(self.convert_types, row) - row_dict = dict(zip(schema, row)) - - s = json.dumps(row_dict, sort_keys=True) - if PY3: - s = s.encode('utf-8') - tmp_file_handle.write(s) - - # Append newline to make dumps BigQuery compatible. - tmp_file_handle.write(b'\n') - - # Stop if the file exceeds the file size limit. - if tmp_file_handle.tell() >= self.approx_max_file_size_bytes: - file_no += 1 - tmp_file_handle = NamedTemporaryFile(delete=True) - tmp_file_handles[self.filename.format(file_no)] = tmp_file_handle + tmp_file_handles = {} + row_no = 0 + + def _create_new_file(): + handle = NamedTemporaryFile(delete=True) + filename = self.filename.format(len(tmp_file_handles)) + tmp_file_handles[filename] = handle + return handle + + # Don't create a file if there is nothing to write + if cursor.rowcount > 0: + tmp_file_handle = _create_new_file() + + for row in cursor: + # Convert datetime objects to utc seconds, and decimals to floats + row = map(self.convert_types, row) + row_dict = dict(zip(schema, row)) + + s = json.dumps(row_dict, sort_keys=True) + if PY3: + s = s.encode('utf-8') + tmp_file_handle.write(s) + + # Append newline to make dumps BigQuery compatible. + tmp_file_handle.write(b'\n') + + # Stop if the file exceeds the file size limit. + if tmp_file_handle.tell() >= self.approx_max_file_size_bytes: + tmp_file_handle = _create_new_file() + row_no += 1 + + self.log.info('Received %s rows over %s files', row_no, len(tmp_file_handles)) return tmp_file_handles diff --git a/airflow/contrib/operators/pubsub_operator.py b/airflow/contrib/operators/pubsub_operator.py index 2d55b19f8595d..e40828bf92151 100644 --- a/airflow/contrib/operators/pubsub_operator.py +++ b/airflow/contrib/operators/pubsub_operator.py @@ -67,19 +67,19 @@ def __init__( **kwargs): """ :param project: the GCP project ID where the topic will be created - :type project: string + :type project: str :param topic: the topic to create. Do not include the full topic path. In other words, instead of ``projects/{project}/topics/{topic}``, provide only ``{topic}``. (templated) - :type topic: string + :type topic: str :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ super(PubSubTopicCreateOperator, self).__init__(*args, **kwargs) @@ -163,28 +163,28 @@ def __init__( **kwargs): """ :param topic_project: the GCP project ID where the topic exists - :type topic_project: string + :type topic_project: str :param topic: the topic to create. Do not include the full topic path. In other words, instead of ``projects/{project}/topics/{topic}``, provide only ``{topic}``. (templated) - :type topic: string + :type topic: str :param subscription: the Pub/Sub subscription name. If empty, a random name will be generated using the uuid module - :type subscription: string + :type subscription: str :param subscription_project: the GCP project ID where the subscription will be created. If empty, ``topic_project`` will be used. - :type subscription_project: string + :type subscription_project: str :param ack_deadline_secs: Number of seconds that a subscriber has to acknowledge each message pulled from the subscription :type ack_deadline_secs: int :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ super(PubSubSubscriptionCreateOperator, self).__init__(*args, **kwargs) @@ -248,22 +248,22 @@ def __init__( **kwargs): """ :param project: the GCP project ID in which to work (templated) - :type project: string + :type project: str :param topic: the topic to delete. Do not include the full topic path. In other words, instead of ``projects/{project}/topics/{topic}``, provide only ``{topic}``. (templated) - :type topic: string + :type topic: str :param fail_if_not_exists: If True and the topic does not exist, fail the task :type fail_if_not_exists: bool :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ super(PubSubTopicDeleteOperator, self).__init__(*args, **kwargs) @@ -324,22 +324,22 @@ def __init__( **kwargs): """ :param project: the GCP project ID in which to work (templated) - :type project: string + :type project: str :param subscription: the subscription to delete. Do not include the full subscription path. In other words, instead of ``projects/{project}/subscription/{subscription}``, provide only ``{subscription}``. (templated) - :type subscription: string + :type subscription: str :param fail_if_not_exists: If True and the subscription does not exist, fail the task :type fail_if_not_exists: bool :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ super(PubSubSubscriptionDeleteOperator, self).__init__(*args, **kwargs) @@ -396,12 +396,12 @@ def __init__( **kwargs): """ :param project: the GCP project ID in which to work (templated) - :type project: string + :type project: str :param topic: the topic to which to publish. Do not include the full topic path. In other words, instead of ``projects/{project}/topics/{topic}``, provide only ``{topic}``. (templated) - :type topic: string + :type topic: str :param messages: a list of messages to be published to the topic. Each message is a dict with one or more of the following keys-value mappings: @@ -413,11 +413,11 @@ def __init__( :type messages: list :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ super(PubSubPublishOperator, self).__init__(*args, **kwargs) diff --git a/airflow/contrib/operators/qubole_check_operator.py b/airflow/contrib/operators/qubole_check_operator.py index 235af08ca753e..8b6b5d351cd86 100644 --- a/airflow/contrib/operators/qubole_check_operator.py +++ b/airflow/contrib/operators/qubole_check_operator.py @@ -215,11 +215,11 @@ def get_sql_from_qbol_cmd(params): def handle_airflow_exception(airflow_exception, hook): cmd = hook.cmd if cmd is not None: - if cmd.is_success: + if cmd.is_success(cmd.status): qubole_command_results = hook.get_query_results() qubole_command_id = cmd.id exception_message = '\nQubole Command Id: {qubole_command_id}' \ '\nQubole Command Results:' \ '\n{qubole_command_results}'.format(**locals()) raise AirflowException(str(airflow_exception) + exception_message) - raise AirflowException(airflow_exception.message) + raise AirflowException(str(airflow_exception)) diff --git a/airflow/contrib/operators/s3_copy_object_operator.py b/airflow/contrib/operators/s3_copy_object_operator.py new file mode 100644 index 0000000000000..330138ed27594 --- /dev/null +++ b/airflow/contrib/operators/s3_copy_object_operator.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +# +# 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. + +from airflow.hooks.S3_hook import S3Hook +from airflow.models import BaseOperator +from airflow.utils.decorators import apply_defaults + + +class S3CopyObjectOperator(BaseOperator): + """ + Creates a copy of an object that is already stored in S3. + + Note: the S3 connection used here needs to have access to both + source and destination bucket/key. + + :param source_bucket_key: The key of the source object. + + It can be either full s3:// style url or relative path from root level. + + When it's specified as a full s3:// url, please omit source_bucket_name. + :type source_bucket_key: str + :param dest_bucket_key: The key of the object to copy to. + + The convention to specify `dest_bucket_key` is the same as `source_bucket_key`. + :type dest_bucket_key: str + :param source_bucket_name: Name of the S3 bucket where the source object is in. + + It should be omitted when `source_bucket_key` is provided as a full s3:// url. + :type source_bucket_name: str + :param dest_bucket_name: Name of the S3 bucket to where the object is copied. + + It should be omitted when `dest_bucket_key` is provided as a full s3:// url. + :type dest_bucket_name: str + :param source_version_id: Version ID of the source object (OPTIONAL) + :type source_version_id: str + :param aws_conn_id: Connection id of the S3 connection to use + :type aws_conn_id: str + :param verify: Whether or not to verify SSL certificates for S3 connection. + By default SSL certificates are verified. + + You can provide the following values: + + - False: do not validate SSL certificates. SSL will still be used, + but SSL certificates will not be + verified. + - path/to/cert/bundle.pem: A filename of the CA cert bundle to uses. + You can specify this argument if you want to use a different + CA cert bundle than the one used by botocore. + :type verify: bool or str + """ + + @apply_defaults + def __init__( + self, + source_bucket_key, + dest_bucket_key, + source_bucket_name=None, + dest_bucket_name=None, + source_version_id=None, + aws_conn_id='aws_default', + verify=None, + *args, **kwargs): + super(S3CopyObjectOperator, self).__init__(*args, **kwargs) + + self.source_bucket_key = source_bucket_key + self.dest_bucket_key = dest_bucket_key + self.source_bucket_name = source_bucket_name + self.dest_bucket_name = dest_bucket_name + self.source_version_id = source_version_id + self.aws_conn_id = aws_conn_id + self.verify = verify + + def execute(self, context): + s3_hook = S3Hook(aws_conn_id=self.aws_conn_id, verify=self.verify) + s3_hook.copy_object(self.source_bucket_key, self.dest_bucket_key, + self.source_bucket_name, self.dest_bucket_name, + self.source_version_id) diff --git a/airflow/contrib/operators/s3_delete_objects_operator.py b/airflow/contrib/operators/s3_delete_objects_operator.py new file mode 100644 index 0000000000000..1aa1b3901e83f --- /dev/null +++ b/airflow/contrib/operators/s3_delete_objects_operator.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# +# 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. + +from airflow.exceptions import AirflowException +from airflow.hooks.S3_hook import S3Hook +from airflow.models import BaseOperator +from airflow.utils.decorators import apply_defaults + + +class S3DeleteObjectsOperator(BaseOperator): + """ + To enable users to delete single object or multiple objects from + a bucket using a single HTTP request. + + Users may specify up to 1000 keys to delete. + + :param bucket: Name of the bucket in which you are going to delete object(s) + :type bucket: str + :param keys: The key(s) to delete from S3 bucket. + + When ``keys`` is a string, it's supposed to be the key name of + the single object to delete. + + When ``keys`` is a list, it's supposed to be the list of the + keys to delete. + + You may specify up to 1000 keys. + :type keys: str or list + :param aws_conn_id: Connection id of the S3 connection to use + :type aws_conn_id: str + :param verify: Whether or not to verify SSL certificates for S3 connection. + By default SSL certificates are verified. + + You can provide the following values: + + - False: do not validate SSL certificates. SSL will still be used, + but SSL certificates will not be + verified. + - path/to/cert/bundle.pem: A filename of the CA cert bundle to uses. + You can specify this argument if you want to use a different + CA cert bundle than the one used by botocore. + :type verify: bool or str + """ + + @apply_defaults + def __init__( + self, + bucket, + keys, + aws_conn_id='aws_default', + verify=None, + *args, **kwargs): + super(S3DeleteObjectsOperator, self).__init__(*args, **kwargs) + self.bucket = bucket + self.keys = keys + self.aws_conn_id = aws_conn_id + self.verify = verify + + def execute(self, context): + s3_hook = S3Hook(aws_conn_id=self.aws_conn_id, verify=self.verify) + + response = s3_hook.delete_objects(bucket=self.bucket, keys=self.keys) + + deleted_keys = [x['Key'] for x in response.get("Deleted", [])] + self.log.info("Deleted: {}".format(deleted_keys)) + + if "Errors" in response: + errors_keys = [x['Key'] for x in response.get("Errors", [])] + raise AirflowException("Errors when deleting: {}".format(errors_keys)) diff --git a/airflow/contrib/operators/s3_list_operator.py b/airflow/contrib/operators/s3_list_operator.py index b85691b005fb9..3ca22d5932b75 100644 --- a/airflow/contrib/operators/s3_list_operator.py +++ b/airflow/contrib/operators/s3_list_operator.py @@ -30,14 +30,24 @@ class S3ListOperator(BaseOperator): used by `xcom` in the downstream task. :param bucket: The S3 bucket where to find the objects. (templated) - :type bucket: string + :type bucket: str :param prefix: Prefix string to filters the objects whose name begin with such prefix. (templated) - :type prefix: string + :type prefix: str :param delimiter: the delimiter marks key hierarchy. (templated) - :type delimiter: string + :type delimiter: str :param aws_conn_id: The connection ID to use when connecting to S3 storage. - :type aws_conn_id: string + :type aws_conn_id: str + :parame verify: Whether or not to verify SSL certificates for S3 connection. + By default SSL certificates are verified. + You can provide the following values: + - False: do not validate SSL certificates. SSL will still be used + (unless use_ssl is False), but SSL certificates will not be + verified. + - path/to/cert/bundle.pem: A filename of the CA cert bundle to uses. + You can specify this argument if you want to use a different + CA cert bundle than the one used by botocore. + :type verify: bool or str **Example**: The following operator would list all the files @@ -61,6 +71,7 @@ def __init__(self, prefix='', delimiter='', aws_conn_id='aws_default', + verify=None, *args, **kwargs): super(S3ListOperator, self).__init__(*args, **kwargs) @@ -68,9 +79,10 @@ def __init__(self, self.prefix = prefix self.delimiter = delimiter self.aws_conn_id = aws_conn_id + self.verify = verify def execute(self, context): - hook = S3Hook(aws_conn_id=self.aws_conn_id) + hook = S3Hook(aws_conn_id=self.aws_conn_id, verify=self.verify) self.log.info( 'Getting the list of files from bucket: {0} in prefix: {1} (Delimiter {2})'. diff --git a/airflow/contrib/operators/s3_to_gcs_operator.py b/airflow/contrib/operators/s3_to_gcs_operator.py index 64d7dc7cab976..5dd355a6fd331 100644 --- a/airflow/contrib/operators/s3_to_gcs_operator.py +++ b/airflow/contrib/operators/s3_to_gcs_operator.py @@ -33,31 +33,43 @@ class S3ToGoogleCloudStorageOperator(S3ListOperator): destination path. :param bucket: The S3 bucket where to find the objects. (templated) - :type bucket: string + :type bucket: str :param prefix: Prefix string which filters objects whose name begin with such prefix. (templated) - :type prefix: string + :type prefix: str :param delimiter: the delimiter marks key hierarchy. (templated) - :type delimiter: string + :type delimiter: str :param aws_conn_id: The source S3 connection - :type aws_conn_id: string + :type aws_conn_id: str + :parame verify: Whether or not to verify SSL certificates for S3 connection. + By default SSL certificates are verified. + You can provide the following values: + - False: do not validate SSL certificates. SSL will still be used + (unless use_ssl is False), but SSL certificates will not be + verified. + - path/to/cert/bundle.pem: A filename of the CA cert bundle to uses. + You can specify this argument if you want to use a different + CA cert bundle than the one used by botocore. + :type verify: bool or str :param dest_gcs_conn_id: The destination connection ID to use when connecting to Google Cloud Storage. - :type dest_gcs_conn_id: string + :type dest_gcs_conn_id: str :param dest_gcs: The destination Google Cloud Storage bucket and prefix where you want to store the files. (templated) - :type dest_gcs: string + :type dest_gcs: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str :param replace: Whether you want to replace existing destination files or not. :type replace: bool **Example**: + .. code-block:: python + s3_to_gcs_op = S3ToGoogleCloudStorageOperator( task_id='s3_to_gcs_example', bucket='my-s3-bucket', @@ -80,6 +92,7 @@ def __init__(self, prefix='', delimiter='', aws_conn_id='aws_default', + verify=None, dest_gcs_conn_id=None, dest_gcs=None, delegate_to=None, @@ -98,6 +111,7 @@ def __init__(self, self.dest_gcs = dest_gcs self.delegate_to = delegate_to self.replace = replace + self.verify = verify if dest_gcs and not self._gcs_object_is_directory(self.dest_gcs): self.log.info( @@ -146,7 +160,7 @@ def execute(self, context): 'There are no new files to sync. Have a nice day!') if files: - hook = S3Hook(aws_conn_id=self.aws_conn_id) + hook = S3Hook(aws_conn_id=self.aws_conn_id, verify=self.verify) for file in files: # GCS hook builds its own in-memory file so we have to create diff --git a/airflow/contrib/operators/s3_to_sftp_operator.py b/airflow/contrib/operators/s3_to_sftp_operator.py new file mode 100644 index 0000000000000..d31e935f477e0 --- /dev/null +++ b/airflow/contrib/operators/s3_to_sftp_operator.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# +# 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. + +from airflow.models import BaseOperator +from airflow.hooks.S3_hook import S3Hook +from airflow.contrib.hooks.ssh_hook import SSHHook +from tempfile import NamedTemporaryFile +from urllib.parse import urlparse +from airflow.utils.decorators import apply_defaults + + +def get_s3_key(s3_key): + """This parses the correct format for S3 keys + regardless of how the S3 url is passed.""" + + parsed_s3_key = urlparse(s3_key) + return parsed_s3_key.path.lstrip('/') + + +class S3ToSFTPOperator(BaseOperator): + """ + This operator enables the transferring of files from S3 to a SFTP server + :param sftp_conn_id: The sftp connection id. The name or + identifier for establishing a connection to the SFTP server. + :type sftp_conn_id: string + :param sftp_path: The sftp remote path. This is the specified + file path for uploading file to the SFTP server. + :type sftp_path: string + :param s3_conn_id: The s3 connnection id. The name or identifier for establishing + a connection to S3 + :type s3_conn_id: string + :param s3_bucket: The targeted s3 bucket. This is the S3 bucket + from where the file is downloaded. + :type s3_bucket: string + :param s3_key: The targeted s3 key. This is the specified file path + for downloading the file from S3. + :type s3_key: string + """ + + template_fields = ('s3_key', 'sftp_path') + + @apply_defaults + def __init__(self, + s3_bucket, + s3_key, + sftp_path, + sftp_conn_id='ssh_default', + s3_conn_id='aws_default', + *args, + **kwargs): + super(S3ToSFTPOperator, self).__init__(*args, **kwargs) + self.sftp_conn_id = sftp_conn_id + self.sftp_path = sftp_path + self.s3_bucket = s3_bucket + self.s3_key = s3_key + self.s3_conn_id = s3_conn_id + + def execute(self, context): + self.s3_key = get_s3_key(self.s3_key) + ssh_hook = SSHHook(ssh_conn_id=self.sftp_conn_id) + s3_hook = S3Hook(self.s3_conn_id) + + s3_client = s3_hook.get_conn() + ssh_client = ssh_hook.get_conn() + sftp_client = ssh_client.open_sftp() + + with NamedTemporaryFile("w") as f: + s3_client.download_file(self.s3_bucket, self.s3_key, f.name) + sftp_client.put(f.name, self.sftp_path) diff --git a/airflow/contrib/operators/sagemaker_create_training_job_operator.py b/airflow/contrib/operators/sagemaker_create_training_job_operator.py index 409c5f6aa936a..279220867956d 100644 --- a/airflow/contrib/operators/sagemaker_create_training_job_operator.py +++ b/airflow/contrib/operators/sagemaker_create_training_job_operator.py @@ -34,9 +34,9 @@ class SageMakerCreateTrainingJobOperator(BaseOperator): The configuration necessary to start a training job (templated) :type training_job_config: dict :param region_name: The AWS region_name - :type region_name: string + :type region_name: str :param sagemaker_conn_id: The SageMaker connection ID to use. - :type sagemaker_conn_id: string + :type sagemaker_conn_id: str :param use_db_config: Whether or not to use db config associated with sagemaker_conn_id. If set to true, will automatically update the training config @@ -45,12 +45,12 @@ class SageMakerCreateTrainingJobOperator(BaseOperator): in the training_job_config, so be careful :type use_db_config: bool :param aws_conn_id: The AWS connection ID to use. - :type aws_conn_id: string + :type aws_conn_id: str :param wait_for_completion: if the operator should block until training job finishes :type wait_for_completion: bool :param check_interval: if wait is set to be true, this is the time interval - which the operator will check the status of the training job + in seconds which the operator will check the status of the training job :type check_interval: int :param max_ingestion_time: if wait is set to be true, the operator will fail if the training job hasn't finish within the max_ingestion_time diff --git a/airflow/contrib/operators/sagemaker_create_transform_job_operator.py b/airflow/contrib/operators/sagemaker_create_transform_job_operator.py new file mode 100644 index 0000000000000..22c8c2b4ba297 --- /dev/null +++ b/airflow/contrib/operators/sagemaker_create_transform_job_operator.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- +# +# 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. + +from airflow.contrib.hooks.sagemaker_hook import SageMakerHook +from airflow.models import BaseOperator +from airflow.utils.decorators import apply_defaults +from airflow.exceptions import AirflowException + + +class SageMakerCreateTransformJobOperator(BaseOperator): + """ + Initiate a SageMaker transform + + This operator returns The ARN of the model created in Amazon SageMaker + + :param sagemaker_conn_id: The SageMaker connection ID to use. + :type sagemaker_conn_id: string + :param transform_job_config: + The configuration necessary to start a transform job (templated) + :type transform_job_config: dict + :param model_config: + The configuration necessary to create a model, the default is none + which means that user should provide a created model in transform_job_config + If given, will be used to create a model before creating transform job + :type model_config: dict + :param use_db_config: Whether or not to use db config + associated with sagemaker_conn_id. + If set to true, will automatically update the transform config + with what's in db, so the db config doesn't need to + included everything, but what's there does replace the ones + in the transform_job_config, so be careful + :type use_db_config: bool + :param region_name: The AWS region_name + :type region_name: string + :param wait_for_completion: if the program should keep running until job finishes + :type wait_for_completion: bool + :param check_interval: if wait is set to be true, this is the time interval + in seconds which the operator will check the status of the transform job + :type check_interval: int + :param max_ingestion_time: if wait is set to be true, the operator will fail + if the transform job hasn't finish within the max_ingestion_time + (Caution: be careful to set this parameters because transform can take very long) + :type max_ingestion_time: int + :param aws_conn_id: The AWS connection ID to use. + :type aws_conn_id: string + + **Example**: + The following operator would start a transform job when executed + + sagemaker_transform = + SageMakerCreateTransformJobOperator( + task_id='sagemaker_transform', + transform_job_config=config_transform, + model_config=config_model, + region_name='us-west-2' + sagemaker_conn_id='sagemaker_customers_conn', + use_db_config=True, + aws_conn_id='aws_customers_conn' + ) + """ + + template_fields = ['transform_job_config'] + template_ext = () + ui_color = '#ededed' + + @apply_defaults + def __init__(self, + sagemaker_conn_id=None, + transform_job_config=None, + model_config=None, + use_db_config=False, + region_name=None, + wait_for_completion=True, + check_interval=2, + max_ingestion_time=None, + *args, **kwargs): + super(SageMakerCreateTransformJobOperator, self).__init__(*args, **kwargs) + + self.sagemaker_conn_id = sagemaker_conn_id + self.transform_job_config = transform_job_config + self.model_config = model_config + self.use_db_config = use_db_config + self.region_name = region_name + self.wait_for_completion = wait_for_completion + self.check_interval = check_interval + self.max_ingestion_time = max_ingestion_time + + def execute(self, context): + sagemaker = SageMakerHook( + sagemaker_conn_id=self.sagemaker_conn_id, + use_db_config=self.use_db_config, + region_name=self.region_name, + check_interval=self.check_interval, + max_ingestion_time=self.max_ingestion_time + ) + + if self.model_config: + self.log.info( + "Creating SageMaker Model %s for transform job" + % self.model_config['ModelName'] + ) + sagemaker.create_model(self.model_config) + + self.log.info( + "Creating SageMaker transform Job %s." + % self.transform_job_config['TransformJobName'] + ) + response = sagemaker.create_transform_job( + self.transform_job_config, + wait_for_completion=self.wait_for_completion) + if not response['ResponseMetadata']['HTTPStatusCode'] \ + == 200: + raise AirflowException( + 'Sagemaker transform Job creation failed: %s' % response) + else: + return response diff --git a/airflow/contrib/operators/sagemaker_create_tuning_job_operator.py b/airflow/contrib/operators/sagemaker_create_tuning_job_operator.py index 0c40a9adc93f4..d5f4396375993 100644 --- a/airflow/contrib/operators/sagemaker_create_tuning_job_operator.py +++ b/airflow/contrib/operators/sagemaker_create_tuning_job_operator.py @@ -31,9 +31,9 @@ class SageMakerCreateTuningJobOperator(BaseOperator): This operator returns The ARN of the model created in Amazon SageMaker :param sagemaker_conn_id: The SageMaker connection ID to use. - :type sagemaker_conn_id: string + :type sagemaker_conn_id: str :param region_name: The AWS region_name - :type region_name: string + :type region_name: str :param tuning_job_config: The configuration necessary to start a tuning job (templated) :type tuning_job_config: dict @@ -48,14 +48,14 @@ class SageMakerCreateTuningJobOperator(BaseOperator): until tuning job finishes :type wait_for_completion: bool :param check_interval: if wait is set to be true, this is the time interval - which the operator will check the status of the tuning job + in seconds which the operator will check the status of the tuning job :type check_interval: int :param max_ingestion_time: if wait is set to be true, the operator will fail if the tuning job hasn't finish within the max_ingestion_time (Caution: be careful to set this parameters because tuning can take very long) :type max_ingestion_time: int :param aws_conn_id: The AWS connection ID to use. - :type aws_conn_id: string + :type aws_conn_id: str **Example**: The following operator would start a tuning job when executed diff --git a/airflow/contrib/operators/segment_track_event_operator.py b/airflow/contrib/operators/segment_track_event_operator.py index 04f6ae6d41d4b..5d2f2db539083 100644 --- a/airflow/contrib/operators/segment_track_event_operator.py +++ b/airflow/contrib/operators/segment_track_event_operator.py @@ -27,16 +27,16 @@ class SegmentTrackEventOperator(BaseOperator): Send Track Event to Segment for a specified user_id and event :param user_id: The ID for this user in your database. (templated) - :type user_id: string + :type user_id: str :param event: The name of the event you're tracking. (templated) - :type event: string + :type event: str :param properties: A dictionary of properties for the event. (templated) :type properties: dict :param segment_conn_id: The connection ID to use when connecting to Segment. - :type segment_conn_id: string + :type segment_conn_id: str :param segment_debug_mode: Determines whether Segment should run in debug mode. Defaults to False - :type segment_debug_mode: boolean + :type segment_debug_mode: bool """ template_fields = ('user_id', 'event', 'properties') ui_color = '#ffd700' diff --git a/airflow/contrib/operators/sftp_operator.py b/airflow/contrib/operators/sftp_operator.py index 3c736c8b95101..a3b5c1f24492b 100644 --- a/airflow/contrib/operators/sftp_operator.py +++ b/airflow/contrib/operators/sftp_operator.py @@ -33,11 +33,15 @@ class SFTPOperator(BaseOperator): This operator uses ssh_hook to open sftp trasport channel that serve as basis for file transfer. - :param ssh_hook: predefined ssh_hook to use for remote execution + :param ssh_hook: predefined ssh_hook to use for remote execution. + Either `ssh_hook` or `ssh_conn_id` needs to be provided. :type ssh_hook: :class:`SSHHook` - :param ssh_conn_id: connection id from airflow Connections + :param ssh_conn_id: connection id from airflow Connections. + `ssh_conn_id` will be ingored if `ssh_hook` is provided. :type ssh_conn_id: str :param remote_host: remote host to connect (templated) + Nullable. If provided, it will replace the `remote_host` which was + defined in `ssh_hook` or predefined in the connection of `ssh_conn_id`. :type remote_host: str :param local_filepath: local file path to get or put. (templated) :type local_filepath: str @@ -77,13 +81,21 @@ def __init__(self, def execute(self, context): file_msg = None try: - if self.ssh_conn_id and not self.ssh_hook: - self.ssh_hook = SSHHook(ssh_conn_id=self.ssh_conn_id) + if self.ssh_conn_id: + if self.ssh_hook and isinstance(self.ssh_hook, SSHHook): + self.log.info("ssh_conn_id is ignored when ssh_hook is provided.") + else: + self.log.info("ssh_hook is not provided or invalid. " + + "Trying ssh_conn_id to create SSHHook.") + self.ssh_hook = SSHHook(ssh_conn_id=self.ssh_conn_id) if not self.ssh_hook: - raise AirflowException("can not operate without ssh_hook or ssh_conn_id") + raise AirflowException("Cannot operate without ssh_hook or ssh_conn_id.") if self.remote_host is not None: + self.log.info("remote_host is provided explicitly. " + + "It will replace the remote_host which was defined " + + "in ssh_hook or predefined in connection of ssh_conn_id.") self.ssh_hook.remote_host = self.remote_host with self.ssh_hook.get_conn() as ssh_client: diff --git a/airflow/contrib/operators/sftp_to_s3_operator.py b/airflow/contrib/operators/sftp_to_s3_operator.py new file mode 100644 index 0000000000000..6899e98e2b1f9 --- /dev/null +++ b/airflow/contrib/operators/sftp_to_s3_operator.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +# +# 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. + +from airflow.models import BaseOperator +from airflow.hooks.S3_hook import S3Hook +from airflow.contrib.hooks.ssh_hook import SSHHook +from tempfile import NamedTemporaryFile +from urllib.parse import urlparse +from airflow.utils.decorators import apply_defaults + + +def get_s3_key(s3_key): + """This parses the correct format for S3 keys + regardless of how the S3 url is passed.""" + + parsed_s3_key = urlparse(s3_key) + return parsed_s3_key.path.lstrip('/') + + +class SFTPToS3Operator(BaseOperator): + """ + This operator enables the transferring of files from a SFTP server to Amazon S3 + :param sftp_conn_id: The sftp connection id. The name or identifier for + establishing a connection to the SFTP server. + :type sftp_conn_id: string + :param sftp_path: The sftp remote path. This is the specified file + path for downloading the file from the SFTP server. + :type sftp_path: string + :param s3_conn_id: The s3 connnection id. The name or identifier for + establishing a connection to S3 + :type s3_conn_id: string + :param s3_bucket: The targeted s3 bucket. This is the S3 bucket + to where the file is uploaded. + :type s3_bucket: string + :param s3_key: The targeted s3 key. This is the specified path + for uploading the file to S3. + :type s3_key: string + """ + + template_fields = ('s3_key', 'sftp_path') + + @apply_defaults + def __init__(self, + s3_bucket, + s3_key, + sftp_path, + sftp_conn_id='ssh_default', + s3_conn_id='aws_default', + *args, + **kwargs): + super(SFTPToS3Operator, self).__init__(*args, **kwargs) + self.sftp_conn_id = sftp_conn_id + self.sftp_path = sftp_path + self.s3_bucket = s3_bucket + self.s3_key = s3_key + self.s3_conn_id = s3_conn_id + + def execute(self, context): + self.s3_key = get_s3_key(self.s3_key) + ssh_hook = SSHHook(ssh_conn_id=self.sftp_conn_id) + s3_hook = S3Hook(self.s3_conn_id) + + ssh_client = ssh_hook.get_conn() + sftp_client = ssh_client.open_sftp() + + with NamedTemporaryFile("w") as f: + sftp_client.get(self.sftp_path, f.name) + + s3_hook.load_file( + filename=f.name, + key=self.s3_key, + bucket_name=self.s3_bucket, + replace=True + ) diff --git a/airflow/contrib/operators/slack_webhook_operator.py b/airflow/contrib/operators/slack_webhook_operator.py index bab3e90856d34..64f2448a550dd 100644 --- a/airflow/contrib/operators/slack_webhook_operator.py +++ b/airflow/contrib/operators/slack_webhook_operator.py @@ -31,8 +31,8 @@ class SlackWebhookOperator(SimpleHttpOperator): Each Slack webhook token can be pre-configured to use a specific channel, username and icon. You can override these defaults in this hook. - :param conn_id: connection that has Slack webhook token in the extra field - :type conn_id: str + :param http_conn_id: connection that has Slack webhook token in the extra field + :type http_conn_id: str :param webhook_token: Slack webhook token :type webhook_token: str :param message: The message you want to send on Slack @@ -77,7 +77,7 @@ def __init__(self, def execute(self, context): """ - Call the SparkSqlHook to run the provided sql query + Call the SlackWebhookHook to post the provided Slack message """ self.hook = SlackWebhookHook( self.http_conn_id, diff --git a/airflow/contrib/operators/snowflake_operator.py b/airflow/contrib/operators/snowflake_operator.py index 39d7d496ea740..6c3f403912134 100644 --- a/airflow/contrib/operators/snowflake_operator.py +++ b/airflow/contrib/operators/snowflake_operator.py @@ -26,16 +26,16 @@ class SnowflakeOperator(BaseOperator): Executes sql code in a Snowflake database :param snowflake_conn_id: reference to specific snowflake connection id - :type snowflake_conn_id: string + :type snowflake_conn_id: str :param sql: the sql code to be executed. (templated) :type sql: Can receive a str representing a sql statement, a list of str (sql statements), or reference to a template file. Template reference are recognized by str ending in '.sql' :param warehouse: name of warehouse which overwrite defined one in connection - :type warehouse: string + :type warehouse: str :param database: name of database which overwrite defined one in connection - :type database: string + :type database: str """ template_fields = ('sql',) diff --git a/airflow/contrib/operators/ssh_operator.py b/airflow/contrib/operators/ssh_operator.py index c0e8953d2c344..2bf342935d60c 100644 --- a/airflow/contrib/operators/ssh_operator.py +++ b/airflow/contrib/operators/ssh_operator.py @@ -31,11 +31,15 @@ class SSHOperator(BaseOperator): """ SSHOperator to execute commands on given remote host using the ssh_hook. - :param ssh_hook: predefined ssh_hook to use for remote execution + :param ssh_hook: predefined ssh_hook to use for remote execution. + Either `ssh_hook` or `ssh_conn_id` needs to be provided. :type ssh_hook: :class:`SSHHook` - :param ssh_conn_id: connection id from airflow Connections + :param ssh_conn_id: connection id from airflow Connections. + `ssh_conn_id` will be ingored if `ssh_hook` is provided. :type ssh_conn_id: str :param remote_host: remote host to connect (templated) + Nullable. If provided, it will replace the `remote_host` which was + defined in `ssh_hook` or predefined in the connection of `ssh_conn_id`. :type remote_host: str :param command: command to execute on remote host. (templated) :type command: str @@ -68,14 +72,22 @@ def __init__(self, def execute(self, context): try: - if self.ssh_conn_id and not self.ssh_hook: - self.ssh_hook = SSHHook(ssh_conn_id=self.ssh_conn_id, - timeout=self.timeout) + if self.ssh_conn_id: + if self.ssh_hook and isinstance(self.ssh_hook, SSHHook): + self.log.info("ssh_conn_id is ignored when ssh_hook is provided.") + else: + self.log.info("ssh_hook is not provided or invalid. " + + "Trying ssh_conn_id to create SSHHook.") + self.ssh_hook = SSHHook(ssh_conn_id=self.ssh_conn_id, + timeout=self.timeout) if not self.ssh_hook: raise AirflowException("Cannot operate without ssh_hook or ssh_conn_id.") if self.remote_host is not None: + self.log.info("remote_host is provided explicitly. " + + "It will replace the remote_host which was defined " + + "in ssh_hook or predefined in connection of ssh_conn_id.") self.ssh_hook.remote_host = self.remote_host if not self.command: diff --git a/airflow/contrib/operators/vertica_operator.py b/airflow/contrib/operators/vertica_operator.py index 41072ff82bdf0..37ccd134e84ac 100644 --- a/airflow/contrib/operators/vertica_operator.py +++ b/airflow/contrib/operators/vertica_operator.py @@ -26,7 +26,7 @@ class VerticaOperator(BaseOperator): Executes sql code in a specific Vertica database :param vertica_conn_id: reference to a specific Vertica database - :type vertica_conn_id: string + :type vertica_conn_id: str :param sql: the sql code to be executed. (templated) :type sql: Can receive a str representing a sql statement, a list of str (sql statements), or reference to a template file. diff --git a/airflow/contrib/sensors/bash_sensor.py b/airflow/contrib/sensors/bash_sensor.py index 26fbb06c18d81..7372a419b6900 100644 --- a/airflow/contrib/sensors/bash_sensor.py +++ b/airflow/contrib/sensors/bash_sensor.py @@ -33,7 +33,7 @@ class BashSensor(BaseSensorOperator): :param bash_command: The command, set of commands or reference to a bash script (must be '.sh') to be executed. - :type bash_command: string + :type bash_command: str :param env: If env is not None, it must be a mapping that defines the environment variables for the new process; these are used instead @@ -41,7 +41,7 @@ class BashSensor(BaseSensorOperator): behavior. (templated) :type env: dict :param output_encoding: output encoding of bash command. - :type output_encoding: string + :type output_encoding: str """ template_fields = ('bash_command', 'env') diff --git a/airflow/contrib/sensors/bigquery_sensor.py b/airflow/contrib/sensors/bigquery_sensor.py index 2e496f68897dd..89ec476d9d565 100644 --- a/airflow/contrib/sensors/bigquery_sensor.py +++ b/airflow/contrib/sensors/bigquery_sensor.py @@ -28,19 +28,19 @@ class BigQueryTableSensor(BaseSensorOperator): :param project_id: The Google cloud project in which to look for the table. The connection supplied to the hook must provide access to the specified project. - :type project_id: string + :type project_id: str :param dataset_id: The name of the dataset in which to look for the table. storage bucket. - :type dataset_id: string + :type dataset_id: str :param table_id: The name of the table to check the existence of. - :type table_id: string + :type table_id: str :param bigquery_conn_id: The connection ID to use when connecting to Google BigQuery. - :type bigquery_conn_id: string + :type bigquery_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ template_fields = ('project_id', 'dataset_id', 'table_id',) ui_color = '#f0eee4' diff --git a/airflow/contrib/sensors/cassandra_record_sensor.py b/airflow/contrib/sensors/cassandra_record_sensor.py index 493a6ba6b1e08..bbb2f5099030e 100644 --- a/airflow/contrib/sensors/cassandra_record_sensor.py +++ b/airflow/contrib/sensors/cassandra_record_sensor.py @@ -43,12 +43,12 @@ def __init__(self, table, keys, cassandra_conn_id, *args, **kwargs): :param table: Target Cassandra table. Use dot notation to target a specific keyspace. - :type table: string + :type table: str :param keys: The keys and their values to be monitored :type keys: dict :param cassandra_conn_id: The connection ID to use when connecting to Cassandra cluster - :type cassandra_conn_id: string + :type cassandra_conn_id: str """ super(CassandraRecordSensor, self).__init__(*args, **kwargs) self.cassandra_conn_id = cassandra_conn_id diff --git a/airflow/contrib/sensors/cassandra_table_sensor.py b/airflow/contrib/sensors/cassandra_table_sensor.py index 5a85995acaaec..088c82bdd3060 100644 --- a/airflow/contrib/sensors/cassandra_table_sensor.py +++ b/airflow/contrib/sensors/cassandra_table_sensor.py @@ -41,10 +41,10 @@ def __init__(self, table, cassandra_conn_id, *args, **kwargs): :param table: Target Cassandra table. Use dot notation to target a specific keyspace. - :type table: string + :type table: str :param cassandra_conn_id: The connection ID to use when connecting to Cassandra cluster - :type cassandra_conn_id: string + :type cassandra_conn_id: str """ super(CassandraTableSensor, self).__init__(*args, **kwargs) self.cassandra_conn_id = cassandra_conn_id diff --git a/airflow/contrib/sensors/datadog_sensor.py b/airflow/contrib/sensors/datadog_sensor.py index 817fee061ae6b..01b7b9fc5148d 100644 --- a/airflow/contrib/sensors/datadog_sensor.py +++ b/airflow/contrib/sensors/datadog_sensor.py @@ -32,7 +32,7 @@ class DatadogSensor(BaseSensorOperator): Airflow runs. :param datadog_conn_id: The connection to datadog, containing metadata for api keys. - :param datadog_conn_id: string + :param datadog_conn_id: str """ ui_color = '#66c3dd' diff --git a/airflow/contrib/sensors/emr_job_flow_sensor.py b/airflow/contrib/sensors/emr_job_flow_sensor.py index 5a17a012d42c4..ba8a018134025 100644 --- a/airflow/contrib/sensors/emr_job_flow_sensor.py +++ b/airflow/contrib/sensors/emr_job_flow_sensor.py @@ -27,7 +27,7 @@ class EmrJobFlowSensor(EmrBaseSensor): If it fails the sensor errors, failing the task. :param job_flow_id: job_flow_id to check the state of - :type job_flow_id: string + :type job_flow_id: str """ NON_TERMINAL_STATES = ['STARTING', 'BOOTSTRAPPING', 'RUNNING', diff --git a/airflow/contrib/sensors/emr_step_sensor.py b/airflow/contrib/sensors/emr_step_sensor.py index 6e79f6353ff73..65bb7c95b1303 100644 --- a/airflow/contrib/sensors/emr_step_sensor.py +++ b/airflow/contrib/sensors/emr_step_sensor.py @@ -27,9 +27,9 @@ class EmrStepSensor(EmrBaseSensor): If it fails the sensor errors, failing the task. :param job_flow_id: job_flow_id which contains the step check the state of - :type job_flow_id: string + :type job_flow_id: str :param step_id: step to check the state of - :type step_id: string + :type step_id: str """ NON_TERMINAL_STATES = ['PENDING', 'RUNNING', 'CONTINUE'] diff --git a/airflow/contrib/sensors/file_sensor.py b/airflow/contrib/sensors/file_sensor.py index 3e49abdfb5a3a..048dd06258e94 100644 --- a/airflow/contrib/sensors/file_sensor.py +++ b/airflow/contrib/sensors/file_sensor.py @@ -35,10 +35,10 @@ class FileSensor(BaseSensorOperator): :param fs_conn_id: reference to the File (path) connection id - :type fs_conn_id: string + :type fs_conn_id: str :param filepath: File or folder name (relative to the base path set within the connection) - :type fs_conn_id: string + :type fs_conn_id: str """ template_fields = ('filepath',) ui_color = '#91818a' diff --git a/airflow/contrib/sensors/gcs_sensor.py b/airflow/contrib/sensors/gcs_sensor.py index 23cd760a41f19..5a4f73e61e822 100644 --- a/airflow/contrib/sensors/gcs_sensor.py +++ b/airflow/contrib/sensors/gcs_sensor.py @@ -27,17 +27,17 @@ class GoogleCloudStorageObjectSensor(BaseSensorOperator): Create a new GoogleCloudStorageObjectSensor. :param bucket: The Google cloud storage bucket where the object is. - :type bucket: string + :type bucket: str :param object: The name of the object to check in the Google cloud storage bucket. - :type object: string + :type object: str :param google_cloud_storage_conn_id: The connection ID to use when connecting to Google cloud storage. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ template_fields = ('bucket', 'object') ui_color = '#f0eee4' @@ -79,21 +79,21 @@ class GoogleCloudStorageObjectUpdatedSensor(BaseSensorOperator): Create a new GoogleCloudStorageObjectUpdatedSensor. :param bucket: The Google cloud storage bucket where the object is. - :type bucket: string + :type bucket: str :param object: The name of the object to download in the Google cloud storage bucket. - :type object: string + :type object: str :param ts_func: Callback for defining the update condition. The default callback returns execution_date + schedule_interval. The callback takes the context as parameter. :type ts_func: function :param google_cloud_storage_conn_id: The connection ID to use when connecting to Google cloud storage. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ template_fields = ('bucket', 'object') template_ext = ('.sql',) @@ -129,17 +129,17 @@ class GoogleCloudStoragePrefixSensor(BaseSensorOperator): Create a new GoogleCloudStorageObjectSensor. :param bucket: The Google cloud storage bucket where the object is. - :type bucket: string + :type bucket: str :param prefix: The name of the prefix to check in the Google cloud storage bucket. - :type prefix: string + :type prefix: str :param google_cloud_storage_conn_id: The connection ID to use when connecting to Google cloud storage. - :type google_cloud_storage_conn_id: string + :type google_cloud_storage_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ template_fields = ('bucket', 'prefix') ui_color = '#f0eee4' diff --git a/airflow/contrib/sensors/mongo_sensor.py b/airflow/contrib/sensors/mongo_sensor.py index 3ed49a6f9d64f..8fd32a0775feb 100644 --- a/airflow/contrib/sensors/mongo_sensor.py +++ b/airflow/contrib/sensors/mongo_sensor.py @@ -39,12 +39,12 @@ def __init__(self, collection, query, mongo_conn_id="mongo_default", *args, **kw Create a new MongoSensor :param collection: Target MongoDB collection. - :type collection: string + :type collection: str :param query: The query to find the target document. :type query: dict :param mongo_conn_id: The connection ID to use when connecting to MongoDB. - :type mongo_conn_id: string + :type mongo_conn_id: str """ super(MongoSensor, self).__init__(*args, **kwargs) self.mongo_conn_id = mongo_conn_id diff --git a/airflow/contrib/sensors/pubsub_sensor.py b/airflow/contrib/sensors/pubsub_sensor.py index 7d1721570dea4..8104fb56997b2 100644 --- a/airflow/contrib/sensors/pubsub_sensor.py +++ b/airflow/contrib/sensors/pubsub_sensor.py @@ -54,10 +54,10 @@ def __init__( **kwargs): """ :param project: the GCP project ID for the subscription (templated) - :type project: string + :type project: str :param subscription: the Pub/Sub subscription name. Do not include the full subscription path. - :type subscription: string + :type subscription: str :param max_messages: The maximum number of messages to retrieve per PubSub pull request :type max_messages: int @@ -69,11 +69,11 @@ def __init__( :type ack_messages: bool :param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform. - :type gcp_conn_id: string + :type gcp_conn_id: str :param delegate_to: The account to impersonate, if any. For this to work, the service account making the request must have domain-wide delegation enabled. - :type delegate_to: string + :type delegate_to: str """ super(PubSubPullSensor, self).__init__(*args, **kwargs) diff --git a/airflow/contrib/sensors/qubole_sensor.py b/airflow/contrib/sensors/qubole_sensor.py index d67fa8557e7ad..c0291b1521471 100644 --- a/airflow/contrib/sensors/qubole_sensor.py +++ b/airflow/contrib/sensors/qubole_sensor.py @@ -29,14 +29,6 @@ class QuboleSensor(BaseSensorOperator): """ Base class for all Qubole Sensors - - :param qubole_conn_id: The qubole connection to run the sensor against - :type qubole_conn_id: string - :param data: a JSON object containing payload, whose presence needs to be checked - :type data: a JSON object - - .. note:: Both ``data`` and ``qubole_conn_id`` fields are template-supported. You can - also use ``.txt`` files for template driven use cases. """ template_fields = ('data', 'qubole_conn_id') @@ -75,6 +67,22 @@ def poke(self, context): class QuboleFileSensor(QuboleSensor): + """ + Wait for a file or folder to be present in cloud storage + and check for its presence via QDS APIs + + :param qubole_conn_id: Connection id which consists of qds auth_token + :type qubole_conn_id: str + :param data: a JSON object containing payload, whose presence needs to be checked + Check this `example `_ for sample payload + structure. + :type data: a JSON object + + .. note:: Both ``data`` and ``qubole_conn_id`` fields support templating. You can + also use ``.txt`` files for template-driven use cases. + """ + @apply_defaults def __init__(self, *args, **kwargs): self.sensor_class = FileSensor @@ -82,6 +90,22 @@ def __init__(self, *args, **kwargs): class QubolePartitionSensor(QuboleSensor): + """ + Wait for a Hive partition to show up in QHS (Qubole Hive Service) + and check for its presence via QDS APIs + + :param qubole_conn_id: Connection id which consists of qds auth_token + :type qubole_conn_id: str + :param data: a JSON object containing payload, whose presence needs to be checked. + Check this `example `_ for sample payload + structure. + :type data: a JSON object + + .. note:: Both ``data`` and ``qubole_conn_id`` fields support templating. You can + also use ``.txt`` files for template-driven use cases. + """ + @apply_defaults def __init__(self, *args, **kwargs): self.sensor_class = PartitionSensor diff --git a/airflow/contrib/sensors/redis_key_sensor.py b/airflow/contrib/sensors/redis_key_sensor.py index baf3e161f5365..a2d190baae2a8 100644 --- a/airflow/contrib/sensors/redis_key_sensor.py +++ b/airflow/contrib/sensors/redis_key_sensor.py @@ -34,9 +34,9 @@ def __init__(self, key, redis_conn_id, *args, **kwargs): Create a new RedisKeySensor :param key: The key to be monitored - :type key: string + :type key: str :param redis_conn_id: The connection ID to use when connecting to Redis DB. - :type redis_conn_id: string + :type redis_conn_id: str """ super(RedisKeySensor, self).__init__(*args, **kwargs) self.redis_conn_id = redis_conn_id diff --git a/airflow/contrib/sensors/sagemaker_training_sensor.py b/airflow/contrib/sensors/sagemaker_training_sensor.py index 90c62ce988fbf..5e83e846efec5 100644 --- a/airflow/contrib/sensors/sagemaker_training_sensor.py +++ b/airflow/contrib/sensors/sagemaker_training_sensor.py @@ -28,7 +28,7 @@ class SageMakerTrainingSensor(SageMakerBaseSensor): If it fails the sensor errors, failing the task. :param job_name: job_name of the training instance to check the state of - :type job_name: string + :type job_name: str """ template_fields = ['job_name'] @@ -45,10 +45,10 @@ def __init__(self, self.region_name = region_name def non_terminal_states(self): - return ['InProgress', 'Stopping', 'Stopped'] + return SageMakerHook.non_terminal_states def failed_states(self): - return ['Failed'] + return SageMakerHook.failed_states def get_sagemaker_response(self): sagemaker = SageMakerHook( diff --git a/airflow/contrib/sensors/sagemaker_transform_sensor.py b/airflow/contrib/sensors/sagemaker_transform_sensor.py new file mode 100644 index 0000000000000..68ef1d8dd7b05 --- /dev/null +++ b/airflow/contrib/sensors/sagemaker_transform_sensor.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# +# 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. + +from airflow.contrib.hooks.sagemaker_hook import SageMakerHook +from airflow.contrib.sensors.sagemaker_base_sensor import SageMakerBaseSensor +from airflow.utils.decorators import apply_defaults + + +class SageMakerTransformSensor(SageMakerBaseSensor): + """ + Asks for the state of the transform state until it reaches a terminal state. + The sensor will error if the job errors, throwing a AirflowException + containing the failure reason. + + :param job_name: job_name of the transform job instance to check the state of + :type job_name: string + :param region_name: The AWS region_name + :type region_name: string + """ + + template_fields = ['job_name'] + template_ext = () + + @apply_defaults + def __init__(self, + job_name, + region_name=None, + *args, + **kwargs): + super(SageMakerTransformSensor, self).__init__(*args, **kwargs) + self.job_name = job_name + self.region_name = region_name + + def non_terminal_states(self): + return SageMakerHook.non_terminal_states + + def failed_states(self): + return SageMakerHook.failed_states + + def get_sagemaker_response(self): + sagemaker = SageMakerHook( + aws_conn_id=self.aws_conn_id, + region_name=self.region_name + ) + + self.log.info('Poking Sagemaker Transform Job %s', self.job_name) + return sagemaker.describe_transform_job(self.job_name) + + def get_failed_reason_from_response(self, response): + return response['FailureReason'] + + def state_from_response(self, response): + return response['TransformJobStatus'] diff --git a/airflow/contrib/sensors/sagemaker_tuning_sensor.py b/airflow/contrib/sensors/sagemaker_tuning_sensor.py index bc74e3a5c5461..ec90964266a11 100644 --- a/airflow/contrib/sensors/sagemaker_tuning_sensor.py +++ b/airflow/contrib/sensors/sagemaker_tuning_sensor.py @@ -29,9 +29,9 @@ class SageMakerTuningSensor(SageMakerBaseSensor): containing the failure reason. :param job_name: job_name of the tuning instance to check the state of - :type job_name: string + :type job_name: str :param region_name: The AWS region_name - :type region_name: string + :type region_name: str """ template_fields = ['job_name'] @@ -48,10 +48,10 @@ def __init__(self, self.region_name = region_name def non_terminal_states(self): - return ['InProgress', 'Stopping', 'Stopped'] + return SageMakerHook.non_terminal_states def failed_states(self): - return ['Failed'] + return SageMakerHook.failed_states def get_sagemaker_response(self): sagemaker = SageMakerHook( diff --git a/airflow/contrib/task_runner/cgroup_task_runner.py b/airflow/contrib/task_runner/cgroup_task_runner.py index 78a240f2db4e2..4662b0fe82f5a 100644 --- a/airflow/contrib/task_runner/cgroup_task_runner.py +++ b/airflow/contrib/task_runner/cgroup_task_runner.py @@ -123,7 +123,7 @@ def start(self): # Create a unique cgroup name cgroup_name = "airflow/{}/{}".format(datetime.datetime.utcnow(). strftime("%Y-%m-%d"), - str(uuid.uuid1())) + str(uuid.uuid4())) self.mem_cgroup_name = "memory/{}".format(cgroup_name) self.cpu_cgroup_name = "cpu/{}".format(cgroup_name) diff --git a/airflow/default_login.py b/airflow/default_login.py index bf87bbc47fa76..e423199fe01a9 100644 --- a/airflow/default_login.py +++ b/airflow/default_login.py @@ -44,14 +44,17 @@ class DefaultUser(object): def __init__(self, user): self.user = user + @property def is_active(self): """Required by flask_login""" return True + @property def is_authenticated(self): """Required by flask_login""" return True + @property def is_anonymous(self): """Required by flask_login""" return False diff --git a/airflow/exceptions.py b/airflow/exceptions.py index 89f3d0e048da2..d4098c4a32435 100644 --- a/airflow/exceptions.py +++ b/airflow/exceptions.py @@ -47,6 +47,17 @@ class AirflowSensorTimeout(AirflowException): pass +class AirflowRescheduleException(AirflowException): + """ + Raise when the task should be re-scheduled at a later time. + + :param reschedule_date: The date when the task should be rescheduled + :type reschedule: datetime + """ + def __init__(self, reschedule_date): + self.reschedule_date = reschedule_date + + class AirflowTaskTimeout(AirflowException): pass diff --git a/airflow/executors/celery_executor.py b/airflow/executors/celery_executor.py index 2128ae7b09228..0de48b4d39ff1 100644 --- a/airflow/executors/celery_executor.py +++ b/airflow/executors/celery_executor.py @@ -17,20 +17,26 @@ # specific language governing permissions and limitations # under the License. +import math +import os import subprocess import time -import os +import traceback +from multiprocessing import Pool, cpu_count from celery import Celery from celery import states as celery_states +from airflow import configuration from airflow.config_templates.default_celery import DEFAULT_CELERY_CONFIG from airflow.exceptions import AirflowException from airflow.executors.base_executor import BaseExecutor -from airflow import configuration from airflow.utils.log.logging_mixin import LoggingMixin from airflow.utils.module_loading import import_string +# Make it constant for unit test. +CELERY_FETCH_ERR_MSG_HEADER = 'Error fetching Celery task state' + ''' To start the celery worker, run the command: airflow worker @@ -63,6 +69,42 @@ def execute_command(command): raise AirflowException('Celery command failed') +class ExceptionWithTraceback(object): + """ + Wrapper class used to propogate exceptions to parent processes from subprocesses. + :param exception: The exception to wrap + :type exception: Exception + :param traceback: The stacktrace to wrap + :type traceback: str + """ + + def __init__(self, exception, exception_traceback): + self.exception = exception + self.traceback = exception_traceback + + +def fetch_celery_task_state(celery_task): + """ + Fetch and return the state of the given celery task. The scope of this function is + global so that it can be called by subprocesses in the pool. + :param celery_task: a tuple of the Celery task key and the async Celery object used + to fetch the task's state + :type celery_task: (str, celery.result.AsyncResult) + :return: a tuple of the Celery task key and the Celery state of the task + :rtype: (str, str) + """ + + try: + # Accessing state property of celery task will make actual network request + # to get the current state of the task. + res = (celery_task[0], celery_task[1].state) + except Exception as e: + exception_traceback = "Celery Task ID: {}\n{}".format(celery_task[0], + traceback.format_exc()) + res = ExceptionWithTraceback(e, exception_traceback) + return res + + class CeleryExecutor(BaseExecutor): """ CeleryExecutor is recommended for production use of Airflow. It allows @@ -72,24 +114,78 @@ class CeleryExecutor(BaseExecutor): vast amounts of messages, while providing operations with the tools required to maintain such a system. """ - def start(self): + + def __init__(self): + super(CeleryExecutor, self).__init__() + + # Celery doesn't support querying the state of multiple tasks in parallel + # (which can become a bottleneck on bigger clusters) so we use + # a multiprocessing pool to speed this up. + # How many worker processes are created for checking celery task state. + self._sync_parallelism = configuration.getint('celery', 'SYNC_PARALLELISM') + if self._sync_parallelism == 0: + self._sync_parallelism = max(1, cpu_count() - 1) + + self._sync_pool = None self.tasks = {} self.last_state = {} + def start(self): + self.log.debug( + 'Starting Celery Executor using {} processes for syncing'.format( + self._sync_parallelism)) + def execute_async(self, key, command, queue=DEFAULT_CELERY_CONFIG['task_default_queue'], executor_config=None): self.log.info("[celery] queuing {key} through celery, " "queue={queue}".format(**locals())) self.tasks[key] = execute_command.apply_async( - args=command, queue=queue) + args=[command], queue=queue) self.last_state[key] = celery_states.PENDING + def _num_tasks_per_process(self): + """ + How many Celery tasks should be sent to each worker process. + :return: Number of tasks that should be used per process + :rtype: int + """ + return max(1, + int(math.ceil(1.0 * len(self.tasks) / self._sync_parallelism))) + def sync(self): - self.log.debug("Inquiring about %s celery task(s)", len(self.tasks)) - for key, task in list(self.tasks.items()): + num_processes = min(len(self.tasks), self._sync_parallelism) + if num_processes == 0: + self.log.debug("No task to query celery, skipping sync") + return + + self.log.debug("Inquiring about %s celery task(s) using %s processes", + len(self.tasks), num_processes) + + # Recreate the process pool each sync in case processes in the pool die + self._sync_pool = Pool(processes=num_processes) + + # Use chunking instead of a work queue to reduce context switching since tasks are + # roughly uniform in size + chunksize = self._num_tasks_per_process() + + self.log.debug("Waiting for inquiries to complete...") + task_keys_to_states = self._sync_pool.map( + fetch_celery_task_state, + self.tasks.items(), + chunksize=chunksize) + self._sync_pool.close() + self._sync_pool.join() + self.log.debug("Inquiries completed.") + + for key_and_state in task_keys_to_states: + if isinstance(key_and_state, ExceptionWithTraceback): + self.log.error( + CELERY_FETCH_ERR_MSG_HEADER + ", ignoring it:{}\n{}\n".format( + key_and_state.exception, key_and_state.traceback)) + continue + key, state = key_and_state try: - state = task.state if self.last_state[key] != state: if state == celery_states.SUCCESS: self.success(key) @@ -104,11 +200,10 @@ def sync(self): del self.tasks[key] del self.last_state[key] else: - self.log.info("Unexpected state: %s", state) + self.log.info("Unexpected state: " + state) self.last_state[key] = state - except Exception as e: - self.log.error("Error syncing the celery executor, ignoring it:") - self.log.exception(e) + except Exception: + self.log.exception("Error syncing the Celery executor, ignoring it.") def end(self, synchronous=False): if synchronous: diff --git a/airflow/executors/local_executor.py b/airflow/executors/local_executor.py index 291d6e127778a..3e622da0531f3 100644 --- a/airflow/executors/local_executor.py +++ b/airflow/executors/local_executor.py @@ -77,7 +77,7 @@ def execute_work(self, key, command): :param key: the key to identify the TI :type key: Tuple(dag_id, task_id, execution_date) :param command: the command to execute - :type command: string + :type command: str """ if key is None: return @@ -146,7 +146,7 @@ def execute_async(self, key, command): :param key: the key to identify the TI :type key: Tuple(dag_id, task_id, execution_date) :param command: the command to execute - :type command: string + :type command: str """ local_worker = LocalWorker(self.executor.result_queue) local_worker.key = key @@ -191,7 +191,7 @@ def execute_async(self, key, command): :param key: the key to identify the TI :type key: Tuple(dag_id, task_id, execution_date) :param command: the command to execute - :type command: string + :type command: str """ self.executor.queue.put((key, command)) diff --git a/airflow/hooks/S3_hook.py b/airflow/hooks/S3_hook.py index 2d64b315342fb..35d26fd2b50fc 100644 --- a/airflow/hooks/S3_hook.py +++ b/airflow/hooks/S3_hook.py @@ -72,6 +72,13 @@ def get_bucket(self, bucket_name): def check_for_prefix(self, bucket_name, prefix, delimiter): """ Checks that a prefix exists in a bucket + + :param bucket_name: the name of the bucket + :type bucket_name: str + :param prefix: a key prefix + :type prefix: str + :param delimiter: the delimiter marks key hierarchy. + :type delimiter: str """ prefix = prefix + delimiter if prefix[-1] != delimiter else prefix prefix_split = re.split(r'(\w+[{d}])$'.format(d=delimiter), prefix, 1) @@ -253,6 +260,13 @@ def check_for_wildcard_key(self, wildcard_key, bucket_name=None, delimiter=''): """ Checks that a key matching a wildcard expression exists in a bucket + + :param wildcard_key: the path to the key + :type wildcard_key: str + :param bucket_name: the name of the bucket + :type bucket_name: str + :param delimiter: the delimiter marks key hierarchy + :type delimiter: str """ return self.get_wildcard_key(wildcard_key=wildcard_key, bucket_name=bucket_name, @@ -266,6 +280,8 @@ def get_wildcard_key(self, wildcard_key, bucket_name=None, delimiter=''): :type wildcard_key: str :param bucket_name: the name of the bucket :type bucket_name: str + :param delimiter: the delimiter marks key hierarchy + :type delimiter: str """ if not bucket_name: (bucket_name, wildcard_key) = self.parse_s3_url(wildcard_key) @@ -326,7 +342,7 @@ def load_string(self, This is provided as a convenience to drop a string in S3. It uses the boto infrastructure to ship a file to s3. - :param string_data: string to set as content for the key. + :param string_data: str to set as content for the key. :type string_data: str :param key: S3 key that will point to the file :type key: str @@ -384,3 +400,89 @@ def load_bytes(self, client = self.get_conn() client.upload_fileobj(filelike_buffer, bucket_name, key, ExtraArgs=extra_args) + + def copy_object(self, + source_bucket_key, + dest_bucket_key, + source_bucket_name=None, + dest_bucket_name=None, + source_version_id=None): + """ + Creates a copy of an object that is already stored in S3. + + Note: the S3 connection used here needs to have access to both + source and destination bucket/key. + + :param source_bucket_key: The key of the source object. + + It can be either full s3:// style url or relative path from root level. + + When it's specified as a full s3:// url, please omit source_bucket_name. + :type source_bucket_key: str + :param dest_bucket_key: The key of the object to copy to. + + The convention to specify `dest_bucket_key` is the same + as `source_bucket_key`. + :type dest_bucket_key: str + :param source_bucket_name: Name of the S3 bucket where the source object is in. + + It should be omitted when `source_bucket_key` is provided as a full s3:// url. + :type source_bucket_name: str + :param dest_bucket_name: Name of the S3 bucket to where the object is copied. + + It should be omitted when `dest_bucket_key` is provided as a full s3:// url. + :type dest_bucket_name: str + :param source_version_id: Version ID of the source object (OPTIONAL) + :type source_version_id: str + """ + + if dest_bucket_name is None: + dest_bucket_name, dest_bucket_key = self.parse_s3_url(dest_bucket_key) + else: + parsed_url = urlparse(dest_bucket_key) + if parsed_url.scheme != '' or parsed_url.netloc != '': + raise AirflowException('If dest_bucket_name is provided, ' + + 'dest_bucket_key should be relative path ' + + 'from root level, rather than a full s3:// url') + + if source_bucket_name is None: + source_bucket_name, source_bucket_key = self.parse_s3_url(source_bucket_key) + else: + parsed_url = urlparse(source_bucket_key) + if parsed_url.scheme != '' or parsed_url.netloc != '': + raise AirflowException('If source_bucket_name is provided, ' + + 'source_bucket_key should be relative path ' + + 'from root level, rather than a full s3:// url') + + CopySource = {'Bucket': source_bucket_name, + 'Key': source_bucket_key, + 'VersionId': source_version_id} + response = self.get_conn().copy_object(Bucket=dest_bucket_name, + Key=dest_bucket_key, + CopySource=CopySource) + return response + + def delete_objects(self, + bucket, + keys): + """ + :param bucket: Name of the bucket in which you are going to delete object(s) + :type bucket: str + :param keys: The key(s) to delete from S3 bucket. + + When ``keys`` is a string, it's supposed to be the key name of + the single object to delete. + + When ``keys`` is a list, it's supposed to be the list of the + keys to delete. + :type keys: str or list + """ + if isinstance(keys, list): + keys = keys + else: + keys = [keys] + + delete_dict = {"Objects": [{"Key": k} for k in keys]} + response = self.get_conn().delete_objects(Bucket=bucket, + Delete=delete_dict) + return response diff --git a/airflow/hooks/__init__.py b/airflow/hooks/__init__.py index 38a7dcfebed2c..44a434a07eef9 100644 --- a/airflow/hooks/__init__.py +++ b/airflow/hooks/__init__.py @@ -18,79 +18,15 @@ # under the License. -import os import sys -# ------------------------------------------------------------------------ -# -# #TODO #FIXME Airflow 2.0 -# -# Old import machinary below. -# -# This is deprecated but should be kept until Airflow 2.0 -# for compatibility. -# -# ------------------------------------------------------------------------ - # Imports the hooks dynamically while keeping the package API clean, # abstracting the underlying modules - -_hooks = { - 'base_hook': ['BaseHook'], - 'hive_hooks': [ - 'HiveCliHook', - 'HiveMetastoreHook', - 'HiveServer2Hook', - ], - 'hdfs_hook': ['HDFSHook'], - 'webhdfs_hook': ['WebHDFSHook'], - 'pig_hook': ['PigCliHook'], - 'mysql_hook': ['MySqlHook'], - 'postgres_hook': ['PostgresHook'], - 'presto_hook': ['PrestoHook'], - 'samba_hook': ['SambaHook'], - 'sqlite_hook': ['SqliteHook'], - 'S3_hook': ['S3Hook'], - 'zendesk_hook': ['ZendeskHook'], - 'http_hook': ['HttpHook'], - 'druid_hook': [ - 'DruidHook', - 'DruidDbApiHook', - ], - 'jdbc_hook': ['JdbcHook'], - 'dbapi_hook': ['DbApiHook'], - 'mssql_hook': ['MsSqlHook'], - 'oracle_hook': ['OracleHook'], - 'slack_hook': ['SlackHook'], -} - - -if not os.environ.get('AIRFLOW_USE_NEW_IMPORTS', False): - from airflow.utils.helpers import AirflowImporter - airflow_importer = AirflowImporter(sys.modules[__name__], _hooks) - - def _integrate_plugins(): """Integrate plugins to the context""" from airflow.plugins_manager import hooks_modules for hooks_module in hooks_modules: sys.modules[hooks_module.__name__] = hooks_module globals()[hooks_module._name] = hooks_module - - ########################################################## - # TODO FIXME Remove in Airflow 2.0 - - if not os.environ.get('AIRFLOW_USE_NEW_IMPORTS', False): - from zope.deprecation import deprecated - for _hook in hooks_module._objects: - hook_name = _hook.__name__ - globals()[hook_name] = _hook - deprecated( - hook_name, - "Importing plugin hook '{i}' directly from " - "'airflow.hooks' has been deprecated. Please " - "import from 'airflow.hooks.[plugin_module]' " - "instead. Support for direct imports will be dropped " - "entirely in Airflow 2.0.".format(i=hook_name)) diff --git a/airflow/hooks/druid_hook.py b/airflow/hooks/druid_hook.py index cafba9c6c1629..75111fad2e7da 100644 --- a/airflow/hooks/druid_hook.py +++ b/airflow/hooks/druid_hook.py @@ -35,7 +35,7 @@ class DruidHook(BaseHook): :param druid_ingest_conn_id: The connection id to the Druid overlord machine which accepts index jobs - :type druid_ingest_conn_id: string + :type druid_ingest_conn_id: str :param timeout: The interval between polling the Druid job for the status of the ingestion job. Must be greater than or equal to 1 diff --git a/airflow/hooks/hdfs_hook.py b/airflow/hooks/hdfs_hook.py index 3c9136b1fd165..b00bab42ce813 100644 --- a/airflow/hooks/hdfs_hook.py +++ b/airflow/hooks/hdfs_hook.py @@ -39,9 +39,9 @@ class HDFSHook(BaseHook): Interact with HDFS. This class is a wrapper around the snakebite library. :param hdfs_conn_id: Connection id to fetch connection info - :type conn_id: string + :type conn_id: str :param proxy_user: effective user for HDFS operations - :type proxy_user: string + :type proxy_user: str :param autoconfig: use snakebite's automatically configured client :type autoconfig: bool """ diff --git a/airflow/hooks/hive_hooks.py b/airflow/hooks/hive_hooks.py index bd6a01a1e6c6b..178606aa4e501 100644 --- a/airflow/hooks/hive_hooks.py +++ b/airflow/hooks/hive_hooks.py @@ -72,13 +72,13 @@ class HiveCliHook(BaseHook): connection string as is. :param mapred_queue: queue used by the Hadoop Scheduler (Capacity or Fair) - :type mapred_queue: string + :type mapred_queue: str :param mapred_queue_priority: priority within the job queue. Possible settings include: VERY_HIGH, HIGH, NORMAL, LOW, VERY_LOW - :type mapred_queue_priority: string + :type mapred_queue_priority: str :param mapred_job_name: This name will appear in the jobtracker. This can make monitoring easier. - :type mapred_job_name: string + :type mapred_job_name: str """ def __init__( @@ -324,7 +324,7 @@ def load_df( :type field_dict: OrderedDict :param delimiter: field delimiter in the file :type delimiter: str - :param encoding: string encoding to use when writing DataFrame to file + :param encoding: str encoding to use when writing DataFrame to file :type encoding: str :param pandas_kwargs: passed to DataFrame.to_csv :type pandas_kwargs: dict @@ -536,13 +536,13 @@ def check_for_partition(self, schema, table, partition): Checks whether a partition exists :param schema: Name of hive schema (database) @table belongs to - :type schema: string + :type schema: str :param table: Name of hive table @partition belongs to - :type schema: string + :type schema: str :partition: Expression that matches the partitions to check for (eg `a = 'b' AND c = 'd'`) - :type schema: string - :rtype: boolean + :type schema: str + :rtype: bool >>> hh = HiveMetastoreHook() >>> t = 'static_babynames_partitioned' @@ -563,12 +563,12 @@ def check_for_named_partition(self, schema, table, partition_name): Checks whether a partition with a given name exists :param schema: Name of hive schema (database) @table belongs to - :type schema: string + :type schema: str :param table: Name of hive table @partition belongs to - :type schema: string + :type schema: str :partition: Name of the partitions to check for (eg `a=b/c=d`) - :type schema: string - :rtype: boolean + :type schema: str + :rtype: bool >>> hh = HiveMetastoreHook() >>> t = 'static_babynames_partitioned' @@ -652,7 +652,7 @@ def _get_max_partition_from_part_specs(part_specs, partition_key, filter_map): :param part_specs: list of partition specs. :type part_specs: list :param partition_key: partition key name. - :type partition_key: string + :type partition_key: str :param filter_map: partition_key:partition_value map used for partition filtering, e.g. {'key1': 'value1', 'key2': 'value2'}. Only partitions matching all partition_key:partition_value @@ -692,11 +692,11 @@ def max_partition(self, schema, table_name, field=None, filter_map=None): filter out partitions. :param schema: schema name. - :type schema: string + :type schema: str :param table_name: table name. - :type table_name: string + :type table_name: str :param field: partition key to get max partition from. - :type field: string + :type field: str :param filter_map: partition_key:partition_value map used for partition filtering. :type filter_map: map @@ -810,6 +810,7 @@ def _get_results(self, hql, schema='default', fetch_size=None, hive_conf=None): lowered_statement = statement.lower().strip() if (lowered_statement.startswith('select') or lowered_statement.startswith('with') or + lowered_statement.startswith('show') or (lowered_statement.startswith('set') and '=' not in lowered_statement)): description = [c for c in cur.description] diff --git a/airflow/hooks/http_hook.py b/airflow/hooks/http_hook.py index caa89d3142e9b..1e0c7b3058147 100644 --- a/airflow/hooks/http_hook.py +++ b/airflow/hooks/http_hook.py @@ -98,7 +98,11 @@ def run(self, endpoint, data=None, headers=None, extra_options=None): session = self.get_conn(headers) - url = self.base_url + endpoint + if not self.base_url.endswith('/') and not endpoint.startswith('/'): + url = self.base_url + '/' + endpoint + else: + url = self.base_url + endpoint + req = None if self.method == 'GET': # GET uses params diff --git a/airflow/hooks/slack_hook.py b/airflow/hooks/slack_hook.py index 17006fc9a5cc9..953ce319b1eee 100644 --- a/airflow/hooks/slack_hook.py +++ b/airflow/hooks/slack_hook.py @@ -34,9 +34,9 @@ def __init__(self, token=None, slack_conn_id=None): If both supplied, Slack API token will be used. :param token: Slack API token - :type token: string + :type token: str :param slack_conn_id: connection that has Slack API token in the password field - :type slack_conn_id: string + :type slack_conn_id: str """ self.token = self.__get_token(token, slack_conn_id) diff --git a/airflow/jobs.py b/airflow/jobs.py index 90dd293f1e61a..da1089d690b29 100644 --- a/airflow/jobs.py +++ b/airflow/jobs.py @@ -58,7 +58,7 @@ SimpleDagBag, list_py_file_paths) from airflow.utils.db import create_session, provide_session -from airflow.utils.email import send_email +from airflow.utils.email import send_email, get_email_address_list from airflow.utils.log.logging_mixin import LoggingMixin, set_context, StreamLogWriter from airflow.utils.net import get_hostname from airflow.utils.state import State @@ -711,7 +711,7 @@ def manage_slas(self, dag, session=None): for task in dag.tasks: if task.email: if isinstance(task.email, basestring): - emails.add(task.email) + emails |= set(get_email_address_list(task.email)) elif isinstance(task.email, (list, tuple)): emails |= set(task.email) if emails and len(slas): @@ -785,7 +785,7 @@ def create_dag_run(self, dag, session=None): for a DAG based on scheduling interval Returns DagRun if one is scheduled. Otherwise returns None. """ - if dag.schedule_interval: + if dag.schedule_interval and conf.getboolean('scheduler', 'USE_JOB_SCHEDULE'): active_runs = DagRun.find( dag_id=dag.dag_id, state=State.RUNNING, @@ -1101,7 +1101,7 @@ def _find_executable_task_instances(self, simple_dag_bag, states, session=None): task_instances_to_examine = ti_query.all() if len(task_instances_to_examine) == 0: - self.log.info("No tasks to consider for execution.") + self.log.debug("No tasks to consider for execution.") return executable_tis # Put one task instance on each line diff --git a/airflow/logging_config.py b/airflow/logging_config.py index 33c2dc82e1be5..84850b4f8244b 100644 --- a/airflow/logging_config.py +++ b/airflow/logging_config.py @@ -18,6 +18,7 @@ # under the License. # import logging +import warnings from logging.config import dictConfig from airflow import configuration as conf @@ -70,4 +71,36 @@ def configure_logging(): # otherwise Airflow would silently fall back on the default config raise e + validate_logging_config(logging_config) + return logging_config + + +def validate_logging_config(logging_config): + # Now lets validate the other logging-related settings + task_log_reader = conf.get('core', 'task_log_reader') + + logger = logging.getLogger('airflow.task') + + def _get_handler(name): + return next((h for h in logger.handlers if h.name == name), None) + + if _get_handler(task_log_reader) is None: + # Check for pre 1.10 setting that might be in deployed airflow.cfg files + if task_log_reader == "file.task" and _get_handler("task"): + warnings.warn( + "task_log_reader setting in [core] has a deprecated value of " + "{!r}, but no handler with this name was found. Please update " + "your config to use {!r}. Running config has been adjusted to " + "match".format( + task_log_reader, + "task", + ), + DeprecationWarning, + ) + conf.set('core', 'task_log_reader', 'task') + else: + raise AirflowConfigException( + "Configured task_log_reader {!r} was not a handler of the 'airflow.task' " + "logger.".format(task_log_reader) + ) diff --git a/airflow/macros/__init__.py b/airflow/macros/__init__.py index 81782727eb3ab..fdd64f88a680a 100644 --- a/airflow/macros/__init__.py +++ b/airflow/macros/__init__.py @@ -74,20 +74,3 @@ def _integrate_plugins(): for macros_module in macros_modules: sys.modules[macros_module.__name__] = macros_module globals()[macros_module._name] = macros_module - - ########################################################## - # TODO FIXME Remove in Airflow 2.0 - - import os - if not os.environ.get('AIRFLOW_USE_NEW_IMPORTS', False): - from zope.deprecation import deprecated - for _macro in macros_module._objects: - macro_name = _macro.__name__ - globals()[macro_name] = _macro - deprecated( - macro_name, - "Importing plugin macro '{i}' directly from " - "'airflow.macros' has been deprecated. Please " - "import from 'airflow.macros.[plugin_module]' " - "instead. Support for direct imports will be dropped " - "entirely in Airflow 2.0.".format(i=macro_name)) diff --git a/airflow/macros/hive.py b/airflow/macros/hive.py index bb60203e95347..f8e57bb5156dd 100644 --- a/airflow/macros/hive.py +++ b/airflow/macros/hive.py @@ -27,14 +27,14 @@ def max_partition( Gets the max partition for a table. :param schema: The hive schema the table lives in - :type schema: string + :type schema: str :param table: The hive table you are interested in, supports the dot notation as in "my_database.my_table", if a dot is found, the schema param is disregarded - :type table: string + :type table: str :param metastore_conn_id: The hive connection you are interested in. If your default is set you don't need to use this parameter. - :type metastore_conn_id: string + :type metastore_conn_id: str :param filter_map: partition_key:partition_value map used for partition filtering, e.g. {'key1': 'value1', 'key2': 'value2'}. Only partitions matching all partition_key:partition_value diff --git a/airflow/migrations/versions/0a2a5b66e19d_add_task_reschedule_table.py b/airflow/migrations/versions/0a2a5b66e19d_add_task_reschedule_table.py new file mode 100644 index 0000000000000..643a1ca81b678 --- /dev/null +++ b/airflow/migrations/versions/0a2a5b66e19d_add_task_reschedule_table.py @@ -0,0 +1,91 @@ +# flake8: noqa +# +# 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. + +"""add task_reschedule table + +Revision ID: 0a2a5b66e19d +Revises: 9635ae0956e7 +Create Date: 2018-06-17 22:50:00.053620 + +""" + +# revision identifiers, used by Alembic. +revision = '0a2a5b66e19d' +down_revision = '9635ae0956e7' +branch_labels = None +depends_on = None + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + + +TABLE_NAME = 'task_reschedule' +INDEX_NAME = 'idx_' + TABLE_NAME + '_dag_task_date' + +# For Microsoft SQL Server, TIMESTAMP is a row-id type, +# having nothing to do with date-time. DateTime() will +# be sufficient. +def mssql_timestamp(): + return sa.DateTime() + +def mysql_timestamp(): + return mysql.TIMESTAMP(fsp=6) + +def sa_timestamp(): + return sa.TIMESTAMP(timezone=True) + +def upgrade(): + # See 0e2a74e0fc9f_add_time_zone_awareness + conn = op.get_bind() + if conn.dialect.name == 'mysql': + timestamp = mysql_timestamp + elif conn.dialect.name == 'mssql': + timestamp = mssql_timestamp + else: + timestamp = sa_timestamp + + op.create_table( + TABLE_NAME, + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('task_id', sa.String(length=250), nullable=False), + sa.Column('dag_id', sa.String(length=250), nullable=False), + # use explicit server_default=None otherwise mysql implies defaults for first timestamp column + sa.Column('execution_date', timestamp(), nullable=False, server_default=None), + sa.Column('try_number', sa.Integer(), nullable=False), + sa.Column('start_date', timestamp(), nullable=False), + sa.Column('end_date', timestamp(), nullable=False), + sa.Column('duration', sa.Integer(), nullable=False), + sa.Column('reschedule_date', timestamp(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.ForeignKeyConstraint(['task_id', 'dag_id', 'execution_date'], + ['task_instance.task_id', 'task_instance.dag_id','task_instance.execution_date'], + name='task_reschedule_dag_task_date_fkey') + ) + op.create_index( + INDEX_NAME, + TABLE_NAME, + ['dag_id', 'task_id', 'execution_date'], + unique=False + ) + + +def downgrade(): + op.drop_index(INDEX_NAME, table_name=TABLE_NAME) + op.drop_table(TABLE_NAME) diff --git a/airflow/migrations/versions/0e2a74e0fc9f_add_time_zone_awareness.py b/airflow/migrations/versions/0e2a74e0fc9f_add_time_zone_awareness.py index 567172f9bf68e..ac7824fd9e2f5 100644 --- a/airflow/migrations/versions/0e2a74e0fc9f_add_time_zone_awareness.py +++ b/airflow/migrations/versions/0e2a74e0fc9f_add_time_zone_awareness.py @@ -86,8 +86,8 @@ def upgrade(): op.alter_column(table_name='xcom', column_name='timestamp', type_=mysql.TIMESTAMP(fsp=6)) op.alter_column(table_name='xcom', column_name='execution_date', type_=mysql.TIMESTAMP(fsp=6)) else: - # sqlite datetime is fine as is not converting - if conn.dialect.name == 'sqlite': + # sqlite and mssql datetime are fine as is. Therefore, not converting + if conn.dialect.name in ('sqlite', 'mssql'): return # we try to be database agnostic, but not every db (e.g. sqlserver) @@ -182,7 +182,7 @@ def downgrade(): op.alter_column(table_name='xcom', column_name='DATETIME', type_=mysql.DATETIME(fsp=6)) op.alter_column(table_name='xcom', column_name='execution_date', type_=mysql.DATETIME(fsp=6)) else: - if conn.dialect.name == 'sqlite': + if conn.dialect.name in ('sqlite', 'mssql'): return # we try to be database agnostic, but not every db (e.g. sqlserver) diff --git a/airflow/migrations/versions/33ae817a1ff4_add_kubernetes_resource_checkpointing.py b/airflow/migrations/versions/33ae817a1ff4_add_kubernetes_resource_checkpointing.py index 925bf26df06cf..88a4199d3250e 100644 --- a/airflow/migrations/versions/33ae817a1ff4_add_kubernetes_resource_checkpointing.py +++ b/airflow/migrations/versions/33ae817a1ff4_add_kubernetes_resource_checkpointing.py @@ -38,12 +38,23 @@ def upgrade(): + + columns_and_constraints = [ + sa.Column("one_row_id", sa.Boolean, server_default=sa.true(), primary_key=True), + sa.Column("resource_version", sa.String(255)) + ] + + conn = op.get_bind() + + # alembic creates an invalid SQL for mssql dialect + if conn.dialect.name not in ('mssql'): + columns_and_constraints.append(sa.CheckConstraint("one_row_id", name="kube_resource_version_one_row_id")) + table = op.create_table( RESOURCE_TABLE, - sa.Column("one_row_id", sa.Boolean, server_default=sa.true(), primary_key=True), - sa.Column("resource_version", sa.String(255)), - sa.CheckConstraint("one_row_id", name="kube_resource_version_one_row_id") + *columns_and_constraints ) + op.bulk_insert(table, [ {"resource_version": ""} ]) diff --git a/airflow/migrations/versions/86770d1215c0_add_kubernetes_scheduler_uniqueness.py b/airflow/migrations/versions/86770d1215c0_add_kubernetes_scheduler_uniqueness.py index ace7845965bf6..633201b03b6cd 100644 --- a/airflow/migrations/versions/86770d1215c0_add_kubernetes_scheduler_uniqueness.py +++ b/airflow/migrations/versions/86770d1215c0_add_kubernetes_scheduler_uniqueness.py @@ -38,12 +38,23 @@ def upgrade(): + + columns_and_constraints = [ + sa.Column("one_row_id", sa.Boolean, server_default=sa.true(), primary_key=True), + sa.Column("worker_uuid", sa.String(255)) + ] + + conn = op.get_bind() + + # alembic creates an invalid SQL for mssql dialect + if conn.dialect.name not in ('mssql'): + columns_and_constraints.append(sa.CheckConstraint("one_row_id", name="kube_worker_one_row_id")) + table = op.create_table( RESOURCE_TABLE, - sa.Column("one_row_id", sa.Boolean, server_default=sa.true(), primary_key=True), - sa.Column("worker_uuid", sa.String(255)), - sa.CheckConstraint("one_row_id", name="kube_worker_one_row_id") + *columns_and_constraints ) + op.bulk_insert(table, [ {"worker_uuid": ""} ]) diff --git a/airflow/models.py b/airflow/models.py index 55badf4828541..239a3a52638c9 100755 --- a/airflow/models.py +++ b/airflow/models.py @@ -26,7 +26,13 @@ from builtins import str, object, bytes, ImportError as BuiltinImportError import copy -from collections import namedtuple, defaultdict, Hashable +from collections import namedtuple, defaultdict +try: + # Fix Python > 3.7 deprecation + from collections.abc import Hashable +except ImportError: + # Preserve Python < 3.3 compatibility + from collections import Hashable from datetime import timedelta import dill @@ -53,11 +59,11 @@ import uuid from datetime import datetime from urllib.parse import urlparse, quote, parse_qsl - from sqlalchemy import ( - Column, Integer, String, DateTime, Text, Boolean, ForeignKey, PickleType, - Index, Float, LargeBinary, UniqueConstraint) -from sqlalchemy import func, or_, and_, true as sqltrue + Boolean, Column, DateTime, Float, ForeignKey, ForeignKeyConstraint, Index, + Integer, LargeBinary, PickleType, String, Text, UniqueConstraint, + and_, asc, func, or_, true as sqltrue +) from sqlalchemy.ext.declarative import declarative_base, declared_attr from sqlalchemy.orm import reconstructor, relationship, synonym @@ -70,7 +76,8 @@ from airflow.executors import GetDefaultExecutor, LocalExecutor from airflow import configuration from airflow.exceptions import ( - AirflowDagCycleException, AirflowException, AirflowSkipException, AirflowTaskTimeout + AirflowDagCycleException, AirflowException, AirflowSkipException, AirflowTaskTimeout, + AirflowRescheduleException ) from airflow.dag.base_dag import BaseDag, BaseDagBag from airflow.lineage import apply_lineage, prepare_lineage @@ -337,7 +344,8 @@ def process_file(self, filepath, only_if_updated=True, safe_mode=True): return found_dags mods = [] - if not zipfile.is_zipfile(filepath): + is_zipfile = zipfile.is_zipfile(filepath) + if not is_zipfile: if safe_mode and os.path.isfile(filepath): with open(filepath, 'rb') as f: content = f.read() @@ -409,7 +417,7 @@ def process_file(self, filepath, only_if_updated=True, safe_mode=True): if isinstance(dag, DAG): if not dag.full_filepath: dag.full_filepath = filepath - if dag.fileloc != filepath: + if dag.fileloc != filepath and not is_zipfile: dag.fileloc = filepath try: dag.is_subdag = False @@ -520,10 +528,12 @@ def collect_dags( Given a file path or a folder, this method looks for python modules, imports them and adds them to the dagbag collection. - Note that if a .airflowignore file is found while processing, - the directory, it will behaves much like a .gitignore does, + Note that if a ``.airflowignore`` file is found while processing + the directory, it will behave much like a ``.gitignore``, ignoring files that match any of the regex patterns specified - in the file. **Note**: The patterns in .airflowignore are treated as + in the file. + + **Note**: The patterns in .airflowignore are treated as un-anchored regexes, not shell-like glob patterns. """ start_dttm = timezone.utcnow() @@ -580,21 +590,6 @@ def dagbag_report(self): table=pprinttable(stats), ) - @provide_session - def deactivate_inactive_dags(self, session=None): - active_dag_ids = [dag.dag_id for dag in list(self.dags.values())] - for dag in session.query( - DagModel).filter(~DagModel.dag_id.in_(active_dag_ids)).all(): - dag.is_active = False - session.merge(dag) - session.commit() - - @provide_session - def paused_dags(self, session=None): - dag_ids = [dp.dag_id for dp in session.query(DagModel).filter( - DagModel.is_paused.__eq__(True))] - return dag_ids - class User(Base): __tablename__ = "users" @@ -1067,15 +1062,15 @@ def generate_command(dag_id, :type mark_success: bool :param ignore_all_deps: Ignore all ignorable dependencies. Overrides the other ignore_* parameters. - :type ignore_all_deps: boolean + :type ignore_all_deps: bool :param ignore_depends_on_past: Ignore depends_on_past parameter of DAGs (e.g. for Backfills) - :type ignore_depends_on_past: boolean + :type ignore_depends_on_past: bool :param ignore_task_deps: Ignore task-specific dependencies such as depends_on_past and trigger rule - :type ignore_task_deps: boolean + :type ignore_task_deps: bool :param ignore_ti_state: Ignore the task instance's previous failure/success - :type ignore_ti_state: boolean + :type ignore_ti_state: bool :param local: Whether to run the task locally :type local: bool :param pickle_id: If the DAG was serialized to the DB, the ID @@ -1119,10 +1114,10 @@ def log_url(self): BASE_URL = configuration.conf.get('webserver', 'BASE_URL') if settings.RBAC: return BASE_URL + ( - "/log/list/" - "?_flt_3_dag_id={self.dag_id}" - "&_flt_3_task_id={self.task_id}" - "&_flt_3_execution_date={iso}" + "/log?" + "execution_date={iso}" + "&task_id={self.task_id}" + "&dag_id={self.dag_id}" ).format(**locals()) else: return BASE_URL + ( @@ -1326,7 +1321,7 @@ def are_dependencies_met( :type session: Session :param verbose: whether log details on failed dependencies on info or debug log level - :type verbose: boolean + :type verbose: bool """ dep_context = dep_context or DepContext() failed = False @@ -1466,19 +1461,19 @@ def _check_and_change_state_before_execution( executed, in preparation for _run_raw_task :param verbose: whether to turn on more verbose logging - :type verbose: boolean + :type verbose: bool :param ignore_all_deps: Ignore all of the non-critical dependencies, just runs - :type ignore_all_deps: boolean + :type ignore_all_deps: bool :param ignore_depends_on_past: Ignore depends_on_past DAG attribute - :type ignore_depends_on_past: boolean + :type ignore_depends_on_past: bool :param ignore_task_deps: Don't check the dependencies of this TI's task - :type ignore_task_deps: boolean + :type ignore_task_deps: bool :param ignore_ti_state: Disregards previous task instance state - :type ignore_ti_state: boolean + :type ignore_ti_state: bool :param mark_success: Don't run the task, mark its state as success - :type mark_success: boolean + :type mark_success: bool :param test_mode: Doesn't record success or failure in the DB - :type test_mode: boolean + :type test_mode: bool :param pool: specifies the pool to use to run the task instance :type pool: str :return: whether the state was changed to running or not @@ -1596,9 +1591,9 @@ def _run_raw_task( only after another function changes the state to running. :param mark_success: Don't run the task, mark its state as success - :type mark_success: boolean + :type mark_success: bool :param test_mode: Doesn't record success or failure in the DB - :type test_mode: boolean + :type test_mode: bool :param pool: specifies the pool to use to run the task instance :type pool: str """ @@ -1672,6 +1667,10 @@ def signal_handler(signum, frame): except AirflowSkipException: self.refresh_from_db(lock_for_update=True) self.state = State.SKIPPED + except AirflowRescheduleException as reschedule_exception: + self.refresh_from_db() + self._handle_reschedule(reschedule_exception, test_mode, context) + return except AirflowException as e: self.refresh_from_db() # for case when task is marked as success/failed externally @@ -1743,6 +1742,32 @@ def dry_run(self): self.render_templates() task_copy.dry_run() + @provide_session + def _handle_reschedule(self, reschedule_exception, test_mode=False, context=None, + session=None): + # Don't record reschedule request in test mode + if test_mode: + return + + self.end_date = timezone.utcnow() + self.set_duration() + + # Log reschedule request + session.add(TaskReschedule(self.task, self.execution_date, self._try_number, + self.start_date, self.end_date, + reschedule_exception.reschedule_date)) + + # set state + self.state = State.NONE + + # Decrement try_number so subsequent runs will use the same try number and write + # to same log file. + self._try_number -= 1 + + session.merge(self) + session.commit() + self.log.info('Rescheduling task, marking task as NONE') + @provide_session def handle_failure(self, error, test_mode=False, context=None, session=None): self.log.exception(error) @@ -1815,12 +1840,16 @@ def get_template_context(self, session=None): next_execution_date = task.dag.following_schedule(self.execution_date) next_ds = None + next_ds_nodash = None if next_execution_date: next_ds = next_execution_date.strftime('%Y-%m-%d') + next_ds_nodash = next_ds.replace('-', '') prev_ds = None + prev_ds_nodash = None if prev_execution_date: prev_ds = prev_execution_date.strftime('%Y-%m-%d') + prev_ds_nodash = prev_ds.replace('-', '') ds_nodash = ds.replace('-', '') ts_nodash = ts.replace('-', '').replace(':', '') @@ -1887,7 +1916,9 @@ def __repr__(self): 'dag': task.dag, 'ds': ds, 'next_ds': next_ds, + 'next_ds_nodash': next_ds_nodash, 'prev_ds': prev_ds, + 'prev_ds_nodash': prev_ds_nodash, 'ds_nodash': ds_nodash, 'ts': ts, 'ts_nodash': ts_nodash, @@ -1971,7 +2002,7 @@ def xcom_push( Make an XCom available for tasks to pull. :param key: A key for the XCom - :type key: string + :type key: str :param value: A value for the XCom. The value is pickled and stored in the database. :type value: any pickleable object @@ -2017,13 +2048,13 @@ def xcom_pull( available as a constant XCOM_RETURN_KEY. This key is automatically given to XComs returned by tasks (as opposed to being pushed manually). To remove the filter, pass key=None. - :type key: string + :type key: str :param task_ids: Only XComs from tasks with matching ids will be pulled. Can pass None to remove the filter. - :type task_ids: string or iterable of strings (representing task_ids) + :type task_ids: str or iterable of strings (representing task_ids) :param dag_id: If provided, only pulls XComs from this DAG. If None (default), the DAG of the calling task is used. - :type dag_id: string + :type dag_id: str :param include_prior_dates: If False, only XComs from the current execution_date are returned. If True, XComs from previous dates are returned as well. @@ -2094,6 +2125,66 @@ def __init__(self, task, execution_date, start_date, end_date): self.duration = None +class TaskReschedule(Base): + """ + TaskReschedule tracks rescheduled task instances. + """ + + __tablename__ = "task_reschedule" + + id = Column(Integer, primary_key=True) + task_id = Column(String(ID_LEN), nullable=False) + dag_id = Column(String(ID_LEN), nullable=False) + execution_date = Column(UtcDateTime, nullable=False) + try_number = Column(Integer, nullable=False) + start_date = Column(UtcDateTime, nullable=False) + end_date = Column(UtcDateTime, nullable=False) + duration = Column(Integer, nullable=False) + reschedule_date = Column(UtcDateTime, nullable=False) + + __table_args__ = ( + Index('idx_task_reschedule_dag_task_date', dag_id, task_id, execution_date, + unique=False), + ForeignKeyConstraint([task_id, dag_id, execution_date], + [TaskInstance.task_id, TaskInstance.dag_id, + TaskInstance.execution_date], + name='task_reschedule_dag_task_date_fkey') + ) + + def __init__(self, task, execution_date, try_number, start_date, end_date, + reschedule_date): + self.dag_id = task.dag_id + self.task_id = task.task_id + self.execution_date = execution_date + self.try_number = try_number + self.start_date = start_date + self.end_date = end_date + self.reschedule_date = reschedule_date + self.duration = (self.end_date - self.start_date).total_seconds() + + @staticmethod + @provide_session + def find_for_task_instance(task_instance, session): + """ + Returns all task reschedules for the task instance and try number, + in ascending order. + + :param task_instance: the task instance to find task reschedules for + :type task_instance: TaskInstance + """ + TR = TaskReschedule + return ( + session + .query(TR) + .filter(TR.dag_id == task_instance.dag_id, + TR.task_id == task_instance.task_id, + TR.execution_date == task_instance.execution_date, + TR.try_number == task_instance.try_number) + .order_by(asc(TR.id)) + .all() + ) + + class Log(Base): """ Used to actively log events to the database @@ -2202,9 +2293,9 @@ class derived from this one results in the creation of a task object, be set by using the set_upstream and/or set_downstream methods. :param task_id: a unique, meaningful id for the task - :type task_id: string + :type task_id: str :param owner: the owner of the task, using the unix username is recommended - :type owner: string + :type owner: str :param retries: the number of retries that should be performed before failing the task :type retries: int @@ -2306,6 +2397,7 @@ class derived from this one results in the creation of a task object, :type on_failure_callback: callable :param on_retry_callback: much like the ``on_failure_callback`` except that it is executed when retries occur. + :type on_retry_callback: callable :param on_success_callback: much like the ``on_failure_callback`` except that it is executed when the task succeeds. :type on_success_callback: callable @@ -2328,14 +2420,17 @@ class derived from this one results in the creation of a task object, :param executor_config: Additional task-level configuration parameters that are interpreted by a specific executor. Parameters are namespaced by the name of executor. - ``example: to run this task in a specific docker container through - the KubernetesExecutor - MyOperator(..., - executor_config={ - "KubernetesExecutor": - {"image": "myCustomDockerImage"} - } - )`` + + **Example**: to run this task in a specific docker container through + the KubernetesExecutor :: + + MyOperator(..., + executor_config={ + "KubernetesExecutor": + {"image": "myCustomDockerImage"} + } + ) + :type executor_config: dict """ @@ -2413,10 +2508,17 @@ def __init__( self.email = email self.email_on_retry = email_on_retry self.email_on_failure = email_on_failure + self.start_date = start_date if start_date and not isinstance(start_date, datetime): self.log.warning("start_date for %s isn't datetime.datetime", self) + elif start_date: + self.start_date = timezone.convert_to_utc(start_date) + self.end_date = end_date + if end_date: + self.end_date = timezone.convert_to_utc(end_date) + if not TriggerRule.is_valid(trigger_rule): raise AirflowException( "The trigger_rule must be one of {all_triggers}," @@ -3099,7 +3201,7 @@ def get_current(cls, dag_id, session=None): class DAG(BaseDag, LoggingMixin): """ A dag (directed acyclic graph) is a collection of tasks with directional - dependencies. A dag also has a schedule, a start end an end date + dependencies. A dag also has a schedule, a start date and an end date (optional). For each schedule, (say daily or hourly), the DAG needs to run each individual tasks as their dependencies are met. Certain tasks have the property of depending on their own past, meaning that they can't run @@ -3109,9 +3211,9 @@ class DAG(BaseDag, LoggingMixin): added once to a DAG. :param dag_id: The id of the DAG - :type dag_id: string + :type dag_id: str :param description: The description for the DAG to e.g. be shown on the webserver - :type description: string + :type description: str :param schedule_interval: Defines how often that DAG runs, this timedelta object gets added to your latest task instance's execution_date to figure out the next schedule @@ -3128,7 +3230,7 @@ class DAG(BaseDag, LoggingMixin): defines where jinja will look for your templates. Order matters. Note that jinja/airflow includes the path of your DAG file by default - :type template_searchpath: string or list of stings + :type template_searchpath: str or list of stings :param user_defined_macros: a dictionary of macros that will be exposed in your jinja templates. For example, passing ``dict(foo='bar')`` to this argument allows you to ``{{ foo }}`` in all jinja @@ -3167,9 +3269,9 @@ class DAG(BaseDag, LoggingMixin): :type sla_miss_callback: types.FunctionType :param default_view: Specify DAG default view (tree, graph, duration, gantt, landing_times) - :type default_view: string + :type default_view: str :param orientation: Specify DAG orientation in graph view (LR, TB, RL, BT) - :type orientation: string + :type orientation: str :param catchup: Perform scheduler catchup (or only run latest)? Defaults to True :type catchup: bool :param on_failure_callback: A function to be called when a DagRun of this dag fails. @@ -3274,6 +3376,8 @@ def __init__( self.on_success_callback = on_success_callback self.on_failure_callback = on_failure_callback + self._old_context_manager_dags = [] + self._comps = { 'dag_id', 'task_ids', @@ -3321,13 +3425,13 @@ def __hash__(self): def __enter__(self): global _CONTEXT_MANAGER_DAG - self._old_context_manager_dag = _CONTEXT_MANAGER_DAG + self._old_context_manager_dags.append(_CONTEXT_MANAGER_DAG) _CONTEXT_MANAGER_DAG = self return self def __exit__(self, _type, _value, _tb): global _CONTEXT_MANAGER_DAG - _CONTEXT_MANAGER_DAG = self._old_context_manager_dag + _CONTEXT_MANAGER_DAG = self._old_context_manager_dags.pop() # /Context Manager ---------------------------------------------- @@ -3630,8 +3734,7 @@ def subdags(self): """ Returns a list of the subdag objects associated to this DAG """ - # Check SubDag for class but don't check class directly, see - # https://github.com/airbnb/airflow/issues/1168 + # Check SubDag for class but don't check class directly from airflow.operators.subdag_operator import SubDagOperator subdag_lst = [] for task in self.tasks: @@ -3776,9 +3879,11 @@ def clear( only_running=False, confirm_prompt=False, include_subdags=True, + include_parentdag=True, reset_dag_runs=True, dry_run=False, session=None, + get_tis=False, ): """ Clears a set of task instances associated with the current dag for @@ -3799,15 +3904,39 @@ def clear( tis = session.query(TI).filter(TI.dag_id == self.dag_id) tis = tis.filter(TI.task_id.in_(self.task_ids)) + if include_parentdag and self.is_subdag: + + p_dag = self.parent_dag.sub_dag( + task_regex=self.dag_id.split('.')[1], + include_upstream=False, + include_downstream=True) + + tis = tis.union(p_dag.clear( + start_date=start_date, end_date=end_date, + only_failed=only_failed, + only_running=only_running, + confirm_prompt=confirm_prompt, + include_subdags=include_subdags, + include_parentdag=False, + reset_dag_runs=reset_dag_runs, + get_tis=True, + session=session, + )) + if start_date: tis = tis.filter(TI.execution_date >= start_date) if end_date: tis = tis.filter(TI.execution_date <= end_date) if only_failed: - tis = tis.filter(TI.state == State.FAILED) + tis = tis.filter(or_( + TI.state == State.FAILED, + TI.state == State.UPSTREAM_FAILED)) if only_running: tis = tis.filter(TI.state == State.RUNNING) + if get_tis: + return tis + if dry_run: tis = tis.all() session.expunge_all() @@ -3851,6 +3980,7 @@ def clear_dags( only_running=False, confirm_prompt=False, include_subdags=True, + include_parentdag=False, reset_dag_runs=True, dry_run=False, ): @@ -3863,6 +3993,7 @@ def clear_dags( only_running=only_running, confirm_prompt=False, include_subdags=include_subdags, + include_parentdag=include_parentdag, reset_dag_runs=reset_dag_runs, dry_run=True) all_tis.extend(tis) @@ -4056,16 +4187,6 @@ def add_tasks(self, tasks): for task in tasks: self.add_task(task) - @provide_session - def db_merge(self, session=None): - BO = BaseOperator - tasks = session.query(BO).filter(BO.dag_id == self.dag_id).all() - for t in tasks: - session.delete(t) - session.commit() - session.merge(self) - session.commit() - def run( self, start_date=None, @@ -4103,12 +4224,12 @@ def run( dependencies for the first set of tasks only :type ignore_first_depends_on_past: bool :param pool: Resource pool to use - :type pool: string + :type pool: str :param delay_on_limit_secs: Time in seconds to wait before next attempt to run dag run when max_active_runs limit has been reached :type delay_on_limit_secs: float :param verbose: Make logging output more verbose - :type verbose: boolean + :type verbose: bool :param conf: user defined dictionary passed from CLI :type conf: dict """ @@ -4157,7 +4278,7 @@ def create_dagrun(self, Returns the dag run. :param run_id: defines the the run id for this dag run - :type run_id: string + :type run_id: str :param execution_date: the execution date of this dag run :type execution_date: datetime :param state: the state of the dag run @@ -4840,6 +4961,8 @@ def get_state(self): def set_state(self, state): if self._state != state: self._state = state + self.end_date = timezone.utcnow() if self._state in State.finished() else None + if self.dag_id is not None: # FIXME: Due to the scoped_session factor we we don't get a clean # session here, so something really weird goes on: @@ -4884,9 +5007,9 @@ def find(dag_id=None, run_id=None, execution_date=None, Returns a set of dag runs for the given search criteria. :param dag_id: the dag_id to find dag runs for - :type dag_id: integer, list + :type dag_id: int, list :param run_id: defines the the run id for this dag run - :type run_id: string + :type run_id: str :param execution_date: the execution date :type execution_date: datetime :param state: the state of the dag run @@ -5040,12 +5163,13 @@ def update_state(self, session=None): no_dependencies_met = True for ut in unfinished_tasks: # We need to flag upstream and check for changes because upstream - # failures can result in deadlock false positives + # failures/re-schedules can result in deadlock false positives old_state = ut.state deps_met = ut.are_dependencies_met( dep_context=DepContext( flag_upstream_failed=True, - ignore_in_retry_period=True), + ignore_in_retry_period=True, + ignore_in_reschedule_period=True), session=session) if deps_met or old_state != ut.current_state(session=session): no_dependencies_met = False @@ -5063,7 +5187,7 @@ def update_state(self, session=None): if (not unfinished_tasks and any(r.state in (State.FAILED, State.UPSTREAM_FAILED) for r in roots)): self.log.info('Marking run %s failed', self) - self.state = State.FAILED + self.set_state(State.FAILED) dag.handle_callback(self, success=False, reason='task_failure', session=session) @@ -5071,20 +5195,20 @@ def update_state(self, session=None): elif not unfinished_tasks and all(r.state in (State.SUCCESS, State.SKIPPED) for r in roots): self.log.info('Marking run %s successful', self) - self.state = State.SUCCESS + self.set_state(State.SUCCESS) dag.handle_callback(self, success=True, reason='success', session=session) # if *all tasks* are deadlocked, the run failed elif (unfinished_tasks and none_depends_on_past and none_task_concurrency and no_dependencies_met): self.log.info('Deadlock; marking run %s failed', self) - self.state = State.FAILED + self.set_state(State.FAILED) dag.handle_callback(self, success=False, reason='all_tasks_deadlocked', session=session) # finally, if the roots aren't done, the dag is still running else: - self.state = State.RUNNING + self.set_state(State.RUNNING) # todo: determine we want to use with_for_update to make sure to lock the run session.merge(self) @@ -5132,6 +5256,9 @@ def verify_integrity(self, session=None): continue if task.task_id not in task_ids: + Stats.incr( + "task_instance_created-{}".format(task.__class__.__name__), + 1, 1) ti = TaskInstance(task, self.execution_date) session.add(ti) diff --git a/airflow/operators/__init__.py b/airflow/operators/__init__.py index f732d8f8a85b1..114d189da14ab 100644 --- a/airflow/operators/__init__.py +++ b/airflow/operators/__init__.py @@ -16,93 +16,3 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. - -import sys -import os -from airflow.models import BaseOperator # noqa: F401 - -# ------------------------------------------------------------------------ -# -# #TODO #FIXME Airflow 2.0 -# -# Old import machinary below. -# -# This is deprecated but should be kept until Airflow 2.0 -# for compatibility. -# -# ------------------------------------------------------------------------ - -# Imports operators dynamically while keeping the package API clean, -# abstracting the underlying modules - -_operators = { - 'bash_operator': ['BashOperator'], - 'check_operator': [ - 'CheckOperator', - 'ValueCheckOperator', - 'IntervalCheckOperator', - ], - 'python_operator': [ - 'PythonOperator', - 'BranchPythonOperator', - 'ShortCircuitOperator', - ], - 'hive_operator': ['HiveOperator'], - 'pig_operator': ['PigOperator'], - 'presto_check_operator': [ - 'PrestoCheckOperator', - 'PrestoValueCheckOperator', - 'PrestoIntervalCheckOperator', - ], - 'dagrun_operator': ['TriggerDagRunOperator'], - 'dummy_operator': ['DummyOperator'], - 'email_operator': ['EmailOperator'], - 'hive_to_samba_operator': ['Hive2SambaOperator'], - 'latest_only_operator': ['LatestOnlyOperator'], - 'mysql_operator': ['MySqlOperator'], - 'sqlite_operator': ['SqliteOperator'], - 'mysql_to_hive': ['MySqlToHiveTransfer'], - 'postgres_operator': ['PostgresOperator'], - 'subdag_operator': ['SubDagOperator'], - 'hive_stats_operator': ['HiveStatsCollectionOperator'], - 's3_to_hive_operator': ['S3ToHiveTransfer'], - 'hive_to_mysql': ['HiveToMySqlTransfer'], - 'presto_to_mysql': ['PrestoToMySqlTransfer'], - 's3_file_transform_operator': ['S3FileTransformOperator'], - 'http_operator': ['SimpleHttpOperator'], - 'hive_to_druid': ['HiveToDruidTransfer'], - 'jdbc_operator': ['JdbcOperator'], - 'mssql_operator': ['MsSqlOperator'], - 'mssql_to_hive': ['MsSqlToHiveTransfer'], - 'slack_operator': ['SlackAPIOperator', 'SlackAPIPostOperator'], - 'generic_transfer': ['GenericTransfer'], - 'oracle_operator': ['OracleOperator'] -} - -if not os.environ.get('AIRFLOW_USE_NEW_IMPORTS', False): - from airflow.utils.helpers import AirflowImporter - airflow_importer = AirflowImporter(sys.modules[__name__], _operators) - - -def _integrate_plugins(): - """Integrate plugins to the context""" - from airflow.plugins_manager import operators_modules - for operators_module in operators_modules: - sys.modules[operators_module.__name__] = operators_module - globals()[operators_module._name] = operators_module - - ########################################################## - # TODO FIXME Remove in Airflow 2.0 - - if not os.environ.get('AIRFLOW_USE_NEW_IMPORTS', False): - from zope.deprecation import deprecated - for _operator in operators_module._objects: - operator_name = _operator.__name__ - globals()[operator_name] = _operator - deprecated( - operator_name, - "Importing plugin operator '{i}' directly from " - "'airflow.operators' has been deprecated. Please " - "import from 'airflow.operators.[plugin_module]' " - "instead. Support for direct imports will be dropped " - "entirely in Airflow 2.0.".format(i=operator_name)) diff --git a/airflow/operators/bash_operator.py b/airflow/operators/bash_operator.py index 17de0145a3e13..5ca63deeab2b0 100644 --- a/airflow/operators/bash_operator.py +++ b/airflow/operators/bash_operator.py @@ -38,7 +38,7 @@ class BashOperator(BaseOperator): :param bash_command: The command, set of commands or reference to a bash script (must be '.sh') to be executed. (templated) - :type bash_command: string + :type bash_command: str :param xcom_push: If xcom_push is True, the last line written to stdout will also be pushed to an XCom when the bash command completes. :type xcom_push: bool diff --git a/airflow/operators/check_operator.py b/airflow/operators/check_operator.py index a0d213cf6619c..98af08dd3ac60 100644 --- a/airflow/operators/check_operator.py +++ b/airflow/operators/check_operator.py @@ -59,7 +59,7 @@ class CheckOperator(BaseOperator): single record from an external source. :param sql: the sql to be executed. (templated) - :type sql: string + :type sql: str """ template_fields = ('sql',) @@ -114,7 +114,7 @@ class ValueCheckOperator(BaseOperator): single record from an external source. :param sql: the sql to be executed. (templated) - :type sql: string + :type sql: str """ __mapper_args__ = { diff --git a/airflow/operators/docker_operator.py b/airflow/operators/docker_operator.py index 69dc1ebef71e6..517199be513cb 100644 --- a/airflow/operators/docker_operator.py +++ b/airflow/operators/docker_operator.py @@ -53,6 +53,10 @@ class DockerOperator(BaseOperator): This value gets multiplied with 1024. See https://docs.docker.com/engine/reference/run/#cpu-share-constraint :type cpus: float + :param dns: Docker custom DNS servers + :type dns: list of strings + :param dns_search: Docker custom DNS search domain + :type dns_search: list of strings :param docker_url: URL of the host running the docker daemon. Default is unix://var/run/docker.sock :type docker_url: str @@ -127,6 +131,8 @@ def __init__( xcom_push=False, xcom_all=False, docker_conn_id=None, + dns=None, + dns_search=None, *args, **kwargs): @@ -134,6 +140,8 @@ def __init__( self.api_version = api_version self.command = command self.cpus = cpus + self.dns = dns + self.dns_search = dns_search self.docker_url = docker_url self.environment = environment or {} self.force_pull = force_pull @@ -203,7 +211,9 @@ def execute(self, context): host_config=self.cli.create_host_config( binds=self.volumes, network_mode=self.network_mode, - shm_size=self.shm_size), + shm_size=self.shm_size, + dns=self.dns, + dns_search=self.dns_search), image=image, mem_limit=self.mem_limit, user=self.user, diff --git a/airflow/operators/druid_check_operator.py b/airflow/operators/druid_check_operator.py index 73f7915ca5f40..39674fdd3983e 100644 --- a/airflow/operators/druid_check_operator.py +++ b/airflow/operators/druid_check_operator.py @@ -51,9 +51,9 @@ class DruidCheckOperator(CheckOperator): without stopping the progress of the DAG. :param sql: the sql to be executed - :type sql: string + :type sql: str :param druid_broker_conn_id: reference to the druid broker - :type druid_broker_conn_id: string + :type druid_broker_conn_id: str """ @apply_defaults diff --git a/airflow/operators/email_operator.py b/airflow/operators/email_operator.py index 7b4109c3a5619..d6af588d06fee 100644 --- a/airflow/operators/email_operator.py +++ b/airflow/operators/email_operator.py @@ -29,10 +29,10 @@ class EmailOperator(BaseOperator): :param to: list of emails to send the email to. (templated) :type to: list or string (comma or semicolon delimited) :param subject: subject line for the email. (templated) - :type subject: string + :type subject: str :param html_content: content of the email, html markup is allowed. (templated) - :type html_content: string + :type html_content: str :param files: file names to attach in email :type files: list :param cc: list of recipients to be added in CC field @@ -40,10 +40,10 @@ class EmailOperator(BaseOperator): :param bcc: list of recipients to be added in BCC field :type bcc: list or string (comma or semicolon delimited) :param mime_subtype: MIME sub content type - :type mime_subtype: string + :type mime_subtype: str :param mime_charset: character set parameter added to the Content-Type header. - :type mime_charset: string + :type mime_charset: str """ template_fields = ('to', 'subject', 'html_content') diff --git a/airflow/operators/hive_operator.py b/airflow/operators/hive_operator.py index 6b06fd4ba0d75..cf3f655e59313 100644 --- a/airflow/operators/hive_operator.py +++ b/airflow/operators/hive_operator.py @@ -35,9 +35,9 @@ class HiveOperator(BaseOperator): :param hql: the hql to be executed. Note that you may also use a relative path from the dag file of a (template) hive script. (templated) - :type hql: string + :type hql: str :param hive_cli_conn_id: reference to the Hive database. (templated) - :type hive_cli_conn_id: string + :type hive_cli_conn_id: str :param hiveconfs: if defined, these key value pairs will be passed to hive as ``-hiveconf "key"="value"`` :type hiveconfs: dict @@ -47,18 +47,18 @@ class HiveOperator(BaseOperator): Note that you may want to use this along with the ``DAG(user_defined_macros=myargs)`` parameter. View the DAG object documentation for more details. - :type hiveconf_jinja_translate: boolean + :type hiveconf_jinja_translate: bool :param script_begin_tag: If defined, the operator will get rid of the part of the script before the first occurrence of `script_begin_tag` :type script_begin_tag: str :param mapred_queue: queue used by the Hadoop CapacityScheduler. (templated) - :type mapred_queue: string + :type mapred_queue: str :param mapred_queue_priority: priority within CapacityScheduler queue. Possible settings include: VERY_HIGH, HIGH, NORMAL, LOW, VERY_LOW - :type mapred_queue_priority: string + :type mapred_queue_priority: str :param mapred_job_name: This name will appear in the jobtracker. This can make monitoring easier. - :type mapred_job_name: string + :type mapred_job_name: str """ template_fields = ('hql', 'schema', 'hive_cli_conn_id', 'mapred_queue', diff --git a/airflow/operators/hive_to_samba_operator.py b/airflow/operators/hive_to_samba_operator.py index fa2a9619eb73e..7963524a106e3 100644 --- a/airflow/operators/hive_to_samba_operator.py +++ b/airflow/operators/hive_to_samba_operator.py @@ -32,11 +32,11 @@ class Hive2SambaOperator(BaseOperator): results of the query as a csv to a Samba location. :param hql: the hql to be exported. (templated) - :type hql: string + :type hql: str :param hiveserver2_conn_id: reference to the hiveserver2 service - :type hiveserver2_conn_id: string + :type hiveserver2_conn_id: str :param samba_conn_id: reference to the samba destination - :type samba_conn_id: string + :type samba_conn_id: str """ template_fields = ('hql', 'destination_filepath') diff --git a/airflow/operators/http_operator.py b/airflow/operators/http_operator.py index e757118fc0bd2..0585a92a86e48 100644 --- a/airflow/operators/http_operator.py +++ b/airflow/operators/http_operator.py @@ -28,11 +28,11 @@ class SimpleHttpOperator(BaseOperator): Calls an endpoint on an HTTP system to execute an action :param http_conn_id: The connection to run the operator against - :type http_conn_id: string + :type http_conn_id: str :param endpoint: The relative part of the full url. (templated) - :type endpoint: string + :type endpoint: str :param method: The HTTP method to use, default = "POST" - :type method: string + :type method: str :param data: The data to pass. POST-data in POST/PUT and params in the URL for a GET request. (templated) :type data: For POST/PUT, depends on the content-type parameter, diff --git a/airflow/operators/jdbc_operator.py b/airflow/operators/jdbc_operator.py index 9e7f24dbf6fa3..a10bf30c5c0db 100644 --- a/airflow/operators/jdbc_operator.py +++ b/airflow/operators/jdbc_operator.py @@ -29,7 +29,7 @@ class JdbcOperator(BaseOperator): Requires jaydebeapi. :param jdbc_conn_id: reference to a predefined database - :type jdbc_conn_id: string + :type jdbc_conn_id: str :param sql: the sql code to be executed. (templated) :type sql: Can receive a str representing a sql statement, a list of str (sql statements), or reference to a template file. diff --git a/airflow/operators/mssql_operator.py b/airflow/operators/mssql_operator.py index 1309be94e4520..f27e2145ebd63 100644 --- a/airflow/operators/mssql_operator.py +++ b/airflow/operators/mssql_operator.py @@ -27,12 +27,12 @@ class MsSqlOperator(BaseOperator): Executes sql code in a specific Microsoft SQL database :param mssql_conn_id: reference to a specific mssql database - :type mssql_conn_id: string + :type mssql_conn_id: str :param sql: the sql code to be executed - :type sql: string or string pointing to a template file with .sql + :type sql: str or string pointing to a template file with .sql extension. (templated) :param database: name of database which overwrite defined one in connection - :type database: string + :type database: str """ template_fields = ('sql',) diff --git a/airflow/operators/mysql_operator.py b/airflow/operators/mysql_operator.py index 2b940c785be35..e5bd788bd163a 100644 --- a/airflow/operators/mysql_operator.py +++ b/airflow/operators/mysql_operator.py @@ -27,13 +27,13 @@ class MySqlOperator(BaseOperator): Executes sql code in a specific MySQL database :param mysql_conn_id: reference to a specific mysql database - :type mysql_conn_id: string + :type mysql_conn_id: str :param sql: the sql code to be executed. (templated) :type sql: Can receive a str representing a sql statement, a list of str (sql statements), or reference to a template file. Template reference are recognized by str ending in '.sql' :param database: name of database which overwrite defined one in connection - :type database: string + :type database: str """ template_fields = ('sql',) diff --git a/airflow/operators/oracle_operator.py b/airflow/operators/oracle_operator.py index 84820c079013e..b97129715ff13 100644 --- a/airflow/operators/oracle_operator.py +++ b/airflow/operators/oracle_operator.py @@ -25,8 +25,9 @@ class OracleOperator(BaseOperator): """ Executes sql code in a specific Oracle database + :param oracle_conn_id: reference to a specific Oracle database - :type oracle_conn_id: string + :type oracle_conn_id: str :param sql: the sql code to be executed. (templated) :type sql: Can receive a str representing a sql statement, a list of str (sql statements), or reference to a template file. diff --git a/airflow/operators/pig_operator.py b/airflow/operators/pig_operator.py index d22f19f70921e..69a54b7f066de 100644 --- a/airflow/operators/pig_operator.py +++ b/airflow/operators/pig_operator.py @@ -29,15 +29,15 @@ class PigOperator(BaseOperator): Executes pig script. :param pig: the pig latin script to be executed. (templated) - :type pig: string + :type pig: str :param pig_cli_conn_id: reference to the Hive database - :type pig_cli_conn_id: string + :type pig_cli_conn_id: str :param pigparams_jinja_translate: when True, pig params-type templating ${var} gets translated into jinja-type templating {{ var }}. Note that you may want to use this along with the ``DAG(user_defined_macros=myargs)`` parameter. View the DAG object documentation for more details. - :type pigparams_jinja_translate: boolean + :type pigparams_jinja_translate: bool """ template_fields = ('pig',) diff --git a/airflow/operators/postgres_operator.py b/airflow/operators/postgres_operator.py index 5ff6e9e643278..e329100aa2e8e 100644 --- a/airflow/operators/postgres_operator.py +++ b/airflow/operators/postgres_operator.py @@ -26,13 +26,13 @@ class PostgresOperator(BaseOperator): Executes sql code in a specific Postgres database :param postgres_conn_id: reference to a specific postgres database - :type postgres_conn_id: string + :type postgres_conn_id: str :param sql: the sql code to be executed. (templated) :type sql: Can receive a str representing a sql statement, a list of str (sql statements), or reference to a template file. Template reference are recognized by str ending in '.sql' :param database: name of database which overwrite defined one in connection - :type database: string + :type database: str """ template_fields = ('sql',) diff --git a/airflow/operators/presto_check_operator.py b/airflow/operators/presto_check_operator.py index 608aebfe2966a..16f5bc0212a15 100644 --- a/airflow/operators/presto_check_operator.py +++ b/airflow/operators/presto_check_operator.py @@ -52,9 +52,9 @@ class PrestoCheckOperator(CheckOperator): without stopping the progress of the DAG. :param sql: the sql to be executed - :type sql: string + :type sql: str :param presto_conn_id: reference to the Presto database - :type presto_conn_id: string + :type presto_conn_id: str """ @apply_defaults @@ -76,9 +76,9 @@ class PrestoValueCheckOperator(ValueCheckOperator): Performs a simple value check using sql code. :param sql: the sql to be executed - :type sql: string + :type sql: str :param presto_conn_id: reference to the Presto database - :type presto_conn_id: string + :type presto_conn_id: str """ @apply_defaults @@ -108,7 +108,7 @@ class PrestoIntervalCheckOperator(IntervalCheckOperator): :param metrics_threshold: a dictionary of ratios indexed by metrics :type metrics_threshold: dict :param presto_conn_id: reference to the Presto database - :type presto_conn_id: string + :type presto_conn_id: str """ @apply_defaults diff --git a/airflow/operators/redshift_to_s3_operator.py b/airflow/operators/redshift_to_s3_operator.py index 9c1b621dae965..2bad90a861c0d 100644 --- a/airflow/operators/redshift_to_s3_operator.py +++ b/airflow/operators/redshift_to_s3_operator.py @@ -28,17 +28,28 @@ class RedshiftToS3Transfer(BaseOperator): Executes an UNLOAD command to s3 as a CSV with headers :param schema: reference to a specific schema in redshift database - :type schema: string + :type schema: str :param table: reference to a specific table in redshift database - :type table: string + :type table: str :param s3_bucket: reference to a specific S3 bucket - :type s3_bucket: string + :type s3_bucket: str :param s3_key: reference to a specific S3 key - :type s3_key: string + :type s3_key: str :param redshift_conn_id: reference to a specific redshift database - :type redshift_conn_id: string + :type redshift_conn_id: str :param aws_conn_id: reference to a specific S3 connection - :type aws_conn_id: string + :type aws_conn_id: str + :parame verify: Whether or not to verify SSL certificates for S3 connection. + By default SSL certificates are verified. + You can provide the following values: + + - False: do not validate SSL certificates. SSL will still be used + (unless use_ssl is False), but SSL certificates will not be + verified. + - path/to/cert/bundle.pem: A filename of the CA cert bundle to uses. + You can specify this argument if you want to use a different + CA cert bundle than the one used by botocore. + :type verify: bool or str :param unload_options: reference to a list of UNLOAD options :type unload_options: list """ @@ -56,9 +67,9 @@ def __init__( s3_key, redshift_conn_id='redshift_default', aws_conn_id='aws_default', + verify=None, unload_options=tuple(), autocommit=False, - parameters=None, include_header=False, *args, **kwargs): super(RedshiftToS3Transfer, self).__init__(*args, **kwargs) @@ -68,9 +79,9 @@ def __init__( self.s3_key = s3_key self.redshift_conn_id = redshift_conn_id self.aws_conn_id = aws_conn_id + self.verify = verify self.unload_options = unload_options self.autocommit = autocommit - self.parameters = parameters self.include_header = include_header if self.include_header and \ @@ -79,7 +90,7 @@ def __init__( def execute(self, context): self.hook = PostgresHook(postgres_conn_id=self.redshift_conn_id) - self.s3 = S3Hook(aws_conn_id=self.aws_conn_id) + self.s3 = S3Hook(aws_conn_id=self.aws_conn_id, verify=self.verify) credentials = self.s3.get_credentials() unload_options = '\n\t\t\t'.join(self.unload_options) diff --git a/airflow/operators/s3_file_transform_operator.py b/airflow/operators/s3_file_transform_operator.py index 84a6eda0c8101..da82fa952cc1f 100644 --- a/airflow/operators/s3_file_transform_operator.py +++ b/airflow/operators/s3_file_transform_operator.py @@ -47,6 +47,18 @@ class S3FileTransformOperator(BaseOperator): :type source_s3_key: str :param source_aws_conn_id: source s3 connection :type source_aws_conn_id: str + :param source_verify: Whether or not to verify SSL certificates for S3 connetion. + By default SSL certificates are verified. + You can provide the following values: + + - ``False``: do not validate SSL certificates. SSL will still be used + (unless use_ssl is False), but SSL certificates will not be + verified. + - ``path/to/cert/bundle.pem``: A filename of the CA cert bundle to uses. + You can specify this argument if you want to use a different + CA cert bundle than the one used by botocore. + This is also applicable to ``dest_verify``. + :type source_verify: bool or str :param dest_s3_key: The key to be written from S3. (templated) :type dest_s3_key: str :param dest_aws_conn_id: destination s3 connection @@ -71,14 +83,18 @@ def __init__( transform_script=None, select_expression=None, source_aws_conn_id='aws_default', + source_verify=None, dest_aws_conn_id='aws_default', + dest_verify=None, replace=False, *args, **kwargs): super(S3FileTransformOperator, self).__init__(*args, **kwargs) self.source_s3_key = source_s3_key self.source_aws_conn_id = source_aws_conn_id + self.source_verify = source_verify self.dest_s3_key = dest_s3_key self.dest_aws_conn_id = dest_aws_conn_id + self.dest_verify = dest_verify self.replace = replace self.transform_script = transform_script self.select_expression = select_expression @@ -88,8 +104,10 @@ def execute(self, context): raise AirflowException( "Either transform_script or select_expression must be specified") - source_s3 = S3Hook(aws_conn_id=self.source_aws_conn_id) - dest_s3 = S3Hook(aws_conn_id=self.dest_aws_conn_id) + source_s3 = S3Hook(aws_conn_id=self.source_aws_conn_id, + verify=self.source_verify) + dest_s3 = S3Hook(aws_conn_id=self.dest_aws_conn_id, + verify=self.dest_verify) self.log.info("Downloading source S3 file %s", self.source_s3_key) if not source_s3.check_for_key(self.source_s3_key): diff --git a/airflow/operators/s3_to_hive_operator.py b/airflow/operators/s3_to_hive_operator.py index b82ebce6fa295..85f05325f65be 100644 --- a/airflow/operators/s3_to_hive_operator.py +++ b/airflow/operators/s3_to_hive_operator.py @@ -78,6 +78,16 @@ class S3ToHiveTransfer(BaseOperator): :type delimiter: str :param aws_conn_id: source s3 connection :type aws_conn_id: str + :parame verify: Whether or not to verify SSL certificates for S3 connection. + By default SSL certificates are verified. + You can provide the following values: + - False: do not validate SSL certificates. SSL will still be used + (unless use_ssl is False), but SSL certificates will not be + verified. + - path/to/cert/bundle.pem: A filename of the CA cert bundle to uses. + You can specify this argument if you want to use a different + CA cert bundle than the one used by botocore. + :type verify: bool or str :param hive_cli_conn_id: destination hive connection :type hive_cli_conn_id: str :param input_compressed: Boolean to determine if file decompression is @@ -107,6 +117,7 @@ def __init__( check_headers=False, wildcard_match=False, aws_conn_id='aws_default', + verify=None, hive_cli_conn_id='hive_cli_default', input_compressed=False, tblproperties=None, @@ -125,6 +136,7 @@ def __init__( self.wildcard_match = wildcard_match self.hive_cli_conn_id = hive_cli_conn_id self.aws_conn_id = aws_conn_id + self.verify = verify self.input_compressed = input_compressed self.tblproperties = tblproperties self.select_expression = select_expression @@ -136,7 +148,7 @@ def __init__( def execute(self, context): # Downloading file from S3 - self.s3 = S3Hook(aws_conn_id=self.aws_conn_id) + self.s3 = S3Hook(aws_conn_id=self.aws_conn_id, verify=self.verify) self.hive = HiveCliHook(hive_cli_conn_id=self.hive_cli_conn_id) self.log.info("Downloading S3 file") diff --git a/airflow/operators/s3_to_redshift_operator.py b/airflow/operators/s3_to_redshift_operator.py index 0d7921e9ed0f1..265d6e25634f2 100644 --- a/airflow/operators/s3_to_redshift_operator.py +++ b/airflow/operators/s3_to_redshift_operator.py @@ -28,17 +28,27 @@ class S3ToRedshiftTransfer(BaseOperator): Executes an COPY command to load files from s3 to Redshift :param schema: reference to a specific schema in redshift database - :type schema: string + :type schema: str :param table: reference to a specific table in redshift database - :type table: string + :type table: str :param s3_bucket: reference to a specific S3 bucket - :type s3_bucket: string + :type s3_bucket: str :param s3_key: reference to a specific S3 key - :type s3_key: string + :type s3_key: str :param redshift_conn_id: reference to a specific redshift database - :type redshift_conn_id: string + :type redshift_conn_id: str :param aws_conn_id: reference to a specific S3 connection - :type aws_conn_id: string + :type aws_conn_id: str + :parame verify: Whether or not to verify SSL certificates for S3 connection. + By default SSL certificates are verified. + You can provide the following values: + - False: do not validate SSL certificates. SSL will still be used + (unless use_ssl is False), but SSL certificates will not be + verified. + - path/to/cert/bundle.pem: A filename of the CA cert bundle to uses. + You can specify this argument if you want to use a different + CA cert bundle than the one used by botocore. + :type verify: bool or str :param copy_options: reference to a list of COPY options :type copy_options: list """ @@ -56,6 +66,7 @@ def __init__( s3_key, redshift_conn_id='redshift_default', aws_conn_id='aws_default', + verify=None, copy_options=tuple(), autocommit=False, parameters=None, @@ -67,13 +78,14 @@ def __init__( self.s3_key = s3_key self.redshift_conn_id = redshift_conn_id self.aws_conn_id = aws_conn_id + self.verify = verify self.copy_options = copy_options self.autocommit = autocommit self.parameters = parameters def execute(self, context): self.hook = PostgresHook(postgres_conn_id=self.redshift_conn_id) - self.s3 = S3Hook(aws_conn_id=self.aws_conn_id) + self.s3 = S3Hook(aws_conn_id=self.aws_conn_id, verify=self.verify) credentials = self.s3.get_credentials() copy_options = '\n\t\t\t'.join(self.copy_options) diff --git a/airflow/operators/slack_operator.py b/airflow/operators/slack_operator.py index c5a69456fbe86..ddf8788e9be17 100644 --- a/airflow/operators/slack_operator.py +++ b/airflow/operators/slack_operator.py @@ -32,11 +32,11 @@ class SlackAPIOperator(BaseOperator): In the future additional Slack API Operators will be derived from this class as well :param slack_conn_id: Slack connection ID which its password is Slack API token - :type slack_conn_id: string + :type slack_conn_id: str :param token: Slack API token (https://api.slack.com/web) - :type token: string + :type token: str :param method: The Slack API Method to Call (https://api.slack.com/methods) - :type method: string + :type method: str :param api_params: API Method call parameters (https://api.slack.com/methods) :type api_params: dict """ @@ -93,13 +93,13 @@ class SlackAPIPostOperator(SlackAPIOperator): :param channel: channel in which to post message on slack name (#general) or ID (C12318391). (templated) - :type channel: string + :type channel: str :param username: Username that airflow will be posting to Slack as. (templated) - :type username: string + :type username: str :param text: message to send to slack. (templated) - :type text: string + :type text: str :param icon_url: url to icon used for this message - :type icon_url: string + :type icon_url: str :param attachments: extra formatting details. (templated) - see https://api.slack.com/docs/attachments. :type attachments: array of hashes @@ -115,8 +115,8 @@ def __init__(self, text='No message has been set.\n' 'Here is a cat video instead\n' 'https://www.youtube.com/watch?v=J---aiyznGQ', - icon_url='https://raw.githubusercontent.com' - '/airbnb/airflow/master/airflow/www/static/pin_100.png', + icon_url='https://raw.githubusercontent.com/apache/' + 'incubator-airflow/master/airflow/www/static/pin_100.jpg', attachments=None, *args, **kwargs): self.method = 'chat.postMessage' diff --git a/airflow/operators/sqlite_operator.py b/airflow/operators/sqlite_operator.py index 5b7213ed816d8..8280075a32f87 100644 --- a/airflow/operators/sqlite_operator.py +++ b/airflow/operators/sqlite_operator.py @@ -27,9 +27,9 @@ class SqliteOperator(BaseOperator): Executes sql code in a specific Sqlite database :param sqlite_conn_id: reference to a specific sqlite database - :type sqlite_conn_id: string + :type sqlite_conn_id: str :param sql: the sql code to be executed. (templated) - :type sql: string or string pointing to a template file. File must have + :type sql: str or string pointing to a template file. File must have a '.sql' extensions. """ diff --git a/airflow/sensors/__init__.py b/airflow/sensors/__init__.py index 5036251d664ba..b7f8352944d3f 100644 --- a/airflow/sensors/__init__.py +++ b/airflow/sensors/__init__.py @@ -17,49 +17,3 @@ # specific language governing permissions and limitations # under the License. # -import sys -import os - -_sensors = { - 'base_sensor_operator': ['BaseSensorOperator'], - 'external_task_sensor': ['ExternalTaskSensor'], - 'hdfs_sensor': ['HdfsSensor'], - 'hive_partition_sensor': ['HivePartitionSensor'], - 'http_sensor': ['HttpSensor'], - 'metastore_partition_sensor': ['MetastorePartitionSensor'], - 'named_hive_partition_sensor': ['NamedHivePartitionSensor'], - 's3_key_sensor': ['S3KeySensor'], - 's3_prefix_sensor': ['S3PrefixSensor'], - 'sql_sensor': ['SqlSensor'], - 'time_delta_sensor': ['TimeDeltaSensor'], - 'time_sensor': ['TimeSensor'], - 'web_hdfs_sensor': ['WebHdfsSensor'] -} - -if not os.environ.get('AIRFLOW_USE_NEW_IMPORTS', False): - from airflow.utils.helpers import AirflowImporter - airflow_importer = AirflowImporter(sys.modules[__name__], _sensors) - - -def _integrate_plugins(): - """Integrate plugins to the context""" - from airflow.plugins_manager import sensors_modules - for sensors_module in sensors_modules: - sys.modules[sensors_module.__name__] = sensors_module - globals()[sensors_module._name] = sensors_module - - ########################################################## - # TODO FIXME Remove in Airflow 2.0 - - if not os.environ.get('AIRFLOW_USE_NEW_IMPORTS', False): - from zope.deprecation import deprecated - for _sensor in sensors_module._objects: - sensor_name = _sensor.__name__ - globals()[sensor_name] = _sensor - deprecated( - sensor_name, - "Importing plugin operator '{i}' directly from " - "'airflow.operators' has been deprecated. Please " - "import from 'airflow.operators.[plugin_module]' " - "instead. Support for direct imports will be dropped " - "entirely in Airflow 2.0.".format(i=sensor_name)) diff --git a/airflow/sensors/base_sensor_operator.py b/airflow/sensors/base_sensor_operator.py index 74b0e0fe1ca5b..1dc59dd230b0c 100644 --- a/airflow/sensors/base_sensor_operator.py +++ b/airflow/sensors/base_sensor_operator.py @@ -19,20 +19,22 @@ from time import sleep +from datetime import timedelta from airflow.exceptions import AirflowException, AirflowSensorTimeout, \ - AirflowSkipException -from airflow.models import BaseOperator, SkipMixin + AirflowSkipException, AirflowRescheduleException +from airflow.models import BaseOperator, SkipMixin, TaskReschedule from airflow.utils import timezone from airflow.utils.decorators import apply_defaults +from airflow.ti_deps.deps.ready_to_reschedule import ReadyToRescheduleDep class BaseSensorOperator(BaseOperator, SkipMixin): """ - Sensor operators are derived from this class an inherit these attributes. + Sensor operators are derived from this class and inherit these attributes. Sensor operators keep executing at a time interval and succeed when - a criteria is met and fail if and when they time out. + a criteria is met and fail if and when they time out. :param soft_fail: Set to true to mark the task as SKIPPED on failure :type soft_fail: bool @@ -41,20 +43,42 @@ class BaseSensorOperator(BaseOperator, SkipMixin): :type poke_interval: int :param timeout: Time, in seconds before the task times out and fails. :type timeout: int + :param mode: How the sensor operates. + Options are: ``{ poke | reschedule }``, default is ``poke``. + When set to ``poke`` the sensor is taking up a worker slot for its + whole execution time and sleeps between pokes. Use this mode if the + expected runtime of the sensor is short or if a short poke interval + is requried. + When set to ``reschedule`` the sensor task frees the worker slot when + the criteria is not yet met and it's rescheduled at a later time. Use + this mode if the expected time until the criteria is met is. The poke + inteval should be more than one minute to prevent too much load on + the scheduler. + :type mode: str """ ui_color = '#e6f1f2' + valid_modes = ['poke', 'reschedule'] @apply_defaults def __init__(self, poke_interval=60, timeout=60 * 60 * 24 * 7, soft_fail=False, + mode='poke', *args, **kwargs): super(BaseSensorOperator, self).__init__(*args, **kwargs) self.poke_interval = poke_interval self.soft_fail = soft_fail self.timeout = timeout + if mode not in self.valid_modes: + raise AirflowException( + "The mode must be one of {valid_modes}," + "'{d}.{t}'; received '{m}'." + .format(valid_modes=self.valid_modes, + d=self.dag.dag_id if self.dag else "", + t=self.task_id, m=mode)) + self.mode = mode def poke(self, context): """ @@ -65,6 +89,11 @@ def poke(self, context): def execute(self, context): started_at = timezone.utcnow() + if self.reschedule: + # If reschedule, use first start date of current try + task_reschedules = TaskReschedule.find_for_task_instance(context['ti']) + if task_reschedules: + started_at = task_reschedules[0].start_date while not self.poke(context): if (timezone.utcnow() - started_at).total_seconds() > self.timeout: # If sensor is in soft fail mode but will be retried then @@ -75,7 +104,12 @@ def execute(self, context): raise AirflowSkipException('Snap. Time is OUT.') else: raise AirflowSensorTimeout('Snap. Time is OUT.') - sleep(self.poke_interval) + if self.reschedule: + reschedule_date = timezone.utcnow() + timedelta( + seconds=self.poke_interval) + raise AirflowRescheduleException(reschedule_date) + else: + sleep(self.poke_interval) self.log.info("Success criteria met. Exiting.") def _do_skip_downstream_tasks(self, context): @@ -83,3 +117,15 @@ def _do_skip_downstream_tasks(self, context): self.log.debug("Downstream task_ids %s", downstream_tasks) if downstream_tasks: self.skip(context['dag_run'], context['ti'].execution_date, downstream_tasks) + + @property + def reschedule(self): + return self.mode == 'reschedule' + + @property + def deps(self): + """ + Adds one additional dependency for all sensor operators that + checks if a sensor task instance can be rescheduled. + """ + return BaseOperator.deps.fget(self) | {ReadyToRescheduleDep()} diff --git a/airflow/sensors/external_task_sensor.py b/airflow/sensors/external_task_sensor.py index eda1a2d9d2d28..c80986fa9f286 100644 --- a/airflow/sensors/external_task_sensor.py +++ b/airflow/sensors/external_task_sensor.py @@ -30,10 +30,10 @@ class ExternalTaskSensor(BaseSensorOperator): :param external_dag_id: The dag_id that contains the task you want to wait for - :type external_dag_id: string + :type external_dag_id: str :param external_task_id: The task_id that contains the task you want to wait for - :type external_task_id: string + :type external_task_id: str :param allowed_states: list of allowed states, default is ``['success']`` :type allowed_states: list :param execution_delta: time difference with the previous execution to diff --git a/airflow/sensors/hive_partition_sensor.py b/airflow/sensors/hive_partition_sensor.py index c8eddc3443fc6..ca10c863b478c 100644 --- a/airflow/sensors/hive_partition_sensor.py +++ b/airflow/sensors/hive_partition_sensor.py @@ -31,12 +31,12 @@ class HivePartitionSensor(BaseSensorOperator): :param table: The name of the table to wait for, supports the dot notation (my_database.my_table) - :type table: string + :type table: str :param partition: The partition clause to wait for. This is passed as is to the metastore Thrift client ``get_partitions_by_filter`` method, and apparently supports SQL like notation as in ``ds='2015-01-01' AND type='value'`` and comparison operators as in ``"ds>=2015-01-01"`` - :type partition: string + :type partition: str :param metastore_conn_id: reference to the metastore thrift service connection id :type metastore_conn_id: str diff --git a/airflow/sensors/http_sensor.py b/airflow/sensors/http_sensor.py index f665737e96225..e60b175ed9695 100644 --- a/airflow/sensors/http_sensor.py +++ b/airflow/sensors/http_sensor.py @@ -35,11 +35,11 @@ class HttpSensor(BaseSensorOperator): would fail the sensor itself directly (no more poking). :param http_conn_id: The connection to run the sensor against - :type http_conn_id: string + :type http_conn_id: str :param method: The HTTP request method to use - :type method: string + :type method: str :param endpoint: The relative part of the full url - :type endpoint: string + :type endpoint: str :param request_params: The parameters to be added to the GET url :type request_params: a dictionary of string key/value pairs :param headers: The HTTP headers to be added to the GET request diff --git a/airflow/sensors/s3_key_sensor.py b/airflow/sensors/s3_key_sensor.py index 246b4c3e73641..a743ba2e0cdd3 100644 --- a/airflow/sensors/s3_key_sensor.py +++ b/airflow/sensors/s3_key_sensor.py @@ -43,6 +43,16 @@ class S3KeySensor(BaseSensorOperator): :type wildcard_match: bool :param aws_conn_id: a reference to the s3 connection :type aws_conn_id: str + :param verify: Whether or not to verify SSL certificates for S3 connection. + By default SSL certificates are verified. + You can provide the following values: + - False: do not validate SSL certificates. SSL will still be used + (unless use_ssl is False), but SSL certificates will not be + verified. + - path/to/cert/bundle.pem: A filename of the CA cert bundle to uses. + You can specify this argument if you want to use a different + CA cert bundle than the one used by botocore. + :type verify: bool or str """ template_fields = ('bucket_key', 'bucket_name') @@ -52,6 +62,7 @@ def __init__(self, bucket_name=None, wildcard_match=False, aws_conn_id='aws_default', + verify=None, *args, **kwargs): super(S3KeySensor, self).__init__(*args, **kwargs) @@ -76,10 +87,11 @@ def __init__(self, self.bucket_key = bucket_key self.wildcard_match = wildcard_match self.aws_conn_id = aws_conn_id + self.verify = verify def poke(self, context): from airflow.hooks.S3_hook import S3Hook - hook = S3Hook(aws_conn_id=self.aws_conn_id) + hook = S3Hook(aws_conn_id=self.aws_conn_id, verify=self.verify) full_url = "s3://" + self.bucket_name + "/" + self.bucket_key self.log.info('Poking for key : {full_url}'.format(**locals())) if self.wildcard_match: diff --git a/airflow/sensors/s3_prefix_sensor.py b/airflow/sensors/s3_prefix_sensor.py index 917dd46e26c28..4617c97cf360e 100644 --- a/airflow/sensors/s3_prefix_sensor.py +++ b/airflow/sensors/s3_prefix_sensor.py @@ -38,6 +38,18 @@ class S3PrefixSensor(BaseSensorOperator): :param delimiter: The delimiter intended to show hierarchy. Defaults to '/'. :type delimiter: str + :param aws_conn_id: a reference to the s3 connection + :type aws_conn_id: str + :param verify: Whether or not to verify SSL certificates for S3 connection. + By default SSL certificates are verified. + You can provide the following values: + - False: do not validate SSL certificates. SSL will still be used + (unless use_ssl is False), but SSL certificates will not be + verified. + - path/to/cert/bundle.pem: A filename of the CA cert bundle to uses. + You can specify this argument if you want to use a different + CA cert bundle than the one used by botocore. + :type verify: bool or str """ template_fields = ('prefix', 'bucket_name') @@ -47,6 +59,7 @@ def __init__(self, prefix, delimiter='/', aws_conn_id='aws_default', + verify=None, *args, **kwargs): super(S3PrefixSensor, self).__init__(*args, **kwargs) @@ -56,12 +69,13 @@ def __init__(self, self.delimiter = delimiter self.full_url = "s3://" + bucket_name + '/' + prefix self.aws_conn_id = aws_conn_id + self.verify = verify def poke(self, context): self.log.info('Poking for prefix : {self.prefix}\n' 'in bucket s3://{self.bucket_name}'.format(**locals())) from airflow.hooks.S3_hook import S3Hook - hook = S3Hook(aws_conn_id=self.aws_conn_id) + hook = S3Hook(aws_conn_id=self.aws_conn_id, verify=self.verify) return hook.check_for_prefix( prefix=self.prefix, delimiter=self.delimiter, diff --git a/airflow/sensors/sql_sensor.py b/airflow/sensors/sql_sensor.py index e9208fa89042d..de46e6d3db9b8 100644 --- a/airflow/sensors/sql_sensor.py +++ b/airflow/sensors/sql_sensor.py @@ -30,7 +30,7 @@ class SqlSensor(BaseSensorOperator): sql returns no row, or if the first cell in (0, '0', ''). :param conn_id: The connection to run the sensor against - :type conn_id: string + :type conn_id: str :param sql: The sql to run. To pass, it needs to return at least one cell that contains a non-zero / empty string value. """ diff --git a/airflow/ti_deps/dep_context.py b/airflow/ti_deps/dep_context.py index 6d39998988f83..60d4118d84443 100644 --- a/airflow/ti_deps/dep_context.py +++ b/airflow/ti_deps/dep_context.py @@ -49,20 +49,22 @@ class DepContext(object): creation while checking to see whether the task instance is runnable. It was the shortest path to add the feature. This is bad since this class should be pure (no side effects). - :type flag_upstream_failed: boolean + :type flag_upstream_failed: bool :param ignore_all_deps: Whether or not the context should ignore all ignoreable dependencies. Overrides the other ignore_* parameters - :type ignore_all_deps: boolean + :type ignore_all_deps: bool :param ignore_depends_on_past: Ignore depends_on_past parameter of DAGs (e.g. for Backfills) - :type ignore_depends_on_past: boolean + :type ignore_depends_on_past: bool :param ignore_in_retry_period: Ignore the retry period for task instances - :type ignore_in_retry_period: boolean + :type ignore_in_retry_period: bool + :param ignore_in_reschedule_period: Ignore the reschedule period for task instances + :type ignore_in_reschedule_period: bool :param ignore_task_deps: Ignore task-specific dependencies such as depends_on_past and trigger rule - :type ignore_task_deps: boolean + :type ignore_task_deps: bool :param ignore_ti_state: Ignore the task instance's previous failure/success - :type ignore_ti_state: boolean + :type ignore_ti_state: bool """ def __init__( self, @@ -71,6 +73,7 @@ def __init__( ignore_all_deps=False, ignore_depends_on_past=False, ignore_in_retry_period=False, + ignore_in_reschedule_period=False, ignore_task_deps=False, ignore_ti_state=False): self.deps = deps or set() @@ -78,6 +81,7 @@ def __init__( self.ignore_all_deps = ignore_all_deps self.ignore_depends_on_past = ignore_depends_on_past self.ignore_in_retry_period = ignore_in_retry_period + self.ignore_in_reschedule_period = ignore_in_reschedule_period self.ignore_task_deps = ignore_task_deps self.ignore_ti_state = ignore_ti_state diff --git a/airflow/ti_deps/deps/ready_to_reschedule.py b/airflow/ti_deps/deps/ready_to_reschedule.py new file mode 100644 index 0000000000000..e0f5f8fdfe410 --- /dev/null +++ b/airflow/ti_deps/deps/ready_to_reschedule.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# +# 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. + +from airflow.ti_deps.deps.base_ti_dep import BaseTIDep +from airflow.utils import timezone +from airflow.utils.db import provide_session +from airflow.utils.state import State + + +class ReadyToRescheduleDep(BaseTIDep): + NAME = "Ready To Reschedule" + IGNOREABLE = True + IS_TASK_DEP = True + + @provide_session + def _get_dep_statuses(self, ti, session, dep_context): + """ + Determines whether a task is ready to be rescheduled. Only tasks in + NONE state with at least one row in task_reschedule table are + handled by this dependency class, otherwise this dependency is + considered as passed. This dependency fails if the latest reschedule + request's reschedule date is still in future. + """ + if dep_context.ignore_in_reschedule_period: + yield self._passing_status( + reason="The context specified that being in a reschedule period was " + "permitted.") + return + + if ti.state != State.NONE: + yield self._passing_status( + reason="The task instance is not in NONE state.") + return + + # Lazy import to avoid circular dependency + from airflow.models import TaskReschedule + task_reschedules = TaskReschedule.find_for_task_instance(task_instance=ti) + if not task_reschedules: + yield self._passing_status( + reason="There is no reschedule request for this task instance.") + return + + now = timezone.utcnow() + next_reschedule_date = task_reschedules[-1].reschedule_date + if now >= next_reschedule_date: + yield self._passing_status( + reason="Task instance id ready for reschedule.") + return + + yield self._failing_status( + reason="Task is not ready for reschedule yet but will be rescheduled " + "automatically. Current date is {0} and task will be rescheduled " + "at {1}.".format(now.isoformat(), next_reschedule_date.isoformat())) diff --git a/airflow/ti_deps/deps/trigger_rule_dep.py b/airflow/ti_deps/deps/trigger_rule_dep.py index 76e5e1324ffd7..8c9505db7115d 100644 --- a/airflow/ti_deps/deps/trigger_rule_dep.py +++ b/airflow/ti_deps/deps/trigger_rule_dep.py @@ -105,20 +105,20 @@ def _evaluate_trigger_rule( :param ti: the task instance to evaluate the trigger rule of :type ti: TaskInstance :param successes: Number of successful upstream tasks - :type successes: boolean + :type successes: bool :param skipped: Number of skipped upstream tasks - :type skipped: boolean + :type skipped: bool :param failed: Number of failed upstream tasks - :type failed: boolean + :type failed: bool :param upstream_failed: Number of upstream_failed upstream tasks - :type upstream_failed: boolean + :type upstream_failed: bool :param done: Number of completed upstream tasks - :type done: boolean + :type done: bool :param flag_upstream_failed: This is a hack to generate the upstream_failed state creation while checking to see whether the task instance is runnable. It was the shortest path to add the feature - :type flag_upstream_failed: boolean + :type flag_upstream_failed: bool :param session: database session :type session: Session """ diff --git a/airflow/utils/dag_processing.py b/airflow/utils/dag_processing.py index 89e5701cf15bf..8ddddad104ac7 100644 --- a/airflow/utils/dag_processing.py +++ b/airflow/utils/dag_processing.py @@ -487,7 +487,7 @@ def heartbeat(self): for file_path, processor in self._processors.items(): if processor.done: - self.log.info("Processor for %s finished", file_path) + self.log.debug("Processor for %s finished", file_path) now = timezone.utcnow() finished_processors[file_path] = processor self._last_runtime[file_path] = (now - @@ -560,7 +560,7 @@ def heartbeat(self): processor = self._processor_factory(file_path) processor.start() - self.log.info( + self.log.debug( "Started a process (PID: %s) to generate tasks for %s", processor.pid, file_path ) diff --git a/airflow/utils/db.py b/airflow/utils/db.py index b57b8cf92b3cb..6b2f3a639a16c 100644 --- a/airflow/utils/db.py +++ b/airflow/utils/db.py @@ -96,11 +96,6 @@ def initdb(rbac=False): conn_id='airflow_db', conn_type='mysql', host='mysql', login='root', password='', schema='airflow')) - merge_conn( - models.Connection( - conn_id='airflow_ci', conn_type='mysql', - host='mysql', login='root', extra="{\"local_infile\": true}", - schema='airflow_ci')) merge_conn( models.Connection( conn_id='beeline_default', conn_type='beeline', port="10000", @@ -146,6 +141,7 @@ def initdb(rbac=False): models.Connection( conn_id='mysql_default', conn_type='mysql', login='root', + schema='airflow', host='mysql')) merge_conn( models.Connection( @@ -342,8 +338,8 @@ def upgradedb(): package_dir = os.path.normpath(os.path.join(current_dir, '..')) directory = os.path.join(package_dir, 'migrations') config = Config(os.path.join(package_dir, 'alembic.ini')) - config.set_main_option('script_location', directory) - config.set_main_option('sqlalchemy.url', settings.SQL_ALCHEMY_CONN) + config.set_main_option('script_location', directory.replace('%', '%%')) + config.set_main_option('sqlalchemy.url', settings.SQL_ALCHEMY_CONN.replace('%', '%%')) command.upgrade(config, 'heads') diff --git a/airflow/utils/email.py b/airflow/utils/email.py index f4038715ac882..d26ffb8a70835 100644 --- a/airflow/utils/email.py +++ b/airflow/utils/email.py @@ -47,6 +47,9 @@ def send_email(to, subject, html_content, path, attr = configuration.conf.get('email', 'EMAIL_BACKEND').rsplit('.', 1) module = importlib.import_module(path) backend = getattr(module, attr) + to = get_email_address_list(to) + to = ", ".join(to) + return backend(to, subject, html_content, files=files, dryrun=dryrun, cc=cc, bcc=bcc, mime_subtype=mime_subtype, mime_charset=mime_charset, **kwargs) @@ -128,9 +131,9 @@ def send_MIME_email(e_from, e_to, mime_msg, dryrun=False): def get_email_address_list(address_string): if isinstance(address_string, basestring): if ',' in address_string: - address_string = address_string.split(',') + address_string = [address.strip() for address in address_string.split(',')] elif ';' in address_string: - address_string = address_string.split(';') + address_string = [address.strip() for address in address_string.split(';')] else: address_string = [address_string] diff --git a/airflow/utils/helpers.py b/airflow/utils/helpers.py index d6b1d93b38263..3ebd5f75c6ce6 100644 --- a/airflow/utils/helpers.py +++ b/airflow/utils/helpers.py @@ -28,12 +28,9 @@ from past.builtins import basestring from datetime import datetime from functools import reduce -import imp import os import re import signal -import sys -import warnings from jinja2 import Template @@ -259,118 +256,3 @@ def parse_template_string(template_string): return None, Template(template_string) else: return template_string, None - - -class AirflowImporter(object): - """ - Importer that dynamically loads a class and module from its parent. This - allows Airflow to support ``from airflow.operators import BashOperator`` - even though BashOperator is actually in - ``airflow.operators.bash_operator``. - - The importer also takes over for the parent_module by wrapping it. This is - required to support attribute-based usage: - - .. code:: python - - from airflow import operators - operators.BashOperator(...) - """ - - def __init__(self, parent_module, module_attributes): - """ - :param parent_module: The string package name of the parent module. For - example, 'airflow.operators' - :type parent_module: string - :param module_attributes: The file to class mappings for all importable - classes. - :type module_attributes: string - """ - self._parent_module = parent_module - self._attribute_modules = self._build_attribute_modules(module_attributes) - self._loaded_modules = {} - - # Wrap the module so we can take over __getattr__. - sys.modules[parent_module.__name__] = self - - @staticmethod - def _build_attribute_modules(module_attributes): - """ - Flips and flattens the module_attributes dictionary from: - - module => [Attribute, ...] - - To: - - Attribute => module - - This is useful so that we can find the module to use, given an - attribute. - """ - attribute_modules = {} - - for module, attributes in list(module_attributes.items()): - for attribute in attributes: - attribute_modules[attribute] = module - - return attribute_modules - - def _load_attribute(self, attribute): - """ - Load the class attribute if it hasn't been loaded yet, and return it. - """ - module = self._attribute_modules.get(attribute, False) - - if not module: - # This shouldn't happen. The check happens in find_modules, too. - raise ImportError(attribute) - elif module not in self._loaded_modules: - # Note that it's very important to only load a given modules once. - # If they are loaded more than once, the memory reference to the - # class objects changes, and Python thinks that an object of type - # Foo that was declared before Foo's module was reloaded is no - # longer the same type as Foo after it's reloaded. - path = os.path.realpath(self._parent_module.__file__) - folder = os.path.dirname(path) - f, filename, description = imp.find_module(module, [folder]) - self._loaded_modules[module] = imp.load_module(module, f, filename, description) - - # This functionality is deprecated, and AirflowImporter should be - # removed in 2.0. - warnings.warn( - "Importing '{i}' directly from '{m}' has been " - "deprecated. Please import from " - "'{m}.[operator_module]' instead. Support for direct " - "imports will be dropped entirely in Airflow 2.0.".format( - i=attribute, m=self._parent_module.__name__), - DeprecationWarning) - - loaded_module = self._loaded_modules[module] - - return getattr(loaded_module, attribute) - - def __getattr__(self, attribute): - """ - Get an attribute from the wrapped module. If the attribute doesn't - exist, try and import it as a class from a submodule. - - This is a Python trick that allows the class to pretend it's a module, - so that attribute-based usage works: - - from airflow import operators - operators.BashOperator(...) - - It also allows normal from imports to work: - - from airflow.operators.bash_operator import BashOperator - """ - if hasattr(self._parent_module, attribute): - # Always default to the parent module if the attribute exists. - return getattr(self._parent_module, attribute) - elif attribute in self._attribute_modules: - # Try and import the attribute if it's got a module defined. - loaded_attribute = self._load_attribute(attribute) - setattr(self, attribute, loaded_attribute) - return loaded_attribute - - raise AttributeError diff --git a/airflow/utils/log/gcs_task_handler.py b/airflow/utils/log/gcs_task_handler.py index e768882ac5df3..a9502ef8db64f 100644 --- a/airflow/utils/log/gcs_task_handler.py +++ b/airflow/utils/log/gcs_task_handler.py @@ -126,7 +126,7 @@ def gcs_read(self, remote_log_location): """ Returns the log found at the remote_log_location. :param remote_log_location: the log's location in remote storage - :type remote_log_location: string (path) + :type remote_log_location: str (path) """ bkt, blob = self.parse_gcs_url(remote_log_location) return self.hook.download(bkt, blob).decode() @@ -136,9 +136,9 @@ def gcs_write(self, log, remote_log_location, append=True): Writes the log to the remote_log_location. Fails silently if no hook was created. :param log: the log to write to the remote_log_location - :type log: string + :type log: str :param remote_log_location: the log's location in remote storage - :type remote_log_location: string (path) + :type remote_log_location: str (path) :param append: if False, any existing log file is overwritten. If True, the new log is appended to any existing logs. :type append: bool diff --git a/airflow/utils/log/logging_mixin.py b/airflow/utils/log/logging_mixin.py index 85bdcaad7a13c..442fecd0363c8 100644 --- a/airflow/utils/log/logging_mixin.py +++ b/airflow/utils/log/logging_mixin.py @@ -92,7 +92,7 @@ def write(self, message): self._buffer += message else: self._buffer += message - self.logger.log(self.level, self._buffer) + self.logger.log(self.level, self._buffer.rstrip()) self._buffer = str() def flush(self): diff --git a/airflow/utils/log/s3_task_handler.py b/airflow/utils/log/s3_task_handler.py index bdbf94b6bbbbd..196aec50f1bd4 100644 --- a/airflow/utils/log/s3_task_handler.py +++ b/airflow/utils/log/s3_task_handler.py @@ -132,7 +132,7 @@ def s3_read(self, remote_log_location, return_error=False): Returns the log found at the remote_log_location. Returns '' if no logs are found or there is an error. :param remote_log_location: the log's location in remote storage - :type remote_log_location: string (path) + :type remote_log_location: str (path) :param return_error: if True, returns a string error message if an error occurs. Otherwise returns '' when an error occurs. :type return_error: bool @@ -151,9 +151,9 @@ def s3_write(self, log, remote_log_location, append=True): Writes the log to the remote_log_location. Fails silently if no hook was created. :param log: the log to write to the remote_log_location - :type log: string + :type log: str :param remote_log_location: the log's location in remote storage - :type remote_log_location: string (path) + :type remote_log_location: str (path) :param append: if False, any existing log file is overwritten. If True, the new log is appended to any existing logs. :type append: bool diff --git a/airflow/utils/log/wasb_task_handler.py b/airflow/utils/log/wasb_task_handler.py index a2a0c0daee999..b7f726d41db52 100644 --- a/airflow/utils/log/wasb_task_handler.py +++ b/airflow/utils/log/wasb_task_handler.py @@ -140,7 +140,7 @@ def wasb_read(self, remote_log_location, return_error=False): Returns the log found at the remote_log_location. Returns '' if no logs are found or there is an error. :param remote_log_location: the log's location in remote storage - :type remote_log_location: string (path) + :type remote_log_location: str (path) :param return_error: if True, returns a string error message if an error occurs. Otherwise returns '' when an error occurs. :type return_error: bool @@ -159,9 +159,9 @@ def wasb_write(self, log, remote_log_location, append=True): Writes the log to the remote_log_location. Fails silently if no hook was created. :param log: the log to write to the remote_log_location - :type log: string + :type log: str :param remote_log_location: the log's location in remote storage - :type remote_log_location: string (path) + :type remote_log_location: str (path) :param append: if False, any existing log file is overwritten. If True, the new log is appended to any existing logs. :type append: bool diff --git a/airflow/utils/operator_resources.py b/airflow/utils/operator_resources.py index 649961340eb42..44df83eafb508 100644 --- a/airflow/utils/operator_resources.py +++ b/airflow/utils/operator_resources.py @@ -33,10 +33,10 @@ class Resource(object): Represents a resource requirement in an execution environment for an operator. :param name: Name of the resource - :type name: string + :type name: str :param units_str: The string representing the units of a resource (e.g. MB for a CPU resource) to be used for display purposes - :type units_str: string + :type units_str: str :param qty: The number of units of the specified resource that are required for execution of the operator. :type qty: long diff --git a/airflow/utils/state.py b/airflow/utils/state.py index e95f58c3505dd..a351df07b9654 100644 --- a/airflow/utils/state.py +++ b/airflow/utils/state.py @@ -101,7 +101,6 @@ def finished(cls): """ return [ cls.SUCCESS, - cls.SHUTDOWN, cls.FAILED, cls.SKIPPED, ] @@ -117,5 +116,6 @@ def unfinished(cls): cls.SCHEDULED, cls.QUEUED, cls.RUNNING, + cls.SHUTDOWN, cls.UP_FOR_RETRY ] diff --git a/airflow/www/app.py b/airflow/www/app.py index 0e6a2a0c23aa3..98e3003908d05 100644 --- a/airflow/www/app.py +++ b/airflow/www/app.py @@ -47,7 +47,8 @@ def create_app(config=None, testing=False): log = LoggingMixin().log app = Flask(__name__) - app.wsgi_app = ProxyFix(app.wsgi_app) + if configuration.conf.getboolean('webserver', 'ENABLE_PROXY_FIX'): + app.wsgi_app = ProxyFix(app.wsgi_app) app.secret_key = configuration.conf.get('webserver', 'SECRET_KEY') app.config['LOGIN_DISABLED'] = not configuration.conf.getboolean( 'webserver', 'AUTHENTICATE') @@ -148,11 +149,7 @@ def integrate_plugins(): # required for testing purposes otherwise the module retains # a link to the default_auth if app.config['TESTING']: - if six.PY2: - reload(e) - else: - import importlib - importlib.reload(e) + six.moves.reload_module(e) app.register_blueprint(e.api_experimental, url_prefix='/api/experimental') diff --git a/airflow/www/static/gantt-chart-d3v2.js b/airflow/www/static/gantt-chart-d3v2.js index d21311a1c541d..245a0147e9f72 100644 --- a/airflow/www/static/gantt-chart-d3v2.js +++ b/airflow/www/static/gantt-chart-d3v2.js @@ -129,7 +129,7 @@ d3.gantt = function() { call_modal(d.taskName, d.executionDate); }) .attr("class", function(d){ - if(taskStatus[d.status] == null){ return "bar";} + if(taskStatus[d.status] == null){ return "null";} return taskStatus[d.status]; }) .attr("y", 0) diff --git a/airflow/www/static/main.css b/airflow/www/static/main.css index 57164b94e5ccf..147695c4a9591 100644 --- a/airflow/www/static/main.css +++ b/airflow/www/static/main.css @@ -262,3 +262,4 @@ div.square { .sc { color: #BA2121 } /* Literal.String.Char */ .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ .s2 { color: #BA2121 } /* Literal.String.Double */ +.s1 { color: #BA2121 } /* Literal.String.Single */ diff --git a/airflow/www/utils.py b/airflow/www/utils.py index 9ce114d5eda3e..6404d27f951af 100644 --- a/airflow/www/utils.py +++ b/airflow/www/utils.py @@ -20,17 +20,21 @@ # flake8: noqa: E402 import inspect from future import standard_library -standard_library.install_aliases() +standard_library.install_aliases() # noqa: E402 from builtins import str, object from cgi import escape from io import BytesIO as IO import functools import gzip +import io import json +import os +import re import time import wtforms from wtforms.compat import text_type +import zipfile from flask import after_this_request, request, Response from flask_admin.model import filters @@ -69,8 +73,8 @@ class LoginMixin(object): def is_accessible(self): return ( not AUTHENTICATE or ( - not current_user.is_anonymous() and - current_user.is_authenticated() + not current_user.is_anonymous and + current_user.is_authenticated ) ) @@ -79,7 +83,7 @@ class SuperUserMixin(object): def is_accessible(self): return ( not AUTHENTICATE or - (not current_user.is_anonymous() and current_user.is_superuser()) + (not current_user.is_anonymous and current_user.is_superuser()) ) @@ -87,7 +91,7 @@ class DataProfilingMixin(object): def is_accessible(self): return ( not AUTHENTICATE or - (not current_user.is_anonymous() and current_user.data_profiling()) + (not current_user.is_anonymous and current_user.data_profiling()) ) @@ -372,6 +376,22 @@ def zipper(response): return view_func +def open_maybe_zipped(f, mode='r'): + """ + Opens the given file. If the path contains a folder with a .zip suffix, then + the folder is treated as a zip archive, opening the file inside the archive. + + :return: a file object, as in `open`, or as in `ZipFile.open`. + """ + + _, archive, filename = re.search( + r'((.*\.zip){})?(.*)'.format(re.escape(os.sep)), f).groups() + if archive and zipfile.is_zipfile(archive): + return zipfile.ZipFile(archive, mode=mode).open(filename) + else: + return io.open(f, mode=mode) + + def make_cache_key(*args, **kwargs): """ Used by cache to get a unique key per URL diff --git a/airflow/www/views.py b/airflow/www/views.py index e1a7caa8bb78c..0aef2281e7ccc 100644 --- a/airflow/www/views.py +++ b/airflow/www/views.py @@ -260,7 +260,7 @@ def data_profiling_required(f): def decorated_function(*args, **kwargs): if ( current_app.config['LOGIN_DISABLED'] or - (not current_user.is_anonymous() and current_user.data_profiling()) + (not current_user.is_anonymous and current_user.data_profiling()) ): return f(*args, **kwargs) else: @@ -661,7 +661,7 @@ def code(self): dag = dagbag.get_dag(dag_id) title = dag_id try: - with open(dag.fileloc, 'r') as f: + with wwwutils.open_maybe_zipped(dag.fileloc, 'r') as f: code = f.read() html_code = highlight( code, lexers.PythonLexer(), HtmlFormatter(linenos=True)) @@ -1111,7 +1111,9 @@ def _clear_dag_tis(self, dag, start_date, end_date, origin, count = dag.clear( start_date=start_date, end_date=end_date, - include_subdags=recursive) + include_subdags=recursive, + include_parentdag=recursive, + ) flash("{0} task instances have been cleared".format(count)) return redirect(origin) @@ -1120,7 +1122,9 @@ def _clear_dag_tis(self, dag, start_date, end_date, origin, start_date=start_date, end_date=end_date, include_subdags=recursive, - dry_run=True) + dry_run=True, + include_parentdag=recursive, + ) if not tis: flash("No task instances to clear", 'error') response = redirect(origin) @@ -1927,21 +1931,48 @@ def gantt(self, session=None): TF.execution_date == ti.execution_date) .all() ) for ti in tis])) - tis_with_fails = sorted(tis + ti_fails, key=lambda ti: ti.start_date) + TR = models.TaskReschedule + ti_reschedules = list(itertools.chain(*[( + session + .query(TR) + .filter(TR.dag_id == ti.dag_id, + TR.task_id == ti.task_id, + TR.execution_date == ti.execution_date) + .all() + ) for ti in tis])) + # determine bars to show in the gantt chart + # all reschedules of one attempt are combinded into one bar + gantt_bar_items = [] + for task_id, items in itertools.groupby( + sorted(tis + ti_fails + ti_reschedules, key=lambda ti: ti.task_id), + key=lambda ti: ti.task_id): + start_date = None + for i in sorted(items, key=lambda ti: ti.start_date): + start_date = start_date or i.start_date + end_date = i.end_date or timezone.utcnow() + if type(i) == models.TaskInstance: + gantt_bar_items.append((task_id, start_date, end_date, i.state)) + start_date = None + elif type(i) == TF and (len(gantt_bar_items) == 0 or + end_date != gantt_bar_items[-1][2]): + gantt_bar_items.append((task_id, start_date, end_date, State.FAILED)) + start_date = None tasks = [] - for ti in tis_with_fails: - end_date = ti.end_date if ti.end_date else timezone.utcnow() - state = ti.state if type(ti) == models.TaskInstance else State.FAILED + for gantt_bar_item in gantt_bar_items: + task_id = gantt_bar_item[0] + start_date = gantt_bar_item[1] + end_date = gantt_bar_item[2] + state = gantt_bar_item[3] tasks.append({ - 'startDate': wwwutils.epoch(ti.start_date), + 'startDate': wwwutils.epoch(start_date), 'endDate': wwwutils.epoch(end_date), - 'isoStart': ti.start_date.isoformat()[:-4], + 'isoStart': start_date.isoformat()[:-4], 'isoEnd': end_date.isoformat()[:-4], - 'taskName': ti.task_id, - 'duration': "{}".format(end_date - ti.start_date)[:-4], + 'taskName': task_id, + 'duration': "{}".format(end_date - start_date)[:-4], 'status': state, - 'executionDate': ti.execution_date.isoformat(), + 'executionDate': dttm.isoformat(), }) states = {task['status']: task['status'] for task in tasks} data = { diff --git a/airflow/www_rbac/api/experimental/endpoints.py b/airflow/www_rbac/api/experimental/endpoints.py index 8663bad55d631..21aa7e8a1a60b 100644 --- a/airflow/www_rbac/api/experimental/endpoints.py +++ b/airflow/www_rbac/api/experimental/endpoints.py @@ -237,6 +237,7 @@ def dag_run_status(dag_id, execution_date): return jsonify(info) + @api_experimental.route('/latest_runs', methods=['GET']) @requires_authentication def latest_dag_runs(): diff --git a/airflow/www_rbac/app.py b/airflow/www_rbac/app.py index 321185ee9b56e..392dce1b31a12 100644 --- a/airflow/www_rbac/app.py +++ b/airflow/www_rbac/app.py @@ -41,7 +41,8 @@ def create_app(config=None, session=None, testing=False, app_name="Airflow"): global app, appbuilder app = Flask(__name__) - app.wsgi_app = ProxyFix(app.wsgi_app) + if conf.getboolean('webserver', 'ENABLE_PROXY_FIX'): + app.wsgi_app = ProxyFix(app.wsgi_app) app.secret_key = conf.get('webserver', 'SECRET_KEY') airflow_home_path = conf.get('core', 'AIRFLOW_HOME') diff --git a/airflow/www_rbac/decorators.py b/airflow/www_rbac/decorators.py index deb42abc1b588..8f962ef8406bb 100644 --- a/airflow/www_rbac/decorators.py +++ b/airflow/www_rbac/decorators.py @@ -32,7 +32,7 @@ def action_logging(f): @functools.wraps(f) def wrapper(*args, **kwargs): session = settings.Session() - if g.user.is_anonymous(): + if g.user.is_anonymous: user = 'anonymous' else: user = g.user.username diff --git a/airflow/www_rbac/security.py b/airflow/www_rbac/security.py index 55570debf6a9d..6bb67d4d8338e 100644 --- a/airflow/www_rbac/security.py +++ b/airflow/www_rbac/security.py @@ -83,6 +83,7 @@ 'can_task_stats', 'can_code', 'can_log', + 'can_get_logs_with_metadata', 'can_tries', 'can_graph', 'can_tree', @@ -113,6 +114,7 @@ 'set_running', 'set_success', 'clear', + 'can_clear', } op_perms = { @@ -193,7 +195,7 @@ def get_user_roles(self, user=None): """ if user is None: user = g.user - if user.is_anonymous(): + if user.is_anonymous: public_role = appbuilder.config.get('AUTH_ROLE_PUBLIC') return [appbuilder.security_manager.find_role(public_role)] \ if public_role else [] @@ -219,7 +221,7 @@ def get_accessible_dag_ids(self, username=None): if not username: username = g.user - if username.is_anonymous() or 'Public' in username.roles: + if username.is_anonymous or 'Public' in username.roles: # return an empty list if the role is public return set() @@ -243,7 +245,7 @@ def has_access(self, permission, view_name, user=None): """ if not user: user = g.user - if user.is_anonymous(): + if user.is_anonymous: return self.is_item_public(permission, view_name) return self._has_view_access(user, permission, view_name) diff --git a/airflow/www_rbac/static/css/bootstrap-theme.css b/airflow/www_rbac/static/css/bootstrap-theme.css index 734f940feed61..3adaec1d3b80d 100644 --- a/airflow/www_rbac/static/css/bootstrap-theme.css +++ b/airflow/www_rbac/static/css/bootstrap-theme.css @@ -4949,6 +4949,28 @@ a.thumbnail.active { .alert-danger .alert-link { color: #843534; } +.alert-message { + background-color: #d9edf7; + border-color: #bce8f1; + color: #31708f; +} +.alert-message hr { + border-top-color: #a6e1ec; +} +.alert-message .alert-link { + color: #245269; +} +.alert-error { + background-color: #f2dede; + border-color: #ebccd1; + color: #a94442; +} +.alert-error hr { + border-top-color: #e4b9c0; +} +.alert-error .alert-link { + color: #843534; +} @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; diff --git a/airflow/www_rbac/static/css/main.css b/airflow/www_rbac/static/css/main.css index ac6189938cb3b..d3d198356e8db 100644 --- a/airflow/www_rbac/static/css/main.css +++ b/airflow/www_rbac/static/css/main.css @@ -265,3 +265,4 @@ div.square { .sc { color: #BA2121 } /* Literal.String.Char */ .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ .s2 { color: #BA2121 } /* Literal.String.Double */ +.s1 { color: #BA2121 } /* Literal.String.Single */ diff --git a/airflow/www_rbac/static/js/clock.js b/airflow/www_rbac/static/js/base.js similarity index 84% rename from airflow/www_rbac/static/js/clock.js rename to airflow/www_rbac/static/js/base.js index afde7c2545f37..ea065792a533a 100644 --- a/airflow/www_rbac/static/js/clock.js +++ b/airflow/www_rbac/static/js/base.js @@ -33,4 +33,11 @@ function displayTime() { $(document).ready(function () { displayTime(); $('span').tooltip(); + $.ajaxSetup({ + beforeSend: function(xhr, settings) { + if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) { + xhr.setRequestHeader("X-CSRFToken", csrfToken); + } + } + }); }); diff --git a/airflow/www_rbac/static/js/gantt-chart-d3v2.js b/airflow/www_rbac/static/js/gantt-chart-d3v2.js index d21311a1c541d..245a0147e9f72 100644 --- a/airflow/www_rbac/static/js/gantt-chart-d3v2.js +++ b/airflow/www_rbac/static/js/gantt-chart-d3v2.js @@ -129,7 +129,7 @@ d3.gantt = function() { call_modal(d.taskName, d.executionDate); }) .attr("class", function(d){ - if(taskStatus[d.status] == null){ return "bar";} + if(taskStatus[d.status] == null){ return "null";} return taskStatus[d.status]; }) .attr("y", 0) diff --git a/airflow/www_rbac/templates/appbuilder/baselayout.html b/airflow/www_rbac/templates/appbuilder/baselayout.html index 1653a909d02b2..89e32cae783ec 100644 --- a/airflow/www_rbac/templates/appbuilder/baselayout.html +++ b/airflow/www_rbac/templates/appbuilder/baselayout.html @@ -67,9 +67,9 @@ {% block tail_js %} {{ super() }} - + {% endblock %} diff --git a/airflow/www_rbac/templates/appbuilder/navbar_right.html b/airflow/www_rbac/templates/appbuilder/navbar_right.html index bf5aa43221884..d42f8e2e8a82c 100644 --- a/airflow/www_rbac/templates/appbuilder/navbar_right.html +++ b/airflow/www_rbac/templates/appbuilder/navbar_right.html @@ -47,7 +47,7 @@
  • -{% if not current_user.is_anonymous() %} +{% if not current_user.is_anonymous %}
    rwtCsjapZm7!^y($ry&fC*F&2Wz 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

    )IR6E)85M<#9vK`A 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

    RYi%6M zUEnJeZj>+otLB0r8B?j))r}x5#i~0;vJG_UPfwV4fuB&iS%T~U`pf)%Z_hWNQa0wd z7#V02x$)@boB$%!5K1?xHVzVpGm3_fxn#+wPMkrP(F8DD{7HjS2ImO5lJ+0B$Um=L z)lZdX^`i3Vh3kkr4T8}OaeI_nm!|79s=3aGKwwgBlq@>o9-n?8cnDeoghi9dAr{a7 z3;^TeF9@qQ-9=Z(_o1})%+D|EsXum;x%lo5Kb%~uP+)BKw%rNbzv>gnbca0#+w)K%y{9FuvPxXPz!)dxJrIB7&j6VOB5dA_06;|^je8?^bgY=82}qzCrGQ{A zXyN=Rq)uRH;$NhD-sOjIURP<}guO4WT)w)#p}8cF6<|9p+vx@AG?c9ycu|^V?Cgl( z0=9Iqs23K&|M^YP+o5Piq|Gz@KwojGIwyEi{o}(=_eZBmlO!gcL{ymTucKr!Q>t=c zdF*d8Ik_)37L3~tR-^$HDQ1HeH8kXR>i?Rg^DL89GYK~uv31lPK|^D1EXVQ(=an*P9~54>Dmw1UkOQp z>~5A16@bN9yjlp+OnaoV6PF1aOW)2oGT@BsjWNRtz{FZAJ-$VJ#redYPnTtjGcNiR zz-NX4fH(6lENI;;HV)$RN^b)un+@|!I{_!uE*UMM#8W*UV3XlC@p|DA zo+cEsjSWlS{fcYr^w$qDP}___H*y(_|9n%#a~1O=tjP%`ySMriv7;34&%6L~8%u(v z-wxZCOz^(icsbe{V&iy&ozDzQrRN2qS+$!qH1%&rK@>er4HS&xTfR?dirOQ zAFV08&Oo-BD|x&P2E~kr#PrH(36ceD&!DXnr+ZC6J+-d;llO6Z2=~sRt~Gr>G=|w1 zJ0{k?8dH==lshz8WR9+KyA$XZrE&HCqWVAd)@pzow|}x86CU&B<`us7HLWQx zR%=j(_mRDSntQ#Gt`m!^U$k7fHOmMn!CFqm6*6HW(fS`QOypkYeY7WpkpbX#~D>mwo3 zDCh`?Q{sB?4EyZH^KMG2JiL8(3BKPxk=eV$0aZIUsNawly49powLhK$c`)e= z&`-*I!7iP|M7ZxIKvvA_QO8-@eHNgGDwX@JioI~^JS6WNMRHP{58s{|a8q)hVuuQZ z@Cyq6DVl!L;(I5W;cCh}CYL`r`jjxK5OpwKt2n~P?$*LQI=bSU5-{wnps^Lgf}q(v zY=Sky0&EBcy546%4#?PbGE_l$(NlzA+iiZpFu3~d+|eahN~%zqY)v*`PZX#o5uTNJ zk%RA|v;VBFPgkYKuL^$YLP-Q&3q1kIBn5d)4w|@?8zt0{k`|7hS+E~a8MNg8InO%C z39U031nzN2>(ZNcpx# zN?1zPQBpu*$xDbG_1{Pp`w@{#fB9f2{qLevK$R-{_Lph#up|DPzdZjY$GpWz@cD1F zn?-1VViGGlQvAPIN8T}@3a#)$lo9&h6t{pRH&7J;SO$`$1lfO~H&u3pW{cKn52ncd zZyt~qSOz_80U7%Ls{DmQFXe;6A1F5vP55tKbRHJ4jO6bs@&BtP8TbM9Y(S~2!Av?# z{ogzw60i)}?o#RhRbmYMK)IqwXkB?~+%D#S@qjcTz%q)A)G7X(udP81#L>K*^i{-v zAs9{)1(u=8LWl9+eC={fAdZeHDIWiu2mHTq{*N#h`M+@fk1+qgaQ@GI{C}tOf25`V zJDvYCE&bo={2yrvC^nGkC~+hbWQ+j!1mG{(na)G~$JRSk?+UF}ET7I{g>iZFcfBPAGsgVJ*VV z>cye+_3ll{qqGNznjUt;{EzUz1fmMRTmVFQj@F@zf$O{m`=o&L(+QFe5p=4)+Y+Eg zu(-+sbk(B__42N!i4;ViKf_9g`2ef~`(p9HPVzi(=Q3eLjWEzn>N&JG!sf7mdhFZI zQXatHi_r39TK7`)@ZOss;PE=`0y4isnK&$aBsHW!>$~tn)Hmw@0C6ID5(@b|kU%cr zg?^}B>3xbgZq}u`LJzF|eDQKU39PR7#zOn_*LEcR1Ym>ECv6JG3Y3QiUX?#!4LJmi zGLu_sx2<9XcCJd;l52tvBoZV^uG%ZAX7w3Ocz+s>SrZ0S}UXNrn-n6^Z znz-UWz|{d-{fP?zm=^LT3gTd`*6e`d*tT{Uy(B}VID|OT1%Q|K1KvDF4lRXw`Um`h z9`!zfLY2tpHTR9zeeTX-YgFS*f5;V1!WjyasS#t|JmnKDM8V?-=>0cC%crFdQe3weuZy;8Jxw?C<(_^7_)Ad?kmU5OkViyG8~i&Hu)&d8v4HDY{08CS;yZ0QEh< zxy-8l20kax;nGgSP7Yvx8kgapKVoxIT>_Bl{^89m-8ab1u4ONU$*~0`CHc)n3Mfs- z08Iqy-NURmN=e+z>~UJx5gDzi16dbU8bD3~49B_0%O&-?=K+z>ypo?&{Jf@~*}R5U zx=l5&x0+%_Toob`-XF4&nq8aTdrcDCcYgCl*lG^rR%X|?`*Z(< z_%1sRs0D9dc1zHmEdPP(QL}8~N#z(=UGP_vvGu-3bVY_f3=HoG1`6kyha?H1!y^DZ~zEuk^^NpQZZ+tC8~+&Wc%h6=;C5Vu0Nb7TezDHP zTLJExUA2sg*-%{&8`uwlk!Xhnp>_AvN^OTZ%{g9ns@lkDgAad!=VszK*|bZ|wOY)B z0KL5)g(Cn&J6$8iJNAlW%|m}+=%ULRsvq>9Dd-8XFkWoYw!?@xAARF$+G6Z;Jol}< zSX~EU>@ndb^vs|Ed*&;!he8C$Li%0-QO4EAc>zfJbPAC6H+hskwZD7b4 z$?!BQG!eg0oe8hCp{QEUFS8jzT*c&po5?635_>+PhPIlI$>Kw=|O4KItAdIgx3g!v=>*|*+i zH!h@sUI=`@WvVE0FVbo(bpO;%{gL0^ws(jOg;QFmf{IPXYo5-RXj!CMrkJQj%YY&I zws()w52Hd^D~%6U0qPcGboYCA^t-ldf%2**);q;DkDVXU$O@r=g~Rj*=Rz8A4zWvk zy<83gd?g=OXgz^1peoP>6x}WLTix&^rZ(t1!)B@aO%XO@>i|2jV&C>7$~rtUePPKW zH~WK%&~2F#DWYV?n?I@p9TbACc_Aoot8C<2@{0V*-p@4&ymnNT7U?nnHw6X7Agdan zVx`D|5kVdu1^z>8CFl{b9>$bT3OzH(Aq*d_I#0F(2E)3Gl7#`B$Zn!j=FS&3p;N{B z;Flvn%+5Os0W4#|#D97cFMn_?(*&bB=6HFWPna>|lFD$bp6o+85r%)!#o`8`L>3SiYM0@8vf`AmpDq~BBCEW2&fxZ0;KmzAn z)woa&tHGy{+Tx2+X-u8-@alD0&@N#1X-Vi=z7)6E_1{G%CD)Awa0(UuYR^DQ{LIo= zk-j4JgP>nkK?px-NeF6!^s8-Mf6qn4xfeD%!S)8Oib{)0lvh@a(PJ_y{+#-TJuJ-_T^AB+Y%Lj%~ob2?LcT2EX~$dEBhK2hJEk zI-@%@Q}$GaugS1sVZU%nREg@V@MFg3!phM@%Xv#tiZluwWI4a7E!D--6T)(QHcx{C zNOKkjLTreJKER(&t)sI;XsBnHS`WdEZIlH2QCFfxGBLrT$uTe@*W{N|^O^Roh?HNX z9jltxy;SC{w`L_i?)=rcAOC9*qEVTHtUXli^PIXkASCFL?ghGfef>m=cPo%9Q;1<3 zE;UZ0Gm_*LVC3j`GcC1*qNsT^Z8_UW1K%1(Gnqq z__*B%jr9HW^O%Lub^87lw#<5Qt{QQ>`HUfR<)_C&cj~ooTuP%qf2f>)^!`)Y?w%&o zYOphUhoZ}*Yf9%>j&+PP_qqOq6fbyPT|7qt4z^)}X3S}n(PCVOwEr`)HT$uKS6ZdX z&U=bmz`u&gapSTUFYJ%JZM@5)+A)>X;Uxl!dzIs<669p8 zf*hxwY-_vWke?7H)vQ0Aum#3ovVq-FSdw)8R;F2O@>!6JElG5kBCO-T#O!UBz>9>? z{5l*u%p$vEZf&6>qge2~e?{%^e@u4RFO0G~?R1cTT%{s+?kNmFMyFH7YT?n% z0QO=DT>V|vdguTzL~+n$O3A`_0bAb>X>}dsv-BDS{vQI?i_Ew078vu14%}7%$9uwL z7OH2W0#}_17gCp(;in)q?u1uMQSu@zy2Z`JXd;6DpnwPEVC%&MR+|uSb17=E~Vnlwg_s-!eYF$M>EA^|>Fp#s?SQMSv zpTPVfPys*zRms2>rc_k7BB{aKKj8!JzXQgLU_?x}6+3Q!baG6Y zIeTb+V077$5Joi5{i?Ilz#=4)A1S{$FaC#&p8pyVF>1qWwUvKlFYi~t-b&bmCggMv z7J{I{}8 z8_UW8O8RI6rr#GPvtl6L&^_Y*2+7Og2N%brLBp4AT-&Dn1EP+8m6SB?Rd}oER=~Hu z;_Em?e$z~baFg7!!%Yag6ooAPW=07aEK8Q-#H#VNXE4B|@}Z=JBq|93)-_gIQuf~9 z@)&5ArW+$4arJ1(ED;ur*`P?juj9M)C%UIDKmr4jjKCSQ$+@WVarcu5zVcuc7m(h= zM&EHHfR4(t&h;#P3HBhcw#8bc7p%!6)7V{mY0a()lDPm*oMq#6pjxfH*9NPLzh%5{ znAG0dYhSa$>mVZHk*^4@+W20LBDSF2eBtyeJ3_`=7Ca$ZozL3R#0YQB<9_QihERHx z=PSuo)!`TJO51|ddcSL+LaFqnM@mVnL6gH1i+MM9FeV&&Jxw)++xZ~z(z{9-shgQf zeB-$tBvt3li4`!5)lAfQKLj=Vj41K%a5^NHWkdH@OxX9glw@l)df)lacR@0ELpKR0 z`$s_x-$;5`QN$hFpNk5^*Aauu5tbt5xb71&J}V9pV0>73^H&_u;(CbSytF9QktI{Q zVC>7a|1zQbuWA}363y5URV7Bmy~iOE5+uR&%TS#bNI_>YgmWK=k5k~Lbq zVcB)k%hIgilC84E4RTaBzVHG36b$v$1)eY(YA2HMQSAoT1H0f5~5upA&a~n*f3{(SL_k(!7XA zMe@jxYWTMZ9(OYIMY7b|cpBz^IFRH1sYv0^DZL$1r38Tkqq!AS-=eM@YqTRZqSc9C zC*fi2SzDI>=+yS={+6%63#{X16#}irbv`8KzEJ#(ybRA#SZo1B#DzH==6w^~Pcvbw zGX8DDKUoVE+^*4T&*cTGN!u_R8551vsLU6Dxo9C>1!XbVJgpuGrCMQ=n<`f0tGBuS znAdCAV}f)3-k7+5mqg6I#*dnQgdj1FyqV(&r&6pD&BEK`jr@^lRdV2vQaBB9tdn%n zk(FSjNdWF%>OC+*#=lhoQi=`lM&%+jODEZo{$Uu9Y~5SRhQy7bN{ZdfmuXu^UTjJ2 zdhS+qQ=pAwU?3JCpiXA&0fT1ve@3EHd5!9z=M0|%?(mw=i~|x+PgE8y>WmX8FW!LY znzH!nI@fwwJWaLvPZWtrWK#T5fj^Jjx0EB&U*?KNtQSR}7ArHsHkn9!M#H6tCk7X+-e-(kiDtiLTj{U##-U zRJT8zdif&z?GQ*)7KB>F9~;R8o&uWXbgSyxk{7LKd)pi#q{ zP#?Qdy0Kj>)e#6G*rI2w$VIW#0F2vWoIbfEFuM{%lW=H3GX~56u-X}6k;nT?NLhsS z%~?Y{%`5hoL+jodRt4TqeeYL2y95^N=*TsZEl^*?Ow+^C4W7ll;>*#v&{7r4?W-ztNEk_utS7 z2B$Awgg|9LO0SFN|7S|iA#$LQ1zy|zW5ki^2Ux}E6t{kUP(vd!5q?ovy*DA=5SwY# zkFyoL_X6gcuB@;xCBm2&E)bLl6nvvi*Sx1$!@qCo|JgJp%jj z>}R7A#TyR;++$&S^1f0rVPywKHE`Uv-W~)hDP-GX)xB_>UfGHm6%1>MaSZv}>hufT z*}z;PdDgH`-vsd1h#)M_fhbD*CE9B{Wk%o&PwSin+EWsQotk>Munq*6v_JckucW9P zrZIQL9s#=WfP$R%+Cpamu(aAp7A_8l2d_ylMD5YC)>|XapB#R7A4{WZo^19z`Xz1!qEe(S zH8?Y#GA8X-x1EEP1+HkgY8OpuAb{4sE5LK!9s7dUIVPoDm1$l&n(Gy2)b-C=93Joe z4?&0r@m-%skC7!xZtZjJCi*gqdyfDZY}6eX@x^K8d2*i;9SYe1^-B^d+tVBd1K%;4pA=!HLqX{F* znrFP6Xy~0oK$u1rG7kud2LtbsDwUQIVT;!5%2<8Bo3O{cGBqRfZ7cEY+ zF2ZqbMQuc4n+q-BjtLoiJ^JOPMOSw=G?_6-$oIfi2US~3ZUJv0i;ihQuOUvO8n%Wi zaHH}eA(z8@G{n1HC&@&=g%OG8Bh&L|;MZ*J+_SIikn`C+R864xJg3mwIf!XzJA{}C}h)(JFz+P{7 z3{{%J^AUU(Zj1GfKc!}iTrqkUL`_iy=UgWy)n1;%60zZcc_9WR%KiKhh@a!#_e%bt zOtbhLI7|4CB_b)39y#|flP_HXC^1#L$RbjI-v zT0{ofvf+zI=o#%dZFZ4ZNYxhfo78^cPqZ{o1IcDwM^%b5AkR8($rEBC9fsP(yN~GM zE=u&EBXucV8TXJA`-6r;&!rD^6wgBitBtmB61`YGq(kuu<;=QS*e~ifi#I#2v;PMF zRTa@zSapl4qW2+aokl{+Mzlm(tcwl*f-nLnCXmfoox#)TMIS;j?yr2*$)d~4%M1f36b^d zr>6%lDpA!N!c-W^4k~0`h6)ZbTC?$^yhCi~UpxYebQ<-h*JS(fLeBn4=h8LdJj&?a z@9VvBcvo-)v6EVqVQ2advJ9Hr)Oj8nbS%!EZOZhNolxVd*XK|b)UR@sonsvJ(&knA z#Hug|6lUw=Xy3Q_r5_FXsL!!4JBM~XC{NikM!Mk^?N(SG`_Oi*WOBt%z(IFKA|*OR zEDq80GA02wyk%z+Q61dy;vRQISl;P_LwxB4M~_?k0<+3hPcWR2aLp(x%thYgKu|BYJ@IXj>@>#yx7P?iwLi< z61kz02%N)JvY0g5h!Tl^nU08&;NJ?%qL>X?3koA$eEaj<`DnSM{9w8{lZi_F{5VDJ zM9pOl6cjXwe)}$4hZM?>!I*>5LWfUY6i1QhNHXIC)`;v?tg1$Kxu|-w4msAHQ+*v? ze!0TFaod$hyxJ7v?%_(wnL)k?GI{}=@zXRU{Jmrqs}FZpSTx}`P2|EhjZQN+$`az7 zdUmyaWHCY(Cm0u7+^n``$@vnwB{`7I1Kd|`@&r*ejMt}Zf6yH(@%1FPKn7l%S z7h)oT7WZ{!(0;RlqGJR^ppg7Ep?d~~J*4w)$2=9OFhhe5Pg$}0VTiff<^ttiSnhvL z@SQxYqF7ixoJ4SHC%OCWtKSMJJo@RKmP(Ob&c9DQf>l~>wZo}&g+yR$QE2Q>aw(XJ zd@dQ5tC_JetG0Upvp|wHN(QlIN^{?+cI8-++!fXoRx`a=h5bsI*DhM6#UW$oJ(%KY zW4HAUFk(Kpi7=V0UHYBW1%eMm>qlObk{yWdCl_h?IoUM35w)g ztG;AiXV>CsHI74+R&om^se5~srHVM$7B}zgL#4@(oe3!N5|3c z{_c$==#VIPi{1VvcC&7t10!_>R$d~rB=kS#n`ZCpX8)6mro zDPM$BN#Lsp5JUr@cIb|!sje|U&F}eO`<6mSyPjnO)E^&-L6PL`WMCiG@C7<-@)hNH zRSZgbX`v#>myMYdw^XR{T~X)?JgbBbU_@J3y?V&p%1&Rr_HbAY#}#uZ((KkWKuN#FSCI5>Iq3a3_)>^MxE z^l_Miz=i=FTGJvr?C`gzaLGju=TLtt?dRnvNyvDLw>jToV`!L4J;HL(G`C6Un*RbH zK{0V;{5o|Yg;s;^B(E*BXk!g_@t{wncE2tY?$fO{tV6zfA(zNU2fr zha%+|C2U~v0;-xLI>C~ydMq`eV`;Acm#~k~9)_k=iPF95D7F~zPIP+w1lDkIj+bdU zIO61WzbzZ^m>XT1oS16YoxJ{kq`hTOmGAq-OLym{kxuCb>5dIZcXyX`H%Nn&bSWSu z-QC?K-Cas^9=`wcdw*um+%vww8QAgMbzN(H7WAX+g4ak?8Y1~Gab$3sDSuU8b5C}W zeaR|R^(BLZ$_2B_U=OvAT)fj+{bHP0$NhH9d2g_lF80}{J^pk!6Ee5~zWB6Cs^_5Z z>ei#ojoD8J0*5Rv{A9W%Hk!Hzol7ILVR$+SrbRdTpZmj!URmkcep>`4l6sZhq)_f9 zU4LX;A%vr}kfOZ3BMQHT==$dc`45GpEMro*#Fu;s!-GxR9W-F!&?!o@tP(???>5>$qc#&@Qc0yk57zq;Tr5VY zv!#qcqj8*df^0q1b&CIRA5z3PT*Yybo{pzHR&iObjeq@~k?TlJu9wUI9t(l`RE$#N zXA)6QzSMm7WZop?!zKM4_aK2>#{6gc6D$MWg#V z#bkjn0s1WMWh3GFS^*h>`{<$K<88*^=a!I;6vsvi7k@lOs2vkGN5Mp=SF>KvHK!$3 zvt9^dIXnXav#sUiK9pAi%k0D?dZfrMJ1%7TO5>JF_`Jx(wuLd%FHm*+LPCfeLEm1H zJ{;v8L|CR$cp_`}N3!a0r{+q?8C95A>G%r*NJbeh;eM=KytgIffS-IbwNJEbrJxmZ zFGh2FPo-V@_{_4%bW^0t&R8D~M{xz&cIET}cOUy*y)5GSgs{0*?jDaPCZPADH$$Mr zm_U)soFB#eE$dzC}8pa=HV^509UTD@srTXj+vf+_`XbnXI=D{%iX9ok;f5}b)K_MQ1O85Z|QcYV6Mz z;9}C(nle?WJDKJmjDGDKRrrNFS>WDU+<%TYfo5KaD~y?1SoRUn-)xwwsI}`R3LmT| zSmK~??4t6l1)2wgFY+TuuS?CM`J)NmqRqNtdQ(QtN&?@k8YBIx{XR!dgS& z57*fX{AEAxW1f4@Qq|V=L`5%pk||la)SL2n_2=mFJ>GVqs>cMn405iwB^|R9a~@yo zNV74yk!&tybReVU*jA8!6Od*=H)cW% zKpb-DEMc6fAeafW*4uZsz%l$i=f#bI##EA@;a%wcl9a)G4;o|F}vph8fDVo)keiiEKSar5Qd&lzw-PUdiHEerQ(qGKP641 ztVEuSIgP80IaF2nlGtV3Jd1fS8EUDtZ26D9P8=Oem-4aUqT|UMf)jrIGWP*(ktdi< zmxPex+HlM(`tji^X9>C~u3zc7x{BtYKSdfX!tM{CC-{qG-d)*$KR1A3fiX%}jBSJC zgWLlf_}BYH&9>hv8GU02kY{9p9@5$5zggkdNr;Ew@gRgJg*J9iPovw)2VVvGK%iu= z)nj*Loqtrryb^6Dm`v{aZD+aL0#=c}<+JP{_1{4~@rVy1WLcXZp_Y9|ife(n^Z$@~ zsYq*;H#x`E?pXC@mj!YFFabcF@a;uwE2!6hM~Aj9fwELsOtZN(d3X)rqD%^D_Ys-^ zX6z2$sA;AuiQqHl8yh4r@*O!VBXdD!G(8HsX`F;gVWao%!721Xj&)aAU(q+v{mw< zydEQCB25{#o;c3I45@mnbcv@msuedwq0<{mW4eHRQMo4<{DJI09+w&^^{hE!=LM2$ z`s#g4#Wx=fQAEEI^5yZBgAzFxLB+QP0wp!ZxR@rgZa!qgJrU#Bg)+1A6aR3h&#JA; zGTxPyK5@JxbL;l*zg0uHaG0*1&IEm_F0^0mzmHgHeZ&Jy^*Nx@;CKIm$TzI}q4Swy z0y>7jVs)qnP76hTE-{mQpaC|I3ZUTsdB%HKWD6SpW*}N8JfQ z<65sA(_7-swGa0@@jSkag2To$eE(ws^d#=h6Vrm?W{$?^2oDZ5uLd(sIyKXB0fK1E z#gnmZVphr0m;Q0G31Y9IR{-dm*qlOif~mrl!iOSaH}=gdK4C`B^ea~r4He3cL%bm8 zx9ey_d@zJUX(;W=J5=Vi08G{z&qooI5oIcxCL~q_bbN`t^;o-N>n6{`*o-!fyPNO{ zOjvFA)p`?9*YhW^)47fuAogiZs2t!?unXp%nQ2lgefj8i3SvH98{G|g1}ebkE$IKF z6u_Y2u~_9hcvpYLHjJxa^oe*@`0?w9C7t4Frk(VS#YABkvwF=-k=vnI8_<+}#epw-;K+4T=>>VO3HkR)(X*o* z3A^oWEu%V*oZyAueKgh_5&YrXqraK&(n3Vk-0Bs>@R4oW14quY1!n=_$^VDxnU)MT zla5mYCG&<(x?dV~{v~HhcDsU~*6J)>iubpM9KI%YGE~A=^OAtdgU#K9`il}y8%d&# z6*Z)XDFvT5g?&ub>8NxnR?ej(fWaH>edDCF+iL3e17h@1a>;=k$(FtzB{H;EBq2iucG)j?}s zMiZ&VqGp4S(JF={vcB9Q{UiQ_80}3D`&pA=cIAapgiI6d6g&CxcGC` zFr!W}ZCd^R&9Fvn(A*h;mDuZ98kyGwiR1HArJ%r|9tSGZKMcv_WLz*1=)gLtz6@6K z?_KGhCa_a5E)O~gdthH}=qbF+<1S%(pahZ75UK@8O!jV!f5AvXRWGvb26a_SrHjMz zeGP5ROGgzIi<_Zvr&)Q1qSX+uYTnNr%et?Lw(~FGA)XLDC>@=3@(v5}Zt9Gl%NQ&Y zPI>rvvfNBNaL_?;^)8YFRM$L(dU0c7YQJJE=RIyezCch2-pze(Ty+re>Fa=uTi=0^{R^McdNkqz3)i3DS{czKh2#!{*&DNCt^LhK0 zwW|-bFKmCm3)@GEjN5INwwi#`yCyv`#@$#*!9X1%98YRo$=nH;u5D zy5R#-lmA@Lu9(D3ekBp05mvwk|L|IZGc%REyhb!ClK7!Tz1cq=^#c&@p(O5rQ@1Th zp_T}t8jp0whi9hUWU&}2Y)EIg66u`nT;|TyPWMC7RL``SQ_|fg4zdZLkutOz7ds|! zgp(IL7Qcp&Wo$OwxXjLHS&3(SW_XZEayrfqL%vJHT+-!)sj%C`?xm44?UVhfrabpd zN?V`SjBMU*$g%i zc;%nD<9%p@z9k@ifzBM|gF?a!pj}=8IC_-~N;vbBRgtEEA~=?);riubBZCF~Z(Sm^ z#RPitbxQbHt14a&dIH1HhWX#_^>?w!8H>GilUIuBX6#;N!%DQ=fcS#z??UA%{zdE- ztwXE@jR|sh0%acm1KpD&M_jpfd0p_NU4dy=wmgb~ zL#u2+JFD>Xrn<+4@F>)Su}cokf92ck-D3dhjthA>qKa8Vk>Cv|JwnB>&`BCbSvs?m zm8=6Y%q=iUzbn{k>)7QS@AW)Sd$<{DCrMmX=CFBLBMSGVT$h-dx{wV&5J& z_(q~B_ggj=<~$bBa|J`T-5$IXq?LKna>K({sPcs zHRZjXm7fWAIiGzCFts0@$lLR9Ro_LlE#JGOP468hWm}$m;qErvQ&sT)-0aU*DNgvt zFq?xW5z-zw*OUFV?2R7H#^z0a)<}m~m6P`w;nsnn!>^A3jAEiikZG&?%qoCt?{EMMiN zVdT?Gdrs_LMO@%Q?@&zpLI`4aeXrQHJsbq@Xg2WsH?3pDoAY1`)jXF$$)x~(6cVyp zck07m0$D2KD$>{20~)e2_Ko8~LRRQevM3tDfuUN-{=di@L0dn%HWoF+1Dz2xv6nyZ zPq2zyr!3R)U;R;$nwv5*4KfzP&vg(AuOSY?g!75N`NCG+Rx977Sw}<0Te8=8Ds`9b43stlDLA;PI(eSsrfmBkb4i*tSKR$bRC-tat0m1kX_J z({pluQlz0a^l1zgE~IjL9&4Jb4g&G_F^|zLG8C~^m(}xmd65&5c>d- zNH=Q%g(G&!=K>M0c@dy>g5Ox^A@<>(XzeKG6dnF-L7;XBT&~9=vUQPYCPF2D@!ldjM zPJyA7&DE@eGU9!3QY5$W6n5I{RPE&+Hx7Nf^6`<=q2sVIoat8FVw!Q?-nA1JQ8^14S?M)fuSImnOclHTJ_E}@# z;f1euRZcY6wr{OVoI;@NaZ6`vrkXqof?mm_cO$;2VIXpo($F2%rYDTmRp+9#qGctF zl|}_*;9Go2nIsBlV_ob8+o^D8g}j8!ZUKSK9O$i_f~>m6O*}mT+-?b&C@xz$5C%2r z;wPEnJM^y#!KNEOxq4aG?npG_zI`Z`9BQr5v*;KuHp#Zb4s(;J&S1;1q7gwiLK~{q znqQOXZ}VtEA$uDd!fYpfl@JSm$&YV7N?^keq-OH%8*_AvM{~h~phTVWwTnl``?SA^ z!Q{K{@|}fsbu;}5ZNsD$B3x>fG(!0Hz79g9Y#vOSUts5t)E$nw;7X|_^!)%Ap45Uv zEvoufKOp_tJvpR!w8iJ6i|M!Ym@O6y8-(uk^qa0(d!i+>)yOR9+>wVWI}0A-}lp4vd=ijw-k?- z5zej(SGf6!p<+@SRatlBpcTR`@IByJdE~ke%|SWo@!Y-=o@FvKdgK zZ>fu=oYVEz5Ja7yzZ;|+Of;bT<(`NZv90YBQLAEDBQB&6=?^uoeM=Ay>9WR}?-LRv zh!WCKQ!-K?)23^IT%7aAdx4Tbbx+>z@dT}IfriJU%2@X~u+nt4ikRqmYZ@vfVrKyU zZK2X6616zxk9+XF29j$|0EoLABhD|pXT=3X`CP0u6J>^zwDYI0Ks z^eBwfeCHtqvJ>5wiVjP~m(MOW8cQwd!YnhHE9dZpcESvO8**+=>nZx2V!cufV=NKO zdL~q1!TFBF!!j*Y(h;!}-rFZbQRXqPFjZ6Sm!wkLCmG$b!p=!2Z?+c-o5Hz2-`?tC z2gX><2+WC|nN68wi?PBa8WM_=FeHmq6Qu}E8O<4Vt;FTh?4r~f5HcuyP(oB{6==*@ z74L=lyvL6^8lU_F7B2qzbfU*Q3;%mJV&?d~Tj*TR+rv2;AM~W-vM^YU^7u3v$NL>K z+&jxo-xn?j#sTG=%^v{^L@j$h8io|3|K3iJy4EGKwd%rM)W>@bo-52LNC zZRe}?hX4zb!8;-Ep3ik(nT2u$r z_akrvi#ZyTYbw(w7GnkByAlGGdcIjIJ?*nHk_&E9$nvQPeds8RJ-CXDJ^Nhh6352_>PlEJ{GF`5ko%a~#u{mMsxTX25@Rcn1gVO)Qa0xJw3sRr zOGEu-HF)d!n5zn?QqvSrOFh0(Vg0C+dONfs$+)O@wPbFRG&rkLp}6cAkXp@bEEgMi zoeQZ(?&am#o#6>+KiA|ID_amc$nG~jd=BSob{USrIg&(Cc!+|2A0gq;!)yx|`opk# z#2FOck%eOE&&vCrKch9rr$2pl>oM?b4^N%+rKLX0XF^vTK30Juc#vgKL-bu`Wd2bu zkZWhCVu0^Zx!@P9fHgS z=skk1b}N<{D>?d02K0+X&=HS!%Nog#mcF3((cKr6e?PF)bu0|k67`*LJCZVbXuqFb zt=)RI1oqqOUeAr^{Ch;e(+^P^aKA_A44hj-4FaT<-i%cvds^NeV$Ei4AJ!)1W0Y(3 z>v{c}28Q9-1C>qcB}P=TjbM#XhRmDzhzV!n`p37<#8I++wPdeiK2Q_fKshSYBWGSTVkp z=Kql4Jl|HUhJ-iyeF$f@s!HWAM9A|?=pw2i>@>8<9ql#?wq)bb`g<>;__hczx|H`t zCWO?)Gf4cFJkCM%1xQuBKt62QH=^h+RevA8JbdJp7>_RF7(s8|>bRI`WDp6d?`3zv z`DTfo!Truc3`JndhAtY0l(Gw&9pK0O1jGx;{Q@IKUJN%+=BN>JwtW?bFVC~0jKTW( zf1hh#(7CG-1`9YuA@T5a2~^9~pc!-ifv8y%doc`CnP757od5Iu74abtvO?!H_T(^3 z25-WD1H*}2zZk??bm3o+uk@WiwU_bP2he?slJSH%_Yy6J*#qfZ_X84a-xy717bn+X zCMD_@Ri=~WT(cJH6~@ljCY23H@WZ6f8%M8hZ#2`Dw}V(m_-u9zV-FAZJy+6A-bLiV zJ-0`63^1*kEmUX=M!e^Dzh8_Q?^gsueB0^Q@z5?!MgSC_2OtFlvP@qP%7E(!VRIu8 zcjwf+4cJ-LVZYE_mF6}h`uNlT`&>7cqqY(|=aEXt8Ek^^(c_E|8gWwOK!orax*Z<- zrI{F%H#&=4 z`i^8vi{!B3v48;w51(Xe=X7goBl+L=`Tm{$e;lyzGwRW}C~~>~_nY2-+yA%m|Lbq= zSKa4)YU~PHuCrV%G!*3FIyB6-2?AH*?Gau9%YI2nY!DLww*xIkKr{(_RNFn zDGJ0O9b%aRBdfbFHumptFdh)(+Q)-(e<~8o{P%z1nfdb@KkEN))q4LImRQCy7MHbT z&(5O(AOLW&^aWc3_h(^X)&o7xj`Og zX%xr+&iCEdIz$oEhYwDmCQj$JUje+Ob`SuCd(yz?OdTrw6E&J!2K3kq;Q7Jpya!w! zxj>|fCxBFx?^rGPXqBibi-W_)y~nfP1y}|fHiMDlNQGM1!quv?h?{^u$PxQ*CI-L7 z)<5P^4p^*#$2MV_vP)=rap$_KD$z^+uRv{wqMK~BfTwK>RaW$P^%V)hRx%K#4DMy} z-CP7Xb7@a7A!{9dR#)-#-KOtpXvGx;tFX*4;g>=uviWWR-f2%L?AYa2FOaXuVKY}o zai5a=|4yi>Tw)p80sbYH>(H+twt|p(6yLe`lt5<(Z2=(n5M9p{x>GTv64qK;Xvy1c zv+)2pBV_S9Q#iP1)~>mX0**2-tY+v=XL|=xBCk{l(X1y6y8I^~qRbhvr9K0>S^Pj3 zjE$mt?E)yPh(|#}*H?Njyo3M$08T|t2<%;e!J0{ID(SZ@Wk7AL+qauy*cbF(^apG@ z-9VxyE(EJFtzzcyVVbNl0Y`7~51WbsFLs3xM^)kO;hBIQ{3_ivj%|%e^?tx+zEEGB zeQs`B7b+aOkC@p1ehbFTviUtO*Z25yu8v6*b#1Py(*LGLfD1X_K+7}>h`Lo}Jg`zc znx2__!J?~y5;F(*Y^H?Jj5vw8?b7GJ72J$G=5w?)co^>WP1mMl@0*TMNc{m3PeWrn`@M~2qX$6!T?cB!?}>^3 zNCDR%H8S(>giLGnYGy!H6q+1Q%%}R$uIOYt1w0&&Ku^c@M?YXA>jze}j*mjW{{i_K zMJn$P@+9w0EMS1H{1^_C%d0#QbnxnRck}kRlYKzu?L2`(Zph>ET)kx~&D_!N+ndJ3 zvh=4)h~OCJ(}`mDV(07Knfs>H#y zS1o$|yHeRp@t=MGKDHMi<&@?&7cfZ!9E%99UEoJTJd^JP55GUZI{$bq{w6BDyoiM- z4W0`dWU4vU+4-jJ^YtpLqckhUl_JzL?r63Yz;mSXU;^~Zvh#bKC*?r5=to zcCB;(v>c^DY${sJ{K_;vpxc)n{SO^pOTD=(xuy{?bQy0M(_J$Sq5EG#7h-(<2Yi~+ zRz=AhFSF)RN&mOsVWFX@4=%Z~j6F{9@eT;uI>ldYWS=~&Z3275pxjr2nfQ4=^8PR19(f@(o*1ex@Ouy+G z9gyG=eDWprJGLrtA1{LR((>rIJvI!f4XKrpWw~XpN~$JF5ufIXuKD-pU&j|<`oA~z z%)YK$6@Gn>pmkdOEs9mt1Vlo340i8W$0$ttdo1iFgEKvPanRq!b~w%-&$ynyjKX%V zoyI&dH_srw+8)eQXkIb*A;e*DWQ*kbaOR?)>xN2$xe(vBTz&*)s81Ql@NC?S*=l)A<|9cK#Eg+Cvf?IQ6)JH<{ zKhfRz>HgiwctUs?oSQ4(VEzfns7)9VH+g&jVt3o(9n&Y%uSVDil}fcGANhU$+D&x2;tQ|s-02f` z0KQw#{a&XIq#Qc=0@$D;)qn*>2vI1ZoW(%L)-&$CS+nTgW8g(CHbof2B3Tns8UtsY zP!fRQ01~Mh>41a~^No1VV}UW<*~fEtka&1!qX3yys<3w5`(>Y0i&GK9$*vRuXah?E zt1Dph4Z+2Lpl&w*kgCW<36Hc0Y_@>dftMUNoWo_4w8n?~7w8wDboLKSu(CA*842pd zU^TzDsrjXNB}F2y=AiVU36CeBvP_SD#!Qw_!cXbsUv@7 zpc|zT6DC1mZ}uTv46vAYBp8*jMr)~lh_BMra}Mhdn1Y!gLxwgC(@TYt)q=yqs(DX| zz9G5rjQDCF$AWDK$-PTui)XUYDCDnL18HH7>84xtn;sSlPSOPr@(<|f+h05bK#AO25&41Fxg59K- z#K7h(yVr84^waII$%-imx`Em|M)Ys{HUfz~c-2YupX61&l!^~aB;EMM5d=GCU-C@M zE$y@k6eDlxQL&3@o z5K|I?`+-Jilus9HbW5{WXnDh3c(@2Sp<|cJBQZ0p>=bs(tfU%jN$Mp?CvRu4bb$3| zM8ZhcZ-;1O=n=}S+UKs=DD&t5N19`Bf3vf;y0*|#Fd=FtjN(0U!@5ysdE`tO7Lw8M z#P4hBk(_ZkUQqP(HZxpz-pH@h$|2bgrK)ov3+!NoJBa$wn&@iw9SBoo}NHR8cn!25e}hVM4@jv@wZrTx%E5J(y33x1Ax*?>gl6*wrk$Is3z5l`z}Hoa#@ zJ+{07fkgnh;JIiMuyl{Vi-gZSZL!Sb0l`~RAi$5-Wbe2 zm(T_1l+x~p?-#xiPgQkB$50JC0vFFKIGgOUOm6TbZV3?qqq=`wwxeiAg1oQ#@yP&f z9jVBXI2xZ>>siArcpyE1nV^dHg5r=dDsS{KQKt^#dpZ#cVDVszPv(rikN3Z&Y%T8l z)D1s?p7swSDL2vYJM+>}_BX@KyF;O;G|zqsh=>7R{*qi&tiE(IAQ*HxIJ51HB=?)9b@zfKp~OLPgpeQ7Kq@CJ3TSl#G(P2uccPm?D{CI;86HEB65= z7djI%X)WE^H{7qq6r27-!Y{NOrNV-xNlEh>UL*$t4Bc`N$~wwwV_AFMoH2fbUJx_d z?sO1FGd1BOgI$Yj50d)6BgbhSHq+2W_)Le;On75xxbP6Ybog@e>65p z>>by%h(^MuuV*FIcNGX$pIPo7%o%b;RU7pFm1MclBEZIk+Q&BRP{)=o*YSVBgjwpn zucfvw8)vYCy9g^S9a-FlPX#`NuX{z(N_5ake9GucE7by&MbJMER}T#j3WEF}{u*^l zK+mAVvDhIpi+L9k={mdlH>hdZg(;qy4`9|~YemE2C5sF$e1JRNv-zSMW;)`5y?>kx ze!7wTrm@h}7j61Q=wV5&8Y>XwClaF{C~eB?KMEbb_K;d`24^Y-MKxrZJM_W89{Q`y zM}LV%oNms#r!47)t>};-tRMWLw6&;x?xHk5VSi%!!zSva0BaFC#_7r>f89>>Q#m5cpWJZh7Z)0=Z0=rudbCp3)SxR>qBjcjCVYT3R zStMpd4nt=!e25&5_r1n$Q4v`t1mP*bg(7BpIVI0C25@~>>oBZ3WdyEP{?8IOA&}oQ zO6{-42yTv~Im`%z5jU<3%r*>8-9Lp_Wxp*~87$S>_yWfzn><>}>5}aKRgIKfjs7TU zPC4H5q2le}hMc~w`GTDmO>|ep^iZa^n+@15cU(gnV~$e~Vu`Mk##oz)$TnuwRWxqm*3Apr_zsnKq|=UG6{ufc z$G%%s1J)aH6{H?f$!(ibQ$^QG#~D1P=&9-osWaJ!_jcwOkmbOxmYuu=6po;QKNx(b zJO(HJyGGjtW8b?!aJp47nARCsqaHsP=PtQp@EmkU&#cvsD~T9RkEWKm2WiHF%c}px z>Dl6Sv5mQESAnd$qxLYxljhNq2?l`o10e^Oj(aiR`Sv(i%x1tg-cQn*WiXcRwp^o zIqbt2K4&yJ#}kLZG%qm<=#Kr;NnP$c`Cw;>Y&u^%eJE2!y3r}^XA8R1zh0V51B`Is zz+JlxPj#N4g@`@=6Wo}-od{(I%V6hq8FACD|5OvLDiW)wLE?=*MQ#7IO9_uAd9UYWSJcHV1G8a?e36%e$0t+NO3UCp1cWG5ggtPOvvws00 z*0hCTu6AiOSjD(ipt9$M@TrJbob^e;SBY3nlpH6A(_b5U_G8wUEGS36_sQ(Mju|qV zp+eIba;dYb`;CYYAmZQ=y+Xyo-0^}AgOKKT$lV<@msh(Pnz3y0tx7SGMC-g~p6i^{B7|h)Ej~i%wpGu|p~6l2 zqB7)eeB`4)ilDiCFSxYcVuvbr=}jp@>@=h3WIl1ETlupBF@c6xSgED~{#x%KP0|l` zoGXzR-IB+`{iQX`KmargiCWr#80_cd)Isb2lgDzBJfJ-eMv zceYH)5hZI(%^>PRZ<0awC`e4X8rjIui1htJ1K>F(K^QUlSlm|LG=nkY74{=rvtaX8 z;jvycjO;acXmwA+>e`H+(Ar>h1sk4~55|VkP)`6S=2$#_v>bq{By5SJ3(Yx@ifovG zV;Vx8>m-CEOEu}J?}K(ZvHoQk4fltOVLvyMVRnT_2(S6ibRrU}GFK}}Sw>IMZ7;HJ z9t#pg1G$Q?9-C~cb(S>5ldQd7{0Q#cO)8>yaENPgAU0$27u(!2~bTnIs>4|FB0*)aqv zct=$fRC){%l2m?ohoZo~(I$M`v81OJ^$V42Q*i46!v*NqNl`LFC$p~LlR>R2hRbGiy7pFAdra|&5d@~LUKmbZ*(IZ;x^o5zJ%S! z>A`f8x0Vb%93e-+=9f)tq?RYxK`KtG=^g+gn1r01B4w zf*x|kirkIyWi&XfF?A2oNWvl3B3O6j{MgLxgBqJ?=Fcupvy~M!d&wp5+B$0qyi64D z61|;1?hjasDaKly)Dgjvyc0Z5=(sybVbXG8_{!SPqDue5?9EtU+^#uP|4raAVKyYL zC^c6X52OQ^4J`*Hj%oe5BgqF1cMd*l^LiQcd1&ZOq|Xv$Vp^1GiKm(^=}|Ozdq}$b zygb_sYY97qN#zJ0XvUwjt;GWKE;(hKgi3zq@#1@?UoSwYOUKMzyF&`T`k`{I%J@O} z#me7LPbqNLP?|=_2s6MTIP}?h@#mZUqy&Y+R4gffNTw#TVc!0!nI$cSKk}g^SCROz zJFdGU^(8OS?|v&n-daUG8jGzxfjOoic&5x3Pub?+p1v+8Bt6nZR~0r721@$dLY~9X zH5`N%XR~ELdA%oF9WR0;&DT9GTIa^p70)pp7Vi=4@lbodiA~!R7p%}E{}R$XxD9|I z)o-iM)6^ZHODL;Mg4vVS&&|A{@ zch_}$SN{NA?%eFK$?Wtj!l$^; zHzuXvt}xHl}L!lj8YvQ$sI!^w(>BFPPl%BPIS2)S-V9~KB4Tx-F0=%<9( zTl8QNj=mjLc6jt-s8%V3lFIsO7~qdAPAx zyv=N&TW-mvR3b332S0iXnv$3PA`lM`md&g=J;Er&&PWD_{1 z#ba!JRpH|$bWYNyA#8ws$#;2x>m_BGMCOXSM3|k9x)gyuFIecl$W7hMoZrbIuqgM zHDie(yhOkYW@ws)V`p94#HMgbj?(D(cyDS<4wX# zRN@g6806R@hoB9^=t5%3iX=?oH==h#nV@VQD?vUuV`d7sT#jv;Xe-x6@FaUL*Z}R< z(?}~6Bp&palX4`a$Bork>r2^?2v~vt@oFKKcMT+_lRrUnu{nXSTe zRj%2hCmnI^VF*LXnZ79MgC&=T%o6)v#%o109qtS`(##}f8~LDtLgCGZU5=$H@G_Y` zWL{M+48jC!9lt?Y{SR`p+2F~a4&L58iKPKs0hA&aW1_kRpPrFfdz^J@T(0C~NHK0v ztEkI}`X$5Pk}#kk+cCNG$*C*MY;_Gm{{qUB^HCLw?88K01BWEo%AHOtT_Ghn( z%Ky#$p;(Kj-Du7tO_g&Tk0ph=z-U~n`}O-gp0R4j%Rg}hHA&m{(n_jz65~|`B{(yA zp+IXpUppPh-jz^TxI&B|1a|&>Zq{&A@m&ezpF6a+FqqcI5@KUStS&J{WB)t(f7-flGIj~KnrKqT+xrD;|93H~PfMftMk zk=ZjRPwJs{LRV;_E>Z}lg^8d?nZ}wLJqX8bCcWla9il7=DsM;bQORgIlq@us;$mb3 ziV+_DBM}@?kOAi8z)cU&V;smyN1`<}pDt*HVUk!N8KUBxDR5G2BQ#W5E^>>8ZOtXq z8)lOOA?Sm2>A4Y?k~9T@vFF&m8m>NgE>+Hb>wtR*omFraw8yq~Up~Jd+@e;OZ_rq% zA7(y0;{0A`EEmiSr=C@?D?!E2MB{Gq}nBxk%uyBXtiP~=s21aRJXAv^L!Rd{+sg$D%B8>fi4IY*y9x{`{2I2SHO&~TA zu|c$@e6nL;n8L6IBc1KMa0t}`X5z~b$Q+<|H=qX|nZ9JY291Y8#{Y<;2F0LHUqL3J zA?o6=qJ?Txjg%h``---6N?)-d2uW%}?59TOsXa^@Ag-nxT&B!YUbQqLr6I5Cti(Ab z4I!;s*tQQIy-!EdN^s*x+U@~zGXYbZO2aVB9hedjI9M^XG|25i0y*#@1GhoXt_%V6 zTe*QXuqM{UvnTo_e}k!EgxDhc-(O>zcZ4ycJgRq~#be;2v0w}a?4E9p5?uyHS5`^w zhx=*U-*>(@k;%OqdX{Q6QW%RTdm#sA3N2;$zS`cQ*n%S;Hi3KP$gpBH9HygL_m8RJ zv_T^NF8WU1{$;9yg@U!2JJkke7^)aOh`;pym6HV{`<@mJWwe%wx=O%?EExIuxv7M- z%iyb4xfTvfxNApew%@gL7q{)U-ASw^O|Iy=-|+uhf6E6CQd z#7tzrzRHWc4->@aBSkjgxzcR1o`~do|3g^8Pp1%Wd6ytd5 zFe(sc4o-4D<{r&dV;v@qL$A?34WyFpCY8)hO3UL(_$QtqksV4u5*^_=tW3MFrGs9QK@ z-PM`;uoYvef=EN7y!xZ9kgs2$Sv$xV5s4rX?V>_mBkoo z@#_o{CS)X*hY#{m&D<&7yrRqV<|{!YzzNzNVBiL%e{ycx2IRnp+hhthP^&eZxFK!V z{ovdY^?Kse4)%nRi_A23aZKMggTF|!>wO}a4esuaJL1jNmBnW%91Z%mLiN8j-S89F zqqA|8;PNFhmdzAbyRTSotW?s~b|pURQ@MmO*9H2eo%3xLAq(J>wz1(~109s17e`WA z-%JP`;Qkmd#xjUc)|YTL15eQ?XfRbTKWxTCk3`#8nsAxa2%+il*EJC)qn=X=VKa${ z6TXv-%AvmR22*YE-g2{#;h%ju-YxO#DXkvX_tKzfg&AKv9#? zL2msK_eUS)pfR->BLs2T_D?+RZWCoT2!QuZ)WZdiTujtBN!&HQoXgG zW09_V-}wVh{Chzv$&2AF?pqacV~4M93lWvOIsPkp#z7vutJFDkbk1DE|I^c1ctzDl zYkU~GI|QV=yOA71X(Xf@q@)|9J0+wW0Ribj(7_o>1f*jK=@bxdG3Yr^=ki>}6(rfa@vsz~L@xv`#D}2EStRin)h= z54p+N+=q`qKFwx0$xO5isg{{}BJFBD`H)DM1nNCJJv!dg?VB!`*a)KC}fCYLE3<;sT1*OxrPd1rnzNuj;2585Ejz1kvIapRtcmS_TJ&6=K}k`$*`HoxM2@|?^0gmlPy^P;kbiQszg{&kcB zN|LU-?M(--3yk9^vdN8y9m0}Ou3%g%CQ{%uom(fov3bhw6ZkuMPCR)OFgDwWf3EHQ zOJt%P%iHhg0@Pyy><^yl&s_bFTMFulPzbiE-^Fj*(T3IR&NsPY;swtw;QoQRiGA}- zeG6A_7LLWQLhzSBWo|X6fgq8MeO9rh$7BuCV71RVwf?|6#RFb`)vI%a@RXDw`^c$} zA{KL1JXsu0hqxO>3bXSwBM>5B|1%EUviD0A4XEm?EI1b39404K{Gps4<#5us=!P_= zo4U>W&oAc_fhP@f{?26{uv1nF(%Bku1HE`!Zi%Xw%9{AMi1Ou#)LsL#ztCn2n$-ORM_Qn z_Te)q8l`>aoKiI>!QYYd{m=b$lJ`T#EoVXJ?&NKXv51UR9y<5X8U~3)>&6HNAI{IG z;dv5E)!)syI~Jy?0imEPe%0`AAmtF{T!ZDaRv~jEKS2pe!EJQn*M&DD3_1peb2#$C zy6_iqt``ztAv5ViqM|a*rMXT$auAXNr2|i&I(ilj_|TP(HQYX+9}xQh?OVg{(O4X9 zwSf^TpDvhS=+Jdkn%mWdr|(kUKknc!T_6*^m`mJ1#`k0BQo;84l15{K#>%neavFB| zGqutW){%+?I)A2!Rx1rst<;|1KnOte%y(4UpxrXOfLEq>>{S^oh0+rw0~HKQxPXNU zw7VNwvRf}5bvI4`T&l; zKW&{=PGT&0Unk-A`bHQxC7O50apdXWd9LF`Pe|()>2Q1*MU^=2Y+Ydy`%Ve8^JK)^ z{Z74mvVhe$Pt<5-582y#eInVgi#k2&Iy^UC+A$?h<2$F^(gZ#MZuoYBr=DNSmZ`z4pJ&l0-V6%Jg14*2T!6uoJNS z@5d(!6mfWK*N$q~j?SBGwvfDdY{UIt7=mzxn!(WM4^aNIl%mWu-b1O6I` z*neTM{2vBD7%uVYO(N1vQdP;33hqCp|irh`1{T!3} zD`V_baBiN5_Kh4Lcu4lNxL_~PAn$_ebFEpKqYQi0c_NJ4+5eBIve(+U<-arw17)Rv zI%r;lAu8ylvCO@}L3RTNIGpYzZ{kH?*Sx{vx_!MgZV2khokG-+jVsaoh6L?w-(VO( z>20JRJNh%JniHE!Wziq)<~uGEb5Lttyr-_0ML%qS=^ zTMK+EbF_Bg*~FnrMzc3PG$7;4kTcKLFSp!|T^&Ayi*dRMw=_veB;j@YY!+3d^~;NB zlorn#S>4kQ?Jmkh-|pQS%_nJk*O;iXP}YOTPd;y|3TUv(31uHuOPb`>r+>CimAx>= z+fQCwVz@8H1^(LFrHV#h_shOE=mpTz;phO^Yp$@-RuTtz0T%e_i=v z9!J8%IwV~;=*p1U~fd=8W3>(&;+e}O-KmG>Hg{ z&A|ke&3KFtXzl@1P*qE2Qe&2mC9fAK^xh+aGGm`g($_+L`*;?gj%TfZ@`zACjcYy= z7Gi`%I4lF)PIlEDc`BNSr)o(Wr^^0MsU01=Yo+$=uwLz#ru{?2O1vGIae1k74*@5% zK~4{Cucy4Cs&!};4Ai}`;hN&VDjOdxzjZqQpKfmf=|d6> z@f>jhYy8?*3Ro;VGn*M(>}Dx4B|9$G_3Ox1S}J?-2_=%|2ykZhD@nnGu2xX$wKvPx zQ@k%BkYtZ*a9Mg3|AK<<90rYRdYwoxo~$;1+f_~gF!?tQ7|}W%kru)bqQoe{6jm%j zV%}6YWzn52+fx#F1w--M)VPlP`$(Dj z%{8h}l8<6mGsDD4(c}3Gf0|YB%kW_OjnPTUl$3TnN&m!SAnY(g#DYCbW@^aOYG)1~ zY6OA91J6;cw{-ifHyowTaCxiMh$(fx081i5lvyir30I=5?*g`&^%+3_HqpIdJSfK3 z+TVz-d;)7NLe1T>=Xk#@HRUeM0VE$&#ZFShNQ`xhx1I7-#CcZflh;C>kioNj>?utb zab4UG7XkwRWN&iu*vscgl2Cqhs&_=tnszm=uMJ*%3Dbkha#*G-xDdO!Nmxv!8FF^g z4_-TwZO~KDa9%E~rkv=$tUJr7h9Q^u;iPGxS@+N5Y?c?WqJik``i$+r@Va_%oenUpvX#KPN%(rZ zQ1N{4zv)P^x79e_F-_{eDvqANHfVWkAlYf3HPMh#K^BmA82q*8wMP$H zQ`W-dw7|qr=Afo$rV@lDP0522@%I^WaHL3i^d9NQsG%J8a26q5fArE`PqTy<=$(Gy zi@lyB@{E@@y3&g;VJ{KaAU=F}Ooa>i#8Xe9KpNFRSjai?P@%;RFTV5l@r14%(;RP% zrG>suj@v}%;oxc4>v82~GbO+Ry0{BSb-}RL{jLxI%n}Y;hWReAXL4?1K8t2Rdz=3S zl}IV4A+Ug(+&NyM;@StrY^yU^OIml9H2Ie3C!INt%C)AJPVlk5;H%9NuOZIQ-N*ia zDFoSb>M?&*nRqmbI2H*6p+!iq>wniA^( z$d)mdIf+~yiuCQWkUuwME1kF6HCz@$0%LGN?%-@3cbwilHHmPg$oFllAPbQ{Zba7YsnD92)udNlImVuo$(U^2 zcaz?%zA46=zbYt_T7<|L5zBE$g@OaY{bqZ;n}5X&W1CfqFj#7+34x+ESN3ZNk$Q?U zDAJ}^*tcasIGO(nI$=NCSCNuseoT7#4*%rMVHJ+L)7Hk0i5S-_vj0t}5}D)n7*A0{KTOJyXJ zhtBn;ew;wk$-Bp~GbRGUe&Hsg9%v0^;+c|4SmmE0x8RH>bRmmH6y(%F46l^;ok
    }r<_EVJK{e}eK76Jrmv)Lk(Z4PMIF$N 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 diff --git a/docs/img/gantt.png b/docs/img/gantt.png index c462adbdf4bdf93fd8cc4cbca7e83244bc5a801a..d74e1e5c3e5dd78ee193b5259de7cfdf8bda7038 100644 GIT binary patch literal 121795 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

    $UQHggEG);a1C;LUP0#_VcL`cP&kCU{dsU) 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 literal 213845 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 xd4 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 Y)zCL|tI1$0>7qq?KN#%D*0l8dADfZv)c^nh diff --git a/docs/img/graph.png b/docs/img/graph.png index cbc58e6d8f146ee365df9095d04d606227b00c53..ea2b7054e22e98f47eb9a0a0eaed8698c671c7c7 100644 GIT binary patch literal 152205 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≷VGH&=yvozmWBbG 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%0AEut7s#te&?=-vjX2-g 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 z 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 literal 333294 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� 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%0A<*uZPU! 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 diff --git a/docs/img/logos/airflow_1200x315_transparent.png b/docs/img/logos/airflow_1200x315_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..755001f82d5b205ddda44c27733ed9e50d7c60a2 GIT binary patch literal 20480 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 CP?mB4 literal 0 HcmV?d00001 diff --git a/docs/img/logos/airflow_2040x1370_black.png b/docs/img/logos/airflow_2040x1370_black.png new file mode 100644 index 0000000000000000000000000000000000000000..52e1982664a618c0e685a5ee0eb81800b8f213d9 GIT binary patch literal 94208 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

    EuV$BjQ0GfON)sm`Q)e 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 F{|AoKcZdK0 literal 0 HcmV?d00001 diff --git a/docs/img/logos/airflow_2040x1370_blue_name_spin_o_3d.png b/docs/img/logos/airflow_2040x1370_blue_name_spin_o_3d.png new file mode 100644 index 0000000000000000000000000000000000000000..dd71b5725877cadad6a4925bc93b33eb760a0d9b GIT binary patch literal 225280 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

    I4szSoNgUBY7p+x0^;qm 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�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ড়ZxO=KpuA(!8opaXhs#v3N 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 literal 0 HcmV?d00001 diff --git a/docs/img/logos/airflow_3600x944_transparent.png b/docs/img/logos/airflow_3600x944_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..9dbe2d753c1dca25eb64100ee2c18f2faf310488 GIT binary patch literal 49152 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 literal 0 HcmV?d00001 diff --git a/docs/img/logos/airflow_64x64_emoji_transparent.png b/docs/img/logos/airflow_64x64_emoji_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d01b8703438dadcbb93fe9fbc0ebde74d10062 GIT binary patch literal 4453 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 literal 0 HcmV?d00001 diff --git a/docs/img/logos/airflow_960x560_blue_name_spin_o_transparent.png b/docs/img/logos/airflow_960x560_blue_name_spin_o_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ae055cf73e4c29f5eb4d999df87c8155aa2b3c GIT binary patch literal 12288 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 F{}1L-l4Sq@ literal 0 HcmV?d00001 diff --git a/docs/img/logos/airflow_960x560_transparent.png b/docs/img/logos/airflow_960x560_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..1c9e0c61a29b571635041460577d68fceb30ef61 GIT binary patch literal 20480 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/img/logos/airflow_transparent_dark_gray.svg b/docs/img/logos/airflow_transparent_dark_gray.svg new file mode 100644 index 0000000000000..4d4d86c270d06 --- /dev/null +++ b/docs/img/logos/airflow_transparent_dark_gray.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Apache + Airflow + + diff --git a/docs/img/logos/airflow_transparent_gray.svg b/docs/img/logos/airflow_transparent_gray.svg new file mode 100644 index 0000000000000..1e5d2dab86500 --- /dev/null +++ b/docs/img/logos/airflow_transparent_gray.svg @@ -0,0 +1,156 @@ + + + + + + + Apache + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Airflow + + + diff --git a/docs/img/tree.png b/docs/img/tree.png index f3796b057249b7e0ee1b63a52270a623d1682fb6..06750aa4cb2025ede172d899215fe825ec57f297 100644 GIT binary patch literal 128024 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 literal 163147 zcmafb1z6MH_di&GNUMmz=n^UE934ssh#=h|-J?N3K!nj9Dk>sfqee(~$6$0#V52u; z4F352)%SUR|Bt`D?w-AO?>#rp``mNSIrqKAywp@7x%>Do9v&WvnyR7>9^UOLJiMDH zgm*rg{jBLm3 z&&$UhIp4kdrL1~`h%G|)Wo5e3?U{Gcgs@RP3b-NO8*WQG?Wg8u2}*KrsEI{hF0$eu zpDpJ3F6IcD1vf0^N?u6{F6GeRr3}q7Yv1{KL-sqrKHY=$ft<92URE4Fx$NyVJW_rU z4wZE(8k#$ol~C94#fo`ITKBnK>y_cF1}GgVo+|6QwF@Z+)uB6{+hY~h;oG63w@}KS z9!fg9VI{opZ!nRmiR*PMKH%aQm^Ij>qS_#sy^VMKZZ?nR?a)m!)S#5+laC5(@(>D- z+w#3^3DV+$A~j>XvUv%anYZ7(`8gzY)+APR^-$37DSLLVME9YwwbC!M1eSjD5iBrj zEhK&LUY|X~oeG`P)n!hHVYm4w6V>wH)WZT5Go;vVR6SnTy-_x3*3T2D=7x+8A>imC zi>EP{4eqhQM#)d(blzNrLOS&T46$Y{630g-P9ZB%5kTN z*k{%|MsN8xZEmTd-Y57X)|J4J<`iP;R4LyQo;Z3+u9=U`7Hnx$n5R1Oc^r)CB8(l{cx0|svTjb7Re zJ_#`lzds9?dK2rlf6s%xEG}Sm7xXC5zvFFG({fn>Dx<%knet}zWv96%)XrZ@o%hHb&$s;0OQb>G>{LR81 z{lGG+o-t1qkMg}D6Ok%q(g#8cqAI*M@%Nd!RK=^Pij;$uG?@{J#j4yM3|or+iK4xB z_Z7H)Nc@b=`jY&TdXj)d$!avy{z+EcW&!tTtv!ulBtX`2?C7`mG4EVhiy{GkD3`^( zLA>g2V}9V%8!tL__yr(@+?~%WpCHMn@et=C(_v_fd^cvzp3Hh-z&$ouO2FJ*|{KZqdJc@GGv3S)Ju8 z@dM=j8xJTSMBE*?|NH@lJ4d_z+rF{IOKqhw#W4*5`NU!|E%)42m##Zqv>z5egj?%X z(aeU^DQL3rv85-HCGsUPBrZMS;-Y!d@I*t8l9NaKiLS&KFQp>gEh?orOSOZ7!B483 zj$8p;2+k8O*P>THxu&wSRENHmeS59T_cH$_aQt^ojL^fl7e?yEpQgrL#!R`mpJa1l zIY)Gc^?CJVz6UBaXenuTz3S46EUi-gCcp9Zc~gJr6O*ae!t%np-f`Q(Q^h}}-?9qp z*5V15&E2gvc}qRn`1{d9^sWkGG=0K%f^WQODrVbu`zcxo&5RD;=Gn$Qe*2j8vHN3B z;U_|xj$Zuy@43Redd*9$=xk~PWWW>j2*G$!7j(VCnoAt^lep=GQF7s%AASZ$Wt(<9 z-(QEmZk)bTDpA@qR}cAyd4&?6gV*rAJ&Dt2*ptZ1Tym0hxB$`k70WjE40FUyYn<>m6bYB@7RFxSzTj ze15I@`bKf->ryI0Dq{{pj#nD?b>9uJ28cH^2ELls>i4qioh%nR^^-qxuxZZmZykOu z7l{|45ovM;%>A5w596(Nt_ZTSbLgoou4uB-swJy2b24+in)}rshNu`?$zxd%n0NnX zRj@|QVaHK9!Bl8!XN6!zJV*FYd#9_W3-jt56P2};#hPd}1bcXT40ua!W9ph}0~)cx zCwYCg$$rVcTDyn*$L0aZ!%hFagWz4OmE=v&HbiQ9 zTsiC{VvhhQ+8P;*xDdEvypq34!>bL2g&u}-guM?d3KI^)$;HbZg%97RdZ!RBdaJJ5 z>kZv&;bLH?xV43wuidM zS3O(Ed8KBDXpZPz#JQr5rSWQBXV@10gs8?|-ila(xiVb6I@8n6H20e{x7GC4Y=8A^ zHJFVeX*C(cK~l*A(?f19g>IVZ^nA(d#MB?MlZmLb zX09ePx+jat;p>BgMI(AqQ3%_ZhII}#yF5EnrNtg`chC4CyRvcxnpkjVUjdb7U26Ca|Te_Zz)3 z$1&|FNRkPXQq$wBu&S6|WF0%g$3_d{dW_@gC0sn9hqrKw7CbtV<&f5Rvl;FDmrMT7 z)~&6=13F@s*e@X`DZh$7Ogt`}$z{ra<8FKEbU7R5`NcB`p*!L$JnRw(vY3mM)X>c~ z>TUdG$T{cyaqTi9l?FXmNTqNKMJg0r&!Tmu}bav zrsb9Q3TJW9vqD-JKaqQxJET>RFN0k5YQ7LejC|gGF!E#MdHxQte7AB(e2NwpaMX27 zy}+l$M}WP1se>y%Og$@J3kkSdmWmS#CS#cp?s?=E5AxRI?Q|&Do^mm(s^2U)MAfG8x(Y(522nc_Z;#8 zryUAIeQv~GI|)Q?s&72;@E)@LdE=|;u1^X=!3c78a`BV^Ni+YehQ#&tpKLy6#(!1ua+GE^(0IwH;Ob$+D9kIw z%g-!xmywZC%EQ`LLPt^gKgqAZNi*AfdAUjO@%j4t^7;z$x_a3035bh}^YK69d-jay zx(1J@pNp3Th{wf~Q7@5FC9QOPHz+)oNZh@ zuZJchz%Tqv>RA#U0{2Qr|h|s^2{#((%k^UKrgqDYc%{80;FhfQ_itm5r z{bzkCzCWD$H_rXXZTVO3^?i}KE5-NU_gLnx6N9%Y9-b_onxfn*5I(Y*D3o3=^(w@4 zZ_7!8k}z6Uh1^|EMM;+2qV2(?T#wBwH#uBU2z?y|Jw1Y8?Zy|u5Ah#>Gx#UkiWKBF zRIg;)NR(3adyb?k($aLEQU&G))aAN$S#_I0Sd^!1|Fe@85`+ zE1ao*aA+cqcH%@|*y`9P8Yjdb^g2{5f~vW7#VN?~|2c&@$I6z`BHnqIn)MxW0`+F0 z!Fs*%{ZBu-d%Ul#6riP{sa#oEN$EL+GR4LIg-h2(csINQ0-C(NyuLzfYlY>AC?sz= zd2K$*|6nLwqZ&Q2es(%Know#~=kn91#`u<^?B5bQh3pU03iB{;AD`Dsj+>F8^k-k6 z3$rIBJtMc;lzGf5>;VAyv8hIEyA^AZ;c{yLIF%;x}S6Jso zCuvxdX>zi0F+~MUbWCn6tn(RD<?uB z7g6dc)*Ksz<{?4Q^0zogavLtD_vLV7>?`1p}UDa9p= zUCw>KtlrC4(pA-dQ)55A20l|fASWZGMBn@adV;E(f5Q+Q-(X0H4UF9HPE*0C3;fLc ztHP6Ixlt=s<@e~m>Fi`<P!!V}EOEVn@Tjt?_FOAR>&PQ$qVqO&;?ql2-Vu&0iGb zpQ6!wVOwvj(SoCU7hA7U2XeS6#VHA)?|JD2J>?tJX=AH zWEspOh9Kn5&I=TeSxew|)XzmBqLk)~<^AY|YWH4@G1NS(R`0J`Y*Qrc!U}w*0yu-Q z#P|uG!wT}AN(*VF^#giyOwenoJ1A~$QFic>Kt9JM8A*uyL%Vz5&cps7{^l(HKOk(# zkwC25HfudmTGu1{2Otj?4VyV8fyGXzAfpd6g1kp=i)_pLWCO!q{!Jx@Ifu20pc034 z6A1mDEd)Z1HBHkJb@MHpoStrcOomJ*r|oxM;QA*@(@pF`qSwK4asiFOmuff{^0LBgOSGVAV zh}yG_P3Nth)+w$t708PIJqb5%Wk_tC3hANW5rGx&(pCeXnmRcvtch$Ny_^@F@t-Qw z{2;-#{gv|{2K!&Ssp1<_mW9XvrwvIYl4q)D_V+>ngGCdvB`O!kaOE;!Ja4iram0MW zkiVypPDWpLR&`LHQb!rpp-aqM0oGDym(Gq6LTM|y&c2m}e~p^$wl&iz#42x&u?(^`gY4w<9Lyl+EcX zLI7RC0ZMWGiT+8S`xP>IP=elG=ftvLS^hGSQ2Gpwx2Kgoxju6aBF?T!jX>O-J`x%d zkdET77<*V(2fNUjZG>*{>KDR;+Q5&QXlXK-Vx}*9(96%oDDqX>XZ_l`cFgKCaCHLP zaqws@u%EahO3qAXe9Q$bvHmjPz-Y;qKxR$6$n?>ikiY;C`2TN z0d_ORMG2SKAoIYm5qMWm{+O_fB=%VTYU9QHw*a*!vfagIUAtHmzl3F-3FtF!rr7kY ze&9*Slf?y^`q|6i_WX|@<7csZG^)%##CIEARX%K>;OWpFTwkZtOu>2T@U+TS7Z2cEyA02-zs!i0hSuA0Zgn8Z5M>AHgyfE3oBIjq9*`F zEF=+3?om5JHD{-JW#+)L>Z*?!@Xkf$Wz+R9XMtA<>(5R`O{*7?StCLHyubso9kZa2 z!z^B`3Zq@pXi-ot<{)4i?%*u>)nIXuG0#`0ctJtR&qkO0wvpOD%h$D?`{{Wb+k8X* zxC*t&VDPb=Ry9lOu`{g?8Oq|s9&kv;O4>9kjl986I?Ux4pX^zDRrQ*>kfJQ+b8e?| ze$?{N@tR5R;sOU$^{{^z<3}81S(*Ok_aO+(*W?)#TMFD$$DYCCtKj9>+S<`&q41>Y zH;Xkv$oOC^xbn7)DG@R+%Y96WZE4xPo2&N|>t9XBmuwY!gtJc0T~>bc82>|j%sgLE z&wGZGTeSP-!Y*EQn{xWGDv#zZ8j@oBG+;I~CtCbXxIlt>#|xtHEupRtG9TWs@D8*RB+L@nU%3Y92ks!8Iz1E7!uu!O#Pd$U=HU9O)?Z!8bpdGW78;Yt!J7s5WAoi zBaz^J3&?QSCO&mKfiXVdaD#BJfcMVY=b_LMPo*bigfO)}%tp$Z6&PgG1jvKdP}CgE z?_w-k(lZg>`YxPCg>}sx{a7TJ0aR;p24pz#aTtT=5enGFAQDB|J7et=V zQ{`v2$GoJGo4?YJa6IYN+?FJU4L`^Bcgf-8dcyx|IbPe25KDsJ1A-dguAQx`_|E}E zO`ykqW@ct@T?=!4vK*SSYXJp~OO45m;&Lu9W#n+v30RDXiN5Av>ugJx;cEmm#8r(gyQ{+^@nye0syK(+RC>Gu(N zf_}YN94HP?<1T(q1N$Xq%ymENSRBf$Pm`tum6*mHpqo+IKqw zF02%PE^`~srgU%O zx3z_@JFTxmQe&qarS}dSe-9Pq>e)VBO_ZO{(#c965rN&DIB#~xZvmKGcbbF`Z6wbUmbTp6O-D?3~bvNF50 z7mXy2$QtSO#N5#Bzo^wV5e4(6quzK9`jyOusRidNx9xN%glO}`>jp>k9qRm4N89a;Q)URH8I$&LFL%mU&x04pkTKE9W%IKsECT$+1ga&2 zeo38N?(VxW#=103m4UE8*k17d)VeWB2}KsnI^BMR#g+Y+D_9^R^)|~ML z6w`}N+s^FOw;4|R4IYS;he~L$&9}`G-f{#Vp!#b^^6g>iU#-ZQ;JT|QhNP#p5cajn zr&r!P)3e)C#oXv-xeO_!1zEAC))Z;w7#52y-tb)tIw64cz_Wh_yNjo~HlZMscPzc! z{RAgUheMZSzevG*e8vH-uIVN|YL#BLb1mCLPOZ_|^}?PPKl6WF<5hcPOt@GtpdZlx zzx?`FNLk7=+tb3&3C+Uv)>|h{^=BnyfiPa9#=$b&DAp+^K(nqceLRYKVAn;u1>WJj za&=ZhvWGL^M&T44gSvN|k3UqGTm^8!NUkQg z!{`sV{V3kieG%glmTGj0o)ZnecI($jm5aCN_drpo`n7nqTX{d52Y8zXgVDuidOMc`trxL8 zCXHT(@I;1`otg4FzTkt{EtW4+%7xo`RBNdtsTL4E)vZr@lZoiXAJ@l;5*a?0ScZWM(G{s#t%N{AdZ)|iA#suz!?Uiv8VLAeP(W7NP@p(nC(r_hOj-qy~ZCzyvCCAXVU)COUDW{$rt{UTs3>6<%7}$i7(W)r_v5b3&#KveMq6T1Z=;F7 z%822~JZfkcp3odId9Qgy^d-05RQHbb90J^UasrrHvIjRE(lxo~bIfKv2mpn;=ywMB zJqPGZ>Sbl9Kd{)V?m6pU*9x{FxHu!j@BLNFFpL?W>eMgXv9dIYx{>Kxf#!XZjuTBy{)DWo#xdY2i^d!1Bbbf$8@1prYtBA9H2D}Z`9pkV zuqR5QTGCjbIRbBj;Fi-ilR1kH)x(Gz6>}9oteZs_tr5KVhIQ5r} z)kqEEl)`7pAZsjWO9d#1z3hT?5a%U<0<1JV?V4wdJ>x_-hx}BN1gL+rkdTqV(KBYQ z*xjbR6x5g|E5c%6KCvg zn=q~8x>&vzm>Aby&4i{;8$Q7gVEw{k67E7Pu z>>x44r!h<4#ms&%6kWr47MtxH8B)3vYl{%RUnQXPwe*>*gLg9w*b5pRgShSK&-#PO zp6xQ291oOzh(^A9M*nH(!KMIpa*v5BS6%H~)lAT&&)!~jb};CDZIgn8yw6>pBw1D( z38K-h?6{VD^pBsTE(uB-JM{KykBpr9a&eHQZ+5c}M%yUk^MVPfs27ggp3*l0M2t{O~l2KV0Rh{WCE7L2OUp#&Ks6cEETgqJB`r^LS!4 zm`9UEh~B-ELXYplHn_*^>Ri8RJ?X_yjjj5%<14aD#h`rC>_AiXy^i zbzCqfyd}MpH+i(IBy^sIMq3*r~`nTBZI$d2G}?@w^!7KC!iY3J}YpL z%z0j!5%H`J==3_~C(6g2UXaS%*!rv*j2=w)C$&6DU~lvJ5Q`cB1@ezv&AaE%(oh?0 ziPoLh6mOP&*sJnN$?k5m=uvk z+v;}WU-FX(Z{eTAyZ~>PYhw)p$JIDygHFyWClr~L1M|p-Lawk&i0bWlmUsF7+eKuQ zl@tx+>IaL1RMghMixskD0+5W^8W{;bl%US5A1mZqvoHJ7VSuu?6*r1ZD=}%BmO&S3 z(TJ$1-P*hxrdRx0`uF_Fj@i|m$W-lvnczf73aY=338HkC#>Br6G`6(lYKEPg8CO|6 z5}knzPCJ(VcbpggER3McurAT;jgLT4S66t`>+-t2g+-SR)RB{y^`IfeeYf&F@`nl3 z&t*(Bb!4h4LpaB+B2w-|IY;F(*alpC@#QibL(?m$1{U9>RNXex@@N3+id)bmT~p_F zNXC}y@(|n{Gr&SxS4FLF{ z1JqHE6s(GDMs^BGXhmQ{qD#g+p>6L+G3y+_*VMz z-}d;Nn2oKk>>-Yxd81Y{B62N$Ap%ek;mw1|LK$Hm_;?6RL~5FXO~2eU7m^x#MDII4 zhMD&qx&QFXqR2x(^3^YkL-ctWw4#SUz9#LfJ9tr%!{xVfHWbk)-te8u9zb?`bj673 ze$)<6-MnS%`BeGO6}gO)r7PSLCf*my(%f%I_ORy;)9nv2!ha1HyIYc)RE`X%SE`&I>81igGhAHx@c_$a~h@nn$q znQ*yZ+=gi1F;)Kt+1}%F)aN&iMV;TGY#r;swdO|$kG_s5TIL)*ChGxlespFZ>)~xe zRvkZ7P0{1MVU&c2_$4;d>Eo8SR(ca^UN_w-%#E-LHj1c$8-@%(8W$q&1fm?xvdhBO z=3+eQR)trH#Z^?6*8Q^y!v5HI?71U#dLrj0|1BeA(qYb;y~-CRb?&1rL9w&v@h;pX z_2j4D8M6NywTvojOnGmHu zU-R+!Pf@NN1hZFP5?hfp?@Qp-*@%9#Zi9n7ND+G3E!raBK+DF%Bz zthz!bszFE#4!Kz4;Q2gE-Fn(}{~7Z`=$3|S)q)S4hn-_XN~l*l=xTTGa@h2cl8jrI zg(>A?CIqMNtyWPo4AWGJ79JvT7C_a`m@31v^DnNSRx+>@$0C}RaAlQR+w|NsrUA~i zW{05!yAgs!;AyatE256(S%Z;)==q3lpaj>kN$iE4f#fG7Lx|V<2H)`j#=+PdY)lqyF*UYm%~Wf^z4Q8NDxU&@kFY- zYX)jR@a&5prh@*VUgS(sJ&QS_64=nD=u`j@Mb2la+%2d7zEk@mXU>qTACdR0W`tmW zSZwX%PY|`Yg26|B0pMW1_~ox^ah19TK80O8Vw$NQLedIJZaH?z+2Se+7`g4 zHDiJxW0X?LPON6we>_YD;5rCp>Q{LXi5V^kJ z!Fh#e*vpU5!>vwU|rV2L!|866@cweg(rs9x2Z+W_RI=UzM@3;#NT3rr1K8Sh@}JvzdXIR5w8-4GoD9B^feD||%jZBl>?73@AOslC zkqhMT9BG(dTR>jiTDZD(<&Snt^262*j~10nwPI&DhrSzT+~pt`|^--b8 zJujhiW%RRS5;*3@DI4dL1`*$SA1y~k$C-~4mCGTI@-wt8zxR;IO#qJkZKxxn-gi6q z$!Jw3#SYLzDw(YdCE^>$Un#X=)NVN|B1OtQv3UWo^d*cox9`du)QfXm_uBh_q2LuJ z(%qwj+W_K##Ml`pw?_U#0cuTYnUh6Ho~k^h)bf#ljctwR(wD}a?givA-Ir&drM`eE*uU1*i3%sqsC94O*V81u#!-*<@H#h@(!B#<6vkjc_b`c<|rsCJ(kErHoMPT&VAa*>xC1tpXu3#@{ zFJOX}ncCP*4o&BNJf^}??$Xb^ydPR~x}0RgI;o@x%i7tOADt8sQi!a@4Mq3>^Bmym<(__lCuZQZO+_s=%NY{V>iWArRy<- zssyaN*&n~3pvv37h3yHs=((@VSgtaWc^T*gLUagz1>pwQ?VWhoCL%A(cc{ zG(w98j5H!fJ~vxR9FHm_r~A6gz@vCJ3RYMbHCN}K8+CP}^&+AraK{rIK`GDr583ap zd_Fv)BYRD_q12BJlF6@Q6YDv=V;-G5#(suRK)3&CE%Iz=U$5aj$2_^vUy7^aSy?eC zJF)X7Ig$YGA8_-zK2icE*MoYp-W^Ts0woywgpoAJR-)@bG(jM>yS^)@ecAq-ZU zmp)#zl;C%LFc;ssAw|HsQY@WqAm2-I(rLQ-nbc=~p>gJtEs{*_l5vp}rNifE+4Nd^ zeTTaty4gKAD(KkCtfC1M_>ma4BOMqWlCVp5lCiL}RtiwIexpxW%Dtm}i4hWc%M)BF zx@pQ0;hG4ehoPt5GkNo=N=fkxQAemY4O-poX%XF0x-IBNWeMy`y5%x+UXj&9N^lS^3fl3;|L>P(0QQNn|acDg;OKXe;Wj! zILv{+YRx7f%E!(legfY4Ej;SEiN3b?{TnSdS5z05Y;}QiBc71-m21!a1=-l4&6(KF zhSg`7TKkkbTCx_({7kfi2_dED*Y2hy?=%d)+Lzg+b6bg|{!WmqokoXM#O5Ffwcq6y zrGp-+i+!<*7iTB(nq;}9BgMEGhR{}_Pd&Fi)*5bdmnk&qcN_k&u?|ZVV>rMAJ8yh` z0%0pRn&*uty2aTpEPd^~lw*Lw9n>xRk;iw`D>c=R%oC30B$v*He`ZKOu;X!Ux$+>P zoFO?@0njCo`>q*rLUVf*^wSVH{9#s%b4{Y{{mcE)yw4eyz^)6|pdBND^G`X!KK)#U zUoWYHDhvn-?m;%3T?35J5~6%mn)sCql^>VVTf-h5u^{k;TBYMNVJ;g(C)I{H_ETk< z2O|~Y#@UI7q7(M5i5cpC!{M;kbSnG%-!+}62U^dDT-o_tx*flXfmbWq!(|}pa)_nO zlknwoC?=@7K6>DlkM@8~h&9JHJjM`l_^)6?m}b_1c>3>XSY3&sE3m#`VzbWIV4#Bd z7q4*L8K$n$1Ephsj>l@_-m+5st*5L8rt6qhnGUybt&NsW%ePmrTeQZL7qPc?D#i7*3b)Ikf zIjrPNM3_s9%cs5gn1{=m?kGHRz)bW)7p@~Xmey@ffj`<9iyy!0QrByX7Zf?Fgs-D>0wu%m!waAdm$T6m z!ZXIYwQq7n2~oB?z0m#+0b_6lA~l z&*s~6WTz_o!Q?JL=K%Cp>{n?1!6&ivyQT}#Fjl~ECuG{ObulnrxXdCTARu|-M!S7U z@@4N{yN`0vM)gjJLzGR(_tie{hpsf;H-EtplWS`YXC2Y7^ynpH+BFCIcor$I6_QlK zS>>RzxC;G5G1C3TO?*a7wx?ahGYe@k=?Wf+tA2pilxuCEkB|ICCs|X;^`l_?$-(4^ zhv;womI&D1((SW7b>K!`+b#Rso4K*J>8r8+Z zLV`O@eYRs4U0Y2-5wn@QTyqE}MZ%v8aRd<8(bLYm28ph*ai>z9gJVqGE7}rb<~^-m zA#m@rDz9qF_n#rY3Hgc5Np z?^0>^>x;5}HkZ8BEoiXQEJejCTQ(EE6Q{cM6w1S*)X?j2q*v~*cgT2mEG*WA_tQ1U zC-zhb37N8eKpyCw*oxvJ;NmulpFei zDs>dU>TrrlkeT^j-h>f>xTiEsCFfN&49oI)I-m6yXK9Q4feP& z0D=0=n+T})FDX6#7j}rr1S?&d1 z2dv7cvxf=k2yqE@>7MXu1Od0=VhFY_B(^Ulic`wryOx{Fa$IJPZson8_a4X&)o9^p zXd;M~u!)MuJu<2$g6p$0M)bzLYuQOZG>^P&4~*F1kls>rXceGGfW<~E^u?B5MnN8Z zQO_~^kxo1|0_qk_!pn3e!?DOq?z<&mR^(wH$QQV-`t@6$L;@?suTSB|{j&Xzt&mS$+dIRZc8Pv7NL&psU{7t&bt^+0 z46(X6+jER@Ph5O~EdhD{Ght4jD4RL>2GWIF@5z!}<#rGsfPP!#79N-)jfxxm=u+YGCgp1l=0~r`;C!I|J+On%L91qS)%9ItZL`?ODD=Nn(mUZ zs4fqe>9tkS{&mw*ZQc>CC<30v48IT80aIMys~G)i7N(~aW%dLsf~L8OV#}NHIT0_r ztCoAA^G5O6ILnMAd*6UQ3ra3AjZ~Gh-lIb#E!3Zx>BfeoAXad%dVU#!j=`zXvYy|u zIohZ++y5f9^)(r(z;K=rblSlX{PHpp9LU<$6L(lCy-xUhkV7eWRE~g6OF}W`H@J41 z_RlW&PWYgZBK-w#!&k$Us7KM!UzgQ~gE#JoQHoF;fPL(YfYVgYJ;D9X{Ovk~iQ0M2 ztM7Ah;L{EWbqI&()KqG3*ey;oZy?fztX9dcH+E)~ z`<6yqA?p_+)7ep3va%b$xVg3k;^X3+ZDra;{hWN)w_639Vpf0oACnB*oOQUKs;G*0 zS6ac+bASiYTav68?$1szj;}DVx*+h@YK@zvAF?$g%9%M0$hAG;5?GUUMhL&&>%{vz z8{(dgxvUSyrnrU-7SJ6u%yt{_i9-bULd00s(FH;1YpG~m)-sKC+#foEYECMokP_TH zzd?3f(AstRHEssFDLlm=Itb3#?K+p@{G4l_pX1PCMHNHPUi0~AFC69G(wenU{)8ib zTU4;RV3pmaDj$uq%c-_Ya;*i-2Gby~x=~-?%BAI#R@~)H9WIUT-%1bN039r-%j3n! z&NyDTI{zPuY5gN!OB}xO-D{7TJUYAk!(Tt|9M*LHe08|HjLWL25RiO#F>ct`3gYxV`U^Zq=L0gLeRygo@rnMjLo$wBtV zVK%|$S>&t7BBTw`sE*Ol+S8Z8(^RO69-g|ZMMu#c53*fbNpb4!`H#x0t8t^u#x)P( z*r?s0GLOrHbfRdTU5p(|`Q}*pct_GJ0a9v?sRKJ3-Y`wmH!dQTsIxtyFoE)XKCnLJ zo8iWKu90*EJaq)I`NTB*EAKn8BhHaH7EyZ&&xYUl)RqKjkV!hN7)EJco$^CO!krRu zwl+rlEBU=`=NSw?&>%qzaiZK@Ut|-a%fKWNPqOKroL@I^sVEdrrnjQedy`D6u)w&6 z9>=q(GJIj6l2V#lJwo%lr-s3@{rV&;w>^dt&%IjfYWX@W&?MD$o?`WaK@|sCH$!Yr?$3PVnmk~@l zHR%YZ4XXKUuZ%ln+4f*C^f!L{1B%g z$;4XiVj3`#-h)Y4yFDPW8peaT2gq@6VY+t{O)N&)jT zq^!_A^r4`o5+VMa84Px2g%Z9KMIl^yU$)vK_MJWw1fA`f(?g|0M-`coR7@PIe&P@< zobS1)=ULs$-=4=SIo!D00kTWx`IQXJA4xV=;K}1-aJps4 zbj^8oJPW-_)y+7RY)-yilIZ;^#P%=5Olh#iGZ+0O$TaUIDs&-m0qwKK6ErFqG}mJ{lBPO$O{9mcD!ie&F6(TY{?d;%=C37FnR3cWFvxT;MD;%@}1e#owcr zs??r{g4Xo7*f#HOJ40aMImf#e8ww0|0a7JBGAQTc`e+jj%JCr1`Fk}LpMchU%8{X6 zHBmV|G_s+WyNu73W$CIb8{|Sq-W!XKo$w1VuGfhop0d>~z}Sax)acL4OzZ8OJb+tC zxF9XF}!-5P7~J5e4+WQyeIRy!uLoZ7^ZP%u(UI>ZuC6ZV$?Pa>2I5!)OFw(AEo%ASA^||Ix4{A4!c|zFfkm^7SwNC9VM@u{n+hpVTAVEX?*r zo|k%zjS$jO$cvOuvLJ`P2S>-8L8^k!8JyQ>XoAAeq@-dA>|xw4ZL?QhZVxM)6GgeZ zRXc;110Q2=8JXU9vZ4`(tOP7!O@;ILT}RE=C`_003xhDT2ss=#bw?!`EFR|CMQ7CM z;e?M1s}RZ2kB%8?gD}2gSsvwBHCB*B8bRU+CXY>!j3{@P>wkHvs3J4vk zbS7L`ao4D)J!in(7s&PhDh7Cj;7PHil)v_aQ88#l!~bLNt)rp}+l6lx6;v9O9y*i` z$)Q_H43I7<>1G&0q#FdJK>F;yEcF9 zHO#Di?|Wa@eZ{`+-*vi!b0M($Y>QqUhG1&DsA;)ym{~2SPa|3tB@!4Ai@)fGgk8Kv z$+MhteVz9a!(Ep1H0GIM2$q+Uu9ofR^nH} z4@fr9xC0b5=e0TkPk|$K{^WUMI_m!F;eUi1(GP5Smd#X38yu>#e7kbc1qSDj(R<*G z78_kVJM>}HQ6z4)bWlz$#yxzS%4lzQ1Z8na(!5s&RA!yxG9v6JP^HySqLVZNv~TIO z+||!R=P(La7Vd4ci(VtYQ&Sof6r=R~u_q0p31;skg{+BMm^-;OQEY78FR%Fnk|iO@ zw%23__HsgaT$Fqis|jhgpZW}{b+D!=mDCYFYUT8-7$v2MOW~@9Y^V9n)L%zH+k6)a zTwiu%M~YCmpTyi=F3hN{YqPt%81iDaWyHAYgiF~Tb&d6Y-~Gbpj92Z|m0TZS=U?|Y z=pp64{c&hB$al_YJZ!EZzq0x-t9Wrpq^sczH;V_^p5f!T^uEsZs`!l2KA1<`?_}_% zyrscs@EGF4Yw$b!t- ziBAL{Z@0=gBlfTdv%)@s?I$G35P&qHA?XXoKQR4$WH50jr6m^~u?42rxXQg_CQO5V z{p`TVS3im3F86&k$g~1IToKg#5{%~-WEvAs_o>o5TwUdn{mts&=HMD;ITQE?kgnw(KWK7N2{CWe&Jd8zUnc$Scu?T6gx%5!zuN<+K(r-Id!l6OarEnIMypD$vC6l z=a)LVQqo;|gU$Iv@vd?91vJHRoAu_Ad;HR|pHfZwAHo`u=c%!t=Hh#)^bi;S%lI^b z@=S176n0ai=t^TnH;xP&_3+hH-+JkZ7ewb+-lsRzA@Xoz!rI^8ab+g6<3Kx`dSa-L zzXa=qJ%c_f(U&@MCpoP>j5>@0b}a=JPY@1!S*KIqoo2i-n4C%9Q$5?{T1w zta}2c_#9@m40^Q|gVIKK5p(B{q12_Ul__!;wsZGE_jxx#yz;JoGoD4^2DU!-ik(=W zVZ>ejB${`c6m<=A_axL(XP!+wMgj*5y*a$54w3EBsv;|D2xkz(TMb6VZd+!Bu(fMakgQj@kP$OTzn#}4%l zo>O8(Ur_upAIZV1q4mNX#~t5QiRU?AYv$1o{)0l^58PteW93O9jgH1#6l2=LGuaM) zGsVf~eoM-0Af zdKjy(N&*F<_XN|LSdC5MHmzqRO~8-S|c;mF!t*jtN`|jCYNjKb;j#nr zeexv40X0A@H}LBsCQM|N#hh;yq5g_&P}d$um}JPgdfhp0anL}sJoX1aS%93qIVpb< z+HSu=FXyyWLQgczC(|@7?7mt3bjN{FBc# zjg1&Lf1f-j-p|l;8s{yM&e6HDo4uk&r({~V1nh>Yf>wBcLQQLs4z)^v;WP09Q!;;7 zACEhW`#STGXX>P;x#{7yvWAwQFZo$Y!9{@LCU1~EOhw+t$b^WLKfkB3WWZEH1 zg#|%g%u^<>8pO|&sEY#I1gJT$vvygZn>ntIih^c;|{NMY@`IW39+`tu8V>tBjd7Ct$AFiq0P^x?tjFhq<+z>Kk_# zM8u7h^A-t$8dH!h!#L@qf3|)~Xt6w?hE_rSnar6Rg!)owCeGzOzu(_ec;||7nU*Y9h2o+P8XdBD0A;D?xlcqv}f^N%*NwK^amTuME0_lT)oTq z#PKA|7=@_igS}eWNKX_h76R$`1o$39o#GU5Z4tS&;oBlthK-f}Gp(E%G|FmN!+@yB};P+;&dfgOhoRuy#l$kXbn z^_zLui9RqJyO9yZEp3zhg9RWDBHt}5dBD4}O!Q&bG0WlNmDU@Mvv%Jt5;1czq9ZL^H#x*c#IKYk9|djL7v)dGeg*1YqN0pL9f#g_5_`uY0|V_w)ypEN6r@tthxBm zbPe2#^zhpCgbVfFKK>ZGduE~H9Z%S`W5pZkQjA%k93_N{c+%# zxb44ks+kbmQNu;pVd|7pvShQU+SORKM$=RV`!+xJ=hdKuWS^gf2aBpoIDr(OW_^mBV zi)s|vDx$*At9&r5W@aMbNY9{dX=*zJEmw7K?y^dGff;XFr9Zo2Z7aagZ*NhGq8wK@ z4_u%p_5PB*JOesG`O2)gEh-hZ2W&;Dk?m8i^V;t5&zt&rSm8?@p{vl&8TIDeO3E;- z@Wwm$ra+q43YFdyLON7G_0*jP#6)&x;mUH|y(Ui4CsnQ;Bj8R>)CpLMHVrnqB1es3 zAmvXakyTw%2fm~9C6bImPJ|x*EM1-9SUvl!l^hA8SB~n4(Fm8ulk$F`gsinmA~x9b za|eq5UeZ4S|E}mYCpwre`0XYW(330H0aa30#nlO=G;RA!iCUWNziVE`+0b1(%cze- z0hd^I2Q40kWe3|vsq6MK{*`Lolv^^z9rBImR%y7}mBl7@lKmFa!1r>r&aRm0PgH!O zfbbwmuiU&dKhCe>YC7AB)Vx2+ct4k1gv!a_^EAoFAz~&Qwukd;A9>DFpVA$Wt}g6$ zSer1vQ%2H~zGKckJz34knaQK|3kjZ+Sz>gNLYmQj_4b!Fm0C`E{_N@us5MKoe=&b$ z0TAbJPhFLtI}{pyqWmb z#(wr*AxE~K&Bc#0!v8(AugljJR6R*rffYa?YfnwE&}55dZKT-~f4WdOt&`o-MLez> zCcXd;BHD6o=&2I91Eq*?R>PR`t|)5KueR~yXx^}|9Bh$Q{s$hzUgBm!(PzhU6VQ}a zOVgt9Szi`Rn4ApY&2km;iQFT=jU2K0 z+;|pVSPm;OaLU09-1*%nOB~SvBbB&xkwVF%+|YKT?UWW26yGMDR1{!$}$Hofs+q3v7}WnK(mZ-NSbO zdm|F1l}&Ll0<8ob5%9wKipW?zZ##<1ah4=k{)a;THX5C^mx|}~YDQt}q)6JC!KJ-} z^Gm|3&?C=a>hO~U=4%X|tDxrc=uC7(u(IJL-=kQAU|hLjj)B-~pn?SN-6PDJh0Ymn3`sCCp?>(4M1?m^LDl)m)NSabhtZ_x8 zJ-f>AF)^1w`4qjP#+?2x$z?fv%iUj^x96|YvP7#cJw$e~8*sTA@a>582Z?Yvc#CpM z4Jad?qIY*()sMm2vCKdEM35B_6z=+;^+Dm*w_gWKOv0BV z;c%6cU~<_vv9rAJ?+c2bAJ4Bir1+e{+@`|sCQLrYz&6L9=t(r2y}&-6-Xp*{)H@=C zf3|i}oR6h{Q4~Rqt!A1IWa(LDX0%^?jE4`&(K z<@(G_gN4V}l$*kDJ!dwx5I{m(#c{8$godw98ow=Wc#hvl<)G!)Rt2Kk(G*>#u=Y}i&c{8);48byir7V6TV zyLioJKK!D^3;HT{mC2Lm@XiU~L5}>8jyUU+=RCc8#z;E9J7QvGAU)IXcE~O=jwyds zy$)09!f7Y*&Zo$6hN;vz^y&=3Ra9J=e^;wXALpg5bTGfcHHE3u`H#FAz?JeI=P z+w8!5B~#%G;fh;hCBaGi^V9j?5`p_zm0o6+Ffbi$@O$y}44eoUiIs6;)DBVaSrBDs}prF@NsMDzAO z(V*CK)-8NPi_)VmGx~ul#~LS7h}7Mt>YXsY8nx}S!m%U5Zv+#76uBN0k-sSc^1Hs&MtQD zKP#yj^KS9uET;MCV_rQm7oJz!oMp~%AN!naRw{3F^N5cHZ}o*r#`Ecd7bT~#Rn{Q~ zfup3ucMg|<^;e!GXEGG!b#oc|=0(Cfbh1l$pQ6%cf4PzgWCa&K6#2~9^(-Yda`t$I zqHxUCjVF0oWJ$!{o@Q24^56xuN6pxrMBt|EwITQpP$ixyC;RlOZphDZE~i5|k@yz! zcH%ojArv|Rc4gt;(LZQ{`piXv!Xtl@Je7kgzyWpO#!|K&9JgL2m->EQ^rQE{^ir%45iUZr><#6RW}lE~G3~?SB_%?O3L}rhtC@Dt z=&FmO1!=ZKG?LN6+a7B`85yzgQ{F=I?ZfwJ^FkMo&5fQX+Ep78+mBOUEW@NPT^{@5 zqiOy2M^w39=X7S6fxTsf?1h)7zyp(MnstVa{hJdRIVmH@E6h)q=m}|KCROlg?Ww0) z6@fVM0qDWruiy^XlF~i9?=~5@qoQ0(cNjBqg)oOStB2k)i76Jp%grH=4HE}j6vfjY z{2$O!U~x{X4)g1v^o+6w-Gz{aQ9_)u>xGHj~`#hc|}K5<*;N-ied#z)!DT zRm+=dU#;oPE=l>o{q}m5MiZTa}NjnrXFa z+zsLV{_t1<;jIxCKOoL*Y|m8~hj}XuiXWF~ah^TjY`HAT0`jcu*Y%6hvc&A<*B0=) z$zbh>`NL}RngSm8ciD-)C3zfRYwi2H$OtslM0U59Gs^|au z(*F_9{@9S;w%dg6$LUa1oOH7l)Z0L7HOMHKq8s&e5+MbyJ25rMjul%;{dSx>#Vqxv zdQO>jC69SYOUBE3W^1F)B^L0nsOhc~vj1RX!v z#*w2}PV6^U5g9c(LojTPgPDYP##;yG7xLdlN>iM4_lcGVa+KY+$ChO0xdj(dJP0i4hI5@TY&VH)egpPFOTBRm}hQ1A^3?_a_UYskrckbl|9`Q=k z^6OBNOXAb$-PA~_>D4{;7=+dvT1ZoDE@Lr~owr>aLJ5AdDFyT&nKVo1UB0*|s-16a z621NA;LN7wRm=Rj6@vT2*#7>uwCm*nC};dDOw5TW?oCPIT7aPe$z@cSS$VcTdg)*t z2Ir5ZaP8PEv*`3spBg)tU3@tilZfq5Yy4UAFy$gaGS!~wCnN|;5=%6=o&c-M zSl9phN!jzo%qYbE_%zTA!6*8@vCN^(cXRs4OgJFLlIIok&$C}GK%sSmZuONN9lEUH zgVAf659jlpYnJoTP&XJZ9p~MBg|XSU{N6Z(yfLxfdb!~YKF~GNhBZ2?hGS)g2a=n*fZ*{;c(^SL;qT6_U61$hwI%04c^royd9<+C=9U#lnuQYlHO8J zZ7lKQeuTr)?XV6}TslSy@8Y0g649CpOGRGhz51-!xZ zh^>H5F(ZXfqLN!O^8Aa@md5tdBAfX6zGtJ+5z-^5(>X^yq!L$$J^NFCeqlL6aVa`%xo)l!C z=rEvIinuS&-$i_7sy9tJ{Tsb7R$`;LX8!zD>0a7VrPZMtb2FF4mBP0v<0K2QTtOV$ z5EBE%H{*nsx%A^3?I*5X77}|W;#X3wtj8QV^By7I5xR~h|G5j=-#BnieN1OL;R2Si zQ*Cj%6Cyl5X4gmLTQRVs_nLd#Kjv^NMYsniqwfogeI8$mfrHVMhv!_Lluc07wg(-8 zH}y#;-|gfe-iT4|Z3vp_bCtJx0`{UkGN5s;KdaJ+tPoO(19n_m1ld6^dFF+4YfIt0 zUFTYsbrj~KSLt(pAx%g1oM>r6Xi*qB#$mt01@kyDGh?wayVQMDNJ+?K-X^`ibGe^+ z8A}5ZdRkK3IC(0v>^bINiC$jb9k0E*JSzgJaJ8S2xLl7Dm|>lmxy)4NDzuksAqn%9 zC}_xjm9y8QwcQ~P-a~0!0IZUWPbb)xSPD8`abx$!|Bl_Wx0NWqSes4f*HHsjrA~Sh<+a)iT@MBs_ZNJn)s|b*)xYZAun;x z8P}draSHv-%P@W0MJAeqVR{Q5g}AzA@Q0gQPizugNk18-x|^j_PUq2CObRqMpf6Gq z?O_tJuI1Cx`yx_H$>$ca%-MnrD$ItuxK2V5vt%~m`0s`R62@f?^nA-Yb0_0yRnugCq7UpiZx}gTZV5Z2p5QGh)ozHH(UvpGt(}2C&4E1+%&Qqpx;fLb$Lx(vb=kY8ySbk;L z^op61O0*zf-3Tt*6A=69Dz8Ap)&YbUIpU9y0n7bdkUF>}V2H@qjnz$ny!_Xz=azHGu}dTd|Xmt-Sn) z+9PP~56?t^7x0VHhPZKNjeUJ*?zYA~&HhJITimNHou^Yrg>esjz9v;uPTgTN+O)-!68*A} zbI8sJ-n>Y7G&tDJbVgP{9pcN*E3)X}U<4$6oC_Wf;W9nk1WiA*E{{U_vg{Jsl~ygx zo*Fh@ZY;cUCGPLTZc8F`ISno{8Vlu zn@QBCmxei-$zQtPsx(c~=O=(p(RiS?YgLT|WK6p?gnEe9AG zc@SPSh$96Kz&w(`v})QpbV{Z_c=Yg2H;>g$qfMQk%g%GOU$K+Bi%)UXoUvUV)PmP! z%iL3|^DKR$lh}B=ronf9-FWyLc<^&%(Op>do_TIc||F(U(+N9BIUg@1>&-Nw} zHZ6x>kH0DcaUd=k{9Eu=K5K)s(TOOt$@uFp3TLg%Pl zy{%n>a~>Z4OHZ!9tGywwsQq$hey4iK{i=amZ|V(-n?~|UIMiyVx$&9!RI2Tb1fLk* zmN9m5!%v4E%VrACL=(V2@P2x(q!~FLeVOO6y7FK0I=o9!Sy~Tp5z{1f*f?t5{|#an zE~9B$L|TC<)MOGihD#;m^^i!sz8j3p z?mrg5mcy=JeMCy3E%-YK(gD=c*r}g@z&9qFaYGR}t zVNZwxQjCH8~zo;Z2?VO0-R{;HT$@$_?|>)LDB%qvoXi zGw7gg<(`*00qH-Zf3cSQ8%`bL@Y8NWS&x#Xhf?8DjrLl5-JT=VvKes_gr|)M**n|W z<2hiPSx+M*Q#HjK7b3J(4ShK^KXi!h(3$@%=#IF37xkOu3(@DtW5})3624X&fD_Kg3Ng08e^VB8pvG zJ?zPdt|di>@A&_Wg(Q`OFzuXso~xf7bV7fG6?j+0@ze{7Jy5Lu<+8058nPj99vlT*w;JZ zc-n&5;&8pq1PhX@ zR`1|ujG>rfvwPZYn^I0cDx^YD6V5u!KJPTZIec93G!dgzPweB@2 z-O;>v90#vpZCc4~i8<3{HRz(_EBPgAo=6P5wFs$SaJ#v+KcPBAQbol9BStNaf8q+# zP(3;!bwRYcLw3p{mf5vJH}i94QKihNH1o4RhBzIcc&^>KbTmuAoa(TY3#( z*o;W^OYqcK3acMu?hlGb1hwZE6!fQll!s<{MEx|Gl-B7kw?Dx6kSI_!%N^9bW>M50 z>Tv`2Lovz|Q|9s#Ob1WHeypHi`FB{CL9vj44L!s#hpv8gl*PQp@dk;+)m&{2ndZ`0 z=$7@>*`5=Ee!G5>r}mQR?2^94DZu!M-J~##+V-H>1v8!XRnoYcsNq_nFS=F1H&R)Jy8ip)V$N1DJ4G=b7m|Z z(BbfmtDZTaX+TVDY=IvjCX6FHbLSUPv8;ngU<21*N#3T=GMw|Sw1VQF%o6^yp>5iB zoXN$NmCRNShnaEW<|+VvUihs3$BqBXi}-_^t#hZpiy2z<%zD*Jaz6txKi^z@NOQsS z*WWzCf?-AdQc2y4Z$Z{NoMgzg`~r1pWw5h`a&@gN?;KAVowhCe&h3rW6DXFk^dgG{(ms+rox^dzeul+?H4NnxTJ%-16FzC zUnjm!1h~8Y&r#j~jrQ;)o~nH*2oOqKO5l!jgUoIY;50%0z8L)nHF6p)BlymvNnqU~ zjsv;uD(0cH*WBFv!XJa|oE#l}x>+(+vhr{GUC1y2=)Q%8oGz%3&-?9Y5#duoh_{up zafi;!uX)!X%F4=*M1+Mu?DrO*4yTT!FTOpb1&a!&Yp}*? zAYa;U9bXIgXW)4 zf09&^l(=Bn`tdl;Z{c&SoL+mase$@~7X4Ev71_5$5~O4_*0#4v_1#3(!s6+cGkVw| zufs$J|^ta_I1+` z4EOX20~|})j@52#FQn5K!lSc_I@nl2+x)fXfPyK4iTIsR%cCxACWaE3vf5{1+|;-v z=kEH6P&U1BUNmN@Z{zW|lfTa;f<7=;G)rrW#wqlfLHSc5olN>MF6I6bU7p}=j?#ZS zfTvpYE4nLv=9ysn9G;kO%EI^ENW{CCOKW`VIbT5jws;Z;IwZ=3Pn_55qpDUO%bUMf z_7r;OO@}(5?nzlS_iEZp=l%Oih9>E*LY_}81C4N2muX^vs9^BkgU)rNyRpu{ksqd~ zEb;f?T%4K|eN!1FoUfHb*6+f{xal{w|E_0c9>l3743cwuig%yio$kC#`YlR9i2JXj zj3-MicFwBlJkF<_?hL6a5IML#t{=AY@AQS(CW7SOG!J6pqqw8eogD>LMEslZiIst| zAySU{?{eUl@HTj>u2%Pl#^1m9@&;)|5r+`dU+?<=4eh^8;{Thqf1Z&4U&-3;Rizim zRENxt5_JE*BC%~`3{&J=COqL6GFt$L7^>W9SNE!nV&8lRUT!X{NKULk^5SVifzam& zrtn*xuB!tAu<1%wP0i`$t?eT$SC1-NVo!!JPzUPt7Z84A!du$uPH&wTY=2*2$*+r5 zJm(N%{;RS+jlQ|m&C^wxEAaPKDIc#pAxrKP)!#2^&cdMV$)9~c`LC%`1qMZ#*e&wA z1AlAA_7;zv8MuKc%=a(q|13WLdj9Z+>+8a&HcEeQ%s_dkJHaU0TG8@v-EyvzsF1`n zON7V?{_AD_`IAl+;0DaWoR1R!>S)MB0#E88c{<5oyNq!t0XIN_($h}+%R>kL^$d7Y znxBUM?%T-llYY^T4tbW=OL~lf(GR@4b+7;Y1UvAaRZTsHnzgXRY9PJ96FpNP8+5xs zr&!-oWSsPG&-BaEO#$%=>%mN0tD$V8vUWq4&ifj3^&T1*rw0RXfR4CjzLf)OIRTga z7G2T&0T&0lO9cQTQ%ECSD8kSroAdG*MI`7rD=O&xOJ=MkAfSCmJyZ}1)QJco92<&l z5!Gmc<&3Z2^#OBFtjVyQhNyM107{rQgPmUWe7FQOVdZS6g@}69|Keck#ky^#-T0S; zuK+OfTN_W+vp+wji4U!=lb_DCW=EutX5Ci0Xq=+e-ebjSOQBokVe6B{8MbrvReJs> zk#Z{BN z61D!@|YwwMH%%B9oLou;7Bx=3H?*IcQj ze-!i=qJh!bsAL`eud{a*g^U-P{RUiMbk@}fM+xlsb1f=qfznw|d%>=R_dQnqsb&S5 zS?Le;WGBb6cYogFO$GYyd}YwIzk9G%Ih5XXIMX)^Trq;F{+=sCufk0Q2HqPkLxxPr zoJGLX=y%_qoz8UWqKe3b)3P^dYl^S4jD1$45cJ%F_xh|os`--?%Us8M?f#m=ls=+D zMjQop_@AXkkg>1)@EeV>;gES^xxY4|Dxxj^Ti&~)T9KVmK_C%TpH`M>lAVzGCTI$x zfl-wz>5mJE=`=BixN>#7%+eeH#vzlS%u~x4AYT{a3=f?$ko7Rc< zj`jJ?*cPVUA!EzuopkzrIS!8NOyzwj2o~6CkRC?wU;EMWrPV*LDF1cdsr6Bbp8_+X zYx3A*WBd-&j}!yPx_9Irhg;JtK}1sBk4g)3{AcWeP64;*_Av;j7J?;(_Yd+R*cGd* zizA}joj@#T#>dAthh81bvg?YbvdD(4q;(LwWU7@F8#Q>2&T(e_e%!AW-*$ELHXk#M z2xmAoLw42A06`+{iTijKXZS4Y0XOM#sltB^>Yq=Nb7baYw?L9UH*vg2Lcnux#=np# zyr={?;?4J%0>cRD-ZY=@_3h^;v_v%9jpj#){d$YTH1@jEeD_z|Gz-xvX+jK+@0`cf zfDfXK;8&m^Rb8BVHNg5$eXc3iDdaFCBxGA@HPAn4;FJ~V+jz2)AxIdhlym|Vd%U?k zTewP>drTbsK=YoW%*}7CfoX!)>A<8j9KsP*cGmS?J0Q_Kh_30H33E+{Ocfv{hFgcC zz0iY=`=YHDWN$wIQP7ha;%k^2Ec-qbXy++Wnc3GahRVJW#PQ_T|IzJxj)AR&(m3(~ zq-wt|2d74iQswdogB7$2kP}oTuFG@@v%NEn_CK2Q8UTpWiPda1Il#u$FTlVwx4JmL zm%XdoENM`O#nM@fop6fGd!tPGe$>qS^ci|iTV8$>z~Y-neD5j9aMZWTdhmOhkdeA6 zAodABkTbYpIw?|Ib*J!>LPZu#)X%mq0`VB_P8 z5!r#s_#Yn)j%l14&BE6PUyHt{2Wa>V`n=C)Y7Z3NDT~EV>Dv{xE_rG0}V8RYd47?U?S}(~i z8nJ8&xVlWp*a6x9;k|4ldxUi2slRdZ z!e~I3C{>y}*hZiHhgQG4_DsE-LXm2Sm7SF|xr=+jB2LnrxkNddQhWD$;9T?L`+ph| z2hRWU(z=y&t3(aq2=`Yg zJmsm!x<Z8jgCRA$ z9t$|lg9QUF&t;lJLvd)W_OF?~?SDM^ih0#dcUJk*X&tb0y7CHK0V>DCQP*zA;^03@ z$7vE4bITboHIcTCopsx3Ix=4RRN8WRsz)%~ zT_tN_y))k=k9D7VzV?Kh{7+N$<=M^1F2v8bApls`IKTbIMz_Pq=S{#y5i38^P$GJe zSS=Ib7r?K$MOXzqFp<#&Nx<;C0l2W+v8~_lnTk;InaXTgi9!wmZUl*bg*ippL=~TLnz4J*5m;p*5*|-vxF^nuxa4 zY&`&2@?`ob2#)hZvFJ_;lW6w`NZ%Fl@6QW0ySU~sW2TEjL4pp!m*SGdqB}N2)^5^^ zji0>~PKA@wz<{krk8c-hWIV7Ll?KewSIc$5q~&ntSiUe?*Kpg}T9?y}Um~&Qv2ocn zD%cLHsk2XEAZpQS)M%Z@(p;%Y%TsG{SO-I8)tiaC@7=b*IKS6fnT+XW65%TgwT&N}(o(jdG; z8Qty*d?;e}Q85DppohaRz9__Yzu-{+Ob=NK{ig7YO&)`Jazz+bto^Zq7=lBDBq9G! z<*j=UQr!l{V6*_6&#b7=V>*@JqF<51h+JWvZJGq1QYKM4b9yx=z@PXlT@5$k&T}ov z$2<|Tc9}K-UId-2T^Qd!?wSsz6_hhUOnDJY zO{iE2IWOfTp((zpyL+PeZ_;}>`hc2P(E0CX9f6(|0o<{462dm%NFTQR)txdF{9$WC`?cb-jc-NifV8kDaK&>HP2mJAxr}Luq@k-3gT>!=AEIvXmGKOf zuyl#F)eV^d=Bz(i*Vq=B+2fxL&TBc_mI%=PdNLr4_&&bFBCTWMcfiu~XS@F~lI&Fh z_4K-Zgv^{%%f%=~%4rOi#~=gfE1f1_`DDoocwTD7zr9jMad2-oP@bKXB=aJ@Y?+K* z6F(pC=VW>G7w24ydk%b^BpSgsaQayNB`Rd}7mLj2W&xr%OrYqhyAxkKwIc7y2c7f(2LYPQu#xZEUTubHNT==(bgkE|@ZpLbAcTG0lE2*<9zyT{Yb zi4a|7r9uUlaU-u8maP>q`plddr^UE1>i3;d9WX5BsJZ(c9Wh zW=Fac#mCggXHRmJM_C6A+m#Kei~nr<&TmFOVxq~kA%H37Ayo#g-jT*LXbu1?>I?~+^e@^S}yqDXg3=3~-HwBR70Muu<< zxBt=h98S}GnL<*NavUgOW(O?+BwBWX&8?&7xT2Q10O+ zmV{T?O$ju7HEC&{2Ac5<08{_mite7V|H-n<9)m4a{7Nbq;%Z~emEY%wT^V4WvQxYh zn6GKbkJy05}9{tH4&F|uV-CFsqx ziUj=Y@SnsDv{|;V12|~3>t}P)e8hJfDb49Vg-kjZaw%*~73mIr1VmXP$iYe=+s?qg zT#+yQb-|CilHaC?Owrt}*o{^+Xi=3nOkI+WvX)GY>GlM^pieFM5N=_48;6y<>0t%B z3DZs_eRBv==2vcCR9yXNjF>7}rw{OG|8-6u0bSzVUIz(kR#L&pHB~ct)1qyf0bn$n z0M*EXsPQNPJIiU0cC0<^haCUYuj{jQZl?vGS^(FdrYJ6ktO2mZpAc`%?ga9-oD1ZU zQP|=OO^#(*+SsBLl+2mFX$Lix`OSWeG2{e7xu!ZG=du{gTHf^{trCPBWdyxON*R(|50@eD%IjB+1k9f3N^tZ@X&< zq<+o`fP=M<@UNx$$1HNJ&g3#Oj6v!FzmlN-Jmd}6ZeN|v2-8@lwN`+38pNB)Eb$UQ z#QJ?8W1UW2bNf;%qC zHS<6qWn!Z)!M~#wW>b*`U#!63qZHmTAlecySGblC?xKT-YhZYp>_=BYE2@|my&2ec z%cbM91m&FYnq~{8i>4e0GAbjRE{XuwVf>LnmoAxTg?01plGmdg%GfN9InnkuFc6$| zvxt@_jI^p!t#o+OFvX1muGmGe8pTuJZ3s+tc>~gL)btr>vL)c^RiTv6u25IL zM7fdPtJu6Or7ThC+NUscRwZP$Mt!VBM52qn-@ydIkZsx@-HZc-F?W zZQDGiZ>n*X#eh?#opF1VRY60E>e-D->!DcvtO?hpI~9-jtrA{6>@dm9qhoi?+;*s5 z9%PlQU$cP4#?0;mwDu@Eh7pIgC0S>GB`T7SE@0<=@IBxV6tyDFtpURZ8&p~ zWo7o%P9k%AoPhXCW{>f?)OYqbhuzF^>hFaLg%ol`Y)4r<4F<0VS#(hytpNcM=`?() z+S0^jlyM*Vs?ob#Eqg49W2shF^g=zNdzCt(@^@euuOFe7h!)Sj)$OA|r44rpO0P%P zcG;5Wvdbqi<_XwMe*ZE7;Z;Tk-;Nfw;2X~0c~|TEL-P-csPNI1nB$3Ug8Ev4R*s|a zockF3^%{osF`Z?GLv@-h5Oj}kFuYH?PH6&JP97E#^>Rs~2NF)7HY@d1UYLz?xTWj> zI+o>PDw85SMy~7(1j=%WB;2tUgsVEQ+_@7G z<__KeAViE$AJR<=TJ?8(hsG<*>^$zJ9Og;HQWopd+G;110j7>1GtK20;Z_dMZZ`>o z5s8)PTxFHI`* z>UA!n+3yU_BC0T~8zVr=NGIVLt)HbI%Zxj)$ie*Wz3ffFX&_U}oCUYfDD`(LxX@iW z09GLlmIk1^&*&0U-@8P9%~fh6W7@Se{1}gbr!e*PivwIb_ov7VtK zisU-o6y@Sh3dBcfe`A8v&t<-)u9Q;d@z+i3RgNsK-3V{oRd@2{FJ8M27cZ=I#vl|;~<4=v65befby+?FKsrwh&* zYg>p#>h<|td}ZTjxE$2gq97OY5GwKCaktL*O7_I(}N_iqXD z5fW3{G(%YuB5z*C(UuC_Keh?Cu-Jp#kVdxt@NkK z=5y^aCbDTfnvy*^-+TOKyqoyKAek!z4_k(E1RNna(v)h-p}<;xsmqpAbV$2P()~BV za+2lhtgl@L%sN;;*xg`q`CT0oEvX&7SYMnoxTL23vA3F+=expahk3|VHQCujgT=@4NubE*>*P5a$k{dJ`G zWYB{9H_DU#%fzGjo8AdM6gkMVa7#_7OmAeT-4`-Z(sL+WcJ=>`H!gk8@*F zA<1;hqJYU~){kSVrpdcHgxY+iV@@?*_8UJR%T-O6CPi$Hb~GOKv6ZRwtC8X{EC8un z`{pdqu1Zu8`J(UE(QcKj3aS_S*`19(OGV=5q$iEVuh&}og)nn(M&qqpGV%Z1C3+Xv&) zmXozhN@W`I4Z0)7k|u<%i^T#N83$*}^-;ubxSF4p6*$T2|6xqxO#KMkEN=r&Q8uj`g5ec~b zfFCj$d9>xDHTMky(?{;x6D(sf5d=Ouy_SvVE1%c1zo>+T6FH3MDDOhl+|1Bc%rxHd zh3H%W6J;5kXnvZN4QN4>rC}-}du9O0Y{=OiL?Mk&*LORn$fX?1A8!G47S`)F(lDX@ z`JYHFVukzNVdlgYz=ST+;u^%D2WCt>| zOrft8G;|7NJ#f9-9+~b(UXcZ<|=UBg$)DH?-~~?pXyV#DV0=V*S) za9)bh3+=g#Z*#|@HIGdof#9*v4~q`WAw$79)M-7TgQwoWGN%BLOC2sKF8Gf{CL#Sj zmPPAukEv>RZYs&S{!ABfFK)BOHZLE2ruM?gO^rB?P^PsFkIApl}nf;YcGjv__&x%C{HT&cXr za{it7|N9@m0$!+r$|16bK;a!T+P5!F;kEhgo65V%762^f)Y&`%hNSRyQ#dPa)@Nh7 z1J6U-Zdq0Qf?kUXRp;p{l_O^`>1CNq8`C8by6Q75`2hO*%1_g8Jy#|9t>dsMg(ra8 zaD+Y{>G1fQB#KV73lnIHc7yrLD#`|#oLgMk&Aj^}rL?@9yy9yF(CD&sd3itkRIT9= znfATEhfo>aqqUlqtSE6_X>+*C(Bw!|mVLpK>y(Dx@`RKg(pR4#@# z=A7Yf?P1tT`RPNNrmnI(p22bnBJBw4k$CkkG!qpH(CQ5~by< zU>e_-9n#QmkM4k+(ZvvI7h(lu(RV_4H3X~d%@^zBXBy)q$oi)8=toM!X!+mrWZA~- zD@SD?+P+_c;WKGSm4xe?DLKBopF;Y5AJ4so0)Q#eZmw_=ZL4nB0U# zZ~o=7@qfn45c*OjN*G8N=%TnEuctW35{(pr07#CGfn-xSs)M1=F?k7ha4KYB9>5Sx zE7~B9X1%dJ`~WieR@T6hUiN;XwYH_r>XWaw$id4!tEWgg9F0`5`?CsLOosF~{I%e$=Y?!Omu@bS_c+ZsF?tK6x)C@7ecPFPNsErj z@JsRy$P1lCSnPT!8qiUa3{4lQdPRHPxya%rHL4tu5M#WS@6 z%mO920!snSxd_|aw3>S)egQLE1aNS}r$*V5i=-gkiCzHC4H{EITRdmiEEk#x|9!4i zmvT>sxIr1kKO+@%0c00c{G%N}UrGfm;KF0MRHC2x0^)-!rk5q_p$4Jo-Wn+vdy@8& z)T>xpy-QyAKBq}a7du?_~j&NH6OKKhXTdFf-4j2aObnUv6e$k1j)WyLxCwUc9Fh=?lp) zbRK*z^;R`qTuh+vYlMCMRt_)9`L7~9L2bV-K>E1e-wyOrlQz=4hwi%x=3|}K@8PJH z+*8bDzL3d6#%8-O2lY~Q-8%8) z%oD+yPFWqtIe)MgkjS^mU>dM*FxqjzuxC=qDana2oUWuGnjw^)y5%dZB39>6JT zK&d;w3W)1`tJ(BFIzs8Zd!nDM14qA*INWDA6k*c2aQy+ZVezZNWtuC-2z0|!Mun2BsV@qLWfo{tZkCmp+MoBuC>!>W(#)0vzd`liDXKA~F?hkx5gvq1 zPK4D=Qe$*}IXdB|n+cAo3FSjH{Up-+$Y|o3(}n5sDHN?6axlx70>(cwv8Xt_2ri_H9b@5g1MbFw`U?A8H5 zg&#}$F>x_D?R@BDZjC&n-aQr+p|fUkVz{I)cj~fCvRSkoiDY26foeg{e@O}!uoqP&uolAS~miqfsjEx)Pk}iH=99H zvGfWDAp3?|S5ScCt+dbxglHKQF+QH7B&|YAjlYp`+8>}ngzg0;m{&a*hJ!!H7XKb6 z+z~~As3nC?a0hm2_|pESbfLV0Ob3L>+1Qe1i*+Qbxny;tOF4GK_JL(I_UoP zgceE<-FJ$YJl~oH-6I#ckMyXnME5Gk2Y}LoB>Atp&e5zJ23)z3tUA5e4bY{ru?GU< z$q2G?Uy|6}7==(hN z7n=C`;E8d$e|&Ol_vqj57ZqWa5K#tv{x8@RAZ~$2k@EG2#50a7+#@>B!9<=8Zd@Zq zI^HXw{vFI~g0iINok~ZwAZBa>zEtT{Sg7@~{&cD(Xd5zm7I9s>-wtm3@GxKAT&k4OOn})G(O>v_wbA1^-}g4P^&JQ!Uv&tGDfxyfY)-<0c zGA$3PJa(Pav#Zh^36X)zi+4SjibA=~M4M;0d#MOw;Bfxt!7!gb_D7~BJ2^5bCG68= zm)%H)B=^WPQ0q`x)vfHBNAsf<=$S@5$Ja;{^LE>PZw4X}1klUQ3-grdfFTlXj-h+- zOUp|4Mc*@nT`zz0 z>M5kHtYU~+z&YE;wJR+6?Tdr7pd4_WGj*2Uej<|))&4kh|5u)f=lr_A<)mE&y6WnH zIrJZFg94=a#F%qX9d>DH_oTkfoqV#L^EPPitY`V6Ksv#UbVG zR7&P&2|)|O8NI@)oB=?~9=ihMj-Q{2(XrLHMi2IX^CtND&MhH;8Xp%eS!->&0QWlQLXY||sw|JY!X&S(Uv zy#|J6@g)HHXq2GmXN1IEss(A9x6yFSdfJobbpUO_C`6pcM z?^f53dya1bTxW{sj}XYeP7yB{XaQa^gRl&qP)87C6_iM^~ z_A%vfeWVUR&7}DabOMrqCo4Cm4UouIg^T`g4E5g^0YdJ-F)dng%N4ud^e-TIiQFb1 zbV`jSlU^>b+QZ7fTLZg2$yN97%lRMwxa|Hev=?Sl{%PStUVKHR=ZIzCX81#H`}`FTrqVQuz}GAvDfRyOh5P&2vwj7Zj<8?P`;V>ie=kW-EbuiQWQ~86 zPvQoIF#xZ~&!fqOKbFw{{;>R>q5ics?w_?y8Sn0&S6O3~;6J@0xB=|I*HZugviZ<#oMs*`$4a zi|P^;FJZbT`5*pE#x^d7tC?zYMcy{Ww@7K!u;};uWwfF!tp7}P`8+t=0P5xY_{8vTr!u&obn2S08S>W*R zvVq`!X}=H@b^MX>`maP3(5H|gYtHU5NcfhUyjXL#QokWGzwFw{V!JVYaC!@KV1>b7 zv#UcbNhU)bH}Up{D@Q(1*Szm?Sfa~^@9u4d-;HK};W#p0o(<|fDgW~9zyavXy-PHz zv{KU)k*56X7|l+A44e}M0Adp#K-GT^^vN8!Ta+GWrvB?TUm!j55ikw7n7{l{J)Pl) z2kQauExcSlC(8M2 zm(P%YDj2(z%!gH3nfINJJ17o3bH@^lN~@00DX&u!Et(5L_ zCY+7G+kd!e3sc>{SIol5pek>~uJ!%QicGeY$A4>3?2M+gOx`Mhc;a}U3RS?Om zVZ`y(K|+F|SH2T<_&qBTSHZZgL~-EeKuO@(|CY|hcdng`jotFejE%2vV5j6*y}63< zWK>I%Gc`FSs;{eE(>gC#)MFZC%}+1BL(B+5Dc3p?s$C|j$*AgdVFQSKD?`*HI&KI; zRT9l;_y(qbG?BX=X)2N&l{+9f)gsENE#6z4>(K4gzg9zS$ASFwRfhY)g3~)Wj5d8_UEp7!-TMkAtEY5bsrREQc;BXMm*CFYv~t(gjhasr6!i&^w>V2&_+xMgq$Vd!T) zQDbpk_(}4lrvHm23Q7xAE#S7;tvvaoQf;|q*0gbBPd=#YV~`f>*7VRIrW5-(_~CZ% z^7w$l^RI%6yW%R_lkNOJD#|;Eg&5jz{Y3U3TyFAXrdd6oCz`p)1shH;&k9tjtC*wT zVQFc7ySpbcvbyjKKfT{oc|NGoq@K$^69%GT&ja08`w+fvT|?xg*$;n&9RkC}CR1Cg z0xccN4Gk)cx?MGb1v)27f>fczKA4A3a)%5G*CXK#=|r=_N{EeMFNKC2ThvpbZRwWV z+XR?BJSgY5D zXar&=KJcqRw+=IS(im1FpM01^Xz10&}r3($ib5!;f6 zRtXZ~;IMdK7VCKZ9Q6FuZv5#gJ5xSKYiUG^sU`Vs>@=l=3VVFvcV9IDyXcmz<9Uel zpnn=E0jO7T&v*-mqA08R_Sw1Kyl|B_^=up1Mgo~F<;Egw#u}8#^H&v^Rc)&k9d)A1 z_KUk@ri+#4p)E_C;08xDVT)a|j z*^tTr|IOH(oAP3T@41KMLr#?;SRK6QISMo=Rlp|k2SL**jQx1XT!b)NCC)af(%=Gj zdO_gz5{<0aGra;639U1$x3_06(`y(XBI&BFr8GE}d3FfbUf5RbZ|9uxP!5pEtfMDd z240GnFDl$k`|nKZRZR#sh!k^Ka`J0{Y4EXM^D}BzZ4`(Mg(WUrZzou6o*$?;w9Adv z+Fvx4)CSvEUY(>)<);EI?a{a5X{6V7b}bwBBK1Dc{JB+6PnL9U|-jtAfw_;TQ+o z#sHhK=t*$C>3xk5kjcose>|*IK)L&Qw3)69tE4nj{A*tO!-L!JY&US{CQ6+uQNwFm zL9fv@)6=~(6xXNjd7lai)-*Wn^gNKsXN{|BIQO*9!!e`j(n~GHg!^dnH_4|MkR0?k ztXvvi;Ejb>h-sfSndf=l#8N8RU2$l#3wRD?(v(IWfgQX-l@*Z#E*+zxQcoLv?vw|F z4NIa=Dgj=_lF2OF-9?nb2S0t*E-yB&hHrPZyjP}1K5QlRP7yC=J{q%F@`vyH&w8(a z#}ww`vviwi7>ZZZzS79&XE=lZjorv%SAL)}w5iADfj{{x?zlGv%G?seZn@rreKc>h$i>!z-&A(91~hgi z=Ny#g#{>r|wV?@w&B7`@CCK^XYiwcM(fLac?{dwV3Mf!(joiQ$TA8n|Yw2dp$FJ*O z;}PzQl;wjAYvtIaxRB}zMWlo`n}kJ=fAx03oJVYg*EtfbyO!@E z7!mXE+vt`u8y*~N>CFkzcP=@GTqG3DPZif?>KS~`b+JzPuX7Q*9`dgX9i^rLm;%B( zJ29eu#-Q5)&qwOJpoc%NYjfRlJXhd~MuKs)IK^?ZG}e$L^drbntF)@QbAzYcfy6wPna6 z_j+VNev9bM!s)oRc=Cf=>aLKZh>cm5lwyEkF)fN@)I1J#4k={wn!ELYnC9GBIeLg} zsWw0Ko<1xFw%GPrAqNTA{EZ80*jS7&^j8o^9KkH!;(*&$#@K32a=q)8M&^^79;q5C zWnup82o{K$YMH@7Iu*}+Q8Dj$0+?;Z9)Yx(`AoRR=IKt)LT*Pr%Z4~^kPf8;mRL(s zi3eNal>blF2cb_`O$jXT%;-{&zr4?{TRB?SA&*}yhort}N!BvC`;;7tHo7EcbpBQ& z)%Nf^rbw_`e|w$RPoxx*Y_1VRSMBhqRyLBN#ejg;c5okdgtK(wQg+UUOq_C6(_0_x z)|;Yz>dAILeLs)EVzm_OzXwN!ya;#%wf0s!e5=F$lREtFSI8I zbk)!YjB)y4}so@YJ%_fy%%^ew`lZLdBji}|E2I~K)?DW0OO|~iRwkI!ikCr=I!>DJeFiu)A#sgCBFL^65MvorXtPzimZ$1?YbF=x{T4Gf!=-_4 zBO|TB^Joz^x>2Kd=0lh=Zf&p97(P7PK<6p<<7pL^^v0yG& zewKyk3vU}!wu`ErMl@JH7CMx0{8CU6*GLH-MSu*Q_pA2)qy?H`-QQG}X9G}>Pn zN+T}B#@hR2ZsCQKdk59a$p>+#b_P^T`i#emv)P}zb9Sbb_qf1!Nk>XX2h{0Ch!dB6 zLG@2SrtjyT3^tPZUE{ie(oN^&d|jNb<#v?i*V<}(lKctth#^H=3|@M?hd9WA+M=lj zvRu@Z!|%*~1edjhR^JLbjILye_dhQ;ywSA~D^T5~{yZz^no4V(bjzV{MHJYaXzFIw zWYOikj_7Z4j3U-lyop;t@f$`;m`pb;SG7G}e!G~9ESYC32fz+Tq@7hg?~jH&EFj@6 z*N2v`6E^%->Tl;4Y=`E=WK+`@VD%Q1NxxZcgFdHU^79+VZf+iNcTqVbC5v`b)rdV< zX&z+mknyhK4eTC#loovL*S$av$V~1Ge!e|UMqClI(A-fm>xq~AuKEIw45tq@JH zbkO(HeOra`G?k7#H}uOsGrbLk<|mhTmaODlO~gY7;E~*)`R=WDQiH$H9V~?T3lh9Y zCrSxf&W;#w?rZxL9p&FA2|u6dl~BLQ;PhJgGSY^B3=`M}Z7Qr$z(5BfBTv2%%L5xD zd1}kr!Gf*zEVWT{X_~Gb5iJrF?-XRIXHWLPj{@GTSkDfdDKT-MA9c1% z*~XMQmtKy$)KtYEqMH>BFWo6-d90QoJ0y-rC&6+LCERDsiZaUj4))i^c;<6Egx4jm z?9}^u_e(a?;3yX_y@!ExEGXW5sZIG?iIB*@;ihOZ)!EG7l>Eo}66WV*g#<#F?Xj!+ z+DTN*hPqd$2=u`JjO}=7sYG4>hIiLOZg=0)cy^-u!P+z72Xr=fb;s3Qr)u(k-HTTN z7wy77%ZA)uXPnqOief(57aLgm-L0)E{5OOD9Mvi@XM^a;Aa~ZSFQS+uFkofgi&oaX zWqE$7gL=cW~zCap}4!XXqK zXv?q&RnI8_sPWB*xm%C9%=+43M=(p z!_}SMqVpDL@zo^dWPYgL8=K2WO7Jxq8yB8{1=i_{Az1yX0?v|b>Z;f5r@QapQA`v1 zMs8_JmwXyj=@-o=lWb53S=;@pRA#dUhMx!sPYQ&C=$N|_<{kUTbLWDuX6maO-Udge z+kSt3C;!V+-e`1~#;aybduf(N1Z^l|coB<;vdTc?xUi`P;&$b>r)WfSTUvl)Z;Sqm zo!YXnWw=jR!n@63UGz$&bt~Oo)HK?Z;%IFyWAw`gM|LVO1>iL&O5h57v&H3sF~YO- z<`xh^(O*FGM|rm;P3G{o-rG(R*c$i2ALaW6!C&Mkh~1 zz1{O7an!J(n26(0g~xdPpZF=b3GLWs`yL~L?Uox4Ll73@rwSB>#T5RWc9cI!uUB1km_kgH8jS3!q$ zl=D!1Lg25uIPdntPb?dWMQn*GjXg^0*z>fy>5k}QeRBx$78QT9eSpSa_7*wdll zlPKh3!ZRerN~JRFBhSmN+?0FW|2m++jtGKuZ>aiT?FsTZt-g}FH1dz2)}LA|PF%ky zIaB~cI#K{`73{3b>E6;tP$~$E2To~XQ8Uuigd;ris zCVF)-!Xo+qGOgIm{5$}VpDDqyJDx27Qzg*Zut1CB7*KyFZ;j`s0L*}iMu6@i|5=^Y zfb-&B)wdok^@Il?=GZ%?-T}@K>j3lbab(Gx^+*1zu|~z$_(b^%j2!_k?GXN}l!##%PL|S6BF-ol zhqn=I#G~n0Uc(PuPVG#a`66qszNC|Qt;-~l7koTGnpV3j#*livSMvQp*~?r_i~Yuj zyVNjl{%q)Nz=V|ciwCpO8yqE3g4lLa?U8nq?D2y|Zk|vd`qNev2mj#{5%-2SOE??L z)8673U5{Aflg?1k#Ukw^hYd^@wrvFU)TRhrW3y#%rp1`@-j2cf@>7kw$7Tv{ge9F2 zTXK-MCww6{mPh{QuDf}r*~B^Q&-y!ZgS9?D0KR5U?bE+};Mpr+b9q28xpq}d7p0%p1ZFDm zLyh(P${LL+czva%=Q)g69{Qpm)-JWKMsD|dbe-zT6-@u}pmTjKgfEmcV!BBnxz!

    IEFLzlC1ab+=Y39Ekz+{ln7oRuJion+zCw&cFhh|yR07RC6A-v>)-@hGLH^q>po z{D-^GT>W<W% zS=*>}K2hy#Gf9r!Z1wX9@;h%Oh`G&Z<|iRQaWDWFPJs98cZzGXWvc9fIm6h{-$lAr ztQy6XZqsd0*GZlA&8#Q^kgab6;CO)CeRJgYf@`sQ&PmaEHAXHOP?!$_vVjgGO^aK= z6-WSdYSkzVsDuXrOkIO<5D=-`-IH5elXNZC#vXztoY$59QqeO!G8n3(6aXh$&s19H zpQhN?=fgZVQn80_01|Z)DEAuRlvxS8?}L{d0VZam4+RYNHTcL5Py&4KqdE=jA}Q{# zn$%@uwtZ7yy7t>u|;7i;ZYHg~_wg$~v*!8lB3#TkAfC;{#Tsn4ll zXBbXa_BZ2nIZ0A`4H611r1tWQgQy$Oo6S7+yt8Vt)I4guhoNy~qh5!yEMH)gT3vQ` z98)+HSSOb*Vr8J}jooR6+jA0WuPYVs!db31tgOoJbq~fBhirDW=}VnuEwy!#!a(1y z-4rLaeGY*<2lP2TS^=6<1P)-QkI2}QpBz+Bt%cKlINib< zpSKyG@pHiatu}@B5;yNfDq7Zp)7TB&;101n_6PhC=xJaCi1^A?pDS8g+J5iZtlpqZ z^X>507~_m=NvizzH)W*AkxTN!TSvSn0R~)f`m5ik_4#j)Zc-;|gW6Zo6MpiAz}I!8 zD9M?GhlRpoz;wz(4o7LVD+I}n5)a3SkxRmRdaRB=F68G9PTu7ml`k*@~B zcVBY`5uBeF4?4pp(xklc6LjY_-?9?+Y<%rj?)Z?`HGG{PPLOg&(G>oO-*=%|bxx35 z<;2tu&Xzp4FQyaXZcseDP;2_D{)b}5CIu{`*|*iBqPR%unQ~0YGFTYsD#&~b1n-DQ zzU9+hNli67E#2bX2p_fg7QZ{7ac9q6E1VsB6;Ne2!5+_ICVm8)+~cxW_%t9?9-7m| zbK3daI$zo2(9Za@BK6Sm^Vq1Hb>g~)J%s^Kg6Kc=nopIAk}uwZB{11 zwq3_zmSc)EmaS&ym6N4tR7l_EEdVt}4N2UFMV5c3Ra`9_$Ip5x9~ZPZ=rG-RfPBNX z$g_j!hKy@;OjTzW2G8cP=I%toLHTqkJ~*X>_)JY78ZlH%TAYUEV0r@hKS{T;&KvlZ zScYc}vqlExs&P&*49K+c*HkJ+)~N*v*OQ|x&={CE#^pRWT|{{yppxa3@2J z9MaU%VbGo|HIX_7+_uOlCXDEb0F3@^lT<*7LkI#WN zm+IQyaOo{zobig|a;KzxURWoTZg!6;9%Kd>`S~weJ}ZzSUUsnuqJfRUW!b%Y+M@M6 z5?ZirBA!~L^R&=0pUi&n+A>#vwdkTRF=go1M!zT);8_NSWSfc-(CRJRZT6><5*t_V+Qd&9FQqHcuoIQC8dt^c+YNF&;^ z4P=2#00oow&rH9^=+cEOVxST~ujb`x+FkM?36Poa4@ook8ZR(H>%YK(#q3Wa?T14= zHoN>M3=YsY;?vA}LPmZcR$<3EcAd$k!)qKR0_z#ozIe~`(_3Za20TbbC{OkSLjvPX z2$R}kE+@awhizLmSEz_s7Q0tn?WvNY2WK!#Y|j{}K6s4HJg3pWO}a`}Omf#JRBo-m zWpdg$zGq*6xliWdML9Esu(3}}lWs}CUlNn#vOvyo;`xwwj;2hDj{mi##fYq9&RK-r zF4mkP>JEFLBG%#c20ATHvkA4ggAMMRpAN`hte9OF4KJE^jyw_SR63`0xcf-DT@+TM zLi5`&{3K|JudtmT_ojC9#cG2XPKd}N6xW66_;_Z19NJDAx8KRg5r|$pDNgmK$H({r zOl}svEI})nxA|_@U8F!0c-fhC!90-%gZxc45=9c}s&(k$Nu<&_vFTr)Ksis~o7#~HP>bAP=UY7l!j#s#{fvvGVf6|EjCe(k?c?82T(FsthN z^EM@Wm9N&p@DNSzbUd{}uU}mSJQ;IfEzmv-+gOmx*CP^KGjyD9ovs;w^xOCm$ahlyR$oDhykZOMZZ) zg4doapkjXBm7sVFy1tgk)C+yn1hnQgj_5$|xtdPKXxV%{AkoSY6)<$P$7gA}gT)6h zHYDHBw}1f>xTL;SpenDJa_+rB0FF9nYHg=GQ-VMl?@c5B^5rC*?=m?rzI2%%pu`Ax ziV;hggtdi5ksk+~C~iuu$8#cJfQ6aDP1$0p)qZW`z4_sIp-u&j{AHQM@c>`Ga;S%_ zcsmU6BsBd?kmGlKP7^Dpa&#}0O;+>-Oy-CIOQ(&*dy4$P;=PYR-0sh1dv9Rmhj*$7251R6Ow z`jYbb7ezl%i~Foy&6}?s!8n2^(is#9`cCpR&g}|h*&(;XW_9Zcm@P`?`Sv^3W(%bd zm~4To9Zt4-U~PhETHjLd`n;0C+RrG9>?2Uw4%&C;9P&^BV3m?^xx9C>_YX157u(*E%w$qnueMWV|S=WJ~GaA zQeAznhJ(HPYMq4eVyZ|(U+d+2D@rtRb{r|pOOFE59^;(mAkSFeo94=A3}PJf%Yd4+ zL?3%2pE`8+NXX&r>w0*qAp0p&r*JW`Zd$O9Q1^*4jfS-9!~Jn?c(Q1*qO)_qEj;j- z^eZ(8BEmN1if!N;=le<2Q0d7nFQUo2!Brh^q(qlVSWHy^q1F4F_s-_aQvFi}h~vYJ zakd-j1YZ$qOOLIQZ%(fK$nqq zv3Pe&oXgW4$0C>aMPBTaa2#Y7Xt2$ZP$RG?!diq#^$?< z2N!smHdki{)UN_?N5kooH(j7XR*t#-im0SNuY(8BWmma%`&KnWtlXi?L!_#8H>TZ? z2#t7C25c2ACcSpIo^MZQoH%eIm`!BqK8aZJQ`BCRR&w$tyQ)pu16%P1FlptPW{7yW znF#Doyoe>qt--xA-xf@DS>A<{lbpupIXj6Rn!X#o3cy;cR za0%{|XO3w;)($E4yUlnJ^s{&M6Qpf?6RuZ{&sly&lesDZ*>{Vy+RS>Gqk4W;L0%db zAfP*ya1^3ITm=nC>cH~sSi2}K9SX{T%n!Z$vT^-}*Yr+qg|=`x6&2*;P<=|c*c(6N zNIJX(UFez=TEW_YX!}OlDWola-(h`~ER;nhJO8mPQeoEV`;nRB{)GVVY{?fj%emr> z))zA-#B77DHBViiZtGw7DquL?&ENNU`aM@Wf{^A_VUUgw5ml$3FYzJ5cJ@Jm)Y_M?Lhe4om^ zyY8*@y}a~9c&-&&UMs3CW`N~}FL4t3WH`&u&?9$WHr{8;dYYmW_}IY@ z(6DEfR!s2X;OE8uzAkUIoMNoTiR%!gdT=cgt$uPT%admmN_F--IQ1kzW)2U*rf3(X zfJLH{Cwp&|)0!4m@P@8A4;0V!V1t75z8JI~R&|Xbf%C9NmB-^70{75Do+=U-MD5l4 zC%g zT^&0P5FT{BrGSbU5b517(=va6m`Ar%?Ckb8soOtUXM*dupoqw7kicIh~pnD zYL(5*6mb3WK1(2e=O;0%dER@Li$+MaDsw)axx-`rDuGbGTmmiNkeraSe2h(g0DGZR z3^pkIBfVmnkX5ath?D7zFY+NVM^Ghx@)D>#H0}ebb&wa{thcOBCliZeS@yFPLLKDA zkq$8+H3iB5CrGH!_3w_GUjerQvv|MyU-(Gh;R|h3w1HIh0MA3L=nV&ty{f5XfUw0v zQaQwNR?}hK%IHk*l=<}7*1x@tisbwkHApi+2THyI}z(~_E z>|Vm^C`t!^{}gQqVhLh2FtksSFc-t?APH0jOav#5QjbM1gzc;&=c8KPl4x^3jK^&} zRa+VY)T-!#sE;CDu>@3fyT13jC98V2BR-ACA@Q<^L||jtCzh-^Em#gD#>8^8L2dv$ z=6F`L{*cHV$xr2DBp+oA`mJI_NaMgqQakgo5Inj$u#H088A~n{AJkB{VAZ)a!>CUA zHL*b=X_%o!|GYN_dk-HzAKBTBdu4yu`s5^niv0k8K}4Qo*8TWQpr^xHX=hKpuKusOG$>x9|A%}$U<&m#Y57tlg-fVpV{pSRQ)q~ zJ>l4+uiw$MtIv}V5IxN`?C)}QS`b*a|6sN`lU6H*si&s@%wxpWwnFRmGSDvk-Nq1M zKeUl(P)GVSxQ75VQGqx4rZu$3acGET5-Es2;4{Cg@Is1S(ql_`$^%Yc&9qFT0qV$~ zp#n~+61p)LJ^jB%ZiUTu7|~dWZ$rMit366Oa*24FZJIGDvDaVLb;K4o1AeXtX*}zU z-5gS9+r`QDSfPM5md;9B;jawHDVc`B{dUAmwn~yAgZQDi-9stiKe8ZH8RE@oyR-M{iRm@2x+7`zIaE2iz>in_Jt zN{~xR$5y2EA&~>DYzFNhK7PFp(h#20H3ofgX{rjY0p**J`C$pJQDyh7`8Z}h3K&@G zjX;<9T%%(5i_f#*iij&6i?Hlaax>gu!E$;m1$k7SA+uGn;^s>mf^{hS7o8bo;!ojo zKLG`7V)Z0yzoS-#QQrfjNF*Vg#Sv+MLD(e~KiQ}{W7nl20ahPw(W1RoP-Va3vX8Qu#dR)Hg3us*#4u#+bL&=HL*?yF zlA>STZ|AGYiDo_U{NY$`ceZ%7vq|h;11xIhB(=xnYMrIdDe}PAOY^5t@A#Qq(|iJB z|C{QQz0Ygzu})0#@JMt{_^xqG9ofcm*?0{Ps4T70)IVEQ zVu~wjy#Ob`?Cmx0ie$|Z+hxS_1RXoRmVS^yZ|LqRhcBrCrB~C5%n#f8^lI&OiRzf2 zJwZ$K>kRUh&${u}Yu!On zv&SP~^2s!&?R=>l)CMm3(L8x{vXu{Fz*vcJ+6O@}%Lm=uy$c)DvWV*mBUbXK?95|# zes?#E7@(FA(7d6?@~75|pH67krj8BtL3{#VmVL;1%|bi@cQcfY)q9JiNrRf~&murx zg=);)ASfN|buKG`6veU?b>ez$@j_NGdU>_?OCUYqIibQ3;WQmZE;tk|xZamM(~|-j z(sNMD*P+-N%9o$0U(|l@oU{o8IMbtZfDvNABqTq=)NhH#edv`-tAR^ZOD}NnvLNEn zeJUMI0EvJqXn!mue>%P>FnjUxYw!+=9J_!w0_?nF zwuUgYH^|SD1@t*WKLovyEi8 z>z!~Wu%3C`e$?7_ShRICj{S7_zZ*P^TP`rJ@_aw7Xc}Y9?lxnkJP%YvNCV zUHao=njIDDE7WroSibfWI%&9mlyM5R4=-_nFYjSaIk{WC&muqdl|-H5%lP z8IpsFh?9znEO-fdS+PEi&9YWyA>Y!_9&+uJmQsEW)DMO+uhepaMeOReXhbjxpuKhW zDSOWvP3h=Gv~NYtwx`jl)~xLHenXd`DmE7s6)iZ>c>C-{#N^>Nt?@;V$D(ju$OoGC zICQZg-qol2aP%y-tE`*L3!Ai{SpPmO%-}kertYM|>k_t@3^fX18oyHko!Pc9r!w(wsLN??7i@mpuin?w4e-#ix zKtNg=1XQ|)?oufgkOqOFq`N`7Tj@qn>F#bA8tLxt?tRXEUw2&3^WS^zm;1$D%NNK} zhTqH?M|_X(hs%CePPJidD;J4;bkn%!m@8q#L0#5XuwW=YTRl#QWzAjvMK1aW$p(=x zQ|poJCmdE6QbYrWf)9rBZIS7a1AaV4(a$IjN_j}AdA_mq$>j2Rb1Aufp34AajmN(= zW!H+VdM3yrh~vTYh6ZeXa8z$1lS4(U1F_DIPuEj{Bag7d6l3e}(9F17wuv7jX_CX< z4-ttuzd$1n9e0X5XK0H@Sk@VcLr8eo0&)z<)^EV9`haOqx4*){?fE=rOxFE+()=c@ z^fr`z#-VGOyE9$ur(E(kIj(VPZ_;Oz+qQY^yZ$dN*F(hFc?7N?rY`fpi7EtB^?hGs zcG@0w(><10yn#b5E^%}JRPQ`lz!-$6Zc^f6k zse6(hag%0~WI7BxCY5}MtL0rj3DJl7%Q1U(2R3b;OT}`1cQ?OZ(}^*}HYw^o9 z>$UUTRn-mL<2S5#*d1}K1cHZev5ZqOpMCmOO8mtte*+A8EKpp%vMj*vr%p=&1Zkrv=g+N}q8ST&K(@v%UFs{|?)6-hB{v$$JkJ za#vTn))WCnMRE-;j9Fc3T@V@wVXY*=(+(7Wp4BY~%1oaa zDf;<3+9cTt(xTW82Swle_7C%M+gfA3N4tt1X6~N~LntUJoFG06Fb_l^?^NB#d=CyX;E!@Ox17-Em*s8PpXuKOeVn=Zc^u zSF|UG=R{ejTR(rlJ0>+-=*MaO`N;nSXpQwTI;c?2*;Na=Xg3r| z_kc&$V$7{UV)N(zG^@uPL=D1jxf~MosaB;!%U0?nDffN&S=W>uah!UNsb<38u z7^>}ObQ}aZbJ-Yv!t+s5QDx>a2O={vxw0zmmhe8|uLB_gUFZ0GE1CIY`@k|JdamNx z1UE4uays7CMIx#8RBLNS?q$`0;;?4&VuLZt@Upl1EJ;1UK>!Vzt?gAid1M_LJ_AYy zkCg#+rii$GI=bPDBdiafesvkf3h5gTO0Bois)arzcXJ9l9lv*2cp(%ty85BZ7-Rx{ zfa*iI@ztVwHO3Qhe)awc#{Aftiu+x0wrnEu(54iLl}|P3oueaOTzVL(Qj1svDb3?B z^PiN-dk6NH*9w)G9;(BaK@8#Z0WF`u`<7|+y8x4=kHZ`d98v|VJzPT1+1a`$p$ZkI zM=)P)i2iR=<5D8M4hshR5~aJt3~!e$Z)$~L$I9t(`MD1F@ckN**Qv4jiV4IQ%;kgq zX{tfdwNz%9#P#bn(F$NodPe?!$)_CFIhXkSWDqTy-_|&13fCBW+&kKN0dF7_V~ga@ z>f__;%ksnD62$rXos1>x&Wyw_z82qQD|dXK470;A_XEFLraakD7@K^bo^InbYH1sF{={8j4Ue3*Qa?nxGHApe@<@T7khdVx=ST2(c-c?u~``XsD@A`|-SRIY! zo?A%7HJ`|FFCwuU4W@leq~aMa*6XBbfm@)^GFU@iTh}W}qPk;w64SV~tc45RRaFCd zl>(wc34;t`{AvTGW--9wEI1mwS{^aDKhG%F#ASVYtuY`W@!h{!X!dg;`scTZ;*^ZB z$9HhA))6^AMxzbTK9V)E`Z9V|nLc{>RMv=KEs7lbhJ)M6%tn(+8OL7sGVH7hIYHwX zY$06#o`$5Wxrdb)<%lFP+)p#Z9`o?697F_IlFy%@C!8)9R;0VnrkTr%IXNp^&W*#T z@OF$Ib7Ka7yc2R+e`p{PS-!|7g@s5s_LU+C6(@+W*@q`hSDXd0gLAzNd|JH^@q5!U zGBV=uBqRova6c#_q5q0&+S$6fjY+!OK0B$mu^341a!4`ER#37#opu`;|Jm46*;sZu zlV^~o3-hWqx-^Fe!agCLmR(`d8(JN2^+u94_@nV>_fiy0>t#oPg z9ni|d+ToKwauI!XZEU1}DL7Ado* zfijzu#I^$Vg4|?gm;P{qRttV)CJ!p-8bS-x;L%Jge+KN%u|6|}5+MsG1M8$D#pup~ z{pQRHvuHiDSPPFjL31Gk_R4!s=Jt6_(1v&DRjicv|DHkT9vfm_(!c!p@v5un@osyqw2+iG^ZBj& z#%Y@Ak)wH}3xNyU6L%de(-Yg`O5buk{S<3+bDj)uzKyHcWnu=`1_5sKnrX&&;?w+B z`Mt8=D}TE0labvU_j3kaOjk}j^9bk*GVVx~&oHDDyByeSrEf~%lj^4^4 z+uCi>PBWMB(;nr~Al5jsykjE&6W&*h@KTY>Or7WI7J5SCvi*i)B{ZC(l(M%>f!}7`a&hIO~j!zksBJsp;YW`#)}q{yMl@W+MgE*hY~aHw#Cd^^!#h_%ujCP>T9kg z@2pfy&*E_fNLe?Jd)6NcB4#jn^jokU)I9YyEkSG{cM6t>kqjv^E7Y4>%6=ynD7s`C zP9`w(nA~+C|8-HT3NYh`Q9;L%iA(YyqZ4AeAn7$WHAMm6s<*TC`fNYVlS-pRo}+5v zpeMv}Vogkv$1u(?yg}A2MeY4I?YJB|3+MrBfb{hJ3z4WtUUH7O!c?XEzu3bWv*wwm3Os58jYWQgoYNrxw|CE-JJkwx-zKqQ+s8bZY zk6mUscJ&>eG8r#8GPEgiuh!z~w%>+XUl4UWyl+@m!eggGYt)JqAVc_uDm_EE&a8bf z*|#p_jbbyxHDl4hdpUNj%2nkciNhHBA|YSkSLdqW!zFDgjO@#q=ew#dRV>^nz(VJ4M*pJskm%IN8}IX}jp z`lG@V<0S+`CFFo~REya~lB;ZMOCTUD3Rfy4ispLae1mpqLK*)BYJC3F{YNTKu^s)S zyCCl_e}*h~xIFTVn6cUZbcq&gjJ7XOc|O-mYJW_BxQ@0SM&~h{a;H;ScYY9GW*f25 z>0IF84oh~tcEoo(NMyLtG}s=>sT#sD5Q|+dW!iQrJe3})4h9wjI(xi#Ur5aa6TLqY z-@d-eC^h+Z8>nJP?$`}EP~W;uXc#rF>aAp6Xic5f$(!Lx8%g!`?uQLU-}x@y*X{m# zx;KAaxL-8aO)z6MM|TwG!F|*{#n^)YfraCJ+=@$eR#U&ts2xe?swfvzJrf!0lO`}t zJ$^|bWZSB@j)rtMa3Ss=?mBt*5=IdfaH4a45zLty?N+zo+FsA;PZm4oUaW9cd`?Th zifi~j^F4R}Bq1XMwwqP4o~+6==ns^?rzPYm z^y{C6-}<2j0)nCyw0{k!c=G&Yb3{)kp!qz?Ge9b)^ilk*s+WBMu#$EFgsCc>R=-Pz zb0}YW)e{rqu5bo3{?cfVi_qv~=})`h=G;hZHE~UKJ9`V+1u{qyn^zs~KRzNh2Tg6r z1L(q%Km+hQJ#?)$C`oeInrI4SRIjk5{p08MWL#%N;blq1`KYpokXwg|86cb$l%a_m z)EYP2o$OY6pgs8hq+c~MtDfQJXty!FK;C^1*M@ZL+^ZDbSz3QYtDKyphNdJBD6;yIf4&e+ ziLc)L%nLc>`C~G^{Ah1Xk;b)^uouBGbvumrJD+oYk-F2pK6Ul6JKm+u?~VUpuiJP# z2CFt`xq4wSV|zi%ql-6=yL~0jB`2yLR79q4Kfgh~7uZF>D^rFF>yLbF;stBw8 zb9*?gcXBy>UF>p{tZ)@pgHG@LoswqV67F!^{3Ry5UFOZ0E*+SS7m0#5 zX~v|XGc&v;_Y0>V3n)ysmR}P4lNW2d-Ur`%JvT@yz1=mQzuck8le*CD8hHQ_rujr2 zE55|nESt!jdAIads#+;Awz6=Qcg?!;c(bzcVtEb6Abo@Of!3I@wsTMYymh7FWR2={ z{aS*_3}8Yo=Pr}FH9dU1Vz!kPt7VN+>&ifG)rM^jyhP0b2=^pq5~Us3{abJ6MPIKv zF0}=k0}|Z1nOqA0WIiy*=CL!?tWrSIs;en}C;V9x;8p9nVOP=ef|Ho0{;~*T&y*$; zePUih<>1P{#e$FP#j?daHeq=21g2%(O|u93m#44^2g}~eE6)R&HTK;mqM<1& zez`Gt*xH$!Xoo3ykp{FpvvGFlUfmc-#OT9?3qS?K!(@%s-A#I(^n_*yi7M@&JyV^>%1xdIP0^ zFv+s*Jq`mhr2W#ZL&|l(7SJ`-NH^h;cHy_P1gN0PM9GN)Q{Yg_#CZ2ZSrl+)o~c`c`5cJ8C6mvENho-%wvFZ+%WQ_U|)fdy6$;=!%13SvAZSyygmt zT-*ULluBpjVX4P0UuMM5iXDe8$i4HF zq4g1|!OCXx@myX(sNh(;U=`WLT=zM50WmjA{_Co-hM;GW35*qAJ#xM~-v_XH!7km( za|HjK?^a6c4J^#6t6SMZiByv5B#Ey5=P99cN2Oq-%;4nDYeaW^Vz8eSO@)*S91-~O z8r&KUT}6jIG7_`x5i>9Fdz6p%S##WNOMBP(uiRy*rfP;J#Jh>(eb0If@fv*(@760> zI-ysJ>CP4TB&l|)^DgXMi+MK@<}((9ziak+ta4Rvv>ta&e_ zChoRoVIGVZtM;NKu{%{lsPgdTnq&74P1n_oQD$ge1nHQ`bVYt;c~kIntMgx(VL=il zMH*w507TrK3`l%)XAg7;b-4N(r>3->H?!);%Ne78yMjfHRb<4#d zg((JOF^;U)z`XJlD5QZY^u+TuAjLhQf~-E#gsD!oO4kD)&$~6u@pFJPTxF_1`N(V# zofTdm*bdYNrei}wFv9hKDqp%-;DX}=s-_4sBXfD9~~w+@FKY3#(z zX7je4upAp(*H4q5Ba9n;bHCL7b7ACeC01}fMZl2jlKf?ku4}hkOey=@r;M7+uh)b1V66WIxwDD=zffNC^7(Q=8YwriOn0HaE z_B$#LJ+FSgP$tkI6LhU=EdFZrjsltbJ?%0WOn4bLOEQ)CVmqcpBl*r!Ha;TsbC33` z52H>+72rDd(cR&%QWdt{9B#i?O$5@K*1S8>aqE~ftaG5R+6Nv)q8_A&9EhU!Y+Ya0 z4I(7sL}apSCC1K54ocm=yhgZ0`K;|Y84$R4GCSVWJ)wtH`%u1)T$%54X^f2~#NPEF z;Wsvd3PD(q=@VS4!3fmPjO-lG_hl%7sg4U$5W8-E{hg8gUtU)%%FigIC%qWtV4@O^ z?Nl#_0-(VE-GzZSA(jP#iJ~vAl+p}EQx72*nv2Ke5?ug{4>N_WZ*JeHT-B#J{LI<` zw_`6`PSyiq6C96cXXr{8bN(0FFE^;;cT|LYI=|Rq!MfX?vX`2vvnrUr^?ORXwaXo~ zdiahO#^1{#AEOg*lQ>pcR-%*-n@SxF7QofWok}$;+~QZMW>`Du;8#4sKwcK-tv zq~=h^t%)fuld1)qte6iFd~Su)D##Ou3x_hLu0_<$NJj?eNu{G$z}e}mT_q22BiK#6 zzCSe>{Tc;l?YJGj@ttHV&u%(2ZkCoayMFdEvq#^mx8T4J6#b70*H(hC_eocQiP2Oe z$~SLev7;`g&O^uDB^25m`8gRyk~3HwG*M`sXqNjD!YN z<0DLvU*?Ao`c=j5w^I^WGCwySD%T$tg$5t_GEGE4{$m;@OoZ~LiwRMjlM+D{eAO?S ze>Zk{Q>#7W{Xr6kEXu{K?&DnK-u6EBFGFLbt>}p4F`<8u9X+dkK~kK+GlKs4e6VVB zuTQ?=81XZkC6PQ4#pm;xn(}Ge@+=dB&M*Jve#(Xw5s~~bAtykX2mYduCCVugIHiR} z?fZ_Dw&APpJ;OuP$@Zv^Jpb`-Gpa*ciJWyD$PfE}@aGdodj1If&(I}~EsFm;Lq7QT z(+;0SMEw6h?5{Qb|N1?PYdj=N`1kw2Meb=>4RAhlivSRrE z;muD=!H$T~9FPmBq5g-B?BE58?f%?svQ-CB0f0f7-(A`WIfEOJnCr`*mkwQ&{u~X6 z%u4|=TF%DjH^&3DU`C@hUCh4*M~*u^K+QLpp=Kka0B%^FUp{6X%vce34NjLCpiP(s z-PV2JEEipQ1klQWgKN$=o~O#LZ2-P^H#7K&mDOmFq7r}qE?K`B{UO#|EHUYT-Z-fSMfY18fcRu{>4t zorz+27%Pj<_~jCe)!73)Myv^##It}Sv+nGM0Q;rx6y`QpQUT7mIqzZQ|7;?-W1aBl zl#Ry<64ox)rKxWUhD(4~VmxZdcBNjtx}pu(e5#7rYr1}R$=IX%jYZlnNYrujUBi&^9 zM_?kGevk<$+iD0U=?EpQiyi_oR~7hZ8{bF%F+-`XcR4>}h<*gB&dd&A;_#CA^ zUCWj4TImVh8$We~OMvTc7e(0o3XUWBH$tzh&zHOw$~! zoL?t@+5m`R9SkJG{_vtqfuZC^7tm%`sH9UqN&s)~_zd_A<7ZZ4fzz}}XJ`?eglXtf zJ)jPb+9McG#54S=?lkb;{`*f{Eov9F%bwsp?>`w#p3h%=<;D$~2+)9%Q=9A2x0F1J zPX@S~LdL6CUTpC_AT%>gqDfLnL&pE4s*l&$=y9`5&N=A3O6zg8Ntf!Y;Uv9j0-r!& z{*w?8YIzHwscpN_Jk#YS%3O{I3rQW?K-fcqohTUDZ3?6wVCq^uk3%BF6=-Mb0{S{c zy@>Tl$`F5RaC#OS7pvH&{ma=sd?&0BB`M@mYyW#=Ev0H4PGMy*zN(Cy;~-_ib4 zYBW{$n;6VxdR(=P;U!T0@u#vsnkuEkb4+N>m|16(c2T{YWHoyIH#g~jUOKXNf1Mm@ zCdDQPGr@RB0P(6(w-kq*=fK%OFxmCF1SOV73>bI zX*%YEj}IwRL(GC1>hjE$Mi_1>Yp;Oc{F(eCIHWoj7(fbCg6Ob-!@I^ zaC86jx0drJO{XmSl_l7eom2p9!n_B!ovaFVWuK_eYq;8Sw>g@sz1qrMUS4qK->*Af zGUx%v06f%jeUO0tU+WXgGX%*xly{w@WWwvXI@O(d&VpsRK}i;AO%0*00~eeEp@|O= z#-GsVEnq&2+yZ?R8G!{b2hgehF^-EVV|%->aSz4>ruD2yVQgW_NbD0@@54o2baT_N zmq#>OydOnNM6q?0(xdm9P?ez=rsiJ~xdjtH&f4oa$OYmzG}pL`SUN=Xk=Bn8G7qzF z!9%d0#k&K&z6Q|2)M-8m;pUpiUJwh7FzpO+6MK0=r9tgzW8=wI_BMv47?5O~gmyn( z$@3jhRTYcGSUOT?eyeCHDXSfRM}MiLVhMK!D1P*~^ACXIGGp0bL~4e4K$hI_wHCo> zk>Mt03?)DfClJhyh;O@IzbmNJ(-r8H_Ol&+=6Bqjv0Y9M8apexI9>L6Lh8<-sr}lyA1^Yj6%ET@2O*A7RMVRL%mKf0g z=vv7qw|eN^%6jKHFoy>!u!xMPgG z`)>93$3I_uOpxtgV6E>;1}M?mxNiOV?QWIsi*F4~8p;Wd&0LD>@?7CtDZLLsJFd6e z9N9R}ly*ld=q$1)aF8nmcvfrbz-1ksI}7xKpNutu<3M;><5v6g78?>ugvy25J6F0C+hWA;rQ9a8*HP!Eosl4o!5N&ua* z+(U1SG$#d^C)qfMZobCy?2vyTvI|foA($s2?EMGcyY2K|M0reIf7-Xc%6#$JcGbD- z4$wnHMn6Dg&;G8T)&np@ZIo0vD4%FQE_coX4lxNUdp^e45CIGsKB`8#upEt z2Qe9A5PaHChsdW(-#pJ$yYum_txSdQC@McTQ@4?XFs+L_h;+2_8kd6Tqm+WwB$F!O zUip1%GD4RtIE}q`)o&xeE6Zg%;g_8FXID|SVvy^-i{Zhi=EPph>I+SSc0jI6cNZIW z4IZwCi||D^H-#k0BOpT?a3&HbPS=!sFAX#J6wGH{c+-*X)Hh|T4yaFUhu`X(4P1O{ zVRmv=`2M{0I~iL|{jA=i{d2U3-FSae6b@QY4Fn3`4r$!VkFh z>_%vpYiqfh%va~~aHYkXKC^so&i;^fCM8J+)W_qFN%D+?gBEAdf zNZC*0CDdeAX!dE|URS#_O-3}KEm9R6o4~#PpYnsP7GlMG*hl#^0rdwV68~%|bO>Fmm6n#4QKZGX`|^EJxtU64({O(?0FenSgSoU0 zqOlWZS(!43X#%Z%DdQ_#HK)WD{6h|OHqT=IMYST&$2{6I51I{YCRmzrJ@HbH%UDD> zs`GKRx@#_Daz|2K&BofC&0o?WVy7^;x*U0;n=ptu_D#y7mqd=R{W69XIIQhvV-=E? z?4dF^w%qz1!y6J480B9^dzcT^>H$KfrLW-6v0ptp*SmwIpZDo>+!(P_WOl<>DdFU+ zcz=~j{%HmNUK8QBC?u4utUbs4=9|TAaCAe#o}i*OlKAJRp7~Rd^Fqdl;5LqPK_Rgn z6q%bt)HdRe>h|Ll!Fz(DjS>%^cb^6cgBww%-V!Y=T@!I>9ZawPYG*BXG<_7vXHw+oimt5EYC5gLp!4B#|ePLGAjBK763OQ=uKy+{H z7S?DDg4XUeOPdfn zRNz)%m*QHKh-;72n%%zVo%n810nK;IDu2$h6@w>6#1Zz>$=ZKc(QfW#qD9kW5oscG zwgA1!NX~^SkL=$((JAOX>qH?KTBB~%4&%}aGmHbS8}3)P19{i)1+e3`Q9sj((n7cb z-~o#b`9maC@h@l$JQY)4=$QrmRC|DV_;Cz1;2inm_3=p%()9~on}T}!z@@37_=+x) zs?Q$|Y`*z^tj>H*HkWQfa88COo(yx zz>Y0Ei7)%)es!{`#ZlS24MwXvRM+07Pi*-p`1Iv@5(a$@dxYxEO8XevhVPg7?BX?b z4fPjlsEvEE^jkD>N2Fnvk!f@BAK#hF3JA6S6z1RIZkbe9Mw;D%YGUo6!3xMNtoc89 zmdmkKHSDU%F9b;b{+Abkd2TQnPSJnY){RyB zn{m5m2I>!IsDC;3oVj3$H(!R0NoDivzLjLs7T^ttOYzmQ&%|&1X(46c#G}u~(I^}r z5m4R(w3J$sv5CLa?dfInPO>{gT$oSbSS&gY0^0YzNsw;tcOX?#tT^l7k zY+<66{BLgz?5Qg#*L*#?&+_C1?~Qw+WldM3PD`1VFGFWh5r{>uC-^>3>rg?qyHViy z$+*+_BM5h@HtRZh`~WQj)iY(OrZ!1m)9D`pX4fttaWRFYs6j02sN#xkzG6ITX5)G@ zOx3#~Z_XS;aQY=vsQYeo>oi3@?1(axE(*>j|*2grAJ8KxzLG{1C zI^K*bYdhsq){boeDbTLs`!=T4x~x;qY9?uy_9N*%Y1rTPZiKIJbBL)4me72ofZO!M z>;J6BCs<7o1a$;28EMztktI-Bumip|`2!siFBl~mByMP_r^QEsRJML5)XW^JZB2SN z3$0LRc}c^Cd!))2XKAz=tx%Vf2)T99K;+LCBaVemioya`5-l34sdI@Nk2yrRaT6I~ z&j*gcXgl3^F4Yxie4>L>`mOpWt_(p$6}4|Yx!Koxw>hDkU<_mNDfhxxM`e(lCs(>I z8i=Xk)`Yzxze>{+VgvNbG6U-|)}rmN4-uEfADk8i1G%oeT=k0R?{!91q3Wcp`j3}1 z=fCy;ljOpS3Ezc3h}!=S&H1O*TAzUkuYA8Z4}05ZzTX z$^WjP4-&Or)q*{Qlo@T0+j0WiZtnJdXW;(xJ)s`N-mWn`y1aKIDESk~6h6}rBD&vo zH_%namhih?9H_KO7G_rR9i>_5sxIBp18P zOpu`y;{h7%E-M^5Pw=G8G>qVb`-m)8z9P6BEbP%r+yXy3efUXxEp}awHv^pl`R?+p z&Oj+x@SQMYcBm|lWe38GO`bjs+}h3NZE~SA(dM)`^cTilN!c>-OOCr!)dR|0FelhJ z{&p!m!Aci2`a4(%S1j$FNu=&`z?uH5Ea0hu0AdpB9m>81f2jUCT1h3g3o2Vecaa=2 z;&QMBdPv|M$jTYJRKCnv_ol>iB-`>JqHeE z9qm}(VgcFE5x7p&mU)s*j@7$3q>{qY0*o`5^;;-xp3@_H!lr_OZi+`|9$TZG;vw;_bPD{rZC@ZbY!DlY8Cj515Z1cTAgw9&`{?m zjR5gtD?DDLlULv@NjUCV_z@F2(B!8SIAOa2N@byDmR0?XuvuQGZkpJYna@ui8P~N} z#}q#=S&$6YABm=!2V&RP5<7Y8p?Yh)pD9#Q){3^7|4|39GWj2M0MwV%eDpk{f1!{( z5s(hF$pColyfAwL#JWpeRpRI_0DfDKAp*jPddKR1-t9IM)zA1gbhG9 z);$bngMMH7ehU`Fh3N`BkA8@lFW4{{@M-Ol+4ixl?2MRVtEdmU2Aez)ccjS6?ye4b z$D@_*r)bK)#Lyhil#TpvyfQH`J|1R==L=mU@Bw=@#z+wCmds6U6SyIF6 zBklf4?H6RquL%Pe@ggG>vGw(pr(!H5R^m0Woj8=my^@)qp;qAm%CvKT1Gn6jiGE8( zn82BeHvG82Q2yCJVh<&FR+(&%{u?jzd*m;Y@!%WZW!*@(cXfjEmjOtpRjx|xMQGRD z)+=2(IV&fO`IsQswvc!Mh`C3nm4x^wjL&ZhdzNL-D0>1519ljmkV(B*=mP)TO)*EX?S;UR4hjc%0z{HseKJBr`;n@>?ynB^?v& z4QP?;2-&<|R}DaZa%yHEV6k|&(MYNgbJnulJu;g#T2Z)C{o0P_=Lg3BMn3m`M}jhb zjM^z|`Rkr}&+qxB%o?g0eX8E29UrmFM?x&VhXp7X+pHV3Yn05 zU8S#%U}`cN!v%YxevhBXCnkG(5Gu)6)%?1A6LF%tr|?rwmht|ule|_IGWkM~Yjp8@ zjdxqm$Lr`{dj!>F-6XW&U3AwwVCKiX+_IDl#?W$EynLZf9vs1OP2RIaI)HYvAyd$`DctE!EfBD%lEcFMPORFZ&=Ij0&lCZ;&0d{VI`!sz=qzt`@-d% zcP6!ek%4+8kb+2Ei&b7+2wH$3w*Xwc4Nr6l$@)}%q^Au5IPvyDu%jva#yoI)G>wKs zhe;4os9sB|b{<|?_b!;t7VAk_D19A-+tVnQh`-(QZz!lgn`-C>;nx=OQ<6A_kL$3B z=>pO5y3$kQ5a($1b@su=z}9F_>rN{BB|70>?@ z{HCG9mkn~jm;Y)!{(Hau=Zmy8&_FBTsrUkDdVl9m{q3*dr@es2KFmn?cZK@@_{A?C z@Qav)<^Mf{|E~x6=l^<%2zqS#Uw_g5?KS?_%YO-jHwN``WB&70|Lfm?pU@)=8h=C- zIjH}-C;!*$!C%!gftrG{c5Nc(?*YjFd<;)`YfNFMHmaNCm)|(SbyRSHsGU zhFVg$sK!0)$m`*WUB#RQm^;6pE?*AihQw$dN{r8@u_}=7t+^75@xl!G`nx=f# zl^)(033_9jJ0_UBwGZO(O$Tz+Ce8+CzPmSFh1|fjGS^Kbod4*Jpe-J}S=0`?W-7+y z0xoBH0piznrzxO6_|7g0o%*n93H+ufW;5Ui{$5Q47w2Ig*Zj(CxLJVs^q;G4H`-Wj z*Fy=DjNudDG4N{wXrW)1C;BQ|H(tho2A3)QGb4H`$~kfvs7oe|IH*|5sJ8SE02ew9 z?7)uSvX%mZ2Th1P*FP+VFua0ZDP;c`(^-WJvtd4+AB<9LK5is9f^z$7?y(|_7&^J6 zxJpbo;a(z^Nz;1E=QR3QbsE;fT)l72yzZNU@!uJe4aP&&V8w07*VljH*M!{>B3Vc+ zUf6IyD}Qn)LG^tAKa75~30?I!KGc5<>eES%+B`ai7hh4kS7S1RY$l~^SSK@f4)E~H zUC%01^uH_3fG6K6wK5~MYgrBx7fFpbn~qi}sp?)xc9?5yWLt$5(5btCF3H~NOsJvq$t&B&XFHQXhtXg|muwp~Fc|KmIInS%Kc`JEgIY3KYrm_uSr=_QU!pIq z?dKtMdlF3@JeMJx2r*yjimXtv>?tP*T;)++?KUX{U@}1%uc^^Yl@*WbZMPsiLc}2D z{o}jNo0pn2Fs${-z1z*??xtLV~FJt8^ zKHy4o%o$me0%ue?gj50(H|fJ-n><;mF(O7S!a-`z*MDrRYpg)OH4b-|?I(;1^4`Zt%8_lGO$jdE2=l zRcGA$8ii=gbw!|<)44QEY+B^GJ(TIM-Qi~hSBM^W3tBQx_feQ9Bmth774fCPKYHH{ zf=2a!#S8z8$i78?j{qs9|fQfed1O%Uq8>sc5+wXWt zaEQKm0Mr21@SQjTopbWxWK+PNrJ8=sytT^6Zzu+=VrM`>Xop>w`uf>9u&(8Wea+7? zSDNlF>A*}3$RnSDcl?x_wTTvw!HTnoE(||zdmDzg7?nm2oPLaxJf)pf+(D;VP!E6J z)W`bf8!FPq>6rS!0Kv5ds8b(Y8)`$(8h~N;UE##lWe;%E)hQOf1E2quyZR)&`;=cc z{En%_>@XKHYpWpC*OEIy{8IHw>?hXMVRC_-57GYdKdCUY|Y;r2dR?4rS&iN~&k)erSD&S?`(pT+iZMQ7FL-5i~YZ2#@zPfJ4j z2GmdqU!?yEReFRUux^5a^YLVbcjiM>qQP(mC=x5OEVPNs^hr_p8{`&F(Ic==x9`Ah zb?x~eJ}Uklu|Z`-UMCx(2-{Z*@4?8~U`PAqP_8RCiIi$%r5UhER<3(K2aR!wS9QsA z1vWPm zwuA~`&^w?DA8JOe<=-qz>a)Z0ODvnS`4Wx2D4)ch%#?aZLt$X&YgdRoaqqWr94^%; zPrG*wpM^k^SUal^8mRuszADm_WcL=KAV%L@|D7>2n$UFk-%I=NN8nK;hfX=5`Te8N zjQtRYSlU+v@=~y`TiCUIo#5f5?&WIiITdLIy0OS72Q~F?61YO3_u(4zrG$wH211-Da0D-FY-vD_THT{jR-8jlv}&5)p0yJYCkR8g!pEuuwvW(xSt5Ho+y!iv$BLN*cOa zh&HkDHX}~59=U+CZ59>0-ZPI$+;v5V(^ymYdiRA&WR{Sk&~gZS9bE-kN=$xM zjyI^@{H!&V9{Og2Fuo7pes_u!k*_2xx|z4s${6ThTuG04Wzdet)~2Lgp0!l?+f`SK zvaBY&MV3dMxHEkh40C zZ_^p0ISN<|k?onc zoz64E88@Bu5m%Q>Tzb?;eoHsPPlVoKguv6nR6%C2D?DlW6;{NgOWDHi#zM(EV}6{T z<(rT8b7$Je(nrhZfW?Sd{RtsmrSIzS+HMthD!M@&x}zLWv+k46IjR^gemCWsw~o2{ zQLbM%T%lx08UslxbRB;Jnpt9@EV40tT%s~*>&`6AygQx1-g@_v+G|-VEDKGZC(cMt zl^E-rjaNGc7hV;9bTdy&iqAq_1Gp#L-4o3!y4C#==u%y+>o80DMiAs3aaR9P`BD=q zllxop@x==s_owAR{@VT&B41@TTqg%V;fgT!xe$14rwF*Hu`++5-iY!Id1IzpMQm0U z$?VPTmmGj`*ZGdW9Q#*ykDMfT74bFZxkNp@v^!wb)(|bn+YL8$f=9z)iRrV0mCx0Y zZnFDod6)?MSQf~2b%XI4>qf;lNJ(O(6XkJ=v1i1XKbJyJ}qSsGt%A?WC$(# z6C)9I$6#t}-Q&*)bS+e8SW;w8Kkyj2X`n7#Aa zrL!>dneJgt1rCH02Q@{+4E!Iyo}$P@;)LaC>z%$3Y(3WH>O2_mxEm=q9_c_ER+;gM zq}4tCgETpNhV)SNdZJb3$EXgmci7Q4#AZ7?P$j!?y3_Gx)9XNQya8RswSaZism%0` z7nh{lsefOx2q4)if1q0XSE}QghXgzqdf5khf6I-rQa#rt%)rlh?#&n#`u4LScF@Ep zBG2a@pJ9Uf0`V>I>y_CHMUt`MCg(zc;x_Q2QXiRM zwJ`2wc72)slS66xLc9MCNvYoBz)wabrSeyQos6gm{3Ran0ja@Mt`BXuppz+Ea1U9yx!3Z)=yj-mBp_{_2TGl3Qgv<3p)4Yw&=ura&G0x){jmuIAi!bnl!wN@JTc} zQ`Z9ku8=!Xod&a5@qHAY=xN4oGWPyEZVYM+MJcG^<6{KujD7_8oaLjbx>p(nY>vHf zzwA3dukt{eE+7aXFw}AYW|s}9-_|tEPECUzXuh+=Sp*lqeY%5ycVLQT3+it~akc3g z{wd&izdZiDup4wE7)$4!W6pvW4R1&PE^YXd0N;|dd1wFHl2pR>yWqA|WD90k%DRO9 z+zpZW!y-EL{ghV2U%$oa3Ma@d!1fYhf6W^Cn(DX=1aDTQC#mS`!AvzTwK~xum_P@0 z)EPZMO!8r}#m7mV$?mEN5pyNKB@~6NZMxE8A4c(x8ambIRTcytw=td2u=MuiMOiTZ zgq{ALJf-oY@bi3CynFDKee=>zMLu*9BKrs`}KM@fwyFoNEn6I7pPgGihI_X)au`&4hnj( zeN?-D!{r?CKYyqZ4CqB;yUt|McBl_bpSIR{s`@VkX-ZARe7^UBs-P5~q`2%IlC=QE&}aS#N-9fub$#FrD80x&9UjvbeVU5Ud4%vIaKZq_ z0wjlZj5_4aP5xt@AY3hsdh}$Q0feb8iHuG_3lMwN%+h@U7ktft(WcksI$j+5A)_G4 z)A+4n?K}HT*r?rrYLhukstPr4XPRwKdbQo%q(rEDIj37cPpg-YbPl~p^$p6JBnsD; zs)nk?ucUIIu5VrQ2DyCp1SR!N*DG9x1-DS;8VPG*MRjsHWgwXpI>_8L?D_U;F1#VG znXc8|RM5mF>!|eB`0w2XPT9|M33HxP|CV4`YAxiweTt4^h(J791+}9^ykCP>aDp~L z1Jc+N`ZDHm)cng{?yrme;V_rK;P>MaOA2f&`l007$H64L^zs*T`4)=Cm zsYdRnd{6#KVPIKwjH2Par$+~Aal9uhkk`b* zBM|M-A|UHar43%ubO#Z}vW#QfpZBgmhiPIpo=s~+*oADw`zp^peF1^~U(|gEP*hph ztpXw{NRq68fS?iu0m&fA1gMBg25CTYk|Y@nB#8==Rg@sP$r(hVM9CS+(BzzX`bSS%nw{s&X45hy$?j5 zNf#2=s*nwv>@Un!HOX$@8S=1`po5If6iUeoCR@PY^?j(KGTdbX#% zQ}RhMP+@n4d*x1!cM%OB;?{Kt;)JGOCxrH$W?;O`M^%?4yNL?1K>N+ctj0)rT#vS_ zJ0~h6tn4=iD%Y-KKJ_Ck#@MP1pGP(kw(b_bB_z87d%)CI%uFzdeVqpx)G2%-4*s5p zjQogR>MR{U-Wr77O-)jAjl`W28EzudKu_6~!$m*MaQ;SZ4+-f`!-1JwY|yA^Oh0o8 zZF5vEb0z+!!`ML83-V?BiMYcZ>}rDs66AcqH9`^6@YTZ?YlvdP1tTSKOQr6QSGo3^ zOPtg%lg26!kGL=n6&~+M)zn3@yZ6gO-wLk@nP(c6nR)JM(_CKT?R1%Z+h}8YC7mww zeTE>P6O^}hhcehSVdCvwdi`BgxI1)&U>T+FlmYdaYEgvn@Ynx0M{wTJ1s?r{pSqpE z3aq&Um=&}j;`q@1De2vfM(-;-06=kQa@CG z+5S!GhUQttYc5OKR2qkCG3Pa-7KBHWNOgzfo3Cn;DNo-?1~t~=rmxiGihFs_!VZga zZ_aJa^&;HMwB>V4jWXEPRlCR6t1;m^bv;ls7!xuZQ;DH?#`kBaU(bsG=p(sDv#@^- z%vrw!-7irmgR`%PoW1qRmWL{ayzMkLRm79Y2;UUH_+SK;wjK2|- zzfA$@c#*3+_MIn|xO>%zqv-eoHz)I_<$$!~&hwSHy7@Wm5E$^gh{P{exHy`R);fcd z_P)hFweA7gV|7G)*{e_Eif}KHr?zKx8kZDo`URI*-2fP`(^N$)XykG|v|&OY;VIuX2dRaUt8c}~Zn?0{_-E&UvXKADU39!jSaKzypBVEClqV(Bc3 z=6+ZfV5&YAo@4Eck@7j}e!6xm)9qiRm9t9xN2*@1)(*$M6n(No^d*Dm+&wKCG!*q5 zjK~`a)<``=eilt!6>{v0bchiX7)#z18*UOjGeMN`<@P^|3e=Zi_a@lE`MCXKw)4uq zIen~~S5}%G0UyO@NdfHNuFsbJHT9u&xEapv!w&d#!O3Q)?z;SWEOo#TpKiim1W`AH9ZzPBVvafgus!u1w*)THG z8wJWZT3SE+OUAoM`;0lr&>jIex7eCv(%WIP z{xQ20(A-87untQ!p??UCF!tu4`NWO>)K@UYvL%OH_O~@>XRbK>$?Z?bMHW6Yg%^U% z-_NMI`N$6R&RIOY11hRHC|P*zBcU3_QJ#hfep_HIn}ht=57U+#1}%9i*$ZdTb9DO~ zvhtmv(4pX;FLH7DkdV3&(`wGn23Za$JjNq;L8!184TC!UjDTib1q{s7T7CaHH2-`& z-SPttxSwN4-(}CN=QjQJl)?sxj@o|akDDb9=g0a9e$*i0{wA`?MZvHO;Qp{_>8_0} zY{MO2O5&}LYC9w7G(Un)`_)@<*DC-pzadlcTLKZO_m3wEel?5{UyTk+-Q6?v|M@^R z(;s2WYQCJfTO~gV0K1i0>28iHxB?W5EkmBEz=|V?TzsWtAM)!%u)KP)bj)RtWagSBnU0t7Qt#-H>yejOp^@!hmsO-(t zoy;!hN7HS!&?@1<_j&`M?kSSOX{ILu#x*TJM6uF<$g7;`I>wA!15keLaaMru%ere??I62sK;ePVX#IH zCAg*D{f!a-OTpWLvb2ksbk1%NwDq?oDi(`WA@(|uRoRusK%1uKVg%+fuL31fea0*j z&vvR=y`TuIm1nNGzlVhKknc}DwdnwSgIPZYb%E#M8LHl_FyBB%S;5an$%!| zGL&(Gl6G8ulhw4`4k5Vko!ZvNfQ{NV2`~GyUOdZ4RfC+-hnxzs?^R5YWO~^_=TWt{ud|OiW!7G< zvczf01qdM3etBH;El!a>86j)IS03C@Q8j0S>S>m=Z3O{;9>9-ZO~47kxgQKU zW=&*=v8?ovzJrmEQC^JhJU7P?R5tVdpv%4!XI>1{T19DgVf-wh#pqSOSDE#$es)@< zFI~o7-LuT;y?oX)BEYQo;-5^7A0S(T2*QK#&tChrrc0A?>~p_(xC{%WwLlyTkK z{NNxw70$;AXK#MiqtWQU&X$3bDT+;#W_XO$Izu$^JY`qQjLgCTLTTfq-dI^eev4tL zm{W~f!Ck&Xl_nD8n_>FV20qT$_%4Ng#p}k~*WM4R4pO|3;c91MZ4!R=o%CNZ%`fEd zvDBMs&3CH_nbY1s7u$<^Sa0>0!6GQhDFLO%a#-(GMp<(Pp>0Fb`)V+>{d$i>*VgTL9{on& zBxBgR7acE2l0WXvF&R-pUG3E4N;p&A;0_1P57M-QbxI91u1;Zt&f5)6Kt^)b*#Ebk ztgI-z^!n_rpQ-n_C>GvZgBGBBu0t|k2oS+nv#QQ5Xq36Sj8_O$t<`0KdS3Se;A0tn z33S>0hDj+QnW-P2-eimBGg0yLlp7bym;(GmU9pc~~)?`|5X;<{Wng zvIccBIwJ7ytGW|~SO@ozQm}_)G!$6BDM+8N1{5v^&BPw7mn~ zO!2Pd|8fa0T)ELk1lcw}9w{z<(n%<}(g;|-=V{V?(s?&UB_9Od6Iw_k;eOcvNz!;) zUMGJ8jIWNc?vifZiCoCd3ILie_&9T6_}O^<6RJ*>Bp6HUARLww^&Te4UMz=zwb|Zk ztkmvEu1llXgu+8al?c|hKDfWv`SG(NuBGF6n0_Cyz(+ezLEjVSn^&c_AjA_0f!u93 zZwJ6CM~6jk68$d1%Y4E_@r$_eW>2wV7D}A9AAfU3A{OXh{IU>Ykm5WSI8p&uuwz@o zt*7B%`Tp}^rDg`c(zAm}_CNp0wal9}b#nh`3nf^AK#-{_PmB%`dNet7NX1x+NF|9> zL3r`WHb55rNHLwAx8Tv#@W%CHQnsHpKEv|te5p}``MSNo$l8L^!je2Gx;qc1jQuS; zSl(B4iEAa__NDpm6@#jM4m9CwK5v^%dws$fG*oS@FN~e@AQ~)naj}I;gf5*yO&yBQO^hxp~H?8icKD z29S!kRY&HFGSfpsfq;{Z&Xcw5BPGMedik7F6yZFiDluI5KPZQppUl*6k|$SC2P%S3 zKd^D<;ch7z6fPpxf~+R3|FR$ToZ(VfVVpIys_E%Z`@LMPM!Rk@c82<`L6D{zxX>bE z+IPuJ>2?&zw;K3NVP|=?VTO1#`OTPp)*lA_{*q`bq9ld@>SLqnZ~;gyY}i$@7QT!b z^AAYy>Zcnj1JLAz`#4CJH{z}}(9;Y_xFS9n^2JX7x%CsghO`dXaj6YH@twnV=H?*a z@FFVN9LU1A8VdisJ4*PW|>t1$j~R>+66Jq-oM#&j6XNV&_Q~;Fk2hX8NQJ|{l0s~;;o5+W`Yb0DTS2XVp&L~7p$jort?AzjQ(gFeo45W87}*w8kRC%6{tp5=mK+<~+Adr;dj>aEzV4N8X;#mjBJSew40=<_{ zsEHo%w2<(9!RM5a%_D??=m6>W?h<6rrj>m_i==A0r#}vvb4;3_Z0--L-*I+lX z4e|CaLBm*xYU-ZN9gzsuBa>T^tO|w4Rgf{5j)b`=D0XQ2$Ac)Y!{qv+`nyD)pk?E` zM7|!8$U8wV6~7sb{dib)w%MR4IhsPvygaWFc!U&9Ec%qr216js{eiz- zvmFSexgdKNFg-qW{dmk}Y!k~pU|WrZDC<#annEHo2UVR!G-KO0yRIhCQl8>Jza*Vl zt!cRFxZMuk6mHKXTrB8LfxhS$_4oY)?3gV)6(%-KTs1*K?8DQmQGxY<~#FH&wB29_F~vtVT) z&`HC;mIj@Z_Se!AjiGoI3gvM`qy@J4u@eej{&0zUV!Hr z4qh@{bw9>Y)7ya*lbqpRB4GBV>4aGLw~MKvk@i3c7`9<($znjCyGp+J1;Rnu%7D|7 zj@{tx@_}KiJVa#mROpn>DO^5F{BH+;vhe!zx<tW=cGyOWRacYxr4X+t_xlba9(zVShtvN_@EN&) z{LedAS)%Sty-5R^Lkz3XGQPN`&IZTr>`14oDm@k{ z-Y~N`xVps8!4R*DHFFe9GKjr?&v|0EqF@Bl`33(t#)RXTN!LLe0C13siyLq5`oQ|z4)>$`g0h!>bD*4uhSvvQyH7QR4HvFdw< z8pv4Zx5T?~0cr9S-GJM2a+?>x31Ni(yI#4a3vCn?;|z7=-nq*Oe0(nkxgk6gByz@Ryi3WBpoBOE&io; zz?to5Wmqg?An{`bnr5q=lc?!i6KK3U@zSjQ<0~;*n-lg<_oOsh$=+sP$cgwHd1hte5qUZgK~^icQRSaP^Gg=OEBlF@GPB?%opnl(iMza6I}LtnBlD= z*q3&)tJY(hML#F>U|i=F*7A)pLA$wvzt$iHB#5P3Cv7|SBk+~EHuT2h_!3oV;LTYc zcS<}iM@L=~GBrqpia#663^ZVSi7a159gYQ38Q-)z0jaMYo>{v)1hSeI_WiMwqSL z!@_e8u%B*Kx7(lSG8U{Ee-IFN+ha|&kt*`smPADOrhJtRWZ(S=5+w@yiv7uqMZHo) z0sWyLOddlh$Qe;tbdM+BE(&-%78F0da^K5lNK#J-fKK*b!wk{%3;zSkjcZbPveooH zD79srBg)NPtZW&dNnXte+Qp1)mefWGy zs}?aIB*yzui4a2V6;diFp8F9LP17M&s#2?Wv_FE=i`-bAfu3y$8!R{M5@;=o-ju}- zX=j0Nld9hn%u)lR@5m~pE{9Ojo6Un&!ZxRFkz17*CSr(7!9~%c^aY*k{de>S82!35 zUzVTPc4GWE!Wnf&1Ihzk12`8DLxE+{L_99xai2@RFT9m4P~C^cuFXDY^KV?fZ^3MRm#Zfbl^!{L^Ij)Q z%!pd+tq|*-O|v`pCXvotQ_g`AYkia7n8gM|@z{zs_MTSa@jrW)Y%2TpU`*+cl+$fX z7Q)b7A(rXDADb-WX;&7Wuwr~YGTag$R9Ol_0acw;^maK*)uVLi@-);dMtSlVU8RcH zna{Y zJHtWJSk0<@}!5t zIMYj8qv6M6G&~GZR>Nr*90Z46D#|Zj=I1y46w%k$JW-V?azVzv#Gj11IcqVJ_mmeh z1Q*$`@|(!`lS`6vf997r&5m%{oyO)S!JpXxYJA+mdu?Kpqi++RP9#fFvM@$0 z;V4U^Bm$#k<1U1C2T~Xsb8^S43>*oe?tq9`*x8h-LHkV3>46}FYG*Vq_Or$32Nc#w z#ZFS;_*UB=ky@$YZwC*|uk&ebyBEO}Cwsrvri=f;ep%kxsI`E7fxd6l3>kB&9x~0`Z@QY#dAJ|TU*xpTG+Y8t4(LFVbrz4BDPaf^u zk1glciJ8xuF{CBtSivSuGj_}g{v_mn@qyTO`S2K&ioCY-T4ZP{m%rirf2Ok^4Rj{s zXVH>k7IG(cl5|wSo!EoQ+uA$Di{kHdna+)Ebi!jCWOv$;6&4_B&VvJ1&+w^+L6+iK zbhx%vu+|fF=uD=|d-^eFYM0v8nYVkZZVtuGmF}&kZH&`lF~%qghj}d2HuPPdA8DWU zneL=@D<~1&oU5c{_||$rIK}mOk@CE_2MsF#f zQUcJc)e+$YiXU_Eg|GOeNj)L`lO{(AzJOg%mXU5pnu?{6hA#!pUl|&jHY2SXy)rXe zX*uIxygzGP5`sqq_0Tt07b;GLIM|UeZ{-WpP;=YW+Nm3bW*haB4fBlswFy{wZF`4(s{41J>Js8D;5R zrsjZDg%Z|<-A_`+rruV;k9)EV1Q>Dx^|WfhW22Yy$xHec`Ye~s*p)udbGE6}7X5>1>*X0@>bS<+FG* zP@f)Pji58azuN{CkNt$a?B`~D?=rIu{395dv`&BWzsUUptdFjVH4}fDhq4Xk@Uf9V zHSQ21ZQ?r(%T)VHJtLIqm%d%F!OEZ&3bPA9eD&VRXzPCU>kLe5s_);e5H= z%_5&*ZGK7nQluWcv#o~q4Z%c~FD~WSRoD0WImAv7eV$B<*9}pw z(u~a+h`XPqOmBxgO7Q7a=I@GPz-4+8Q`V2m6i4vM0H9Pb5O8XTa!X8R=@qrq zJ6t3ctPJ0>7)Vg8CSP(Hwj}Nn>r&loj;WD(e>-EcI%d#}DeG=e2uK8vlLfx=;#6=5 zlr>UAb){?-I`cu|wJ#Fkn_Ir6j+-Wb&E@#H30Ci|kSFnAY+Fpn^B-mY;i>uF7) zFb84m*;v+;`$ZhoQfP*{XkW|;2R}N;1qsdgwh_*3M{28-qyfzRo$14+8`51hdI%yh zNFxt5`$$HgCo>zxYjE?Id+qjf)-?whD?HJ;tnVUhN>ZR_REoRqFwCcroqHES5&7SNvX?Z6t{nA?9z=7#&buZ)T!ml*Od}a6-QP9S6fL+Fx#ctscVVq}Qv<4aVt2ZukN!yB+GvqLDK_Hh&w`rx2!nVW zm2zib83s~l3gM*}p%1@e!jp#pixFD$j1%>6xM0rIZI=~;zjL~Fu43zxyDt-W^f>_6 z_ajTBJ|)wg3_=6&_fBXwt93^-+4NGSKJ~E|SIpOw4E)`y*e+|DtA<7feUsA@u%QL- zEM6+aNzvKS5h0#H|Ij~=RwR7;^gHc?=W8K|SVL!6hA$HN4=)dsHI@$NeH7-BYY@rBF#;)Y%3QX(_tv>2x}Korcv(!a!j<4-9@4DgeQ-*z{`EH^*CPYD1NIZA_Gt+{hMK3N;k#o)bE{{@UCmk&sh>V)}c$QBVf3l!AAZUN&|QWMEpV{! z1VZm57nifnk?`J7k(lC4j7;dMbf0U2C zlM`!ock9N$&^al88c9S`zAI;#stux{sa({;6Ks!khTqE=1(bDHF^&oRKX&F-Pry`?6ycupS2cad+56$;^{pag9x1hM(|JT9ZFypZS^v>Io-1Eb(>#UpWfX{W;5AS}4 z&QShn_B?W>#`H7Gz2`ql?l(oSkfmak`liW`l-iKA*})>4_~Sw14Y9R3k!v5PZ|v-~ zsymfp5!9TyB1v>pg2+qeg;=ke-7>YrJH1Gzf+zN2W3z-7OR2AYI2O4x(L2&Ef_hY; z#}1o?F=^-#pOzms!t(2s(h;Y>R@Ch2`jG!3P}qTeSLz=WNfey` zL{N0X@gqyi^XK}Et_QI2=v~V^iRc4F7)oR`unyu7iEDA;OixckORI6I1MvG5N!NW2 zd2H5(w*?6oj?u(>RV|z*9a^`lNyxtyjRUG=cR{K~@4v{9WH{_56w^A>4}+O1WL z>{KsdgHa)xL0w&4(n@m9U7Q+g$2rceviUUGkge5~{Cp}b3oI0>+QR(j5VT-XU)h{e zaJd#17;7*o0q4if@n%eFrPS)k1O3R5BXIoh=j|3rPR}S5Un)vV`+cm=9?CK9et^vi z9RSGt%?u2v>Uym>kwN@?^x=Zab?pD63gGh8^d z(SOoWXUVFJ`AH6(zM|*tMd(m!RN6G zsefsI&{^#J8^lAlJUo8&?q%XQXW6-lcvF$n|31dgl(j0o$DEgY$DV zzh5>N4i*mj`GGLiA0rI!d7L&cDmQlT@>opaV)-@l$Y=4N9dMf|zo{$#E#>gSn#KRpFPkKyXLNYv*i>}p=ehY}xjo{^ls$MP z&GXmik*{TxdZYEE=y00b?>Dt@F1}7NY5%BXgK@qo|M_aV^sg~OPFd{)+*FEE-ss<_ zcjYuuJzQNBmXG3}BNjjkvu5IR=VwWV?;{95rjF#*&j20Mr=v0M^shI+|4lv{Tweap z?BdLyhxp?oWoL||`5ifep0y^Xs`b~gwpI8L-QZBF>Kb!;`I`~N=uKmO?Zd*Tn= ze05Q2nw*xsCJenfXG(6R+wM6As+y50mk8TE)A==^e_Z6xfq#HieX6FT9z$bx!hY&Q z*ZZlNDBI|o{Y|l!8?%p6b=ZF0bgmwpqer>-LZ?VbY^<%%%*2!adFO~IIow8$qA&## z)SpdF{aki@I7kwcgaj|8NSI{~1Q_>Gij|;mqxuEWnIlS;X`<+Y6tV*_ZGQV zv9elaZpH);(p1O@t(O}ZlJ5Bcp>U8+*wBz9e_bOGlqX`DHYqjUWQ$HG{~BPaL(k3! zh}<9GXmv;*@YqyzvDz34R-s>2c6M2~${w)ARw}mfp8SfF&HJ6b_s-WF8C=C(aF(`t z&R$}s{2a}%FxtQ`-H|L{L!>(KRXo?P-DpLn^CDMjc8;u~(Zh!U_cWc9Ab^N+F1ERJ zG6ej{zd)^$wYa!=w_w~3cWPe?4BsjS(&FPM?Ba%1{>yM{iDMm_(ik&*P>8umlrnbN z@72@Us_ook6f$Y;+)T`TM!j{f7_zfvL(h0cH}uB@UXcQO3&t~N&TxagabDVae|zwY z(mnMv6OmSa#yweAFTV}2Ao=1#z8mRG z{A1ld;P#e;@}Zs;`o_@P$EI^0e|ykY6zNmM*TQ)-l&!U8*$ILYumwtZ7TZSy&9Y9C7&gfHcwPQS-0PqaV z%Fe#3t^M{!jHt*r;m7JO;d*2kwN!&<6^~|WUmLj?W&a4dYXu<-&0C#HN=j=3roN`D zVHAa)rTb61JGZ)3j!NZj-4o#b(yLj;#3ju5Tm@HZHv5sciUKrO3&FX{m+!X=FvrYx zVv3#yri0hXY?mWzw!g5`xq5HD_Jxkm->&ZWvK%W*PkvRTN~p85dip-*Ci{h;sqq-A zUOwVteY8!i*Q0xP?$iMLmIlZpUNv!kB;(vt2OJ8LZ+LTU69X9SMc`obepo zAv1_*Ik{%!g4|9yrGXM&y-lWg#eSkG#>_|sAe=EY@EP(7Co>I8Mb{}x77n%Ow;749 z=Qq_t1?EBZbfLjb2iORfYW(g#nQm`*A7(F#UL6T--l!)nfqI zxMZ`PHhY^BUphy^3@vo+6)uZ6H*cv?`<RW_d=pp--yTUpLA>?qt&t*AeGt%`Om>U~p4;;;Rji z0-%6aA^t&A#d^LbJ9$~q)4oZ z?M^8yJr~=N;4|%enATd!nQg$OfpJONWK`km&jLf$YQY`Q1!RhhAO5wW{e27dm3KRM z2+gBRBUCdNBcw#%s~%t80xI5aUxSpxQ3=dBG`%q?A?wXSOs3IL-~1Fp(PEU1Q!5@J z_C@gZi`ns={&{EpFJY4z9Zxm#EkB5SQ2tVj)e`PBH%_B-yT`}dyYG=@w{B?nP>!A? zKQFKSZgpWS>~gn_Zffuh?`D@|qv`<6HaO~#>Usn3IBD2k;xWU@e$FBeTi#eU0!zMB0;_35n`8CSIelYq@BqR)o)m) zhllJpA4o5ii@embHdV}P7nz)2zwENx>GBF-vIg8V1)o)I!S#;}a zeim&GZg2KHf9Yn!tq;m-Yejw{Q}2VNVie`FnK$p1ZYgbFUE!K5CW(qA{991)JGPhc z7cb>OXTBPRCE>*vJkf!P6@5aCTKM7&Rz|gu?MF;fQj-5;!iLo2q6+T>oEJRk>{b)^ zH>$fV>q z9iPtq5xV{RD-MVe*~~kC74oX~y*1p7zc1;(7d^a{BcqP=4(}a$miOuid*kmXY8(@tZ_`W$=dHh z`7m!)kM@*=2p@S~!6&%|U})wsra6c&a6|eFC$W6O3_;eCt!Qvy8W<)d=+t+t7F&;0EI53zRQ00y{6Mj+?q({`|HZBJFw%4`I~fnzXTi&(SEYR`Ql(QB zV=@TtF&euDxvmeG2P$^8%YZR<7TU4g?R$ynatKtmg3-PWzc(@%gYmrT{Csh$dOnOALmalLt4 zm3cC(_o#UEYCvNnechE!HHU3Xcq(#dEw|L8|D7X0`~n z`uo!O`&o&Vc{Au{Os1U4JZ?D=#jy9dBZCLKw>AHfd}oPMg+w9E)ZA6d`VLF#o-ALP zbOYBrM*N*^ZJ(n+7#BFJiAH&yAS1J%fS|QMEg>Pm-5o1!a5j&G!W6UB+T9T@b_6=T z(iB}+vp-J2ZPa=oi^H4Jc+URX_3N|e)|2-pI_c9{Ti%urBm1B8E=IF=5mdf8^TNPF z8fx1Wv;mK9h3oFZ8$%ugtB5j)o#kB#5cPu*B8Sj=`C+;)G)shB17)bdp633lCXDK8 z_7qkCn4kODzG!p-?fv6w6`hD@|0OuON8f}hjZ?C^eBC$CkZ5_r=N!vvZoT@&gN7dn zGG*QzahI9c{2D41-P3%UW?)Z>L0u##^XyB`>l8PFj=VavTN0*sd%icfNe_i7(IX_Z zZGB3$yu2*UlgOi-t1@_fq66Rf9-~@j7&JhM;1Z8Ma=17~PuIv?eZRSE9^>BD-rjEE za_LP|{4o*3kRse#L?@;D;Bd^0;pqMC41*fEo8X0$sgCb%0rI>ZvA57isg7A&Z^K6@T~TL;kHX7xui7k8ZR~(H)vNMjJ1tvqOe_ zbTPJ7>}Vr}u)Isv1}pN>5!rZ`6Oo*Dk$b+2_i*5&)&BDPXIqy)?Bl4pmDP}565QRO zoKF}NgLM3Z5AQD6=uo>|ToOzOIZDUgh zVn4Qm1997&txvGG1+9TM&wAIBqwV!sMYZQsyFtYYTr>my*E7-TdO4WuIdXim=*5+v zsMtT|MOn>>D?*H_RJ8U|sP>PPo_cy|sw`-8?c_8u2Nij#FLw)X7#ELE#Y=~9`m3k- zh-~p>#@`98K|fV|fc?yF9{Q1zsE?+XcDF&6cQ;LgJ!ZRa;@QU45wmzIdg_;^CMI&! zuh%r+Hl<`&@xGRm{1K$N%@9pC(aGpn2Qxc+YsnZ6-@=~P-D|V?AEdgtCu%ypJj#t{ zTe+)MaJTM%khyqF^~>3auQe7Xvnm(dTJty@7QX4TFYOG9uFA7Ti{2&gl%c>~5$ygA z=E&p$=F_IRaAlLCzkDlt@!L8}w)k}B&feb=?U^f^yH|HZBBc+w?cw2H3P=e~)1)I1 zHVPwlQ7yQr;>`5=Z3$Lf5YC*amuHf zqjPtr!wH?1STXPpohQyAqGMQ!(T(3$^Zg57lXDff$#G&7Cj4_{$A493aTwk2VQ2%n zA46|$VRTzBslIjHl95<&_c0+=DR7Y-f#KZoV_ zb^yVH`0=Cos`Q2LxtLy^$v8yID_K}7mzEMCGC)&eGOxXvEKq>=zVp8ZKnT!GnIoPv zZE%&ilUn8Lm%5J1)A7FNEJDAGM-dE&3jHHI`Ri9kS*`on-6Kw8(kh?&4U#$<{9aME zEHRmN&|Pyl&hamo`Qw6XOx?5zPztGQa8B{;N=hncr8B+JvY=HbbY3alh1&$EArnUyQv1O&kb&?cqCKUik1%Vs0;I z6(en0D2M9J8NFAua(kw4XOkg!;5^#VKG|R7zm2n7{SkZz17ZTv!j3L#i$d%H-0Qx= zr6b~{<6rAB$2f@cXV7gDGeaoqg$@AsqCEb~P7jp@Ww#=YR&F8Pt<2qO)>Y)Grf{C9 zH@K}t&B`CNXUyP0m~DSXW@W3gwYqM&C*x}T<5A*38ncU3-x?MrISQ`4PvuaN`RpQt z-2pJLao^-TSz_`DrwiNtL2>df%tMGF$I+zlohi(<*Kk-2K}gE+VxTr(e}S6Ynfe2V!W zJ_IKo2Ei~rEd?sY;fADDw3v|}?iY1^E>97&=$Z&K?__1G8Ty>Yw{E7Vk~$}|Qw_A# zj7o3cKWk2bno3YUggNIy_Pin(Xe|rSg(OK`wCn_H714WT`O<#&X4K*6m7`jRF%j zU`5Py;#zUp_#fEnOomQysPm%fr(X%(=VN^&E|-R4g@V*-cWzNS2JN`7ShFlzP?;uj zimr8|TqIpLV{JCx@16Q|IHnCNv1w`BL&4CkO+R>d?|q4PCd{;J^yCuqyoLcya;bj0 zDE^#hJT|#Op90z%XgQ^w+$<^TJL-+uPYoMBpi>~~6-mY|<0YEo&a^gldDHje%jzsp z)6ardJrJ}vwQnUezOq+Vw#?u3=(V@E&)*9d{#`5kdq58rl)E@+^*74u;k~ihR6M%x zyE|2Ed;29lx^s7DJd2>O$#InjDEhFj461hyg3lYrdaiRyd-TrPF&X=>vUsPYr0kw2 zL;Mbr#zJGI``e`-3JM-GH7^|h>&E^0it7rN@+}o9kA_s<=R7nu9ro&64i&vISKcSd zIxo{P5BGIG`o95ILkUtk4{wWZO)?r783lj(bU94a>G3D~m4dyj=xAD@P?{tOBZA8l z6V-ddQa`ZOt-1a}lbeMfKh_NZ(4*=!Ug<-zU0CFl5`%~qd`wrgVUUF4l-UdMyZV zSmL7}f2@xbXniRZrvJsw7rKR`-fiD**(Igb(ZoiYOd%MmgbsoP^IvHB$u{3&R=RkxTcC`Sl;Z9L)A2TidOy}-Na z2pMg@q1T!9q*}ZO1XKo@ud{`#L8&{qoy_crxU;Oe zw-jmtYvd?2tk(6hpJJ5t^As)AQ#5KVD+oDxwe2ETnw3EzbcOx!_H8*WCQ}sjRympz zZS*1p{~m7u$h?MwcKRSKSQxBNLpR?!LU>*u&1bWa{~d)rIpN2PZ4YF3J{=W|1j|RS z*{U`Dq%n~!Ca;JIP$s93NyCyS!QDLGgg&mPQz+oFUO3oo$^1AuJN;g&nt_5rcOc5` zVS}jc@{0@SW~HSwmN-MzZNdmlIn@j9golUsnfw=ssO&7UCs`crI7RANKV4@2tS8Sm z4W8|-QNNE8vNe@4P451xa{2S%#W!mDUqAD*s!#-jd4Pkox8W^S(;hc-s#t3;Fco44Br}sdnt~@w#5T$ai^98*2FznXC42?8vsbf{ zYyF*97+Vf;82pzRvxS3Z4p3LTH8aJ3kx=7>@jUYkzPIa_kF+(T)L9(`y`@|2X`@1e zoAP}pK)M{-Fx?^8|0j{*kMpNg$5JM(;W+2}ikzz6cjl4NJ;IgFa!ra}mnOIR2}9ZK zG`XCI?_6%A&KlJQ!=|W0y8RvPlLoX;GONwg$YrB~u8%|YU&n-q@(gnHyYtru-Th;D zZSm{w4H2F<8xTI5n;yJ15p8vC-PN?Mm6SaLZ9A`Fv2FSeTC?Z(6KCv#K1kZgz@JV` z12p#fgI6(+jf!W%ljLd%Tw0GPJJ02x`Q|@vhFi;-fNZy!E1g4awW&!yPUSTG-WPc* z{dltDt)}}@dHwr2v5(aI!vZD02qe8a(4n1&5-Fb!Vtx_|Muuf_V#d93_`?PVdf7?r z;TCqSKjO^MZ=wYxpZCpQ#oRwvp0Y`jnpANci?{KEeJx|N`j+uIcTodHUB2rBG`&r2 z(Jqa(JPfyaFEBtD5XAMmzduS?)ggLb0#PZR1DuVW2W>f4cTmLeqr(RwZ5^Fhbhu{MV7c*H>kp*uLvr#BP&bCm#d3e=cl>=5KteZ5 zHTpuV?vk$z?B7NY4vg?>77OxKMA>?8V3eyH@r@NGz6z)pKCF}|OtLN|J(QUp`HYV} zme?4WY(XHCmo_vs9F_+;dd(WAGFr;p+q=l>?ai!4J89{sCr+HO+cm9j@3B$sjA_j2 z*tuE;<~~E}!-m#I0m>1$Z;V?aJdwe?h;U*!0UT&5Yb`!O$Xtb6Mm*=VT zb0I!ydv`JaTZ%zz zmAmWo4@A2FNIeSfXrYSo0+qCdTm8EQml`Al*MUJAHLisJ@3?_m;Q0V0s_p{%VIH&D z%nsf$>7|s)7@9llvb4m?+2?JJHPmb5%A>x0y07W7mKEt4l429q^|)bkzsXd&XwyyIU-VkXqy0vD!b_}*Wq{G{iNZ~$ zJ<1q6|Dl$fn>h1d0N#AhiJbYKCC!VJz?DJf2G+aDo*F~$-PE2MMfXR^mpdP2uZ$4jDs zqZ^I>(pL$4hq;)r4m;GGw+0Khs8^EXwwFJP?r=XhPz|C!V=PJ5w<^9$6W8DEz6|X< zKoF$<>%q(4LfAZQ`jWtA!`7Az4yt1BQP#INVN>09YmsKJu{LJTL;PrSf8P=n6Z80_ zr4w^aZ$yu`)_<@_)HVjPuthN%BeCM%f#4>tvPMd}vn>c#x^~5sOj~;~q4(-iy*cfd zM{gy+93P%p#Dxg0S}M6C;^s(*cy^9CNg`IXl9s)v%6=_KW1)PRnk=Hv85+9)@!mhu!GZKG{QY-$tqEGb}r!M=>}qmiM{ZCkM=ev$0Nie z!`r_K1;iJ8lOMl0yIf`aq)crajmz1Qw7Rl~nk3wE5dGmcc0iAj36aXO0{x=!^RBfO z@gjn)HC|bMdAX|=w2WpNhs7pQsTI0z?d)w-li=G+T*?n|Hi*2;9NI_nK zw)m=XS?&iRQ*%X`N+p7D5_z7gYhrqwh+YpJpsE3z##?jsz>_WaH=CBSs-h3AVH1b!67&Xu&gO+a*#QKduIks(2}W zPz|w~;AzKJHnkl&$NiMVQ8Ag0ZHHX^<61YHW5cfh*z?-=XU?Zcvu;@(pHU5x`cgs% z_qgZxazULHyS9YT3TSRPJ~pQIL^=MAqD!xLNfJIvkd*M>7fwX5C7g>u1GMoucDWV~Pf!l1B=* zwpM8bRy0(P-on-gdI<#yhGPp8ON*K@JSg(Iy&m; z*V|Y^s~i~|B(d;;1&%`-2NpMuyFc9z1&0Jbm%ftv!+VszCl%PaBi#JREvJpi*9Mr? zy{C-qMR{Td@@8ZV4Kn(A8)q4HjO$~L^G0N0H7|||3Lf?-DE4+PE;W^e=vrhHiF1J0 zd7)#^cJH58tQQO9SA#fCy@BTF51DPf%@TJA7Qt4?G>*0IE_)6_RTZ{UMcKAAu5)Fe zgQk7_S&0+2deL4dx9W+r@3VgXo0C-`wI!uQhDo?}D5pF-neaaoLiLNd?Y!%O;kOC=YXT{y;Y}*A7=Miq2iyOaH93 zV{B?sz}DEfTB#D?md$&caN^Y8;cyFcUr>r-dvqann8E|Mk)?n|N{Zk^zX zxpU`+Pl+b>h(!RzD-*|Kz-dS`s64T;L)ty%`zz;rCGFjc#y zocbSC>0f`PGi2ADuqd31Y1kBu$c-Z~peSzhK4 zs{R86NiF@Tfq%bwYAeaNS_OvMIkvI;8uDCW<*=1CJH+d0w^vlqgU{NIB4~Pbb{s@2 z1gsu!;Z0UH?sv>R-iZaIk118O=WvJ$c7L_pkb};i6yO^f=q<9w);D3R0$}lR=MzP; zdg*FO36`+F0;Y0`L?nzD75)ssn&oSYN={V|tkxDDvU%-w9TMO=>?0p>PtFWff1)@^ z&XoS(3wG2$X*_xlTu*jsUvI0#e(0I<+1Q84RW}4!Yy(Rdpmr zpW7vqS1956=T!&e_cbE=kKQ=7S7kiF-f`WYJ8M@__*Z=s0+8c`%hov zQuVa@gx9i~dT|Htr-HKe{t;T#Dt5BUew=9OaQ9f7D+q z$~2;S)=IAH;7)Jf%7i1CE%C=~+_8$Xj{TReY+O9t#`d|MXIbc++;0vzZaB4TDta9y z1!%~egJ=;>L$-&lPGxY=2cp<)VbiW(u~q^(;0FuD*>E^LsFgC*rWDDJO@T5f4=Y3M zaI3wwaN(YTs=VBIN<)PiHmtAvG5|A)^9Mm|M)5xcto+^Ch9Z`-S^y7mP&4YD&3O$M z-*8Nx0{T%D@aAoN3?R1_31g4wJ=zf|3j79SH|xfZU%?!6HxQ7=JQ1i)<9kNzYq#-N zERj(h-1J2Lr3B{}cv$4*i*SlfF04kswn%KPSoalmq$~n>xMoTI~Ag9+YdwRR#|ZNioEP@h2JemLB9DwkB{yW>MB zvJ7Zu49^OgDYx>K)#-fo$=sa}$FSlJQWX|}H%$u|wu^9Kts3(6mGl8gvEG=L^d9J) za3Dtwlru9kkIY_>x$Zg{!IHg70`5vbm!5|$4^hqes#bsJW z!zsg6UZth-Z;>vicCDy5)!CucJ?s^$n|}^NG9T(g$(NXOr@9`qdl;D13;ueaNHDNd zbVQK@8CxYZia#{!oh5p2y&F>sdvN2*_kuPHzXJCFgbKMFSUoCwdZx|I+H}{Jm}GN_i@D@c zfCE*jH%I}A0uIxfz~A~lmHy&&7tsRB8|Re;AZuW^wPKL0H33qeqn-hxl!@Wv29oYGfVbd@!sahnvMqrhlpxhINbhL9yj=1Y zpxeG4PnGdN=XHM-^QMHDZl+Bt6TugHX!rtr*UsX3(gDK7CW*w>d^fnVf9>pbVyR9; zOg}S$`3t@lCFkwz9IjYV(VpFy@?@^CAjjAN+A{c#EPY!Sd%V{SK33N}B+g_UlNiM@ z^wJw*V4*kx7kJ=tis=~D{8n9q(mx$t@l+`V|L__LpurkrFyptwGe0SIx~pjGR!2Ha zfg!-4MnBRE#Q+Q1rzEGyV+86iR1R5lDPT|*V(SSunUWLJ{|U6B{27Rwo?_P(5?wjV4F*pVLsT`<_Nne>9q8s z0fE^9d^~X*XoPokbfWEk>d!oc>SD0~kU94LHAXI+?kgr4I7eoMt#|FrW$Tj%O87&n zIrk{z)!&F4p1K-r>DTo-?$>%VVZCj(Tu%Po&0zWkSh6F74YU%CPBNm@eb9+ zH}1-#MI+$wj;##rc*mvkLc_lem@QSEWn>)qO}9BWS%%AU0}?S#7T?WEWxYs!(nE*~ z`I#DGhw~}f@>@AZAgsxxP+u*E%66vo?ArptmA0!rYws@L8;_3Tq(=k<1iA@{kdUOT zAGHs6Rbso(f%}TJ5dhtfj3+tg5U*I4*I*w}IUl<0RfAt@u#7wDm}HcvtF;6lRabzl zYZ@>awub&{4Y6~9=n=a!)vRX+%P)95Yk!MB&9SX(WW?|0=7yaCZd2Pj@SP92`O+V> zAg+R_N6C3pY}f5xm(t~6lAkR!F95s00Xa%vINg--MHOs`jT!EFB{D!@*R|{LB|~;b z0lAfjx0iIxo+(A1O?*RscIFaAd?%aGZ}11ilfN5KEK1z{6ogHZR=!~5dV?MB5mHC8 z(U|5$uY`W{8^3Br;h(wtZGA6*i2BUT%({FZwvD;vQ0HfyV{R38>4pi{#uSF{v^T*o z^i|Kk#8tRt?s%L&p7!5^LVvfr?{QG2WK|v80nF=hJ6U`8B#NQ;O3TPiLz4{IJU8@W zMypjU@*x&hF=?5SgQOtv%_;I2Rg(>2gn1qyr{VEu8(MP9iW~!OD?lHBPA=qod&${5 zAIP&WnG!V_(7xa4O$$Tx9ID8Q0;hwv^PyX_iXoQV6|d!Xy@j_c6!3KDTvbayvJsy^ zS|_W>BZu}{#;x$R$&qm8T0tNw#1#@4Uy)ygKgd+-?q_DK%4)EBEQwX5NnB?@0byP0A_-|SSc&sc2CSf3cZ9dw|W`D{nrI64#aGEi_|j$4VphFY+lEJbnd z^ree3c*g}`p+%UL-<}VLUsm;nmv?LcKQZE>K?+xwMMRyH)UJrWnb_g_?ib3Rh{wM} zG=Ii2O-+f@LlEp)bXVQ#l#M6v6=N;w0vDM1^nerv}!o2hW$oAWX@pixH3o=Wc zlp0&<(l1fW11rGM%4yiR#)%|d3Lz7(SvK_Belc4HL^Clxg&M!E{onx?;16wzG#0ZD z(b!Q#tg5EnYc`TALHq5I==)A!cWb@@5`ikqo?P1X_$Q2@MN3oZnfc=J`pom_<<{Js zKO`;?xcP{i!cdt3Ww?@uzU#cH0Dj+kb z87F25kq}II+w|Su;i^o3zdc>5Ue)B7*YwA z_ECV5FU)R$|F3yrtd%kkT(+${lB9;pUEwA9SV5T_>Lj2{{O`Agb-WdM8X3-i__N^*T zhf4ZD1iQiq3?e-iEo^72B(bSEvO7thLSV86Ph#=TR-BkvV_gC*lQ_`5HbhvCwZsO! zW-AtYTHwlfPhFzirWHCBE)K;%y+yUX=rSPKCOvu$TEaRY!_d4_cA<$AJA{!G4owE* zUoD+JE23VXfm!Bd=CgfkP=CG#jCfHVnG{Nyb^VAE8o%m3#G5s!^wFGVx|a$8Z{C3Q zO$=*-*#cHZCeTl(RO4UyfQ_b7-Ad97_&i{JL9bT({{7L4&tF5S{qVmK;PqaoTucV3 z+Lx7OZoJ#4bZ-2SB_AIj?4;pFwg%FsIK5_bOo(XCY%~O>Nl1O_Q^3mVURWu)v9x+w zU_So-qs1AGZ7|)TBUnCq+Dm>92}0rix5+=u8Jo{e1qXSf%0C@^@#Ou3vjG_&4;E`& zGW2ZUaa*0%OnIsC(|~5sz$Bv$Y{&a43nMq3BO3`kF|FV%PC?F!(94;ypNXo*=vI6= zde*5+S;J+hUdg%z_w+xE2#i5Wh6fp1~qb5{!UvBf~EqfU3oUz$sFmXlGvD8s7dTsX+7sAzu zuYTnDtd0`Hr9!TxN>?R`k%2dkIy8p<^DJ30fjLIzF9==792s80U00gQ7A&OtnI-%j zBLN0@$$l>8NY<4glUzS9Jrf{_^m9bixqnr+XAmh(xO#<%4N7o0-*~PKPbGhz*o)rj zdYtD-o@}z*>3w6@{xRqL6$daR_ZZln5t;jf&<*~5b_`@tTr_FNvH4-j3^BIA>W1>$3Gds29k zy~d{>wztWF$x25FH(zuKXJlX!*kVmiLiC1_6TcVWCJ{df-5NM*iVMr-cw6iwAUy~7 zb*}IvnmyMcwkF79SpPm*{y8X#oT-t|84ml6`ItrQ%!_KJ27-FH#rNSF~c^VMZT zPDqUqpCJ=huQ;2y+J=i^wl@oI+j2OB0?7-3glXVFDVAU7hzdm+3W%m@(Dbb9{{!$+ z$+mv8055saBC@eKQ@^6p|0gKSo_kOm#T6NJ2!P4KyMxK#?EQWDj<@@tL%3k|A*C`k zjbDq-Rdf6z-6@kH=+tj5$HiSnBAjV&!4D9&(PuXh(v^L8vMU2|DxiCoU{WQG-ItNl zqu?g|kdlAI2@GbUf>@4u9%_8_=07_AKNJY{)3I2E?Yks9v7zjN7$#m}LLYcUa&j&) zn1&p&TUFJ+*Mx5slyED-d0Eiw``|Bu8r9=eA6&eof@J9=z7L$Bvr`$1Bfeb=@S<@g z(+epUa0OC|3il9!_1Po7ULfc+#(5}iJ6acrwz@ayoecp)V{trdrzPlRbkCks!8O;j znwszne0M4?vvj?z!ZhmS7}Vd*aptO8MmPUa!eAE_FZFQWIh6=0|1j*FM|$2NhlnNFF+OvJbsUMM^4BYc)kOj*1uXIwO|OCEo-*6$hkcn!bn{50kum>e z9c{(dkfo&+RUeb;=C)b!OhwO(GWJdzn;FWYH=o=(6DG;~g}z%+fjzq+)M1Z(b)R1s zcf_(E83B|I$fM=-s<2D_yrP+kCAZ<`e-t>ID@O;xii;Po3=%AdYhlZ^rZ+QNdizsE zxDhp|3Aj&p-o-t3ICkL=2ho693b|at_y}{|NIA|KsvhbHV{V$wy<~wd5Qjk4zZq;8 zAh+{GmJ5xEUhmr}E#x4u*VVAu&9Cpt=-v)d;8&F~77o8gkTWVoe`<(+uLtPxF$MM+8iLZh zeohH@SB7ur0#>6I(juBa!aLtC7ipjzd%9o_HcSCGSNfCPi2l{IY~tthL*y#3-a=za zNwj+rBP<7s{&*BuJ@>16;nMn3f$xKcEiL?!^zLQe^I8?Arga5)zVCkKdI{^I4FqT~NzmR_ z*TvdcK?#vArlh(4^F>^W($bbUHo#QOqYyc#VXu0PCcv5QT56r22Zj`f*7#Dijjx{j zOe;YTx+MlYkc#?rmHvadq!-}~?WaJ?WFaN%T0|_xbmx=lh)! zqCQ@a#$FA@7tXohN>kM!fLDT6Rb*q(UXJ#WF1BKMsQoYoPaJl~<(Wrhd2}v$B*L>= zYLIJgmWPk1U-WO6h<~oxFH+!c1f@WaeByxZ#wYHl)xjeXFV#sWy~8{5ouU(yg{rdh zRN{HBr7aiH-!vhe(t%&WCRi70Vl`1Aa@FM<5ml|GaLFLL((td-GfF1U?pd|QO*YE= z{QveDyg{GgJ>3d`@M*Pmdm9}s@CGJ|hLJhR6fEkyCa;iSNyyCs&BgR0t`T?@r84Ki z!phL6)7RWE#=3B{*~{#3rna!yL} zBcTV{=c9VEbiKS0u`G@V4`2by5pNtP9mrA%;789;liVj?c6}UxGl%1;KqbxMv7iH; z*Fej0rt6ziJ_aD<8KA+Y?sm#hGlQ>}Pl=lk_mFcSYf4JsnznU|C6wVOucfM$sZM}w z_L$NKRZH=Y7}12-DmSfY{sf7JFyBAvZSfKs=nWIsNEKt_k~e`Y{j0bB;G@EM5Dm zY?3+??@!U9PhjCKZAa#{-syvC{`zfdXIU0}_G~ZkITiIFccgLXS#i_!R}RaxN3*}8 z$5s4^p4B;bMu)tVW-CRd6=}XBlB<5(V06j({58-CdQNA5Z8Pd|r+&!gTkpKmmiqAA zUj2rD=^IT+%R zT)s@4AL_zD5W>a`N`b+^CRP3;Wu=ULrP71LxtbSkqp`q_tty)fpsR4pGfD5O$ntxH z!u&nM^v`Sa*QeJy?92=-9XykbRnV)!m7h<@gC>}7d8Ch#9QjrjA`c1!8lZYk26(ZlrHN#r;RlG_R->z@&aXT8MVOBuE(aReT*jQRqOAE z?{;Rbzy;44NL1UWf8g%LAnsq;)mVAk=*^2Et#4;K&*n7z*;{zQwz_*hSnV)ihE*dl8+SO87{Ty>AjZuf22sN($hGFbku{DH#le^b5KwND97_PPD zSoxBeE{D*N{lbpL1<=*H9gj~0m`Ta31kB~2r>EyA7|||{1`~zOE>0iwcJ2L*mMQSx zO!^@d)gErDW5RE(ba^ANin(r<-e?tp5(K-I(H|^ef(GCbU}|VpI#i&!7!904_}H96 z1YYNa$R59PhKSQ24g)29c^18bg9|cF$`2f}LEOUdn6mtOWMxL}9^9kK)re7{X)YFd zGS5e;ghuB~?W3u5ua{5I4Q`R1CKqF|_}16*k4FP1 zi>Lajlg;7oJ+&PmB6bvD(^$P>^Xc9kzf&|2*Gxq^xVYY~h>-C5L5s*Q{64F^U%Qxl z)&mhmNl*=%{>x|Hw@b3=a1ik=c=yAANX0G_axbB~&f4gtcg<+~dKr+^O7ypfB zU@%|>?6DR=Fp*b}-4`!#Bws-QP5(A^n%$WiCvb)8Eb|ORZ~==b120rZ_7jj`d8ZoK z!G+L$-_r0Op^k5>CkWSt^%OD7$OCeG3`~0eJi+p%nr?Fsp7x8cUs7w+><(B~n&xea zTF_|+1bhX!;V`t{Vg^yM#7)1^Df)tuLx;G#qTVM$U+?8s#(G9)N5{~9G$#TDG+=GE zKZXD8HQLs~#*urHRZ0+VOsCs~H@ty`&pj<0lc*a8RFMh%GDTa05;N>T_!o zE5o8sQ}6!4XjhPv6G;Wr>1@SS$OceoE>Q!z0o+{%y026`-lU@G1z(>R^KG0;QfJa~ zbapQ78+7@^Fl6tYPsK}JQ$V+)U)@=@yi0M~IIGMChGSm=u8 ziYN9Pdyk1%s9!h*)DB&POY{dN-Ccugl7jKg$0dC4N=0Le{8#6x+M`Pn1b@t?{UILs zYw%J;GD&N$r6=S!3+?EN|7O@-Sp{yKc4W4qvbit;Sk*Yd#g|{pfEbO(czs*KkLG9| z5Kuj6v5G_@VK!xP5?$TnkID6P@P8Qd>yKBbD^UwT} z4qHL(kM|)ymFt<7fu^2~G4XjNkoDfpXr5{7kWB0!ke0?}HtJ>R)AVgi6E=>YklE-P zGCSsisZ@#OkJX^R>B8&)W`z2^R&MΞq5do#Bt2oGaCD+}J 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%0D#zn)OxWGPfd`~NKu}qwuY+QxSFe~Q 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 azx>B`$x#z|(S6{LisEgB{NEou`F{Y4>Eq@A diff --git a/docs/installation.rst b/docs/installation.rst index 6d32c070188db..3db48e45ddf40 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -19,6 +19,9 @@ You can also install Airflow with support for extra features like ``s3`` or ``po .. note:: GPL dependency One of the dependencies of Apache Airflow by default pulls in a GPL library ('unidecode'). + + If you are not concerned about the GPL dependency, export the following environment variable prior to installing airflow: ``export AIRFLOW_GPL_UNIDECODE=yes``. + In case this is a concern you can force a non GPL library by issuing ``export SLUGIFY_USES_TEXT_UNIDECODE=yes`` and then proceed with the normal installation. Please note that this needs to be specified at every upgrade. Also note that if `unidecode` @@ -68,7 +71,7 @@ Here's the list of the subpackages and what they enable: +---------------+----------------------------------------------+-------------------------------------------------+ | jdbc | ``pip install apache-airflow[jdbc]`` | JDBC hooks and operators | +---------------+----------------------------------------------+-------------------------------------------------+ -| kerbero s | ``pip install apache-airflow[kerberos]`` | Kerberos integration for Kerberized Hadoop | +| kerberos | ``pip install apache-airflow[kerberos]`` | Kerberos integration for Kerberized Hadoop | +---------------+----------------------------------------------+-------------------------------------------------+ | ldap | ``pip install apache-airflow[ldap]`` | LDAP authentication for users | +---------------+----------------------------------------------+-------------------------------------------------+ diff --git a/docs/integration.rst b/docs/integration.rst index 4c513bf26db1c..6ef7bd8398705 100644 --- a/docs/integration.rst +++ b/docs/integration.rst @@ -6,6 +6,7 @@ Integration - :ref:`AWS` - :ref:`Databricks` - :ref:`GCP` +- :ref:`Qubole` .. _ReverseProxy: @@ -64,6 +65,15 @@ Your reverse proxy (ex: nginx) should be configured as follow: } } +To ensure that Airflow generates URLs with the correct scheme when +running behind a TLS-terminating proxy, you should configure the proxy +to set the `X-Forwarded-Proto` header, and enable the `ProxyFix` +middleware in your `airflow.cfg`:: + + enable_proxy_fix = True + +Note: you should only enable the `ProxyFix` middleware when running +Airflow behind a trusted proxy (AWS ELB, nginx, etc.). .. _Azure: @@ -350,6 +360,7 @@ BigQuery Operators - :ref:`BigQueryCreateEmptyTableOperator` : Creates a new, empty table in the specified BigQuery dataset optionally with schema. - :ref:`BigQueryCreateExternalTableOperator` : Creates a new, external table in the dataset with the data in Google Cloud Storage. - :ref:`BigQueryDeleteDatasetOperator` : Deletes an existing BigQuery dataset. +- :ref:`BigQueryCreateEmptyDatasetOperator` : Creates an empty BigQuery dataset. - :ref:`BigQueryOperator` : Executes BigQuery SQL queries in a specific BigQuery database. - :ref:`BigQueryToBigQueryOperator` : Copy a BigQuery table to another BigQuery table. - :ref:`BigQueryToCloudStorageOperator` : Transfers a BigQuery table to a Google Cloud Storage bucket @@ -404,6 +415,13 @@ BigQueryDeleteDatasetOperator .. autoclass:: airflow.contrib.operators.bigquery_operator.BigQueryDeleteDatasetOperator +.. _BigQueryCreateEmptyDatasetOperator: + +BigQueryCreateEmptyDatasetOperator +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: airflow.contrib.operators.bigquery_operator.BigQueryCreateEmptyDatasetOperator + .. _BigQueryOperator: BigQueryOperator @@ -440,6 +458,40 @@ BigQueryHook :members: +Cloud Functions +''''''''''''''' + +Cloud Functions Operators +""""""""""""""""""""""""" + +- :ref:`GcfFunctionDeployOperator` : deploy Google Cloud Function to the cloud. +- :ref:`GcfFunctionDeleteOperator` : delete Google Cloud Function in the cloud. + +.. autoclass:: airflow.contrib.operators.gcp_operator.GCP + +.. _GcfFunctionDeployOperator: + +GcfFunctionDeployOperator +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: airflow.contrib.operators.gcp_function_operator.GcfFunctionDeployOperator + + +.. _GcfFunctionDeleteOperator: + +GcfFunctionDeleteOperator +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: airflow.contrib.operators.gcp_function_operator.GcfFunctionDeleteOperator + + +Cloud Functions Hook +"""""""""""""""""""" + +.. autoclass:: airflow.contrib.hooks.gcp_function_hook.GcfHook + :members: + + Cloud DataFlow '''''''''''''' @@ -787,3 +839,28 @@ Google Kubernetes Engine Hook .. autoclass:: airflow.contrib.hooks.gcp_container_hook.GKEClusterHook :members: + + +.. _Qubole: + +Qubole +------ + +Apache Airflow has a native operator and hooks to talk to `Qubole `__, +which lets you submit your big data jobs directly to Qubole from Apache Airflow. + +QuboleOperator +'''''''''''''' + +.. autoclass:: airflow.contrib.operators.qubole_operator.QuboleOperator + +QubolePartitionSensor +''''''''''''''''''''' + +.. autoclass:: airflow.contrib.sensors.qubole_sensor.QubolePartitionSensor + + +QuboleFileSensor +'''''''''''''''' + +.. autoclass:: airflow.contrib.sensors.qubole_sensor.QuboleFileSensor diff --git a/docs/kubernetes.rst b/docs/kubernetes.rst index a4916858fc15e..8a4cea5a733f5 100644 --- a/docs/kubernetes.rst +++ b/docs/kubernetes.rst @@ -4,7 +4,8 @@ Kubernetes Executor The kubernetes executor is introduced in Apache Airflow 1.10.0. The Kubernetes executor will create a new pod for every task instance. Example helm charts are available at `scripts/ci/kubernetes/kube/{airflow,volumes,postgres}.yaml` in the source distribution. The volumes are optional and depend on your configuration. There are two volumes available: -- Dags: by storing all the dags onto the persistent disks, all the workers can read the dags from there. Another option is using git-sync, before starting the container, a git pull of the dags repository will be performed and used throughout the lifecycle of the pod/ + +- Dags: by storing all the dags onto the persistent disks, all the workers can read the dags from there. Another option is using git-sync, before starting the container, a git pull of the dags repository will be performed and used throughout the lifecycle of the pod. - Logs: by storing the logs onto a persistent disk, all the logs will be available for all the workers and the webserver itself. If you don't configure this, the logs will be lost after the worker pods shuts down. Another option is to use S3/GCS/etc to store the logs. @@ -87,11 +88,13 @@ Kubernetes Operator arguments=["echo", "10"], labels={"foo": "bar"}, secrets=[secret_file,secret_env] - volume=[volume], + volumes=[volume], volume_mounts=[volume_mount] name="test", task_id="task", - affinity=affinity + affinity=affinity, + is_delete_operator_pod=True, + hostnetwork=False ) diff --git a/docs/profiling.rst b/docs/profiling.rst index 09102334b1c29..37608127aea66 100644 --- a/docs/profiling.rst +++ b/docs/profiling.rst @@ -1,6 +1,12 @@ +.. TODO: This section would be removed after we migrate to www_rbac completely. + Data Profiling ============== +.. note:: + ``Adhoc Queries`` and ``Charts`` are no longer supported in the new FAB-based webserver + and UI, due to security concerns. + Part of being productive with data is having the right weapons to profile the data you are working with. Airflow provides a simple query interface to write SQL and get results quickly, and a charting application diff --git a/docs/scheduler.rst b/docs/scheduler.rst index 3e895898fceb2..9c5cb5c90c166 100644 --- a/docs/scheduler.rst +++ b/docs/scheduler.rst @@ -63,6 +63,8 @@ use one of these cron "preset": | ``@yearly`` | Run once a year at midnight of January 1 | ``0 0 1 1 *`` | +--------------+----------------------------------------------------------------+---------------+ +**Note**: Use ``schedule_interval=None`` and not ``schedule_interval='None'`` when +you don't want to schedule your DAG. Your DAG will be instantiated for each schedule, while creating a ``DAG Run`` entry for each schedule. @@ -94,7 +96,7 @@ interval series. """ Code that goes along with the Airflow tutorial located at: - https://github.com/airbnb/airflow/blob/master/airflow/example_dags/tutorial.py + https://github.com/apache/incubator-airflow/blob/master/airflow/example_dags/tutorial.py """ from airflow import DAG from airflow.operators.bash_operator import BashOperator @@ -109,11 +111,15 @@ interval series. 'email_on_failure': False, 'email_on_retry': False, 'retries': 1, - 'retry_delay': timedelta(minutes=5), - 'schedule_interval': '@hourly', + 'retry_delay': timedelta(minutes=5) } - dag = DAG('tutorial', catchup=False, default_args=default_args) + dag = DAG( + 'tutorial', + default_args=default_args, + description='A simple tutorial DAG', + schedule_interval='@hourly', + catchup=False) In the example above, if the DAG is picked up by the scheduler daemon on 2016-01-02 at 6 AM, (or from the command line), a single DAG Run will be created, with an ``execution_date`` of 2016-01-01, and the next diff --git a/docs/security.rst b/docs/security.rst index 253587afb1b2b..9f6740d041ce0 100644 --- a/docs/security.rst +++ b/docs/security.rst @@ -10,15 +10,26 @@ backends or creating your own. Be sure to checkout :doc:`api` for securing the API. +.. note:: + + Airflow uses the config parser of Python. This config parser interpolates '%'-signs. + Make sure not to have those in your passwords if they do not make sense, otherwise + Airflow might leak these passwords on a config parser exception to a log. + Web Authentication ------------------ Password '''''''' +.. note:: + + This is for flask-admin based web UI only. If you are using FAB-based web UI with RBAC feature, + please use command line interface ``airflow users --create`` to create accounts, or do that in the FAB-based UI itself. + One of the simplest mechanisms for authentication is requiring users to specify a password before logging in. Password authentication requires the used of the ``password`` subpackage in your requirements file. Password hashing -uses bcrypt before storing passwords. +uses ``bcrypt`` before storing passwords. .. code-block:: bash @@ -337,10 +348,10 @@ certs and keys. .. code-block:: bash [celery] - CELERY_SSL_ACTIVE = True - CELERY_SSL_KEY = - CELERY_SSL_CERT = - CELERY_SSL_CACERT = + ssl_active = True + ssl_key = + ssl_cert = + ssl_cacert = Impersonation ------------- diff --git a/docs/timezone.rst b/docs/timezone.rst index 9e8598e2ed464..2c6f30fd39e51 100644 --- a/docs/timezone.rst +++ b/docs/timezone.rst @@ -2,23 +2,23 @@ Time zones ========== Support for time zones is enabled by default. Airflow stores datetime information in UTC internally and in the database. -It allows you to run your DAGs with time zone dependent schedules. At the moment Airflow does not convert them to the -end user’s time zone in the user interface. There it will always be displayed in UTC. Also templates used in Operators +It allows you to run your DAGs with time zone dependent schedules. At the moment Airflow does not convert them to the +end user’s time zone in the user interface. There it will always be displayed in UTC. Also templates used in Operators are not converted. Time zone information is exposed and it is up to the writer of DAG what do with it. -This is handy if your users live in more than one time zone and you want to display datetime information according to +This is handy if your users live in more than one time zone and you want to display datetime information according to each user’s wall clock. -Even if you are running Airflow in only one time zone it is still good practice to store data in UTC in your database -(also before Airflow became time zone aware this was also to recommended or even required setup). The main reason is -Daylight Saving Time (DST). Many countries have a system of DST, where clocks are moved forward in spring and backward -in autumn. If you’re working in local time, you’re likely to encounter errors twice a year, when the transitions -happen. (The pendulum and pytz documentation discusses these issues in greater detail.) This probably doesn’t matter -for a simple DAG, but it’s a problem if you are in, for example, financial services where you have end of day -deadlines to meet. +Even if you are running Airflow in only one time zone it is still good practice to store data in UTC in your database +(also before Airflow became time zone aware this was also to recommended or even required setup). The main reason is +Daylight Saving Time (DST). Many countries have a system of DST, where clocks are moved forward in spring and backward +in autumn. If you’re working in local time, you’re likely to encounter errors twice a year, when the transitions +happen. (The pendulum and pytz documentation discusses these issues in greater detail.) This probably doesn’t matter +for a simple DAG, but it’s a problem if you are in, for example, financial services where you have end of day +deadlines to meet. -The time zone is set in `airflow.cfg`. By default it is set to utc, but you change it to use the system’s settings or -an arbitrary IANA time zone, e.g. `Europe/Amsterdam`. It is dependent on `pendulum`, which is more accurate than `pytz`. +The time zone is set in `airflow.cfg`. By default it is set to utc, but you change it to use the system’s settings or +an arbitrary IANA time zone, e.g. `Europe/Amsterdam`. It is dependent on `pendulum`, which is more accurate than `pytz`. Pendulum is installed when you install Airflow. Please note that the Web UI currently only runs in UTC. @@ -28,8 +28,8 @@ Concepts Naïve and aware datetime objects '''''''''''''''''''''''''''''''' -Python’s datetime.datetime objects have a tzinfo attribute that can be used to store time zone information, -represented as an instance of a subclass of datetime.tzinfo. When this attribute is set and describes an offset, +Python’s datetime.datetime objects have a tzinfo attribute that can be used to store time zone information, +represented as an instance of a subclass of datetime.tzinfo. When this attribute is set and describes an offset, a datetime object is aware. Otherwise, it’s naive. You can use timezone.is_aware() and timezone.is_naive() to determine whether datetimes are aware or naive. @@ -39,7 +39,7 @@ Because Airflow uses time-zone-aware datetime objects. If your code creates date .. code:: python from airflow.utils import timezone - + now = timezone.utcnow() a_date = timezone.datetime(2017,1,1) @@ -49,9 +49,9 @@ Interpretation of naive datetime objects Although Airflow operates fully time zone aware, it still accepts naive date time objects for `start_dates` and `end_dates` in your DAG definitions. This is mostly in order to preserve backwards compatibility. In -case a naive `start_date` or `end_date` is encountered the default time zone is applied. It is applied +case a naive `start_date` or `end_date` is encountered the default time zone is applied. It is applied in such a way that it is assumed that the naive date time is already in the default time zone. In other -words if you have a default time zone setting of `Europe/Amsterdam` and create a naive datetime `start_date` of +words if you have a default time zone setting of `Europe/Amsterdam` and create a naive datetime `start_date` of `datetime(2017,1,1)` it is assumed to be a `start_date` of Jan 1, 2017 Amsterdam time. .. code:: python @@ -65,16 +65,16 @@ words if you have a default time zone setting of `Europe/Amsterdam` and create a op = DummyOperator(task_id='dummy', dag=dag) print(op.owner) # Airflow -Unfortunately, during DST transitions, some datetimes don’t exist or are ambiguous. -In such situations, pendulum raises an exception. That’s why you should always create aware +Unfortunately, during DST transitions, some datetimes don’t exist or are ambiguous. +In such situations, pendulum raises an exception. That’s why you should always create aware datetime objects when time zone support is enabled. -In practice, this is rarely an issue. Airflow gives you aware datetime objects in the models and DAGs, and most often, -new datetime objects are created from existing ones through timedelta arithmetic. The only datetime that’s often +In practice, this is rarely an issue. Airflow gives you aware datetime objects in the models and DAGs, and most often, +new datetime objects are created from existing ones through timedelta arithmetic. The only datetime that’s often created in application code is the current time, and timezone.utcnow() automatically does the right thing. -Default time zone +Default time zone ''''''''''''''''' The default time zone is the time zone defined by the `default_timezone` setting under `[core]`. If @@ -92,15 +92,15 @@ it is therefore important to make sure this setting is equal on all Airflow node Time zone aware DAGs -------------------- -Creating a time zone aware DAG is quite simple. Just make sure to supply a time zone aware `start_date`. It is +Creating a time zone aware DAG is quite simple. Just make sure to supply a time zone aware `start_date`. It is recommended to use `pendulum` for this, but `pytz` (to be installed manually) can also be used for this. .. code:: python import pendulum - + local_tz = pendulum.timezone("Europe/Amsterdam") - + default_args=dict( start_date=datetime(2016, 1, 1, tzinfo=local_tz), owner='Airflow' @@ -110,18 +110,21 @@ recommended to use `pendulum` for this, but `pytz` (to be installed manually) ca op = DummyOperator(task_id='dummy', dag=dag) print(dag.timezone) # - +Please note that while it is possible to set a `start_date` and `end_date` for Tasks always the DAG timezone +or global timezone (in that order) will be used to calculate the next execution date. Upon first encounter +the start date or end date will be converted to UTC using the timezone associated with start_date or end_date, +then for calculations this timezone information will be disregarded. Templates ''''''''' -Airflow returns time zone aware datetimes in templates, but does not convert them to local time so they remain in UTC. +Airflow returns time zone aware datetimes in templates, but does not convert them to local time so they remain in UTC. It is left up to the DAG to handle this. .. code:: python import pendulum - + local_tz = pendulum.timezone("Europe/Amsterdam") local_tz.convert(execution_date) @@ -129,15 +132,15 @@ It is left up to the DAG to handle this. Cron schedules '''''''''''''' -In case you set a cron schedule, Airflow assumes you will always want to run at the exact same time. It will -then ignore day light savings time. Thus, if you have a schedule that says -run at end of interval every day at 08:00 GMT+1 it will always run end of interval 08:00 GMT+1, -regardless if day light savings time is in place. +In case you set a cron schedule, Airflow assumes you will always want to run at the exact same time. It will +then ignore day light savings time. Thus, if you have a schedule that says +run at the end of interval every day at 08:00 GMT+1 it will always run at the end of interval 08:00 GMT+1, +regardless if day light savings time is in place. Time deltas ''''''''''' For schedules with time deltas Airflow assumes you always will want to run with the specified interval. So if you -specify a timedelta(hours=2) you will always want to run to hours later. In this case day light savings time will +specify a timedelta(hours=2) you will always want to run two hours later. In this case day light savings time will be taken into account. diff --git a/docs/tutorial.rst b/docs/tutorial.rst index 1c2dfd69b7c41..0ea58d2784e65 100644 --- a/docs/tutorial.rst +++ b/docs/tutorial.rst @@ -37,7 +37,7 @@ complicated, a line by line explanation follows below. # 'end_date': datetime(2016, 1, 1), } - dag = DAG('tutorial', default_args=default_args) + dag = DAG('tutorial', default_args=default_args, schedule_interval=timedelta(days=1)) # t1, t2 and t3 are examples of tasks created by instantiating operators t1 = BashOperator( @@ -147,7 +147,7 @@ define a ``schedule_interval`` of 1 day for the DAG. .. code:: python dag = DAG( - 'tutorial', default_args=default_args, schedule_interval=timedelta(1)) + 'tutorial', default_args=default_args, schedule_interval=timedelta(days=1)) Tasks ----- @@ -277,8 +277,8 @@ something like this: .. code:: python """ - Code that goes along with the Airflow located at: - http://airflow.readthedocs.org/en/latest/tutorial.html + Code that goes along with the Airflow tutorial located at: + https://github.com/apache/incubator-airflow/blob/master/airflow/example_dags/tutorial.py """ from airflow import DAG from airflow.operators.bash_operator import BashOperator @@ -301,7 +301,7 @@ something like this: } dag = DAG( - 'tutorial', default_args=default_args, schedule_interval=timedelta(1)) + 'tutorial', default_args=default_args, schedule_interval=timedelta(days=1)) # t1, t2 and t3 are examples of tasks created by instantiating operators t1 = BashOperator( diff --git a/docs/ui.rst b/docs/ui.rst index 4b232fa1aea18..5a09ce5aa0a92 100644 --- a/docs/ui.rst +++ b/docs/ui.rst @@ -1,6 +1,6 @@ UI / Screenshots ================= -The Airflow UI make it easy to monitor and troubleshoot your data pipelines. +The Airflow UI makes it easy to monitor and troubleshoot your data pipelines. Here's a quick overview of some of the features and visualizations you can find in the Airflow UI. diff --git a/run_unit_tests.sh b/run_unit_tests.sh index f923de9e5c70b..8d671583427eb 100755 --- a/run_unit_tests.sh +++ b/run_unit_tests.sh @@ -27,9 +27,6 @@ export AIRFLOW__CORE__UNIT_TEST_MODE=True # configuration test export AIRFLOW__TESTSECTION__TESTKEY=testvalue -# use Airflow 2.0-style imports -export AIRFLOW_USE_NEW_IMPORTS=1 - # add test/contrib to PYTHONPATH DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" export PYTHONPATH=$PYTHONPATH:${DIR}/tests/test_utils @@ -75,4 +72,3 @@ nosetests $nose_args # To run individual tests: # nosetests tests.core:CoreTest.test_scheduler_job - diff --git a/scripts/ci/2-setup-kdc.sh b/scripts/ci/2-setup-kdc.sh index 56824f5a5ee3f..c5cd381c2f626 100755 --- a/scripts/ci/2-setup-kdc.sh +++ b/scripts/ci/2-setup-kdc.sh @@ -30,7 +30,7 @@ KRB5_KTNAME=/etc/airflow.keytab cat /etc/hosts echo "hostname: ${FQDN}" -sudo cp $DIRNAME/krb5/krb-conf/client/krb5.conf /etc/krb5.conf +sudo cp $DIRNAME/krb5/krb5.conf /etc/krb5.conf echo -e "${PASS}\n${PASS}" | sudo kadmin -p ${ADMIN}/admin -w ${PASS} -q "addprinc -randkey airflow/${FQDN}" sudo kadmin -p ${ADMIN}/admin -w ${PASS} -q "ktadd -k ${KRB5_KTNAME} airflow" diff --git a/scripts/ci/4-load-data.sh b/scripts/ci/4-load-data.sh deleted file mode 100755 index 7935482be075e..0000000000000 --- a/scripts/ci/4-load-data.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env bash -# 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. * - -set -exuo pipefail - -DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) -DATA_DIR="${DIR}/data" -DATA_FILE="${DATA_DIR}/baby_names.csv" -DATABASE=airflow_ci -HOST=mysql - -mysqladmin -h ${HOST} -u root create ${DATABASE} -mysql -h ${HOST} -u root < ${DATA_DIR}/mysql_schema.sql -mysqlimport --local -h ${HOST} -u root --fields-optionally-enclosed-by="\"" --fields-terminated-by=, --ignore-lines=1 ${DATABASE} ${DATA_FILE} diff --git a/scripts/ci/5-run-tests.sh b/scripts/ci/5-run-tests.sh index 9a4e06f5e2d1c..8acc78f1a7ff0 100755 --- a/scripts/ci/5-run-tests.sh +++ b/scripts/ci/5-run-tests.sh @@ -48,9 +48,6 @@ export AIRFLOW__CORE__UNIT_TEST_MODE=True # configuration test export AIRFLOW__TESTSECTION__TESTKEY=testvalue -# use Airflow 2.0-style imports -export AIRFLOW_USE_NEW_IMPORTS=1 - # any argument received is overriding the default nose execution arguments: nose_args=$@ @@ -61,9 +58,11 @@ which airflow > /dev/null || python setup.py develop # (which contains /usr/local/bin) sudo ln -sf "${VIRTUAL_ENV}/bin/airflow" /usr/local/bin/ -echo "Initializing the DB" -yes | airflow initdb -yes | airflow resetdb +if [ -z "$KUBERNETES_VERSION" ]; then + echo "Initializing the DB" + yes | airflow initdb + yes | airflow resetdb +fi if [ -z "$nose_args" ]; then nose_args="--with-coverage \ @@ -78,8 +77,10 @@ if [ -z "$nose_args" ]; then --logging-level=DEBUG" fi -# kdc init happens in setup_kdc.sh -kinit -kt ${KRB5_KTNAME} airflow +if [ -z "$KUBERNETES_VERSION" ]; then + # kdc init happens in setup_kdc.sh + kinit -kt ${KRB5_KTNAME} airflow +fi # For impersonation tests running on SQLite on Travis, make the database world readable so other # users can update it diff --git a/scripts/ci/airflow_travis.cfg b/scripts/ci/airflow_travis.cfg index 2d412e182c406..6895c4d5ad05f 100644 --- a/scripts/ci/airflow_travis.cfg +++ b/scripts/ci/airflow_travis.cfg @@ -59,6 +59,7 @@ broker_url = amqp://guest:guest@rabbitmq:5672/ result_backend = db+mysql://root@mysql/airflow flower_port = 5555 default_queue = default +sync_parallelism = 0 [celery_broker_transport_options] visibility_timeout = 21600 diff --git a/scripts/ci/data/baby_names.csv b/scripts/ci/data/baby_names.csv deleted file mode 100644 index b0ee22951e1ee..0000000000000 --- a/scripts/ci/data/baby_names.csv +++ /dev/null @@ -1,54 +0,0 @@ -"year","name","percent","sex" -1880,"John",0.081541,"boy" -1880,"William",0.080511,"boy" -1880,"James",0.050057,"boy" -1880,"Charles",0.045167,"boy" -1880,"George",0.043292,"boy" -1880,"Frank",0.02738,"boy" -1880,"Joseph",0.022229,"boy" -1880,"Thomas",0.021401,"boy" -1880,"Henry",0.020641,"boy" -1880,"Robert",0.020404,"boy" -1880,"Edward",0.019965,"boy" -1880,"Harry",0.018175,"boy" -1880,"Walter",0.014822,"boy" -1880,"Arthur",0.013504,"boy" -1880,"Fred",0.013251,"boy" -1880,"Albert",0.012609,"boy" -1880,"Samuel",0.008648,"boy" -1880,"David",0.007339,"boy" -1880,"Louis",0.006993,"boy" -1880,"Joe",0.006174,"boy" -1880,"Charlie",0.006165,"boy" -1880,"Clarence",0.006165,"boy" -1880,"Richard",0.006148,"boy" -1880,"Andrew",0.005439,"boy" -1880,"Daniel",0.00543,"boy" -1880,"Ernest",0.005194,"boy" -1880,"Will",0.004966,"boy" -1880,"Jesse",0.004805,"boy" -1880,"Oscar",0.004594,"boy" -1880,"Lewis",0.004366,"boy" -1880,"Peter",0.004189,"boy" -1880,"Benjamin",0.004138,"boy" -1880,"Frederick",0.004079,"boy" -1880,"Willie",0.00402,"boy" -1880,"Alfred",0.003961,"boy" -1880,"Sam",0.00386,"boy" -1880,"Roy",0.003716,"boy" -1880,"Herbert",0.003581,"boy" -1880,"Jacob",0.003412,"boy" -1880,"Tom",0.00337,"boy" -1880,"Elmer",0.00315,"boy" -1880,"Carl",0.003142,"boy" -1880,"Lee",0.003049,"boy" -1880,"Howard",0.003015,"boy" -1880,"Martin",0.003015,"boy" -1880,"Michael",0.00299,"boy" -1880,"Bert",0.002939,"boy" -1880,"Herman",0.002931,"boy" -1880,"Jim",0.002914,"boy" -1880,"Francis",0.002905,"boy" -1880,"Harvey",0.002905,"boy" -1880,"Earl",0.002829,"boy" -1880,"Eugene",0.00277,"boy" \ No newline at end of file diff --git a/scripts/ci/data/mysql_schema.sql b/scripts/ci/data/mysql_schema.sql deleted file mode 100644 index c2c60729d1468..0000000000000 --- a/scripts/ci/data/mysql_schema.sql +++ /dev/null @@ -1,27 +0,0 @@ -/** -* 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. -*/ - -USE airflow_ci; - -CREATE TABLE IF NOT EXISTS baby_names ( - org_year integer(4), - baby_name VARCHAR(25), - rate FLOAT(7,6), - sex VARCHAR(4) -) \ No newline at end of file diff --git a/scripts/ci/docker-compose-kubernetes.yml b/scripts/ci/docker-compose-kubernetes.yml new file mode 100644 index 0000000000000..0cdb2df199b7b --- /dev/null +++ b/scripts/ci/docker-compose-kubernetes.yml @@ -0,0 +1,28 @@ +# +# 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. + +version: "2.2" +services: + airflow-testing: + network_mode: host + environment: + - KUBERNETES_VERSION + - MINIKUBE_IP + volumes: + - /usr/local/bin/kubectl:/usr/local/bin/kubectl + - /usr/local/bin/minikube:/usr/local/bin/minikube + - ~/.kube:/home/airflow/.kube + - ~/.minikube:/home/airflow/.minikube diff --git a/scripts/ci/docker-compose.yml b/scripts/ci/docker-compose.yml index 32e0a536c1597..101ad9529731e 100644 --- a/scripts/ci/docker-compose.yml +++ b/scripts/ci/docker-compose.yml @@ -57,8 +57,7 @@ services: - ./openldap/ldif:/container/service/slapd/assets/config/bootstrap/ldif/custom krb5-kdc-server: - build: ./krb5 - image: krb5-kdc-server + image: godatadriven/krb5-kdc-server hostname: krb5-kdc-server domainname: example.com @@ -67,6 +66,7 @@ services: init: true environment: - USER=airflow + - ADDITIONAL_PATH=~/.local/bin - SLUGIFY_USES_TEXT_UNIDECODE=yes - TOX_ENV - PYTHON_VERSION diff --git a/scripts/ci/krb5/krb-conf/server/kdc.conf b/scripts/ci/krb5/krb-conf/server/kdc.conf deleted file mode 100644 index c21095f418d4a..0000000000000 --- a/scripts/ci/krb5/krb-conf/server/kdc.conf +++ /dev/null @@ -1,30 +0,0 @@ -# -# 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. -[kdcdefaults] -kdc_ports = 88 -kdc_tcp_ports = 88 - -[realms] -TEST.LOCAL = { - #master_key_type = aes256-cts - acl_file = /etc/krb5kdc/kadm5.acl - dict_file = /usr/share/dict/words - admin_keytab = /var/krb5kdc/kadm5.keytab - max_renewable_life = 7d 0h 0m 0s - supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal -} diff --git a/scripts/ci/krb5/krb-conf/client/krb5.conf b/scripts/ci/krb5/krb5.conf similarity index 92% rename from scripts/ci/krb5/krb-conf/client/krb5.conf rename to scripts/ci/krb5/krb5.conf index 471737a964123..77c78d686e39e 100644 --- a/scripts/ci/krb5/krb-conf/client/krb5.conf +++ b/scripts/ci/krb5/krb5.conf @@ -30,7 +30,7 @@ renew_lifetime = 7d forwardable = true [realms] - TEST.LOCAL = { - kdc = krb5-kdc-server:88 - admin_server = krb5-kdc-server - } +TEST.LOCAL = { + kdc = krb5-kdc-server:88 + admin_server = krb5-kdc-server +} diff --git a/scripts/ci/krb5/start_kdc.sh b/scripts/ci/krb5/start_kdc.sh deleted file mode 100755 index 6e02f006fa830..0000000000000 --- a/scripts/ci/krb5/start_kdc.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash - -# -# 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. - -set -exuo pipefail - -FQDN=`hostname` -ADMIN="admin" -PASS="airflow" -KRB5_KTNAME=/etc/airflow.keytab - -cat /etc/hosts -echo "hostname: ${FQDN}" -# create kerberos database -echo -e "${PASS}\n${PASS}" | kdb5_util create -s -# create admin -echo -e "${PASS}\n${PASS}" | kadmin.local -q "addprinc ${ADMIN}/admin" -# create airflow -echo -e "${PASS}\n${PASS}" | kadmin.local -q "addprinc -randkey airflow" -echo -e "${PASS}\n${PASS}" | kadmin.local -q "addprinc -randkey airflow/${FQDN}" -kadmin.local -q "ktadd -k ${KRB5_KTNAME} airflow" -kadmin.local -q "ktadd -k ${KRB5_KTNAME} airflow/${FQDN}" - -# Start services -/usr/local/bin/supervisord -n -c /etc/supervisord.conf diff --git a/scripts/ci/krb5/supervisord.conf b/scripts/ci/krb5/supervisord.conf deleted file mode 100644 index 165e5cde84646..0000000000000 --- a/scripts/ci/krb5/supervisord.conf +++ /dev/null @@ -1,43 +0,0 @@ -; -; 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. - -; supervisord.conf - kdc-server - -[supervisord] -logfile=/var/log/supervisord/supervisord.log ; supervisord log file -logfile_maxbytes=50MB ; maximum size of logfile before rotation -logfile_backups=10 ; number of backed up logfiles -loglevel=error ; info, debug, warn, trace -pidfile=/var/run/supervisord.pid ; pidfile location -nodaemon=false ; run supervisord as a daemon -minfds=1024 ; number of startup file descriptors -minprocs=200 ; number of process descriptors -user=root ; default user -childlogdir=/var/log/supervisord/ ; where child log files will live - -[program:krb5-kdc] -command=service krb5-kdc start -autostart=true -autorestart=true - -[program:krb5-admin-server] -command=service krb5-admin-server start -autostart=true -autorestart=true - -[supervisorctl] diff --git a/scripts/ci/kubernetes/docker/airflow-test-env-init.sh b/scripts/ci/kubernetes/docker/airflow-test-env-init.sh index aa86da72dfa70..05f8e20aeacb4 100755 --- a/scripts/ci/kubernetes/docker/airflow-test-env-init.sh +++ b/scripts/ci/kubernetes/docker/airflow-test-env-init.sh @@ -19,7 +19,8 @@ cd /usr/local/lib/python2.7/dist-packages/airflow && \ cp -R example_dags/* /root/airflow/dags/ && \ +cp -R contrib/example_dags/example_kubernetes_*.py /root/airflow/dags/ && \ airflow initdb && \ alembic upgrade heads && \ -(airflow create_user -u airflow -l airflow -f jon -e airflow@apache.org -r Admin -p airflow || true) && \ +(airflow users --create --username airflow --lastname airflow --firstname jon --email airflow@apache.org --role Admin --password airflow || true) && \ echo "retrieved from mount" > /root/test_volume/test.txt diff --git a/scripts/ci/kubernetes/docker/build.sh b/scripts/ci/kubernetes/docker/build.sh index b93c6b1715ddb..49d0fb87c3a31 100755 --- a/scripts/ci/kubernetes/docker/build.sh +++ b/scripts/ci/kubernetes/docker/build.sh @@ -22,9 +22,13 @@ TAG=${2:-latest} DIRNAME=$(cd "$(dirname "$0")"; pwd) AIRFLOW_ROOT="$DIRNAME/../../../.." -ENVCONFIG=$(minikube docker-env) -if [ $? -eq 0 ]; then - eval $ENVCONFIG +set -e + +if [ "${VM_DRIVER:-none}" != "none" ]; then + ENVCONFIG=$(minikube docker-env) + if [ $? -eq 0 ]; then + eval $ENVCONFIG + fi fi echo "Airflow directory $AIRFLOW_ROOT" diff --git a/scripts/ci/kubernetes/kube/airflow.yaml b/scripts/ci/kubernetes/kube/airflow.yaml index 4f451ba44a687..1b6e33cec5b3c 100644 --- a/scripts/ci/kubernetes/kube/airflow.yaml +++ b/scripts/ci/kubernetes/kube/airflow.yaml @@ -151,4 +151,3 @@ spec: nodePort: 30809 selector: name: airflow - diff --git a/scripts/ci/kubernetes/kube/configmaps.yaml b/scripts/ci/kubernetes/kube/configmaps.yaml index f8e99778f59d8..ab44931e59cc5 100644 --- a/scripts/ci/kubernetes/kube/configmaps.yaml +++ b/scripts/ci/kubernetes/kube/configmaps.yaml @@ -27,7 +27,7 @@ data: logging_level = INFO executor = KubernetesExecutor parallelism = 32 - load_examples = True + load_examples = False plugins_folder = /root/airflow/plugins sql_alchemy_conn = $SQL_ALCHEMY_CONN @@ -256,6 +256,10 @@ data: # Default queue that tasks get assigned to and that worker listen on. default_queue = default + # How many processes CeleryExecutor uses to sync task state. + # 0 means to use max(1, number of cores - 1) processes. + sync_parallelism = 0 + # Import path for celery configuration options celery_config_options = airflow.config_templates.default_celery.DEFAULT_CELERY_CONFIG diff --git a/scripts/ci/kubernetes/kube/deploy.sh b/scripts/ci/kubernetes/kube/deploy.sh index a9a42a7a12d12..75567c9acf6a4 100755 --- a/scripts/ci/kubernetes/kube/deploy.sh +++ b/scripts/ci/kubernetes/kube/deploy.sh @@ -17,6 +17,8 @@ # specific language governing permissions and limitations * # under the License. * +set -x + IMAGE=${1:-airflow/ci} TAG=${2:-latest} DIRNAME=$(cd "$(dirname "$0")"; pwd) diff --git a/scripts/ci/kubernetes/minikube/start_minikube.sh b/scripts/ci/kubernetes/minikube/start_minikube.sh index c9388e08ffddc..0803884899bf5 100755 --- a/scripts/ci/kubernetes/minikube/start_minikube.sh +++ b/scripts/ci/kubernetes/minikube/start_minikube.sh @@ -19,12 +19,13 @@ #!/usr/bin/env bash +set -x _MY_SCRIPT="${BASH_SOURCE[0]}" _MY_DIR=$(cd "$(dirname "$_MY_SCRIPT")" && pwd) # Avoids 1.7.x because of https://github.com/kubernetes/minikube/issues/2240 _KUBERNETES_VERSION="${KUBERNETES_VERSION}" -_MINIKUBE_VERSION="${MINIKUBE_VERSION:-v0.26.0}" +_MINIKUBE_VERSION="${MINIKUBE_VERSION:-v0.28.2}" echo "setting up kubernetes ${_KUBERNETES_VERSION}, using minikube ${_MINIKUBE_VERSION}" @@ -116,7 +117,7 @@ echo Showing kube-system pods kubectl get -n kube-system pods (k8s_single_pod_ready -n kube-system -l component=kube-addon-manager) || - (_ADDON=$(kubectl get pod -n kube-system -l component=kube-addon-manager + (_ADDON=$(kubectl get pod -n kube-system -l component=kube-addon-manager \ --no-headers -o name| cut -d/ -f2); echo Addon-manager describe:; kubectl describe pod -n kube-system $_ADDON; diff --git a/scripts/ci/kubernetes/setup_kubernetes.sh b/scripts/ci/kubernetes/setup_kubernetes.sh index ea559a02aa997..96f8f5d6af2a5 100755 --- a/scripts/ci/kubernetes/setup_kubernetes.sh +++ b/scripts/ci/kubernetes/setup_kubernetes.sh @@ -25,6 +25,5 @@ DIRNAME=$(cd "$(dirname "$0")"; pwd) $DIRNAME/minikube/start_minikube.sh $DIRNAME/docker/build.sh -$DIRNAME/kube/deploy.sh echo "Airflow environment on kubernetes is good to go!" diff --git a/scripts/ci/run-ci.sh b/scripts/ci/run-ci.sh index f2815bbd95979..2c893bcaa0909 100755 --- a/scripts/ci/run-ci.sh +++ b/scripts/ci/run-ci.sh @@ -24,16 +24,16 @@ DIRNAME=$(cd "$(dirname "$0")"; pwd) AIRFLOW_ROOT="$DIRNAME/../.." # Fix file permissions -sudo chown -R airflow.airflow . $HOME/.wheelhouse/ $HOME/.cache/pip +sudo chown -R airflow.airflow . $HOME/.cache $HOME/.wheelhouse/ $HOME/.cache/pip $HOME/.kube $HOME/.minikube if [[ $PYTHON_VERSION == '3' ]]; then PIP=pip3 else - PIP=pip + PIP=pip2 fi -sudo $PIP install --upgrade pip -sudo $PIP install tox +sudo -H $PIP install --upgrade pip +sudo -H $PIP install tox cd $AIRFLOW_ROOT && $PIP --version && tox --version @@ -41,7 +41,13 @@ if [ -z "$KUBERNETES_VERSION" ]; then tox -e $TOX_ENV else - KUBERNETES_VERSION=${KUBERNETES_VERSION} $DIRNAME/kubernetes/setup_kubernetes.sh && \ + # This script runs inside a container, the path of the kubernetes certificate + # is /home/travis/.minikube/client.crt but the user in the container is `airflow` + if [ ! -d /home/travis ]; then + sudo mkdir -p /home/travis + fi + sudo ln -s /home/airflow/.minikube /home/travis/.minikube + tox -e $TOX_ENV -- tests.contrib.minikube \ --with-coverage \ --cover-erase \ diff --git a/scripts/perf/dags/perf_dag_1.py b/scripts/perf/dags/perf_dag_1.py index ea9714112e3ca..46b3d3e5a2f8d 100644 --- a/scripts/perf/dags/perf_dag_1.py +++ b/scripts/perf/dags/perf_dag_1.py @@ -7,9 +7,9 @@ # 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 diff --git a/scripts/perf/dags/perf_dag_2.py b/scripts/perf/dags/perf_dag_2.py index 2289ebb5eda7b..a6916e664c40f 100644 --- a/scripts/perf/dags/perf_dag_2.py +++ b/scripts/perf/dags/perf_dag_2.py @@ -7,9 +7,9 @@ # 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 diff --git a/scripts/perf/scheduler_ops_metrics.py b/scripts/perf/scheduler_ops_metrics.py index 2658288856489..ef274d6cd233e 100644 --- a/scripts/perf/scheduler_ops_metrics.py +++ b/scripts/perf/scheduler_ops_metrics.py @@ -7,9 +7,9 @@ # 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 @@ -129,8 +129,7 @@ def heartbeat(self): if len(successful_tis) == num_task_instances: self.log.info("All tasks processed! Printing stats.") else: - self.log.info("Test timeout reached. " - "Printing available stats.") + self.log.info("Test timeout reached. Printing available stats.") self.print_stats() set_dags_paused_state(True) sys.exit() diff --git a/setup.cfg b/setup.cfg index 622cc1303a173..881fe0107d9b2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -14,6 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. + [metadata] name = Airflow summary = Airflow is a system to programmatically author, schedule and monitor data pipelines. @@ -34,4 +35,3 @@ all_files = 1 upload-dir = docs/_build/html [easy_install] - diff --git a/setup.py b/setup.py index e5b669d0c11c0..eded3c4e50230 100644 --- a/setup.py +++ b/setup.py @@ -239,7 +239,7 @@ def write_version(filename=os.path.join(*['airflow', + cassandra + mongo devel = [ - 'click', + 'click==6.7', 'freezegun', 'jira', 'lxml>=4.0.0', @@ -292,16 +292,16 @@ def do_setup(): zip_safe=False, scripts=['airflow/bin/airflow'], install_requires=[ - 'alembic>=0.8.3, <0.9', + 'alembic>=0.9, <1.0', 'bleach~=2.1.3', 'configparser>=3.5.0, <3.6.0', 'croniter>=0.3.17, <0.4', 'dill>=0.2.2, <0.3', 'flask>=0.12.4, <0.13', - 'flask-appbuilder>=1.11.1, <2.0.0', + 'flask-appbuilder>=1.12, <2.0.0', 'flask-admin==1.4.1', 'flask-caching>=1.3.3, <1.4.0', - 'flask-login==0.2.11', + 'flask-login>=0.3, <0.5', 'flask-swagger==0.2.13', 'flask-wtf>=0.14.2, <0.15', 'funcsigs==1.0.0', @@ -322,7 +322,7 @@ def do_setup(): 'requests>=2.5.1, <3', 'setproctitle>=1.1.8, <2', 'sqlalchemy>=1.1.15, <1.2.0', - 'tabulate>=0.7.5, <0.8.0', + 'tabulate>=0.7.5, <=0.8.2', 'tenacity==4.8.0', 'thrift>=0.9.2', 'tzlocal>=1.4', diff --git a/tests/cli/__init__.py b/tests/cli/__init__.py index 4067cc78ee9a2..114d189da14ab 100644 --- a/tests/cli/__init__.py +++ b/tests/cli/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/cli/test_cli.py b/tests/cli/test_cli.py index 616b9a0f16da4..aeafdd85fe213 100644 --- a/tests/cli/test_cli.py +++ b/tests/cli/test_cli.py @@ -20,9 +20,12 @@ import unittest +from datetime import datetime, timedelta, time from mock import patch, Mock, MagicMock from time import sleep import psutil +import pytz +import subprocess from argparse import Namespace from airflow import settings from airflow.bin.cli import get_num_ready_workers_running, run, get_dag @@ -136,7 +139,21 @@ def test_ready_prefix_on_cmdline_dead_process(self): self.assertEqual(get_num_ready_workers_running(self.gunicorn_master_proc), 0) def test_cli_webserver_debug(self): - p = psutil.Popen(["airflow", "webserver", "-d"]) + env = os.environ.copy() + p = psutil.Popen(["airflow", "webserver", "-d"], env=env) + sleep(3) # wait for webserver to start + return_code = p.poll() + self.assertEqual( + None, + return_code, + "webserver terminated with return code {} in debug mode".format(return_code)) + p.terminate() + p.wait() + + def test_cli_rbac_webserver_debug(self): + env = os.environ.copy() + env['AIRFLOW__WEBSERVER__RBAC'] = 'True' + p = psutil.Popen(["airflow", "webserver", "-d"], env=env) sleep(3) # wait for webserver to start return_code = p.poll() self.assertEqual( @@ -165,3 +182,80 @@ def test_local_run(self): ti.refresh_from_db() state = ti.current_state() self.assertEqual(state, State.SUCCESS) + + def test_next_execution(self): + # A scaffolding function + def reset_dr_db(dag_id): + session = Session() + dr = session.query(models.DagRun).filter_by(dag_id=dag_id) + dr.delete() + session.commit() + session.close() + + EXAMPLE_DAGS_FOLDER = os.path.join( + os.path.dirname( + os.path.dirname( + os.path.dirname(os.path.realpath(__file__)) + ) + ), + "airflow/example_dags" + ) + + dagbag = models.DagBag(dag_folder=EXAMPLE_DAGS_FOLDER, + include_examples=False) + dag_ids = ['example_bash_operator', # schedule_interval is '0 0 * * *' + 'latest_only', # schedule_interval is timedelta(hours=4) + 'example_python_operator', # schedule_interval=None + 'example_xcom'] # schedule_interval="@once" + + # The details below is determined by the schedule_interval of example DAGs + now = timezone.utcnow() + next_execution_time_for_dag1 = pytz.utc.localize( + datetime.combine( + now.date() + timedelta(days=1), + time(0) + ) + ) + next_execution_time_for_dag2 = now + timedelta(hours=4) + expected_output = [str(next_execution_time_for_dag1), + str(next_execution_time_for_dag2), + "None", + "None"] + + for i in range(len(dag_ids)): + dag_id = dag_ids[i] + + # Clear dag run so no execution history fo each DAG + reset_dr_db(dag_id) + + p = subprocess.Popen(["airflow", "next_execution", dag_id, + "--subdir", EXAMPLE_DAGS_FOLDER], + stdout=subprocess.PIPE) + p.wait() + stdout = [] + for line in p.stdout: + stdout.append(str(line.decode("utf-8").rstrip())) + + # `next_execution` function is inapplicable if no execution record found + # It prints `None` in such cases + self.assertEqual(stdout[-1], "None") + + dag = dagbag.dags[dag_id] + # Create a DagRun for each DAG, to prepare for next step + dag.create_dagrun( + run_id='manual__' + now.isoformat(), + execution_date=now, + start_date=now, + state=State.FAILED + ) + + p = subprocess.Popen(["airflow", "next_execution", dag_id, + "--subdir", EXAMPLE_DAGS_FOLDER], + stdout=subprocess.PIPE) + p.wait() + stdout = [] + for line in p.stdout: + stdout.append(str(line.decode("utf-8").rstrip())) + self.assertEqual(stdout[-1], expected_output[i]) + + reset_dr_db(dag_id) diff --git a/tests/configuration.py b/tests/configuration.py index ac6f7b7db7746..b50a83259add4 100644 --- a/tests/configuration.py +++ b/tests/configuration.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/__init__.py b/tests/contrib/__init__.py index 50b2e1d1785dd..114d189da14ab 100644 --- a/tests/contrib/__init__.py +++ b/tests/contrib/__init__.py @@ -7,16 +7,12 @@ # 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. - -from __future__ import absolute_import -from .operators import * -from .sensors import * diff --git a/tests/contrib/hooks/__init__.py b/tests/contrib/hooks/__init__.py index 4067cc78ee9a2..114d189da14ab 100644 --- a/tests/contrib/hooks/__init__.py +++ b/tests/contrib/hooks/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_aws_dynamodb_hook.py b/tests/contrib/hooks/test_aws_dynamodb_hook.py index eabd352190213..835c042b2dc62 100644 --- a/tests/contrib/hooks/test_aws_dynamodb_hook.py +++ b/tests/contrib/hooks/test_aws_dynamodb_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_aws_hook.py b/tests/contrib/hooks/test_aws_hook.py index b27b37d5736f3..d7664aca1137a 100644 --- a/tests/contrib/hooks/test_aws_hook.py +++ b/tests/contrib/hooks/test_aws_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_aws_lambda_hook.py b/tests/contrib/hooks/test_aws_lambda_hook.py index 0b9744cd22285..e71bac5518ebf 100644 --- a/tests/contrib/hooks/test_aws_lambda_hook.py +++ b/tests/contrib/hooks/test_aws_lambda_hook.py @@ -7,9 +7,9 @@ # 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 @@ -23,7 +23,6 @@ import json import textwrap import zipfile -import base64 from airflow.contrib.hooks.aws_lambda_hook import AwsLambdaHook diff --git a/tests/contrib/hooks/test_bigquery_hook.py b/tests/contrib/hooks/test_bigquery_hook.py index d7e9491b8b8d4..1cc3f66258982 100644 --- a/tests/contrib/hooks/test_bigquery_hook.py +++ b/tests/contrib/hooks/test_bigquery_hook.py @@ -25,7 +25,8 @@ import mock from airflow.contrib.hooks import bigquery_hook as hook -from airflow.contrib.hooks.bigquery_hook import _cleanse_time_partitioning +from airflow.contrib.hooks.bigquery_hook import _cleanse_time_partitioning, \ + _validate_value, _api_resource_configs_duplication_check bq_available = True @@ -206,6 +207,16 @@ def mock_job_cancel(projectId, jobId): class TestBigQueryBaseCursor(unittest.TestCase): + def test_bql_deprecation_warning(self): + with warnings.catch_warnings(record=True) as w: + hook.BigQueryBaseCursor("test", "test").run_query( + bql='select * from test_table' + ) + yield + self.assertIn( + 'Deprecated parameter `bql`', + w[0].message.args[0]) + def test_invalid_schema_update_options(self): with self.assertRaises(Exception) as context: hook.BigQueryBaseCursor("test", "test").run_load( @@ -216,16 +227,6 @@ def test_invalid_schema_update_options(self): ) self.assertIn("THIS IS NOT VALID", str(context.exception)) - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_bql_deprecation_warning(self, mock_rwc): - with warnings.catch_warnings(record=True) as w: - hook.BigQueryBaseCursor("test", "test").run_query( - bql='select * from test_table' - ) - self.assertIn( - 'Deprecated parameter `bql`', - w[0].message.args[0]) - def test_nobql_nosql_param_error(self): with self.assertRaises(TypeError) as context: hook.BigQueryBaseCursor("test", "test").run_query( @@ -281,6 +282,39 @@ def test_run_query_sql_dialect_override(self, run_with_config): args, kwargs = run_with_config.call_args self.assertIs(args[0]['query']['useLegacySql'], bool_val) + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_api_resource_configs(self, run_with_config): + for bool_val in [True, False]: + cursor = hook.BigQueryBaseCursor(mock.Mock(), "project_id") + cursor.run_query('query', + api_resource_configs={ + 'query': {'useQueryCache': bool_val}}) + args, kwargs = run_with_config.call_args + self.assertIs(args[0]['query']['useQueryCache'], bool_val) + self.assertIs(args[0]['query']['useLegacySql'], True) + + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_api_resource_configs_duplication_warning(self, run_with_config): + with self.assertRaises(ValueError): + cursor = hook.BigQueryBaseCursor(mock.Mock(), "project_id") + cursor.run_query('query', + use_legacy_sql=True, + api_resource_configs={ + 'query': {'useLegacySql': False}}) + + def test_validate_value(self): + with self.assertRaises(TypeError): + _validate_value("case_1", "a", dict) + self.assertIsNone(_validate_value("case_2", 0, int)) + + def test_duplication_check(self): + with self.assertRaises(ValueError): + key_one = True + _api_resource_configs_duplication_check( + "key_one", key_one, {"key_one": False}) + self.assertIsNone(_api_resource_configs_duplication_check( + "key_one", key_one, {"key_one": True})) + class TestLabelsInRunJob(unittest.TestCase): @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') @@ -303,8 +337,93 @@ def run_with_config(config): mocked_rwc.assert_called_once() -class TestTimePartitioningInRunJob(unittest.TestCase): +class TestDatasetsOperations(unittest.TestCase): + + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_create_empty_dataset_no_dataset_id_err(self, + run_with_configuration): + + with self.assertRaises(ValueError): + hook.BigQueryBaseCursor( + mock.Mock(), "test_create_empty_dataset").create_empty_dataset( + dataset_id="", project_id="") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_create_empty_dataset_duplicates_call_err(self, + run_with_configuration): + with self.assertRaises(ValueError): + hook.BigQueryBaseCursor( + mock.Mock(), "test_create_empty_dataset").create_empty_dataset( + dataset_id="", project_id="project_test", + dataset_reference={ + "datasetReference": + {"datasetId": "test_dataset", + "projectId": "project_test2"}}) + + def test_get_dataset_without_dataset_id(self): + with mock.patch.object(hook.BigQueryHook, 'get_service'): + with self.assertRaises(ValueError): + hook.BigQueryBaseCursor( + mock.Mock(), "test_create_empty_dataset").get_dataset( + dataset_id="", project_id="project_test") + + def test_get_dataset(self): + expected_result = { + "kind": "bigquery#dataset", + "location": "US", + "id": "your-project:dataset_2_test", + "datasetReference": { + "projectId": "your-project", + "datasetId": "dataset_2_test" + } + } + dataset_id = "test_dataset" + project_id = "project_test" + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + with mock.patch.object(bq_hook.service, 'datasets') as MockService: + MockService.return_value.get(datasetId=dataset_id, + projectId=project_id).execute.\ + return_value = expected_result + result = bq_hook.get_dataset(dataset_id=dataset_id, + project_id=project_id) + self.assertEqual(result, expected_result) + + def test_get_datasets_list(self): + expected_result = {'datasets': [ + { + "kind": "bigquery#dataset", + "location": "US", + "id": "your-project:dataset_2_test", + "datasetReference": { + "projectId": "your-project", + "datasetId": "dataset_2_test" + } + }, + { + "kind": "bigquery#dataset", + "location": "US", + "id": "your-project:dataset_1_test", + "datasetReference": { + "projectId": "your-project", + "datasetId": "dataset_1_test" + } + } + ]} + project_id = "project_test"'' + + mocked = mock.Mock() + with mock.patch.object(hook.BigQueryBaseCursor(mocked, project_id).service, + 'datasets') as MockService: + MockService.return_value.list( + projectId=project_id).execute.return_value = expected_result + result = hook.BigQueryBaseCursor( + mocked, "test_create_empty_dataset").get_datasets_list( + project_id=project_id) + self.assertEqual(result, expected_result['datasets']) + + +class TestTimePartitioningInRunJob(unittest.TestCase): @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") @mock.patch("airflow.contrib.hooks.bigquery_hook.time") @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') @@ -413,12 +532,269 @@ def test_extra_time_partitioning_options(self): } self.assertEqual(tp_out, expect) - def test_cant_add_dollar_and_field_name(self): - with self.assertRaises(ValueError): - _cleanse_time_partitioning( - 'test.teast$20170101', - {'type': 'DAY', 'field': 'test_field', 'expirationMs': 1000} + +class TestClusteringInRunJob(unittest.TestCase): + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_load_default(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertIsNone(config['load'].get('clustering')) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_load( + destination_project_dataset_table='my_dataset.my_table', + schema_fields=[], + source_uris=[], + ) + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_load_with_arg(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertEqual( + config['load']['clustering'], + { + 'fields': ['field1', 'field2'] + } ) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_load( + destination_project_dataset_table='my_dataset.my_table', + schema_fields=[], + source_uris=[], + cluster_fields=['field1', 'field2'], + time_partitioning={'type': 'DAY'} + ) + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_query_default(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertIsNone(config['query'].get('clustering')) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_query(sql='select 1') + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_query_with_arg(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertEqual( + config['query']['clustering'], + { + 'fields': ['field1', 'field2'] + } + ) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_query( + sql='select 1', + destination_dataset_table='my_dataset.my_table', + cluster_fields=['field1', 'field2'], + time_partitioning={'type': 'DAY'} + ) + + mocked_rwc.assert_called_once() + + +class TestClusteringInRunJob(unittest.TestCase): + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_load_default(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertIsNone(config['load'].get('clustering')) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_load( + destination_project_dataset_table='my_dataset.my_table', + schema_fields=[], + source_uris=[], + ) + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_load_with_arg(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertEqual( + config['load']['clustering'], + { + 'fields': ['field1', 'field2'] + } + ) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_load( + destination_project_dataset_table='my_dataset.my_table', + schema_fields=[], + source_uris=[], + cluster_fields=['field1', 'field2'], + time_partitioning={'type': 'DAY'} + ) + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_query_default(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertIsNone(config['query'].get('clustering')) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_query(sql='select 1') + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_query_with_arg(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertEqual( + config['query']['clustering'], + { + 'fields': ['field1', 'field2'] + } + ) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_query( + sql='select 1', + destination_dataset_table='my_dataset.my_table', + cluster_fields=['field1', 'field2'], + time_partitioning={'type': 'DAY'} + ) + + mocked_rwc.assert_called_once() + + +class TestClusteringInRunJob(unittest.TestCase): + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_load_default(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertIsNone(config['load'].get('clustering')) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_load( + destination_project_dataset_table='my_dataset.my_table', + schema_fields=[], + source_uris=[], + ) + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_load_with_arg(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertEqual( + config['load']['clustering'], + { + 'fields': ['field1', 'field2'] + } + ) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_load( + destination_project_dataset_table='my_dataset.my_table', + schema_fields=[], + source_uris=[], + cluster_fields=['field1', 'field2'], + time_partitioning={'type': 'DAY'} + ) + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_query_default(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertIsNone(config['query'].get('clustering')) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_query(sql='select 1') + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_query_with_arg(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertEqual( + config['query']['clustering'], + { + 'fields': ['field1', 'field2'] + } + ) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_query( + sql='select 1', + destination_dataset_table='my_dataset.my_table', + cluster_fields=['field1', 'field2'], + time_partitioning={'type': 'DAY'} + ) + + mocked_rwc.assert_called_once() class TestBigQueryHookLegacySql(unittest.TestCase): diff --git a/tests/contrib/hooks/test_databricks_hook.py b/tests/contrib/hooks/test_databricks_hook.py index aca8dd96004b4..090f46caeb4fe 100644 --- a/tests/contrib/hooks/test_databricks_hook.py +++ b/tests/contrib/hooks/test_databricks_hook.py @@ -18,15 +18,21 @@ # under the License. # +import itertools import json import unittest +from requests import exceptions as requests_exceptions + from airflow import __version__ -from airflow.contrib.hooks.databricks_hook import DatabricksHook, RunState, SUBMIT_RUN_ENDPOINT, _TokenAuth +from airflow.contrib.hooks.databricks_hook import ( + DatabricksHook, + RunState, + SUBMIT_RUN_ENDPOINT +) from airflow.exceptions import AirflowException from airflow.models import Connection from airflow.utils import db -from requests import exceptions as requests_exceptions try: from unittest import mock @@ -46,7 +52,9 @@ 'node_type_id': 'r3.xlarge', 'num_workers': 1 } +CLUSTER_ID = 'cluster_id' RUN_ID = 1 +JOB_ID = 42 HOST = 'xx.cloud.databricks.com' HOST_WITH_SCHEME = 'https://xx.cloud.databricks.com' LOGIN = 'login' @@ -63,9 +71,21 @@ 'state_message': STATE_MESSAGE } } +NOTEBOOK_PARAMS = { + "dry-run": "true", + "oldest-time-to-consider": "1457570074236" +} +JAR_PARAMS = ["param1", "param2"] RESULT_STATE = None +def run_now_endpoint(host): + """ + Utility function to generate the run now endpoint given the host. + """ + return 'https://{}/api/2.0/jobs/run-now'.format(host) + + def submit_run_endpoint(host): """ Utility function to generate the submit run endpoint given the host. @@ -79,12 +99,68 @@ def get_run_endpoint(host): """ return 'https://{}/api/2.0/jobs/runs/get'.format(host) + def cancel_run_endpoint(host): """ Utility function to generate the get run endpoint given the host. """ return 'https://{}/api/2.0/jobs/runs/cancel'.format(host) + +def start_cluster_endpoint(host): + """ + Utility function to generate the get run endpoint given the host. + """ + return 'https://{}/api/2.0/clusters/start'.format(host) + + +def restart_cluster_endpoint(host): + """ + Utility function to generate the get run endpoint given the host. + """ + return 'https://{}/api/2.0/clusters/restart'.format(host) + + +def terminate_cluster_endpoint(host): + """ + Utility function to generate the get run endpoint given the host. + """ + return 'https://{}/api/2.0/clusters/delete'.format(host) + +def create_valid_response_mock(content): + response = mock.MagicMock() + response.json.return_value = content + return response + + +def create_post_side_effect(exception, status_code=500): + if exception != requests_exceptions.HTTPError: + return exception() + else: + response = mock.MagicMock() + response.status_code = status_code + response.raise_for_status.side_effect = exception(response=response) + return response + + +def setup_mock_requests( + mock_requests, + exception, + status_code=500, + error_count=None, + response_content=None): + + side_effect = create_post_side_effect(exception, status_code) + + if error_count is None: + # POST requests will fail indefinitely + mock_requests.post.side_effect = itertools.repeat(side_effect) + else: + # POST requests will fail 'error_count' times, and then they will succeed (once) + mock_requests.post.side_effect = \ + [side_effect] * error_count + [create_valid_response_mock(response_content)] + + class DatabricksHookTest(unittest.TestCase): """ Tests for DatabricksHook. @@ -97,9 +173,10 @@ def setUp(self, session=None): conn.host = HOST conn.login = LOGIN conn.password = PASSWORD + conn.extra = None session.commit() - self.hook = DatabricksHook() + self.hook = DatabricksHook(retry_delay=0) def test_parse_host_with_proper_host(self): host = self.hook._parse_host(HOST) @@ -111,34 +188,85 @@ def test_parse_host_with_scheme(self): def test_init_bad_retry_limit(self): with self.assertRaises(ValueError): - DatabricksHook(retry_limit = 0) - - @mock.patch('airflow.contrib.hooks.databricks_hook.requests') - def test_do_api_call_with_error_retry(self, mock_requests): - for exception in [requests_exceptions.ConnectionError, requests_exceptions.Timeout]: - with mock.patch.object(self.hook.log, 'error') as mock_errors: - mock_requests.reset_mock() - mock_requests.post.side_effect = exception() + DatabricksHook(retry_limit=0) + + def test_do_api_call_retries_with_retryable_error(self): + for exception in [ + requests_exceptions.ConnectionError, + requests_exceptions.SSLError, + requests_exceptions.Timeout, + requests_exceptions.ConnectTimeout, + requests_exceptions.HTTPError]: + with mock.patch( + 'airflow.contrib.hooks.databricks_hook.requests') as mock_requests, \ + mock.patch.object(self.hook.log, 'error') as mock_errors: + setup_mock_requests(mock_requests, exception) with self.assertRaises(AirflowException): self.hook._do_api_call(SUBMIT_RUN_ENDPOINT, {}) - self.assertEquals(len(mock_errors.mock_calls), self.hook.retry_limit) + self.assertEquals(mock_errors.call_count, self.hook.retry_limit) @mock.patch('airflow.contrib.hooks.databricks_hook.requests') - def test_do_api_call_with_bad_status_code(self, mock_requests): - mock_requests.codes.ok = 200 - status_code_mock = mock.PropertyMock(return_value=500) - type(mock_requests.post.return_value).status_code = status_code_mock - with self.assertRaises(AirflowException): - self.hook._do_api_call(SUBMIT_RUN_ENDPOINT, {}) + def test_do_api_call_does_not_retry_with_non_retryable_error(self, mock_requests): + setup_mock_requests( + mock_requests, requests_exceptions.HTTPError, status_code=400 + ) + + with mock.patch.object(self.hook.log, 'error') as mock_errors: + with self.assertRaises(AirflowException): + self.hook._do_api_call(SUBMIT_RUN_ENDPOINT, {}) + + mock_errors.assert_not_called() + + def test_do_api_call_succeeds_after_retrying(self): + for exception in [ + requests_exceptions.ConnectionError, + requests_exceptions.SSLError, + requests_exceptions.Timeout, + requests_exceptions.ConnectTimeout, + requests_exceptions.HTTPError]: + with mock.patch( + 'airflow.contrib.hooks.databricks_hook.requests') as mock_requests, \ + mock.patch.object(self.hook.log, 'error') as mock_errors: + setup_mock_requests( + mock_requests, + exception, + error_count=2, + response_content={'run_id': '1'} + ) + + response = self.hook._do_api_call(SUBMIT_RUN_ENDPOINT, {}) + + self.assertEquals(mock_errors.call_count, 2) + self.assertEquals(response, {'run_id': '1'}) + + @mock.patch('airflow.contrib.hooks.databricks_hook.sleep') + def test_do_api_call_waits_between_retries(self, mock_sleep): + retry_delay = 5 + self.hook = DatabricksHook(retry_delay=retry_delay) + + for exception in [ + requests_exceptions.ConnectionError, + requests_exceptions.SSLError, + requests_exceptions.Timeout, + requests_exceptions.ConnectTimeout, + requests_exceptions.HTTPError]: + with mock.patch( + 'airflow.contrib.hooks.databricks_hook.requests') as mock_requests, \ + mock.patch.object(self.hook.log, 'error'): + mock_sleep.reset_mock() + setup_mock_requests(mock_requests, exception) + + with self.assertRaises(AirflowException): + self.hook._do_api_call(SUBMIT_RUN_ENDPOINT, {}) + + self.assertEquals(len(mock_sleep.mock_calls), self.hook.retry_limit - 1) + mock_sleep.assert_called_with(retry_delay) @mock.patch('airflow.contrib.hooks.databricks_hook.requests') def test_submit_run(self, mock_requests): - mock_requests.codes.ok = 200 mock_requests.post.return_value.json.return_value = {'run_id': '1'} - status_code_mock = mock.PropertyMock(return_value=200) - type(mock_requests.post.return_value).status_code = status_code_mock json = { 'notebook_task': NOTEBOOK_TASK, 'new_cluster': NEW_CLUSTER @@ -157,11 +285,34 @@ def test_submit_run(self, mock_requests): timeout=self.hook.timeout_seconds) @mock.patch('airflow.contrib.hooks.databricks_hook.requests') - def test_get_run_page_url(self, mock_requests): + def test_run_now(self, mock_requests): mock_requests.codes.ok = 200 - mock_requests.get.return_value.json.return_value = GET_RUN_RESPONSE + mock_requests.post.return_value.json.return_value = {'run_id': '1'} status_code_mock = mock.PropertyMock(return_value=200) - type(mock_requests.get.return_value).status_code = status_code_mock + type(mock_requests.post.return_value).status_code = status_code_mock + json = { + 'notebook_params': NOTEBOOK_PARAMS, + 'jar_params': JAR_PARAMS, + 'job_id': JOB_ID + } + run_id = self.hook.run_now(json) + + self.assertEquals(run_id, '1') + + mock_requests.post.assert_called_once_with( + run_now_endpoint(HOST), + json={ + 'notebook_params': NOTEBOOK_PARAMS, + 'jar_params': JAR_PARAMS, + 'job_id': JOB_ID + }, + auth=(LOGIN, PASSWORD), + headers=USER_AGENT_HEADER, + timeout=self.hook.timeout_seconds) + + @mock.patch('airflow.contrib.hooks.databricks_hook.requests') + def test_get_run_page_url(self, mock_requests): + mock_requests.get.return_value.json.return_value = GET_RUN_RESPONSE run_page_url = self.hook.get_run_page_url(RUN_ID) @@ -175,10 +326,7 @@ def test_get_run_page_url(self, mock_requests): @mock.patch('airflow.contrib.hooks.databricks_hook.requests') def test_get_run_state(self, mock_requests): - mock_requests.codes.ok = 200 mock_requests.get.return_value.json.return_value = GET_RUN_RESPONSE - status_code_mock = mock.PropertyMock(return_value=200) - type(mock_requests.get.return_value).status_code = status_code_mock run_state = self.hook.get_run_state(RUN_ID) @@ -195,10 +343,7 @@ def test_get_run_state(self, mock_requests): @mock.patch('airflow.contrib.hooks.databricks_hook.requests') def test_cancel_run(self, mock_requests): - mock_requests.codes.ok = 200 mock_requests.post.return_value.json.return_value = GET_RUN_RESPONSE - status_code_mock = mock.PropertyMock(return_value=200) - type(mock_requests.post.return_value).status_code = status_code_mock self.hook.cancel_run(RUN_ID) @@ -209,6 +354,54 @@ def test_cancel_run(self, mock_requests): headers=USER_AGENT_HEADER, timeout=self.hook.timeout_seconds) + @mock.patch('airflow.contrib.hooks.databricks_hook.requests') + def test_start_cluster(self, mock_requests): + mock_requests.codes.ok = 200 + mock_requests.post.return_value.json.return_value = {} + status_code_mock = mock.PropertyMock(return_value=200) + type(mock_requests.post.return_value).status_code = status_code_mock + + self.hook.start_cluster({"cluster_id": CLUSTER_ID}) + + mock_requests.post.assert_called_once_with( + start_cluster_endpoint(HOST), + json={'cluster_id': CLUSTER_ID}, + auth=(LOGIN, PASSWORD), + headers=USER_AGENT_HEADER, + timeout=self.hook.timeout_seconds) + + @mock.patch('airflow.contrib.hooks.databricks_hook.requests') + def test_restart_cluster(self, mock_requests): + mock_requests.codes.ok = 200 + mock_requests.post.return_value.json.return_value = {} + status_code_mock = mock.PropertyMock(return_value=200) + type(mock_requests.post.return_value).status_code = status_code_mock + + self.hook.restart_cluster({"cluster_id": CLUSTER_ID}) + + mock_requests.post.assert_called_once_with( + restart_cluster_endpoint(HOST), + json={'cluster_id': CLUSTER_ID}, + auth=(LOGIN, PASSWORD), + headers=USER_AGENT_HEADER, + timeout=self.hook.timeout_seconds) + + @mock.patch('airflow.contrib.hooks.databricks_hook.requests') + def test_terminate_cluster(self, mock_requests): + mock_requests.codes.ok = 200 + mock_requests.post.return_value.json.return_value = {} + status_code_mock = mock.PropertyMock(return_value=200) + type(mock_requests.post.return_value).status_code = status_code_mock + + self.hook.terminate_cluster({"cluster_id": CLUSTER_ID}) + + mock_requests.post.assert_called_once_with( + terminate_cluster_endpoint(HOST), + json={'cluster_id': CLUSTER_ID}, + auth=(LOGIN, PASSWORD), + headers=USER_AGENT_HEADER, + timeout=self.hook.timeout_seconds) + class DatabricksHookTokenTest(unittest.TestCase): """ diff --git a/tests/contrib/hooks/test_discord_webhook_hook.py b/tests/contrib/hooks/test_discord_webhook_hook.py index c92b198fc20e1..c6b3eac00fd07 100644 --- a/tests/contrib/hooks/test_discord_webhook_hook.py +++ b/tests/contrib/hooks/test_discord_webhook_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_emr_hook.py b/tests/contrib/hooks/test_emr_hook.py index dc981ba093b3c..edb2dbb049fad 100644 --- a/tests/contrib/hooks/test_emr_hook.py +++ b/tests/contrib/hooks/test_emr_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_ftp_hook.py b/tests/contrib/hooks/test_ftp_hook.py index ac5db561c32f6..8b9ae2cd59556 100644 --- a/tests/contrib/hooks/test_ftp_hook.py +++ b/tests/contrib/hooks/test_ftp_hook.py @@ -7,9 +7,9 @@ # 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 @@ -82,19 +82,19 @@ def test_rename(self): self.conn_mock.rename.assert_called_once_with(from_path, to_path) self.conn_mock.quit.assert_called_once_with() - + def test_mod_time(self): self.conn_mock.sendcmd.return_value = '213 20170428010138' - + path = '/path/file' with fh.FTPHook() as ftp_hook: ftp_hook.get_mod_time(path) self.conn_mock.sendcmd.assert_called_once_with('MDTM ' + path) - + def test_mod_time_micro(self): self.conn_mock.sendcmd.return_value = '213 20170428010138.003' - + path = '/path/file' with fh.FTPHook() as ftp_hook: ftp_hook.get_mod_time(path) diff --git a/tests/contrib/hooks/test_gcp_dataflow_hook.py b/tests/contrib/hooks/test_gcp_dataflow_hook.py index 7811e4aabd59f..653993a7de7c1 100644 --- a/tests/contrib/hooks/test_gcp_dataflow_hook.py +++ b/tests/contrib/hooks/test_gcp_dataflow_hook.py @@ -19,7 +19,6 @@ # import unittest -from mock import call from mock import MagicMock from airflow.contrib.hooks.gcp_dataflow_hook import DataFlowHook,\ @@ -35,6 +34,7 @@ TASK_ID = 'test-dataflow-operator' +JOB_NAME = 'test-dataflow-pipeline' TEMPLATE = 'gs://dataflow-templates/wordcount/template_file' PARAMETERS = { 'inputFile': 'gs://dataflow-samples/shakespeare/kinglear.txt', @@ -79,7 +79,7 @@ def setUp(self): new=mock_init): self.dataflow_hook = DataFlowHook(gcp_conn_id='test') - @mock.patch(DATAFLOW_STRING.format('uuid.uuid1')) + @mock.patch(DATAFLOW_STRING.format('uuid.uuid4')) @mock.patch(DATAFLOW_STRING.format('_DataflowJob')) @mock.patch(DATAFLOW_STRING.format('_Dataflow')) @mock.patch(DATAFLOW_STRING.format('DataFlowHook.get_conn')) @@ -92,18 +92,18 @@ def test_start_python_dataflow(self, mock_conn, dataflowjob_instance = mock_dataflowjob.return_value dataflowjob_instance.wait_for_done.return_value = None self.dataflow_hook.start_python_dataflow( - task_id=TASK_ID, variables=DATAFLOW_OPTIONS_PY, + job_name=JOB_NAME, variables=DATAFLOW_OPTIONS_PY, dataflow=PY_FILE, py_options=PY_OPTIONS) - EXPECTED_CMD = ['python', '-m', PY_FILE, + EXPECTED_CMD = ['python2', '-m', PY_FILE, '--region=us-central1', '--runner=DataflowRunner', '--project=test', '--labels=foo=bar', '--staging_location=gs://test/staging', - '--job_name={}-{}'.format(TASK_ID, MOCK_UUID)] + '--job_name={}-{}'.format(JOB_NAME, MOCK_UUID)] self.assertListEqual(sorted(mock_dataflow.call_args[0][0]), sorted(EXPECTED_CMD)) - @mock.patch(DATAFLOW_STRING.format('uuid.uuid1')) + @mock.patch(DATAFLOW_STRING.format('uuid.uuid4')) @mock.patch(DATAFLOW_STRING.format('_DataflowJob')) @mock.patch(DATAFLOW_STRING.format('_Dataflow')) @mock.patch(DATAFLOW_STRING.format('DataFlowHook.get_conn')) @@ -116,18 +116,18 @@ def test_start_java_dataflow(self, mock_conn, dataflowjob_instance = mock_dataflowjob.return_value dataflowjob_instance.wait_for_done.return_value = None self.dataflow_hook.start_java_dataflow( - task_id=TASK_ID, variables=DATAFLOW_OPTIONS_JAVA, + job_name=JOB_NAME, variables=DATAFLOW_OPTIONS_JAVA, dataflow=JAR_FILE) EXPECTED_CMD = ['java', '-jar', JAR_FILE, '--region=us-central1', '--runner=DataflowRunner', '--project=test', '--stagingLocation=gs://test/staging', '--labels={"foo":"bar"}', - '--jobName={}-{}'.format(TASK_ID, MOCK_UUID)] + '--jobName={}-{}'.format(JOB_NAME, MOCK_UUID)] self.assertListEqual(sorted(mock_dataflow.call_args[0][0]), sorted(EXPECTED_CMD)) - @mock.patch(DATAFLOW_STRING.format('uuid.uuid1')) + @mock.patch(DATAFLOW_STRING.format('uuid.uuid4')) @mock.patch(DATAFLOW_STRING.format('_DataflowJob')) @mock.patch(DATAFLOW_STRING.format('_Dataflow')) @mock.patch(DATAFLOW_STRING.format('DataFlowHook.get_conn')) @@ -140,18 +140,17 @@ def test_start_java_dataflow_with_job_class( dataflowjob_instance = mock_dataflowjob.return_value dataflowjob_instance.wait_for_done.return_value = None self.dataflow_hook.start_java_dataflow( - task_id=TASK_ID, variables=DATAFLOW_OPTIONS_JAVA, + job_name=JOB_NAME, variables=DATAFLOW_OPTIONS_JAVA, dataflow=JAR_FILE, job_class=JOB_CLASS) EXPECTED_CMD = ['java', '-cp', JAR_FILE, JOB_CLASS, '--region=us-central1', '--runner=DataflowRunner', '--project=test', '--stagingLocation=gs://test/staging', '--labels={"foo":"bar"}', - '--jobName={}-{}'.format(TASK_ID, MOCK_UUID)] + '--jobName={}-{}'.format(JOB_NAME, MOCK_UUID)] self.assertListEqual(sorted(mock_dataflow.call_args[0][0]), sorted(EXPECTED_CMD)) - @mock.patch('airflow.contrib.hooks.gcp_dataflow_hook._Dataflow.log') @mock.patch('subprocess.Popen') @mock.patch('select.select') @@ -178,18 +177,18 @@ def poll_resp_error(): def test_valid_dataflow_job_name(self): job_name = self.dataflow_hook._build_dataflow_job_name( - task_id=TASK_ID, append_job_name=False + job_name=JOB_NAME, append_job_name=False ) - self.assertEquals(job_name, TASK_ID) + self.assertEquals(job_name, JOB_NAME) - def test_fix_underscore_in_task_id(self): - task_id_with_underscore = 'test_example' - fixed_job_name = task_id_with_underscore.replace( + def test_fix_underscore_in_job_name(self): + job_name_with_underscore = 'test_example' + fixed_job_name = job_name_with_underscore.replace( '_', '-' ) job_name = self.dataflow_hook._build_dataflow_job_name( - task_id=task_id_with_underscore, append_job_name=False + job_name=job_name_with_underscore, append_job_name=False ) self.assertEquals(job_name, fixed_job_name) @@ -201,7 +200,7 @@ def test_invalid_dataflow_job_name(self): with self.assertRaises(ValueError) as e: self.dataflow_hook._build_dataflow_job_name( - task_id=invalid_job_name, append_job_name=False + job_name=invalid_job_name, append_job_name=False ) # Test whether the job_name is present in the Error msg self.assertIn('Invalid job_name ({})'.format(fixed_name), @@ -210,37 +209,37 @@ def test_invalid_dataflow_job_name(self): def test_dataflow_job_regex_check(self): self.assertEquals(self.dataflow_hook._build_dataflow_job_name( - task_id='df-job-1', append_job_name=False + job_name='df-job-1', append_job_name=False ), 'df-job-1') self.assertEquals(self.dataflow_hook._build_dataflow_job_name( - task_id='df-job', append_job_name=False + job_name='df-job', append_job_name=False ), 'df-job') self.assertEquals(self.dataflow_hook._build_dataflow_job_name( - task_id='dfjob', append_job_name=False + job_name='dfjob', append_job_name=False ), 'dfjob') self.assertEquals(self.dataflow_hook._build_dataflow_job_name( - task_id='dfjob1', append_job_name=False + job_name='dfjob1', append_job_name=False ), 'dfjob1') self.assertRaises( ValueError, self.dataflow_hook._build_dataflow_job_name, - task_id='1dfjob', append_job_name=False + job_name='1dfjob', append_job_name=False ) self.assertRaises( ValueError, self.dataflow_hook._build_dataflow_job_name, - task_id='dfjob@', append_job_name=False + job_name='dfjob@', append_job_name=False ) self.assertRaises( ValueError, self.dataflow_hook._build_dataflow_job_name, - task_id='df^jo', append_job_name=False + job_name='df^jo', append_job_name=False ) @@ -254,7 +253,7 @@ def setUp(self): @mock.patch(DATAFLOW_STRING.format('DataFlowHook._start_template_dataflow')) def test_start_template_dataflow(self, internal_dataflow_mock): self.dataflow_hook.start_template_dataflow( - task_id=TASK_ID, variables=DATAFLOW_OPTIONS_TEMPLATE, parameters=PARAMETERS, + job_name=JOB_NAME, variables=DATAFLOW_OPTIONS_TEMPLATE, parameters=PARAMETERS, dataflow_template=TEMPLATE) internal_dataflow_mock.assert_called_once_with( mock.ANY, DATAFLOW_OPTIONS_TEMPLATE, PARAMETERS, TEMPLATE) diff --git a/tests/contrib/hooks/test_gcp_dataproc_hook.py b/tests/contrib/hooks/test_gcp_dataproc_hook.py index f2629ff148ce1..e22b27a8e7165 100644 --- a/tests/contrib/hooks/test_gcp_dataproc_hook.py +++ b/tests/contrib/hooks/test_gcp_dataproc_hook.py @@ -7,9 +7,9 @@ # 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 @@ -19,6 +19,7 @@ # import unittest +from airflow.contrib.hooks.gcp_dataproc_hook import _DataProcJob from airflow.contrib.hooks.gcp_dataproc_hook import DataProcHook try: @@ -37,9 +38,11 @@ BASE_STRING = 'airflow.contrib.hooks.gcp_api_base_hook.{}' DATAPROC_STRING = 'airflow.contrib.hooks.gcp_dataproc_hook.{}' + def mock_init(self, gcp_conn_id, delegate_to=None): pass + class DataProcHookTest(unittest.TestCase): def setUp(self): with mock.patch(BASE_STRING.format('GoogleCloudBaseHook.__init__'), @@ -48,6 +51,48 @@ def setUp(self): @mock.patch(DATAPROC_STRING.format('_DataProcJob')) def test_submit(self, job_mock): - with mock.patch(DATAPROC_STRING.format('DataProcHook.get_conn', return_value=None)): - self.dataproc_hook.submit(PROJECT_ID, JOB) - job_mock.assert_called_once_with(mock.ANY, PROJECT_ID, JOB, REGION) + with mock.patch(DATAPROC_STRING.format('DataProcHook.get_conn', + return_value=None)): + self.dataproc_hook.submit(PROJECT_ID, JOB) + job_mock.assert_called_once_with(mock.ANY, PROJECT_ID, JOB, REGION, + job_error_states=mock.ANY) + + +class DataProcJobTest(unittest.TestCase): + @mock.patch(DATAPROC_STRING.format('_DataProcJob.__init__'), return_value=None) + def test_raise_error_default_job_error_states(self, mock_init): + job = _DataProcJob() + job.job = {'status': {'state': 'ERROR'}} + job.job_error_states = None + with self.assertRaises(Exception) as cm: + job.raise_error() + self.assertIn('ERROR', str(cm.exception)) + + @mock.patch(DATAPROC_STRING.format('_DataProcJob.__init__'), return_value=None) + def test_raise_error_custom_job_error_states(self, mock_init): + job = _DataProcJob() + job.job = {'status': {'state': 'CANCELLED'}} + job.job_error_states = ['ERROR', 'CANCELLED'] + with self.assertRaises(Exception) as cm: + job.raise_error() + self.assertIn('CANCELLED', str(cm.exception)) + + @mock.patch(DATAPROC_STRING.format('_DataProcJob.__init__'), return_value=None) + def test_raise_error_fallback_job_error_states(self, mock_init): + job = _DataProcJob() + job.job = {'status': {'state': 'ERROR'}} + job.job_error_states = ['CANCELLED'] + with self.assertRaises(Exception) as cm: + job.raise_error() + self.assertIn('ERROR', str(cm.exception)) + + @mock.patch(DATAPROC_STRING.format('_DataProcJob.__init__'), return_value=None) + def test_raise_error_with_state_done(self, mock_init): + job = _DataProcJob() + job.job = {'status': {'state': 'DONE'}} + job.job_error_states = None + try: + job.raise_error() + # Pass test + except Exception: + self.fail("raise_error() should not raise Exception when job=%s" % job.job) diff --git a/tests/contrib/hooks/test_gcp_pubsub_hook.py b/tests/contrib/hooks/test_gcp_pubsub_hook.py index 98f1b1316392c..b1290fb3320c3 100644 --- a/tests/contrib/hooks/test_gcp_pubsub_hook.py +++ b/tests/contrib/hooks/test_gcp_pubsub_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_jdbc_hook.py b/tests/contrib/hooks/test_jdbc_hook.py index c1b994907be1c..fd4a4fc337355 100644 --- a/tests/contrib/hooks/test_jdbc_hook.py +++ b/tests/contrib/hooks/test_jdbc_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_jira_hook.py b/tests/contrib/hooks/test_jira_hook.py index e07ddf32fc788..029a45299067b 100644 --- a/tests/contrib/hooks/test_jira_hook.py +++ b/tests/contrib/hooks/test_jira_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_redis_hook.py b/tests/contrib/hooks/test_redis_hook.py index ca8bdea3b3448..12c30680e1bfa 100644 --- a/tests/contrib/hooks/test_redis_hook.py +++ b/tests/contrib/hooks/test_redis_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_redshift_hook.py b/tests/contrib/hooks/test_redshift_hook.py index 029dfd38016c5..103411207071c 100644 --- a/tests/contrib/hooks/test_redshift_hook.py +++ b/tests/contrib/hooks/test_redshift_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_sagemaker_hook.py b/tests/contrib/hooks/test_sagemaker_hook.py index 8bb56cc8e7d12..3a863b3cb0dc7 100644 --- a/tests/contrib/hooks/test_sagemaker_hook.py +++ b/tests/contrib/hooks/test_sagemaker_hook.py @@ -47,6 +47,8 @@ job_name = 'test-job-name' +model_name = 'test-model-name' + image = 'test-image' test_arn_return = {'TrainingJobArn': 'testarn'} @@ -152,6 +154,38 @@ } } +create_transform_params = \ + { + 'TransformJobName': job_name, + 'ModelName': model_name, + 'BatchStrategy': 'MultiRecord', + 'TransformInput': { + 'DataSource': { + 'S3DataSource': { + 'S3DataType': 'S3Prefix', + 'S3Uri': data_url + } + } + }, + 'TransformOutput': { + 'S3OutputPath': output_url, + }, + 'TransformResources': { + 'InstanceType': 'ml.m4.xlarge', + 'InstanceCount': 123 + } + } + +create_model_params = \ + { + 'ModelName': model_name, + 'PrimaryContainer': { + 'Image': image, + 'ModelDataUrl': output_url, + }, + 'ExecutionRoleArn': role + } + db_config = { 'Tags': [ { @@ -393,6 +427,52 @@ def test_create_tuning_job_db_config(self, mock_client, mock_check_tuning): assert_called_once_with(**updated_config) self.assertEqual(response, test_arn_return) + @mock.patch.object(SageMakerHook, 'check_for_url') + @mock.patch.object(SageMakerHook, 'get_conn') + def test_create_transform_job(self, mock_client, mock_check_url): + mock_check_url.return_value = True + mock_session = mock.Mock() + attrs = {'create_transform_job.return_value': + test_arn_return} + mock_session.configure_mock(**attrs) + mock_client.return_value = mock_session + hook = SageMakerHook(sagemaker_conn_id='sagemaker_test_conn_id') + response = hook.create_transform_job(create_transform_params, + wait_for_completion=False) + mock_session.create_transform_job.assert_called_once_with( + **create_transform_params) + self.assertEqual(response, test_arn_return) + + @mock.patch.object(SageMakerHook, 'check_for_url') + @mock.patch.object(SageMakerHook, 'get_conn') + def test_create_transform_job_db_config(self, mock_client, mock_check_url): + mock_check_url.return_value = True + mock_session = mock.Mock() + attrs = {'create_transform_job.return_value': + test_arn_return} + mock_session.configure_mock(**attrs) + mock_client.return_value = mock_session + hook_use_db_config = SageMakerHook(sagemaker_conn_id='sagemaker_test_conn_id', + use_db_config=True) + response = hook_use_db_config.create_transform_job( + create_transform_params, wait_for_completion=False) + updated_config = copy.deepcopy(create_transform_params) + updated_config.update(db_config) + mock_session.create_transform_job.assert_called_once_with(**updated_config) + self.assertEqual(response, test_arn_return) + + @mock.patch.object(SageMakerHook, 'get_conn') + def test_create_model(self, mock_client): + mock_session = mock.Mock() + attrs = {'create_model.return_value': + test_arn_return} + mock_session.configure_mock(**attrs) + mock_client.return_value = mock_session + hook = SageMakerHook(sagemaker_conn_id='sagemaker_test_conn_id') + response = hook.create_model(create_model_params) + mock_session.create_model.assert_called_once_with(**create_model_params) + self.assertEqual(response, test_arn_return) + @mock.patch.object(SageMakerHook, 'get_conn') def test_describe_training_job(self, mock_client): mock_session = mock.Mock() @@ -418,6 +498,19 @@ def test_describe_tuning_job(self, mock_client): assert_called_once_with(HyperParameterTuningJobName=job_name) self.assertEqual(response, 'InProgress') + @mock.patch.object(SageMakerHook, 'get_conn') + def test_describe_transform_job(self, mock_client): + mock_session = mock.Mock() + attrs = {'describe_transform_job.return_value': + 'InProgress'} + mock_session.configure_mock(**attrs) + mock_client.return_value = mock_session + hook = SageMakerHook(sagemaker_conn_id='sagemaker_test_conn_id') + response = hook.describe_transform_job(job_name) + mock_session.describe_transform_job.\ + assert_called_once_with(TransformJobName=job_name) + self.assertEqual(response, 'InProgress') + if __name__ == '__main__': unittest.main() diff --git a/tests/contrib/hooks/test_sftp_hook.py b/tests/contrib/hooks/test_sftp_hook.py index 105b6b81d8478..322b5bbbe13a7 100644 --- a/tests/contrib/hooks/test_sftp_hook.py +++ b/tests/contrib/hooks/test_sftp_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_slack_webhook_hook.py b/tests/contrib/hooks/test_slack_webhook_hook.py index 3f657aa741e31..a26204f39ef39 100644 --- a/tests/contrib/hooks/test_slack_webhook_hook.py +++ b/tests/contrib/hooks/test_slack_webhook_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_snowflake_hook.py b/tests/contrib/hooks/test_snowflake_hook.py index aaaf57a00b8d8..a6bc375be60e6 100644 --- a/tests/contrib/hooks/test_snowflake_hook.py +++ b/tests/contrib/hooks/test_snowflake_hook.py @@ -8,9 +8,9 @@ # 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 diff --git a/tests/contrib/hooks/test_spark_jdbc_hook.py b/tests/contrib/hooks/test_spark_jdbc_hook.py index 2451b4a157c60..a6202dcfb95ca 100644 --- a/tests/contrib/hooks/test_spark_jdbc_hook.py +++ b/tests/contrib/hooks/test_spark_jdbc_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_spark_sql_hook.py b/tests/contrib/hooks/test_spark_sql_hook.py index c95ee3fb130d0..47ccd618b321a 100644 --- a/tests/contrib/hooks/test_spark_sql_hook.py +++ b/tests/contrib/hooks/test_spark_sql_hook.py @@ -19,9 +19,7 @@ # import six -import sys import unittest -from io import StringIO from itertools import dropwhile from mock import patch, call diff --git a/tests/contrib/hooks/test_sqoop_hook.py b/tests/contrib/hooks/test_sqoop_hook.py index 47c9a7be8e283..649500a364174 100644 --- a/tests/contrib/hooks/test_sqoop_hook.py +++ b/tests/contrib/hooks/test_sqoop_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_wasb_hook.py b/tests/contrib/hooks/test_wasb_hook.py index 7a81512835a76..b5545e2727152 100644 --- a/tests/contrib/hooks/test_wasb_hook.py +++ b/tests/contrib/hooks/test_wasb_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/hooks/test_zendesk_hook.py b/tests/contrib/hooks/test_zendesk_hook.py index 799919b3a0d3b..99dd8926dc40b 100644 --- a/tests/contrib/hooks/test_zendesk_hook.py +++ b/tests/contrib/hooks/test_zendesk_hook.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/minikube/test_kubernetes_executor.py b/tests/contrib/minikube/test_kubernetes_executor.py index 45d4124d07973..23bdfaec8d5bf 100644 --- a/tests/contrib/minikube/test_kubernetes_executor.py +++ b/tests/contrib/minikube/test_kubernetes_executor.py @@ -16,6 +16,7 @@ # under the License. +import os import unittest from subprocess import check_call, check_output import requests.exceptions @@ -25,18 +26,25 @@ import re try: - check_call(["kubectl", "get", "pods"]) + check_call(["/usr/local/bin/kubectl", "get", "pods"]) except Exception as e: - raise unittest.SkipTest( - "Kubernetes integration tests require a minikube cluster;" - "Skipping tests {}".format(e) - ) + if os.environ.get('KUBERNETES_VERSION'): + raise e + else: + raise unittest.SkipTest( + "Kubernetes integration tests require a minikube cluster;" + "Skipping tests {}".format(e) + ) def get_minikube_host(): - host_ip = check_output(['minikube', 'ip']) - if six.PY3: - host_ip = host_ip.decode('UTF-8') + if "MINIKUBE_IP" in os.environ: + host_ip = os.environ['MINIKUBE_IP'] + else: + host_ip = check_output(['/usr/local/bin/minikube', 'ip']) + if six.PY3: + host_ip = host_ip.decode('UTF-8') + host = '{}:30809'.format(host_ip.strip()) return host diff --git a/tests/contrib/minikube/test_kubernetes_pod_operator.py b/tests/contrib/minikube/test_kubernetes_pod_operator.py index 5cb02d1ff1ba6..f39fcdb03d56a 100644 --- a/tests/contrib/minikube/test_kubernetes_pod_operator.py +++ b/tests/contrib/minikube/test_kubernetes_pod_operator.py @@ -20,6 +20,7 @@ import shutil from airflow.contrib.operators.kubernetes_pod_operator import KubernetesPodOperator from airflow import AirflowException +from kubernetes.client.rest import ApiException from subprocess import check_call import mock import json @@ -28,12 +29,15 @@ from airflow.contrib.kubernetes.volume import Volume try: - check_call(["kubectl", "get", "pods"]) + check_call(["/usr/local/bin/kubectl", "get", "pods"]) except Exception as e: - raise unittest.SkipTest( - "Kubernetes integration tests require a minikube cluster;" - "Skipping tests {}".format(e) - ) + if os.environ.get('KUBERNETES_VERSION'): + raise e + else: + raise unittest.SkipTest( + "Kubernetes integration tests require a minikube cluster;" + "Skipping tests {}".format(e) + ) class KubernetesPodOperatorTest(unittest.TestCase): @@ -93,6 +97,34 @@ def test_working_pod(): ) k.execute(None) + @staticmethod + def test_delete_operator_pod(): + k = KubernetesPodOperator( + namespace='default', + image="ubuntu:16.04", + cmds=["bash", "-cx"], + arguments=["echo 10"], + labels={"foo": "bar"}, + name="test", + task_id="task", + is_delete_operator_pod=True + ) + k.execute(None) + + @staticmethod + def test_pod_hostnetwork(): + k = KubernetesPodOperator( + namespace='default', + image="ubuntu:16.04", + cmds=["bash", "-cx"], + arguments=["echo 10"], + labels={"foo": "bar"}, + name="test", + task_id="task", + hostnetwork=True + ) + k.execute(None) + @staticmethod def test_pod_node_selectors(): node_selectors = { @@ -200,10 +232,24 @@ def test_faulty_image(self): task_id="task", startup_timeout_seconds=5 ) - with self.assertRaises(AirflowException) as cm: - k.execute(None), + with self.assertRaises(AirflowException): + k.execute(None) - print("exception: {}".format(cm)) + def test_faulty_service_account(self): + bad_service_account_name = "foobar" + k = KubernetesPodOperator( + namespace='default', + image="ubuntu:16.04", + cmds=["bash", "-cx"], + arguments=["echo 10"], + labels={"foo": "bar"}, + name="test", + task_id="task", + startup_timeout_seconds=5, + service_account_name=bad_service_account_name + ) + with self.assertRaises(ApiException): + k.execute(None) def test_pod_failure(self): """ diff --git a/tests/contrib/operators/__init__.py b/tests/contrib/operators/__init__.py index fc532e61c6c64..331c28ef9ab6c 100644 --- a/tests/contrib/operators/__init__.py +++ b/tests/contrib/operators/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_awsbatch_operator.py b/tests/contrib/operators/test_awsbatch_operator.py index 11725cae1b6fb..273edd5630e74 100644 --- a/tests/contrib/operators/test_awsbatch_operator.py +++ b/tests/contrib/operators/test_awsbatch_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_bigquery_operator.py b/tests/contrib/operators/test_bigquery_operator.py index 7c76ab73fec81..9ce3b478d3338 100644 --- a/tests/contrib/operators/test_bigquery_operator.py +++ b/tests/contrib/operators/test_bigquery_operator.py @@ -22,8 +22,8 @@ from airflow.contrib.operators.bigquery_operator import \ BigQueryCreateExternalTableOperator, \ - BigQueryOperator, \ - BigQueryCreateEmptyTableOperator, BigQueryDeleteDatasetOperator + BigQueryOperator, BigQueryCreateEmptyTableOperator, \ + BigQueryDeleteDatasetOperator, BigQueryCreateEmptyDatasetOperator try: from unittest import mock @@ -136,3 +136,24 @@ def test_execute(self, mock_hook): dataset_id=TEST_DATASET, project_id=TEST_PROJECT_ID ) + + +class BigQueryCreateEmptyDatasetOperatorTest(unittest.TestCase): + @mock.patch('airflow.contrib.operators.bigquery_operator.BigQueryHook') + def test_execute(self, mock_hook): + operator = BigQueryCreateEmptyDatasetOperator( + task_id=TASK_ID, + dataset_id=TEST_DATASET, + project_id=TEST_PROJECT_ID + ) + + operator.execute(None) + mock_hook.return_value \ + .get_conn() \ + .cursor() \ + .create_empty_dataset \ + .assert_called_once_with( + dataset_id=TEST_DATASET, + project_id=TEST_PROJECT_ID, + dataset_reference={} + ) diff --git a/tests/contrib/operators/test_databricks_operator.py b/tests/contrib/operators/test_databricks_operator.py index f77da2ec18eda..75602efb7d4fa 100644 --- a/tests/contrib/operators/test_databricks_operator.py +++ b/tests/contrib/operators/test_databricks_operator.py @@ -7,9 +7,9 @@ # 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 @@ -18,12 +18,13 @@ # under the License. # -import jinja2 import unittest from datetime import datetime from airflow.contrib.hooks.databricks_hook import RunState +import airflow.contrib.operators.databricks_operator as databricks_operator from airflow.contrib.operators.databricks_operator import DatabricksSubmitRunOperator +from airflow.contrib.operators.databricks_operator import DatabricksRunNowOperator from airflow.exceptions import AirflowException from airflow.models import DAG @@ -58,6 +59,40 @@ EXISTING_CLUSTER_ID = 'existing-cluster-id' RUN_NAME = 'run-name' RUN_ID = 1 +JOB_ID = 42 +NOTEBOOK_PARAMS = { + "dry-run": "true", + "oldest-time-to-consider": "1457570074236" +} +JAR_PARAMS = ["param1", "param2"] +RENDERED_TEMPLATED_JAR_PARAMS = [ + '/test-{0}'.format(DATE) +] +TEMPLATED_JAR_PARAMS = [ + '/test-{{ ds }}' +] +PYTHON_PARAMS = ["john doe", "35"] +SPARK_SUBMIT_PARAMS = ["--class", "org.apache.spark.examples.SparkPi"] + + +class DatabricksOperatorSharedFunctions(unittest.TestCase): + def test_deep_string_coerce(self): + test_json = { + 'test_int': 1, + 'test_float': 1.0, + 'test_dict': {'key': 'value'}, + 'test_list': [1, 1.0, 'a', 'b'], + 'test_tuple': (1, 1.0, 'a', 'b') + } + + expected = { + 'test_int': '1', + 'test_float': '1.0', + 'test_dict': {'key': 'value'}, + 'test_list': ['1', '1.0', 'a', 'b'], + 'test_tuple': ['1', '1.0', 'a', 'b'] + } + self.assertDictEqual(databricks_operator._deep_string_coerce(test_json), expected) class DatabricksSubmitRunOperatorTest(unittest.TestCase): @@ -65,12 +100,15 @@ def test_init_with_named_parameters(self): """ Test the initializer with the named parameters. """ - op = DatabricksSubmitRunOperator(task_id=TASK_ID, new_cluster=NEW_CLUSTER, notebook_task=NOTEBOOK_TASK) - expected = op._deep_string_coerce({ - 'new_cluster': NEW_CLUSTER, - 'notebook_task': NOTEBOOK_TASK, - 'run_name': TASK_ID + op = DatabricksSubmitRunOperator(task_id=TASK_ID, + new_cluster=NEW_CLUSTER, + notebook_task=NOTEBOOK_TASK) + expected = databricks_operator._deep_string_coerce({ + 'new_cluster': NEW_CLUSTER, + 'notebook_task': NOTEBOOK_TASK, + 'run_name': TASK_ID }) + self.assertDictEqual(expected, op.json) def test_init_with_json(self): @@ -78,14 +116,14 @@ def test_init_with_json(self): Test the initializer with json data. """ json = { - 'new_cluster': NEW_CLUSTER, - 'notebook_task': NOTEBOOK_TASK + 'new_cluster': NEW_CLUSTER, + 'notebook_task': NOTEBOOK_TASK } op = DatabricksSubmitRunOperator(task_id=TASK_ID, json=json) - expected = op._deep_string_coerce({ - 'new_cluster': NEW_CLUSTER, - 'notebook_task': NOTEBOOK_TASK, - 'run_name': TASK_ID + expected = databricks_operator._deep_string_coerce({ + 'new_cluster': NEW_CLUSTER, + 'notebook_task': NOTEBOOK_TASK, + 'run_name': TASK_ID }) self.assertDictEqual(expected, op.json) @@ -99,10 +137,10 @@ def test_init_with_specified_run_name(self): 'run_name': RUN_NAME } op = DatabricksSubmitRunOperator(task_id=TASK_ID, json=json) - expected = op._deep_string_coerce({ - 'new_cluster': NEW_CLUSTER, - 'notebook_task': NOTEBOOK_TASK, - 'run_name': RUN_NAME + expected = databricks_operator._deep_string_coerce({ + 'new_cluster': NEW_CLUSTER, + 'notebook_task': NOTEBOOK_TASK, + 'run_name': RUN_NAME }) self.assertDictEqual(expected, op.json) @@ -114,14 +152,16 @@ def test_init_with_merging(self): """ override_new_cluster = {'workers': 999} json = { - 'new_cluster': NEW_CLUSTER, - 'notebook_task': NOTEBOOK_TASK, + 'new_cluster': NEW_CLUSTER, + 'notebook_task': NOTEBOOK_TASK, } - op = DatabricksSubmitRunOperator(task_id=TASK_ID, json=json, new_cluster=override_new_cluster) - expected = op._deep_string_coerce({ - 'new_cluster': override_new_cluster, - 'notebook_task': NOTEBOOK_TASK, - 'run_name': TASK_ID, + op = DatabricksSubmitRunOperator(task_id=TASK_ID, + json=json, + new_cluster=override_new_cluster) + expected = databricks_operator._deep_string_coerce({ + 'new_cluster': override_new_cluster, + 'notebook_task': NOTEBOOK_TASK, + 'run_name': TASK_ID, }) self.assertDictEqual(expected, op.json) @@ -133,10 +173,10 @@ def test_init_with_templating(self): dag = DAG('test', start_date=datetime.now()) op = DatabricksSubmitRunOperator(dag=dag, task_id=TASK_ID, json=json) op.json = op.render_template('json', op.json, {'ds': DATE}) - expected = op._deep_string_coerce({ - 'new_cluster': NEW_CLUSTER, - 'notebook_task': RENDERED_TEMPLATED_NOTEBOOK_TASK, - 'run_name': TASK_ID, + expected = databricks_operator._deep_string_coerce({ + 'new_cluster': NEW_CLUSTER, + 'notebook_task': RENDERED_TEMPLATED_NOTEBOOK_TASK, + 'run_name': TASK_ID, }) self.assertDictEqual(expected, op.json) @@ -146,27 +186,9 @@ def test_init_with_bad_type(self): } # Looks a bit weird since we have to escape regex reserved symbols. exception_message = 'Type \<(type|class) \'datetime.datetime\'\> used ' + \ - 'for parameter json\[test\] is not a number or a string' + 'for parameter json\[test\] is not a number or a string' with self.assertRaisesRegexp(AirflowException, exception_message): - op = DatabricksSubmitRunOperator(task_id=TASK_ID, json=json) - - def test_deep_string_coerce(self): - op = DatabricksSubmitRunOperator(task_id='test') - test_json = { - 'test_int': 1, - 'test_float': 1.0, - 'test_dict': {'key': 'value'}, - 'test_list': [1, 1.0, 'a', 'b'], - 'test_tuple': (1, 1.0, 'a', 'b') - } - expected = { - 'test_int': '1', - 'test_float': '1.0', - 'test_dict': {'key': 'value'}, - 'test_list': ['1', '1.0', 'a', 'b'], - 'test_tuple': ['1', '1.0', 'a', 'b'] - } - self.assertDictEqual(op._deep_string_coerce(test_json), expected) + DatabricksSubmitRunOperator(task_id=TASK_ID, json=json) @mock.patch('airflow.contrib.operators.databricks_operator.DatabricksHook') def test_exec_success(self, db_mock_class): @@ -184,14 +206,16 @@ def test_exec_success(self, db_mock_class): op.execute(None) - expected = op._deep_string_coerce({ - 'new_cluster': NEW_CLUSTER, - 'notebook_task': NOTEBOOK_TASK, - 'run_name': TASK_ID + expected = databricks_operator._deep_string_coerce({ + 'new_cluster': NEW_CLUSTER, + 'notebook_task': NOTEBOOK_TASK, + 'run_name': TASK_ID }) db_mock_class.assert_called_once_with( - DEFAULT_CONN_ID, - retry_limit=op.databricks_retry_limit) + DEFAULT_CONN_ID, + retry_limit=op.databricks_retry_limit, + retry_delay=op.databricks_retry_delay) + db_mock.submit_run.assert_called_once_with(expected) db_mock.get_run_page_url.assert_called_once_with(RUN_ID) db_mock.get_run_state.assert_called_once_with(RUN_ID) @@ -214,14 +238,15 @@ def test_exec_failure(self, db_mock_class): with self.assertRaises(AirflowException): op.execute(None) - expected = op._deep_string_coerce({ - 'new_cluster': NEW_CLUSTER, - 'notebook_task': NOTEBOOK_TASK, - 'run_name': TASK_ID, + expected = databricks_operator._deep_string_coerce({ + 'new_cluster': NEW_CLUSTER, + 'notebook_task': NOTEBOOK_TASK, + 'run_name': TASK_ID, }) db_mock_class.assert_called_once_with( - DEFAULT_CONN_ID, - retry_limit=op.databricks_retry_limit) + DEFAULT_CONN_ID, + retry_limit=op.databricks_retry_limit, + retry_delay=op.databricks_retry_delay) db_mock.submit_run.assert_called_once_with(expected) db_mock.get_run_page_url.assert_called_once_with(RUN_ID) db_mock.get_run_state.assert_called_once_with(RUN_ID) @@ -230,8 +255,8 @@ def test_exec_failure(self, db_mock_class): @mock.patch('airflow.contrib.operators.databricks_operator.DatabricksHook') def test_on_kill(self, db_mock_class): run = { - 'new_cluster': NEW_CLUSTER, - 'notebook_task': NOTEBOOK_TASK, + 'new_cluster': NEW_CLUSTER, + 'notebook_task': NOTEBOOK_TASK, } op = DatabricksSubmitRunOperator(task_id=TASK_ID, json=run) db_mock = db_mock_class.return_value @@ -241,3 +266,173 @@ def test_on_kill(self, db_mock_class): db_mock.cancel_run.assert_called_once_with(RUN_ID) + +class DatabricksRunNowOperatorTest(unittest.TestCase): + + def test_init_with_named_parameters(self): + """ + Test the initializer with the named parameters. + """ + op = DatabricksRunNowOperator(job_id=JOB_ID, task_id=TASK_ID) + expected = databricks_operator._deep_string_coerce({ + 'job_id': 42 + }) + + self.assertDictEqual(expected, op.json) + + def test_init_with_json(self): + """ + Test the initializer with json data. + """ + json = { + 'notebook_params': NOTEBOOK_PARAMS, + 'jar_params': JAR_PARAMS, + 'python_params': PYTHON_PARAMS, + 'spark_submit_params': SPARK_SUBMIT_PARAMS + } + op = DatabricksRunNowOperator(task_id=TASK_ID, job_id=JOB_ID, json=json) + + expected = databricks_operator._deep_string_coerce({ + 'notebook_params': NOTEBOOK_PARAMS, + 'jar_params': JAR_PARAMS, + 'python_params': PYTHON_PARAMS, + 'spark_submit_params': SPARK_SUBMIT_PARAMS, + 'job_id': JOB_ID + }) + + self.assertDictEqual(expected, op.json) + + def test_init_with_merging(self): + """ + Test the initializer when json and other named parameters are both + provided. The named parameters should override top level keys in the + json dict. + """ + override_notebook_params = {'workers': 999} + json = { + 'notebook_params': NOTEBOOK_PARAMS, + 'jar_params': JAR_PARAMS + } + + op = DatabricksRunNowOperator(task_id=TASK_ID, + json=json, + job_id=JOB_ID, + notebook_params=override_notebook_params, + python_params=PYTHON_PARAMS, + spark_submit_params=SPARK_SUBMIT_PARAMS) + + expected = databricks_operator._deep_string_coerce({ + 'notebook_params': override_notebook_params, + 'jar_params': JAR_PARAMS, + 'python_params': PYTHON_PARAMS, + 'spark_submit_params': SPARK_SUBMIT_PARAMS, + 'job_id': JOB_ID + }) + + self.assertDictEqual(expected, op.json) + + def test_init_with_templating(self): + json = { + 'notebook_params': NOTEBOOK_PARAMS, + 'jar_params': TEMPLATED_JAR_PARAMS + } + + dag = DAG('test', start_date=datetime.now()) + op = DatabricksRunNowOperator(dag=dag, task_id=TASK_ID, job_id=JOB_ID, json=json) + op.json = op.render_template('json', op.json, {'ds': DATE}) + expected = databricks_operator._deep_string_coerce({ + 'notebook_params': NOTEBOOK_PARAMS, + 'jar_params': RENDERED_TEMPLATED_JAR_PARAMS, + 'job_id': JOB_ID + }) + self.assertDictEqual(expected, op.json) + + def test_init_with_bad_type(self): + json = { + 'test': datetime.now() + } + # Looks a bit weird since we have to escape regex reserved symbols. + exception_message = 'Type \<(type|class) \'datetime.datetime\'\> used ' + \ + 'for parameter json\[test\] is not a number or a string' + with self.assertRaisesRegexp(AirflowException, exception_message): + DatabricksRunNowOperator(task_id=TASK_ID, job_id=JOB_ID, json=json) + + @mock.patch('airflow.contrib.operators.databricks_operator.DatabricksHook') + def test_exec_success(self, db_mock_class): + """ + Test the execute function in case where the run is successful. + """ + run = { + 'notebook_params': NOTEBOOK_PARAMS, + 'notebook_task': NOTEBOOK_TASK, + 'jar_params': JAR_PARAMS + } + op = DatabricksRunNowOperator(task_id=TASK_ID, job_id=JOB_ID, json=run) + db_mock = db_mock_class.return_value + db_mock.run_now.return_value = 1 + db_mock.get_run_state.return_value = RunState('TERMINATED', 'SUCCESS', '') + + op.execute(None) + + expected = databricks_operator._deep_string_coerce({ + 'notebook_params': NOTEBOOK_PARAMS, + 'notebook_task': NOTEBOOK_TASK, + 'jar_params': JAR_PARAMS, + 'job_id': JOB_ID + }) + + db_mock_class.assert_called_once_with( + DEFAULT_CONN_ID, + retry_limit=op.databricks_retry_limit, + retry_delay=op.databricks_retry_delay) + db_mock.run_now.assert_called_once_with(expected) + db_mock.get_run_page_url.assert_called_once_with(RUN_ID) + db_mock.get_run_state.assert_called_once_with(RUN_ID) + self.assertEquals(RUN_ID, op.run_id) + + @mock.patch('airflow.contrib.operators.databricks_operator.DatabricksHook') + def test_exec_failure(self, db_mock_class): + """ + Test the execute function in case where the run failed. + """ + run = { + 'notebook_params': NOTEBOOK_PARAMS, + 'notebook_task': NOTEBOOK_TASK, + 'jar_params': JAR_PARAMS + } + op = DatabricksRunNowOperator(task_id=TASK_ID, job_id=JOB_ID, json=run) + db_mock = db_mock_class.return_value + db_mock.run_now.return_value = 1 + db_mock.get_run_state.return_value = RunState('TERMINATED', 'FAILED', '') + + with self.assertRaises(AirflowException): + op.execute(None) + + expected = databricks_operator._deep_string_coerce({ + 'notebook_params': NOTEBOOK_PARAMS, + 'notebook_task': NOTEBOOK_TASK, + 'jar_params': JAR_PARAMS, + 'job_id': JOB_ID + }) + db_mock_class.assert_called_once_with( + DEFAULT_CONN_ID, + retry_limit=op.databricks_retry_limit, + retry_delay=op.databricks_retry_delay) + db_mock.run_now.assert_called_once_with(expected) + db_mock.get_run_page_url.assert_called_once_with(RUN_ID) + db_mock.get_run_state.assert_called_once_with(RUN_ID) + self.assertEquals(RUN_ID, op.run_id) + + @mock.patch('airflow.contrib.operators.databricks_operator.DatabricksHook') + def test_on_kill(self, db_mock_class): + run = { + 'notebook_params': NOTEBOOK_PARAMS, + 'notebook_task': NOTEBOOK_TASK, + 'jar_params': JAR_PARAMS + } + op = DatabricksRunNowOperator(task_id=TASK_ID, job_id=JOB_ID, json=run) + db_mock = db_mock_class.return_value + op.run_id = RUN_ID + + op.on_kill() + db_mock.cancel_run.assert_called_once_with(RUN_ID) diff --git a/tests/contrib/operators/test_dataflow_operator.py b/tests/contrib/operators/test_dataflow_operator.py index 4ea5f65698f03..b951503eb5bf7 100644 --- a/tests/contrib/operators/test_dataflow_operator.py +++ b/tests/contrib/operators/test_dataflow_operator.py @@ -7,9 +7,9 @@ # 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 @@ -20,9 +20,10 @@ import unittest -from airflow.contrib.operators.dataflow_operator import DataFlowPythonOperator, \ - DataFlowJavaOperator, DataflowTemplateOperator -from airflow.contrib.operators.dataflow_operator import DataFlowPythonOperator +from airflow.contrib.operators.dataflow_operator import \ + DataFlowPythonOperator, DataFlowJavaOperator, \ + DataflowTemplateOperator, GoogleCloudBucketHelper + from airflow.version import version try: @@ -35,6 +36,7 @@ TASK_ID = 'test-dataflow-operator' +JOB_NAME = 'test-dataflow-pipeline' TEMPLATE = 'gs://dataflow-templates/wordcount/template_file' PARAMETERS = { 'inputFile': 'gs://dataflow-samples/shakespeare/kinglear.txt', @@ -73,6 +75,7 @@ def setUp(self): self.dataflow = DataFlowPythonOperator( task_id=TASK_ID, py_file=PY_FILE, + job_name=JOB_NAME, py_options=PY_OPTIONS, dataflow_default_options=DEFAULT_OPTIONS_PYTHON, options=ADDITIONAL_OPTIONS, @@ -81,6 +84,7 @@ def setUp(self): def test_init(self): """Test DataFlowPythonOperator instance is properly initialized.""" self.assertEqual(self.dataflow.task_id, TASK_ID) + self.assertEqual(self.dataflow.job_name, JOB_NAME) self.assertEqual(self.dataflow.py_file, PY_FILE) self.assertEqual(self.dataflow.py_options, PY_OPTIONS) self.assertEqual(self.dataflow.poll_sleep, POLL_SLEEP) @@ -107,8 +111,8 @@ def test_exec(self, gcs_hook, dataflow_mock): 'labels': {'foo': 'bar', 'airflow-version': TEST_VERSION} } gcs_download_hook.assert_called_once_with(PY_FILE) - start_python_hook.assert_called_once_with(TASK_ID, expected_options, - mock.ANY, PY_OPTIONS) + start_python_hook.assert_called_once_with(JOB_NAME, expected_options, mock.ANY, + PY_OPTIONS) self.assertTrue(self.dataflow.py_file.startswith('/tmp/dataflow')) @@ -118,6 +122,7 @@ def setUp(self): self.dataflow = DataFlowJavaOperator( task_id=TASK_ID, jar=JAR_FILE, + job_name=JOB_NAME, job_class=JOB_CLASS, dataflow_default_options=DEFAULT_OPTIONS_JAVA, options=ADDITIONAL_OPTIONS, @@ -126,6 +131,7 @@ def setUp(self): def test_init(self): """Test DataflowTemplateOperator instance is properly initialized.""" self.assertEqual(self.dataflow.task_id, TASK_ID) + self.assertEqual(self.dataflow.job_name, JOB_NAME) self.assertEqual(self.dataflow.poll_sleep, POLL_SLEEP) self.assertEqual(self.dataflow.dataflow_default_options, DEFAULT_OPTIONS_JAVA) @@ -146,7 +152,7 @@ def test_exec(self, gcs_hook, dataflow_mock): self.dataflow.execute(None) self.assertTrue(dataflow_mock.called) gcs_download_hook.assert_called_once_with(JAR_FILE) - start_java_hook.assert_called_once_with(TASK_ID, mock.ANY, + start_java_hook.assert_called_once_with(JOB_NAME, mock.ANY, mock.ANY, JOB_CLASS) @@ -156,6 +162,7 @@ def setUp(self): self.dataflow = DataflowTemplateOperator( task_id=TASK_ID, template=TEMPLATE, + job_name=JOB_NAME, parameters=PARAMETERS, dataflow_default_options=DEFAULT_OPTIONS_TEMPLATE, poll_sleep=POLL_SLEEP) @@ -163,6 +170,7 @@ def setUp(self): def test_init(self): """Test DataflowTemplateOperator instance is properly initialized.""" self.assertEqual(self.dataflow.task_id, TASK_ID) + self.assertEqual(self.dataflow.job_name, JOB_NAME) self.assertEqual(self.dataflow.template, TEMPLATE) self.assertEqual(self.dataflow.parameters, PARAMETERS) self.assertEqual(self.dataflow.poll_sleep, POLL_SLEEP) @@ -184,5 +192,75 @@ def test_exec(self, dataflow_mock): 'tempLocation': 'gs://test/temp', 'zone': 'us-central1-f' } - start_template_hook.assert_called_once_with(TASK_ID, expected_options, + start_template_hook.assert_called_once_with(JOB_NAME, expected_options, PARAMETERS, TEMPLATE) + + +class GoogleCloudBucketHelperTest(unittest.TestCase): + + @mock.patch( + 'airflow.contrib.operators.dataflow_operator.GoogleCloudBucketHelper.__init__' + ) + def test_invalid_object_path(self, mock_parent_init): + + # This is just the path of a bucket hence invalid filename + file_name = 'gs://test-bucket' + mock_parent_init.return_value = None + + gcs_bucket_helper = GoogleCloudBucketHelper() + gcs_bucket_helper._gcs_hook = mock.Mock() + + with self.assertRaises(Exception) as context: + gcs_bucket_helper.google_cloud_to_local(file_name) + + self.assertEquals( + 'Invalid Google Cloud Storage (GCS) object path: {}'.format(file_name), + str(context.exception)) + + @mock.patch( + 'airflow.contrib.operators.dataflow_operator.GoogleCloudBucketHelper.__init__' + ) + def test_valid_object(self, mock_parent_init): + + file_name = 'gs://test-bucket/path/to/obj.jar' + mock_parent_init.return_value = None + + gcs_bucket_helper = GoogleCloudBucketHelper() + gcs_bucket_helper._gcs_hook = mock.Mock() + + def _mock_download(bucket, object, filename=None): + text_file_contents = 'text file contents' + with open(filename, 'w') as text_file: + text_file.write(text_file_contents) + return text_file_contents + + gcs_bucket_helper._gcs_hook.download.side_effect = _mock_download + + local_file = gcs_bucket_helper.google_cloud_to_local(file_name) + self.assertIn('obj.jar', local_file) + + @mock.patch( + 'airflow.contrib.operators.dataflow_operator.GoogleCloudBucketHelper.__init__' + ) + def test_empty_object(self, mock_parent_init): + + file_name = 'gs://test-bucket/path/to/obj.jar' + mock_parent_init.return_value = None + + gcs_bucket_helper = GoogleCloudBucketHelper() + gcs_bucket_helper._gcs_hook = mock.Mock() + + def _mock_download(bucket, object, filename=None): + text_file_contents = '' + with open(filename, 'w') as text_file: + text_file.write(text_file_contents) + return text_file_contents + + gcs_bucket_helper._gcs_hook.download.side_effect = _mock_download + + with self.assertRaises(Exception) as context: + gcs_bucket_helper.google_cloud_to_local(file_name) + + self.assertEquals( + 'Failed to download Google Cloud Storage (GCS) object: {}'.format(file_name), + str(context.exception)) diff --git a/tests/contrib/operators/test_dataproc_operator.py b/tests/contrib/operators/test_dataproc_operator.py index e5cc770321b52..60c1268ee7a5f 100644 --- a/tests/contrib/operators/test_dataproc_operator.py +++ b/tests/contrib/operators/test_dataproc_operator.py @@ -59,10 +59,13 @@ TAGS = ['tag1', 'tag2'] STORAGE_BUCKET = 'gs://airflow-test-bucket/' IMAGE_VERSION = '1.1' +CUSTOM_IMAGE = 'test-custom-image' MASTER_MACHINE_TYPE = 'n1-standard-2' MASTER_DISK_SIZE = 100 +MASTER_DISK_TYPE = 'pd-standard' WORKER_MACHINE_TYPE = 'n1-standard-2' WORKER_DISK_SIZE = 100 +WORKER_DISK_TYPE = 'pd-standard' NUM_PREEMPTIBLE_WORKERS = 2 GET_INIT_ACTION_TIMEOUT = "600s" # 10m LABEL1 = {} @@ -125,8 +128,10 @@ def setUp(self): storage_bucket=STORAGE_BUCKET, image_version=IMAGE_VERSION, master_machine_type=MASTER_MACHINE_TYPE, + master_disk_type=MASTER_DISK_TYPE, master_disk_size=MASTER_DISK_SIZE, worker_machine_type=WORKER_MACHINE_TYPE, + worker_disk_type=WORKER_DISK_TYPE, worker_disk_size=WORKER_DISK_SIZE, num_preemptible_workers=NUM_PREEMPTIBLE_WORKERS, labels=deepcopy(labels), @@ -159,8 +164,10 @@ def test_init(self): self.assertEqual(dataproc_operator.image_version, IMAGE_VERSION) self.assertEqual(dataproc_operator.master_machine_type, MASTER_MACHINE_TYPE) self.assertEqual(dataproc_operator.master_disk_size, MASTER_DISK_SIZE) + self.assertEqual(dataproc_operator.master_disk_type, MASTER_DISK_TYPE) self.assertEqual(dataproc_operator.worker_machine_type, WORKER_MACHINE_TYPE) self.assertEqual(dataproc_operator.worker_disk_size, WORKER_DISK_SIZE) + self.assertEqual(dataproc_operator.worker_disk_type, WORKER_DISK_TYPE) self.assertEqual(dataproc_operator.num_preemptible_workers, NUM_PREEMPTIBLE_WORKERS) self.assertEqual(dataproc_operator.labels, self.labels[suffix]) @@ -258,6 +265,39 @@ def test_build_cluster_data_with_autoDeleteTime_and_autoDeleteTtl(self): self.assertEqual(cluster_data['config']['lifecycleConfig']['autoDeleteTime'], "2017-06-07T00:00:00.000000Z") + def test_init_with_image_version_and_custom_image_both_set(self): + with self.assertRaises(AssertionError): + DataprocClusterCreateOperator( + task_id=TASK_ID, + cluster_name=CLUSTER_NAME, + project_id=PROJECT_ID, + num_workers=NUM_WORKERS, + zone=ZONE, + dag=self.dag, + image_version=IMAGE_VERSION, + custom_image=CUSTOM_IMAGE + ) + + def test_init_with_custom_image(self): + dataproc_operator = DataprocClusterCreateOperator( + task_id=TASK_ID, + cluster_name=CLUSTER_NAME, + project_id=PROJECT_ID, + num_workers=NUM_WORKERS, + zone=ZONE, + dag=self.dag, + custom_image=CUSTOM_IMAGE + ) + + cluster_data = dataproc_operator._build_cluster_data() + expected_custom_image_url = \ + 'https://www.googleapis.com/compute/beta/projects/' \ + '{}/global/images/{}'.format(PROJECT_ID, CUSTOM_IMAGE) + self.assertEqual(cluster_data['config']['masterConfig']['imageUri'], + expected_custom_image_url) + self.assertEqual(cluster_data['config']['workerConfig']['imageUri'], + expected_custom_image_url) + def test_cluster_name_log_no_sub(self): with patch('airflow.contrib.operators.dataproc_operator.DataProcHook') \ as mock_hook: @@ -425,7 +465,7 @@ def test_cluster_name_log_no_sub(self): dag=self.dag ) with patch.object(dataproc_task.log, 'info') as mock_info: - with self.assertRaises(TypeError) as _: + with self.assertRaises(TypeError): dataproc_task.execute(None) mock_info.assert_called_with('Deleting cluster: %s', CLUSTER_NAME) @@ -464,7 +504,7 @@ def test_hook_correct_region(): dataproc_task.execute(None) mock_hook.return_value.submit.assert_called_once_with(mock.ANY, mock.ANY, - REGION) + REGION, mock.ANY) @staticmethod def test_dataproc_job_id_is_set(): @@ -488,7 +528,7 @@ def test_hook_correct_region(): dataproc_task.execute(None) mock_hook.return_value.submit.assert_called_once_with(mock.ANY, mock.ANY, - REGION) + REGION, mock.ANY) @staticmethod def test_dataproc_job_id_is_set(): @@ -513,7 +553,7 @@ def test_hook_correct_region(): dataproc_task.execute(None) mock_hook.return_value.submit.assert_called_once_with(mock.ANY, mock.ANY, - REGION) + REGION, mock.ANY) @staticmethod def test_dataproc_job_id_is_set(): @@ -538,7 +578,7 @@ def test_hook_correct_region(): dataproc_task.execute(None) mock_hook.return_value.submit.assert_called_once_with(mock.ANY, mock.ANY, - REGION) + REGION, mock.ANY) @staticmethod def test_dataproc_job_id_is_set(): diff --git a/tests/contrib/operators/test_discord_webhook_operator.py b/tests/contrib/operators/test_discord_webhook_operator.py index 0fa5838351ef9..9816f0e223199 100644 --- a/tests/contrib/operators/test_discord_webhook_operator.py +++ b/tests/contrib/operators/test_discord_webhook_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_druid_operator.py b/tests/contrib/operators/test_druid_operator.py index d3e51dddba5e6..e7d502c9cf0af 100644 --- a/tests/contrib/operators/test_druid_operator.py +++ b/tests/contrib/operators/test_druid_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_ecs_operator.py b/tests/contrib/operators/test_ecs_operator.py index 43a816da4a1ea..3b0f03351dddc 100644 --- a/tests/contrib/operators/test_ecs_operator.py +++ b/tests/contrib/operators/test_ecs_operator.py @@ -7,9 +7,9 @@ # 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 @@ -69,7 +69,20 @@ def setUp(self, aws_hook_mock): cluster='c', overrides={}, aws_conn_id=None, - region_name='eu-west-1') + region_name='eu-west-1', + group='group', + placement_constraints=[ + { + 'expression': 'attribute:ecs.instance-type =~ t2.*', + 'type': 'memberOf' + } + ], + network_configuration={ + 'awsvpcConfiguration': { + 'securityGroups': ['sg-123abc'] + } + } + ) def test_init(self): @@ -100,7 +113,20 @@ def test_execute_without_failures(self, check_mock, wait_mock): launchType='EC2', overrides={}, startedBy=mock.ANY, # Can by 'airflow' or 'Airflow' - taskDefinition='t' + taskDefinition='t', + group='group', + placementConstraints=[ + { + 'expression': 'attribute:ecs.instance-type =~ t2.*', + 'type': 'memberOf' + } + ], + platformVersion='LATEST', + networkConfiguration={ + 'awsvpcConfiguration': { + 'securityGroups': ['sg-123abc'] + } + } ) wait_mock.assert_called_once_with() @@ -123,7 +149,20 @@ def test_execute_with_failures(self): launchType='EC2', overrides={}, startedBy=mock.ANY, # Can by 'airflow' or 'Airflow' - taskDefinition='t' + taskDefinition='t', + group='group', + placementConstraints=[ + { + 'expression': 'attribute:ecs.instance-type =~ t2.*', + 'type': 'memberOf' + } + ], + platformVersion='LATEST', + networkConfiguration={ + 'awsvpcConfiguration': { + 'securityGroups': ['sg-123abc'] + } + } ) def test_wait_end_tasks(self): diff --git a/tests/contrib/operators/test_emr_add_steps_operator.py b/tests/contrib/operators/test_emr_add_steps_operator.py index 1315f93769c6b..5caa79cf36766 100644 --- a/tests/contrib/operators/test_emr_add_steps_operator.py +++ b/tests/contrib/operators/test_emr_add_steps_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_emr_create_job_flow_operator.py b/tests/contrib/operators/test_emr_create_job_flow_operator.py index 7dae30d43a809..704f5982d8f2a 100644 --- a/tests/contrib/operators/test_emr_create_job_flow_operator.py +++ b/tests/contrib/operators/test_emr_create_job_flow_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_emr_terminate_job_flow_operator.py b/tests/contrib/operators/test_emr_terminate_job_flow_operator.py index 7eb27ec16ec79..a4d43407c7555 100644 --- a/tests/contrib/operators/test_emr_terminate_job_flow_operator.py +++ b/tests/contrib/operators/test_emr_terminate_job_flow_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_file_to_wasb.py b/tests/contrib/operators/test_file_to_wasb.py index f508be1574d26..46630cb475c1b 100644 --- a/tests/contrib/operators/test_file_to_wasb.py +++ b/tests/contrib/operators/test_file_to_wasb.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_gcp_function_operator.py b/tests/contrib/operators/test_gcp_function_operator.py new file mode 100644 index 0000000000000..d7585ae66fdef --- /dev/null +++ b/tests/contrib/operators/test_gcp_function_operator.py @@ -0,0 +1,624 @@ +# -*- coding: utf-8 -*- +# +# 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. + +import unittest + +from googleapiclient.errors import HttpError +from parameterized import parameterized + +from airflow.contrib.operators.gcp_function_operator import \ + GcfFunctionDeployOperator, GcfFunctionDeleteOperator, FUNCTION_NAME_PATTERN +from airflow import AirflowException +from airflow.version import version + +from copy import deepcopy + +try: + # noinspection PyProtectedMember + from unittest import mock +except ImportError: + try: + import mock + except ImportError: + mock = None + +EMPTY_CONTENT = ''.encode('utf8') +MOCK_RESP_404 = type('', (object,), {"status": 404})() + +PROJECT_ID = 'test_project_id' +LOCATION = 'test_region' +SOURCE_ARCHIVE_URL = 'gs://folder/file.zip' +ENTRYPOINT = 'helloWorld' +FUNCTION_NAME = 'projects/{}/locations/{}/functions/{}'.format(PROJECT_ID, LOCATION, + ENTRYPOINT) +RUNTIME = 'nodejs6' +VALID_RUNTIMES = ['nodejs6', 'nodejs8', 'python37'] +VALID_BODY = { + "name": FUNCTION_NAME, + "entryPoint": ENTRYPOINT, + "runtime": RUNTIME, + "httpsTrigger": {}, + "sourceArchiveUrl": SOURCE_ARCHIVE_URL +} + + +def _prepare_test_bodies(): + body_no_name = deepcopy(VALID_BODY) + body_no_name.pop('name', None) + body_empty_entry_point = deepcopy(VALID_BODY) + body_empty_entry_point['entryPoint'] = '' + body_empty_runtime = deepcopy(VALID_BODY) + body_empty_runtime['runtime'] = '' + body_values = [ + ({}, "The required parameter 'body' is missing"), + (body_no_name, "The required body field 'name' is missing"), + (body_empty_entry_point, + "The body field 'entryPoint' of value '' does not match"), + (body_empty_runtime, "The body field 'runtime' of value '' does not match"), + ] + return body_values + + +class GcfFunctionDeployTest(unittest.TestCase): + @parameterized.expand(_prepare_test_bodies()) + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_body_empty_or_missing_fields(self, body, message, mock_hook): + mock_hook.return_value.upload_function_zip.return_value = 'https://uploadUrl' + with self.assertRaises(AirflowException) as cm: + op = GcfFunctionDeployOperator( + project_id="test_project_id", + location="test_region", + body=body, + task_id="id" + ) + op.execute(None) + err = cm.exception + self.assertIn(message, str(err)) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.reset_mock() + + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_deploy_execute(self, mock_hook): + mock_hook.return_value.get_function.side_effect = mock.Mock( + side_effect=HttpError(resp=MOCK_RESP_404, content=b'not found')) + mock_hook.return_value.create_new_function.return_value = True + op = GcfFunctionDeployOperator( + project_id=PROJECT_ID, + location=LOCATION, + body=deepcopy(VALID_BODY), + task_id="id" + ) + op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.return_value.get_function.assert_called_once_with( + 'projects/test_project_id/locations/test_region/functions/helloWorld' + ) + expected_body = deepcopy(VALID_BODY) + expected_body['labels'] = { + 'airflow-version': 'v' + version.replace('.', '-').replace('+', '-') + } + mock_hook.return_value.create_new_function.assert_called_once_with( + 'projects/test_project_id/locations/test_region', + expected_body + ) + + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_update_function_if_exists(self, mock_hook): + mock_hook.return_value.get_function.return_value = True + mock_hook.return_value.update_function.return_value = True + op = GcfFunctionDeployOperator( + project_id=PROJECT_ID, + location=LOCATION, + body=deepcopy(VALID_BODY), + task_id="id" + ) + op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.return_value.get_function.assert_called_once_with( + 'projects/test_project_id/locations/test_region/functions/helloWorld' + ) + expected_body = deepcopy(VALID_BODY) + expected_body['labels'] = { + 'airflow-version': 'v' + version.replace('.', '-').replace('+', '-') + } + mock_hook.return_value.update_function.assert_called_once_with( + 'projects/test_project_id/locations/test_region/functions/helloWorld', + expected_body, expected_body.keys()) + mock_hook.return_value.create_new_function.assert_not_called() + + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_empty_project_id(self, mock_hook): + with self.assertRaises(AirflowException) as cm: + GcfFunctionDeployOperator( + project_id="", + location="test_region", + body=None, + task_id="id" + ) + err = cm.exception + self.assertIn("The required parameter 'project_id' is missing", str(err)) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_empty_location(self, mock_hook): + with self.assertRaises(AirflowException) as cm: + GcfFunctionDeployOperator( + project_id="test_project_id", + location="", + body=None, + task_id="id" + ) + err = cm.exception + self.assertIn("The required parameter 'location' is missing", str(err)) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_empty_body(self, mock_hook): + with self.assertRaises(AirflowException) as cm: + GcfFunctionDeployOperator( + project_id="test_project_id", + location="test_region", + body=None, + task_id="id" + ) + err = cm.exception + self.assertIn("The required parameter 'body' is missing", str(err)) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + + @parameterized.expand([ + (runtime,) for runtime in VALID_RUNTIMES + ]) + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_correct_runtime_field(self, runtime, mock_hook): + mock_hook.return_value.list_functions.return_value = [] + mock_hook.return_value.create_new_function.return_value = True + body = deepcopy(VALID_BODY) + body['runtime'] = runtime + op = GcfFunctionDeployOperator( + project_id="test_project_id", + location="test_region", + body=body, + task_id="id" + ) + op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.reset_mock() + + @parameterized.expand([ + (network,) for network in [ + "network-01", + "n-0-2-3-4", + "projects/PROJECT/global/networks/network-01" + "projects/PRÓJECT/global/networks/netwórk-01" + ] + ]) + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_valid_network_field(self, network, mock_hook): + mock_hook.return_value.list_functions.return_value = [] + mock_hook.return_value.create_new_function.return_value = True + body = deepcopy(VALID_BODY) + body['network'] = network + op = GcfFunctionDeployOperator( + project_id="test_project_id", + location="test_region", + body=body, + task_id="id" + ) + op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.reset_mock() + + @parameterized.expand([ + (labels,) for labels in [ + {}, + {"label": 'value-01'}, + {"label_324234_a_b_c": 'value-01_93'}, + ] + ]) + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_valid_labels_field(self, labels, mock_hook): + mock_hook.return_value.list_functions.return_value = [] + mock_hook.return_value.create_new_function.return_value = True + body = deepcopy(VALID_BODY) + body['labels'] = labels + op = GcfFunctionDeployOperator( + project_id="test_project_id", + location="test_region", + body=body, + task_id="id" + ) + op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.reset_mock() + + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_validation_disabled(self, mock_hook): + mock_hook.return_value.list_functions.return_value = [] + mock_hook.return_value.create_new_function.return_value = True + body = { + "name": "function_name", + "some_invalid_body_field": "some_invalid_body_field_value" + } + op = GcfFunctionDeployOperator( + project_id="test_project_id", + location="test_region", + body=body, + validate_body=False, + task_id="id" + ) + op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.reset_mock() + + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_body_validation_simple(self, mock_hook): + mock_hook.return_value.list_functions.return_value = [] + mock_hook.return_value.create_new_function.return_value = True + body = deepcopy(VALID_BODY) + body['name'] = '' + with self.assertRaises(AirflowException) as cm: + op = GcfFunctionDeployOperator( + project_id="test_project_id", + location="test_region", + body=body, + task_id="id" + ) + op.execute(None) + err = cm.exception + self.assertIn("The body field 'name' of value '' does not match", + str(err)) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.reset_mock() + + @parameterized.expand([ + ('name', '', + "The body field 'name' of value '' does not match"), + ('description', '', "The body field 'description' of value '' does not match"), + ('entryPoint', '', "The body field 'entryPoint' of value '' does not match"), + ('availableMemoryMb', '0', + "The available memory has to be greater than 0"), + ('availableMemoryMb', '-1', + "The available memory has to be greater than 0"), + ('availableMemoryMb', 'ss', + "invalid literal for int() with base 10: 'ss'"), + ('network', '', "The body field 'network' of value '' does not match"), + ('maxInstances', '0', "The max instances parameter has to be greater than 0"), + ('maxInstances', '-1', "The max instances parameter has to be greater than 0"), + ('maxInstances', 'ss', "invalid literal for int() with base 10: 'ss'"), + ]) + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_invalid_field_values(self, key, value, message, mock_hook): + mock_hook.return_value.list_functions.return_value = [] + mock_hook.return_value.create_new_function.return_value = True + body = deepcopy(VALID_BODY) + body[key] = value + with self.assertRaises(AirflowException) as cm: + op = GcfFunctionDeployOperator( + project_id="test_project_id", + location="test_region", + body=body, + task_id="id" + ) + op.execute(None) + err = cm.exception + self.assertIn(message, str(err)) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.reset_mock() + + @parameterized.expand([ + ({'sourceArchiveUrl': ''}, + "The body field 'source_code.sourceArchiveUrl' of value '' does not match"), + ({'sourceArchiveUrl': '', 'zip_path': '/path/to/file'}, + "Only one of 'sourceArchiveUrl' in body or 'zip_path' argument allowed."), + ({'sourceArchiveUrl': 'gs://url', 'zip_path': '/path/to/file'}, + "Only one of 'sourceArchiveUrl' in body or 'zip_path' argument allowed."), + ({'sourceArchiveUrl': '', 'sourceUploadUrl': ''}, + "Parameter 'sourceUploadUrl' is empty in the body and argument " + "'zip_path' is missing or empty."), + ({'sourceArchiveUrl': 'gs://adasda', 'sourceRepository': ''}, + "The field 'source_code.sourceRepository' should be dictionary type"), + ({'sourceUploadUrl': '', 'sourceRepository': ''}, + "Parameter 'sourceUploadUrl' is empty in the body and argument 'zip_path' " + "is missing or empty."), + ({'sourceArchiveUrl': '', 'sourceUploadUrl': '', 'sourceRepository': ''}, + "Parameter 'sourceUploadUrl' is empty in the body and argument 'zip_path' " + "is missing or empty."), + ({'sourceArchiveUrl': 'gs://url', 'sourceUploadUrl': 'https://url'}, + "The mutually exclusive fields 'sourceUploadUrl' and 'sourceArchiveUrl' " + "belonging to the union 'source_code' are both present. Please remove one"), + ({'sourceUploadUrl': 'https://url', 'zip_path': '/path/to/file'}, + "Only one of 'sourceUploadUrl' in body " + "or 'zip_path' argument allowed. Found both."), + ({'sourceUploadUrl': ''}, "Parameter 'sourceUploadUrl' is empty in the body " + "and argument 'zip_path' is missing or empty."), + ({'sourceRepository': ''}, "The field 'source_code.sourceRepository' " + "should be dictionary type"), + ({'sourceRepository': {}}, "The required body field " + "'source_code.sourceRepository.url' is missing"), + ({'sourceRepository': {'url': ''}}, + "The body field 'source_code.sourceRepository.url' of value '' does not match"), + ] + ) + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_invalid_source_code_union_field(self, source_code, message, mock_hook): + mock_hook.return_value.upload_function_zip.return_value = 'https://uploadUrl' + body = deepcopy(VALID_BODY) + body.pop('sourceUploadUrl', None) + body.pop('sourceArchiveUrl', None) + zip_path = source_code.pop('zip_path', None) + body.update(source_code) + with self.assertRaises(AirflowException) as cm: + op = GcfFunctionDeployOperator( + project_id="test_project_id", + location="test_region", + body=body, + task_id="id", + zip_path=zip_path + ) + op.execute(None) + err = cm.exception + self.assertIn(message, str(err)) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.reset_mock() + + @parameterized.expand([ + ({'sourceArchiveUrl': 'gs://url'},), + ({'zip_path': '/path/to/file', 'sourceUploadUrl': None},), + ({'sourceUploadUrl': + 'https://source.developers.google.com/projects/a/repos/b/revisions/c/paths/d'},), + ({'sourceRepository': + {'url': 'https://source.developers.google.com/projects/a/' + 'repos/b/revisions/c/paths/d'}},), + ]) + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_valid_source_code_union_field(self, source_code, mock_hook): + mock_hook.return_value.upload_function_zip.return_value = 'https://uploadUrl' + mock_hook.return_value.get_function.side_effect = mock.Mock( + side_effect=HttpError(resp=MOCK_RESP_404, content=b'not found')) + mock_hook.return_value.create_new_function.return_value = True + body = deepcopy(VALID_BODY) + body.pop('sourceUploadUrl', None) + body.pop('sourceArchiveUrl', None) + body.pop('sourceRepository', None) + body.pop('sourceRepositoryUrl', None) + zip_path = source_code.pop('zip_path', None) + body.update(source_code) + op = GcfFunctionDeployOperator( + project_id="test_project_id", + location="test_region", + body=body, + task_id="id", + zip_path=zip_path + ) + op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + if zip_path: + mock_hook.return_value.upload_function_zip.assert_called_once_with( + parent='projects/test_project_id/locations/test_region', + zip_path='/path/to/file' + ) + mock_hook.return_value.get_function.assert_called_once_with( + 'projects/test_project_id/locations/test_region/functions/helloWorld' + ) + mock_hook.return_value.create_new_function.assert_called_once_with( + 'projects/test_project_id/locations/test_region', + body + ) + mock_hook.reset_mock() + + @parameterized.expand([ + ({'eventTrigger': {}}, + "The required body field 'trigger.eventTrigger.eventType' is missing"), + ({'eventTrigger': {'eventType': 'providers/test/eventTypes/a.b'}}, + "The required body field 'trigger.eventTrigger.resource' is missing"), + ({'eventTrigger': {'eventType': 'providers/test/eventTypes/a.b', 'resource': ''}}, + "The body field 'trigger.eventTrigger.resource' of value '' does not match"), + ({'eventTrigger': {'eventType': 'providers/test/eventTypes/a.b', + 'resource': 'res', + 'service': ''}}, + "The body field 'trigger.eventTrigger.service' of value '' does not match"), + ({'eventTrigger': {'eventType': 'providers/test/eventTypes/a.b', + 'resource': 'res', + 'service': 'service_name', + 'failurePolicy': {'retry': ''}}}, + "The field 'trigger.eventTrigger.failurePolicy.retry' " + "should be dictionary type") + ] + ) + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_invalid_trigger_union_field(self, trigger, message, mock_hook): + mock_hook.return_value.upload_function_zip.return_value = 'https://uploadUrl' + body = deepcopy(VALID_BODY) + body.pop('httpsTrigger', None) + body.pop('eventTrigger', None) + body.update(trigger) + with self.assertRaises(AirflowException) as cm: + op = GcfFunctionDeployOperator( + project_id="test_project_id", + location="test_region", + body=body, + task_id="id", + ) + op.execute(None) + err = cm.exception + self.assertIn(message, str(err)) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.reset_mock() + + @parameterized.expand([ + ({'httpsTrigger': {}},), + ({'eventTrigger': {'eventType': 'providers/test/eventTypes/a.b', + 'resource': 'res'}},), + ({'eventTrigger': {'eventType': 'providers/test/eventTypes/a.b', + 'resource': 'res', + 'service': 'service_name'}},), + ({'eventTrigger': {'eventType': 'providers/test/eventTypes/ą.b', + 'resource': 'reś', + 'service': 'service_namę'}},), + ({'eventTrigger': {'eventType': 'providers/test/eventTypes/a.b', + 'resource': 'res', + 'service': 'service_name', + 'failurePolicy': {'retry': {}}}},) + ]) + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_valid_trigger_union_field(self, trigger, mock_hook): + mock_hook.return_value.upload_function_zip.return_value = 'https://uploadUrl' + mock_hook.return_value.get_function.side_effect = mock.Mock( + side_effect=HttpError(resp=MOCK_RESP_404, content=b'not found')) + mock_hook.return_value.create_new_function.return_value = True + body = deepcopy(VALID_BODY) + body.pop('httpsTrigger', None) + body.pop('eventTrigger', None) + body.update(trigger) + op = GcfFunctionDeployOperator( + project_id="test_project_id", + location="test_region", + body=body, + task_id="id", + ) + op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.return_value.get_function.assert_called_once_with( + 'projects/test_project_id/locations/test_region/functions/helloWorld' + ) + mock_hook.return_value.create_new_function.assert_called_once_with( + 'projects/test_project_id/locations/test_region', + body + ) + mock_hook.reset_mock() + + +class GcfFunctionDeleteTest(unittest.TestCase): + _FUNCTION_NAME = 'projects/project_name/locations/project_location/functions' \ + '/function_name' + _DELETE_FUNCTION_EXPECTED = { + '@type': 'type.googleapis.com/google.cloud.functions.v1.CloudFunction', + 'name': _FUNCTION_NAME, + 'sourceArchiveUrl': 'gs://functions/hello.zip', + 'httpsTrigger': { + 'url': 'https://project_location-project_name.cloudfunctions.net' + '/function_name'}, + 'status': 'ACTIVE', 'entryPoint': 'entry_point', 'timeout': '60s', + 'availableMemoryMb': 256, + 'serviceAccountEmail': 'project_name@appspot.gserviceaccount.com', + 'updateTime': '2018-08-23T00:00:00Z', + 'versionId': '1', 'runtime': 'nodejs6'} + + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_delete_execute(self, mock_hook): + mock_hook.return_value.delete_function.return_value = \ + self._DELETE_FUNCTION_EXPECTED + op = GcfFunctionDeleteOperator( + name=self._FUNCTION_NAME, + task_id="id" + ) + result = op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.return_value.delete_function.assert_called_once_with( + 'projects/project_name/locations/project_location/functions/function_name' + ) + self.assertEqual(result['name'], self._FUNCTION_NAME) + + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_correct_name(self, mock_hook): + op = GcfFunctionDeleteOperator( + name="projects/project_name/locations/project_location/functions" + "/function_name", + task_id="id" + ) + op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_invalid_name(self, mock_hook): + with self.assertRaises(AttributeError) as cm: + op = GcfFunctionDeleteOperator( + name="invalid_name", + task_id="id" + ) + op.execute(None) + err = cm.exception + self.assertEqual(str(err), 'Parameter name must match pattern: {}'.format( + FUNCTION_NAME_PATTERN)) + mock_hook.assert_not_called() + + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_empty_name(self, mock_hook): + mock_hook.return_value.delete_function.return_value = \ + self._DELETE_FUNCTION_EXPECTED + with self.assertRaises(AttributeError) as cm: + GcfFunctionDeleteOperator( + name="", + task_id="id" + ) + err = cm.exception + self.assertEqual(str(err), 'Empty parameter: name') + mock_hook.assert_not_called() + + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_gcf_error_silenced_when_function_doesnt_exist(self, mock_hook): + op = GcfFunctionDeleteOperator( + name=self._FUNCTION_NAME, + task_id="id" + ) + mock_hook.return_value.delete_function.side_effect = mock.Mock( + side_effect=HttpError(resp=MOCK_RESP_404, content=b'not found')) + op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.return_value.delete_function.assert_called_once_with( + 'projects/project_name/locations/project_location/functions/function_name' + ) + + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_non_404_gcf_error_bubbled_up(self, mock_hook): + op = GcfFunctionDeleteOperator( + name=self._FUNCTION_NAME, + task_id="id" + ) + resp = type('', (object,), {"status": 500})() + mock_hook.return_value.delete_function.side_effect = mock.Mock( + side_effect=HttpError(resp=resp, content=b'error')) + + with self.assertRaises(HttpError): + op.execute(None) + + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.return_value.delete_function.assert_called_once_with( + 'projects/project_name/locations/project_location/functions/function_name' + ) diff --git a/tests/contrib/operators/test_gcs_download_operator.py b/tests/contrib/operators/test_gcs_download_operator.py index 13b08a4bd7e00..4e9914e8fd446 100644 --- a/tests/contrib/operators/test_gcs_download_operator.py +++ b/tests/contrib/operators/test_gcs_download_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_gcs_list_operator.py b/tests/contrib/operators/test_gcs_list_operator.py index 84612eaaf3a04..8f0281f76fb64 100644 --- a/tests/contrib/operators/test_gcs_list_operator.py +++ b/tests/contrib/operators/test_gcs_list_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_gcs_to_s3_operator.py b/tests/contrib/operators/test_gcs_to_s3_operator.py index 5f386a62fe812..1a35a223ab8aa 100644 --- a/tests/contrib/operators/test_gcs_to_s3_operator.py +++ b/tests/contrib/operators/test_gcs_to_s3_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_hipchat_operator.py b/tests/contrib/operators/test_hipchat_operator.py index b6abce9bd2f94..71c93c9259ca1 100644 --- a/tests/contrib/operators/test_hipchat_operator.py +++ b/tests/contrib/operators/test_hipchat_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_hive_to_dynamodb_operator.py b/tests/contrib/operators/test_hive_to_dynamodb_operator.py index e5b2c3e65a257..9ef3809593441 100644 --- a/tests/contrib/operators/test_hive_to_dynamodb_operator.py +++ b/tests/contrib/operators/test_hive_to_dynamodb_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_jenkins_operator.py b/tests/contrib/operators/test_jenkins_operator.py index 0d70246fff85d..23e0bcb66fd97 100644 --- a/tests/contrib/operators/test_jenkins_operator.py +++ b/tests/contrib/operators/test_jenkins_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_jira_operator_test.py b/tests/contrib/operators/test_jira_operator_test.py index 764458c314dad..a358d3019f1bb 100644 --- a/tests/contrib/operators/test_jira_operator_test.py +++ b/tests/contrib/operators/test_jira_operator_test.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_mlengine_operator_utils.py b/tests/contrib/operators/test_mlengine_operator_utils.py index 0cb106da6bb8d..09f0071e21c68 100644 --- a/tests/contrib/operators/test_mlengine_operator_utils.py +++ b/tests/contrib/operators/test_mlengine_operator_utils.py @@ -114,7 +114,7 @@ def testSuccessfulRun(self): mock_dataflow_hook.assert_called_with( gcp_conn_id='google_cloud_default', delegate_to=None, poll_sleep=10) hook_instance.start_python_dataflow.assert_called_once_with( - 'eval-test-summary', + '{{task.task_id}}', { 'prediction_path': 'gs://legal-bucket/fake-output-path', 'labels': {'airflow-version': TEST_VERSION}, diff --git a/tests/contrib/operators/test_mysql_to_gcs_operator.py b/tests/contrib/operators/test_mysql_to_gcs_operator.py index f0eb709500ca0..e33d270032765 100644 --- a/tests/contrib/operators/test_mysql_to_gcs_operator.py +++ b/tests/contrib/operators/test_mysql_to_gcs_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_postgres_to_gcs_operator.py b/tests/contrib/operators/test_postgres_to_gcs_operator.py index ca72016974c0e..904f57689d4b9 100644 --- a/tests/contrib/operators/test_postgres_to_gcs_operator.py +++ b/tests/contrib/operators/test_postgres_to_gcs_operator.py @@ -7,9 +7,9 @@ # 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 @@ -22,43 +22,68 @@ from __future__ import print_function from __future__ import unicode_literals -import sys import unittest -from airflow.contrib.operators.postgres_to_gcs_operator import PostgresToGoogleCloudStorageOperator +from airflow.hooks.postgres_hook import PostgresHook +from airflow.contrib.operators.postgres_to_gcs_operator import \ + PostgresToGoogleCloudStorageOperator try: - from unittest import mock + from unittest.mock import patch except ImportError: try: - import mock + from mock import patch except ImportError: mock = None -PY3 = sys.version_info[0] == 3 +TABLES = {'postgres_to_gcs_operator', 'postgres_to_gcs_operator_empty'} TASK_ID = 'test-postgres-to-gcs' -POSTGRES_CONN_ID = 'postgres_conn_test' -SQL = 'select 1' +POSTGRES_CONN_ID = 'postgres_default' +SQL = 'SELECT * FROM postgres_to_gcs_operator' BUCKET = 'gs://test' FILENAME = 'test_{}.ndjson' -# we expect the psycopg cursor to return encoded strs in py2 and decoded in py3 -if PY3: - ROWS = [('mock_row_content_1', 42), ('mock_row_content_2', 43), ('mock_row_content_3', 44)] - CURSOR_DESCRIPTION = (('some_str', 0), ('some_num', 1005)) -else: - ROWS = [(b'mock_row_content_1', 42), (b'mock_row_content_2', 43), (b'mock_row_content_3', 44)] - CURSOR_DESCRIPTION = ((b'some_str', 0), (b'some_num', 1005)) + NDJSON_LINES = [ b'{"some_num": 42, "some_str": "mock_row_content_1"}\n', b'{"some_num": 43, "some_str": "mock_row_content_2"}\n', b'{"some_num": 44, "some_str": "mock_row_content_3"}\n' ] SCHEMA_FILENAME = 'schema_test.json' -SCHEMA_JSON = b'[{"mode": "NULLABLE", "name": "some_str", "type": "STRING"}, {"mode": "REPEATED", "name": "some_num", "type": "INTEGER"}]' +SCHEMA_JSON = b'[{"mode": "NULLABLE", "name": "some_str", "type": "STRING"}, ' \ + b'{"mode": "NULLABLE", "name": "some_num", "type": "INTEGER"}]' class PostgresToGoogleCloudStorageOperatorTest(unittest.TestCase): + def setUp(self): + postgres = PostgresHook() + with postgres.get_conn() as conn: + with conn.cursor() as cur: + for table in TABLES: + cur.execute("DROP TABLE IF EXISTS {} CASCADE;".format(table)) + cur.execute("CREATE TABLE {}(some_str varchar, some_num integer);" + .format(table)) + + cur.execute( + "INSERT INTO postgres_to_gcs_operator VALUES(%s, %s);", + ('mock_row_content_1', 42) + ) + cur.execute( + "INSERT INTO postgres_to_gcs_operator VALUES(%s, %s);", + ('mock_row_content_2', 43) + ) + cur.execute( + "INSERT INTO postgres_to_gcs_operator VALUES(%s, %s);", + ('mock_row_content_3', 44) + ) + + def tearDown(self): + postgres = PostgresHook() + with postgres.get_conn() as conn: + with conn.cursor() as cur: + for table in TABLES: + cur.execute("DROP TABLE IF EXISTS {} CASCADE;".format(table)) + def test_init(self): """Test PostgresToGoogleCloudStorageOperator instance is properly initialized.""" op = PostgresToGoogleCloudStorageOperator( @@ -68,9 +93,8 @@ def test_init(self): self.assertEqual(op.bucket, BUCKET) self.assertEqual(op.filename, FILENAME) - @mock.patch('airflow.contrib.operators.postgres_to_gcs_operator.PostgresHook') - @mock.patch('airflow.contrib.operators.postgres_to_gcs_operator.GoogleCloudStorageHook') - def test_exec_success(self, gcs_hook_mock_class, pg_hook_mock_class): + @patch('airflow.contrib.operators.postgres_to_gcs_operator.GoogleCloudStorageHook') + def test_exec_success(self, gcs_hook_mock_class): """Test the execute function in case where the run is successful.""" op = PostgresToGoogleCloudStorageOperator( task_id=TASK_ID, @@ -79,10 +103,6 @@ def test_exec_success(self, gcs_hook_mock_class, pg_hook_mock_class): bucket=BUCKET, filename=FILENAME) - pg_hook_mock = pg_hook_mock_class.return_value - pg_hook_mock.get_conn().cursor().__iter__.return_value = iter(ROWS) - pg_hook_mock.get_conn().cursor().description = CURSOR_DESCRIPTION - gcs_hook_mock = gcs_hook_mock_class.return_value def _assert_upload(bucket, obj, tmp_filename, content_type): @@ -96,16 +116,9 @@ def _assert_upload(bucket, obj, tmp_filename, content_type): op.execute(None) - pg_hook_mock_class.assert_called_once_with(postgres_conn_id=POSTGRES_CONN_ID) - pg_hook_mock.get_conn().cursor().execute.assert_called_once_with(SQL, None) - - @mock.patch('airflow.contrib.operators.postgres_to_gcs_operator.PostgresHook') - @mock.patch('airflow.contrib.operators.postgres_to_gcs_operator.GoogleCloudStorageHook') - def test_file_splitting(self, gcs_hook_mock_class, pg_hook_mock_class): + @patch('airflow.contrib.operators.postgres_to_gcs_operator.GoogleCloudStorageHook') + def test_file_splitting(self, gcs_hook_mock_class): """Test that ndjson is split by approx_max_file_size_bytes param.""" - pg_hook_mock = pg_hook_mock_class.return_value - pg_hook_mock.get_conn().cursor().__iter__.return_value = iter(ROWS) - pg_hook_mock.get_conn().cursor().description = CURSOR_DESCRIPTION gcs_hook_mock = gcs_hook_mock_class.return_value expected_upload = { @@ -129,13 +142,23 @@ def _assert_upload(bucket, obj, tmp_filename, content_type): approx_max_file_size_bytes=len(expected_upload[FILENAME.format(0)])) op.execute(None) - @mock.patch('airflow.contrib.operators.postgres_to_gcs_operator.PostgresHook') - @mock.patch('airflow.contrib.operators.postgres_to_gcs_operator.GoogleCloudStorageHook') - def test_schema_file(self, gcs_hook_mock_class, pg_hook_mock_class): + @patch('airflow.contrib.operators.postgres_to_gcs_operator.GoogleCloudStorageHook') + def test_empty_query(self, gcs_hook_mock_class): + """If the sql returns no rows, we should not upload any files""" + gcs_hook_mock = gcs_hook_mock_class.return_value + + op = PostgresToGoogleCloudStorageOperator( + task_id=TASK_ID, + sql='SELECT * FROM postgres_to_gcs_operator_empty', + bucket=BUCKET, + filename=FILENAME) + op.execute(None) + + assert not gcs_hook_mock.upload.called, 'No data means no files in the bucket' + + @patch('airflow.contrib.operators.postgres_to_gcs_operator.GoogleCloudStorageHook') + def test_schema_file(self, gcs_hook_mock_class): """Test writing schema files.""" - pg_hook_mock = pg_hook_mock_class.return_value - pg_hook_mock.get_conn().cursor().__iter__.return_value = iter(ROWS) - pg_hook_mock.get_conn().cursor().description = CURSOR_DESCRIPTION gcs_hook_mock = gcs_hook_mock_class.return_value diff --git a/tests/contrib/operators/test_pubsub_operator.py b/tests/contrib/operators/test_pubsub_operator.py index 8f775da43a8be..26424b46881d6 100644 --- a/tests/contrib/operators/test_pubsub_operator.py +++ b/tests/contrib/operators/test_pubsub_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_qubole_check_operator.py b/tests/contrib/operators/test_qubole_check_operator.py index 29044827ee6e5..972038005bb79 100644 --- a/tests/contrib/operators/test_qubole_check_operator.py +++ b/tests/contrib/operators/test_qubole_check_operator.py @@ -24,6 +24,7 @@ from airflow.contrib.operators.qubole_check_operator import QuboleValueCheckOperator from airflow.contrib.hooks.qubole_check_hook import QuboleCheckHook from airflow.contrib.hooks.qubole_hook import QuboleHook +from qds_sdk.commands import HiveCommand try: from unittest import mock @@ -80,11 +81,13 @@ def test_execute_pass(self, mock_get_hook): mock_hook.get_first.assert_called_with(query) @mock.patch.object(QuboleValueCheckOperator, 'get_hook') - def test_execute_fail(self, mock_get_hook): + def test_execute_assertion_fail(self, mock_get_hook): mock_cmd = mock.Mock() mock_cmd.status = 'done' mock_cmd.id = 123 + mock_cmd.is_success = mock.Mock( + return_value=HiveCommand.is_success(mock_cmd.status)) mock_hook = mock.Mock() mock_hook.get_first.return_value = [11] @@ -97,6 +100,30 @@ def test_execute_fail(self, mock_get_hook): 'Qubole Command Id: ' + str(mock_cmd.id)): operator.execute() + mock_cmd.is_success.assert_called_with(mock_cmd.status) + + @mock.patch.object(QuboleValueCheckOperator, 'get_hook') + def test_execute_assert_query_fail(self, mock_get_hook): + + mock_cmd = mock.Mock() + mock_cmd.status = 'error' + mock_cmd.id = 123 + mock_cmd.is_success = mock.Mock( + return_value=HiveCommand.is_success(mock_cmd.status)) + + mock_hook = mock.Mock() + mock_hook.get_first.return_value = [11] + mock_hook.cmd = mock_cmd + mock_get_hook.return_value = mock_hook + + operator = self.__construct_operator('select value from tab1 limit 1;', 5, 1) + + with self.assertRaises(AirflowException) as cm: + operator.execute() + + self.assertNotIn('Qubole Command Id: ', str(cm.exception)) + mock_cmd.is_success.assert_called_with(mock_cmd.status) + @mock.patch.object(QuboleCheckHook, 'get_query_results') @mock.patch.object(QuboleHook, 'execute') def test_results_parser_callable(self, mock_execute, mock_get_query_results): diff --git a/tests/contrib/operators/test_s3_copy_object_operator.py b/tests/contrib/operators/test_s3_copy_object_operator.py new file mode 100644 index 0000000000000..25904ecc51476 --- /dev/null +++ b/tests/contrib/operators/test_s3_copy_object_operator.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +# +# 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. + +import io +import unittest + +import boto3 +from moto import mock_s3 + +from airflow.contrib.operators.s3_copy_object_operator import S3CopyObjectOperator + + +class TestS3CopyObjectOperator(unittest.TestCase): + + def setUp(self): + self.source_bucket = "bucket1" + self.source_key = "path1/data.txt" + self.dest_bucket = "bucket2" + self.dest_key = "path2/data_copy.txt" + + @mock_s3 + def test_s3_copy_object_arg_combination_1(self): + conn = boto3.client('s3') + conn.create_bucket(Bucket=self.source_bucket) + conn.create_bucket(Bucket=self.dest_bucket) + conn.upload_fileobj(Bucket=self.source_bucket, + Key=self.source_key, + Fileobj=io.BytesIO(b"input")) + + # there should be nothing found before S3CopyObjectOperator is executed + self.assertFalse('Contents' in conn.list_objects(Bucket=self.dest_bucket, + Prefix=self.dest_key)) + + t = S3CopyObjectOperator(task_id="test_task_s3_copy_object", + source_bucket_key=self.source_key, + source_bucket_name=self.source_bucket, + dest_bucket_key=self.dest_key, + dest_bucket_name=self.dest_bucket) + t.execute(None) + + objects_in_dest_bucket = conn.list_objects(Bucket=self.dest_bucket, + Prefix=self.dest_key) + # there should be object found, and there should only be one object found + self.assertEqual(len(objects_in_dest_bucket['Contents']), 1) + # the object found should be consistent with dest_key specified earlier + self.assertEqual(objects_in_dest_bucket['Contents'][0]['Key'], self.dest_key) + + @mock_s3 + def test_s3_copy_object_arg_combination_2(self): + conn = boto3.client('s3') + conn.create_bucket(Bucket=self.source_bucket) + conn.create_bucket(Bucket=self.dest_bucket) + conn.upload_fileobj(Bucket=self.source_bucket, + Key=self.source_key, + Fileobj=io.BytesIO(b"input")) + + # there should be nothing found before S3CopyObjectOperator is executed + self.assertFalse('Contents' in conn.list_objects(Bucket=self.dest_bucket, + Prefix=self.dest_key)) + + source_key_s3_url = "s3://{}/{}".format(self.source_bucket, self.source_key) + dest_key_s3_url = "s3://{}/{}".format(self.dest_bucket, self.dest_key) + t = S3CopyObjectOperator(task_id="test_task_s3_copy_object", + source_bucket_key=source_key_s3_url, + dest_bucket_key=dest_key_s3_url) + t.execute(None) + + objects_in_dest_bucket = conn.list_objects(Bucket=self.dest_bucket, + Prefix=self.dest_key) + # there should be object found, and there should only be one object found + self.assertEqual(len(objects_in_dest_bucket['Contents']), 1) + # the object found should be consistent with dest_key specified earlier + self.assertEqual(objects_in_dest_bucket['Contents'][0]['Key'], self.dest_key) diff --git a/tests/contrib/operators/test_s3_delete_objects_operator.py b/tests/contrib/operators/test_s3_delete_objects_operator.py new file mode 100644 index 0000000000000..05ce1f57db758 --- /dev/null +++ b/tests/contrib/operators/test_s3_delete_objects_operator.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# +# 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. + +import io +import unittest + +import boto3 +from moto import mock_s3 + +from airflow.contrib.operators.s3_delete_objects_operator import S3DeleteObjectsOperator + + +class TestS3DeleteObjectsOperator(unittest.TestCase): + + @mock_s3 + def test_s3_delete_single_object(self): + bucket = "testbucket" + key = "path/data.txt" + + conn = boto3.client('s3') + conn.create_bucket(Bucket=bucket) + conn.upload_fileobj(Bucket=bucket, + Key=key, + Fileobj=io.BytesIO(b"input")) + + # The object should be detected before the DELETE action is taken + objects_in_dest_bucket = conn.list_objects(Bucket=bucket, + Prefix=key) + self.assertEqual(len(objects_in_dest_bucket['Contents']), 1) + self.assertEqual(objects_in_dest_bucket['Contents'][0]['Key'], key) + + t = S3DeleteObjectsOperator(task_id="test_task_s3_delete_single_object", + bucket=bucket, + keys=key) + t.execute(None) + + # There should be no object found in the bucket created earlier + self.assertFalse('Contents' in conn.list_objects(Bucket=bucket, + Prefix=key)) + + @mock_s3 + def test_s3_delete_multiple_objects(self): + bucket = "testbucket" + key_pattern = "path/data" + n_keys = 3 + keys = [key_pattern + str(i) for i in range(n_keys)] + + conn = boto3.client('s3') + conn.create_bucket(Bucket=bucket) + for k in keys: + conn.upload_fileobj(Bucket=bucket, + Key=k, + Fileobj=io.BytesIO(b"input")) + + # The objects should be detected before the DELETE action is taken + objects_in_dest_bucket = conn.list_objects(Bucket=bucket, + Prefix=key_pattern) + self.assertEqual(len(objects_in_dest_bucket['Contents']), n_keys) + self.assertEqual(sorted([x['Key'] for x in objects_in_dest_bucket['Contents']]), + sorted(keys)) + + t = S3DeleteObjectsOperator(task_id="test_task_s3_delete_multiple_objects", + bucket=bucket, + keys=keys) + t.execute(None) + + # There should be no object found in the bucket created earlier + self.assertFalse('Contents' in conn.list_objects(Bucket=bucket, + Prefix=key_pattern)) diff --git a/tests/contrib/operators/test_s3_list_operator.py b/tests/contrib/operators/test_s3_list_operator.py index de95c7623b18a..df897b5700286 100644 --- a/tests/contrib/operators/test_s3_list_operator.py +++ b/tests/contrib/operators/test_s3_list_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_s3_to_gcs_operator.py b/tests/contrib/operators/test_s3_to_gcs_operator.py index 807882c324936..3534bb1c2b517 100644 --- a/tests/contrib/operators/test_s3_to_gcs_operator.py +++ b/tests/contrib/operators/test_s3_to_gcs_operator.py @@ -7,9 +7,9 @@ # 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 @@ -88,8 +88,8 @@ def _assert_upload(bucket, object, tmp_filename): uploaded_files = operator.execute(None) - s3_one_mock_hook.assert_called_once_with(aws_conn_id=AWS_CONN_ID) - s3_two_mock_hook.assert_called_once_with(aws_conn_id=AWS_CONN_ID) + s3_one_mock_hook.assert_called_once_with(aws_conn_id=AWS_CONN_ID, verify=None) + s3_two_mock_hook.assert_called_once_with(aws_conn_id=AWS_CONN_ID, verify=None) gcs_mock_hook.assert_called_once_with( google_cloud_storage_conn_id=GCS_CONN_ID, delegate_to=None) diff --git a/tests/contrib/operators/test_s3_to_sftp_operator.py b/tests/contrib/operators/test_s3_to_sftp_operator.py new file mode 100644 index 0000000000000..171367017f184 --- /dev/null +++ b/tests/contrib/operators/test_s3_to_sftp_operator.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +# +# 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. + +import unittest + +from airflow import configuration +from airflow import models +from airflow.contrib.operators.s3_to_sftp_operator import S3ToSFTPOperator +from airflow.contrib.operators.ssh_operator import SSHOperator +from airflow.models import DAG, TaskInstance +from airflow.settings import Session +from airflow.utils import timezone +from airflow.utils.timezone import datetime +import boto3 +from moto import mock_s3 + + +TASK_ID = 'test_s3_to_sftp' +BUCKET = 'test-s3-bucket' +S3_KEY = 'test/test_1_file.csv' +SFTP_PATH = '/tmp/remote_path.txt' +SFTP_CONN_ID = 'ssh_default' +S3_CONN_ID = 'aws_default' +LOCAL_FILE_PATH = '/tmp/test_s3_upload' + +SFTP_MOCK_FILE = 'test_sftp_file.csv' +S3_MOCK_FILES = 'test_1_file.csv' + +TEST_DAG_ID = 'unit_tests' +DEFAULT_DATE = datetime(2018, 1, 1) + + +def reset(dag_id=TEST_DAG_ID): + session = Session() + tis = session.query(models.TaskInstance).filter_by(dag_id=dag_id) + tis.delete() + session.commit() + session.close() + + +reset() + + +class S3ToSFTPOperatorTest(unittest.TestCase): + @mock_s3 + def setUp(self): + configuration.load_test_config() + from airflow.contrib.hooks.ssh_hook import SSHHook + from airflow.hooks.S3_hook import S3Hook + + hook = SSHHook(ssh_conn_id='ssh_default') + s3_hook = S3Hook('aws_default') + hook.no_host_key_check = True + args = { + 'owner': 'airflow', + 'start_date': DEFAULT_DATE, + 'provide_context': True + } + dag = DAG(TEST_DAG_ID + 'test_schedule_dag_once', default_args=args) + dag.schedule_interval = '@once' + + self.hook = hook + self.s3_hook = s3_hook + + self.ssh_client = self.hook.get_conn() + self.sftp_client = self.ssh_client.open_sftp() + + self.dag = dag + self.s3_bucket = BUCKET + self.sftp_path = SFTP_PATH + self.s3_key = S3_KEY + + @mock_s3 + def test_s3_to_sftp_operation(self): + # Setting + configuration.conf.set("core", "enable_xcom_pickling", "True") + test_remote_file_content = \ + "This is remote file content \n which is also multiline " \ + "another line here \n this is last line. EOF" + + # Test for creation of s3 bucket + conn = boto3.client('s3') + conn.create_bucket(Bucket=self.s3_bucket) + self.assertTrue((self.s3_hook.check_for_bucket(self.s3_bucket))) + + with open(LOCAL_FILE_PATH, 'w') as f: + f.write(test_remote_file_content) + self.s3_hook.load_file(LOCAL_FILE_PATH, self.s3_key, bucket_name=BUCKET) + + # Check if object was created in s3 + objects_in_dest_bucket = conn.list_objects(Bucket=self.s3_bucket, + Prefix=self.s3_key) + # there should be object found, and there should only be one object found + self.assertEqual(len(objects_in_dest_bucket['Contents']), 1) + + # the object found should be consistent with dest_key specified earlier + self.assertEqual(objects_in_dest_bucket['Contents'][0]['Key'], self.s3_key) + + # get remote file to local + run_task = S3ToSFTPOperator( + s3_bucket=BUCKET, + s3_key=S3_KEY, + sftp_path=SFTP_PATH, + sftp_conn_id=SFTP_CONN_ID, + s3_conn_id=S3_CONN_ID, + task_id=TASK_ID, + dag=self.dag + ) + self.assertIsNotNone(run_task) + + run_task.execute(None) + + # Check that the file is created remotely + check_file_task = SSHOperator( + task_id="test_check_file", + ssh_hook=self.hook, + command="cat {0}".format(self.sftp_path), + do_xcom_push=True, + dag=self.dag + ) + self.assertIsNotNone(check_file_task) + ti3 = TaskInstance(task=check_file_task, execution_date=timezone.utcnow()) + ti3.run() + self.assertEqual( + ti3.xcom_pull(task_ids='test_check_file', key='return_value').strip(), + test_remote_file_content) + + # Clean up after finishing with test + conn.delete_object(Bucket=self.s3_bucket, Key=self.s3_key) + conn.delete_bucket(Bucket=self.s3_bucket) + self.assertFalse((self.s3_hook.check_for_bucket(self.s3_bucket))) + + def delete_remote_resource(self): + # check the remote file content + remove_file_task = SSHOperator( + task_id="test_check_file", + ssh_hook=self.hook, + command="rm {0}".format(self.test_remote_filepath), + do_xcom_push=True, + dag=self.dag + ) + self.assertIsNotNone(remove_file_task) + ti3 = TaskInstance(task=remove_file_task, execution_date=timezone.utcnow()) + ti3.run() + + def tearDown(self): + self.delete_remote_resource() + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/contrib/operators/test_sftp_operator.py b/tests/contrib/operators/test_sftp_operator.py index 01446a6fddd49..bf4525e31100e 100644 --- a/tests/contrib/operators/test_sftp_operator.py +++ b/tests/contrib/operators/test_sftp_operator.py @@ -7,9 +7,9 @@ # 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 @@ -20,6 +20,7 @@ import os import unittest from base64 import b64encode +import six from airflow import configuration from airflow import models @@ -219,6 +220,71 @@ def test_json_file_transfer_get(self): self.assertEqual(content_received.strip(), test_remote_file_content.encode('utf-8').decode('utf-8')) + def test_arg_checking(self): + from airflow.exceptions import AirflowException + conn_id = "conn_id_for_testing" + os.environ['AIRFLOW_CONN_' + conn_id.upper()] = "ssh://test_id@localhost" + + # Exception should be raised if neither ssh_hook nor ssh_conn_id is provided + if six.PY2: + self.assertRaisesRegex = self.assertRaisesRegexp + with self.assertRaisesRegex(AirflowException, + "Cannot operate without ssh_hook or ssh_conn_id."): + task_0 = SFTPOperator( + task_id="test_sftp", + local_filepath=self.test_local_filepath, + remote_filepath=self.test_remote_filepath, + operation=SFTPOperation.PUT, + dag=self.dag + ) + task_0.execute(None) + + # if ssh_hook is invalid/not provided, use ssh_conn_id to create SSHHook + task_1 = SFTPOperator( + task_id="test_sftp", + ssh_hook="string_rather_than_SSHHook", # invalid ssh_hook + ssh_conn_id=conn_id, + local_filepath=self.test_local_filepath, + remote_filepath=self.test_remote_filepath, + operation=SFTPOperation.PUT, + dag=self.dag + ) + try: + task_1.execute(None) + except Exception: + pass + self.assertEqual(task_1.ssh_hook.ssh_conn_id, conn_id) + + task_2 = SFTPOperator( + task_id="test_sftp", + ssh_conn_id=conn_id, # no ssh_hook provided + local_filepath=self.test_local_filepath, + remote_filepath=self.test_remote_filepath, + operation=SFTPOperation.PUT, + dag=self.dag + ) + try: + task_2.execute(None) + except Exception: + pass + self.assertEqual(task_2.ssh_hook.ssh_conn_id, conn_id) + + # if both valid ssh_hook and ssh_conn_id are provided, ignore ssh_conn_id + task_3 = SFTPOperator( + task_id="test_sftp", + ssh_hook=self.hook, + ssh_conn_id=conn_id, + local_filepath=self.test_local_filepath, + remote_filepath=self.test_remote_filepath, + operation=SFTPOperation.PUT, + dag=self.dag + ) + try: + task_3.execute(None) + except Exception: + pass + self.assertEqual(task_3.ssh_hook.ssh_conn_id, self.hook.ssh_conn_id) + def delete_local_resource(self): if os.path.exists(self.test_local_filepath): os.remove(self.test_local_filepath) @@ -226,11 +292,11 @@ def delete_local_resource(self): def delete_remote_resource(self): # check the remote file content remove_file_task = SSHOperator( - task_id="test_check_file", - ssh_hook=self.hook, - command="rm {0}".format(self.test_remote_filepath), - do_xcom_push=True, - dag=self.dag + task_id="test_check_file", + ssh_hook=self.hook, + command="rm {0}".format(self.test_remote_filepath), + do_xcom_push=True, + dag=self.dag ) self.assertIsNotNone(remove_file_task) ti3 = TaskInstance(task=remove_file_task, execution_date=timezone.utcnow()) diff --git a/tests/contrib/operators/test_sftp_to_s3_operator.py b/tests/contrib/operators/test_sftp_to_s3_operator.py new file mode 100644 index 0000000000000..4be3a71d208f6 --- /dev/null +++ b/tests/contrib/operators/test_sftp_to_s3_operator.py @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- +# +# 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. + +import unittest + +from airflow import configuration +from airflow import models +from airflow.contrib.operators.sftp_to_s3_operator import SFTPToS3Operator +from airflow.contrib.operators.ssh_operator import SSHOperator +from airflow.models import DAG, TaskInstance +from airflow.settings import Session +from airflow.utils import timezone +from airflow.utils.timezone import datetime +from airflow.contrib.hooks.ssh_hook import SSHHook +from airflow.hooks.S3_hook import S3Hook + +import boto3 +from moto import mock_s3 + +BUCKET = 'test-bucket' +S3_KEY = 'test/test_1_file.csv' +SFTP_PATH = '/tmp/remote_path.txt' +SFTP_CONN_ID = 'ssh_default' +S3_CONN_ID = 'aws_default' + +SFTP_MOCK_FILE = 'test_sftp_file.csv' +S3_MOCK_FILES = 'test_1_file.csv' + +TEST_DAG_ID = 'unit_tests' +DEFAULT_DATE = datetime(2018, 1, 1) + + +def reset(dag_id=TEST_DAG_ID): + session = Session() + tis = session.query(models.TaskInstance).filter_by(dag_id=dag_id) + tis.delete() + session.commit() + session.close() + + +reset() + + +class SFTPToS3OperatorTest(unittest.TestCase): + + @mock_s3 + def setUp(self): + configuration.load_test_config() + + hook = SSHHook(ssh_conn_id='ssh_default') + s3_hook = S3Hook('aws_default') + hook.no_host_key_check = True + args = { + 'owner': 'airflow', + 'start_date': DEFAULT_DATE, + 'provide_context': True + } + dag = DAG(TEST_DAG_ID + 'test_schedule_dag_once', default_args=args) + dag.schedule_interval = '@once' + + self.hook = hook + self.s3_hook = s3_hook + + self.ssh_client = self.hook.get_conn() + self.sftp_client = self.ssh_client.open_sftp() + + self.dag = dag + self.s3_bucket = BUCKET + self.sftp_path = SFTP_PATH + self.s3_key = S3_KEY + + @mock_s3 + def test_sftp_to_s3_operation(self): + # Setting + configuration.conf.set("core", "enable_xcom_pickling", "True") + test_remote_file_content = \ + "This is remote file content \n which is also multiline " \ + "another line here \n this is last line. EOF" + + # create a test file remotely + create_file_task = SSHOperator( + task_id="test_create_file", + ssh_hook=self.hook, + command="echo '{0}' > {1}".format(test_remote_file_content, + self.sftp_path), + do_xcom_push=True, + dag=self.dag + ) + self.assertIsNotNone(create_file_task) + ti1 = TaskInstance(task=create_file_task, execution_date=timezone.utcnow()) + ti1.run() + + # Test for creation of s3 bucket + conn = boto3.client('s3') + conn.create_bucket(Bucket=self.s3_bucket) + self.assertTrue((self.s3_hook.check_for_bucket(self.s3_bucket))) + + # get remote file to local + run_task = SFTPToS3Operator( + s3_bucket=BUCKET, + s3_key=S3_KEY, + sftp_path=SFTP_PATH, + sftp_conn_id=SFTP_CONN_ID, + s3_conn_id=S3_CONN_ID, + task_id='test_sftp_to_s3', + dag=self.dag + ) + self.assertIsNotNone(run_task) + + run_task.execute(None) + + # Check if object was created in s3 + objects_in_dest_bucket = conn.list_objects(Bucket=self.s3_bucket, + Prefix=self.s3_key) + # there should be object found, and there should only be one object found + self.assertEqual(len(objects_in_dest_bucket['Contents']), 1) + + # the object found should be consistent with dest_key specified earlier + self.assertEqual(objects_in_dest_bucket['Contents'][0]['Key'], self.s3_key) + + # Clean up after finishing with test + conn.delete_object(Bucket=self.s3_bucket, Key=self.s3_key) + conn.delete_bucket(Bucket=self.s3_bucket) + self.assertFalse((self.s3_hook.check_for_bucket(self.s3_bucket))) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/contrib/operators/test_slack_webhook_operator.py b/tests/contrib/operators/test_slack_webhook_operator.py index 544b790eecda0..6345ad0ef9924 100644 --- a/tests/contrib/operators/test_slack_webhook_operator.py +++ b/tests/contrib/operators/test_slack_webhook_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_snowflake_operator.py b/tests/contrib/operators/test_snowflake_operator.py index 669bd65563021..f5da6f6c43ae8 100644 --- a/tests/contrib/operators/test_snowflake_operator.py +++ b/tests/contrib/operators/test_snowflake_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_spark_jdbc_operator.py b/tests/contrib/operators/test_spark_jdbc_operator.py index 9f2cd23f8f247..652c2bc6306bb 100644 --- a/tests/contrib/operators/test_spark_jdbc_operator.py +++ b/tests/contrib/operators/test_spark_jdbc_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_spark_sql_operator.py b/tests/contrib/operators/test_spark_sql_operator.py index 8fa1428e5a5cb..b0c956931f9fb 100644 --- a/tests/contrib/operators/test_spark_sql_operator.py +++ b/tests/contrib/operators/test_spark_sql_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_spark_submit_operator.py b/tests/contrib/operators/test_spark_submit_operator.py index 0a528d9b1904c..38018d9d8cc3d 100644 --- a/tests/contrib/operators/test_spark_submit_operator.py +++ b/tests/contrib/operators/test_spark_submit_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_sqoop_operator.py b/tests/contrib/operators/test_sqoop_operator.py index 83ffa6fb796d6..5a235c487fefb 100644 --- a/tests/contrib/operators/test_sqoop_operator.py +++ b/tests/contrib/operators/test_sqoop_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/operators/test_ssh_operator.py b/tests/contrib/operators/test_ssh_operator.py index 7ddd24b2ac2ca..1a2c788596671 100644 --- a/tests/contrib/operators/test_ssh_operator.py +++ b/tests/contrib/operators/test_ssh_operator.py @@ -19,6 +19,7 @@ import unittest from base64 import b64encode +import six from airflow import configuration from airflow import models @@ -148,6 +149,65 @@ def test_no_output_command(self): self.assertIsNotNone(ti.duration) self.assertEqual(ti.xcom_pull(task_ids='test', key='return_value'), b'') + def test_arg_checking(self): + import os + from airflow.exceptions import AirflowException + conn_id = "conn_id_for_testing" + TIMEOUT = 5 + os.environ['AIRFLOW_CONN_' + conn_id.upper()] = "ssh://test_id@localhost" + + # Exception should be raised if neither ssh_hook nor ssh_conn_id is provided + if six.PY2: + self.assertRaisesRegex = self.assertRaisesRegexp + with self.assertRaisesRegex(AirflowException, + "Cannot operate without ssh_hook or ssh_conn_id."): + task_0 = SSHOperator(task_id="test", command="echo -n airflow", + timeout=TIMEOUT, dag=self.dag) + task_0.execute(None) + + # if ssh_hook is invalid/not provided, use ssh_conn_id to create SSHHook + task_1 = SSHOperator( + task_id="test_1", + ssh_hook="string_rather_than_SSHHook", # invalid ssh_hook + ssh_conn_id=conn_id, + command="echo -n airflow", + timeout=TIMEOUT, + dag=self.dag + ) + try: + task_1.execute(None) + except Exception: + pass + self.assertEqual(task_1.ssh_hook.ssh_conn_id, conn_id) + + task_2 = SSHOperator( + task_id="test_2", + ssh_conn_id=conn_id, # no ssh_hook provided + command="echo -n airflow", + timeout=TIMEOUT, + dag=self.dag + ) + try: + task_2.execute(None) + except Exception: + pass + self.assertEqual(task_2.ssh_hook.ssh_conn_id, conn_id) + + # if both valid ssh_hook and ssh_conn_id are provided, ignore ssh_conn_id + task_3 = SSHOperator( + task_id="test_3", + ssh_hook=self.hook, + ssh_conn_id=conn_id, + command="echo -n airflow", + timeout=TIMEOUT, + dag=self.dag + ) + try: + task_3.execute(None) + except Exception: + pass + self.assertEqual(task_3.ssh_hook.ssh_conn_id, self.hook.ssh_conn_id) + if __name__ == '__main__': unittest.main() diff --git a/tests/contrib/sensors/__init__.py b/tests/contrib/sensors/__init__.py index 4067cc78ee9a2..114d189da14ab 100644 --- a/tests/contrib/sensors/__init__.py +++ b/tests/contrib/sensors/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_aws_redshift_cluster_sensor.py b/tests/contrib/sensors/test_aws_redshift_cluster_sensor.py index 95064c2655ac0..6753cefa428a3 100644 --- a/tests/contrib/sensors/test_aws_redshift_cluster_sensor.py +++ b/tests/contrib/sensors/test_aws_redshift_cluster_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_bash_sensor.py b/tests/contrib/sensors/test_bash_sensor.py index 346be5180eaa9..e678425997790 100644 --- a/tests/contrib/sensors/test_bash_sensor.py +++ b/tests/contrib/sensors/test_bash_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_datadog_sensor.py b/tests/contrib/sensors/test_datadog_sensor.py index 2f93bb1d4500e..75fca65033766 100644 --- a/tests/contrib/sensors/test_datadog_sensor.py +++ b/tests/contrib/sensors/test_datadog_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_emr_base_sensor.py b/tests/contrib/sensors/test_emr_base_sensor.py index 2215edd09e0f6..6dd6fc2b87917 100644 --- a/tests/contrib/sensors/test_emr_base_sensor.py +++ b/tests/contrib/sensors/test_emr_base_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_emr_job_flow_sensor.py b/tests/contrib/sensors/test_emr_job_flow_sensor.py index a66e52ffdf5f1..606cd84c32623 100644 --- a/tests/contrib/sensors/test_emr_job_flow_sensor.py +++ b/tests/contrib/sensors/test_emr_job_flow_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_emr_step_sensor.py b/tests/contrib/sensors/test_emr_step_sensor.py index 7f72c73befd03..2a105a9393d21 100644 --- a/tests/contrib/sensors/test_emr_step_sensor.py +++ b/tests/contrib/sensors/test_emr_step_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_file_sensor.py b/tests/contrib/sensors/test_file_sensor.py index 0bb0007c60751..d0fd0b9aadcb7 100644 --- a/tests/contrib/sensors/test_file_sensor.py +++ b/tests/contrib/sensors/test_file_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_ftp_sensor.py b/tests/contrib/sensors/test_ftp_sensor.py index cf0fdb4918503..a20618fe9923b 100644 --- a/tests/contrib/sensors/test_ftp_sensor.py +++ b/tests/contrib/sensors/test_ftp_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_hdfs_sensor.py b/tests/contrib/sensors/test_hdfs_sensor.py index 26ce5570a0e44..f72d9834477d0 100644 --- a/tests/contrib/sensors/test_hdfs_sensor.py +++ b/tests/contrib/sensors/test_hdfs_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_jira_sensor_test.py b/tests/contrib/sensors/test_jira_sensor_test.py index 06a7713f35d48..561b4babd12bf 100644 --- a/tests/contrib/sensors/test_jira_sensor_test.py +++ b/tests/contrib/sensors/test_jira_sensor_test.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_pubsub_sensor.py b/tests/contrib/sensors/test_pubsub_sensor.py index f1f8fade62c7b..1973b0453ab76 100644 --- a/tests/contrib/sensors/test_pubsub_sensor.py +++ b/tests/contrib/sensors/test_pubsub_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_qubole_sensor.py b/tests/contrib/sensors/test_qubole_sensor.py index 1f28c3ddcd87c..9a0365d021570 100644 --- a/tests/contrib/sensors/test_qubole_sensor.py +++ b/tests/contrib/sensors/test_qubole_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_redis_sensor.py b/tests/contrib/sensors/test_redis_sensor.py index b931b49e9bd0c..394c8e574bd4f 100644 --- a/tests/contrib/sensors/test_redis_sensor.py +++ b/tests/contrib/sensors/test_redis_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_sagemaker_transform_sensor.py b/tests/contrib/sensors/test_sagemaker_transform_sensor.py new file mode 100644 index 0000000000000..bb4a184bb2797 --- /dev/null +++ b/tests/contrib/sensors/test_sagemaker_transform_sensor.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +# +# 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. + +import unittest + +try: + from unittest import mock +except ImportError: + try: + import mock + except ImportError: + mock = None + +from airflow import configuration +from airflow.contrib.sensors.sagemaker_transform_sensor \ + import SageMakerTransformSensor +from airflow.contrib.hooks.sagemaker_hook import SageMakerHook +from airflow.exceptions import AirflowException + +DESCRIBE_TRANSFORM_INPROGRESS_RETURN = { + 'TransformJobStatus': 'InProgress', + 'ResponseMetadata': { + 'HTTPStatusCode': 200, + } +} +DESCRIBE_TRANSFORM_COMPELETED_RETURN = { + 'TransformJobStatus': 'Compeleted', + 'ResponseMetadata': { + 'HTTPStatusCode': 200, + } +} +DESCRIBE_TRANSFORM_FAILED_RETURN = { + 'TransformJobStatus': 'Failed', + 'ResponseMetadata': { + 'HTTPStatusCode': 200, + }, + 'FailureReason': 'Unknown' +} +DESCRIBE_TRANSFORM_STOPPING_RETURN = { + 'TransformJobStatus': 'Stopping', + 'ResponseMetadata': { + 'HTTPStatusCode': 200, + } +} +DESCRIBE_TRANSFORM_STOPPED_RETURN = { + 'TransformJobStatus': 'Stopped', + 'ResponseMetadata': { + 'HTTPStatusCode': 200, + } +} + + +class TestSageMakerTransformSensor(unittest.TestCase): + def setUp(self): + configuration.load_test_config() + + @mock.patch.object(SageMakerHook, 'get_conn') + @mock.patch.object(SageMakerHook, 'describe_transform_job') + def test_raises_errors_failed_state(self, mock_describe_job, mock_client): + mock_describe_job.side_effect = [DESCRIBE_TRANSFORM_FAILED_RETURN] + sensor = SageMakerTransformSensor( + task_id='test_task', + poke_interval=2, + aws_conn_id='aws_test', + job_name='test_job_name' + ) + self.assertRaises(AirflowException, sensor.execute, None) + mock_describe_job.assert_called_once_with('test_job_name') + + @mock.patch.object(SageMakerHook, 'get_conn') + @mock.patch.object(SageMakerHook, '__init__') + @mock.patch.object(SageMakerHook, 'describe_transform_job') + def test_calls_until_a_terminal_state(self, + mock_describe_job, hook_init, mock_client): + hook_init.return_value = None + + mock_describe_job.side_effect = [ + DESCRIBE_TRANSFORM_INPROGRESS_RETURN, + DESCRIBE_TRANSFORM_STOPPING_RETURN, + DESCRIBE_TRANSFORM_STOPPED_RETURN, + DESCRIBE_TRANSFORM_COMPELETED_RETURN + ] + sensor = SageMakerTransformSensor( + task_id='test_task', + poke_interval=2, + aws_conn_id='aws_test', + job_name='test_job_name', + region_name='us-east-1' + ) + + sensor.execute(None) + + # make sure we called 4 times(terminated when its compeleted) + self.assertEqual(mock_describe_job.call_count, 4) + + # make sure the hook was initialized with the specific params + hook_init.assert_called_with(aws_conn_id='aws_test', + region_name='us-east-1') + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/contrib/sensors/test_sftp_sensor.py b/tests/contrib/sensors/test_sftp_sensor.py index 1c13f3fb879ae..0fb9d6c610ca9 100644 --- a/tests/contrib/sensors/test_sftp_sensor.py +++ b/tests/contrib/sensors/test_sftp_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/sensors/test_wasb_sensor.py b/tests/contrib/sensors/test_wasb_sensor.py index f715b0166e705..d122e4c454403 100644 --- a/tests/contrib/sensors/test_wasb_sensor.py +++ b/tests/contrib/sensors/test_wasb_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/contrib/utils/__init__.py b/tests/contrib/utils/__init__.py index fc532e61c6c64..331c28ef9ab6c 100644 --- a/tests/contrib/utils/__init__.py +++ b/tests/contrib/utils/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/core.py b/tests/core.py index 8df6312eeb2e6..c37b1f9c8ba31 100644 --- a/tests/core.py +++ b/tests/core.py @@ -72,7 +72,7 @@ import six -NUM_EXAMPLE_DAGS = 21 +NUM_EXAMPLE_DAGS = 18 DEV_NULL = '/dev/null' TEST_DAG_FOLDER = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'dags') @@ -97,7 +97,8 @@ def reset(dag_id=TEST_DAG_ID): configuration.conf.load_test_config() -reset() +if os.environ.get('KUBERNETES_VERSION') is None: + reset() class OperatorSubclass(BaseOperator): @@ -434,7 +435,7 @@ def test_illegal_args(self): Tests that Operators reject illegal arguments """ with warnings.catch_warnings(record=True) as w: - t = BashOperator( + BashOperator( task_id='test_illegal_args', bash_command='echo success', dag=self.dag, @@ -626,6 +627,35 @@ def __bool__(self): dag=self.dag) t.resolve_template_files() + def test_task_get_template(self): + TI = models.TaskInstance + ti = TI( + task=self.runme_0, execution_date=DEFAULT_DATE) + ti.dag = self.dag_bash + ti.run(ignore_ti_state=True) + context = ti.get_template_context() + + # DEFAULT DATE is 2015-01-01 + self.assertEquals(context['ds'], '2015-01-01') + self.assertEquals(context['ds_nodash'], '20150101') + + # next_ds is 2015-01-02 as the dag interval is daily + self.assertEquals(context['next_ds'], '2015-01-02') + self.assertEquals(context['next_ds_nodash'], '20150102') + + # prev_ds is 2014-12-31 as the dag interval is daily + self.assertEquals(context['prev_ds'], '2014-12-31') + self.assertEquals(context['prev_ds_nodash'], '20141231') + + self.assertEquals(context['ts'], '2015-01-01T00:00:00+00:00') + self.assertEquals(context['ts_nodash'], '20150101T000000+0000') + + self.assertEquals(context['yesterday_ds'], '2014-12-31') + self.assertEquals(context['yesterday_ds_nodash'], '20141231') + + self.assertEquals(context['tomorrow_ds'], '2015-01-02') + self.assertEquals(context['tomorrow_ds_nodash'], '20150102') + def test_import_examples(self): self.assertEqual(len(self.dagbag.dags), NUM_EXAMPLE_DAGS) @@ -917,7 +947,7 @@ def test_dag_stats(self): models.DagStat.update([], session=session) - run1 = self.dag_bash.create_dagrun( + self.dag_bash.create_dagrun( run_id="run1", execution_date=DEFAULT_DATE, state=State.RUNNING) @@ -935,7 +965,7 @@ def test_dag_stats(self): self.assertEqual(stats.count, 0) self.assertFalse(stats.dirty) - run2 = self.dag_bash.create_dagrun( + self.dag_bash.create_dagrun( run_id="run2", execution_date=DEFAULT_DATE + timedelta(days=1), state=State.RUNNING) @@ -1059,40 +1089,44 @@ def test_cli_list_dag_runs(self): def test_cli_create_user_random_password(self): args = self.parser.parse_args([ - 'create_user', '-u', 'test1', '-l', 'doe', '-f', 'jon', - '-e', 'jdoe@foo.com', '-r', 'Viewer', '--use_random_password' + 'users', '-c', '--username', 'test1', '--lastname', 'doe', + '--firstname', 'jon', + '--email', 'jdoe@foo.com', '--role', 'Viewer', '--use_random_password' ]) - cli.create_user(args) + cli.users(args) def test_cli_create_user_supplied_password(self): args = self.parser.parse_args([ - 'create_user', '-u', 'test2', '-l', 'doe', '-f', 'jon', - '-e', 'jdoe@apache.org', '-r', 'Viewer', '-p', 'test' + 'users', '-c', '--username', 'test2', '--lastname', 'doe', + '--firstname', 'jon', + '--email', 'jdoe@apache.org', '--role', 'Viewer', '--password', 'test' ]) - cli.create_user(args) + cli.users(args) def test_cli_delete_user(self): args = self.parser.parse_args([ - 'create_user', '-u', 'test3', '-l', 'doe', '-f', 'jon', - '-e', 'jdoe@example.com', '-r', 'Viewer', '--use_random_password' + 'users', '-c', '--username', 'test3', '--lastname', 'doe', + '--firstname', 'jon', + '--email', 'jdoe@example.com', '--role', 'Viewer', '--use_random_password' ]) - cli.create_user(args) + cli.users(args) args = self.parser.parse_args([ - 'delete_user', '-u', 'test3', + 'users', '-d', '--username', 'test3', ]) - cli.delete_user(args) + cli.users(args) def test_cli_list_users(self): for i in range(0, 3): args = self.parser.parse_args([ - 'create_user', '-u', 'user{}'.format(i), '-l', 'doe', '-f', 'jon', - '-e', 'jdoe+{}@gmail.com'.format(i), '-r', 'Viewer', + 'users', '-c', '--username', 'user{}'.format(i), '--lastname', + 'doe', '--firstname', 'jon', + '--email', 'jdoe+{}@gmail.com'.format(i), '--role', 'Viewer', '--use_random_password' ]) - cli.create_user(args) + cli.users(args) with mock.patch('sys.stdout', new_callable=six.StringIO) as mock_stdout: - cli.list_users(self.parser.parse_args(['list_users'])) + cli.users(self.parser.parse_args(['users', '-l'])) stdout = mock_stdout.getvalue() for i in range(0, 3): self.assertIn('user{}'.format(i), stdout) @@ -1400,8 +1434,18 @@ def test_subdag_clear(self): 'clear', 'example_subdag_operator', '--no_confirm', '--exclude_subdags']) cli.clear(args) + def test_parentdag_downstream_clear(self): + args = self.parser.parse_args([ + 'clear', 'example_subdag_operator.section-1', '--no_confirm']) + cli.clear(args) + args = self.parser.parse_args([ + 'clear', 'example_subdag_operator.section-1', '--no_confirm', + '--exclude_parentdag']) + cli.clear(args) + def test_get_dags(self): - dags = cli.get_dags(self.parser.parse_args(['clear', 'example_subdag_operator', '-c'])) + dags = cli.get_dags(self.parser.parse_args(['clear', 'example_subdag_operator', + '-c'])) self.assertEqual(len(dags), 1) dags = cli.get_dags(self.parser.parse_args(['clear', 'subdag', '-dx', '-c'])) @@ -1483,6 +1527,42 @@ def test_pool_no_args(self): except Exception as e: self.fail("The 'pool' command raised unexpectedly: %s" % e) + def test_pool_import_export(self): + # Create two pools first + pool_config_input = { + "foo": { + "description": "foo_test", + "slots": 1 + }, + "baz": { + "description": "baz_test", + "slots": 2 + } + } + with open('pools_import.json', mode='w') as f: + json.dump(pool_config_input, f) + + # Import json + try: + cli.pool(self.parser.parse_args(['pool', '-i', 'pools_import.json'])) + except Exception as e: + self.fail("The 'pool -i pools_import.json' failed: %s" % e) + + # Export json + try: + cli.pool(self.parser.parse_args(['pool', '-e', 'pools_export.json'])) + except Exception as e: + self.fail("The 'pool -e pools_export.json' failed: %s" % e) + + with open('pools_export.json', mode='r') as f: + pool_config_output = json.load(f) + self.assertEqual( + pool_config_input, + pool_config_output, + "Input and output pool files are not same") + os.remove('pools_import.json') + os.remove('pools_export.json') + def test_variables(self): # Checks if all subcommands are properly received cli.variables(self.parser.parse_args([ @@ -1877,6 +1957,34 @@ def test_dag_views(self): response = self.app.get(url) self.assertIn("Wait a minute", response.data.decode('utf-8')) response = self.app.get(url + "&confirmed=true") + url = ( + "/admin/airflow/clear?task_id=section-1-task-1&" + "dag_id=example_subdag_operator.section-1&future=false&past=false&" + "upstream=false&downstream=true&recursive=true&" + "execution_date={}&" + "origin=/admin".format(DEFAULT_DATE_DS)) + response = self.app.get(url) + self.assertIn("Wait a minute", response.data.decode('utf-8')) + self.assertIn("example_subdag_operator.end", + response.data.decode('utf-8')) + self.assertIn("example_subdag_operator.section-1.section-1-task-1", + response.data.decode('utf-8')) + self.assertIn("example_subdag_operator.section-1", + response.data.decode('utf-8')) + self.assertIn("example_subdag_operator.section-2", + response.data.decode('utf-8')) + self.assertIn("example_subdag_operator.section-2.section-2-task-1", + response.data.decode('utf-8')) + self.assertIn("example_subdag_operator.section-2.section-2-task-2", + response.data.decode('utf-8')) + self.assertIn("example_subdag_operator.section-2.section-2-task-3", + response.data.decode('utf-8')) + self.assertIn("example_subdag_operator.section-2.section-2-task-4", + response.data.decode('utf-8')) + self.assertIn("example_subdag_operator.section-2.section-2-task-5", + response.data.decode('utf-8')) + self.assertIn("example_subdag_operator.some-other-task", + response.data.decode('utf-8')) url = ( "/admin/airflow/run?task_id=runme_0&" "dag_id=example_bash_operator&ignore_all_deps=false&ignore_ti_state=true&" diff --git a/tests/dags/.airflowignore b/tests/dags/.airflowignore new file mode 100644 index 0000000000000..93361c17e24d8 --- /dev/null +++ b/tests/dags/.airflowignore @@ -0,0 +1 @@ +.*_invalid.* diff --git a/tests/dags/no_dags.py b/tests/dags/no_dags.py index db5ba598d7c23..b7f8352944d3f 100644 --- a/tests/dags/no_dags.py +++ b/tests/dags/no_dags.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_backfill_pooled_tasks.py b/tests/dags/test_backfill_pooled_tasks.py index 4b4f2a8661e14..8320f51c86e76 100644 --- a/tests/dags/test_backfill_pooled_tasks.py +++ b/tests/dags/test_backfill_pooled_tasks.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_cli_triggered_dags.py b/tests/dags/test_cli_triggered_dags.py index b0683be80f57a..f625e18475454 100644 --- a/tests/dags/test_cli_triggered_dags.py +++ b/tests/dags/test_cli_triggered_dags.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_default_impersonation.py b/tests/dags/test_default_impersonation.py index 42b7198bd6ca1..537fee9a7cb93 100644 --- a/tests/dags/test_default_impersonation.py +++ b/tests/dags/test_default_impersonation.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_double_trigger.py b/tests/dags/test_double_trigger.py index eea0aa1ddc69f..a53d7638dfefc 100644 --- a/tests/dags/test_double_trigger.py +++ b/tests/dags/test_double_trigger.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_impersonation.py b/tests/dags/test_impersonation.py index 4e554e146d7c6..bc327d2953844 100644 --- a/tests/dags/test_impersonation.py +++ b/tests/dags/test_impersonation.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_impersonation_custom.py b/tests/dags/test_impersonation_custom.py index 43a52355c4095..1157812abca02 100644 --- a/tests/dags/test_impersonation_custom.py +++ b/tests/dags/test_impersonation_custom.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_impersonation_subdag.py b/tests/dags/test_impersonation_subdag.py index 423c55266485b..01275c67c0264 100644 --- a/tests/dags/test_impersonation_subdag.py +++ b/tests/dags/test_impersonation_subdag.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_issue_1225.py b/tests/dags/test_issue_1225.py index b7bd5d5a24e7b..8009f48904875 100644 --- a/tests/dags/test_issue_1225.py +++ b/tests/dags/test_issue_1225.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_latest_runs.py b/tests/dags/test_latest_runs.py index a39a6bd948e25..e8cd99adc907e 100644 --- a/tests/dags/test_latest_runs.py +++ b/tests/dags/test_latest_runs.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_mark_success.py b/tests/dags/test_mark_success.py index 50ba32d2e3d73..dfbcbc1b5d16b 100644 --- a/tests/dags/test_mark_success.py +++ b/tests/dags/test_mark_success.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_no_impersonation.py b/tests/dags/test_no_impersonation.py index cb5bb66a6124c..26cb935d8679e 100644 --- a/tests/dags/test_no_impersonation.py +++ b/tests/dags/test_no_impersonation.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_on_kill.py b/tests/dags/test_on_kill.py index 353b4573921c3..d9307f150843b 100644 --- a/tests/dags/test_on_kill.py +++ b/tests/dags/test_on_kill.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_retry_handling_job.py b/tests/dags/test_retry_handling_job.py index aae072e0bf4b5..39c29a8d61f91 100644 --- a/tests/dags/test_retry_handling_job.py +++ b/tests/dags/test_retry_handling_job.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags/test_scheduler_dags.py b/tests/dags/test_scheduler_dags.py index 990086693771a..ae2bd202d9803 100644 --- a/tests/dags/test_scheduler_dags.py +++ b/tests/dags/test_scheduler_dags.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags_with_system_exit/a_system_exit.py b/tests/dags_with_system_exit/a_system_exit.py index 42d96a3d1c9be..8d51ddcbb833e 100644 --- a/tests/dags_with_system_exit/a_system_exit.py +++ b/tests/dags_with_system_exit/a_system_exit.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags_with_system_exit/b_test_scheduler_dags.py b/tests/dags_with_system_exit/b_test_scheduler_dags.py index 2d925cd79e172..bde36ba5dfecf 100644 --- a/tests/dags_with_system_exit/b_test_scheduler_dags.py +++ b/tests/dags_with_system_exit/b_test_scheduler_dags.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/dags_with_system_exit/c_system_exit.py b/tests/dags_with_system_exit/c_system_exit.py index 2581dfecebeea..bebaa3e8f3945 100644 --- a/tests/dags_with_system_exit/c_system_exit.py +++ b/tests/dags_with_system_exit/c_system_exit.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/executors/__init__.py b/tests/executors/__init__.py index 4e16cd0a8e1f1..114d189da14ab 100644 --- a/tests/executors/__init__.py +++ b/tests/executors/__init__.py @@ -7,14 +7,12 @@ # 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. - -from .dask_executor import * diff --git a/tests/executors/dask_executor.py b/tests/executors/dask_executor.py index 9bf051f5805d2..4f0009e1ccb21 100644 --- a/tests/executors/dask_executor.py +++ b/tests/executors/dask_executor.py @@ -55,8 +55,8 @@ def assert_tasks_on_executor(self, executor): # start the executor executor.start() - success_command = ['true', ] - fail_command = ['false', ] + success_command = ['true', 'some_parameter'] + fail_command = ['false', 'some_parameter'] executor.execute_async(key='success', command=success_command) executor.execute_async(key='fail', command=fail_command) diff --git a/tests/executors/test_base_executor.py b/tests/executors/test_base_executor.py index f349355d32efa..f640a75e01d62 100644 --- a/tests/executors/test_base_executor.py +++ b/tests/executors/test_base_executor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/executors/test_celery_executor.py b/tests/executors/test_celery_executor.py index 69f9fbfe9fea8..5c70b5bf20d70 100644 --- a/tests/executors/test_celery_executor.py +++ b/tests/executors/test_celery_executor.py @@ -18,14 +18,16 @@ # under the License. import sys import unittest +import mock from celery.contrib.testing.worker import start_worker from airflow.executors.celery_executor import CeleryExecutor from airflow.executors.celery_executor import app +from airflow.executors.celery_executor import CELERY_FETCH_ERR_MSG_HEADER from airflow.utils.state import State # leave this it is used by the test worker -import celery.contrib.testing.tasks +import celery.contrib.testing.tasks # noqa: F401 class CeleryExecutorTest(unittest.TestCase): @@ -34,8 +36,8 @@ def test_celery_integration(self): executor.start() with start_worker(app=app, logfile=sys.stdout, loglevel='debug'): - success_command = ['true', ] - fail_command = ['false', ] + success_command = ['true', 'some_parameter'] + fail_command = ['false', 'some_parameter'] executor.execute_async(key='success', command=success_command) # errors are propagated for some reason @@ -57,5 +59,26 @@ def test_celery_integration(self): self.assertNotIn('success', executor.last_state) self.assertNotIn('fail', executor.last_state) + def test_exception_propagation(self): + @app.task + def fake_celery_task(): + return {} + + mock_log = mock.MagicMock() + executor = CeleryExecutor() + executor._log = mock_log + + executor.tasks = {'key': fake_celery_task()} + executor.sync() + mock_log.error.assert_called_once() + args, kwargs = mock_log.error.call_args_list[0] + log = args[0] + # Result of queuing is not a celery task but a dict, + # and it should raise AttributeError and then get propagated + # to the error log. + self.assertIn(CELERY_FETCH_ERR_MSG_HEADER, log) + self.assertIn('AttributeError', log) + + if __name__ == '__main__': unittest.main() diff --git a/tests/executors/test_executor.py b/tests/executors/test_executor.py index a6fc54020f04e..23dd8d691cf32 100644 --- a/tests/executors/test_executor.py +++ b/tests/executors/test_executor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/executors/test_local_executor.py b/tests/executors/test_local_executor.py index 846e1325618ac..59cb09c74e6b0 100644 --- a/tests/executors/test_local_executor.py +++ b/tests/executors/test_local_executor.py @@ -33,8 +33,8 @@ def execution_parallelism(self, parallelism=0): executor.start() success_key = 'success {}' - success_command = ['true', ] - fail_command = ['false', ] + success_command = ['true', 'some_parameter'] + fail_command = ['false', 'some_parameter'] for i in range(self.TEST_SUCCESS_COMMANDS): key, command = success_key.format(i), success_command diff --git a/tests/hooks/test_http_hook.py b/tests/hooks/test_http_hook.py index c8163322f942b..e64e59fbcae64 100644 --- a/tests/hooks/test_http_hook.py +++ b/tests/hooks/test_http_hook.py @@ -42,6 +42,15 @@ def get_airflow_connection(conn_id=None): ) +def get_airflow_connection_with_port(conn_id=None): + return models.Connection( + conn_id='http_default', + conn_type='http', + host='test.com', + port=1234 + ) + + class TestHttpHook(unittest.TestCase): """Test get, post and raise_for_status""" def setUp(self): @@ -69,6 +78,32 @@ def test_raise_for_status_with_200(self, m): resp = self.get_hook.run('v1/test') self.assertEquals(resp.text, '{"status":{"status": 200}}') + @requests_mock.mock() + @mock.patch('requests.Request') + def test_get_request_with_port(self, m, request_mock): + from requests.exceptions import MissingSchema + + with mock.patch( + 'airflow.hooks.base_hook.BaseHook.get_connection', + side_effect=get_airflow_connection_with_port + ): + expected_url = 'http://test.com:1234/some/endpoint' + for endpoint in ['some/endpoint', '/some/endpoint']: + + try: + self.get_hook.run(endpoint) + except MissingSchema: + pass + + request_mock.assert_called_once_with( + mock.ANY, + expected_url, + headers=mock.ANY, + params=mock.ANY + ) + + request_mock.reset_mock() + @requests_mock.mock() def test_get_request_do_not_raise_for_status_if_check_response_is_false(self, m): diff --git a/tests/hooks/test_mysql_hook.py b/tests/hooks/test_mysql_hook.py index d112f880e9e3a..415d430fc4b77 100644 --- a/tests/hooks/test_mysql_hook.py +++ b/tests/hooks/test_mysql_hook.py @@ -18,12 +18,81 @@ # under the License. # +import json import mock import unittest +import MySQLdb.cursors + +from airflow import models from airflow.hooks.mysql_hook import MySqlHook +class TestMySqlHookConn(unittest.TestCase): + + def setUp(self): + super(TestMySqlHookConn, self).setUp() + + self.connection = models.Connection( + login='login', + password='password', + host='host', + schema='schema', + ) + + self.db_hook = MySqlHook() + self.db_hook.get_connection = mock.Mock() + self.db_hook.get_connection.return_value = self.connection + + @mock.patch('airflow.hooks.mysql_hook.MySQLdb.connect') + def test_get_conn(self, mock_connect): + self.db_hook.get_conn() + mock_connect.assert_called_once() + args, kwargs = mock_connect.call_args + self.assertEqual(args, ()) + self.assertEqual(kwargs['user'], 'login') + self.assertEqual(kwargs['passwd'], 'password') + self.assertEqual(kwargs['host'], 'host') + self.assertEqual(kwargs['db'], 'schema') + + @mock.patch('airflow.hooks.mysql_hook.MySQLdb.connect') + def test_get_conn_port(self, mock_connect): + self.connection.port = 3307 + self.db_hook.get_conn() + mock_connect.assert_called_once() + args, kwargs = mock_connect.call_args + self.assertEqual(args, ()) + self.assertEqual(kwargs['port'], 3307) + + @mock.patch('airflow.hooks.mysql_hook.MySQLdb.connect') + def test_get_conn_charset(self, mock_connect): + self.connection.extra = json.dumps({'charset': 'utf-8'}) + self.db_hook.get_conn() + mock_connect.assert_called_once() + args, kwargs = mock_connect.call_args + self.assertEqual(args, ()) + self.assertEqual(kwargs['charset'], 'utf-8') + self.assertEqual(kwargs['use_unicode'], True) + + @mock.patch('airflow.hooks.mysql_hook.MySQLdb.connect') + def test_get_conn_cursor(self, mock_connect): + self.connection.extra = json.dumps({'cursor': 'sscursor'}) + self.db_hook.get_conn() + mock_connect.assert_called_once() + args, kwargs = mock_connect.call_args + self.assertEqual(args, ()) + self.assertEqual(kwargs['cursorclass'], MySQLdb.cursors.SSCursor) + + @mock.patch('airflow.hooks.mysql_hook.MySQLdb.connect') + def test_get_conn_local_infile(self, mock_connect): + self.connection.extra = json.dumps({'local_infile': True}) + self.db_hook.get_conn() + mock_connect.assert_called_once() + args, kwargs = mock_connect.call_args + self.assertEqual(args, ()) + self.assertEqual(kwargs['local_infile'], 1) + + class TestMySqlHook(unittest.TestCase): def setUp(self): @@ -85,3 +154,20 @@ def test_run_multi_queries(self): self.assertEqual(kwargs, {}) self.cur.execute.assert_called_with(sql[1]) self.conn.commit.assert_not_called() + + def test_bulk_load(self): + self.db_hook.bulk_load('table', '/tmp/file') + self.cur.execute.assert_called_once_with(""" + LOAD DATA LOCAL INFILE '/tmp/file' + INTO TABLE table + """) + + def test_bulk_dump(self): + self.db_hook.bulk_dump('table', '/tmp/file') + self.cur.execute.assert_called_once_with(""" + SELECT * INTO OUTFILE '/tmp/file' + FROM table + """) + + def test_serialize_cell(self): + self.assertEqual('foo', self.db_hook._serialize_cell('foo', None)) diff --git a/tests/hooks/test_postgres_hook.py b/tests/hooks/test_postgres_hook.py index 0520239e06ee8..3e71f60f5b8d0 100644 --- a/tests/hooks/test_postgres_hook.py +++ b/tests/hooks/test_postgres_hook.py @@ -28,6 +28,10 @@ class TestPostgresHook(unittest.TestCase): + def __init__(self, *args, **kwargs): + super(TestPostgresHook, self).__init__(*args, **kwargs) + self.table = "test_postgres_hook_table" + def setUp(self): super(TestPostgresHook, self).setUp() @@ -43,6 +47,13 @@ def get_conn(self): self.db_hook = UnitTestPostgresHook() + def tearDown(self): + super(TestPostgresHook, self).tearDown() + + with PostgresHook().get_conn() as conn: + with conn.cursor() as cur: + cur.execute("DROP TABLE IF EXISTS {}".format(self.table)) + def test_copy_expert(self): m = mock.mock_open(read_data='{"some": "json"}') with mock.patch('airflow.hooks.postgres_hook.open', m): @@ -61,40 +72,36 @@ def test_copy_expert(self): def test_bulk_load(self): hook = PostgresHook() - table = "t" input_data = ["foo", "bar", "baz"] with hook.get_conn() as conn: with conn.cursor() as cur: - cur.execute("DROP TABLE IF EXISTS {}".format(table)) - cur.execute("CREATE TABLE {} (c VARCHAR)".format(table)) + cur.execute("CREATE TABLE {} (c VARCHAR)".format(self.table)) conn.commit() with NamedTemporaryFile() as f: f.write("\n".join(input_data).encode("utf-8")) f.flush() - hook.bulk_load(table, f.name) + hook.bulk_load(self.table, f.name) - cur.execute("SELECT * FROM {}".format(table)) + cur.execute("SELECT * FROM {}".format(self.table)) results = [row[0] for row in cur.fetchall()] self.assertEqual(sorted(input_data), sorted(results)) def test_bulk_dump(self): hook = PostgresHook() - table = "t" input_data = ["foo", "bar", "baz"] with hook.get_conn() as conn: with conn.cursor() as cur: - cur.execute("DROP TABLE IF EXISTS {}".format(table)) - cur.execute("CREATE TABLE {} (c VARCHAR)".format(table)) + cur.execute("CREATE TABLE {} (c VARCHAR)".format(self.table)) values = ",".join("('{}')".format(data) for data in input_data) - cur.execute("INSERT INTO {} VALUES {}".format(table, values)) + cur.execute("INSERT INTO {} VALUES {}".format(self.table, values)) conn.commit() with NamedTemporaryFile() as f: - hook.bulk_dump(table, f.name) + hook.bulk_dump(self.table, f.name) f.seek(0) results = [line.rstrip().decode("utf-8") for line in f.readlines()] diff --git a/tests/impersonation.py b/tests/impersonation.py index f789fcb95f463..8ded423e356a0 100644 --- a/tests/impersonation.py +++ b/tests/impersonation.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/jobs.py b/tests/jobs.py index f9c07b96c9f51..bb714bd201602 100644 --- a/tests/jobs.py +++ b/tests/jobs.py @@ -425,8 +425,6 @@ def test_backfill_ordered_concurrent_execute(self): def test_backfill_pooled_tasks(self): """ Test that queued tasks are executed by BackfillJob - - Test for https://github.com/airbnb/airflow/pull/1225 """ session = settings.Session() pool = Pool(pool='test_backfill_pooled_task_pool', slots=1) @@ -903,6 +901,59 @@ def test_backfill_execute_subdag(self): subdag.clear() dag.clear() + def test_subdag_clear_parentdag_downstream_clear(self): + dag = self.dagbag.get_dag('example_subdag_operator') + subdag_op_task = dag.get_task('section-1') + + subdag = subdag_op_task.subdag + subdag.schedule_interval = '@daily' + + executor = TestExecutor(do_update=True) + job = BackfillJob(dag=subdag, + start_date=DEFAULT_DATE, + end_date=DEFAULT_DATE, + executor=executor, + donot_pickle=True) + + with timeout(seconds=30): + job.run() + + ti0 = TI( + task=subdag.get_task('section-1-task-1'), + execution_date=DEFAULT_DATE) + ti0.refresh_from_db() + self.assertEqual(ti0.state, State.SUCCESS) + + sdag = subdag.sub_dag( + task_regex='section-1-task-1', + include_downstream=True, + include_upstream=False) + + sdag.clear( + start_date=DEFAULT_DATE, + end_date=DEFAULT_DATE, + include_parentdag=True) + + ti0.refresh_from_db() + self.assertEquals(State.NONE, ti0.state) + + ti1 = TI( + task=dag.get_task('some-other-task'), + execution_date=DEFAULT_DATE) + self.assertEquals(State.NONE, ti1.state) + + # Checks that all the Downstream tasks for Parent DAG + # have been cleared + for task in subdag_op_task.downstream_list: + ti = TI( + task=dag.get_task(task.task_id), + execution_date=DEFAULT_DATE + ) + self.assertEquals(State.NONE, ti.state) + + subdag.clear() + dag.clear() + def test_backfill_execute_subdag_with_removed_task(self): """ Ensure that subdag operators execute properly in the case where @@ -3234,16 +3285,22 @@ def test_list_py_file_paths(self): [JIRA-1357] Test the 'list_py_file_paths' function used by the scheduler to list and load DAGs. """ - detected_files = [] - expected_files = [] + detected_files = set() + expected_files = set() + # No_dags is empty, _invalid_ is ignored by .airflowignore + ignored_files = [ + 'no_dags.py', + 'test_invalid_cron.py', + 'test_zip_invalid_cron.zip', + ] for file_name in os.listdir(TEST_DAGS_FOLDER): if file_name.endswith('.py') or file_name.endswith('.zip'): - if file_name not in ['no_dags.py']: - expected_files.append( + if file_name not in ignored_files: + expected_files.add( '{}/{}'.format(TEST_DAGS_FOLDER, file_name)) for file_path in list_py_file_paths(TEST_DAGS_FOLDER): - detected_files.append(file_path) - self.assertEqual(sorted(detected_files), sorted(expected_files)) + detected_files.add(file_path) + self.assertEqual(detected_files, expected_files) def test_reset_orphaned_tasks_nothing(self): """Try with nothing. """ diff --git a/tests/macros/__init__.py b/tests/macros/__init__.py index db5ba598d7c23..b7f8352944d3f 100644 --- a/tests/macros/__init__.py +++ b/tests/macros/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/macros/test_hive.py b/tests/macros/test_hive.py index eaa5050f0ddab..73e42717fa837 100644 --- a/tests/macros/test_hive.py +++ b/tests/macros/test_hive.py @@ -7,9 +7,9 @@ # 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 @@ -17,7 +17,7 @@ # specific language governing permissions and limitations # under the License. -from datetime import datetime, timedelta +from datetime import datetime import unittest from airflow.macros import hive diff --git a/tests/models.py b/tests/models.py index a1fd1e991221a..1479b63ec4354 100644 --- a/tests/models.py +++ b/tests/models.py @@ -38,23 +38,25 @@ from airflow.exceptions import AirflowDagCycleException, AirflowSkipException from airflow.jobs import BackfillJob from airflow.models import DAG, TaskInstance as TI -from airflow.models import DagRun from airflow.models import State as ST from airflow.models import DagModel, DagRun, DagStat from airflow.models import clear_task_instances from airflow.models import XCom from airflow.models import Connection +from airflow.models import SkipMixin +from airflow.models import KubeResourceVersion, KubeWorkerIdentifier from airflow.jobs import LocalTaskJob from airflow.operators.dummy_operator import DummyOperator from airflow.operators.bash_operator import BashOperator from airflow.operators.python_operator import PythonOperator from airflow.operators.python_operator import ShortCircuitOperator +from airflow.operators.subdag_operator import SubDagOperator from airflow.ti_deps.deps.trigger_rule_dep import TriggerRuleDep from airflow.utils import timezone from airflow.utils.weight_rule import WeightRule from airflow.utils.state import State from airflow.utils.trigger_rule import TriggerRule -from mock import patch, ANY +from mock import patch, Mock, ANY from parameterized import parameterized from tempfile import mkdtemp, NamedTemporaryFile @@ -65,7 +67,7 @@ class DagTest(unittest.TestCase): - def test_parms_not_passed_is_empty_dict(self): + def test_params_not_passed_is_empty_dict(self): """ Test that when 'params' is _not_ passed to a new Dag, that the params attribute is set to an empty dictionary. @@ -139,6 +141,17 @@ def test_dag_as_context_manager(self): self.assertEqual(dag.dag_id, 'creating_dag_in_cm') self.assertEqual(dag.tasks[0].task_id, 'op6') + with dag: + with dag: + op7 = DummyOperator(task_id='op7') + op8 = DummyOperator(task_id='op8') + op9 = DummyOperator(task_id='op8') + op9.dag = dag2 + + self.assertEqual(op7.dag, dag) + self.assertEqual(op8.dag, dag) + self.assertEqual(op9.dag, dag2) + def test_dag_topological_sort(self): dag = DAG( 'dag', @@ -311,7 +324,6 @@ def test_dag_task_priority_weight_total(self): with self.assertRaises(AirflowException): DummyOperator(task_id='should_fail', weight_rule='no rule') - def test_get_num_task_instances(self): test_dag_id = 'test_get_num_task_instances_dag' test_task_id = 'task_1' @@ -334,20 +346,41 @@ def test_get_num_task_instances(self): session.merge(ti4) session.commit() - self.assertEqual(0, DAG.get_num_task_instances(test_dag_id, ['fakename'], - session=session)) - self.assertEqual(4, DAG.get_num_task_instances(test_dag_id, [test_task_id], - session=session)) - self.assertEqual(4, DAG.get_num_task_instances(test_dag_id, - ['fakename', test_task_id], session=session)) - self.assertEqual(1, DAG.get_num_task_instances(test_dag_id, [test_task_id], - states=[None], session=session)) - self.assertEqual(2, DAG.get_num_task_instances(test_dag_id, [test_task_id], - states=[State.RUNNING], session=session)) - self.assertEqual(3, DAG.get_num_task_instances(test_dag_id, [test_task_id], - states=[None, State.RUNNING], session=session)) - self.assertEqual(4, DAG.get_num_task_instances(test_dag_id, [test_task_id], - states=[None, State.QUEUED, State.RUNNING], session=session)) + self.assertEqual( + 0, + DAG.get_num_task_instances(test_dag_id, ['fakename'], session=session) + ) + self.assertEqual( + 4, + DAG.get_num_task_instances(test_dag_id, [test_task_id], session=session) + ) + self.assertEqual( + 4, + DAG.get_num_task_instances( + test_dag_id, ['fakename', test_task_id], session=session) + ) + self.assertEqual( + 1, + DAG.get_num_task_instances( + test_dag_id, [test_task_id], states=[None], session=session) + ) + self.assertEqual( + 2, + DAG.get_num_task_instances( + test_dag_id, [test_task_id], states=[State.RUNNING], session=session) + ) + self.assertEqual( + 3, + DAG.get_num_task_instances( + test_dag_id, [test_task_id], + states=[None, State.RUNNING], session=session) + ) + self.assertEqual( + 4, + DAG.get_num_task_instances( + test_dag_id, [test_task_id], + states=[None, State.QUEUED, State.RUNNING], session=session) + ) session.close() def test_render_template_field(self): @@ -368,7 +401,7 @@ def test_render_template_field_macro(self): dag = DAG('test-dag', start_date=DEFAULT_DATE, - user_defined_macros = dict(foo='bar')) + user_defined_macros=dict(foo='bar')) with dag: task = DummyOperator(task_id='op1') @@ -407,11 +440,11 @@ def test_render_template_field_filter(self): if a custom filter was defined""" def jinja_udf(name): - return 'Hello %s' %name + return 'Hello %s' % name dag = DAG('test-dag', start_date=DEFAULT_DATE, - user_defined_filters = dict(hello=jinja_udf)) + user_defined_filters=dict(hello=jinja_udf)) with dag: task = DummyOperator(task_id='op1') @@ -545,6 +578,38 @@ def test_cycle(self): with self.assertRaises(AirflowDagCycleException): dag.test_cycle() + @patch('airflow.models.timezone.utcnow') + def test_sync_to_db(self, mock_now): + dag = DAG( + 'dag', + start_date=DEFAULT_DATE, + ) + with dag: + DummyOperator(task_id='task', owner='owner1') + SubDagOperator( + task_id='subtask', + owner='owner2', + subdag=DAG( + 'dag.subtask', + start_date=DEFAULT_DATE, + ) + ) + now = datetime.datetime.utcnow().replace(tzinfo=pendulum.timezone('UTC')) + mock_now.return_value = now + session = settings.Session() + dag.sync_to_db(session=session) + + orm_dag = session.query(DagModel).filter(DagModel.dag_id == 'dag').one() + self.assertEqual(set(orm_dag.owners.split(', ')), {'owner1', 'owner2'}) + self.assertEqual(orm_dag.last_scheduler_run, now) + self.assertTrue(orm_dag.is_active) + + orm_subdag = session.query(DagModel).filter( + DagModel.dag_id == 'dag.subtask').one() + self.assertEqual(set(orm_subdag.owners.split(', ')), {'owner1', 'owner2'}) + self.assertEqual(orm_subdag.last_scheduler_run, now) + self.assertTrue(orm_subdag.is_active) + class DagStatTest(unittest.TestCase): def test_dagstats_crud(self): @@ -595,6 +660,26 @@ def test_dagstats_crud(self): for stat in res: self.assertFalse(stat.dirty) + def test_update_exception(self): + session = Mock() + (session.query.return_value + .filter.return_value + .with_for_update.return_value + .all.side_effect) = RuntimeError('it broke') + DagStat.update(session=session) + session.rollback.assert_called() + + def test_set_dirty_exception(self): + session = Mock() + session.query.return_value.filter.return_value.all.return_value = [] + (session.query.return_value + .filter.return_value + .with_for_update.return_value + .all.side_effect) = RuntimeError('it broke') + DagStat.set_dirty('dag', session) + session.rollback.assert_called() + + class DagRunTest(unittest.TestCase): def create_dag_run(self, dag, @@ -684,10 +769,14 @@ def test_dagrun_find(self): session.commit() - self.assertEqual(1, len(models.DagRun.find(dag_id=dag_id1, external_trigger=True))) - self.assertEqual(0, len(models.DagRun.find(dag_id=dag_id1, external_trigger=False))) - self.assertEqual(0, len(models.DagRun.find(dag_id=dag_id2, external_trigger=True))) - self.assertEqual(1, len(models.DagRun.find(dag_id=dag_id2, external_trigger=False))) + self.assertEqual(1, + len(models.DagRun.find(dag_id=dag_id1, external_trigger=True))) + self.assertEqual(0, + len(models.DagRun.find(dag_id=dag_id1, external_trigger=False))) + self.assertEqual(0, + len(models.DagRun.find(dag_id=dag_id2, external_trigger=True))) + self.assertEqual(1, + len(models.DagRun.find(dag_id=dag_id2, external_trigger=False))) def test_dagrun_success_when_all_skipped(self): """ @@ -801,7 +890,26 @@ def test_dagrun_deadlock(self): dr.update_state() self.assertEqual(dr.state, State.FAILED) - def test_dagrun_no_deadlock(self): + def test_dagrun_no_deadlock_with_shutdown(self): + session = settings.Session() + dag = DAG('test_dagrun_no_deadlock_with_shutdown', + start_date=DEFAULT_DATE) + with dag: + op1 = DummyOperator(task_id='upstream_task') + op2 = DummyOperator(task_id='downstream_task') + op2.set_upstream(op1) + + dr = dag.create_dagrun(run_id='test_dagrun_no_deadlock_with_shutdown', + state=State.RUNNING, + execution_date=DEFAULT_DATE, + start_date=DEFAULT_DATE) + upstream_ti = dr.get_task_instance(task_id='upstream_task') + upstream_ti.set_state(State.SHUTDOWN, session=session) + + dr.update_state() + self.assertEqual(dr.state, State.RUNNING) + + def test_dagrun_no_deadlock_with_depends_on_past(self): session = settings.Session() dag = DAG('test_dagrun_no_deadlock', start_date=DEFAULT_DATE) @@ -896,6 +1004,124 @@ def on_failure_callable(context): updated_dag_state = dag_run.update_state() self.assertEqual(State.FAILED, updated_dag_state) + def test_dagrun_set_state_end_date(self): + session = settings.Session() + + dag = DAG( + 'test_dagrun_set_state_end_date', + start_date=DEFAULT_DATE, + default_args={'owner': 'owner1'}) + + dag.clear() + + now = timezone.utcnow() + dr = dag.create_dagrun(run_id='test_dagrun_set_state_end_date', + state=State.RUNNING, + execution_date=now, + start_date=now) + + # Initial end_date should be NULL + # State.SUCCESS and State.FAILED are all ending state and should set end_date + # State.RUNNING set end_date back to NULL + session.add(dr) + session.commit() + self.assertIsNone(dr.end_date) + + dr.set_state(State.SUCCESS) + session.merge(dr) + session.commit() + + dr_database = session.query(DagRun).filter( + DagRun.run_id == 'test_dagrun_set_state_end_date' + ).one() + self.assertIsNotNone(dr_database.end_date) + self.assertEqual(dr.end_date, dr_database.end_date) + + dr.set_state(State.RUNNING) + session.merge(dr) + session.commit() + + dr_database = session.query(DagRun).filter( + DagRun.run_id == 'test_dagrun_set_state_end_date' + ).one() + + self.assertIsNone(dr_database.end_date) + + dr.set_state(State.FAILED) + session.merge(dr) + session.commit() + dr_database = session.query(DagRun).filter( + DagRun.run_id == 'test_dagrun_set_state_end_date' + ).one() + + self.assertIsNotNone(dr_database.end_date) + self.assertEqual(dr.end_date, dr_database.end_date) + + def test_dagrun_update_state_end_date(self): + session = settings.Session() + + dag = DAG( + 'test_dagrun_update_state_end_date', + start_date=DEFAULT_DATE, + default_args={'owner': 'owner1'}) + + # A -> B + with dag: + op1 = DummyOperator(task_id='A') + op2 = DummyOperator(task_id='B') + op1.set_upstream(op2) + + dag.clear() + + now = timezone.utcnow() + dr = dag.create_dagrun(run_id='test_dagrun_update_state_end_date', + state=State.RUNNING, + execution_date=now, + start_date=now) + + # Initial end_date should be NULL + # State.SUCCESS and State.FAILED are all ending state and should set end_date + # State.RUNNING set end_date back to NULL + session.merge(dr) + session.commit() + self.assertIsNone(dr.end_date) + + ti_op1 = dr.get_task_instance(task_id=op1.task_id) + ti_op1.set_state(state=State.SUCCESS, session=session) + ti_op2 = dr.get_task_instance(task_id=op2.task_id) + ti_op2.set_state(state=State.SUCCESS, session=session) + + dr.update_state() + + dr_database = session.query(DagRun).filter( + DagRun.run_id == 'test_dagrun_update_state_end_date' + ).one() + self.assertIsNotNone(dr_database.end_date) + self.assertEqual(dr.end_date, dr_database.end_date) + + ti_op1.set_state(state=State.RUNNING, session=session) + ti_op2.set_state(state=State.RUNNING, session=session) + dr.update_state() + + dr_database = session.query(DagRun).filter( + DagRun.run_id == 'test_dagrun_update_state_end_date' + ).one() + + self.assertEqual(dr._state, State.RUNNING) + self.assertIsNone(dr.end_date) + self.assertIsNone(dr_database.end_date) + + ti_op1.set_state(state=State.FAILED, session=session) + ti_op2.set_state(state=State.FAILED, session=session) + dr.update_state() + + dr_database = session.query(DagRun).filter( + DagRun.run_id == 'test_dagrun_update_state_end_date' + ).one() + + self.assertIsNotNone(dr_database.end_date) + self.assertEqual(dr.end_date, dr_database.end_date) + def test_get_task_instance_on_empty_dagrun(self): """ Make sure that a proper value is returned when a dagrun has no task instances @@ -935,9 +1161,9 @@ def test_get_latest_runs(self): dag_id='test_latest_runs_1', start_date=DEFAULT_DATE) dag_1_run_1 = self.create_dag_run(dag, - execution_date=timezone.datetime(2015, 1, 1)) + execution_date=timezone.datetime(2015, 1, 1)) dag_1_run_2 = self.create_dag_run(dag, - execution_date=timezone.datetime(2015, 1, 2)) + execution_date=timezone.datetime(2015, 1, 2)) dagruns = models.DagRun.get_latest_runs(session) session.close() for dagrun in dagruns: @@ -985,13 +1211,21 @@ def with_all_tasks_removed(dag): flaky_ti.refresh_from_db() self.assertEquals(State.NONE, flaky_ti.state) + class DagBagTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.empty_dir = mkdtemp() + + @classmethod + def tearDownClass(cls): + os.rmdir(cls.empty_dir) def test_get_existing_dag(self): """ test that were're able to parse some example DAGs and retrieve them """ - dagbag = models.DagBag(include_examples=True) + dagbag = models.DagBag(dag_folder=self.empty_dir, include_examples=True) some_expected_dag_ids = ["example_bash_operator", "example_branch_operator"] @@ -1008,7 +1242,7 @@ def test_get_non_existing_dag(self): """ test that retrieving a non existing dag id returns None without crashing """ - dagbag = models.DagBag(include_examples=True) + dagbag = models.DagBag(dag_folder=self.empty_dir, include_examples=False) non_existing_dag_id = "non_existing_dag_id" self.assertIsNone(dagbag.get_dag(non_existing_dag_id)) @@ -1021,7 +1255,7 @@ def test_process_file_that_contains_multi_bytes_char(self): f.write('\u3042'.encode('utf8')) # write multi-byte char (hiragana) f.flush() - dagbag = models.DagBag(include_examples=True) + dagbag = models.DagBag(dag_folder=self.empty_dir, include_examples=False) self.assertEqual([], dagbag.process_file(f.name)) def test_zip_skip_log(self): @@ -1043,7 +1277,7 @@ def test_zip(self): """ test the loading of a DAG within a zip file that includes dependencies """ - dagbag = models.DagBag() + dagbag = models.DagBag(dag_folder=self.empty_dir, include_examples=False) dagbag.process_file(os.path.join(TEST_DAGS_FOLDER, "test_zip.zip")) self.assertTrue(dagbag.get_dag("test_zip_dag")) @@ -1053,14 +1287,14 @@ def test_process_file_cron_validity_check(self): as schedule interval can be identified """ invalid_dag_files = ["test_invalid_cron.py", "test_zip_invalid_cron.zip"] - dagbag = models.DagBag(dag_folder=mkdtemp()) + dagbag = models.DagBag(dag_folder=self.empty_dir, include_examples=False) self.assertEqual(len(dagbag.import_errors), 0) for d in invalid_dag_files: dagbag.process_file(os.path.join(TEST_DAGS_FOLDER, d)) self.assertEqual(len(dagbag.import_errors), len(invalid_dag_files)) - @patch.object(DagModel,'get_current') + @patch.object(DagModel, 'get_current') def test_get_dag_without_refresh(self, mock_dagmodel): """ Test that, once a DAG is loaded, it doesn't get refreshed again if it @@ -1074,6 +1308,7 @@ def test_get_dag_without_refresh(self, mock_dagmodel): class TestDagBag(models.DagBag): process_file_calls = 0 + def process_file(self, filepath, only_if_updated=True, safe_mode=True): if 'example_bash_operator.py' == os.path.basename(filepath): TestDagBag.process_file_calls += 1 @@ -1116,7 +1351,7 @@ def process_dag(self, create_dag): f.write(source.encode('utf8')) f.flush() - dagbag = models.DagBag(include_examples=False) + dagbag = models.DagBag(dag_folder=self.empty_dir, include_examples=False) found_dags = dagbag.process_file(f.name) return dagbag, found_dags, f.name @@ -1293,6 +1528,7 @@ def test_skip_cycle_dags(self): Don't crash when loading an invalid (contains a cycle) DAG file. Don't load the dag into the DagBag either """ + # Define Dag to load def basic_cycle(): from airflow.models import DAG @@ -1426,7 +1662,7 @@ def test_process_file_with_none(self): """ test that process_file can handle Nones """ - dagbag = models.DagBag(include_examples=True) + dagbag = models.DagBag(dag_folder=self.empty_dir, include_examples=False) self.assertEqual([], dagbag.process_file(None)) @@ -1457,13 +1693,15 @@ def test_kill_zombies(self, mock_ti): configuration.getboolean('core', 'unit_test_mode'), ANY) + class TaskInstanceTest(unittest.TestCase): def test_set_task_dates(self): """ Test that tasks properly take start/end dates from DAGs """ - dag = DAG('dag', start_date=DEFAULT_DATE, end_date=DEFAULT_DATE + datetime.timedelta(days=10)) + dag = DAG('dag', start_date=DEFAULT_DATE, + end_date=DEFAULT_DATE + datetime.timedelta(days=10)) op1 = DummyOperator(task_id='op_1', owner='test') @@ -1521,6 +1759,16 @@ def test_timezone_awareness(self): ti = TI(task=op1, execution_date=execution_date) self.assertEquals(ti.execution_date, utc_date) + def test_task_naive_datetime(self): + NAIVE_DATETIME = DEFAULT_DATE.replace(tzinfo=None) + + op_no_dag = DummyOperator(task_id='test_task_naive_datetime', + start_date=NAIVE_DATETIME, + end_date=NAIVE_DATETIME) + + self.assertTrue(op_no_dag.start_date.tzinfo) + self.assertTrue(op_no_dag.end_date.tzinfo) + def test_set_dag(self): """ Test assigning Operators to Dags, including deferred assignment @@ -1619,7 +1867,6 @@ def test_requeue_over_concurrency(self, mock_concurrency_reached): ti.run() self.assertEqual(ti.state, models.State.NONE) - @patch.object(TI, 'pool_full') def test_run_pooling_task(self, mock_pool_full): """ @@ -1813,11 +2060,11 @@ def test_next_retry_datetime(self): ti.try_number = 9 dt = ti.next_retry_datetime() - self.assertEqual(dt, ti.end_date+max_delay) + self.assertEqual(dt, ti.end_date + max_delay) ti.try_number = 50 dt = ti.next_retry_datetime() - self.assertEqual(dt, ti.end_date+max_delay) + self.assertEqual(dt, ti.end_date + max_delay) def test_depends_on_past(self): dagbag = models.DagBag() @@ -2059,7 +2306,7 @@ def test_check_and_change_state_before_execution(self): def test_check_and_change_state_before_execution_dep_not_met(self): dag = models.DAG(dag_id='test_check_and_change_state_before_execution') task = DummyOperator(task_id='task', dag=dag, start_date=DEFAULT_DATE) - task2= DummyOperator(task_id='task2', dag=dag, start_date=DEFAULT_DATE) + task2 = DummyOperator(task_id='task2', dag=dag, start_date=DEFAULT_DATE) task >> task2 ti = TI( task=task2, execution_date=timezone.utcnow()) @@ -2114,6 +2361,20 @@ def test_log_url(self): self.assertEqual(d['task_id'][0], 'op') self.assertEqual(pendulum.parse(d['execution_date'][0]), now) + @patch('airflow.settings.RBAC', True) + def test_log_url_rbac(self): + dag = DAG('dag', start_date=DEFAULT_DATE) + task = DummyOperator(task_id='op', dag=dag) + ti = TI(task=task, execution_date=datetime.datetime(2018, 1, 1)) + + expected_url = ( + 'http://localhost:8080/log?' + 'execution_date=2018-01-01T00%3A00%3A00%2B00%3A00' + '&task_id=op' + '&dag_id=dag' + ) + self.assertEqual(ti.log_url, expected_url) + def test_mark_success_url(self): now = pendulum.now('Europe/Brussels') dag = DAG('dag', start_date=DEFAULT_DATE) @@ -2156,6 +2417,35 @@ def test_overwrite_params_with_dag_run_conf_none(self): self.assertEqual(False, params["override"]) + @patch('airflow.models.send_email') + def test_email_alert(self, mock_send_email): + task = DummyOperator(task_id='op', email='test@test.test') + ti = TI(task=task, execution_date=datetime.datetime.now()) + ti.email_alert(RuntimeError('it broke')) + + self.assertTrue(mock_send_email.called) + (email, title, body), _ = mock_send_email.call_args + self.assertEqual(email, 'test@test.test') + self.assertIn(repr(ti), title) + self.assertIn('it broke', body) + + def test_set_duration(self): + task = DummyOperator(task_id='op', email='test@test.test') + ti = TI( + task=task, + execution_date=datetime.datetime.now(), + ) + ti.start_date = datetime.datetime(2018, 10, 1, 1) + ti.end_date = datetime.datetime(2018, 10, 1, 2) + ti.set_duration() + self.assertEqual(ti.duration, 3600) + + def test_set_duration_empty_dates(self): + task = DummyOperator(task_id='op', email='test@test.test') + ti = TI(task=task, execution_date=datetime.datetime.now()) + ti.set_duration() + self.assertIsNone(ti.duration) + class ClearTasksTest(unittest.TestCase): @@ -2278,7 +2568,8 @@ def test_dags_clear(self): for i in range(num_of_dags): dag = DAG('test_dag_clear_' + str(i), start_date=DEFAULT_DATE, end_date=DEFAULT_DATE + datetime.timedelta(days=10)) - ti = TI(task=DummyOperator(task_id='test_task_clear_' + str(i), owner='test', dag=dag), + ti = TI(task=DummyOperator(task_id='test_task_clear_' + str(i), owner='test', + dag=dag), execution_date=DEFAULT_DATE) dags.append(dag) tis.append(ti) @@ -2464,6 +2755,7 @@ def test_xcom_get_many(self): for result in results: self.assertEqual(result.value, json_obj) + class ConnectionTest(unittest.TestCase): @patch.object(configuration, 'get') def test_connection_extra_no_encryption(self, mock_get): @@ -2499,8 +2791,8 @@ def test_connection_from_uri_without_extras(self): self.assertIsNone(connection.extra) def test_connection_from_uri_with_extras(self): - uri = 'scheme://user:password@host%2flocation:1234/schema?'\ - 'extra1=a%20value&extra2=%2fpath%2f' + uri = 'scheme://user:password@host%2flocation:1234/schema?' \ + 'extra1=a%20value&extra2=%2fpath%2f' connection = Connection(uri=uri) self.assertEqual(connection.conn_type, 'scheme') self.assertEqual(connection.host, 'host/location') @@ -2510,3 +2802,99 @@ def test_connection_from_uri_with_extras(self): self.assertEqual(connection.port, 1234) self.assertDictEqual(connection.extra_dejson, {'extra1': 'a value', 'extra2': '/path/'}) + + +class TestSkipMixin(unittest.TestCase): + + @patch('airflow.models.timezone.utcnow') + def test_skip(self, mock_now): + session = settings.Session() + now = datetime.datetime.utcnow().replace(tzinfo=pendulum.timezone('UTC')) + mock_now.return_value = now + dag = DAG( + 'dag', + start_date=DEFAULT_DATE, + ) + with dag: + tasks = [DummyOperator(task_id='task')] + dag_run = dag.create_dagrun( + run_id='manual__' + now.isoformat(), + state=State.FAILED, + ) + SkipMixin().skip( + dag_run=dag_run, + execution_date=now, + tasks=tasks, + session=session) + + session.query(TI).filter( + TI.dag_id == 'dag', + TI.task_id == 'task', + TI.state == State.SKIPPED, + TI.start_date == now, + TI.end_date == now, + ).one() + + @patch('airflow.models.timezone.utcnow') + def test_skip_none_dagrun(self, mock_now): + session = settings.Session() + now = datetime.datetime.utcnow().replace(tzinfo=pendulum.timezone('UTC')) + mock_now.return_value = now + dag = DAG( + 'dag', + start_date=DEFAULT_DATE, + ) + with dag: + tasks = [DummyOperator(task_id='task')] + SkipMixin().skip( + dag_run=None, + execution_date=now, + tasks=tasks, + session=session) + + session.query(TI).filter( + TI.dag_id == 'dag', + TI.task_id == 'task', + TI.state == State.SKIPPED, + TI.start_date == now, + TI.end_date == now, + ).one() + + def test_skip_none_tasks(self): + session = Mock() + SkipMixin().skip(dag_run=None, execution_date=None, tasks=[], session=session) + self.assertFalse(session.query.called) + self.assertFalse(session.commit.called) + + +class TestKubeResourceVersion(unittest.TestCase): + + def test_checkpoint_resource_version(self): + session = settings.Session() + KubeResourceVersion.checkpoint_resource_version('7', session) + self.assertEqual(KubeResourceVersion.get_current_resource_version(session), '7') + + def test_reset_resource_version(self): + session = settings.Session() + version = KubeResourceVersion.reset_resource_version(session) + self.assertEqual(version, '0') + self.assertEqual(KubeResourceVersion.get_current_resource_version(session), '0') + + +class TestKubeWorkerIdentifier(unittest.TestCase): + + @patch('airflow.models.uuid.uuid4') + def test_get_or_create_not_exist(self, mock_uuid): + session = settings.Session() + session.query(KubeWorkerIdentifier).update({ + KubeWorkerIdentifier.worker_uuid: '' + }) + mock_uuid.return_value = 'abcde' + worker_uuid = KubeWorkerIdentifier.get_or_create_current_kube_worker_uuid(session) + self.assertEqual(worker_uuid, 'abcde') + + def test_get_or_create_exist(self): + session = settings.Session() + KubeWorkerIdentifier.checkpoint_kube_worker_uuid('fghij', session) + worker_uuid = KubeWorkerIdentifier.get_or_create_current_kube_worker_uuid(session) + self.assertEqual(worker_uuid, 'fghij') diff --git a/tests/operators/__init__.py b/tests/operators/__init__.py index b94e5a9b6ac4a..4924560599651 100644 --- a/tests/operators/__init__.py +++ b/tests/operators/__init__.py @@ -7,9 +7,9 @@ # 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 @@ -17,11 +17,3 @@ # specific language governing permissions and limitations # under the License. -from .docker_operator import * -from .subdag_operator import * -from .operators import * -from .hive_operator import * -from .s3_to_hive_operator import * -from .python_operator import * -from .latest_only_operator import * - diff --git a/tests/operators/docker_operator.py b/tests/operators/docker_operator.py index 59d6d5841642d..a216d9bd50dbb 100644 --- a/tests/operators/docker_operator.py +++ b/tests/operators/docker_operator.py @@ -7,9 +7,9 @@ # 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 @@ -77,7 +77,9 @@ def test_execute(self, client_class_mock, mkdtemp_mock): client_mock.create_host_config.assert_called_with(binds=['/host/path:/container/path', '/mkdtemp:/tmp/airflow'], network_mode='bridge', - shm_size=1000) + shm_size=1000, + dns=None, + dns_search=None) client_mock.images.assert_called_with(name='ubuntu:latest') client_mock.logs.assert_called_with(container='some_id', stream=True) client_mock.pull.assert_called_with('ubuntu:latest', stream=True) diff --git a/tests/operators/latest_only_operator.py b/tests/operators/latest_only_operator.py index 3c21831f05789..ffce39f569c6b 100644 --- a/tests/operators/latest_only_operator.py +++ b/tests/operators/latest_only_operator.py @@ -7,9 +7,9 @@ # 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 @@ -20,11 +20,9 @@ from __future__ import print_function, unicode_literals import datetime -import logging import unittest from airflow import configuration, DAG, settings -from airflow.jobs import BackfillJob from airflow.models import TaskInstance from airflow.operators.latest_only_operator import LatestOnlyOperator from airflow.operators.dummy_operator import DummyOperator diff --git a/tests/operators/operators.py b/tests/operators/operators.py index ae953253cccf8..a2d2e4ccff765 100644 --- a/tests/operators/operators.py +++ b/tests/operators/operators.py @@ -20,14 +20,12 @@ from __future__ import print_function from airflow import DAG, configuration, operators -from airflow.utils.tests import skipUnlessImported from airflow.utils import timezone from collections import OrderedDict import os import mock -import six import unittest configuration.load_test_config() @@ -38,18 +36,23 @@ TEST_DAG_ID = 'unit_test_dag' -@skipUnlessImported('airflow.operators.mysql_operator', 'MySqlOperator') class MySqlTest(unittest.TestCase): def setUp(self): configuration.load_test_config() args = { 'owner': 'airflow', - 'mysql_conn_id': 'airflow_db', 'start_date': DEFAULT_DATE } dag = DAG(TEST_DAG_ID, default_args=args) self.dag = dag + def tearDown(self): + from airflow.hooks.mysql_hook import MySqlHook + drop_tables = {'test_mysql_to_mysql', 'test_airflow'} + with MySqlHook().get_conn() as conn: + for table in drop_tables: + conn.execute("DROP TABLE IF EXISTS {}".format(table)) + def test_mysql_operator_test(self): sql = """ CREATE TABLE IF NOT EXISTS test_airflow ( @@ -60,7 +63,6 @@ def test_mysql_operator_test(self): t = MySqlOperator( task_id='basic_mysql', sql=sql, - mysql_conn_id='airflow_db', dag=self.dag) t.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE, ignore_ti_state=True) @@ -72,8 +74,9 @@ def test_mysql_operator_test_multi(self): from airflow.operators.mysql_operator import MySqlOperator t = MySqlOperator( task_id='mysql_operator_test_multi', - mysql_conn_id='airflow_db', - sql=sql, dag=self.dag) + sql=sql, + dag=self.dag, + ) t.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE, ignore_ti_state=True) def test_mysql_hook_test_bulk_load(self): @@ -85,7 +88,7 @@ def test_mysql_hook_test_bulk_load(self): t.flush() from airflow.hooks.mysql_hook import MySqlHook - h = MySqlHook('airflow_ci') + h = MySqlHook('airflow_db') with h.get_conn() as c: c.execute(""" CREATE TABLE IF NOT EXISTS test_airflow ( @@ -100,7 +103,7 @@ def test_mysql_hook_test_bulk_load(self): def test_mysql_hook_test_bulk_dump(self): from airflow.hooks.mysql_hook import MySqlHook - hook = MySqlHook('airflow_ci') + hook = MySqlHook('airflow_db') priv = hook.get_first("SELECT @@global.secure_file_priv") if priv and priv[0]: # Confirm that no error occurs @@ -115,7 +118,7 @@ def test_mysql_hook_test_bulk_dump_mock(self, mock_get_conn): mock_get_conn.return_value.cursor.return_value.execute = mock_execute from airflow.hooks.mysql_hook import MySqlHook - hook = MySqlHook('airflow_ci') + hook = MySqlHook('airflow_db') table = "INFORMATION_SCHEMA.TABLES" tmp_file = "/path/to/output/file" hook.bulk_dump(table, tmp_file) @@ -167,7 +170,6 @@ def test_overwrite_schema(self): assert "Unknown database 'foobar'" in str(e) -@skipUnlessImported('airflow.operators.postgres_operator', 'PostgresOperator') class PostgresTest(unittest.TestCase): def setUp(self): configuration.load_test_config() @@ -259,7 +261,6 @@ def test_overwrite_schema(self): assert 'database "foobar" does not exist' in str(e) -@skipUnlessImported('airflow.operators.mysql_to_hive', 'MySqlToHiveTransfer') class TransferTests(unittest.TestCase): def setUp(self): configuration.load_test_config() @@ -267,6 +268,81 @@ def setUp(self): dag = DAG(TEST_DAG_ID, default_args=args) self.dag = dag + rows = [ + (1880, "John", 0.081541, "boy"), + (1880, "William", 0.080511, "boy"), + (1880, "James", 0.050057, "boy"), + (1880, "Charles", 0.045167, "boy"), + (1880, "George", 0.043292, "boy"), + (1880, "Frank", 0.02738, "boy"), + (1880, "Joseph", 0.022229, "boy"), + (1880, "Thomas", 0.021401, "boy"), + (1880, "Henry", 0.020641, "boy"), + (1880, "Robert", 0.020404, "boy"), + (1880, "Edward", 0.019965, "boy"), + (1880, "Harry", 0.018175, "boy"), + (1880, "Walter", 0.014822, "boy"), + (1880, "Arthur", 0.013504, "boy"), + (1880, "Fred", 0.013251, "boy"), + (1880, "Albert", 0.012609, "boy"), + (1880, "Samuel", 0.008648, "boy"), + (1880, "David", 0.007339, "boy"), + (1880, "Louis", 0.006993, "boy"), + (1880, "Joe", 0.006174, "boy"), + (1880, "Charlie", 0.006165, "boy"), + (1880, "Clarence", 0.006165, "boy"), + (1880, "Richard", 0.006148, "boy"), + (1880, "Andrew", 0.005439, "boy"), + (1880, "Daniel", 0.00543, "boy"), + (1880, "Ernest", 0.005194, "boy"), + (1880, "Will", 0.004966, "boy"), + (1880, "Jesse", 0.004805, "boy"), + (1880, "Oscar", 0.004594, "boy"), + (1880, "Lewis", 0.004366, "boy"), + (1880, "Peter", 0.004189, "boy"), + (1880, "Benjamin", 0.004138, "boy"), + (1880, "Frederick", 0.004079, "boy"), + (1880, "Willie", 0.00402, "boy"), + (1880, "Alfred", 0.003961, "boy"), + (1880, "Sam", 0.00386, "boy"), + (1880, "Roy", 0.003716, "boy"), + (1880, "Herbert", 0.003581, "boy"), + (1880, "Jacob", 0.003412, "boy"), + (1880, "Tom", 0.00337, "boy"), + (1880, "Elmer", 0.00315, "boy"), + (1880, "Carl", 0.003142, "boy"), + (1880, "Lee", 0.003049, "boy"), + (1880, "Howard", 0.003015, "boy"), + (1880, "Martin", 0.003015, "boy"), + (1880, "Michael", 0.00299, "boy"), + (1880, "Bert", 0.002939, "boy"), + (1880, "Herman", 0.002931, "boy"), + (1880, "Jim", 0.002914, "boy"), + (1880, "Francis", 0.002905, "boy"), + (1880, "Harvey", 0.002905, "boy"), + (1880, "Earl", 0.002829, "boy"), + (1880, "Eugene", 0.00277, "boy"), + ] + + from airflow.hooks.mysql_hook import MySqlHook + with MySqlHook().get_conn() as cur: + cur.execute(''' + CREATE TABLE IF NOT EXISTS baby_names ( + org_year integer(4), + baby_name VARCHAR(25), + rate FLOAT(7,6), + sex VARCHAR(4) + ) + ''') + + for row in rows: + cur.execute("INSERT INTO baby_names VALUES(%s, %s, %s, %s);", row) + + def tearDown(self): + from airflow.hooks.mysql_hook import MySqlHook + with MySqlHook().get_conn() as cur: + cur.execute("DROP TABLE IF EXISTS baby_names CASCADE;") + def test_clear(self): self.dag.clear( start_date=DEFAULT_DATE, @@ -277,7 +353,6 @@ def test_mysql_to_hive(self): sql = "SELECT * FROM baby_names LIMIT 1000;" t = MySqlToHiveTransfer( task_id='test_m2h', - mysql_conn_id='airflow_ci', hive_cli_conn_id='beeline_default', sql=sql, hive_table='test_mysql_to_hive', @@ -291,7 +366,6 @@ def test_mysql_to_hive_partition(self): sql = "SELECT * FROM baby_names LIMIT 1000;" t = MySqlToHiveTransfer( task_id='test_m2h', - mysql_conn_id='airflow_ci', hive_cli_conn_id='beeline_default', sql=sql, hive_table='test_mysql_to_hive_part', @@ -307,23 +381,21 @@ def test_mysql_to_hive_tblproperties(self): sql = "SELECT * FROM baby_names LIMIT 1000;" t = MySqlToHiveTransfer( task_id='test_m2h', - mysql_conn_id='airflow_ci', hive_cli_conn_id='beeline_default', sql=sql, hive_table='test_mysql_to_hive', recreate=True, delimiter=",", - tblproperties={'test_property':'test_value'}, + tblproperties={'test_property': 'test_value'}, dag=self.dag) t.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE, ignore_ti_state=True) @mock.patch('airflow.hooks.hive_hooks.HiveCliHook.load_file') def test_mysql_to_hive_type_conversion(self, mock_load_file): - mysql_conn_id = 'airflow_ci' mysql_table = 'test_mysql_to_hive' from airflow.hooks.mysql_hook import MySqlHook - m = MySqlHook(mysql_conn_id) + m = MySqlHook() try: with m.get_conn() as c: @@ -342,7 +414,6 @@ def test_mysql_to_hive_type_conversion(self, mock_load_file): from airflow.operators.mysql_to_hive import MySqlToHiveTransfer t = MySqlToHiveTransfer( task_id='test_m2h', - mysql_conn_id=mysql_conn_id, hive_cli_conn_id='beeline_default', sql="SELECT * FROM {}".format(mysql_table), hive_table='test_mysql_to_hive', @@ -363,12 +434,11 @@ def test_mysql_to_hive_type_conversion(self, mock_load_file): c.execute("DROP TABLE IF EXISTS {}".format(mysql_table)) def test_mysql_to_hive_verify_loaded_values(self): - mysql_conn_id = 'airflow_ci' mysql_table = 'test_mysql_to_hive' hive_table = 'test_mysql_to_hive' from airflow.hooks.mysql_hook import MySqlHook - m = MySqlHook(mysql_conn_id) + m = MySqlHook() try: minmax = ( @@ -409,7 +479,6 @@ def test_mysql_to_hive_verify_loaded_values(self): from airflow.operators.mysql_to_hive import MySqlToHiveTransfer t = MySqlToHiveTransfer( task_id='test_m2h', - mysql_conn_id=mysql_conn_id, hive_cli_conn_id='beeline_default', sql="SELECT * FROM {}".format(mysql_table), hive_table=hive_table, diff --git a/tests/operators/s3_to_hive_operator.py b/tests/operators/s3_to_hive_operator.py index 3e41454395fa3..21ef29e25bfe1 100644 --- a/tests/operators/s3_to_hive_operator.py +++ b/tests/operators/s3_to_hive_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/operators/slack_operator.py b/tests/operators/slack_operator.py index ad916429772a0..d29f7c8236ff3 100644 --- a/tests/operators/slack_operator.py +++ b/tests/operators/slack_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/operators/test_check_operator.py b/tests/operators/test_check_operator.py index 46a48e42d233b..d3b546058431c 100644 --- a/tests/operators/test_check_operator.py +++ b/tests/operators/test_check_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/operators/test_redshift_to_s3_operator.py b/tests/operators/test_redshift_to_s3_operator.py index 379e78744e6cf..314b74a8042d2 100644 --- a/tests/operators/test_redshift_to_s3_operator.py +++ b/tests/operators/test_redshift_to_s3_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/operators/test_s3_file_transform_operator.py b/tests/operators/test_s3_file_transform_operator.py index 6b72c58f7857f..ee788f9d26486 100644 --- a/tests/operators/test_s3_file_transform_operator.py +++ b/tests/operators/test_s3_file_transform_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/operators/test_s3_to_redshift_operator.py b/tests/operators/test_s3_to_redshift_operator.py index 2afde6c95d7f3..95e0f1d823935 100644 --- a/tests/operators/test_s3_to_redshift_operator.py +++ b/tests/operators/test_s3_to_redshift_operator.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/operators/test_sagemaker_create_transform_job_operator.py b/tests/operators/test_sagemaker_create_transform_job_operator.py new file mode 100644 index 0000000000000..a8701530d9daa --- /dev/null +++ b/tests/operators/test_sagemaker_create_transform_job_operator.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +# +# 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. + +import unittest +try: + from unittest import mock +except ImportError: + try: + import mock + except ImportError: + mock = None + +from airflow import configuration +from airflow.contrib.hooks.sagemaker_hook import SageMakerHook +from airflow.contrib.operators.sagemaker_create_transform_job_operator \ + import SageMakerCreateTransformJobOperator +from airflow.exceptions import AirflowException + +role = 'test-role' + +bucket = 'test-bucket' + +key = 'test/data' +data_url = 's3://{}/{}'.format(bucket, key) + +job_name = 'test-job-name' + +model_name = 'test-model-name' + +image = 'test-image' + +output_url = 's3://{}/test/output'.format(bucket) + +create_transform_params = \ + { + 'TransformJobName': job_name, + 'ModelName': model_name, + 'BatchStrategy': 'MultiRecord', + 'TransformInput': { + 'DataSource': { + 'S3DataSource': { + 'S3DataType': 'S3Prefix', + 'S3Uri': data_url + } + } + }, + 'TransformOutput': { + 'S3OutputPath': output_url, + }, + 'TransformResources': { + 'InstanceType': 'ml.m4.xlarge', + 'InstanceCount': 123 + } + } + +create_model_params = \ + { + 'ModelName': model_name, + 'PrimaryContainer': { + 'Image': image, + 'ModelDataUrl': output_url, + }, + 'ExecutionRoleArn': role + } + + +class TestSageMakertransformOperator(unittest.TestCase): + + def setUp(self): + configuration.load_test_config() + self.sagemaker = SageMakerCreateTransformJobOperator( + task_id='test_sagemaker_operator', + sagemaker_conn_id='sagemaker_test_id', + transform_job_config=create_transform_params, + model_config=create_model_params, + region_name='us-west-2', + use_db_config=True, + wait_for_completion=False, + check_interval=5 + ) + + @mock.patch.object(SageMakerHook, 'get_conn') + @mock.patch.object(SageMakerHook, 'create_model') + @mock.patch.object(SageMakerHook, 'create_transform_job') + @mock.patch.object(SageMakerHook, '__init__') + def test_hook_init(self, hook_init, mock_transform, mock_model, mock_client): + mock_transform.return_value = {"TransformJobArn": "testarn", + "ResponseMetadata": + {"HTTPStatusCode": 200}} + hook_init.return_value = None + self.sagemaker.execute(None) + hook_init.assert_called_once_with( + sagemaker_conn_id='sagemaker_test_id', + region_name='us-west-2', + use_db_config=True, + check_interval=5, + max_ingestion_time=None + ) + + @mock.patch.object(SageMakerHook, 'get_conn') + @mock.patch.object(SageMakerHook, 'create_model') + @mock.patch.object(SageMakerHook, 'create_transform_job') + def test_execute_without_failure(self, mock_transform, mock_model, mock_client): + mock_transform.return_value = {"TransformJobArn": "testarn", + "ResponseMetadata": + {"HTTPStatusCode": 200}} + self.sagemaker.execute(None) + mock_model.assert_called_once_with(create_model_params) + mock_transform.assert_called_once_with(create_transform_params, + wait_for_completion=False + ) + + @mock.patch.object(SageMakerHook, 'get_conn') + @mock.patch.object(SageMakerHook, 'create_model') + @mock.patch.object(SageMakerHook, 'create_transform_job') + def test_execute_with_failure(self, mock_transform, mock_model, mock_client): + mock_transform.return_value = {"TransformJobArn": "testarn", + "ResponseMetadata": + {"HTTPStatusCode": 404}} + self.assertRaises(AirflowException, self.sagemaker.execute, None) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/operators/test_virtualenv_operator.py b/tests/operators/test_virtualenv_operator.py index 8196d636f4c1f..460ea2f4a25b6 100644 --- a/tests/operators/test_virtualenv_operator.py +++ b/tests/operators/test_virtualenv_operator.py @@ -7,9 +7,9 @@ # 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 @@ -28,13 +28,10 @@ from subprocess import CalledProcessError from airflow import configuration, DAG -from airflow.models import TaskInstance from airflow.operators.python_operator import PythonVirtualenvOperator -from airflow.settings import Session from airflow.utils import timezone from airflow.exceptions import AirflowException -import logging DEFAULT_DATE = timezone.datetime(2016, 1, 1) END_DATE = timezone.datetime(2016, 1, 2) @@ -55,9 +52,10 @@ def setUp(self): schedule_interval=INTERVAL) self.addCleanup(self.dag.clear) - def _run_as_operator(self, fn, **kwargs): + def _run_as_operator(self, fn, python_version=sys.version_info[0], **kwargs): task = PythonVirtualenvOperator( python_callable=fn, + python_version=python_version, task_id='task', dag=self.dag, **kwargs) @@ -83,7 +81,7 @@ def f(): def test_no_system_site_packages(self): def f(): try: - import funcsigs + import funcsigs # noqa: F401 except ImportError: return True raise Exception @@ -91,26 +89,31 @@ def f(): def test_system_site_packages(self): def f(): - import funcsigs + import funcsigs # noqa: F401 self._run_as_operator(f, requirements=['funcsigs'], system_site_packages=True) def test_with_requirements_pinned(self): - self.assertNotEqual('0.4', funcsigs.__version__, 'Please update this string if this fails') + self.assertNotEqual( + '0.4', funcsigs.__version__, 'Please update this string if this fails') + def f(): - import funcsigs + import funcsigs # noqa: F401 if funcsigs.__version__ != '0.4': raise Exception + self._run_as_operator(f, requirements=['funcsigs==0.4']) def test_unpinned_requirements(self): def f(): - import funcsigs - self._run_as_operator(f, requirements=['funcsigs', 'dill'], system_site_packages=False) + import funcsigs # noqa: F401 + self._run_as_operator( + f, requirements=['funcsigs', 'dill'], system_site_packages=False) def test_range_requirements(self): def f(): - import funcsigs - self._run_as_operator(f, requirements=['funcsigs>1.0', 'dill'], system_site_packages=False) + import funcsigs # noqa: F401 + self._run_as_operator( + f, requirements=['funcsigs>1.0', 'dill'], system_site_packages=False) def test_fail(self): def f(): @@ -152,8 +155,10 @@ def test_wrong_python_op_args(self): version = 3 else: version = 2 + def f(): pass + with self.assertRaises(AirflowException): self._run_as_operator(f, python_version=version, op_args=[1]) @@ -168,11 +173,12 @@ def f(): print(virtualenv_string_args) if virtualenv_string_args[0] != virtualenv_string_args[2]: raise Exception - self._run_as_operator(f, python_version=self._invert_python_major_version(), string_args=[1,2,1]) + self._run_as_operator( + f, python_version=self._invert_python_major_version(), string_args=[1, 2, 1]) def test_with_args(self): def f(a, b, c=False, d=False): - if a==0 and b==1 and c and not d: + if a == 0 and b == 1 and c and not d: return True else: raise Exception diff --git a/tests/plugins/test_plugin.py b/tests/plugins/test_plugin.py index d4c7f27b1c573..f507bdd585c59 100644 --- a/tests/plugins/test_plugin.py +++ b/tests/plugins/test_plugin.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/plugins_manager.py b/tests/plugins_manager.py index f9d093f16284e..39da5ce448d38 100644 --- a/tests/plugins_manager.py +++ b/tests/plugins_manager.py @@ -7,9 +7,9 @@ # 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 @@ -22,12 +22,9 @@ from __future__ import print_function from __future__ import unicode_literals -import inspect -import logging import unittest from flask.blueprints import Blueprint -from flask_admin import BaseView from flask_admin.menu import MenuLink, MenuView from airflow.hooks.base_hook import BaseHook diff --git a/tests/security/__init__.py b/tests/security/__init__.py index 7aa5f6adfa814..114d189da14ab 100644 --- a/tests/security/__init__.py +++ b/tests/security/__init__.py @@ -7,14 +7,12 @@ # 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. - -from .kerberos import * diff --git a/tests/security/kerberos.py b/tests/security/kerberos.py index 98c06951cfdbb..c495dd08c4d3d 100644 --- a/tests/security/kerberos.py +++ b/tests/security/kerberos.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/sensors/__init__.py b/tests/sensors/__init__.py index 4067cc78ee9a2..114d189da14ab 100644 --- a/tests/sensors/__init__.py +++ b/tests/sensors/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/sensors/test_base_sensor.py b/tests/sensors/test_base_sensor.py index adb7a5d1e31f7..353f4447b1008 100644 --- a/tests/sensors/test_base_sensor.py +++ b/tests/sensors/test_base_sensor.py @@ -18,17 +18,21 @@ # under the License. import unittest +from mock import Mock from airflow import DAG, configuration, settings -from airflow.exceptions import AirflowSensorTimeout -from airflow.models import DagRun, TaskInstance +from airflow.exceptions import (AirflowSensorTimeout, AirflowException, + AirflowRescheduleException) +from airflow.models import DagRun, TaskInstance, TaskReschedule from airflow.operators.dummy_operator import DummyOperator from airflow.sensors.base_sensor_operator import BaseSensorOperator +from airflow.ti_deps.deps.ready_to_reschedule import ReadyToRescheduleDep from airflow.utils import timezone from airflow.utils.state import State from airflow.utils.timezone import datetime from datetime import timedelta from time import sleep +from freezegun import freeze_time configuration.load_test_config() @@ -57,6 +61,7 @@ def setUp(self): self.dag = DAG(TEST_DAG_ID, default_args=args) session = settings.Session() + session.query(TaskReschedule).delete() session.query(DagRun).delete() session.query(TaskInstance).delete() session.commit() @@ -158,3 +163,297 @@ def test_soft_fail_with_retries(self): self.assertEquals(len(tis), 2) for ti in tis: self.assertEquals(ti.state, State.SKIPPED) + + def test_ok_with_reschedule(self): + sensor = self._make_sensor( + return_value=None, + poke_interval=10, + timeout=25, + mode='reschedule') + sensor.poke = Mock(side_effect=[False, False, True]) + dr = self._make_dag_run() + + # first poke returns False and task is re-scheduled + date1 = timezone.utcnow() + with freeze_time(date1): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + # verify task is re-scheduled, i.e. state set to NONE + self.assertEquals(ti.state, State.NONE) + # verify one row in task_reschedule table + task_reschedules = TaskReschedule.find_for_task_instance(ti) + self.assertEquals(len(task_reschedules), 1) + self.assertEquals(task_reschedules[0].start_date, date1) + self.assertEquals(task_reschedules[0].reschedule_date, + date1 + timedelta(seconds=sensor.poke_interval)) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) + + # second poke returns False and task is re-scheduled + date2 = date1 + timedelta(seconds=sensor.poke_interval) + with freeze_time(date2): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + # verify task is re-scheduled, i.e. state set to NONE + self.assertEquals(ti.state, State.NONE) + # verify two rows in task_reschedule table + task_reschedules = TaskReschedule.find_for_task_instance(ti) + self.assertEquals(len(task_reschedules), 2) + self.assertEquals(task_reschedules[1].start_date, date2) + self.assertEquals(task_reschedules[1].reschedule_date, + date2 + timedelta(seconds=sensor.poke_interval)) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) + + # third poke returns True and task succeeds + date3 = date2 + timedelta(seconds=sensor.poke_interval) + with freeze_time(date3): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + self.assertEquals(ti.state, State.SUCCESS) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) + + def test_fail_with_reschedule(self): + sensor = self._make_sensor( + return_value=False, + poke_interval=10, + timeout=5, + mode='reschedule') + dr = self._make_dag_run() + + # first poke returns False and task is re-scheduled + date1 = timezone.utcnow() + with freeze_time(date1): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + self.assertEquals(ti.state, State.NONE) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) + + # second poke returns False, timeout occurs + date2 = date1 + timedelta(seconds=sensor.poke_interval) + with freeze_time(date2): + with self.assertRaises(AirflowSensorTimeout): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + self.assertEquals(ti.state, State.FAILED) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) + + def test_soft_fail_with_reschedule(self): + sensor = self._make_sensor( + return_value=False, + poke_interval=10, + timeout=5, + soft_fail=True, + mode='reschedule') + dr = self._make_dag_run() + + # first poke returns False and task is re-scheduled + date1 = timezone.utcnow() + with freeze_time(date1): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + self.assertEquals(ti.state, State.NONE) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) + + # second poke returns False, timeout occurs + date2 = date1 + timedelta(seconds=sensor.poke_interval) + with freeze_time(date2): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + self.assertEquals(ti.state, State.SKIPPED) + + def test_ok_with_reschedule_and_retry(self): + sensor = self._make_sensor( + return_value=None, + poke_interval=10, + timeout=5, + retries=1, + retry_delay=timedelta(seconds=10), + mode='reschedule') + sensor.poke = Mock(side_effect=[False, False, False, True]) + dr = self._make_dag_run() + + # first poke returns False and task is re-scheduled + date1 = timezone.utcnow() + with freeze_time(date1): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + self.assertEquals(ti.state, State.NONE) + # verify one row in task_reschedule table + task_reschedules = TaskReschedule.find_for_task_instance(ti) + self.assertEquals(len(task_reschedules), 1) + self.assertEquals(task_reschedules[0].start_date, date1) + self.assertEquals(task_reschedules[0].reschedule_date, + date1 + timedelta(seconds=sensor.poke_interval)) + self.assertEqual(task_reschedules[0].try_number, 1) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) + + # second poke fails and task instance is marked up to retry + date2 = date1 + timedelta(seconds=sensor.poke_interval) + with freeze_time(date2): + with self.assertRaises(AirflowSensorTimeout): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + self.assertEquals(ti.state, State.UP_FOR_RETRY) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) + + # third poke returns False and task is rescheduled again + date3 = date2 + timedelta(seconds=sensor.poke_interval) + sensor.retry_delay + with freeze_time(date3): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + self.assertEquals(ti.state, State.NONE) + # verify one row in task_reschedule table + task_reschedules = TaskReschedule.find_for_task_instance(ti) + self.assertEquals(len(task_reschedules), 1) + self.assertEquals(task_reschedules[0].start_date, date3) + self.assertEquals(task_reschedules[0].reschedule_date, + date3 + timedelta(seconds=sensor.poke_interval)) + self.assertEqual(task_reschedules[0].try_number, 2) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) + + # fourth poke return True and task succeeds + date4 = date3 + timedelta(seconds=sensor.poke_interval) + with freeze_time(date4): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + self.assertEquals(ti.state, State.SUCCESS) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) + + def test_should_include_ready_to_reschedule_dep(self): + sensor = self._make_sensor(True) + deps = sensor.deps + self.assertTrue(ReadyToRescheduleDep() in deps) + + def test_invalid_mode(self): + with self.assertRaises(AirflowException): + self._make_sensor( + return_value=True, + mode='foo') + + def test_ok_with_custom_reschedule_exception(self): + sensor = self._make_sensor( + return_value=None, + mode='reschedule') + date1 = timezone.utcnow() + date2 = date1 + timedelta(seconds=60) + date3 = date1 + timedelta(seconds=120) + sensor.poke = Mock(side_effect=[ + AirflowRescheduleException(date2), + AirflowRescheduleException(date3), + True, + ]) + dr = self._make_dag_run() + + # first poke returns False and task is re-scheduled + with freeze_time(date1): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + # verify task is re-scheduled, i.e. state set to NONE + self.assertEquals(ti.state, State.NONE) + # verify one row in task_reschedule table + task_reschedules = TaskReschedule.find_for_task_instance(ti) + self.assertEquals(len(task_reschedules), 1) + self.assertEquals(task_reschedules[0].start_date, date1) + self.assertEquals(task_reschedules[0].reschedule_date, date2) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) + + # second poke returns False and task is re-scheduled + with freeze_time(date2): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + # verify task is re-scheduled, i.e. state set to NONE + self.assertEquals(ti.state, State.NONE) + # verify two rows in task_reschedule table + task_reschedules = TaskReschedule.find_for_task_instance(ti) + self.assertEquals(len(task_reschedules), 2) + self.assertEquals(task_reschedules[1].start_date, date2) + self.assertEquals(task_reschedules[1].reschedule_date, date3) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) + + # third poke returns True and task succeeds + with freeze_time(date3): + self._run(sensor) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + self.assertEquals(ti.state, State.SUCCESS) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) + + def test_reschedule_with_test_mode(self): + sensor = self._make_sensor( + return_value=None, + poke_interval=10, + timeout=25, + mode='reschedule') + sensor.poke = Mock(side_effect=[False]) + dr = self._make_dag_run() + + # poke returns False and AirflowRescheduleException is raised + date1 = timezone.utcnow() + with freeze_time(date1): + for dt in self.dag.date_range(DEFAULT_DATE, end_date=DEFAULT_DATE): + TaskInstance(sensor, dt).run( + ignore_ti_state=True, + test_mode=True) + tis = dr.get_task_instances() + self.assertEquals(len(tis), 2) + for ti in tis: + if ti.task_id == SENSOR_OP: + # in test mode state is not modified + self.assertEquals(ti.state, State.NONE) + # in test mode no reschedule request is recorded + task_reschedules = TaskReschedule.find_for_task_instance(ti) + self.assertEquals(len(task_reschedules), 0) + if ti.task_id == DUMMY_OP: + self.assertEquals(ti.state, State.NONE) diff --git a/tests/sensors/test_external_task_sensor.py b/tests/sensors/test_external_task_sensor.py index 403c892c239b2..feb0cdcd40a3b 100644 --- a/tests/sensors/test_external_task_sensor.py +++ b/tests/sensors/test_external_task_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/sensors/test_hdfs_sensor.py b/tests/sensors/test_hdfs_sensor.py index b94065d8423ef..26adeaa3ab60b 100644 --- a/tests/sensors/test_hdfs_sensor.py +++ b/tests/sensors/test_hdfs_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/sensors/test_http_sensor.py b/tests/sensors/test_http_sensor.py index de9513724415a..6b6b4603d6845 100644 --- a/tests/sensors/test_http_sensor.py +++ b/tests/sensors/test_http_sensor.py @@ -7,9 +7,9 @@ # 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 @@ -140,7 +140,7 @@ class FakeSession(object): def __init__(self): self.response = requests.Response() self.response.status_code = 200 - self.response._content = 'airbnb/airflow'.encode('ascii', 'ignore') + self.response._content = 'apache/incubator-airflow'.encode('ascii', 'ignore') def send(self, request, **kwargs): return self.response @@ -178,7 +178,7 @@ def test_get_response_check(self): method='GET', endpoint='/search', data={"client": "ubuntu", "q": "airflow"}, - response_check=lambda response: ("airbnb/airflow" in response.text), + response_check=lambda response: ("apache/incubator-airflow" in response.text), headers={}, dag=self.dag) t.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE, ignore_ti_state=True) @@ -192,7 +192,7 @@ def test_sensor(self): request_params={"client": "ubuntu", "q": "airflow", 'date': '{{ds}}'}, headers={}, response_check=lambda response: ( - "airbnb/airflow/" + DEFAULT_DATE.strftime('%Y-%m-%d') + "apache/incubator-airflow/" + DEFAULT_DATE.strftime('%Y-%m-%d') in response.text), poke_interval=5, timeout=15, diff --git a/tests/sensors/test_sql_sensor.py b/tests/sensors/test_sql_sensor.py index 960bdd21ed1aa..433eaa61e9146 100644 --- a/tests/sensors/test_sql_sensor.py +++ b/tests/sensors/test_sql_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/sensors/test_timedelta_sensor.py b/tests/sensors/test_timedelta_sensor.py index 18ee07bfa8823..6951746532f6f 100644 --- a/tests/sensors/test_timedelta_sensor.py +++ b/tests/sensors/test_timedelta_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/sensors/test_timeout_sensor.py b/tests/sensors/test_timeout_sensor.py index 7a4e70b71cfdb..91fc2d57a619e 100644 --- a/tests/sensors/test_timeout_sensor.py +++ b/tests/sensors/test_timeout_sensor.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/test_logging_config.py b/tests/test_logging_config.py index d6f1194f75d67..b568a88cb2422 100644 --- a/tests/test_logging_config.py +++ b/tests/test_logging_config.py @@ -17,16 +17,22 @@ # specific language governing permissions and limitations # under the License. import os -import shutil +import six import sys import tempfile -import unittest from mock import patch, mock from airflow import configuration as conf from airflow.configuration import mkdir_p from airflow.exceptions import AirflowConfigException + +if six.PY2: + # Need `assertWarns` back-ported from unittest2 + import unittest2 as unittest +else: + import unittest + SETTINGS_FILE_VALID = """ LOGGING_CONFIG = { 'version': 1, @@ -41,14 +47,24 @@ 'class': 'logging.StreamHandler', 'formatter': 'airflow.task', 'stream': 'ext://sys.stdout' - } + }, + 'task': { + 'class': 'logging.StreamHandler', + 'formatter': 'airflow.task', + 'stream': 'ext://sys.stdout' + }, }, 'loggers': { 'airflow': { 'handlers': ['console'], 'level': 'INFO', 'propagate': False - } + }, + 'airflow.task': { + 'handlers': ['task'], + 'level': 'INFO', + 'propagate': False, + }, } } """ @@ -200,18 +216,21 @@ def test_loading_no_local_settings(self): # When the key is not available in the configuration def test_when_the_config_key_does_not_exists(self): from airflow import logging_config + conf_get = conf.get def side_effect(*args): if args[1] == 'logging_config_class': raise AirflowConfigException else: - return "bla_bla_from_test" + return conf_get(*args) logging_config.conf.get = mock.Mock(side_effect=side_effect) with patch.object(logging_config.log, 'debug') as mock_debug: logging_config.configure_logging() - mock_debug.assert_any_call('Could not find key logging_config_class in config') + mock_debug.assert_any_call( + 'Could not find key logging_config_class in config' + ) # Just default def test_loading_local_settings_without_logging_config(self): @@ -222,6 +241,16 @@ def test_loading_local_settings_without_logging_config(self): 'Unable to load custom logging, using default config instead' ) + def test_1_9_config(self): + from airflow.logging_config import configure_logging + conf.set('core', 'task_log_reader', 'file.task') + try: + with self.assertWarnsRegex(DeprecationWarning, r'file.task'): + configure_logging() + self.assertEqual(conf.get('core', 'task_log_reader'), 'task') + finally: + conf.remove_option('core', 'task_log_reader', remove_default=False) + if __name__ == '__main__': unittest.main() diff --git a/tests/test_utils/__init__.py b/tests/test_utils/__init__.py index 4067cc78ee9a2..114d189da14ab 100644 --- a/tests/test_utils/__init__.py +++ b/tests/test_utils/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/test_utils/reset_warning_registry.py b/tests/test_utils/reset_warning_registry.py index 3ca78eda67cb4..65f08a2300468 100644 --- a/tests/test_utils/reset_warning_registry.py +++ b/tests/test_utils/reset_warning_registry.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/__init__.py b/tests/ti_deps/__init__.py index 4067cc78ee9a2..114d189da14ab 100644 --- a/tests/ti_deps/__init__.py +++ b/tests/ti_deps/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/contexts/__init__.py b/tests/ti_deps/contexts/__init__.py index 4067cc78ee9a2..114d189da14ab 100644 --- a/tests/ti_deps/contexts/__init__.py +++ b/tests/ti_deps/contexts/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/deps/__init__.py b/tests/ti_deps/deps/__init__.py index 4067cc78ee9a2..114d189da14ab 100644 --- a/tests/ti_deps/deps/__init__.py +++ b/tests/ti_deps/deps/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/deps/fake_models.py b/tests/ti_deps/deps/fake_models.py index da4731710b0b0..7896f205ff74d 100644 --- a/tests/ti_deps/deps/fake_models.py +++ b/tests/ti_deps/deps/fake_models.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/deps/test_dag_ti_slots_available_dep.py b/tests/ti_deps/deps/test_dag_ti_slots_available_dep.py index 0ea1503a21afa..cfac5d3051835 100644 --- a/tests/ti_deps/deps/test_dag_ti_slots_available_dep.py +++ b/tests/ti_deps/deps/test_dag_ti_slots_available_dep.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/deps/test_dag_unpaused_dep.py b/tests/ti_deps/deps/test_dag_unpaused_dep.py index c1f4148d29cd2..8a6df5c1bf319 100644 --- a/tests/ti_deps/deps/test_dag_unpaused_dep.py +++ b/tests/ti_deps/deps/test_dag_unpaused_dep.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/deps/test_dagrun_exists_dep.py b/tests/ti_deps/deps/test_dagrun_exists_dep.py index 62aff97cdce89..85d649aaba15d 100644 --- a/tests/ti_deps/deps/test_dagrun_exists_dep.py +++ b/tests/ti_deps/deps/test_dagrun_exists_dep.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/deps/test_not_in_retry_period_dep.py b/tests/ti_deps/deps/test_not_in_retry_period_dep.py index afd9e01a8ff40..ca0726dc0c388 100644 --- a/tests/ti_deps/deps/test_not_in_retry_period_dep.py +++ b/tests/ti_deps/deps/test_not_in_retry_period_dep.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/deps/test_not_running_dep.py b/tests/ti_deps/deps/test_not_running_dep.py index 37696186b7288..1bc4261bb86bc 100644 --- a/tests/ti_deps/deps/test_not_running_dep.py +++ b/tests/ti_deps/deps/test_not_running_dep.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/deps/test_not_skipped_dep.py b/tests/ti_deps/deps/test_not_skipped_dep.py index 07d0bffdc2acb..6e1d832940a19 100644 --- a/tests/ti_deps/deps/test_not_skipped_dep.py +++ b/tests/ti_deps/deps/test_not_skipped_dep.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/deps/test_prev_dagrun_dep.py b/tests/ti_deps/deps/test_prev_dagrun_dep.py index a51dcd091b0e9..e5d8cdf2b15fb 100644 --- a/tests/ti_deps/deps/test_prev_dagrun_dep.py +++ b/tests/ti_deps/deps/test_prev_dagrun_dep.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/deps/test_ready_to_reschedule_dep.py b/tests/ti_deps/deps/test_ready_to_reschedule_dep.py new file mode 100644 index 0000000000000..898850f8b7bfb --- /dev/null +++ b/tests/ti_deps/deps/test_ready_to_reschedule_dep.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# +# 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. + +import unittest +from datetime import timedelta +from mock import Mock, patch + +from airflow.models import TaskInstance, DAG, TaskReschedule +from airflow.ti_deps.dep_context import DepContext +from airflow.ti_deps.deps.ready_to_reschedule import ReadyToRescheduleDep +from airflow.utils.state import State +from airflow.utils.timezone import utcnow + + +class NotInReschedulePeriodDepTest(unittest.TestCase): + + def _get_task_instance(self, state): + dag = DAG('test_dag') + task = Mock(dag=dag) + ti = TaskInstance(task=task, state=state, execution_date=None) + return ti + + def _get_task_reschedule(self, reschedule_date): + task = Mock(dag_id='test_dag', task_id='test_task') + tr = TaskReschedule(task=task, execution_date=None, try_number=None, + start_date=reschedule_date, end_date=reschedule_date, + reschedule_date=reschedule_date) + return tr + + def test_should_pass_if_ignore_in_reschedule_period_is_set(self): + ti = self._get_task_instance(State.NONE) + dep_context = DepContext(ignore_in_reschedule_period=True) + self.assertTrue(ReadyToRescheduleDep().is_met(ti=ti, dep_context=dep_context)) + + def test_should_pass_if_not_in_none_state(self): + ti = self._get_task_instance(State.UP_FOR_RETRY) + self.assertTrue(ReadyToRescheduleDep().is_met(ti=ti)) + + @patch('airflow.models.TaskReschedule.find_for_task_instance', return_value=[]) + def test_should_pass_if_no_reschedule_record_exists(self, find_for_task_instance): + ti = self._get_task_instance(State.NONE) + self.assertTrue(ReadyToRescheduleDep().is_met(ti=ti)) + + @patch('airflow.models.TaskReschedule.find_for_task_instance') + def test_should_pass_after_reschedule_date_one(self, find_for_task_instance): + find_for_task_instance.return_value = [ + self._get_task_reschedule(utcnow() - timedelta(minutes=1)), + ] + ti = self._get_task_instance(State.NONE) + self.assertTrue(ReadyToRescheduleDep().is_met(ti=ti)) + + @patch('airflow.models.TaskReschedule.find_for_task_instance') + def test_should_pass_after_reschedule_date_multiple(self, find_for_task_instance): + find_for_task_instance.return_value = [ + self._get_task_reschedule(utcnow() - timedelta(minutes=21)), + self._get_task_reschedule(utcnow() - timedelta(minutes=11)), + self._get_task_reschedule(utcnow() - timedelta(minutes=1)), + ] + ti = self._get_task_instance(State.NONE) + self.assertTrue(ReadyToRescheduleDep().is_met(ti=ti)) + + @patch('airflow.models.TaskReschedule.find_for_task_instance') + def test_should_fail_before_reschedule_date_one(self, find_for_task_instance): + find_for_task_instance.return_value = [ + self._get_task_reschedule(utcnow() + timedelta(minutes=1)), + ] + ti = self._get_task_instance(State.NONE) + self.assertFalse(ReadyToRescheduleDep().is_met(ti=ti)) + + @patch('airflow.models.TaskReschedule.find_for_task_instance') + def test_should_fail_before_reschedule_date_multiple(self, find_for_task_instance): + find_for_task_instance.return_value = [ + self._get_task_reschedule(utcnow() - timedelta(minutes=19)), + self._get_task_reschedule(utcnow() - timedelta(minutes=9)), + self._get_task_reschedule(utcnow() + timedelta(minutes=1)), + ] + ti = self._get_task_instance(State.NONE) + self.assertFalse(ReadyToRescheduleDep().is_met(ti=ti)) diff --git a/tests/ti_deps/deps/test_runnable_exec_date_dep.py b/tests/ti_deps/deps/test_runnable_exec_date_dep.py index 643985ce4c0cb..8f59b43ba4fa0 100644 --- a/tests/ti_deps/deps/test_runnable_exec_date_dep.py +++ b/tests/ti_deps/deps/test_runnable_exec_date_dep.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/deps/test_task_concurrency.py b/tests/ti_deps/deps/test_task_concurrency.py index fd1b28da33967..940bfca361ce6 100644 --- a/tests/ti_deps/deps/test_task_concurrency.py +++ b/tests/ti_deps/deps/test_task_concurrency.py @@ -7,9 +7,9 @@ # 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 @@ -24,7 +24,6 @@ from airflow.models import DAG, BaseOperator from airflow.ti_deps.dep_context import DepContext from airflow.ti_deps.deps.task_concurrency_dep import TaskConcurrencyDep -from airflow.utils.state import State class TaskConcurrencyDepTest(unittest.TestCase): diff --git a/tests/ti_deps/deps/test_trigger_rule_dep.py b/tests/ti_deps/deps/test_trigger_rule_dep.py index f4a96f5bd0658..14dc01756c0fa 100644 --- a/tests/ti_deps/deps/test_trigger_rule_dep.py +++ b/tests/ti_deps/deps/test_trigger_rule_dep.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/ti_deps/deps/test_valid_state_dep.py b/tests/ti_deps/deps/test_valid_state_dep.py index 19b18935dbd06..188b074db6526 100644 --- a/tests/ti_deps/deps/test_valid_state_dep.py +++ b/tests/ti_deps/deps/test_valid_state_dep.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils.py b/tests/utils.py index 12d3ff037b264..00f126c5da28e 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/__init__.py b/tests/utils/__init__.py index 4067cc78ee9a2..114d189da14ab 100644 --- a/tests/utils/__init__.py +++ b/tests/utils/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/log/__init__.py b/tests/utils/log/__init__.py index 4067cc78ee9a2..114d189da14ab 100644 --- a/tests/utils/log/__init__.py +++ b/tests/utils/log/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/log/test_es_task_handler.py b/tests/utils/log/test_es_task_handler.py index 787094ef53860..94184fc82685d 100644 --- a/tests/utils/log/test_es_task_handler.py +++ b/tests/utils/log/test_es_task_handler.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/log/test_file_processor_handler.py b/tests/utils/log/test_file_processor_handler.py index 23cf1d4daae0e..42b1a1e27040f 100644 --- a/tests/utils/log/test_file_processor_handler.py +++ b/tests/utils/log/test_file_processor_handler.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/test_cli_util.py b/tests/utils/test_cli_util.py index 00dc9f959f1bc..ec159abd68470 100644 --- a/tests/utils/test_cli_util.py +++ b/tests/utils/test_cli_util.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/test_compression.py b/tests/utils/test_compression.py index a0886880bf877..5a367094f4d27 100644 --- a/tests/utils/test_compression.py +++ b/tests/utils/test_compression.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/test_dag_processing.py b/tests/utils/test_dag_processing.py index f29e384b8c657..687d8b13c24e2 100644 --- a/tests/utils/test_dag_processing.py +++ b/tests/utils/test_dag_processing.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/test_dates.py b/tests/utils/test_dates.py index ba762c8d09cfe..84ffb4d7d8fd6 100644 --- a/tests/utils/test_dates.py +++ b/tests/utils/test_dates.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/test_db.py b/tests/utils/test_db.py index 5fdc40b5255be..718e2ae1066fe 100644 --- a/tests/utils/test_db.py +++ b/tests/utils/test_db.py @@ -45,20 +45,19 @@ def test_database_schema_and_sqlalchemy_model_are_in_sync(self): lambda t: (t[0] == 'remove_column' and t[2] == 'users' and t[3].name == 'password'), - # ignore tables created by other tests - lambda t: (t[0] == 'remove_table' and - t[1].name == 't'), - lambda t: (t[0] == 'remove_table' and - t[1].name == 'test_airflow'), - lambda t: (t[0] == 'remove_table' and - t[1].name == 'test_postgres_to_postgres'), - lambda t: (t[0] == 'remove_table' and - t[1].name == 'test_mysql_to_mysql'), + # ignore tables created by celery lambda t: (t[0] == 'remove_table' and t[1].name == 'celery_taskmeta'), lambda t: (t[0] == 'remove_table' and t[1].name == 'celery_tasksetmeta'), + + # ignore indices created by celery + lambda t: (t[0] == 'remove_index' and + t[1].name == 'task_id'), + lambda t: (t[0] == 'remove_index' and + t[1].name == 'taskset_id'), + # Ignore all the fab tables lambda t: (t[0] == 'remove_table' and t[1].name == 'ab_permission'), @@ -76,6 +75,23 @@ def test_database_schema_and_sqlalchemy_model_are_in_sync(self): t[1].name == 'ab_user'), lambda t: (t[0] == 'remove_table' and t[1].name == 'ab_view_menu'), + + # Ignore all the fab indices + lambda t: (t[0] == 'remove_index' and + t[1].name == 'permission_id'), + lambda t: (t[0] == 'remove_index' and + t[1].name == 'name'), + lambda t: (t[0] == 'remove_index' and + t[1].name == 'user_id'), + lambda t: (t[0] == 'remove_index' and + t[1].name == 'username'), + lambda t: (t[0] == 'remove_index' and + t[1].name == 'field_string'), + lambda t: (t[0] == 'remove_index' and + t[1].name == 'email'), + lambda t: (t[0] == 'remove_index' and + t[1].name == 'permission_view_id'), + # from test_security unit test lambda t: (t[0] == 'remove_table' and t[1].name == 'some_model'), @@ -83,4 +99,7 @@ def test_database_schema_and_sqlalchemy_model_are_in_sync(self): for ignore in ignores: diff = [d for d in diff if not ignore(d)] - self.assertFalse(diff, 'Database schema and SQLAlchemy model are not in sync') + self.assertFalse( + diff, + 'Database schema and SQLAlchemy model are not in sync: ' + str(diff) + ) diff --git a/tests/utils/test_decorators.py b/tests/utils/test_decorators.py index f9b48148bb354..3a196dd8a1eb0 100644 --- a/tests/utils/test_decorators.py +++ b/tests/utils/test_decorators.py @@ -7,9 +7,9 @@ # 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 diff --git a/scripts/ci/krb5/Dockerfile b/tests/utils/test_email.py similarity index 50% rename from scripts/ci/krb5/Dockerfile rename to tests/utils/test_email.py index cdb4cf979e05d..1666ef5c627cc 100644 --- a/scripts/ci/krb5/Dockerfile +++ b/tests/utils/test_email.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -16,37 +17,28 @@ # specific language governing permissions and limitations # under the License. -FROM ubuntu:xenial +import unittest +from airflow.utils.email import get_email_address_list -# environment variables -ENV DEBIAN_FRONTEND noninteractive +EMAILS = ['test1@example.com', 'test2@example.com'] -# Kerberos server -RUN apt-get update && apt-get install --no-install-recommends -y \ - ntp \ - python-dev \ - python-pip \ - python-wheel \ - python-setuptools \ - python-pkg-resources \ - krb5-admin-server \ - krb5-kdc -RUN mkdir /app/ +class EmailTest(unittest.TestCase): -# Supervisord -RUN pip install supervisor==3.3.4 -RUN mkdir -p /var/log/supervisord/ + def test_get_email_address_comma_sep_string(self): + emails_string = 'test1@example.com, test2@example.com' -COPY ./krb-conf/server/kdc.conf /etc/krb5kdc/kdc.conf -COPY ./krb-conf/server/kadm5.acl /etc/krb5kdc/kadm5.acl -COPY ./krb-conf/client/krb5.conf /etc/krb5.conf -COPY ./start_kdc.sh /app/start_kdc.sh + self.assertEquals( + get_email_address_list(emails_string), EMAILS) -# supervisord -COPY ./supervisord.conf /etc/supervisord.conf + def test_get_email_address_colon_sep_string(self): + emails_string = 'test1@example.com; test2@example.com' -WORKDIR /app + self.assertEquals( + get_email_address_list(emails_string), EMAILS) -# when container is starting -CMD ["/bin/bash", "/app/start_kdc.sh"] + def test_get_email_address_list(self): + emails_list = ['test1@example.com', 'test2@example.com'] + + self.assertEquals( + get_email_address_list(emails_list), EMAILS) diff --git a/tests/utils/test_helpers.py b/tests/utils/test_helpers.py index 26760744de417..4cb3e1a1fc8e1 100644 --- a/tests/utils/test_helpers.py +++ b/tests/utils/test_helpers.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/test_json.py b/tests/utils/test_json.py index 91f53099dff3e..8e95716ee867b 100644 --- a/tests/utils/test_json.py +++ b/tests/utils/test_json.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/test_log_handlers.py b/tests/utils/test_log_handlers.py index d9623ee113604..ffd6df4b04e41 100644 --- a/tests/utils/test_log_handlers.py +++ b/tests/utils/test_log_handlers.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/test_logging_mixin.py b/tests/utils/test_logging_mixin.py index 74da742891c3c..df7423092f6ac 100644 --- a/tests/utils/test_logging_mixin.py +++ b/tests/utils/test_logging_mixin.py @@ -7,9 +7,9 @@ # 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 @@ -86,8 +86,8 @@ def test_write(self): self.assertEqual(log._buffer, msg) - log.write("\n") - logger.log.assert_called_once_with(1, msg + "\n") + log.write(" \n") + logger.log.assert_called_once_with(1, msg) self.assertEqual(log._buffer, "") diff --git a/tests/utils/test_module_loading.py b/tests/utils/test_module_loading.py index 6c257df1bbcb4..ba1ebcade6a3b 100644 --- a/tests/utils/test_module_loading.py +++ b/tests/utils/test_module_loading.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/test_net.py b/tests/utils/test_net.py index f97f6c0821000..86540983be305 100644 --- a/tests/utils/test_net.py +++ b/tests/utils/test_net.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/test_timezone.py b/tests/utils/test_timezone.py index 0b44bddaaea28..92fd54ec7a53d 100644 --- a/tests/utils/test_timezone.py +++ b/tests/utils/test_timezone.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/test_trigger_rule.py b/tests/utils/test_trigger_rule.py index be2a9f432b825..f068542849d35 100644 --- a/tests/utils/test_trigger_rule.py +++ b/tests/utils/test_trigger_rule.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/utils/test_weight_rule.py b/tests/utils/test_weight_rule.py index 27576e2e077aa..c862263387cc3 100644 --- a/tests/utils/test_weight_rule.py +++ b/tests/utils/test_weight_rule.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/www/__init__.py b/tests/www/__init__.py index f0f8b68337da6..4924560599651 100644 --- a/tests/www/__init__.py +++ b/tests/www/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/www/api/__init__.py b/tests/www/api/__init__.py index f0f8b68337da6..4924560599651 100644 --- a/tests/www/api/__init__.py +++ b/tests/www/api/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/www/api/experimental/__init__.py b/tests/www/api/experimental/__init__.py index f0f8b68337da6..4924560599651 100644 --- a/tests/www/api/experimental/__init__.py +++ b/tests/www/api/experimental/__init__.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/www/api/experimental/test_endpoints.py b/tests/www/api/experimental/test_endpoints.py index a93a19bc8947d..187ca921d59d8 100644 --- a/tests/www/api/experimental/test_endpoints.py +++ b/tests/www/api/experimental/test_endpoints.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/www/api/experimental/test_kerberos_endpoints.py b/tests/www/api/experimental/test_kerberos_endpoints.py index 1cf30635fa407..63a15574321b9 100644 --- a/tests/www/api/experimental/test_kerberos_endpoints.py +++ b/tests/www/api/experimental/test_kerberos_endpoints.py @@ -7,9 +7,9 @@ # 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 @@ -20,7 +20,6 @@ import json import mock import os -import socket import unittest from datetime import datetime diff --git a/tests/www/api/experimental/test_password_endpoints.py b/tests/www/api/experimental/test_password_endpoints.py index 8131ff52f3dd5..20a0608a77880 100644 --- a/tests/www/api/experimental/test_password_endpoints.py +++ b/tests/www/api/experimental/test_password_endpoints.py @@ -17,11 +17,8 @@ # specific language governing permissions and limitations # under the License. -import json import unittest -from datetime import datetime - from backports.configparser import DuplicateSectionError from airflow import models diff --git a/tests/www/test_utils.py b/tests/www/test_utils.py index 9034b8b5fd28e..a824e58b09c31 100644 --- a/tests/www/test_utils.py +++ b/tests/www/test_utils.py @@ -117,8 +117,8 @@ def test_params_all(self): self.assertEqual('page=3&search=bash_&showPaused=False', utils.get_params(showPaused=False, page=3, search='bash_')) - # flask_login is loaded by calling flask_login._get_user. - @mock.patch("flask_login._get_user") + # flask_login is loaded by calling flask_login.utils._get_user. + @mock.patch("flask_login.utils._get_user") @mock.patch("airflow.settings.Session") def test_action_logging_with_login_user(self, mocked_session, mocked_get_user): fake_username = 'someone' @@ -143,7 +143,7 @@ def some_func(): self.assertEqual(fake_username, kwargs['owner']) mocked_session_instance.add.assert_called_once() - @mock.patch("flask_login._get_user") + @mock.patch("flask_login.utils._get_user") @mock.patch("airflow.settings.Session") def test_action_logging_with_invalid_user(self, mocked_session, mocked_get_user): anonymous_username = 'anonymous' @@ -195,6 +195,40 @@ def some_func(): self.assertEqual(anonymous_username, kwargs['owner']) mocked_session_instance.add.assert_called_once() + def test_open_maybe_zipped_normal_file(self): + with mock.patch( + 'io.open', mock.mock_open(read_data="data")) as mock_file: + utils.open_maybe_zipped('/path/to/some/file.txt') + mock_file.assert_called_with('/path/to/some/file.txt', mode='r') + + def test_open_maybe_zipped_normal_file_with_zip_in_name(self): + path = '/path/to/fakearchive.zip.other/file.txt' + with mock.patch( + 'io.open', mock.mock_open(read_data="data")) as mock_file: + utils.open_maybe_zipped(path) + mock_file.assert_called_with(path, mode='r') + + @mock.patch("zipfile.is_zipfile") + @mock.patch("zipfile.ZipFile") + def test_open_maybe_zipped_archive(self, mocked_ZipFile, mocked_is_zipfile): + mocked_is_zipfile.return_value = True + instance = mocked_ZipFile.return_value + instance.open.return_value = mock.mock_open(read_data="data") + + utils.open_maybe_zipped('/path/to/archive.zip/deep/path/to/file.txt') + + mocked_is_zipfile.assert_called_once() + (args, kwargs) = mocked_is_zipfile.call_args_list[0] + self.assertEqual('/path/to/archive.zip', args[0]) + + mocked_ZipFile.assert_called_once() + (args, kwargs) = mocked_ZipFile.call_args_list[0] + self.assertEqual('/path/to/archive.zip', args[0]) + + instance.open.assert_called_once() + (args, kwargs) = instance.open.call_args_list[0] + self.assertEqual('deep/path/to/file.txt', args[0]) + def test_get_python_source_from_method(self): class AMockClass(object): def a_method(self): diff --git a/tests/www/test_validators.py b/tests/www/test_validators.py index 0fef4e3db202d..0180b734cc0e4 100644 --- a/tests/www/test_validators.py +++ b/tests/www/test_validators.py @@ -7,9 +7,9 @@ # 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 diff --git a/tests/www/test_views.py b/tests/www/test_views.py index fb7a2f3411870..734b28bcdc369 100644 --- a/tests/www/test_views.py +++ b/tests/www/test_views.py @@ -31,7 +31,7 @@ from urllib.parse import quote_plus from werkzeug.test import Client -from airflow import models, configuration, settings +from airflow import models, configuration from airflow.config_templates.airflow_local_settings import DEFAULT_LOGGING_CONFIG from airflow.models import DAG, DagRun, TaskInstance from airflow.operators.dummy_operator import DummyOperator @@ -67,7 +67,7 @@ def setUp(self): self.chart = { 'label': 'chart', 'owner': 'airflow', - 'conn_id': 'airflow_ci', + 'conn_id': 'airflow_db', } def tearDown(self): diff --git a/tests/www_rbac/test_security.py b/tests/www_rbac/test_security.py index 67ea5b3035640..6e0b5726394da 100644 --- a/tests/www_rbac/test_security.py +++ b/tests/www_rbac/test_security.py @@ -109,7 +109,7 @@ def test_init_role_modelview(self): def test_get_user_roles(self): user = mock.MagicMock() - user.is_anonymous.return_value = False + user.is_anonymous = False roles = self.appbuilder.sm.find_role('Admin') user.roles = roles self.assertEqual(self.security_manager.get_user_roles(user), roles) @@ -144,7 +144,7 @@ def test_get_accessible_dag_ids(self, mock_get_user_roles, self.security_manager.init_role(role_name, role_vms, role_perms) role = self.security_manager.find_role(role_name) user.roles = [role] - user.is_anonymous.return_value = False + user.is_anonymous = False mock_get_all_permissions_views.return_value = {('can_dag_read', 'dag_id')} mock_get_user_roles.return_value = [role] @@ -154,7 +154,7 @@ def test_get_accessible_dag_ids(self, mock_get_user_roles, @mock.patch('airflow.www_rbac.security.AirflowSecurityManager._has_view_access') def test_has_access(self, mock_has_view_access): user = mock.MagicMock() - user.is_anonymous.return_value = False + user.is_anonymous = False mock_has_view_access.return_value = True self.assertTrue(self.security_manager.has_access('perm', 'view', user)) diff --git a/tests/www_rbac/test_utils.py b/tests/www_rbac/test_utils.py index 1879ba082693d..68d1744ab8fa8 100644 --- a/tests/www_rbac/test_utils.py +++ b/tests/www_rbac/test_utils.py @@ -18,6 +18,7 @@ # under the License. import unittest +import mock from xml.dom import minidom from airflow.www_rbac import utils @@ -113,6 +114,40 @@ def test_params_all(self): self.assertEqual('page=3&search=bash_&showPaused=False', utils.get_params(showPaused=False, page=3, search='bash_')) + def test_open_maybe_zipped_normal_file(self): + with mock.patch( + 'io.open', mock.mock_open(read_data="data")) as mock_file: + utils.open_maybe_zipped('/path/to/some/file.txt') + mock_file.assert_called_with('/path/to/some/file.txt', mode='r') + + def test_open_maybe_zipped_normal_file_with_zip_in_name(self): + path = '/path/to/fakearchive.zip.other/file.txt' + with mock.patch( + 'io.open', mock.mock_open(read_data="data")) as mock_file: + utils.open_maybe_zipped(path) + mock_file.assert_called_with(path, mode='r') + + @mock.patch("zipfile.is_zipfile") + @mock.patch("zipfile.ZipFile") + def test_open_maybe_zipped_archive(self, mocked_ZipFile, mocked_is_zipfile): + mocked_is_zipfile.return_value = True + instance = mocked_ZipFile.return_value + instance.open.return_value = mock.mock_open(read_data="data") + + utils.open_maybe_zipped('/path/to/archive.zip/deep/path/to/file.txt') + + mocked_is_zipfile.assert_called_once() + (args, kwargs) = mocked_is_zipfile.call_args_list[0] + self.assertEqual('/path/to/archive.zip', args[0]) + + mocked_ZipFile.assert_called_once() + (args, kwargs) = mocked_ZipFile.call_args_list[0] + self.assertEqual('/path/to/archive.zip', args[0]) + + instance.open.assert_called_once() + (args, kwargs) = instance.open.call_args_list[0] + self.assertEqual('deep/path/to/file.txt', args[0]) + if __name__ == '__main__': unittest.main() diff --git a/tests/www_rbac/test_views.py b/tests/www_rbac/test_views.py index f6a350150405b..64531244656a4 100644 --- a/tests/www_rbac/test_views.py +++ b/tests/www_rbac/test_views.py @@ -874,6 +874,17 @@ def login(self, username=None, password=None): role=role_admin, password='test') + role_user = self.appbuilder.sm.find_role('User') + test_user = self.appbuilder.sm.find_user(username='test_user') + if not test_user: + self.appbuilder.sm.add_user( + username='test_user', + first_name='test_user', + last_name='test_user', + email='test_user@fab.org', + role=role_user, + password='test_user') + dag_acl_role = self.appbuilder.sm.add_role('dag_acl_tester') dag_tester = self.appbuilder.sm.find_user(username='dag_tester') if not dag_tester: @@ -1314,6 +1325,50 @@ def test_tree_success_for_read_only_role(self): resp = self.client.get(url, follow_redirects=True) self.check_content_in_response('runme_1', resp) + def test_log_success(self): + self.logout() + self.login() + url = ('log?task_id=runme_0&dag_id=example_bash_operator&execution_date={}' + .format(self.percent_encode(self.default_date))) + resp = self.client.get(url, follow_redirects=True) + self.check_content_in_response('Log by attempts', resp) + url = ('get_logs_with_metadata?task_id=runme_0&dag_id=example_bash_operator&' + 'execution_date={}&try_number=1&metadata=null' + .format(self.percent_encode(self.default_date))) + resp = self.client.get(url, follow_redirects=True) + self.check_content_in_response('"message":', resp) + self.check_content_in_response('"metadata":', resp) + + def test_log_failure(self): + self.logout() + self.login(username='dag_faker', + password='dag_faker') + url = ('log?task_id=runme_0&dag_id=example_bash_operator&execution_date={}' + .format(self.percent_encode(self.default_date))) + resp = self.client.get(url, follow_redirects=True) + self.check_content_not_in_response('Log by attempts', resp) + url = ('get_logs_with_metadata?task_id=runme_0&dag_id=example_bash_operator&' + 'execution_date={}&try_number=1&metadata=null' + .format(self.percent_encode(self.default_date))) + resp = self.client.get(url, follow_redirects=True) + self.check_content_not_in_response('"message":', resp) + self.check_content_not_in_response('"metadata":', resp) + + def test_log_success_for_user(self): + self.logout() + self.login(username='test_user', + password='test_user') + url = ('log?task_id=runme_0&dag_id=example_bash_operator&execution_date={}' + .format(self.percent_encode(self.default_date))) + resp = self.client.get(url, follow_redirects=True) + self.check_content_in_response('Log by attempts', resp) + url = ('get_logs_with_metadata?task_id=runme_0&dag_id=example_bash_operator&' + 'execution_date={}&try_number=1&metadata=null' + .format(self.percent_encode(self.default_date))) + resp = self.client.get(url, follow_redirects=True) + self.check_content_in_response('"message":', resp) + self.check_content_in_response('"metadata":', resp) + if __name__ == '__main__': unittest.main() diff --git a/tox.ini b/tox.ini index c4b74a1e55345..f07641f29b38a 100644 --- a/tox.ini +++ b/tox.ini @@ -17,7 +17,7 @@ # under the License. [tox] -envlist = flake8,{py27,py35}-backend_{mysql,sqlite,postgres} +envlist = flake8,{py27,py35}-backend_{mysql,sqlite,postgres}-env_{docker,kubernetes} skipsdist = True [global] @@ -57,10 +57,9 @@ passenv = * commands = pip wheel --progress-bar off -w {homedir}/.wheelhouse -f {homedir}/.wheelhouse -e .[devel_ci] pip install --progress-bar off --find-links={homedir}/.wheelhouse --no-index -e .[devel_ci] - {toxinidir}/scripts/ci/1-setup-env.sh - {toxinidir}/scripts/ci/2-setup-kdc.sh - {toxinidir}/scripts/ci/3-setup-databases.sh - {toxinidir}/scripts/ci/4-load-data.sh + env_docker: {toxinidir}/scripts/ci/1-setup-env.sh + env_docker: {toxinidir}/scripts/ci/2-setup-kdc.sh + env_docker: {toxinidir}/scripts/ci/3-setup-databases.sh {toxinidir}/scripts/ci/5-run-tests.sh [] {toxinidir}/scripts/ci/6-check-license.sh codecov -e TOXENV From 887813e0377d2fe014d7a5d831981d1da079afa5 Mon Sep 17 00:00:00 2001 From: "wayne.morris" Date: Sun, 7 Oct 2018 16:00:39 -0400 Subject: [PATCH 2/9] Merge with upstream/master --- airflow/contrib/hooks/databricks_hook.py | 6 - docs/code.rst | 2 - tests/contrib/hooks/test_bigquery_hook.py | 176 ---------------------- 3 files changed, 184 deletions(-) diff --git a/airflow/contrib/hooks/databricks_hook.py b/airflow/contrib/hooks/databricks_hook.py index 13885bb4e1b64..f4a890ac7ba4a 100644 --- a/airflow/contrib/hooks/databricks_hook.py +++ b/airflow/contrib/hooks/databricks_hook.py @@ -221,12 +221,6 @@ def _retryable_error(exception): or exception.response is not None and exception.response.status_code >= 500 -def _retryable_error(exception): - return isinstance(exception, requests_exceptions.ConnectionError) \ - or isinstance(exception, requests_exceptions.Timeout) \ - or exception.response is not None and exception.response.status_code >= 500 - - RUN_LIFE_CYCLE_STATES = [ 'PENDING', 'RUNNING', diff --git a/docs/code.rst b/docs/code.rst index c281c565f8f75..e5a53193e62f7 100644 --- a/docs/code.rst +++ b/docs/code.rst @@ -188,10 +188,8 @@ Operators .. autoclass:: airflow.contrib.operators.s3_delete_objects_operator.S3DeleteObjectsOperator .. autoclass:: airflow.contrib.operators.s3_list_operator.S3ListOperator .. autoclass:: airflow.contrib.operators.s3_to_gcs_operator.S3ToGoogleCloudStorageOperator -.. autoclass:: airflow.contrib.operators.s3_to_sftp_operator.S3ToSFTPOperator .. autoclass:: airflow.contrib.operators.segment_track_event_operator.SegmentTrackEventOperator .. autoclass:: airflow.contrib.operators.sftp_operator.SFTPOperator -.. autoclass:: airflow.contrib.operators.sftp_to_s3_operator.SFTPToS3Operator .. autoclass:: airflow.contrib.operators.slack_webhook_operator.SlackWebhookOperator .. autoclass:: airflow.contrib.operators.snowflake_operator.SnowflakeOperator .. autoclass:: airflow.contrib.operators.spark_jdbc_operator.SparkJDBCOperator diff --git a/tests/contrib/hooks/test_bigquery_hook.py b/tests/contrib/hooks/test_bigquery_hook.py index 1cc3f66258982..77a31f032081b 100644 --- a/tests/contrib/hooks/test_bigquery_hook.py +++ b/tests/contrib/hooks/test_bigquery_hook.py @@ -621,182 +621,6 @@ def run_with_config(config): mocked_rwc.assert_called_once() -class TestClusteringInRunJob(unittest.TestCase): - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_load_default(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertIsNone(config['load'].get('clustering')) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_load( - destination_project_dataset_table='my_dataset.my_table', - schema_fields=[], - source_uris=[], - ) - - mocked_rwc.assert_called_once() - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_load_with_arg(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertEqual( - config['load']['clustering'], - { - 'fields': ['field1', 'field2'] - } - ) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_load( - destination_project_dataset_table='my_dataset.my_table', - schema_fields=[], - source_uris=[], - cluster_fields=['field1', 'field2'], - time_partitioning={'type': 'DAY'} - ) - - mocked_rwc.assert_called_once() - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_query_default(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertIsNone(config['query'].get('clustering')) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_query(sql='select 1') - - mocked_rwc.assert_called_once() - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_query_with_arg(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertEqual( - config['query']['clustering'], - { - 'fields': ['field1', 'field2'] - } - ) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_query( - sql='select 1', - destination_dataset_table='my_dataset.my_table', - cluster_fields=['field1', 'field2'], - time_partitioning={'type': 'DAY'} - ) - - mocked_rwc.assert_called_once() - - -class TestClusteringInRunJob(unittest.TestCase): - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_load_default(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertIsNone(config['load'].get('clustering')) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_load( - destination_project_dataset_table='my_dataset.my_table', - schema_fields=[], - source_uris=[], - ) - - mocked_rwc.assert_called_once() - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_load_with_arg(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertEqual( - config['load']['clustering'], - { - 'fields': ['field1', 'field2'] - } - ) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_load( - destination_project_dataset_table='my_dataset.my_table', - schema_fields=[], - source_uris=[], - cluster_fields=['field1', 'field2'], - time_partitioning={'type': 'DAY'} - ) - - mocked_rwc.assert_called_once() - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_query_default(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertIsNone(config['query'].get('clustering')) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_query(sql='select 1') - - mocked_rwc.assert_called_once() - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_query_with_arg(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertEqual( - config['query']['clustering'], - { - 'fields': ['field1', 'field2'] - } - ) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_query( - sql='select 1', - destination_dataset_table='my_dataset.my_table', - cluster_fields=['field1', 'field2'], - time_partitioning={'type': 'DAY'} - ) - - mocked_rwc.assert_called_once() - - class TestBigQueryHookLegacySql(unittest.TestCase): """Ensure `use_legacy_sql` param in `BigQueryHook` propagates properly.""" From 093626a279437810958bc59175b36ef67b1c2341 Mon Sep 17 00:00:00 2001 From: "wayne.morris" Date: Sun, 7 Oct 2018 19:46:25 -0400 Subject: [PATCH 3/9] [AIRFLOW-2993] s3_to_sftp and sftp_to_s3 operators #3828 Fixed variable for deleting resources. [AIRFLOW-XXX] Remove residual line in Changelog (#3814) [AIRFLOW-2930] Fix celery excecutor scheduler crash (#3784) Caused by an update in PR #3740. execute_command.apply_async(args=command, ...) -command is a list of short unicode strings and the above code pass multiple arguments to a function defined as taking only one argument. -command = ["airflow", "run", "dag323",...] -args = command = ["airflow", "run", "dag323", ...] -execute_command("airflow","run","dag3s3", ...) will be error and exit. [AIRFLOW-2854] kubernetes_pod_operator add more configuration items (#3697) * kubernetes_pod_operator add more configuration items * fix test_kubernetes_pod_operator test_faulty_service_account failure case * fix review comment issues * pod_operator add hostnetwork config * add doc example [AIRFLOW-2994] Fix command status check in Qubole Check operator (#3790) [AIRFLOW-2949] Add syntax highlight for single quote strings (#3795) * AIRFLOW-2949: Add syntax highlight for single quote strings * AIRFLOW-2949: Also updated new UI main.css [AIRFLOW-2948] Arg check & better doc - SSHOperator & SFTPOperator (#3793) There may be different combinations of arguments, and some processings are being done 'silently', while users may not be fully aware of them. For example - User only needs to provide either `ssh_hook` or `ssh_conn_id`, while this is not clear in doc - if both provided, `ssh_conn_id` will be ignored. - if `remote_host` is provided, it will replace the `remote_host` which wasndefined in `ssh_hook` or predefined in the connection of `ssh_conn_id` These should be documented clearly to ensure it's transparent to the users. log.info() should also be used to remind users and provide clear logs. In addition, add instance check for ssh_hook to ensure it is of the correct type (SSHHook). Tests are updated for this PR. [AIRFLOW-XXX] Fix Broken Link in CONTRIBUTING.md [AIRFLOW-2980] ReadTheDocs - Fix Missing API Reference [AIRFLOW-2779] Make GHE auth third party licensed (#3803) This reinstates the original license. [AIRFLOW-XXX] Add Format to list of companies (#3824) [AIRFLOW-2900] Show code for packaged DAGs (#3749) [AIRFLOW-2983] Add prev_ds_nodash and next_ds_nodash macro (#3821) [AIRFLOW-2974] Extended Databricks hook with clusters operation (#3817) Add hooks for: - cluster start, - restart, - terminate. Add unit tests for the added hooks. Add hooks for cluster start, restart and terminate. Add unit tests for the added hooks. Add cluster_id variable for performing cluster operation tests. [AIRFLOW-2951] Update dag_run table end_date when state change (#3798) The existing airflow only change dag_run table end_date value when a user teminate a dag in web UI. The end_date will not be updated if airflow detected a dag finished and updated its state. This commit add end_date update in DagRun's set_state function to make up tho problem mentioned above. [AIRFLOW-2145] fix deadlock on clearing running TI (#3657) a `shutdown` task is not considered be `unfinished`, so a dag run can deadlock when all `unfinished` downstreams are all waiting on a task that's in the `shutdown` state. fix this by considering `shutdown` to be `unfinished`, since it's not truly a terminal state [AIRFLOW-XXX] Fix typo in docstring of gcs_to_bq (#3833) [AIRFLOW-2476] Allow tabulate up to 0.8.2 (#3835) [AIRFLOW-XXX] Fix typos in faq.rst (#3837) [AIRFLOW-2979] Make celery_result_backend conf Backwards compatible (#3832) (#2806) Renamed `celery_result_backend` to `result_backend` and broke backwards compatibility. [AIRFLOW-2866] Fix missing CSRF token head when using RBAC UI (#3804) [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) [AIRFLOW-3007] Update backfill example in Scheduler docs The scheduler docs at https://airflow.apache.org/scheduler.html#backfill-and-catchup use deprecated way of passing `schedule_interval`. `schedule_interval` should be pass to DAG as a separate parameter and not as a default arg. [AIRFLOW-3005] Replace 'Airbnb Airflow' with 'Apache Airflow' (#3845) [AIRFLOW-3002] Fix variable & tests in GoogleCloudBucketHelper (#3843) [AIRFLOW-2991] Log path to driver output after Dataproc job (#3827) [AIRFLOW-XXX] Fix python3 and flake8 errors in dev/airflow-jira This is a script that checks if the Jira's marked as fixed in a release are actually merged in - getting this working is helpful to me in preparing 1.10.1 [AIRFLOW-2883] Add import and export for pool cli using JSON [AIRFLOW-3021] Add Censys to who uses Airflow list > Censys > Find and analyze every reachable server and device on the Internet > https://censys.io/ closes AIRFLOW-3021 https://issues.apache.org/jira/browse/AIRFLOW-3021 Add Branch to Company List [AIRFLOW-3008] Move Kubernetes example DAGs to contrib [AIRFLOW-2997] Support cluster fields in bigquery (#3838) This adds a cluster_fields argument to the bigquery hook, GCS to bigquery operator and bigquery query operators. This field requests that bigquery store the result of the query/load operation sorted according to the specified fields (the order of fields given is significant). [AIRFLOW-XXX] Redirect FAQ `airflow[crypto]` to How-to Guides. [AIRFLOW-XXX] Remove redundant space in Kerberos (#3866) [AIRFLOW-3028] Update Text & Images in Readme.md [AIRFLOW-1917] Trim extra newline and trailing whitespace from log (#3862) [AIRFLOW-2985] Operators for S3 object copying/deleting (#3823) 1. Copying: Under the hood, it's `boto3.client.copy_object()`. It can only handle the situation in which the S3 connection used can access both source and destination bucket/key. 2. Deleting: 2.1 Under the hood, it's `boto3.client.delete_objects()`. It supports either deleting one single object or multiple objects. 2.2 If users try to delete a non-existent object, the request will still succeed, but there will be an entry 'Errors' in the response. There may also be other reasons which may cause similar 'Errors' ( request itself would succeed without explicit exception). So an argument `silent_on_errors` is added to let users decide if this sort of 'Errors' should fail the operator. The corresponding methods are added into S3Hook, and these two operators are 'wrappers' of these methods. [AIRFLOW-3030] Fix CLI docs (#3872) [AIRFLOW-XXX] Update kubernetes.rst docs (#3875) Update kubernetes.rst with correct KubernetesPodOperator inputs for the volumes. [AIRFLOW-XXX] Add Enigma to list of companies [AIRFLOW-2965] CLI tool to show the next execution datetime Cover different cases - schedule_interval is "@once" or None, then following_schedule method would always return None - If dag is paused, print reminder - If latest_execution_date is not found, print warning saying not applicable. [AIRFLOW-XXX] Add Bombora Inc using Airflow [AIRFLOW-XXX] Move Dag level access control out of 1.10 section (#3882) It isn't in 1.10 (and wasn't in this section when the PR was created). [AIRFLOW-3012] Fix Bug when passing emails for SLA [AIRFLOW-2797] Create Google Dataproc cluster with custom image (#3871) [AIRFLOW-XXX] Updated README to include CAVA [AIRFLOW-3035] Allow custom 'job_error_states' in dataproc ops (#3884) Allow caller to pass in custom list of Dataproc job states into the DataProc*Operator classes that should result in the _DataProcJob.raise_error() method raising an Exception. [AIRFLOW-3034]: Readme updates : Add Slack & Twitter, remove Gitter [AIRFLOW-3056] Add happn to Airflow user list [AIRFLOW-3052] Add logo options to Airflow (#3892) [AIRFLOW-2524] Add SageMaker Batch Inference (#3767) * Fix for comments * Fix sensor test * Update non_terminal_states and failed_states to static variables of SageMakerHook Add SageMaker Transform Operator & Sensor Co-authored-by: srrajeev-aws [AIRFLOW-XXX] Added Jeitto as one of happy Airflow users! (#3902) [AIRFLOW-XXX] Add Jeitto as one happy Airflow user! [AIRFLOW-3044] Dataflow operators accept templated job_name param (#3887) * Default value of new job_name param is templated task_id, to match the existing behavior as much as possible. * Change expected value in test_mlengine_operator_utils.py to match default for new job_name param. [AIRFLOW-2707] Validate task_log_reader on upgrade from <=1.9 (#3881) We changed the default logging config and config from 1.9 to 1.10, but anyone who upgrades and has an existing airflow.cfg won't know they need to change this value - instead they will get nothing displayed in the UI (ajax request fails) and see "'NoneType' object has no attribute 'read'" in the error log. This validates that config section at start up, and seamlessly upgrades the old previous value. [AIRFLOW-3025] Enable specifying dns and dns_search options for DockerOperator (#3860) Enable specifying dns and dns_search options for DockerOperator [AIRFLOW-1298] Clear UPSTREAM_FAILED using the clean cli (#3886) * [AIRFLOW-1298] Fix 'clear only_failed' * [AIRFLOW-1298] Fix 'clear only_failed' [AIRFLOW-3059] Log how many rows are read from Postgres (#3905) To know how many data is being read from Postgres, it is nice to log this to the Airflow log. Previously when there was no data, it would still create a single file. This is not something that we want, and therefore we've changed this behaviour. Refactored the tests to make use of Postgres itself since we have it running. This makes the tests more realistic, instead of mocking everything. [AIRFLOW-XXX] Fix typo in docs/timezone.rst (#3904) [AIRFLOW-3068] Remove deprecated imports [AIRFLOW-3036] Add relevant ECS options to ECS operator. (#3908) The ECS operator currently supports only a subset of available options for running ECS tasks. This patch adds all ECS options that could be relevant to airflow; options that wouldn't make sense here, like `count`, were skipped. [AIRFLOW-1195] Add feature to clear tasks in Parent Dag (#3907) [AIRFLOW-3073] Add note-Profiling feature not supported in new webserver (#3909) Adhoc queries and Charts features are no longer supported in new FAB-based webserver and UI. But this is not mentioned at all in the doc "Data Profiling" (https://airflow.incubator.apache.org/profiling.html) This commit adds a note to remind users for this. [AIRFLOW-XXX] Fix SlackWebhookOperator docs (#3915) The docs refer to `conn_id` while the actual argument is `http_conn_id`. [AIRFLOW-1441] Fix inconsistent tutorial code (#2466) [AIRFLOW-XXX] Add 90 Seconds to companies [AIRFLOW-3096] Further reduce DaysUntilStale for probo/stale [AIRFLOW-3072] Assign permission get_logs_with_metadata to viewer role (#3913) [AIRFLOW-3090] Demote dag start/stop log messages to debug (#3920) [AIRFLOW-2407] Use feature detection for reload() (#3298) * [AIRFLOW-2407] Use feature detection for reload() [Use feature detection instead of version detection](https://docs.python.org/3/howto/pyporting.html#use-feature-detection-instead-of-version-detection) is a Python porting best practice that avoids a flake8 undefined name error... flake8 testing of https://github.com/apache/incubator-airflow on Python 3.6.3 [AIRFLOW-XXX] Fix a wrong sample bash command, a display issue & a few typos (#3924) [AIRFLOW-3090] Make No tasks to consider for execution debug (#3923) During normal operation, it is not necessary to see the message. This can only be useful when debugging an issue. AIRFLOW-2952 Fix Kubernetes CI (#3922) The current dockerised CI pipeline doesn't run minikube and the Kubernetes integration tests. This starts a Kubernetes cluster using minikube and runs k8s integration tests using docker-compose. [AIRFLOW-2918] Fix Flake8 violations (#3931) [AIRFLOW-3076] Remove preloading of MySQL testdata (#3911) One of the things for tests is being self contained. This means that it should not depend on anything external, such as loading data. This PR will use the setUp and tearDown to load the data into MySQL and remove it afterwards. This removes the actual bash mysql commands and will make it easier to dockerize the whole testsuite in the future [AIRFLOW-2918] Remove unused imports [AIRFLOW-3090] Specify path of key file in log message (#3921) [AIRFLOW-3067] Display www_rbac Flask flash msg properly (#3903) The Flask flash messages are not displayed properly. When we don't give a category for a flash message, defautl value will be 'message'. In some cases, we specify 'error' category. Using Flask-AppBuilder, the flash message will be given a CSS class 'alert-[category]'. But We don't have 'alert-message' or 'alert-error' in the current 'bootstrap-theme.css' file. This makes the the flash messages in www_rbac UI come with no background color. This commit addresses this issue by adding 'alert-message' (using specs of existing CSS class 'alert-info') and 'alert-error' (using specs of existing CSS class 'alert-danger') into 'bootstrap-theme.css'. [AIRFLOW-3109] Bugfix to allow user/op roles to clear task intance via UI by default add show statements to hql filtering. [AIRFLOW-3051] Change CLI to make users ops similar to connections The ability to manipulate users from the command line is a bit clunky. Currently 'airflow create_user' and 'airflow delete_user' and 'airflow list_users'. It seems that these ought to be made more like connections, so that it becomes 'airflow users list ...', 'airflow users delete ...' and 'airflow users create ...' [AIRFLOW-3009] Import Hashable from collection.abc to fix Python 3.7 deprecation warning (#3849) [AIRFLOW-3111] Fix instructions in UPDATING.md and remove comment (#3944) artifacts in default_airflow.cfg - fixed incorrect instructions in UPDATING.md regarding core.log_filename_template and elasticsearch.elasticsearch_log_id_template - removed comments referencing "additional curly braces" from default_airflow.cfg since they're irrelevant to the rendered airflow.cfg [AIRFLOW-3117] Add instructions to allow GPL dependency (#3949) The installation instructions failed to mention how to proceed with the GPL dependency. For those who are not concerned by GPL, it is useful to know how to proceed with GPL dependency. [AIRFLOW-XXX] Add Square to the companies lists [AIRFLOW-XXX] Add Fathom Health to readme [AIRFLOW-XXX] Pin Click to 6.7 to Fix CI (#3962) [AIRFLOW-XXX] Fix SlackWebhookOperator execute method comment (#3963) [AIRFLOW-3100][AIRFLOW-3101] Improve docker compose local testing (#3933) [AIRFLOW-3127] Fix out-dated doc for Celery SSL (#3967) Now in `airflow.cfg`, for Celery-SSL, the item names are "ssl_active", "ssl_key", "ssl_cert", and "ssl_cacert". (since PR https://github.com/apache/incubator-airflow/pull/2806/files) But in the documentation https://airflow.incubator.apache.org/security.html?highlight=celery or https://github.com/apache/incubator-airflow/blob/master/docs/security.rst, it's "CELERY_SSL_ACTIVE", "CELERY_SSL_KEY", "CELERY_SSL_CERT", and "CELERY_SSL_CACERT", which is out-dated and may confuse readers. [AIRFLOW-XXX] Fix PythonVirtualenvOperator tests (#3968) The recent update to the CI image changed the default python from python2 to python3. The PythonVirtualenvOperator tests expected python2 as default and fail due to serialisation errors. [AIRFLOW-2952] Fix Kubernetes CI (#3957) - Update outdated cli command to create user - Remove `airflow/example_dags_kubernetes` as the dag already exists in `contrib/example_dags/` - Update the path to copy K8s dags [AIRFLOW-3104] Add .airflowignore info into doc (#3939) .airflowignore is a nice feature, but it was not mentioned at all in the documentation. [AIRFLOW-XXX] Add Delete for CLI Example in UPDATING.md [AIRFLOW-3123] Use a stack for DAG context management (#3956) [AIRFLOW-3125] Monitor Task Instances creation rates (#3966) Montor Task Instances creation rates by Operator type. These stats can provide some visibility on how much workload Airflow is getting. They can be used for resource allocation in the long run (i.e. to determine when we should scale up workers) and debugging in scenarios like the creation rate of certain type of Task Instances spikes. [AIRFLOW-3129] Backfill mysql hook unit tests. (#3970) [AIRFLOW-3124] Fix RBAC webserver debug mode (#3958) [AIRFLOW-XXX] Add Compass to companies list (#3972) We're using Airflow at Compass now. [AIRFLOW-XXX] Speed up DagBagTest cases (#3974) I noticed that many of the tests of DagBags operate on a specific DAG only, and don't need to load the example or test dags. By not loading the dags we don't need to this shaves about 10-20s of test time. [AIRFLOW-2912] Add Deploy and Delete operators for GCF (#3969) Both Deploy and Delete operators interact with Google Cloud Functions to manage functions. Both are idempotent and make use of GcfHook - hook that encapsulates communication with GCP over GCP API. [AIRFLOW-1390] Update Alembic to 0.9 (#3935) [AIRFLOW-2238] Update PR tool to remove outdated info (#3978) [AIRFLOW-XXX] Don't spam test logs with "bad cron expression" messages (#3973) We needed these test dags to check the behaviour of invalid cron expressions, but by default we were loading them every time we create a DagBag (which many, many tests to). Instead we ignore these known-bad dags by default, and the test checking those (tests/models.py:DagBagTest.test_process_file_cron_validity_check) is already explicitly processing those DAGs directly, so it remains tested. [AIRFLOW-XXX] Fix undocumented params in S3_hook Some function parameters were undocumented. Additional docstrings were added for clarity. [AIRFLOW-3079] Improve migration scripts to support MSSQL Server (#3964) There were two problems for MSSQL. First, 'timestamp' data type in MSSQL Server is essentially a row-id, and not a timezone enabled date/time stamp. Second, alembic creates invalid SQL when applying the 0/1 constraint to boolean values. MSSQL should enforce this constraint by simply asserting a boolean value. [AIRFLOW-XXX] Add DoorDash to README.md (#3980) DoorDash uses Airflow https://softwareengineeringdaily.com/2018/09/28/doordash/ [AIRFLOW-3062] Add Qubole in integration docs (#3946) [AIRFLOW-3129] Improve test coverage of airflow.models. (#3982) [AIRFLOW-2574] Cope with '%' in SQLA DSN when running migrations (#3787) Alembic uses a ConfigParser like Airflow does, and "%% is a special value in there, so we need to escape it. As per the Alembic docs: > Note that this value is passed to ConfigParser.set, which supports > variable interpolation using pyformat (e.g. `%(some_value)s`). A raw > percent sign not part of an interpolation symbol must therefore be > escaped, e.g. `%%` [AIRFLOW-3137] Make ProxyFix middleware optional. (#3983) The ProxyFix middleware should only be used when airflow is running behind a trusted proxy. This patch adds a `USE_PROXY_FIX` flag that defaults to `False`. [AIRFLOW-3004] Add config disabling scheduler cron (#3899) [AIRFLOW-3103][AIRFLOW-3147] Update flask-appbuilder (#3937) [AIRFLOW-XXX] Fixing the issue in Documentation (#3998) Fixing the operator name from DataFlowOperation to DataFlowJavaOperator in Documentation [AIRFLOW-3088] Include slack-compatible emoji image [AIRFLOW-3161] fix TaskInstance log link in RBAC UI [AIRFLOW-3148] Remove unnecessary arg "parameters" in RedshiftToS3Transfer (#3995) "Parameters" are used to help render the SQL command. But in this operator, only "schema" and "table" are needed. There is no SQL command to render. By checking the code,we can also find argument "parameters" is never really used. (Fix a minor issue in the docstring as well) [AIRFLOW-3159] Update GCS logging docs for latest code (#3952) [AIRFLOW-XXX] Fix airflow.models.DAG docstring mistake Closes #4004 from Sambeth/sambeth [AIRFLOW-XXX] Adding Home Depot as users of Apache airflow (#4013) * Adding Home Depot as users of Apache airflow [AIRFLOW-XXX] Added ThoughtWorks as user of Airflow in README (#4012) [AIRFLOW-XXX] Added DataCamp to list of companies in README (#4009) [AIRFLOW-3165] Document interpolation of '%' and warn (#4007) [AIRFLOW-3099] Complete list of optional airflow.cfg sections (#4002) [AIRFLOW-3162] Fix HttpHook URL parse error when port is specified (#4001) [AIRFLOW-3055] add get_dataset and get_datasets_list to bigquery_hook (#3894) * [AIRFLOW-3055] add get_dataset and get_datasets_list to bigquery_hook [AIRFLOW-3141] Add missing missing sensor tests. (#3991) Fixed string encoding error and updated with master. [AIRFLOW-XXX] Fix wrong {{ next_ds }} description (#4017) [AIRFLOW-XXX] Fix Typo in SFTPOperator docstring (#4016) [AIRFLOW-XXX] Remove residual line in Changelog (#3814) [AIRFLOW-2930] Fix celery excecutor scheduler crash (#3784) Caused by an update in PR #3740. execute_command.apply_async(args=command, ...) -command is a list of short unicode strings and the above code pass multiple arguments to a function defined as taking only one argument. -command = ["airflow", "run", "dag323",...] -args = command = ["airflow", "run", "dag323", ...] -execute_command("airflow","run","dag3s3", ...) will be error and exit. [AIRFLOW-2854] kubernetes_pod_operator add more configuration items (#3697) * kubernetes_pod_operator add more configuration items * fix test_kubernetes_pod_operator test_faulty_service_account failure case * fix review comment issues * pod_operator add hostnetwork config * add doc example [AIRFLOW-2994] Fix command status check in Qubole Check operator (#3790) [AIRFLOW-2949] Add syntax highlight for single quote strings (#3795) * AIRFLOW-2949: Add syntax highlight for single quote strings * AIRFLOW-2949: Also updated new UI main.css [AIRFLOW-2948] Arg check & better doc - SSHOperator & SFTPOperator (#3793) There may be different combinations of arguments, and some processings are being done 'silently', while users may not be fully aware of them. For example - User only needs to provide either `ssh_hook` or `ssh_conn_id`, while this is not clear in doc - if both provided, `ssh_conn_id` will be ignored. - if `remote_host` is provided, it will replace the `remote_host` which wasndefined in `ssh_hook` or predefined in the connection of `ssh_conn_id` These should be documented clearly to ensure it's transparent to the users. log.info() should also be used to remind users and provide clear logs. In addition, add instance check for ssh_hook to ensure it is of the correct type (SSHHook). Tests are updated for this PR. [AIRFLOW-XXX] Fix Broken Link in CONTRIBUTING.md [AIRFLOW-2980] ReadTheDocs - Fix Missing API Reference [AIRFLOW-2779] Make GHE auth third party licensed (#3803) This reinstates the original license. [AIRFLOW-XXX] Add Format to list of companies (#3824) [AIRFLOW-2900] Show code for packaged DAGs (#3749) [AIRFLOW-2974] Extended Databricks hook with clusters operation (#3817) Add hooks for: - cluster start, - restart, - terminate. Add unit tests for the added hooks. Add hooks for cluster start, restart and terminate. Add unit tests for the added hooks. Add cluster_id variable for performing cluster operation tests. [AIRFLOW-2951] Update dag_run table end_date when state change (#3798) The existing airflow only change dag_run table end_date value when a user teminate a dag in web UI. The end_date will not be updated if airflow detected a dag finished and updated its state. This commit add end_date update in DagRun's set_state function to make up tho problem mentioned above. [AIRFLOW-2145] fix deadlock on clearing running TI (#3657) a `shutdown` task is not considered be `unfinished`, so a dag run can deadlock when all `unfinished` downstreams are all waiting on a task that's in the `shutdown` state. fix this by considering `shutdown` to be `unfinished`, since it's not truly a terminal state [AIRFLOW-XXX] Fix typo in docstring of gcs_to_bq (#3833) [AIRFLOW-2476] Allow tabulate up to 0.8.2 (#3835) [AIRFLOW-XXX] Fix typos in faq.rst (#3837) [AIRFLOW-2979] Make celery_result_backend conf Backwards compatible (#3832) (#2806) Renamed `celery_result_backend` to `result_backend` and broke backwards compatibility. [AIRFLOW-2866] Fix missing CSRF token head when using RBAC UI (#3804) [AIRFLOW-3007] Update backfill example in Scheduler docs The scheduler docs at https://airflow.apache.org/scheduler.html#backfill-and-catchup use deprecated way of passing `schedule_interval`. `schedule_interval` should be pass to DAG as a separate parameter and not as a default arg. [AIRFLOW-3005] Replace 'Airbnb Airflow' with 'Apache Airflow' (#3845) [AIRFLOW-3002] Fix variable & tests in GoogleCloudBucketHelper (#3843) [AIRFLOW-2991] Log path to driver output after Dataproc job (#3827) [AIRFLOW-XXX] Fix python3 and flake8 errors in dev/airflow-jira This is a script that checks if the Jira's marked as fixed in a release are actually merged in - getting this working is helpful to me in preparing 1.10.1 [AIRFLOW-2883] Add import and export for pool cli using JSON [AIRFLOW-3021] Add Censys to who uses Airflow list > Censys > Find and analyze every reachable server and device on the Internet > https://censys.io/ closes AIRFLOW-3021 https://issues.apache.org/jira/browse/AIRFLOW-3021 Add Branch to Company List [AIRFLOW-3008] Move Kubernetes example DAGs to contrib [AIRFLOW-2997] Support cluster fields in bigquery (#3838) This adds a cluster_fields argument to the bigquery hook, GCS to bigquery operator and bigquery query operators. This field requests that bigquery store the result of the query/load operation sorted according to the specified fields (the order of fields given is significant). [AIRFLOW-XXX] Redirect FAQ `airflow[crypto]` to How-to Guides. [AIRFLOW-XXX] Remove redundant space in Kerberos (#3866) [AIRFLOW-3028] Update Text & Images in Readme.md [AIRFLOW-1917] Trim extra newline and trailing whitespace from log (#3862) [AIRFLOW-2985] Operators for S3 object copying/deleting (#3823) 1. Copying: Under the hood, it's `boto3.client.copy_object()`. It can only handle the situation in which the S3 connection used can access both source and destination bucket/key. 2. Deleting: 2.1 Under the hood, it's `boto3.client.delete_objects()`. It supports either deleting one single object or multiple objects. 2.2 If users try to delete a non-existent object, the request will still succeed, but there will be an entry 'Errors' in the response. There may also be other reasons which may cause similar 'Errors' ( request itself would succeed without explicit exception). So an argument `silent_on_errors` is added to let users decide if this sort of 'Errors' should fail the operator. The corresponding methods are added into S3Hook, and these two operators are 'wrappers' of these methods. [AIRFLOW-3030] Fix CLI docs (#3872) [AIRFLOW-XXX] Update kubernetes.rst docs (#3875) Update kubernetes.rst with correct KubernetesPodOperator inputs for the volumes. [AIRFLOW-XXX] Add Enigma to list of companies [AIRFLOW-2965] CLI tool to show the next execution datetime Cover different cases - schedule_interval is "@once" or None, then following_schedule method would always return None - If dag is paused, print reminder - If latest_execution_date is not found, print warning saying not applicable. [AIRFLOW-XXX] Add Bombora Inc using Airflow [AIRFLOW-XXX] Move Dag level access control out of 1.10 section (#3882) It isn't in 1.10 (and wasn't in this section when the PR was created). [AIRFLOW-3012] Fix Bug when passing emails for SLA [AIRFLOW-2797] Create Google Dataproc cluster with custom image (#3871) [AIRFLOW-XXX] Updated README to include CAVA [AIRFLOW-3035] Allow custom 'job_error_states' in dataproc ops (#3884) Allow caller to pass in custom list of Dataproc job states into the DataProc*Operator classes that should result in the _DataProcJob.raise_error() method raising an Exception. [AIRFLOW-3034]: Readme updates : Add Slack & Twitter, remove Gitter [AIRFLOW-3056] Add happn to Airflow user list [AIRFLOW-3052] Add logo options to Airflow (#3892) [AIRFLOW-2524] Add SageMaker Batch Inference (#3767) * Fix for comments * Fix sensor test * Update non_terminal_states and failed_states to static variables of SageMakerHook Add SageMaker Transform Operator & Sensor Co-authored-by: srrajeev-aws [AIRFLOW-XXX] Added Jeitto as one of happy Airflow users! (#3902) [AIRFLOW-XXX] Add Jeitto as one happy Airflow user! [AIRFLOW-3044] Dataflow operators accept templated job_name param (#3887) * Default value of new job_name param is templated task_id, to match the existing behavior as much as possible. * Change expected value in test_mlengine_operator_utils.py to match default for new job_name param. [AIRFLOW-2707] Validate task_log_reader on upgrade from <=1.9 (#3881) We changed the default logging config and config from 1.9 to 1.10, but anyone who upgrades and has an existing airflow.cfg won't know they need to change this value - instead they will get nothing displayed in the UI (ajax request fails) and see "'NoneType' object has no attribute 'read'" in the error log. This validates that config section at start up, and seamlessly upgrades the old previous value. [AIRFLOW-3025] Enable specifying dns and dns_search options for DockerOperator (#3860) Enable specifying dns and dns_search options for DockerOperator [AIRFLOW-1298] Clear UPSTREAM_FAILED using the clean cli (#3886) * [AIRFLOW-1298] Fix 'clear only_failed' * [AIRFLOW-1298] Fix 'clear only_failed' [AIRFLOW-3059] Log how many rows are read from Postgres (#3905) To know how many data is being read from Postgres, it is nice to log this to the Airflow log. Previously when there was no data, it would still create a single file. This is not something that we want, and therefore we've changed this behaviour. Refactored the tests to make use of Postgres itself since we have it running. This makes the tests more realistic, instead of mocking everything. [AIRFLOW-XXX] Fix typo in docs/timezone.rst (#3904) [AIRFLOW-3068] Remove deprecated imports [AIRFLOW-3036] Add relevant ECS options to ECS operator. (#3908) The ECS operator currently supports only a subset of available options for running ECS tasks. This patch adds all ECS options that could be relevant to airflow; options that wouldn't make sense here, like `count`, were skipped. [AIRFLOW-1195] Add feature to clear tasks in Parent Dag (#3907) [AIRFLOW-3073] Add note-Profiling feature not supported in new webserver (#3909) Adhoc queries and Charts features are no longer supported in new FAB-based webserver and UI. But this is not mentioned at all in the doc "Data Profiling" (https://airflow.incubator.apache.org/profiling.html) This commit adds a note to remind users for this. [AIRFLOW-XXX] Fix SlackWebhookOperator docs (#3915) The docs refer to `conn_id` while the actual argument is `http_conn_id`. [AIRFLOW-1441] Fix inconsistent tutorial code (#2466) [AIRFLOW-XXX] Add 90 Seconds to companies [AIRFLOW-3096] Further reduce DaysUntilStale for probo/stale [AIRFLOW-3072] Assign permission get_logs_with_metadata to viewer role (#3913) [AIRFLOW-3090] Demote dag start/stop log messages to debug (#3920) [AIRFLOW-2407] Use feature detection for reload() (#3298) * [AIRFLOW-2407] Use feature detection for reload() [Use feature detection instead of version detection](https://docs.python.org/3/howto/pyporting.html#use-feature-detection-instead-of-version-detection) is a Python porting best practice that avoids a flake8 undefined name error... flake8 testing of https://github.com/apache/incubator-airflow on Python 3.6.3 [AIRFLOW-XXX] Fix a wrong sample bash command, a display issue & a few typos (#3924) [AIRFLOW-3090] Make No tasks to consider for execution debug (#3923) During normal operation, it is not necessary to see the message. This can only be useful when debugging an issue. AIRFLOW-2952 Fix Kubernetes CI (#3922) The current dockerised CI pipeline doesn't run minikube and the Kubernetes integration tests. This starts a Kubernetes cluster using minikube and runs k8s integration tests using docker-compose. [AIRFLOW-2918] Fix Flake8 violations (#3931) [AIRFLOW-3076] Remove preloading of MySQL testdata (#3911) One of the things for tests is being self contained. This means that it should not depend on anything external, such as loading data. This PR will use the setUp and tearDown to load the data into MySQL and remove it afterwards. This removes the actual bash mysql commands and will make it easier to dockerize the whole testsuite in the future [AIRFLOW-2918] Remove unused imports [AIRFLOW-3090] Specify path of key file in log message (#3921) [AIRFLOW-3067] Display www_rbac Flask flash msg properly (#3903) The Flask flash messages are not displayed properly. When we don't give a category for a flash message, defautl value will be 'message'. In some cases, we specify 'error' category. Using Flask-AppBuilder, the flash message will be given a CSS class 'alert-[category]'. But We don't have 'alert-message' or 'alert-error' in the current 'bootstrap-theme.css' file. This makes the the flash messages in www_rbac UI come with no background color. This commit addresses this issue by adding 'alert-message' (using specs of existing CSS class 'alert-info') and 'alert-error' (using specs of existing CSS class 'alert-danger') into 'bootstrap-theme.css'. [AIRFLOW-3109] Bugfix to allow user/op roles to clear task intance via UI by default add show statements to hql filtering. [AIRFLOW-3051] Change CLI to make users ops similar to connections The ability to manipulate users from the command line is a bit clunky. Currently 'airflow create_user' and 'airflow delete_user' and 'airflow list_users'. It seems that these ought to be made more like connections, so that it becomes 'airflow users list ...', 'airflow users delete ...' and 'airflow users create ...' [AIRFLOW-3009] Import Hashable from collection.abc to fix Python 3.7 deprecation warning (#3849) [AIRFLOW-3111] Fix instructions in UPDATING.md and remove comment (#3944) artifacts in default_airflow.cfg - fixed incorrect instructions in UPDATING.md regarding core.log_filename_template and elasticsearch.elasticsearch_log_id_template - removed comments referencing "additional curly braces" from default_airflow.cfg since they're irrelevant to the rendered airflow.cfg [AIRFLOW-3117] Add instructions to allow GPL dependency (#3949) The installation instructions failed to mention how to proceed with the GPL dependency. For those who are not concerned by GPL, it is useful to know how to proceed with GPL dependency. [AIRFLOW-XXX] Add Square to the companies lists [AIRFLOW-XXX] Add Fathom Health to readme [AIRFLOW-XXX] Pin Click to 6.7 to Fix CI (#3962) [AIRFLOW-XXX] Fix SlackWebhookOperator execute method comment (#3963) [AIRFLOW-3100][AIRFLOW-3101] Improve docker compose local testing (#3933) [AIRFLOW-3127] Fix out-dated doc for Celery SSL (#3967) Now in `airflow.cfg`, for Celery-SSL, the item names are "ssl_active", "ssl_key", "ssl_cert", and "ssl_cacert". (since PR https://github.com/apache/incubator-airflow/pull/2806/files) But in the documentation https://airflow.incubator.apache.org/security.html?highlight=celery or https://github.com/apache/incubator-airflow/blob/master/docs/security.rst, it's "CELERY_SSL_ACTIVE", "CELERY_SSL_KEY", "CELERY_SSL_CERT", and "CELERY_SSL_CACERT", which is out-dated and may confuse readers. [AIRFLOW-XXX] Fix PythonVirtualenvOperator tests (#3968) The recent update to the CI image changed the default python from python2 to python3. The PythonVirtualenvOperator tests expected python2 as default and fail due to serialisation errors. [AIRFLOW-2952] Fix Kubernetes CI (#3957) - Update outdated cli command to create user - Remove `airflow/example_dags_kubernetes` as the dag already exists in `contrib/example_dags/` - Update the path to copy K8s dags [AIRFLOW-3104] Add .airflowignore info into doc (#3939) .airflowignore is a nice feature, but it was not mentioned at all in the documentation. [AIRFLOW-XXX] Add Delete for CLI Example in UPDATING.md [AIRFLOW-3123] Use a stack for DAG context management (#3956) [AIRFLOW-3125] Monitor Task Instances creation rates (#3966) Montor Task Instances creation rates by Operator type. These stats can provide some visibility on how much workload Airflow is getting. They can be used for resource allocation in the long run (i.e. to determine when we should scale up workers) and debugging in scenarios like the creation rate of certain type of Task Instances spikes. [AIRFLOW-3129] Backfill mysql hook unit tests. (#3970) [AIRFLOW-3124] Fix RBAC webserver debug mode (#3958) [AIRFLOW-XXX] Add Compass to companies list (#3972) We're using Airflow at Compass now. [AIRFLOW-XXX] Speed up DagBagTest cases (#3974) I noticed that many of the tests of DagBags operate on a specific DAG only, and don't need to load the example or test dags. By not loading the dags we don't need to this shaves about 10-20s of test time. [AIRFLOW-2912] Add Deploy and Delete operators for GCF (#3969) Both Deploy and Delete operators interact with Google Cloud Functions to manage functions. Both are idempotent and make use of GcfHook - hook that encapsulates communication with GCP over GCP API. [AIRFLOW-1390] Update Alembic to 0.9 (#3935) [AIRFLOW-2238] Update PR tool to remove outdated info (#3978) [AIRFLOW-XXX] Don't spam test logs with "bad cron expression" messages (#3973) We needed these test dags to check the behaviour of invalid cron expressions, but by default we were loading them every time we create a DagBag (which many, many tests to). Instead we ignore these known-bad dags by default, and the test checking those (tests/models.py:DagBagTest.test_process_file_cron_validity_check) is already explicitly processing those DAGs directly, so it remains tested. [AIRFLOW-XXX] Fix undocumented params in S3_hook Some function parameters were undocumented. Additional docstrings were added for clarity. [AIRFLOW-3079] Improve migration scripts to support MSSQL Server (#3964) There were two problems for MSSQL. First, 'timestamp' data type in MSSQL Server is essentially a row-id, and not a timezone enabled date/time stamp. Second, alembic creates invalid SQL when applying the 0/1 constraint to boolean values. MSSQL should enforce this constraint by simply asserting a boolean value. [AIRFLOW-XXX] Add DoorDash to README.md (#3980) DoorDash uses Airflow https://softwareengineeringdaily.com/2018/09/28/doordash/ [AIRFLOW-3062] Add Qubole in integration docs (#3946) [AIRFLOW-3129] Improve test coverage of airflow.models. (#3982) [AIRFLOW-2574] Cope with '%' in SQLA DSN when running migrations (#3787) Alembic uses a ConfigParser like Airflow does, and "%% is a special value in there, so we need to escape it. As per the Alembic docs: > Note that this value is passed to ConfigParser.set, which supports > variable interpolation using pyformat (e.g. `%(some_value)s`). A raw > percent sign not part of an interpolation symbol must therefore be > escaped, e.g. `%%` [AIRFLOW-3137] Make ProxyFix middleware optional. (#3983) The ProxyFix middleware should only be used when airflow is running behind a trusted proxy. This patch adds a `USE_PROXY_FIX` flag that defaults to `False`. [AIRFLOW-3004] Add config disabling scheduler cron (#3899) [AIRFLOW-3103][AIRFLOW-3147] Update flask-appbuilder (#3937) [AIRFLOW-XXX] Fixing the issue in Documentation (#3998) Fixing the operator name from DataFlowOperation to DataFlowJavaOperator in Documentation [AIRFLOW-3088] Include slack-compatible emoji image [AIRFLOW-3161] fix TaskInstance log link in RBAC UI [AIRFLOW-3148] Remove unnecessary arg "parameters" in RedshiftToS3Transfer (#3995) "Parameters" are used to help render the SQL command. But in this operator, only "schema" and "table" are needed. There is no SQL command to render. By checking the code,we can also find argument "parameters" is never really used. (Fix a minor issue in the docstring as well) [AIRFLOW-3159] Update GCS logging docs for latest code (#3952) [AIRFLOW-XXX] Fix airflow.models.DAG docstring mistake Closes #4004 from Sambeth/sambeth [AIRFLOW-XXX] Adding Home Depot as users of Apache airflow (#4013) * Adding Home Depot as users of Apache airflow [AIRFLOW-XXX] Added ThoughtWorks as user of Airflow in README (#4012) [AIRFLOW-XXX] Added DataCamp to list of companies in README (#4009) [AIRFLOW-3165] Document interpolation of '%' and warn (#4007) [AIRFLOW-3099] Complete list of optional airflow.cfg sections (#4002) [AIRFLOW-3162] Fix HttpHook URL parse error when port is specified (#4001) [AIRFLOW-3055] add get_dataset and get_datasets_list to bigquery_hook (#3894) * [AIRFLOW-3055] add get_dataset and get_datasets_list to bigquery_hook [AIRFLOW-3141] Add missing missing sensor tests. (#3991) [AIRFLOW-XXX] Fix wrong {{ next_ds }} description (#4017) [AIRFLOW-XXX] Fix Typo in SFTPOperator docstring (#4016) Addressed changes from comments made in the PR. [AIRFLOW-3139] include parameters into log.info in SQL operators, if any (#3986) For all SQL-operators based on DbApiHook, sql command itself is printed into log.info. But if parameters are used for the sql command, the parameters would not be included in the printing. This makes the log less useful. This commit ensures that the parameters are also printed into the log.info, if any. [AIRFLOW-XXX] Include Danamica in list of companies using Airflow (#4019) [AIRFLOW-XXX] Update manage-connections.rst (#4020) Explain how to connect with MySQL [AIRFLOW-XXX] Add CarLabs to companies list (#4021) [AIRFLOW-3175] Fix docstring format in airflow/jobs.py (#4025) These docstrings could not parsed properly in Sphinx syntax [AIRFLOW-3086] Add extras group for google auth to setup.py. (#3917) To clarify installation instructions for the google auth backend, add an install group to `setup.py` that installs dependencies google auth via `pip install apache-airflow[google_auth]`. [AIRFLOW-XXX] Include Pagar.me in list of users of Airflow (#4026) [AIRFLOW-3173] Add _cmd options for password config options (#4024) There were a few more "password" config options added over the last few months that didn't have _cmd options. Any config option that is a password should be able to be provided via a _cmd version. [AIRFLOW-3078] Basic operators for Google Compute Engine (#4022) Add GceInstanceStartOperator, GceInstanceStopOperator and GceSetMachineTypeOperator. Each operator includes: - core logic - input params validation - unit tests - presence in the example DAG - docstrings - How-to and Integration documentation Additionally, in GceHook error checking if response is 200 OK was added: Some types of errors are only visible in the response's "error" field and the overall HTTP response is 200 OK. That is why apart from checking if status is "done" we also check if "error" is empty, and if not an exception is raised with error message extracted from the "error" field of the response. In this commit we also separated out Body Field Validator to separate module in tools - this way it can be reused between various GCP operators, it has proven to be usable in at least two of them now. Co-authored-by: sprzedwojski Co-authored-by: potiuk [AIRFLOW-3168] More resillient database use in CI (#4014) Make sure mysql is available before calling it in CI [AIRFLOW-3177] Change scheduler_heartbeat from gauge to counter (#4027) This updates the scheduler_heartbeat metric from a gauge to a counter to better support the statsd_exporter for usage with Prometheus. A counter allows users to track the rate of the heartbeat, and integrates with the exporter better. A crashing or down scheduler will no longer emit the metric, but the statsd_exporter will continue to show a 1 for the metric value. This fixes that issue because a counter will continually change, and the lack of change indicates an issue with the scheduler. Add statsd change notice in UPDATING.md [AIRFLOW-2956] Add kubernetes tolerations (#3806) [AIRFLOW-3183] Fix bug in DagFileProcessorManager.max_runs_reached() (#4031) The condition is intended to ensure the function will return False if any file's run_count is still smaller than max_run. But the operator used here is "!=". Instead, it should be "<". This is because in DagFileProcessorManager, there is no statement helping limit the upper limit of run_count. It's possible that files' run_count will be bigger than max_run. In such case, max_runs_reached() method may fail its purpose. [AIRFLOW-3099] Don't ever warn about missing sections of config (#4028) Rather than looping through and setting each config variable individually, and having to know which sections are optional and which aren't, instead we can just call a single function on ConfigParser and it will read the config from the dict, and more importantly here, never error about missing sections - it will just create them as needed. [AIRFLOW-1837] Respect task start_date when different from dag's (#4010) Currently task instances get created and scheduled based on the DAG's start date rather than their own. This commit adds a check before creating a task instance to see that the start date is not after the execution date. [AIRFLOW-3089] Drop hard-coded url scheme in google auth redirect. (#3919) The google auth provider hard-codes the `_scheme` in the callback url to `https` so that airflow generates correct urls when run behind a proxy that terminates tls. But this means that google auth can't be used when running without https--for example, during local development. Also, hard-coding `_scheme` isn't the correct solution to the problem of running behind a proxy. Instead, the proxy should be configured to set the `X-Forwarded-Proto` header to `https`; Flask interprets this header and generates the appropriate callback url without hard-coding the scheme. [AIRFLOW-XXX] Add Grab to companies list (#4041) [AIRFLOW-3178] Handle percents signs in configs for airflow run (#4029) * [AIRFLOW-3178] Don't mask defaults() function from ConfigParser ConfigParser (the base class for AirflowConfigParser) expects defaults() to be a function - so when we re-assign it to be a property some of the methods from ConfigParser no longer work. * [AIRFLOW-3178] Correctly escape percent signs when creating temp config Otherwise we have a problem when we come to use those values. * [AIRFLOW-3178] Use os.chmod instead of shelling out There's no need to run another process for a built in Python function. This also removes a possible race condition that would make temporary config file be readable by more than the airflow or run-as user The exact behaviour would depend on the umask we run under, and the primary group of our user, likely this would mean the file was readably by members of the airflow group (which in most cases would be just the airflow user). To remove any such possibility we chmod the file before we write to it [AIRFLOW-2216] Use profile for AWS hook if S3 config file provided in aws_default connection extra parameters (#4011) Use profile for AWS hook if S3 config file provided in aws_default connection extra parameters Add test to validate profile set [AIRFLOW-3001] Add index 'ti_dag_date' to taskinstance (#3885) To optimize query performance [AIRFLOW-2794] Add WasbDeleteBlobOperator (#3961) Deleting Azure blob is now supported. Either single blobs can be deleted, or one can choose to supply a prefix, in which case one can match multiple blobs to be deleted. [AIRFLOW-3138] Use current data type for migrations (#3985) * Use timestamp instead of timestamp with timezone for migration. [AIRFLOW-393] Add callback for FTP downloads (#2372) [AIRFLOW-3119] Enable debugging with Celery(#3950) This will enable --loglevel when launching a celery worker and inherit that LOGGING_LEVEL setting from airflow.cfg [AIRFLOW-3112] Make SFTP hook to inherit SSH hook (#3945) This is to aline the arguments of SFTP hook with SSH hook [AIRFLOW-3195] Log query and task_id in druid-hook (#4018) Log query and task_id in druid-hook [AIRFLOW-3187] Update airflow.gif file with a slower version (#4033) [AIRFLOW-2789] Create single node DataProc cluster (#4015) Create single node cluster - infer from num_workers --- README.md | 4 + UPDATING.md | 4 + airflow/bin/cli.py | 40 +- airflow/configuration.py | 82 ++-- airflow/contrib/auth/backends/google_auth.py | 3 +- .../example_dags/example_gcp_compute.py | 108 +++++ .../example_kubernetes_operator.py | 12 +- airflow/contrib/hooks/aws_hook.py | 40 +- airflow/contrib/hooks/bigquery_hook.py | 40 ++ airflow/contrib/hooks/ftp_hook.py | 68 ++- airflow/contrib/hooks/gcp_compute_hook.py | 167 +++++++ airflow/contrib/hooks/sftp_hook.py | 69 ++- airflow/contrib/hooks/wasb_hook.py | 41 ++ .../kubernetes_request_factory.py | 5 + .../pod_request_factory.py | 2 + airflow/contrib/kubernetes/pod.py | 4 +- .../contrib/operators/dataproc_operator.py | 20 +- .../contrib/operators/gcp_compute_operator.py | 183 ++++++++ .../operators/gcp_function_operator.py | 281 +----------- .../operators/kubernetes_pod_operator.py | 5 + .../contrib/operators/s3_to_sftp_operator.py | 4 +- airflow/contrib/operators/sftp_operator.py | 2 +- .../contrib/operators/sftp_to_s3_operator.py | 4 +- .../operators/wasb_delete_blob_operator.py | 71 +++ airflow/contrib/utils/gcp_field_validator.py | 417 ++++++++++++++++++ airflow/hooks/dbapi_hook.py | 3 +- airflow/hooks/druid_hook.py | 2 + airflow/jobs.py | 37 +- .../bf00311e1990_add_index_to_taskinstance.py | 46 ++ ...7_add_max_tries_column_to_task_instance.py | 3 +- airflow/models.py | 3 + airflow/sensors/s3_key_sensor.py | 8 +- airflow/sensors/sql_sensor.py | 6 +- airflow/task/task_runner/base_task_runner.py | 6 - airflow/utils/configuration.py | 6 +- airflow/utils/dag_processing.py | 2 +- docs/code.rst | 2 +- docs/howto/manage-connections.rst | 23 + docs/howto/operator.rst | 56 +++ docs/howto/set-config.rst | 20 +- docs/img/airflow.gif | Bin 622963 -> 622832 bytes docs/installation.rst | 134 +++--- docs/integration.rst | 31 ++ docs/kubernetes.rst | 11 +- docs/security.rst | 25 +- run_unit_tests.sh | 3 - ...{3-setup-databases.sh => 3-setup-mysql.sh} | 9 +- scripts/ci/5-run-tests.sh | 3 - scripts/ci/airflow_travis.cfg | 4 +- setup.py | 2 + tests/configuration.py | 39 +- tests/contrib/hooks/test_aws_hook.py | 21 + tests/contrib/hooks/test_bigquery_hook.py | 176 ++++++++ tests/contrib/hooks/test_ftp_hook.py | 23 + tests/contrib/hooks/test_wasb_hook.py | 56 ++- .../operators/test_dataproc_operator.py | 28 ++ .../operators/test_gcp_compute_operator.py | 377 ++++++++++++++++ .../operators/test_gcp_function_operator.py | 17 + .../operators/test_s3_to_sftp_operator.py | 5 +- tests/contrib/operators/test_sftp_operator.py | 105 ++--- .../test_wasb_delete_blob_operator.py | 91 ++++ tests/core.py | 33 +- tests/dags/test_scheduler_dags.py | 22 +- tests/executors/test_celery_executor.py | 5 + tests/jobs.py | 23 +- tests/sensors/test_s3_key_sensor.py | 55 ++- tests/sensors/test_s3_prefix_sensor.py | 43 ++ tests/sensors/test_sql_sensor.py | 24 + tests/www_rbac/test_views.py | 26 +- tox.ini | 4 +- 70 files changed, 2692 insertions(+), 602 deletions(-) create mode 100644 airflow/contrib/example_dags/example_gcp_compute.py create mode 100644 airflow/contrib/hooks/gcp_compute_hook.py create mode 100644 airflow/contrib/operators/gcp_compute_operator.py create mode 100644 airflow/contrib/operators/wasb_delete_blob_operator.py create mode 100644 airflow/contrib/utils/gcp_field_validator.py create mode 100644 airflow/migrations/versions/bf00311e1990_add_index_to_taskinstance.py rename scripts/ci/{3-setup-databases.sh => 3-setup-mysql.sh} (79%) create mode 100644 tests/contrib/operators/test_gcp_compute_operator.py create mode 100644 tests/contrib/operators/test_wasb_delete_blob_operator.py create mode 100644 tests/sensors/test_s3_prefix_sensor.py diff --git a/README.md b/README.md index 9d1da1e49c725..0f0d6c79ff8b4 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,7 @@ Currently **officially** using Airflow: 1. [Branch](https://branch.io) [[@sdebarshi](https://github.com/sdebarshi), [@dmitrig01](https://github.com/dmitrig01)] 1. [California Data Collaborative](https://github.com/California-Data-Collaborative) powered by [ARGO Labs](http://www.argolabs.org) 1. [Carbonite](https://www.carbonite.com) [[@ajbosco](https://github.com/ajbosco)] +1. [CarLabs](https://www.carlabs.ai/) [[@sganz](https://github.com/sganz) & [@odannyc](https://github.com/odannyc)] 1. [CAVA](https://www.cava.com) [[@minh5](http://github.com/minh5)] 1. [Celect](http://www.celect.com) [[@superdosh](https://github.com/superdosh) & [@chadcelect](https://github.com/chadcelect)] 1. [Censys](https://censys.io) [[@zakird](https://github.com/zakird), [@dadrian](https://github.com/dadrian), & [@andrewsardone](https://github.com/andrewsardone)] @@ -144,6 +145,7 @@ Currently **officially** using Airflow: 1. [Creditas](https://www.creditas.com.br) [[@dcassiano](https://github.com/dcassiano)] 1. [Custom Ink](https://www.customink.com/) [[@david-dalisay](https://github.com/david-dalisay), [@dmartin11](https://github.com/dmartin11) & [@mpeteuil](https://github.com/mpeteuil)] 1. [Dailymotion](http://www.dailymotion.com/fr) [[@germaintanguy](https://github.com/germaintanguy) & [@hc](https://github.com/hc)] +1. [Danamica](https://www.danamica.dk) [[@testvinder](https://github.com/testvinder)] 1. [Data Reply](https://www.datareply.co.uk/) [[@kaxil](https://github.com/kaxil)] 1. [DataCamp](https://datacamp.com/) [[@dgrtwo](https://github.com/dgrtwo)] 1. [DataFox](https://www.datafox.com/) [[@sudowork](https://github.com/sudowork)] @@ -167,6 +169,7 @@ Currently **officially** using Airflow: 1. [Glassdoor](https://github.com/Glassdoor) [[@syvineckruyk](https://github.com/syvineckruyk)] 1. [Global Fashion Group](http://global-fashion-group.com) [[@GFG](https://github.com/GFG)] 1. [GovTech GDS](https://gds-gov.tech) [[@chrissng](https://github.com/chrissng) & [@datagovsg](https://github.com/datagovsg)] +1. [Grab](https://www.grab.com/sg/) [[@grab](https://github.com/grab)] 1. [Gradeup](https://gradeup.co) [[@gradeup](https://github.com/gradeup)] 1. [Grand Rounds](https://www.grandrounds.com/) [[@richddr](https://github.com/richddr), [@timz1290](https://github.com/timz1290), [@wenever](https://github.com/@wenever), & [@runongirlrunon](https://github.com/runongirlrunon)] 1. [Groupalia](http://es.groupalia.com) [[@jesusfcr](https://github.com/jesusfcr)] @@ -227,6 +230,7 @@ Currently **officially** using Airflow: 1. [OneFineStay](https://www.onefinestay.com) [[@slangwald](https://github.com/slangwald)] 1. [Open Knowledge International](https://okfn.org) [@vitorbaptista](https://github.com/vitorbaptista) 1. [Overstock](https://www.github.com/overstock) [[@mhousley](https://github.com/mhousley) & [@mct0006](https://github.com/mct0006)] +1. [Pagar.me](https://pagar.me/) [[@pagarme](https://github.com/pagarme) 1. [Pandora Media](https://www.pandora.com/) [[@Acehaidrey](https://github.com/Acehaidrey) & [@wolfier](https://github.com/wolfier)] 1. [PAYMILL](https://www.paymill.com/) [[@paymill](https://github.com/paymill) & [@matthiashuschle](https://github.com/matthiashuschle)] 1. [PayPal](https://www.paypal.com/) [[@r39132](https://github.com/r39132) & [@jhsenjaliya](https://github.com/jhsenjaliya)] diff --git a/UPDATING.md b/UPDATING.md index 74337f3fe88de..5e1402576b867 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -52,6 +52,10 @@ To delete a user: airflow users --delete --username jondoe ``` +### StatsD Metrics + +The `scheduler_heartbeat` metric has been changed from a gauge to a counter. Each loop of the scheduler will increment the counter by 1. This provides a higher degree of visibility and allows for better integration with Prometheus using the [StatsD Exporter](https://github.com/prometheus/statsd_exporter). Scheduler upness can be determined by graphing and alerting using a rate. If the scheduler goes down, the rate will drop to 0. + ### Custom auth backends interface change We have updated the version of flask-login we depend upon, and as a result any diff --git a/airflow/bin/cli.py b/airflow/bin/cli.py index 6cbda705f1f76..eeef6e5effff3 100644 --- a/airflow/bin/cli.py +++ b/airflow/bin/cli.py @@ -19,7 +19,6 @@ # under the License. from __future__ import print_function -from backports.configparser import NoSectionError import logging import os @@ -488,24 +487,6 @@ def _run(args, dag, ti): @cli_utils.action_logging def run(args, dag=None): - # Optional sections won't log an error if they're missing in airflow.cfg. - OPTIONAL_AIRFLOW_CFG_SECTIONS = [ - 'atlas', - 'celery', - 'celery_broker_transport_options', - 'dask', - 'elasticsearch', - 'github_enterprise', - 'hive', - 'kerberos', - 'kubernetes', - 'kubernetes_node_selectors', - 'kubernetes_secrets', - 'ldap', - 'lineage', - 'mesos', - ] - if dag: args.dag_id = dag.dag_id @@ -519,25 +500,7 @@ def run(args, dag=None): if os.path.exists(args.cfg_path): os.remove(args.cfg_path) - # Do not log these properties since some may contain passwords. - # This may also set default values for database properties like - # core.sql_alchemy_pool_size - # core.sql_alchemy_pool_recycle - for section, config in conf_dict.items(): - for option, value in config.items(): - try: - conf.set(section, option, value) - except NoSectionError: - no_section_msg = ( - 'Section {section} Option {option} ' - 'does not exist in the config!' - ).format(section=section, option=option) - - if section in OPTIONAL_AIRFLOW_CFG_SECTIONS: - log.debug(no_section_msg) - else: - log.error(no_section_msg) - + conf.conf.read_dict(conf_dict, source=args.cfg_path) settings.configure_vars() # IMPORTANT, have to use the NullPool, otherwise, each "run" command may leave @@ -1077,6 +1040,7 @@ def worker(args): 'queues': args.queues, 'concurrency': args.concurrency, 'hostname': args.celery_hostname, + 'loglevel': conf.get('core', 'LOGGING_LEVEL'), } if args.daemon: diff --git a/airflow/configuration.py b/airflow/configuration.py index 33376285be483..6065a2bc61b96 100644 --- a/airflow/configuration.py +++ b/airflow/configuration.py @@ -130,6 +130,10 @@ class AirflowConfigParser(ConfigParser): ('celery', 'result_backend'), # Todo: remove this in Airflow 1.11 ('celery', 'celery_result_backend'), + ('atlas', 'password'), + ('smtp', 'smtp_password'), + ('ldap', 'bind_password'), + ('kubernetes', 'git_password'), } # A two-level mapping of (section -> new_name -> old_name). When reading @@ -154,9 +158,9 @@ class AirflowConfigParser(ConfigParser): def __init__(self, default_config=None, *args, **kwargs): super(AirflowConfigParser, self).__init__(*args, **kwargs) - self.defaults = ConfigParser(*args, **kwargs) + self.airflow_defaults = ConfigParser(*args, **kwargs) if default_config is not None: - self.defaults.read_string(default_config) + self.airflow_defaults.read_string(default_config) self.is_validated = False @@ -246,9 +250,9 @@ def get(self, section, key, **kwargs): return option # ...then the default config - if self.defaults.has_option(section, key): + if self.airflow_defaults.has_option(section, key): return expand_env_var( - self.defaults.get(section, key, **kwargs)) + self.airflow_defaults.get(section, key, **kwargs)) else: log.warning( @@ -282,6 +286,10 @@ def read(self, filenames): super(AirflowConfigParser, self).read(filenames) self._validate() + def read_dict(self, *args, **kwargs): + super(AirflowConfigParser, self).read_dict(*args, **kwargs) + self._validate() + def has_option(self, section, option): try: # Using self.get() to avoid reimplementing the priority order @@ -300,8 +308,8 @@ def remove_option(self, section, option, remove_default=True): if super(AirflowConfigParser, self).has_option(section, option): super(AirflowConfigParser, self).remove_option(section, option) - if self.defaults.has_option(section, option) and remove_default: - self.defaults.remove_option(section, option) + if self.airflow_defaults.has_option(section, option) and remove_default: + self.airflow_defaults.remove_option(section, option) def getsection(self, section): """ @@ -310,10 +318,11 @@ def getsection(self, section): :param section: section from the config :return: dict """ - if section not in self._sections and section not in self.defaults._sections: + if (section not in self._sections and + section not in self.airflow_defaults._sections): return None - _section = copy.deepcopy(self.defaults._sections[section]) + _section = copy.deepcopy(self.airflow_defaults._sections[section]) if section in self._sections: _section.update(copy.deepcopy(self._sections[section])) @@ -332,30 +341,35 @@ def getsection(self, section): _section[key] = val return _section - def as_dict(self, display_source=False, display_sensitive=False): + def as_dict( + self, display_source=False, display_sensitive=False, raw=False): """ Returns the current configuration as an OrderedDict of OrderedDicts. :param display_source: If False, the option value is returned. If True, a tuple of (option_value, source) is returned. Source is either - 'airflow.cfg' or 'default'. + 'airflow.cfg', 'default', 'env var', or 'cmd'. :type display_source: bool :param display_sensitive: If True, the values of options set by env vars and bash commands will be displayed. If False, those options are shown as '< hidden >' :type display_sensitive: bool + :param raw: Should the values be output as interpolated values, or the + "raw" form that can be fed back in to ConfigParser + :type raw: bool """ - cfg = copy.deepcopy(self.defaults._sections) - cfg.update(copy.deepcopy(self._sections)) - - # remove __name__ (affects Python 2 only) - for options in cfg.values(): - options.pop('__name__', None) - - # add source - if display_source: - for section in cfg: - for k, v in cfg[section].items(): - cfg[section][k] = (v, 'airflow config') + cfg = {} + configs = [ + ('default', self.airflow_defaults), + ('airflow.cfg', self), + ] + + for (source_name, config) in configs: + for section in config.sections(): + sect = cfg.setdefault(section, OrderedDict()) + for (k, val) in config.items(section=section, raw=raw): + if display_source: + val = (val, source_name) + sect[k] = val # add env vars and overwrite because they have priority for ev in [ev for ev in os.environ if ev.startswith('AIRFLOW__')]: @@ -363,16 +377,15 @@ def as_dict(self, display_source=False, display_sensitive=False): _, section, key = ev.split('__') opt = self._get_env_var_option(section, key) except ValueError: - opt = None - if opt: - if ( - not display_sensitive and - ev != 'AIRFLOW__CORE__UNIT_TEST_MODE'): - opt = '< hidden >' - if display_source: - opt = (opt, 'env var') - cfg.setdefault(section.lower(), OrderedDict()).update( - {key.lower(): opt}) + continue + if (not display_sensitive and ev != 'AIRFLOW__CORE__UNIT_TEST_MODE'): + opt = '< hidden >' + elif raw: + opt = opt.replace('%', '%%') + if display_source: + opt = (opt, 'env var') + cfg.setdefault(section.lower(), OrderedDict()).update( + {key.lower(): opt}) # add bash commands for (section, key) in self.as_command_stdout: @@ -381,8 +394,11 @@ def as_dict(self, display_source=False, display_sensitive=False): if not display_sensitive: opt = '< hidden >' if display_source: - opt = (opt, 'bash cmd') + opt = (opt, 'cmd') + elif raw: + opt = opt.replace('%', '%%') cfg.setdefault(section, OrderedDict()).update({key: opt}) + del cfg[section][key + '_cmd'] return cfg diff --git a/airflow/contrib/auth/backends/google_auth.py b/airflow/contrib/auth/backends/google_auth.py index bc7d552f59e93..ddbcb1222f2c0 100644 --- a/airflow/contrib/auth/backends/google_auth.py +++ b/airflow/contrib/auth/backends/google_auth.py @@ -112,8 +112,7 @@ def login(self, request): log.debug('Redirecting user to Google login') return self.google_oauth.authorize(callback=url_for( 'google_oauth_callback', - _external=True, - _scheme='https'), + _external=True), state=request.args.get('next') or request.referrer or None) def get_google_user_profile_info(self, google_token): diff --git a/airflow/contrib/example_dags/example_gcp_compute.py b/airflow/contrib/example_dags/example_gcp_compute.py new file mode 100644 index 0000000000000..e4abe2e152a00 --- /dev/null +++ b/airflow/contrib/example_dags/example_gcp_compute.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +# +# 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. + +""" +Example Airflow DAG that starts, stops and sets the machine type of a Google Compute +Engine instance. + +This DAG relies on the following Airflow variables +https://airflow.apache.org/concepts.html#variables +* PROJECT_ID - Google Cloud Platform project where the Compute Engine instance exists. +* LOCATION - Google Cloud Platform zone where the instance exists. +* INSTANCE - Name of the Compute Engine instance. +* SHORT_MACHINE_TYPE_NAME - Machine type resource name to set, e.g. 'n1-standard-1'. + See https://cloud.google.com/compute/docs/machine-types +""" + +import datetime + +import airflow +from airflow import models +from airflow.contrib.operators.gcp_compute_operator import GceInstanceStartOperator, \ + GceInstanceStopOperator, GceSetMachineTypeOperator + +# [START howto_operator_gce_args] +PROJECT_ID = models.Variable.get('PROJECT_ID', '') +LOCATION = models.Variable.get('LOCATION', '') +INSTANCE = models.Variable.get('INSTANCE', '') +SHORT_MACHINE_TYPE_NAME = models.Variable.get('SHORT_MACHINE_TYPE_NAME', '') +SET_MACHINE_TYPE_BODY = { + 'machineType': 'zones/{}/machineTypes/{}'.format(LOCATION, SHORT_MACHINE_TYPE_NAME) +} + +default_args = { + 'start_date': airflow.utils.dates.days_ago(1) +} +# [END howto_operator_gce_args] + +with models.DAG( + 'example_gcp_compute', + default_args=default_args, + schedule_interval=datetime.timedelta(days=1) +) as dag: + # [START howto_operator_gce_start] + gce_instance_start = GceInstanceStartOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id=INSTANCE, + task_id='gcp_compute_start_task' + ) + # [END howto_operator_gce_start] + # Duplicate start for idempotence testing + gce_instance_start2 = GceInstanceStartOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id=INSTANCE, + task_id='gcp_compute_start_task2' + ) + # [START howto_operator_gce_stop] + gce_instance_stop = GceInstanceStopOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id=INSTANCE, + task_id='gcp_compute_stop_task' + ) + # [END howto_operator_gce_stop] + # Duplicate stop for idempotence testing + gce_instance_stop2 = GceInstanceStopOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id=INSTANCE, + task_id='gcp_compute_stop_task2' + ) + # [START howto_operator_gce_set_machine_type] + gce_set_machine_type = GceSetMachineTypeOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id=INSTANCE, + body=SET_MACHINE_TYPE_BODY, + task_id='gcp_compute_set_machine_type' + ) + # [END howto_operator_gce_set_machine_type] + # Duplicate set machine type for idempotence testing + gce_set_machine_type2 = GceSetMachineTypeOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id=INSTANCE, + body=SET_MACHINE_TYPE_BODY, + task_id='gcp_compute_set_machine_type2' + ) + + gce_instance_start >> gce_instance_start2 >> gce_instance_stop >> \ + gce_instance_stop2 >> gce_set_machine_type >> gce_set_machine_type2 diff --git a/airflow/contrib/example_dags/example_kubernetes_operator.py b/airflow/contrib/example_dags/example_kubernetes_operator.py index 4b3f54bd04ef9..ba1f4433a78cc 100644 --- a/airflow/contrib/example_dags/example_kubernetes_operator.py +++ b/airflow/contrib/example_dags/example_kubernetes_operator.py @@ -38,6 +38,14 @@ default_args=args, schedule_interval=None) + tolerations = [ + { + 'key': "key", + 'operator': 'Equal', + 'value': 'value' + } + ] + k = KubernetesPodOperator( namespace='default', image="ubuntu:16.04", @@ -49,7 +57,9 @@ task_id="task", get_logs=True, dag=dag, - is_delete_operator_pod=False) + is_delete_operator_pod=False, + tolerations=tolerations + ) except ImportError as e: log.warn("Could not import KubernetesPodOperator: " + str(e)) diff --git a/airflow/contrib/hooks/aws_hook.py b/airflow/contrib/hooks/aws_hook.py index 448de63ffe989..8ce74d2b4eedc 100644 --- a/airflow/contrib/hooks/aws_hook.py +++ b/airflow/contrib/hooks/aws_hook.py @@ -97,33 +97,36 @@ def _get_credentials(self, region_name): if self.aws_conn_id: try: connection_object = self.get_connection(self.aws_conn_id) + extra_config = connection_object.extra_dejson if connection_object.login: aws_access_key_id = connection_object.login aws_secret_access_key = connection_object.password - elif 'aws_secret_access_key' in connection_object.extra_dejson: - aws_access_key_id = connection_object.extra_dejson[ + elif 'aws_secret_access_key' in extra_config: + aws_access_key_id = extra_config[ 'aws_access_key_id'] - aws_secret_access_key = connection_object.extra_dejson[ + aws_secret_access_key = extra_config[ 'aws_secret_access_key'] - elif 's3_config_file' in connection_object.extra_dejson: + elif 's3_config_file' in extra_config: aws_access_key_id, aws_secret_access_key = \ _parse_s3_config( - connection_object.extra_dejson['s3_config_file'], - connection_object.extra_dejson.get('s3_config_format')) + extra_config['s3_config_file'], + extra_config.get('s3_config_format'), + extra_config.get('profile')) if region_name is None: - region_name = connection_object.extra_dejson.get('region_name') + region_name = extra_config.get('region_name') - role_arn = connection_object.extra_dejson.get('role_arn') - external_id = connection_object.extra_dejson.get('external_id') - aws_account_id = connection_object.extra_dejson.get('aws_account_id') - aws_iam_role = connection_object.extra_dejson.get('aws_iam_role') + role_arn = extra_config.get('role_arn') + external_id = extra_config.get('external_id') + aws_account_id = extra_config.get('aws_account_id') + aws_iam_role = extra_config.get('aws_iam_role') if role_arn is None and aws_account_id is not None and \ aws_iam_role is not None: - role_arn = "arn:aws:iam::" + aws_account_id + ":role/" + aws_iam_role + role_arn = "arn:aws:iam::{}:role/{}" \ + .format(aws_account_id, aws_iam_role) if role_arn is not None: sts_session = boto3.session.Session( @@ -143,11 +146,12 @@ def _get_credentials(self, region_name): RoleSessionName='Airflow_' + self.aws_conn_id, ExternalId=external_id) - aws_access_key_id = sts_response['Credentials']['AccessKeyId'] - aws_secret_access_key = sts_response['Credentials']['SecretAccessKey'] - aws_session_token = sts_response['Credentials']['SessionToken'] + credentials = sts_response['Credentials'] + aws_access_key_id = credentials['AccessKeyId'] + aws_secret_access_key = credentials['SecretAccessKey'] + aws_session_token = credentials['SessionToken'] - endpoint_url = connection_object.extra_dejson.get('host') + endpoint_url = extra_config.get('host') except AirflowException: # No connection found: fallback on boto3 credential strategy @@ -183,7 +187,7 @@ def get_credentials(self, region_name=None): This contains the attributes: access_key, secret_key and token. """ session, _ = self._get_credentials(region_name) - # Credentials are refreshable, so accessing your access key / secret key - # separately can lead to a race condition. + # Credentials are refreshable, so accessing your access key and + # secret key separately can lead to a race condition. # See https://stackoverflow.com/a/36291428/8283373 return session.get_credentials().get_frozen_credentials() diff --git a/airflow/contrib/hooks/bigquery_hook.py b/airflow/contrib/hooks/bigquery_hook.py index dba4618e35905..abb1fea0f8f41 100644 --- a/airflow/contrib/hooks/bigquery_hook.py +++ b/airflow/contrib/hooks/bigquery_hook.py @@ -496,8 +496,12 @@ def run_query(self, schema_update_options=(), priority='INTERACTIVE', time_partitioning=None, +<<<<<<< HEAD api_resource_configs=None, cluster_fields=None): +======= + api_resource_configs=None): +>>>>>>> 5869feae... [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) """ Executes a BigQuery SQL query. Optionally persists results in a BigQuery table. See here: @@ -528,7 +532,11 @@ def run_query(self, See https://cloud.google.com/bigquery/user-defined-functions for details. :param use_legacy_sql: Whether to use legacy SQL (true) or standard SQL (false). If `None`, defaults to `self.use_legacy_sql`. +<<<<<<< HEAD :type use_legacy_sql: bool +======= + :type use_legacy_sql: boolean +>>>>>>> 5869feae... [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) :param api_resource_configs: a dictionary that contain params 'configuration' applied for Google BigQuery Jobs API: https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs @@ -569,7 +577,20 @@ def run_query(self, time_partitioning. The order of columns given determines the sort order. :type cluster_fields: list of str """ + if not api_resource_configs: + api_resource_configs = self.api_resource_configs + else: + _validate_value('api_resource_configs', + api_resource_configs, dict) + configuration = deepcopy(api_resource_configs) + if 'query' not in configuration: + configuration['query'] = {} + else: + _validate_value("api_resource_configs['query']", + configuration['query'], dict) + +<<<<<<< HEAD if not api_resource_configs: api_resource_configs = self.api_resource_configs else: @@ -583,6 +604,8 @@ def run_query(self, _validate_value("api_resource_configs['query']", configuration['query'], dict) +======= +>>>>>>> 5869feae... [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) sql = bql if sql is None else sql # TODO remove `bql` in Airflow 2.0 - Jira: [AIRFLOW-2513] @@ -634,9 +657,12 @@ def run_query(self, 'tableId': destination_table, } +<<<<<<< HEAD if cluster_fields: cluster_fields = {'fields': cluster_fields} +======= +>>>>>>> 5869feae... [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) query_param_list = [ (sql, 'query', None, str), (priority, 'priority', 'INTERACTIVE', str), @@ -647,8 +673,12 @@ def run_query(self, (maximum_bytes_billed, 'maximumBytesBilled', None, float), (time_partitioning, 'timePartitioning', {}, dict), (schema_update_options, 'schemaUpdateOptions', None, tuple), +<<<<<<< HEAD (destination_dataset_table, 'destinationTable', None, dict), (cluster_fields, 'clustering', None, dict), +======= + (destination_dataset_table, 'destinationTable', None, dict) +>>>>>>> 5869feae... [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) ] for param_tuple in query_param_list: @@ -1817,6 +1847,7 @@ def _validate_value(key, value, expected_type): key, expected_type, type(value))) +<<<<<<< HEAD def _api_resource_configs_duplication_check(key, value, config_dict, config_dict_name='api_resource_configs'): if key in config_dict and value != config_dict[key]: @@ -1825,3 +1856,12 @@ def _api_resource_configs_duplication_check(key, value, config_dict, "in `query` config and {param_name} was also provided " "with arg to run_query() method. Please remove duplicates." .format(param_name=key, dict_name=config_dict_name)) +======= +def _api_resource_configs_duplication_check(key, value, config_dict): + if key in config_dict and value != config_dict[key]: + raise ValueError("Values of {param_name} param are duplicated. " + "`api_resource_configs` contained {param_name} param " + "in `query` config and {param_name} was also provided " + "with arg to run_query() method. Please remove duplicates." + .format(param_name=key)) +>>>>>>> 5869feae... [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) diff --git a/airflow/contrib/hooks/ftp_hook.py b/airflow/contrib/hooks/ftp_hook.py index 8beefb372916c..03849012a3d5b 100644 --- a/airflow/contrib/hooks/ftp_hook.py +++ b/airflow/contrib/hooks/ftp_hook.py @@ -148,7 +148,11 @@ def delete_directory(self, path): conn = self.get_conn() conn.rmd(path) - def retrieve_file(self, remote_full_path, local_full_path_or_buffer): + def retrieve_file( + self, + remote_full_path, + local_full_path_or_buffer, + callback=None): """ Transfers the remote file to a local location. @@ -161,23 +165,59 @@ def retrieve_file(self, remote_full_path, local_full_path_or_buffer): :param local_full_path_or_buffer: full path to the local file or a file-like buffer :type local_full_path_or_buffer: str or file-like buffer + :param callback: callback which is called each time a block of data + is read. if you do not use a callback, these blocks will be written + to the file or buffer passed in. if you do pass in a callback, note + that writing to a file or buffer will need to be handled inside the + callback. + [default: output_handle.write()] + :type callback: callable + + Example:: + hook = FTPHook(ftp_conn_id='my_conn') + + remote_path = '/path/to/remote/file' + local_path = '/path/to/local/file' + + # with a custom callback (in this case displaying progress on each read) + def print_progress(percent_progress): + self.log.info('Percent Downloaded: %s%%' % percent_progress) + + total_downloaded = 0 + total_file_size = hook.get_size(remote_path) + output_handle = open(local_path, 'wb') + def write_to_file_with_progress(data): + total_downloaded += len(data) + output_handle.write(data) + percent_progress = (total_downloaded / total_file_size) * 100 + print_progress(percent_progress) + hook.retrieve_file(remote_path, None, callback=write_to_file_with_progress) + + # without a custom callback data is written to the local_path + hook.retrieve_file(remote_path, local_path) """ conn = self.get_conn() is_path = isinstance(local_full_path_or_buffer, basestring) - if is_path: - output_handle = open(local_full_path_or_buffer, 'wb') + # without a callback, default to writing to a user-provided file or + # file-like buffer + if not callback: + if is_path: + output_handle = open(local_full_path_or_buffer, 'wb') + else: + output_handle = local_full_path_or_buffer + callback = output_handle.write else: - output_handle = local_full_path_or_buffer + output_handle = None remote_path, remote_file_name = os.path.split(remote_full_path) conn.cwd(remote_path) self.log.info('Retrieving file from FTP: %s', remote_full_path) - conn.retrbinary('RETR %s' % remote_file_name, output_handle.write) + conn.retrbinary('RETR %s' % remote_file_name, callback) self.log.info('Finished retrieving file from FTP: %s', remote_full_path) - if is_path: + if is_path and output_handle: output_handle.close() def store_file(self, remote_full_path, local_full_path_or_buffer): @@ -230,6 +270,12 @@ def rename(self, from_name, to_name): return conn.rename(from_name, to_name) def get_mod_time(self, path): + """ + Returns a datetime object representing the last time the file was modified + + :param path: remote file path + :type path: string + """ conn = self.get_conn() ftp_mdtm = conn.sendcmd('MDTM ' + path) time_val = ftp_mdtm[4:] @@ -239,6 +285,16 @@ def get_mod_time(self, path): except ValueError: return datetime.datetime.strptime(time_val, '%Y%m%d%H%M%S') + def get_size(self, path): + """ + Returns the size of a file (in bytes) + + :param path: remote file path + :type path: string + """ + conn = self.get_conn() + return conn.size(path) + class FTPSHook(FTPHook): diff --git a/airflow/contrib/hooks/gcp_compute_hook.py b/airflow/contrib/hooks/gcp_compute_hook.py new file mode 100644 index 0000000000000..5fa088942b706 --- /dev/null +++ b/airflow/contrib/hooks/gcp_compute_hook.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +# +# 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. + +import time +from googleapiclient.discovery import build + +from airflow import AirflowException +from airflow.contrib.hooks.gcp_api_base_hook import GoogleCloudBaseHook + +# Number of retries - used by googleapiclient method calls to perform retries +# For requests that are "retriable" +NUM_RETRIES = 5 + +# Time to sleep between active checks of the operation results +TIME_TO_SLEEP_IN_SECONDS = 1 + + +class GceOperationStatus: + PENDING = "PENDING" + RUNNING = "RUNNING" + DONE = "DONE" + + +# noinspection PyAbstractClass +class GceHook(GoogleCloudBaseHook): + """ + Hook for Google Compute Engine APIs. + """ + _conn = None + + def __init__(self, + api_version, + gcp_conn_id='google_cloud_default', + delegate_to=None): + super(GceHook, self).__init__(gcp_conn_id, delegate_to) + self.api_version = api_version + + def get_conn(self): + """ + Retrieves connection to Google Compute Engine. + + :return: Google Compute Engine services object + :rtype: dict + """ + if not self._conn: + http_authorized = self._authorize() + self._conn = build('compute', self.api_version, + http=http_authorized, cache_discovery=False) + return self._conn + + def start_instance(self, project_id, zone, resource_id): + """ + Starts an existing instance defined by project_id, zone and resource_id. + + :param project_id: Google Cloud Platform project where the Compute Engine + instance exists. + :type project_id: str + :param zone: Google Cloud Platform zone where the instance exists. + :type zone: str + :param resource_id: Name of the Compute Engine instance resource. + :type resource_id: str + :return: True if the operation succeeded, raises an error otherwise + :rtype: bool + """ + response = self.get_conn().instances().start( + project=project_id, + zone=zone, + instance=resource_id + ).execute(num_retries=NUM_RETRIES) + operation_name = response["name"] + return self._wait_for_operation_to_complete(project_id, zone, operation_name) + + def stop_instance(self, project_id, zone, resource_id): + """ + Stops an instance defined by project_id, zone and resource_id. + + :param project_id: Google Cloud Platform project where the Compute Engine + instance exists. + :type project_id: str + :param zone: Google Cloud Platform zone where the instance exists. + :type zone: str + :param resource_id: Name of the Compute Engine instance resource. + :type resource_id: str + :return: True if the operation succeeded, raises an error otherwise + :rtype: bool + """ + response = self.get_conn().instances().stop( + project=project_id, + zone=zone, + instance=resource_id + ).execute(num_retries=NUM_RETRIES) + operation_name = response["name"] + return self._wait_for_operation_to_complete(project_id, zone, operation_name) + + def set_machine_type(self, project_id, zone, resource_id, body): + """ + Sets machine type of an instance defined by project_id, zone and resource_id. + + :param project_id: Google Cloud Platform project where the Compute Engine + instance exists. + :type project_id: str + :param zone: Google Cloud Platform zone where the instance exists. + :type zone: str + :param resource_id: Name of the Compute Engine instance resource. + :type resource_id: str + :param body: Body required by the Compute Engine setMachineType API, + as described in + https://cloud.google.com/compute/docs/reference/rest/v1/instances/setMachineType + :type body: dict + :return: True if the operation succeeded, raises an error otherwise + :rtype: bool + """ + response = self._execute_set_machine_type(project_id, zone, resource_id, body) + operation_name = response["name"] + return self._wait_for_operation_to_complete(project_id, zone, operation_name) + + def _execute_set_machine_type(self, project_id, zone, resource_id, body): + return self.get_conn().instances().setMachineType( + project=project_id, zone=zone, instance=resource_id, body=body)\ + .execute(num_retries=NUM_RETRIES) + + def _wait_for_operation_to_complete(self, project_id, zone, operation_name): + """ + Waits for the named operation to complete - checks status of the + asynchronous call. + + :param operation_name: name of the operation + :type operation_name: str + :return: True if the operation succeeded, raises an error otherwise + :rtype: bool + """ + service = self.get_conn() + while True: + operation_response = self._check_operation_status( + service, operation_name, project_id, zone) + if operation_response.get("status") == GceOperationStatus.DONE: + error = operation_response.get("error") + if error: + code = operation_response.get("httpErrorStatusCode") + msg = operation_response.get("httpErrorMessage") + # Extracting the errors list as string and trimming square braces + error_msg = str(error.get("errors"))[1:-1] + raise AirflowException("{} {}: ".format(code, msg) + error_msg) + # No meaningful info to return from the response in case of success + return True + time.sleep(TIME_TO_SLEEP_IN_SECONDS) + + def _check_operation_status(self, service, operation_name, project_id, zone): + return service.zoneOperations().get( + project=project_id, zone=zone, operation=operation_name).execute( + num_retries=NUM_RETRIES) diff --git a/airflow/contrib/hooks/sftp_hook.py b/airflow/contrib/hooks/sftp_hook.py index 33c8b19e0a732..3cb32ab8ba93b 100644 --- a/airflow/contrib/hooks/sftp_hook.py +++ b/airflow/contrib/hooks/sftp_hook.py @@ -21,11 +21,14 @@ import pysftp import logging import datetime -from airflow.hooks.base_hook import BaseHook +from airflow.contrib.hooks.ssh_hook import SSHHook -class SFTPHook(BaseHook): +class SFTPHook(SSHHook): """ + This hook is inherited from SSH hook. Please refer to SSH hook for the input + arguments. + Interact with SFTP. Aims to be interchangeable with FTPHook. Pitfalls: - In contrast with FTPHook describe_directory only returns size, type and @@ -39,32 +42,66 @@ class SFTPHook(BaseHook): Errors that may occur throughout but should be handled downstream. """ - def __init__(self, ftp_conn_id='sftp_default'): - self.ftp_conn_id = ftp_conn_id + def __init__(self, ftp_conn_id='sftp_default', *args, **kwargs): + kwargs['ssh_conn_id'] = ftp_conn_id + super(SFTPHook, self).__init__(*args, **kwargs) + self.conn = None + self.private_key_pass = None + + if self.ssh_conn_id is not None: + conn = self.get_connection(self.ssh_conn_id) + if conn.extra is not None: + extra_options = conn.extra_dejson + if 'private_key_pass' in extra_options: + self.private_key_pass = extra_options.get('private_key_pass', None) + + # For backward compatibility + # TODO: remove in Airflow 2.1 + import warnings + if 'ignore_hostkey_verification' in extra_options \ + and str(extra_options["ignore_hostkey_verification"])\ + .lower() == 'false': + warnings.warn( + 'Extra option `ignore_hostkey_verification` is deprecated.' + 'Please use `no_host_key_check` instead.' + 'This option will be removed in Airflow 2.1', + DeprecationWarning, + stacklevel=2, + ) + self.no_host_key_check = False + if 'private_key' in extra_options: + warnings.warn( + 'Extra option `private_key` is deprecated.' + 'Please use `key_file` instead.' + 'This option will be removed in Airflow 2.1', + DeprecationWarning, + stacklevel=2, + ) + self.key_file = extra_options.get('private_key') def get_conn(self): """ Returns an SFTP connection object """ if self.conn is None: - params = self.get_connection(self.ftp_conn_id) cnopts = pysftp.CnOpts() - if ('ignore_hostkey_verification' in params.extra_dejson and - params.extra_dejson['ignore_hostkey_verification']): + if self.no_host_key_check: cnopts.hostkeys = None + cnopts.compression = self.compress conn_params = { - 'host': params.host, - 'port': params.port, - 'username': params.login, + 'host': self.remote_host, + 'port': self.port, + 'username': self.username, 'cnopts': cnopts } - if params.password is not None: - conn_params['password'] = params.password - if 'private_key' in params.extra_dejson: - conn_params['private_key'] = params.extra_dejson['private_key'] - if 'private_key_pass' in params.extra_dejson: - conn_params['private_key_pass'] = params.extra_dejson['private_key_pass'] + if self.password and self.password.strip(): + conn_params['password'] = self.password + if self.key_file: + conn_params['private_key'] = self.key_file + if self.private_key_pass: + conn_params['private_key_pass'] = self.private_key_pass + self.conn = pysftp.Connection(**conn_params) return self.conn diff --git a/airflow/contrib/hooks/wasb_hook.py b/airflow/contrib/hooks/wasb_hook.py index 130c19469bd08..a977a98a33740 100644 --- a/airflow/contrib/hooks/wasb_hook.py +++ b/airflow/contrib/hooks/wasb_hook.py @@ -18,6 +18,7 @@ # under the License. # +from airflow import AirflowException from airflow.hooks.base_hook import BaseHook from azure.storage.blob import BlockBlobService @@ -148,3 +149,43 @@ def read_file(self, container_name, blob_name, **kwargs): return self.connection.get_blob_to_text(container_name, blob_name, **kwargs).content + + def delete_file(self, container_name, blob_name, is_prefix=False, + ignore_if_missing=False, **kwargs): + """ + Delete a file from Azure Blob Storage. + + :param container_name: Name of the container. + :type container_name: str + :param blob_name: Name of the blob. + :type blob_name: str + :param is_prefix: If blob_name is a prefix, delete all matching files + :type is_prefix: bool + :param ignore_if_missing: if True, then return success even if the + blob does not exist. + :type ignore_if_missing: bool + :param kwargs: Optional keyword arguments that + `BlockBlobService.create_blob_from_path()` takes. + :type kwargs: object + """ + + if is_prefix: + blobs_to_delete = [ + blob.name for blob in self.connection.list_blobs( + container_name, prefix=blob_name, **kwargs + ) + ] + elif self.check_for_blob(container_name, blob_name): + blobs_to_delete = [blob_name] + else: + blobs_to_delete = [] + + if not ignore_if_missing and len(blobs_to_delete) == 0: + raise AirflowException('Blob(s) not found: {}'.format(blob_name)) + + for blob_uri in blobs_to_delete: + self.log.info("Deleting blob: " + blob_uri) + self.connection.delete_blob(container_name, + blob_uri, + delete_snapshots='include', + **kwargs) diff --git a/airflow/contrib/kubernetes/kubernetes_request_factory/kubernetes_request_factory.py b/airflow/contrib/kubernetes/kubernetes_request_factory/kubernetes_request_factory.py index 97bcdf2abc9ea..bc424d57abf9e 100644 --- a/airflow/contrib/kubernetes/kubernetes_request_factory/kubernetes_request_factory.py +++ b/airflow/contrib/kubernetes/kubernetes_request_factory/kubernetes_request_factory.py @@ -186,3 +186,8 @@ def extract_image_pull_secrets(pod, req): req['spec']['imagePullSecrets'] = [{ 'name': pull_secret } for pull_secret in pod.image_pull_secrets.split(',')] + + @staticmethod + def extract_tolerations(pod, req): + if pod.tolerations: + req['spec']['tolerations'] = pod.tolerations diff --git a/airflow/contrib/kubernetes/kubernetes_request_factory/pod_request_factory.py b/airflow/contrib/kubernetes/kubernetes_request_factory/pod_request_factory.py index 877d7aafe2b2e..059026b320240 100644 --- a/airflow/contrib/kubernetes/kubernetes_request_factory/pod_request_factory.py +++ b/airflow/contrib/kubernetes/kubernetes_request_factory/pod_request_factory.py @@ -60,6 +60,7 @@ def create(self, pod): self.extract_annotations(pod, req) self.extract_affinity(pod, req) self.extract_hostnetwork(pod, req) + self.extract_tolerations(pod, req) return req @@ -118,4 +119,5 @@ def create(self, pod): self.extract_annotations(pod, req) self.extract_affinity(pod, req) self.extract_hostnetwork(pod, req) + self.extract_tolerations(pod, req) return req diff --git a/airflow/contrib/kubernetes/pod.py b/airflow/contrib/kubernetes/pod.py index 221c8f4180ef8..5de23ff5bdf81 100644 --- a/airflow/contrib/kubernetes/pod.py +++ b/airflow/contrib/kubernetes/pod.py @@ -78,7 +78,8 @@ def __init__( resources=None, annotations=None, affinity=None, - hostnetwork=False + hostnetwork=False, + tolerations=None, ): self.image = image self.envs = envs or {} @@ -100,3 +101,4 @@ def __init__( self.annotations = annotations or {} self.affinity = affinity or {} self.hostnetwork = hostnetwork or False + self.tolerations = tolerations or [] diff --git a/airflow/contrib/operators/dataproc_operator.py b/airflow/contrib/operators/dataproc_operator.py index 49e24a3df24c1..af2a211539d28 100644 --- a/airflow/contrib/operators/dataproc_operator.py +++ b/airflow/contrib/operators/dataproc_operator.py @@ -52,7 +52,8 @@ class DataprocClusterCreateOperator(BaseOperator): :param project_id: The ID of the google cloud project in which to create the cluster. (templated) :type project_id: str - :param num_workers: The # of workers to spin up + :param num_workers: The # of workers to spin up. If set to zero will + spin up cluster in a single node mode :type num_workers: int :param storage_bucket: The storage bucket to use, setting to None lets dataproc generate a custom one for you @@ -186,7 +187,7 @@ def __init__(self, self.metadata = metadata self.custom_image = custom_image self.image_version = image_version - self.properties = properties + self.properties = properties or dict() self.master_machine_type = master_machine_type self.master_disk_type = master_disk_type self.master_disk_size = master_disk_size @@ -205,10 +206,18 @@ def __init__(self, self.idle_delete_ttl = idle_delete_ttl self.auto_delete_time = auto_delete_time self.auto_delete_ttl = auto_delete_ttl + self.single_node = num_workers == 0 assert not (self.custom_image and self.image_version), \ "custom_image and image_version can't be both set" + assert ( + not self.single_node or ( + self.single_node and self.num_preemptible_workers == 0 + ) + ), "num_workers == 0 means single node mode - no preemptibles allowed" + + def _get_cluster_list_for_project(self, service): result = service.projects().regions().clusters().list( projectId=self.project_id, @@ -351,7 +360,12 @@ def _build_cluster_data(self): '{}/global/images/{}'.format(self.project_id, self.custom_image) cluster_data['config']['masterConfig']['imageUri'] = custom_image_url - cluster_data['config']['workerConfig']['imageUri'] = custom_image_url + if not self.single_node: + cluster_data['config']['workerConfig']['imageUri'] = custom_image_url + + if self.single_node: + self.properties["dataproc:dataproc.allow.zero.workers"] = "true" + if self.properties: cluster_data['config']['softwareConfig']['properties'] = self.properties if self.idle_delete_ttl: diff --git a/airflow/contrib/operators/gcp_compute_operator.py b/airflow/contrib/operators/gcp_compute_operator.py new file mode 100644 index 0000000000000..a2fd54529429c --- /dev/null +++ b/airflow/contrib/operators/gcp_compute_operator.py @@ -0,0 +1,183 @@ +# -*- coding: utf-8 -*- +# +# 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. + +from airflow import AirflowException +from airflow.contrib.hooks.gcp_compute_hook import GceHook +from airflow.contrib.utils.gcp_field_validator import GcpBodyFieldValidator +from airflow.models import BaseOperator +from airflow.utils.decorators import apply_defaults + + +class GceBaseOperator(BaseOperator): + """ + Abstract base operator for Google Compute Engine operators to inherit from. + """ + @apply_defaults + def __init__(self, + project_id, + zone, + resource_id, + gcp_conn_id='google_cloud_default', + api_version='v1', + *args, **kwargs): + self.project_id = project_id + self.zone = zone + self.full_location = 'projects/{}/zones/{}'.format(self.project_id, + self.zone) + self.resource_id = resource_id + self.gcp_conn_id = gcp_conn_id + self.api_version = api_version + self._validate_inputs() + self._hook = GceHook(gcp_conn_id=self.gcp_conn_id, api_version=self.api_version) + super(GceBaseOperator, self).__init__(*args, **kwargs) + + def _validate_inputs(self): + if not self.project_id: + raise AirflowException("The required parameter 'project_id' is missing") + if not self.zone: + raise AirflowException("The required parameter 'zone' is missing") + if not self.resource_id: + raise AirflowException("The required parameter 'resource_id' is missing") + + def execute(self, context): + pass + + +class GceInstanceStartOperator(GceBaseOperator): + """ + Start an instance in Google Compute Engine. + + :param project_id: Google Cloud Platform project where the Compute Engine + instance exists. + :type project_id: str + :param zone: Google Cloud Platform zone where the instance exists. + :type zone: str + :param resource_id: Name of the Compute Engine instance resource. + :type resource_id: str + :param gcp_conn_id: The connection ID used to connect to Google Cloud Platform. + :type gcp_conn_id: str + :param api_version: API version used (e.g. v1). + :type api_version: str + """ + template_fields = ('project_id', 'zone', 'resource_id', 'gcp_conn_id', 'api_version') + + @apply_defaults + def __init__(self, + project_id, + zone, + resource_id, + gcp_conn_id='google_cloud_default', + api_version='v1', + *args, **kwargs): + super(GceInstanceStartOperator, self).__init__( + project_id=project_id, zone=zone, resource_id=resource_id, + gcp_conn_id=gcp_conn_id, api_version=api_version, *args, **kwargs) + + def execute(self, context): + return self._hook.start_instance(self.project_id, self.zone, self.resource_id) + + +class GceInstanceStopOperator(GceBaseOperator): + """ + Stop an instance in Google Compute Engine. + + :param project_id: Google Cloud Platform project where the Compute Engine + instance exists. + :type project_id: str + :param zone: Google Cloud Platform zone where the instance exists. + :type zone: str + :param resource_id: Name of the Compute Engine instance resource. + :type resource_id: str + :param gcp_conn_id: The connection ID used to connect to Google Cloud Platform. + :type gcp_conn_id: str + :param api_version: API version used (e.g. v1). + :type api_version: str + """ + template_fields = ('project_id', 'zone', 'resource_id', 'gcp_conn_id', 'api_version') + + @apply_defaults + def __init__(self, + project_id, + zone, + resource_id, + gcp_conn_id='google_cloud_default', + api_version='v1', + *args, **kwargs): + super(GceInstanceStopOperator, self).__init__( + project_id=project_id, zone=zone, resource_id=resource_id, + gcp_conn_id=gcp_conn_id, api_version=api_version, *args, **kwargs) + + def execute(self, context): + return self._hook.stop_instance(self.project_id, self.zone, self.resource_id) + + +SET_MACHINE_TYPE_VALIDATION_SPECIFICATION = [ + dict(name="machineType", regexp="^.+$"), +] + + +class GceSetMachineTypeOperator(GceBaseOperator): + """ + Changes the machine type for a stopped instance to the machine type specified in + the request. + + :param project_id: Google Cloud Platform project where the Compute Engine + instance exists. + :type project_id: str + :param zone: Google Cloud Platform zone where the instance exists. + :type zone: str + :param resource_id: Name of the Compute Engine instance resource. + :type resource_id: str + :param body: Body required by the Compute Engine setMachineType API, as described in + https://cloud.google.com/compute/docs/reference/rest/v1/instances/setMachineType#request-body + :type body: dict + :param gcp_conn_id: The connection ID used to connect to Google Cloud Platform. + :type gcp_conn_id: str + :param api_version: API version used (e.g. v1). + :type api_version: str + """ + template_fields = ('project_id', 'zone', 'resource_id', 'gcp_conn_id', 'api_version') + + @apply_defaults + def __init__(self, + project_id, + zone, + resource_id, + body, + gcp_conn_id='google_cloud_default', + api_version='v1', + validate_body=True, + *args, **kwargs): + self.body = body + self._field_validator = None + if validate_body: + self._field_validator = GcpBodyFieldValidator( + SET_MACHINE_TYPE_VALIDATION_SPECIFICATION, api_version=api_version) + super(GceSetMachineTypeOperator, self).__init__( + project_id=project_id, zone=zone, resource_id=resource_id, + gcp_conn_id=gcp_conn_id, api_version=api_version, *args, **kwargs) + + def _validate_all_body_fields(self): + if self._field_validator: + self._field_validator.validate(self.body) + + def execute(self, context): + self._validate_all_body_fields() + return self._hook.set_machine_type(self.project_id, self.zone, + self.resource_id, self.body) diff --git a/airflow/contrib/operators/gcp_function_operator.py b/airflow/contrib/operators/gcp_function_operator.py index 4455307c93259..8207b9d084f89 100644 --- a/airflow/contrib/operators/gcp_function_operator.py +++ b/airflow/contrib/operators/gcp_function_operator.py @@ -20,277 +20,23 @@ from googleapiclient.errors import HttpError -from airflow import AirflowException, LoggingMixin +from airflow import AirflowException +from airflow.contrib.utils.gcp_field_validator import GcpBodyFieldValidator, \ + GcpFieldValidationException from airflow.version import version from airflow.models import BaseOperator from airflow.contrib.hooks.gcp_function_hook import GcfHook from airflow.utils.decorators import apply_defaults -# TODO: This whole section should be extracted later to contrib/tools/field_validator.py - -COMPOSITE_FIELD_TYPES = ['union', 'dict'] - - -class FieldValidationException(AirflowException): - """ - Thrown when validation finds dictionary field not valid according to specification. - """ - - def __init__(self, message): - super(FieldValidationException, self).__init__(message) - - -class ValidationSpecificationException(AirflowException): - """ - Thrown when validation specification is wrong - (rather than dictionary being validated). - This should only happen during development as ideally - specification itself should not be invalid ;) . - """ - - def __init__(self, message): - super(ValidationSpecificationException, self).__init__(message) - - -# TODO: make better description, add some examples -# TODO: move to contrib/utils folder when we reuse it. -class BodyFieldValidator(LoggingMixin): - """ - Validates correctness of request body according to specification. - The specification can describe various type of - fields including custom validation, and union of fields. This validator is meant - to be reusable by various operators - in the near future, but for now it is left as part of the Google Cloud Function, - so documentation about the - validator is not yet complete. To see what kind of specification can be used, - please take a look at - gcp_function_operator.CLOUD_FUNCTION_VALIDATION which specifies validation - for GCF deploy operator. - - :param validation_specs: dictionary describing validation specification - :type validation_specs: [dict] - :param api_version: Version of the api used (for example v1) - :type api_version: str - - """ - def __init__(self, validation_specs, api_version): - # type: ([dict], str) -> None - super(BodyFieldValidator, self).__init__() - self._validation_specs = validation_specs - self._api_version = api_version - - @staticmethod - def _get_field_name_with_parent(field_name, parent): - if parent: - return parent + '.' + field_name - return field_name - - @staticmethod - def _sanity_checks(children_validation_specs, field_type, full_field_path, - regexp, custom_validation, value): - # type: (dict, str, str, str, function, object) -> None - if value is None and field_type != 'union': - raise FieldValidationException( - "The required body field '{}' is missing. Please add it.". - format(full_field_path)) - if regexp and field_type: - raise ValidationSpecificationException( - "The validation specification entry '{}' has both type and regexp. " - "The regexp is only allowed without type (i.e. assume type is 'str' " - "that can be validated with regexp)".format(full_field_path)) - if children_validation_specs and field_type not in COMPOSITE_FIELD_TYPES: - raise ValidationSpecificationException( - "Nested fields are specified in field '{}' of type '{}'. " - "Nested fields are only allowed for fields of those types: ('{}').". - format(full_field_path, field_type, COMPOSITE_FIELD_TYPES)) - if custom_validation and field_type: - raise ValidationSpecificationException( - "The validation specification field '{}' has both type and " - "custom_validation. Custom validation is only allowed without type.". - format(full_field_path)) - - @staticmethod - def _validate_regexp(full_field_path, regexp, value): - # type: (str, str, str) -> None - if not re.match(regexp, value): - # Note matching of only the beginning as we assume the regexps all-or-nothing - raise FieldValidationException( - "The body field '{}' of value '{}' does not match the field " - "specification regexp: '{}'.". - format(full_field_path, value, regexp)) - - def _validate_dict(self, children_validation_specs, full_field_path, value): - # type: (dict, str, dict) -> None - for child_validation_spec in children_validation_specs: - self._validate_field(validation_spec=child_validation_spec, - dictionary_to_validate=value, - parent=full_field_path) - for field_name in value.keys(): - if field_name not in [spec['name'] for spec in children_validation_specs]: - self.log.warning( - "The field '{}' is in the body, but is not specified in the " - "validation specification '{}'. " - "This might be because you are using newer API version and " - "new field names defined for that version. Then the warning " - "can be safely ignored, or you might want to upgrade the operator" - "to the version that supports the new API version.".format( - self._get_field_name_with_parent(field_name, full_field_path), - children_validation_specs)) - - def _validate_union(self, children_validation_specs, full_field_path, - dictionary_to_validate): - # type: (dict, str, dict) -> None - field_found = False - found_field_name = None - for child_validation_spec in children_validation_specs: - # Forcing optional so that we do not have to type optional = True - # in specification for all union fields - new_field_found = self._validate_field( - validation_spec=child_validation_spec, - dictionary_to_validate=dictionary_to_validate, - parent=full_field_path, - force_optional=True) - field_name = child_validation_spec['name'] - if new_field_found and field_found: - raise FieldValidationException( - "The mutually exclusive fields '{}' and '{}' belonging to the " - "union '{}' are both present. Please remove one". - format(field_name, found_field_name, full_field_path)) - if new_field_found: - field_found = True - found_field_name = field_name - if not field_found: - self.log.warning( - "There is no '{}' union defined in the body {}. " - "Validation expected one of '{}' but could not find any. It's possible " - "that you are using newer API version and there is another union variant " - "defined for that version. Then the warning can be safely ignored, " - "or you might want to upgrade the operator to the version that " - "supports the new API version.".format( - full_field_path, - dictionary_to_validate, - [field['name'] for field in children_validation_specs])) - - def _validate_field(self, validation_spec, dictionary_to_validate, parent=None, - force_optional=False): - """ - Validates if field is OK. - :param validation_spec: specification of the field - :type validation_spec: dict - :param dictionary_to_validate: dictionary where the field should be present - :type dictionary_to_validate: dict - :param parent: full path of parent field - :type parent: str - :param force_optional: forces the field to be optional - (all union fields have force_optional set to True) - :type force_optional: bool - :return: True if the field is present - """ - field_name = validation_spec['name'] - field_type = validation_spec.get('type') - optional = validation_spec.get('optional') - regexp = validation_spec.get('regexp') - children_validation_specs = validation_spec.get('fields') - required_api_version = validation_spec.get('api_version') - custom_validation = validation_spec.get('custom_validation') - - full_field_path = self._get_field_name_with_parent(field_name=field_name, - parent=parent) - if required_api_version and required_api_version != self._api_version: - self.log.debug( - "Skipping validation of the field '{}' for API version '{}' " - "as it is only valid for API version '{}'". - format(field_name, self._api_version, required_api_version)) - return False - value = dictionary_to_validate.get(field_name) - - if (optional or force_optional) and value is None: - self.log.debug("The optional field '{}' is missing. That's perfectly OK.". - format(full_field_path)) - return False - - # Certainly down from here the field is present (value is not None) - # so we should only return True from now on - - self._sanity_checks(children_validation_specs=children_validation_specs, - field_type=field_type, - full_field_path=full_field_path, - regexp=regexp, - custom_validation=custom_validation, - value=value) - - if regexp: - self._validate_regexp(full_field_path, regexp, value) - elif field_type == 'dict': - if not isinstance(value, dict): - raise FieldValidationException( - "The field '{}' should be dictionary type according to " - "specification '{}' but it is '{}'". - format(full_field_path, validation_spec, value)) - if children_validation_specs is None: - self.log.debug( - "The dict field '{}' has no nested fields defined in the " - "specification '{}'. That's perfectly ok - it's content will " - "not be validated." - .format(full_field_path, validation_spec)) - else: - self._validate_dict(children_validation_specs, full_field_path, value) - elif field_type == 'union': - if not children_validation_specs: - raise ValidationSpecificationException( - "The union field '{}' has no nested fields " - "defined in specification '{}'. Unions should have at least one " - "nested field defined.".format(full_field_path, validation_spec)) - self._validate_union(children_validation_specs, full_field_path, - dictionary_to_validate) - elif custom_validation: - try: - custom_validation(value) - except Exception as e: - raise FieldValidationException( - "Error while validating custom field '{}' specified by '{}': '{}'". - format(full_field_path, validation_spec, e)) - elif field_type is None: - self.log.debug("The type of field '{}' is not specified in '{}'. " - "Not validating its content.". - format(full_field_path, validation_spec)) - else: - raise ValidationSpecificationException( - "The field '{}' is of type '{}' in specification '{}'." - "This type is unknown to validation!".format( - full_field_path, field_type, validation_spec)) - return True - - def validate(self, body_to_validate): - """ - Validates if the body (dictionary) follows specification that the validator was - instantiated with. Raises ValidationSpecificationException or - ValidationFieldException in case of problems with specification or the - body not conforming to the specification respectively. - :param body_to_validate: body that must follow the specification - :type body_to_validate: dict - :return: None - """ - try: - for validation_spec in self._validation_specs: - self._validate_field(validation_spec=validation_spec, - dictionary_to_validate=body_to_validate) - except FieldValidationException as e: - raise FieldValidationException( - "There was an error when validating: field '{}': '{}'". - format(body_to_validate, e)) - -# TODO End of field validator to be extracted - def _validate_available_memory_in_mb(value): if int(value) <= 0: - raise FieldValidationException("The available memory has to be greater than 0") + raise GcpFieldValidationException("The available memory has to be greater than 0") def _validate_max_instances(value): if int(value) <= 0: - raise FieldValidationException( + raise GcpFieldValidationException( "The max instances parameter has to be greater than 0") @@ -378,9 +124,10 @@ def __init__(self, self.api_version = api_version self.zip_path = zip_path self.zip_path_preprocessor = ZipPathPreprocessor(body, zip_path) - self.validate_body = validate_body - self._field_validator = BodyFieldValidator(CLOUD_FUNCTION_VALIDATION, - api_version=api_version) + self._field_validator = None + if validate_body: + self._field_validator = GcpBodyFieldValidator(CLOUD_FUNCTION_VALIDATION, + api_version=api_version) self._hook = GcfHook(gcp_conn_id=self.gcp_conn_id, api_version=self.api_version) self._validate_inputs() super(GcfFunctionDeployOperator, self).__init__(*args, **kwargs) @@ -395,7 +142,8 @@ def _validate_inputs(self): self.zip_path_preprocessor.preprocess_body() def _validate_all_body_fields(self): - self._field_validator.validate(self.body) + if self._field_validator: + self._field_validator.validate(self.body) def _create_new_function(self): self._hook.create_new_function(self.full_location, self.body) @@ -406,8 +154,8 @@ def _update_function(self): def _check_if_function_exists(self): name = self.body.get('name') if not name: - raise FieldValidationException("The 'name' field should be present in " - "body: '{}'.".format(self.body)) + raise GcpFieldValidationException("The 'name' field should be present in " + "body: '{}'.".format(self.body)) try: self._hook.get_function(name) except HttpError as e: @@ -430,8 +178,7 @@ def _set_airflow_version_label(self): def execute(self, context): if self.zip_path_preprocessor.should_upload_function(): self.body[SOURCE_UPLOAD_URL] = self._upload_source_code() - if self.validate_body: - self._validate_all_body_fields() + self._validate_all_body_fields() self._set_airflow_version_label() if not self._check_if_function_exists(): self._create_new_function() diff --git a/airflow/contrib/operators/kubernetes_pod_operator.py b/airflow/contrib/operators/kubernetes_pod_operator.py index d3c396e668361..d4f10138762fb 100644 --- a/airflow/contrib/operators/kubernetes_pod_operator.py +++ b/airflow/contrib/operators/kubernetes_pod_operator.py @@ -78,6 +78,8 @@ class KubernetesPodOperator(BaseOperator): /airflow/xcom/return.json in the container will also be pushed to an XCom when the container completes. :type xcom_push: bool + :param tolerations: Kubernetes tolerations + :type list of tolerations """ template_fields = ('cmds', 'arguments', 'env_vars', 'config_file') @@ -111,6 +113,7 @@ def execute(self, context): pod.affinity = self.affinity pod.node_selectors = self.node_selectors pod.hostnetwork = self.hostnetwork + pod.tolerations = self.tolerations launcher = pod_launcher.PodLauncher(kube_client=client, extract_xcom=self.xcom_push) @@ -158,6 +161,7 @@ def __init__(self, service_account_name="default", is_delete_operator_pod=False, hostnetwork=False, + tolerations=None, *args, **kwargs): super(KubernetesPodOperator, self).__init__(*args, **kwargs) @@ -186,3 +190,4 @@ def __init__(self, self.service_account_name = service_account_name self.is_delete_operator_pod = is_delete_operator_pod self.hostnetwork = hostnetwork + self.tolerations = tolerations or [] diff --git a/airflow/contrib/operators/s3_to_sftp_operator.py b/airflow/contrib/operators/s3_to_sftp_operator.py index d31e935f477e0..1878900f877f4 100644 --- a/airflow/contrib/operators/s3_to_sftp_operator.py +++ b/airflow/contrib/operators/s3_to_sftp_operator.py @@ -25,6 +25,7 @@ from airflow.utils.decorators import apply_defaults +@staticmethod def get_s3_key(s3_key): """This parses the correct format for S3 keys regardless of how the S3 url is passed.""" @@ -77,8 +78,7 @@ def execute(self, context): s3_hook = S3Hook(self.s3_conn_id) s3_client = s3_hook.get_conn() - ssh_client = ssh_hook.get_conn() - sftp_client = ssh_client.open_sftp() + sftp_client = ssh_hook.get_conn().open_sftp() with NamedTemporaryFile("w") as f: s3_client.download_file(self.s3_bucket, self.s3_key, f.name) diff --git a/airflow/contrib/operators/sftp_operator.py b/airflow/contrib/operators/sftp_operator.py index a3b5c1f24492b..620d875f89cef 100644 --- a/airflow/contrib/operators/sftp_operator.py +++ b/airflow/contrib/operators/sftp_operator.py @@ -30,7 +30,7 @@ class SFTPOperation(object): class SFTPOperator(BaseOperator): """ SFTPOperator for transferring files from remote host to local or vice a versa. - This operator uses ssh_hook to open sftp trasport channel that serve as basis + This operator uses ssh_hook to open sftp transport channel that serve as basis for file transfer. :param ssh_hook: predefined ssh_hook to use for remote execution. diff --git a/airflow/contrib/operators/sftp_to_s3_operator.py b/airflow/contrib/operators/sftp_to_s3_operator.py index 6899e98e2b1f9..109ed38c00c5d 100644 --- a/airflow/contrib/operators/sftp_to_s3_operator.py +++ b/airflow/contrib/operators/sftp_to_s3_operator.py @@ -25,6 +25,7 @@ from airflow.utils.decorators import apply_defaults +@staticmethod def get_s3_key(s3_key): """This parses the correct format for S3 keys regardless of how the S3 url is passed.""" @@ -76,8 +77,7 @@ def execute(self, context): ssh_hook = SSHHook(ssh_conn_id=self.sftp_conn_id) s3_hook = S3Hook(self.s3_conn_id) - ssh_client = ssh_hook.get_conn() - sftp_client = ssh_client.open_sftp() + sftp_client = ssh_hook.get_conn().open_sftp() with NamedTemporaryFile("w") as f: sftp_client.get(self.sftp_path, f.name) diff --git a/airflow/contrib/operators/wasb_delete_blob_operator.py b/airflow/contrib/operators/wasb_delete_blob_operator.py new file mode 100644 index 0000000000000..4634741d8b824 --- /dev/null +++ b/airflow/contrib/operators/wasb_delete_blob_operator.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# +# 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. +# +from airflow.contrib.hooks.wasb_hook import WasbHook +from airflow.models import BaseOperator +from airflow.utils.decorators import apply_defaults + + +class WasbDeleteBlobOperator(BaseOperator): + """ + Deletes blob(s) on Azure Blob Storage. + + :param container_name: Name of the container. (templated) + :type container_name: str + :param blob_name: Name of the blob. (templated) + :type blob_name: str + :param wasb_conn_id: Reference to the wasb connection. + :type wasb_conn_id: str + :param check_options: Optional keyword arguments that + `WasbHook.check_for_blob()` takes. + :param is_prefix: If blob_name is a prefix, delete all files matching prefix. + :type is_prefix: bool + :param ignore_if_missing: if True, then return success even if the + blob does not exist. + :type ignore_if_missing: bool + """ + + template_fields = ('container_name', 'blob_name') + + @apply_defaults + def __init__(self, container_name, blob_name, + wasb_conn_id='wasb_default', check_options=None, + is_prefix=False, ignore_if_missing=False, + *args, + **kwargs): + super(WasbDeleteBlobOperator, self).__init__(*args, **kwargs) + if check_options is None: + check_options = {} + self.wasb_conn_id = wasb_conn_id + self.container_name = container_name + self.blob_name = blob_name + self.check_options = check_options + self.is_prefix = is_prefix + self.ignore_if_missing = ignore_if_missing + + def execute(self, context): + self.log.info( + 'Deleting blob: {self.blob_name}\n' + 'in wasb://{self.container_name}'.format(**locals()) + ) + hook = WasbHook(wasb_conn_id=self.wasb_conn_id) + + hook.delete_file(self.container_name, self.blob_name, + self.is_prefix, self.ignore_if_missing, + **self.check_options) diff --git a/airflow/contrib/utils/gcp_field_validator.py b/airflow/contrib/utils/gcp_field_validator.py new file mode 100644 index 0000000000000..20f72d94b813a --- /dev/null +++ b/airflow/contrib/utils/gcp_field_validator.py @@ -0,0 +1,417 @@ +# -*- coding: utf-8 -*- +# +# 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. +"""Validator for body fields sent via GCP API. + +The validator performs validation of the body (being dictionary of fields) that +is sent in the API request to Google Cloud (via googleclient API usually). + +Context +------- +The specification mostly focuses on helping Airflow DAG developers in the development +phase. You can build your own GCP operator (such as GcfDeployOperator for example) which +can have built-in validation specification for the particular API. It's super helpful +when developer plays with different fields and their values at the initial phase of +DAG development. Most of the Google Cloud APIs perform their own validation on the +server side, but most of the requests are asynchronous and you need to wait for result +of the operation. This takes precious times and slows +down iteration over the API. BodyFieldValidator is meant to be used on the client side +and it should therefore provide an instant feedback to the developer on misspelled or +wrong type of parameters. + +The validation should be performed in "execute()" method call in order to allow +template parameters to be expanded before validation is performed. + +Types of fields +--------------- + +Specification is an array of dictionaries - each dictionary describes field, its type, +validation, optionality, api_version supported and nested fields (for unions and dicts). + +Typically (for clarity and in order to aid syntax highlighting) the array of +dicts should be defined as series of dict() executions. Fragment of example +specification might look as follows: + +``` +SPECIFICATION =[ + dict(name="an_union", type="union", optional=True, fields=[ + dict(name="variant_1", type="dict"), + dict(name="variant_2", regexp=r'^.+$', api_version='v1beta2'), + ), + dict(name="an_union", type="dict", fields=[ + dict(name="field_1", type="dict"), + dict(name="field_2", regexp=r'^.+$'), + ), + ... +] +``` + +Each field should have key = "name" indicating field name. The field can be of one of the +following types: + +* Dict fields: (key = "type", value="dict"): + Field of this type should contain nested fields in form of an array of dicts. + Each of the fields in the array is then expected (unless marked as optional) + and validated recursively. If an extra field is present in the dictionary, warning is + printed in log file (but the validation succeeds - see the Forward-compatibility notes) +* Union fields (key = "type", value="union"): field of this type should contain nested + fields in form of an array of dicts. One of the fields (and only one) should be + present (unless the union is marked as optional). If more than one union field is + present, FieldValidationException is raised. If none of the union fields is + present - warning is printed in the log (see below Forward-compatibility notes). +* Regexp-validated fields: (key = "regexp") - fields of this type are assumed to be + strings and they are validated with the regexp specified. Remember that the regexps + should ideally contain ^ at the beginning and $ at the end to make sure that + the whole field content is validated. Typically such regexp + validations should be used carefully and sparingly (see Forward-compatibility + notes below). Most of regexp validation should be at most r'^.+$'. +* Custom-validated fields: (key = "custom_validation") - fields of this type are validated + using method specified via custom_validation field. Any exception thrown in the custom + validation will be turned into FieldValidationException and will cause validation to + fail. Such custom validations might be used to check numeric fields (including + ranges of values), booleans or any other types of fields. +* API version: (key="api_version") if API version is specified, then the field will only + be validated when api_version used at field validator initialization matches exactly the + the version specified. If you want to declare fields that are available in several + versions of the APIs, you should specify the field as many times as many API versions + should be supported (each time with different API version). +* if none of the keys ("type", "regexp", "custom_validation" - the field is not validated + +You can see some of the field examples in EXAMPLE_VALIDATION_SPECIFICATION. + + +Forward-compatibility notes +--------------------------- +Certain decisions are crucial to allow the client APIs to work also with future API +versions. Since body attached is passed to the API’s call, this is entirely +possible to pass-through any new fields in the body (for future API versions) - +albeit without validation on the client side - they can and will still be validated +on the server side usually. + +Here are the guidelines that you should follow to make validation forward-compatible: + +* most of the fields are not validated for their content. It's possible to use regexp + in some specific cases that are guaranteed not to change in the future, but for most + fields regexp validation should be r'^.+$' indicating check for non-emptiness +* api_version is not validated - user can pass any future version of the api here. The API + version is only used to filter parameters that are marked as present in this api version + any new (not present in the specification) fields in the body are allowed (not verified) + For dictionaries, new fields can be added to dictionaries by future calls. However if an + unknown field in dictionary is added, a warning is logged by the client (but validation + remains successful). This is very nice feature to protect against typos in names. +* For unions, newly added union variants can be added by future calls and they will + pass validation, however the content or presence of those fields will not be validated. + This means that it’s possible to send a new non-validated union field together with an + old validated field and this problem will not be detected by the client. In such case + warning will be printed. +* When you add validator to an operator, you should also add ``validate_body`` parameter + (default = True) to __init__ of such operators - when it is set to False, + no validation should be performed. This is a safeguard for totally unpredicted and + backwards-incompatible changes that might sometimes occur in the APIs. + +""" + +import re + +from airflow import LoggingMixin, AirflowException + +COMPOSITE_FIELD_TYPES = ['union', 'dict'] + + +class GcpFieldValidationException(AirflowException): + """Thrown when validation finds dictionary field not valid according to specification. + """ + + def __init__(self, message): + super(GcpFieldValidationException, self).__init__(message) + + +class GcpValidationSpecificationException(AirflowException): + """Thrown when validation specification is wrong. + + This should only happen during development as ideally + specification itself should not be invalid ;) . + """ + + def __init__(self, message): + super(GcpValidationSpecificationException, self).__init__(message) + + +def _int_greater_than_zero(value): + if int(value) <= 0: + raise GcpFieldValidationException("The available memory has to be greater than 0") + + +EXAMPLE_VALIDATION_SPECIFICATION = [ + dict(name="name", regexp="^.+$"), + dict(name="description", regexp="^.+$", optional=True), + dict(name="availableMemoryMb", custom_validation=_int_greater_than_zero, + optional=True), + dict(name="labels", optional=True, type="dict"), + dict(name="an_union", type="union", fields=[ + dict(name="variant_1", regexp=r'^.+$'), + dict(name="variant_2", regexp=r'^.+$', api_version='v1beta2'), + dict(name="variant_3", type="dict", fields=[ + dict(name="url", regexp=r'^.+$') + ]), + dict(name="variant_4") + ]), +] + + +class GcpBodyFieldValidator(LoggingMixin): + """Validates correctness of request body according to specification. + + The specification can describe various type of + fields including custom validation, and union of fields. This validator is + to be reusable by various operators. See the EXAMPLE_VALIDATION_SPECIFICATION + for some examples and explanations of how to create specification. + + :param validation_specs: dictionary describing validation specification + :type validation_specs: [dict] + :param api_version: Version of the api used (for example v1) + :type api_version: str + + """ + def __init__(self, validation_specs, api_version): + # type: ([dict], str) -> None + super(GcpBodyFieldValidator, self).__init__() + self._validation_specs = validation_specs + self._api_version = api_version + + @staticmethod + def _get_field_name_with_parent(field_name, parent): + if parent: + return parent + '.' + field_name + return field_name + + @staticmethod + def _sanity_checks(children_validation_specs, field_type, full_field_path, + regexp, custom_validation, value): + # type: (dict, str, str, str, function, object) -> None + if value is None and field_type != 'union': + raise GcpFieldValidationException( + "The required body field '{}' is missing. Please add it.". + format(full_field_path)) + if regexp and field_type: + raise GcpValidationSpecificationException( + "The validation specification entry '{}' has both type and regexp. " + "The regexp is only allowed without type (i.e. assume type is 'str' " + "that can be validated with regexp)".format(full_field_path)) + if children_validation_specs and field_type not in COMPOSITE_FIELD_TYPES: + raise GcpValidationSpecificationException( + "Nested fields are specified in field '{}' of type '{}'. " + "Nested fields are only allowed for fields of those types: ('{}').". + format(full_field_path, field_type, COMPOSITE_FIELD_TYPES)) + if custom_validation and field_type: + raise GcpValidationSpecificationException( + "The validation specification field '{}' has both type and " + "custom_validation. Custom validation is only allowed without type.". + format(full_field_path)) + + @staticmethod + def _validate_regexp(full_field_path, regexp, value): + # type: (str, str, str) -> None + if not re.match(regexp, value): + # Note matching of only the beginning as we assume the regexps all-or-nothing + raise GcpFieldValidationException( + "The body field '{}' of value '{}' does not match the field " + "specification regexp: '{}'.". + format(full_field_path, value, regexp)) + + def _validate_dict(self, children_validation_specs, full_field_path, value): + # type: (dict, str, dict) -> None + for child_validation_spec in children_validation_specs: + self._validate_field(validation_spec=child_validation_spec, + dictionary_to_validate=value, + parent=full_field_path) + all_dict_keys = [spec['name'] for spec in children_validation_specs] + for field_name in value.keys(): + if field_name not in all_dict_keys: + self.log.warning( + "The field '{}' is in the body, but is not specified in the " + "validation specification '{}'. " + "This might be because you are using newer API version and " + "new field names defined for that version. Then the warning " + "can be safely ignored, or you might want to upgrade the operator" + "to the version that supports the new API version.".format( + self._get_field_name_with_parent(field_name, full_field_path), + children_validation_specs)) + + def _validate_union(self, children_validation_specs, full_field_path, + dictionary_to_validate): + # type: (dict, str, dict) -> None + field_found = False + found_field_name = None + for child_validation_spec in children_validation_specs: + # Forcing optional so that we do not have to type optional = True + # in specification for all union fields + new_field_found = self._validate_field( + validation_spec=child_validation_spec, + dictionary_to_validate=dictionary_to_validate, + parent=full_field_path, + force_optional=True) + field_name = child_validation_spec['name'] + if new_field_found and field_found: + raise GcpFieldValidationException( + "The mutually exclusive fields '{}' and '{}' belonging to the " + "union '{}' are both present. Please remove one". + format(field_name, found_field_name, full_field_path)) + if new_field_found: + field_found = True + found_field_name = field_name + if not field_found: + self.log.warning( + "There is no '{}' union defined in the body {}. " + "Validation expected one of '{}' but could not find any. It's possible " + "that you are using newer API version and there is another union variant " + "defined for that version. Then the warning can be safely ignored, " + "or you might want to upgrade the operator to the version that " + "supports the new API version.".format( + full_field_path, + dictionary_to_validate, + [field['name'] for field in children_validation_specs])) + + def _validate_field(self, validation_spec, dictionary_to_validate, parent=None, + force_optional=False): + """ + Validates if field is OK. + :param validation_spec: specification of the field + :type validation_spec: dict + :param dictionary_to_validate: dictionary where the field should be present + :type dictionary_to_validate: dict + :param parent: full path of parent field + :type parent: str + :param force_optional: forces the field to be optional + (all union fields have force_optional set to True) + :type force_optional: bool + :return: True if the field is present + """ + field_name = validation_spec['name'] + field_type = validation_spec.get('type') + optional = validation_spec.get('optional') + regexp = validation_spec.get('regexp') + children_validation_specs = validation_spec.get('fields') + required_api_version = validation_spec.get('api_version') + custom_validation = validation_spec.get('custom_validation') + + full_field_path = self._get_field_name_with_parent(field_name=field_name, + parent=parent) + if required_api_version and required_api_version != self._api_version: + self.log.debug( + "Skipping validation of the field '{}' for API version '{}' " + "as it is only valid for API version '{}'". + format(field_name, self._api_version, required_api_version)) + return False + value = dictionary_to_validate.get(field_name) + + if (optional or force_optional) and value is None: + self.log.debug("The optional field '{}' is missing. That's perfectly OK.". + format(full_field_path)) + return False + + # Certainly down from here the field is present (value is not None) + # so we should only return True from now on + + self._sanity_checks(children_validation_specs=children_validation_specs, + field_type=field_type, + full_field_path=full_field_path, + regexp=regexp, + custom_validation=custom_validation, + value=value) + + if regexp: + self._validate_regexp(full_field_path, regexp, value) + elif field_type == 'dict': + if not isinstance(value, dict): + raise GcpFieldValidationException( + "The field '{}' should be dictionary type according to " + "specification '{}' but it is '{}'". + format(full_field_path, validation_spec, value)) + if children_validation_specs is None: + self.log.debug( + "The dict field '{}' has no nested fields defined in the " + "specification '{}'. That's perfectly ok - it's content will " + "not be validated." + .format(full_field_path, validation_spec)) + else: + self._validate_dict(children_validation_specs, full_field_path, value) + elif field_type == 'union': + if not children_validation_specs: + raise GcpValidationSpecificationException( + "The union field '{}' has no nested fields " + "defined in specification '{}'. Unions should have at least one " + "nested field defined.".format(full_field_path, validation_spec)) + self._validate_union(children_validation_specs, full_field_path, + dictionary_to_validate) + elif custom_validation: + try: + custom_validation(value) + except Exception as e: + raise GcpFieldValidationException( + "Error while validating custom field '{}' specified by '{}': '{}'". + format(full_field_path, validation_spec, e)) + elif field_type is None: + self.log.debug("The type of field '{}' is not specified in '{}'. " + "Not validating its content.". + format(full_field_path, validation_spec)) + else: + raise GcpValidationSpecificationException( + "The field '{}' is of type '{}' in specification '{}'." + "This type is unknown to validation!".format( + full_field_path, field_type, validation_spec)) + return True + + def validate(self, body_to_validate): + """ + Validates if the body (dictionary) follows specification that the validator was + instantiated with. Raises ValidationSpecificationException or + ValidationFieldException in case of problems with specification or the + body not conforming to the specification respectively. + :param body_to_validate: body that must follow the specification + :type body_to_validate: dict + :return: None + """ + try: + for validation_spec in self._validation_specs: + self._validate_field(validation_spec=validation_spec, + dictionary_to_validate=body_to_validate) + except GcpFieldValidationException as e: + raise GcpFieldValidationException( + "There was an error when validating: body '{}': '{}'". + format(body_to_validate, e)) + all_field_names = [spec['name'] for spec in self._validation_specs + if spec.get('type') != 'union' and + spec.get('api_version') != self._api_version] + all_union_fields = [spec for spec in self._validation_specs + if spec.get('type') == 'union'] + for union_field in all_union_fields: + all_field_names.extend( + [nested_union_spec['name'] for nested_union_spec in union_field['fields'] + if nested_union_spec.get('type') != 'union' and + nested_union_spec.get('api_version') != self._api_version]) + for field_name in body_to_validate.keys(): + if field_name not in all_field_names: + self.log.warning( + "The field '{}' is in the body, but is not specified in the " + "validation specification '{}'. " + "This might be because you are using newer API version and " + "new field names defined for that version. Then the warning " + "can be safely ignored, or you might want to upgrade the operator" + "to the version that supports the new API version.".format( + field_name, self._validation_specs)) diff --git a/airflow/hooks/dbapi_hook.py b/airflow/hooks/dbapi_hook.py index 5b50ade34e486..bb2c20c188c0c 100644 --- a/airflow/hooks/dbapi_hook.py +++ b/airflow/hooks/dbapi_hook.py @@ -163,10 +163,11 @@ def run(self, sql, autocommit=False, parameters=None): for s in sql: if sys.version_info[0] < 3: s = s.encode('utf-8') - self.log.info(s) if parameters is not None: + self.log.info("{} with parameters {}".format(s, parameters)) cur.execute(s, parameters) else: + self.log.info(s) cur.execute(s) # If autocommit was set to False for db that supports autocommit, diff --git a/airflow/hooks/druid_hook.py b/airflow/hooks/druid_hook.py index 75111fad2e7da..a45ebf472fe68 100644 --- a/airflow/hooks/druid_hook.py +++ b/airflow/hooks/druid_hook.py @@ -68,6 +68,7 @@ def get_conn_url(self): def submit_indexing_job(self, json_index_spec): url = self.get_conn_url() + self.log.info("Druid ingestion spec: {}".format(json_index_spec)) req_index = requests.post(url, json=json_index_spec, headers=self.header) if req_index.status_code != 200: raise AirflowException('Did not get 200 when ' @@ -76,6 +77,7 @@ def submit_indexing_job(self, json_index_spec): req_json = req_index.json() # Wait until the job is completed druid_task_id = req_json['task'] + self.log.info("Druid indexing task-id: {}".format(druid_task_id)) running = True diff --git a/airflow/jobs.py b/airflow/jobs.py index da1089d690b29..3922939a868a7 100644 --- a/airflow/jobs.py +++ b/airflow/jobs.py @@ -349,10 +349,10 @@ def _launch_process(result_queue, :param file_path: the file to process :type file_path: unicode :param pickle_dags: whether to pickle the DAGs found in the file and - save them to the DB + save them to the DB :type pickle_dags: bool :param dag_id_white_list: if specified, only examine DAG ID's that are - in this list + in this list :type dag_id_white_list: list[unicode] :param thread_name: the name to use for the process that is launched :type thread_name: unicode @@ -424,6 +424,7 @@ def start(self): def terminate(self, sigkill=False): """ Terminate (and then kill) the process launched to process the file. + :param sigkill: whether to issue a SIGKILL if SIGTERM doesn't work. :type sigkill: bool """ @@ -452,6 +453,7 @@ def pid(self): def exit_code(self): """ After the process is finished, this can be called to get the return code + :return: the exit code of the process :rtype: int """ @@ -463,6 +465,7 @@ def exit_code(self): def done(self): """ Check if the process launched to process this file is done. + :return: whether the process is finished running :rtype: bool """ @@ -544,16 +547,18 @@ def __init__( :param dag_ids: if specified, only schedule tasks with these DAG IDs :type dag_ids: list[unicode] :param subdir: directory containing Python files with Airflow DAG - definitions, or a specific path to a file + definitions, or a specific path to a file :type subdir: unicode :param num_runs: The number of times to try to schedule each DAG file. - -1 for unlimited within the run_duration. + -1 for unlimited within the run_duration. + :type num_runs: int :param processor_poll_interval: The number of seconds to wait between - polls of running processors + polls of running processors + :type processor_poll_interval: int :param run_duration: how long to run (in seconds) before exiting :type run_duration: int :param do_pickle: once a DAG object is obtained by executing the Python - file, whether to serialize the DAG object to the DB + file, whether to serialize the DAG object to the DB :type do_pickle: bool """ # for BaseJob compatibility @@ -782,7 +787,7 @@ def update_import_errors(session, dagbag): def create_dag_run(self, dag, session=None): """ This method checks whether a new DagRun needs to be created - for a DAG based on scheduling interval + for a DAG based on scheduling interval. Returns DagRun if one is scheduled. Otherwise returns None. """ if dag.schedule_interval and conf.getboolean('scheduler', 'USE_JOB_SCHEDULE'): @@ -990,7 +995,7 @@ def _change_state_for_tis_without_dagrun(self, :param new_state: set TaskInstances to this state :type new_state: State :param simple_dag_bag: TaskInstances associated with DAGs in the - simple_dag_bag and with states in the old_state will be examined + simple_dag_bag and with states in the old_state will be examined :type simple_dag_bag: SimpleDagBag """ tis_changed = 0 @@ -1061,7 +1066,7 @@ def _find_executable_task_instances(self, simple_dag_bag, states, session=None): dag concurrency, executor state, and priority. :param simple_dag_bag: TaskInstances associated with DAGs in the - simple_dag_bag will be fetched from the DB and executed + simple_dag_bag will be fetched from the DB and executed :type simple_dag_bag: SimpleDagBag :param executor: the executor that runs task instances :type executor: BaseExecutor @@ -1374,7 +1379,7 @@ def _execute_task_instances(self, 3. Enqueue the TIs in the executor. :param simple_dag_bag: TaskInstances associated with DAGs in the - simple_dag_bag will be fetched from the DB and executed + simple_dag_bag will be fetched from the DB and executed :type simple_dag_bag: SimpleDagBag :param states: Execute TaskInstances in these states :type states: Tuple[State] @@ -1483,7 +1488,7 @@ def _log_file_processing_stats(self, Print out stats about how files are getting processed. :param known_file_paths: a list of file paths that may contain Airflow - DAG definitions + DAG definitions :type known_file_paths: list[unicode] :param processor_manager: manager for the file processors :type stats: DagFileProcessorManager @@ -1789,7 +1794,7 @@ def process_file(self, file_path, pickle_dags=False, session=None): :param file_path: the path to the Python file that should be executed :type file_path: unicode :param pickle_dags: whether serialize the DAGs found in the file and - save them to the db + save them to the db :type pickle_dags: bool :return: a list of SimpleDags made from the Dags found in the file :rtype: list[SimpleDag] @@ -1890,7 +1895,7 @@ def process_file(self, file_path, pickle_dags=False, session=None): @provide_session def heartbeat_callback(self, session=None): - Stats.gauge('scheduler_heartbeat', 1, 1) + Stats.incr('scheduler_heartbeat', 1, 1) class BackfillJob(BaseJob): @@ -2028,6 +2033,7 @@ def _update_counters(self, ti_status): """ Updates the counters per state of the tasks that were running. Can re-add to tasks to run in case required. + :param ti_status: the internal status of the backfill job tasks :type ti_status: BackfillJob._DagRunTaskStatus """ @@ -2072,6 +2078,7 @@ def _manage_executor_state(self, running): """ Checks if the executor agrees with the state of task instances that are running + :param running: dict of key, task to verify """ executor = self.executor @@ -2103,6 +2110,7 @@ def _get_dag_run(self, run_date, session=None): Returns a dag run for the given run date, which will be matched to an existing dag run if available or create a new dag run otherwise. If the max_active_runs limit is reached, this function will return None. + :param run_date: the execution date for the dag run :type run_date: datetime :param session: the database session object @@ -2162,6 +2170,7 @@ def _task_instances_for_dag_run(self, dag_run, session=None): """ Returns a map of task instance key to task instance object for the tasks to run in the given dag run. + :param dag_run: the dag run to get the tasks from :type dag_run: models.DagRun :param session: the database session object @@ -2227,6 +2236,7 @@ def _process_backfill_task_instances(self, Process a set of task instances from a set of dag runs. Special handling is done to account for different task instance states that could be present when running them in a backfill process. + :param ti_status: the internal status of the job :type ti_status: BackfillJob._DagRunTaskStatus :param executor: the executor to run the task instances @@ -2464,6 +2474,7 @@ def _execute_for_run_dates(self, run_dates, ti_status, executor, pickle_id, Computes the dag runs and their respective task instances for the given run dates and executes the task instances. Returns a list of execution dates of the dag runs that were executed. + :param run_dates: Execution dates for dag runs :type run_dates: list :param ti_status: internal BackfillJob status structure to tis track progress diff --git a/airflow/migrations/versions/bf00311e1990_add_index_to_taskinstance.py b/airflow/migrations/versions/bf00311e1990_add_index_to_taskinstance.py new file mode 100644 index 0000000000000..528bd53b366e5 --- /dev/null +++ b/airflow/migrations/versions/bf00311e1990_add_index_to_taskinstance.py @@ -0,0 +1,46 @@ +# +# 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. + +"""add index to taskinstance + +Revision ID: bf00311e1990 +Revises: dd25f486b8ea +Create Date: 2018-09-12 09:53:52.007433 + +""" + +from alembic import op + +# revision identifiers, used by Alembic. +revision = 'bf00311e1990' +down_revision = 'dd25f486b8ea' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_index( + 'ti_dag_date', + 'task_instance', + ['dag_id', 'execution_date'], + unique=False + ) + + +def downgrade(): + op.drop_index('ti_dag_date', table_name='task_instance') diff --git a/airflow/migrations/versions/cc1e65623dc7_add_max_tries_column_to_task_instance.py b/airflow/migrations/versions/cc1e65623dc7_add_max_tries_column_to_task_instance.py index 6155a40c81934..03195a7536d3d 100644 --- a/airflow/migrations/versions/cc1e65623dc7_add_max_tries_column_to_task_instance.py +++ b/airflow/migrations/versions/cc1e65623dc7_add_max_tries_column_to_task_instance.py @@ -29,7 +29,6 @@ import sqlalchemy as sa from airflow import settings from airflow.models import DagBag -from airflow.utils.sqlalchemy import UtcDateTime from sqlalchemy import Column, Integer, String from sqlalchemy.engine.reflection import Inspector @@ -51,7 +50,7 @@ class TaskInstance(Base): task_id = Column(String(ID_LEN), primary_key=True) dag_id = Column(String(ID_LEN), primary_key=True) - execution_date = Column(UtcDateTime, primary_key=True) + execution_date = Column(sa.DateTime, primary_key=True) max_tries = Column(Integer) try_number = Column(Integer, default=0) diff --git a/airflow/models.py b/airflow/models.py index 239a3a52638c9..e54c04b284cf6 100755 --- a/airflow/models.py +++ b/airflow/models.py @@ -887,6 +887,7 @@ class TaskInstance(Base, LoggingMixin): __table_args__ = ( Index('ti_dag_state', dag_id, state), + Index('ti_dag_date', dag_id, execution_date), Index('ti_state', state), Index('ti_state_lkp', dag_id, task_id, execution_date, state), Index('ti_pool', pool, state, priority_weight), @@ -5254,6 +5255,8 @@ def verify_integrity(self, session=None): for task in six.itervalues(dag.task_dict): if task.adhoc: continue + if task.start_date > self.execution_date and not self.is_backfill: + continue if task.task_id not in task_ids: Stats.incr( diff --git a/airflow/sensors/s3_key_sensor.py b/airflow/sensors/s3_key_sensor.py index a743ba2e0cdd3..462091ff86ca1 100644 --- a/airflow/sensors/s3_key_sensor.py +++ b/airflow/sensors/s3_key_sensor.py @@ -73,10 +73,7 @@ def __init__(self, raise AirflowException('Please provide a bucket_name') else: bucket_name = parsed_url.netloc - if parsed_url.path[0] == '/': - bucket_key = parsed_url.path[1:] - else: - bucket_key = parsed_url.path + bucket_key = parsed_url.path.lstrip('/') else: parsed_url = urlparse(bucket_key) if parsed_url.scheme != '' or parsed_url.netloc != '': @@ -97,5 +94,4 @@ def poke(self, context): if self.wildcard_match: return hook.check_for_wildcard_key(self.bucket_key, self.bucket_name) - else: - return hook.check_for_key(self.bucket_key, self.bucket_name) + return hook.check_for_key(self.bucket_key, self.bucket_name) diff --git a/airflow/sensors/sql_sensor.py b/airflow/sensors/sql_sensor.py index de46e6d3db9b8..d2ef6b36262e0 100644 --- a/airflow/sensors/sql_sensor.py +++ b/airflow/sensors/sql_sensor.py @@ -51,8 +51,4 @@ def poke(self, context): records = hook.get_records(self.sql) if not records: return False - else: - if str(records[0][0]) in ('0', '',): - return False - else: - return True + return str(records[0][0]) not in ('0', '') diff --git a/airflow/task/task_runner/base_task_runner.py b/airflow/task/task_runner/base_task_runner.py index 0b195047cb170..2a346de939e73 100644 --- a/airflow/task/task_runner/base_task_runner.py +++ b/airflow/task/task_runner/base_task_runner.py @@ -60,12 +60,6 @@ def __init__(self, local_task_job): # Always provide a copy of the configuration file settings cfg_path = tmp_configuration_copy() - # The following command should always work since the user doing chmod is the same - # as the one who just created the file. - subprocess.call( - ['chmod', '600', cfg_path], - close_fds=True - ) # Add sudo commands to change user if we need to. Needed to handle SubDagOperator # case using a SequentialExecutor. diff --git a/airflow/utils/configuration.py b/airflow/utils/configuration.py index 18a338c23f6ff..6a621d5fa9c18 100644 --- a/airflow/utils/configuration.py +++ b/airflow/utils/configuration.py @@ -26,16 +26,18 @@ from airflow import configuration as conf -def tmp_configuration_copy(): +def tmp_configuration_copy(chmod=0o600): """ Returns a path for a temporary file including a full copy of the configuration settings. :return: a path to a temporary file """ - cfg_dict = conf.as_dict(display_sensitive=True) + cfg_dict = conf.as_dict(display_sensitive=True, raw=True) temp_fd, cfg_path = mkstemp() with os.fdopen(temp_fd, 'w') as temp_file: + if chmod is not None: + os.fchmod(temp_fd, chmod) json.dump(cfg_dict, temp_file) return cfg_path diff --git a/airflow/utils/dag_processing.py b/airflow/utils/dag_processing.py index 8ddddad104ac7..8b77c796d2030 100644 --- a/airflow/utils/dag_processing.py +++ b/airflow/utils/dag_processing.py @@ -578,7 +578,7 @@ def max_runs_reached(self): if self._max_runs == -1: # Unlimited runs. return False for file_path in self._file_paths: - if self._run_count[file_path] != self._max_runs: + if self._run_count[file_path] < self._max_runs: return False if self._run_count[self._heart_beat_key] < self._max_runs: return False diff --git a/docs/code.rst b/docs/code.rst index e5a53193e62f7..764d6949ac2ec 100644 --- a/docs/code.rst +++ b/docs/code.rst @@ -251,7 +251,7 @@ Variable Description ``{{ prev_ds_nodash }}`` the previous execution date as ``YYYYMMDD`` if exists, else ``None` ``{{ next_ds }}`` the next execution date as ``YYYY-MM-DD`` if ``{{ ds }}`` is ``2016-01-01`` and ``schedule_interval`` is ``@weekly``, - ``{{ prev_ds }}`` will be ``2016-01-08`` + ``{{ next_ds }}`` will be ``2016-01-08`` ``{{ next_ds_nodash }}`` the next execution date as ``YYYYMMDD`` if exists, else ``None` ``{{ yesterday_ds }}`` yesterday's date as ``YYYY-MM-DD`` ``{{ yesterday_ds_nodash }}`` yesterday's date as ``YYYYMMDD`` diff --git a/docs/howto/manage-connections.rst b/docs/howto/manage-connections.rst index f869a08b3c061..a79fe0bc30b1e 100644 --- a/docs/howto/manage-connections.rst +++ b/docs/howto/manage-connections.rst @@ -133,3 +133,26 @@ Scopes (comma separated) Scopes are ignored when using application default credentials. See issue `AIRFLOW-2522 `_. +MySQL +~~~~~~~~~~~~~~~~~~~~~ +The MySQL connect type allows to connect with MySQL database. + +Configuring the Connection +'''''''''''''''''''''''''' +Host (required) + The host to connect to. + +Schema (optional) + Specify the schema name to be used in the database. + +Login (required) + Specify the user name to connect. + +Password (required) + Specify the password to connect. + +Extra (optional) + Specify the charset. Example: {"charset": "utf8"} + + .. note:: + If encounter UnicodeDecodeError while working with MySQL connection check the charset defined is matched to the database charset. diff --git a/docs/howto/operator.rst b/docs/howto/operator.rst index 0d973a391cc7b..549d67757049f 100644 --- a/docs/howto/operator.rst +++ b/docs/howto/operator.rst @@ -102,6 +102,62 @@ to execute a BigQuery load job. :start-after: [START howto_operator_gcs_to_bq] :end-before: [END howto_operator_gcs_to_bq] +GceInstanceStartOperator +^^^^^^^^^^^^^^^^^^^^^^^^ + +Allows to start an existing Google Compute Engine instance. + +In this example parameter values are extracted from Airflow variables. +Moreover, the ``default_args`` dict is used to pass common arguments to all operators in a single DAG. + +.. literalinclude:: ../../airflow/contrib/example_dags/example_gcp_compute.py + :language: python + :start-after: [START howto_operator_gce_args] + :end-before: [END howto_operator_gce_args] + + +Define the :class:`~airflow.contrib.operators.gcp_compute_operator +.GceInstanceStartOperator` by passing the required arguments to the constructor. + +.. literalinclude:: ../../airflow/contrib/example_dags/example_gcp_compute.py + :language: python + :dedent: 4 + :start-after: [START howto_operator_gce_start] + :end-before: [END howto_operator_gce_start] + +GceInstanceStopOperator +^^^^^^^^^^^^^^^^^^^^^^^ + +Allows to stop an existing Google Compute Engine instance. + +For parameter definition take a look at :class:`~airflow.contrib.operators.gcp_compute_operator.GceInstanceStartOperator` above. + +Define the :class:`~airflow.contrib.operators.gcp_compute_operator +.GceInstanceStopOperator` by passing the required arguments to the constructor. + +.. literalinclude:: ../../airflow/contrib/example_dags/example_gcp_compute.py + :language: python + :dedent: 4 + :start-after: [START howto_operator_gce_stop] + :end-before: [END howto_operator_gce_stop] + +GceSetMachineTypeOperator +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Allows to change the machine type for a stopped instance to the specified machine type. + +For parameter definition take a look at :class:`~airflow.contrib.operators.gcp_compute_operator.GceInstanceStartOperator` above. + +Define the :class:`~airflow.contrib.operators.gcp_compute_operator +.GceSetMachineTypeOperator` by passing the required arguments to the constructor. + +.. literalinclude:: ../../airflow/contrib/example_dags/example_gcp_compute.py + :language: python + :dedent: 4 + :start-after: [START howto_operator_gce_set_machine_type] + :end-before: [END howto_operator_gce_set_machine_type] + + GcfFunctionDeleteOperator ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/howto/set-config.rst b/docs/howto/set-config.rst index 2caf5d5eb7275..fc8d59da189ee 100644 --- a/docs/howto/set-config.rst +++ b/docs/howto/set-config.rst @@ -20,16 +20,30 @@ or by creating a corresponding environment variable: AIRFLOW__CORE__SQL_ALCHEMY_CONN=my_conn_string -You can also derive the connection string at run time by appending ``_cmd`` to the key like this: +You can also derive the connection string at run time by appending ``_cmd`` to +the key like this: .. code-block:: bash [core] sql_alchemy_conn_cmd = bash_command_to_run --But only three such configuration elements namely sql_alchemy_conn, broker_url and result_backend can be fetched as a command. The idea behind this is to not store passwords on boxes in plain text files. The order of precedence is as follows - +The following config options support this ``_cmd`` version: + +* ``sql_alchemy_conn`` in ``[core]`` section +* ``fernet_key`` in ``[core]`` section +* ``broker_url`` in ``[celery]`` section +* ``result_backend`` in ``[celery]`` section +* ``password`` in ``[atlas]`` section +* ``smtp_password`` in ``[smtp]`` section +* ``bind_password`` in ``[ldap]`` section +* ``git_password`` in ``[kubernetes]`` section + +The idea behind this is to not store passwords on boxes in plain text files. + +The order of precedence for all connfig options is as follows - 1. environment variable 2. configuration in airflow.cfg 3. command in airflow.cfg -4. default +4. Airflow's built in defaults diff --git a/docs/img/airflow.gif b/docs/img/airflow.gif index 1889b868f708aaaa9a29a3ef2613c8436b8de384..7646e37f35ed5fbe0ad3f65d612ff3aa1a1e531f 100644 GIT binary patch delta 580462 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%0D4-&*g%3WuBU!VV*B@WT@K+VI4+RxEJEl=R@+ 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⪚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%0DL-Rl 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 `l^# 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 EJJG_;$^ZZW delta 580724 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


    D!A`VHW7`Pw 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

    -md!6u-pFFq??{j72 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

    H(gCY*0>tv`jQwmXuPRA_YF6c6mlOO>O?8= zPg=?orIB;0OTQ6Ol8Up5tMnWudzS}P7VjMzU;tS)kWv#;f~;f}1?zIafHIUW6Gr%Bf!>!a)Ga8f2FJA+zMC731Y37Gc4rtzyPyWE)#-fKnPf%h%*`ce(5(uSv7p*Zaz2 zx`M6lFAc0#32e75YU z95g}@{QaO?BLK^+o-VwHe;r+7Q!wMxp_qZVdqxEMnu8*bH*sZ9D-2Sg);u)Mu_Aul zFw}}*$w_&~j57sUVen(bi9)R*a4T6Mj5s128OaRD@Z#PP0=4E~tVss5n90llFF!8K zWF0e;XNhL>9=XgWX56165NHNSz{E@LvXjXQ{uPl#qJXgzHe`MjY!Ob{$JDbjXwsUa>dDrc!cy~H3UX>$&V;hFo2(KGB>3Uph z8UEXlxRWgxKKTv>;~C8nNamoqaqxv68i<-ypLa z5Jz!~WBjao4nc*bjAxiLprpb^cAMoa^yiXy(G`C;5gh$Ef2IC^@*GXibfnG8@oYm{ z9yix$&R1RJjU%q(5&k&Jdrk7mkzK7RUwO;F40M^(9C3@zgT-YlZ^do>;$8lvG5VU! zVLaCqkK3@T-(i)*hkNN#ce>-gvDZu({_xg)MI)eK?qVk{?_JmU)e$}RldIkA(3V`< z^PN++tJUR_e|tOPW=__cC)?3=H~r!?zju}T9dUpstKc0+cw7NE-&NmPs z`NR&ssUG4?7_p@l19%p?0hf!x*VDDz{T?b%Zkq85k2T)#=-$UPQ1ona6DAmY?l$=%>yEg==k0~;#N8zRmT zf?>FQ8sz992g<`YDB+iRnisa-UPa+v)!ISrRS*=Q98MvH$wPf*g5umCAl_jbI!+m? zAtX9Z!7ZRXTp#f@Ujlk!;?SWT0wMOv!ymezf7}(J{^Ypg;s~N(E#b3u;S(aF;VB{v zHsT{Pz#K{|~Rp3bB7TxI{q8WqbiCOpHn|GO` zev|&z3Szqa+N<{#K)z<~6+3V$$8%$&nXpk{HcbF@O=gLnF*% zQZb-A9wd3;+bh)9fh~?Hgq(RLWE~n96og~1`Qw9C7$x9Z2t=2!F~BXnf@&?}<1pMw zz9WH!mo?$qqb=m<(Ij8lWKKDmP!i>3f3YNVW&WKTPGkre6i@!wPgdnnN+Le8S3^>c zF-#bHxq-!v71&iHD^8LI8Q(Teq9nRwQKH#l8AA%>z+W08m-*FLm7Hz)C13*LIsD~c z7TGN_V^A(mczIb}E>2<s<To@VT&=3cF49U>ZkmBC`Zr8&kSdAX=3)k> zdHtqbmXB~I=3)k#V>XVbB`2vdf2ZO&XG;FD=P?pnb%rB$O__Gu9CuF6bZJ1CEu(7g zWO+&sG^kePMWag5Wpq|1ZZcqoTHcPiScYLJ1AONW{f;2u+67c1;wWb^j;B1pByP=Q zjk4EFQbJ9JBa0rS06~L;^;K5o13g)JY1M~<>@Gn-kp|}Fd1J?x|*6oCR8m>k;Y=|5vratYD6HZT2<-fcp8a) zQfW!REY(*JJe&eeBXBCte{>OBcr79R%qd)(VQ1qQUt8`~VQylq_9=fdPL<85Mmd>} zodc>$7l>k}ym4VFO=qMs>0K@;v09!4oP(z!SX!Z}@e!M}E)KPN6RWb5t3q0^+Gm1E zBDV_YSiP!%;wp5asDj$+b){?LkgMeI>YxFokG%sW<0y<%<;%I9i4qMMX79~JI4kUpfm}9bjtFR)@zY1zFcB{FL)4Lkg zUeRi}uAa$8rpR(C{t4)>zQeudYuFiMzb+2Q1}r2CDlEfxREhT8GFmIe zYJkOJtj0XGv;>0iYw;y9MNwW(lL;Mwxk zn~Im5Ht1vtkkUnxv=nIT|!r6_R0P9AsT9r~jnwJ}F zt>iGA+}5A$hV1J-!#R|ekKMv8xRv0V0($u_@Cxtj_LcPh>El9!>q2VcC@&>Iu9Sr; zd72mVF68rOe^&%Z?>SKJH~#o7S;>=I-#do=Uleg;-HyX0j z>@6Cf`?+HX@S@6U7RxHm*sk8<=$Rqb(**kz$}SGR!Ifh@@LeA0?Yi(yPN$yr-WOsY zz7d-ZFOIZUa6O5zJ?YR17a0Y+l?4ZJ1~<+Icd*y0f9os4sLN7LJ(ci7@e%__;#@$eYt@Wkrik`Azes^<_(a2Nk@%VIDHGcmq7u`X_C6zl4B zk?`#*4m4bG7XMNlBjXnf@G<5h`mPp^;adaarVdxwT29tXT4wjO-&PVaGQuz>Z>TYt zf)%>$e~HnhYFz;6HZT74iEy%VVW#OWCGalpy7KOlRqvA3@7CY>*5WD8F9Qe=XZ4$c z!WB?n;Tnq=G!)q)>Zy-8F#pZw0;6c<1f)RqV0R+(i=mV8F|(BJqq<%51Itz_b*iR0 z@MwiIBTgAG`=W>iB!SiICoP&u>KWZRnRUJce;rOvc)=b}+8g5ZpuzZ*~| zA_gQSG#XA>&_w-dD$Oe61ThOUPQ>DIO@S~LO7SoaX*xcaNh*$uA(%}cu?UtW3(CV$ ze}CwCaV!r1RRj9|(o-ub=&CRsrq5-}SsHRZw$viqQ@|U!&~Rvj9>dZtJ!H83QHY*m1!X7s{K9!Br0$ zlx03cHx?^TL-D;OZkyHfIZ$^~U-#{Op}OgrP@kxmdD?S&nn_YM!!37na~QsXe{>Xk z87B&;Er|jb{^ltf=P`Vf)k$lVTO}HWS`K_Ox8gW=6pwCuF0>T$cMq?Xf$w#FhpYv2 zXle^MN9I9A1bCYfI5beW{Z@A~N{$ukkSLJUEX_96wT~r<0+Ko6MGtRdr?tGH*`q0T zAch}AK*I;#xP|pJkNfzKBj7^ze>daAI9bhj>ppI z4?9_nmvt#R&XP00i~}W@A2uN7_+CfXH}p6}0J-AWbgr_Kn-_VUD-M!p(*+n<8#fM_ zH#sea>7zD|i)q?sQDl}&xChrFgS{?>2euIBnT%W9m(%o+&n}J^nU0Hff9t)uk#jd$ zi?E&hIR2g|j-EqjpHmK?6X>A3bRIHZAYLEr>Dk{A>l3P$qf_e7Ihis?tzeHirBkJq zuXcZ$7kkyV39Tnlc6d%f#3%LkdExg#>G!nflzvCJf7haoO;Ah>1uZoK7Z@sB5p|Ha zB%hxPgcL}^>&Le z(zE^U{dWJQn={(HT0Q;ZWP+rpyS!1I8_-@R48O6ghP|HN9oc91LAe#$ z_cPoRJ!6OYsjoddf62XS(|upr{o?l*-~SRsSfFb8*ojskuihjr7JiMP*L2OOK5u2y z<2^dTzKO~H1NtM|t0)VhWM3tL{POe?PA9?_-(Dqr$+LXAbJ*`+DJ3X(0vjpTw|h&5 zE!Ow^uR{*Lv3r9$HJPpz_2;|&MiI=HW*=fb!1JZ_&sMuXf4sep6%@C)mQoJGwKwDb zr2JJ6^pqI``w!ve1B5(zf*3@ACXir?cLIkoaQF}+11{$-FmNMKAVmgcFbWL9Kw(FL z#*ATX$Uv0Hjwc(bBxq3MMT`U^Mog(vUrke_@_muU=(xSmxG2nh-TW%~;WD&yOKz)+~$B%|jR^lP+yKw5rH&Xa^QN z*fEb^oG<@k3~cb^O^iQL;!G@(amux3|qc}r9_UTZuf6_gTVUE{1Co9t}4(1+qqUYB$4j^BPW2tHh8Xd}qE-ooAJ70QTO&KQS! z7^c69V7P_7ks6doI{6A@;J^eKSnxrN-jT{6{5<>+#1KV%P9#Ajs7VlyU_;2ScQn{Y zC>LSuf9a%}9^wL_6Cv`4#~ywBvB%8h(TIT@8W{$fyq145P`i%#twbU?kE=B$ec-JT9N=Q=V_W zIfpSpUNO^@tui!k#>kq3Y0Kfd)Y73mlg#cse-_zHh^ImiHB-^@`pgs~A^y`0^qY4a zEzz&?$~4o;SK#dFy4D0GucC)q8j)9{gcJz3jfAsqMM`nRZblYuywO3DoK*=>J3o`h z*=hyakTXhp3bu@4huTx5lftai&ha`TH%K>B6=kZAEG%gcQCB*CCm3;?~=apvm=uTa5Y!nv4a?fdL7= zfwwPraXKeSF&*-lRW@<@wM~3Qu590m`o%R_)t0R{;enxz^x$HHwpJd7BXGDQh$W`j zBB3zGX=8^v{y1cnNPd&#pL3(CWsz{Zf2GD{%}rQro1y->EG}S3f-?TB7?7{my6wK3 zD4Iv2go`I%#`!bC02TC{!3XseQAIm4hVLhVeEdft8S^r)lc3P-D|tk5Xc&>6X(XjA zU7K_`je_dvofJwwXLANR@96W;k)xQ+&3478>Ye7Cymfa<(b#e`FBJe-e|NLa%g9HBAZ^McdRe3 z_1BvO-KhN{V6G#QS>pmYCsG;S2>7ekNdRUl0pI}F7qx<&%WFL&O0?27Euoa5HnYOW z0TW0R8JSCNP1y|7lBOW&jSzJve>BFE+6RS_X^>hh6p0JpB##CDvgafg!wh>k*pnNs zq+&zs8Ng~{FuY(-TF}D@1}_9dr7*C8w-ZSZaq^B3uuq99fx(5$BEP4s5NH^oAq?Fl zvbe~scS13sLlEf0g5WTS4@A$hj3^Wes>p&pVImBi_(rHnu_IJei50Opf1EAuqm9hsgFN;_Nr7Mx zQtC3x@g!2bSt3t-@he{`PpP3iKn|GxFqK1I0l}!rC;|yo5{#hnq#T&#BN8}==(h9` z9ZoP;#oVAnj3AF@773cGe@oMv{-QjSbp(J6XvyxrmNMTh{)w2zyvV4g;z9<52_v>k z-3yJ0NuiLAkPPVHX1aOD=&325v5|@QoI?;w?z4umxyAV;h%oh)(2p3oVL%7UO-gy` zo6oe9G>fvCohgrc-g)L`@+is=2}wp0;2%y}w=;YC)1ZN>NF%W+e?iY=ad8d_f)Zmo zQ=`xZpBN?SH!mZ%RR)SAe_<+AoSHP%?XOgo;)$~svQMmzM5~%(Uq^0gucW<5rb4MH zS^p+Sp(u%`NAzhDeI-;So}`;>ZKsCNYE;Z^=UY)#Q8GK?oo;${rV|or&=x|I@yWxS zH$#_7VA@x;j#Z3pe+^z8=d;rf8PuXPvn!1}s#l&CRsJ_w39K>x@)5#f#IV(2$UmvfRk{AYf(~PdFbqT`N+8R01IU;t0RiPy zBXPAO5-SK`M{eg9XD$hu&73%)oMdSb?i%&{#DE}RS#ATwO}~C~=yN2RE;K>!J6@5i zUC~m<8K$(Q)10d{L!-?~G%o|nd}f%bnayl`Go5)Rf9IZnHhmW>jh@fSO)L-NHzZXF zpG`e7{+#(Qixx=h-izXgyiU@$*mQQ&OkK$O%?;1^hJ2a*C>T0uF%BuUpLJTXRF`bk zU~ctiS?wnk-wV&QmJtJtaO+&(jK-wyGpKxxl24f_*q9}@iwkT&+7$-V2T`6yq)lyg z{u9ijf8I8|4+>UqPdit64fDh)e$fdnElI=v=vqo>l7oWhszV?agoxQVF_DwJWE1nT zvA>wDjOT#7k0a%aekRg%+Q=&3pm{{F3a`;E<=VlcBSv&?Bdji1X6H~{O(LMpEWzu- zciOp)asV#6%459|VcN}Yf*;boa#>H6u~YaofAyL?lVpKwC`4|;b+&)BvlUI>ue``~ z=qxfKVkcVBnGW2Zw5}#Ns{8G@%)5$A9ed z(mE2qMZ{t>NedWjVzG5cgpx{P)9E4NO2)t4teF?j;+MtK$*;__9=biT&K(u69Sg)f zfA^=d%=V6D)?Qg@u_uc7YNOOwgiQsG{)iEvHzqYgNA~BXy^U;NZc4ctC%f;+yoU1S zWdVO#uWb(7j6YxQCqJ_`dhEZ64*kDKA0pI8cyF=qwX>zmOJwhy4vzp`>R0d%B2qv& z3eV{NBI_W6X&&$)whsB^0RbH%=78i^f1Y9K93li>fi~EJ5_T>KD(&Dh0s*-|sw6=D zD8*uoVd(}?t|%evmWC=)@GsWH-w;Z=k|qy6&(NSl2Q`KTJ1Dx|NhUZDB0ew#y=eY) z0xB|L>OSycbfi*tkSMH4Gp0~6Gy;&a$AOgaA(+r16e2EMsV^ex93)J$8o>&Sf8=$% zFp-{+izw?seh?ypU{*$O3A?Z&zW(qWaL_|E4kF%5AWUJj@~I5%i~xls`|5Dmrcj#( zNp-GCh`^5$9Y~KLktp`#XD;Fq(a^x zGDJZVm#hDN#+7h!2`4drDzT?9e=!&}afvu_C_HglUa&rFO(;T9$QVf=RIzE^5C-Vx z9BffTR7VDHp#vG<0={sYdT@sl5A~qJ7sn77QAZf%iWu3^7*zs;M6oB7(MFhY`uvXg zoG%(HkQ%ST8tH~&q-z!z;~T><3*)g=c5zwgQAMsP9XZ1d;H>~FvR7zEe-MB$0`i3+ zrj83Siem116KwL#$Gi^rk6| zfflJIDvc5;MdTYuLMSbAf0RC{D7=y_l+m1`=;5?cOpIPCH&hXX8!gD?xT01xvS5;M6L6O=G|6lQhjr zWA5_WrZOoj^E9baC0J7+pz;|Gf+c+fG+)D9JaPE&#tm}7H-8g2e{-M=;Hor>vw(sV zIbi?`MLr;TFDZv0TdSY61p`vpv(3^rZ1_UXSS_GeF-n%=+^j z12k{u(?KItLOn!5e<##JFLWU>R6{rP`Z&}>FX}?$lSe8vP`>dYIxjA1=^a0mMO#!b zT~s_t6h>#XIAxSZZMA}Rk=!4 zR&!NTEp<|De^plnlvjThRD)GmIn-AP^;lgBSBsTdTa{RA^;w(MS*6uWla*R)G+JfV zT0?1Buhm=8b6c-8T)(w2$CX?y(p=BA0Mivt*|l!ERbAs1ThG;9<(1;<)n1beU-Q)f zv-MT?RYc&GUk7$f>D6BewmSh9Vedv^7j`=xHbWy-e?%3AVk_2SFBW4nR%17oV>{Mk zKNe&|R%Az(Wd2LmWKR}lQ&weHmStPkWnUI%V^(HomS$_#W^Wc}b5>_}mS=m`XMYxG zgH~um)=!7lXpa_YlU8Y$mT8;TX`dEqqgHCCmTIfkYOfY+vsP<4)=!7jYrht3!&Yp^ zmTb$`e{9bdZPQk5iF9q-)@|Rmyo>>E=az2k)^6{%CGl2o_m*$_mL*BTZv$6w2iI-^ zmv9gFa19r6>sE0W*Kr>gawAuAM^tVn*K)tMaW7YMH&<^nmvcWCbk){#Lzi?*7i>q@ zbW>LYD_3>B7Ij+}c4Jp|-S%~7*Kuptc5@eWe{olLdv|hq*LQ>Wc3D?=Ll<~;_jrp} zd6$=Tlb8N^>DGClS9%$jc&FET`8Im5S9{Mkd$$*FyBBuB*L%m8eA8BZ%lCAv7k$^4 zd)1eH-#2~XSANCzeCO9}>(_Mg*M9exef5`rWzK#7SAbV{fD0Ia4H$vtGl8l1di{5S ze;*im0~mt;R)Qy3ejV6?g%^V}*mpOWgB93%J@|u1SaU`Ae@&Q#Wfz50SanyJh4Z(9 zUpPKpSaNAthHn^qV_1f57>7TXhkN*Pe;9~=SBHlv32okKv0YHMx=97m_8Jk~1)r=XjKXl~Eaw1!0vl(33ein9d;&*qFTRQel9Em>&$7T6vCNp^lAN zm1p^Jav7KcS(tG-54;(b4_QQgxsiD}oNt-Dh*_Iqd5)7g=9U?hBiWS2IGQV#n`QZ$ z-4~v>8JIGmoPR``2gZQ8IB*r3f4uTwjS06Nc1{EI8Gad06x^0%+yHGw0Sd~1q8WIK z{xkO(+>bYYl?_c86o17d%7kX;fQ_2tP2sXdE}(6daJQ|ZnS!(!&zNE zn!LW60YV_GA7`w|Yp?Bssv%;ngQ=)}U!zQo`N)L@QhaQCycZ{JsT>!wZ~!Kzt18dqkJwz74{}m&Lky zgbf$lrvp20U);zye;i2O!P9=^#Bp4Ji@S4u`)+}Ii{FTUKf(y+R?W>;xWE1v%{jPn z@k@;Bfi`;ln<4;_wL851p_KAq=cfBdBAUpX8IKG7&_$sUPB8@_9JFZ;n$O|OP@0LL zyB?Ux(0!zJ6p%+~qR0Iqz46)~ss_m+r_{weS4NqM)|!>Fe*&0ZU5sOWJH-1*{G3Ms zUC3RWNATPq^!&k3J=gzy!gyrR869#Eoy--T&>zCk>%q|>UDA1k*(?3hfrQx&ESP{@ z*teV5e~U+kL4bN4NLKySTOCNAi!(|ba=;uV?%^HgecpSdb%KINScF)4cHT5Ofn@Dl-j3_uN6a3o16Vfo zo=4=Kyr7bz>!IqsR_dXl?>Sd-;XMVG9^O89?=U{KpV~*>A*Ulg z<|bsdfBga8;Tzsz4zw#G2!P3jr2OfnoZY#=HopRLdjI#g8qqaC{-7~`xQqYzDp1hKpS-I<^IBOtEjhMnC% z_?J9LfM3j)!s&-x_a8^X+{{Pzf9@|IATBUSe^Jk$L4QFQMEK^95(5UA4*C=H(3HVp z4>K}wBe7!{jjuY2yr}UZM~UwwluU7Nq)1~A%b*kpqou@;8AG~!Cy=1TgbV#OdN@qt zPzFUuK6}VTB1{G{5i*ca&|pdiOXFyLj{J-OIPHU%F^To_qG}-Cv2{j6HihGVx-sjt!3-T>kj**^b|ml)P}Oqo4>G zBV=;3QR3Lpc@Dyq@C=H^5YPOn)hL0nSDq0lxz2bYtZ9uAQX7O8LBhGC7eLE3SkH~} zhe2WwFMj-?28C*Jb8C*wIiye`yxM zIT8_9+E*#$V5Lbey`s=78VsqIF;!kUWm-L0nFDAneM$aQM+wz*)r|%XSkp*q&3RB< zULHlHKklWO-bs3P)aN}<&1KL>L8+x*p&lv3kdsgzB&DHFov0R^LOJRWq)~!)5}0OU zIg*wUaOvfdVdfwznP#GC6JAdRe<_un29av&o--+Fl%^CJCy^-+>GY>Tfl4&!ZyJ!w zn4)hvM3q-CFaSeGr0Hjtr2=8f8hGYu_^7V z{*-$vo!KtQ>r~$Q1MI28W_qtd$0qcwRVqP|q_xhn_0mJ|iS?n0Y2~}?e}M*lqf#TT z8QQRsAcrjS$P`N?NQ)PUa!{M}-ZB+q?Y-Ag%%Mg8eBpc#X?W1d8Jt7$@M!q{aJBGn_%xRK{^k3i?% zrTe-f(ayS7FLx9zOZ8+ziCy)s+L2n6F2z726KN`uYZ4e1Fhzm;f5ZJdPwnXt+mQ!V zen;n{WxPc7+^&_Su}ef+Q19E$0PYCGv2)x_W?;rqq zK!(5fV~8;*!MKB{>OkMq-a*E95R5S37F$`CKn^q(4P*ieJ%EBBZ1aleA*LtCd))&K z5<#idjydw{-|q1Bpa2HXD}MwO+(3?pE(9J#ffegv19vjR#%XGT6*R~N-;%-banLnk zyVHb{L_!9b5QQqVjrE9NlNfccWU^^u4Ob>DsTit+CrsfATSvz_+VOG+*$&fmV!-Sj zC~hU03m}(6L#9E_A9^f_&rakIoNxge?`X|K!g4wZnBpDKz|To=5`Ud{ykb5Pd5RZr zfl0-w>>0NZND_we3WrH;M3gwkIYbl~P8Q~qlU)9qe+1EpTQDgTuZWEvEg8x2oKci6 z5`-y48G>QF15XbTge-9q6-Po+k`RfULSlIiJx0ZP5BkP4m4lXlafW>A%8KxAaf@iJ zvXyv>KqJoajS3azX@3!LLnh>rm%%lXDc9UhSPtg~NFIeH!x)CDG;oVoFvOgsG)6kL zsStghV?Mc&r8m*V$kU1D9p^aBv*J0=dS>LFILqfgZRtr+4zNp-gXA#Wb3KEMMvC*h_aV4JAd4G^^++r-rVWdPZs;eY& zWGp&8$hHI)6|nXzQw#Z5gH)3?wFE`2W=Y%rP+8YU)o9g~Ko#n|;Do5R3}spe339*OG8-l*>4Os4aSR!G zU`Fb(D1To=@l%( zU*wp|L#GmS%d-AJmO{S@O5GGQa-kGD|8`o2P;~8ZkwNrvsXd4m{ z(3lx?rmbECoquAHobDk93(%*fxK~aeh;5PbH#We0`#FGdkAAW*=?X;^}9Ay4j+} z;AXN}RcdR~+SoqnLGHmc3A|dX@UE#rtcThn&j#Sx_Orw%ZdbN4fCv)V&KcjUsUE{+ zi+>*1Es!tE#)Uiu<9QVDL7tHbM&gMh)}xdMIf5ryfe#u_(eA9-=xC9sMadlr@-x@u zY@9!YsM7Wap2(}Qc|CQW#F@Dt6Hz2CIe!DK&JalZ*{NfEU^nb*Y zQt9t?`qZ!9_7>hXy}FP3?~9~D+SPuN-mQ7gA5TONNx|L3JA6Mfq~>(dpwCre1b%J~ z-))g1Q2~7;A$<(cc}C`Zu7-V-qJE3^da-AIxzcleM1Hb266hx>q_=*2VSot8X&NDa zF5!EuLu&u>5J3|>SJ8h5ffI8QI)6-4e_xS#2H}CPG9Y>8Aak*T{`XG+czHlbN3UZb zc~BPjKu^zSe_bbB%mH@(qOgPxQx8t4ccpeoL}-L67bTRy1&V_un8twFgMznrdpYqG zITl+*c5VV;dGIA7V@QU<0v2(lZ`LAya%gcmrfNE zC-H@z;V5dMfN;l$T}XFCb$8e24}(~U8Q}(vIDw!?fF2Y@9ifQMCQbrDRc`o(InhsR zkryJ8gF(0#u;vfvKm-}V1vU|GKUiq00%yasR`B-_A#iBnmu?{V8uVfeIAdudArI++ zU{wf)b)|>mw}=ZNjkwf!3c(hMK8bT zBFC7F5@C+afsT1G{)@G!ZglZAP8E%g(sV3Fayt=xQ#2Cy@CwR-E3t@=;CNKl$Bnw! zVdn^D#8))y$cgP(jQ$ai8DVMk7-JNP7YvCN`bZ_xGmWEo4*ih_hJVpb$TojzL6G}G zh)EG4(Ue*r_KhSdF=3U4?;w-m^NK=gBt2DOp^*fl;4K`t5P|qg19)k?fr?mSlp}(a zS!ic8B{$ayhVQsI$mfuIm}~Z!aifMd4X=8CjB8~n84OtmTJ12f! z=V-{pG*4MT-~urs0e@euH-b|_muGVlOG!nQxR*s!2DbHwl~^fo=@n5In2b1XU8xbE zcw0X>5`&0xL;eXX2$u<=u_tvUZtHS7g3uwifG1@z3=Ax6@17B%riEmkId-8>+8JUt9AEnue#E6l=7Jp5w>6)-9FdBiI)XAB) zSvRlZIJ=o>*2zxT8GI5!nj^w~a%P#u=_uo23hXot=|Ks%&}3e5b6yc?;{t2yxh2w> zgm+n;WOto0k)5|mj(+)_j}xA{$(yQapiq&WUh$u$q8IH+jZp(%k=B>v!G8JH6+Z$! zPXSf_8J&Z7fPcm?pENNHG)SD#6PhyG7l6hyCDCxs314{$L|vknW(gI<$2D0v8#zD; z#&8aP^%VY~IAP!eOt0{yuW$<;k{HQ3plOH~YO$GPQH=`Wq);lQw?L%=lytrFcE*#I zX(^YbL8L~Cq&FsdfGCbm^9~*)2n_|Luh1bcDldsxrGLapio@t++Ek=RN?3_mk+oB& zcM7F?`j~L)oOon*KKBmwAd0|eTTP0mQ97ln2vzdnG)a^ZtuWGBj8LZyPI<_jS29c}VWSM3ut<;){*ZK}HkOG$H zBuP}KU&VM8jK!=juXsR1=t&G{AB+IYyLaH>2 zc_RT0&h;Eck(jMEr#CtCFlln@eWiH3m+exR9U zb?3C05w%;nYHJCYTSXHgHZWU9VM6%P1ynSh_x7k7!rY;7lwkBGKl zd4H(clXn{kKa>!+j!HbZ^)pZ5e4l7NOWRtDH*Q*s7+jkd73Pf0#+`Zu1qQ;bG}}{n z{vrW=hGLZatFx++Omm3c`LHE<6Gu0D=ku+VnLF-btf$i%coId!!;J<}yYM5nQsR8v zGkd*@IhVB^p}R#KHFuut62wcQ#;dJAYJa+En~{3qg0r`+C#hS>n>&AFea5O=wkx)d zb2ivmcO9{%rv|o3w78s$Y@fTltJYP~Taji7z2J(vdqKS;VZFoHxqUV~i(9Nsrn@jA zwoLM^BAY#D^czfxvLc}>5R1Hh_OcpL6TLEj=3BEEd>5}n36#)-^>7-gp&3LKL4Rst ztXJWf0%5``Q3h|@go4Y#9t^DLg@?N`B|owvv%wK>MlS|KK2=J!^s7xdh9^q4!~Wvc zJ;#}JQgUK1*0uRJFlx#XW>~`<0hwvC8&R}$MplOc^SN_-5HuAe>d9t!>z7h|WK^7l zl!#@X$Hhl+vg=~Sf>)1`XAs028-HP(o@>UcM$ASDd>5zllv1KJc#>zQ;}aP?gZh&l zUhywaxf_-HzAP2dtV`33${AzLWKru;2ubU}<1X-@=c2On5m(pzjBZ;XGEaaL7BMOFS z$9M+Q)a1lg>P4c^N|n4#NP27yqDMKP(_NFq8Z=C=5J|gnOjTO8fpfMmjY%@Cw%0d^ z^Yjks;VYecN!0xRg@3 zjMUXl{SA6FC-D?ZW-V}qX4FUx%*GrOkc3NM)^rG_BSCz5KjT40U<{i6nx|iu2h)UX zkR{2urWb>G$>_S8nH?Klw?B|%4Bv>+@B2~Epf01MBS8QS^59X@ksbp`+qR9{@_QZi zkV;^C75e5y!w}r_5q~kW!P)146UpX@YlhiEyV;$MI-`4G!Y11BOxhJ|+M3$19Ox33 zE!}vU6!DY^AVmqvfm*tqV6}bQBLdz_gE7R-5K^)c;^f$AgQSsLj^*wqfk>9c= zFd1dx89~Vb&H$G^;edXp61jdw-s)etGIV^h2C(6I59e{1b*U zo;S_=F!Vh_&2l!~@nwAT>#b@?Hqq;;c-`=v>E%wVyk>pMp8nwZX_nmi?A(!#)6O(E z5^0dmMcK|Y+b&&2Vm%BYG!pYcP_5@Rum z2=os40XIz_7;2%6MIU%LiCif{1W}U-QV$?wzkiG{Poq~uv08F*h{f?3{4=sS!LMQ} z{;~97me!%I7X#9Bq=CDCHNTSbS*p#7Hy<^z?eb&|Cz1YNGaVrhbzTPaqGkD-`K;sj zzzF!Iy7#+IE>bW0o_C0YpBIIH7l&W);}Pb|?iHkebg$9~DC1+*UirF8nMSn5-ZBhm zPJf8x^$v9o1E{a}W=Sicuk>Eg`q*vm&tJ8#uNSdjx)4tL%YXa1KX;Tr_vG~qjGqLy z!TA?4{1-5)xKAFV8mYD4nPJ&M=->VZU$cPr9l%irJ?O6*!38c;hX5f;0|SB#LfrC~ zFrmPL1`#Us*GNLc9L69viqJ3uM2;O58h^9M@g1~h=M<8B=T9EAdj8(MYYC0uD~|U_ zK1=CQ=T4pp-(6rpvmVKBJ8eG0*;DD!q)MIg99i=IWYeb!&mk?U^BYo=Rh4d)>eXx1 zuKrMp-3hiVTAm(MV;%!ECE2F-VFRmh+LJMMTC+TxCz(RL0UTlQ?ZT*nfPOmec*(>!78 zbRD}lZQ{kN2Df@Rb3(AJIS%&-z2oSPSD`Ieio9nK1{y3UG(vC~@jN-qpGTjg%+H|4 z-M`lhE&Y5LAqk6uF&}*o=kRH3_kT~J^7K2ei~!#Q@IVC@WUxWt>~k*2oN_Nx; zwHu!r@x2#;l<}S+#VT@1C!Zv)NhqhJk}oN%#4^k5IMlMs2ff_uN|#dDQGbHG9DHY@ z9>HX@P2%=p|JM-jI!ae(>@Xs#iq@;&|7`Q+XB_+(m2rdDIG*Uq$ zoo!M|FD=eeOg9BhQ%*k>%u`S^eN@s?M@2PNIZsuU)K*`ukX2Y`4O3QHZ}m!4Ttl@r zPhEEfcGh2mg=kn}Q8o5hPJfeC7E@-MZL3#2pM|zsU!}FyDQdIrb6alf^!D30!{wG- zJ+T!xU1!l%mm_oA_3~YKv6OdSD(h_)U;aPYwYT3k^+lFne>VkqU>gfI*h7SYU3kHU z6Nb1_f#H2P;tMObc-4$w#aP&h!R&Zrk*yBynk}bFULG{%{S+~bI(5qJ@m1qmZx;nPe(m<)mLY|b=O~qJ$Bh= zr@eODZ^u1%-FN5Rc941pK6v4WFa7>^;*Uo@dF7W+-gxGphdz4gnRkAA>#xT?d)KSi zzI*Ri=l*-#Nf*C-^Up^={oKP>zkS@g-E*~4$+7Lyx|d**t;SwF?dZB zUk;r(MJm28iGNib9u%=?L@jQShh6ld4#5~k*^M!KQY2#%jPy$_lzu&+k$>`ZW^pPE(q?{%^R!m;g;DHAkAqhpO|LBwVOPSr^WXzH_4uO`S(+7t&@9 zwR9yt=}t|z(w6cRpD_LB>t>qIMt(yS{sd`I*MEsRW8~DWIj!eJi`vYiMsuN=fQIT0 z+Dw8n@`1I~ULJ}mzIPm|I}$zOj|w7+U2kFZ+tUqW zB7Y5$z)p<|qvW2>voQ)S39p#h+}8HFFp4hfR9o89)^5A2W32`d%evRXD7L7ZZ9{h1 zy4&V>MSz<+H~z%P2ytCej9wwT9xxyRc|F}Nj$4or0GO@Q)oei`VBOCaB)g~k z?&@Y++t@`ob>SWF>dM=Y^PVof1z9ia+JCE&_nI!g1tD(h>Ih z7D+jfC}tB(kOiOa9QiFs9#FSjHSU*|O?}u~^!%_OYxpg^a#@I#CeVv3~@S zK#Ws2=kB&M1SmG_eoNP96aAS1Gh!X14dQ4>%Y)4RH8Y?M9911fAkz#mQ<@6`12!|j z&C)&Hr9FLSMa%v}&5thisZVF;I1if6v!gYh^&C4%hrrQ+Hu0z(?FK_5x*)CYHKnKg zYEq*Zn(rtzj3~^y+5We<1-SqbMt_aiF?agYXf7SIW39SevyRZTtuvf;{pdZLF4+YE zcIo1qpMns3b?-RzlN0T3KX03L;&yiF(hCC{Gr-G{?l+(X4Fx2%mZ+)rHmgeqZDY6D zbgKSzsL2@S+$kA*S{C1&BY@>8a>oeF19|Ye-0mzQIg`~p5*K*+juk_i%zqIuXP!YV zXsjBx*3LETv|VaapQG*_nGl4d5B|Es66B}f__Mu%e(TjSy1=EgGo+i&fS*1?v#mDz zp}PL{a1%uS=JGg)woUzSv-2|T7PoXpa9%o{$2*!yjQPxK&dZzUT;W$Gx`W#pblCM= z@XkfL(pkRsr$@bXWR}1`hkpSS3CwrVCIWEQXD;@~lbwV-Hs|CCVv4H*B@^#BN9t1_ zJ7Xx=z!c~DRsTFxn73UXG~adK>Hc?l7+&4?Cj9Gse`mxey&y|BDCc|c__%{w@|3r{ zJglDiT{FJ(GXWpyODB2;kRBRxSM)RToeAJOUG@aA_eh|z{`G%@JAV-Xd-3pYd)%{I z9*VuXJj!crSKI#WYu`ARlOHs?3S&5odwT{0oU(UFKx3G)Zvcr+E1mxOIer2OsB*3b zoU(KH{+(9CI!3$&^Xo$cV1c~Tt9mkTo(~&`A z072AAz;;VH(`msTyni^5kf@bYogK76OLIUUgF)7T9}%QM9(0`_>?{qu9SBsw0CJvl z01D)jhyJoQ#VRp*n6T1uGVEeIs%xDz1TA|SFoFO>b2B@V0*Xo#H8xBghKqnCdcSLG zJqF-{Ya_mBszcKuG{|Z?@e;x>9Ir(zC@(ZPULr#mLpM|_9e+s#Lov*&N;I7_lm|CF zJk@!%OLQGk{5{k8hB%x=*deq*RK+{wB|9U%Pb7#+;zK|5FF-uR?Mp@UA_(#`9SNRWuJ9D;`MXow4lzdSfI-6|2Odj~t?u{?mLIZG~v zqcODGu@8J5FN^?U>c}#@J(Kh=lq{YI2(;O{fHOnCiGOngpbUZ=G6tUfhS>@xP&0-G zGlF-(2nEB(jf4@8jK-k&upT=dQ!p(5vPnwVF(`P*c4A3*129U6!xQN&GP#9UmpZ%8qO`?qI1nbTgbRwEGK7L8G{~d`s$jg{+}`Ld(Javo=W#HRwd0 z5*ba%yts^rN6!RJV9d_aB(u|u%|DAr-*ipbL4Qrv)JC+c&4F|sLeouldk4qjO?eoG zTj)XIOeo@%M^kLhR#Z-b+d1a~3ex%!3D`i&lfe4YfIfrE`m(#?xdk`!P5`w2#qiv; z@hqP5TuswKPvBHf4{cA{JP+GsIr&7L-FylAl&JjNPg&%%?qbfSOU|H_#|dQ*d(=*X z1b?+}qRzZh(bHkk&wEEq?7i=FF>C8D9Gg*ev(D4OPKjJ1?h%AIyZ~X8haw$Dn54U| z)GgHEN)l7dzVt9G{UB&~NgfNUvV^XQb2RnxMIfm>Nz@1`y-FZCwffux)!m9#G$kfz=5QNfW zfU+#j)k(QXjgd*+QY0DGg1fa)?T&By%u-b_>H-q0;vP3`2-K2Q1{l>O{hg#tGxdtEqawedp!q2qp%;D)LOMRe^pHX+9z|Jx^2BX zA*5E*vDUmo*v=XVh3zbIwWn`o4{-%3i&dS7jZbvFJ#|GrpcvI#XoN<{gku!Qcr`zL zMIC;{S9$Zt(t(DFAg%DC1SrUXB!3WuO%vEnOT$-aJ-BRAc`yb_Xaq_iIcP+?hAo|k zZPjd@*o|#ZQf*g_<<_btQuu5gmE1In^D;>+*^^D#)`3^HYS|tw9sZb|Ez;^O-mKX> zGcAoXohr+#pT$p*1zW_TxO+v?X?0hqWw_|nImRN`(*f9}Wyty45zg{hd4FIn{=3wA z3$`7})E(i}(rK`Q_#ido0%PF7MSU-3r6*%pRN_;!9za1;(5&4$Hw`ca4zw}GGKNIi-hZz$D z-;KGl6GYH8U2CLN|7ry7J%7YNG&N`_DIM7-M!SI6HHJTfMQ$>MSHLaY)m_Dkfb9L< zf)FM<^)EM|gidW$((+vI72VRwFKs#p;qtOuxCO_8T~o*__I3VW_zmCxr36*&U1-?e zg*6@gr3Bx#vu4F#{WZz{O|S?6;Bye(Z(v>UWx7Lw0?@sMeETVm9DhVYn^5uL9*H6| z@#53_d|Y9z!0-rxk#$$$)gmZ&B++AH$mi~wR6T~V$jV%3>qNyJ)nj7J2fV<&#n9B#9GD~Pj8 z!f$=oZuMgD%quSLtbc8U;mVAW5-Vc^lSDw~ze+w`8R@|u_CYvq(V6ArIjq$pHV7)F zol%a$Db10+h zWQUWeU)G;9Cd51zBF~(N3vk~3wZF%8S@X>U^rZy#HQFHKW`A#{U=Fn4aHM7tW`GaE zEk>NUZe`|aRJZSAk%FpKFVo=>6+sQc|_&AiFmHljjLN5@R~I zQ`6ykTIh-;zI86B9Sz@B+uQz&J$^H_zD+@DgdOfkKQ;q9#X31Vh1S?fIf|BO(pnK& zn^FR;G>`5qPJcvcXtGm`7FiDtS%W>DBe@0GD`|o_Y0XM$fu?6^bR9vwB)oSeO{%~cTG^DVzmE&8!J&Y`!w$4y! zaM@?3Spy`{Q}tJ@4(svyAFCEtejehjMqHov>T?3?t$!73*CFeDO4dg+tSAn!y}U}u zlIy(AD-}dRY6CQ==CLv;g8^eF8EhzfJG*Sr%xt)pu+FYV2GGaaE;Q0!DmG0WNo;MNersUVq%~CW6y}S!@PXW4^q#Q!{*IG?XM0yL$&tB((509Vqyqqs6lFf~-KSwKRk* z#TqGkeFj(dF^dhtn7m!1YwvULZ}1H8T^nQmWBxSkj@ua_G(2=hx7Kaqv+vWvZ%R#R zKAw?;?5t@Lg+L6}?#|uX>N*>?5LgXB_=aB zJM7*&4EA%u0nhDFPN=P5KiwcVQQb}eEc2+Eh_&uk?ilE~?$~)&WC)eO!)0Z?PGd6p za(_0ipDibdE;sb7o;Gk^0mU)fX!LpMkB9yG~deO(w*^xRaPXSnm>hAcfl zLbbK6(>14XY%%T?^79To?c`m~!qpR(t4RLi@|kP&zBct_mUL6p^!2m!%Et6IKXYQ| zbUF8J4FGi=u_{t`*Rw@+MHW6*&r{X4W`FE^olXxf^G4Ft3H9cVCe4aBK<9C2{-YZT zM=OIN_2VV-{x1=qI1;D#+avKEf97`2gLjuAY2pG{g)HG#a~>s#3qW{;Uo1isV@ln! z0(Tv;O&xtruY_0l(;_sRL~X1CSvJpjLTq^M9$t zbt$zIL})_gIlfQY=F@?u5!2C2hr9Ita^>2vuWs(!=-YEFuLp|wv+IHfb8C0>RR1rL zFJ7Uu`@IHhE)7VYvU)Uoj)xJ&hjd>@ z{MdDtgOQOn8_g~Na&_^B4*FKIe6Fh}{y&8xc4|i2;{W#ZTK7ac*I)5FG`WB;(meSgA+_nJB7YgUnduXwMtK}xf*g4AokWTjL8lI{I&8Es z&#hOlGA%4~%i_eB8roVNiB;y`fssE>Cg{c^jIIL>GeE4EamL3o34c5MW|^tdl6hi} ztteY5#Iyt9Mr4`0B=3fq2L`6>5N}Dn3;FszXk1?LlB`D`PQ19W>dhWI4}SgAxmnJX zKQ9dJkT(?R-qo)p=$d5CrTzqG+n)Ii<3cFs=;nMT)5uqf-7*^kjlA;CdlEbs-EpE3 zq#Q+kT?8Ir6js)rJb$E_c3o9s}kPgdTe$4m90B?`ag@ZS~1? zpGW%nmcw3x7-pkPD5}U3Z!VUEoI?;Y=i5jN2~yH;=Y3@tl~r1KC6;$N$dm*`JxP;b znkkhMh9!|{q*rH2rCFCB`ST{6amooNk~=YwLnFgLBjZC;I)C&`1SHW%i7AB^`buKZ zMET-+K-slZCM?kh&7g)Jn&_fl)i;|2@@3^*rkT?CX-G}tsVAQ>g87cB@_h5nIlKw- zilwF`w&iz01y>t1t-Ai@sGXQ#(S9X?E6+|bwHV%6@^W==x{Q|DT$s?}+toV;QAEjD zYBC^iNqjm4QKX}O3Sv?~(lnX11m%S5TYg$hkwEXptL1HtwOe7oAJ4n7!S?=(tFNE- zE7ZyZ1-u-=B>{S8NzgQQ<9cZ}OxwfH5d=+>7u>?qIe&Xfy3o-q@o2Cp@1&5Tab&)n z@497-T#$wEj)ZWC^hTxfzex8yV%IR2EzisYvvhL~Iq%Gp!YwWIv&0xd>=4ll8Lieg z&^&|GXA%?Cb_6y4&qQ9+K4A^g)&!a2Q4ii`+}p+xV0ZMZ>8S2uJL}v|5P#Dp7dL--I3<(_JyY_=1-c6qOMj9@U!t&?&a_LNDA9$ZO=bem$k$#4+PxZN(1RzO}5grqK*mD?7Gy+d~daX=anIZ!s^`M0`!hd;M zMA;bm$F@SYP&o#5BW8HFkb#N`pl{6FQYNBJwoUD%HN8c%&K61}1rmk>;UXbRH&OE|s&xXHto%!2F<0qz5*TrWB^{(G6YP7)qHyFbKQk8TMF0 z9+4*TdHX?Vm^2h4t}F$wl+mm6Jby?K2txHw1Pe4jjd60*DC7J6h?RwBa<@GRoHHP+FJCn$~PaY6$mtke*K*0_~ zIoJM_TtOfE%jZqDB$XY=Wl!c4%~FZ8TRqZe-zr*%ly-4 zv|T3+mMchU>svRHOkqOyt3G)lTAMdD-U?+QP~|Fq^XoX#NUw#@I3sL)`iv4<1f+Cr zB}t`t-KCbar=E(;E&BVXcHS;`CIad+P&7*fQ=}2b5Ji(#LeU&xn4&T9XL}5y0a2JD zz543#t4PCufsVMuYm$~iY=1;i37Fy>#z;aX_hV7rV3d3pK1YTQwLm0sK7N`6@e_nZlLm$aLYS;+y_~K@#?0?{MU%=k z&H!Hc*TL5G89QCcU0Rp{md13`?#XFrcv@&MU3GJF=rU8w!yIPyrxmm0Ti%7T2$^`&D=9B!*cOp^{;j$Q z-bwGK(w8o{t46}YTG6U4y}pI9^)2b4OBzWKOx&J^0dFAY;D6rvj*XL{{0%8XGU`#T zBqZN#WoTge9Y?1`(sMvz+to=WYT747qY{*FnEfS!tyo8~f*+u@F~l}>Puo8tSR4cG z98)7o1O}QZxEGlu=g2!za!@yQ3kF3mQC!+z((ssGhLJD%t(dh8FT}q@my$HjsI&u? z$bY0EFj_ps%YPfms2J7qAHn?D*v|Um`b2s}iOD;j#=S3izq{g3RF!$g@p@cs?P9pabX z_@o}mj;0wTTT5gyVgL;uN7rK;8uY;MmPcx;(?*Ekp>s0(l4q zCA3`-0Ds#ty@=~^L0?HgJ?)MR8N=UA+50g7B{*Kebd-2!Bn!bXy&I%M}J9C60t8!b=-ciPGs^ zxiBDTEmfBBUia zz<(pk1U7y|5O~YR@uEX`V@Ea8ifG~mnASP=n;gCcL?Tgxz~lE(20MC$A`a5jR3pPx zNj^#+DEdS{p2a@~rMy zgE|T$Ql3!06y#oLO-tk*7o?z1A!0k01bgRr7snxV-Cb{@{Mg~r*VSkGgt&z{>Djk(hmbbOh2a73AsTI z#HW1DXAYDBb6qEXa?ZxlCw&U!=YM1Z4Dcs?c4vM<)8_CXdy@Cj;WbqD3PA2nto=Pt|@7@X@f?oJEf^iG(rxT-316j zb>^2FSel#u>6XGNpeiMu4yvKzm!KZ1q7LbzHfqros{W($V4~uuoK9+_UMi;6g{5XH zxXE9cYJaMzo+_apX{DyBs=jKZZYr!I>8#c&t=j6V$||m^sjlv- zm-=X{`l_&EYOm(1s}8H77Avv_>ai~CnkuWaLMu`RtFubMRawT3IYGHbeq>beqZv$pG!mMgqgsJzx{z2?`s&a1x4=zqOBYQOI5guW}l z3hBQNESU=Ix)!W6<*UIqEQBiTp+c;~vMIt&?1xIM#qJ=+g6hV44#Q?F$Wm;>c5KK# zYRQTz$)4;prL4QMYLv39$^tCRn(55O?5f&qlh*z$&N^ttqN~nYNvp1m&<-up7Ol}9 zEz%~f(k?C2Hm%b>Eq~NTt<+8})mE+5UM<#Ut=4WW*LJPfel6IBt=Nt&*_N%@o-Nv@ zt=g_F+qSLSzAfA~ZP3Oo-PWz$-Ywqdt={e}-}bHF{w?4JuHX(X;TEpp9xmc0ZL7*D z<2J72J}%@&uH;TG~>3^1PSeh>CrmpI)E?9B} z>%K1R#xCi)uI$!s?b5F8jxO%zF7NiP@BS|EN-5|DFYz|+?iMfdCNJt9uktpp^I|UZ zKCkpnuj589^<)4a8*=O-^7EcU{uyY125`YWkgzG_zy)Z)FmP@oKmjE@Fd$2D z^bSKK;}Gb*bxE9XHr zvlA@KgDi_PExUm&pC>NsGB3|bJ=_8{1M}Dkvwt8E^PDI%GB=?)i@JJcFav#a5Shv$eEcJQX zo<}}IoXFVawbMDkfZJt)oZP4`Q5as=G@Uf!^L()}__YKK@K?8!R&zC9cs2L2(^;c+ zSx0GO-%eUvbvv=O6uLE>+=5_#@m$ySU4JJYU$fI*$I0Bi1VNMCX2;1p5CKuFQw_(- zR=b@kDE9R+c1Dmj1I#vL-!?g~CuOsfWp5&8zlmnQ#9&icXX~9^$H{27Q**xwT$hJJ z8+K~H30z!`f4n+QpH9KKM1bjnKV>K3=H|a*T>_S8iP=X+kFporlD1W2( zdHSK{HpOpuE>YWYoFEiMJKd`*#EYIM%TfimUkZkoTJmc!4i;f0Is%2RNL_ zxJMXxoH)2PFL;A%`0YUWh=V1Chkv-0PPa>3z&2LIhHs^Z!%2yQ28ny5iNi^i0=Y)p zxQj;=mP5Hmymxl{LyO~hjDyCE&xwyK_)G;kPds>eNVuFFxrHmaM=<$bOthSE_?-fp zlv_EK12>?@`I~G83|#mALF6<Sg`{b-H~V}uceu6Mw49R@q8dw(RidufDwpxFAG;QDlrIjsAGtP^^z-+GWe`zaIq?KFFv z3;V!(gs=1av2UZYH=)4;HM9%)-+?>3QxtgHPPT75p?kZzlR3Jx)3={H)4WL_iNZZp zJGHkHyt8{hy7tDu{)zNNK)yTio9uhPM>v_+JHXqO!1KDovy;Kk7=J$}ypS_{!zcT) zze&VDd$hkv#lOiGHHM%c1jp;V#}^36kGsf!ytqg6H`IGIL&M)a_3gC0yu0>2yb9Y> zi+Gc}=E4ci&pKtN-NI}4UTiuHe|qXh??J&<&Bw_-2&SHcG~r*nYIB9&ze%dgDP1nU z;lmck!Of7j);uX^lLCoR{0oS;69mvUX|{+q}?g$X7-*TdmAE?q*ybALynpoF&YWQ48HE^_&(^e9*cViiJN>MyC+qdglwEIE>5*R3uu@kLhHE$l(NmK7z!$5;FC0f&{W42^P8gvR(>O!hkv1ie*obxKot$*Hz_0-hVU`<4i#_rDf;Op+}cKefn>l z=bk-#M}6TpW6z5B^bY>*`0YKhYv*oV;kP6}FWmAdNcP1DncPGkn5SlhJZYyAdgp?^m0GQ8WXanA{mmBN|c^42*>_*+zTfdDH|rpFrQQ?N(QE^vbYNE zyD&QbXij3zjfCo!&O8vPsTa>olRkp-f6}8)iOpO3lW1mac)pg&AHPl&yt@WZ? zyMNrQFv8%)30ULu3b$a-a`Q)7OAl5E*@P^TKscccs`k~K02_{h96TBpr%4S0S6qLz zh3(waKvfr79#2g*-jwHswq98imULf_PVyI~`5I({uja1le>el{dNT4FP8cCoMt7l%Ipg0XOnwmzCxw3n*95O-leEiJE zB7iVVvffz^vIw}GDRi1poZR(;4WB%5tY5#iSjdvg4>An`KkA(jGhS@-z95|XD1R&m ziv4uH3Z0yD7$Ae&AKiiCo%Z6}tlesl7H3Q$;eq1(`pX@kJaXuuf=pMzBxd`fAo5K+ z?MYo;D8J@TqBXA07OKY}uqky9gQ&_m{#zH$YG#?FC}|{_?fIqtNeY1G%3{VAwy0@J~+| z6j;avSi|QS5Nx=j)vD^|5eGiyB7Jk80AE0$zYzNZEe(RucpltN(L}fqD~9bMnSeqM zpdg3^sSs*CTgmLcRw^^HTPIkXuA6|zLAI1zt@ zP^6s{FS5amX_175OiUIPV#SRBav-jnmO)l%Mi=%3dLP^#LEdP?MfOW$EBnbU+JZUx zt&)|jTpNofrx!oE&q}vroI-4g7&uPOdj5bVPzYzi#c%-{?+{RLR#FvHyaO5#O3Y&Z zf}ovO3@Ib&)4(m52|WhD?HRW)ND_aB@rsGv5hav3$2oGu7idb8nwKGvAR2LtOJ(8} z27;vomiY`CeK36t2!S9>k-iWN;~mGjh#=0nn6(VEn8zFpf*f>CSgyq^UiwBs>k|@F zL!$+?n8CjqLnpV!wg8rCTr*7jaxfwBjBLUlcf-@35I>xV#nPmYx{#Lad z0c9=d$(qlC!XLTfGGoPBi)4SxWw4YOl}iAE7a9G*S)>$9ukkxrcGcJ zdji;c2zEM!?c;0rnAo$(#H^w;q*KKN*_&WiYn8W>b8IK)Opsz+5bl%rmlKf!F^LxROe>fWVGLHUMkau6)wA|$Tc>Qr)!aQ;9B4T)cZ ziQJ7hrsIh)@gkLK%cg&jY+qQuCVhg6tC6PM!^l8S12M)Rf&jc6is;UX$NA54>`NTz zFxYee7K{;=8iaA)HZffGa%2isDQqze1`9!Rxrl=xIroJDVa6>R{frU|!qQG{UdWr{ z91$evSRp%>E>4VkJ`7!iV@u71>G&n#_0-iP%6rXtyVPADK3ad#v>WV@h0Iq-(XG{Q zy$BTYU^)hf4<|oSRbjVFnC8?YJDUnNUhq500PE!&&$tUDmyK!-PgOiaI`yh$EnJ*z zGQ81|_Fs+|9a_&08cFhTeZb~xiUsA^v{VVPpJD6_3;Uu^ErT1HbgTYmKU>-E9Bhyo z0Oya9x;xfBBu;-$D{XEMu(sGn_@SXQ?vRwbD(AkKN7SwDc2n`)#jfPMk^K$9&_*E! zjmf^aQ9J$>Vkp+X$x~l*of9C@yw)#>udeF^i@Z;wr09E3;Q} zeASDdn3H%iDyv~24vo?>IqCW5&$a11SZEc%u*L`UWGrtl2Z$P8+-_ABcpdtO~SDuRpjr>Ds zoQWi<5*kGLH3m;YX?l}4$!q_{MvccpO!u3G$bWda5q%WmzfU*z=Wbseu2aOP+n`VS zsPBhjE!Fa+0Hf~!aRN|yjYclu70y8vngm=h#QcBO?IzMMexMCk)Gy>z%m`*`AQt2F z1_J)dM*bEedzNnC-eUh|qyKj6|2FWzn$OilBKr)m`W(&%cToEr&?6vFAtaCjEs!QK za91=?+d9zw*e?X#P0+w&u>edVR8ZwksEKOj)h}@<;_04H3^kj^o_NC=P!k7Lj8lKx!2ajXi!sdVFGyILH_Q=BP5! zdn_+FoFhlZFb#u`;Ld>vXo3rLL)vl%0N2G;)X#uAYq6Y!9A{DJAR`3w#TX99tq9^9 zCPsG{FTfbDuukg(l#Up_NBo|L4amyc-&m>L7btuUsp=)S3kJ>6tCc#l5;)}uN zF1RkkzO*qcUCDv~&OVYr6t=}3Q=)$rVa*jW4i=~JRmu`2&eFv=Wp8dtAP+7hfkG4n zQW6so0YQ>QlI?Z2NiT0sF!W0S1yUeQF*2Y5FICauU??uiuAe5yE$J-42<#buP!};o zGCiazfzk7H12Z9`48{u?!;L-kay2>=Fvg27Yl8k6Zwm!q(doo;8*xJX>_dN5PAlQC zO)vyuN^ape%3v5&B9~yyB7ZVpn6t}v=^|iYF=yysoO3VxjVV8ngY?oCJxf*8EjS@g z`24{)PX!3C54IG7IE@oImD6ZyLOOl&{-ASrf`xjj^E!}(3vNL+^a#}ot2;@uG^Mg9 zzRowy2odGc_qwn*nFBa+OE`bK#XUy~K9>_evr|3glXdcwCiZjn`tv^xNkB1(K#iyK zq!PvKLl96%mAeUQMrs%|V;Dk$MoeKxUxE^DVa|5*NUNi++6FS* zN-gctALoXgz=ylbxt33H7PS0c@8^8;vMP%JUMPQQG!g(v`$rt zL;XP>5EVCQg20fpM!SE{CQ1<87SJFx(^aVy^*{n7tke2R(pZnxS9*YNaN-RsPf_m( zTE5gkyQJly@Gl?&JQFlGRV6_Wi!H4ZP~6~G*OOd*k~V2#EsnKW5wIO`>s^smA)d9I z977(aZ#$kcKppN{Kky{9bs%vCBIH5#{vPmVz}5B!;wfiiRu6xYLXZPpmsMR8F&bUR zUFkJhKXX0V=v|!^THiuni^(7QwOUmUZUR;=5VYR}Ryf`v`UE157FO79Pj^BM1|@b> zC>AxV=N>#~a`JIkiB?hw4jM9n3p&J3ob*r;)oI^BQA5>C9~Cx|RyMG7>$D9jAkQDJ z&TB8Cu0)O}{&IiSCeboR;_1+?pu)D)D1mIvC^5NkA%II~9>q_m26?phVhfe!V3sJ# zKma|W@G`+jA8zkn&m&?_SugS?_Le=JG#GV5aOtpcNp)Sy%QdS;A(m0~6u08W>o~;r zZJ#5^bnoNn6PBQ$N^Y-cBUV_FB>rayf-r9nDlm{(U#EXf>yuXB;sm+xCqj+Z^e9nS zwmts~Y`3X@er7i=!Zr=aDLN(UJc#?Ex8|;bc2{EwVG?;IKz4meG(78ev5j3XjuJa| zSslZ7GlvVxKvjT_`-pd71w%fL!+Dn%C+b&uTWgYfhd)v@Or>|}I)wprRcB$hD!dna z!#7?rc5;7o_hN4g|9V1w1%`dy_XP)+D&+Tg^H!Cva<2~H&hWu7CSYwDq0&po84=q=Rd02ZN zG{69?SQ0}~ZUsSZV$$+u^Gg1xXV}!+h6KQl1I~Z2_%E6UF&C**q%4vAZ7L6x<{%O8 zf}&9UVL)s%?v##_ip6^m7intGMgwl_q62x}n6fr?!#Xur&~8EU_;R5obFapLPM0tZ z#7FqWH{oo&#+Ye(rzZr%6+7j8j)P+a!y0cG_4LFcR3rv5V;}}3XBn4vhL*6-mo(pk z;*5U}hSm1?+O{WjhZzm%gOH4rlSzEiqd0=OB#2X&bq^}W5E`JtS7yw!I?bqDv6Wr! zl&hk37lN7@sgHMe-C`NmFa8GPNT(+IPM3k;k7Q(6C3d5#tKn<0NIoPB4O%d01B84wMqGJ5VU*g1q7>6q=A zn6tx}>zS&&&n#R~FzAt=6(X7gEE}sg5D8kF6(U~}ViMy=bzHiXZ5k%kj#FMmPdUX; z5IT8j4@l^^=zs*x6nS5A8bh-7LCb%#L0hr z`9}5xqtL8+W3U>o;&zno=@pD=K=`Rod*(46m#LZQsR20-4@0Hi;Uz%Bg_r3Zd?0GHX+`Pczc$0P`n%(;)MI4!l_Y51eTKE8ANI_UJWX&3L1Z)8&_sy zyY1t;S6REOyTQZMCN65V-AcSak*U9%3#p~QWA&@8%e`y6QR90^(tEw@yHb7oSMr;j z0fxB!yQ~9zz}LvL4m`nYY`PU9OR-{6mEZtB?nadsZ=7bWsk3~Ld^Ht+$j610vpRILCa4#UfKw) zTnC_Y7nEdYD{K)k?E_+Q)qzDq&ii94%y?-^M|QYGAZ<~u4+PL5BM0QTSAk+eehDZT zI#R#Kbq3JB_t=dLlVeR&|+Tb zu`3N}SJ{Jn>C>Qq!e3RK;qW^!gByWf$6Z}V176YuC#Rq%94G{(Xr8?$1ci9jhbFDW z+JR!Pe0?W&ZYOz3H@ck~H+0x&u>a!N2LiZK(=u2+NoZ_7MA`E8Z(1Rm0BVnP5V(xJ|EVq)d7bXR&Y1a6^1 zj3N{Eh6v2NZ{&g1xxknuU{P)o8cYW)?+8Ee#v_g%D3V@sW@mpaD5-}-B$@yu>yu~c z`2`gJ;zFRI=YO8%%SZ8S(rW?T=d~tGasW~X+i%|f`3!;{*DScso+r~jH~7Qt$o@be z#CGJKFGfP|{lQh(-XOPkKSG2E$|e);9yb)fR*|01KgM%p#AJ1|=omh>uZB5mVz1tX zK#)@Ym)ms3pJRVHW-&i-6DMfIb?$xkQKAee7D2ndY!H0vX|Gax|3|2P(pe*4{!Ag{ zf%wZHeoo&>Qs0yr=5S@fdbtyfN_tYLV`&cID81v z&A@Y9AVv_hFr%Od5QBVE2rY+2N(4nY%tJ8bNQK5kKD=N`VG0Hk&JC1T5n`Ey1SvVZ zm64^ffsG&|4wfXL-m)PbTj z{y+=?w4{IAhj0}(k^nJBSAkzGYJIwQ;5%r~Yzid&&YwJJ_58hi*BF|^R|@YDewO&} z-**=nP_9Qt%oF3tQ8!YToI0##q-k4w`*=#_O8n zcfXHcv2?BDou+3Unp4@GN0ocM(HC2D`7KD@di<3}o_lB2`Oi@SZ?MI5fhC?BU0?jZ>F^~g;IUV&73_?;?XQEU+0~Vo^Rp*nV4n;tqqEy|<;h>Hp zWNB8Ib_!~!+Zz)(Iv+#1`g={IwBA-m|#wfSCa?60Ze6q~7CMuPXG=_!`|^(Q7J=bkplPjquMM z@j4!P+LTXwdF5#?uKCiOcdqv5MrW=#SEiqidg`jL&U)*vzYcrsvd>O??Y7^Jd+xgL z&U^2^{|aWj!`|iIFKkeHaBTxPI-;aO(`tQ$w|Nj3EzyJzxfCMa{0S}141S)WW z3^X8D8VJD%N^pYpdmsfbh`|hMaDy4NAO}AP!Vrp(gB~2A2~UW^6#B1(Dr}((_s7B) zB5-~(tf38Wh{GHzFortpAp(DS=))ii(S<-9q7jcsLi!aB5t|6b{ylMtG>oDZ zuZTq*PBDvGR3aC@2*&(vF^ptH;uy<_#vqd}OG z+@l{i*vCH#l7fL8Bp=;)MK~IAk&LuqAse~CM?!Lv1C%5sFUdbk{$hV}lXXNSCsU}& z8Y=RWq%5TaJ!wh^hBB3uTqP?R>B?6cGM2IwAT3om%3A6&mA8ClFL$ZOUjkE(!WzAyb68Or|qoiOOdJaGBBsBQ>ju#cN{IirNHbH#gYKZHhCF-)vC1C6F`VwKXEuN3SxlmmqzJvaG{GH5^pP>eo3WtiZ5qZc1C7#j0SGWPC{di&Q49j4gnD@5u)s#+DR zbtI`tX9`1978RsiRi;-@n$neK^`$XYEB|WR(*Wjlr*XC4J6^HX02Vb5N9`X;kvhO( zxWN?qdxlpV@eKgZ^`mtqsz>>n*s$tvtRdB(G0qCs{K<5!c>t^cH~Utb5^%9Rohn{G zdR4tXwy*hv22g*aI@J0-b*W9oU!R77+uY*wwzpq#PoO42ond5zIsqf;2*n`jLgk=!`|eYgbJ< z1iktjum1!A-U8Z}e|gw$clVcxql5sF_%%vH`}YkP7$txH0+hgCQH+uU&+6~NdGYKp z@B$GD;Pb*p(eVA=Azud2*RqIg?}Fi5KM)^f#Q57U{|by^0lHX!{pGFz18kH5-|rO| zeuxBW%fAFKxWW4S23}$ez;ATM#_>IhApD2px42QrMtL%c@n_=qemKM|zTb@X2V?z; zxPLYNul|3cOcyuuxWho+AC<#GWcwM!C`OQQ{wVyA2;c8dM|nm6_-qtErW9Hv59)jfm@!EgX{`oV7tyOJ5ljzAMQL!I|pY#wn z822m=$$@rft!xH_fZ2xPU$(bhD3QLJ0TGC`Lvr<2u#_7t=&oO_4}xo5U)g@+UiU+0 z{q9>oMBeuscK?2z-vRo2f5tutvg`M4W=kNlnr6TSm>q%4ewf;Tx;CSU5O4wB$l&*b zLY{wdP1yY<+{cm4Zl1Lp=T6?Q-sYZ+{qh}e8qfFNz$W0p^;ht2190T$X821WE^)h3 z+}ihkd7*Hf12glS4*q?|oV)$%2;8*b3zscWwM%ULnLOhN zKKw%x|Bg%ug4wAC;NmeVk8ij{+VXhykD1$Nz6#`VoG)Sk^o3`~G)_27d58H+&utZ(Qw0-KUP9`Gp2tZC!dC2VsBP*SteGuk0Wo^}+5} zx&8Kzd|J1B!qa1ei}+TXm||ymKxCMQ zP~<`9&>0XIhFupaDHmq)&~T5ZdsGKNwP=0zV`N4Ffxaewyx1At#%m)e4+R!Y9v1;_ zv=kB7fx*aJyNG4bC=UQP7AAkkWVYA-irs~cSjCDAP!iPwt|@r(NdaAhZq1_y9)XIE}fc>1G^%t&r5#cQ}2K;s6ESS1qe zRzFK20o}Ea_oHMScOwH?KN$&!9q2{h=!!rn59?Sz?YLsMSabhVkNAIck2?rJ71@u5 z@{b=TkR4e+1-WMjd5jK`2|Ff@bwrKU7>&*-Ky3GiBk2&b$aobrWj*E)zo=jq@r4iB zgcA8*6|s!wbctMHlLADDZD>DV8H$CtKZKZAqXZ2b_Y$pVdX2(hd6J07Wf6HGQop8Q zKd5c=^Nkq>miWVp5nz8&5OD!1{?~K~Np5smK@qTU1$F_D#uO>$29Op6UStf4`3(g& zQ8Zx;nqma+&=-?}d4Q;v4sij3_KkR@W%pwWW5;0lLkaHX5Kz#SiiekMSU;5DlzSp| z3~&o;)^+~#h-qmQrD;D)!BOvVKIF%v=MJnSGf5W zC{}^dDUxy-7Kmv}VHg%}(06VTeD-6W^LRoYbdmhFlU;WszxjK;W(+CNBR^?B#ufo> zA&=9fpFHxD=inn8k&pTVaCNm5hVl*~p>y^#47UK5-x#6tplsnqj$+r4JNcL%8e=Ax zY5;_osLw0R=_je$apy@_7yu>QE@U zXiA!s-KJm{nkNt$qx~qKHM(dmx^g)xq&y0v1o)qB5u|?|IHU!7pdI=@Xj+{9xRg+8 zgu}>H8M>1i*>s&jUIoT^8!Dm>7mpBOWf%E__Q^kU$F2)jTY%Javtd7bgESw<+0 z<&pTKtQn`U7KnnuI<47y6x$j=0CyDK_F$Omp;CYHPanyr_+t=Vw-gX)asc^ZkXmG& zfu5bwr!m{3IhmmOW0y@>fvNV5Pj(B9&!hwp zZcTNOU01dD;}gi*vRw7D!)1FZdp|3?XkSZ{3;?rsC9^(7vqEySY@4%%y0iGxvmZ7S zBbtAd_`_>a_l=4Er?g^ps6W|Xiz%o8Hw^C}3Pj6V8LPFnxtoct(xQ)=bt%VmsV0U*^LLnA# zoLhc3DzDMzY>twM7t63XK`4r}dxdBW-b!R6dsOdhi?hc7Jy3_H;9d;|vKn9tX^5pA z_zIn21h-%c$hMb&`3=yJkhN87`1=j|ySE^#ZBbQKQ7fA4S$w;&S!YYL0D!~fe7;a{&c~cnj2qc^g-D0OzPO#6o5D zYTT8r7h1*8+psx%BO$PYqdPzsX}Yyqw~U5A%2voHL2<`dmNe^^GF!NC$g~BOJJ zggIwXXa1}uinK7gwd@#_Jh_wZR}>PEoe&Y4vmAtF<;ih4v=YD(p}ET`*2^5h$iTd$ z!VJ6iQ_SBOw;7wskG#wu*31l0cF(M`O9_aiT&=wZUA0DJsvN$D%(Uit6mcfbVCX1B zhRgB%i$$c%tqic;{LK%c&boh_m6rsccyR$9OvfCj%S>Ctd2qv&ki*Y-5-t7GVcf&w z*NY|n#)_n1*;u;XM{aIpo?`(G9FcVWsJG2_pQd&r)Z9ON8CQ|AtwRkcSap#{t*S#= zdQ$DEIe}3iD{qDjSX?c)Mwc_8k?)X>0knS3=uG(T|bOJ znucVq4bS5ko?KZ!!;OEsU8{c%>K579bR;DT9%yCmjo^QVpRu{6Y^bRMwB|^DKT2M!qLo=Y{$W)4=v}_zM|+b$-N{i^m)F`w-Ub%h>(er>&)YrE zucm9VEnDD`gpwGg`K-&fp@g<>KM84N{i{Tx02UJa3`c)9;bXBBoSo?UlkAn~{>oCz z-1=h@0IS;}H505p-bEzr4x#E5i0uUa>Kqa4->vJl-i8HU+ZIXdNXYBqi?JI?nqSPF zzL!76zUSzE&9^v^^xfh{5Lvv2=>FsD`qKlDmZ#dD>V0?ZC;p2C4(lS0V&%^6=dR$V ztM0oFmIHqe?+z#LJtm*3XY2(Hqu=1Iy!pJ!uHlN-i*-h?lb(5a!SW_*aNf@FWtHM} zyWIW$@8>3A^+{=Y$BWXL2TC*;(BM!wu4vu(VRo+cc4g;`em~JI^hBRam&FALJ7y9t z^7VZIUElS<25`n`<#YSG43OuE-r`>W_29+2w)}sah1-T-+xB{HjA|~1R{oFmWATmD z{IwU!>O}PtYG1$qGk03Q;v~`;f6wQ{hWE=V>0Fh&^xbf351VE1jlRA2>0W$*zvuKQ z&~keD#7&xlFVOiDhWp&&DDOz9^bNS@&mxt~Y3k}?n5~?BD7{{K$G+)Ponq99`$j?M z$FIy>)%$cFf*!qc)(R1@9PL}*=ESOD{^FgTVij6RNrYpOEmWJ%7M2N zjNNl$c9(7nub0=|HOIFFvtysm{`h~w_-HGSqW%nnuBg1EY7Zv<_#l!`zyD+dtfGqm z%Z#tWGSpD70}FEQDd8TA%pmDTY^k<_8c`^ZTV8o3lh|lF>FEs{${_F6m6EM|pl!D9Es&NC}EpoVxPJ-wwjjx&);fi2(^( zd}Ww~BrxTccWiQxQ3>1f(;_jYdgV2kRP!)2Gr2@l9yJAIb45wxEMra@72=b(MPbrW z&l*|!6wryj5fmjt4JGPMhj4%VrXq!)IOne=O@dOYxSk=b{#sS5YPBF!(^^$BCu`zK zxkl+cbVGF0RadZX1(6^qLC&NpyYYIj&BUU@Up5q%vAAzuSK)hk_5T4cTmI zKIofsE)?VykS~2DR6IG_^2w}h{%gH~VKx}yY{BK~su6YO8RQm?L6+uS!{qebZ@zhF zXs40=7-WiHL7Av+dF%Q}lr~-WZ3Cn9?Ahq@bSXVoCHpTuf%@)N9-~EE%kRV9kq#?L zU}6}giJ&1htXyN`m}P%1Z-p@2%D*nxwg`X*o4?Lkwf-9-yyIqaZkW=(8zy9H4T^8V zLk(PB0|_VV@CXub>l|pFc~+FolQmLun6eBODA%%z(`|WxS9l`BpVA#m4K#?VD~ML@ z)~1N)CUJBIO2>6T*KdN|_BH*=I(F!yN8B&oeQ!Q^MTb|2V|jm|+3AAop`G@zmGI6n za$`XMGIFqvDI_YYBVDP0MmuW#Paeygi1T*yjub#@fN>VNB#1jX(;OFlMjaL8LET$)E(z z0Yo7ZF=2-y*_eOEWf1+TMP=n;*?Mr8H>^#^CAa?i#=E$%xOjDi5|jW_&{oqd=zZj5 zvvcDY5d}feJ*_}!gx(t8akX4!tv&~ejrgpz7Y6XKBXWcWvY_Y_DFP-j5wMm)KGGw+ zB=TLM^B~+z<-ABqg*Y9G&4cm=q5tG7iAWTjV9M~Pv&nzsQ9YmuG~T7kdflo`L;2A3 zWC@W9!K9biQ;RX2B0fQ#j3~wo-$atBl~L-80j4w^K|pChgG7^4)EwV$%9j#VN`;Ps zl*%hD63cUNfeVMiiv%`!FPs=;m&K#sBL9;WMCM^4rl_YmVGv71GS4N76yWdGf#f;Cpy*1P7M+zmo%CF=Q~;xzBUqNm>mITrXb}#A4yPJPMpY( z7=clu5#BSYo8*z0U=rk&MS}<#%{WGylremK zR3jVDAylH~p@slcO>9bnO8L|aDg`;qOQ7MDkc5Bdq(;P1MHsqD27J|;3gPKlK|+&? zIB{gtTAVwxIj$`}uZu77s@~)i#>fl{e^z8bBQOZ5vCsvZG)0R?OL!^<@RW{3Sx;fX zibu}rF_@24CMs_MNFxbSHIL#XK}KoW0``!u4IPkO)A|^e{^diZTO1GL6p{~p>!*ZS zEqQ+=P)VXVuXMwj>}Jn$uD?iBxTWGt{z&C9EV=gSiZJohVjsm)yPBv?`aFn0xDsBL zj8~Q!q$IZ#a@)Q&MtUJr zB$tyiX{mDT+6^@}USc zLM+^i%4T)-5?K@4&<)wulH$?`Q)qt$*usVevH!RzT+bAhsD?%+D}-!iLxb70P1K`B zjo-hNwG6&vv{3T5$x0qBoM`@wpcz1fVf5@$!kea8%qamdZPq0=Ugf@<1{j;LNZ`IQ?e zI;8#vxWKP>^PEE};W#c5!%_asO3=0?;!@(###l;aK5AksK~+LFENZ zk!oh8HRf7bdeh~RNtV|dD`Vbrl@!wR7ZM!j&^Y+ekv=}7AB*U%ggC6so=GD>UFr<4 zI3=v^ad~uH6jK9P$wo~eke`1;a3@?hZB##nUMVpx=pHbj|B;_}VeQ?=`C(v+ZFkWG1zz#O-qc zXw(RdJjY3EChy~r>EEQipF84HVp$~bkTv^?vDRLlbdC%LB?4ci(&v9*4Y=_KB?nC7 z`=@R)J?q~j?`r*xIfFv}US~5l`1_BL_=ppl78;q2{KE})GYI-ixdI^ePIt%6~!kb7cGSR=bPz@C9ktSq7$hkY(+P~wuyR>PG z!?}(0$RZG=DA(A*iTE5k*|!a|r=ZwDB-Dy7bdB^VD|j(MRJsi*ybTtNLA)!B7Ob0M z^O73OALOyMzsNyWvlcnL!4>0{9!v>S^0b>U0*q)wf`G)7kVJpXT0uILiY+`H%<+mf z^sh{#3qa8NuY?3j0fm>3Kzzz&|`xD%XI%fa#EDNI!)LfmiU85ut?a z3xb;4lyk^IE;ug<7^@>OC1XfGzltu1palENouoiUu2>GXLl7{Nr95cFARwf*!=hz0 zpsVOcw}LWWtc!nNR6eh$GA>D~Oc+03oQOt{y7$_~qmii|qQ~8E3Fes)e%!^B@I_#J zhaX9*H{*(PSTz~D$CStc5d%mG+_kh&NUezya6}nlEXaR^h=4ps^C3m^n7~9M2!7(R zI{QOYgu?$wDp8=v>|!E*TqP`|$+s$qSHeiC0FB$ACQ5(6M~l!$2H8l%Fv(;yh&VB_ z`anv7TEH@33I5XBpme&4sH`BF^b40f4w%eJjmn^$Jd&I22(T1Go+JvNbPZF2hGBUM zLC`coFiN6`GYebFty4&Zya_1CuqJYhv>d{gSU?z<$+qJaBV>t~EJ(s6i?Y127xatA z3QKv|Nlkw{s{dHaw#16J1dO;$i6CIeL3F|i!YOWX$}(KX3vipMEQnh`&45fyl&Hr| zBnrxWG01|6yc`siNv3x)Mc+I{G3m_EC7R(oXJ# zGV~-2Xh{Atso2l^gd6`PNp-PLu-H!e+>ijBy$3qa-ozsQ91Qu)Pd*fg_WVtB0U^Oi zPz&AA?lgu5^^5nk3<@O-Br}Ez(WrIe4xN^Q4amhRAW)X2+>lMPx;{> z9sPgM!psmEol#S)QSiLc`ShR?J<$sj&|rB`q6pGz>M0#PP$8|-egm5Qe1`AyPbyV1 zCvBWBbr4$8#gkhBjmhdDH^>1vjZ-q=rw|Z@XSjvKxh_04vDS0Rm8NUhd(ZG;?{z6;n)A$0?QlUIOMS9%TDP8wK(Jy;Ji zScF~J54u){eb^3CScn}iiM3LDb=Zl`SdA@MjNRC`saTH<*&h{IlGPB9E!m7cS(M!n zmF3WjU0IloS$64InVs31z1b(ES)6~}*p}VdckNl9-7lS$)Rzrfqa|6Oh1sM%T60}m z{-*s_r+wOIjoPE7TG=aFsmLMO(HVSF%mn zvu#^}ja#`5*SD=(NxfT{)!Uw0TfF^SW93_h6}_FyTl zVl2*L3cg}3?&9c6VlS3pE)HXVGA?5?7U3~IVK^|m724XxuWJQMILSAG?-rz=lWEPHOGNxonzGO`9U`x*A zEly-k{$xo0_GC~VfwTWP-RodfeX-pVG!X)fP&EoV~Bp_D;|bM z$b+4!hkt6r!?XmEp#K2v!x1wqJzg2_eY1vHX2 z=}h~V{wHE-MZ?9V7HUzhhgS${LAV86lxnKB>XcsTmd@#YMvbF?KIyGyX_tm+nFh3) zHd9i?=^EPUp1#hX4(g#sje59+tgh(mbZdZlBDwD8r*7)8&I7}PKCCurt*)U=IO|;o z>yj30)KF=%_G;8%Ynry{wN`AM=4n!mYoUH?)2QpaK2yC`YEkHGQl$jTK8?bz>Z_h= z!v?g(mTYQ1jj(=y1(arNq&|m#d56-5>Rt|M83yhe$^(za;d;nE4Zv$sZbDHI;g4_w z4i*I{C-@mjdfS2#?nU-4javwCgQjrQa2*)X?HbbW(}2}R*eU?O2?3{}*a+{%E{*I~3AcbV~0^uZHmhpKytjK{LJZ%4i z0bbN9)UXNf<|>qU1yTic8X6Ugi1U9*$-0<8C-R5mP9+-pD3Hj$!~Vb!m_Qg%bbtQ9 zbWO)=JC6W7H$EB)^-azx6XE_kTI|UXM*j4|dHUcG*t%KSB0)Uv^F}jd}nLLN|?WCv}~+b`rvN)OeI> z+V*~bSD@0M^n68$`X&wIfPwi|zS{6iaXZy|(r}(2`1*z5de9Je)3Cm}pKX6w`;?z|Zg+~7_lL6&{FUB+ zd4P#@g~0h5%KL)n4}7904ZeDkMp;XP=^p1oTraiKth62Cn>$Iv0P zi4-|%^r%pvv5q4BVSJYGWXgyqU*=%oMr6v6FCE@{xiE;#i6o)f6zT9;y@`Stq{!*9 zrB0j@f9f=5?Bvj(6Km@9=Tu=mjzzPceD|#6SFmQ!qCG2h;kye+%lhLPAt5Dy1`IMu zJj%e7!eMs*_B>ez@GG-^0S9I)0dZ2Z#_X1n*p>kdr5?F3h+tAAl+2ssdiM9sE*FW9 z8AKL2nnCG>rz6+Xz(7OU$&Ee6o?Y8*5)l1HPU0wPd%IPbZle;-FQ3#f&Zco19vq!QZM$n})0~ri7q8CBR*nn>JhC=>3TT z-ATly$J=q4CFh<(&Gl7XbRrG*S7Bg1_t%5ho#&W*{ZV!gc;b;47IuGWS0HK%6N`aGEpXO{RM@YFCl8zp#EesA_E~zcxeg@40Fq3 zbAiRvgK8r7szN;F@rto|`qOBO#PVvFuUswL?6c3f73-a}PK2gHsb)8fuErv(U%AdA zsF1graf=o-JUQw{PW6lzfxJ7}l`NGDdqm)5{l1%TkP!s6WMIaBq>zKgc3mjZE1A6_ zo5C+)tZ_`%rPqVWOqNKpT?ZpvnMgP;I?-e@FN9-ZlQJ;!c#Y{59nU`7cv{DUK|9%? zMo)xvLK9caWXDx<2(dqtLJPH$QY%#Q#wgbcvdE5Q{B_6v@2IRX%l{4d@sWQ>`3?`mM05^%6tu5P@GHaLgCBl>yH+k}>;Mt7Gg;QbmD z0Yn)~KJQpobt2#C#0Erd?h(SY}Crm1{Is5-iv z45GHD6KSP?34(Fj5x^3-x8WfMeg2RkVrXch9-_;HFf$GL{1HG2Ew6+-bW0DvLBIqa zP%R~tnQ!pZyC$(sd{T1Q*d#(HXz`>(xe3oi>fx5kJ?tKC85vmY2)5U?tZnR5$nXN` zye8>nG96n@lCd)5aL)OOz5J zWgYJ*l05G5Nq!97wQ$$ELHeVR9}pce`dl{0h+NCC4y@P^M|Kg!R3ns{n9h_>$}!RWrdq1htcC%3_(ojeG!;`M zs;I^|S!;Ask6YYgcuaLFjv~;Ab9}>F@?u~F+>iLC7)DGq zaEn(Ye+01%XwxMb%h$|!_8d{AgkLu_K8g57PVYEJqs&;@%Vzd3n+;cIKYP`80JXGP z$qfUbFw&Xr1vHJobE($)L4mh zCIXxiiEagJGgsQlyAgvH&r%a$t7uNP9~>wre`9Nx1tU;!<^9imEmy~hjJGHgep@_w zRJrxGHsNDwpL&5F3 zCe}K_&4yJ`yi6i*hd7L0bWQ}s?tK!8f!SgD{z@dphpCwi-wVk9z*xq1p>g2W6Q6bp zfBDRXsiuP&0Aa1tuE-57rG7BH-yJleqjI^$TmYxZZSqL- z71+TR)-F?dG+{+y*dQmiw(xleq7`kYmr7)K8nDbe{jn^~ysjtTU{Ve&)8C|Y*CrNw zkP-g)K-c|FTqt3+tNk-nh&_g4X=0Lqe@m65Ul%Wu3Nf}Y10!luyE0G^URGmdNIx9q zX;}jPky(z+K?wWC2z(8~Q|0UI*+4rm0D~CwCS|>aXxlyr3KY3{ABw*#0F4_Ra(cr&#E;xa%ssN>Y_;`DCzVe{;$s zhO(6dd6xEUa>%U7%3(&9-VFl>TJ^|MNMOz!1d)`%D0zlSavtGnlHB8I%=kq%ZlbBp zx8n*esEND`Ra*;PN+_QS#Btmy-({u397If)X8w$tH#z3tkk!E}rJ`@}Jedv@C?jj> z&?;)&E*uX!Xg)r*kc${CO8>Ide}||QVaXa!wB-9lwhoxC(|kBB_Bos~fT+#>G63#s^X)68kitJUq{f2fy-j9b{@ zOh2s2J374gJ>VweByHY6%1PRUSOV14;z`>7VQ|%k+K5N#xfCzCu?O&tJeF>8SUf1wNv@<2@Z+<)ky0&QU1pjj3E zoJd6B+8yG-A^>|_o$8e)V1dKg2vXda~41?tJuUVNhtHsmQbB;!pX6RKHG zb{`e-S51-zPSTxDMr8#aoKpPc%^BrT4qj1i6;djtk_gdX03%f{1j=PXQ9J_@Enp;y zonEk4>anESf2mwy99S(bV#0YPYk(!#h-Dg*rB9{{TDIj_;vsqjpA3!+?tt9ghq~Ij{fv!octy>YK8m=$W?!Q=5St!cLD}Unw#~V#B(^MZf*zMWrCxO%zPys$@zvLG|MgENEr-6LZB3= zsHGa_f7lFJ1{1*m5uTC!QKpA2=v3aPD=w&Xnxy3M4c%}kNQR_GWN4gh=#_P-b$n=u zj%bONR1>ABxs}L?qMJ%l1`(b^uyDaGFp1MCqd!ClyRg}c;AlJY(qJlHLbcp#1c5O? z)-ZU-Fu+~L4JrP}@Z~1XXp%zKlA0)s&L|j0e<`1`m|eVRYhtOECRAlUj@)pFMxCj` z=%{HvYR{-Co8E$(QU;uAp+w9n>6k@(Jjh}>iXdo`16gRPo=Fu6LI!1CmpamWo|tUF zrwMIHsv-t921*W4f-&TuE1d>}UL81QMp(VVu)ad2-U3Fn7#!Ot zf3hZ2c>axm37vT^o+|>;t>)^k24v6;B;CD3xgLffyjHX}iwRoULIx&&(p}btYs7tP zeEH|!+{U@4E3vLCfr=|gnx3Lc#yix*j;dXiX^*fH>$HYe%g95ya>!pOsHsxTCt3(- z)v1ZhC&J49Dsf81$36rOuH}`1tWR$#)c%wo@~m#ggn?_MA#;mO6C0>M1C-yV8U!Y zWFHkCs){Al@dc=p{+7jZ48{^3j|i=G5bcH>EfMBt)m919E(FTXk4`}COo@(ZfBr04 znh{n;MT^y}pdBa9ddAoS#;BET&z^0&gg~gYQir_*4HiX2QS9Y9h6zGLCU8Ne$cu0) zUAdMkxti--?d!0vtCDaolVIcUrQvDVAAkT3j#SY%P(oo`CzPdQBDqC{!dvu7+Ev_c z;|b5Eq5VHGt z{+)0og@^*5nJES-1|IN9xNz|_@X&TF1k)&#!e-M5>i)e07nH%ssGbF9Y_0w66OyXz zG5`pB$33jZ2)4&BtuTI(2jc#Pgch){An>vgE}Y#k+vc#|fp3@U1O)@J5EF6j@vuZ7 zG5*%#Xrpco{4Nt4KOB>wfAAG|tQM2sL3HtI^b!w=1{9P5pvgueVs0Xn%;iu5C7^9R zG)kTXiS>ok^uh(Fp@t<(hV^1^Gp=tVKQas(TJb;_&qPPTz)Yabgu(e?0OoFD>@Ixq z3WVW^xUn*NxH3yxtHl(X+!3$NX{{of8Lu&*%#td;l?|9Y{0`9m~os=!TW^Y9w?)KI_?=N(tq z2*adr{G}qt@TJHGA8w&!LSX)h zN(@_%h^OwH+Gd;veRK`hqOY-mYMa5GZRQ|05mKL^h%4YI=Y37%5p-R+(J9z zjL1lY`K|kn}g3G)%^(MC3#)_p?h6FiOWXLGSQQ z+w`rCY))esL-TYz;htxfh+YWwFhxXB%Q3zY?nyt~Q?FoDf79YrGeqTODpubbAvP)S z3AAr4B|j53fk@v41FLr#VZI>q>*Y#gV_>c6MU}_HLu+OdLk2

      UzVzi$av;(yNrfczzZ`$T|+V}J=w|+L%eju2Gzp)QI*n>UD5J09j zESMZ7sC_A+9`+G_xiWrIwJ8377|3oK*jgOeNgk+!R#+PLpblENg{K8*_*ob$ExEC>L4Sgcn2EIL7yGafBDfhONQ4f;Af#9yiCAfi_#2J*8;`gfk@y>v zxEqyN8<$v%(C8Prs2RIx9HN*Uhj=i-NN&Tp8^yRA$A}xrxEsre8_g&i&lrvBs208{1mzDRIk{FnOnf^DJ09KfXS(*hSm1jbg-qD!2@tB6uHqn9tm8l$e35j`0jC-ky zoau(1sf?g0hoT8@qzR4CusDi=Ito!aNNE?vse8wPnwX-R+rgT(;hKU0n<6ut34xg_ zc#po9k4>kPu*j6g=alOx4~_6WhVc^fND%Un2~cngsVEnJ?~tB&_8Dxc7;ed!@o0bT zi5l1`o0eG++=+(XNq*qTCBI3D!MS7LVV!;vpxQYdwTX5aKLc}8h|%lVn&DVXG0faa-= z5sIP$Av#5W7i0b)HxWq65eVf5(Pl=suxLB>6CCQH*}-=T*9dMPPwB%}15poJS`a%{ z5mo9BC3>P|L@;M+5Mo+=qJt1+sxxD{UMhMpELt5d>KZVr7cx4a1W}-hc%V%vFFop; zKN^}r+JQqFjYTRD-(U)Y06?TD55v$103-@+l%xuOC#jiQoRkn4@9+x71$NMdQO0FI zuW+FU20*KtTZMHFrjQ95!4sG&2=eJ+a%N!2_CGu&2q95RlZvZFkrb0k37L>h32_g` zKsEqm3oI_r*`rFr?i=T)>RjSO1m(j8jeuLqbPklDKwU8mWl%m1G&>2! zL>sF!!@yjF1xA_RL|o87)K#BHBtNY5bv9dn1`hi@2-O4SlLS2^p9tkWP|#B%v1Vfz z1VjL4k43R0O9}U&vSTN$F+olgd$Q}AHi{XF{rQ0ZSsL`Zoi!?sH~Nq{%7#1YmxoG@ z3(AZQN{0`ciA8!3rqE1{@Cpe91;YRh+w?v60|TmN5Y83^b7Tsl5Lw3HQ3YhQjT>@* zwuDBn{s0Zk6h-f_O-V4glUtv~1)oW9KH`N&td>eo@l(L+oLfq0p*pIRAh{Yv3Akni zK>(~g6a)rj5Qv)tCn~uXx>FcM31z^zJGOeS& zWBzR=KhFSHh2{@}aJ4E+Xq!_85PM2ym3zK(r$Lja^q00LxVEAJzXu_x!bqr2wwsXH zn|Ld~db_Ap*r?Dbz}f_{9G6gy09{-V6$O>K4Y$1bHa0Mj0!a|O2cb(zP*^YpRv0lz zf{dQB1i^Sr1Rl#h#*|BaB*+DSaSsLcQq0Pw95iPh)yL6l$pi5UR=agang>{vJFz50 zqq;sEw?MKXK}A`FN?rO5 znUDlTu)+heML?wz5tpVDI?zHyz+vPD5zW!geqGYm<88w+ygG22hTvx7uC+z;ZbOmYl4+P7j?22R6ebS!wB&|g5_lzv^`{m z$yhY1yVL`cYy_`h3epN(ttMjQqd;76wf9h0Pc%(51r511O^U@_4(_~oT znh}|k`7~~StH#dk*`m?mpYh?F5#paQ;+s+8nQ`Lp*PQY_46Ao>lEcBmwNod1aOcqK zt*#OZR&mfOJ4>Npv%~7Ho-E;Y3*Ie78Q~R=LvdW8JDejPk+bWiZVWkt5#-xAx&G?9 zLvcg_4YPU^ysi-f!+fuh=OOj%t^PjL4Hdd$oVy->6P7CNPmxU+G5+Ocv_C&FI?R_o zIc235o2k?u#>R76?M+nxW~N!Reae>6iiP?^kkr zUZ?eN!pO=)L{L)e;|3n@@uhU60e2NZUJu3~2p|9P0VML(MW;)eI}+?0Vp^xUgDj?y z@*bam2d0OnV=6ky6>%yXt~Q^$J(faUKWr0xi%Rho+cQeOFOeY(zG0{?A+tl_Ob!mq9NMym*M%l z;q|N9#>m>d>Dprn+ZQR@&Pdx&IdNaq2$2bvz8D4?>16LWs_b%O9_0Uy=lW+6KQF2(K9mpBW6V84jNrZ$BA- zaSx$1FCuYT7GhfaB|-UmVfpJj_M`ak+{XFT?D?gU{h6`-n9=>2@%@+){s7@m;6Q=} z4IV_8P@zG2ri|5F7*XOxiWMzh#F$azMvfglegqj(Y3$WG zm^C{NyYNh3Px`Ib4WokHO)V_*C zUd`+HBiF!^KZYGP*0M*lO*elA9a^+dxF|PyYP*_SBg)ZC(2J>e;b#-;O))xC@WF@dU)`yYsk9FT3^JgD^ti?7_wt z3opdb!d&9YZa?n&v+lnRWfQP}DE11>?!fHI%WlE!{u;FIK?!H1Q8fFo!7)c2al{Y6 zmf8bxIuZ3FaYYlqL(w`Ftz*$T7p;SFIvH!EvP#3?!!k=O@8eLvAK42Mx*?|v(8$89 zOLDp;r)zS$C#Q=Nx+$%svrfmJ>+nndX8LYS=*ndBNCKD2O--rTYZJPEH=&EOxjF5G zG*Y(k^zuyW!fejZ<^W|=(CpHLZcXSCZEn%#8fETLNmpg{DN4!I^Fuzl)08<*NA(m< zLd83jyadhbiak`9Q?*rNkA>;gKV!`fQ|4-2?$+i8{B&0XdqprZH-kk_EcF~J6j^b{ z4N2KenZ0yY|8inaTIQ&K)itqe8)Nd<7P)26TmA>ZCAVLHJ2KZ+bfcCP9k zdOxe@Yn^*O&ckNa4Uyf}$YBEo6i#S?4SJX^GEhrfwl+m(#cU}?XZo|Ggr*XN+9?tA^wG~rs)!05E^tk6vsOjOJW-e;wre3*k=1gU7 zSmlZ(ye4@v2_h4JdD!yo89@a32BC8VF+%>7iY%|{n>-q!*)7b0)0|+mh4lP1&_$P< z?&hb>mEpXV+`C@R{oel6z#SdD_MqOOBnL`%PwSprG6~)v-}9*7Amw{7UZQ$lsax`v zSH878uQ$>A*z`IlHqcxTZrLkc0C6R`)P2uT42;?MUiUYDMx8HJ=~LfM@;~SJqnK70E4SAdc8hv@k4G(e;W4HkdKT+H*UNMz=Kw~M!c*pR9(7$i! z&>!+(p)s;zj52V6ehhpE47sLSu1cJV-;-HbyCGM}}?mM-Jha z!@PWBh6Fi(VN3F75d-Q5fk0DWrm8po8V8O}d*taJ-Vg^q3{p*l%Yof;WOp3eg)k)} zbe}x#F$_Ueu?&KEh6yR*1}?ZE4|(X{LF!?QPI7?@jo?ZiC=tAGGy;?d8D0-y0ENgw zBNLRM$yG>M%3DA~5KHujG4gOrpLkLbH*7=>c6m5|gm6+65c$UMXmX1@R51_35Qs57 znF*R0^LJc$=0V=k2>RKt5uOyq?tE88H;CdM4atKs#=^~OuCklN+#NLD$%QgdqLB&d zqiz1koS+S7Xo@K$1cfI-?on_#syhzroaQ=6a?pHP+t=1C$rDUcq8`sELl2p2YEoAK%U`-{u~&Arl1r>5`sVpUk0HJp)^P?cj*Qhasdi7#9a;u zT86G1QxrSxK^|Tz3Mlv#3O#5LG}K9wfmHZZPRN@{ogT`lAso%^_TA+JiDY zB&LRSLn97~kc7@=q04C~a2{%yh>~ui1YB7np=QBQg^x`fRZb+8Gs)ppa-<}gk+)FL$O8;ukb_2qOFM2L zf?1R4N)`se2!#2t!aCF=o9{0E-n517#O&Z7cp;D?yRk9m$3grVI#1uqG zK@u!_j_%%KEa2tBGj5RsDC}`~Qig$s1@ej{z~HV>fPz-noP;)?70&rhLMVq(25CYe zv7%_VQ|f?x7H>CE9sb7mo7!OCrz@ag4NVP#!=h%b90->!(^5Y-}+#kcsL6P(7685E)$%1fl zL8v%o_gUG5&3-nQjX{Jj;}OKy?SVo4F$@ng?-|d4#y!r#W`(>NzxQ~5MPreA6?St0 z8n2-CE1s@q0M{G-A@@dVSb|IhaK8K%a7}_#AYG3JhghIF=AQqn??dCSK&t{XBzyqo4!9-?5h zD3VCS;mx!Wg{>?uQ>yxZEqi^uE|rHFvpH1w_BV?>)oL7HI`!OX*B>!O^13U1Lu1@f z6hwc9F^n+O^Dd5uhK2ZopK%Xpgb}y44?sFIVllbfA?l+!$rV4t3&qMj-P zF>?dP$%G`x{sHJBf~?XmXyB>1DkWoxDJZywFaxQAXfSWfC#HLOy_Ozb=85jw3w&3mN}wAT|h{2XZaN zW55I?z!-bHmx(-xfw&vgRok1CGL*jl;7G0E`X+j4e9s4Fl8-1k?=$%&kO}q($tlMs&oE$f2q5qBqK) zFER#cn=qDtc!h>^NF=I7V~|J)YofmRhNlxEhiu54C?bi3!WU|a6_Us>k~$|k2Q`C; z`D-CA>PU&yNQX49k+h+2kPn1(AeMH1R z?2Z1*vyIFP$dnL;$LgjdYl&qHMRamYf7?q~M5>+mAH594SsIB*{7Y5bBfmh$(NM?U zU`N<+N4uy8daz7-Fg_C^%hL%&j~hg(DZ~s?5PsY(f7~&EoXeVcyHJe96|$w@fz8Pa zCrW^SP1xi`o-mx+{GB0+iPx-6V7in1!%8r*L!sfyXxU7W>rCK4%h^!N*6@^X~)lV0lF&Nz_8SRbAdrQ-#HPqD6DFqE4-3%XX4ImW_AyrU+ zBK1!rosIo$js9$n|7_9#wLB=rJSnBpHcg9t(2_W{58+&v{AAGL+)8siATKRbFog{< zRShy#4KvjZC*4prjY~Fl(?zWc3dxX1^@R<&$~w);J~>W=;nP9&)7Ajg(-73tAXM8h z)EY(94pme}Mb)FYksV=GIz1OVEm1swRjo@cn@k1OO;wFf9gR;NjZmG9QJoDN{%s8$ zP1Rzp2|3jgR}~mo{ZUyRHCoLaTkTa`Jq=wI4PF%uUxf`|g$-d<4PrIca8*@h?HFdw zQfIw5XoVhW%~on14QmYzYz+-*QT5tG z1=|l2Tfep3m<8O-5nL4G+O^eF!w8#q5Z%!w-O^1W%iJA!=oGk3*u_nM%f`*e$NkmF zCDqAAxyrrV-2GcQq*UVU+`|3bj3b0BAl~9N-s3%9LP!R?QCwE5t>A@D+1*y!4OYD! zR=(9;s^C6|G#2@Ii_C?d%?&lel}y9UxVCYd^i|*WU0)^;%hhe(@U&3q^-t-oSL)4M z+kHUXWmNLxG`si)Q)oMXbsEONj1-m-1XH2}1Lh;}Js|O|IP#@W^F{tVJ>0_!#^4M- z0rzEIBynBmgx$5Y--pHDd$rzg#onB0BKcJa5ez=H@FJpw#8+z1=x~FglL&bL$@aK~ zGDrd_NCLxRV2WT`!*JTrfLhCtTCKPq_H|ZF7A^=*Y6MdVM)#rLA{LAz28|?^j3us$CVt{4j^Yj; zlqx2~D<0G=9@;H`UfC|5*e^zw0H%aVmd59cxtS<1QD}rlc!m1@5kFlPgLbf^hRNsWK~n z12>tf!a{3oA7-z62u6NehzZPtj`oL-){BtdjFDDEbCam}N1`gCbHmmw2vea)WF; zq0k#W;?84&n7~8(r4&>$uqwYKxIg`gCL+j#YtFhn(BU%JC3eaLBs%9?poF}-CX~9V zVC;c^Okl;nLnUaS1Q>8`O29)pYbjBfZ>jUJS9qdma{g}vvoxN90kTqVpok^{2gMYS zDnSr4eiJA`5QU?AhI+{GS3)bltHti3goRLwK0EIQ=G|AVR9d0nceLQvPU+X4;@IXD z+Rj$n1`XT>4c*=h-i8$4=E1x`t{^aq&~3keyu#r z5Yt8lgKy6+&#uDl;eur6`1fGPqC# ze=8FPbph9mqttH^^CAn+k32sU?#{~<7V!?!Ez zz?cgjm})mDAnwrabC=j8C~!ej9wCQ+v$IfQHaSmp@iQ!-V7e@S25`f0r3MdE=mA04 z9Z3^iuBNGQUo3AHh={zhyeI5+|NUSjs-jgCq!Sg(yEN!}ZZd zb%j#(bsYHt+Ynj&p7V z=mrWrk2^V*V}B?=FRXZh8}AlJ2)g@*&yu3v_IzQp7x5y-j2bs`?0D{$v5q1~ zk}QeQ*sF6USF&sgaoDYQE@#s8M~=;j6DW4_?CEpo2`0E|5-s}h+pCa9molw4Y*;;} zQi27f29(B+MZtCWt`UqNf?kPw z_3ajvB(E~{AR_AO!_7e&Jv;X*NFI58VQ|UB+SoZaMuv$>GVmF+GBDhje_{@GnBzvs zMKxj#B?zU6&@xfF)rbg@XYca5Y4jOJaAW>N+>G_iW$d#gP{s;M(#T&urt~04RE_-g zOdc?lAxeTla3zQl{~a`p5h*x`ktjjr;07ff-Xc#)6IC=9iT-?~REZ>_)K!Xc!Gv3j zF5Q&VPc`-w)KD>!g%pZ9f0pGGR6eRz6^uf9wH1p-W);?0N`7_LFljl7Raw zgD6ryq)-q+aJgC@L^LALIeC=XBSMiTnujsBU?!86IVj4-ZFxXpf6P0XB;n{e!*CIV z5lQ&Rmmoa^;l`O<5-}^K2{qc~rv8ZjvL>sy3L=j&Ni<|k8D-!H=UDEA7oek2Q9^_u zTdipX6hwA~YrpwJn-tMB{W}wp0~3X$f59{{nJ`UI8p^OqRSFF8yITn&NOxU9Lx~`iKr`OOqL?B`Cg;3^ z(krh>O5i)Dq~y;tq9}FFT{5MbvM7GN^3FTw`0VpLAU>1H#f{t&mM8`JGoC2w{roeC z#&DboG+RX(=9w2$^42X}`SZ>zl>pEG09C@EJ$ma z3}a%=CZ=q&$TArtvq9r2WsKhS{@mSK$IuMkqda*vB2zt215IoujcBgc3Ok!}S;ny}->IWPem>2EU8F#eVsloIk?tYnVGpa`*P=%k{oDdT!x*3-V&V`5 zrt5RcyU6H1coEZy@FA%?ojfLyg%z@}g)Uqn8&*gNe`}NwA-1cbLvn{hgz#>M2l<^3 zVJ4O!ehV!`lo$~QMhPxVrv6LS@`xZN!-Z2d;v7qa6BfBJxsJS|FjXmZY$un*t%26JTgAw`0FkV4QkT`EHCtIZ` zHF>3b3}b6ixksB|`3y9gM2o>f22^7nLBi*A-zUKY5I_wJGACE^Qq4y zh7+A2xn?eJo^^ z;fq|1D6T!N;Y~kiSLNZAp?X~=Uz7M(f8_;Md4v66VU>4S#j>`wy;KJ_Vk_I(HWsep zlq)&udPfZ=v9l-s{p?6XOT^I{ue8QHt@2W9yw$q4xz5dqJ)$e!=|=ahmA&m{OPE>Z zZPs|c6)JFXsMQY=cX-Af9&(MR+~G0zx$b@MMx0tz-0pC@#_R6zzT4IC`c$}zf3ylE z&kMZt4sX4{YcG5gtl)#l_pbECp?!ykU*PE%u>39Ic>N0CWXdy$1O}dgdxzi!li0lt z=InzptJ`7nc8;P@=T)=&!3-O(yucH1?>^kS5bJKlCH`@1Pwd?kYj?%wZ1FE&Y)~01 zkH*8Zaqn=fJ00te$G7t_kh6SNeyFRt zq6axLt!a$-*}Q;mvY_8dXhs@3nuvy^5haN{N3&Y7knXdjjYsL*S^7%!e^4P4a-D@q za9YVB{j~AW+&eYjj?J`lGwl?O!d17r*=2q8?Z#POBMTJCp`!;ITA&l1u%Xv5&MT9H z9cqP+`kAG6=&7ff>S{83!SDD+kqq|kcxOd8=pqYW`udQ0GYs0alQx8@-BD{(4BOhK zQMWOa zO*%%GRUX-skdGiGrElb+5#L5gBcOnFjcENOgkiZsU{eN|*MydYf0@`hAVhMGydw`u z@Rq^+tvZ0KSmFamyTO8v0&aVI$qf(Ea3Rjnb5H#1E48>pF%Dm=V(E-6m>waGAah1wZIrtBa8g%U_y#XEeA^K_t}oKj-^e~2M##c;8ZiUzp%UY(POC?2Q1r$7Ga2aj=}miHd%>0pfrWeh7ja zLc})+LJq({e-h9NG<4lq&`cTVN4K1Yf51#0l))`j&JyVdro`PHCV`otkukVI>U~50 zBb0$4ltHUJk(T6PwuqfdoI@rw#$+@?K}4b(+=BGv%*sK8#=V{OxB(P25fP9f9VX&r zJO~k#fpQp2Wt;{R2?`~E$S_!99&8Dy6iyUL(Siiue=xwJ5rB$JJVP>y-SS05@sZB) zeOb?G*3U5v6A~Rn7+sVh-SjyeP$}L?F&dVgDKo$M>@vZMG9!-L0&+{ zGZf`bcI4UAB%Y8=HA2KShE6u-**0=lHzv$Ce>x$x)I(`*9KHk-+nw2b= z)%iy~P=bQg$Eqw~QD%bMaO6L-q8&m(1!a>#hyoEfBDT=tq2xgjyh2(?h8sYKVdTL% z1Yd!Op`_fS0Dea%Sj&DSM-QOSMVRD2M#r{%LtX$Sb|~Pxm8M`AWYA!y5mZKS!b!9Q zf2D8=C2Jzfazw;D3c_hdg*;5=&g5fce#1F91s4>jKfFQ?7$j1}qT`?k`uL{U;)aCOT9$q5ef32l?^`&6_rBS&fQo*Bp73Sm! z0t{?X3sTD~7=d?UWv}d8Mixm6-l6V=f1E??;b#`kL;568f*lda3Kx)}e1L{%jEZcc zVr`yeblAq%#0pTV-B`$jdY)oza2(8(K@X7JD?kAZu*pT#oIyrP4s21}8379N(5-N$ zJa{I7+(TAI=FrF?msG|p^uTE9Nn?c4dNxTTtPyH-PXDgDRIoO9WS%Hze--(~qc-W29>i}L0gO$l?j=yF{$nIMqBC+SL#PC@ zKtWjOh0>HMDLQB#vMN(nP9_xPK)k6{tgDbJ~&TnebX@MqC2T#Oyw@D1Bub`^n| zmVt&9f{vAfJ{NXb3~7>(Y28s6M1;fAl~mI7Idg z%9lRFtt{Zjl%H+}DMrL%|7(&5MYDS#wO@#LTfLR`?P*%}SZjnMD zuHopRbV2vKGC*{>8Si_lIEkCd<^|jkJQ}CE95JK(dSdy=k4I< z>FB4D&}%r_E4bmSXzeRtfA#Be{VQPwtYHnTb9te9LcuFQLv#G3Zl(Yjxq(PVCPdJN zK^ns|OrUP6Mw$Aic>HYng=*Y^hFA>tvqf$-*c zEZ{95t8Q+{#~H|d{7DeBXn|uaokOaFjjJpmG*^-Xg{u)WpA)H;_>wkJ}^|>u+ z!7X~pEo#xNYT0dbG3c)bL1@sdMh>a0v`S7sZf($s8%|4|G_0@gTRs{K;y$E5sLD#B zVHI6u8x>@=XbBO}e~Bf6oPj9t=u(TUwk${9DvPd4o!rBa&h8%?fn$0G5u{$H5N-}- z$fJzqO496NEbITgLQ#eWsMO)zNvp$V!mS`DPnv>ilwxCmoT(_vcMOQ)h)=SV!QO^l zvRts(c5lLb?-ACigxx9g<>}xxVShd$+a{j8Mw$B#82l!efBY^N{km4tu7+k@BAxIC z^_U0AtPJJU10VCTL8KfSTH-TMLb)zYBjiEX_HiGlmHss9;>$I{Ykpxd(#dU%T$q?b zdz9bq!busBA|dMH*(kCfOQR`33ek+k8iqv5T~e})VN`(4Bol_V=7F1jjVW~9c8YTF z8AAr8)h1hFf7w)qDEl$kxIrMt#K@2#f^;o3R3b35s^toTDagb(WX>m+9we6mwS*=m zpy8@cpeY10uX-q)g6({XE$xJF=!~zB)PpCm0X)MquZ{6tW>sF27yA}h8t2#=t5+Md z*Biqz1bxjnR1I9*11ce|su*M_iGo8vG=M=MyqO4$e@IW8JoH1~0vmn9Hy~`ty<7UF z&;5MMJ4i_fR?QD`G)iE!L$}RHhY4;-PyF%BNu&NtO&`SDn1;)-w8-pINgu@gb@bN| z3s1ko%<+YGriJ>LpGk8xh;Z~PmxlTzkmDfkkhbtaAavDiCxGxp`mF>O8;lnBjyh8e zI}3?Cf6#+kul4z^ZThzD8L!zsPgy?~*gqdwK>t`932;%G$?C=;VB-n&K|~}5b}Z6L zS>%jidtzDO?qatoIXlETgq>l_-c;bO02A$(VntXF%vj$i7l)Y_bC%kA7CN6!pq|d4 zhEAbU%%M_DqB6{)I+s&SG8nxD-*$*@iw(S1e~KvVc88SqR3Hv;mq%nvh5HnDCNLQ% z6*u8bg*?218*s86XGLfK%V&>mXz$r*dzWzjM_(BSXn@Uio7FXl-L;72HINC1K|7n1 zfOHIc#dY&bcBk`pS6X-H*LUyNX_HQBlg?^WOlw2TYeP(IC(LZSw}KDPeAi2Tt4>)% zf6Q5X?|xfYe}~S0hfaV)%z!gYfiuj38%%;PIEm9vgUicrRlf%aDgoksHjBdv=n0+LAL&f0HxJlN(Hw56qMg%#Qy{k7v1@%gdHyNtaX1 zmk&&sWA~UJU707$nI}w|56qhXOPl}8{+shloX&CrqCI%bwGB zpO0gu4@{sN%%J~Eq4Ue3^Gl-F%c3{Bs*?p{`GTvzI;^`oWr2>)0n~ldT7Fa5f2R9s zr~k{R4@{`@%c$2&sn^S?%S)=Sy0UY&IyAepKf5}3!=$5Fum8)X^Gl{X_^ub*pGM(5 zYgk+t8+jj_dGA=2U)hx}ySh(FonOhFL(H|;OSYrybF1~e_!9d(@wtg%f8D?zrV}Bze~Wg%fJ`B$4kY*J4wP@ z`mHBnu8-NnS7F4f&cxSC#aGO@KmJ|0SJ}D8S-O8b&O7?F4_UQWQpxA%$@f{x6Y9#N z_P5tqJ`ZSbzwcnrZD6w7VCKBk8%fA3$;cbb!oN$ybNSG-cG3Iy(LY(zf8SWlXWz`f zSLl4&zEh` zV~IR?0wKin47IgshxedufByA#zM+18)P?@kt$pbSKTDjxkEFiO|2=o({(cfd3-E;O z(Ee}5{kychyu3WSTs*sEJiGpEyz2u$iM)g5s_$B4lMtfP%+-)g>&R=Ie@lc?;9m*x z>xl8o{pyQv>)RR|3|>w=KRu(bJp(8}_!BsgU_pZi5hhf)kRiicf5YB2lsJ)MMT`Ev zi8^4voeAr(ljY=n5bt7ZkGt ziXpfZo)b0lZQp|5e_o08J6K@7VZ)>n?)%WK;*W8Vax6U60JLQzTn@=QGU4E5)Q@1F5}Cko1~#DnFD${|P|NqKpQP_jKS>(=F6 z!3uuf)hy}hI@vb9E-~)hx_9&L-Ch*1^zk$eBR;Q_@p_$*f8Ecd9DgQe&Ge1K{C(b7 zlF_>2$JWVcjT#OKZEWu@W6ZONwB~L1$qgpjox{s5$Wm)@Ew^2SOpA^iUoN3qzA2EY0MoIj-<4 zDY`sas*cZ+vitL({_g0q3$KLqs!ULh%3IW^!zgrAqV^grQG>>f9H5{Cv0l+yS6KqhGUk>>8hPbLgHWQx)w9%1*54G3aoAxlWs>J$Y85r8 z9%yV8e}s}^1xccjgA>lFR(AO+?-qwesm-uyGchGFfih&bHg2aqIaG!2^i;O6gs#ZX zq8kbnQ$oKx6#k(^k#4Bbs2NJ{XR7_76zhcG+ZrKFy*{YZunPi}zENf5tp_8B=)sMj zpvj|$AdCnCTWtrD=M^Y&Ai@YEL@|YnAR2i`e_tXpS=b+WG6^Du90*Sm3ah@6du_MP z60x3Jl7PaLdcF}P2qM}Rv@EeMsR214J=#zU>5WjJc-4w0`=^^$Y zf66ch8qqHYyg0$v#vO((-)W@owu^spm@**8wic!DZ#n22_s-!4x~cC!uOLDaWS0Xj zeaI9^=o|j-deDdtH6nR!!=69(7CR&4!F3G@8rcZ4ClngwXe$(m(kjI?LxrbfD4d!L z3j-+}3Pfu->>3WihQqPB&}{J;6>bJ6e~4~zAqN_y1iwTvjPcR#Yr!f*V1{v^O#BU8 z#H*n|DhC5Myy6?716(~Qu{uiBu2{^nT@xd+MJ~XL3q%-3<$7>M7Zt=9Tu4E`jB$=U z1VIqS(BEi`0RZ-lqD@;P`C_zQjtG-MGs(5mGN-_8qi>3A)mq}jU|CKPf3ER(uX}` zJmYEzIiU+xxWiIGY=eJ zL%FX;Yy?Ve`4oWpEW!>^&tAnre>fq%uG~Br=p+)`+ic7E#btP{AF904)O}RF^|PW7zzk0yZ)Op z9N2H1y=ke+usl;pwl?|;SB>jPCer{gkD{n6Ltu+S+2WA4E41yRa7#md7Sx5m#bI!5 zm@XiSM4uK-$qtjte;@z6v)<8S!JXQZOcUH_FL6U|Kv4=wrFGp0R<>1 z>@@?%=t#<{VN@K>($l7jX<%ASsZE9O_oG6f37CK5K9SBd^BsMGtZcm zbB|k0aBoHsnP$B?R3tC&6-*Y$_@10|p=kXj-$G!P*8FuG}U5bv12jN_#Wr83i8=(wr1L}*?Sm;Do zD-U8ENr^%vf0X38wX~95QauLb4-PiCzMOWje<^{XcQoi5hATPtP_U5! z4c~v#_tRXf(BAG4;42h(ztzl8HtQ4NVN>{aLX+VXSGf^5uLt!=+3|P&msqD%&BTV% zPE14cD>K&>PQPe_9IH4`mbZ^t1#cQzz-7q4vvjdoP6Yk_|0ql4TU-ng+5OR zLyx#dZ-+|HYfkSvo`DMr?I|AUZv!uI~>dn+Gik)0XdWjHo^)DI;VG1 ze@SnQs&gjCDLT+Cf+`5OKrCLbv1HAtChH7)!00l<;kXV8e94!9DyX>Nd_brJBW3=Q z;1flIHcIA!dgpUwtg-$^k)q=D>Zo&|B2v=Mq>|v&+R!RItzS@La3IkV-{r72BJCi~ zx!eGPl8lg=O&R%XFB;*2NYQlQ%{g%Be+E$~2fbzo^CT`%-~`n12X!m+glqE*N{4_e zs>Un{3vLO8=*@8G38&*6yhSGN!Bh~&6kH^jWatqk5GE|7Osacj&GKjdK&f0$q~nSc$FLCkoI+QOy?$>s>RhTzD?;K-&4w}u}D zB_m9sCu$0NJTMPT(=<7fB5dU}O;ZpAYb>6jG+DC|x={XTl7ux)GZQq;IG74Im53=e zhbD(XsLt*x0&{ByGi(YIYYr1X$iW(*(;CQOA$H4$;IYi)@yzIvpzJX-fAP_w^pS{s z#WrteZpvU7^o73;tiQ@Y6&s?O`fEM;D{;oc7~DWT4-5(TjCpTVci<3D;ktS z=}n&^G-@U^YAW;{FLY}%)N3}BYC6(r&$n-fP1Wu4N-gf9g zx28#v=1GwzN^R&m|1CQMZaaObJ3aI}jVnAMYCOv{PzANkk`zjpe{{C^35VdcXykO@ z=#&WU)bsFEq4ZQs`SjrY6uAI(P&u_zx290z^ia7hQEN+9^r=z%?NQ05O1I`pqb5tY zW=prGOQYsXJ@r;`6+b|gQAJhqNY%?sbxqxIPNx)WSQTqr6=`4b6f;Ak6)lrL;YL1m^lC@}-m1>%mYM!-dqLo_ZbzX_W z9@GIF@HJoc6<@b?-pZ9~+_Y#GRcKIE2vv15{v*{0CsnvAHC8WmGcz^eHkDo}wqmgY z8+;*SHFje&HW$FrU&%CJg=SzqrC=}fU@>{U-n@^G-6F}VsCb8sg@;nm0*3AFo9MF zg*LW`)?kgcXpk0Zl-5(27HMD>X=K(@XtrwI_HFHnXSFPAm2+#$v1_&LYfm<8g=TDv zrffImY>Osse~V^qH>GXiHgVzhYD<=GA=GXS6K^3;Z#fiYsZ?b(lw}95VVTuwxfE)h zP-+!-bV+w07B*Ge@P^jsEgJ$F_?w=+ezbbWVm5Iqm@$CZUFH_=a(K5^$mCG#G$4MSwkpfGfp-Jq3Y1MS&}Yfm0Yn zWn_s3Vucr_g>CbDoiu#$10M+C23r1Li@CUqyZ8nOfgFSsY}*WoH${jgg@`xBh&Kg^ zB}Ivy_#k-Y8(LH{J_V=>r|ragiChkx_sR zilv9kxPz1SgRwM(ad(8Nw}i!0E900%#&qjkCD0t>M}VXdGwEsapwAk@l-rE^NYMzO z0+4}5kOh;Fy*GMC7LnsahU(&%fjJ#p0Fr4Lc6}IA%otP9*iqCNQ`i_&+}Kgz_-#=F zf0GR&#op#KSmi276mkmN`W1VNr5 zkhUeGp&>wi<{oBap3Wgg5<@^Dg>&X8e?ho~$3Vvz+-Lp7StSI7KxpNqK}yz4wWc#z zA#lTe2*jf+B<9p5OTr2@KE{1!ZmFZ zvKD26sRUt_VS}mSFc09S4IwBMe-orP-GJka1f(>ZmUm}fw)$gx_Lwmxo*iYLKZC5x z`mFWYI>B2~lDSfrc~P3VQl7a|qIprKxnj+UeGWU2B1>45WEk?G3<8{Z21IoHW0Mri zoS2Q0`li1s3y(ykrZDchULgQ;6Dfk=><%aAXwQJ4Vh)F`n&!q04!bQ*f7_dV?6O2h zz{4;wbV{-|`_D{MPXkN}^WYXhx(td_uGGmGaEAzz%z$Kh1yMt&_$A5Oi{sh`skrYZ z0H}C^N`3Tme5@;{jQ*gzbgL(jqq(|U-o86z!J2h>d93B4P|Et3(Oaz5b%Vurt^c;I zmG!L!T9e&3vNhF{v)9KJe{G}#va!er=2VoDxZt(pP&c{Hrap$hexmTW1Sy!T!k5oJ zC)^;ysC`^gM%aoAbSj(W*nwChOLR=^LL-ANGC)?@s#s?vIA@X4POV-c36h{K@<)ua zXp9$)OIi}qO06~IN|w&@dz2)rWXWKBX(WINabgp_l0xk;T9j_Ve-i0ws$%9^D51|| z9VigIi8`X4|Ky!FMZ6b(7{2O6G* zUeWqeC=XH~1?=p$Wf>DQUN{mzHP}nPj!czeiLi&vtx8@nW}9zP{kD;VUnn6!I<7Uo zOXdrH)5yvGA07;}WUgOGgzj-{=3YAwpy2JXMd+`b5Fx0il3>rg%QSQf=_!KS`NZ49 zd+IB=>d)iqfA2Y;z20ouyl>Mzh}V5-+ufPp{fNn)ZOz_oj{+gPitTes?Q6{+Nl7eb zJHZtl@AbY^_#WZ&Xe8L`<7$G5=zmBU%Ye=0p;1be={`h`6z6j0+cN z{+?yz*$4_HfAviD5LC}!qodH4a(VU22$yH~1Q}^m@LfzO37?JpS`Z=^i(tzZwC4+( zJ+o}v{{! zFi-@M2{h+GW08kMnDS0N-F-6*7d>DF);kr6LPQY8tn{KWln?;}gf{V%(@s78q?AxZ z8UBToQWD0L2Q;E=SC~~W5@bpcFyzpXS?4?>qA`N>7@J*asdZeL2HoPBnaA-JrkcMI zf3}*NfGNgUWOkx3S!Hp`IU8qb@`;;hqyg$%YI_pO+G}kh%35u=F)G_`!}JCzYrzdy zX{LGIQidCOa6yD1@*Lz`BgSmyhIB7NvttfH1kr;`<#ADlSD7TioP9B- zJYyXflswZ27kRir1QafT^~|SvltIK;_4t|us8@=L;7z*f#FI}@0A*xRK_t19AWi<| zaISRM!JEXCFL99q6b6JGH7td3>Te^-3eKqf0og# znV&psCMdB#17_&Zm?>)XVU8w!n52|4t=FYOL#?SXZWvLoARFDosSyQoTCb;2xIv;Q z^9qv3!}Y)IOw_P$JJu@dEqQJB_&ERlZ!*e|-)mpw`<^J&$`mOeRoZ%|#}DG0yi(;t}!Qy;di2 z?!K9nr>tMk2qK6@bLU}^*`^RROc}#IR7OKq8)1Z}=MH0bNCnlyBw4V>4mJ_~Qc<2) z%2eys^7wzjY(8Eyr|*x=C%g}T{P3f|204ea-W4BFg71Kea! zY~#tS@FtW}3+2#6*C{AC=TB_u6|Kqu1sIf}DXYU>5)vec`+?=mifNgh6iKv9%|3+K@q*C^45fCiKjx6tEPjFAa}3iK7aoXt62 zq0oUYZe^x(14D^oe~gF*RFj99CMK&H%4=dWo13IbG$mQiO`da;=_Ds?OxaFPzO$qZ zlqb*RfkNe+<7set2Q<0^jU>uLTMW{cLBDd3p)#nbN1aVQh+0&6@cuMY?_lEfl)BUq zBF3YY1gR%QT1k>(@*SX5XJ_QOQcSjVlk3D}OgA}GOvclue{`*DUAZbruWk~ok`!xK zMe!)Mp4F6Tt>juU+15(Fb*!U=XHD%2*~nrNuY=SpCiyx@zvdONrc5a&3oFUPRx+`Y zTx=!dTFJRecD1baA7ue)*-By-keaP5XU)pWN`iKfqDARTLupz`qE?csZLM*So3z*V zF}9MNZ69k3f7{!VbFiV@Eg*Y4NYV~6xPu(-Ad8FK@QOE6%5@-f2kBe~LU*~+6>M%L zY27|z7m(ToBzFPnT|k0&y!`ENYt(@abqILC1I7k6(xNhI{!#v(=~du*&D&nYQrDcL zY3c#z+sFF$@xFb`Zy)#T-w=yfF!ngGFHVf&6#F6&qr13p-R=ZNrVC#=#6 zn-aqg)UX3N>_87Y5X2)cvXSLt4+1M$zz1%zg5TTRzL;{x2dr^mB@AUi#@B&7R-lg+ z2xJ8cS%E}8vYF3(m-5nh!Pb;=D5*?9D|Z&hpVe_FyL`YeA27@Z9PD;En4l2PL8Vcx1QuP0sTxsKo5G;gD!NO5B=3dW3w>wZ1i-q+{Y~| z5YGhEGXX6fKuiZv)10ognLW*DQ14aLBPF#dP3_)C59-eTl6L7yw_8?sHkPKCvbD20 zjcfnCxQ{U=;G(5%W0cZaw~%IOvDr##b|zb?LS%j zkJbb4IBN^ezJnhy;rm;7rf@NdNibsNjPL|K<}z>k)_ahuzHq)ryKlwzo3WE3WxzcS zfAsKzJbfZ3Aj$D(a!BEW5G{yI7OVmDE8iH^4y^gaZ|>V;+jr-u{Wo!c9(2J-oT6bT z$k5GK^Z*{6eMx7O``(8FCO{o551)F(cZ~Jy=Df6A{ui#-zYF%V>jfIGpo*r%C@oX) z5Ku#%DgnG-j{wQxg%M%LokI_8cW1iueYx&-W%{zVfj%?lgz2}Z? zw(0@X2qHA1p~dM=Y@m@UvdBIYIoSSNR5T3nf94(HDJY;iWDH}H7{Q_RJ^p|{e?H*@ ziujH({#WX*ZJl>OpXWcJw?Ct|Kc$C1r-whOcYS7&edbp}74j80#eE`CRd4h+BjI=) zu`l=1A-5oZ(BTmEKz^=Q4^Oi;Ve$=vzy;RB7XCP;egr{+JVk;8aSwvzMzQfUlyVMj zLMc^c7#3(r6etqCv4evF1-~?be_H1jyazS*$3FN+HTuUV{1ef2Uu8_keN{fe!Hvl;8$sP%XEy8=v9^z+(z}1Pz%Ghh<1j?d?<&xe@76k;)t)% z8}Jf`c|eH`f*l0mC7l91lyDC9a0`?$h;m2?77;p`kO})D2)E!7WuS_cBN~^Oi$tM_ zx9A4c;RY}e1l2M_q7aA6c!6L6g-j!b=|ld7P-BI1f`$G!5&%eV0!TmvxIYGnKM06F z3dlYT$UY9ZhF=kZY$OQve*#MnV-c^w1wlY7Mj#XS(1Ok~6szf#s$rAj;e-QFe5A;$mACd%$ zR|Z!C1*T#O9T|$%_!ZZfG}&lA+sHKC=qBH&h2hABUgm{W2Zp>QhCN1x8`gJcNPWyU zcJU~W+V>7LVg#9B3= zfW;g+P#}4PGW6$Sx^`K-7FNDyNQ-eZ{a2RAah7?OmY%nkf7jKPUiOwh7MJ*ih99Pe zcIg(`my5oVEd-$-jc}DGLJ-&D28Y6aFkmnu5g;Kc6RMdNf^$4QAvhDn6^&p_Cg>c{ zlO;JJn3T{Q8et(p0E1w05B^~|{;m) zk3H~=Bbl2^3M$rP9t-m?3_%dDfGs}t9$rzC8j++y;F_Y^FI*5X@dryTArG1;2p6GD zx*{Mw@Pb-75?pCCUO7HsYW_50Y9?fQd}f$@r1mU6MVFa=mk*XxG zq96)|0e+o27rt4Q&&d;vC3Vl%z#VSI`s;nLRH}E2=8qtAmA+1A0f2~wwtwV#YWumQH$gN%It^Nb9>?5w} zL$2v#uI7WT=A*823ZS9$jL*PE){zMvv{-ilCzwd1q3{@I2(F`8zxO4(^2g98H&dOy#y9{@!O z6rm6y5)-Cb7P(oY)zPRA0V|V339fU3f8Vea5&?;-DzEE1L(QQ)6bgP08ZR&ql{zA? z*_RT`A+IlK8EG?;^BR)=c&R75x!2OUEL)SHYaYJ(5cUBcnLr8CiL=M5x(E^~n@I_9 z^O->)w@B8dA4Q)2vSprqg`VcKv}XCc@EN@LGrZH%**@@J@gEz@kBpGDF6bD#(#K^Tk~J}2B&DI8^<>|iZyKID)LAuZCb{K_#L%QMVAH9S5yOf@-7H9HJ7Jq$HJ z{L2WNf+8`Tg3t(Qb0W7;e@{ALPukN%Y;h_;4b-NY6hmDWJruOEchg7s4zI9JM*TT{ z@zhTZMNf@`N_|jh(+C@jotVMYZ~;XssMTqP(RroO=(WO`<@wmgb10oYDor&k4K*$eH89OIGR-tJ4cPzJm!cpXeo=Y?Uo~d3|wv-DiEBX@5Q2 zcX8Gt#?|L--5MU(2>#yV z6W{(!Gv7&5-$`@dMw8!0v)>mE>+gM&;2J=;NB_G`!~p*yj%Z=MY}$?KtQSSm=jN>Uxo628QaXj_Pj? zTX8;ek#231&R(BxyqBKRnSPF&F65m~+YU3@IEy1{xkIcGxp9i_E~{x0zV zNAY9N_i<77gmU&SllG9Z_Oh`}-b48s2 z4iNqX4kTF6;6a256)sfx%oH?+5hYHfSn=SyTf^>I}+>$@45Br6i5sNxZic<+D6)Y)+IXsDI2Wf%0OWESiLpOQ;O(`NC!|>eZ{~ zZW+VcHL9^!=e&+JIqa5CvT6O%W7FaU3KTacDLf|%qFTHYzrEs`*Du3*!-kRkTlio` zw1yQ6{3c55;>8Z{LRO4XBW1%OM`GrTcV)}Y{^Y%C)c2eqL6Z$qGNLo$XhD5VLTi+o zVt+kKf`<8{O=)RKd3lUH4NY-s)#7-y%1*8p?BnKS%_fdck*!;}a_QQwPIfQz?pOm4 z4(}Cld9RJ3qlYS)Jyy#b-@DXIc>eu^p9ey_CF<5Ug5DX%KWLu$Mm~hT>5s4ecc3u_ zK!MJA5FumAAfl0H&Z*~?TOO|uKx}=OTMHFL}ss|cq6b#Fl|K7=j2q?CC<{7kbgzzAFeDv>|ck*xwnpa*K${z_$ zu~8r#s;nfe>%$tghu(mn-ORLwZ5titc4NF5~^!XKz}Xz zF42<4vyV}W&V#fg^(N)WJxeW$FH?%@;}kvpHY@`QQr);ECfZ2lV%1F6BWOc6NQJ_U zVNBtoCf)=w^`LVa=^+Iojyfj~+s?^^3t3Af@f~CGIO?8n8bKC{JRWQ${s&;oIQ5_k z-5AvfE+{$Yo?*&xHm6|($pa$Vrhnz45dgn2D%LWLp(KxCDog=}TaC(OCnd`;1))?` zbxaTV1cj z9*j^I3K;U3vLIu)$N>t}N((!O*bo-#qD+k7S2t)nHs&5tjL2bXK{6(B;~s=kGGU{L zsHyI^H#6v#9$-kq+aQcEr5;mqfMHe+kqr`SvbAhY9%#6L!H6<2bp9g=QJ!%Fh8*(9 z?QX7IM9QFZC<&r(bvqO!hkqQnh!qCkdL`D4AfSLKa>dIKyNq*&&0XCf(5}+LJn~3* zn5%=YO_UfTO8M!5TIPNrn7^MH(wYg~4$-7}{yt>E9(`Kq?<-v&>F<~3-s$xX`%Iop zat|`>AY`IKFwjZtdf+vLTnh@Oc!xZE@(LmZD+ye9-9ez?h8|F&9)I=thTLWXgEBm$ z9`D!*YoZqfE^y@=V$%&Jm}HD|xFH8cL&z|CKm8$18F`1W^DeY*2WR*jm-A z9&q6qokJUx^Ca(4b{1Plc6jv*E46K zO?>zwXqbXj4kAJiUVkBvnFQgCqR8DVZo!2B%8Pa1_)SH&_dV~eFMQk^AEU~r9Yb+v zed_z(&(;S&?#b_a^y8lWo`%2t{pB;KF{6AM5rjO5!is$vh7k~GkSC_jRYk#85KhLc zJoF$FjFHH$T6+#+~l2@cwt6$IiOE`rP{iXJx-xicbD6uG&W8~X;43Vrhy zxr0z6wAL#a5P>F8fM;EjP_;~;PkVJ*Un0M^$fq?jQIEX-8LuQ6KfZ+0lHbGR(=^FF zPCm_(Oao;o^M5kRJP?pDE_6dCppb;2+(K|)8^}A#kb@E#L=?Y*LIn@quXq;+-GaP^1194~ESn$eV1S7ankAFfOl|$|ZA%ww85HJXWR?Faq zSMbK8fC~}{y}iEs=jdr8cE1OM8ENkaVhVs z2@&hMM1SKeH}vqVKG~)*ZrYby7$FJ6=o}a1icY&eX1bjHt@{QNPT?ZxuTK%|dVR%( zt+*kv{&>X!87t5p5OGMr6GZF=`3-3Jq)LKl-Yfho6^bHqD=sB%(oEYY)JD>|KwIt8 zTKhigg)+8Gn{Co+YqZK zniIc7FankZ;;R%S!Kej+Moh~v3<+ge5P&W48UAnQ24ko)2)B5%gRMHM0zn}MZlHt= zfq#mT2nKP>O*RIieK|uZPZT*K2G3~2lD`w{DaAPZXeL9NzZWy@wdtebCLa>Y8xJkV zI`)cwsO-%i9MC4i@Em8k>qVRiq6fw7*exh=H!8Z&aR|8@?v4_-6kZwz5l%uLu67{- ziOp-wPUubRC68+-@s0UYo2E%Mwt@N5zIrAdGPw|F1cnpLNH*s! zpa86k<#5pi9_Se}F>NCdld7gT>w}?DkGA2ij%Nka?Z!r`(nq zzSFEdy5gR-m}$9A+OCZ@jE76O4rr!Py1yHqI?jSz*epnpxU zOnA!;r4fa0Oq3fB6RZ*DLNq0E7&2qb%MBSzI;G`ti##*}8uv)M)}hXuM$lv!srH9h zZ{@Ah1ojz%nDxzxpX*3ILIrkPk!4JO(fYktTOZ-Wk7V!!CiDbcAcy4xDc?()=Np>n zW3gUCsb9;V>(iO+(>}i#jek`^ma0J#j**pF`4WaGG&C%grNawR7!@?U6;T+g!Wfp{ z+KJO>Ln!!|vACKE;sPU3HnJE(rYS{KLUcJIgt`1t#GYZqn8_LDE5@OzLZHb+oteI&sXn0j zM3)IgQB;e1Fca~Ej(gaMbd1D_SjTiMjCXv;?&-y}Ai#of$G}Pp4&t&5Qwu{(8bnMQ zXw(^LbQx-tLXo<}OMi+n)!IZFqs30j2zC@Uk@&E2yhx1HlYcatfHazcjG2O5nS-=7 zYXll>>=|v08Eym`Z|oUxTp4l9NSU0;;@HTc>Byn^NS6u8PZ>!{EXkfZNu5bams!c4 zX-S=V$xn$%nrup^EDW0j8vdLF8l7Ajp5zptgsnN=`Y<)m%=sWK76} z%+{pM$@I;bsY_0|OH0vA>Elc)^h{m*%S;kYmL$!gGtEyzP3BBb^%RJGSWL+TNXon@ z+$=5KL?qtSOX^%1;B@{O;rtZhj2Yu}8RX0q4Y63jLG|&6EsXnGOAv z4xN+_4N)D<$PqQj5;ejTow*bx!WG@l7Uh%|<&+q;lo|b$8s(H5g_IoKQ7Q$)9u>(S zO~m;`QGd{s$|9A}Bh8c~&6FjblqThrC(V>7Wt1tcQa8n|EA7cF704|W(k_+DFU`3L zy+-fsIq)DfE0(M19IQ#mYJL$T|(aA?=fOq=*RB(=fG^F}0L3g_JYR zlr*)JHBFQ@O;l3;O`1i;%SO$~M_t57y%Tc41%Ft5LW!u{ICbQ`idB;vCd( zEL7V%)KVSRaXi)ROjW8})o5&0{P2V!fQu}^g;~whTD{as$<#^NR7UAkOZn7E2~|KD zRbn02Pcc>qMb_I4Qb@g1_Hfn{H~}V*)>oufm9*8M#8oTQRbErq@x(co1XdgqR&u=x zB!6MJJG=!Est5rw9Is#&hP228$rpr}NX{@abWw z!C04RP)m8x{^Ic1c%4>%tygP>6q98Xlz#;jm4y_RWfYgy6PS%zSc*NUf((4(S8g!^ zH$dByu)HMTig213-hd&6$U!&AJc!|fV7iDWQ4FL_6s27mrkxb04GpLT*@d80s!d4p zSV(qNNnQm|U;Wq1Fie3JTa!qhEP1Md@ISWA$AmC5zO%;wX)-v24l|<;c}O0Tpnp5H z{oJHT9)$p_a-5OTQ6clYheF$xgs|I(3Bsb4jn&=2&C}V=O`g#`hg73jh4@=Q3EWQ^ zTu3S0&Ny7DRV|YJO?=Hpef_z})zHaJN`R$EhQ-{HXpHEQmLNE$XSf&DxxXMamPVN0 z`HiTDdH#jTBag=L4|ORG7Q6*@QGXY-X+HoamdmIIV`zlvX%(w_-M*s)UObviP?uC{ zzaN1J1Qwu;XgXragZJ`T7?Pd4F+YSbg@(aj)xlub4eX!g%s&!6zb&+>z&uB9oZpHl&ejYtnHJnWt6T>lz*?ildz51 z*hzwf(KO-W4e6O6?&?_!a)VW|BLC^JX;CP+Wg|hXBWU|0CSj-)&{lSY6@BW4pnrz7yoZlbm3ALxV5{BS4`|ZYX(> z7Lfj_5O84$XkfRo@uH3KrhkihmTx#LJr+bkFp*KAG(&n%jzm`m)mV_^*!f7}kX_>8 z%wCsyVnB&vJ(=P}sbWC6V*JSBfps{bB8}PcuuKR7(lLdYDyNI+4^hY^FvGJ8v6U!m zr4$h4+mS9i3lYybBg@kxY<3<#a*9`ov2LOj3^K18x<70tATwj5fq#LRPrEol#@`;0 zWE+B)x=EdJDq*ZDvTv>jgwY^A(pwvmm&W;7<2~tD; z3(BPw$~S=9JXr#;fq%KOa3X>?lD&zwh{=Av$({`qP>Lv&izFXdCn1A&q4qfCLBR~p=i*G)AL(8*o zJeCcIo2CPT-GZ=eJ;Cfu(d<6qY{)2ZS_5YP6lVS0UX<+K&=hkgMQs69ZR}(1)+UN; z>1YK0B^HsPSbhg7D(Qm&xf}YIhHEByc)>~L0u@i8Tj1i%k{2_=2!`=6nEu!aFoIz> zs1mhpgnx&+y08*5ELyJ>0wTc@8_N4B%7dJnTDI|KqrD~M#o1sehiJh1bXdoTj)|9F z$^?=KG9oA<{ARkC;;gXi?~20ZjJ5OY9PoA>f_IHtB|h-b#zZ>DLTUF@Jm*k7_d-7J z^PqJbH<($}xua`2E8$21M7M6PVF^~mKcoVo6MuwY0ZH+PS@8>c8yTu&GRy7zJ3&KN zont{81Xf#UsOA?r(Qrx~X@U0+;b=j4xKFz_t$BBYuIpC58x}!`x^Z%7P;cMz4cJRR zD5$Q8*A0LclDrcU&1W?K^jK z8-E>lP%L+I-W5a3pr_S34}2r_2_q?>J) zItl{8`Nfs*fy&yAu*oKf0T;Y3x#mfjXR8ZM3!aE`VF6_zY{aJ6g1ZpHD3%*V1gECfoQ$nYCL+c zB<zjqmJuO z^w_?dRW@D>v)*aclqt!rN&53f(kJDyj(M(84mV7HvUGWP{<*)LUzr~kntvPmU!}*X z|GkABccdoeZ@-+(mUWS@#S@_&ezJZpXPj4?wJX^eU6-SbV6M1FJQR_81^WRr!xGt5vG zwsc{SJ!!ZlP#t>N6Nq7QIU<=inRup6DXM8xi*4?gAe=JIIOj|@+8L9MdGgt(pNCoa z=Sf`(dJ>q0inJ7>A!)a0L9aYlD4UDExhRZ_*10I2i2m;BsHdNT3V&0eh!VQ!p@ojQ zXrq=w>glA2R*LAQh-QlDriFGIs;;{tI%=V%B6_Nzsgi1@tgSlwYN4?fI%}b|7J93o zx$;`AwQ%|>D6oYJ`zNu#8rv+giz+K9vw}J+D71n~`zN*6!W%D++5Wk$pxyfUt+wH! zJ1(N-{(0`7>HfLypMUN8`L4VRGYs86_t+D$#1q@2PL`_b^eMi5>RT_r1N$p!Sv&SA zu%86`X|SIN_o;BhFT+fiJ=pkCv&}cxoQra#X6)(4e0J>Ts>enuD8PQ2+$YL?s@x~b ze7YR7)KhO&F*a9Yo%Pih^IY`3S1uZKpF@l5wV(b+m&}%o`HirIG=^* zd3c_Q+qt-%jnDbGkG$c~C`C+TyVJ}2sMs@}Ts$NTg8 z=CN}-`>?gE`hPL*p63a=oxRWbJDkD8IeeSNBOiX`%G+u0pMBe@dHK>So%^5G&xt*p z+PBGlo8GGlzWDo7P5zwb`w4w>Qs4jBhdB40ZFiJXo2BIRth+c0e`nGk|0?)0|G^1> zeG(v?2$(?wjt+r@Qy{DuC@Tl53xb;B%c3a$Xu%i83x9)c(jcEW*d`Co&`k8O1`m7a z!yZ<}OKJKS372KUW}&cPDzp^~IVBj9!7z#plcAbum?s;m35QiQ6E3oFgCT%1jA8sD zA%fVWA&N{q3p~=ml9;k3MyrXqdZHBhcaL{CX<<}6lNIfR#WQJRC(2+a0KrasQ;k7NquDF<1| zM8a~BjTE8?KUYL^9T8oYY#SyIrb%~kvXjVbL=r^d4`T>I5bAM}Z`xwYFrgAostgk= zq3KFP!cvipbR>=-`Mz5QESGIu<{RC^{zUn-Fn^fBG@c-Wkcnd^lae8VhA3VEMW;N| zOVMo8G`&SNkwHg@P+Tf>bPO$>L!AcEmPvG? zb9;t_xKIWt^uUOZ4l*sExF4_o_ zh6EbPlu#aw@r_25fv^7g$TujFS^h3GVt=P)fI$w*(1>%KhOdG!$vZ^h2F!Bdt2D{y zmiDQpes1ZXwGF61QJ_^?QqNBCgOmK)L_amzPfZdelMB^)tqA2H37O474vcvVC~)B% z@(=_Jf?x!==70#_4MKG%l9GB{7Y0E!tzvsXgjakc4?V~OWIBK@X&RpPSION47l^ZhNF#4f8gu+XSww zz=BI{=mulAy!YkhKj574#od+(1c8OEWXXGKgnV4%1LaUN<Bzzxp`3V!qOjGg`_p??RakcWhGAXri4fD4xW$UQP)1TK8^9BwG`GemJ_ zV<0&Nu~l(QGR&h5lc~cz`tY4YoXy`Bw3gK~aoWP_yRibVtZzFj)Y2N`m(?Q^K`4WH z8$kpeyS2wTsH;CHkpw|(1k9&Z$v2=-UXiL}KEvkacs;}%VpwB31;S$<#C{`Mxx2I^v zF*v7AgUClk!QB=ebn>K>*b0uiuc=IXLr=kIQH&wpNT!ajK^Uq>x@N%&wJVYPiu_t?HPo29o)y^@td(7><^=;fAdF_*D zJ9OJ#D4i4i??tYt{`&2cu#{`9+`ka&{JXz1QUS^`W=QK zq6~J@FFEr`czSc*9R%^`016UuGhcIHgj*aF!TSBiEf5SDC{)(5k)2Oy9F1_Cmv|hF zfSdtd(+N1>143Z$b<^+BUGQDc@QGFNdE4=UTk>tv@-g4SkbebW<$>je(p=S5fK`@8 zd=iC_g&T0xYz)I*QAQ>hLnBm{edR$8lA0i7LT+@{XXOD$-NP-oL1m~$Yf*+W?S&h- zm1(KeUvZ#J6kv=T;Fcs{j4YrPHXsB-APPtzS5aV_)ZLlf9hu}^nCxAc^xc;HT?jgg zLr971i4rNTlz;wtMVMTy6qJ~PDEOft3I<3(1CgA=O1Vcpe8V6f#2@;hv36DOUL_-YXFjy8th~Ci=pxNmS?eUZCO_iY)&~{kEBoM+Y!eT5E!X)5= zC{Ca$o=F*!$r*-88hXhZdPy7h$Q#08-DJXN9TsTWqJK;nVKS=LVC6>@y2uswNEW)t z7EYtFGzM^RV>bdv9-T;6*^+FXm@3Xsx7E+Loldwp&bSq$Crws7GM-J`U_2(%4{nGw zt_U^qh&8SVHtr(``OX-si7ti-FA5PlB9}S}4?CugJHBK1+`~jtBsi)>MOLJT=;Mj- zBaZmviGKk8Bu5Hl_7G$)T44NO;Gt;@B#DHiO^)RJ zlq8uLq?aIMK`CU*F=Y2RB=JDxOfqFYl49lHB8Q=(-{79m^rUh9WS9iymJHonk9YIWQg2kjO1j9?4(*=<;rEHmw#+!k96fDeWeie0_Jz5 zrH8Dgi?pSOyd`1ACEm^DmeeJW++{cAWoB(UXH(3KGDzoiQl~Q1jO;C2Zg$*m4p46b&To=fvYaGwrDXQBW{~-7&#W2ryM7GCMO#%XUsL{dnzbT z>;v9VjK$PvDQZl9-q3!oPfKFueWK=grhi;{p5sa`B!-IROGZ>oF6fD(MQ38jXP!uC zV#sK&Xn)Gxf8Nstnxk=@Cy%5jkE|z+v?q!JX-%l8ey}KsxTt=>D3Qvj?`f!Ta;V*T zD2{@tQHm&Ek|B{9Oj_fFo^k|Iy=zo^V z>HbM{DSmvZhlDA9jH#WLsTejXjtpmv6sL;}sE!tBFdnGiCFqXz0iecb7WWX*+ zr|M;uTIQ8DT9%gTuh!Y4mJix((0`-?Ql);7t^#MI#>lL$NUg3%J&?n+Qfsx6!#7xK zwrcCPa%;C*t31HNUw~?ii0X=vDzKvHslG?5V#un#N2{*us}gFgHmj!YBCdwWJ9t7C z@N2*N>%RhQzzXcZ5-h;7fhW{xSd6QSlPi>W90o2fR+Kynn8UI1c_A zfNI-~t_VF4!tRl5$(roR#?lQC!ZNzW!mdcelE}kC?0ZV=c~ESASnPRVtj%g{IMORK z+3P{#tA~iJ7aHx+B5l$t?b3Q-3#_cT9x7}msv9oq%+6`ej>pa7N6wDN&Sq`Tk_g9Q zo5ud`;=-=lE-uufE~4_PxcTbjc2Z$c!Z0*~8w_Dh{ePh#xB)11b<}?V z@0NkCmSpGXI!fPi$L+KavjXklqNLf9$m_=L_Ll7IzOCc(DCEkf z{)Jci!a!`*!|BDJevvLn+->v{YYiD|>0+-n)$WXnr}dI&{}L@BydC!t;5mu;2@Ig@V#S(kV125JKSimDsvG4{h1^y4f#6p+j@CN!6{%qw)GIWk*GINK|^kOvUM-1Zm zm+|oi>j(a=Y-3AXZ4NGW$HMk+SnFk-2lOZZy`YUp8o|Mv;BKwC zgGz@tXXCk*;|J;%{)_33LFtxp=|Tx9kD+$_Y4DSkd-#{*0S7RDfBZB(>;Q32;5~u_ zhb0LTB#FFw4IMfZl`zjkiWMzh#F$az#YPe_b__DH9+!mB9-bqT@L9!oMpQPG2PFuR zTM0$gLm3j}%7y~v6}(q3VnR0~O9Cx8P~%XM8=XFdn$cLoAkdH!6qJz2yLuptR?OqE zYeG{LL6&`Zw&5^;v1~(DRGX1$RJwJex`o2fVwr?SxO%lniRjq36wf6|!bP6Ib4U*+ zT!?Y5UCNa$U&fqS^JdPSJ%9cN9a{A0hR~qB)9X+5YMAd#ldk721_=@~Y~Qv`a7te%3VLvOy!+Oudp z`5KxkpAntViF5G`(P^Z#fAi%>BNRW zvaun)h>$6Nyb<*(h{uVt3gWAWh7x2W7h&9NJpG_+j=Z6W@X;aeM2gFyFn=U#t+uEW zv&^M*q|!3HSagWVAfgohimDqMDlnl&>fv!KiiT3GL?2UJQ7$&yL^M%F7iF|jM;}Gh zG}IbejkS8@aqZ5}?5W3>3~0kGx82AfLyX`~{p|#QF_L37Id`4{slkg(ac;R-Zv+p{ zp8E4Jqg)#rN+ARv%JQX$1mps{R~(`>yXokJbR+J%EKR_Kh9Psnix~88N2-$G$x8*_ z0@0X~hK*~r$75lx4_Q4m|Bta~UEsxo{yxCvnT`U}}2?DUgIJuVQG2fMrS&9P+wioqX~VLBFn~iU#LGb!&}w2;Bxj48rbz zhO7+1luDX{0|Rq&EJdEr+%U_#jqtpNK|op~P}9an4p|HEphk|FrN=-$vXL zgybzxE843QRsIC=3Q9N*T5?K4CWaxWpVh;CP!JyRm={0}cF=<#1R>S7MyalSO;e!3 z!q{#T22!=KH);zG+fG0nxFLrbP~ld8-zXwJz2WL_hT#?ZO!h?wyr?R5ZpK<8+>i8HhzK$>Rna;xaEH(2jh3T1EJikSKY7E|I2d z2$S@exBqdHK_dC&%{ci;iYP9TT=<3{9W*g2MpBL%V&f(0NJ?7P(w4WxB}GP9kFI&` zQkf#nJB0qALbJ87g=vE!aM>GDYF;-o^A-VwwYa&&`9_@cRcK%0|&VrUB zpcNewluRI$3kvm}ck1UwLA*ntq~y^hxnK%{G>-@;yoWsS=!R5Q1Vndw7Devy4s>dT z5(X__D@$ri?ij2*dSu8wM1fFuie)I91S*Ea(l}XV%ciyzqjR_*h(HQ|^d7e;k%2@p z&U-YJie-3)Dkn~Lk$aqD z7@`2JF)X@JmA>N{&oG96Xf4Y@%yQO2&@jd~jL{g^_A|D#y(m@dAzRp*M6;x5U2xWXkb zPG&od6EXL>!-(!?d20;cj@7>R#czH?Q`Qpx5^SPThFUYgR%0T66Rwru0bNgU0~*5Z zRX8l(Q{yRAa~R_lhZZfChYQ~3mf6vdhIFJQJ!wi;+R~SP^qDP%ssDy%&2DxxoDZB} z6wuWMO0ctW9B~5_FajQeZgiiUD_s}Idds#ZEqZGmUPWVn+Sk7ZcCdv#Y+@JN*kRSQ zYSIiEPUQmB&o)&uNnL6i@IVQxLQWNIux&!T`q`m3<-SBR!BqpH* zwJG5Q^`^Fe5|qI2e2anKAMZCCfR@*Um)zthM|sLszH*jZZQ=fHH)kFWaZ*L1A)cW4 z+D^~{jH5u~8oxKlKW+myP^;xfM|#qgzI3KH{p2raw`dqLbBIggQVdB(&Xsxbdh`6$ zKL`8ILC%Dgklg8KM|;}UzIL{^J%CULW@x5Pb5i+#;T@dPGdbjNDxSB%@AVFQ;5Ytp zCYa0YZby9L6~B1KH{S8}fP1GsGk2Q%K^=OANj=oT2CXO9?|=Wg;Kly&Az1zc^N&Y; z>Q%pb*0-MAk&k(1C=YMT*8}g>yVS&gV{sIGp6AvU{pk69gJ7KA^~Xnk@|C}Q=7$jW zQg=9i#Qoq6+h2qsxX5|mKi~V{gB|2H*oE<%KYsF;-~8uCzh#~;_vk;{4%iSsMHpfY z-;mn(_U^v$`;CkEr{Dko2fzRnK*obThA==qJHP})zy(ym1Ee}*QikelKm?SB#W0ng zo*%{wO8xHMf5^Obi_u4#7C6GNTkF`w8Top#7oq~OytB(^u$gC z#ZMH)P$b1sG{sVcywl(sG=sS-tiT7{Lr%%TUC06jvqgI|#9TbYQe%Wu^hH$s#b5-+ zVHCzjXZ`!E*=(MgV~mm@B%%MP2Mb zo}(*5;0kF}M`~opb#%vegvWQ3$9Sa2d9=rR#K(Ko$9(j{=cB?`{xl}5yF4O<2X!z8 zTkr%%AOu2SgDh~!hlI$8WP^!h16$a~i{wX))X0qF$c^;Kjs(e%6v>bz$&oaF$rmg@ zKUB$;WXYCvNq{63NstG7c*&ZyNk4>#f>ei{%`9N)XweX&hGS1}C&;m8k@9fV5RnP@x&<1tT2ZhiGl~6xS&r<3iZ$s710rYCD9T!(GzV@b;F!YLD3d<(HDi$7?sf(~kX~9*)1c8E z<>+WKGjn( zwb2_j(h3ArJoVEq zR6DIePc@BGMb%VQ)m3HHR&~`^h1FP<)mf$0TD8?%#noKZ)m`P)UiH;q1=e5{)?p>q zVl~!dMb>0h)@5a9)@F6qXNA^imDXvc)@rrZYsJ=VH4RHe5=f0yn7|ZIrBrPt*K#%2 zb4Ay5Ro8W8*LHQ+cZJt@mDhQt*Ltl)^EMKq7>MHElS2P*n>sb zgjLvuW!Q#w*oTFa?|LI7McI^9*_CD4mUY>eh1r;u*_ox;nzh-ICD@z|!BPF!7W2cL zm&1+&HYFw7vNhYYMccGh+qGrewsqU0^+Or^*E1C)m3-T~#oN5q+r8zN9*+YTe-&7~ zl-s$bQu*W5$)()NwcN{XPL+aOZ?&>I^xV${-Ov?X<|~N)&4pYg8{O1Z-PL8?);+kZ zFx}Xd-Pxtx+O^%=#ogT1-QDHg-u2zz1>WEl-r*(Q;x*pmMc(99-sNT9=5^lZh2H3u z-sz>@>b2hM#op}I-tFby?)Bd9BL&~^72okC-|{uz^F`nERp0ex-}ZIi_l4j1mEZZL z-}<%Rm*2GlMSl`D;S)yT6jtFCX5kig;TMMC7?$A~rr{d4;Ty)`9M<6-=HVXp;U5O# zAQs{wCgLJC;v+`lBv#@jX5uDx{^BQw;wYBlDW>8ow&E+s;w;wUE#~4b_Tn!F<1iNE zF(%_OHsdo!<1|*|HD=>BcH=jO<2aV%Ii}+}w&Od-<2XFl<2~l%KKA232IN2%M&v|RfGIfqD&Xo`M@>V>>p zkmy@5iHCotX>%5YlE&$r*6EYJh2I?pon`8b{2ratPdF6ju!gLmLvE;#C8=v}PVYMoA+Mkec#hJm4G-b@hbvX%gl9$?}s~_#Rlp!$X!av zY6(bb+%*OXknF5B1;Wm0{=;tGcL40pW&kdD?9_(l$Tn@9PJ+XZ-5k(ry}n&zXzi>X zY(y?>*e>3BDDBp6Y}FQSWoGT$CTY~J-DfE4wYJ@7cx#{zfjoGH<1z+OCD(Uf@*d{M76jNzt<*xT&vJv`K59Xz-8?Ak2xw{Aa>=5FN$>zsxHZ_R`dzi)pCm+@VWY`Hew;tp`xeTAI900zft3E(B! zHSnB{0RA>zQvm85(EjZKSKf2L?vhS{Acxcv&uI^z@hi9G8lPPxhjH0Wf}G}pAunkg zH{CDSX)?d@5LapxXY%B=?3^ZVNY#LxW^OFE^I6vN*%bw#w(`0C2Js$gs)p~8&T)U! zg$AIO@7k5^oNk2b?WfUE9rog0*BAzbzUXiG-Hmw#(3-aiY08FN zF5l{8-}Q-CK6CbH_vIWSGFE#Z5Z%sNGx*S>m`hg8N7>^`p)qTgzs_twhS`Lj>^+6U#ek6pXR z={o<{wkPRkR}IxCX@&2aUoUCJH(t;uY2MG>dXW3Y4*9O}{gNK>t^t30oz4SqeSXPi zeg&`c>DTJf>1^cw{GX2i#g^{IddPkDh`0Uxzx^|}UFBy0 z?FI;c0tXI!cYy)Igl-5zi;yrO7lIN8=6IO!)x?Y%H)b?w5n+mZ97htY`0?b)Mj7jc zI4R-W#1toCh@8j;CC)963nv=O>GNmK2+$^a1o|^bO^Jd&hSZqH=t(FUhkcCjjU<$h z8tRek{_6EBm$4TIB7e8*(vKL&2B|u9qo}IJBo?;#l4H?_5n$4d{IKcSn<#_iY2-!& z&cPC&p-dw2so|+PlL%^*hYM(zS0(lgT82_1lRtBG&Lb0L9-;?*@^;-Lr=X01FDE6K z7$pohu62J5F7e&1VcNCd;>xk%N2!0ulP_=nJo@zN*RyZ${(n9E`10qsUH(vXSn3H) zan#QM^FWlGlnF<*Sp=Y5mL-JXShoO2*+91p=h!BZDb&GbtxF+Suj*} zi$?V;(L29Av=fRSF2>V~Ldxh;g#-o4Km>Sd)Ch1Bfytmh zs9D74M4~EE3PD|YJa9zs%n~%sR#+xVO57}1ZP4y zNGj1i?>PG`w9!7>sz8B)3YLR{al{gj)K*(0LPYqJ6;s|$`q7FTacU8x10kExi4!$u zkyRV*m{7fzf{ReRz`8{3r$WwY-Tp>p6l>OVA5oGk!woz9FvJl{JTb*u?n;)bDy;;r zn-e9x=zp6hwW|?TP$9(MbzG>tG8a&kvFulVJ`~YN?=tYKL?s(FEXh^*c&tv4wh6O8 zs*1O%&)4m18c9pyTr^WcUii>fBh5K7SW_QJbj4kJ{WaKOi#;~kTV6bts)J_qN=k%+ z%c@4uu*oh-Hv7cuTWivbBuDcmbhM{XrJKY8sJi5#E_6q;`QOhiO-~ z59Q$1#|S;9(URf0Wz5`~H!A)a<+Rlf^yEr&-c?H$bu3W81nK?I@gqTV($ge;V<$?N zzkj|y`|Z2`KK${QceYsc6ZDOXr*g#hM@CS;b08c=$zgG5AnP;?~WQ^67IpN2R z+{>oOtaihXaDi*YyeB^Msn317uaI3CA2WX?Vla4GgpUK6CqgI*7It2fpr7Q(lk^zP zW)gv*;#`m_FGx;wp3^JuXyET`S<81iR3ZDzUsYns&y}*Yr7nG`!~97S9qNyxC8e1} zXqpfrhQ*RNtP3`m`MCi3g#M=)iD*z@zy&vmLLLacD4j6a(T(aWc3oj0z0@f}jM9Iy zq=HgcPM{!0n3A=uW<4uf;Um+L)bSydES^I{Xij`-b(F>g>PL?BjJ@);uYUdOSVsdC zf@x%N4;_%vPv|9OO2{=OdGF9Qte{bg2IWRqzTVlwk&j2Y9IxB{Ufk8S}{0V9pM z87c5_4{TuR4tc>VG*!KqiG`%tMd*J3tmR2ly3&@8DQia}A)HWB&3^8RXjkQ}OWAfL{A)2$SjI9JZ{&6f zk*kUyqOsyCPavKCe62`@JP{o8nZmm6GaEISU=Dr=xN|;OS0_x=k63^9pdS$zK{A;F z(OtUQ*1k5jspKn;$iot~lAks_SUb%>c(<%h!Mgb}}zzsEyR4ygW^Gp#bij*$D)pxXw1lGp_NClSfrS zQ1!};P+rAMgx^0L%aVVfJrQzSgbT)oMk99YBclYqSIUAHmE!!Gu*lbz}gmEwHm z9G3ZBoFYDn{y+}6PzEj#!RVQ$IdaF6NrWWf72kNrIY_C;x`uz*B21GA%bCOwqX$70 z&p5|7hVktxz5_|`DtLfnjBv^pH51T)#y4(}c;k61(M_I-=biNoL4b3_{;;zrHDC7G z)4ujvRuw$)R$kYC<$I&bQ}TR=ZZla+-lKyj?{{uI8wUz*0}1LaHBghwLw4AIHnP*t z4!XSG7@h-WtXF?!Z~O6+zx=4h{Vj*S##NP*B#;(2;^FxcAQ69Gm|p8$!U`Bk6=Uf@2Vp8%BscWH$3F@XP+ z1+NtpNB)GGQNRF9jG#6#SkjS2i49iC$=u<2ApZ@73FdzUnT^l@G93j@77I?0?-14k z{+d9nn@x<&k56UG{+w-(=U$EKL5H*Ys)DWm#X(C7d-$p=@!4=`lnOrU>sLAUshZ z6egk~F5-Xs++a>zfKpL{#P!^&NZMC?ApB(nG?ane%?#i8R&KrFP8r`<)B`1C4^D(Y zA^L;=nMhacU8(7aPlSLVR7#?pg!BcNo(;q^+}D2*pz(0tLqS6w?hX?g)-DpnD?lHn z)FS?(D4_ts8Y504HCAKT-GjG50V*;8B$mM|SmJ+qK!Yf_ff2v}4CFu(FclNt1$N|t z5##_2^Z*y+fhm;HD{z5157N%hyCSsSpA_pax<01zre{Cv5B5Z*W;DB%rCvg_1 zaULgfCZ}>PCv!HZb3P|@MyGU6CvytH79@f)@TPWdC)soYb$%y!hNpOrCwZ3VcM3r# zaHo2%r^LX4dA=un#;1JF=X=5dd)_C0){1x1Cx7;*fBxrure}T*D1mB;G5{!oCa8ig zsB#KHb`~gve?};MBm#q0sD)lAeI|m0ZYYPc#};5Hi2jDCh)U-cbf}4*=y(L@h^{D$ zwkQq=0gA?`jNXNd)~JnM=#1v5j=IH-_Nb5k=Z*%cke0=d7O9cG=a43;l9I%cHmQ?R z=aNRLln%s`R;iUP=agotl3pp7cByb`DVPSSmyT(be}<`<&M29t>5-l(o1UnezNwG4 zshn;ooYrZL&MBT2sGaWVisq@G;wPU5Dv16mp{l2#9%_Xas-p5HqBd%RE-IwrrlU@( ze@3dM(k7*5>U>@*r@|(J?!Xq*K_aBV4rr>H@&z_X#6F}dmc2p}NPqwUfUM3ct=6io z-YTx0YSA5wNO2 zB!Y%s85bxkxt6QBo-4YhtGcc$ySA&X3ILiZsxs_AxYpi(3g|@aXSQy_@sex`vv`0I=AgNKc)!@exc#;nZFEY1FEyl$kvGAF^J6}SE?`Ss@xRO?1y1Id;w zUDyL0aH&9 zwrxgZ0vTa$ILn0t94jcg- zWUTxk?QouMSUfKC9zh*IFI&*A?E+JO)`3^3!`&ih+HyqbR%jhm?tvm_y>o%|hKQIKFs{~B1 ze|hY~+p_A&mTz2G@N@oBtN#Kp>L`Q!CZ`66h4CKe76`3en1kYKuQDhu^S&XT&~?uY$5_5Fh7*nk^gzY!a_&UDyNEHs=s$gy0?l za2Dqe>xDg(>Jfl2Nu+^rez8V~?f)h)e|yAg1g|k0x3L?~ssNPg4$m&*eyeb9@$Qar za@Ii?H!m39(>{nXac+V9{_k9%F+pT-m*i{}lf>SR@fOJO82@ou>_Z*%uzWVMM&z$? zUZ?Lat#9`3BQL0cp09C|u|FJW6WhZR53XH|@^Z#-M&xfN$nLcgCnd{8AEPo@f7CDa zCNcP~FZiy<8yBiFj&|FbP9pcax#Vj ztUwqrakg)l(uF$Y0^~X;z2*Wof1q<8JM%0L@LudPI%mX0^K(HD=l&8iGKaKCkF>%n za|K^=d8q6+zmLRTtV_T2#cHwv6ZAyvZ8W!qI@|F9ZwV*cb65!Q2WQ0Hesm?Hv_8jY zMsI{3BPT!$gg`s(*=|86Vs@dz*R+dA(Q`|nh5e|2$Uu{jUt z7OeGIuXS3J{-<2z!csq{;Zia-i|iy11S<^v_Akg z0x$DGH0?_JgV>_-UQfh69JbO*1S@N+?2 zL-a%#M!&63`-5uFc4E6Wa}z|$I_*9f46B12bF^+F zHb=}iZ5y@Je)kK-C)tt(P&;Q+`-4CW!RN;BI19M{Dnn>*Y;ij1e}d1oc?*Oo4<{)v5oujK;W}I>o9whglR{)lux;?qBcih!&^tV zK)`qN^7tSFa5}t~d9h zQ#k%87iYMdGLk3puWR&&(scb2xP%)oDxWxb(nT&*I&}JYMi?+r4}>{XGs`yfby~VV zNP18sxN=gqwV!n^fBK}OIt81%0-G&zlCc5TxIavEq675~B=tl9YYu$YFyw(6H*5}2 z!YkYYC8Vyce=-0)-hwFP0RiM{1iS(z4E(GbfqShN5&WtVWWp^Vd=KcV!80(hcKpXv zLdef*4rF|L<-i4eR$oP(tTMbQI6TDP>OS7WD}0-;=KRhZtgWU%BOJUaxGb*BM|{>=xkeBz3G4W|%kEPb=QH22hX?y`+WUtie`l$_y17SoojY;56X#On@t}+T zIA3$UCZosNPd7*G=f0b7HQT$?lP}dL=NIen4WIqnvq#T1=P-{1kbAoBUj2*OySXc; zx5hn1w@@aJg*tFO-`0AA%ept+UBW}n}v~UJ*E|~MS z3&hBN^JFirI^S*5=0cj=XA*C*L3`_dvUpbjYpG3yJmdhw3PAZ(6Rn=VKPdhC3xxX9 zY6QSc3h*ic5M2;CeXWK7K=|_~2tYxD2N4o5e`NRbFLQ9O5nBubSm4RWODv1Lu0H*wb7fddCNi~{#<;fbS8u3U+R9FeGP1`QT ze>*ghvQArZ20~d-Up3xtB3#*33}Z5x}2812!!8E1babpj)A74jZvcD0DNh82tSzW%@LV1a_` zvrYnJ4Zfk^(95&_{?ku390+7;w+IEoW+?qEY)`|X$jeL_AvQ$tH;fXKj-h?ju}8%f zQxvN>{k-DIw1&{qFFq6f>8>ZHu0n1s2rp|cE`jWskfF$C6cRv&vh%65wYH+Le@5_f zI!LB>zRB_%XwG5iodl{3Q_Nw!3`wAK3@E6FhPq@329kofN1!(kS`#CUa9T*9cg*zX z7Lp=>Mj(R1)YBh68Tu0dN-iq{8Z8CgQ_Cz< zfrJu=G>CKxj>9VKQM1T!tTrzmhe9sCEq*IeFA#C)&mU}@BJis%8lnydWjn0bUg6N1 zu_1d>Tv0`J4*RtsVOtCLM5!ngvW|(Iz1LyQ_CX819q9e(t8V3jw%6?Re@nI@W__{; zU3J+#_TiIJPFbK3S>B;n%$U`1z5@Z9dB3f?Qqo|5n#=h!pN*3)zC;d-SVRen)p^L~ z$h~<7ZWGS$jYbxr&rBN!^9ATH$e$5cK3p8@lNNEHPjk4&Dq z^>BZTNZ^9eN6*Pp$2Dgtg@T})F+X+B zHw7@|%vni#^&RAuXEjYx{mG=DAV@VFA?mFM0Q*u48Xkbl1D#H;UB4OD8uCv`;N(-VOAHxfooV!fsxvj(5DlLaH127LZl-w@rh8>{?FS&qn@{^#~fQpkc4d3 z#41J+X)dm-bf7M27wF% z01@z1JtAO`3&`n903bl0+=LL`)q?@LVw689aS-4U>J=3Eq)mPqOoI%wCXDlkF3&klp#B2CqAqV0D}djchywSbHE{Wl zfJ=#}IUeaqC7I(tMH%1^#iNcyz=5SLb?Hl6nh1?%3}FWiO;=PDFM@t6p(FIE9iN6$ zdnv;xMa_l8h7!UobVnZzDKSg3;MEW4{h+Dzf zU7F@LuYrbWHxrr{6?E2%dL}|$Y?>br6rmJ$6*MZ##ae^7gD+krhfqtyVbcJI-RLo> z4Dn+c(3Kw%QpBlv;pnpV_>;JWY_W^{8y17+QIiR2HS<~^{D4EaLA6Ac1KG%G4MG4x zu~MITe~2FJt~sZgL~nHliGZ9~X%UAYL{G>w#yS3wODZ~@b0PD@l>j2OTw2w0QSU%* zn~pio=+=q42#LU^tob|G8brA7G)Qsv`3~j*;8g_Cr$645-u1Q@0Kn6psMK3u>e}}p z_%%RziK|NZp_t0ds^p3~{TP39DB(ldp*=V+)8)EV__`VBLJCfPoR5Atx)X6}H%3fOVmZ z87LQZ0PM6RBr#VWJirLY#l$xy@|97>SM;P6Gbj#GS!?#5edwreC%vd|x~yRNScWcb ze>K|CiZs~udFG2jiBMFQVj=asSj#-AAcCR(v!NX%A{W@;;YA{|12Z#ZN*lf?djMl2 z`psB?BmQZ|j1;#K8B$*6v7};7i`8TOh=RgVt!qj0I#6x$ARz$m_#$@^)VW%~BuPnr z4U&U;vicyuq=_(VZObk}BNLB$1|=kre-m`p(zl+1Mkx;>-0YHM+59XBHJ_bofw-Y2 z(xfM<4dQEknwNC~5d{Ef4PRIf_aN~+H}LRu&TVQyzwCzhLCEP34e&bL6(KNz4UA~> z^tfAw^e{yn9U}lG{K-n0a${XIq>5q;#1{3I2lMjq^Y}zIktNHbv24RPN|c4#e>wDB zBuul=5d6n`1hSArelMk^0ptS5fuiLS{uy#5#>o@K#=$ilHI18x!!b8HaQb{6IgjW! z_NcO0Rqhxuleuq1HR{#vvJb0Yy{H}sjegW21oiCoi$$tB*Nuu}#5^kzGb4_eA)Ry_ z^pMQxDf&d>_SLTOgt5KahYZ_7e`svjqimU_n^G(tWVtx-L4WhCX&#=4PE4Nil@D0p zDjC&j;U$o!)+G4w{Y!r&o8RlEZLBGg0vK!)n(NMpO{{%hfsEu;+5>>J#jEbzb_6E` z=u)e^2~K8zd)f*4{d%j7ka#*b_n)jiLZl4?IhoJ&uGfh4{e+Nl13)7Ff9UNp1)>q) zwZ8k`F9^J!AMNq}8+`$%G=e&j3;uIZhvhak%|aoZa)tNZ!rwy6S9>Zsl5AftEb$ER z!n)%&DsKTt#E;;>HID4)ESsxG zZh#y}^Fq+^E+cNtp|c(@;wUO!G^#st0Yo6Lk|IOzHsjP(<+^Z*e^5$q``*iN3?L+! zEeDc-l*Ht=k}Z0q>$SiQ{B-{BaZ=?L48{9yg4W0l0G4gNG_m+v?bYy2_>eDBjKC(m ztspQFAvURSw2u`fkrHw7AjZx24h0o~=S>(O36fxSfDzX?5e91Ub5xQ2!o>Z63ghZ8 z59OtfHmijAP7hxOf1)IVB9!FrY>MIvFvKp7=`QRm^lr%xW61>PL%gHrjIJ}L<_K8K zSFEMvs%ii`svq-E@%GOK!9(NdNH`u&u4qUtoC+M{@fs;28`be5*ij%U@-n~>J$kUu zz-)<#5HQB>Yn13CBTb3U!)6SPDcFMwO-qADk|oQGDZVgTf7t9Ix8j75=sYl~qUi9V zB8&eV%N+Gk(kg84YAEskgs|r>;z!V;!S0A_bciSp&tw!%|1v2|Wa1*^#JLvn)%58b zAmW@{F>yj5Qv8A2*elplG54fPCQJd^LZD4pNdkxC!H3 zDI}QB6vL9df7t0JX7MaLu^=|dPCjY-NWw95(ILZUhs`1iZP8%UEI8%@(C?-7YV{3+jDqx5rqyq7Fe3G0rc25K;{1;vnKS7QTe+C$D>6V9j-SbOzFPUI{0Qy{2{JRQ}f1VUoqAhNmw ze;XuEGe8Rtj3UrRvNee%{yJf;76ZWm<2h0ze=f8IF{0B}@*gp5D7GN}*n*=ZMmoZE zJWkE_7UfJJB1TV--N;lKt0V=$iJf4gM>i1wTI-mGQQ3qq0fg&G!?Yj>AY#2#{U{;_ zD%O@TwjgM2_^xzeKeJ)G6l9~+7gHA9e_rk04x*S|FZYHNW^8HIG1C z5mY=?3Z}@mY+XvGvphs%Zc8<;EoqkVRh00#@$=T{d+yf0PC) z+Llf06G67tYw$I)w!_4v#yiB-YwnS6V@_5>!#w#4J-uV{(*FdJjXfgCBpao-Ij&!$z zUgASvG)7-PZ(##dAXoxmt4~S^e-MwEPL*_&>;e}NOn>p){+=&?lo z=t9tD4%I~+OiT!NYQnZLUiT1OI&WEuBMq>jj%Sk`dCD`W@iuYfjm_$Sx{#VhRXjI1 zh%8XUI)R!6gG9gMn&mZ{`EHwAu7-}pYi2|?t|D^7Q!7k#JP0o|{21?~;wmnhA-uU} z!uewW%Pp3;BAeJge`&R(HAM0z?~K!h@>rTYRk{;i8l{axsER~v`WZOPVQb^>B>sa# zjm$wAa?B{^2FQZC&}cX2e$Fi9F=b9IyB_vrUngM6Z7&625|f~m5#pEXwQyu@}2{o)@geTC1fwOmtcqg8DapE{uUgjm$zE$%9{* z%qUCnsIdWcomHrXI;ksipQk3LACjjF?J|P8vmMJUV0)zNMPxqrVTg+Il%eK;`nA`G zsDv6bRGYPZf7|G2T1I@+9A-MYt^2yMd+vk^8^tqtpSx_PNFA!BOnhVN14oYF<%9kR1bLk!Ae^q-EKkk33%q!6+B6Iluydlth$8*BU zCn}#`bB8T`(>cA{)h6D20oDB5Ho=nZD_r{^_AU>TAN&v2_coPzV+y>9v0AxxVYmW9Y#??48`} z$-WS!{_N2{?bUwm)xPZA{_WvD?yX$xf9byNOIq&n-XGY0@AOiJ?{m7@Cm>0 zx61AjKk?Dn@Vy@J9sltmKk}iT@hQLZE&uXwQ1LZ?^FsvlwO;Z;KlDX^^v}ohP5<;! zfABef^;thOQorX(KlWvR_DTQsZU6Rhzvo+j_jf<{|DE=MKlp{8?R~%ajsN(kSDg2i zpYxGl)rbH2p+EZPz4@uX`mLX&mp}Uv|N1*!`n~`A!5@9NfByW*zx=sM`_W(Q&40?n zzy00+{Yhf|<$wO^A3W0k{)fK)dmR4xzyG~o{{h0Em&Y{-9)CM}tcW9|$dM#Vnmmaz zrOK5oTe^G+Gp5X$CqLS}i8H6pn*e(H{0TIu(4j<&8a;|MsnVrPn>u|8HLBF9RI38r zi8ZU%tz5f${R%d$*s)}H(mabct=hG0+ny~8H?CZaP%nfCA;7BMy?p!n{R=p-;H7g5 z8$OIUvEs#y8-JH|3pujn$&}qXzKmIC(-gz%5&V{CFjWG#pp{`Nz>TO|rt(M-Y9!OG zTa*+R!ZDBa^*vN40H3d476w5yL*2I zEt5|uvR^fVAv8s!SI4;|%|VGhB_l$avv!TtzH_1EZ-1Fb?^I?24oF~u1|Epuft4-D zV1o`$mSBVu4#boo2|Ys{08l^!O$t*9P?~sCg&>e1OF?muK_>b{fH4LQli^PUoa2u% zL5YIUEl8DdkbC2$SkQ_`@o12bLA~NnJqh@PBtte{@Qp#Qf?r*ogz3LrETu&?t~7J`tJ2hcpgD z)deXEc~t%n1OX~gXg#?o&^zx8q$5xQG>Irs!ywdYQI76O5P+i!1gSrgiu!1&LFG}Y za6SF`%{S0oDp0Muiedn+{+#2PK&JR)p+NFLdVh|rLVa4PugUgw>aPT?8dS8YO4{q5 z!TK{SQ+R$0Zn)x(OKw7So{Mg}l9kJDS4-U@P^LaLGEf9P5eZ;a0z?^VREqk;s8N&} zBOC+p`ty!(r=A7?tO9umKnn3~+b;k!)=0nw8f$E?zydw9sT=2m)3k5aG zQVYla^E*Bdly6e)ehqfmVvjwR5bBPhEdP&e!OWK^9};5j}h z{=K9L1PV>zLI{0ADHu$!f&jQ+QB3HMilxwH-}oS)bQikbDGLB`%h^wgWuneeOK1oa zP7ZVkfaXE0CpU{B09FVT7yj#VP=Dkc?0Og@AbP8PT-I zsZ4c9C#VV4sH&wCO$8rQ99EEf7~`ltfgykha4DKHF-3@aCpdXHGJkm$t6M$sBcgcr zj8g_{MGQzn5@2c+7z9gD5+!L7bLd3i?e7`4@YO4f(mcO~GAMct6k;_vDDVC`^sm=L zDNzVuw?$qIhb^?81nde_HxA@EjNPkGa*zZfFw!TD^@pH@f?0tqGMQDat!;0sOgKn& zx4dl$9B@0frZ7Mdlz%G7VLx}do~L6M>21^vZ4M-(*|OS z#B~nKO~Ud|w)`kwzaQ~?SI86Wu!qdfM*bC>0SOR6J=20 zs&~!iPF+kMd1$x0-B5-+l!>$4PRf*rL0UFLl)x#n(UO0X02p9!{>PZ-TV!Rj}RE#}FdZYXk0(wu<;aeEI0-$L=Yv5}hX zn9F?TG=HzT%@d*&D3}bkmjbs2iPSIidK!l~E}1_f?gmP5p_u-N-?GUJ(xnZBQrU$e z3scuGB0;z($Rvu=3<^u@dH3W<`MSSv9815U8?c-`)#il4vz#{4GYtg_5omzJD0i--N;yPwT$Xw16MqN}J(W>XE6m3FD*_Y?8W|Gzic(KJAagZDgLzQUh5Z6-i=$9hm_*( zX)9&pezMgFsnxDPjw_Vh?|wO{O@eZyKNJBJpDKm#zW2Wm{_sCqDgCTb8A1SqB&hlA zKz}#qOv`WqA~1_(1Xz3A5a^oRZ}kFP0F;Sx4-HVj8@{q4O>%YwXBzJIZh0|56qEum zP+U*8di{b=xgvlHBwMQm6wOl)We@@Lq&bh5fC`ugZlHn0!%ZFtg8uM!oYrfq)@uzI zZzPBx!SfA4Z~^59KCCw@~% zg;i*UR|pqN!E~TvdvGLf2$3viHd#sdcm@GcFoX~*(mehVltc<4R&hoU#@AQAh7k3j zVL=fAnMM$ZL{SDIRz#792eEHTCKMBdL)(N$mzE=ur8*6mhHaP-G}VBG(ucMNYkv#z zaz%lKo5+cs=!u_L5lxW?0#qr{HD$vR1Og-vphgg{&{0O9V@c8o z4%8FHa&g+5Uv!A!hgY19x{!&V*uZH5Td7vplFZxh>!U=g-?+JT;K-q zc85dZUP+KIL68L1)fDTLS{Efjp*I-mN09zvS3$u3kVYW^M37n%SQQtUk)qLHpml;C zDU$j~k|k-9Cs}PGsgf(nk}c_yFA0-Ffs!*xlQn6R&J>e5sgpa&lRep!H-8C~K`E3& z`87Uilt+n_NvV{yMU+kHlurqj05U7crJ=$(C(7mT3u>aVeK^>6UeAmv`xtbE%hm$(K!umwySEfhih&NtlIcnEEJ~ ziK&>285M`=n2!mW`^cD+Nq?D@c@>d~nVG4XGiRBd>6wYSnV~6~qlsdlX_}|$mZYhg ztI3+!gqp7jn^)PIvq_t^DL#<)9l1FS)wm7bpn+wu8m}M- z2q_ft(Tq9p8@?fXM4=w+Aqv%5oW~iG>9HQ|aT~b-JhzaWxoH|Vrhgju(To5P8?#Xx zNzotwAr$Z-AK6tD^hq1`iJr|7g;rsk{|TT0DlXcz5P$d-NHT~{kvF7f5c1%3J&^*W z=sW_cYq>ZrNKt-!qHJ(jj1OuQ8Hy^(#v(L=dgJ(rViF`Wa*Z)mkpyO;{xBuu$t5DH zDQY$lUGfts8i#rzpnpB;qd%G;1d1@aLZsjD47_<1IKo*?VQEO=UB^NY5Oa6GvMor{ zNOlu2v^OSEXDrAfD^Hp#0r^8<=B1j#DgNWBEBjLqM0yTxU@aGFbO_@szt|HjMWw*z z6Z2;&dtzsL>MXMIrUPN6WC^5&YN&^b7(zOzRiUIvY7|Xs6o0w*cF2|~#lmL-&^!$V z1(Yy@wF&EICE0s@0b2M`of)QgmbjppV+7m{TQ4upSD@PPo7Zg>KGJmx& ziuW*ZRw-L!JzpnhUF9@GL99%3tT$ycQKK^4hp5pit<&l*N`Y%d@mYu?6bTRnTtJbX z#aZdc1@s62fPX^-Spun`v~xaThz7uP4;nnB_hn=TL%x@D$is+;LL>*+t_Fs$$ki!` z7)S(HG1%iemV+Ld)PkMmsbgrb&13!|%_DbiH53y26BKK(7K5-=L9HF@u^-D3LTY@X zRvanHA~s5n#iKiAAVBZ1gY$AnHS%9mM2}kMf(gTM^nc|&l<*EVL}rk(B_lnzI$%2I!$vo;AcOa690g3x4YRx?7zf+>&# z%rbIlXbLKnN!IgI2L%+T2LLdTA}l0y1ji`vRDTc)I}|VFxHXl%>q->nYel{kQJWjJ zL9tT`#ZZ)|I;QIrMTILzWm7nXTw>L~oMZuP0zI6jw|8 zZ3Zwq-;g-wwM#t(6lv!a{seG}9@VfV%!rJFJJ9eP1i&okkN^S@1n~u56scgf<~L-F zr#v*rbZo~_Qg^`UH)tHcL{VYkbtzYjw0}f_VZXXN50(@THV`Y^i}~fKUh~A6tjVk? zq>X@n0td=4U@!ktL8Wx9pOP>Qcn|l`V|yk?%ky7M!3EpGN4Q4Fj~6gamN-9{1Gp0; zhon+3Jj(;YN4^|~z>LTLHWZyZ6v&2mp9-~W7ZiFHtZ+vVWJeTnhRv*sXFR&e-+v6w znJKbxySb)JG&fR2aeEN;lOo>`6q1`1ZoFq6O2~6)!XvwZ0?`BN+-k4HB(EgTl|s)k z+t2R%&jvk#Hw?A&0{*A^)={sMpuPretL4nkK%?oQV-{`Ag31@+?9m@xnB(k>!$Yh96asP9UStT?!m`rtwu9T$2nqG$_IKVL3OLg9B0Gl5O1syM#1&gntcq3lA89JcKJI z@`N-f0Y4}R4c=}50z*o|<364TLnvEJxPZ6o-b>EpB^kwdWYe3rh1AI0Tv+7^(Oy9E za^h6uWfusDt);^|gy6yjJA<+!w$0@YaCzICfC!$@UYM=7Bpj{}5` zV?re7NQ_|ej(d2?M}g?e&g@kPlXBdV)(Kiffm)3t7y{4(-YXpyKHRuP5dt9D7vFxw zss4}-iJHxh?&)55vB~c3ew6AC?-Nm^^G@&eZkJ3|2OEF>@CmQ*2=DF<@9;3W@DVTZ z6HoCKZ}At8@fol28_)3_@9`fm@eTp%rhHoZmYMpy&-+=C z+CGs4kkZ&xQFLA91{o(BcZaHgo%@T~`_B*k9&y&$1Jw-%1wfSmJ-|3Q5F@Ws{ig*5 zP+-{E`oVg_)&Sf5lo|c&&;Fsf`VHF?dQ@X;=SS#4FXtcu#oI`o>R9}&Jq832!vG8f z(8xdE!GrPy5xj8EUmjBk4=xYXKsE+STh z{+TS^RLfQ%00G8ynyTnfXPJQ^3}ZCO(O-^?0-hbzP}A~d%$YTB<}5SpXV9TVk0xE( z^l8+oRj+2<+VyMLRL7Pz8POk%wQVyx#_0IqH&JEs9DG;iLXKMpp8lE)!5H+dxF z{%i1{s1(Q%BHrtdQVJN8{TVBq_GEH@DKt8U+}Ztm`0?dyj$PmWef;_L@8{p&|9=1j z6cC}={Gq5M#{|i3q}}53?LfF5%ZROa5&#Sue{La&IsgcGr=yH0IS3j7_VQ>T13s*9 zpd6AQLIAVSVz9y6=CkpCMjUg5Z$KV<^zla^gA{T|B8xO~wE_=Z?;t1^bZa2qHvT&3 zuYpo%)ReMD9pjX9PC89G@=iSS)N@Zh z`}FfqK#fZBqzG|Klg8c-GNL3H8X1Nygt+tzO@9O;>mdZwvPeUJN@rAQK?@PBb5v4G z-7!#9Q&n|UR$F!TRaku*w4^cn(v6@fqhttDoFuK3QcDlYBvUdSq7tw}Sz=G42-`FD zS!knmDOPH$wf0(Uv(MBbzFF6nrpWCW}I_Is=#>xNC88P&Ful9MBxNr(~K_l zl~Z^HA|NDx+{nl}5=p*SHvwEs;!KlrAa3J+jcw90-tGw z5=uk?`XEZ^oj8aP1Tm~ea}_(Nkq~kaJ6!d0t49#&y0p%pOtOnG>Z9%D7=REE+V^UI zz6s)j!~KEcY|=~T>}}LjSABKXTQ{x1os@)ur=l4T2Fv)@%LSM4Bye+L z+H~ZTkI8j^=9_o^dFZ3Z33iFoDQj(c@WF;+mNit4SlbeJICO!E{Q2vl6{uc;A2s+3~RH`wQ zt7K&>mk5&-3x2w`3;Fc==3d zM)PJb0nkVvn9IQoB)8<9&eW90z}{f5is~LaSlWSNoeRPVIqMXK!FGs zs7Xel5W$iNAP8JYf-$=W1t>5uBN){vM@z!ejo!13s|f)BxNwz){8A$4-~!h!@Hkd~ z)%2!QF@_Pi#sHoAqaIv<0vDX>R3iu`pi`wPYK{r1B$PxD^8Tm?419x-zvRH5N|jo7 zh*qWXDfK|QQ<6qPAk|2X0BJy$zpiq?BS=I%l?U$OEizvf31X)9H-9{%rip0}lX_I<0=h*AZ8#!8exDN&~v5HN%a{%+LUqtgV1G_ttYwu6i-6{1)yojYL}~~ zKVAWY5Ijz`A{tx>V1OQfNcNZY$ioG=P?zOYm?ikgw3GR8wn4HW<)U^#VKwGn9cxUjOd<<;*g~3|W@IOODKSB6{$e3U5P1>=3XPC7V5~FT zdICVIDg_lwpj;11Fy=UrNi@7hBJ6%;gaMRzg&?ZAoQ$ME6t{pv@wf@?iF`ZU70Cf) z^eygwms(n<&M`qk;8Fnm61U+~e;-cn@eX-FgCtF6P!hm;CMf56yi7Z|qYZSD2sC`y z0MNiqr1mh#2;vrvXoM(;tZbOayeAzML}3XX?Ti>96UN{l@OZ~7rPf2}=UYh%0DI&- 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

      u4$ks;gx#i2D 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 OG*wk~Rox>X002AC0QV;V diff --git a/docs/installation.rst b/docs/installation.rst index 3db48e45ddf40..bb1365ff0071e 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -41,71 +41,75 @@ these extra dependencies. Here's the list of the subpackages and what they enable: -+---------------+----------------------------------------------+-------------------------------------------------+ -| subpackage | install command | enables | -+===============+==============================================+=================================================+ -| all | ``pip install apache-airflow[all]`` | All Airflow features known to man | -+---------------+----------------------------------------------+-------------------------------------------------+ -| all_dbs | ``pip install apache-airflow[all_dbs]`` | All databases integrations | -+---------------+----------------------------------------------+-------------------------------------------------+ -| async | ``pip install apache-airflow[async]`` | Async worker classes for Gunicorn | -+---------------+----------------------------------------------+-------------------------------------------------+ -| celery | ``pip install apache-airflow[celery]`` | CeleryExecutor | -+---------------+----------------------------------------------+-------------------------------------------------+ -| cloudant | ``pip install apache-airflow[cloudant]`` | Cloudant hook | -+---------------+----------------------------------------------+-------------------------------------------------+ -| crypto | ``pip install apache-airflow[crypto]`` | Encrypt connection passwords in metadata db | -+---------------+----------------------------------------------+-------------------------------------------------+ -| devel | ``pip install apache-airflow[devel]`` | Minimum dev tools requirements | -+---------------+----------------------------------------------+-------------------------------------------------+ -| devel_hadoop | ``pip install apache-airflow[devel_hadoop]`` | Airflow + dependencies on the Hadoop stack | -+---------------+----------------------------------------------+-------------------------------------------------+ -| druid | ``pip install apache-airflow[druid]`` | Druid related operators & hooks | -+---------------+----------------------------------------------+-------------------------------------------------+ -| gcp_api | ``pip install apache-airflow[gcp_api]`` | Google Cloud Platform hooks and operators | -| | | (using ``google-api-python-client``) | -+---------------+----------------------------------------------+-------------------------------------------------+ -| hdfs | ``pip install apache-airflow[hdfs]`` | HDFS hooks and operators | -+---------------+----------------------------------------------+-------------------------------------------------+ -| hive | ``pip install apache-airflow[hive]`` | All Hive related operators | -+---------------+----------------------------------------------+-------------------------------------------------+ -| jdbc | ``pip install apache-airflow[jdbc]`` | JDBC hooks and operators | -+---------------+----------------------------------------------+-------------------------------------------------+ -| kerberos | ``pip install apache-airflow[kerberos]`` | Kerberos integration for Kerberized Hadoop | -+---------------+----------------------------------------------+-------------------------------------------------+ -| ldap | ``pip install apache-airflow[ldap]`` | LDAP authentication for users | -+---------------+----------------------------------------------+-------------------------------------------------+ -| mssql | ``pip install apache-airflow[mssql]`` | Microsoft SQL Server operators and hook, | -| | | support as an Airflow backend | -+---------------+----------------------------------------------+-------------------------------------------------+ -| mysql | ``pip install apache-airflow[mysql]`` | MySQL operators and hook, support as an Airflow | -| | | backend. The version of MySQL server has to be | -| | | 5.6.4+. The exact version upper bound depends | -| | | on version of ``mysqlclient`` package. For | -| | | example, ``mysqlclient`` 1.3.12 can only be | -| | | used with MySQL server 5.6.4 through 5.7. | -+---------------+----------------------------------------------+-------------------------------------------------+ -| password | ``pip install apache-airflow[password]`` | Password authentication for users | -+---------------+----------------------------------------------+-------------------------------------------------+ -| postgres | ``pip install apache-airflow[postgres]`` | PostgreSQL operators and hook, support as an | -| | | Airflow backend | -+---------------+----------------------------------------------+-------------------------------------------------+ -| qds | ``pip install apache-airflow[qds]`` | Enable QDS (Qubole Data Service) support | -+---------------+----------------------------------------------+-------------------------------------------------+ -| rabbitmq | ``pip install apache-airflow[rabbitmq]`` | RabbitMQ support as a Celery backend | -+---------------+----------------------------------------------+-------------------------------------------------+ -| redis | ``pip install apache-airflow[redis]`` | Redis hooks and sensors | -+---------------+----------------------------------------------+-------------------------------------------------+ -| s3 | ``pip install apache-airflow[s3]`` | ``S3KeySensor``, ``S3PrefixSensor`` | -+---------------+----------------------------------------------+-------------------------------------------------+ -| samba | ``pip install apache-airflow[samba]`` | ``Hive2SambaOperator`` | -+---------------+----------------------------------------------+-------------------------------------------------+ -| slack | ``pip install apache-airflow[slack]`` | ``SlackAPIPostOperator`` | -+---------------+----------------------------------------------+-------------------------------------------------+ -| ssh | ``pip install apache-airflow[ssh]`` | SSH hooks and Operator | -+---------------+----------------------------------------------+-------------------------------------------------+ -| vertica | ``pip install apache-airflow[vertica]`` | Vertica hook support as an Airflow backend | -+---------------+----------------------------------------------+-------------------------------------------------+ ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| subpackage | install command | enables | ++=====================+===================================================+=================================================+ +| all | ``pip install apache-airflow[all]`` | All Airflow features known to man | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| all_dbs | ``pip install apache-airflow[all_dbs]`` | All databases integrations | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| async | ``pip install apache-airflow[async]`` | Async worker classes for Gunicorn | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| celery | ``pip install apache-airflow[celery]`` | CeleryExecutor | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| cloudant | ``pip install apache-airflow[cloudant]`` | Cloudant hook | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| crypto | ``pip install apache-airflow[crypto]`` | Encrypt connection passwords in metadata db | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| devel | ``pip install apache-airflow[devel]`` | Minimum dev tools requirements | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| devel_hadoop | ``pip install apache-airflow[devel_hadoop]`` | Airflow + dependencies on the Hadoop stack | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| druid | ``pip install apache-airflow[druid]`` | Druid related operators & hooks | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| gcp_api | ``pip install apache-airflow[gcp_api]`` | Google Cloud Platform hooks and operators | +| | | (using ``google-api-python-client``) | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| github_enterprise | ``pip install apache-airflow[github_enterprise]`` | Github Enterprise auth backend | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| google_auth | ``pip install apache-airflow[google_auth]`` | Google auth backend | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| hdfs | ``pip install apache-airflow[hdfs]`` | HDFS hooks and operators | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| hive | ``pip install apache-airflow[hive]`` | All Hive related operators | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| jdbc | ``pip install apache-airflow[jdbc]`` | JDBC hooks and operators | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| kerberos | ``pip install apache-airflow[kerberos]`` | Kerberos integration for Kerberized Hadoop | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| ldap | ``pip install apache-airflow[ldap]`` | LDAP authentication for users | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| mssql | ``pip install apache-airflow[mssql]`` | Microsoft SQL Server operators and hook, | +| | | support as an Airflow backend | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| mysql | ``pip install apache-airflow[mysql]`` | MySQL operators and hook, support as an Airflow | +| | | backend. The version of MySQL server has to be | +| | | 5.6.4+. The exact version upper bound depends | +| | | on version of ``mysqlclient`` package. For | +| | | example, ``mysqlclient`` 1.3.12 can only be | +| | | used with MySQL server 5.6.4 through 5.7. | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| password | ``pip install apache-airflow[password]`` | Password authentication for users | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| postgres | ``pip install apache-airflow[postgres]`` | PostgreSQL operators and hook, support as an | +| | | Airflow backend | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| qds | ``pip install apache-airflow[qds]`` | Enable QDS (Qubole Data Service) support | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| rabbitmq | ``pip install apache-airflow[rabbitmq]`` | RabbitMQ support as a Celery backend | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| redis | ``pip install apache-airflow[redis]`` | Redis hooks and sensors | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| s3 | ``pip install apache-airflow[s3]`` | ``S3KeySensor``, ``S3PrefixSensor`` | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| samba | ``pip install apache-airflow[samba]`` | ``Hive2SambaOperator`` | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| slack | ``pip install apache-airflow[slack]`` | ``SlackAPIPostOperator`` | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| ssh | ``pip install apache-airflow[ssh]`` | SSH hooks and Operator | ++---------------------+---------------------------------------------------+-------------------------------------------------+ +| vertica | ``pip install apache-airflow[vertica]`` | Vertica hook support as an Airflow backend | ++---------------------+---------------------------------------------------+-------------------------------------------------+ Initiating Airflow Database ''''''''''''''''''''''''''' diff --git a/docs/integration.rst b/docs/integration.rst index 6ef7bd8398705..3a5a3c3e0507d 100644 --- a/docs/integration.rst +++ b/docs/integration.rst @@ -457,6 +457,37 @@ BigQueryHook .. autoclass:: airflow.contrib.hooks.bigquery_hook.BigQueryHook :members: +Compute Engine +'''''''''''''' + +Compute Engine Operators +"""""""""""""""""""""""" + +- :ref:`GceInstanceStartOperator` : start an existing Google Compute Engine instance. +- :ref:`GceInstanceStopOperator` : stop an existing Google Compute Engine instance. +- :ref:`GceSetMachineTypeOperator` : change the machine type for a stopped instance. + +.. _GceInstanceStartOperator: + +GceInstanceStartOperator +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: airflow.contrib.operators.gcp_compute_operator.GceInstanceStartOperator + +.. _GceInstanceStopOperator: + +GceInstanceStopOperator +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: airflow.contrib.operators.gcp_compute_operator.GceInstanceStopOperator + +.. _GceSetMachineTypeOperator: + +GceSetMachineTypeOperator +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: airflow.contrib.operators.gcp_compute_operator.GceSetMachineTypeOperator + Cloud Functions ''''''''''''''' diff --git a/docs/kubernetes.rst b/docs/kubernetes.rst index 8a4cea5a733f5..f05f22c44543f 100644 --- a/docs/kubernetes.rst +++ b/docs/kubernetes.rst @@ -82,6 +82,14 @@ Kubernetes Operator } } + tolerations = [ + { + 'key': "key", + 'operator': 'Equal', + 'value': 'value' + } + ] + k = KubernetesPodOperator(namespace='default', image="ubuntu:16.04", cmds=["bash", "-cx"], @@ -94,7 +102,8 @@ Kubernetes Operator task_id="task", affinity=affinity, is_delete_operator_pod=True, - hostnetwork=False + hostnetwork=False, + tolerations=tolerations ) diff --git a/docs/security.rst b/docs/security.rst index 9f6740d041ce0..c14cd1c2c3393 100644 --- a/docs/security.rst +++ b/docs/security.rst @@ -12,9 +12,10 @@ Be sure to checkout :doc:`api` for securing the API. .. note:: - Airflow uses the config parser of Python. This config parser interpolates '%'-signs. - Make sure not to have those in your passwords if they do not make sense, otherwise - Airflow might leak these passwords on a config parser exception to a log. + Airflow uses the config parser of Python. This config parser interpolates + '%'-signs. Make sure escape any ``%`` signs in your config file (but not + environment variables) as ``%%``, otherwise Airflow might leak these + passwords on a config parser exception to a log. Web Authentication ------------------ @@ -237,6 +238,12 @@ and in your DAG, when initializing the HiveOperator, specify: run_as_owner=True +To use kerberos authentication, you must install Airflow with the `kerberos` extras group: + +.. code-block:: base + + pip install airflow[kerberos] + OAuth Authentication -------------------- @@ -264,6 +271,12 @@ to only members of those teams. .. note:: If you do not specify a team whitelist, anyone with a valid account on your GHE installation will be able to login to Airflow. +To use GHE authentication, you must install Airflow with the `github_enterprise` extras group: + +.. code-block:: base + + pip install airflow[github_enterprise] + Setting up GHE Authentication ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -306,6 +319,12 @@ login, separated with a comma, to only members of those domains. oauth_callback_route = /oauth2callback domain = "example1.com,example2.com" +To use Google authentication, you must install Airflow with the `google_auth` extras group: + +.. code-block:: base + + pip install airflow[google_auth] + Setting up Google Authentication ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/run_unit_tests.sh b/run_unit_tests.sh index 8d671583427eb..2c4abbfaad605 100755 --- a/run_unit_tests.sh +++ b/run_unit_tests.sh @@ -24,9 +24,6 @@ set -x export AIRFLOW_HOME=${AIRFLOW_HOME:=~} export AIRFLOW__CORE__UNIT_TEST_MODE=True -# configuration test -export AIRFLOW__TESTSECTION__TESTKEY=testvalue - # add test/contrib to PYTHONPATH DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" export PYTHONPATH=$PYTHONPATH:${DIR}/tests/test_utils diff --git a/scripts/ci/3-setup-databases.sh b/scripts/ci/3-setup-mysql.sh similarity index 79% rename from scripts/ci/3-setup-databases.sh rename to scripts/ci/3-setup-mysql.sh index 2a5cb682e0119..ca5c1aa9f1b84 100755 --- a/scripts/ci/3-setup-databases.sh +++ b/scripts/ci/3-setup-mysql.sh @@ -20,4 +20,11 @@ set -exuo pipefail MYSQL_HOST=mysql -mysql -h ${MYSQL_HOST} -u root -e 'drop database if exists airflow; create database airflow' +retries=3 +for ((i=0; i=0.9.1'] +google_auth = ['Flask-OAuthlib>=0.9.1'] hdfs = ['snakebite>=2.7.8'] hive = [ 'hmsclient>=0.1.0', @@ -358,6 +359,7 @@ def do_setup(): 'emr': emr, 'gcp_api': gcp_api, 'github_enterprise': github_enterprise, + 'google_auth': google_auth, 'hdfs': hdfs, 'hive': hive, 'jdbc': jdbc, diff --git a/tests/configuration.py b/tests/configuration.py index b50a83259add4..09284c9972e44 100644 --- a/tests/configuration.py +++ b/tests/configuration.py @@ -37,38 +37,64 @@ class ConfTest(unittest.TestCase): - def setup(self): + @classmethod + def setUpClass(cls): + os.environ['AIRFLOW__TESTSECTION__TESTKEY'] = 'testvalue' + os.environ['AIRFLOW__TESTSECTION__TESTPERCENT'] = 'with%percent' configuration.load_test_config() + conf.set('core', 'percent', 'with%%inside') + + @classmethod + def tearDownClass(cls): + del os.environ['AIRFLOW__TESTSECTION__TESTKEY'] + del os.environ['AIRFLOW__TESTSECTION__TESTPERCENT'] def test_env_var_config(self): opt = conf.get('testsection', 'testkey') self.assertEqual(opt, 'testvalue') + opt = conf.get('testsection', 'testpercent') + self.assertEqual(opt, 'with%percent') + def test_conf_as_dict(self): cfg_dict = conf.as_dict() # test that configs are picked up self.assertEqual(cfg_dict['core']['unit_test_mode'], 'True') + self.assertEqual(cfg_dict['core']['percent'], 'with%inside') + # test env vars self.assertEqual(cfg_dict['testsection']['testkey'], '< hidden >') + def test_conf_as_dict_source(self): # test display_source cfg_dict = conf.as_dict(display_source=True) self.assertEqual( - cfg_dict['core']['load_examples'][1], 'airflow config') + cfg_dict['core']['load_examples'][1], 'airflow.cfg') self.assertEqual( cfg_dict['testsection']['testkey'], ('< hidden >', 'env var')) + def test_conf_as_dict_sensitive(self): # test display_sensitive cfg_dict = conf.as_dict(display_sensitive=True) self.assertEqual(cfg_dict['testsection']['testkey'], 'testvalue') + self.assertEqual(cfg_dict['testsection']['testpercent'], 'with%percent') # test display_source and display_sensitive cfg_dict = conf.as_dict(display_sensitive=True, display_source=True) self.assertEqual( cfg_dict['testsection']['testkey'], ('testvalue', 'env var')) + def test_conf_as_dict_raw(self): + # test display_sensitive + cfg_dict = conf.as_dict(raw=True, display_sensitive=True) + self.assertEqual(cfg_dict['testsection']['testkey'], 'testvalue') + + # Values with '%' in them should be escaped + self.assertEqual(cfg_dict['testsection']['testpercent'], 'with%%percent') + self.assertEqual(cfg_dict['core']['percent'], 'with%%inside') + def test_command_config(self): TEST_CONFIG = '''[test] key1 = hello @@ -104,6 +130,10 @@ def test_command_config(self): self.assertFalse(test_conf.has_option('test', 'key5')) self.assertTrue(test_conf.has_option('another', 'key6')) + cfg_dict = test_conf.as_dict(display_sensitive=True) + self.assertEqual('cmd_result', cfg_dict['test']['key2']) + self.assertNotIn('key2_cmd', cfg_dict['test']) + def test_remove_option(self): TEST_CONFIG = '''[test] key1 = hello @@ -191,4 +221,9 @@ def test_deprecated_options_cmd(self): conf.set('celery', 'celery_result_backend_cmd', '/bin/echo 99') with self.assertWarns(DeprecationWarning): + tmp = None + if 'AIRFLOW__CELERY__RESULT_BACKEND' in os.environ: + tmp = os.environ.pop('AIRFLOW__CELERY__RESULT_BACKEND') self.assertEquals(conf.getint('celery', 'result_backend'), 99) + if tmp: + os.environ['AIRFLOW__CELERY__RESULT_BACKEND'] = tmp diff --git a/tests/contrib/hooks/test_aws_hook.py b/tests/contrib/hooks/test_aws_hook.py index d7664aca1137a..eaadc5fbff413 100644 --- a/tests/contrib/hooks/test_aws_hook.py +++ b/tests/contrib/hooks/test_aws_hook.py @@ -19,6 +19,7 @@ # import unittest + import boto3 from airflow import configuration @@ -146,6 +147,26 @@ def test_get_credentials_from_extra(self, mock_get_connection): self.assertEqual(credentials_from_hook.secret_key, 'aws_secret_access_key') self.assertIsNone(credentials_from_hook.token) + @mock.patch('airflow.contrib.hooks.aws_hook._parse_s3_config', + return_value=('aws_access_key_id', 'aws_secret_access_key')) + @mock.patch.object(AwsHook, 'get_connection') + def test_get_credentials_from_extra_with_s3_config_and_profile( + self, mock_get_connection, mock_parse_s3_config + ): + mock_connection = Connection( + extra='{"s3_config_format": "aws", ' + '"profile": "test", ' + '"s3_config_file": "aws-credentials", ' + '"region_name": "us-east-1"}') + mock_get_connection.return_value = mock_connection + hook = AwsHook() + hook._get_credentials(region_name=None) + mock_parse_s3_config.assert_called_with( + 'aws-credentials', + 'aws', + 'test' + ) + @unittest.skipIf(mock_sts is None, 'mock_sts package not present') @mock.patch.object(AwsHook, 'get_connection') @mock_sts diff --git a/tests/contrib/hooks/test_bigquery_hook.py b/tests/contrib/hooks/test_bigquery_hook.py index 77a31f032081b..1cc3f66258982 100644 --- a/tests/contrib/hooks/test_bigquery_hook.py +++ b/tests/contrib/hooks/test_bigquery_hook.py @@ -621,6 +621,182 @@ def run_with_config(config): mocked_rwc.assert_called_once() +class TestClusteringInRunJob(unittest.TestCase): + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_load_default(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertIsNone(config['load'].get('clustering')) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_load( + destination_project_dataset_table='my_dataset.my_table', + schema_fields=[], + source_uris=[], + ) + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_load_with_arg(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertEqual( + config['load']['clustering'], + { + 'fields': ['field1', 'field2'] + } + ) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_load( + destination_project_dataset_table='my_dataset.my_table', + schema_fields=[], + source_uris=[], + cluster_fields=['field1', 'field2'], + time_partitioning={'type': 'DAY'} + ) + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_query_default(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertIsNone(config['query'].get('clustering')) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_query(sql='select 1') + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_query_with_arg(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertEqual( + config['query']['clustering'], + { + 'fields': ['field1', 'field2'] + } + ) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_query( + sql='select 1', + destination_dataset_table='my_dataset.my_table', + cluster_fields=['field1', 'field2'], + time_partitioning={'type': 'DAY'} + ) + + mocked_rwc.assert_called_once() + + +class TestClusteringInRunJob(unittest.TestCase): + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_load_default(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertIsNone(config['load'].get('clustering')) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_load( + destination_project_dataset_table='my_dataset.my_table', + schema_fields=[], + source_uris=[], + ) + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_load_with_arg(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertEqual( + config['load']['clustering'], + { + 'fields': ['field1', 'field2'] + } + ) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_load( + destination_project_dataset_table='my_dataset.my_table', + schema_fields=[], + source_uris=[], + cluster_fields=['field1', 'field2'], + time_partitioning={'type': 'DAY'} + ) + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_query_default(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertIsNone(config['query'].get('clustering')) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_query(sql='select 1') + + mocked_rwc.assert_called_once() + + @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") + @mock.patch("airflow.contrib.hooks.bigquery_hook.time") + @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') + def test_run_query_with_arg(self, mocked_rwc, mocked_time, mocked_logging): + project_id = 12345 + + def run_with_config(config): + self.assertEqual( + config['query']['clustering'], + { + 'fields': ['field1', 'field2'] + } + ) + mocked_rwc.side_effect = run_with_config + + bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) + bq_hook.run_query( + sql='select 1', + destination_dataset_table='my_dataset.my_table', + cluster_fields=['field1', 'field2'], + time_partitioning={'type': 'DAY'} + ) + + mocked_rwc.assert_called_once() + + class TestBigQueryHookLegacySql(unittest.TestCase): """Ensure `use_legacy_sql` param in `BigQueryHook` propagates properly.""" diff --git a/tests/contrib/hooks/test_ftp_hook.py b/tests/contrib/hooks/test_ftp_hook.py index 8b9ae2cd59556..1274990827096 100644 --- a/tests/contrib/hooks/test_ftp_hook.py +++ b/tests/contrib/hooks/test_ftp_hook.py @@ -19,6 +19,7 @@ # import mock +import six import unittest from airflow.contrib.hooks import ftp_hook as fh @@ -101,6 +102,28 @@ def test_mod_time_micro(self): self.conn_mock.sendcmd.assert_called_once_with('MDTM ' + path) + def test_get_size(self): + self.conn_mock.size.return_value = 1942 + + path = '/path/file' + with fh.FTPHook() as ftp_hook: + ftp_hook.get_size(path) + + self.conn_mock.size.assert_called_once_with(path) + + def test_retrieve_file(self): + _buffer = six.StringIO('buffer') + with fh.FTPHook() as ftp_hook: + ftp_hook.retrieve_file(self.path, _buffer) + self.conn_mock.retrbinary.assert_called_once_with('RETR path', _buffer.write) + + def test_retrieve_file_with_callback(self): + func = mock.Mock() + _buffer = six.StringIO('buffer') + with fh.FTPHook() as ftp_hook: + ftp_hook.retrieve_file(self.path, _buffer, callback=func) + self.conn_mock.retrbinary.assert_called_once_with('RETR path', func) + if __name__ == '__main__': unittest.main() diff --git a/tests/contrib/hooks/test_wasb_hook.py b/tests/contrib/hooks/test_wasb_hook.py index b5545e2727152..88481440e71be 100644 --- a/tests/contrib/hooks/test_wasb_hook.py +++ b/tests/contrib/hooks/test_wasb_hook.py @@ -21,8 +21,9 @@ import json import unittest +from collections import namedtuple -from airflow import configuration +from airflow import configuration, AirflowException from airflow import models from airflow.contrib.hooks.wasb_hook import WasbHook from airflow.utils import db @@ -143,6 +144,59 @@ def test_read_file(self, mock_service): 'container', 'blob', max_connections=1 ) + @mock.patch('airflow.contrib.hooks.wasb_hook.BlockBlobService', + autospec=True) + def test_delete_single_blob(self, mock_service): + mock_instance = mock_service.return_value + hook = WasbHook(wasb_conn_id='wasb_test_sas_token') + hook.delete_file('container', 'blob', is_prefix=False) + mock_instance.delete_blob.assert_called_once_with( + 'container', 'blob', delete_snapshots='include' + ) + + @mock.patch('airflow.contrib.hooks.wasb_hook.BlockBlobService', + autospec=True) + def test_delete_multiple_blobs(self, mock_service): + mock_instance = mock_service.return_value + Blob = namedtuple('Blob', ['name']) + mock_instance.list_blobs.return_value = iter( + [Blob('blob_prefix/blob1'), Blob('blob_prefix/blob2')] + ) + hook = WasbHook(wasb_conn_id='wasb_test_sas_token') + hook.delete_file('container', 'blob_prefix', is_prefix=True) + mock_instance.delete_blob.assert_any_call( + 'container', 'blob_prefix/blob1', delete_snapshots='include' + ) + mock_instance.delete_blob.assert_any_call( + 'container', 'blob_prefix/blob2', delete_snapshots='include' + ) + + @mock.patch('airflow.contrib.hooks.wasb_hook.BlockBlobService', + autospec=True) + def test_delete_nonexisting_blob_fails(self, mock_service): + mock_instance = mock_service.return_value + mock_instance.exists.return_value = False + hook = WasbHook(wasb_conn_id='wasb_test_sas_token') + with self.assertRaises(Exception) as context: + hook.delete_file( + 'container', 'nonexisting_blob', + is_prefix=False, ignore_if_missing=False + ) + self.assertIsInstance(context.exception, AirflowException) + + @mock.patch('airflow.contrib.hooks.wasb_hook.BlockBlobService', + autospec=True) + def test_delete_multiple_nonexisting_blobs_fails(self, mock_service): + mock_instance = mock_service.return_value + mock_instance.list_blobs.return_value = iter([]) + hook = WasbHook(wasb_conn_id='wasb_test_sas_token') + with self.assertRaises(Exception) as context: + hook.delete_file( + 'container', 'nonexisting_blob_prefix', + is_prefix=True, ignore_if_missing=False + ) + self.assertIsInstance(context.exception, AirflowException) + if __name__ == '__main__': unittest.main() diff --git a/tests/contrib/operators/test_dataproc_operator.py b/tests/contrib/operators/test_dataproc_operator.py index 60c1268ee7a5f..fb90606ea51ac 100644 --- a/tests/contrib/operators/test_dataproc_operator.py +++ b/tests/contrib/operators/test_dataproc_operator.py @@ -298,6 +298,34 @@ def test_init_with_custom_image(self): self.assertEqual(cluster_data['config']['workerConfig']['imageUri'], expected_custom_image_url) + def test_build_single_node_cluster(self): + dataproc_operator = DataprocClusterCreateOperator( + task_id=TASK_ID, + cluster_name=CLUSTER_NAME, + project_id=PROJECT_ID, + num_workers=0, + num_preemptible_workers=0, + zone=ZONE, + dag=self.dag + ) + cluster_data = dataproc_operator._build_cluster_data() + self.assertEqual( + cluster_data['config']['softwareConfig']['properties'] + ['dataproc:dataproc.allow.zero.workers'], "true") + + def test_init_cluster_with_zero_workers_and_not_non_zero_preemtibles(self): + with self.assertRaises(AssertionError): + DataprocClusterCreateOperator( + task_id=TASK_ID, + cluster_name=CLUSTER_NAME, + project_id=PROJECT_ID, + num_workers=0, + num_preemptible_workers=2, + zone=ZONE, + dag=self.dag, + image_version=IMAGE_VERSION, + ) + def test_cluster_name_log_no_sub(self): with patch('airflow.contrib.operators.dataproc_operator.DataProcHook') \ as mock_hook: diff --git a/tests/contrib/operators/test_gcp_compute_operator.py b/tests/contrib/operators/test_gcp_compute_operator.py new file mode 100644 index 0000000000000..449c4e015fdda --- /dev/null +++ b/tests/contrib/operators/test_gcp_compute_operator.py @@ -0,0 +1,377 @@ +# -*- coding: utf-8 -*- +# +# 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. +import ast +import unittest + +from airflow import AirflowException, configuration +from airflow.contrib.operators.gcp_compute_operator import GceInstanceStartOperator, \ + GceInstanceStopOperator, GceSetMachineTypeOperator +from airflow.models import TaskInstance, DAG +from airflow.utils import timezone + +try: + # noinspection PyProtectedMember + from unittest import mock +except ImportError: + try: + import mock + except ImportError: + mock = None + +PROJECT_ID = 'project-id' +LOCATION = 'zone' +RESOURCE_ID = 'resource-id' +SHORT_MACHINE_TYPE_NAME = 'n1-machine-type' +SET_MACHINE_TYPE_BODY = { + 'machineType': 'zones/{}/machineTypes/{}'.format(LOCATION, SHORT_MACHINE_TYPE_NAME) +} + +DEFAULT_DATE = timezone.datetime(2017, 1, 1) + + +class GceInstanceStartTest(unittest.TestCase): + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_instance_start(self, mock_hook): + mock_hook.return_value.start_instance.return_value = True + op = GceInstanceStartOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id=RESOURCE_ID, + task_id='id' + ) + result = op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.return_value.start_instance.assert_called_once_with( + PROJECT_ID, LOCATION, RESOURCE_ID + ) + self.assertTrue(result) + + # Setting all of the operator's input parameters as templated dag_ids + # (could be anything else) just to test if the templating works for all fields + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_instance_start_with_templates(self, mock_hook): + dag_id = 'test_dag_id' + configuration.load_test_config() + args = { + 'start_date': DEFAULT_DATE + } + self.dag = DAG(dag_id, default_args=args) + op = GceInstanceStartOperator( + project_id='{{ dag.dag_id }}', + zone='{{ dag.dag_id }}', + resource_id='{{ dag.dag_id }}', + gcp_conn_id='{{ dag.dag_id }}', + api_version='{{ dag.dag_id }}', + task_id='id', + dag=self.dag + ) + ti = TaskInstance(op, DEFAULT_DATE) + ti.render_templates() + self.assertEqual(dag_id, getattr(op, 'project_id')) + self.assertEqual(dag_id, getattr(op, 'zone')) + self.assertEqual(dag_id, getattr(op, 'resource_id')) + self.assertEqual(dag_id, getattr(op, 'gcp_conn_id')) + self.assertEqual(dag_id, getattr(op, 'api_version')) + + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_start_should_throw_ex_when_missing_project_id(self, mock_hook): + with self.assertRaises(AirflowException) as cm: + op = GceInstanceStartOperator( + project_id="", + zone=LOCATION, + resource_id=RESOURCE_ID, + task_id='id' + ) + op.execute(None) + err = cm.exception + self.assertIn("The required parameter 'project_id' is missing", str(err)) + mock_hook.assert_not_called() + + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_start_should_throw_ex_when_missing_zone(self, mock_hook): + with self.assertRaises(AirflowException) as cm: + op = GceInstanceStartOperator( + project_id=PROJECT_ID, + zone="", + resource_id=RESOURCE_ID, + task_id='id' + ) + op.execute(None) + err = cm.exception + self.assertIn("The required parameter 'zone' is missing", str(err)) + mock_hook.assert_not_called() + + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_start_should_throw_ex_when_missing_resource_id(self, mock_hook): + with self.assertRaises(AirflowException) as cm: + op = GceInstanceStartOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id="", + task_id='id' + ) + op.execute(None) + err = cm.exception + self.assertIn("The required parameter 'resource_id' is missing", str(err)) + mock_hook.assert_not_called() + + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_instance_stop(self, mock_hook): + mock_hook.return_value.stop_instance.return_value = True + op = GceInstanceStopOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id=RESOURCE_ID, + task_id='id' + ) + result = op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.return_value.stop_instance.assert_called_once_with( + PROJECT_ID, LOCATION, RESOURCE_ID + ) + self.assertTrue(result) + + # Setting all of the operator's input parameters as templated dag_ids + # (could be anything else) just to test if the templating works for all fields + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_instance_stop_with_templates(self, mock_hook): + dag_id = 'test_dag_id' + configuration.load_test_config() + args = { + 'start_date': DEFAULT_DATE + } + self.dag = DAG(dag_id, default_args=args) + op = GceInstanceStopOperator( + project_id='{{ dag.dag_id }}', + zone='{{ dag.dag_id }}', + resource_id='{{ dag.dag_id }}', + gcp_conn_id='{{ dag.dag_id }}', + api_version='{{ dag.dag_id }}', + task_id='id', + dag=self.dag + ) + ti = TaskInstance(op, DEFAULT_DATE) + ti.render_templates() + self.assertEqual(dag_id, getattr(op, 'project_id')) + self.assertEqual(dag_id, getattr(op, 'zone')) + self.assertEqual(dag_id, getattr(op, 'resource_id')) + self.assertEqual(dag_id, getattr(op, 'gcp_conn_id')) + self.assertEqual(dag_id, getattr(op, 'api_version')) + + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_stop_should_throw_ex_when_missing_project_id(self, mock_hook): + with self.assertRaises(AirflowException) as cm: + op = GceInstanceStopOperator( + project_id="", + zone=LOCATION, + resource_id=RESOURCE_ID, + task_id='id' + ) + op.execute(None) + err = cm.exception + self.assertIn("The required parameter 'project_id' is missing", str(err)) + mock_hook.assert_not_called() + + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_stop_should_throw_ex_when_missing_zone(self, mock_hook): + with self.assertRaises(AirflowException) as cm: + op = GceInstanceStopOperator( + project_id=PROJECT_ID, + zone="", + resource_id=RESOURCE_ID, + task_id='id' + ) + op.execute(None) + err = cm.exception + self.assertIn("The required parameter 'zone' is missing", str(err)) + mock_hook.assert_not_called() + + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_stop_should_throw_ex_when_missing_resource_id(self, mock_hook): + with self.assertRaises(AirflowException) as cm: + op = GceInstanceStopOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id="", + task_id='id' + ) + op.execute(None) + err = cm.exception + self.assertIn("The required parameter 'resource_id' is missing", str(err)) + mock_hook.assert_not_called() + + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_set_machine_type(self, mock_hook): + mock_hook.return_value.set_machine_type.return_value = True + op = GceSetMachineTypeOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id=RESOURCE_ID, + body=SET_MACHINE_TYPE_BODY, + task_id='id' + ) + result = op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.return_value.set_machine_type.assert_called_once_with( + PROJECT_ID, LOCATION, RESOURCE_ID, SET_MACHINE_TYPE_BODY + ) + self.assertTrue(result) + + # Setting all of the operator's input parameters as templated dag_ids + # (could be anything else) just to test if the templating works for all fields + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_set_machine_type_with_templates(self, mock_hook): + dag_id = 'test_dag_id' + configuration.load_test_config() + args = { + 'start_date': DEFAULT_DATE + } + self.dag = DAG(dag_id, default_args=args) + op = GceSetMachineTypeOperator( + project_id='{{ dag.dag_id }}', + zone='{{ dag.dag_id }}', + resource_id='{{ dag.dag_id }}', + body={}, + gcp_conn_id='{{ dag.dag_id }}', + api_version='{{ dag.dag_id }}', + task_id='id', + dag=self.dag + ) + ti = TaskInstance(op, DEFAULT_DATE) + ti.render_templates() + self.assertEqual(dag_id, getattr(op, 'project_id')) + self.assertEqual(dag_id, getattr(op, 'zone')) + self.assertEqual(dag_id, getattr(op, 'resource_id')) + self.assertEqual(dag_id, getattr(op, 'gcp_conn_id')) + self.assertEqual(dag_id, getattr(op, 'api_version')) + + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_set_machine_type_should_throw_ex_when_missing_project_id(self, mock_hook): + with self.assertRaises(AirflowException) as cm: + op = GceSetMachineTypeOperator( + project_id="", + zone=LOCATION, + resource_id=RESOURCE_ID, + body=SET_MACHINE_TYPE_BODY, + task_id='id' + ) + op.execute(None) + err = cm.exception + self.assertIn("The required parameter 'project_id' is missing", str(err)) + mock_hook.assert_not_called() + + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_set_machine_type_should_throw_ex_when_missing_zone(self, mock_hook): + with self.assertRaises(AirflowException) as cm: + op = GceSetMachineTypeOperator( + project_id=PROJECT_ID, + zone="", + resource_id=RESOURCE_ID, + body=SET_MACHINE_TYPE_BODY, + task_id='id' + ) + op.execute(None) + err = cm.exception + self.assertIn("The required parameter 'zone' is missing", str(err)) + mock_hook.assert_not_called() + + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_set_machine_type_should_throw_ex_when_missing_resource_id(self, mock_hook): + with self.assertRaises(AirflowException) as cm: + op = GceSetMachineTypeOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id="", + body=SET_MACHINE_TYPE_BODY, + task_id='id' + ) + op.execute(None) + err = cm.exception + self.assertIn("The required parameter 'resource_id' is missing", str(err)) + mock_hook.assert_not_called() + + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook') + def test_set_machine_type_should_throw_ex_when_missing_machine_type(self, mock_hook): + with self.assertRaises(AirflowException) as cm: + op = GceSetMachineTypeOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id=RESOURCE_ID, + body={}, + task_id='id' + ) + op.execute(None) + err = cm.exception + self.assertIn( + "The required body field 'machineType' is missing. Please add it.", str(err)) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + + MOCK_OP_RESPONSE = "{'kind': 'compute#operation', 'id': '8529919847974922736', " \ + "'name': " \ + "'operation-1538578207537-577542784f769-7999ab71-94f9ec1d', " \ + "'zone': 'https://www.googleapis.com/compute/v1/projects/polidea" \ + "-airflow/zones/europe-west3-b', 'operationType': " \ + "'setMachineType', 'targetLink': " \ + "'https://www.googleapis.com/compute/v1/projects/polidea-airflow" \ + "/zones/europe-west3-b/instances/pa-1', 'targetId': " \ + "'2480086944131075860', 'status': 'DONE', 'user': " \ + "'uberdarek@polidea-airflow.iam.gserviceaccount.com', " \ + "'progress': 100, 'insertTime': '2018-10-03T07:50:07.951-07:00', "\ + "'startTime': '2018-10-03T07:50:08.324-07:00', 'endTime': " \ + "'2018-10-03T07:50:08.484-07:00', 'error': {'errors': [{'code': " \ + "'UNSUPPORTED_OPERATION', 'message': \"Machine type with name " \ + "'machine-type-1' does not exist in zone 'europe-west3-b'.\"}]}, "\ + "'httpErrorStatusCode': 400, 'httpErrorMessage': 'BAD REQUEST', " \ + "'selfLink': " \ + "'https://www.googleapis.com/compute/v1/projects/polidea-airflow" \ + "/zones/europe-west3-b/operations/operation-1538578207537" \ + "-577542784f769-7999ab71-94f9ec1d'} " + + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook' + '._check_operation_status') + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook' + '._execute_set_machine_type') + @mock.patch('airflow.contrib.operators.gcp_compute_operator.GceHook.get_conn') + def test_set_machine_type_should_handle_and_trim_gce_error( + self, get_conn, _execute_set_machine_type, _check_operation_status): + get_conn.return_value = {} + _execute_set_machine_type.return_value = {"name": "test-operation"} + _check_operation_status.return_value = ast.literal_eval(self.MOCK_OP_RESPONSE) + with self.assertRaises(AirflowException) as cm: + op = GceSetMachineTypeOperator( + project_id=PROJECT_ID, + zone=LOCATION, + resource_id=RESOURCE_ID, + body=SET_MACHINE_TYPE_BODY, + task_id='id' + ) + op.execute(None) + err = cm.exception + _check_operation_status.assert_called_once_with( + {}, "test-operation", PROJECT_ID, LOCATION) + _execute_set_machine_type.assert_called_once_with( + PROJECT_ID, LOCATION, RESOURCE_ID, SET_MACHINE_TYPE_BODY) + # Checking the full message was sometimes failing due to different order + # of keys in the serialized JSON + self.assertIn("400 BAD REQUEST: {", str(err)) # checking the square bracket trim + self.assertIn("UNSUPPORTED_OPERATION", str(err)) diff --git a/tests/contrib/operators/test_gcp_function_operator.py b/tests/contrib/operators/test_gcp_function_operator.py index d7585ae66fdef..4192560dd984c 100644 --- a/tests/contrib/operators/test_gcp_function_operator.py +++ b/tests/contrib/operators/test_gcp_function_operator.py @@ -519,6 +519,23 @@ def test_valid_trigger_union_field(self, trigger, mock_hook): ) mock_hook.reset_mock() + @mock.patch('airflow.contrib.operators.gcp_function_operator.GcfHook') + def test_extra_parameter(self, mock_hook): + mock_hook.return_value.list_functions.return_value = [] + mock_hook.return_value.create_new_function.return_value = True + body = deepcopy(VALID_BODY) + body['extra_parameter'] = 'extra' + op = GcfFunctionDeployOperator( + project_id="test_project_id", + location="test_region", + body=body, + task_id="id" + ) + op.execute(None) + mock_hook.assert_called_once_with(api_version='v1', + gcp_conn_id='google_cloud_default') + mock_hook.reset_mock() + class GcfFunctionDeleteTest(unittest.TestCase): _FUNCTION_NAME = 'projects/project_name/locations/project_location/functions' \ diff --git a/tests/contrib/operators/test_s3_to_sftp_operator.py b/tests/contrib/operators/test_s3_to_sftp_operator.py index 171367017f184..d8ce35cd81b6c 100644 --- a/tests/contrib/operators/test_s3_to_sftp_operator.py +++ b/tests/contrib/operators/test_s3_to_sftp_operator.py @@ -139,19 +139,20 @@ def test_s3_to_sftp_operation(self): ti3.run() self.assertEqual( ti3.xcom_pull(task_ids='test_check_file', key='return_value').strip(), - test_remote_file_content) + test_remote_file_content.encode('utf-8')) # Clean up after finishing with test conn.delete_object(Bucket=self.s3_bucket, Key=self.s3_key) conn.delete_bucket(Bucket=self.s3_bucket) self.assertFalse((self.s3_hook.check_for_bucket(self.s3_bucket))) + @staticmethod def delete_remote_resource(self): # check the remote file content remove_file_task = SSHOperator( task_id="test_check_file", ssh_hook=self.hook, - command="rm {0}".format(self.test_remote_filepath), + command="rm {0}".format(self.sftp_path), do_xcom_push=True, dag=self.dag ) diff --git a/tests/contrib/operators/test_sftp_operator.py b/tests/contrib/operators/test_sftp_operator.py index bf4525e31100e..8bfd8e11319bc 100644 --- a/tests/contrib/operators/test_sftp_operator.py +++ b/tests/contrib/operators/test_sftp_operator.py @@ -42,6 +42,7 @@ def reset(dag_id=TEST_DAG_ID): session.commit() session.close() + reset() @@ -79,12 +80,12 @@ def test_pickle_file_transfer_put(self): # put test file to remote put_test_task = SFTPOperator( - task_id="test_sftp", - ssh_hook=self.hook, - local_filepath=self.test_local_filepath, - remote_filepath=self.test_remote_filepath, - operation=SFTPOperation.PUT, - dag=self.dag + task_id="test_sftp", + ssh_hook=self.hook, + local_filepath=self.test_local_filepath, + remote_filepath=self.test_remote_filepath, + operation=SFTPOperation.PUT, + dag=self.dag ) self.assertIsNotNone(put_test_task) ti2 = TaskInstance(task=put_test_task, execution_date=timezone.utcnow()) @@ -92,18 +93,18 @@ def test_pickle_file_transfer_put(self): # check the remote file content check_file_task = SSHOperator( - task_id="test_check_file", - ssh_hook=self.hook, - command="cat {0}".format(self.test_remote_filepath), - do_xcom_push=True, - dag=self.dag + task_id="test_check_file", + ssh_hook=self.hook, + command="cat {0}".format(self.test_remote_filepath), + do_xcom_push=True, + dag=self.dag ) self.assertIsNotNone(check_file_task) ti3 = TaskInstance(task=check_file_task, execution_date=timezone.utcnow()) ti3.run() self.assertEqual( - ti3.xcom_pull(task_ids='test_check_file', key='return_value').strip(), - test_local_file_content) + ti3.xcom_pull(task_ids='test_check_file', key='return_value').strip(), + test_local_file_content) def test_json_file_transfer_put(self): configuration.conf.set("core", "enable_xcom_pickling", "False") @@ -116,12 +117,12 @@ def test_json_file_transfer_put(self): # put test file to remote put_test_task = SFTPOperator( - task_id="test_sftp", - ssh_hook=self.hook, - local_filepath=self.test_local_filepath, - remote_filepath=self.test_remote_filepath, - operation=SFTPOperation.PUT, - dag=self.dag + task_id="test_sftp", + ssh_hook=self.hook, + local_filepath=self.test_local_filepath, + remote_filepath=self.test_remote_filepath, + operation=SFTPOperation.PUT, + dag=self.dag ) self.assertIsNotNone(put_test_task) ti2 = TaskInstance(task=put_test_task, execution_date=timezone.utcnow()) @@ -129,19 +130,18 @@ def test_json_file_transfer_put(self): # check the remote file content check_file_task = SSHOperator( - task_id="test_check_file", - ssh_hook=self.hook, - command="cat {0}".format(self.test_remote_filepath), - do_xcom_push=True, - dag=self.dag + task_id="test_check_file", + ssh_hook=self.hook, + command="cat {0}".format(self.test_remote_filepath), + do_xcom_push=True, + dag=self.dag ) self.assertIsNotNone(check_file_task) ti3 = TaskInstance(task=check_file_task, execution_date=timezone.utcnow()) ti3.run() self.assertEqual( - ti3.xcom_pull(task_ids='test_check_file', key='return_value').strip(), - b64encode(test_local_file_content).decode('utf-8')) - + ti3.xcom_pull(task_ids='test_check_file', key='return_value').strip(), + b64encode(test_local_file_content).decode('utf-8')) def test_pickle_file_transfer_get(self): configuration.conf.set("core", "enable_xcom_pickling", "True") @@ -151,12 +151,12 @@ def test_pickle_file_transfer_get(self): # create a test file remotely create_file_task = SSHOperator( - task_id="test_create_file", - ssh_hook=self.hook, - command="echo '{0}' > {1}".format(test_remote_file_content, - self.test_remote_filepath), - do_xcom_push=True, - dag=self.dag + task_id="test_create_file", + ssh_hook=self.hook, + command="echo '{0}' > {1}".format(test_remote_file_content, + self.test_remote_filepath), + do_xcom_push=True, + dag=self.dag ) self.assertIsNotNone(create_file_task) ti1 = TaskInstance(task=create_file_task, execution_date=timezone.utcnow()) @@ -164,12 +164,12 @@ def test_pickle_file_transfer_get(self): # get remote file to local get_test_task = SFTPOperator( - task_id="test_sftp", - ssh_hook=self.hook, - local_filepath=self.test_local_filepath, - remote_filepath=self.test_remote_filepath, - operation=SFTPOperation.GET, - dag=self.dag + task_id="test_sftp", + ssh_hook=self.hook, + local_filepath=self.test_local_filepath, + remote_filepath=self.test_remote_filepath, + operation=SFTPOperation.GET, + dag=self.dag ) self.assertIsNotNone(get_test_task) ti2 = TaskInstance(task=get_test_task, execution_date=timezone.utcnow()) @@ -189,12 +189,12 @@ def test_json_file_transfer_get(self): # create a test file remotely create_file_task = SSHOperator( - task_id="test_create_file", - ssh_hook=self.hook, - command="echo '{0}' > {1}".format(test_remote_file_content, - self.test_remote_filepath), - do_xcom_push=True, - dag=self.dag + task_id="test_create_file", + ssh_hook=self.hook, + command="echo '{0}' > {1}".format(test_remote_file_content, + self.test_remote_filepath), + do_xcom_push=True, + dag=self.dag ) self.assertIsNotNone(create_file_task) ti1 = TaskInstance(task=create_file_task, execution_date=timezone.utcnow()) @@ -202,12 +202,12 @@ def test_json_file_transfer_get(self): # get remote file to local get_test_task = SFTPOperator( - task_id="test_sftp", - ssh_hook=self.hook, - local_filepath=self.test_local_filepath, - remote_filepath=self.test_remote_filepath, - operation=SFTPOperation.GET, - dag=self.dag + task_id="test_sftp", + ssh_hook=self.hook, + local_filepath=self.test_local_filepath, + remote_filepath=self.test_remote_filepath, + operation=SFTPOperation.GET, + dag=self.dag ) self.assertIsNotNone(get_test_task) ti2 = TaskInstance(task=get_test_task, execution_date=timezone.utcnow()) @@ -218,7 +218,7 @@ def test_json_file_transfer_get(self): with open(self.test_local_filepath, 'r') as f: content_received = f.read() self.assertEqual(content_received.strip(), - test_remote_file_content.encode('utf-8').decode('utf-8')) + test_remote_file_content.encode('utf-8').decode('utf-8')) def test_arg_checking(self): from airflow.exceptions import AirflowException @@ -289,6 +289,7 @@ def delete_local_resource(self): if os.path.exists(self.test_local_filepath): os.remove(self.test_local_filepath) + @staticmethod def delete_remote_resource(self): # check the remote file content remove_file_task = SSHOperator( diff --git a/tests/contrib/operators/test_wasb_delete_blob_operator.py b/tests/contrib/operators/test_wasb_delete_blob_operator.py new file mode 100644 index 0000000000000..7c3ed0bd630ad --- /dev/null +++ b/tests/contrib/operators/test_wasb_delete_blob_operator.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +# +# 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. +# + +import datetime +import unittest + +from airflow import DAG, configuration +from airflow.contrib.operators.wasb_delete_blob_operator import WasbDeleteBlobOperator + +try: + from unittest import mock +except ImportError: + try: + import mock + except ImportError: + mock = None + + +class TestWasbDeleteBlobOperator(unittest.TestCase): + + _config = { + 'container_name': 'container', + 'blob_name': 'blob', + } + + def setUp(self): + configuration.load_test_config() + args = { + 'owner': 'airflow', + 'start_date': datetime.datetime(2017, 1, 1) + } + self.dag = DAG('test_dag_id', default_args=args) + + def test_init(self): + operator = WasbDeleteBlobOperator( + task_id='wasb_operator', + dag=self.dag, + **self._config + ) + self.assertEqual(operator.container_name, + self._config['container_name']) + self.assertEqual(operator.blob_name, self._config['blob_name']) + self.assertEqual(operator.is_prefix, False) + self.assertEqual(operator.ignore_if_missing, False) + + operator = WasbDeleteBlobOperator( + task_id='wasb_operator', + dag=self.dag, + is_prefix=True, + ignore_if_missing=True, + **self._config + ) + self.assertEqual(operator.is_prefix, True) + self.assertEqual(operator.ignore_if_missing, True) + + @mock.patch('airflow.contrib.operators.wasb_delete_blob_operator.WasbHook', + autospec=True) + def test_execute(self, mock_hook): + mock_instance = mock_hook.return_value + operator = WasbDeleteBlobOperator( + task_id='wasb_operator', + dag=self.dag, + is_prefix=True, + ignore_if_missing=True, + **self._config + ) + operator.execute(None) + mock_instance.delete_file.assert_called_once_with( + 'container', 'blob', True, True + ) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/core.py b/tests/core.py index c37b1f9c8ba31..918e9b4d49282 100644 --- a/tests/core.py +++ b/tests/core.py @@ -62,7 +62,7 @@ from airflow.utils import timezone from airflow.utils.timezone import datetime from airflow.utils.state import State -from airflow.utils.dates import infer_time_unit, round_time, scale_time_units +from airflow.utils.dates import days_ago, infer_time_unit, round_time, scale_time_units from lxml import html from airflow.exceptions import AirflowException from airflow.configuration import AirflowConfigException, run_command @@ -80,6 +80,7 @@ DEFAULT_DATE_ISO = DEFAULT_DATE.isoformat() DEFAULT_DATE_DS = DEFAULT_DATE_ISO[:10] TEST_DAG_ID = 'unit_tests' +EXAMPLE_DAG_DEFAULT_DATE = days_ago(2) try: import cPickle as pickle @@ -1805,21 +1806,21 @@ def setUp(self): self.dagrun_python = self.dag_python.create_dagrun( run_id="test_{}".format(models.DagRun.id_for_date(timezone.utcnow())), - execution_date=DEFAULT_DATE, + execution_date=EXAMPLE_DAG_DEFAULT_DATE, start_date=timezone.utcnow(), state=State.RUNNING ) self.sub_dag.create_dagrun( run_id="test_{}".format(models.DagRun.id_for_date(timezone.utcnow())), - execution_date=DEFAULT_DATE, + execution_date=EXAMPLE_DAG_DEFAULT_DATE, start_date=timezone.utcnow(), state=State.RUNNING ) self.example_xcom.create_dagrun( run_id="test_{}".format(models.DagRun.id_for_date(timezone.utcnow())), - execution_date=DEFAULT_DATE, + execution_date=EXAMPLE_DAG_DEFAULT_DATE, start_date=timezone.utcnow(), state=State.RUNNING ) @@ -1912,7 +1913,7 @@ def test_dag_views(self): response = self.app.get( '/admin/airflow/task?' 'task_id=runme_0&dag_id=example_bash_operator&' - 'execution_date={}'.format(DEFAULT_DATE_DS)) + 'execution_date={}'.format(EXAMPLE_DAG_DEFAULT_DATE)) self.assertIn("Attributes", response.data.decode('utf-8')) response = self.app.get( '/admin/airflow/dag_stats') @@ -1924,22 +1925,21 @@ def test_dag_views(self): "/admin/airflow/success?task_id=print_the_context&" "dag_id=example_python_operator&upstream=false&downstream=false&" "future=false&past=false&execution_date={}&" - "origin=/admin".format(DEFAULT_DATE_DS)) + "origin=/admin".format(EXAMPLE_DAG_DEFAULT_DATE)) response = self.app.get(url) self.assertIn("Wait a minute", response.data.decode('utf-8')) - response = self.app.get(url + "&confirmed=true") response = self.app.get( '/admin/airflow/clear?task_id=print_the_context&' 'dag_id=example_python_operator&future=true&past=false&' 'upstream=true&downstream=false&' 'execution_date={}&' - 'origin=/admin'.format(DEFAULT_DATE_DS)) + 'origin=/admin'.format(EXAMPLE_DAG_DEFAULT_DATE)) self.assertIn("Wait a minute", response.data.decode('utf-8')) url = ( "/admin/airflow/success?task_id=section-1&" "dag_id=example_subdag_operator&upstream=true&downstream=true&" "future=false&past=false&execution_date={}&" - "origin=/admin".format(DEFAULT_DATE_DS)) + "origin=/admin".format(EXAMPLE_DAG_DEFAULT_DATE)) response = self.app.get(url) self.assertIn("Wait a minute", response.data.decode('utf-8')) self.assertIn("section-1-task-1", response.data.decode('utf-8')) @@ -1953,7 +1953,7 @@ def test_dag_views(self): "dag_id=example_python_operator&future=false&past=false&" "upstream=false&downstream=true&" "execution_date={}&" - "origin=/admin".format(DEFAULT_DATE_DS)) + "origin=/admin".format(EXAMPLE_DAG_DEFAULT_DATE)) response = self.app.get(url) self.assertIn("Wait a minute", response.data.decode('utf-8')) response = self.app.get(url + "&confirmed=true") @@ -1962,7 +1962,7 @@ def test_dag_views(self): "dag_id=example_subdag_operator.section-1&future=false&past=false&" "upstream=false&downstream=true&recursive=true&" "execution_date={}&" - "origin=/admin".format(DEFAULT_DATE_DS)) + "origin=/admin".format(EXAMPLE_DAG_DEFAULT_DATE)) response = self.app.get(url) self.assertIn("Wait a minute", response.data.decode('utf-8')) self.assertIn("example_subdag_operator.end", @@ -1989,7 +1989,7 @@ def test_dag_views(self): "/admin/airflow/run?task_id=runme_0&" "dag_id=example_bash_operator&ignore_all_deps=false&ignore_ti_state=true&" "ignore_task_deps=true&execution_date={}&" - "origin=/admin".format(DEFAULT_DATE_DS)) + "origin=/admin".format(EXAMPLE_DAG_DEFAULT_DATE)) response = self.app.get(url) response = self.app.get( "/admin/airflow/refresh?dag_id=example_bash_operator") @@ -2024,7 +2024,7 @@ def test_fetch_task_instance(self): url = ( "/admin/airflow/object/task_instances?" "dag_id=example_python_operator&" - "execution_date={}".format(DEFAULT_DATE_DS)) + "execution_date={}".format(EXAMPLE_DAG_DEFAULT_DATE)) response = self.app.get(url) self.assertIn("print_the_context", response.data.decode('utf-8')) @@ -2032,19 +2032,20 @@ def test_dag_view_task_with_python_operator_using_partial(self): response = self.app.get( '/admin/airflow/task?' 'task_id=test_dagrun_functool_partial&dag_id=test_task_view_type_check&' - 'execution_date={}'.format(DEFAULT_DATE_DS)) + 'execution_date={}'.format(EXAMPLE_DAG_DEFAULT_DATE)) self.assertIn("A function with two args", response.data.decode('utf-8')) def test_dag_view_task_with_python_operator_using_instance(self): response = self.app.get( '/admin/airflow/task?' 'task_id=test_dagrun_instance&dag_id=test_task_view_type_check&' - 'execution_date={}'.format(DEFAULT_DATE_DS)) + 'execution_date={}'.format(EXAMPLE_DAG_DEFAULT_DATE)) self.assertIn("A __call__ method", response.data.decode('utf-8')) def tearDown(self): configuration.conf.set("webserver", "expose_config", "False") - self.dag_bash.clear(start_date=DEFAULT_DATE, end_date=timezone.utcnow()) + self.dag_bash.clear(start_date=EXAMPLE_DAG_DEFAULT_DATE, + end_date=timezone.utcnow()) session = Session() session.query(models.DagRun).delete() session.query(models.TaskInstance).delete() diff --git a/tests/dags/test_scheduler_dags.py b/tests/dags/test_scheduler_dags.py index ae2bd202d9803..94e6f8216d226 100644 --- a/tests/dags/test_scheduler_dags.py +++ b/tests/dags/test_scheduler_dags.py @@ -17,18 +17,34 @@ # specific language governing permissions and limitations # under the License. -from datetime import datetime +from datetime import datetime, timedelta from airflow.models import DAG from airflow.operators.dummy_operator import DummyOperator -DEFAULT_DATE = datetime(2100, 1, 1) +DEFAULT_DATE = datetime(2016, 1, 1) # DAG tests backfill with pooled tasks # Previously backfill would queue the task but never run it dag1 = DAG( dag_id='test_start_date_scheduling', - start_date=datetime(2100, 1, 1)) + start_date=datetime.utcnow() + timedelta(days=1)) dag1_task1 = DummyOperator( task_id='dummy', dag=dag1, owner='airflow') + +dag2 = DAG( + dag_id='test_task_start_date_scheduling', + start_date=DEFAULT_DATE +) +dag2_task1 = DummyOperator( + task_id='dummy1', + dag=dag2, + owner='airflow', + start_date=DEFAULT_DATE + timedelta(days=3) +) +dag2_task2 = DummyOperator( + task_id='dummy2', + dag=dag2, + owner='airflow' +) diff --git a/tests/executors/test_celery_executor.py b/tests/executors/test_celery_executor.py index 5c70b5bf20d70..f1b6a429faf3d 100644 --- a/tests/executors/test_celery_executor.py +++ b/tests/executors/test_celery_executor.py @@ -26,11 +26,16 @@ from airflow.executors.celery_executor import CELERY_FETCH_ERR_MSG_HEADER from airflow.utils.state import State +from airflow import configuration +configuration.load_test_config() + # leave this it is used by the test worker import celery.contrib.testing.tasks # noqa: F401 class CeleryExecutorTest(unittest.TestCase): + @unittest.skipIf('sqlite' in configuration.conf.get('core', 'sql_alchemy_conn'), + "sqlite is configured with SequentialExecutor") def test_celery_integration(self): executor = CeleryExecutor() executor.start() diff --git a/tests/jobs.py b/tests/jobs.py index bb714bd201602..9dcd15fbe6120 100644 --- a/tests/jobs.py +++ b/tests/jobs.py @@ -2217,7 +2217,7 @@ def test_scheduler_start_date(self): dag_id = 'test_start_date_scheduling' dag = self.dagbag.get_dag(dag_id) dag.clear() - self.assertTrue(dag.start_date > DEFAULT_DATE) + self.assertTrue(dag.start_date > datetime.datetime.utcnow()) scheduler = SchedulerJob(dag_id, num_runs=2) @@ -2252,6 +2252,27 @@ def test_scheduler_start_date(self): self.assertEqual( len(session.query(TI).filter(TI.dag_id == dag_id).all()), 1) + def test_scheduler_task_start_date(self): + """ + Test that the scheduler respects task start dates that are different + from DAG start dates + """ + dag_id = 'test_task_start_date_scheduling' + dag = self.dagbag.get_dag(dag_id) + dag.clear() + scheduler = SchedulerJob(dag_id, + num_runs=2) + scheduler.run() + + session = settings.Session() + tiq = session.query(TI).filter(TI.dag_id == dag_id) + ti1s = tiq.filter(TI.task_id == 'dummy1').all() + ti2s = tiq.filter(TI.task_id == 'dummy2').all() + self.assertEqual(len(ti1s), 0) + self.assertEqual(len(ti2s), 2) + for t in ti2s: + self.assertEqual(t.state, State.SUCCESS) + def test_scheduler_multiprocessing(self): """ Test that the scheduler can successfully queue multiple dags in parallel diff --git a/tests/sensors/test_s3_key_sensor.py b/tests/sensors/test_s3_key_sensor.py index a6e77058d8159..0d7f5678f854c 100644 --- a/tests/sensors/test_s3_key_sensor.py +++ b/tests/sensors/test_s3_key_sensor.py @@ -17,7 +17,10 @@ # specific language governing permissions and limitations # under the License. +import mock import unittest +from parameterized import parameterized + from airflow.exceptions import AirflowException from airflow.sensors.s3_key_sensor import S3KeySensor @@ -31,7 +34,9 @@ def test_bucket_name_None_and_bucket_key_as_relative_path(self): :return: """ with self.assertRaises(AirflowException): - S3KeySensor(bucket_key="file_in_bucket") + S3KeySensor( + task_id='s3_key_sensor', + bucket_key="file_in_bucket") def test_bucket_name_provided_and_bucket_key_is_s3_url(self): """ @@ -40,5 +45,49 @@ def test_bucket_name_provided_and_bucket_key_is_s3_url(self): :return: """ with self.assertRaises(AirflowException): - S3KeySensor(bucket_key="s3://test_bucket/file", - bucket_name='test_bucket') + S3KeySensor( + task_id='s3_key_sensor', + bucket_key="s3://test_bucket/file", + bucket_name='test_bucket') + + @parameterized.expand([ + ['s3://bucket/key', None, 'key', 'bucket'], + ['key', 'bucket', 'key', 'bucket'], + ]) + def test_parse_bucket_key(self, key, bucket, parsed_key, parsed_bucket): + s = S3KeySensor( + task_id='s3_key_sensor', + bucket_key=key, + bucket_name=bucket, + ) + self.assertEqual(s.bucket_key, parsed_key) + self.assertEqual(s.bucket_name, parsed_bucket) + + @mock.patch('airflow.hooks.S3_hook.S3Hook') + def test_poke(self, mock_hook): + s = S3KeySensor( + task_id='s3_key_sensor', + bucket_key='s3://test_bucket/file') + + mock_check_for_key = mock_hook.return_value.check_for_key + mock_check_for_key.return_value = False + self.assertFalse(s.poke(None)) + mock_check_for_key.assert_called_with(s.bucket_key, s.bucket_name) + + mock_hook.return_value.check_for_key.return_value = True + self.assertTrue(s.poke(None)) + + @mock.patch('airflow.hooks.S3_hook.S3Hook') + def test_poke_wildcard(self, mock_hook): + s = S3KeySensor( + task_id='s3_key_sensor', + bucket_key='s3://test_bucket/file', + wildcard_match=True) + + mock_check_for_wildcard_key = mock_hook.return_value.check_for_wildcard_key + mock_check_for_wildcard_key.return_value = False + self.assertFalse(s.poke(None)) + mock_check_for_wildcard_key.assert_called_with(s.bucket_key, s.bucket_name) + + mock_check_for_wildcard_key.return_value = True + self.assertTrue(s.poke(None)) diff --git a/tests/sensors/test_s3_prefix_sensor.py b/tests/sensors/test_s3_prefix_sensor.py new file mode 100644 index 0000000000000..aa24f84b92207 --- /dev/null +++ b/tests/sensors/test_s3_prefix_sensor.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# +# 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. + +import mock +import unittest + +from airflow.sensors.s3_prefix_sensor import S3PrefixSensor + + +class S3PrefixSensorTests(unittest.TestCase): + + @mock.patch('airflow.hooks.S3_hook.S3Hook') + def test_poke(self, mock_hook): + s = S3PrefixSensor( + task_id='s3_prefix', + bucket_name='bucket', + prefix='prefix') + + mock_hook.return_value.check_for_prefix.return_value = False + self.assertFalse(s.poke(None)) + mock_hook.return_value.check_for_prefix.assert_called_with( + prefix='prefix', + delimiter='/', + bucket_name='bucket') + + mock_hook.return_value.check_for_prefix.return_value = True + self.assertTrue(s.poke(None)) diff --git a/tests/sensors/test_sql_sensor.py b/tests/sensors/test_sql_sensor.py index 433eaa61e9146..5b52f3b65480a 100644 --- a/tests/sensors/test_sql_sensor.py +++ b/tests/sensors/test_sql_sensor.py @@ -16,6 +16,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +import mock import unittest from airflow import DAG @@ -30,6 +31,7 @@ class SqlSensorTests(unittest.TestCase): + def setUp(self): configuration.load_test_config() args = { @@ -38,6 +40,8 @@ def setUp(self): } self.dag = DAG(TEST_DAG_ID, default_args=args) + @unittest.skipUnless('mysql' in configuration.conf.get('core', 'sql_alchemy_conn'), + "this is a mysql test") def test_sql_sensor_mysql(self): t = SqlSensor( task_id='sql_sensor_check', @@ -47,6 +51,8 @@ def test_sql_sensor_mysql(self): ) t.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE, ignore_ti_state=True) + @unittest.skipUnless('postgresql' in configuration.conf.get('core', 'sql_alchemy_conn'), + "this is a postgres test") def test_sql_sensor_postgres(self): t = SqlSensor( task_id='sql_sensor_check', @@ -55,3 +61,21 @@ def test_sql_sensor_postgres(self): dag=self.dag ) t.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE, ignore_ti_state=True) + + @mock.patch('airflow.sensors.sql_sensor.BaseHook') + def test_sql_sensor_postgres_poke(self, mock_hook): + t = SqlSensor( + task_id='sql_sensor_check', + conn_id='postgres_default', + sql="SELECT 1", + ) + + mock_get_records = ( + mock_hook.get_connection.return_value + .get_hook.return_value.get_records) + + mock_get_records.return_value = [] + self.assertFalse(t.poke(None)) + + mock_get_records.return_value = [['1']] + self.assertTrue(t.poke(None)) diff --git a/tests/www_rbac/test_views.py b/tests/www_rbac/test_views.py index 64531244656a4..a952b9874c088 100644 --- a/tests/www_rbac/test_views.py +++ b/tests/www_rbac/test_views.py @@ -39,7 +39,7 @@ from airflow.models import DAG, DagRun, TaskInstance from airflow.operators.dummy_operator import DummyOperator from airflow.settings import Session -from airflow.utils import timezone +from airflow.utils import dates, timezone from airflow.utils.state import State from airflow.utils.timezone import datetime from airflow.www_rbac import app as application @@ -267,8 +267,8 @@ def test_mount(self): class TestAirflowBaseViews(TestBase): - default_date = timezone.datetime(2018, 3, 1) - run_id = "test_{}".format(models.DagRun.id_for_date(default_date)) + EXAMPLE_DAG_DEFAULT_DATE = dates.days_ago(2) + run_id = "test_{}".format(models.DagRun.id_for_date(EXAMPLE_DAG_DEFAULT_DATE)) def setUp(self): super(TestAirflowBaseViews, self).setUp() @@ -297,19 +297,19 @@ def prepare_dagruns(self): self.bash_dagrun = self.bash_dag.create_dagrun( run_id=self.run_id, - execution_date=self.default_date, + execution_date=self.EXAMPLE_DAG_DEFAULT_DATE, start_date=timezone.utcnow(), state=State.RUNNING) self.sub_dagrun = self.sub_dag.create_dagrun( run_id=self.run_id, - execution_date=self.default_date, + execution_date=self.EXAMPLE_DAG_DEFAULT_DATE, start_date=timezone.utcnow(), state=State.RUNNING) self.xcom_dagrun = self.xcom_dag.create_dagrun( run_id=self.run_id, - execution_date=self.default_date, + execution_date=self.EXAMPLE_DAG_DEFAULT_DATE, start_date=timezone.utcnow(), state=State.RUNNING) @@ -327,19 +327,19 @@ def test_home(self): def test_task(self): url = ('task?task_id=runme_0&dag_id=example_bash_operator&execution_date={}' - .format(self.percent_encode(self.default_date))) + .format(self.percent_encode(self.EXAMPLE_DAG_DEFAULT_DATE))) resp = self.client.get(url, follow_redirects=True) self.check_content_in_response('Task Instance Details', resp) def test_xcom(self): url = ('xcom?task_id=runme_0&dag_id=example_bash_operator&execution_date={}' - .format(self.percent_encode(self.default_date))) + .format(self.percent_encode(self.EXAMPLE_DAG_DEFAULT_DATE))) resp = self.client.get(url, follow_redirects=True) self.check_content_in_response('XCom', resp) def test_rendered(self): url = ('rendered?task_id=runme_0&dag_id=example_bash_operator&execution_date={}' - .format(self.percent_encode(self.default_date))) + .format(self.percent_encode(self.EXAMPLE_DAG_DEFAULT_DATE))) resp = self.client.get(url, follow_redirects=True) self.check_content_in_response('Rendered Template', resp) @@ -409,28 +409,28 @@ def test_paused(self): def test_failed(self): url = ('failed?task_id=run_this_last&dag_id=example_bash_operator&' 'execution_date={}&upstream=false&downstream=false&future=false&past=false' - .format(self.percent_encode(self.default_date))) + .format(self.percent_encode(self.EXAMPLE_DAG_DEFAULT_DATE))) resp = self.client.get(url) self.check_content_in_response('Wait a minute', resp) def test_success(self): url = ('success?task_id=run_this_last&dag_id=example_bash_operator&' 'execution_date={}&upstream=false&downstream=false&future=false&past=false' - .format(self.percent_encode(self.default_date))) + .format(self.percent_encode(self.EXAMPLE_DAG_DEFAULT_DATE))) resp = self.client.get(url) self.check_content_in_response('Wait a minute', resp) def test_clear(self): url = ('clear?task_id=runme_1&dag_id=example_bash_operator&' 'execution_date={}&upstream=false&downstream=false&future=false&past=false' - .format(self.percent_encode(self.default_date))) + .format(self.percent_encode(self.EXAMPLE_DAG_DEFAULT_DATE))) resp = self.client.get(url) self.check_content_in_response(['example_bash_operator', 'Wait a minute'], resp) def test_run(self): url = ('run?task_id=runme_0&dag_id=example_bash_operator&ignore_all_deps=false&' 'ignore_ti_state=true&execution_date={}' - .format(self.percent_encode(self.default_date))) + .format(self.percent_encode(self.EXAMPLE_DAG_DEFAULT_DATE))) resp = self.client.get(url) self.check_content_in_response('', resp, resp_code=302) diff --git a/tox.ini b/tox.ini index f07641f29b38a..17bfeb6ec2e78 100644 --- a/tox.ini +++ b/tox.ini @@ -48,7 +48,9 @@ setenv = KRB5_CONFIG=/etc/krb5.conf KRB5_KTNAME=/etc/airflow.keytab backend_mysql: AIRFLOW__CORE__SQL_ALCHEMY_CONN=mysql://root@mysql/airflow + backend_mysql: AIRFLOW__CELERY__RESULT_BACKEND=db+mysql://root@mysql/airflow backend_postgres: AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:airflow@postgres/airflow + backend_postgres: AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:airflow@postgres/airflow backend_sqlite: AIRFLOW__CORE__SQL_ALCHEMY_CONN=sqlite:///{homedir}/airflow.db backend_sqlite: AIRFLOW__CORE__EXECUTOR=SequentialExecutor @@ -59,7 +61,7 @@ commands = pip install --progress-bar off --find-links={homedir}/.wheelhouse --no-index -e .[devel_ci] env_docker: {toxinidir}/scripts/ci/1-setup-env.sh env_docker: {toxinidir}/scripts/ci/2-setup-kdc.sh - env_docker: {toxinidir}/scripts/ci/3-setup-databases.sh + backend_mysql: {toxinidir}/scripts/ci/3-setup-mysql.sh {toxinidir}/scripts/ci/5-run-tests.sh [] {toxinidir}/scripts/ci/6-check-license.sh codecov -e TOXENV From 7353797ab5b2bbae7ba346898c861a66345db1f0 Mon Sep 17 00:00:00 2001 From: "wayne.morris" Date: Fri, 12 Oct 2018 12:30:34 -0400 Subject: [PATCH 4/9] Resolved conflicts --- airflow/contrib/hooks/bigquery_hook.py | 40 ----- tests/contrib/hooks/test_bigquery_hook.py | 176 ---------------------- 2 files changed, 216 deletions(-) diff --git a/airflow/contrib/hooks/bigquery_hook.py b/airflow/contrib/hooks/bigquery_hook.py index abb1fea0f8f41..dba4618e35905 100644 --- a/airflow/contrib/hooks/bigquery_hook.py +++ b/airflow/contrib/hooks/bigquery_hook.py @@ -496,12 +496,8 @@ def run_query(self, schema_update_options=(), priority='INTERACTIVE', time_partitioning=None, -<<<<<<< HEAD api_resource_configs=None, cluster_fields=None): -======= - api_resource_configs=None): ->>>>>>> 5869feae... [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) """ Executes a BigQuery SQL query. Optionally persists results in a BigQuery table. See here: @@ -532,11 +528,7 @@ def run_query(self, See https://cloud.google.com/bigquery/user-defined-functions for details. :param use_legacy_sql: Whether to use legacy SQL (true) or standard SQL (false). If `None`, defaults to `self.use_legacy_sql`. -<<<<<<< HEAD :type use_legacy_sql: bool -======= - :type use_legacy_sql: boolean ->>>>>>> 5869feae... [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) :param api_resource_configs: a dictionary that contain params 'configuration' applied for Google BigQuery Jobs API: https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs @@ -577,20 +569,7 @@ def run_query(self, time_partitioning. The order of columns given determines the sort order. :type cluster_fields: list of str """ - if not api_resource_configs: - api_resource_configs = self.api_resource_configs - else: - _validate_value('api_resource_configs', - api_resource_configs, dict) - configuration = deepcopy(api_resource_configs) - if 'query' not in configuration: - configuration['query'] = {} - else: - _validate_value("api_resource_configs['query']", - configuration['query'], dict) - -<<<<<<< HEAD if not api_resource_configs: api_resource_configs = self.api_resource_configs else: @@ -604,8 +583,6 @@ def run_query(self, _validate_value("api_resource_configs['query']", configuration['query'], dict) -======= ->>>>>>> 5869feae... [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) sql = bql if sql is None else sql # TODO remove `bql` in Airflow 2.0 - Jira: [AIRFLOW-2513] @@ -657,12 +634,9 @@ def run_query(self, 'tableId': destination_table, } -<<<<<<< HEAD if cluster_fields: cluster_fields = {'fields': cluster_fields} -======= ->>>>>>> 5869feae... [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) query_param_list = [ (sql, 'query', None, str), (priority, 'priority', 'INTERACTIVE', str), @@ -673,12 +647,8 @@ def run_query(self, (maximum_bytes_billed, 'maximumBytesBilled', None, float), (time_partitioning, 'timePartitioning', {}, dict), (schema_update_options, 'schemaUpdateOptions', None, tuple), -<<<<<<< HEAD (destination_dataset_table, 'destinationTable', None, dict), (cluster_fields, 'clustering', None, dict), -======= - (destination_dataset_table, 'destinationTable', None, dict) ->>>>>>> 5869feae... [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) ] for param_tuple in query_param_list: @@ -1847,7 +1817,6 @@ def _validate_value(key, value, expected_type): key, expected_type, type(value))) -<<<<<<< HEAD def _api_resource_configs_duplication_check(key, value, config_dict, config_dict_name='api_resource_configs'): if key in config_dict and value != config_dict[key]: @@ -1856,12 +1825,3 @@ def _api_resource_configs_duplication_check(key, value, config_dict, "in `query` config and {param_name} was also provided " "with arg to run_query() method. Please remove duplicates." .format(param_name=key, dict_name=config_dict_name)) -======= -def _api_resource_configs_duplication_check(key, value, config_dict): - if key in config_dict and value != config_dict[key]: - raise ValueError("Values of {param_name} param are duplicated. " - "`api_resource_configs` contained {param_name} param " - "in `query` config and {param_name} was also provided " - "with arg to run_query() method. Please remove duplicates." - .format(param_name=key)) ->>>>>>> 5869feae... [AIRFLOW-491] Add feature to pass extra api configs to BQ Hook (#3733) diff --git a/tests/contrib/hooks/test_bigquery_hook.py b/tests/contrib/hooks/test_bigquery_hook.py index 1cc3f66258982..77a31f032081b 100644 --- a/tests/contrib/hooks/test_bigquery_hook.py +++ b/tests/contrib/hooks/test_bigquery_hook.py @@ -621,182 +621,6 @@ def run_with_config(config): mocked_rwc.assert_called_once() -class TestClusteringInRunJob(unittest.TestCase): - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_load_default(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertIsNone(config['load'].get('clustering')) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_load( - destination_project_dataset_table='my_dataset.my_table', - schema_fields=[], - source_uris=[], - ) - - mocked_rwc.assert_called_once() - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_load_with_arg(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertEqual( - config['load']['clustering'], - { - 'fields': ['field1', 'field2'] - } - ) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_load( - destination_project_dataset_table='my_dataset.my_table', - schema_fields=[], - source_uris=[], - cluster_fields=['field1', 'field2'], - time_partitioning={'type': 'DAY'} - ) - - mocked_rwc.assert_called_once() - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_query_default(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertIsNone(config['query'].get('clustering')) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_query(sql='select 1') - - mocked_rwc.assert_called_once() - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_query_with_arg(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertEqual( - config['query']['clustering'], - { - 'fields': ['field1', 'field2'] - } - ) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_query( - sql='select 1', - destination_dataset_table='my_dataset.my_table', - cluster_fields=['field1', 'field2'], - time_partitioning={'type': 'DAY'} - ) - - mocked_rwc.assert_called_once() - - -class TestClusteringInRunJob(unittest.TestCase): - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_load_default(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertIsNone(config['load'].get('clustering')) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_load( - destination_project_dataset_table='my_dataset.my_table', - schema_fields=[], - source_uris=[], - ) - - mocked_rwc.assert_called_once() - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_load_with_arg(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertEqual( - config['load']['clustering'], - { - 'fields': ['field1', 'field2'] - } - ) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_load( - destination_project_dataset_table='my_dataset.my_table', - schema_fields=[], - source_uris=[], - cluster_fields=['field1', 'field2'], - time_partitioning={'type': 'DAY'} - ) - - mocked_rwc.assert_called_once() - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_query_default(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertIsNone(config['query'].get('clustering')) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_query(sql='select 1') - - mocked_rwc.assert_called_once() - - @mock.patch("airflow.contrib.hooks.bigquery_hook.LoggingMixin") - @mock.patch("airflow.contrib.hooks.bigquery_hook.time") - @mock.patch.object(hook.BigQueryBaseCursor, 'run_with_configuration') - def test_run_query_with_arg(self, mocked_rwc, mocked_time, mocked_logging): - project_id = 12345 - - def run_with_config(config): - self.assertEqual( - config['query']['clustering'], - { - 'fields': ['field1', 'field2'] - } - ) - mocked_rwc.side_effect = run_with_config - - bq_hook = hook.BigQueryBaseCursor(mock.Mock(), project_id) - bq_hook.run_query( - sql='select 1', - destination_dataset_table='my_dataset.my_table', - cluster_fields=['field1', 'field2'], - time_partitioning={'type': 'DAY'} - ) - - mocked_rwc.assert_called_once() - - class TestBigQueryHookLegacySql(unittest.TestCase): """Ensure `use_legacy_sql` param in `BigQueryHook` propagates properly.""" From d9bede67eb16af585c4630198ef2aba24647652e Mon Sep 17 00:00:00 2001 From: "wayne.morris" Date: Fri, 12 Oct 2018 13:06:10 -0400 Subject: [PATCH 5/9] Made get_s3_key static method. --- .../contrib/operators/s3_to_sftp_operator.py | 17 ++++++++--------- .../contrib/operators/sftp_to_s3_operator.py | 17 ++++++++--------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/airflow/contrib/operators/s3_to_sftp_operator.py b/airflow/contrib/operators/s3_to_sftp_operator.py index 1878900f877f4..dbc7e5afd9693 100644 --- a/airflow/contrib/operators/s3_to_sftp_operator.py +++ b/airflow/contrib/operators/s3_to_sftp_operator.py @@ -25,15 +25,6 @@ from airflow.utils.decorators import apply_defaults -@staticmethod -def get_s3_key(s3_key): - """This parses the correct format for S3 keys - regardless of how the S3 url is passed.""" - - parsed_s3_key = urlparse(s3_key) - return parsed_s3_key.path.lstrip('/') - - class S3ToSFTPOperator(BaseOperator): """ This operator enables the transferring of files from S3 to a SFTP server @@ -72,6 +63,14 @@ def __init__(self, self.s3_key = s3_key self.s3_conn_id = s3_conn_id + @staticmethod + def get_s3_key(s3_key): + """This parses the correct format for S3 keys + regardless of how the S3 url is passed.""" + + parsed_s3_key = urlparse(s3_key) + return parsed_s3_key.path.lstrip('/') + def execute(self, context): self.s3_key = get_s3_key(self.s3_key) ssh_hook = SSHHook(ssh_conn_id=self.sftp_conn_id) diff --git a/airflow/contrib/operators/sftp_to_s3_operator.py b/airflow/contrib/operators/sftp_to_s3_operator.py index 109ed38c00c5d..bc7dc05257b3c 100644 --- a/airflow/contrib/operators/sftp_to_s3_operator.py +++ b/airflow/contrib/operators/sftp_to_s3_operator.py @@ -25,15 +25,6 @@ from airflow.utils.decorators import apply_defaults -@staticmethod -def get_s3_key(s3_key): - """This parses the correct format for S3 keys - regardless of how the S3 url is passed.""" - - parsed_s3_key = urlparse(s3_key) - return parsed_s3_key.path.lstrip('/') - - class SFTPToS3Operator(BaseOperator): """ This operator enables the transferring of files from a SFTP server to Amazon S3 @@ -72,6 +63,14 @@ def __init__(self, self.s3_key = s3_key self.s3_conn_id = s3_conn_id + @staticmethod + def get_s3_key(s3_key): + """This parses the correct format for S3 keys + regardless of how the S3 url is passed.""" + + parsed_s3_key = urlparse(s3_key) + return parsed_s3_key.path.lstrip('/') + def execute(self, context): self.s3_key = get_s3_key(self.s3_key) ssh_hook = SSHHook(ssh_conn_id=self.sftp_conn_id) From 22c1512fd93a4f814785bb3df931ec084bc6a50f Mon Sep 17 00:00:00 2001 From: "wayne.morris" Date: Fri, 12 Oct 2018 13:07:21 -0400 Subject: [PATCH 6/9] Made get_s3_key static method. --- airflow/contrib/operators/s3_to_sftp_operator.py | 2 +- airflow/contrib/operators/sftp_to_s3_operator.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/airflow/contrib/operators/s3_to_sftp_operator.py b/airflow/contrib/operators/s3_to_sftp_operator.py index dbc7e5afd9693..7e02e97cd24e4 100644 --- a/airflow/contrib/operators/s3_to_sftp_operator.py +++ b/airflow/contrib/operators/s3_to_sftp_operator.py @@ -72,7 +72,7 @@ def get_s3_key(s3_key): return parsed_s3_key.path.lstrip('/') def execute(self, context): - self.s3_key = get_s3_key(self.s3_key) + self.s3_key = self.get_s3_key(self.s3_key) ssh_hook = SSHHook(ssh_conn_id=self.sftp_conn_id) s3_hook = S3Hook(self.s3_conn_id) diff --git a/airflow/contrib/operators/sftp_to_s3_operator.py b/airflow/contrib/operators/sftp_to_s3_operator.py index bc7dc05257b3c..b0ed1e16a3630 100644 --- a/airflow/contrib/operators/sftp_to_s3_operator.py +++ b/airflow/contrib/operators/sftp_to_s3_operator.py @@ -72,7 +72,7 @@ def get_s3_key(s3_key): return parsed_s3_key.path.lstrip('/') def execute(self, context): - self.s3_key = get_s3_key(self.s3_key) + self.s3_key = self.get_s3_key(self.s3_key) ssh_hook = SSHHook(ssh_conn_id=self.sftp_conn_id) s3_hook = S3Hook(self.s3_conn_id) From 2a7aa1f2c21c3c3daffad75bf8c85b93ad2715c8 Mon Sep 17 00:00:00 2001 From: "wayne.morris" Date: Fri, 12 Oct 2018 14:32:29 -0400 Subject: [PATCH 7/9] Resolved conflicts. --- .../operators/test_s3_to_sftp_operator.py | 2 +- tests/contrib/operators/test_sftp_operator.py | 170 ++++++------------ 2 files changed, 53 insertions(+), 119 deletions(-) diff --git a/tests/contrib/operators/test_s3_to_sftp_operator.py b/tests/contrib/operators/test_s3_to_sftp_operator.py index d8ce35cd81b6c..ea07d293f18b7 100644 --- a/tests/contrib/operators/test_s3_to_sftp_operator.py +++ b/tests/contrib/operators/test_s3_to_sftp_operator.py @@ -154,7 +154,7 @@ def delete_remote_resource(self): ssh_hook=self.hook, command="rm {0}".format(self.sftp_path), do_xcom_push=True, - dag=self.dag + dag=self.dags ) self.assertIsNotNone(remove_file_task) ti3 = TaskInstance(task=remove_file_task, execution_date=timezone.utcnow()) diff --git a/tests/contrib/operators/test_sftp_operator.py b/tests/contrib/operators/test_sftp_operator.py index af3f73142230d..bf4525e31100e 100644 --- a/tests/contrib/operators/test_sftp_operator.py +++ b/tests/contrib/operators/test_sftp_operator.py @@ -42,7 +42,6 @@ def reset(dag_id=TEST_DAG_ID): session.commit() session.close() - reset() @@ -80,12 +79,12 @@ def test_pickle_file_transfer_put(self): # put test file to remote put_test_task = SFTPOperator( - task_id="test_sftp", - ssh_hook=self.hook, - local_filepath=self.test_local_filepath, - remote_filepath=self.test_remote_filepath, - operation=SFTPOperation.PUT, - dag=self.dag + task_id="test_sftp", + ssh_hook=self.hook, + local_filepath=self.test_local_filepath, + remote_filepath=self.test_remote_filepath, + operation=SFTPOperation.PUT, + dag=self.dag ) self.assertIsNotNone(put_test_task) ti2 = TaskInstance(task=put_test_task, execution_date=timezone.utcnow()) @@ -93,18 +92,18 @@ def test_pickle_file_transfer_put(self): # check the remote file content check_file_task = SSHOperator( - task_id="test_check_file", - ssh_hook=self.hook, - command="cat {0}".format(self.test_remote_filepath), - do_xcom_push=True, - dag=self.dag + task_id="test_check_file", + ssh_hook=self.hook, + command="cat {0}".format(self.test_remote_filepath), + do_xcom_push=True, + dag=self.dag ) self.assertIsNotNone(check_file_task) ti3 = TaskInstance(task=check_file_task, execution_date=timezone.utcnow()) ti3.run() self.assertEqual( - ti3.xcom_pull(task_ids='test_check_file', key='return_value').strip(), - test_local_file_content) + ti3.xcom_pull(task_ids='test_check_file', key='return_value').strip(), + test_local_file_content) def test_json_file_transfer_put(self): configuration.conf.set("core", "enable_xcom_pickling", "False") @@ -117,12 +116,12 @@ def test_json_file_transfer_put(self): # put test file to remote put_test_task = SFTPOperator( - task_id="test_sftp", - ssh_hook=self.hook, - local_filepath=self.test_local_filepath, - remote_filepath=self.test_remote_filepath, - operation=SFTPOperation.PUT, - dag=self.dag + task_id="test_sftp", + ssh_hook=self.hook, + local_filepath=self.test_local_filepath, + remote_filepath=self.test_remote_filepath, + operation=SFTPOperation.PUT, + dag=self.dag ) self.assertIsNotNone(put_test_task) ti2 = TaskInstance(task=put_test_task, execution_date=timezone.utcnow()) @@ -130,18 +129,19 @@ def test_json_file_transfer_put(self): # check the remote file content check_file_task = SSHOperator( - task_id="test_check_file", - ssh_hook=self.hook, - command="cat {0}".format(self.test_remote_filepath), - do_xcom_push=True, - dag=self.dag + task_id="test_check_file", + ssh_hook=self.hook, + command="cat {0}".format(self.test_remote_filepath), + do_xcom_push=True, + dag=self.dag ) self.assertIsNotNone(check_file_task) ti3 = TaskInstance(task=check_file_task, execution_date=timezone.utcnow()) ti3.run() self.assertEqual( - ti3.xcom_pull(task_ids='test_check_file', key='return_value').strip(), - b64encode(test_local_file_content).decode('utf-8')) + ti3.xcom_pull(task_ids='test_check_file', key='return_value').strip(), + b64encode(test_local_file_content).decode('utf-8')) + def test_pickle_file_transfer_get(self): configuration.conf.set("core", "enable_xcom_pickling", "True") @@ -151,12 +151,12 @@ def test_pickle_file_transfer_get(self): # create a test file remotely create_file_task = SSHOperator( - task_id="test_create_file", - ssh_hook=self.hook, - command="echo '{0}' > {1}".format(test_remote_file_content, - self.test_remote_filepath), - do_xcom_push=True, - dag=self.dag + task_id="test_create_file", + ssh_hook=self.hook, + command="echo '{0}' > {1}".format(test_remote_file_content, + self.test_remote_filepath), + do_xcom_push=True, + dag=self.dag ) self.assertIsNotNone(create_file_task) ti1 = TaskInstance(task=create_file_task, execution_date=timezone.utcnow()) @@ -164,12 +164,12 @@ def test_pickle_file_transfer_get(self): # get remote file to local get_test_task = SFTPOperator( - task_id="test_sftp", - ssh_hook=self.hook, - local_filepath=self.test_local_filepath, - remote_filepath=self.test_remote_filepath, - operation=SFTPOperation.GET, - dag=self.dag + task_id="test_sftp", + ssh_hook=self.hook, + local_filepath=self.test_local_filepath, + remote_filepath=self.test_remote_filepath, + operation=SFTPOperation.GET, + dag=self.dag ) self.assertIsNotNone(get_test_task) ti2 = TaskInstance(task=get_test_task, execution_date=timezone.utcnow()) @@ -189,12 +189,12 @@ def test_json_file_transfer_get(self): # create a test file remotely create_file_task = SSHOperator( - task_id="test_create_file", - ssh_hook=self.hook, - command="echo '{0}' > {1}".format(test_remote_file_content, - self.test_remote_filepath), - do_xcom_push=True, - dag=self.dag + task_id="test_create_file", + ssh_hook=self.hook, + command="echo '{0}' > {1}".format(test_remote_file_content, + self.test_remote_filepath), + do_xcom_push=True, + dag=self.dag ) self.assertIsNotNone(create_file_task) ti1 = TaskInstance(task=create_file_task, execution_date=timezone.utcnow()) @@ -202,12 +202,12 @@ def test_json_file_transfer_get(self): # get remote file to local get_test_task = SFTPOperator( - task_id="test_sftp", - ssh_hook=self.hook, - local_filepath=self.test_local_filepath, - remote_filepath=self.test_remote_filepath, - operation=SFTPOperation.GET, - dag=self.dag + task_id="test_sftp", + ssh_hook=self.hook, + local_filepath=self.test_local_filepath, + remote_filepath=self.test_remote_filepath, + operation=SFTPOperation.GET, + dag=self.dag ) self.assertIsNotNone(get_test_task) ti2 = TaskInstance(task=get_test_task, execution_date=timezone.utcnow()) @@ -218,72 +218,7 @@ def test_json_file_transfer_get(self): with open(self.test_local_filepath, 'r') as f: content_received = f.read() self.assertEqual(content_received.strip(), - test_remote_file_content.encode('utf-8').decode('utf-8')) - - def test_arg_checking(self): - from airflow.exceptions import AirflowException - conn_id = "conn_id_for_testing" - os.environ['AIRFLOW_CONN_' + conn_id.upper()] = "ssh://test_id@localhost" - - # Exception should be raised if neither ssh_hook nor ssh_conn_id is provided - if six.PY2: - self.assertRaisesRegex = self.assertRaisesRegexp - with self.assertRaisesRegex(AirflowException, - "Cannot operate without ssh_hook or ssh_conn_id."): - task_0 = SFTPOperator( - task_id="test_sftp", - local_filepath=self.test_local_filepath, - remote_filepath=self.test_remote_filepath, - operation=SFTPOperation.PUT, - dag=self.dag - ) - task_0.execute(None) - - # if ssh_hook is invalid/not provided, use ssh_conn_id to create SSHHook - task_1 = SFTPOperator( - task_id="test_sftp", - ssh_hook="string_rather_than_SSHHook", # invalid ssh_hook - ssh_conn_id=conn_id, - local_filepath=self.test_local_filepath, - remote_filepath=self.test_remote_filepath, - operation=SFTPOperation.PUT, - dag=self.dag - ) - try: - task_1.execute(None) - except Exception: - pass - self.assertEqual(task_1.ssh_hook.ssh_conn_id, conn_id) - - task_2 = SFTPOperator( - task_id="test_sftp", - ssh_conn_id=conn_id, # no ssh_hook provided - local_filepath=self.test_local_filepath, - remote_filepath=self.test_remote_filepath, - operation=SFTPOperation.PUT, - dag=self.dag - ) - try: - task_2.execute(None) - except Exception: - pass - self.assertEqual(task_2.ssh_hook.ssh_conn_id, conn_id) - - # if both valid ssh_hook and ssh_conn_id are provided, ignore ssh_conn_id - task_3 = SFTPOperator( - task_id="test_sftp", - ssh_hook=self.hook, - ssh_conn_id=conn_id, - local_filepath=self.test_local_filepath, - remote_filepath=self.test_remote_filepath, - operation=SFTPOperation.PUT, - dag=self.dag - ) - try: - task_3.execute(None) - except Exception: - pass - self.assertEqual(task_3.ssh_hook.ssh_conn_id, self.hook.ssh_conn_id) + test_remote_file_content.encode('utf-8').decode('utf-8')) def test_arg_checking(self): from airflow.exceptions import AirflowException @@ -354,7 +289,6 @@ def delete_local_resource(self): if os.path.exists(self.test_local_filepath): os.remove(self.test_local_filepath) - @staticmethod def delete_remote_resource(self): # check the remote file content remove_file_task = SSHOperator( From 755e396c07423734742fa7a23638db71ffa9a0fc Mon Sep 17 00:00:00 2001 From: "wayne.morris" Date: Fri, 12 Oct 2018 15:53:12 -0400 Subject: [PATCH 8/9] Resolved error reported in travis. --- tests/contrib/operators/test_s3_to_sftp_operator.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/contrib/operators/test_s3_to_sftp_operator.py b/tests/contrib/operators/test_s3_to_sftp_operator.py index ea07d293f18b7..5ca52612f73b5 100644 --- a/tests/contrib/operators/test_s3_to_sftp_operator.py +++ b/tests/contrib/operators/test_s3_to_sftp_operator.py @@ -146,7 +146,6 @@ def test_s3_to_sftp_operation(self): conn.delete_bucket(Bucket=self.s3_bucket) self.assertFalse((self.s3_hook.check_for_bucket(self.s3_bucket))) - @staticmethod def delete_remote_resource(self): # check the remote file content remove_file_task = SSHOperator( From 5b9515b1d1bf7ac5feed09529bb9cacab7ed3ce6 Mon Sep 17 00:00:00 2001 From: "wayne.morris" Date: Fri, 12 Oct 2018 16:40:29 -0400 Subject: [PATCH 9/9] Resolved error reported in travis. --- tests/contrib/operators/test_s3_to_sftp_operator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/contrib/operators/test_s3_to_sftp_operator.py b/tests/contrib/operators/test_s3_to_sftp_operator.py index 5ca52612f73b5..359c5eb912172 100644 --- a/tests/contrib/operators/test_s3_to_sftp_operator.py +++ b/tests/contrib/operators/test_s3_to_sftp_operator.py @@ -153,7 +153,7 @@ def delete_remote_resource(self): ssh_hook=self.hook, command="rm {0}".format(self.sftp_path), do_xcom_push=True, - dag=self.dags + dag=self.dag ) self.assertIsNotNone(remove_file_task) ti3 = TaskInstance(task=remove_file_task, execution_date=timezone.utcnow())

    NAzq6e_ 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 z�o$iO@_|uuX?$s%5J_uP81Kfz&o&L~dE#+ftgH!FIJHi2Im-(T&#b(Y=-ZQI9~o zRwWDHu&-c7@`IN znAno&jG|aPHc?p7gpJ;% zDlQ7+Z?FdiJjS*SzR_u`j@pd1UV|#3#Qc$osy2rztsAPDl98#ORne=)^gAQUP*sg% zbDNeF{yYA*pxPCfopTIo7bH}L`&6FVMYdgGHc`b&s+afXj!#sMxA?2BNr37cqOwlZ z1O`-DDAdy()N>@?yiuPB-)3oZ;5Sky+3^G)gCTY6zv0yycNs<;)(!^$cWYvnZv2!dkw3b_QNK& z^4j`lg`zhrBP8zziab(N!G$pv2sMwBp&|2uH$B7N0m3%H)3MFUXbd>(1{{C+G_SYg z4qiErhXkG))=ezk8vgX-MD`sjG@k#U=`S(!RJZ!oy?oj+-;n}Vte{Ng!=t4Jqskl&)7jTYi$u z6U2PYh;grFPA`Pv6Xrk=Luo!5Q_XZP3v1Y_-&%#jGtf{b@2O-ByIWK-&@TKylsZ2 z)$|ND<)ZTY=Gh7zoF^ua(oo9_Qw2(4#XjqkS&Byf z{g^+eFIe;&n5*wfNuCa+;lO;vRmN7k)9z!EoV5;xF{#Dy++_#ui7Nl)5SSon&#AFPR@KQ!e2z6Bs4YI2s+V2FC(_F$9vflbjq_~E zyd7)Rn4pFxWP*RkVJ+|S=yoq^g3#I#8&^`T7zrz)RUWawJk%o}V9Gs{R?5DtTMx(Zo_Fk$2c82aZx(5!{a zd|wWVy<^RY?SG4&2sBS>Gtg~`PHQ{bptq%tI=sm`?D|H7LyI~85mYy8+o0dW!iU=u z|MlCkUF>3fNl=N_R4UbPO_jRQI=unbHKH{YMkJUWB!8bc>09>$$Oh+&vzToYPh{=$ z?mZQW>B!#Tt;qc8n?_hT$zbff50MRiSkMiWI(X=$Ia}h4h5!d2t-vn&wd2!UCC;P7 zOpnTODsmUMn8Qe|=Ap&XXTUP%277YR!D`xcm95shUp{8TI8~0g0e|acAz?tR&ZUQY zllI+dFXAK>^Xx2)TKW$&OvP!bi)(jbFMxY?Ye3%UF+Adt{6LsXbAUU-w~{*Z^xY{` zN!N94jsNpZEv`DzN%j!lHvym@jjqQ8pxG=9dvl))o8ME)ARZqJkK{tmw~|RT%8GsJ zW-d9^j+~x9gFYDOyKy2%fTe$Ofrob~sFT{qpLX!E^)o>X@h^5M78gK4&qN>=806yT zm~qQ~;l7a|Dr|B;aGZMUNKJNOcBTR)H@-Y^bh;XKv01wCFV8P>qrW3}MVC=;g0xy^ zjtASj!bUr;5*JEQu&YhqIrUvq)BU2jy9BVhsZw55YhHut#wPS!DH`OyjV1qrT`iz- zw;`&p1dC&3-q!6du6F9VNxry2C1Oy%pYvyA<*O}DkK@y2xzpgCuCqjgIF6u$Zz>UI z&Pb)So#UK1Ybn&^?EGH|w$c~2Zyj^(J+-#Yc5$62e28>j>?HKc&#*h<{pdH5cserU zgL|gAiWKo%*p@)I|20J|3nxCy78-XB2cMjJ>w9gChB)#p-dEunD`V9nzK=x}5I9&J zwRjo5G)Td7qtzIkWw4sb*F&J}##+fMT*wmCa#(J3W%e`4{nDUW6x>N0a?* zzMHHhoE=&pPb|ADR4#(OGQLc;*I4ShqQ_?#*=>MQ^oz|qKq(*~ZoRf$QUuoFCm)3Q z@86-$QK{`kA|D1s@s`g5er&7E?87yp?$86Q(?C^4t2y@T_9}lT?!Q5`jtJ8{;Rl=Q z`RW{wC-=5Krh)g5BW5Vo4}i{xq0+-=ExI`46T%~v=X+luxlD>OR`Q+IHpFiQRqJlk zDm{ZAGdA}v`rm;OpAD4|Q?;D?u{0Oin8%BMEeE&vwmA9LNc*8cKkN{LMxwdV&_f0o zc>}F)zc){!jZjJv2o41zUTpz?2oI2>#zk;LQOdftzRQsk%ZkN&wY#A|eF@JfOz zbn(iLmz)hk>>x=LAP9;w<7#S>D2pnKLdI{w#x^Jml~~@Hu39HYnkGlL8B!DTO>NgtYfrl|w=5kY<&$o@{3T+2 zgd~&l*c6(N15@g9Ymn)OVf+(lTPj427WcJ6Xnfe{h9)oh&h}|6gsL(ae?BE!N z6O3P+(cIH#7;uLDBYJ=B>Ts<{C9LDmi+(xz8%HTKD386>y5st53Qk?V%y|!hUJxkz zZC2_*>Zh^ioHp>i)I(B+E^LNtsSrY96j@|>zSF)QK9^^{8Hy8V&fr9i=}{cSp|oon zgL1iF43*(3S21_Kd>?A|PFSsi0seCUgcGl*_D%PvLt7o zU9d+e?Ki88^wo#SwA({+!?4-;L)Nl1xrz!IC|FK@FPc3Ya-yIju`p!MA5qSFJV~rl^VKpaqf*Bho_R!w)P(?pwCr4u&M~pqi z^dm;ym)~~Xj%`bB|F}Cge;m|x>}LD(n2i*7^OWs0=Tvm*q?u}giXj5(HP}0|6>d3y zp^rTMpQHrV&Ct74qFg~ylrCKxxBd$@*fo?5!z2a)+~3ITd-!^&{hwUF)5lDH9s#Ft ztx9k_Gs&hd_m!j%yhaqbXP^C`uAdS)=5n2u_!sLmBZC#^ju?{%P~S|d{F7J3+c%_F zF^aV$B(-+U^-X)TgXLU0sX0>D6NS?M+F9qE}Y&YvXR%|oZo~L!c z;F!AWKrjXIaJW})Bz{cNAbodS*Amxu;`H69d!+rpdWrU)ZG``ME8tw>0-MNKvK#sx zjMsWGvCZvsJ^jYH=_*-S=6QC({H5;pPfcL&oml#6;Qg)uZqV^g&Ux+QvB7fRKjZIE z_Q#eP=u7tn+(-sNeY_4`xkrcm!qD=2(fx^xPTq$aUmuLX6wC+EW%hv75?_ZhR<^y0 z2XNdP;j~ZmAbGYyg5<_f7D)z7U1;SXNpoWuPXGh9IolA$kH&D}9tK?Z$|0Jo#t7*r z27EZ%Fau#zq>>~fVM^sNGk+31-j0#DgzX!CG>bz zql)~^N%0mIjCAZ{syfZd39+Tj0##!gZv63?CroVeha+#J-4d+1m^pN-#^1j_FLhw% zy1O6O|IwUYlv~E_UN!NC(mbQ@sSNCjF=;xeo!J*H$;_8hHEG%WBXiQBOrU^$%2LTa zd-29nsG(}=la+f;>j?{Y67+D&HMu3%5w${$HEP-ufmIUzd&1|3Zt8h$g~a}t zy6aX;0pjzn)XU-bV9eG+Z>CCFqEG699IZvc3YGF07;`#T0>z}gm0T3j+VYwnB^alb z$}bo{5^vp0nd(YZ#VGKR7#>iON0DBTxR742dbEB35(t6xj6tjqJf{}4nITLes1?U5 z?tjh950tpqH0sUJ-b5GAP$L6)pdey0`pE!Y$nhEeM|q7t#|B7k zO*3)iGyn7xNGg)}>`0C9=KNip(N76@1R{D^CGs#b`l$d9=mSN(7!7W~Lebm@$KdcYCg zJ|4`)j}e&sn-ziQl$e0w>o)}iXkB2_VWdd12Ou)W7yvVDhj{0W*>R28pJxH8iRfAV z*{LSjB4k-8zd;I!L{tR|PYaA}-&tQ+Mn5Cq1M+?bIT&Duxr_Hc8x^LN^st{13I_1t zBI@?>mLD99?F=nG;`wIug8}r&h>T4zK=!qOnE>F|qRa%a!$V}tnxM8{)Q__#X(7RL zGy0hT1<1!4Cd>dWd_)ZK_fL4SonK~6y2tFYvNHOa0p|n=qxZnijV+SVA)4fV6*9XSic28qhl7*X*TjhPKO+aJ}u>!bX7r$f$^bjG~ ze}OR2c&)H|HI~WsTS}r6=Q8@)04Kxb_4TuH0(haz zrfHL_NU~8N0$Ie_0(_(lJ;NRNEOey3m-Y37YI5Y2NUd_BsmQCetZl^^1%7f!CQ zJD!%cvnrvFXC;-zk2lieo5C`kD`Y=CY^z)T)j$bENqlskn-e+1PjIL`yV2|X8OFqC zHK`IWxlWxw0T_zolNBpe7ksEz{{V%`7j=#eBr_A6OL$^F`?gza6+ygjpRtx+y{Q7| zcMCBhmFq*{WUN*v`n;P1soa00az)%NhT|TL5Q`@t1!o2m|DFl;iZ$)cREfO}&->+h zINnP43n<=wy}y*}UPDWhdE>a%6Iih3NOf&LkpXST#m((-^F1&0l{)+VR~hP_eD-+^ zBKPET#iT$TQUX80BKBfq0b?UQ#r!&^HtRGiZ~4{uo0<*OSgTP7|eHId+RQs2*qp|f2&AulFg!gmn(za6kLk3$BI+2qe%)>QCV4PBf~`K)GjrkH>jaa{$66 z3vG{SFzJE!>u6P?iMaGVnE~;q^ zzbm8eAaB)OZ00=snQRnNj4l!$0?anpU~H`8`r0(MXqKYFmqLS{R#i>S#$LswmR&r` z7%Rw#qMaEDGh@n0g~BTT@WKm+!Sj<-INSMZjN_Fs4g(HGb9xlAsy6jQQ+;h<^5wL9 zq1Zl+n%jZtZ>xf|2py2E)tGkBDuU@(TjBRG_g3Ms5y$S*br1FJ-BfV)!B%q0qfJ$Y zd-mvjt1#tZ)yL~)yQVyWIET3o#HW+#{(8zI;RWew2k=}uwC=cdZcYEJ=kT_w>v*}C z-DLoswdX?OTvZ|TLM5}v^*arnJhs?i&@+^r|!to?pG#3*}@qU^f8JVB$B>!>Ik!GH~z<| zM-Udwp+_o`xkJ@+WrBp3B&S>YhR0M*2aKdFS8l?=XwYSX^)0h^wP^-)B)<-ezrqdc z*rbM)fQVxuTvBt#Z{aL4Z9gGkH8oW427vmzcBU?bDtZ?45?Qu zTvj8MaS^?b8ch-|RxBsqByHHC^4J>A86XF%j%>U^EpZ#NNYcqW4n?WEQVvzxiDy{| zNtdK|BQ@xZA!LEcjt5!fcGF*LBs{%C5fMsthZKc`AY=SNYQr8T@(9wDy1w$7R$s0B>4&+F)DR<< zaX^&UV58V$iT>xp1=**vp|DF=Mv{jTsM3Wcznr*3OeD7MIB>kGU(ib^VYND(@gqJN z4gixEe^?;%eke!M9GrEq!k~$mW4~AtmbHPb97eMTP?4{w zdsM-P21dDqB477(oI?n5^HM%lWVYT!{FgZmAn_<~4Z7*(bDJ26Ndx+TO<7v+ZTjD~{;&@42lr={9GCYc1kO#&WwXfS`Eyqe;8K$W}Jcm3;Zc=D%Vw!`Rppl%eaKeK7;mO(jIyvrg>|J-$;zvD9=iKc-f&OgLLHE*O zPY0wCNv399VLe}0KwxrY@Lv;5vgm_8I?^Y96QMCNO6`)GXcVAQ=Ir@aCC{h#cY!(| z4m0E)u|+;Fco$cGY{L%PM=O^=*LpF0AB`FJ!GRf%S^%UVTsL4%4h7>`Ms}%&GbFQw zOUO2e)(o)s;(t;NB*$_~E1&vAi2OX~?JU*}zwsQQR#*9i#3V`80Qbv3_-|kZ;b{{f$A0x!jM)t-q1~Z*YgGg$tBqCuf$6Xe1nk(M|888XxS~$o zxEo+N8ULuS^GRLd=0v7 zUw=N2fIeaEUwm2vP*QnWk=H}QM{Pe3vmJ;gOt2XG&=2|IcWi*F;8GmmR&NgeKUu7+ z?Cnesd_!WOpyI@4t-?%R5WfKkrJA^01*Ha5mGV%)PY%+Bx^#xf6Ux=3e^4o=97rF1 zB$W;U3twf;n+n=hwL7aM*14p5VW2d1gk^?=+dp)|z!Kd{rD6DJLYoD*RbQN4l9_A} zsOCNq)`g*zrl79tI!r$_p^)(XH~oXQF_}?fCMB&jW2j~|bnFaOep)>?;L>8hL2s2r zq6hM_;OPIL+G6FR-539W9B)u`wNjk%(KxOdBI#k0{e$ioH7{dKqRH|n6y36^X;>|M z9B`PyAIu`S9NK`?3_ofAX0MF^_iG;5CTEnxzlN#iFM_G9yAzUTLj{x=C={2hY=xoL z3^7F2@nZIILb~-4p?Z?QdtcETTKXXcp@rh*l8{F|}MLL9*qbkxS!A5ny$ZWcw1QsAnvf4CG;xX3G*| zy(@zIN8a+GMT%n-k1N{NsLH-J$Wdn=beBL$4yA05!FGVsY05rw4Dxx^aT6GZk07jk z2gXES7HSK^^o^!gK@n-3xQ)t)7n7LqP{k_lZS;UQ1%&y?t2qiz{ZyDj%)gsju$c1O z82NY=0m~FeLUZXjY;qz=4To}IisQ5xyM7sqi5(LWZRTnpJ_XxB_ z?FRWpqwu)jwy*(yjb-SpOi0RoTmM(0VWt>Pk&aORI_#m2y^tcQg=kI|MHf5Pe*XM6 zakl+w3-=vv<>~> zh^lrGji#2TMS`lfl$<~gRKtfZmewp7E9y~lcNAeRYAH&q`JlZ?%`(j`HAH(aI~uB* z8num8FX0-E&jCr{4Kud<;C(c!7q~#2v>1HN_3FAyfaG!D=+z>s7ktoCjcQXnIJ(?b z7MR(iOcTF^lMf-oGL3fn!xl*HTfW-kESU8E`XWgk`m7foR$}?QV6F&_3I6!&L*RRF zjh`uszf<4;PUHS5RLAU_*nwTCAw~n|sQjs>1tYo$rczNxwg3v}mA*z*{}q%sFCFD{ zK<%d__T>e>Ybrvz=K5QubxMHBgVfSYgeC$hxM^D6;O9@&q9ZPg+ASK@r4dC-?Rs~W zhmy;*!O)%pktZ3fZrAt&4Xybzpxx5F%7xbYu3hnuFLTG&=e(;S{lNu;E~%;kPr=qO zaA)41d)?2aOnMPokdBo8!RNe{kAHd`R|Y+02L68Tiu*j|X@HpfOH*k1d;b0Eg5~Ps zdwDE*Lq0!rF8q+JG+mj(pW?eAM6(}h4?eoMq4I%%k*&CfF@|Ce8BqCop=>rIzkxp) zAz9mX5zhK+SMFa7c+qrCGBkS!c4%_V9LQK`bf-^gNm6728Nt^Y#)m?>H)&-LgMVDb zb^m%A>cfnC%GL`i*PnOS5r5ZT97UJvm_3(J{-o*h_ZzNCArtGHtPAn+L6C(Tfj+?z zXJUqD4|zS`qJEryzJ>N~w55s9Gp|phZ4e4?5-DvG>ur))ZIXIzJ`inuY)1FIfCJi0 z#a00;lOKUf$h2B0_8feCjUf!vFpQv0u+kQj-WIdf7K;~Ri&fJsql}rdZ$`~%XlZEzv_wAXf z8SSplZK!u6dRyF{r`5if*S>f7zRzC1ZTR*lX%h#;;@thdXM84VA+8V$E9{Fq;@%jnoE=J1(Vv)HXw)3ewDQ+4WLAL(>wwcpe=+QP*`3LaE_Uv$5v09+m#u5~&Y4?1bU#yy=0I-OfQSwx%;<)1>AcpSzMc8x*yi=j+aYZgM&M%0JU2)%DQjlF@d~l`6a3NWD z!E<)SB6B2PccE^#iScr!{O^i7;euucaYQ?Ffmv}$*Ko=7;ff92jVj}cBjSo`-<4I_ z?PAdlLF>lD>P9DW#XIB5@}DdJ`4t!R+*N?gP2|Omu)vL@-BpOrO`HdqnAAeH4Ou$f1oRbpYSQ5J zPw(_StCyL`?UIt$8Lh+i^!c5%bCuHVL%Qd$daorbuO=@q8)es{K4;UH+jX8>dut~f zXRocjV}}I$`&+LXpttGUTbCJUTZHo6A3g7Ot2xsl!9D*3eEdOJa(cO&sWhfY4<`+W3fd|DR0VeNO(|J{el94CA~_iMk8 zdh4B(aqr{oo6PDQvhQGTeV(v>pHbkIJL3f}xEnR{a=Y_MeCwN0;gV^5^p5Ni_wD_s zX*AE#yY=u0??&KT6Sze0Pol;UL%baZC*(Ct_@qTA^{V4&NplR5z0@9(uni8uTEdAy;Cy+rdb~&UILQvp1*x{p4|6#cpLEj zyU*;t@8V2A*?PcKgnw^A0JPKk$t2=#W9A`9=6Olkcey@br#&E+^}+S4|J-*w)p$gd zvwyYMUrm?CqY8xItfhS;+FKJ;IeJuK6F3*|%e4&jY6j)X8UQOt=s9~1Y5I6)yxe_o z=&rbX{PlvrZrk$xyz6#Pw8p_~kfpe3es zJ)FxGEaHh%oo8F9QP&NcL>#``o^QlW!u&${-hQr5vRnGOdht}h<^9k6xNK6#kKG?H z!*}1L+v;WdeR<5I@`3JcBnFuy9IG37|MZ7{W0cOFcbgqCZ;DQ1%W&BmPyH`pn(L0; zBI#;P_TS!L&%xIpy9Wk&rR3fs@Ypzfe}=BdeSK7_#p+4)YG*;_n)g2GT4wu}XSJ@DPfOW!MX^Y_j*GG8d7#{}WGu@8IH6ta z6?uM-?3G2*9J85pZXF+WTUCoSVU<@mxW!af`sL9r>5*2@*8I-RRL8udW8aRWY|a#} zt4EfmdbujDMmFI;)%7c~e;DHCwz3IYD#okd)!_iUj~o9~-#fPD`(p8YIf$=uN*h$; zJZrgt<UAyO)b>lUOuo<9<(cH^YNeFq9R%EA z@u^)M{o(z#^eN`N^O2IhSsk%hdO1b_@8KImCVS!>UFBIi>t(KSsGs2O=5!tXH7MyG z@gV)=1V{J(+){Ut7H!eMP?a(Px$VgLAS?C5>|f!OZWlUxL%dEpbh&!WpMu1_Lcju9Rrp3Pv1F-kbvcA$dJ+Ai|)FLETAQQ1q3;qAexE?0{mv?sfT7a}BkiFF z3RDgt@$*8d{y#RVKZslX|Dw^S4f!_j{|Ai@@Zp-lpyCD48>@dx@wxD;Mu+e(*Y&vs-4lK?0(KuQ2k zDx&IHC&WlrO~@WUm}4$Vr}Y(5vMC90j61tzXet31$Xm;WxvP}itAFNQwN|t`RLawR z`cg#r1(6Z11Q5dyNl=6xzKCR z$W{h`38eX=<$E?rS~|Y*1o6dAq#fJ8>W3LptuCLlFm+Zo2DU>a>e zzD<2+Bfi*D@5wJCkMDagzBI(+B`YXLJaW+}Ny%_4iCscVBaBc2cO=5FW_!=bW+8Yh ziBaATz2`wM{;3*CC>Z#C7vVCJt3pU{rkzbHDq1BFE?o$JuKCc6%g_oqF?h;7{~9~7 zAI)zT)SuFKQw~LMW)n0Co^I*;n_~?@Mtb zl4DUY1b4{dsRUza(h)<3P;U$I(v8sgAt+jd0_1Q4N_m1c6y{V}{K_@-LE2M|C4o{1 zF6QP1lmJ3I3J9Z+zaLmfOC8|0DY94q2!iBr12\Jz|{sLTxUS&**8$eDMLkTKWM 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