Hello community,
here is the log from the commit of package python-oslo.context for openSUSE:Factory checked in at 2016-03-07 13:23:10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-oslo.context (Old)
and /work/SRC/openSUSE:Factory/.python-oslo.context.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-oslo.context"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-oslo.context/python-oslo.context.changes 2015-10-30 13:42:28.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.python-oslo.context.new/python-oslo.context.changes 2016-03-07 13:23:32.000000000 +0100
@@ -1,0 +2,27 @@
+Fri Feb 26 13:17:47 UTC 2016 - dmueller@suse.com
+
+- update to 2.2.0:
+ * Standardize an oslo.policy credentials dictionary
+ * Revert "Add common oslo.log format parameters"
+ * Add roles to context
+ * Agnostic approach to construct context from_dict
+ * Add common oslo.log format parameters
+ * Improve Context docs with example syntax
+ * Define method for oslo.log context parameters
+ * Add additional unit tests
+ * Fix request_id type on Python 3: use text (Unicode)
+ * Updated from global requirements
+ * Provide a helper to load a context from environment
+ * Revert "Add properties for id attributes"
+ * Add properties for id attributes
+ * Trival: Remove 'MANIFEST.in'
+ * Updated from global requirements
+ * Remove python 2.6 classifier
+ * Remove python 2.6 and cleanup tox.ini
+ * Remove reference to undefined attributes
+ * Fix coverage configuration and execution
+ * Add shields.io version/downloads links/badges into README.rst
+ * Change ignore-errors to ignore_errors
+ * Updated from global requirements
+
+-------------------------------------------------------------------
Old:
----
oslo.context-0.6.0.tar.gz
New:
----
oslo.context-2.2.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-oslo.context.spec ++++++
--- /var/tmp/diff_new_pack.9BBb7M/_old 2016-03-07 13:23:33.000000000 +0100
+++ /var/tmp/diff_new_pack.9BBb7M/_new 2016-03-07 13:23:33.000000000 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-oslo.context
#
-# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
Name: python-oslo.context
-Version: 0.6.0
+Version: 2.2.0
Release: 0
Url: https://launchpad.net/oslo.context
Summary: Helpers to maintain useful information about a request context
@@ -62,16 +62,16 @@
%{__python2} setup.py install --skip-build --root %{buildroot}
%check
-export PYTHONPATH="%{python2_sitelib}:%{buildroot}%{python2_sitelib}"
-export PYTHON="python -S"
testr init && testr run --parallel
%files
-%defattr(-,root,root,-)
-%doc README.rst ChangeLog LICENSE AUTHORS
-%{python2_sitelib}/*
+%license LICENSE
+%doc README.rst ChangeLog AUTHORS
+%{python2_sitelib}/oslo_context
+%{python2_sitelib}/oslo.context*egg-info
%files doc
+%license LICENSE
%doc html
%changelog
++++++ oslo.context-0.6.0.tar.gz -> oslo.context-2.2.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/.coveragerc new/oslo.context-2.2.0/.coveragerc
--- old/oslo.context-0.6.0/.coveragerc 2015-09-08 17:39:25.000000000 +0200
+++ new/oslo.context-2.2.0/.coveragerc 2016-02-25 07:04:46.000000000 +0100
@@ -1,7 +1,8 @@
[run]
branch = True
-source = context
-omit = context/tests/*,context/openstack/*
+source = oslo_context
+omit = oslo_context/tests/*
[report]
-ignore-errors = True
+ignore_errors = True
+precision = 2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/AUTHORS new/oslo.context-2.2.0/AUTHORS
--- old/oslo.context-0.6.0/AUTHORS 2015-09-08 17:39:45.000000000 +0200
+++ new/oslo.context-2.2.0/AUTHORS 2016-02-25 07:05:11.000000000 +0100
@@ -1,20 +1,26 @@
Alexander Gorodnev
Andrew Bogott
+ChangBo Guo(gcb)
Cyril Roelandt
+Davanum Srinivas (dims)
Davanum Srinivas
Davanum Srinivas
Dina Belova
Doug Hellmann
Flavio Percoco
James Carey
+Jamie Lennox
Jason Kölker
Jay Pipes
Jeremy Stanley
Joe Gordon
+Joshua Harlow
Michael Basnight
Monty Taylor
+Ronald Bradford
Sean Dague
Steve Martinelli
Thomas Herve
Victor Sergeyev
+Victor Stinner
Zhongyue Luo
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/ChangeLog new/oslo.context-2.2.0/ChangeLog
--- old/oslo.context-0.6.0/ChangeLog 2015-09-08 17:39:45.000000000 +0200
+++ new/oslo.context-2.2.0/ChangeLog 2016-02-25 07:05:11.000000000 +0100
@@ -1,6 +1,60 @@
CHANGES
=======
+2.2.0
+-----
+
+* Standardize an oslo.policy credentials dictionary
+* Revert "Add common oslo.log format parameters"
+* Add roles to context
+
+2.1.0
+-----
+
+* Agnostic approach to construct context from_dict
+* Add common oslo.log format parameters
+
+2.0.0
+-----
+
+* Improve Context docs with example syntax
+* Define method for oslo.log context parameters
+* Add additional unit tests
+* Fix request_id type on Python 3: use text (Unicode)
+* Updated from global requirements
+* Provide a helper to load a context from environment
+
+1.0.1
+-----
+
+* Revert "Add properties for id attributes"
+* Add properties for id attributes
+* Trival: Remove 'MANIFEST.in'
+
+1.0.0
+-----
+
+* Updated from global requirements
+* Remove python 2.6 classifier
+* Remove python 2.6 and cleanup tox.ini
+
+0.9.0
+-----
+
+* Remove reference to undefined attributes
+
+0.8.0
+-----
+
+* Fix coverage configuration and execution
+
+0.7.0
+-----
+
+* Add shields.io version/downloads links/badges into README.rst
+* Change ignore-errors to ignore_errors
+* Updated from global requirements
+
0.6.0
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/MANIFEST.in new/oslo.context-2.2.0/MANIFEST.in
--- old/oslo.context-0.6.0/MANIFEST.in 2015-09-08 17:39:25.000000000 +0200
+++ new/oslo.context-2.2.0/MANIFEST.in 1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +0,0 @@
-include AUTHORS
-include ChangeLog
-exclude .gitignore
-exclude .gitreview
-
-global-exclude *.pyc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/PKG-INFO new/oslo.context-2.2.0/PKG-INFO
--- old/oslo.context-0.6.0/PKG-INFO 2015-09-08 17:39:45.000000000 +0200
+++ new/oslo.context-2.2.0/PKG-INFO 2016-02-25 07:05:11.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: oslo.context
-Version: 0.6.0
+Version: 2.2.0
Summary: Oslo Context library
Home-page: http://launchpad.net/oslo
Author: OpenStack
@@ -10,6 +10,14 @@
Oslo Context Library
====================
+ .. image:: https://img.shields.io/pypi/v/oslo.context.svg
+ :target: https://pypi.python.org/pypi/oslo.context/
+ :alt: Latest Version
+
+ .. image:: https://img.shields.io/pypi/dm/oslo.context.svg
+ :target: https://pypi.python.org/pypi/oslo.context/
+ :alt: Downloads
+
The Oslo context library has helpers to maintain useful information
about a request context. The request context is usually populated in
the WSGI pipeline and used by various modules such as logging.
@@ -29,6 +37,5 @@
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/README.rst new/oslo.context-2.2.0/README.rst
--- old/oslo.context-0.6.0/README.rst 2015-09-08 17:39:25.000000000 +0200
+++ new/oslo.context-2.2.0/README.rst 2016-02-25 07:04:46.000000000 +0100
@@ -2,6 +2,14 @@
Oslo Context Library
====================
+.. image:: https://img.shields.io/pypi/v/oslo.context.svg
+ :target: https://pypi.python.org/pypi/oslo.context/
+ :alt: Latest Version
+
+.. image:: https://img.shields.io/pypi/dm/oslo.context.svg
+ :target: https://pypi.python.org/pypi/oslo.context/
+ :alt: Downloads
+
The Oslo context library has helpers to maintain useful information
about a request context. The request context is usually populated in
the WSGI pipeline and used by various modules such as logging.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/doc/source/conf.py new/oslo.context-2.2.0/doc/source/conf.py
--- old/oslo.context-0.6.0/doc/source/conf.py 2015-09-08 17:39:25.000000000 +0200
+++ new/oslo.context-2.2.0/doc/source/conf.py 2016-02-25 07:04:46.000000000 +0100
@@ -38,7 +38,7 @@
# General information about the project.
project = u'oslo.context'
-copyright = u'2014, OpenStack Foundation'
+copyright = u'2016, OpenStack Foundation'
# If true, '()' will be appended to :func: etc. cross-reference text.
add_function_parentheses = True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/doc/source/examples/usage.py new/oslo.context-2.2.0/doc/source/examples/usage.py
--- old/oslo.context-0.6.0/doc/source/examples/usage.py 1970-01-01 01:00:00.000000000 +0100
+++ new/oslo.context-2.2.0/doc/source/examples/usage.py 2016-02-25 07:04:46.000000000 +0100
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2015 OpenStack Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+"""A respresentative usage example of Oslo Context
+
+This example requires the following modules to be installed.
+
+$ pip install oslo.context oslo.log
+
+More information can be found at:
+
+ http://docs.openstack.org/developer/oslo.context/usage.html
+"""
+
+from oslo_config import cfg
+from oslo_context import context
+from oslo_log import log as logging
+
+CONF = cfg.CONF
+DOMAIN = "demo"
+
+logging.register_options(CONF)
+logging.setup(CONF, DOMAIN)
+
+LOG = logging.getLogger(__name__)
+
+LOG.info("Message without context")
+# ids in Openstack are 32 characters long
+# For readability a shorter id value is used
+context.RequestContext(user='6ce90b4d',
+ tenant='d6134462',
+ project_domain='a6b9360e')
+LOG.info("Message with context")
+
+context = context.RequestContext(user='ace90b4d',
+ tenant='b6134462',
+ project_domain='c6b9360e')
+LOG.info("Message with passed context", context=context)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/doc/source/examples/usage_simple.py new/oslo.context-2.2.0/doc/source/examples/usage_simple.py
--- old/oslo.context-0.6.0/doc/source/examples/usage_simple.py 1970-01-01 01:00:00.000000000 +0100
+++ new/oslo.context-2.2.0/doc/source/examples/usage_simple.py 2016-02-25 07:04:46.000000000 +0100
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2015 OpenStack Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+"""A simple usage example of Oslo Context
+
+This example requires the following modules to be installed.
+
+$ pip install oslo.context oslo.log
+
+More information can be found at:
+
+ http://docs.openstack.org/developer/oslo.context/usage.html
+"""
+
+from oslo_config import cfg
+from oslo_context import context
+from oslo_log import log as logging
+
+CONF = cfg.CONF
+DOMAIN = "demo"
+
+logging.register_options(CONF)
+logging.setup(CONF, DOMAIN)
+
+LOG = logging.getLogger(__name__)
+
+LOG.info("Message without context")
+context.RequestContext()
+LOG.info("Message with context")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/doc/source/examples/usage_user_identity.py new/oslo.context-2.2.0/doc/source/examples/usage_user_identity.py
--- old/oslo.context-0.6.0/doc/source/examples/usage_user_identity.py 1970-01-01 01:00:00.000000000 +0100
+++ new/oslo.context-2.2.0/doc/source/examples/usage_user_identity.py 2016-02-25 07:04:46.000000000 +0100
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2015 OpenStack Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+"""A usage example of Oslo Context with user_identity
+
+This example requires the following modules to be installed.
+
+$ pip install oslo.context oslo.log
+
+More information can be found at:
+
+ http://docs.openstack.org/developer/oslo.context/usage.html
+"""
+
+from oslo_config import cfg
+from oslo_context import context
+from oslo_log import log as logging
+
+CONF = cfg.CONF
+DOMAIN = "demo"
+
+logging.register_options(CONF)
+CONF.logging_user_identity_format = "%(user)s/%(tenant)s@%(project_domain)s"
+logging.setup(CONF, DOMAIN)
+
+LOG = logging.getLogger(__name__)
+
+LOG.info("Message without context")
+# ids in Openstack are 32 characters long
+# For readability a shorter id value is used
+context.RequestContext(request_id='req-abc',
+ user='6ce90b4d',
+ tenant='d6134462',
+ project_domain='a6b9360e')
+LOG.info("Message with context")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/doc/source/examples.rst new/oslo.context-2.2.0/doc/source/examples.rst
--- old/oslo.context-0.6.0/doc/source/examples.rst 1970-01-01 01:00:00.000000000 +0100
+++ new/oslo.context-2.2.0/doc/source/examples.rst 2016-02-25 07:04:46.000000000 +0100
@@ -0,0 +1,37 @@
+==========
+ Examples
+==========
+
+.. _examples:
+
+These files can be found in the doc/source/examples directory of
+the git source of this project. They can also be found at the
+`online git respository`_ of this project.
+
+.. _online git respository: http://git.openstack.org/cgit/openstack/oslo.context/tree/doc/source/example...
+
+
+.. _example_usage_simple.py:
+
+usage_simple.py
+---------------
+
+.. highlight:: python
+.. literalinclude:: examples/usage_simple.py
+ :linenos:
+
+.. _example_usage.py:
+
+usage.py
+--------
+
+.. literalinclude:: examples/usage.py
+ :linenos:
+
+.. _example_usage_user_identity.py:
+
+usage_user_identity.py
+----------------------
+
+.. literalinclude:: examples/usage_user_identity.py
+ :linenos:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/doc/source/index.rst new/oslo.context-2.2.0/doc/source/index.rst
--- old/oslo.context-0.6.0/doc/source/index.rst 2015-09-08 17:39:25.000000000 +0200
+++ new/oslo.context-2.2.0/doc/source/index.rst 2016-02-25 07:04:46.000000000 +0100
@@ -7,6 +7,7 @@
installation
usage
+ examples
contributing
history
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/doc/source/usage.rst new/oslo.context-2.2.0/doc/source/usage.rst
--- old/oslo.context-0.6.0/doc/source/usage.rst 2015-09-08 17:39:25.000000000 +0200
+++ new/oslo.context-2.2.0/doc/source/usage.rst 2016-02-25 07:04:46.000000000 +0100
@@ -2,6 +2,123 @@
Usage
=======
-To use oslo.context in a project::
+oslo.context is used in conjunction with `oslo.log`_ to provide context
+aware log records when specifying a :class:`~oslo_context.context.RequestContext`
+object.
- from oslo_context import context
+This code example demonstrates two INFO log records with varying output
+format due to the use of RequestContext.
+
+.. _oslo.log: http://docs.openstack.org/developer/oslo.log/
+
+.. highlight:: python
+.. literalinclude:: examples/usage_simple.py
+ :linenos:
+ :lines: 28-42
+ :emphasize-lines: 2,14
+
+Source: :ref:`example_usage_simple.py`
+
+**Example Logging Output:**
+
+::
+
+ 2016-01-20 21:56:29.283 8428 INFO __main__ [-] Message without context
+ 2016-01-20 21:56:29.284 8428 INFO __main__ [req-929d23e9-f50e-46ae-a8a7-02bc8c3fd2c8 - - - - -] Message with context
+
+The format of these log records are defined by the
+`logging_default_format_string`_ and `logging_context_format_string`_
+configuration options respectively. The `logging_user_identity_format`_ option
+also provides further context aware definition flexibility.
+
+.. _logging_default_format_string: http://docs.openstack.org/developer/oslo.log/opts.html#logging_default_forma...
+.. _logging_context_format_string: http://docs.openstack.org/developer/oslo.log/opts.html#logging_context_forma...
+.. _logging_user_identity_format: http://docs.openstack.org/developer/oslo.log/opts.html#logging_user_identity...
+
+-----------------
+Context Variables
+-----------------
+
+The oslo.context variables used in the **logging_context_format_string** and
+**logging_user_identity_format** configuration options include:
+
+* request_id - A request id (e.g. req-9f2c484a-b504-4fd9-b44c-4357544cca50)
+* user - A user id (e.g. e5bc7033e6b7473c9fe8ee1bd4df79a3)
+* tenant - A tenant/project id (e.g. 79e338475db84f7c91ee4e86b79b34c1)
+* domain - A domain id
+* user_domain - A user domain id
+* project_domain - A project domain id
+
+
+This code example demonstrates defining a context with specific attributes
+that are presented in the output log record.
+
+.. literalinclude:: examples/usage.py
+ :linenos:
+ :lines: 28-46
+ :emphasize-lines: 2,16-18
+
+Source: :ref:`example_usage.py`
+
+**Example Logging Output:**
+
+::
+
+ 2016-01-21 17:30:50.263 12201 INFO __main__ [-] Message without context
+ 2016-01-21 17:30:50.264 12201 INFO __main__ [req-e591e881-36c3-4627-a5d8-54df200168ef 6ce90b4d d6134462 - - a6b9360e] Message with context
+
+A context object can also be passed as an argument to any logging level
+message.
+
+.. literalinclude:: examples/usage.py
+ :linenos:
+ :lines: 48-51
+ :emphasize-lines: 4
+
+**Example Logging Output:**
+
+::
+
+ 2016-01-21 22:43:55.621 17295 INFO __main__ [req-ac2d4a3a-ff3c-4c2b-97a0-2b76b33d9e72 ace90b4d b6134462 - - c6b9360e] Message with passed context
+
+.. note::
+
+ To maintain consistent log messages for operators across multiple
+ OpenStack projects it is highly recommended that
+ **logging_default_format_string** and **logging_context_format_string** are
+ not modified from oslo.log default values.
+
+
+--------------------------
+Project Specific Variables
+--------------------------
+
+Individual projects can also subclass :class:`~oslo_context.context.RequestContext`
+to provide additional attributes that can be using with oslo.log. The Nova
+`RequestContext`_ class for example provides additional variables including
+user_name and project_name.
+
+.. _RequestContext: http://git.openstack.org/cgit/openstack/nova/tree/nova/context.py
+
+This can for example enable the defining of **logging_user_identity_format =
+%(user_name)s %(project_name)s** which would produce a log record
+containing a context portion using names instead of ids such as
+**[req-e4b9a194-a9b1-4829-b7d0-35226fc101fc admin demo]**
+
+This following code example shows how a modified **logging_user_identity_format**
+configuration alters the context portion of the log record.
+
+.. literalinclude:: examples/usage_user_identity.py
+ :linenos:
+ :lines: 28-48
+ :emphasize-lines: 9
+
+Source: :ref:`example_usage_user_identity.py`
+
+
+**Example Logging Output:**
+
+::
+
+ 2016-01-21 20:56:43.964 14816 INFO __main__ [-] Message without context
+ 2016-01-21 20:56:43.965 14816 INFO __main__ [req-abc 6ce90b4d/d6134462@a6b9360e] Message with context
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/oslo.context.egg-info/PKG-INFO new/oslo.context-2.2.0/oslo.context.egg-info/PKG-INFO
--- old/oslo.context-0.6.0/oslo.context.egg-info/PKG-INFO 2015-09-08 17:39:45.000000000 +0200
+++ new/oslo.context-2.2.0/oslo.context.egg-info/PKG-INFO 2016-02-25 07:05:11.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: oslo.context
-Version: 0.6.0
+Version: 2.2.0
Summary: Oslo Context library
Home-page: http://launchpad.net/oslo
Author: OpenStack
@@ -10,6 +10,14 @@
Oslo Context Library
====================
+ .. image:: https://img.shields.io/pypi/v/oslo.context.svg
+ :target: https://pypi.python.org/pypi/oslo.context/
+ :alt: Latest Version
+
+ .. image:: https://img.shields.io/pypi/dm/oslo.context.svg
+ :target: https://pypi.python.org/pypi/oslo.context/
+ :alt: Downloads
+
The Oslo context library has helpers to maintain useful information
about a request context. The request context is usually populated in
the WSGI pipeline and used by various modules such as logging.
@@ -29,6 +37,5 @@
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/oslo.context.egg-info/SOURCES.txt new/oslo.context-2.2.0/oslo.context.egg-info/SOURCES.txt
--- old/oslo.context-0.6.0/oslo.context.egg-info/SOURCES.txt 2015-09-08 17:39:45.000000000 +0200
+++ new/oslo.context-2.2.0/oslo.context.egg-info/SOURCES.txt 2016-02-25 07:05:11.000000000 +0100
@@ -6,7 +6,6 @@
ChangeLog
HACKING.rst
LICENSE
-MANIFEST.in
README.rst
babel.cfg
requirements.txt
@@ -16,6 +15,7 @@
tox.ini
doc/source/conf.py
doc/source/contributing.rst
+doc/source/examples.rst
doc/source/history.rst
doc/source/index.rst
doc/source/installation.rst
@@ -23,6 +23,9 @@
doc/source/api/context.rst
doc/source/api/fixture.rst
doc/source/api/index.rst
+doc/source/examples/usage.py
+doc/source/examples/usage_simple.py
+doc/source/examples/usage_user_identity.py
oslo.context.egg-info/PKG-INFO
oslo.context.egg-info/SOURCES.txt
oslo.context.egg-info/dependency_links.txt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/oslo.context.egg-info/pbr.json new/oslo.context-2.2.0/oslo.context.egg-info/pbr.json
--- old/oslo.context-0.6.0/oslo.context.egg-info/pbr.json 2015-09-08 17:39:45.000000000 +0200
+++ new/oslo.context-2.2.0/oslo.context.egg-info/pbr.json 2016-02-25 07:05:11.000000000 +0100
@@ -1 +1 @@
-{"is_release": true, "git_version": "73c91b8"}
\ No newline at end of file
+{"git_version": "187d574", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/oslo.context.egg-info/requires.txt new/oslo.context-2.2.0/oslo.context.egg-info/requires.txt
--- old/oslo.context-0.6.0/oslo.context.egg-info/requires.txt 2015-09-08 17:39:45.000000000 +0200
+++ new/oslo.context-2.2.0/oslo.context.egg-info/requires.txt 2016-02-25 07:05:11.000000000 +0100
@@ -1,2 +1,2 @@
-pbr<2.0,>=1.6
+pbr>=1.6
Babel>=1.3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/oslo_context/context.py new/oslo.context-2.2.0/oslo_context/context.py
--- old/oslo.context-0.6.0/oslo_context/context.py 2015-09-08 17:39:25.000000000 +0200
+++ new/oslo.context-2.2.0/oslo_context/context.py 2016-02-25 07:04:47.000000000 +0100
@@ -14,12 +14,19 @@
# under the License.
"""
-Simple class that stores security context information in the web request.
+Base class for holding contextual information of a request
+
+This class has several uses:
+
+* Used for storing security information in a web request.
+* Used for passing contextual details to oslo.log.
Projects should subclass this class if they wish to enhance the request
-context or provide additional information in their specific WSGI pipeline.
+context or provide additional information in their specific WSGI pipeline
+or logging context.
"""
+import inspect
import itertools
import threading
import uuid
@@ -29,7 +36,8 @@
def generate_request_id():
- return b'req-' + str(uuid.uuid4()).encode('ascii')
+ """Generate a unique request id."""
+ return 'req-%s' % uuid.uuid4()
class RequestContext(object):
@@ -45,7 +53,7 @@
def __init__(self, auth_token=None, user=None, tenant=None, domain=None,
user_domain=None, project_domain=None, is_admin=False,
read_only=False, show_deleted=False, request_id=None,
- resource_uuid=None, overwrite=True):
+ resource_uuid=None, overwrite=True, roles=None):
"""Initialize the RequestContext
:param overwrite: Set to False to ensure that the greenthread local
@@ -61,6 +69,7 @@
self.read_only = read_only
self.show_deleted = show_deleted
self.resource_uuid = resource_uuid
+ self.roles = roles or []
if not request_id:
request_id = generate_request_id()
self.request_id = request_id
@@ -68,9 +77,29 @@
self.update_store()
def update_store(self):
+ """Store the context in the current thread."""
_request_store.context = self
+ def to_policy_values(self):
+ """A dictionary of context attributes to enforce policy with.
+
+ oslo.policy enforcement requires a dictionary of attributes
+ representing the current logged in user on which it applies policy
+ enforcement. This dictionary defines a standard list of attributes that
+ should be available for enforcement across services.
+
+ It is expected that services will often have to override this method
+ with either deprecated values or additional attributes used by that
+ service specific policy.
+ """
+ return {'user_id': self.user,
+ 'user_domain_id': self.user_domain,
+ 'project_id': self.tenant,
+ 'project_domain_id': self.project_domain,
+ 'roles': self.roles}
+
def to_dict(self):
+ """Return a dictionary of context attributes."""
user_idt = (
self.user_idt_format.format(user=self.user or '-',
tenant=self.tenant or '-',
@@ -89,22 +118,47 @@
'auth_token': self.auth_token,
'request_id': self.request_id,
'resource_uuid': self.resource_uuid,
+ 'roles': self.roles,
'user_identity': user_idt}
+ def get_logging_values(self):
+ """Return a dictionary of logging specific context attributes."""
+ values = self.to_dict()
+ return values
+
+ @classmethod
+ def from_dict(cls, values):
+ """Construct a context object from a provided dictionary."""
+ allowed = [arg for arg in
+ inspect.getargspec(RequestContext.__init__).args
+ if arg != 'self']
+ kwargs = {k: v for (k, v) in values.items() if k in allowed}
+ return cls(**kwargs)
+
@classmethod
- def from_dict(cls, ctx):
- return cls(
- auth_token=ctx.get("auth_token"),
- user=ctx.get("user"),
- tenant=ctx.get("tenant"),
- domain=ctx.get("domain"),
- user_domain=ctx.get("user_domain"),
- project_domain=ctx.get("project_domain"),
- is_admin=ctx.get("is_admin", False),
- read_only=ctx.get("read_only", False),
- show_deleted=ctx.get("show_deleted", False),
- request_id=ctx.get("request_id"),
- resource_uuid=ctx.get("resource_uuid"))
+ def from_environ(cls, environ, **kwargs):
+ """Load a context object from a request environment.
+
+ If keyword arguments are provided then they override the values in the
+ request environment.
+
+ :param environ: The environment dictionary associated with a request.
+ :type environ: dict
+ """
+ # Load a new context object from the environment variables set by
+ # auth_token middleware. See:
+ # http://docs.openstack.org/developer/keystonemiddleware/api/keystonemiddlewar...
+ kwargs.setdefault('auth_token', environ.get('HTTP_X_AUTH_TOKEN'))
+ kwargs.setdefault('user', environ.get('HTTP_X_USER_ID'))
+ kwargs.setdefault('tenant', environ.get('HTTP_X_PROJECT_ID'))
+ kwargs.setdefault('user_domain', environ.get('HTTP_X_USER_DOMAIN_ID'))
+ kwargs.setdefault('project_domain',
+ environ.get('HTTP_X_PROJECT_DOMAIN_ID'))
+
+ roles = environ.get('HTTP_X_ROLES')
+ kwargs.setdefault('roles', roles.split(',') if roles else [])
+
+ return cls(**kwargs)
def get_admin_context(show_deleted=False):
@@ -133,12 +187,10 @@
def is_user_context(context):
"""Indicates if the request context is a normal user."""
- if not context:
+ if not context or not isinstance(context, RequestContext):
return False
if context.is_admin:
return False
- if not context.user_id or not context.project_id:
- return False
return True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/oslo_context/tests/test_context.py new/oslo.context-2.2.0/oslo_context/tests/test_context.py
--- old/oslo.context-0.6.0/oslo_context/tests/test_context.py 2015-09-08 17:39:25.000000000 +0200
+++ new/oslo.context-2.2.0/oslo_context/tests/test_context.py 2016-02-25 07:04:47.000000000 +0100
@@ -13,12 +13,18 @@
# License for the specific language governing permissions and limitations
# under the License.
+import uuid
+
from oslotest import base as test_base
from oslo_context import context
from oslo_context import fixture
+class Object(object):
+ pass
+
+
class ContextTest(test_base.BaseTestCase):
def setUp(self):
@@ -48,15 +54,27 @@
ctx1 = context.RequestContext(overwrite=True)
context.get_admin_context()
self.assertIs(context.get_current(), ctx1)
+ self.assertFalse(ctx1.is_admin)
def test_store_current(self):
# By default a new context is stored.
ctx = context.RequestContext()
self.assertIs(context.get_current(), ctx)
+ def test_no_context(self):
+ self.assertIsNone(context.get_current())
+
def test_admin_context_show_deleted_flag_default(self):
ctx = context.get_admin_context()
+ self.assertIsInstance(ctx, context.RequestContext)
+ self.assertTrue(ctx.is_admin)
self.assertFalse(ctx.show_deleted)
+ self.assertIsNone(ctx.tenant)
+
+ def test_admin_context_show_deleted_flag_set(self):
+ ctx = context.get_admin_context(show_deleted=True)
+ self.assertTrue(ctx.is_admin)
+ self.assertTrue(ctx.show_deleted)
def test_from_dict(self):
dct = {
@@ -85,3 +103,237 @@
self.assertTrue(ctx.show_deleted)
self.assertEqual("request1", ctx.request_id)
self.assertEqual("instance1", ctx.resource_uuid)
+
+ def test_from_dict_unknown_keys(self):
+ dct = {
+ "auth_token": "token1",
+ "user": "user1",
+ "read_only": True,
+ "roles": "role1,role2,role3", # future review provides this
+ "color": "red",
+ "unknown": ""
+ }
+ ctx = context.RequestContext.from_dict(dct)
+ self.assertEqual("token1", ctx.auth_token)
+ self.assertEqual("user1", ctx.user)
+ self.assertIsNone(ctx.tenant)
+ self.assertFalse(ctx.is_admin)
+ self.assertTrue(ctx.read_only)
+ self.assertRaises(KeyError, lambda: ctx.__dict__['color'])
+
+ def test_is_user_context(self):
+ self.assertFalse(context.is_user_context(None))
+ ctx = context.RequestContext(is_admin=True)
+ self.assertFalse(context.is_user_context(ctx))
+ ctx = context.RequestContext(is_admin=False)
+ self.assertTrue(context.is_user_context(ctx))
+ self.assertFalse(context.is_user_context("non context object"))
+
+ def test_from_environ_variables(self):
+ auth_token = uuid.uuid4().hex
+ user_id = uuid.uuid4().hex
+ project_id = uuid.uuid4().hex
+ user_domain_id = uuid.uuid4().hex
+ project_domain_id = uuid.uuid4().hex
+ roles = [uuid.uuid4().hex, uuid.uuid4().hex, uuid.uuid4().hex]
+
+ environ = {'HTTP_X_AUTH_TOKEN': auth_token,
+ 'HTTP_X_USER_ID': user_id,
+ 'HTTP_X_PROJECT_ID': project_id,
+ 'HTTP_X_USER_DOMAIN_ID': user_domain_id,
+ 'HTTP_X_PROJECT_DOMAIN_ID': project_domain_id,
+ 'HTTP_X_ROLES': ','.join(roles)}
+
+ ctx = context.RequestContext.from_environ(environ)
+
+ self.assertEqual(auth_token, ctx.auth_token)
+ self.assertEqual(user_id, ctx.user)
+ self.assertEqual(project_id, ctx.tenant)
+ self.assertEqual(user_domain_id, ctx.user_domain)
+ self.assertEqual(project_domain_id, ctx.project_domain)
+ self.assertEqual(roles, ctx.roles)
+
+ def test_from_environ_no_roles(self):
+ ctx = context.RequestContext.from_environ(environ={})
+ self.assertEqual([], ctx.roles)
+
+ ctx = context.RequestContext.from_environ(environ={'HTTP_X_ROLES': ''})
+ self.assertEqual([], ctx.roles)
+
+ def test_from_function_and_args(self):
+ ctx = context.RequestContext(user="user1")
+ arg = []
+ kw = dict(c=ctx, s="s")
+ fn = context.get_context_from_function_and_args
+ ctx1 = context.get_context_from_function_and_args(fn, arg, kw)
+ self.assertIs(ctx1, ctx)
+
+ def test_not_in_from_function_and_args(self):
+ arg = []
+ kw = dict()
+ fn = context.get_context_from_function_and_args
+ ctx1 = context.get_context_from_function_and_args(fn, arg, kw)
+ self.assertIsNone(ctx1)
+
+ def test_values(self):
+ auth_token = "token1"
+ user = "user1"
+ tenant = "tenant1"
+ domain = "domain1"
+ user_domain = "user_domain1"
+ project_domain = "project_domain1"
+ is_admin = True
+ read_only = True
+ show_deleted = True
+ request_id = "id1"
+ resource_uuid = "uuid1"
+
+ ctx = context.RequestContext(auth_token=auth_token,
+ user=user,
+ tenant=tenant,
+ domain=domain,
+ user_domain=user_domain,
+ project_domain=project_domain,
+ is_admin=is_admin,
+ read_only=read_only,
+ show_deleted=show_deleted,
+ request_id=request_id,
+ resource_uuid=resource_uuid)
+ self.assertEqual(auth_token, ctx.auth_token)
+ self.assertEqual(user, ctx.user)
+ self.assertEqual(tenant, ctx.tenant)
+ self.assertEqual(domain, ctx.domain)
+ self.assertEqual(user_domain, ctx.user_domain)
+ self.assertEqual(project_domain, ctx.project_domain)
+ self.assertEqual(is_admin, ctx.is_admin)
+ self.assertEqual(read_only, ctx.read_only)
+ self.assertEqual(show_deleted, ctx.show_deleted)
+ self.assertEqual(request_id, ctx.request_id)
+ self.assertEqual(resource_uuid, ctx.resource_uuid)
+
+ d = ctx.to_dict()
+ self.assertIn('auth_token', d)
+ self.assertIn('user', d)
+ self.assertIn('tenant', d)
+ self.assertIn('domain', d)
+ self.assertIn('user_domain', d)
+ self.assertIn('project_domain', d)
+ self.assertIn('is_admin', d)
+ self.assertIn('read_only', d)
+ self.assertIn('show_deleted', d)
+ self.assertIn('request_id', d)
+ self.assertIn('resource_uuid', d)
+ self.assertIn('user_identity', d)
+ self.assertIn('roles', d)
+
+ self.assertEqual(auth_token, d['auth_token'])
+ self.assertEqual(tenant, d['tenant'])
+ self.assertEqual(domain, d['domain'])
+ self.assertEqual(user_domain, d['user_domain'])
+ self.assertEqual(project_domain, d['project_domain'])
+ self.assertEqual(is_admin, d['is_admin'])
+ self.assertEqual(read_only, d['read_only'])
+ self.assertEqual(show_deleted, d['show_deleted'])
+ self.assertEqual(request_id, d['request_id'])
+ self.assertEqual(resource_uuid, d['resource_uuid'])
+ user_identity = "%s %s %s %s %s" % (user, tenant, domain,
+ user_domain, project_domain)
+ self.assertEqual(user_identity, d['user_identity'])
+ self.assertEqual([], d['roles'])
+
+ def test_get_logging_values(self):
+ auth_token = "token1"
+ user = "user1"
+ tenant = "tenant1"
+ domain = "domain1"
+ user_domain = "user_domain1"
+ project_domain = "project_domain1"
+ is_admin = True
+ read_only = True
+ show_deleted = True
+ request_id = "id1"
+ resource_uuid = "uuid1"
+
+ ctx = context.RequestContext(auth_token=auth_token,
+ user=user,
+ tenant=tenant,
+ domain=domain,
+ user_domain=user_domain,
+ project_domain=project_domain,
+ is_admin=is_admin,
+ read_only=read_only,
+ show_deleted=show_deleted,
+ request_id=request_id,
+ resource_uuid=resource_uuid)
+ self.assertEqual(auth_token, ctx.auth_token)
+ self.assertEqual(user, ctx.user)
+ self.assertEqual(tenant, ctx.tenant)
+ self.assertEqual(domain, ctx.domain)
+ self.assertEqual(user_domain, ctx.user_domain)
+ self.assertEqual(project_domain, ctx.project_domain)
+ self.assertEqual(is_admin, ctx.is_admin)
+ self.assertEqual(read_only, ctx.read_only)
+ self.assertEqual(show_deleted, ctx.show_deleted)
+ self.assertEqual(request_id, ctx.request_id)
+ self.assertEqual(resource_uuid, ctx.resource_uuid)
+
+ d = ctx.get_logging_values()
+ self.assertIn('auth_token', d)
+ self.assertIn('user', d)
+ self.assertIn('tenant', d)
+ self.assertIn('domain', d)
+ self.assertIn('user_domain', d)
+ self.assertIn('project_domain', d)
+ self.assertIn('is_admin', d)
+ self.assertIn('read_only', d)
+ self.assertIn('show_deleted', d)
+ self.assertIn('request_id', d)
+ self.assertIn('resource_uuid', d)
+ self.assertIn('user_identity', d)
+
+ self.assertEqual(auth_token, d['auth_token'])
+ self.assertEqual(tenant, d['tenant'])
+ self.assertEqual(domain, d['domain'])
+ self.assertEqual(user_domain, d['user_domain'])
+ self.assertEqual(project_domain, d['project_domain'])
+ self.assertEqual(is_admin, d['is_admin'])
+ self.assertEqual(read_only, d['read_only'])
+ self.assertEqual(show_deleted, d['show_deleted'])
+ self.assertEqual(request_id, d['request_id'])
+ self.assertEqual(resource_uuid, d['resource_uuid'])
+ user_identity = "%s %s %s %s %s" % (user, tenant, domain,
+ user_domain, project_domain)
+ self.assertEqual(user_identity, d['user_identity'])
+
+ def test_dict_empty_user_identity(self):
+ ctx = context.RequestContext()
+ d = ctx.to_dict()
+ self.assertEqual("- - - - -", d['user_identity'])
+
+ def test_generate_request_id(self):
+ id = context.generate_request_id()
+ self.assertEqual("req-", id[:4])
+
+ def test_generate_request_id_unique(self):
+ id1 = context.generate_request_id()
+ id2 = context.generate_request_id()
+ self.assertNotEqual(id1, id2)
+
+ def test_policy_dict(self):
+ user = uuid.uuid4().hex
+ user_domain = uuid.uuid4().hex
+ tenant = uuid.uuid4().hex
+ project_domain = uuid.uuid4().hex
+ roles = [uuid.uuid4().hex, uuid.uuid4().hex, uuid.uuid4().hex]
+
+ ctx = context.RequestContext(user=user,
+ user_domain=user_domain,
+ tenant=tenant,
+ project_domain=project_domain,
+ roles=roles)
+
+ self.assertEqual({'user_id': user,
+ 'user_domain_id': user_domain,
+ 'project_id': tenant,
+ 'project_domain_id': project_domain,
+ 'roles': roles}, ctx.to_policy_values())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/requirements.txt new/oslo.context-2.2.0/requirements.txt
--- old/oslo.context-0.6.0/requirements.txt 2015-09-08 17:39:25.000000000 +0200
+++ new/oslo.context-2.2.0/requirements.txt 2016-02-25 07:04:46.000000000 +0100
@@ -2,5 +2,5 @@
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
-pbr<2.0,>=1.6
-Babel>=1.3
+pbr>=1.6 # Apache-2.0
+Babel>=1.3 # BSD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/setup.cfg new/oslo.context-2.2.0/setup.cfg
--- old/oslo.context-0.6.0/setup.cfg 2015-09-08 17:39:45.000000000 +0200
+++ new/oslo.context-2.2.0/setup.cfg 2016-02-25 07:05:11.000000000 +0100
@@ -15,7 +15,6 @@
Programming Language :: Python
Programming Language :: Python :: 2
Programming Language :: Python :: 2.7
- Programming Language :: Python :: 2.6
Programming Language :: Python :: 3
Programming Language :: Python :: 3.4
@@ -52,7 +51,7 @@
universal = true
[egg_info]
-tag_build =
tag_svn_revision = 0
tag_date = 0
+tag_build =
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/setup.py new/oslo.context-2.2.0/setup.py
--- old/oslo.context-0.6.0/setup.py 2015-09-08 17:39:25.000000000 +0200
+++ new/oslo.context-2.2.0/setup.py 2016-02-25 07:04:46.000000000 +0100
@@ -25,5 +25,5 @@
pass
setuptools.setup(
- setup_requires=['pbr>=1.3'],
+ setup_requires=['pbr>=1.8'],
pbr=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/test-requirements.txt new/oslo.context-2.2.0/test-requirements.txt
--- old/oslo.context-0.6.0/test-requirements.txt 2015-09-08 17:39:25.000000000 +0200
+++ new/oslo.context-2.2.0/test-requirements.txt 2016-02-25 07:04:46.000000000 +0100
@@ -4,8 +4,8 @@
hacking<0.11,>=0.10.0
oslotest>=1.10.0 # Apache-2.0
-coverage>=3.6
+coverage>=3.6 # Apache-2.0
# These are needed for docs generation
-oslosphinx>=2.5.0 # Apache-2.0
-sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2
+oslosphinx!=3.4.0,>=2.5.0 # Apache-2.0
+sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2 # BSD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.context-0.6.0/tox.ini new/oslo.context-2.2.0/tox.ini
--- old/oslo.context-0.6.0/tox.ini 2015-09-08 17:39:25.000000000 +0200
+++ new/oslo.context-2.2.0/tox.ini 2016-02-25 07:04:46.000000000 +0100
@@ -1,19 +1,9 @@
[tox]
minversion = 1.6
-envlist = py34,py26,py27,pypy,pep8
-# NOTE(dhellmann): We cannot set skipdist=True
-# for oslo libraries because of the namespace package.
-#skipsdist = True
+envlist = py34,py27,pypy,pep8
[testenv]
-# NOTE(dhellmann): We cannot set usedevelop=True
-# for oslo libraries because of the namespace package.
-#usedevelop = True
-install_command = pip install -U {opts} {packages}
-setenv =
- VIRTUAL_ENV={envdir}
-deps = -r{toxinidir}/requirements.txt
- -r{toxinidir}/test-requirements.txt
+deps = -r{toxinidir}/test-requirements.txt
commands = python setup.py testr --slowest --testr-args='{posargs}'
[testenv:pep8]
@@ -26,7 +16,7 @@
commands = python setup.py build_sphinx
[testenv:cover]
-commands = python setup.py testr --coverage --testr-args='{posargs}'
+commands = python setup.py test --coverage --coverage-package-name=oslo_context --testr-args='{posargs}'
[flake8]
# H803 skipped on purpose per list discussion.