Hello community,

here is the log from the commit of package python-openstacksdk for 
openSUSE:Factory checked in at 2020-03-24 22:33:24
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-openstacksdk (Old)
 and      /work/SRC/openSUSE:Factory/.python-openstacksdk.new.3160 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-openstacksdk"

Tue Mar 24 22:33:24 2020 rev:12 rq:787565 version:0.36.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-openstacksdk/python-openstacksdk.changes  
2019-12-04 14:19:10.746377391 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-openstacksdk.new.3160/python-openstacksdk.changes
        2020-03-24 22:33:31.049123676 +0100
@@ -1,0 +2,27 @@
+Mon Mar 23 17:21:41 UTC 2020 - Dirk Mueller <[email protected]>
+
+- add obsoletes
+
+-------------------------------------------------------------------
+Mon Mar 23 17:21:31 UTC 2020 - [email protected]
+
+- update to version 0.36.2
+  - Fix error handling in network trunks operations
+  - Handle HTTP errors in add/remove router interface calls
+  - Consistent normalization of Machine objects in the cloud layer
+  - Fix error handling on add/remove router iface calls
+  - Include "fields" to "SecurityGroup" query parameters
+  - Use has_service in functional test's require_service
+  - Update TOX/UPPER_CONSTRAINTS_FILE for stable/train
+  - Fix microversion negotiation in some bare metal node call
+  - Keep connection backrefs with weakref.proxy
+  - Update .gitreview for stable/train
+  - Fix server for later microversion
+  - baremetal node: 'error' is a failed state
+
+-------------------------------------------------------------------
+Sat Mar 14 15:37:35 UTC 2020 - Dirk Mueller <[email protected]>
+
+- switch to python 3.x only builds
+
+-------------------------------------------------------------------

Old:
----
  openstacksdk-0.36.0.tar.gz

New:
----
  openstacksdk-0.36.2.tar.gz

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

Other differences:
------------------
++++++ python-openstacksdk.spec ++++++
--- /var/tmp/diff_new_pack.d77gC3/_old  2020-03-24 22:33:31.857124068 +0100
+++ /var/tmp/diff_new_pack.d77gC3/_new  2020-03-24 22:33:31.873124077 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-openstacksdk
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -16,48 +16,19 @@
 #
 
 
+# and cause timeouts due to swapping. Disabling for now
+%define with_tests 0
 Name:           python-openstacksdk
-Version:        0.36.0
+Version:        0.36.2
 Release:        0
 Summary:        An SDK for building applications to work with OpenStack
 License:        Apache-2.0
 Group:          Development/Languages/Python
 URL:            https://launchpad.net/openstacksdk
-Source0:        
https://files.pythonhosted.org/packages/source/o/openstacksdk/openstacksdk-0.36.0.tar.gz
+Source0:        
https://files.pythonhosted.org/packages/source/o/openstacksdk/openstacksdk-0.36.2.tar.gz
 # https://review.opendev.org/692323
 Patch0:         0001-Increase-test-timeout-for-2-tests-in-TestImageProxy-.patch
 BuildRequires:  openstack-macros
-BuildRequires:  python-devel
-BuildRequires:  python2-PyYAML >= 3.12
-BuildRequires:  python2-appdirs >= 1.3.0
-BuildRequires:  python2-beautifulsoup4
-BuildRequires:  python2-decorator >= 3.4.0
-BuildRequires:  python2-deprecation
-BuildRequires:  python2-dogpile.cache >= 0.6.2
-BuildRequires:  python2-extras
-BuildRequires:  python2-fixtures
-BuildRequires:  python2-futures >= 3.0.0
-BuildRequires:  python2-ipaddress >= 1.0.17
-BuildRequires:  python2-jmespath >= 0.9.0
-BuildRequires:  python2-jsonpatch >= 1.16
-BuildRequires:  python2-jsonschema
-BuildRequires:  python2-keystoneauth1 >= 3.16.0
-BuildRequires:  python2-mock
-BuildRequires:  python2-munch >= 2.1.0
-BuildRequires:  python2-netifaces >= 0.10.4
-BuildRequires:  python2-os-service-types >= 1.7.0
-BuildRequires:  python2-oslo.config
-BuildRequires:  python2-oslotest
-BuildRequires:  python2-pbr >= 2.0.0
-BuildRequires:  python2-python-subunit
-BuildRequires:  python2-requests-mock
-BuildRequires:  python2-requestsexceptions >= 1.2.0
-BuildRequires:  python2-six >= 1.10.0
-BuildRequires:  python2-statsd
-BuildRequires:  python2-stestr
-BuildRequires:  python2-stevedore
-BuildRequires:  python2-testscenarios
-BuildRequires:  python2-testtools
 BuildRequires:  python3-PyYAML >= 3.12
 BuildRequires:  python3-appdirs >= 1.3.0
 BuildRequires:  python3-beautifulsoup4
@@ -87,31 +58,40 @@
 BuildRequires:  python3-stevedore
 BuildRequires:  python3-testscenarios
 BuildRequires:  python3-testtools
-Requires:       python-PyYAML >= 3.12
-Requires:       python-appdirs >= 1.3.0
-Requires:       python-cryptography >= 2.1
-Requires:       python-decorator >= 3.4.0
-Requires:       python-dogpile.cache >= 0.6.2
-Requires:       python-iso8601 >= 0.1.11
-Requires:       python-jmespath >= 0.9.0
-Requires:       python-jsonpatch >= 1.16
-Requires:       python-keystoneauth1 >= 3.16.0
-Requires:       python-munch >= 2.1.0
-Requires:       python-netifaces >= 0.10.4
-Requires:       python-os-service-types >= 1.7.0
-Requires:       python-requestsexceptions >= 1.2.0
-Requires:       python-six >= 1.10.0
 BuildArch:      noarch
-%ifpython2
-Requires:       python-futures >= 3.0.0
-Requires:       python-ipaddress >= 1.0.17
-%endif
 %if 0%{?suse_version}
 # RDO does not package prometheus_client
-BuildRequires:  python2-prometheus_client
 BuildRequires:  python3-prometheus_client
-Requires(post): update-alternatives
-Requires(postun): update-alternatives
+%endif
+
+%description
+The openstacksdk is a library for building applications to work
+with OpenStack clouds.
+The project aims to provide a consistent and complete set of
+interactions with OpenStack's many services, along with complete
+documentation, examples, and tools.
+
+%package -n python3-openstacksdk
+Summary:        An SDK for building applications to work with OpenStack
+Group:          Development/Languages/Python
+Requires:       python3-PyYAML >= 3.12
+Requires:       python3-appdirs >= 1.3.0
+Requires:       python3-cryptography >= 2.1
+Requires:       python3-decorator >= 3.4.0
+Requires:       python3-dogpile.cache >= 0.6.2
+Requires:       python3-iso8601 >= 0.1.11
+Requires:       python3-jmespath >= 0.9.0
+Requires:       python3-jsonpatch >= 1.16
+Requires:       python3-keystoneauth1 >= 3.16.0
+Requires:       python3-munch >= 2.1.0
+Requires:       python3-netifaces >= 0.10.4
+Requires:       python3-os-service-types >= 1.7.0
+Requires:       python3-requestsexceptions >= 1.2.0
+Requires:       python3-six >= 1.10.0
+%if 0%{?suse_version}
+Obsoletes:      python2-openstacksdk < 1.0.0
+%endif
+%if 0%{?suse_version}
 %if 0%{?sle_version} >= 150000 || 0%{?suse_version} > 1500
 Requires:       mkisofs
 %else
@@ -119,25 +99,23 @@
 %endif
 %else
 Requires:       genisoimage
-# on RDO, update-alternatives is in chkconfig
-Requires(post): chkconfig
-Requires(postun): chkconfig
 %endif
-%python_subpackages
 
-%description
+%description -n python3-openstacksdk
 The openstacksdk is a library for building applications to work
 with OpenStack clouds.
 The project aims to provide a consistent and complete set of
 interactions with OpenStack's many services, along with complete
 documentation, examples, and tools.
 
+This package contains the Python 3.x module
+
 %package -n python-openstacksdk-doc
 Summary:        %{summary} - Documentation
 Group:          Documentation/HTML
 BuildRequires:  python3-Sphinx
 BuildRequires:  python3-openstackdocstheme
-Requires:       %{name} = %{version}
+Requires:       python3-openstacksdk = %{version}
 
 %description -n python-openstacksdk-doc
 The openstacksdk is a library for building applications to work
@@ -150,7 +128,7 @@
 applications to work with OpenStack clouds.
 
 %prep
-%autosetup -p1 -n openstacksdk-0.36.0
+%autosetup -p1 -n openstacksdk-0.36.2
 %py_req_cleanup
 sed -i -e 's,coverage.*,,' test-requirements.txt || true
 sed -i -e "s,'sphinx.ext.intersphinx'\,,," doc/source/conf.py
@@ -160,31 +138,26 @@
 %endif
 
 %build
-%python_build
-PBR_VERSION=0.36.0 %sphinx_build -b html doc/source doc/build/html
+%py3_build
+PBR_VERSION=0.36.2 %sphinx_build -b html doc/source doc/build/html
 rm -rf doc/build/html/.{doctrees,buildinfo}
 
 %install
-%python_install
-%python_clone -a %{buildroot}%{_bindir}/openstack-inventory
-
-%post
-%python_install_alternative openstack-inventory
-
-%postun
-%python_uninstall_alternative openstack-inventory
+%py3_install
 
+%if 0%{?with_tests}
 %check
 export OS_LOG_CAPTURE=true
 export OS_TEST_TIMEOUT=30
-%python_exec -m stestr.cli run
+python3 -m stestr.cli run
+%endif
 
-%files %{python_files}
+%files -n python3-openstacksdk
 %license LICENSE
 %doc ChangeLog README.rst
-%python_alternative %{_bindir}/openstack-inventory
-%{python_sitelib}/openstack
-%{python_sitelib}/*.egg-info
+%{_bindir}/openstack-inventory
+%{python3_sitelib}/openstack
+%{python3_sitelib}/*.egg-info
 
 %files -n python-openstacksdk-doc
 %license LICENSE

++++++ openstacksdk-0.36.0.tar.gz -> openstacksdk-0.36.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/AUTHORS 
new/openstacksdk-0.36.2/AUTHORS
--- old/openstacksdk-0.36.0/AUTHORS     2019-09-18 17:50:24.000000000 +0200
+++ new/openstacksdk-0.36.2/AUTHORS     2020-03-16 17:32:10.000000000 +0100
@@ -28,6 +28,7 @@
 B.Haleblian <[email protected]>
 Bailey Miller <[email protected]>
 Bence Romsics <[email protected]>
+Bence Romsics <[email protected]>
 Benoît Knecht <[email protected]>
 Bernard Cafarelli <[email protected]>
 Bharat Kunwar <[email protected]>
@@ -176,6 +177,7 @@
 Maxime Vidori <[email protected]>
 Michael Gugino <[email protected]>
 Michael Johnson <[email protected]>
+Michał Dulko <[email protected]>
 Miguel Angel Ajo <[email protected]>
 Mike Perez <[email protected]>
 Mohammed Naser <[email protected]>
@@ -211,6 +213,7 @@
 Romil Gupta <[email protected]>
 Rosario Di Somma <[email protected]>
 Rosario Di Somma <[email protected]>
+Ruby Loo <[email protected]>
 Rui Chen <[email protected]>
 Ryan Brady <[email protected]>
 Sahid Orentino Ferdjaoui <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/ChangeLog 
new/openstacksdk-0.36.2/ChangeLog
--- old/openstacksdk-0.36.0/ChangeLog   2019-09-18 17:50:23.000000000 +0200
+++ new/openstacksdk-0.36.2/ChangeLog   2020-03-16 17:32:09.000000000 +0100
@@ -1,6 +1,26 @@
 CHANGES
 =======
 
+0.36.2
+------
+
+* Fix microversion negotiation in some bare metal node call
+* Consistent normalization of Machine objects in the cloud layer
+* Include "fields" to "SecurityGroup" query parameters
+* Fix error handling in network trunks operations
+* Fix error handling on add/remove router iface calls
+* Handle HTTP errors in add/remove router interface calls
+
+0.36.1
+------
+
+* Keep connection backrefs with weakref.proxy
+* baremetal node: 'error' is a failed state
+* Fix server for later microversion
+* Use has\_service in functional test's require\_service
+* Update TOX/UPPER\_CONSTRAINTS\_FILE for stable/train
+* Update .gitreview for stable/train
+
 0.36.0
 ------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/PKG-INFO 
new/openstacksdk-0.36.2/PKG-INFO
--- old/openstacksdk-0.36.0/PKG-INFO    2019-09-18 17:50:24.000000000 +0200
+++ new/openstacksdk-0.36.2/PKG-INFO    2020-03-16 17:32:10.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: openstacksdk
-Version: 0.36.0
+Version: 0.36.2
 Summary: An SDK for building applications to work with OpenStack
 Home-page: https://docs.openstack.org/openstacksdk/
 Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/openstack/baremetal/v1/_common.py 
new/openstacksdk-0.36.2/openstack/baremetal/v1/_common.py
--- old/openstacksdk-0.36.0/openstack/baremetal/v1/_common.py   2019-09-18 
17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/baremetal/v1/_common.py   2020-03-16 
17:30:48.000000000 +0100
@@ -58,6 +58,15 @@
 VIF_VERSION = '1.28'
 """API version in which the VIF operations were introduced."""
 
+CONFIG_DRIVE_REBUILD_VERSION = '1.35'
+"""API version in which rebuild accepts a configdrive."""
+
+RESET_INTERFACES_VERSION = '1.45'
+"""API version in which the reset_interfaces parameter was introduced."""
+
+CONFIG_DRIVE_DICT_VERSION = '1.56'
+"""API version in which configdrive can be a dictionary."""
+
 
 class ListMixin(object):
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/openstack/baremetal/v1/node.py 
new/openstacksdk-0.36.2/openstack/baremetal/v1/node.py
--- old/openstacksdk-0.36.0/openstack/baremetal/v1/node.py      2019-09-18 
17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/baremetal/v1/node.py      2020-03-16 
17:30:49.000000000 +0100
@@ -337,11 +337,11 @@
         if config_drive:
             # Some config drive actions require a higher version.
             if isinstance(config_drive, dict):
-                version = '1.56'
+                version = _common.CONFIG_DRIVE_DICT_VERSION
             elif target == 'rebuild':
-                version = '1.35'
+                version = _common.CONFIG_DRIVE_REBUILD_VERSION
 
-        version = utils.pick_microversion(session, version)
+        version = self._assert_microversion_for(session, 'commit', version)
 
         body = {'target': target}
         if config_drive:
@@ -487,7 +487,8 @@
         elif not abort_on_failed_state:
             return False
 
-        if self.provision_state.endswith(' failed'):
+        if (self.provision_state.endswith(' failed') or
+                self.provision_state == 'error'):
             raise exceptions.ResourceFailure(
                 "Node %(node)s reached failure state \"%(state)s\"; "
                 "the last error is %(error)s" %
@@ -522,7 +523,7 @@
         else:
             version = None
 
-        version = utils.pick_microversion(session, version)
+        version = self._assert_microversion_for(session, 'commit', version)
 
         # TODO(dtantsur): server timeout support
         body = {'target': target}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/openstack/cloud/_baremetal.py 
new/openstacksdk-0.36.2/openstack/cloud/_baremetal.py
--- old/openstacksdk-0.36.0/openstack/cloud/_baremetal.py       2019-09-18 
17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/cloud/_baremetal.py       2020-03-16 
17:30:49.000000000 +0100
@@ -68,7 +68,7 @@
 
         :returns: list of ``munch.Munch`` representing machines.
         """
-        return [self._normalize_machine(node._to_munch())
+        return [self._normalize_machine(node)
                 for node in self.baremetal.nodes()]
 
     def get_machine(self, name_or_id):
@@ -83,8 +83,7 @@
                   nodes are found.
         """
         try:
-            return self._normalize_machine(
-                self.baremetal.get_node(name_or_id)._to_munch())
+            return self._normalize_machine(self.baremetal.get_node(name_or_id))
         except exc.OpenStackCloudResourceNotFound:
             return None
 
@@ -159,7 +158,7 @@
                                                            wait=True,
                                                            timeout=timeout)
 
-        return node._to_munch()
+        return self._normalize_machine(node)
 
     def register_machine(self, nics, wait=False, timeout=3600,
                          lock_timeout=600, **kwargs):
@@ -477,7 +476,7 @@
         change_list = [change['path'] for change in patch]
         node = self.baremetal.update_node(machine, **attrs)
         return dict(
-            node=self._normalize_machine(node._to_munch()),
+            node=self._normalize_machine(node),
             changes=change_list
         )
 
@@ -573,7 +572,7 @@
         node = self.baremetal.set_node_provision_state(
             name_or_id, target=state, config_drive=configdrive,
             wait=wait, timeout=timeout)
-        return node._to_munch()
+        return self._normalize_machine(node)
 
     def set_machine_maintenance_state(
             self,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/openstack/cloud/_normalize.py 
new/openstacksdk-0.36.2/openstack/cloud/_normalize.py
--- old/openstacksdk-0.36.0/openstack/cloud/_normalize.py       2019-09-18 
17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/cloud/_normalize.py       2020-03-16 
17:30:49.000000000 +0100
@@ -1168,13 +1168,14 @@
 
     def _normalize_machine(self, machine):
         """Normalize Ironic Machine"""
-        machine = machine.copy()
+        if isinstance(machine, resource.Resource):
+            machine = machine._to_munch()
+        else:
+            machine = machine.copy()
 
         # Discard noise
         self._remove_novaclient_artifacts(machine)
 
-        # TODO(mordred) Normalize this resource
-
         return machine
 
     def _normalize_roles(self, roles):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/openstack/cloud/meta.py 
new/openstacksdk-0.36.2/openstack/cloud/meta.py
--- old/openstacksdk-0.36.0/openstack/cloud/meta.py     2019-09-18 
17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/cloud/meta.py     2020-03-16 
17:30:48.000000000 +0100
@@ -484,10 +484,17 @@
     """
     server_vars = add_server_interfaces(cloud, server)
 
-    flavor_id = server['flavor']['id']
-    flavor_name = cloud.get_flavor_name(flavor_id)
-    if flavor_name:
-        server_vars['flavor']['name'] = flavor_name
+    flavor_id = server['flavor'].get('id')
+    if flavor_id:
+        # In newer nova, the flavor record can be kept around for flavors
+        # that no longer exist. The id and name are not there.
+        flavor_name = cloud.get_flavor_name(flavor_id)
+        if flavor_name:
+            server_vars['flavor']['name'] = flavor_name
+    elif 'original_name' in server['flavor']:
+        # Users might be have code still expecting name. That name is in
+        # original_name.
+        server_vars['flavor']['name'] = server['flavor']['original_name']
 
     expand_server_security_groups(cloud, server)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/openstack/compute/v2/server_group.py 
new/openstacksdk-0.36.2/openstack/compute/v2/server_group.py
--- old/openstacksdk-0.36.0/openstack/compute/v2/server_group.py        
2019-09-18 17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/compute/v2/server_group.py        
2020-03-16 17:30:48.000000000 +0100
@@ -70,7 +70,7 @@
                 if self.policies:
                     if not self.policy and isinstance(self.policies, list):
                         self.policy = self.policies[0]
-                    self.policies = None
+                    self._body.clean(only={'policies'})
                 microversion = self._max_microversion
             else:
                 if self.rules:
@@ -80,6 +80,6 @@
                 if self.policy:
                     if not self.policies:
                         self.policies = [self.policy]
-                    self.policy = None
+                    self._body.clean(only={'policy'})
 
         return microversion
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/openstack/connection.py 
new/openstacksdk-0.36.2/openstack/connection.py
--- old/openstacksdk-0.36.0/openstack/connection.py     2019-09-18 
17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/connection.py     2020-03-16 
17:30:49.000000000 +0100
@@ -177,6 +177,7 @@
 :ref:`service-proxies` documentation.
 """
 import warnings
+import weakref
 
 import keystoneauth1.exceptions
 import requestsexceptions
@@ -431,7 +432,7 @@
             # Hide a reference to the connection on the session to help with
             # backwards compatibility for folks trying to just pass
             # conn.session to a Resource method's session argument.
-            self.session._sdk_connection = self
+            self.session._sdk_connection = weakref.proxy(self)
         return self._session
 
     def add_service(self, service):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/openstack/network/v2/router.py 
new/openstacksdk-0.36.2/openstack/network/v2/router.py
--- old/openstacksdk-0.36.0/openstack/network/v2/router.py      2019-09-18 
17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/network/v2/router.py      2020-03-16 
17:30:49.000000000 +0100
@@ -10,6 +10,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+from openstack import exceptions
 from openstack import resource
 from openstack import utils
 
@@ -74,6 +75,11 @@
     #: Timestamp when the router was created.
     updated_at = resource.Body('updated_at')
 
+    def _put(self, session, url, body):
+        resp = session.put(url, json=body)
+        exceptions.raise_from_response(resp)
+        return resp
+
     def add_interface(self, session, **body):
         """Add an internal interface to a logical router.
 
@@ -82,9 +88,11 @@
         :param dict body: The body requested to be updated on the router
 
         :returns: The body of the response as a dictionary.
+
+        :raises: :class:`~openstack.exceptions.SDKException` on error.
         """
         url = utils.urljoin(self.base_path, self.id, 'add_router_interface')
-        resp = session.put(url, json=body)
+        resp = self._put(session, url, body)
         return resp.json()
 
     def remove_interface(self, session, **body):
@@ -95,9 +103,11 @@
         :param dict body: The body requested to be updated on the router
 
         :returns: The body of the response as a dictionary.
+
+        :raises: :class:`~openstack.exceptions.SDKException` on error.
         """
         url = utils.urljoin(self.base_path, self.id, 'remove_router_interface')
-        resp = session.put(url, json=body)
+        resp = self._put(session, url, body)
         return resp.json()
 
     def add_gateway(self, session, **body):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/openstack/network/v2/security_group.py 
new/openstacksdk-0.36.2/openstack/network/v2/security_group.py
--- old/openstacksdk-0.36.0/openstack/network/v2/security_group.py      
2019-09-18 17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/network/v2/security_group.py      
2020-03-16 17:30:49.000000000 +0100
@@ -26,8 +26,8 @@
     allow_list = True
 
     _query_mapping = resource.QueryParameters(
-        'description', 'name', 'project_id', 'tenant_id', 'revision_number',
-        'sort_dir', 'sort_key',
+        'description', 'fields', 'name', 'project_id', 'tenant_id',
+        'revision_number', 'sort_dir', 'sort_key',
         **resource.TagMixin._tag_query_parameters
     )
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/openstack/network/v2/trunk.py 
new/openstacksdk-0.36.2/openstack/network/v2/trunk.py
--- old/openstacksdk-0.36.0/openstack/network/v2/trunk.py       2019-09-18 
17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/network/v2/trunk.py       2020-03-16 
17:30:48.000000000 +0100
@@ -10,6 +10,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+from openstack import exceptions
 from openstack import resource
 from openstack import utils
 
@@ -54,18 +55,21 @@
 
     def add_subports(self, session, subports):
         url = utils.urljoin('/trunks', self.id, 'add_subports')
-        session.put(url, json={'sub_ports': subports})
-        self._body.attributes.update({'sub_ports': subports})
+        resp = session.put(url, json={'sub_ports': subports})
+        exceptions.raise_from_response(resp)
+        self._body.attributes.update(resp.json())
         return self
 
     def delete_subports(self, session, subports):
         url = utils.urljoin('/trunks', self.id, 'remove_subports')
-        session.put(url, json={'sub_ports': subports})
-        self._body.attributes.update({'sub_ports': subports})
+        resp = session.put(url, json={'sub_ports': subports})
+        exceptions.raise_from_response(resp)
+        self._body.attributes.update(resp.json())
         return self
 
     def get_subports(self, session):
         url = utils.urljoin('/trunks', self.id, 'get_subports')
         resp = session.get(url)
+        exceptions.raise_from_response(resp)
         self._body.attributes.update(resp.json())
         return resp.json()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/openstack/resource.py 
new/openstacksdk-0.36.2/openstack/resource.py
--- old/openstacksdk-0.36.0/openstack/resource.py       2019-09-18 
17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/resource.py       2020-03-16 
17:30:49.000000000 +0100
@@ -1215,7 +1215,10 @@
             raise exceptions.NotSupported(message)
 
         actual = self._get_microversion_for(session, action)
-        if actual is None:
+
+        if expected is None:
+            return actual
+        elif actual is None:
             message = ("API version %s is required, but the default "
                        "version will be used.") % expected
             _raise(message)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/openstack/tests/functional/baremetal/test_baremetal_node.py
 
new/openstacksdk-0.36.2/openstack/tests/functional/baremetal/test_baremetal_node.py
--- 
old/openstacksdk-0.36.0/openstack/tests/functional/baremetal/test_baremetal_node.py
 2019-09-18 17:49:02.000000000 +0200
+++ 
new/openstacksdk-0.36.2/openstack/tests/functional/baremetal/test_baremetal_node.py
 2020-03-16 17:30:49.000000000 +0100
@@ -10,6 +10,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+import random
 import uuid
 
 from openstack import exceptions
@@ -154,6 +155,24 @@
                                                      wait=True)
         self.assertEqual(node.provision_state, 'available')
 
+    def test_node_create_in_enroll_provide_by_name(self):
+        name = 'node-%d' % random.randint(0, 1000)
+        node = self.create_node(provision_state='enroll', name=name)
+        self.node_id = node.id
+
+        self.assertEqual(node.driver, 'fake-hardware')
+        self.assertEqual(node.provision_state, 'enroll')
+        self.assertIsNone(node.power_state)
+        self.assertFalse(node.is_maintenance)
+
+        node = self.conn.baremetal.set_node_provision_state(name, 'manage',
+                                                            wait=True)
+        self.assertEqual(node.provision_state, 'manageable')
+
+        node = self.conn.baremetal.set_node_provision_state(name, 'provide',
+                                                            wait=True)
+        self.assertEqual(node.provision_state, 'available')
+
     def test_node_power_state(self):
         node = self.create_node()
         self.assertIsNone(node.power_state)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/openstack/tests/functional/base.py 
new/openstacksdk-0.36.2/openstack/tests/functional/base.py
--- old/openstacksdk-0.36.0/openstack/tests/functional/base.py  2019-09-18 
17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/tests/functional/base.py  2020-03-16 
17:30:49.000000000 +0100
@@ -14,7 +14,6 @@
 import openstack.config
 
 from keystoneauth1 import discover
-from keystoneauth1 import exceptions as _exceptions
 from openstack import connection
 from openstack.tests import base
 
@@ -114,8 +113,6 @@
             self.assertIsNone(result)
         self.addCleanup(cleanup)
 
-    # TODO(shade) Replace this with call to conn.has_service when we've merged
-    #             the shade methods into Connection.
     def require_service(self, service_type, min_microversion=None, **kwargs):
         """Method to check whether a service exists
 
@@ -128,16 +125,16 @@
 
         :returns: True if the service exists, otherwise False.
         """
-        try:
-            data = self.conn.session.get_endpoint_data(
-                service_type=service_type, **kwargs)
-        except _exceptions.EndpointNotFound:
+        if not self.conn.has_service(service_type):
             self.skipTest('Service {service_type} not found in cloud'.format(
                 service_type=service_type))
 
         if not min_microversion:
             return
 
+        data = self.conn.session.get_endpoint_data(
+            service_type=service_type, **kwargs)
+
         if not (data.min_microversion
                 and data.max_microversion
                 and discover.version_between(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/openstack/tests/functional/cloud/test_inventory.py 
new/openstacksdk-0.36.2/openstack/tests/functional/cloud/test_inventory.py
--- old/openstacksdk-0.36.0/openstack/tests/functional/cloud/test_inventory.py  
2019-09-18 17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/tests/functional/cloud/test_inventory.py  
2020-03-16 17:30:49.000000000 +0100
@@ -49,12 +49,15 @@
     def _test_host_content(self, host):
         self.assertEqual(host['image']['id'], self.image.id)
         self.assertNotIn('links', host['image'])
-        self.assertEqual(host['flavor']['id'], self.flavor.id)
+        # TODO(mordred) Add this back wnen ksa releases
+        # self.assertNotIn('id', host['flavor'])
         self.assertNotIn('links', host['flavor'])
         self.assertNotIn('links', host)
         self.assertIsInstance(host['volumes'], list)
         self.assertIsInstance(host['metadata'], dict)
         self.assertIn('interface_ip', host)
+        # TODO(mordred) Add this back wnen ksa releases
+        # self.assertIn('ram', host['flavor'])
 
     def _test_expanded_host_content(self, host):
         self.assertEqual(host['image']['name'], self.image.name)
@@ -81,9 +84,12 @@
         self.assertEqual(host['image']['id'], self.image.id)
         self.assertNotIn('links', host['image'])
         self.assertNotIn('name', host['name'])
-        self.assertEqual(host['flavor']['id'], self.flavor.id)
+        # TODO(mordred) Add this back wnen ksa releases
+        # self.assertNotIn('id', host['flavor'])
         self.assertNotIn('links', host['flavor'])
         self.assertNotIn('name', host['flavor'])
+        # TODO(mordred) Add this back wnen ksa releases
+        # self.assertIn('ram', host['flavor'])
 
         host_found = False
         for host in self.inventory.list_hosts(expand=False):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/openstack/tests/unit/baremetal/v1/test_node.py 
new/openstacksdk-0.36.2/openstack/tests/unit/baremetal/v1/test_node.py
--- old/openstacksdk-0.36.0/openstack/tests/unit/baremetal/v1/test_node.py      
2019-09-18 17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/tests/unit/baremetal/v1/test_node.py      
2020-03-16 17:30:49.000000000 +0100
@@ -183,6 +183,18 @@
                                self.node.wait_for_provision_state,
                                self.session, 'manageable')
 
+    def test_failure_error(self, mock_fetch):
+        def _get_side_effect(_self, session):
+            self.node.provision_state = 'error'
+            self.assertIs(session, self.session)
+
+        mock_fetch.side_effect = _get_side_effect
+
+        self.assertRaisesRegex(exceptions.ResourceFailure,
+                               'failure state "error"',
+                               self.node.wait_for_provision_state,
+                               self.session, 'manageable')
+
     def test_enroll_as_failure(self, mock_fetch):
         def _get_side_effect(_self, session):
             self.node.provision_state = 'enroll'
@@ -214,6 +226,11 @@
                           abort_on_failed_state=False)
 
 
+def _fake_assert(self, session, action, expected, error_message=None):
+    return expected
+
+
[email protected](node.Node, '_assert_microversion_for', _fake_assert)
 @mock.patch.object(node.Node, 'fetch', lambda self, session: self)
 @mock.patch.object(exceptions, 'raise_from_response', mock.Mock())
 class TestNodeSetProvisionState(base.TestCase):
@@ -538,6 +555,7 @@
         mock_fetch.assert_called_with(self.node, self.session)
 
 
[email protected](node.Node, '_assert_microversion_for', _fake_assert)
 @mock.patch.object(exceptions, 'raise_from_response', mock.Mock())
 class TestNodeSetPowerState(base.TestCase):
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/openstack/tests/unit/cloud/test_baremetal_node.py 
new/openstacksdk-0.36.2/openstack/tests/unit/cloud/test_baremetal_node.py
--- old/openstacksdk-0.36.0/openstack/tests/unit/cloud/test_baremetal_node.py   
2019-09-18 17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/tests/unit/cloud/test_baremetal_node.py   
2020-03-16 17:30:48.000000000 +0100
@@ -213,8 +213,9 @@
                  json=self.fake_baremetal_node,
                  validate=dict(json=test_patch)),
         ])
-        self.cloud.patch_machine(
+        result = self.cloud.patch_machine(
             self.fake_baremetal_node['uuid'], test_patch)
+        self.assertEqual(self.fake_baremetal_node['uuid'], result['uuid'])
 
         self.assert_calls()
 
@@ -759,10 +760,11 @@
                      append=[self.fake_baremetal_node['uuid']]),
                  json=self.fake_baremetal_node),
         ])
-        self.cloud.node_set_provision_state(
+        result = self.cloud.node_set_provision_state(
             self.fake_baremetal_node['uuid'],
             'active',
             configdrive='http://host/file')
+        self.assertEqual(self.fake_baremetal_node['uuid'], result['uuid'])
 
         self.assert_calls()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/openstack/tests/unit/network/v2/test_router.py 
new/openstacksdk-0.36.2/openstack/tests/unit/network/v2/test_router.py
--- old/openstacksdk-0.36.0/openstack/tests/unit/network/v2/test_router.py      
2019-09-18 17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/tests/unit/network/v2/test_router.py      
2020-03-16 17:30:49.000000000 +0100
@@ -11,6 +11,9 @@
 # under the License.
 
 import mock
+import testtools
+
+from openstack import exceptions
 from openstack.tests.unit import base
 
 from openstack.network.v2 import router
@@ -118,6 +121,7 @@
         response = mock.Mock()
         response.body = {"subnet_id": "3", "port_id": "2"}
         response.json = mock.Mock(return_value=response.body)
+        response.status_code = 200
         sess = mock.Mock()
         sess.put = mock.Mock(return_value=response)
         body = {"subnet_id": "3"}
@@ -133,6 +137,7 @@
         response = mock.Mock()
         response.body = {"subnet_id": "3", "port_id": "3"}
         response.json = mock.Mock(return_value=response.body)
+        response.status_code = 200
         sess = mock.Mock()
         sess.put = mock.Mock(return_value=response)
 
@@ -149,6 +154,7 @@
         response = mock.Mock()
         response.body = {"subnet_id": "3", "port_id": "2"}
         response.json = mock.Mock(return_value=response.body)
+        response.status_code = 200
         sess = mock.Mock()
         sess.put = mock.Mock(return_value=response)
         body = {"subnet_id": "3"}
@@ -164,6 +170,7 @@
         response = mock.Mock()
         response.body = {"subnet_id": "3", "port_id": "3"}
         response.json = mock.Mock(return_value=response.body)
+        response.status_code = 200
         sess = mock.Mock()
         sess.put = mock.Mock(return_value=response)
         body = {"network_id": 3, "enable_snat": True}
@@ -173,6 +180,39 @@
         sess.put.assert_called_with(url,
                                     json=body)
 
+    def test_add_interface_4xx(self):
+        # Neutron may return 4xx, we have to raise if that happens
+        sot = router.Router(**EXAMPLE)
+        response = mock.Mock()
+        msg = '.*borked'
+        response.body = {'NeutronError': {'message': msg}}
+        response.json = mock.Mock(return_value=response.body)
+        response.ok = False
+        response.status_code = 409
+        response.headers = {'content-type': 'application/json'}
+        sess = mock.Mock()
+        sess.put = mock.Mock(return_value=response)
+        body = {'subnet_id': '3'}
+        with testtools.ExpectedException(exceptions.ConflictException, msg):
+            sot.add_interface(sess, **body)
+
+    def test_remove_interface_4xx(self):
+        # Neutron may return 4xx for example if a router interface has
+        # extra routes referring to it as a nexthop
+        sot = router.Router(**EXAMPLE)
+        response = mock.Mock()
+        msg = '.*borked'
+        response.body = {'NeutronError': {'message': msg}}
+        response.json = mock.Mock(return_value=response.body)
+        response.ok = False
+        response.status_code = 409
+        response.headers = {'content-type': 'application/json'}
+        sess = mock.Mock()
+        sess.put = mock.Mock(return_value=response)
+        body = {'subnet_id': '3'}
+        with testtools.ExpectedException(exceptions.ConflictException, msg):
+            sot.remove_interface(sess, **body)
+
     def test_add_router_gateway(self):
         # Add gateway to a router
         sot = router.Router(**EXAMPLE_WITH_OPTIONAL)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/openstack/tests/unit/network/v2/test_security_group.py 
new/openstacksdk-0.36.2/openstack/tests/unit/network/v2/test_security_group.py
--- 
old/openstacksdk-0.36.0/openstack/tests/unit/network/v2/test_security_group.py  
    2019-09-18 17:49:02.000000000 +0200
+++ 
new/openstacksdk-0.36.2/openstack/tests/unit/network/v2/test_security_group.py  
    2020-03-16 17:30:49.000000000 +0100
@@ -78,6 +78,7 @@
 
         self.assertDictEqual({'any_tags': 'tags-any',
                               'description': 'description',
+                              'fields': 'fields',
                               'limit': 'limit',
                               'marker': 'marker',
                               'name': 'name',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/openstack/tests/unit/network/v2/test_trunk.py 
new/openstacksdk-0.36.2/openstack/tests/unit/network/v2/test_trunk.py
--- old/openstacksdk-0.36.0/openstack/tests/unit/network/v2/test_trunk.py       
2019-09-18 17:49:02.000000000 +0200
+++ new/openstacksdk-0.36.2/openstack/tests/unit/network/v2/test_trunk.py       
2020-03-16 17:30:48.000000000 +0100
@@ -10,9 +10,12 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-from openstack.tests.unit import base
+import mock
+import testtools
 
+from openstack import exceptions
 from openstack.network.v2 import trunk
+from openstack.tests.unit import base
 
 EXAMPLE = {
     'id': 'IDENTIFIER',
@@ -31,7 +34,7 @@
 }
 
 
-class TestQoSPolicy(base.TestCase):
+class TestTrunk(base.TestCase):
 
     def test_basic(self):
         sot = trunk.Trunk()
@@ -54,3 +57,37 @@
         self.assertEqual(EXAMPLE['port_id'], sot.port_id)
         self.assertEqual(EXAMPLE['status'], sot.status)
         self.assertEqual(EXAMPLE['sub_ports'], sot.sub_ports)
+
+    def test_add_subports_4xx(self):
+        # Neutron may return 4xx for example if a port does not exist
+        sot = trunk.Trunk(**EXAMPLE)
+        response = mock.Mock()
+        msg = '.*borked'
+        response.body = {'NeutronError': {'message': msg}}
+        response.json = mock.Mock(return_value=response.body)
+        response.ok = False
+        response.status_code = 404
+        response.headers = {'content-type': 'application/json'}
+        sess = mock.Mock()
+        sess.put = mock.Mock(return_value=response)
+        subports = [{'port_id': 'abc', 'segmentation_id': '123',
+                     'segmentation_type': 'vlan'}]
+        with testtools.ExpectedException(exceptions.ResourceNotFound, msg):
+            sot.add_subports(sess, subports)
+
+    def test_delete_subports_4xx(self):
+        # Neutron may return 4xx for example if a port does not exist
+        sot = trunk.Trunk(**EXAMPLE)
+        response = mock.Mock()
+        msg = '.*borked'
+        response.body = {'NeutronError': {'message': msg}}
+        response.json = mock.Mock(return_value=response.body)
+        response.ok = False
+        response.status_code = 404
+        response.headers = {'content-type': 'application/json'}
+        sess = mock.Mock()
+        sess.put = mock.Mock(return_value=response)
+        subports = [{'port_id': 'abc', 'segmentation_id': '123',
+                     'segmentation_type': 'vlan'}]
+        with testtools.ExpectedException(exceptions.ResourceNotFound, msg):
+            sot.delete_subports(sess, subports)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/openstacksdk.egg-info/PKG-INFO 
new/openstacksdk-0.36.2/openstacksdk.egg-info/PKG-INFO
--- old/openstacksdk-0.36.0/openstacksdk.egg-info/PKG-INFO      2019-09-18 
17:50:24.000000000 +0200
+++ new/openstacksdk-0.36.2/openstacksdk.egg-info/PKG-INFO      2020-03-16 
17:32:10.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: openstacksdk
-Version: 0.36.0
+Version: 0.36.2
 Summary: An SDK for building applications to work with OpenStack
 Home-page: https://docs.openstack.org/openstacksdk/
 Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/openstacksdk.egg-info/SOURCES.txt 
new/openstacksdk-0.36.2/openstacksdk.egg-info/SOURCES.txt
--- old/openstacksdk-0.36.0/openstacksdk.egg-info/SOURCES.txt   2019-09-18 
17:50:24.000000000 +0200
+++ new/openstacksdk-0.36.2/openstacksdk.egg-info/SOURCES.txt   2020-03-16 
17:32:10.000000000 +0100
@@ -1256,6 +1256,7 @@
 releasenotes/notes/fix-dns-return-c810d5e6736322f1.yaml
 releasenotes/notes/fix-endpoint-override-ac41baeec9549ab3.yaml
 releasenotes/notes/fix-floating-ip-private-matching-84e369eee380a185.yaml
+releasenotes/notes/fix-for-microversion-70cd686b6d6e3fd0.yaml
 releasenotes/notes/fix-image-task-ae79502dd5c7ecba.yaml
 releasenotes/notes/fix-list-networks-a592725df64c306e.yaml
 releasenotes/notes/fix-missing-futures-a0617a1c1ce6e659.yaml
@@ -1322,12 +1323,14 @@
 releasenotes/notes/node-set-provision-state-3472cbd81c47458f.yaml
 releasenotes/notes/norm_role_assignments-a13f41768e62d40c.yaml
 releasenotes/notes/normalize-images-1331bea7bfffa36a.yaml
+releasenotes/notes/normalize-machine-290d9f2a3b3a7ef0.yaml
 releasenotes/notes/nova-flavor-to-rest-0a5757e35714a690.yaml
 releasenotes/notes/nova-old-microversion-5e4b8e239ba44096.yaml
 releasenotes/notes/object-checksum-generation-ea1c1e47d2290054.yaml
 releasenotes/notes/object-chunked-data-ee619b7d4759b8d2.yaml
 releasenotes/notes/object-search-a5f5ec4b2df3e045.yaml
 releasenotes/notes/option-precedence-1fecab21fdfb2c33.yaml
+releasenotes/notes/provision-state-negotiation-0155b4d0e932054c.yaml
 releasenotes/notes/remote-profile-100218d08b25019d.yaml
 releasenotes/notes/remove-auto-container-527f1807605b42c0.yaml
 releasenotes/notes/remove-block-store-details-classes-158ab1f46655320a.yaml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/openstacksdk.egg-info/pbr.json 
new/openstacksdk-0.36.2/openstacksdk.egg-info/pbr.json
--- old/openstacksdk-0.36.0/openstacksdk.egg-info/pbr.json      2019-09-18 
17:50:24.000000000 +0200
+++ new/openstacksdk-0.36.2/openstacksdk.egg-info/pbr.json      2020-03-16 
17:32:10.000000000 +0100
@@ -1 +1 @@
-{"git_version": "8b85e8c9", "is_release": true}
\ No newline at end of file
+{"git_version": "211bdc68", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/releasenotes/notes/fix-for-microversion-70cd686b6d6e3fd0.yaml
 
new/openstacksdk-0.36.2/releasenotes/notes/fix-for-microversion-70cd686b6d6e3fd0.yaml
--- 
old/openstacksdk-0.36.0/releasenotes/notes/fix-for-microversion-70cd686b6d6e3fd0.yaml
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/openstacksdk-0.36.2/releasenotes/notes/fix-for-microversion-70cd686b6d6e3fd0.yaml
       2020-03-16 17:30:48.000000000 +0100
@@ -0,0 +1,14 @@
+---
+fixes:
+  - |
+    In April 2019 the microversion support for the Server resource was 
increased
+    to ``2.72``. Unfortunately, due to an issue with version discovery 
documents,
+    this increase never actually became effective. A fix is coming in 
``3.17.2`` of
+    ``keystoneauth`` which will unbreak version discovery and cause the 
microversion
+    support to start working.
+upgrade:
+  - |
+    Due to the fix in microversion support in `keystoneauth`, Servers will be
+    fetched using microversion ``2.72``. Code that assumes the existence of a
+    ``flavor.id`` field in the Server record should be removed, as it does not 
exist
+    in new microversions and cannot be filled in behind the scenes.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/releasenotes/notes/normalize-machine-290d9f2a3b3a7ef0.yaml
 
new/openstacksdk-0.36.2/releasenotes/notes/normalize-machine-290d9f2a3b3a7ef0.yaml
--- 
old/openstacksdk-0.36.0/releasenotes/notes/normalize-machine-290d9f2a3b3a7ef0.yaml
  1970-01-01 01:00:00.000000000 +0100
+++ 
new/openstacksdk-0.36.2/releasenotes/notes/normalize-machine-290d9f2a3b3a7ef0.yaml
  2020-03-16 17:30:48.000000000 +0100
@@ -0,0 +1,4 @@
+---
+fixes:
+  - |
+    Fixes normalization of bare metal machines in the ``patch_machine`` call.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openstacksdk-0.36.0/releasenotes/notes/provision-state-negotiation-0155b4d0e932054c.yaml
 
new/openstacksdk-0.36.2/releasenotes/notes/provision-state-negotiation-0155b4d0e932054c.yaml
--- 
old/openstacksdk-0.36.0/releasenotes/notes/provision-state-negotiation-0155b4d0e932054c.yaml
        1970-01-01 01:00:00.000000000 +0100
+++ 
new/openstacksdk-0.36.2/releasenotes/notes/provision-state-negotiation-0155b4d0e932054c.yaml
        2020-03-16 17:30:49.000000000 +0100
@@ -0,0 +1,11 @@
+---
+fixes:
+  - |
+    Fixes API version negotiation in the following bare metal node calls:
+
+    * ``set_node_provision_state``
+    * ``set_node_power_state``
+
+    Previously an unexpectingly low version could be negotiated, breaking
+    certain features, for example calling the ``provide`` provisioning action
+    with a node name.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openstacksdk-0.36.0/tox.ini 
new/openstacksdk-0.36.2/tox.ini
--- old/openstacksdk-0.36.0/tox.ini     2019-09-18 17:49:08.000000000 +0200
+++ new/openstacksdk-0.36.2/tox.ini     2020-03-16 17:30:49.000000000 +0100
@@ -18,7 +18,7 @@
     OS_STDOUT_CAPTURE={env:OS_STDOUT_CAPTURE:true}
     OS_STDERR_CAPTURE={env:OS_STDERR_CAPTURE:true}
 deps =
-    
-c{env:UPPER_CONSTRAINTS_FILE:https://opendev.org/openstack/requirements/raw/branch/master/upper-constraints.txt}
+    
-c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/train}
     -r{toxinidir}/test-requirements.txt
     -r{toxinidir}/requirements.txt
 commands = stestr run {posargs}
@@ -78,14 +78,14 @@
 
 [testenv:docs]
 deps =
-    
-c{env:UPPER_CONSTRAINTS_FILE:https://opendev.org/openstack/requirements/raw/branch/master/upper-constraints.txt}
+    
-c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/train}
     -r{toxinidir}/requirements.txt
     -r{toxinidir}/doc/requirements.txt
 commands = sphinx-build -W -d doc/build/doctrees -b html doc/source/ 
doc/build/html
 
 [testenv:releasenotes]
 deps =
-    
-c{env:UPPER_CONSTRAINTS_FILE:https://opendev.org/openstack/requirements/raw/branch/master/upper-constraints.txt}
+    
-c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/train}
     -r{toxinidir}/requirements.txt
     -r{toxinidir}/doc/requirements.txt
 commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html 
releasenotes/source releasenotes/build/html


Reply via email to