Hello community,

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

Package is "python-openstackclient"

Wed Feb 14 10:50:39 2018 rev:13 rq:575941 version:3.14.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-openstackclient/python-openstackclient.changes
    2018-01-24 15:28:21.992361455 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-openstackclient.new/python-openstackclient.changes
       2018-02-14 10:50:40.495728908 +0100
@@ -1,0 +2,21 @@
+Mon Feb 12 10:01:50 UTC 2018 - cloud-de...@suse.de
+
+- update to version 3.14.0 (bsc#1078607)
+  - Fix use of new openstacksdk connection
+  - Fix func tests: Ensure to pass OS_CLOUD envvar
+  - Use Zuul v3 fetch-subunit-output
+  - Switch to use stestr directly
+  - Fix indentation in authentication.rst
+  - Allow ports filtering with device_id
+  - Rework Network client config for new SDK Connection
+  - Partially Revert "Update new documentation PTI jobs"
+  - Update new documentation PTI jobs
+  - Check that Glance returns image data before processing it
+  - Corrected spelling mistake
+  - Allow port list to shown undefined attributes
+  - Add floating IP qos_policy actions
+  - Replace assert with condition
+  - flavor: clarify --swap description
+  - Updated from global requirements
+
+-------------------------------------------------------------------

Old:
----
  python-openstackclient-3.13.0.tar.gz

New:
----
  python-openstackclient-3.14.0.tar.gz

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

Other differences:
------------------
++++++ python-openstackclient.spec ++++++
--- /var/tmp/diff_new_pack.TYsvSn/_old  2018-02-14 10:50:41.291700263 +0100
+++ /var/tmp/diff_new_pack.TYsvSn/_new  2018-02-14 10:50:41.303699831 +0100
@@ -17,16 +17,16 @@
 
 
 Name:           python-openstackclient
-Version:        3.13.0
+Version:        3.14.0
 Release:        0
 Summary:        OpenStack Command-line Client
 License:        Apache-2.0
 Group:          Development/Languages/Python
 Url:            https://launchpad.net/python-openstackclient
-Source0:        
https://files.pythonhosted.org/packages/source/p/python-openstackclient/python-openstackclient-3.13.0.tar.gz
+Source0:        
https://files.pythonhosted.org/packages/source/p/python-openstackclient/python-openstackclient-3.14.0.tar.gz
 BuildRequires:  openstack-macros
 BuildRequires:  python-devel
-BuildRequires:  python2-cinderclient >= 3.2.0
+BuildRequires:  python2-cinderclient >= 3.3.0
 BuildRequires:  python2-cliff >= 2.8.0
 BuildRequires:  python2-fixtures >= 3.0.0
 BuildRequires:  python2-glanceclient >= 2.8.0
@@ -36,8 +36,8 @@
 BuildRequires:  python2-openstacksdk >= 0.9.19
 BuildRequires:  python2-os-client-config >= 1.28.0
 BuildRequires:  python2-os-testr >= 1.0.0
-BuildRequires:  python2-osc-lib >= 1.7.0
-BuildRequires:  python2-oslotest >= 1.10.0
+BuildRequires:  python2-osc-lib >= 1.8.0
+BuildRequires:  python2-oslotest >= 3.2.0
 BuildRequires:  python2-osprofiler >= 1.4.0
 BuildRequires:  python2-requests >= 2.14.2
 BuildRequires:  python2-requests-mock >= 1.1.0
@@ -45,7 +45,7 @@
 BuildRequires:  python2-testrepository >= 0.0.18
 BuildRequires:  python2-testtools >= 2.2.0
 BuildRequires:  python2-wrapt >= 1.7.0
-BuildRequires:  python3-cinderclient >= 3.2.0
+BuildRequires:  python3-cinderclient >= 3.3.0
 BuildRequires:  python3-cliff >= 2.8.0
 BuildRequires:  python3-devel
 BuildRequires:  python3-fixtures >= 3.0.0
@@ -56,8 +56,8 @@
 BuildRequires:  python3-openstacksdk >= 0.9.19
 BuildRequires:  python3-os-client-config >= 1.28.0
 BuildRequires:  python3-os-testr >= 1.0.0
-BuildRequires:  python3-osc-lib >= 1.7.0
-BuildRequires:  python3-oslotest >= 1.10.0
+BuildRequires:  python3-osc-lib >= 1.8.0
+BuildRequires:  python3-oslotest >= 3.2.0
 BuildRequires:  python3-osprofiler >= 1.4.0
 BuildRequires:  python3-requests >= 2.14.2
 BuildRequires:  python3-requests-mock >= 1.1.0
@@ -66,17 +66,17 @@
 BuildRequires:  python3-testtools >= 2.2.0
 BuildRequires:  python3-wrapt >= 1.7.0
 Requires:       python-Babel >= 2.3.4
-Requires:       python-cinderclient >= 3.2.0
+Requires:       python-cinderclient >= 3.3.0
 Requires:       python-cliff >= 2.8.0
 Requires:       python-glanceclient >= 2.8.0
 Requires:       python-heatclient >= 1.10.0
-Requires:       python-keystoneauth1 >= 3.2.0
+Requires:       python-keystoneauth1 >= 3.3.0
 Requires:       python-keystoneclient >= 3.8.0
 Requires:       python-novaclient >= 9.1.0
 Requires:       python-openstacksdk >= 0.9.19
-Requires:       python-osc-lib >= 1.7.0
+Requires:       python-osc-lib >= 1.8.0
 Requires:       python-oslo.i18n >= 3.15.3
-Requires:       python-oslo.utils >= 3.31.0
+Requires:       python-oslo.utils >= 3.33.0
 Requires:       python-six >= 1.10.0
 BuildArch:      noarch
 %if 0%{?suse_version}
@@ -102,7 +102,7 @@
 BuildRequires:  python-Sphinx
 #BuildRequires:  python-aodhclient >= 0.9.0
 #BuildRequires:  python-barbicanclient >= 4.0.0
-#BuildRequires:  python-congressclient >= 1.3.0
+#BuildRequires:  python-congressclient >= 1.9.0
 #BuildRequires:  python-designateclient >= 2.7.0
 #BuildRequires:  python-heatclient >= 1.10.0
 #BuildRequires:  python-ironicclient >= 1.14.0
@@ -111,7 +111,7 @@
 #BuildRequires:  python-neutronclient >= 6.3.0
 BuildRequires:  python-openstackdocstheme >= 1.17.0
 #BuildRequires:  python-ironic-inspector-client >= 1.5.0
-#BuildRequires:  python-saharaclient >= 1.2.0
+#BuildRequires:  python-saharaclient >= 1.4.0
 #BuildRequires:  python-zaqarclient >= 1.0.0
 
 %description -n python-openstackclient-doc
@@ -121,7 +121,7 @@
 This package contains auto-generated documentation.
 
 %prep
-%autosetup -p1 -n python-openstackclient-3.13.0
+%autosetup -p1 -n python-openstackclient-3.14.0
 %py_req_cleanup
 sed -i 's/^warning-is-error.*/warning-is-error = 0/g' setup.cfg
 

++++++ python-openstackclient-3.13.0.tar.gz -> 
python-openstackclient-3.14.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-openstackclient-3.13.0/AUTHORS 
new/python-openstackclient-3.14.0/AUTHORS
--- old/python-openstackclient-3.13.0/AUTHORS   2017-12-13 22:39:41.000000000 
+0100
+++ new/python-openstackclient-3.14.0/AUTHORS   2018-01-25 15:28:58.000000000 
+0100
@@ -46,6 +46,7 @@
 Carlos Konstanski <ckonstan...@pippiandcarlos.com>
 Cedric Brandily <zze...@gmail.com>
 Chaozhe.Chen <chaozhe.c...@easystack.cn>
+Chen Hanxiao <che...@certusnet.com.cn>
 Choe, Cheng-Dae <white...@gmail.com>
 Chris Johnson <wchrisjohn...@gmail.com>
 Christian Berendt <bere...@b1-systems.de>
@@ -88,6 +89,7 @@
 Gilles Dubreuil <gil...@redhat.com>
 Guang Yee <guang....@hpe.com>
 Guojian Shao <guoj...@unitedstack.com>
+Guoqiang Ding <dingguoqi...@cloudin.cn>
 Gábor Antal <an...@inf.u-szeged.hu>
 Ha Van Tu <t...@vn.fujitsu.com>
 Hangdong Zhang <hdzh...@fiberhome.com>
@@ -149,6 +151,7 @@
 Kevin_Zheng <zhengzhe...@huawei.com>
 Kristi Nikolla <kniko...@bu.edu>
 Kyrylo Romanenko <kromane...@mirantis.com>
+LIU Yulong <i...@liuyulong.me>
 Lin Yang <lin.a.y...@intel.com>
 Lingxian Kong <anlin.k...@gmail.com>
 LiuNanke <nanke....@easystack.cn>
@@ -167,6 +170,7 @@
 Marek Denis <marek.de...@cern.ch>
 Mark Vanderwiel <vande...@us.ibm.com>
 Martin Schuppert <mschupp...@redhat.com>
+Masayuki Igawa <masay...@igawa.io>
 Matt Fischer <m...@mattfischer.com>
 Matt Joyce <matt.jo...@cloudscaling.com>
 Matt Riedemann <mriedem...@gmail.com>
@@ -176,6 +180,7 @@
 Michael Gugino <michael.gug...@walmart.com>
 Michael Johnson <johnso...@gmail.com>
 Michael McCune <m...@redhat.com>
+Mike Fedosin <mfedo...@redhat.com>
 Mikhail Feoktistov <mfeoktis...@virtuozzo.com>
 Min Min Ren <rmin...@cn.ibm.com>
 Mohan Muppidi <mkumar2...@gmail.com>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-openstackclient-3.13.0/ChangeLog 
new/python-openstackclient-3.14.0/ChangeLog
--- old/python-openstackclient-3.13.0/ChangeLog 2017-12-13 22:39:41.000000000 
+0100
+++ new/python-openstackclient-3.14.0/ChangeLog 2018-01-25 15:28:57.000000000 
+0100
@@ -1,6 +1,31 @@
 CHANGES
 =======
 
+3.14.0
+------
+
+* Updated from global requirements
+* Fix use of new openstacksdk connection
+* Rework Network client config for new SDK Connection
+* Replace assert with condition
+* Updated from global requirements
+* Corrected spelling mistake
+* Updated from global requirements
+* Fix indentation in authentication.rst
+* Partially Revert "Update new documentation PTI jobs"
+* Use Zuul v3 fetch-subunit-output
+* Updated from global requirements
+* Updated from global requirements
+* Add floating IP qos\_policy actions
+* Updated from global requirements
+* Check that Glance returns image data before processing it
+* Allow ports filtering with device\_id
+* Update new documentation PTI jobs
+* flavor: clarify --swap description
+* Switch to use stestr directly
+* Fix func tests: Ensure to pass OS\_CLOUD envvar
+* Updated from global requirements
+
 3.13.0
 ------
 
@@ -15,6 +40,7 @@
 * Release note cleanup
 * Set correct designate endpoint in docs
 * Make osc-tox-unit-tips work on other repos
+* Allow port list to shown undefined attributes
 * Updated from global requirements
 * Fix file mode on network-topology.rst
 * Add support for endpoing filter commands
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-openstackclient-3.13.0/PKG-INFO 
new/python-openstackclient-3.14.0/PKG-INFO
--- old/python-openstackclient-3.13.0/PKG-INFO  2017-12-13 22:39:43.000000000 
+0100
+++ new/python-openstackclient-3.14.0/PKG-INFO  2018-01-25 15:29:00.000000000 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: python-openstackclient
-Version: 3.13.0
+Version: 3.14.0
 Summary: OpenStack Command-line Client
 Home-page: https://docs.openstack.org/python-openstackclient/latest/
 Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-openstackclient-3.13.0/doc/requirements.txt 
new/python-openstackclient-3.14.0/doc/requirements.txt
--- old/python-openstackclient-3.13.0/doc/requirements.txt      1970-01-01 
01:00:00.000000000 +0100
+++ new/python-openstackclient-3.14.0/doc/requirements.txt      2018-01-25 
15:25:53.000000000 +0100
@@ -0,0 +1,6 @@
+# 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.
+openstackdocstheme>=1.18.1 # Apache-2.0
+reno>=2.5.0 # Apache-2.0
+sphinx!=1.6.6,>=1.6.2 # BSD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/doc/source/cli/authentication.rst 
new/python-openstackclient-3.14.0/doc/source/cli/authentication.rst
--- old/python-openstackclient-3.13.0/doc/source/cli/authentication.rst 
2017-12-13 22:34:42.000000000 +0100
+++ new/python-openstackclient-3.14.0/doc/source/cli/authentication.rst 
2018-01-25 15:25:53.000000000 +0100
@@ -114,22 +114,22 @@
 If using a user name and password to authenticate, specify either it's owning
 domain name or ID.
 
-  * ``--os-user-domain-name`` or ``OS_USER_DOMAIN_NAME``
+* ``--os-user-domain-name`` or ``OS_USER_DOMAIN_NAME``
 
-  * ``--os-user-domain-id`` or ``OS_USER_DOMAIN_ID``
+* ``--os-user-domain-id`` or ``OS_USER_DOMAIN_ID``
 
 If using a project name as authorization scope, specify either it's owning
 domain name or ID.
 
-  * ``--os-project-domain-name`` or ``OS_PROJECT_DOMAIN_NAME``
+* ``--os-project-domain-name`` or ``OS_PROJECT_DOMAIN_NAME``
 
-  * ``--os-project-domain-id`` or ``OS_PROJECT_DOMAIN_ID``
+* ``--os-project-domain-id`` or ``OS_PROJECT_DOMAIN_ID``
 
 If using a domain as authorization scope, set either it's name or ID.
 
-  * ``--os-domain-name`` or ``OS_DOMAIN_NAME``
+* ``--os-domain-name`` or ``OS_DOMAIN_NAME``
 
-  * ``--os-domain-id`` or ``OS_DOMAIN_ID``
+* ``--os-domain-id`` or ``OS_DOMAIN_ID``
 
 Note that if the user and project share the same domain, then simply setting
 ``--os-default-domain`` or ``OS_DEFAULT_DOMAIN`` to the domain ID is 
sufficient.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/doc/source/cli/command-objects/flavor.rst 
new/python-openstackclient-3.14.0/doc/source/cli/command-objects/flavor.rst
--- old/python-openstackclient-3.13.0/doc/source/cli/command-objects/flavor.rst 
2017-12-13 22:34:42.000000000 +0100
+++ new/python-openstackclient-3.14.0/doc/source/cli/command-objects/flavor.rst 
2018-01-25 15:25:53.000000000 +0100
@@ -44,7 +44,7 @@
 
 .. option:: --swap <size-mb>
 
-    Swap space size in MB (default 0M)
+    Additional swap space size in MB (default 0M)
 
 .. option:: --vcpus <num-cpu>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/doc/source/cli/command-objects/floating-ip.rst
 
new/python-openstackclient-3.14.0/doc/source/cli/command-objects/floating-ip.rst
--- 
old/python-openstackclient-3.13.0/doc/source/cli/command-objects/floating-ip.rst
    2017-12-13 22:34:42.000000000 +0100
+++ 
new/python-openstackclient-3.14.0/doc/source/cli/command-objects/floating-ip.rst
    2018-01-25 15:25:53.000000000 +0100
@@ -18,6 +18,7 @@
         [--floating-ip-address <ip-address>]
         [--fixed-ip-address <ip-address>]
         [--description <description>]
+        [--qos-policy <qos-policy>]
         [--project <project> [--project-domain <project-domain>]]
         <network>
 
@@ -46,6 +47,12 @@
     Set floating IP description
     *Network version 2 only*
 
+.. option:: --qos-policy <qos-policy>
+
+    QoS policy to attach to the floating IP (name or ID)
+
+    *Network version 2 only*
+
 .. option:: --project <project>
 
     Owner's project (name or ID)
@@ -154,6 +161,7 @@
     openstack floating ip set
         --port <port>
         [--fixed-ip-address <ip-address>]
+        [--qos-policy <qos-policy> | --no-qos-policy]
         <floating-ip>
 
 .. option:: --port <port>
@@ -164,6 +172,14 @@
 
     Fixed IP of the port (required only if port has multiple IPs)
 
+.. option:: --qos-policy <qos-policy>
+
+    Attach QoS policy to the floating IP (name or ID)
+
+.. option:: --no-qos-policy
+
+    Remove the QoS policy attached to the floating IP
+
 .. _floating_ip_set-floating-ip:
 .. describe:: <floating-ip>
 
@@ -193,12 +209,17 @@
 
     openstack floating ip unset
         --port
+        --qos-policy
         <floating-ip>
 
 .. option:: --port
 
     Disassociate any port associated with the floating IP
 
+.. option:: --qos-policy
+
+    Remove the QoS policy attached to the floating IP
+
 .. _floating_ip_unset-floating-ip:
 .. describe:: <floating-ip>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/doc/source/cli/command-objects/port.rst 
new/python-openstackclient-3.14.0/doc/source/cli/command-objects/port.rst
--- old/python-openstackclient-3.13.0/doc/source/cli/command-objects/port.rst   
2017-12-13 22:34:42.000000000 +0100
+++ new/python-openstackclient-3.14.0/doc/source/cli/command-objects/port.rst   
2018-01-25 15:25:53.000000000 +0100
@@ -170,7 +170,7 @@
 
     openstack port list
         [--device-owner <device-owner>]
-        [--router <router> | --server <server>]
+        [--router <router> | --server <server> | --device-id <device-id>]
         [--network <network>]
         [--mac-address <mac-address>]
         [--fixed-ip subnet=<subnet>,ip-address=<ip-address>]
@@ -192,6 +192,10 @@
 
     List only ports attached to this server (name or ID)
 
+.. option:: --device-id <device-id>
+
+    List only ports with the specified device ID
+
 .. option:: --network <network>
 
     List only ports attached to this network (name or ID)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/openstackclient/compute/v2/flavor.py 
new/python-openstackclient-3.14.0/openstackclient/compute/v2/flavor.py
--- old/python-openstackclient-3.13.0/openstackclient/compute/v2/flavor.py      
2017-12-13 22:34:42.000000000 +0100
+++ new/python-openstackclient-3.14.0/openstackclient/compute/v2/flavor.py      
2018-01-25 15:25:53.000000000 +0100
@@ -91,7 +91,7 @@
             type=int,
             metavar="<size-mb>",
             default=0,
-            help=_("Swap space size in MB (default 0M)")
+            help=_("Additional swap space size in MB (default 0M)")
         )
         parser.add_argument(
             "--vcpus",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/openstackclient/compute/v2/service.py 
new/python-openstackclient-3.14.0/openstackclient/compute/v2/service.py
--- old/python-openstackclient-3.13.0/openstackclient/compute/v2/service.py     
2017-12-13 22:34:42.000000000 +0100
+++ new/python-openstackclient-3.14.0/openstackclient/compute/v2/service.py     
2018-01-25 15:25:53.000000000 +0100
@@ -142,7 +142,7 @@
             "--disable-reason",
             default=None,
             metavar="<reason>",
-            help=_("Reason for disabling the service (in quotas). "
+            help=_("Reason for disabling the service (in quotes). "
                    "Should be used with --disable option.")
         )
         up_down_group = parser.add_mutually_exclusive_group()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/openstackclient/image/v2/image.py 
new/python-openstackclient-3.14.0/openstackclient/image/v2/image.py
--- old/python-openstackclient-3.13.0/openstackclient/image/v2/image.py 
2017-12-13 22:34:42.000000000 +0100
+++ new/python-openstackclient-3.14.0/openstackclient/image/v2/image.py 
2018-01-25 15:25:53.000000000 +0100
@@ -17,6 +17,7 @@
 
 import argparse
 import logging
+import sys
 
 from glanceclient.common import utils as gc_utils
 from osc_lib.cli import parseractions
@@ -649,6 +650,12 @@
         )
         data = image_client.images.data(image.id)
 
+        if data.wrapped is None:
+            msg = _('Image %s has no data.') % image.id
+            LOG.error(msg)
+            sys.stdout.write(msg + '\n')
+            raise SystemExit
+
         gc_utils.save_image(data, parsed_args.file)
 
 
@@ -1024,9 +1031,7 @@
 
         if parsed_args.properties:
             for k in parsed_args.properties:
-                try:
-                    assert(k in image.keys())
-                except AssertionError:
+                if k not in image:
                     LOG.error(_("property unset failed, '%s' is a "
                                 "nonexistent property "), k)
                     propret += 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/openstackclient/network/client.py 
new/python-openstackclient-3.14.0/openstackclient/network/client.py
--- old/python-openstackclient-3.13.0/openstackclient/network/client.py 
2017-12-13 22:34:42.000000000 +0100
+++ new/python-openstackclient-3.14.0/openstackclient/network/client.py 
2018-01-25 15:25:53.000000000 +0100
@@ -41,28 +41,36 @@
 
 def make_client(instance):
     """Returns a network proxy"""
-    if profile is None:
-        # New SDK
-        conn = connection.Connection(
-            config=instance._cli_options,
-            session=instance.session)
-    else:
-        prof = profile.Profile()
-        prof.set_region(API_NAME, instance.region_name)
-        prof.set_version(API_NAME, instance._api_version[API_NAME])
-        prof.set_interface(API_NAME, instance.interface)
-        conn = connection.Connection(authenticator=instance.session.auth,
-                                     verify=instance.session.verify,
-                                     cert=instance.session.cert,
-                                     profile=prof)
+    if getattr(instance, "sdk_connection", None) is None:
+        if profile is None:
+            # If the installed OpenStackSDK is new enough to not require a
+            # Profile obejct and osc-lib is not new enough to have created
+            # it for us, make an SDK Connection.
+            # NOTE(dtroyer): This can be removed when this bit is in the
+            #                released osc-lib in requirements.txt.
+            conn = connection.Connection(
+                config=instance._cli_options,
+                session=instance.session,
+            )
+        else:
+            # Fall back to the original Connection creation
+            prof = profile.Profile()
+            prof.set_region(API_NAME, instance.region_name)
+            prof.set_version(API_NAME, instance._api_version[API_NAME])
+            prof.set_interface(API_NAME, instance.interface)
+            conn = connection.Connection(
+                authenticator=instance.session.auth,
+                verify=instance.session.verify,
+                cert=instance.session.cert,
+                profile=prof,
+            )
+
+        instance.sdk_connection = conn
+
+    conn = instance.sdk_connection
     LOG.debug('Connection: %s', conn)
     LOG.debug('Network client initialized using OpenStack SDK: %s',
               conn.network)
-
-    # NOTE(dtroyer): Horrible ugly hack since we don't actually save
-    #                the connection anywhere yet, so stash it in the
-    #                instance directly from here for other uses
-    instance.sdk_connection = conn
     return conn.network
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/openstackclient/network/v2/floating_ip.py 
new/python-openstackclient-3.14.0/openstackclient/network/v2/floating_ip.py
--- old/python-openstackclient-3.13.0/openstackclient/network/v2/floating_ip.py 
2017-12-13 22:34:42.000000000 +0100
+++ new/python-openstackclient-3.14.0/openstackclient/network/v2/floating_ip.py 
2018-01-25 15:25:53.000000000 +0100
@@ -67,6 +67,10 @@
     if parsed_args.fixed_ip_address:
         attrs['fixed_ip_address'] = parsed_args.fixed_ip_address
 
+    if parsed_args.qos_policy:
+        attrs['qos_policy_id'] = network_client.find_qos_policy(
+            parsed_args.qos_policy, ignore_missing=False).id
+
     if parsed_args.description is not None:
         attrs['description'] = parsed_args.description
 
@@ -170,6 +174,11 @@
             help=_("Fixed IP address mapped to the floating IP")
         )
         parser.add_argument(
+            '--qos-policy',
+            metavar='<qos-policy>',
+            help=_("Attach QoS policy to the floating IP (name or ID)")
+        )
+        parser.add_argument(
             '--description',
             metavar='<description>',
             help=_('Set floating IP description')
@@ -462,6 +471,17 @@
             help=_("Fixed IP of the port "
                    "(required only if port has multiple IPs)")
         )
+        qos_policy_group = parser.add_mutually_exclusive_group()
+        qos_policy_group.add_argument(
+            '--qos-policy',
+            metavar='<qos-policy>',
+            help=_("Attach QoS policy to the floating IP (name or ID)")
+        )
+        qos_policy_group.add_argument(
+            '--no-qos-policy',
+            action='store_true',
+            help=_("Remove the QoS policy attached to the floating IP")
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -479,6 +499,13 @@
         if parsed_args.fixed_ip_address:
             attrs['fixed_ip_address'] = parsed_args.fixed_ip_address
 
+        if parsed_args.qos_policy:
+            attrs['qos_policy_id'] = client.find_qos_policy(
+                parsed_args.qos_policy, ignore_missing=False).id
+
+        if 'no_qos_policy' in parsed_args and parsed_args.no_qos_policy:
+            attrs['qos_policy_id'] = None
+
         client.update_ip(obj, **attrs)
 
 
@@ -549,6 +576,12 @@
             default=False,
             help=_("Disassociate any port associated with the floating IP")
         )
+        parser.add_argument(
+            '--qos-policy',
+            action='store_true',
+            default=False,
+            help=_("Remove the QoS policy attached to the floating IP")
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -559,8 +592,11 @@
             parsed_args.floating_ip,
             ignore_missing=False,
         )
+        attrs = {}
         if parsed_args.port:
-            attrs = {
-                'port_id': None,
-            }
+            attrs['port_id'] = None
+        if parsed_args.qos_policy:
+            attrs['qos_policy_id'] = None
+
+        if attrs:
             client.update_ip(obj, **attrs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/openstackclient/network/v2/port.py 
new/python-openstackclient-3.14.0/openstackclient/network/v2/port.py
--- old/python-openstackclient-3.13.0/openstackclient/network/v2/port.py        
2017-12-13 22:34:42.000000000 +0100
+++ new/python-openstackclient-3.14.0/openstackclient/network/v2/port.py        
2018-01-25 15:25:53.000000000 +0100
@@ -499,6 +499,11 @@
             metavar='<server>',
             help=_("List only ports attached to this server (name or ID)"),
         )
+        device_group.add_argument(
+            '--device-id',
+            metavar='<device-id>',
+            help=_("List only ports with the specified device ID")
+        )
         parser.add_argument(
             '--mac-address',
             metavar='<mac-address>',
@@ -553,6 +558,8 @@
             column_headers += ('Security Groups', 'Device Owner', 'Tags')
         if parsed_args.device_owner is not None:
             filters['device_owner'] = parsed_args.device_owner
+        if parsed_args.device_id is not None:
+            filters['device_id'] = parsed_args.device_id
         if parsed_args.router:
             _router = network_client.find_router(parsed_args.router,
                                                  ignore_missing=False)
@@ -584,9 +591,11 @@
 
         data = network_client.ports(**filters)
 
-        return (column_headers,
+        headers, attrs = utils.calculate_header_and_attrs(
+            column_headers, columns, parsed_args)
+        return (headers,
                 (utils.get_item_properties(
-                    s, columns,
+                    s, attrs,
                     formatters=_formatters,
                 ) for s in data))
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/openstackclient/tests/functional/network/v2/test_port.py
 
new/python-openstackclient-3.14.0/openstackclient/tests/functional/network/v2/test_port.py
--- 
old/python-openstackclient-3.13.0/openstackclient/tests/functional/network/v2/test_port.py
  2017-12-13 22:34:42.000000000 +0100
+++ 
new/python-openstackclient-3.14.0/openstackclient/tests/functional/network/v2/test_port.py
  2018-01-25 15:25:53.000000000 +0100
@@ -131,6 +131,16 @@
         self.assertNotIn(mac1, item_map.values())
         self.assertIn(mac2, item_map.values())
 
+        # Test list with unknown fields
+        json_output = json.loads(self.openstack(
+            'port list -f json -c ID -c Name -c device_id'
+        ))
+        id_list = [p['ID'] for p in json_output]
+        self.assertIn(id1, id_list)
+        self.assertIn(id2, id_list)
+        # Check an unknown field exists
+        self.assertIn('device_id', json_output[0])
+
     def test_port_set(self):
         """Test create, set, show, delete"""
         name = uuid.uuid4().hex
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/openstackclient/tests/functional/run_ostestr.sh
 
new/python-openstackclient-3.14.0/openstackclient/tests/functional/run_ostestr.sh
--- 
old/python-openstackclient-3.13.0/openstackclient/tests/functional/run_ostestr.sh
   2017-12-13 22:34:42.000000000 +0100
+++ 
new/python-openstackclient-3.14.0/openstackclient/tests/functional/run_ostestr.sh
   1970-01-01 01:00:00.000000000 +0100
@@ -1,16 +0,0 @@
-#!/bin/bash
-
-# This is a script that runs ostestr with the openrc OS_ variables sourced.
-# Do not run this script unless you know what you're doing.
-# For more information refer to:
-# https://docs.openstack.org/python-openstackclient/latest/
-
-# Source environment variables to kick things off
-if [ -f ~stack/devstack/openrc ] ; then
-    source ~stack/devstack/openrc admin admin
-fi
-
-echo 'Running tests with:'
-env | grep OS
-
-ostestr $*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/openstackclient/tests/functional/run_stestr.sh
 
new/python-openstackclient-3.14.0/openstackclient/tests/functional/run_stestr.sh
--- 
old/python-openstackclient-3.13.0/openstackclient/tests/functional/run_stestr.sh
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/python-openstackclient-3.14.0/openstackclient/tests/functional/run_stestr.sh
    2018-01-25 15:25:53.000000000 +0100
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+# This is a script that runs ostestr with the openrc OS_ variables sourced.
+# Do not run this script unless you know what you're doing.
+# For more information refer to:
+# https://docs.openstack.org/python-openstackclient/latest/
+
+# Source environment variables to kick things off
+if [ -f ~stack/devstack/openrc ] ; then
+    source ~stack/devstack/openrc admin admin
+fi
+
+echo 'Running tests with:'
+env | grep OS
+
+stestr run $*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/openstackclient/tests/unit/image/v2/test_image.py
 
new/python-openstackclient-3.14.0/openstackclient/tests/unit/image/v2/test_image.py
--- 
old/python-openstackclient-3.13.0/openstackclient/tests/unit/image/v2/test_image.py
 2017-12-13 22:34:42.000000000 +0100
+++ 
new/python-openstackclient-3.14.0/openstackclient/tests/unit/image/v2/test_image.py
 2018-01-25 15:25:53.000000000 +0100
@@ -15,6 +15,7 @@
 
 import copy
 
+from glanceclient.common import utils as glanceclient_utils
 from glanceclient.v2 import schemas
 import mock
 from osc_lib import exceptions
@@ -1505,3 +1506,53 @@
             self.image.id, 'test'
         )
         self.assertIsNone(result)
+
+
+class TestImageSave(TestImage):
+
+    image = image_fakes.FakeImage.create_one_image({})
+
+    def setUp(self):
+        super(TestImageSave, self).setUp()
+
+        # Generate a request id
+        self.resp = mock.MagicMock()
+        self.resp.headers['x-openstack-request-id'] = 'req_id'
+
+        # Get the command object to test
+        self.cmd = image.SaveImage(self.app, None)
+
+    def test_save_data(self):
+        req_id_proxy = glanceclient_utils.RequestIdProxy(
+            ['some_data', self.resp]
+        )
+        self.images_mock.data.return_value = req_id_proxy
+
+        arglist = ['--file', '/path/to/file', self.image.id]
+
+        verifylist = [
+            ('file', '/path/to/file'),
+            ('image', self.image.id)
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        with mock.patch('glanceclient.common.utils.save_image') as mocked_save:
+            self.cmd.take_action(parsed_args)
+            mocked_save.assert_called_once_with(req_id_proxy, '/path/to/file')
+
+    def test_save_no_data(self):
+        req_id_proxy = glanceclient_utils.RequestIdProxy(
+            [None, self.resp]
+        )
+        self.images_mock.data.return_value = req_id_proxy
+
+        arglist = ['--file', '/path/to/file', self.image.id]
+
+        verifylist = [
+            ('file', '/path/to/file'),
+            ('image', self.image.id)
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        # Raise SystemExit if no data was provided.
+        self.assertRaises(SystemExit, self.cmd.take_action, parsed_args)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/openstackclient/tests/unit/network/v2/fakes.py
 
new/python-openstackclient-3.14.0/openstackclient/tests/unit/network/v2/fakes.py
--- 
old/python-openstackclient-3.13.0/openstackclient/tests/unit/network/v2/fakes.py
    2017-12-13 22:34:42.000000000 +0100
+++ 
new/python-openstackclient-3.14.0/openstackclient/tests/unit/network/v2/fakes.py
    2018-01-25 15:25:53.000000000 +0100
@@ -1378,6 +1378,7 @@
             'port_id': 'port-id-' + uuid.uuid4().hex,
             'tenant_id': 'project-id-' + uuid.uuid4().hex,
             'description': 'floating-ip-description-' + uuid.uuid4().hex,
+            'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex,
         }
 
         # Overwrite default attributes.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/openstackclient/tests/unit/network/v2/test_floating_ip_network.py
 
new/python-openstackclient-3.14.0/openstackclient/tests/unit/network/v2/test_floating_ip_network.py
--- 
old/python-openstackclient-3.13.0/openstackclient/tests/unit/network/v2/test_floating_ip_network.py
 2017-12-13 22:34:42.000000000 +0100
+++ 
new/python-openstackclient-3.14.0/openstackclient/tests/unit/network/v2/test_floating_ip_network.py
 2018-01-25 15:25:53.000000000 +0100
@@ -62,6 +62,7 @@
         'id',
         'port_id',
         'project_id',
+        'qos_policy_id',
         'router_id',
         'status',
     )
@@ -76,6 +77,7 @@
         floating_ip.id,
         floating_ip.port_id,
         floating_ip.project_id,
+        floating_ip.qos_policy_id,
         floating_ip.router_id,
         floating_ip.status,
     )
@@ -197,6 +199,28 @@
         self.assertEqual(self.columns, columns)
         self.assertEqual(self.data, data)
 
+    def test_create_floating_ip_with_qos(self):
+        qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
+        self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
+        arglist = [
+            '--qos-policy', qos_policy.id,
+            self.floating_ip.floating_network_id,
+        ]
+        verifylist = [
+            ('network', self.floating_ip.floating_network_id),
+            ('qos_policy', qos_policy.id),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        columns, data = self.cmd.take_action(parsed_args)
+
+        self.network.create_ip.assert_called_once_with(**{
+            'floating_network_id': self.floating_ip.floating_network_id,
+            'qos_policy_id': qos_policy.id,
+        })
+        self.assertEqual(self.columns, columns)
+        self.assertEqual(self.data, data)
+
 
 class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork):
 
@@ -538,6 +562,7 @@
         'id',
         'port_id',
         'project_id',
+        'qos_policy_id',
         'router_id',
         'status',
     )
@@ -552,6 +577,7 @@
         floating_ip.id,
         floating_ip.port_id,
         floating_ip.project_id,
+        floating_ip.qos_policy_id,
         floating_ip.router_id,
         floating_ip.status,
     )
@@ -677,6 +703,76 @@
         self.network.update_ip.assert_called_once_with(
             self.floating_ip, **attrs)
 
+    @mock.patch(
+        "openstackclient.tests.unit.network.v2.test_floating_ip_network." +
+        "fip._find_floating_ip"
+    )
+    def test_port_and_qos_policy_option(self, find_floating_ip_mock):
+        qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
+        self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
+        find_floating_ip_mock.side_effect = [
+            self.floating_ip,
+        ]
+        arglist = [
+            "--qos-policy", qos_policy.id,
+            '--port', self.floating_ip.port_id,
+            self.floating_ip.id,
+        ]
+        verifylist = [
+            ('qos_policy', qos_policy.id),
+            ('port', self.floating_ip.port_id),
+            ('floating_ip', self.floating_ip.id),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        self.cmd.take_action(parsed_args)
+
+        attrs = {
+            'qos_policy_id': qos_policy.id,
+            'port_id': self.floating_ip.port_id,
+        }
+        find_floating_ip_mock.assert_called_once_with(
+            mock.ANY,
+            self.floating_ip.id,
+            ignore_missing=False,
+        )
+        self.network.update_ip.assert_called_once_with(
+            self.floating_ip, **attrs)
+
+    @mock.patch(
+        "openstackclient.tests.unit.network.v2.test_floating_ip_network." +
+        "fip._find_floating_ip"
+    )
+    def test_port_and_no_qos_policy_option(self, find_floating_ip_mock):
+        find_floating_ip_mock.side_effect = [
+            self.floating_ip,
+        ]
+        arglist = [
+            "--no-qos-policy",
+            '--port', self.floating_ip.port_id,
+            self.floating_ip.id,
+        ]
+        verifylist = [
+            ('no_qos_policy', True),
+            ('port', self.floating_ip.port_id),
+            ('floating_ip', self.floating_ip.id),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        self.cmd.take_action(parsed_args)
+
+        attrs = {
+            'qos_policy_id': None,
+            'port_id': self.floating_ip.port_id,
+        }
+        find_floating_ip_mock.assert_called_once_with(
+            mock.ANY,
+            self.floating_ip.id,
+            ignore_missing=False,
+        )
+        self.network.update_ip.assert_called_once_with(
+            self.floating_ip, **attrs)
+
 
 class TestUnsetFloatingIP(TestFloatingIPNetwork):
 
@@ -725,6 +821,39 @@
         }
         find_floating_ip_mock.assert_called_once_with(
             mock.ANY,
+            self.floating_ip.id,
+            ignore_missing=False,
+        )
+        self.network.update_ip.assert_called_once_with(
+            self.floating_ip, **attrs)
+
+        self.assertIsNone(result)
+
+    @mock.patch(
+        "openstackclient.tests.unit.network.v2.test_floating_ip_network." +
+        "fip._find_floating_ip"
+    )
+    def test_floating_ip_unset_qos_policy(self, find_floating_ip_mock):
+        find_floating_ip_mock.side_effect = [
+            self.floating_ip,
+        ]
+        arglist = [
+            self.floating_ip.id,
+            "--qos-policy",
+        ]
+        verifylist = [
+            ('floating_ip', self.floating_ip.id),
+            ('qos_policy', True),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        result = self.cmd.take_action(parsed_args)
+
+        attrs = {
+            'qos_policy_id': None,
+        }
+        find_floating_ip_mock.assert_called_once_with(
+            mock.ANY,
             self.floating_ip.id,
             ignore_missing=False,
         )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/openstackclient/tests/unit/network/v2/test_port.py
 
new/python-openstackclient-3.14.0/openstackclient/tests/unit/network/v2/test_port.py
--- 
old/python-openstackclient-3.13.0/openstackclient/tests/unit/network/v2/test_port.py
        2017-12-13 22:34:42.000000000 +0100
+++ 
new/python-openstackclient-3.14.0/openstackclient/tests/unit/network/v2/test_port.py
        2018-01-25 15:25:53.000000000 +0100
@@ -759,6 +759,25 @@
         self.assertEqual(self.columns, columns)
         self.assertEqual(self.data, list(data))
 
+    def test_port_list_device_id_opt(self):
+        arglist = [
+            '--device-id', self._ports[0].device_id,
+        ]
+
+        verifylist = [
+            ('device_id', self._ports[0].device_id)
+        ]
+
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        columns, data = self.cmd.take_action(parsed_args)
+
+        self.network.ports.assert_called_once_with(**{
+            'device_id': self._ports[0].device_id
+        })
+        self.assertEqual(self.columns, columns)
+        self.assertEqual(self.data, list(data))
+
     def test_port_list_device_owner_opt(self):
         arglist = [
             '--device-owner', self._ports[0].device_owner,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/playbooks/osc-devstack/post.yaml 
new/python-openstackclient-3.14.0/playbooks/osc-devstack/post.yaml
--- old/python-openstackclient-3.13.0/playbooks/osc-devstack/post.yaml  
2017-12-13 22:34:42.000000000 +0100
+++ new/python-openstackclient-3.14.0/playbooks/osc-devstack/post.yaml  
2018-01-25 15:25:53.000000000 +0100
@@ -1,4 +1,3 @@
 - hosts: all
   roles:
-    - fetch-tox-output
-    - fetch-stestr-output
+    - fetch-subunit-output
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/playbooks/osc-devstack/run.yaml 
new/python-openstackclient-3.14.0/playbooks/osc-devstack/run.yaml
--- old/python-openstackclient-3.13.0/playbooks/osc-devstack/run.yaml   
2017-12-13 22:34:42.000000000 +0100
+++ new/python-openstackclient-3.14.0/playbooks/osc-devstack/run.yaml   
2018-01-25 15:25:53.000000000 +0100
@@ -1,3 +1,5 @@
 - hosts: all
+  environment:
+    OS_CLOUD: devstack-admin
   roles:
     - tox
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/python_openstackclient.egg-info/PKG-INFO 
new/python-openstackclient-3.14.0/python_openstackclient.egg-info/PKG-INFO
--- old/python-openstackclient-3.13.0/python_openstackclient.egg-info/PKG-INFO  
2017-12-13 22:39:41.000000000 +0100
+++ new/python-openstackclient-3.14.0/python_openstackclient.egg-info/PKG-INFO  
2018-01-25 15:28:58.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: python-openstackclient
-Version: 3.13.0
+Version: 3.14.0
 Summary: OpenStack Command-line Client
 Home-page: https://docs.openstack.org/python-openstackclient/latest/
 Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/python_openstackclient.egg-info/SOURCES.txt 
new/python-openstackclient-3.14.0/python_openstackclient.egg-info/SOURCES.txt
--- 
old/python-openstackclient-3.13.0/python_openstackclient.egg-info/SOURCES.txt   
    2017-12-13 22:39:43.000000000 +0100
+++ 
new/python-openstackclient-3.14.0/python_openstackclient.egg-info/SOURCES.txt   
    2018-01-25 15:29:00.000000000 +0100
@@ -16,6 +16,7 @@
 test-requirements.txt
 tox.ini
 doc/Makefile
+doc/requirements.txt
 doc/source/conf.py
 doc/source/index.rst
 doc/source/_extra/.htaccess
@@ -265,7 +266,7 @@
 openstackclient/tests/__init__.py
 openstackclient/tests/functional/__init__.py
 openstackclient/tests/functional/base.py
-openstackclient/tests/functional/run_ostestr.sh
+openstackclient/tests/functional/run_stestr.sh
 openstackclient/tests/functional/common/__init__.py
 openstackclient/tests/functional/common/test_availability_zone.py
 openstackclient/tests/functional/common/test_configuration.py
@@ -558,6 +559,7 @@
 python_openstackclient.egg-info/top_level.txt
 releasenotes/notes/.placeholder
 releasenotes/notes/add-auto-and-none-as-nic-parameter-ed23a6e7f99f250d.yaml
+releasenotes/notes/add-device_id-to-port-list-0c658db51ce43c9e.yaml
 releasenotes/notes/add-disable-reason-6e0f28459a09a60d.yaml
 releasenotes/notes/add-dns-nameserver-overwrite-option-b866baeae12f9460.yaml
 releasenotes/notes/add-ha-to-router-update-6a38a73cc112b2fc.yaml
@@ -620,6 +622,7 @@
 releasenotes/notes/bp-neutron-client-metering-6f8f9527c2a797fd.yaml
 releasenotes/notes/bp-neutron-client-rbac-bbd7b545b50d2bdf.yaml
 releasenotes/notes/bp-neutron-client-tag-ff24d13e5c70e052.yaml
+releasenotes/notes/bp-neutron-floating-ip-rate-limit-8387c040a6fb9acd.yaml
 releasenotes/notes/bp-routed-networks-3b502faa5cd96807.yaml
 releasenotes/notes/bp-routed-networks-3eea4978c93aa126.yaml
 releasenotes/notes/bp-routed-networks-86a24f34d86fca53.yaml
@@ -858,6 +861,7 @@
 releasenotes/notes/bug-1732216-b41bfedebff911e1.yaml
 releasenotes/notes/bug-1732938-e4d91732ef777f9a.yaml
 releasenotes/notes/bug-1735836-9be6d777a6e6410b.yaml
+releasenotes/notes/bug-1741223-7a5c5b6e7f232628.yaml
 releasenotes/notes/bug-volume-list-with-project-2dc867c5e8346a66.yaml
 releasenotes/notes/change-098377fd53cce7a0.yaml
 releasenotes/notes/cliff-2.3.0-7ead18fae9ceea80.yaml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/python_openstackclient.egg-info/pbr.json 
new/python-openstackclient-3.14.0/python_openstackclient.egg-info/pbr.json
--- old/python-openstackclient-3.13.0/python_openstackclient.egg-info/pbr.json  
2017-12-13 22:39:41.000000000 +0100
+++ new/python-openstackclient-3.14.0/python_openstackclient.egg-info/pbr.json  
2018-01-25 15:28:58.000000000 +0100
@@ -1 +1 @@
-{"git_version": "8c5f755", "is_release": true}
\ No newline at end of file
+{"git_version": "fbee4eb", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/python_openstackclient.egg-info/requires.txt 
new/python-openstackclient-3.14.0/python_openstackclient.egg-info/requires.txt
--- 
old/python-openstackclient-3.13.0/python_openstackclient.egg-info/requires.txt  
    2017-12-13 22:39:41.000000000 +0100
+++ 
new/python-openstackclient-3.14.0/python_openstackclient.egg-info/requires.txt  
    2018-01-25 15:28:58.000000000 +0100
@@ -2,12 +2,12 @@
 six>=1.10.0
 Babel!=2.4.0,>=2.3.4
 cliff!=2.9.0,>=2.8.0
-keystoneauth1>=3.2.0
+keystoneauth1>=3.3.0
 openstacksdk>=0.9.19
-osc-lib>=1.7.0
+osc-lib>=1.8.0
 oslo.i18n>=3.15.3
-oslo.utils>=3.31.0
+oslo.utils>=3.33.0
 python-glanceclient>=2.8.0
 python-keystoneclient>=3.8.0
 python-novaclient>=9.1.0
-python-cinderclient>=3.2.0
+python-cinderclient>=3.3.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/releasenotes/notes/add-device_id-to-port-list-0c658db51ce43c9e.yaml
 
new/python-openstackclient-3.14.0/releasenotes/notes/add-device_id-to-port-list-0c658db51ce43c9e.yaml
--- 
old/python-openstackclient-3.13.0/releasenotes/notes/add-device_id-to-port-list-0c658db51ce43c9e.yaml
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/python-openstackclient-3.14.0/releasenotes/notes/add-device_id-to-port-list-0c658db51ce43c9e.yaml
       2018-01-25 15:25:53.000000000 +0100
@@ -0,0 +1,4 @@
+---
+features:
+  - |
+    Add ``--device-id`` option to the ``port list`` command.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/releasenotes/notes/bp-neutron-floating-ip-rate-limit-8387c040a6fb9acd.yaml
 
new/python-openstackclient-3.14.0/releasenotes/notes/bp-neutron-floating-ip-rate-limit-8387c040a6fb9acd.yaml
--- 
old/python-openstackclient-3.13.0/releasenotes/notes/bp-neutron-floating-ip-rate-limit-8387c040a6fb9acd.yaml
        1970-01-01 01:00:00.000000000 +0100
+++ 
new/python-openstackclient-3.14.0/releasenotes/notes/bp-neutron-floating-ip-rate-limit-8387c040a6fb9acd.yaml
        2018-01-25 15:25:53.000000000 +0100
@@ -0,0 +1,11 @@
+---
+features:
+  - |
+    Add support for attaching and removing qos policy to floating IPs.
+    
+    Add option ``--qos-policy`` to the ``floating ip create`` and
+    ``floating ip set`` commands to add qos policy to a floating IP.
+
+    Add option ``--no-qos-policy`` to the ``floating ip set`` and option
+    ``--qos-policy`` to the ``floating ip unset`` command to remove the
+    qos policy from a floating IP.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-openstackclient-3.13.0/releasenotes/notes/bug-1741223-7a5c5b6e7f232628.yaml
 
new/python-openstackclient-3.14.0/releasenotes/notes/bug-1741223-7a5c5b6e7f232628.yaml
--- 
old/python-openstackclient-3.13.0/releasenotes/notes/bug-1741223-7a5c5b6e7f232628.yaml
      1970-01-01 01:00:00.000000000 +0100
+++ 
new/python-openstackclient-3.14.0/releasenotes/notes/bug-1741223-7a5c5b6e7f232628.yaml
      2018-01-25 15:25:53.000000000 +0100
@@ -0,0 +1,6 @@
+---
+fixes:
+  - |
+    'NoneType' object is not iterable when Glance cannot find image data in its
+    backend.
+    [Bug `1741223 <https://bugs.launchpad.net/ironic/+bug/1741223>`_]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-openstackclient-3.13.0/requirements.txt 
new/python-openstackclient-3.14.0/requirements.txt
--- old/python-openstackclient-3.13.0/requirements.txt  2017-12-13 
22:34:42.000000000 +0100
+++ new/python-openstackclient-3.14.0/requirements.txt  2018-01-25 
15:25:53.000000000 +0100
@@ -6,12 +6,12 @@
 
 Babel!=2.4.0,>=2.3.4 # BSD
 cliff!=2.9.0,>=2.8.0 # Apache-2.0
-keystoneauth1>=3.2.0 # Apache-2.0
+keystoneauth1>=3.3.0 # Apache-2.0
 openstacksdk>=0.9.19 # Apache-2.0
-osc-lib>=1.7.0 # Apache-2.0
+osc-lib>=1.8.0 # Apache-2.0
 oslo.i18n>=3.15.3 # Apache-2.0
-oslo.utils>=3.31.0 # Apache-2.0
+oslo.utils>=3.33.0 # Apache-2.0
 python-glanceclient>=2.8.0 # Apache-2.0
 python-keystoneclient>=3.8.0 # Apache-2.0
 python-novaclient>=9.1.0 # Apache-2.0
-python-cinderclient>=3.2.0 # Apache-2.0
+python-cinderclient>=3.3.0 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-openstackclient-3.13.0/test-requirements.txt 
new/python-openstackclient-3.14.0/test-requirements.txt
--- old/python-openstackclient-3.13.0/test-requirements.txt     2017-12-13 
22:34:42.000000000 +0100
+++ new/python-openstackclient-3.14.0/test-requirements.txt     2018-01-25 
15:25:53.000000000 +0100
@@ -7,16 +7,12 @@
 fixtures>=3.0.0 # Apache-2.0/BSD
 flake8-import-order==0.13 # LGPLv3
 mock>=2.0.0 # BSD
-openstackdocstheme>=1.17.0 # Apache-2.0
-oslotest>=1.10.0 # Apache-2.0
-reno>=2.5.0 # Apache-2.0
+oslotest>=3.2.0 # Apache-2.0
 requests>=2.14.2 # Apache-2.0
 requests-mock>=1.1.0 # Apache-2.0
-sphinx>=1.6.2 # BSD
 stevedore>=1.20.0 # Apache-2.0
 os-client-config>=1.28.0 # Apache-2.0
-os-testr>=1.0.0 # Apache-2.0
-testrepository>=0.0.18 # Apache-2.0/BSD
+stestr>=1.0.0 # Apache-2.0
 testtools>=2.2.0 # MIT
 tempest>=17.1.0 # Apache-2.0
 osprofiler>=1.4.0 # Apache-2.0
@@ -27,7 +23,7 @@
 aodhclient>=0.9.0 # Apache-2.0
 gnocchiclient>=3.3.1 # Apache-2.0
 python-barbicanclient!=4.5.0,!=4.5.1,>=4.0.0 # Apache-2.0
-python-congressclient<2000,>=1.3.0 # Apache-2.0
+python-congressclient<2000,>=1.9.0 # Apache-2.0
 python-designateclient>=2.7.0 # Apache-2.0
 python-heatclient>=1.10.0 # Apache-2.0
 python-ironicclient>=1.14.0 # Apache-2.0
@@ -36,11 +32,11 @@
 python-mistralclient>=3.1.0 # Apache-2.0
 python-muranoclient>=0.8.2 # Apache-2.0
 python-neutronclient>=6.3.0 # Apache-2.0
-python-octaviaclient>=1.0.0 # Apache-2.0
+python-octaviaclient>=1.3.0 # Apache-2.0
 python-rsdclient>=0.1.0 # Apache-2.0
 python-saharaclient>=1.4.0 # Apache-2.0
 python-searchlightclient>=1.0.0 #Apache-2.0
 python-senlinclient>=1.1.0 # Apache-2.0
 python-troveclient>=2.2.0 # Apache-2.0
 python-zaqarclient>=1.0.0 # Apache-2.0
-python-zunclient>=0.2.0 # Apache-2.0
+python-zunclient>=1.0.0 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-openstackclient-3.13.0/tox.ini 
new/python-openstackclient-3.14.0/tox.ini
--- old/python-openstackclient-3.13.0/tox.ini   2017-12-13 22:34:42.000000000 
+0100
+++ new/python-openstackclient-3.14.0/tox.ini   2018-01-25 15:25:53.000000000 
+0100
@@ -14,8 +14,8 @@
   
-c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt}
   -r{toxinidir}/test-requirements.txt
   -r{toxinidir}/requirements.txt
-commands = ostestr {posargs}
-whitelist_externals = ostestr
+commands = stestr run {posargs}
+whitelist_externals = stestr
 
 [testenv:fast8]
 # Use same environment directory as pep8 env to save space and install time
@@ -63,20 +63,20 @@
     pip install -q -U -e 
"git+file://{toxinidir}/../os-client-config#egg=os_client_config"
     pip install -q -e 
"git+file://{toxinidir}/../python-openstacksdk#egg=openstacksdk"
     pip freeze
-    ostestr {posargs}
-whitelist_externals = ostestr
+    stestr run {posargs}
+whitelist_externals = stestr
 
 [testenv:functional]
 setenv = OS_TEST_PATH=./openstackclient/tests/functional
 passenv = OS_*
-whitelist_externals = openstackclient/tests/functional/run_ostestr.sh
+whitelist_externals = openstackclient/tests/functional/run_stestr.sh
 commands =
-    {toxinidir}/openstackclient/tests/functional/run_ostestr.sh {posargs}
+    {toxinidir}/openstackclient/tests/functional/run_stestr.sh {posargs}
 
 [testenv:functional-tips]
 setenv = OS_TEST_PATH=./openstackclient/tests/functional
 passenv = OS_*
-whitelist_externals = openstackclient/tests/functional/run_ostestr.sh
+whitelist_externals = openstackclient/tests/functional/run_stestr.sh
 commands =
     pip install -q -U -e "git+file://{toxinidir}/../cliff#egg=cliff"
     pip install -q -U -e 
"git+file://{toxinidir}/../keystoneauth#egg=keystoneauth"
@@ -84,15 +84,20 @@
     pip install -q -U -e 
"git+file://{toxinidir}/../os-client-config#egg=os_client_config"
     pip install -q -U -e 
"git+file://{toxinidir}/../python-openstacksdk#egg=openstacksdk"
     pip freeze
-    {toxinidir}/openstackclient/tests/functional/run_ostestr.sh {posargs}
+    {toxinidir}/openstackclient/tests/functional/run_stestr.sh {posargs}
 
 [testenv:venv]
 commands = {posargs}
 
 [testenv:cover]
-commands =
-    python setup.py test --coverage --testr-args='{posargs}'
-    coverage report
+setenv =
+    VIRTUAL_ENV={envdir}
+    PYTHON=coverage run --source openstackclient --parallel-mode
+commands =
+    stestr -q run {posargs}
+    coverage combine
+    coverage html -d cover
+    coverage xml -o cover/coverage.xml
 
 [testenv:debug]
 passenv = OS_*
@@ -100,10 +105,19 @@
     oslo_debug_helper -t openstackclient/tests {posargs}
 
 [testenv:docs]
+deps =
+  
-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
 
 [testenv:releasenotes]
-commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html 
releasenotes/source releasenotes/build/html
+deps =
+  
-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 =
+  sphinx-build -a -E -W -d releasenotes/build/doctrees -b html 
releasenotes/source releasenotes/build/html
 
 [flake8]
 show-source = True


Reply via email to