{ "info": { "author": "Monsyne Dragon", "author_email": "mdragon@rackspace.com", "bugtrack_url": null, "classifiers": [], "description": "winchester\n==========\n\nAn OpenStack notification event processing library based on persistant streams.\n\nWinchester is designed to process event streams, such as those produced from\nOpenStack notifications. Events are represented as simple python dictionaries.\nThey should be flat dictionaries (not nested), with a minimum of three keys:\n\n \"message_id\": A unique identifier for this event, such as a uuid.\n \"event_type\": A string identifying the event's type. Usually a hierarchical dotted name like \"foo.bar.baz\"\n \"timestamp\": Time the event occurred (a python datetime, in UTC)\n\nThe individual keys of the event dictionary are called *traits* and can be\nstrings, integers, floats or datetimes. For processing of the (often large)\nnotifications that come out of OpenStack, winchester uses the\n[StackDistiller library](https://github.com/StackTach/stackdistiller) to\nextract flattened events from the notifications, that only contain the data\nyou actually need for processing.\n\nWinchester's processing is done through *triggers* and *pipelines*.\n\nA *trigger* is composed of a *match_criteria* which is like a\npersistant query, collecting events you want to process into a\npersistant *stream* (stored in a sql database), a set of distinguishing\ntraits, which can separate your list of events into distinct streams,\nsimilar to a **GROUP BY** clause in an SQL query, and a *fire_criteria*,\nwhich specifies the conditions a given *stream* has to match for the\ntrigger to fire. When it does, the events in the *stream* are sent to\na *pipeline* listed as the *fire_pipeline* for processing as a batch.\nAlso listed is an *expire_timestamp*. If a given stream does not meet\nthe *fire_criteria* by that time, it is expired, and can be sent to\nan *expire_pipeline* for alternate processing. Both *fire_pipeline*\nand *expire_pipeline* are optional, but at least one of them must\nbe specified.\n\nA *pipeline* is simply a list of simple *handlers*. Each *handler*\nin the pipeline receives the list of events in a given stream,\nsorted by timestamp, in turn. *Handlers* can filter events from the list,\nor add new events to it. These changes will be seen by *handlers* further\ndown the pipeline. *Handlers* should avoid operations with side-effects,\nother than modifying the list of events, as pipeline processing can be\nre-tried later if there is an error. Instead, if all handlers process the\nlist of events without raising an exception, a *commit* call is made on\neach handler, giving it the chance to perform actions, like sending data\nto external systems. *Handlers* are simple to write, as pretty much any\nobject that implements the appropriate *handle_events*, *commit* and\n*rollback* methods can be a *handler*.\n\n## Installing and running.\n\nWinchster is installable as a simple python package.\nOnce installed, and the appropriate database url is specified in the\n*winchester.yaml* config file (example included in the *etc* directory),\nyou can create the appropriate database schema with:\n\n winchester_db -c /winchester.yaml upgrade head\n\nIf you need to run the SQL by hand, or just want to look at the schema, the\nfollowing will print out the appropriate table creation SQL:\n\n winchester_db -c /winchester.yaml upgrade --sql head\n\nOnce you have done that, and configured the appropriate *triggers.yaml*,\n*pipelines.yaml*, and, if using StackDistiller, *event_definitions.yaml* configs\n(again, examples are in *etc* in the winchester codebase), you can add events\ninto the system by calling the *add_event* method of Winchester's TriggerManager.\nIf you are processing OpenStack notifications, you can call *add_notification*,\nwhich will pare down the notification into an event with StackDistiller, and\nthen call *add_event* with that. If you are reading OpenStack notifications off\nof a RabbitMQ queue, there is a plugin for the\n[Yagi](https://github.com/rackerlabs/yagi) notification processor included with\nWinchester. Simply add \"winchester.yagi\\_handler.WinchesterHandler\" to the \"apps\"\nline in your *yagi.conf* section for the queues you want to listen to, and add a:\n\n [winchester]\n config_file = /winchester.yaml\n\nsection to the *yagi.conf*.\n\nTo run the actual pipeline processing, which is run as a separate daemon, run:\n\n pipeline_worker -c /winchester.yaml\n\nYou can pass the *-d* flag to the *pipeline_worker* to tell it to run as a background\ndaemon.\n\nWinchester uses an optimistic locking scheme in the database to coordinate firing,\nexpiring, and processing of streams, so you can run as many processes (like\nYagi's *yagi-event* daemon) feeding TriggerManagers as you need to handle the\nincoming events, and as many *pipeline_worker*s as you need to handle the resulting\nprocessing load, scaling the system horizontally.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/stackforge/stacktach-winchester", "keywords": "stacktach\nevent_processing\npipeline\nevents\nnotification\nopenstack\ntriggers", "license": "Apache-2", "maintainer": null, "maintainer_email": null, "name": "winchester", "package_url": "https://pypi.org/project/winchester/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/winchester/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/stackforge/stacktach-winchester" }, "release_url": "https://pypi.org/project/winchester/0.56/", "requires_dist": null, "requires_python": null, "summary": "An OpenStack notification event processing library.", "version": "0.56" }, "last_serial": 1574059, "releases": { "0.3.dev20": [ { "comment_text": "", "digests": { "md5": "33de683de18693232f8c7e99759f763a", "sha256": "f11c4cb4d3c34c03f7e03b74164b42183a5281aecdc014f65cbc77e0a5eb64f3" }, "downloads": -1, "filename": "winchester-0.3.dev20.tar.gz", "has_sig": false, "md5_digest": "33de683de18693232f8c7e99759f763a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47096, "upload_time": "2015-01-29T14:07:59", "url": "https://files.pythonhosted.org/packages/b8/62/bf5abe1856a99999ad59d31bd77d54fd2b3da9a5e8fd8c09e4a747876850/winchester-0.3.dev20.tar.gz" } ], "0.3.dev23": [ { "comment_text": "", "digests": { "md5": "264ef2f147d65f6459319f148a3338f4", "sha256": "323670d3f3a63c85ab8ef88526efe7031f9960aa19256a4d387335009c64f8d1" }, "downloads": -1, "filename": "winchester-0.3.dev23.tar.gz", "has_sig": false, "md5_digest": "264ef2f147d65f6459319f148a3338f4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50215, "upload_time": "2015-02-17T18:51:40", "url": "https://files.pythonhosted.org/packages/35/43/c23607f1374dded9c8616b52c35ff74904dcf88d2b0b7f752394bba1db7c/winchester-0.3.dev23.tar.gz" } ], "0.31.dev24": [ { "comment_text": "", "digests": { "md5": "3c1321000ae6bd4625e8d8547f1a1bff", "sha256": "b92cd04e4df94dbacaadaf571df1d838b3e035aa60490c2bb95e0f224242adf2" }, "downloads": -1, "filename": "winchester-0.31.dev24.tar.gz", "has_sig": false, "md5_digest": "3c1321000ae6bd4625e8d8547f1a1bff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50523, "upload_time": "2015-02-25T19:01:33", "url": "https://files.pythonhosted.org/packages/de/b9/0b616629d5ec70ebcaacc54757a1c15ed63316bdaeae9606ef9b2b2df710/winchester-0.31.dev24.tar.gz" } ], "0.5.dev28": [ { "comment_text": "", "digests": { "md5": "1d0108ddee8580ce66e5ee6832f3c3fa", "sha256": "b28e0c37f0b3c688e9a2e0cfe97194a0bc7aa3b706cea7fd73a626cc2314a9a0" }, "downloads": -1, "filename": "winchester-0.5.dev28.tar.gz", "has_sig": false, "md5_digest": "1d0108ddee8580ce66e5ee6832f3c3fa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51167, "upload_time": "2015-03-20T17:42:19", "url": "https://files.pythonhosted.org/packages/36/3a/af3332a696688c2fbb0b1e243a58745ff847aab5149eb993c47fd386fba2/winchester-0.5.dev28.tar.gz" } ], "0.51.dev29": [ { "comment_text": "", "digests": { "md5": "a1ac3c3d4427deee4cd66f85780688da", "sha256": "05079ec7ffd9aa96020b4d87babb1a2f3e616fa9a0b11fa8759e3da91b82f957" }, "downloads": -1, "filename": "winchester-0.51.dev29.tar.gz", "has_sig": false, "md5_digest": "a1ac3c3d4427deee4cd66f85780688da", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50758, "upload_time": "2015-03-25T19:47:35", "url": "https://files.pythonhosted.org/packages/f4/db/b70eff2ee7f30487fbf4791fd1a76fff61d831a16745a2dc0325bd26925c/winchester-0.51.dev29.tar.gz" } ], "0.52.dev30": [ { "comment_text": "", "digests": { "md5": "9058b591a93d755e5bdefdfc336dce32", "sha256": "897a4693c456e7ade2b5be0b8ee178568a942ac54f1d3395cc7059eb564e5d0a" }, "downloads": -1, "filename": "winchester-0.52.dev30.tar.gz", "has_sig": false, "md5_digest": "9058b591a93d755e5bdefdfc336dce32", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51030, "upload_time": "2015-04-03T18:49:42", "url": "https://files.pythonhosted.org/packages/52/ec/ba757fb50c6a2c66d78f195d2ed2aeeb7b4b054f0aa3727448c2268578f7/winchester-0.52.dev30.tar.gz" } ], "0.53.dev31": [ { "comment_text": "", "digests": { "md5": "20e028a625ccc558284331304aa0aa9f", "sha256": "f0e508c582e12dc076cf1e56b7cc2598f355d32f3ae3493a5ef99aab0dfbb293" }, "downloads": -1, "filename": "winchester-0.53.dev31.tar.gz", "has_sig": false, "md5_digest": "20e028a625ccc558284331304aa0aa9f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51037, "upload_time": "2015-04-03T19:58:21", "url": "https://files.pythonhosted.org/packages/49/b2/bcc9af1b5671e0561a5bc5d05fc664afd80d546bc8f822fde5bf1484666a/winchester-0.53.dev31.tar.gz" } ], "0.54.dev32": [ { "comment_text": "", "digests": { "md5": "58cf853383ad33ade3ab65311e07b47a", "sha256": "1d58078f49c87ac3ffd971bf8c6b25e5e1943bf6de6ebb580bd8454ffab3367c" }, "downloads": -1, "filename": "winchester-0.54.dev32.tar.gz", "has_sig": false, "md5_digest": "58cf853383ad33ade3ab65311e07b47a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51032, "upload_time": "2015-04-03T20:54:22", "url": "https://files.pythonhosted.org/packages/07/de/42b197492c1966c502496a4bd1b11ffa64069e1b94cc2d0ddfc1021d7a75/winchester-0.54.dev32.tar.gz" } ], "0.54.dev33": [ { "comment_text": "", "digests": { "md5": "c7437f1719b4c49f0b4cc2416cf3e75a", "sha256": "5bf688e8ae0a4b580610ae53b251c5ac0e62a6f89e27d7b7186045086dc59b69" }, "downloads": -1, "filename": "winchester-0.54.dev33.tar.gz", "has_sig": false, "md5_digest": "c7437f1719b4c49f0b4cc2416cf3e75a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51056, "upload_time": "2015-04-08T20:39:46", "url": "https://files.pythonhosted.org/packages/0e/66/e648904e28720fdb070d6e5d4472e33e23ed838b01e6d516facb56e0037f/winchester-0.54.dev33.tar.gz" } ], "0.55.dev34": [ { "comment_text": "", "digests": { "md5": "cd96414fba3c43eae50b858477de3bac", "sha256": "d3f20736f0f9eb3e221d82211ef9d1d7f4dabc5e7e3d454ea2b3e07e316efc4e" }, "downloads": -1, "filename": "winchester-0.55.dev34.tar.gz", "has_sig": false, "md5_digest": "cd96414fba3c43eae50b858477de3bac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51089, "upload_time": "2015-04-17T16:34:19", "url": "https://files.pythonhosted.org/packages/1d/d8/021f0a682e473eb0be7bfb0ea4edf67d4a12f882b753bb25399101f66121/winchester-0.55.dev34.tar.gz" } ], "0.56": [ { "comment_text": "", "digests": { "md5": "dd821052146dfab7396721f2d9221c0c", "sha256": "e1034010df88eb76c02f23f96e906a6d6784c436612623aba48035cd263aaf71" }, "downloads": -1, "filename": "winchester-0.56.tar.gz", "has_sig": false, "md5_digest": "dd821052146dfab7396721f2d9221c0c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48009, "upload_time": "2015-06-01T22:59:48", "url": "https://files.pythonhosted.org/packages/40/02/114aa17b506ee6fe7225dcecd681552cbb9cfb44ad71bd9e3f35309d48fd/winchester-0.56.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "dd821052146dfab7396721f2d9221c0c", "sha256": "e1034010df88eb76c02f23f96e906a6d6784c436612623aba48035cd263aaf71" }, "downloads": -1, "filename": "winchester-0.56.tar.gz", "has_sig": false, "md5_digest": "dd821052146dfab7396721f2d9221c0c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48009, "upload_time": "2015-06-01T22:59:48", "url": "https://files.pythonhosted.org/packages/40/02/114aa17b506ee6fe7225dcecd681552cbb9cfb44ad71bd9e3f35309d48fd/winchester-0.56.tar.gz" } ] }