{ "info": { "author": "Justin Hammond", "author_email": "justin.hammond@rackspace.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Paste", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware" ], "description": "==========\nWafflehaus\n==========\n\nWafflehaus is a collection of WSGI middleware for OpenStack that adds\nfunctionality with zero impact to code. \n\nEach middleware is lovingly called a waffle.\n\nCloud providers of all sizes have problems dealing with business-requirements\nof their cloud and diverging from upstream. By putting business logic into\nmiddleware providers can create special cases without changing upstream code.\n\nNot diverging from upstream is wonderful because:\n\n* You do not need to handle merge conflicts\n* The review process for wafflehaus is shorter especially if you fork it\n* Although your requirement may not benefit OpenStack as a whole, it still fits\n in Wafflehaus\n\nBeyond the above benefits, other benefits of using wafflehaus are:\n\n* You gain access to plenty of predefined waffles that can usually be\n configured to support your special case\n* All of the waffles in wafflehaus are designed to be configured in the\n api-paste.ini file and thus can be distributed however you wish (puppet,\n chef, ansible)\n* It is a fairly democratic and simple way to test new openstack features and\n designs as if many people use a particular waffle it should be added to the\n relevant projects' feature set\n\nFinally, although Wafflehaus was intended to work with OpenStack, it is\npossible to use it in front of any WSGI compliant service.\n\nGetting Help\n------------\n\nThe official channel for wafflehaus support in on freenode in #wafflehaus. \n\nUsing Wafflehaus\n----------------\n\nUsing wafflehaus is simple! A stable version is available on pypi but you can\nalways install wafflehaus using pip+git. Modify your api-paste.ini to include\nyour waffle of choice and add the waffle where you wish in the composite\nthat defines your app.\n\nExample using dns_filter::\n\n [composite:neutronapi_v2_0]\n use = call:neutron.auth:pipeline_factory\n noauth = dns_filter request_id catch_errors extensions neutronapiapp_v2_0\n keystone = dns_filter request_id catch_errors authtoken keystonecontext\n extensions neutronapiapp_v2_0\n\n # This is the waffle\n [filter:dns_filter]\n paste.filter_factory = wafflehaus.dns_filter.whitelist:filter_factory\n whitelist = mydomain.com\n # Uncomment the line below to activate the waffle\n # enabled = true\n\nThen restart the service (or SIGHUP if it applies). If you have an error in\nyour configuration you'll see it in your logs very early, fix that and you'll\nbe rolling.\n\nNote: All waffles are disabled until explicitly set to enabled with the\nenabled = true configuration flag. This allows you to deploy a waffle without\nconcerns (beyond configuration being correct or not).\n\nUsing Runtime Reconfiguring\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIt is difficult to test wafflehaus in CI environments because of how\nPasteDeploy works. The server will need to be restarted for new configurations\n(api-paste) to be loaded. Runtime reconfiguring allows you to change the\nconfigurations using headers. Each waffle that wants to support this will need\nto override the WafflehausBase:_override method, and will need to call the\nbase's __call__.\n\nFinally to enable this the global configuration (nova.conf, neutron.conf) needs\nto have the following::\n\n [WAFFLEHAUS]\n runtime_reconfigurable = True\n\nAll waffles that, at a minimum, call the base's __call__ will support runtime\nenable/disable and toggling of testing with the following headers:\n\n* X_WAFFLEHAUS_CLASSNAME_ENABLED\n* X_WAFFLEHAUS_CLASSNAME_TESTING\n\nwhere *CLASSNAME* is the upper() of the class name of the waffle.\n\nCurrent Deployment Quirks\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nRight now all the subprojects do not include wafflehaus in their requirements\nfile. This is because of weird quirks we have been happening while deploying\nwafflehaus' subprojects. We are working to get those fixed but please do note:\nthe subprojects do require wafflehaus to be installed.\n\nContributing\n------------\n\n* Typical github-etiquette expected\n* Conform to the guidelines below\n\nDevelopment Guidelines\n~~~~~~~~~~~~~~~~~~~~~~\n\n1. Provide a solution in its most shareable form\n2. Add reusuable functionality to wafflehaus as a whole (see resource_filter)\n3. Do not configure in code; configure from external files\n4. Do not depend on specific OpenStack projects\n5. If you must depend on a specific OpenStack project, look for the\n corresponding wafflehaus **subproject**\n6. Each package should have a README.rst\n7. Provide an example use-case of your middleware in the documentation\n8. Do not raise exceptions, return them\n9. Do not assume any other waffle exists if you can; document if you can't\n10. Readable code is preferred over clever code\n\nReturning Exceptions\n~~~~~~~~~~~~~~~~~~~~\nThe reason why exceptions are returned instead of raised is due to interactions\nwith eventlet. When an exception is raised it causes eventlet to halt so it can\nprocess the exception.\n\nThis has certain interactions with faultwrapper because it only catches\nraised exceptions. If you rely on faultwrapper then you may raise the exception\nor, if you are using a subproject that has access to it, you may do the\nfollowing:\n\n from nova.api.openstack import wsgi\n\n return wsgi.Fault(your_exception)\n\nIn this situation the waffle would be in the wafflehaus.nova subproject (as it\nmakes use of nova libraries).\n\nSubprojects\n-----------\n\nIn some situations it is impossible to completely ignore a dependency on a \nproject. In those situations there are subprojects for those dependencies:\n\n* `wafflehaus.glance `_\n* `wafflehaus.neutron `_\n* `wafflehaus.nova `_\n\nIf a subproject is not listed here it may still exist. Also new ones can be\nmade at any time.", "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/roaet/wafflehaus", "keywords": "openstack", "license": "Apache Software License", "maintainer": null, "maintainer_email": null, "name": "wafflehaus", "package_url": "https://pypi.org/project/wafflehaus/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/wafflehaus/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/roaet/wafflehaus" }, "release_url": "https://pypi.org/project/wafflehaus/0.3.6/", "requires_dist": null, "requires_python": null, "summary": "A collection of middleware for openstack", "version": "0.3.6" }, "last_serial": 2181600, "releases": { "0.1dev": [], "0.2dev": [ { "comment_text": "", "digests": { "md5": "d0d02704ee336726cfbcabcd21aa71e0", "sha256": "6503d2308165750fea0a96fe8f82ab5c38a7eb20b1ae5a6090c3d78976416867" }, "downloads": -1, "filename": "wafflehaus-0.2dev.tar.gz", "has_sig": false, "md5_digest": "d0d02704ee336726cfbcabcd21aa71e0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12156, "upload_time": "2014-01-21T15:36:01", "url": "https://files.pythonhosted.org/packages/b9/f1/e78c3e99f77ce4c603f59de078bfdbe2a12401ce03f80b7233177f359cb4/wafflehaus-0.2dev.tar.gz" } ], "0.3.0dev": [ { "comment_text": "", "digests": { "md5": "f484eeec4835ef990f5069f8832ea3fe", "sha256": "7618ccbdd9e908d2aafdca03988107dfbc734db377471d874e13503139c67d87" }, "downloads": -1, "filename": "wafflehaus-0.3.0dev.tar.gz", "has_sig": false, "md5_digest": "f484eeec4835ef990f5069f8832ea3fe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10030, "upload_time": "2014-05-26T17:10:14", "url": "https://files.pythonhosted.org/packages/c5/a2/d06ac05c40acf36af8a6ab8a399b141fe9fdbe0d4ecd998b38f66a199dc5/wafflehaus-0.3.0dev.tar.gz" } ], "0.3.1dev": [ { "comment_text": "", "digests": { "md5": "bb26dfd77c13eaa48730da4be0d5e2f3", "sha256": "d1cf83cb1d3c8336d77c80972dc92ff79ae513e78e152dac895b6545d7c2cd31" }, "downloads": -1, "filename": "wafflehaus-0.3.1dev.tar.gz", "has_sig": false, "md5_digest": "bb26dfd77c13eaa48730da4be0d5e2f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15454, "upload_time": "2014-07-07T19:09:14", "url": "https://files.pythonhosted.org/packages/29/e0/f47921479a30ba5eaac9721c706bd152addec0643bfbdad0e2bb0f314131/wafflehaus-0.3.1dev.tar.gz" } ], "0.3.2dev": [ { "comment_text": "", "digests": { "md5": "a4aa7407813aa5e50b4e775d1a00ce18", "sha256": "f3b8faa4b108b47094fc16bd4cbe9c56536d9598411b93a77dd215cf74238b3f" }, "downloads": -1, "filename": "wafflehaus-0.3.2dev.tar.gz", "has_sig": false, "md5_digest": "a4aa7407813aa5e50b4e775d1a00ce18", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15745, "upload_time": "2014-07-09T17:03:31", "url": "https://files.pythonhosted.org/packages/65/1c/7859065cd617b01ef0f478fe4d9d96ff09bfc1100420274cc0c9305eed9e/wafflehaus-0.3.2dev.tar.gz" } ], "0.3.3dev": [ { "comment_text": "", "digests": { "md5": "b76180294ea63698b950e30f7cdb9834", "sha256": "aba518bcbf06437b4041b5e93003535da304d5a720b2bf50cf8cfbcc625333d8" }, "downloads": -1, "filename": "wafflehaus-0.3.3dev.tar.gz", "has_sig": false, "md5_digest": "b76180294ea63698b950e30f7cdb9834", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15755, "upload_time": "2014-07-24T16:43:41", "url": "https://files.pythonhosted.org/packages/56/4d/3d8a8833ecfe2eaf120fccc7f6f14d3c76490557ab228725b239e3b5d0db/wafflehaus-0.3.3dev.tar.gz" } ], "0.3.4dev": [ { "comment_text": "", "digests": { "md5": "ae06452c75d74a78966f8a42c7e51bd3", "sha256": "badba3bd4eea1fcb616fc6f3358a037a4de130201e7426e8a00f87eaec0f7057" }, "downloads": -1, "filename": "wafflehaus-0.3.4dev.tar.gz", "has_sig": false, "md5_digest": "ae06452c75d74a78966f8a42c7e51bd3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15765, "upload_time": "2014-07-24T17:10:09", "url": "https://files.pythonhosted.org/packages/36/c1/c33ca410050f5c68ffa23e69a1c5675f465c13abb24bf143e92246b6ddd5/wafflehaus-0.3.4dev.tar.gz" } ], "0.3.5dev": [ { "comment_text": "", "digests": { "md5": "de001189080410e975c1d64b010d609c", "sha256": "a39dd78e407d4cf163f2f84845b53c8fe9c95ad0c2379cdd7809474b15f54f93" }, "downloads": -1, "filename": "wafflehaus-0.3.5dev.tar.gz", "has_sig": false, "md5_digest": "de001189080410e975c1d64b010d609c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17500, "upload_time": "2014-07-24T19:06:58", "url": "https://files.pythonhosted.org/packages/73/18/e99acced9cd56278cbfd9d999291ae3855a3a05e9612dbf7de4d23ccf555/wafflehaus-0.3.5dev.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "3357e32c235ea5fa3928647b12490fbe", "sha256": "0ecd23b24d74f00d8c55979cb5909448e99863f2f42862eb447ddbf96da15a7c" }, "downloads": -1, "filename": "wafflehaus-0.3.6.tar.gz", "has_sig": false, "md5_digest": "3357e32c235ea5fa3928647b12490fbe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21541, "upload_time": "2016-06-22T16:33:13", "url": "https://files.pythonhosted.org/packages/3a/d3/504b4bdcf768e8fe467098df20c128d157030039572de873d6dc76ba35d2/wafflehaus-0.3.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3357e32c235ea5fa3928647b12490fbe", "sha256": "0ecd23b24d74f00d8c55979cb5909448e99863f2f42862eb447ddbf96da15a7c" }, "downloads": -1, "filename": "wafflehaus-0.3.6.tar.gz", "has_sig": false, "md5_digest": "3357e32c235ea5fa3928647b12490fbe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21541, "upload_time": "2016-06-22T16:33:13", "url": "https://files.pythonhosted.org/packages/3a/d3/504b4bdcf768e8fe467098df20c128d157030039572de873d6dc76ba35d2/wafflehaus-0.3.6.tar.gz" } ] }