forked from wongwill86/air-tasks
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Create MultiTriggerDag Operator (#6)
* Added patch module helper to allow patching of loaded modules (i.e. via import.load_source) * Adding multi trigger dag example. * Reorganized example dags. * Use pylama for testing.
- Loading branch information
1 parent
c7e9af6
commit 160f014
Showing
18 changed files
with
398 additions
and
62 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
IMAGE_NAME=wongwill86/air-tasks:latest |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
from airflow import DAG | ||
from datetime import datetime, timedelta | ||
from airflow.operators.custom_plugin import MultiTriggerDagRunOperator | ||
from airflow.operators.bash_operator import BashOperator | ||
|
||
SCHEDULE_DAG_ID = 'example_multi_trigger_scheduler' | ||
TARGET_DAG_ID = 'example_multi_trigger_target' | ||
|
||
default_args = { | ||
'owner': 'airflow', | ||
'depends_on_past': False, | ||
'start_date': datetime(2017, 5, 1), | ||
'cactchup_by_default': False, | ||
'retries': 1, | ||
'retry_delay': timedelta(seconds=2), | ||
'retry_exponential_backoff': True, | ||
} | ||
|
||
# ####################### SCHEDULER ################################# | ||
scheduler_dag = DAG( | ||
dag_id=SCHEDULE_DAG_ID, | ||
default_args=default_args, | ||
schedule_interval=None | ||
) | ||
|
||
|
||
def param_generator(): | ||
iterable = xrange(0, 100) | ||
for i in iterable: | ||
yield i | ||
|
||
|
||
operator = MultiTriggerDagRunOperator( | ||
task_id='trigger_%s' % TARGET_DAG_ID, | ||
trigger_dag_id=TARGET_DAG_ID, | ||
params_list=param_generator(), | ||
default_args=default_args, | ||
dag=scheduler_dag) | ||
|
||
# ####################### TARGET DAG ################################# | ||
|
||
target_dag = DAG( | ||
dag_id=TARGET_DAG_ID, | ||
default_args=default_args, | ||
schedule_interval=None | ||
) | ||
|
||
start = BashOperator( | ||
task_id='bash_task', | ||
bash_command='sleep 1; echo "Hello from message #' + | ||
'{{ dag_run.conf if dag_run else "NO MESSAGE" }}"', | ||
default_args=default_args, | ||
dag=target_dag | ||
) |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,4 +18,4 @@ services: | |
- AWS_SECRET_ACCESS_KEY | ||
- AWS_DEFAULT_REGION | ||
command: | ||
- pytest && flake8 . | ||
- pytest --pylama |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
from airflow.plugins_manager import AirflowPlugin | ||
from datetime import datetime | ||
import logging | ||
import types | ||
import collections | ||
|
||
from airflow.models import BaseOperator | ||
from airflow.models import DagBag | ||
from airflow.utils.decorators import apply_defaults | ||
from airflow.utils.state import State | ||
from airflow import settings | ||
|
||
|
||
class MultiTriggerDagRunOperator(BaseOperator): | ||
""" | ||
Triggers multiple DAG runs for a specified ``dag_id``. | ||
Draws inspiration from: | ||
airflow.operators.dagrun_operator.TriggerDagRunOperator | ||
:param trigger_dag_id: the dag_id to trigger | ||
:type trigger_dag_id: str | ||
:param params_list: list of dicts for DAG level parameters that are made | ||
acesssible in templates | ||
namespaced under params for each dag run. | ||
:type params: Iterable<dict> or types.GeneratorType | ||
""" | ||
|
||
@apply_defaults | ||
def __init__( | ||
self, | ||
trigger_dag_id, | ||
params_list, | ||
*args, **kwargs): | ||
super(MultiTriggerDagRunOperator, self).__init__(*args, **kwargs) | ||
self.trigger_dag_id = trigger_dag_id | ||
self.params_list = params_list | ||
if hasattr(self.params_list, '__len__'): | ||
assert len(self.params_list) > 0 | ||
else: | ||
assert (isinstance(params_list, collections.Iterable) or | ||
isinstance(params_list, types.GeneratorType)) | ||
|
||
def execute(self, context): | ||
session = settings.Session() | ||
dbag = DagBag(settings.DAGS_FOLDER) | ||
trigger_dag = dbag.get_dag(self.trigger_dag_id) | ||
|
||
assert trigger_dag is not None | ||
|
||
trigger_id = 0 | ||
# for trigger_id in range(0, len(self.params_list)): | ||
for params in self.params_list: | ||
dr = trigger_dag.create_dagrun(run_id='trig_%s_%d_%s' % | ||
(self.trigger_dag_id, trigger_id, | ||
datetime.now().isoformat()), | ||
state=State.RUNNING, | ||
conf=params, | ||
external_trigger=True) | ||
logging.info("Creating DagRun {}".format(dr)) | ||
session.add(dr) | ||
trigger_id = trigger_id + 1 | ||
if trigger_id % 10: | ||
session.commit() | ||
session.commit() | ||
session.close() | ||
|
||
|
||
class CustomPlugin(AirflowPlugin): | ||
name = "custom_plugin" | ||
operators = [MultiTriggerDagRunOperator] | ||
hooks = [] | ||
executors = [] | ||
macros = [] | ||
admin_views = [] | ||
flask_blueprints = [] | ||
menu_links = [] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1 @@ | ||
apache-airflow==1.8.1 | ||
docker-py | ||
docker |
Empty file.
Empty file.
Empty file.
Empty file.
Oops, something went wrong.