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}