Package: oops_dictconfig
python-oops-dictconfig======================Create an `oops.Config` object from a definition encoded as a dictionary.Dependencies------------* python-oops (http://pypi.python.org/pypi/oops)Also the following dependencies are required depending on the configsyou will use:* python-oops-datedir-repo (http://pypi.python.org/pypi/oops_datedir_repo)* python-oops-amqp (http://pypi.python.org/pypi/oops_datedir_repo)For testing all of the above are needed, along with:* python-testtoolsUse---To use run::from oops_dictconfig import config_from_dictoops_config = config_from_dict(dict_config)where `dict_config` is a `dict` describing the `oops.Config` that iswanted.The empty dict is valid, and will get you an `oops.Config` withno publishers, however, you will usually want at least one publisher.To do that have a `publishers` key in `dict_config` whose value is a listof dicts. Each of those dicts will add a publisher to the `oops.Config`.There is one mandatory key for all publisher types:* type: the type of publisher, currently `"datedir"` and `"amqp"` aresupported.All publishers support the following (deprecated) optional key. Instead ofusing this, you should see the section on fallback publishers:* new_only: if this is `True` then the publisher will be wrapped in`oops.publish_only_new`, meaning that the oops will onlybe sent to this publisher if no previous publisher in thechain published it.Each publisher type also has further options detailed below.datedir```````There is one further mandatory key for the datedir publisher:* error_dir: the path on filesystem where the oops should be written.It doesn't need to already exist.The following optional keys are also supported:* inherit_id: If True, use the oops ID (if present) supplied inthe report, rather than always assigning a new one.* stash_path: If True, the filename that the OOPS was written tois stored in the OOPS report under the key 'datedir_repo_filepath'.It is not stored in the OOPS written to disk, only the in-memorymodel.amqp````There are several other mandatory keys for the amqp publisher:* host: the hostname of the AMQP broker to connect to. If a portis needed then specify it after the hostname, separated bya colon. Examples: `example.com`, `1.2.3.4:5022`.* user: the username to use when connecting to the AMQP broker.* password: the password to use when connecting to the AMQP broker.* vhost: the vhost to send messages on the AMQP broker.* exchange_name: The name of the exchange to publish to.* routing_key: The routing key for messages.There is one other optional key for the amqp publisher:* inherit_id If True any 'True' 'id' in an OOPS report ispreserved. Handy if an id that has already been shownto a user is being published (but uniqueness cannot beguaranteed).Fallback publishers-------------------Sometimes it is desirable to have a chain of publishers, where the next inthe chain is used if the current attempt reported failure. For example, youcan have an amqp publisher with a datedir fallback, so that if the amqpbroker is not reachable the oops are saved to a datedir, where they canbe forwarded later.To do this create a publisher definition with a 'fallback_chain' key,whose value is a list of publishers to chain, e.g.{'fallback_chain': [{'type': 'amqp',...},{'type': 'datedir',...}]}Note that these chains can't be nested, so 'fallback_chain' can only appearat the top level of the publishers list.Examples--------The following would create a DateDirRepo as the only publisher::{'publishers': [{'type': 'datedir','error_dir': '/var/log/oopses/',},],}The following is a simple config for an AMQP publisher::{'publishers': [{'type': 'amqp','host': 'amqp.example.com:5302','user': 'oopsuser','password': 'oopspassword','vhost': 'oopses','exchange_name': 'oopses','routing_key': 'oopses',},],}The following is an example that publishes to AMQP with a fallbackto DateDirRepo if AMQP is not availble::{'publishers': [{'fallback_chain': [{'type': 'amqp','host': 'amqp.example.com:5302','user': 'oopsuser','password': 'oopspassword','vhost': 'oopses','exchange_name': 'oopses','routing_key': 'oopses',},{'type': 'datedir','error_dir': '/var/log/oopses/',},],},],}Template--------You can set the template for oopses by adding a 'template' key tothe dict. This should itself be a dict mapping keys to default values.The template will then be used by the config when creating oopses.The most common use of this is to set the publisher for oopsescoming from that config::{'template': {'publisher': 'myapp',},}configglue----------If you are using configglue to manage your configuration an Optionsubclass is supplied that can be used in your schema as appropriate::from configglue import schemafrom oops_dictconfig.configglue import OopsOptionclass MySchema(schema.Schema):oopses = OopsOption()Once that is defined you can produce the config described aboveusing your configglue config file::oopses = oopses_config[oopses_config]publishers = fallback_chain[fallback_chain]fallback_chain = amqp_publisherdatedir_publisher[amqp_publisher]type = amqphost = amqp.example.com:6832user = oopsuserpassword = oopspasswordvhost = oopsesexchange_name = oopsesrouting_key = oopses[datedir_publisher]type = datedirerror_dir = /var/log/oopsesRunning Tests-------------Install `testrepository` and `python-subunit` and run::testr inittestr runor run::python -m testtools.run oops_dictconfig.tests.test_suite..Copyright (c) 2012, Canonical LtdThis program is free software: you can redistribute it and/or modifyit under the terms of the GNU Lesser General Public License as published bythe Free Software Foundation, version 3 only.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU Lesser General Public License for more details.You should have received a copy of the GNU Lesser General Public Licensealong with this program.  If not, see <http://www.gnu.org/licenses/>.GNU Lesser General Public License version 3 (see the file LICENSE).