Hello community,

here is the log from the commit of package python-os-client-config for 
openSUSE:Factory checked in at 2018-02-14 10:51:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-os-client-config (Old)
 and      /work/SRC/openSUSE:Factory/.python-os-client-config.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-os-client-config"

Wed Feb 14 10:51:14 2018 rev:9 rq:576033 version:1.29.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-os-client-config/python-os-client-config.changes
  2018-01-16 09:41:57.682838306 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-os-client-config.new/python-os-client-config.changes
     2018-02-14 10:51:15.226478999 +0100
@@ -1,0 +2,28 @@
+Tue Feb 13 10:08:06 UTC 2018 - cloud-de...@suse.de
+
+- update to version 1.29.0
+  - Update make_rest_client to work with version discovery
+  - Update globals safely
+  - Protect against p_opt not having prompt attribute
+  - Split docs requirements and update tox.ini
+  - Fix doc typo
+  - Add shade-tox-tips jobs
+  - Make the get_service_type() overrides tolernat of no defaults
+  - Remove osc devstack tips jobs
+  - Do not apply format expansions to passwords
+  - Add shade-functional-tips jobs
+  - Update the documentation link for doc migration
+  - Updates for stestr
+  - Manually sync with g-r
+  - Fix requires_floating_ip
+  - Treat clouds.yaml with one cloud like envvars
+  - DataCentred supports Keystone V3 and Glance V2.
+  - Add betacloud to the vendors
+  - Consume the osc-functional-devstack-tips job
+  - Update reno for stable/pike
+  - Remove setting of version/release from releasenotes
+  - Remove OSIC
+  - Updated from global requirements
+  - Added nat_source flag for networks.
+
+-------------------------------------------------------------------

Old:
----
  os-client-config-1.28.0.tar.gz

New:
----
  os-client-config-1.29.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-os-client-config.spec ++++++
--- /var/tmp/diff_new_pack.XGHAw9/_old  2018-02-14 10:51:15.842456831 +0100
+++ /var/tmp/diff_new_pack.XGHAw9/_new  2018-02-14 10:51:15.846456686 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-os-client-config
 #
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -20,7 +20,7 @@
 %bcond_with test
 %bcond_with docs
 Name:           python-os-client-config
-Version:        1.28.0
+Version:        1.29.0
 Release:        0
 Summary:        OpenStack Client Configuration Library
 License:        Apache-2.0
@@ -34,23 +34,23 @@
 BuildRequires:  python3-devel
 BuildRequires:  python3-pbr >= 2.0.0
 BuildRequires:  python3-setuptools >= 16.0
-Requires:       python-PyYAML >= 3.1.0
+Requires:       python-PyYAML >= 3.10
 Requires:       python-appdirs >= 1.3.0
-Requires:       python-keystoneauth1 >= 2.1.0
-Requires:       python-requestsexceptions >= 1.1.1
+Requires:       python-keystoneauth1 >= 3.3.0
+Requires:       python-requestsexceptions >= 1.2.0
 BuildArch:      noarch
 %if %{with test}
-BuildRequires:  python-extras
+BuildRequires:  python-extras >= 1.0.0
 BuildRequires:  python-fixtures >= 3.0.0
-BuildRequires:  python-glanceclient >= 2.7.0
-BuildRequires:  python-jsonschema >= 2.0.0
+BuildRequires:  python-glanceclient >= 2.8.0
+BuildRequires:  python-jsonschema >= 2.6.0
 BuildRequires:  python-keystoneclient >= 3.8.0
-BuildRequires:  python-mock >= 2.0
-BuildRequires:  python-oslotest >= 1.10.0
-BuildRequires:  python-python-subunit >= 0.0.18
+BuildRequires:  python-mock >= 2.0.0
+BuildRequires:  python-oslotest >= 3.2.0
+BuildRequires:  python-python-subunit >= 1.0.0
 BuildRequires:  python-testrepository >= 0.0.18
 BuildRequires:  python-testscenarios >= 0.4
-BuildRequires:  python-testtools >= 1.4.0
+BuildRequires:  python-testtools >= 2.2.0
 %endif
 %python_subpackages
 
@@ -67,8 +67,8 @@
 Summary:        Documentation for OpenStack client configuration library
 Group:          Development/Languages/Python
 BuildRequires:  python-Sphinx
-BuildRequires:  python-oslosphinx >= 4.7.0
-BuildRequires:  python-reno >= 1.8.0
+BuildRequires:  python-openstackdocstheme >= 1.17.0
+BuildRequires:  python-reno >= 2.5.0
 
 %description -n python-os-client-config-doc
 Documentation for the os-client-config library.
@@ -77,6 +77,7 @@
 %prep
 %autosetup -n %{sname}-%{version}
 %py_req_cleanup
+sed -i 's/^warning-is-error.*/warning-is-error = 0/g' setup.cfg
 
 %build
 %python_build

++++++ os-client-config-1.28.0.tar.gz -> os-client-config-1.29.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/.stestr.conf 
new/os-client-config-1.29.0/.stestr.conf
--- old/os-client-config-1.28.0/.stestr.conf    1970-01-01 01:00:00.000000000 
+0100
+++ new/os-client-config-1.29.0/.stestr.conf    2018-02-01 15:29:39.000000000 
+0100
@@ -0,0 +1,3 @@
+[DEFAULT]
+test_path=.
+top_dir=./
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/.testr.conf 
new/os-client-config-1.29.0/.testr.conf
--- old/os-client-config-1.28.0/.testr.conf     2017-07-10 21:28:35.000000000 
+0200
+++ new/os-client-config-1.29.0/.testr.conf     1970-01-01 01:00:00.000000000 
+0100
@@ -1,7 +0,0 @@
-[DEFAULT]
-test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \
-             OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \
-             OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-60} \
-             ${PYTHON:-python} -m subunit.run discover -t ./ . $LISTOPT 
$IDOPTION
-test_id_option=--load-list $IDFILE
-test_list_option=--list
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/.zuul.yaml 
new/os-client-config-1.29.0/.zuul.yaml
--- old/os-client-config-1.28.0/.zuul.yaml      1970-01-01 01:00:00.000000000 
+0100
+++ new/os-client-config-1.29.0/.zuul.yaml      2018-02-01 15:29:39.000000000 
+0100
@@ -0,0 +1,5 @@
+- project:
+    name: openstack/os-client-config
+    templates:
+      - shade-functional-tips
+      - shade-tox-tips
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/AUTHORS 
new/os-client-config-1.29.0/AUTHORS
--- old/os-client-config-1.28.0/AUTHORS 2017-07-10 21:30:51.000000000 +0200
+++ new/os-client-config-1.29.0/AUTHORS 2018-02-01 15:33:09.000000000 +0100
@@ -8,6 +8,7 @@
 Cedric Brandily <zze...@gmail.com>
 ChangBo Guo(gcb) <eric....@easystack.cn>
 Chris Church <ch...@ninemoreminutes.com>
+Christian Berendt <bere...@betacloud-solutions.de>
 Clark Boylan <clark.boy...@gmail.com>
 Clint Byrum <cl...@fewbar.com>
 Colleen Murphy <coll...@gazlene.net>
@@ -15,6 +16,7 @@
 Davide Guerri <davide.gue...@gmail.com>
 Dean Troyer <dtro...@gmail.com>
 Dean Troyer <dtro...@users.noreply.github.com>
+Dirk Mueller <d...@dmllr.de>
 Doug Hellmann <d...@doughellmann.com>
 Doug Wiegley <d...@parksidesoftware.com>
 Eric Harney <ehar...@redhat.com>
@@ -27,7 +29,9 @@
 Javier Pena <jp...@redhat.com>
 Jeremy Stanley <fu...@yuggoth.org>
 Jim Rollenhagen <j...@jimrollenhagen.com>
+John Dennis <jden...@redhat.com>
 Jordan Pittier <jordan.pitt...@scality.com>
+Joshua Harlow <jxhar...@godaddy.com>
 Julia Kreger <juliaashleykre...@gmail.com>
 LiuNanke <nanke....@easystack.cn>
 Mathieu Gagné <mga...@iweb.com>
@@ -36,6 +40,7 @@
 Monty Taylor <mord...@inaugust.com>
 OpenStack Release Bot <infra-r...@openstack.org>
 Paulo Matias <mat...@ufscar.br>
+Sean Handley <sean.hand...@gmail.com>
 Shuquan Huang <huang.shuq...@99cloud.net>
 Simon Leinen <simon.lei...@switch.ch>
 Spencer Krum <n...@spencerkrum.com>
@@ -48,7 +53,9 @@
 Xav Paice <x...@catalyst.net.nz>
 Yaguang Tang <yagu...@umcloud.com>
 Yuriy Taraday <yorik....@gmail.com>
+Zuul <z...@review.openstack.org>
 avnish <avnish....@nectechnologies.in>
 lifeless <robe...@robertcollins.net>
+lingyongxu <l...@fiberhome.com>
 ricolin <rico....@easystack.cn>
 xhzhf <guoyongxh...@163.com>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/ChangeLog 
new/os-client-config-1.29.0/ChangeLog
--- old/os-client-config-1.28.0/ChangeLog       2017-07-10 21:30:51.000000000 
+0200
+++ new/os-client-config-1.29.0/ChangeLog       2018-02-01 15:33:09.000000000 
+0100
@@ -1,6 +1,40 @@
 CHANGES
 =======
 
+1.29.0
+------
+
+* Updated from global requirements
+* Split docs requirements and update tox.ini
+* Add betacloud to the vendors
+* Make the get\_service\_type() overrides tolernat of no defaults
+* Remove osc devstack tips jobs
+* Do not apply format expansions to passwords
+* Updated from global requirements
+* Remove setting of version/release from releasenotes
+* Add shade-functional-tips jobs
+* Consume the osc-functional-devstack-tips job
+* Fix doc typo
+* Added nat\_source flag for networks
+* Add shade-tox-tips jobs
+* Update make\_rest\_client to work with version discovery
+* Protect against p\_opt not having prompt attribute
+* Treat clouds.yaml with one cloud like envvars
+* Updated from global requirements
+* Fix requires\_floating\_ip
+* Updates for stestr
+* Updated from global requirements
+* Updated from global requirements
+* Updated from global requirements
+* Updated from global requirements
+* DataCentred supports Keystone V3 and Glance V2
+* Update globals safely
+* Update the documentation link for doc migration
+* Remove OSIC
+* Update reno for stable/pike
+* Updated from global requirements
+* Manually sync with g-r
+
 1.28.0
 ------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/HACKING.rst 
new/os-client-config-1.29.0/HACKING.rst
--- old/os-client-config-1.28.0/HACKING.rst     2017-07-10 21:28:35.000000000 
+0200
+++ new/os-client-config-1.29.0/HACKING.rst     2018-02-01 15:29:39.000000000 
+0100
@@ -1,4 +1,4 @@
 os-client-config Style Commandments
 ===============================================
 
-Read the OpenStack Style Commandments 
http://docs.openstack.org/developer/hacking/
\ No newline at end of file
+Read the OpenStack Style Commandments https://docs.openstack.org/hacking/latest
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/PKG-INFO 
new/os-client-config-1.29.0/PKG-INFO
--- old/os-client-config-1.28.0/PKG-INFO        2017-07-10 21:30:52.000000000 
+0200
+++ new/os-client-config-1.29.0/PKG-INFO        2018-02-01 15:33:10.000000000 
+0100
@@ -1,11 +1,12 @@
 Metadata-Version: 1.1
 Name: os-client-config
-Version: 1.28.0
+Version: 1.29.0
 Summary: OpenStack Client Configuation Library
-Home-page: http://docs.openstack.org/developer/os-client-config/
+Home-page: https://docs.openstack.org/os-client-config/latest
 Author: OpenStack
 Author-email: openstack-...@lists.openstack.org
 License: UNKNOWN
+Description-Content-Type: UNKNOWN
 Description: ================
         os-client-config
         ================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/doc/requirements.txt 
new/os-client-config-1.29.0/doc/requirements.txt
--- old/os-client-config-1.28.0/doc/requirements.txt    1970-01-01 
01:00:00.000000000 +0100
+++ new/os-client-config-1.29.0/doc/requirements.txt    2018-02-01 
15:30:06.000000000 +0100
@@ -0,0 +1,4 @@
+docutils>=0.11 # OSI-Approved Open Source, Public Domain
+sphinx!=1.6.6,>=1.6.2 # BSD
+openstackdocstheme>=1.18.1 # Apache-2.0
+reno>=2.5.0 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/doc/source/install/index.rst 
new/os-client-config-1.29.0/doc/source/install/index.rst
--- old/os-client-config-1.28.0/doc/source/install/index.rst    2017-07-10 
21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/doc/source/install/index.rst    2018-02-01 
15:30:06.000000000 +0100
@@ -9,4 +9,4 @@
 Or, if you have virtualenvwrapper installed::
 
     $ mkvirtualenv os-client-config
-    $ pip install os-client-config
\ No newline at end of file
+    $ pip install os-client-config
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/doc/source/user/configuration.rst 
new/os-client-config-1.29.0/doc/source/user/configuration.rst
--- old/os-client-config-1.28.0/doc/source/user/configuration.rst       
2017-07-10 21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/doc/source/user/configuration.rst       
2018-02-01 15:30:06.000000000 +0100
@@ -9,8 +9,8 @@
 provide backwards compatibility to service-specific variables such as
 `NOVA_USERNAME`.
 
-If you have OpenStack environment variables set, `os-client-config` will 
produce
-a cloud config object named `envvars` containing your values from the
+If you have OpenStack environment variables set, `os-client-config` will
+produce a cloud config object named `envvars` containing your values from the
 environment. If you don't like the name `envvars`, that's ok, you can override
 it by setting `OS_CLOUD_NAME`.
 
@@ -115,11 +115,11 @@
 `regions` can be a list of regions. When you call `get_all_clouds`,
 you'll get a cloud config object for each cloud/region combo.
 
-As seen with `dns_service_type`, any setting that makes sense to be 
per-service,
-like `service_type` or `endpoint` or `api_version` can be set by prefixing
-the setting with the default service type. That might strike you funny when
-setting `service_type` and it does me too - but that's just the world we live
-in.
+As seen with `dns_service_type`, any setting that makes sense to be
+per-service, like `service_type` or `endpoint` or `api_version` can be set by
+prefixing the setting with the default service type. That might strike you
+funny when setting `service_type` and it does me too - but that's just the
+world we live in.
 
 Auth Settings
 -------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/doc/source/user/network-config.rst 
new/os-client-config-1.29.0/doc/source/user/network-config.rst
--- old/os-client-config-1.28.0/doc/source/user/network-config.rst      
2017-07-10 21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/doc/source/user/network-config.rst      
2018-02-01 15:29:39.000000000 +0100
@@ -58,3 +58,10 @@
 possible to have more than one network that satisfies that condition, so the
 user might want to tell programs which one to pick. There can be only one
 `nat_destination` per cloud.
+
+`nat_source` is a boolean field that indicates which network floating
+ips should be requested from. It defaults to false. Normally this can be
+inferred by looking for a network that is attached to a router. But it's
+possible to have more than one network that satisfies that condition, so the
+user might want to tell programs which one to pick. There can be only one
+`nat_source` per cloud.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/doc/source/user/vendor-support.rst 
new/os-client-config-1.29.0/doc/source/user/vendor-support.rst
--- old/os-client-config-1.28.0/doc/source/user/vendor-support.rst      
2017-07-10 21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/doc/source/user/vendor-support.rst      
2018-02-01 15:30:06.000000000 +0100
@@ -39,6 +39,20 @@
 
 * Public IPv4 is provided via NAT with Neutron Floating IP
 
+betacloud
+---------
+
+============== ==================
+Region Name    Location
+============== ==================
+betacloud-1    Nuremberg, Germany
+============== ==================
+
+* Identity API Version is 3
+* Images must be in `raw` format
+* Public IPv4 is provided via NAT with Neutron Floating IP
+* Volume API Version is 3
+
 catalyst
 --------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/os_client_config/__init__.py 
new/os-client-config-1.29.0/os_client_config/__init__.py
--- old/os-client-config-1.28.0/os_client_config/__init__.py    2017-07-10 
21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config/__init__.py    2018-02-01 
15:29:39.000000000 +0100
@@ -45,7 +45,7 @@
 
 def make_rest_client(
         service_key, options=None,
-        app_name=None, app_version=None,
+        app_name=None, app_version=None, version=None,
         **kwargs):
     """Simple wrapper function. It has almost no features.
 
@@ -63,7 +63,7 @@
         service_key=service_key, options=options,
         app_name=app_name, app_version=app_version,
         **kwargs)
-    return cloud.get_session_client(service_key)
+    return cloud.get_session_client(service_key, version=version)
 # Backwards compat - simple_client was a terrible name
 simple_client = make_rest_client
 # Backwards compat - session_client was a terrible name
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/os_client_config/cloud_config.py 
new/os-client-config-1.29.0/os_client_config/cloud_config.py
--- old/os-client-config-1.28.0/os_client_config/cloud_config.py        
2017-07-10 21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config/cloud_config.py        
2018-02-01 15:29:39.000000000 +0100
@@ -167,12 +167,14 @@
         # What's even more amazing is that they did it AGAIN with cinder v3
         # And then I learned that mistral copied it.
         if service_type == 'volume':
-            if self.get_api_version(service_type).startswith('2'):
+            vol_type = self.get_api_version(service_type)
+            if vol_type and vol_type.startswith('2'):
                 service_type = 'volumev2'
-            elif self.get_api_version(service_type).startswith('3'):
+            elif vol_type and vol_type.startswith('3'):
                 service_type = 'volumev3'
         elif service_type == 'workflow':
-            if self.get_api_version(service_type).startswith('2'):
+            wk_type = self.get_api_version(service_type)
+            if wk_type and wk_type.startswith('2'):
                 service_type = 'workflowv2'
         return self.config.get(key, service_type)
 
@@ -235,7 +237,27 @@
         """Helper method to grab the service catalog."""
         return self._auth.get_access(self.get_session()).service_catalog
 
-    def get_session_client(self, service_key):
+    def _get_version_args(self, service_key, version):
+        """Translate OCC version args to those needed by ksa adapter.
+
+        If no version is requested explicitly and we have a configured version,
+        set the version parameter and let ksa deal with expanding that to
+        min=ver.0, max=ver.latest.
+
+        If version is set, pass it through.
+
+        If version is not set and we don't have a configured version, default
+        to latest.
+        """
+        if version == 'latest':
+            return None, None, 'latest'
+        if not version:
+            version = self.get_api_version(service_key)
+        if not version:
+            return None, None, 'latest'
+        return version, None, None
+
+    def get_session_client(self, service_key, version=None):
         """Return a prepped requests adapter for a given service.
 
         This is useful for making direct requests calls against a
@@ -249,12 +271,17 @@
 
         and it will work like you think.
         """
+        (version, min_version, max_version) = self._get_version_args(
+            service_key, version)
 
         return adapter.Adapter(
             session=self.get_session(),
             service_type=self.get_service_type(service_key),
             service_name=self.get_service_name(service_key),
             interface=self.get_interface(service_key),
+            version=version,
+            min_version=min_version,
+            max_version=max_version,
             region_name=self.region)
 
     def _get_highest_endpoint(self, service_types, kwargs):
@@ -505,7 +532,7 @@
         """
         if self.config['floating_ip_source'] == "None":
             return False
-        return self.config['requires_floating_ip']
+        return self.config.get('requires_floating_ip')
 
     def get_external_networks(self):
         """Get list of network names for external networks."""
@@ -556,3 +583,10 @@
             if net['nat_destination']:
                 return net['name']
         return None
+
+    def get_nat_source(self):
+        """Get network used for NAT source."""
+        for net in self.config['networks']:
+            if net.get('nat_source'):
+                return net['name']
+        return None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/os_client_config/config.py 
new/os-client-config-1.29.0/os_client_config/config.py
--- old/os-client-config-1.28.0/os_client_config/config.py      2017-07-10 
21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config/config.py      2018-02-01 
15:29:39.000000000 +0100
@@ -69,6 +69,8 @@
 
 BOOL_KEYS = ('insecure', 'cache')
 
+FORMAT_EXCLUSIONS = frozenset(['password'])
+
 
 # NOTE(dtroyer): This turns out to be not the best idea so let's move
 #                overriding defaults to a kwarg to OpenStackConfig.__init__()
@@ -263,6 +265,17 @@
             if not self.default_cloud:
                 self.default_cloud = self.envvar_key
 
+        if not self.default_cloud and self.cloud_config['clouds']:
+            if len(self.cloud_config['clouds'].keys()) == 1:
+                # If there is only one cloud just use it. This matches envvars
+                # behavior and allows for much less typing.
+                # TODO(mordred) allow someone to mark a cloud as "default" in
+                # clouds.yaml.
+                # The next/iter thing is for python3 compat where dict.keys
+                # returns an iterator but in python2 it's a list.
+                self.default_cloud = next(iter(
+                    self.cloud_config['clouds'].keys()))
+
         # Finally, fall through and make a cloud that starts with defaults
         # because we need somewhere to put arguments, and there are neither
         # config files or env vars
@@ -539,6 +552,7 @@
             network = dict(
                 name=name,
                 routes_externally=get_boolean(net.get('routes_externally')),
+                nat_source=get_boolean(net.get('nat_source')),
                 nat_destination=get_boolean(net.get('nat_destination')),
                 default_interface=get_boolean(net.get('default_interface')),
             )
@@ -950,7 +964,7 @@
     def option_prompt(self, config, p_opt):
         """Prompt user for option that requires a value"""
         if (
-                p_opt.prompt is not None and
+                getattr(p_opt, 'prompt', None) is not None and
                 p_opt.dest not in config['auth'] and
                 self._pw_callback is not None
         ):
@@ -1077,7 +1091,7 @@
 
         # If any of the defaults reference other values, we need to expand
         for (key, value) in config.items():
-            if hasattr(value, 'format'):
+            if hasattr(value, 'format') and key not in FORMAT_EXCLUSIONS:
                 config[key] = value.format(**config)
 
         force_ipv4 = config.pop('force_ipv4', self.force_ipv4)
@@ -1172,7 +1186,7 @@
 
         # If any of the defaults reference other values, we need to expand
         for (key, value) in config.items():
-            if hasattr(value, 'format'):
+            if hasattr(value, 'format') and key not in FORMAT_EXCLUSIONS:
                 config[key] = value.format(**config)
 
         force_ipv4 = config.pop('force_ipv4', self.force_ipv4)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/os_client_config/constructors.py 
new/os-client-config-1.29.0/os_client_config/constructors.py
--- old/os-client-config-1.28.0/os_client_config/constructors.py        
2017-07-10 21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config/constructors.py        
2018-02-01 15:29:39.000000000 +0100
@@ -14,15 +14,23 @@
 
 import json
 import os
+import threading
 
 _json_path = os.path.join(
     os.path.dirname(os.path.realpath(__file__)), 'constructors.json')
 _class_mapping = None
+_class_mapping_lock = threading.Lock()
 
 
 def get_constructor_mapping():
     global _class_mapping
-    if not _class_mapping:
+    if _class_mapping is not None:
+        return _class_mapping.copy()
+    with _class_mapping_lock:
+        if _class_mapping is not None:
+            return _class_mapping.copy()
+        tmp_class_mapping = {}
         with open(_json_path, 'r') as json_file:
-            _class_mapping = json.load(json_file)
-    return _class_mapping
+            tmp_class_mapping.update(json.load(json_file))
+        _class_mapping = tmp_class_mapping
+        return tmp_class_mapping.copy()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/os_client_config/defaults.py 
new/os-client-config-1.29.0/os_client_config/defaults.py
--- old/os-client-config-1.28.0/os_client_config/defaults.py    2017-07-10 
21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config/defaults.py    2018-02-01 
15:29:39.000000000 +0100
@@ -14,19 +14,30 @@
 
 import json
 import os
+import threading
 
 _json_path = os.path.join(
     os.path.dirname(os.path.realpath(__file__)), 'defaults.json')
 _defaults = None
+_defaults_lock = threading.Lock()
 
 
 def get_defaults():
     global _defaults
-    if not _defaults:
+    if _defaults is not None:
+        return _defaults.copy()
+    with _defaults_lock:
+        if _defaults is not None:
+            # Did someone else just finish filling it?
+            return _defaults.copy()
         # Python language specific defaults
         # These are defaults related to use of python libraries, they are
         # not qualities of a cloud.
-        _defaults = dict(
+        #
+        # NOTE(harlowja): update a in-memory dict, before updating
+        # the global one so that other callers of get_defaults do not
+        # see the partially filled one.
+        tmp_defaults = dict(
             api_timeout=None,
             verify=True,
             cacert=None,
@@ -36,6 +47,6 @@
         with open(_json_path, 'r') as json_file:
             updates = json.load(json_file)
             if updates is not None:
-                _defaults.update(updates)
-
-    return _defaults.copy()
+                tmp_defaults.update(updates)
+        _defaults = tmp_defaults
+        return tmp_defaults.copy()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/os_client_config/tests/base.py 
new/os-client-config-1.29.0/os_client_config/tests/base.py
--- old/os-client-config-1.28.0/os_client_config/tests/base.py  2017-07-10 
21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config/tests/base.py  2018-02-01 
15:29:39.000000000 +0100
@@ -102,6 +102,7 @@
             'networks': [{
                 'name': 'a-public',
                 'routes_externally': True,
+                'nat_source': True,
             }, {
                 'name': 'another-public',
                 'routes_externally': True,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/os_client_config/tests/test_cloud_config.py 
new/os-client-config-1.29.0/os_client_config/tests/test_cloud_config.py
--- old/os-client-config-1.28.0/os_client_config/tests/test_cloud_config.py     
2017-07-10 21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config/tests/test_cloud_config.py     
2018-02-01 15:29:39.000000000 +0100
@@ -167,6 +167,13 @@
         cc.config['workflow_api_version'] = '2'
         self.assertEqual('workflowv2', cc.get_service_type('workflow'))
 
+    def test_no_override(self):
+        """Test no override happens when defaults are not configured"""
+        cc = cloud_config.CloudConfig("test1", "region-al", fake_services_dict)
+        self.assertEqual('volume', cc.get_service_type('volume'))
+        self.assertEqual('workflow', cc.get_service_type('workflow'))
+        self.assertEqual('not-exist', cc.get_service_type('not-exist'))
+
     def test_get_session_no_auth(self):
         config_dict = defaults.get_defaults()
         config_dict.update(fake_services_dict)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/os_client_config/tests/test_config.py 
new/os-client-config-1.29.0/os_client_config/tests/test_config.py
--- old/os-client-config-1.28.0/os_client_config/tests/test_config.py   
2017-07-10 21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config/tests/test_config.py   
2018-02-01 15:29:39.000000000 +0100
@@ -55,6 +55,25 @@
         self.assertIsInstance(cloud, cloud_config.CloudConfig)
         self.assertEqual(cloud.name, '')
 
+    def test_get_one_cloud_default_cloud_from_file(self):
+        single_conf = base._write_yaml({
+            'clouds': {
+                'single': {
+                    'auth': {
+                        'auth_url': 'http://example.com/v2',
+                        'username': 'testuser',
+                        'password': 'testpass',
+                        'project_name': 'testproject',
+                    },
+                    'region_name': 'test-region',
+                }
+            }
+        })
+        c = config.OpenStackConfig(config_files=[single_conf],
+                                   vendor_files=[self.vendor_yaml])
+        cc = c.get_one_cloud()
+        self.assertEqual(cc.name, 'single')
+
     def test_get_one_cloud_auth_defaults(self):
         c = config.OpenStackConfig(config_files=[self.cloud_yaml])
         cc = c.get_one_cloud(cloud='_test-cloud_', auth={'username': 'user'})
@@ -205,6 +224,7 @@
         self.assertEqual(
             ['a-private', 'another-private', 'split-no-default'],
             cc.get_internal_networks())
+        self.assertEqual('a-public', cc.get_nat_source())
         self.assertEqual('another-private', cc.get_nat_destination())
         self.assertEqual('another-public', cc.get_default_network())
         self.assertEqual(
@@ -220,6 +240,7 @@
         cc = c.get_one_cloud('_test-cloud-domain-scoped_')
         self.assertEqual([], cc.get_external_networks())
         self.assertEqual([], cc.get_internal_networks())
+        self.assertIsNone(cc.get_nat_source())
         self.assertIsNone(cc.get_nat_destination())
         self.assertIsNone(cc.get_default_network())
 
@@ -355,6 +376,66 @@
         self.assertEqual(region, {'name': 'no-cloud-region', 'values': {}})
 
 
+class TestExcludedFormattedConfigValue(base.TestCase):
+    # verify LaunchPad bug #1635696
+    #
+    # get_one_cloud() and get_one_cloud_osc() iterate over config
+    # values and try to expand any variables in those values by
+    # calling value.format(), however some config values
+    # (e.g. password) should never have format() applied to them, not
+    # only might that change the password but it will also cause the
+    # format() function to raise an exception if it can not parse the
+    # format string. Examples would be single brace (e.g. 'foo{')
+    # which raises an ValueError because it's looking for a matching
+    # end brace or a brace pair with a key value that cannot be found
+    # (e.g. 'foo{bar}') which raises a KeyError.
+
+    def setUp(self):
+        super(TestExcludedFormattedConfigValue, self).setUp()
+
+        self.args = dict(
+            auth_url='http://example.com/v2',
+            username='user',
+            project_name='project',
+            region_name='region2',
+            snack_type='cookie',
+            os_auth_token='no-good-things',
+        )
+
+        self.options = argparse.Namespace(**self.args)
+
+    def test_get_one_cloud_password_brace(self):
+        c = config.OpenStackConfig(config_files=[self.cloud_yaml],
+                                   vendor_files=[self.vendor_yaml])
+
+        password = 'foo{'       # Would raise ValueError, single brace
+        self.options.password = password
+        cc = c.get_one_cloud(
+            cloud='_test_cloud_regions', argparse=self.options, validate=False)
+        self.assertEqual(cc.password, password)
+
+        password = 'foo{bar}'   # Would raise KeyError, 'bar' not found
+        self.options.password = password
+        cc = c.get_one_cloud(
+            cloud='_test_cloud_regions', argparse=self.options, validate=False)
+        self.assertEqual(cc.password, password)
+
+    def test_get_one_cloud_osc_password_brace(self):
+        c = config.OpenStackConfig(config_files=[self.cloud_yaml],
+                                   vendor_files=[self.vendor_yaml])
+        password = 'foo{'       # Would raise ValueError, single brace
+        self.options.password = password
+        cc = c.get_one_cloud_osc(
+            cloud='_test_cloud_regions', argparse=self.options, validate=False)
+        self.assertEqual(cc.password, password)
+
+        password = 'foo{bar}'   # Would raise KeyError, 'bar' not found
+        self.options.password = password
+        cc = c.get_one_cloud_osc(
+            cloud='_test_cloud_regions', argparse=self.options, validate=False)
+        self.assertEqual(cc.password, password)
+
+
 class TestConfigArgparse(base.TestCase):
 
     def setUp(self):
@@ -1000,6 +1081,7 @@
             'networks': [
                 {'name': 'private', 'routes_externally': False,
                  'nat_destination': False, 'default_interface': False,
+                 'nat_source': False,
                  'routes_ipv4_externally': False,
                  'routes_ipv6_externally': False},
             ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/os_client_config/vendors/betacloud.json 
new/os-client-config-1.29.0/os_client_config/vendors/betacloud.json
--- old/os-client-config-1.28.0/os_client_config/vendors/betacloud.json 
1970-01-01 01:00:00.000000000 +0100
+++ new/os-client-config-1.29.0/os_client_config/vendors/betacloud.json 
2018-02-01 15:30:06.000000000 +0100
@@ -0,0 +1,14 @@
+{
+  "name": "betacloud",
+  "profile": {
+    "auth": {
+      "auth_url": "https://api-1.betacloud.io:5000/v3";
+    },
+    "regions": [
+      "betacloud-1"
+    ],
+    "identity_api_version": "3",
+    "image_format": "raw",
+    "volume_api_version": "3"
+  }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/os_client_config/vendors/datacentred.json 
new/os-client-config-1.29.0/os_client_config/vendors/datacentred.json
--- old/os-client-config-1.28.0/os_client_config/vendors/datacentred.json       
2017-07-10 21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config/vendors/datacentred.json       
2018-02-01 15:29:39.000000000 +0100
@@ -5,7 +5,7 @@
       "auth_url": "https://compute.datacentred.io:5000";
     },
     "region-name": "sal01",
-    "identity_api_version": "2",
-    "image_api_version": "1"
+    "identity_api_version": "3",
+    "image_api_version": "2"
   }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/os_client_config/vendors/osic.json 
new/os-client-config-1.29.0/os_client_config/vendors/osic.json
--- old/os-client-config-1.28.0/os_client_config/vendors/osic.json      
2017-07-10 21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config/vendors/osic.json      
1970-01-01 01:00:00.000000000 +0100
@@ -1,11 +0,0 @@
-{
-  "name": "osic",
-  "profile": {
-    "auth": {
-      "auth_url": "https://cloud1.osic.org:5000";
-    },
-    "regions": [
-      "RegionOne"
-    ]
-  }
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/os_client_config.egg-info/PKG-INFO 
new/os-client-config-1.29.0/os_client_config.egg-info/PKG-INFO
--- old/os-client-config-1.28.0/os_client_config.egg-info/PKG-INFO      
2017-07-10 21:30:51.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config.egg-info/PKG-INFO      
2018-02-01 15:33:09.000000000 +0100
@@ -1,11 +1,12 @@
 Metadata-Version: 1.1
 Name: os-client-config
-Version: 1.28.0
+Version: 1.29.0
 Summary: OpenStack Client Configuation Library
-Home-page: http://docs.openstack.org/developer/os-client-config/
+Home-page: https://docs.openstack.org/os-client-config/latest
 Author: OpenStack
 Author-email: openstack-...@lists.openstack.org
 License: UNKNOWN
+Description-Content-Type: UNKNOWN
 Description: ================
         os-client-config
         ================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/os_client_config.egg-info/SOURCES.txt 
new/os-client-config-1.29.0/os_client_config.egg-info/SOURCES.txt
--- old/os-client-config-1.28.0/os_client_config.egg-info/SOURCES.txt   
2017-07-10 21:30:52.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config.egg-info/SOURCES.txt   
2018-02-01 15:33:10.000000000 +0100
@@ -1,6 +1,7 @@
 .coveragerc
 .mailmap
-.testr.conf
+.stestr.conf
+.zuul.yaml
 AUTHORS
 CONTRIBUTING.rst
 ChangeLog
@@ -12,6 +13,7 @@
 setup.py
 test-requirements.txt
 tox.ini
+doc/requirements.txt
 doc/source/conf.py
 doc/source/index.rst
 doc/source/contributor/index.rst
@@ -50,6 +52,7 @@
 os_client_config/tests/test_json.py
 os_client_config/vendors/__init__.py
 os_client_config/vendors/auro.json
+os_client_config/vendors/betacloud.json
 os_client_config/vendors/bluebox.json
 os_client_config/vendors/catalyst.json
 os_client_config/vendors/citycloud.json
@@ -62,7 +65,6 @@
 os_client_config/vendors/fuga.json
 os_client_config/vendors/ibmcloud.json
 os_client_config/vendors/internap.json
-os_client_config/vendors/osic.json
 os_client_config/vendors/otc.json
 os_client_config/vendors/ovh.json
 os_client_config/vendors/rackspace.json
@@ -73,27 +75,31 @@
 os_client_config/vendors/zetta.json
 releasenotes/notes/catch-up-release-notes-e385fad34e9f3d6e.yaml
 releasenotes/notes/cloud-profile-status-e0d29b5e2f10e95c.yaml
+releasenotes/notes/default-cloud-7ee0bcb9e5dd24b9.yaml
 releasenotes/notes/fix-compat-with-old-keystoneauth-66e11ee9d008b962.yaml
 releasenotes/notes/ironic-microversion-ba5b0f36f11196a6.yaml
 releasenotes/notes/load-yaml-3177efca78e5c67a.yaml
 releasenotes/notes/magic-fixes-dca4ae4dac2441a8.yaml
 releasenotes/notes/make-rest-client-dd3d365632a26fa0.yaml
+releasenotes/notes/make-rest-client-version-discovery-84125700f159491a.yaml
 releasenotes/notes/min-max-legacy-version-301242466ddefa93.yaml
+releasenotes/notes/nat-source-field-7c7db2a724616d59.yaml
 releasenotes/notes/network-list-e6e9dafdd8446263.yaml
 releasenotes/notes/option-precedence-1fecab21fdfb2c33.yaml
 releasenotes/notes/sdk-helper-41f8d815cfbcfb00.yaml
 releasenotes/notes/session-client-b581a6e5d18c8f04.yaml
 releasenotes/notes/shade-helper-568f8cb372eef6d9.yaml
 releasenotes/notes/started-using-reno-242e2b0cd27f9480.yaml
+releasenotes/notes/vendor-add-betacloud-03872c3485104853.yaml
 releasenotes/notes/vendor-updates-f11184ba56bb27cf.yaml
 releasenotes/source/conf.py
 releasenotes/source/index.rst
 releasenotes/source/mitaka.rst
 releasenotes/source/newton.rst
 releasenotes/source/ocata.rst
+releasenotes/source/pike.rst
 releasenotes/source/unreleased.rst
 releasenotes/source/_static/.placeholder
 releasenotes/source/_templates/.placeholder
 tools/keystone_version.py
-tools/nova_version.py
-tools/tox_install.sh
\ No newline at end of file
+tools/nova_version.py
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/os_client_config.egg-info/pbr.json 
new/os-client-config-1.29.0/os_client_config.egg-info/pbr.json
--- old/os-client-config-1.28.0/os_client_config.egg-info/pbr.json      
2017-07-10 21:30:51.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config.egg-info/pbr.json      
2018-02-01 15:33:09.000000000 +0100
@@ -1 +1 @@
-{"git_version": "f74902b", "is_release": true}
\ No newline at end of file
+{"git_version": "ed71a59", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/os_client_config.egg-info/requires.txt 
new/os-client-config-1.29.0/os_client_config.egg-info/requires.txt
--- old/os-client-config-1.28.0/os_client_config.egg-info/requires.txt  
2017-07-10 21:30:51.000000000 +0200
+++ new/os-client-config-1.29.0/os_client_config.egg-info/requires.txt  
2018-02-01 15:33:09.000000000 +0100
@@ -1,4 +1,4 @@
-PyYAML>=3.1.0
+PyYAML>=3.10
 appdirs>=1.3.0
-keystoneauth1>=2.1.0
-requestsexceptions>=1.1.1
+keystoneauth1>=3.3.0
+requestsexceptions>=1.2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/releasenotes/notes/default-cloud-7ee0bcb9e5dd24b9.yaml
 
new/os-client-config-1.29.0/releasenotes/notes/default-cloud-7ee0bcb9e5dd24b9.yaml
--- 
old/os-client-config-1.28.0/releasenotes/notes/default-cloud-7ee0bcb9e5dd24b9.yaml
  1970-01-01 01:00:00.000000000 +0100
+++ 
new/os-client-config-1.29.0/releasenotes/notes/default-cloud-7ee0bcb9e5dd24b9.yaml
  2018-02-01 15:29:39.000000000 +0100
@@ -0,0 +1,7 @@
+---
+issues:
+  - If there was only one cloud defined in clouds.yaml
+    os-client-config was requiring the cloud parameter
+    be passed. This is inconsistent with how the envvars
+    cloud works which WILL work without setting the cloud
+    parameter if it's the only cloud.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/releasenotes/notes/make-rest-client-version-discovery-84125700f159491a.yaml
 
new/os-client-config-1.29.0/releasenotes/notes/make-rest-client-version-discovery-84125700f159491a.yaml
--- 
old/os-client-config-1.28.0/releasenotes/notes/make-rest-client-version-discovery-84125700f159491a.yaml
     1970-01-01 01:00:00.000000000 +0100
+++ 
new/os-client-config-1.29.0/releasenotes/notes/make-rest-client-version-discovery-84125700f159491a.yaml
     2018-02-01 15:29:39.000000000 +0100
@@ -0,0 +1,6 @@
+---
+features:
+  - Add version argument to make_rest_client and plumb
+    version discovery through get_session_client so that
+    versioned endpoints are properly found if unversioned
+    are in the catalog.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/releasenotes/notes/nat-source-field-7c7db2a724616d59.yaml
 
new/os-client-config-1.29.0/releasenotes/notes/nat-source-field-7c7db2a724616d59.yaml
--- 
old/os-client-config-1.28.0/releasenotes/notes/nat-source-field-7c7db2a724616d59.yaml
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/os-client-config-1.29.0/releasenotes/notes/nat-source-field-7c7db2a724616d59.yaml
       2018-02-01 15:29:39.000000000 +0100
@@ -0,0 +1,6 @@
+---
+features:
+  - Added nat_source flag for networks. In some more complex clouds there
+    can not only be more than one valid network on a server that NAT can
+    attach to, there can also be more than one valid network from which to
+    get a NAT address. Allow flagging a network so that it can be found.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/releasenotes/notes/vendor-add-betacloud-03872c3485104853.yaml
 
new/os-client-config-1.29.0/releasenotes/notes/vendor-add-betacloud-03872c3485104853.yaml
--- 
old/os-client-config-1.28.0/releasenotes/notes/vendor-add-betacloud-03872c3485104853.yaml
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/os-client-config-1.29.0/releasenotes/notes/vendor-add-betacloud-03872c3485104853.yaml
   2018-02-01 15:30:06.000000000 +0100
@@ -0,0 +1,3 @@
+---
+other:
+  - Add betacloud region for Germany
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/releasenotes/source/conf.py 
new/os-client-config-1.29.0/releasenotes/source/conf.py
--- old/os-client-config-1.28.0/releasenotes/source/conf.py     2017-07-10 
21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/releasenotes/source/conf.py     2018-02-01 
15:29:39.000000000 +0100
@@ -46,16 +46,12 @@
 project = u'os-client-config Release Notes'
 copyright = u'2015, os-client-config developers'
 
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-import pbr.version
-occ_version = pbr.version.VersionInfo('os-client-config')
+# Release notes do not need a version in the title, they span
+# multiple versions.
 # The short X.Y version.
-version = occ_version.canonical_version_string()
+version = ''
 # The full version, including alpha/beta/rc tags.
-release = occ_version.version_string_with_vcs()
+release = ''
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-client-config-1.28.0/releasenotes/source/index.rst 
new/os-client-config-1.29.0/releasenotes/source/index.rst
--- old/os-client-config-1.28.0/releasenotes/source/index.rst   2017-07-10 
21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/releasenotes/source/index.rst   2018-02-01 
15:29:39.000000000 +0100
@@ -9,6 +9,7 @@
    :maxdepth: 2
 
    unreleased
+   pike
    ocata
    newton
    mitaka
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/releasenotes/source/pike.rst 
new/os-client-config-1.29.0/releasenotes/source/pike.rst
--- old/os-client-config-1.28.0/releasenotes/source/pike.rst    1970-01-01 
01:00:00.000000000 +0100
+++ new/os-client-config-1.29.0/releasenotes/source/pike.rst    2018-02-01 
15:29:39.000000000 +0100
@@ -0,0 +1,6 @@
+===================================
+ Pike Series Release Notes
+===================================
+
+.. release-notes::
+   :branch: stable/pike
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/requirements.txt 
new/os-client-config-1.29.0/requirements.txt
--- old/os-client-config-1.28.0/requirements.txt        2017-07-10 
21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/requirements.txt        2018-02-01 
15:29:39.000000000 +0100
@@ -1,7 +1,7 @@
 # The order of packages is significant, because pip processes them in the order
 # of appearance. Changing the order has an impact on the overall integration
 # process, which may cause wedges in the gate later.
-PyYAML>=3.1.0
-appdirs>=1.3.0
-keystoneauth1>=2.1.0
-requestsexceptions>=1.1.1  # Apache-2.0
+PyYAML>=3.10 # MIT
+appdirs>=1.3.0 # MIT License
+keystoneauth1>=3.3.0 # Apache-2.0
+requestsexceptions>=1.2.0 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/setup.cfg 
new/os-client-config-1.29.0/setup.cfg
--- old/os-client-config-1.28.0/setup.cfg       2017-07-10 21:30:52.000000000 
+0200
+++ new/os-client-config-1.29.0/setup.cfg       2018-02-01 15:33:10.000000000 
+0100
@@ -5,7 +5,7 @@
        README.rst
 author = OpenStack
 author-email = openstack-...@lists.openstack.org
-home-page = http://docs.openstack.org/developer/os-client-config/
+home-page = https://docs.openstack.org/os-client-config/latest
 classifier = 
        Environment :: OpenStack
        Intended Audience :: Information Technology
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/setup.py 
new/os-client-config-1.29.0/setup.py
--- old/os-client-config-1.28.0/setup.py        2017-07-10 21:28:35.000000000 
+0200
+++ new/os-client-config-1.29.0/setup.py        2018-02-01 15:29:39.000000000 
+0100
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,6 +16,14 @@
 # THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
 import setuptools
 
+# In python < 2.7.4, a lazy loading of package `pbr` will break
+# setuptools if some other modules registered functions in `atexit`.
+# solution from: http://bugs.python.org/issue15881#msg170215
+try:
+    import multiprocessing  # noqa
+except ImportError:
+    pass
+
 setuptools.setup(
-    setup_requires=['pbr'],
+    setup_requires=['pbr>=2.0.0'],
     pbr=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/test-requirements.txt 
new/os-client-config-1.29.0/test-requirements.txt
--- old/os-client-config-1.28.0/test-requirements.txt   2017-07-10 
21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/test-requirements.txt   2018-02-01 
15:30:06.000000000 +0100
@@ -2,20 +2,16 @@
 # of appearance. Changing the order has an impact on the overall integration
 # process, which may cause wedges in the gate later.
 
-hacking>=0.12.0,!=0.13.0,<0.14  # Apache-2.0
+hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0
 
-coverage>=3.6
-docutils>=0.11 # OSI-Approved Open Source, Public Domain
-extras
-fixtures>=0.3.14
-jsonschema>=2.0.0,<3.0.0,!=2.5.0
-mock>=1.2
-python-glanceclient>=0.18.0
-python-subunit>=0.0.18
-sphinx>=1.5.1 # BSD
-openstackdocstheme>=1.5.0  # Apache-2.0
-oslotest>=1.5.1,<1.6.0  # Apache-2.0
-reno>=0.1.1  # Apache2
-testrepository>=0.0.18
-testscenarios>=0.4
-testtools>=0.9.36,!=1.2.0
+coverage!=4.4,>=4.0 # Apache-2.0
+extras>=1.0.0 # MIT
+fixtures>=3.0.0 # Apache-2.0/BSD
+jsonschema<3.0.0,>=2.6.0 # MIT
+mock>=2.0.0 # BSD
+python-glanceclient>=2.8.0 # Apache-2.0
+python-subunit>=1.0.0 # Apache-2.0/BSD
+oslotest>=3.2.0 # Apache-2.0
+stestr>=1.0.0 # Apache-2.0
+testscenarios>=0.4 # Apache-2.0/BSD
+testtools>=2.2.0 # MIT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/tools/tox_install.sh 
new/os-client-config-1.29.0/tools/tox_install.sh
--- old/os-client-config-1.28.0/tools/tox_install.sh    2017-07-10 
21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/tools/tox_install.sh    1970-01-01 
01:00:00.000000000 +0100
@@ -1,30 +0,0 @@
-#!/usr/bin/env bash
-
-# Client constraint file contains this client version pin that is in conflict
-# with installing the client from source. We should remove the version pin in
-# the constraints file before applying it for from-source installation.
-
-CONSTRAINTS_FILE=$1
-shift 1
-
-set -e
-
-# NOTE(tonyb): Place this in the tox enviroment's log dir so it will get
-# published to logs.openstack.org for easy debugging.
-localfile="$VIRTUAL_ENV/log/upper-constraints.txt"
-
-if [[ $CONSTRAINTS_FILE != http* ]]; then
-    CONSTRAINTS_FILE=file://$CONSTRAINTS_FILE
-fi
-# NOTE(tonyb): need to add curl to bindep.txt if the project supports bindep
-curl $CONSTRAINTS_FILE --insecure --progress-bar --output $localfile
-
-pip install -c$localfile openstack-requirements
-
-# This is the main purpose of the script: Allow local installation of
-# the current repo. It is listed in constraints file and thus any
-# install will be constrained and we need to unconstrain it.
-edit-constraints $localfile -- $CLIENT_NAME
-
-pip install -c$localfile -U $*
-exit $?
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-client-config-1.28.0/tox.ini 
new/os-client-config-1.29.0/tox.ini
--- old/os-client-config-1.28.0/tox.ini 2017-07-10 21:28:35.000000000 +0200
+++ new/os-client-config-1.29.0/tox.ini 2018-02-01 15:30:06.000000000 +0100
@@ -5,34 +5,64 @@
 
 [testenv]
 usedevelop = True
-passenv = ZUUL_CACHE_DIR
-          REQUIREMENTS_PIP_LOCATION
-install_command = {toxinidir}/tools/tox_install.sh 
{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt}
 {opts} {packages}
+passenv = UPPER_CONSTRAINTS_FILE
+install_command = pip install -U {opts} {packages}
 setenv =
-   VIRTUAL_ENV={envdir}
-   BRANCH_NAME=master
-   CLIENT_NAME=os-client-config
-deps = -r{toxinidir}/test-requirements.txt
-commands = python setup.py testr --slowest --testr-args='{posargs}'
+    VIRTUAL_ENV={envdir}
+    LANG=en_US.UTF-8
+    LANGUAGE=en_US:en
+    LC_ALL=C
+    OS_STDOUT_CAPTURE=1
+    OS_STDERR_CAPTURE=1
+    OS_TEST_TIMEOUT=60
+deps =
+  
-c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt}
+  -r{toxinidir}/requirements.txt
+  -r{toxinidir}/test-requirements.txt
+commands = stestr run {posargs}
+           stestr slowest
 
 [testenv:pep8]
-commands = flake8
+usedevelop = False
+skip_install = True
+deps =
+    
-c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt}
+    doc8
+    hacking
+    pygments
+    readme
+commands =
+    doc8 doc/source
+    python setup.py check -r -s
+    flake8 os_client_config
 
 [testenv:venv]
 commands = {posargs}
 
 [testenv:cover]
-commands = python setup.py test --coverage 
--coverage-package-name=os_client_config --testr-args='{posargs}'
+setenv =
+    {[testenv]setenv}
+    PYTHON=coverage run --source os_client_config --parallel-mode
+commands =
+    stestr run {posargs}
+    coverage combine
+    coverage html -d cover
+    coverage xml -o cover/coverage.xml
 
 [testenv:docs]
+skip_install = True
 deps =
-    {[testenv]deps}
-    readme
+    
-c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt}
+    -r{toxinidir}/requirements.txt
+    -r{toxinidir}/doc/requirements.txt
 commands =
-    python setup.py build_sphinx
-    python setup.py check -r -s
+  sphinx-build -W -d doc/build/doctrees -b html doc/source/ doc/build/html
 
 [testenv:releasenotes]
+skip_install = True
+deps =
+    
-c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt}
+    -r{toxinidir}/doc/requirements.txt
 commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html 
releasenotes/source releasenotes/build/html
 
 [flake8]


Reply via email to