Hello community,
here is the log from the commit of package python-oslo.service for openSUSE:Factory checked in at 2015-09-02 07:54:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-oslo.service (Old)
and /work/SRC/openSUSE:Factory/.python-oslo.service.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-oslo.service"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-oslo.service/python-oslo.service.changes 2015-08-27 08:54:30.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-oslo.service.new/python-oslo.service.changes 2015-09-02 07:54:10.000000000 +0200
@@ -1,0 +2,36 @@
+Fri Aug 21 11:52:51 UTC 2015 - tbechtold@suse.com
+
+- update to 0.7.0:
+ * Updated from global requirements
+ * Update "Signal handling" section of usage docs
+ * Use oslo_utils reflection to get 'f' callable name
+ * Updated from global requirements
+ * Prefix the 'safe_wrapper' function to be '_safe_wrapper'
+ * Setup translations
+ * Check that sighup is supported before accessing signal.SIGHUP
+ * Use contextlib.closing instead of try ... finally: sock.close
+ * Avoid using the global lockutils semaphore collection
+ * Updated from global requirements
+ * Added newline at end of file
+ * Added class SignalHandler
+ * Updated from global requirements
+ * Activate pep8 check that _ is imported
+ * Denote what happens when no exceptions are passed in
+ * Allow LoopingCall to continue on exception in callee
+- adjust Requires according to requirements.txt
+
+-------------------------------------------------------------------
+Wed Jul 29 10:44:00 UTC 2015 - tbechtold@suse.com
+
+- Unify spec file. Use fedora compatible files macros
+
+-------------------------------------------------------------------
+Tue Jul 28 12:42:16 UTC 2015 - tbechtold@suse.com
+
+- update to 0.5.0:
+ * Updated from global requirements
+ * Add oslo_debug_helper to tox.ini
+ * Add usage documentation for oslo_service.service module
+- update Requires according to requirements.txt
+
+-------------------------------------------------------------------
Old:
----
oslo.service-0.4.0.tar.gz
New:
----
oslo.service-0.7.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-oslo.service.spec ++++++
--- /var/tmp/diff_new_pack.a4OUnc/_old 2015-09-02 07:54:10.000000000 +0200
+++ /var/tmp/diff_new_pack.a4OUnc/_new 2015-09-02 07:54:10.000000000 +0200
@@ -17,22 +17,24 @@
Name: python-oslo.service
-Version: 0.4.0
+Version: 0.7.0
Release: 0
Summary: Oslo service library
License: Apache-2.0
Group: Development/Languages/Python
Url: http://launchpad.net/oslo
Source: https://pypi.python.org/packages/source/o/oslo.service/oslo.service-%{version}.tar.gz
+BuildRequires: openstack-suse-macros
BuildRequires: python-devel
BuildRequires: python-pbr
Requires: python-Babel >= 1.3
Requires: python-eventlet >= 0.17.4
Requires: python-greenlet >= 0.3.2
-Requires: python-monotonic >= 0.1
-Requires: python-oslo.config >= 1.11.0
+Requires: python-monotonic >= 0.3
+Requires: python-oslo.concurrency >= 2.3.0
+Requires: python-oslo.config >= 2.1.0
Requires: python-oslo.i18n >= 1.5.0
-Requires: python-oslo.utils >= 1.6.0
+Requires: python-oslo.utils >= 2.0.0
Requires: python-six >= 1.9.0
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%if 0%{?suse_version} && 0%{?suse_version} <= 1110
@@ -48,14 +50,14 @@
%setup -q -n oslo.service-%{version}
%build
-python setup.py build
+%{__python2} setup.py build
%install
-python setup.py install --prefix=%{_prefix} --root=%{buildroot}
+%{__python2} setup.py install --prefix=%{_prefix} --root=%{buildroot}
%files
%defattr(-,root,root,-)
%doc LICENSE README.rst ChangeLog AUTHORS
-%{python_sitelib}/*
+%{python2_sitelib}/*
%changelog
++++++ oslo.service-0.4.0.tar.gz -> oslo.service-0.7.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/AUTHORS new/oslo.service-0.7.0/AUTHORS
--- old/oslo.service-0.4.0/AUTHORS 2015-07-13 20:35:22.000000000 +0200
+++ new/oslo.service-0.7.0/AUTHORS 2015-08-18 22:23:58.000000000 +0200
@@ -4,6 +4,7 @@
Alex Gaynor
Alex Holden
Alexander Gorodnev
+Andreas Jaeger
Angus Salkeld
Ann Kamyshnikova
Ben Nemec
@@ -38,6 +39,7 @@
Ian Wienand
Ihar Hrachyshka
Ilya Shakhat
+James Carey
Jason Dunsmore
Jason Kölker
Jay Pipes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/ChangeLog new/oslo.service-0.7.0/ChangeLog
--- old/oslo.service-0.4.0/ChangeLog 2015-07-13 20:35:22.000000000 +0200
+++ new/oslo.service-0.7.0/ChangeLog 2015-08-18 22:23:58.000000000 +0200
@@ -1,10 +1,44 @@
CHANGES
=======
+0.7.0
+-----
+
+* Updated from global requirements
+* Update "Signal handling" section of usage docs
+* Use oslo_utils reflection to get 'f' callable name
+* Updated from global requirements
+* Prefix the 'safe_wrapper' function to be '_safe_wrapper'
+* Setup translations
+* Check that sighup is supported before accessing signal.SIGHUP
+* Use contextlib.closing instead of try ... finally: sock.close
+* Avoid using the global lockutils semaphore collection
+* Updated from global requirements
+
+0.6.0
+-----
+
+* Added newline at end of file
+* Added class SignalHandler
+* Updated from global requirements
+* Activate pep8 check that _ is imported
+* Denote what happens when no exceptions are passed in
+* Allow LoopingCall to continue on exception in callee
+
+0.5.0
+-----
+
+* Updated from global requirements
+* Updated from global requirements
+* Updated from global requirements
+* Add oslo_debug_helper to tox.ini
+* Add usage documentation for oslo_service.service module
+
0.4.0
-----
* Updated from global requirements
+* save docstring, name etc using six.wraps
* Move backdoor-related tests from test_service
* Add mock to test_requirements
* Remove usage of mox in test_eventlet_backdoor
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/PKG-INFO new/oslo.service-0.7.0/PKG-INFO
--- old/oslo.service-0.4.0/PKG-INFO 2015-07-13 20:35:23.000000000 +0200
+++ new/oslo.service-0.7.0/PKG-INFO 2015-08-18 22:23:58.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: oslo.service
-Version: 0.4.0
+Version: 0.7.0
Summary: oslo.service library
Home-page: http://launchpad.net/oslo
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/doc/source/index.rst new/oslo.service-0.7.0/doc/source/index.rst
--- old/oslo.service-0.4.0/doc/source/index.rst 2015-07-13 20:34:55.000000000 +0200
+++ new/oslo.service-0.7.0/doc/source/index.rst 2015-08-18 22:23:15.000000000 +0200
@@ -5,7 +5,7 @@
Library for running OpenStack services
.. toctree::
- :maxdepth: 1
+ :maxdepth: 2
installation
usage
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/doc/source/usage.rst new/oslo.service-0.7.0/doc/source/usage.rst
--- old/oslo.service-0.4.0/doc/source/usage.rst 2015-07-13 20:34:55.000000000 +0200
+++ new/oslo.service-0.7.0/doc/source/usage.rst 2015-08-18 22:23:15.000000000 +0200
@@ -65,3 +65,96 @@
$ oslo-config-generator --namespace oslo.service.service \
--namespace oslo.service.periodic_task \
--namespace oslo.service.sslutils
+
+Launching and controlling services
+==================================
+
+oslo_service.service module provides tools for launching OpenStack services and controlling their lifecycles.
+
+A service is an instance of any class that subclasses :py:class:`oslo_service.service.ServiceBase`.
+:py:class:`ServiceBase ` is an abstract class that defines an interface every
+service should implement. :py:class:`oslo_service.service.Service` can serve as a base for constructing new services.
+
+Launchers
+~~~~~~~~~
+
+oslo_service.service module provides two launchers for running services:
+
+ * :py:class:`oslo_service.service.ServiceLauncher` - used for running one or more service in
+ a parent process.
+ * :py:class:`oslo_service.service.ProcessLauncher` - forks a given number of workers in which
+ service(s) are then started.
+
+It is possible to initialize whatever launcher is needed and then launch a service using it.
+
+::
+
+ from oslo_config import cfg
+ from oslo_service import service
+
+ CONF = cfg.CONF
+
+
+ service_launcher = service.ServiceLauncher(CONF)
+ service_launcher.launch_service(service.Service())
+
+ process_launcher = service.ProcessLauncher(CONF, wait_interval=1.0)
+ process_launcher.launch_service(service.Service(), workers=2)
+
+Or one can simply call :func:`oslo_service.service.launch` which will automatically pick an appropriate launcher
+based on a number of workers that are passed to it (ServiceLauncher in case workers=1 or None and ProcessLauncher in
+other case).
+
+::
+
+ from oslo_config import cfg
+ from oslo_service import service
+
+ CONF = cfg.CONF
+
+ launcher = service.launch(CONF, service.Service(), workers=3)
+
+*NOTE:* Please be informed that it is highly recommended to use no more than one instance of ServiceLauncher and
+ProcessLauncher classes per process.
+
+Signal handling
+~~~~~~~~~~~~~~~
+
+oslo_service.service provides handlers for such signals as SIGTERM, SIGINT and SIGHUP.
+
+SIGTERM is used for graceful termination of services. This can allow a server to wait for all clients to close
+connections while rejecting new incoming requests. To force instantaneous termination SIGINT signal must be sent.
+
+On receiving SIGHUP configuration files are reloaded and a service is being reset and started again.Thus, SIGHUP
+can be used for changing config options on the go. To achieve this each service should implement a *reset* method
+which actually enforces changes to config options values.
+
+*NOTE:* SIGHUP is not supported on Windows.
+
+Below is the example of a service with a reset method that allows reloading logging options by sending a SIGHUP.
+
+::
+
+ from oslo_config import cfg
+ from oslo_log import log as logging
+ from oslo_service import service
+
+ CONF = cfg.CONF
+
+ LOG = logging.getLogger(__name__)
+
+ class FooService(service.ServiceBase):
+
+ def start(self):
+ pass
+
+ def wait(self):
+ pass
+
+ def stop(self):
+ pass
+
+ def reset(self):
+ logging.setup(cfg.CONF, 'foo')
+
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo.service/locale/oslo.service-log-critical.pot new/oslo.service-0.7.0/oslo.service/locale/oslo.service-log-critical.pot
--- old/oslo.service-0.4.0/oslo.service/locale/oslo.service-log-critical.pot 1970-01-01 01:00:00.000000000 +0100
+++ new/oslo.service-0.7.0/oslo.service/locale/oslo.service-log-critical.pot 2015-08-18 22:23:15.000000000 +0200
@@ -0,0 +1,20 @@
+# Translations template for oslo.service.
+# Copyright (C) 2015 ORGANIZATION
+# This file is distributed under the same license as the oslo.service
+# project.
+# FIRST AUTHOR , 2015.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: oslo.service 0.6.1.dev6\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2015-08-09 07:32+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 1.3\n"
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo.service/locale/oslo.service-log-error.pot new/oslo.service-0.7.0/oslo.service/locale/oslo.service-log-error.pot
--- old/oslo.service-0.4.0/oslo.service/locale/oslo.service-log-error.pot 1970-01-01 01:00:00.000000000 +0100
+++ new/oslo.service-0.7.0/oslo.service/locale/oslo.service-log-error.pot 2015-08-18 22:23:15.000000000 +0200
@@ -0,0 +1,53 @@
+# Translations template for oslo.service.
+# Copyright (C) 2015 ORGANIZATION
+# This file is distributed under the same license as the oslo.service
+# project.
+# FIRST AUTHOR , 2015.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: oslo.service 0.6.1.dev6\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2015-08-09 07:32+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 1.3\n"
+
+#: oslo_service/loopingcall.py:56 oslo_service/loopingcall.py:124
+#, python-format
+msgid "%(kind)s %(func_name)r failed"
+msgstr ""
+
+#: oslo_service/loopingcall.py:237
+#, python-format
+msgid ""
+"Cannot retry upon suggested exception since retry count (%(retry_count)d)"
+" reached max retry count (%(max_retry_count)d)."
+msgstr ""
+
+#: oslo_service/periodic_task.py:222
+#, python-format
+msgid "Error during %(full_task_name)s"
+msgstr ""
+
+#: oslo_service/service.py:386
+msgid "Unhandled exception"
+msgstr ""
+
+#: oslo_service/threadgroup.py:111
+msgid "Error stopping thread."
+msgstr ""
+
+#: oslo_service/threadgroup.py:118
+msgid "Error stopping timer."
+msgstr ""
+
+#: oslo_service/threadgroup.py:145
+msgid "Error waiting on ThreadGroup."
+msgstr ""
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo.service/locale/oslo.service-log-info.pot new/oslo.service-0.7.0/oslo.service/locale/oslo.service-log-info.pot
--- old/oslo.service-0.4.0/oslo.service/locale/oslo.service-log-info.pot 1970-01-01 01:00:00.000000000 +0100
+++ new/oslo.service-0.7.0/oslo.service/locale/oslo.service-log-info.pot 2015-08-18 22:23:15.000000000 +0200
@@ -0,0 +1,91 @@
+# Translations template for oslo.service.
+# Copyright (C) 2015 ORGANIZATION
+# This file is distributed under the same license as the oslo.service
+# project.
+# FIRST AUTHOR , 2015.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: oslo.service 0.6.1.dev6\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2015-08-09 07:32+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 1.3\n"
+
+#: oslo_service/eventlet_backdoor.py:127
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr ""
+
+#: oslo_service/periodic_task.py:108
+#, python-format
+msgid "Skipping periodic task %(task)s because its interval is negative"
+msgstr ""
+
+#: oslo_service/periodic_task.py:113
+#, python-format
+msgid "Skipping periodic task %(task)s because it is disabled"
+msgstr ""
+
+#: oslo_service/service.py:262
+#, python-format
+msgid "Caught %s, exiting"
+msgstr ""
+
+#: oslo_service/service.py:336
+msgid "Caught SIGINT signal, instantaneous exiting"
+msgstr ""
+
+#: oslo_service/service.py:344
+msgid "Parent process has died unexpectedly, exiting"
+msgstr ""
+
+#: oslo_service/service.py:380
+#, python-format
+msgid "Child caught %s, exiting"
+msgstr ""
+
+#: oslo_service/service.py:417
+msgid "Forking too fast, sleeping"
+msgstr ""
+
+#: oslo_service/service.py:438
+#, python-format
+msgid "Started child %d"
+msgstr ""
+
+#: oslo_service/service.py:456
+#, python-format
+msgid "Starting %d workers"
+msgstr ""
+
+#: oslo_service/service.py:473
+#, python-format
+msgid "Child %(pid)d killed by signal %(sig)d"
+msgstr ""
+
+#: oslo_service/service.py:477
+#, python-format
+msgid "Child %(pid)s exited with status %(code)d"
+msgstr ""
+
+#: oslo_service/service.py:517
+#, python-format
+msgid "Caught %s, stopping children"
+msgstr ""
+
+#: oslo_service/service.py:532
+msgid "Wait called after thread killed. Cleaning up."
+msgstr ""
+
+#: oslo_service/service.py:555
+#, python-format
+msgid "Waiting on %d children to exit"
+msgstr ""
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo.service/locale/oslo.service-log-warning.pot new/oslo.service-0.7.0/oslo.service/locale/oslo.service-log-warning.pot
--- old/oslo.service-0.4.0/oslo.service/locale/oslo.service-log-warning.pot 1970-01-01 01:00:00.000000000 +0100
+++ new/oslo.service-0.7.0/oslo.service/locale/oslo.service-log-warning.pot 2015-08-18 22:23:15.000000000 +0200
@@ -0,0 +1,37 @@
+# Translations template for oslo.service.
+# Copyright (C) 2015 ORGANIZATION
+# This file is distributed under the same license as the oslo.service
+# project.
+# FIRST AUTHOR , 2015.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: oslo.service 0.6.1.dev6\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2015-08-09 07:32+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 1.3\n"
+
+#: oslo_service/loopingcall.py:147
+#, python-format
+msgid "Function %(func_name)r run outlasted interval by %(delay).2f sec"
+msgstr ""
+
+#: oslo_service/loopingcall.py:230
+#, python-format
+msgid ""
+"Exception which is in the suggested list of exceptions occurred while "
+"invoking function: %s."
+msgstr ""
+
+#: oslo_service/service.py:481
+#, python-format
+msgid "pid %d not in child list"
+msgstr ""
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo.service/locale/oslo.service.pot new/oslo.service-0.7.0/oslo.service/locale/oslo.service.pot
--- old/oslo.service-0.4.0/oslo.service/locale/oslo.service.pot 1970-01-01 01:00:00.000000000 +0100
+++ new/oslo.service-0.7.0/oslo.service/locale/oslo.service.pot 2015-08-18 22:23:15.000000000 +0200
@@ -0,0 +1,70 @@
+# Translations template for oslo.service.
+# Copyright (C) 2015 ORGANIZATION
+# This file is distributed under the same license as the oslo.service
+# project.
+# FIRST AUTHOR , 2015.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: oslo.service 0.6.1.dev6\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2015-08-09 07:32+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 1.3\n"
+
+#: oslo_service/loopingcall.py:65
+msgid "Unknown looping call"
+msgstr ""
+
+#: oslo_service/loopingcall.py:67
+msgid "A looping call can only run one function at a time"
+msgstr ""
+
+#: oslo_service/loopingcall.py:138
+msgid "A fixed interval looping call can only run one function at a time"
+msgstr ""
+
+#: oslo_service/loopingcall.py:141
+msgid "Fixed interval looping call"
+msgstr ""
+
+#: oslo_service/loopingcall.py:162
+msgid "A dynamic interval looping call can only run one function at a time"
+msgstr ""
+
+#: oslo_service/loopingcall.py:165
+msgid "Dynamic interval looping call"
+msgstr ""
+
+#: oslo_service/periodic_task.py:37
+#, python-format
+msgid "Unexpected argument for periodic task creation: %(arg)s."
+msgstr ""
+
+#: oslo_service/sslutils.py:39
+#, python-format
+msgid "Unable to find cert_file : %s"
+msgstr ""
+
+#: oslo_service/sslutils.py:42
+#, python-format
+msgid "Unable to find ca_file : %s"
+msgstr ""
+
+#: oslo_service/sslutils.py:45
+#, python-format
+msgid "Unable to find key_file : %s"
+msgstr ""
+
+#: oslo_service/sslutils.py:48
+msgid ""
+"When running server in SSL mode, you must specify both a cert_file and "
+"key_file option value in your configuration file"
+msgstr ""
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo.service.egg-info/PKG-INFO new/oslo.service-0.7.0/oslo.service.egg-info/PKG-INFO
--- old/oslo.service-0.4.0/oslo.service.egg-info/PKG-INFO 2015-07-13 20:35:22.000000000 +0200
+++ new/oslo.service-0.7.0/oslo.service.egg-info/PKG-INFO 2015-08-18 22:23:58.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: oslo.service
-Version: 0.4.0
+Version: 0.7.0
Summary: oslo.service library
Home-page: http://launchpad.net/oslo
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo.service.egg-info/SOURCES.txt new/oslo.service-0.7.0/oslo.service.egg-info/SOURCES.txt
--- old/oslo.service-0.4.0/oslo.service.egg-info/SOURCES.txt 2015-07-13 20:35:23.000000000 +0200
+++ new/oslo.service-0.7.0/oslo.service.egg-info/SOURCES.txt 2015-08-18 22:23:58.000000000 +0200
@@ -36,6 +36,11 @@
oslo.service.egg-info/pbr.json
oslo.service.egg-info/requires.txt
oslo.service.egg-info/top_level.txt
+oslo.service/locale/oslo.service-log-critical.pot
+oslo.service/locale/oslo.service-log-error.pot
+oslo.service/locale/oslo.service-log-info.pot
+oslo.service/locale/oslo.service-log-warning.pot
+oslo.service/locale/oslo.service.pot
oslo_service/__init__.py
oslo_service/_i18n.py
oslo_service/_options.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo.service.egg-info/pbr.json new/oslo.service-0.7.0/oslo.service.egg-info/pbr.json
--- old/oslo.service-0.4.0/oslo.service.egg-info/pbr.json 2015-07-13 20:35:22.000000000 +0200
+++ new/oslo.service-0.7.0/oslo.service.egg-info/pbr.json 2015-08-18 22:23:58.000000000 +0200
@@ -1 +1 @@
-{"is_release": true, "git_version": "355c3bb"}
\ No newline at end of file
+{"is_release": true, "git_version": "ae46422"}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo.service.egg-info/requires.txt new/oslo.service-0.7.0/oslo.service.egg-info/requires.txt
--- old/oslo.service-0.4.0/oslo.service.egg-info/requires.txt 2015-07-13 20:35:22.000000000 +0200
+++ new/oslo.service-0.7.0/oslo.service.egg-info/requires.txt 2015-08-18 22:23:58.000000000 +0200
@@ -1,8 +1,9 @@
Babel>=1.3
eventlet>=0.17.4
greenlet>=0.3.2
-monotonic>=0.1 # Apache-2.0
-oslo.utils>=1.6.0 # Apache-2.0
-oslo.config>=1.11.0 # Apache-2.0
+monotonic>=0.3 # Apache-2.0
+oslo.utils>=2.0.0 # Apache-2.0
+oslo.concurrency>=2.3.0 # Apache-2.0
+oslo.config>=2.1.0 # Apache-2.0
six>=1.9.0
oslo.i18n>=1.5.0 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo_service/loopingcall.py new/oslo.service-0.7.0/oslo_service/loopingcall.py
--- old/oslo.service-0.4.0/oslo_service/loopingcall.py 2015-07-13 20:34:55.000000000 +0200
+++ new/oslo.service-0.7.0/oslo_service/loopingcall.py 2015-08-18 22:23:15.000000000 +0200
@@ -21,7 +21,9 @@
from eventlet import event
from eventlet import greenthread
from oslo_utils import excutils
+from oslo_utils import reflection
from oslo_utils import timeutils
+import six
from oslo_service._i18n import _LE, _LW, _
@@ -45,6 +47,23 @@
self.retvalue = retvalue
+def _safe_wrapper(f, kind, func_name):
+ """Wrapper that calls into wrapped function and logs errors as needed."""
+
+ def func(*args, **kwargs):
+ try:
+ return f(*args, **kwargs)
+ except LoopingCallDone:
+ raise # let the outer handler process this
+ except Exception:
+ LOG.error(_LE('%(kind)s %(func_name)r failed'),
+ {'kind': kind, 'func_name': func_name},
+ exc_info=True)
+ return 0
+
+ return func
+
+
class LoopingCallBase(object):
_KIND = _("Unknown looping call")
@@ -69,33 +88,36 @@
self._thread = None
self._running = False
- def _start(self, idle_for, initial_delay=None):
+ def _start(self, idle_for, initial_delay=None, stop_on_exception=True):
if self._thread is not None:
raise RuntimeError(self._RUN_ONLY_ONE_MESSAGE)
self._running = True
self.done = event.Event()
self._thread = greenthread.spawn(
self._run_loop, self._KIND, self.done, idle_for,
- initial_delay=initial_delay)
+ initial_delay=initial_delay, stop_on_exception=stop_on_exception)
self._thread.link(self._on_done)
return self.done
def _run_loop(self, kind, event, idle_for_func,
- initial_delay=None):
+ initial_delay=None, stop_on_exception=True):
+ func_name = reflection.get_callable_name(self.f)
+ func = self.f if stop_on_exception else _safe_wrapper(self.f, kind,
+ func_name)
if initial_delay:
greenthread.sleep(initial_delay)
try:
watch = timeutils.StopWatch()
while self._running:
watch.restart()
- result = self.f(*self.args, **self.kw)
+ result = func(*self.args, **self.kw)
watch.stop()
if not self._running:
break
idle = idle_for_func(result, watch.elapsed())
LOG.debug('%(kind)s %(func_name)r sleeping '
'for %(idle).02f seconds',
- {'func_name': self.f, 'idle': idle,
+ {'func_name': func_name, 'idle': idle,
'kind': kind})
greenthread.sleep(idle)
except LoopingCallDone as e:
@@ -104,7 +126,7 @@
exc_info = sys.exc_info()
try:
LOG.error(_LE('%(kind)s %(func_name)r failed'),
- {'kind': kind, 'func_name': self.f},
+ {'kind': kind, 'func_name': func_name},
exc_info=exc_info)
event.send_exception(*exc_info)
finally:
@@ -122,15 +144,17 @@
_KIND = _('Fixed interval looping call')
- def start(self, interval, initial_delay=None):
+ def start(self, interval, initial_delay=None, stop_on_exception=True):
def _idle_for(result, elapsed):
delay = elapsed - interval
if delay > 0:
+ func_name = reflection.get_callable_name(self.f)
LOG.warning(_LW('Function %(func_name)r run outlasted '
'interval by %(delay).2f sec'),
- {'func_name': self.f, 'delay': delay})
+ {'func_name': func_name, 'delay': delay})
return -delay if delay < 0 else 0
- return self._start(_idle_for, initial_delay=initial_delay)
+ return self._start(_idle_for, initial_delay=initial_delay,
+ stop_on_exception=stop_on_exception)
class DynamicLoopingCall(LoopingCallBase):
@@ -145,13 +169,15 @@
_KIND = _('Dynamic interval looping call')
- def start(self, initial_delay=None, periodic_interval_max=None):
+ def start(self, initial_delay=None, periodic_interval_max=None,
+ stop_on_exception=True):
def _idle_for(suggested_delay, elapsed):
delay = suggested_delay
if periodic_interval_max is not None:
delay = min(delay, periodic_interval_max)
return delay
- return self._start(_idle_for, initial_delay=initial_delay)
+ return self._start(_idle_for, initial_delay=initial_delay,
+ stop_on_exception=stop_on_exception)
class RetryDecorator(object):
@@ -181,7 +207,9 @@
inc_sleep_time. On reaching this threshold,
max_sleep_time will be used as the sleep time.
:param exceptions: suggested exceptions for which the function must be
- retried
+ retried, if no exceptions are provided (the default)
+ then all exceptions will be reraised, and no
+ retrying will be triggered.
"""
self._max_retry_count = max_retry_count
self._inc_sleep_time = inc_sleep_time
@@ -191,9 +219,9 @@
self._sleep_time = 0
def __call__(self, f):
+ func_name = reflection.get_callable_name(f)
def _func(*args, **kwargs):
- func_name = f.__name__
result = None
try:
if self._retry_count:
@@ -211,12 +239,14 @@
exc_info=True)
if (self._max_retry_count != -1 and
self._retry_count >= self._max_retry_count):
- LOG.error(_LE("Cannot retry upon suggested exception "
+ LOG.error(_LE("Cannot retry %(func_name)s upon "
+ "suggested exception "
"since retry count (%(retry_count)d) "
"reached max retry count "
"(%(max_retry_count)d)."),
{'retry_count': self._retry_count,
- 'max_retry_count': self._max_retry_count})
+ 'max_retry_count': self._max_retry_count,
+ 'func_name': func_name})
else:
ctxt.reraise = False
self._retry_count += 1
@@ -224,10 +254,11 @@
return self._sleep_time
raise LoopingCallDone(result)
+ @six.wraps(f)
def func(*args, **kwargs):
loop = DynamicLoopingCall(_func, *args, **kwargs)
evt = loop.start(periodic_interval_max=self._max_sleep_time)
- LOG.debug("Waiting for function %s to return.", f.__name__)
+ LOG.debug("Waiting for function %s to return.", func_name)
return evt.wait()
return func
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo_service/service.py new/oslo.service-0.7.0/oslo_service/service.py
--- old/oslo.service-0.4.0/oslo_service/service.py 2015-07-13 20:34:55.000000000 +0200
+++ new/oslo.service-0.7.0/oslo_service/service.py 2015-08-18 22:23:15.000000000 +0200
@@ -15,20 +15,10 @@
# License for the specific language governing permissions and limitations
# under the License.
-"""Generic Node base class for all workers that run on hosts.
-
-This module provides two launchers for running services:
-
- * ServiceLauncher - used for running one or more service in
- a parent process.
- * ProcessLauncher - forks a given number of workers in which
- service(s) are then started.
-
-Please be informed that it is highly recommended to use no more than
-one instance of ServiceLauncher and ProcessLauncher classes per process.
-"""
+"""Generic Node base class for all workers that run on hosts."""
import abc
+import collections
import copy
import errno
import io
@@ -43,6 +33,7 @@
import eventlet
from eventlet import event
+from oslo_concurrency import lockutils
from oslo_service import eventlet_backdoor
from oslo_service._i18n import _LE, _LI, _LW
from oslo_service import _options
@@ -50,17 +41,6 @@
from oslo_service import threadgroup
-# Map all signal names to signal integer values and create a
-# reverse mapping (for easier + quick lookup).
-_ignore_signals = ('SIG_DFL', 'SIG_IGN')
-_signals_by_name = dict((name, getattr(signal, name))
- for name in dir(signal)
- if name.startswith("SIG")
- and name not in _ignore_signals)
-_signals_to_name = dict((sigval, name)
- for (name, sigval) in _signals_by_name.items())
-
-
LOG = logging.getLogger(__name__)
@@ -70,10 +50,6 @@
_options.service_opts))]
-def _sighup_supported():
- return 'SIGHUP' in _signals_by_name
-
-
def _is_daemon():
# The process group for a foreground process will match the
# process group of the controlling terminal. If those values do
@@ -95,19 +71,13 @@
def _is_sighup_and_daemon(signo):
- if not (_sighup_supported() and signo == signal.SIGHUP):
+ if not (SignalHandler().is_sighup_supported and signo == signal.SIGHUP):
# Avoid checking if we are a daemon, because the signal isn't
# SIGHUP.
return False
return _is_daemon()
-def _set_signals_handler(handler):
- signal.signal(signal.SIGTERM, handler)
- if _sighup_supported():
- signal.signal(signal.SIGHUP, handler)
-
-
def _check_service_base(service):
if not isinstance(service, ServiceBase):
raise TypeError("Service %(service)s must an instance of %(base)s!"
@@ -138,6 +108,58 @@
"""
+class Singleton(type):
+ _instances = {}
+ _semaphores = lockutils.Semaphores()
+
+ def __call__(cls, *args, **kwargs):
+ with lockutils.lock('singleton_lock', semaphores=cls._semaphores):
+ if cls not in cls._instances:
+ cls._instances[cls] = super(Singleton, cls).__call__(
+ *args, **kwargs)
+ return cls._instances[cls]
+
+
+@six.add_metaclass(Singleton)
+class SignalHandler(object):
+
+ def __init__(self, *args, **kwargs):
+ super(SignalHandler, self).__init__(*args, **kwargs)
+ # Map all signal names to signal integer values and create a
+ # reverse mapping (for easier + quick lookup).
+ self._ignore_signals = ('SIG_DFL', 'SIG_IGN')
+ self._signals_by_name = dict((name, getattr(signal, name))
+ for name in dir(signal)
+ if name.startswith("SIG")
+ and name not in self._ignore_signals)
+ self.signals_to_name = dict(
+ (sigval, name)
+ for (name, sigval) in self._signals_by_name.items())
+ self.is_sighup_supported = 'SIGHUP' in self._signals_by_name
+ self._signal_handlers = collections.defaultdict(set)
+ self.clear()
+
+ def clear(self):
+ for sig in self._signal_handlers:
+ signal.signal(sig, signal.SIG_DFL)
+ self._signal_handlers.clear()
+
+ def add_handlers(self, signals, handler):
+ for sig in signals:
+ self.add_handler(sig, handler)
+
+ def add_handler(self, sig, handler):
+ if sig == "SIGHUP" and not self.is_sighup_supported:
+ return
+ signo = self._signals_by_name[sig]
+ self._signal_handlers[signo].add(handler)
+ signal.signal(signo, self._handle_signals)
+
+ def _handle_signals(self, signo, frame):
+ for handler in self._signal_handlers[signo]:
+ handler(signo, frame)
+
+
class Launcher(object):
"""Launch one or more services and wait for them to complete."""
@@ -214,12 +236,14 @@
:raises SignalExit
"""
# Allow the process to be killed again and die from natural causes
- _set_signals_handler(signal.SIG_DFL)
+ SignalHandler().clear()
raise SignalExit(signo)
def handle_signal(self):
"""Set self._handle_signal as a signal handler."""
- _set_signals_handler(self._handle_signal)
+ SignalHandler().add_handlers(
+ ('SIGTERM', 'SIGHUP', 'SIGINT'),
+ self._handle_signal)
def _wait_for_exit_or_signal(self, ready_callback=None):
status = None
@@ -234,7 +258,7 @@
ready_callback()
super(ServiceLauncher, self).wait()
except SignalExit as exc:
- signame = _signals_to_name[exc.signo]
+ signame = SignalHandler().signals_to_name[exc.signo]
LOG.info(_LI('Caught %s, exiting'), signame)
status = exc.code
signo = exc.signo
@@ -251,6 +275,7 @@
:returns: termination status
"""
systemd.notify_once()
+ SignalHandler().clear()
while True:
self.handle_signal()
status, signo = self._wait_for_exit_or_signal(ready_callback)
@@ -269,17 +294,6 @@
class ProcessLauncher(object):
"""Launch a service with a given number of workers."""
- _signal_handlers_set = set()
-
- @classmethod
- def _handle_class_signals(cls, *args, **kwargs):
- """Call all registered class handlers.
-
- That is needed in case there are multiple ProcessLauncher
- instances in one process.
- """
- for handler in cls._signal_handlers_set:
- handler(*args, **kwargs)
def __init__(self, conf, wait_interval=0.01):
"""Constructor.
@@ -297,12 +311,14 @@
self.launcher = None
rfd, self.writepipe = os.pipe()
self.readpipe = eventlet.greenio.GreenPipe(rfd, 'r')
+ self.signal_handler = SignalHandler()
self.handle_signal()
def handle_signal(self):
"""Add instance's signal handlers to class handlers."""
- self._signal_handlers_set.add(self._handle_signal)
- _set_signals_handler(self._handle_class_signals)
+ self.signal_handler.add_handlers(('SIGTERM', 'SIGHUP'),
+ self._handle_signal)
+ self.signal_handler.add_handler('SIGINT', self._fast_exit)
def _handle_signal(self, signo, frame):
"""Set signal handlers.
@@ -314,7 +330,11 @@
self.running = False
# Allow the process to be killed again and die from natural causes
- _set_signals_handler(signal.SIG_DFL)
+ self.signal_handler.clear()
+
+ def _fast_exit(self, signo, frame):
+ LOG.info(_LI('Caught SIGINT signal, instantaneous exiting'))
+ os._exit(1)
def _pipe_watcher(self):
# This will block until the write end is closed when the parent
@@ -332,17 +352,19 @@
# Setup child signal handlers differently
def _sigterm(*args):
- signal.signal(signal.SIGTERM, signal.SIG_DFL)
+ SignalHandler().clear()
self.launcher.stop()
def _sighup(*args):
- signal.signal(signal.SIGHUP, signal.SIG_DFL)
+ SignalHandler().clear()
raise SignalExit(signal.SIGHUP)
+ self.signal_handler.clear()
+
# Parent signals with SIGTERM when it wants us to go away.
- signal.signal(signal.SIGTERM, _sigterm)
- if _sighup_supported():
- signal.signal(signal.SIGHUP, _sighup)
+ self.signal_handler.add_handler('SIGTERM', _sigterm)
+ self.signal_handler.add_handler('SIGHUP', _sighup)
+ self.signal_handler.add_handler('SIGINT', self._fast_exit)
def _child_wait_for_exit_or_signal(self, launcher):
status = 0
@@ -354,7 +376,7 @@
try:
launcher.wait()
except SignalExit as exc:
- signame = _signals_to_name[exc.signo]
+ signame = self.signal_handler.signals_to_name[exc.signo]
LOG.info(_LI('Child caught %s, exiting'), signame)
status = exc.code
signo = exc.signo
@@ -491,7 +513,7 @@
if not self.sigcaught:
return
- signame = _signals_to_name[self.sigcaught]
+ signame = self.signal_handler.signals_to_name[self.sigcaught]
LOG.info(_LI('Caught %s, stopping children'), signame)
if not _is_sighup_and_daemon(self.sigcaught):
break
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo_service/systemd.py new/oslo.service-0.7.0/oslo_service/systemd.py
--- old/oslo.service-0.4.0/oslo_service/systemd.py 2015-07-13 20:34:55.000000000 +0200
+++ new/oslo.service-0.7.0/oslo_service/systemd.py 2015-08-18 22:23:15.000000000 +0200
@@ -16,6 +16,7 @@
Helper module for systemd service readiness notification.
"""
+import contextlib
import logging
import os
import socket
@@ -36,15 +37,14 @@
notify_socket = os.getenv('NOTIFY_SOCKET')
if notify_socket:
sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
- try:
- sock.connect(_abstractify(notify_socket))
- sock.sendall(msg)
- if unset_env:
- del os.environ['NOTIFY_SOCKET']
- except EnvironmentError:
- LOG.debug("Systemd notification failed", exc_info=True)
- finally:
- sock.close()
+ with contextlib.closing(sock):
+ try:
+ sock.connect(_abstractify(notify_socket))
+ sock.sendall(msg)
+ if unset_env:
+ del os.environ['NOTIFY_SOCKET']
+ except EnvironmentError:
+ LOG.debug("Systemd notification failed", exc_info=True)
def notify():
@@ -81,16 +81,15 @@
sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
sock.settimeout(timeout)
sock.bind(_abstractify(notify_socket))
- try:
- msg = sock.recv(512)
- except socket.timeout:
- return 2
- finally:
- sock.close()
- if 'READY=1' in msg:
- return 0
- else:
- return 1
+ with contextlib.closing(sock):
+ try:
+ msg = sock.recv(512)
+ except socket.timeout:
+ return 2
+ if 'READY=1' in msg:
+ return 0
+ else:
+ return 1
if __name__ == '__main__':
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo_service/tests/test_loopingcall.py new/oslo.service-0.7.0/oslo_service/tests/test_loopingcall.py
--- old/oslo.service-0.4.0/oslo_service/tests/test_loopingcall.py 2015-07-13 20:34:55.000000000 +0200
+++ new/oslo.service-0.7.0/oslo_service/tests/test_loopingcall.py 2015-08-18 22:23:15.000000000 +0200
@@ -46,6 +46,20 @@
timer = loopingcall.FixedIntervalLoopingCall(_raise_it)
self.assertRaises(RuntimeError, timer.start(interval=0.5).wait)
+ def _raise_and_then_done(self):
+ if self.num_runs == 0:
+ raise loopingcall.LoopingCallDone(False)
+ else:
+ self.num_runs = self.num_runs - 1
+ raise RuntimeError()
+
+ def test_do_not_stop_on_exception(self):
+ self.num_runs = 2
+
+ timer = loopingcall.FixedIntervalLoopingCall(self._raise_and_then_done)
+ res = timer.start(interval=0.5, stop_on_exception=False).wait()
+ self.assertFalse(res)
+
def _wait_for_zero(self):
"""Called at an interval until num_runs == 0."""
if self.num_runs == 0:
@@ -150,6 +164,19 @@
timer = loopingcall.DynamicLoopingCall(_raise_it)
self.assertRaises(RuntimeError, timer.start().wait)
+ def _raise_and_then_done(self):
+ if self.num_runs == 0:
+ raise loopingcall.LoopingCallDone(False)
+ else:
+ self.num_runs = self.num_runs - 1
+ raise RuntimeError()
+
+ def test_do_not_stop_on_exception(self):
+ self.num_runs = 2
+
+ timer = loopingcall.DynamicLoopingCall(self._raise_and_then_done)
+ timer.start(stop_on_exception=False).wait()
+
def _wait_for_zero(self):
"""Called at an interval until num_runs == 0."""
if self.num_runs == 0:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/oslo_service/tests/test_service.py new/oslo.service-0.7.0/oslo_service/tests/test_service.py
--- old/oslo.service-0.4.0/oslo_service/tests/test_service.py 2015-07-13 20:34:55.000000000 +0200
+++ new/oslo.service-0.7.0/oslo_service/tests/test_service.py 2015-08-18 22:23:15.000000000 +0200
@@ -370,28 +370,20 @@
mock_kill.mock_calls)
mock_service_stop.assert_called_once_with()
- @mock.patch(
- "oslo_service.service.ProcessLauncher._signal_handlers_set",
- new_callable=lambda: set())
- def test__signal_handlers_set(self, signal_handlers_set_mock):
- callables = set()
- l1 = service.ProcessLauncher(self.conf)
- callables.add(l1._handle_signal)
- self.assertEqual(1, len(service.ProcessLauncher._signal_handlers_set))
- l2 = service.ProcessLauncher(self.conf)
- callables.add(l2._handle_signal)
- self.assertEqual(2, len(service.ProcessLauncher._signal_handlers_set))
- self.assertEqual(callables,
- service.ProcessLauncher._signal_handlers_set)
-
- @mock.patch(
- "oslo_service.service.ProcessLauncher._signal_handlers_set",
- new_callable=lambda: set())
- def test__handle_class_signals(self, signal_handlers_set_mock):
- signal_handlers_set_mock.update([mock.Mock(), mock.Mock()])
- service.ProcessLauncher._handle_class_signals()
- for m in service.ProcessLauncher._signal_handlers_set:
- m.assert_called_once_with()
+ def test__handle_signals(self):
+ signal_handler = service.SignalHandler()
+ signal_handler.clear()
+ self.assertEqual(0,
+ len(signal_handler._signal_handlers[signal.SIGTERM]))
+ call_1, call_2 = mock.Mock(), mock.Mock()
+ signal_handler.add_handler('SIGTERM', call_1)
+ signal_handler.add_handler('SIGTERM', call_2)
+ self.assertEqual(2,
+ len(signal_handler._signal_handlers[signal.SIGTERM]))
+ signal_handler._handle_signals(signal.SIGTERM, 'test')
+ for m in signal_handler._signal_handlers[signal.SIGTERM]:
+ m.assert_called_once_with(signal.SIGTERM, 'test')
+ signal_handler.clear()
@mock.patch("os.kill")
@mock.patch("oslo_service.service.ProcessLauncher.stop")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/requirements.txt new/oslo.service-0.7.0/requirements.txt
--- old/oslo.service-0.4.0/requirements.txt 2015-07-13 20:34:55.000000000 +0200
+++ new/oslo.service-0.7.0/requirements.txt 2015-08-18 22:23:15.000000000 +0200
@@ -5,8 +5,9 @@
Babel>=1.3
eventlet>=0.17.4
greenlet>=0.3.2
-monotonic>=0.1 # Apache-2.0
-oslo.utils>=1.6.0 # Apache-2.0
-oslo.config>=1.11.0 # Apache-2.0
+monotonic>=0.3 # Apache-2.0
+oslo.utils>=2.0.0 # Apache-2.0
+oslo.concurrency>=2.3.0 # Apache-2.0
+oslo.config>=2.1.0 # Apache-2.0
six>=1.9.0
oslo.i18n>=1.5.0 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/setup.cfg new/oslo.service-0.7.0/setup.cfg
--- old/oslo.service-0.4.0/setup.cfg 2015-07-13 20:35:23.000000000 +0200
+++ new/oslo.service-0.7.0/setup.cfg 2015-08-18 22:23:58.000000000 +0200
@@ -59,7 +59,7 @@
universal = true
[egg_info]
-tag_build =
-tag_date = 0
tag_svn_revision = 0
+tag_date = 0
+tag_build =
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/setup.py new/oslo.service-0.7.0/setup.py
--- old/oslo.service-0.4.0/setup.py 2015-07-13 20:34:55.000000000 +0200
+++ new/oslo.service-0.7.0/setup.py 2015-08-18 22:23:15.000000000 +0200
@@ -25,5 +25,5 @@
pass
setuptools.setup(
- setup_requires=['pbr'],
+ setup_requires=['pbr>=1.3'],
pbr=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/test-requirements.txt new/oslo.service-0.7.0/test-requirements.txt
--- old/oslo.service-0.4.0/test-requirements.txt 2015-07-13 20:34:55.000000000 +0200
+++ new/oslo.service-0.7.0/test-requirements.txt 2015-08-18 22:23:15.000000000 +0200
@@ -3,9 +3,8 @@
# process, which may cause wedges in the gate later.
hacking<0.11,>=0.10.0
-mock>=1.1;python_version!='2.6'
-mock==1.0.1;python_version=='2.6'
-oslotest>=1.5.1 # Apache-2.0
+mock>=1.2
+oslotest>=1.10.0 # Apache-2.0
# These are needed for docs generation
oslosphinx>=2.5.0 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.service-0.4.0/tox.ini new/oslo.service-0.7.0/tox.ini
--- old/oslo.service-0.4.0/tox.ini 2015-07-13 20:34:55.000000000 +0200
+++ new/oslo.service-0.7.0/tox.ini 2015-08-18 22:23:15.000000000 +0200
@@ -33,7 +33,6 @@
show-source = True
ignore = E123,E125
-builtins = _
exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build
[hacking]
@@ -45,4 +44,7 @@
# this also means that pip-missing-reqs must be installed separately, outside
# of the requirements.txt files
deps = pip_missing_reqs
-commands = pip-missing-reqs -d --ignore-module=oslo_service* --ignore-module=pkg_resources --ignore-file=oslo_service/tests/* oslo_service
\ No newline at end of file
+commands = pip-missing-reqs -d --ignore-module=oslo_service* --ignore-module=pkg_resources --ignore-file=oslo_service/tests/* oslo_service
+
+[testenv:debug]
+commands = oslo_debug_helper -t oslo_service/tests {posargs}