{ "info": { "author": "Alec Clowes", "author_email": "aclowes@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Libraries :: Application Frameworks" ], "description": "YAWN: Yet Another Workflow Engine\n=================================\n\nYAWN provides a framework for executing a set of shell commands with dependencies\nin a distributed manner and on a repeating schedule. Other tools do similar things and\nare inspirations for this one; particularly Celery_ and Airflow_.\n\nBrowse it live at https://yawn.live, deployed on GKE_.\n\n.. _Celery: http://www.celeryproject.org/\n.. _Airflow: https://airflow.incubator.apache.org/\n.. _GKE: https://github.com/aclowes/yawn-gke\n\n.. image:: https://circleci.com/gh/aclowes/yawn/tree/master.svg?style=svg\n :target: https://circleci.com/gh/aclowes/yawn/tree/master\n.. image:: https://codecov.io/gh/aclowes/yawn/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/aclowes/yawn\n\nPrinciple Differences\n---------------------\n\nYAWN is inspired by, but different from Celery and Airflow because it:\n\n* Runs each task in a separate subprocess, like Airflow but unlike Celery, which avoids polution of\n a shared python interpreter and makes memory usage easier to reason about.\n\n* Uses PostgreSQL as the message broker and database, alleviating the need for a separate broker like\n Redis or RabbitMQ. This avoids the `visibility timeout`_ issue when using Redis as a Celery broker.\n YAWN uses the new ``SELECT ... FOR UPDATE SKIP LOCKED`` statement to efficiently select from the\n queue table.\n\n.. _visibility timeout: http://docs.celeryproject.org/en/latest/getting-started/brokers/redis.html#id1\n\n* Stores the command, environment variables, stdout and stderror for each task execution,\n so its easier to see the logs and history of what happened. Re-running a task does not overwrite\n the previous run.\n\n* Does not support inputs or outputs other than the command line and environment variables, with the\n intention that client applications should handle state instead.\n\nComponents\n----------\n\nWeb Server\n The website provides a user interface to view the workflows and tasks running within them.\n It allows you to run an existing workflow or re-run a failed task. The web server also provides\n a REST API to remotely create and run workflows.\n\nWorker\n The worker schedules and executes tasks. The worker uses ``subprocess.Popen`` to run tasks and\n capture stdout and stderr.\n\nConcepts\n--------\n\nWorkflow\n A set of Tasks that can depend on each other, forming what is popularly known as a directed\n acyclic graph (DAG). Workflows can be scheduled to run on a regular basis and they are versioned\n so they can change over time.\n\nRun\n An instance of a workflow, manually triggered or scheduled.\n\nTask\n A shell command that specifies the upstream tasks it depends on, the number times to retry, and a\n timeout. The task is given environment variables configured in the workflow and run.\n\nExecution\n A single execution of a Task's command, capturing the exit code and standard output and error.\n\nQueue\n A first-in, first-out list of Tasks to execute.\n\nWorker\n A process that reads from a set of Queues and executes the associated Tasks, recording the\n results in an Execution.\n\nInstallation\n------------\n\nTo get started using YAWN::\n\n # install the package - someone has yawn :-(\n pip install yawns\n\n # install postgres and create the yawn database\n # the default settings localhost and no password\n createdb yawn\n\n # setup the tables by running db migrations\n yawn migrate\n\n # create a user to login with\n yawn createsuperuser\n\n # create some sample workflows\n yawn examples\n\n # start the webserver on port 8000\n yawn webserver\n\n # open a new terminal and start the worker\n yawn worker\n\nHere is a screenshot of the page for a single workflow:\n\n.. image:: https://cloud.githubusercontent.com/assets/910316/21969288/fe40baf0-db51-11e6-97f2-7e6875c1e575.png\n\nREST API\n--------\n\nBrowse the API by going to http://127.0.0.1:8000/api/ in a browser.\n\nWhen creating a workflow, the format is (shown as YAML for readability)::\n\n name: Example\n parameters:\n ENVIRONMENT: production\n CALCULATION_DATE: 2017-01-01\n schedule: 0 0 *\n schedule_active: True\n\n tasks:\n - name: task_1\n queue: default\n max_retries: 1\n timeout: 30\n command: python my_awesome_program.py $ENVIRONMENT\n - name: task_2\n queue: default\n command: echo $CALCULATION_DATE | grep 2017\n upstream:\n - task_1\n\n``/api/workflows/``\n GET a list of versions or a single workflow version. POST to create or update a workflow\n using the schema show above. PATCH to change the ``schedule``, ``schedule_active``, or\n ``parameters`` fields only.\n\n * POST - use the schema shown above\n * PATCH ``{\"schedule_active\": false}``\n\n``/api/runs/``\n GET a list of runs, optionally filtering to a particular workflow using ``?workflow=``.\n POST to create a new run. PATCH to change the parameters.\n\n * POST ``{\"workflow_id\": 1, \"parameters\": null}``\n * PATCH ``{\"parameters\": {\"ENVIRONMENT\": \"test\"}}``\n\n``/api/tasks//``\n GET a single task from a workflow run, and its executions with their status and logging\n information. PATCH to enqueue a task or kill a running execution.\n\n * PATCH ``{\"enqueue\": true}``\n * PATCH ``{\"terminate\": }``\n\nPython API\n----------\n\nImport and use the Django models to create your workflow::\n\n from yawn.workflow.models import WorkflowName\n from yawn.task.models import Template\n\n name, _ = WorkflowName.objects.get_or_create(name='Simple Workflow Example')\n workflow = name.new_version(parameters={'MY_OBJECT_ID': '1', 'SOME_SETTING': 'false'})\n task1 = Template.objects.create(workflow=workflow, name='start', command='echo Starting...')\n task2 = Template.objects.create(workflow=workflow, name='task2', command='echo Working on $MY_OBJECT_ID')\n task2.upstream.add(task1)\n task3 = Template.objects.create(workflow=workflow, name='task3',\n command='echo Another busy thing && sleep 20')\n task3.upstream.add(task1)\n task4 = Template.objects.create(workflow=workflow, name='done', command='echo Finished!')\n task4.upstream.add(task2, task3)\n\n workflow.submit_run(parameters={'child': 'true'})\n\nAlternatively, use the serializer to give tasks as a dictionary in the format used\nby the API. This method checks if a version of the Workflow exists with the same structure,\nand will return the existing version if so::\n\n from yawn.workflow.serializers import WorkflowSerializer\n\n serializer = WorkflowSerializer(data=test_views.data())\n serializer.is_valid(raise_exception=True)\n workflow = serializer.save()\n workflow.submit_run()\n\nLinks\n-----\n\n* Contributing_\n* License_\n* `Deploying YAWN on Kubernetes via Google Container Engine`_\n\n.. _Contributing: CONTRIBUTING.rst\n.. _License: LICENSE.txt\n.. _Deploying YAWN on Kubernetes via Google Container Engine: https://github.com/aclowes/yawn-gke\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/aclowes/yawn", "keywords": "task execution subprocess dag workflow", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "yawns", "package_url": "https://pypi.org/project/yawns/", "platform": "", "project_url": "https://pypi.org/project/yawns/", "project_urls": { "Homepage": "https://github.com/aclowes/yawn" }, "release_url": "https://pypi.org/project/yawns/0.2.7/", "requires_dist": null, "requires_python": "", "summary": "Yet Another Workflow Engine, a subprocess-based DAG execution system", "version": "0.2.7" }, "last_serial": 5965892, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "d569c5fde74f6005a2f2255d1e81936c", "sha256": "a299027f36e721508c1929afd13872f0847b240f2aa1cfffce85b1bd634db30a" }, "downloads": -1, "filename": "yawns-0.1.0.tar.gz", "has_sig": false, "md5_digest": "d569c5fde74f6005a2f2255d1e81936c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5808, "upload_time": "2017-02-09T20:31:45", "url": "https://files.pythonhosted.org/packages/c7/a5/45ee0a1c44e78176df1d72587ba942e3bff3d3423759635776dd6d57641d/yawns-0.1.0.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "0857dd2a778f6403e8546e8d3e91d85f", "sha256": "80d81f280f965b9da133f97b4d962dc761ad8f16a92e195f92616c736f0a43c4" }, "downloads": -1, "filename": "yawns-0.1.2.tar.gz", "has_sig": false, "md5_digest": "0857dd2a778f6403e8546e8d3e91d85f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2515932, "upload_time": "2017-06-30T02:07:09", "url": "https://files.pythonhosted.org/packages/ad/1f/bf126b97db51486edd0945bc5df5d244380dac50d740255af133511c7080/yawns-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "111a7213fadff51a1d1ffcf36c010665", "sha256": "06fbb0eed6a1bad127afc4bd30a1ad298493b1fbe76f60f8d5fb25c3f96be286" }, "downloads": -1, "filename": "yawns-0.1.3.tar.gz", "has_sig": false, "md5_digest": "111a7213fadff51a1d1ffcf36c010665", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2525594, "upload_time": "2017-07-11T06:44:55", "url": "https://files.pythonhosted.org/packages/5e/65/5588dc16327348c19a20b515ff0d36617cf068f34ead4faa1515e3dcc600/yawns-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "4caea7896d3145a8e811bbe7c34b63d5", "sha256": "a077398e73fead7e7b24cf332a89be9262e58638b648f921e71cae84e883e104" }, "downloads": -1, "filename": "yawns-0.1.4.tar.gz", "has_sig": false, "md5_digest": "4caea7896d3145a8e811bbe7c34b63d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2529102, "upload_time": "2017-08-26T17:51:44", "url": "https://files.pythonhosted.org/packages/d4/1d/7d4b1617536283a7ba7c038a8b67448b07a159817a27620498d87efce5ef/yawns-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "1a76e5caf91a6d5c4d7df4cbe903d6ce", "sha256": "975e6e73c4fb5f8d6b46b681fba569eda5196e32ae5bc4449f70777d737d7f54" }, "downloads": -1, "filename": "yawns-0.1.5.tar.gz", "has_sig": false, "md5_digest": "1a76e5caf91a6d5c4d7df4cbe903d6ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2529739, "upload_time": "2017-08-29T04:56:13", "url": "https://files.pythonhosted.org/packages/f7/40/fe91341f4fcff51f820f75f2cd15010cff825c012aedc8b67d840b0acfe5/yawns-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "d5c28ecfc77516414a053ca76cd6ee6e", "sha256": "2ebf402ea72acee0b9e2b1a11d1a62b115a65d48c67b3c5ed54c5f4b4235214f" }, "downloads": -1, "filename": "yawns-0.1.6.tar.gz", "has_sig": false, "md5_digest": "d5c28ecfc77516414a053ca76cd6ee6e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2529792, "upload_time": "2017-08-30T04:43:00", "url": "https://files.pythonhosted.org/packages/d9/8f/a2b61a2705a39fb25959cd8b5bc689ee40c4cbb01e190b6e1497120782a5/yawns-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "8cb58f8889012d5f9f884fb024f11c44", "sha256": "28b592ebd4d535dc340280b6d81199dfba155723e31395c4c792a283699de6f0" }, "downloads": -1, "filename": "yawns-0.1.7.tar.gz", "has_sig": false, "md5_digest": "8cb58f8889012d5f9f884fb024f11c44", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2530392, "upload_time": "2017-09-16T16:24:07", "url": "https://files.pythonhosted.org/packages/42/73/2e0a00a3b6cbc847401bb8d65b78ed8d5080cf91bc8ea91596190023083a/yawns-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "61508c38c623246257a58ff83ca1ac11", "sha256": "6708703ea2eb8a23cff8538564a9321ce669a091232f8c0631fa6266b9f302dc" }, "downloads": -1, "filename": "yawns-0.1.8.tar.gz", "has_sig": false, "md5_digest": "61508c38c623246257a58ff83ca1ac11", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2526135, "upload_time": "2018-02-16T03:12:05", "url": "https://files.pythonhosted.org/packages/e4/7a/9af56ccf212253bf5510196baa8413cf083870c0f2f8f8768ff7d79ce0cc/yawns-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "77b8b28d12fb80d57666f9183f2fe635", "sha256": "ea40c72247f4b70ad03638deb841add5258b70da6643d91a14a60d6a3f6d2318" }, "downloads": -1, "filename": "yawns-0.1.9.tar.gz", "has_sig": false, "md5_digest": "77b8b28d12fb80d57666f9183f2fe635", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2526226, "upload_time": "2018-05-07T14:54:06", "url": "https://files.pythonhosted.org/packages/15/50/17e0654f1f0c3921b55c0a1c0f878fbc60919280f97f33f1857f1de23158/yawns-0.1.9.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "8395e98d5732ebf42fe394901e6d2db4", "sha256": "232d680c77f1c80e7312dfefc18d9643cf8273ee64d269994687a73faeca48e7" }, "downloads": -1, "filename": "yawns-0.2.0.tar.gz", "has_sig": false, "md5_digest": "8395e98d5732ebf42fe394901e6d2db4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2526423, "upload_time": "2018-05-27T04:04:34", "url": "https://files.pythonhosted.org/packages/d1/87/6cf5ab2ac0b538039e628b5fdbdd734fedb34bd07634868beff2632b841d/yawns-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "21652a731ad1ac439bac0ce57969b8ea", "sha256": "62422683ade9b7b588c71f7dabdc8ace90efd64468a9df451b1ec4be975ccfbc" }, "downloads": -1, "filename": "yawns-0.2.1.tar.gz", "has_sig": false, "md5_digest": "21652a731ad1ac439bac0ce57969b8ea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2526350, "upload_time": "2018-05-28T23:24:25", "url": "https://files.pythonhosted.org/packages/50/c0/c87e176567991896f97cd9cccd04c6c2ab34cb4cbc47919938583cee23df/yawns-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "76017f9c3aa772745306f8b48b81f2a0", "sha256": "3ba6f9bd8658f492cce0bb6563d8408968c5f3111bd02aa384143d366e7f0bff" }, "downloads": -1, "filename": "yawns-0.2.2.tar.gz", "has_sig": false, "md5_digest": "76017f9c3aa772745306f8b48b81f2a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2527045, "upload_time": "2018-05-29T14:51:14", "url": "https://files.pythonhosted.org/packages/bb/9e/03311d7b78d6d9208919729e2f33e25005c7cc8c4cb07189db22d7385a6d/yawns-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "23845a581a3e2941e6946a9e82017c5d", "sha256": "51b66497c3be42653d7d7aa84863c0ea74bf774ffa5553f8e971b04db8904588" }, "downloads": -1, "filename": "yawns-0.2.3.tar.gz", "has_sig": false, "md5_digest": "23845a581a3e2941e6946a9e82017c5d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2631168, "upload_time": "2018-06-03T15:02:38", "url": "https://files.pythonhosted.org/packages/d1/f7/2258db0fbad2e16d769c28c5a95897fdcb0030bf6a6dd42b3a9093dc2c39/yawns-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "72696f2113deaa8775f1e882e9f38c18", "sha256": "aa80b6f1f6b8f7380fe28b4c5ca769ffd37fb241588eb2604f6699c6f76bd93f" }, "downloads": -1, "filename": "yawns-0.2.4.tar.gz", "has_sig": false, "md5_digest": "72696f2113deaa8775f1e882e9f38c18", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2738226, "upload_time": "2018-07-28T21:48:36", "url": "https://files.pythonhosted.org/packages/45/c3/ffb59ae75c6af9b5f40379271ea3fea89295202e3ed4f011f70f24eb7126/yawns-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "3a36c5df3e0435ed0f08ae7de540bc61", "sha256": "edcdd6fc8e259ce290d1c227f3b94b16418c573116d3d5e58c9a6f695bb12c9d" }, "downloads": -1, "filename": "yawns-0.2.5.tar.gz", "has_sig": false, "md5_digest": "3a36c5df3e0435ed0f08ae7de540bc61", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2739345, "upload_time": "2018-07-29T18:48:38", "url": "https://files.pythonhosted.org/packages/d2/18/11c572215e1315281a61a6d61f176ba35617ae24677677f6c662c843c2ac/yawns-0.2.5.tar.gz" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "06571cd9f88adb6f33a29f763c1ff754", "sha256": "a5309ddc1cdc8c494cbcbec38209b2b8e9792c8719f9c01a8e8c4480cb3805bf" }, "downloads": -1, "filename": "yawns-0.2.6.tar.gz", "has_sig": false, "md5_digest": "06571cd9f88adb6f33a29f763c1ff754", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2739320, "upload_time": "2018-11-04T14:54:53", "url": "https://files.pythonhosted.org/packages/71/b8/a98e9d0e921231ad75ea6904bd717569880457155c18abb8ae49dfb01322/yawns-0.2.6.tar.gz" } ], "0.2.7": [ { "comment_text": "", "digests": { "md5": "40d92be6df1eddd10e0e1fc6ddb5864e", "sha256": "242e945b365d496937b11b0beb684b30b48d2adbffdd3b55afa78ebaa961a9ca" }, "downloads": -1, "filename": "yawns-0.2.7.tar.gz", "has_sig": false, "md5_digest": "40d92be6df1eddd10e0e1fc6ddb5864e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2738866, "upload_time": "2019-10-13T00:14:44", "url": "https://files.pythonhosted.org/packages/7f/f4/82303f2503002a48fe3fb8f7abe87cd8a1b26f649b92c10957bbf31f18e6/yawns-0.2.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "40d92be6df1eddd10e0e1fc6ddb5864e", "sha256": "242e945b365d496937b11b0beb684b30b48d2adbffdd3b55afa78ebaa961a9ca" }, "downloads": -1, "filename": "yawns-0.2.7.tar.gz", "has_sig": false, "md5_digest": "40d92be6df1eddd10e0e1fc6ddb5864e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2738866, "upload_time": "2019-10-13T00:14:44", "url": "https://files.pythonhosted.org/packages/7f/f4/82303f2503002a48fe3fb8f7abe87cd8a1b26f649b92c10957bbf31f18e6/yawns-0.2.7.tar.gz" } ] }