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 - tbecht...@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 - tbecht...@suse.com
+
+- Unify spec file. Use fedora compatible files macros
+
+-------------------------------------------------------------------
+Tue Jul 28 12:42:16 UTC 2015 - tbecht...@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.gay...@gmail.com>
 Alex Holden <a...@alexjonasholden.com>
 Alexander Gorodnev <agorod...@mirantis.com>
+Andreas Jaeger <a...@suse.de>
 Angus Salkeld <asalk...@redhat.com>
 Ann Kamyshnikova <akamyshnik...@mirantis.com>
 Ben Nemec <bne...@redhat.com>
@@ -38,6 +39,7 @@
 Ian Wienand <iwien...@redhat.com>
 Ihar Hrachyshka <ihrac...@redhat.com>
 Ilya Shakhat <ishak...@mirantis.com>
+James Carey <jeca...@us.ibm.com>
 Jason Dunsmore <jasondunsm...@gmail.com>
 Jason Kölker <ja...@koelker.net>
 Jay Pipes <jaypi...@gmail.com>
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 <oslo_service.service.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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <l...@li.org>\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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <l...@li.org>\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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <l...@li.org>\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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <l...@li.org>\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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <l...@li.org>\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}


Reply via email to