Hello community,

here is the log from the commit of package python-senlinclient for 
openSUSE:Factory checked in at 2019-05-03 22:43:17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-senlinclient (Old)
 and      /work/SRC/openSUSE:Factory/.python-senlinclient.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-senlinclient"

Fri May  3 22:43:17 2019 rev:7 rq:692878 version:1.10.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-senlinclient/python-senlinclient.changes  
2018-09-07 15:39:32.998526740 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-senlinclient.new.5148/python-senlinclient.changes
        2019-05-03 22:43:18.771353422 +0200
@@ -1,0 +2,27 @@
+Mon Apr  8 12:26:15 UTC 2019 - [email protected]
+
+- update to version 1.10.1
+  - Fix calls to functions removed from openstacksdk
+  - Update json module to jsonutils
+  - Imported Translations from Zanata
+  - Use template for lower-constraints
+  - Enable cluster profile only and replace function test
+  - Fix getting action id in Location header
+  - Use latest senlin microversion for Stein
+  - Change openstack-dev to openstack-discuss
+  - import zuul job settings from project-config
+  - Add Stein release notes
+  - Update reno for stable/rocky
+  - Don't quote {posargs} in tox.ini
+  - add python 3.6 unit test job
+  - Add senlinclient support bandit test
+  - Add Python 3.6 classifier to setup.cfg
+  - Bump openstacksdk to 0.24.0
+  - switch documentation job to new PTI
+  - Update hacking version
+  - Fix _get_config_from_profile key building
+  - Update client to account for 409 error in cluster actions
+  - add python 3.7 unit test job
+  - Update python-senlinclient to use current openstacksdk
+
+-------------------------------------------------------------------

Old:
----
  python-senlinclient-1.8.0.tar.gz

New:
----
  python-senlinclient-1.10.1.tar.gz

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

Other differences:
------------------
++++++ python-senlinclient.spec ++++++
--- /var/tmp/diff_new_pack.GKOPjS/_old  2019-05-03 22:43:19.243354416 +0200
+++ /var/tmp/diff_new_pack.GKOPjS/_new  2019-05-03 22:43:19.243354416 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-senlinclient
 #
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -12,51 +12,62 @@
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
 
-%global sname python-senlinclient
 Name:           python-senlinclient
-Version:        1.8.0
+Version:        1.10.1
 Release:        0
 Summary:        Python API and CLI for OpenStack Senlin
 License:        Apache-2.0
 Group:          Development/Languages/Python
-URL:            https://launchpad.net/%{sname}
-Source0:        
https://files.pythonhosted.org/packages/source/p/%{sname}/%{sname}-%{version}.tar.gz
+URL:            https://launchpad.net/python-senlinclient
+Source0:        
https://files.pythonhosted.org/packages/source/p/python-senlinclient/python-senlinclient-1.10.1.tar.gz
 BuildRequires:  openstack-macros
-BuildRequires:  python-Babel >= 2.3.4
-BuildRequires:  python-PrettyTable >= 0.7.2
-BuildRequires:  python-PyYAML >= 3.12
-BuildRequires:  python-appdirs
 BuildRequires:  python-devel
-BuildRequires:  python-fixtures
-BuildRequires:  python-heatclient >= 1.10.0
-BuildRequires:  python-jsonschema
-BuildRequires:  python-mock
-BuildRequires:  python-openstackclient
-BuildRequires:  python-openstacksdk >= 0.11.2
-BuildRequires:  python-os-testr
-BuildRequires:  python-osc-lib >= 1.8.0
-BuildRequires:  python-oslo.i18n >= 3.15.3
-BuildRequires:  python-oslo.serialization >= 2.18.0
-BuildRequires:  python-oslo.utils >= 3.33.0
-BuildRequires:  python-oslotest
-BuildRequires:  python-pbr >= 2.0.0
-BuildRequires:  python-python-subunit
-BuildRequires:  python-requests >= 2.14.2
-BuildRequires:  python-requests-mock
-BuildRequires:  python-stestr
-BuildRequires:  python-testtools
+BuildRequires:  python2-Babel >= 2.3.4
+BuildRequires:  python2-PrettyTable >= 0.7.2
+BuildRequires:  python2-PyYAML >= 3.12
+BuildRequires:  python2-fixtures
+BuildRequires:  python2-heatclient >= 1.10.0
+BuildRequires:  python2-mock
+BuildRequires:  python2-openstackclient
+BuildRequires:  python2-openstacksdk >= 0.24.0
+BuildRequires:  python2-osc-lib >= 1.8.0
+BuildRequires:  python2-oslo.i18n >= 3.15.3
+BuildRequires:  python2-oslo.serialization >= 2.18.0
+BuildRequires:  python2-oslo.utils >= 3.33.0
+BuildRequires:  python2-oslotest
+BuildRequires:  python2-pbr >= 2.0.0
+BuildRequires:  python2-requests >= 2.14.2
+BuildRequires:  python2-requests-mock
+BuildRequires:  python2-stestr
+BuildRequires:  python3-Babel >= 2.3.4
+BuildRequires:  python3-PrettyTable >= 0.7.2
+BuildRequires:  python3-PyYAML >= 3.12
+BuildRequires:  python3-devel
+BuildRequires:  python3-fixtures
+BuildRequires:  python3-heatclient >= 1.10.0
+BuildRequires:  python3-mock
+BuildRequires:  python3-openstackclient
+BuildRequires:  python3-openstacksdk >= 0.24.0
+BuildRequires:  python3-osc-lib >= 1.8.0
+BuildRequires:  python3-oslo.i18n >= 3.15.3
+BuildRequires:  python3-oslo.serialization >= 2.18.0
+BuildRequires:  python3-oslo.utils >= 3.33.0
+BuildRequires:  python3-oslotest
+BuildRequires:  python3-pbr >= 2.0.0
+BuildRequires:  python3-requests >= 2.14.2
+BuildRequires:  python3-requests-mock
+BuildRequires:  python3-stestr
+Requires:       python-Babel >= 2.3.4
 Requires:       python-PrettyTable >= 0.7.2
 Requires:       python-PyYAML >= 3.12
-Requires:       python-appdirs
 Requires:       python-heatclient >= 1.10.0
-Requires:       python-jsonschema
 Requires:       python-keystoneauth1 >= 3.4.0
 Requires:       python-openstackclient
-Requires:       python-openstacksdk >= 0.11.2
+Requires:       python-openstacksdk >= 0.24.0
 Requires:       python-osc-lib >= 1.8.0
 Requires:       python-oslo.i18n >= 3.15.3
 Requires:       python-oslo.serialization >= 2.18.0
@@ -65,6 +76,7 @@
 Requires:       python-requests >= 2.14.2
 Requires:       python-six >= 1.10.0
 BuildArch:      noarch
+%python_subpackages
 
 %description
 OpenStack Clustering service Provisioning API Client Library
@@ -72,24 +84,24 @@
 This is a client for the OpenStack Senlin API.
 It provides a Python API (the senlinclient module).
 
-%package doc
+%package -n python-senlinclient-doc
 Summary:        Documentation for OpenStack Senlin API Client
 Group:          Documentation/HTML
 BuildRequires:  python-Sphinx
 BuildRequires:  python-openstackdocstheme
 BuildRequires:  python-reno
 
-%description doc
+%description -n python-senlinclient-doc
 This is a client for the OpenStack Senlin API.
 It implements 100% of the OpenStack Senlin API. This package contains
 auto-generated documentation.
 
 %prep
-%autosetup -n %{sname}-%{version}
+%autosetup -p1 -n python-senlinclient-1.10.1
 %py_req_cleanup
 
 %build
-%{py2_build}
+%{python_build}
 
 %{__python2} setup.py build_sphinx
 PBR_VERSION=%version sphinx-build -b html doc/source doc/build/html
@@ -97,18 +109,18 @@
 rm -rf doc/build/html/.{doctrees,buildinfo}
 
 %install
-%{py2_install}
+%{python_install}
 
 %check
-stestr run
+%python_exec -m stestr.cli run
 
-%files
+%files %{python_files}
 %license LICENSE
 %doc README.rst
-%{python2_sitelib}/senlinclient
-%{python2_sitelib}/*.egg-info
+%{python_sitelib}/senlinclient
+%{python_sitelib}/*.egg-info
 
-%files doc
+%files -n python-senlinclient-doc
 %license LICENSE
 %doc doc/build/html
 

++++++ _service ++++++
--- /var/tmp/diff_new_pack.GKOPjS/_old  2019-05-03 22:43:19.263354458 +0200
+++ /var/tmp/diff_new_pack.GKOPjS/_new  2019-05-03 22:43:19.263354458 +0200
@@ -1,8 +1,8 @@
 <services>
   <service mode="disabled" name="renderspec">
-    <param 
name="input-template">https://raw.githubusercontent.com/openstack/rpm-packaging/stable/rocky/openstack/python-senlinclient/python-senlinclient.spec.j2</param>
+    <param 
name="input-template">https://raw.githubusercontent.com/openstack/rpm-packaging/stable/stein/openstack/python-senlinclient/python-senlinclient.spec.j2</param>
     <param name="output-name">python-senlinclient.spec</param>
-    <param 
name="requirements">https://raw.githubusercontent.com/openstack/python-senlinclient/stable/rocky/requirements.txt</param>
+    <param 
name="requirements">https://raw.githubusercontent.com/openstack/python-senlinclient/stable/stein/requirements.txt</param>
     <param name="changelog-email">[email protected]</param>
     <param name="changelog-provider">gh,openstack,python-senlinclient</param>
   </service>

++++++ python-senlinclient-1.8.0.tar.gz -> python-senlinclient-1.10.1.tar.gz 
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-senlinclient-1.8.0/.zuul.yaml 
new/python-senlinclient-1.10.1/.zuul.yaml
--- old/python-senlinclient-1.8.0/.zuul.yaml    2018-08-08 20:23:54.000000000 
+0200
+++ new/python-senlinclient-1.10.1/.zuul.yaml   2019-03-08 01:47:21.000000000 
+0100
@@ -10,13 +10,17 @@
       - openstack/senlin
 
 - project:
+    templates:
+      - check-requirements
+      - openstack-lower-constraints-jobs
+      - openstack-python-jobs
+      - openstack-python35-jobs
+      - openstack-python36-jobs
+      - openstack-python37-jobs
+      - openstackclient-plugin-jobs
+      - publish-openstack-docs-pti
+      - release-notes-jobs-python3
     check:
       jobs:
         - senlinclient-dsvm-functional:
             voting: false
-        - openstack-tox-lower-constraints
-    gate:
-      jobs:
-        - senlinclient-dsvm-functional:
-            voting: false
-        - openstack-tox-lower-constraints
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-senlinclient-1.8.0/AUTHORS 
new/python-senlinclient-1.10.1/AUTHORS
--- old/python-senlinclient-1.8.0/AUTHORS       2018-08-08 20:27:17.000000000 
+0200
+++ new/python-senlinclient-1.10.1/AUTHORS      2019-03-08 01:49:25.000000000 
+0100
@@ -6,6 +6,7 @@
 Christopher Stone <[email protected]>
 Cindia-blue <[email protected]>
 Doug Hellmann <[email protected]>
+Duc Truong <[email protected]>
 EldonZhao <[email protected]>
 Erik Olof Gunnar Andersson <[email protected]>
 Ethan Lynn <[email protected]>
@@ -20,10 +21,12 @@
 Jeffrey Guan <[email protected]>
 Jeremy Liu <[email protected]>
 Jeremy Stanley <[email protected]>
+Jude Cross <[email protected]>
 KATO Tomoyuki <[email protected]>
 LiuNanke <[email protected]>
 Liuqing Jing <[email protected]>
 Lu lei <[email protected]>
+Monty Taylor <[email protected]>
 Navneet Gupta <[email protected]>
 Nguyen Hai <[email protected]>
 Ondřej Nový <[email protected]>
@@ -36,18 +39,21 @@
 Sharat Sharma <[email protected]>
 Tang Chen <[email protected]>
 Thomas Bechtold <[email protected]>
+Thomas Herve <[email protected]>
 Tony Breeds <[email protected]>
 Tovin Seven <[email protected]>
+Vieri <[email protected]>
 Vu Cong Tuan <[email protected]>
 XueFeng Liu <[email protected]>
 Yanyan Hu <[email protected]>
 Yuanbin.Chen <[email protected]>
+ZhijunWei <[email protected]>
 ZhongShengping <[email protected]>
-Zuul <[email protected]>
 bhavani.cr <[email protected]>
 blkart <[email protected]>
 blue55 <[email protected]>
 caishan <[email protected]>
+cao.yuan <[email protected]>
 chenpengzi <[email protected]>
 chohoor <[email protected]>
 dixiaoli <[email protected]>
@@ -67,8 +73,10 @@
 pawnesh.kumar <[email protected]>
 pengdake <[email protected]>
 qinchunhua <[email protected]>
+qingszhao <[email protected]>
 shangxiaobj <[email protected]>
 shu-mutou <[email protected]>
+sunjia <[email protected]>
 tengqm <[email protected]>
 venkatamahesh <[email protected]>
 xiaolihope <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-senlinclient-1.8.0/ChangeLog 
new/python-senlinclient-1.10.1/ChangeLog
--- old/python-senlinclient-1.8.0/ChangeLog     2018-08-08 20:27:16.000000000 
+0200
+++ new/python-senlinclient-1.10.1/ChangeLog    2019-03-08 01:49:25.000000000 
+0100
@@ -1,12 +1,46 @@
 CHANGES
 =======
 
+1.10.1
+------
+
+* Use latest senlin microversion for Stein
+* Update json module to jsonutils
+
+1.10.0
+------
+
+* Add Stein release notes
+* add python 3.7 unit test job
+* Bump openstacksdk to 0.24.0
+* Fix getting action id in Location header
+* Update hacking version
+* Use template for lower-constraints
+* Fix calls to functions removed from openstacksdk
+* Change openstack-dev to openstack-discuss
+* Add Python 3.6 classifier to setup.cfg
+* Fix \_get\_config\_from\_profile key building
+
+1.9.0
+-----
+
+* Don't quote {posargs} in tox.ini
+* Add senlinclient support bandit test
+* Enable cluster profile only and replace function test
+* add python 3.6 unit test job
+* switch documentation job to new PTI
+* import zuul job settings from project-config
+* Update python-senlinclient to use current openstacksdk
+* Imported Translations from Zanata
+* Update reno for stable/rocky
+
 1.8.0
 -----
 
 * Rocky releasenotes for python-senlinclient
 * Zuul enable senlinclient function check
 * Add cluster and receiver function test
+* Update client to account for 409 error in cluster actions
 * Add function test path to test\_path
 * Switch to stestr
 * Change CURRENT\_API\_VERSION to "1.10"
@@ -441,8 +475,8 @@
 * Updated from global requirements
 * Change 'status\_code' to 'http\_status' to parse SDK's exception
 
-0.3.0
------
+0.3
+---
 
 * Remove argparse from requirements
 * Updated from global requirements
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-senlinclient-1.8.0/PKG-INFO 
new/python-senlinclient-1.10.1/PKG-INFO
--- old/python-senlinclient-1.8.0/PKG-INFO      2018-08-08 20:27:17.000000000 
+0200
+++ new/python-senlinclient-1.10.1/PKG-INFO     2019-03-08 01:49:25.000000000 
+0100
@@ -1,10 +1,10 @@
 Metadata-Version: 1.1
 Name: python-senlinclient
-Version: 1.8.0
+Version: 1.10.1
 Summary: OpenStack Clustering API Client Library
 Home-page: https://docs.openstack.org/python-senlinclient/latest/
 Author: OpenStack
-Author-email: [email protected]
+Author-email: [email protected]
 License: UNKNOWN
 Description: ========================
         Team and repository tags
@@ -37,3 +37,4 @@
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-senlinclient-1.8.0/lower-constraints.txt 
new/python-senlinclient-1.10.1/lower-constraints.txt
--- old/python-senlinclient-1.8.0/lower-constraints.txt 2018-08-08 
20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/lower-constraints.txt        2019-03-08 
01:47:21.000000000 +0100
@@ -39,7 +39,7 @@
 netaddr==0.7.18
 netifaces==0.10.4
 openstackdocstheme==1.18.1
-openstacksdk==0.11.2
+openstacksdk==0.24.0
 os-client-config==1.28.0
 os-service-types==1.2.0
 os-testr==1.0.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/python_senlinclient.egg-info/PKG-INFO 
new/python-senlinclient-1.10.1/python_senlinclient.egg-info/PKG-INFO
--- old/python-senlinclient-1.8.0/python_senlinclient.egg-info/PKG-INFO 
2018-08-08 20:27:17.000000000 +0200
+++ new/python-senlinclient-1.10.1/python_senlinclient.egg-info/PKG-INFO        
2019-03-08 01:49:25.000000000 +0100
@@ -1,10 +1,10 @@
 Metadata-Version: 1.1
 Name: python-senlinclient
-Version: 1.8.0
+Version: 1.10.1
 Summary: OpenStack Clustering API Client Library
 Home-page: https://docs.openstack.org/python-senlinclient/latest/
 Author: OpenStack
-Author-email: [email protected]
+Author-email: [email protected]
 License: UNKNOWN
 Description: ========================
         Team and repository tags
@@ -37,3 +37,4 @@
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/python_senlinclient.egg-info/SOURCES.txt 
new/python-senlinclient-1.10.1/python_senlinclient.egg-info/SOURCES.txt
--- old/python-senlinclient-1.8.0/python_senlinclient.egg-info/SOURCES.txt      
2018-08-08 20:27:17.000000000 +0200
+++ new/python-senlinclient-1.10.1/python_senlinclient.egg-info/SOURCES.txt     
2019-03-08 01:49:25.000000000 +0100
@@ -32,6 +32,7 @@
 python_senlinclient.egg-info/requires.txt
 python_senlinclient.egg-info/top_level.txt
 releasenotes/notes/.placeholder
+releasenotes/notes/bug-1814171-b1c58797c9ca9f44.yaml
 releasenotes/notes/cli-deprecation-241b9569b85f8fbd.yaml
 releasenotes/notes/cluster-collect-a9d1bc8c2e799c7c.yaml
 releasenotes/notes/cluster-policy-list-42ff03ef25d64dd1.yaml
@@ -58,12 +59,11 @@
 releasenotes/source/ocata.rst
 releasenotes/source/pike.rst
 releasenotes/source/queens.rst
+releasenotes/source/rocky.rst
 releasenotes/source/unreleased.rst
 releasenotes/source/_static/.placeholder
 releasenotes/source/_templates/.placeholder
 releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
-releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po
-releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po
 senlinclient/__init__.py
 senlinclient/client.py
 senlinclient/plugin.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/python_senlinclient.egg-info/pbr.json 
new/python-senlinclient-1.10.1/python_senlinclient.egg-info/pbr.json
--- old/python-senlinclient-1.8.0/python_senlinclient.egg-info/pbr.json 
2018-08-08 20:27:17.000000000 +0200
+++ new/python-senlinclient-1.10.1/python_senlinclient.egg-info/pbr.json        
2019-03-08 01:49:25.000000000 +0100
@@ -1 +1 @@
-{"git_version": "08649a0", "is_release": true}
\ No newline at end of file
+{"git_version": "5f9c27d", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/python_senlinclient.egg-info/requires.txt 
new/python-senlinclient-1.10.1/python_senlinclient.egg-info/requires.txt
--- old/python-senlinclient-1.8.0/python_senlinclient.egg-info/requires.txt     
2018-08-08 20:27:17.000000000 +0200
+++ new/python-senlinclient-1.10.1/python_senlinclient.egg-info/requires.txt    
2019-03-08 01:49:25.000000000 +0100
@@ -2,7 +2,7 @@
 pbr!=2.1.0,>=2.0.0
 PrettyTable<0.8,>=0.7.2
 keystoneauth1>=3.4.0
-openstacksdk>=0.11.2
+openstacksdk>=0.24.0
 osc-lib>=1.8.0
 oslo.i18n>=3.15.3
 oslo.serialization!=2.19.1,>=2.18.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/releasenotes/notes/bug-1814171-b1c58797c9ca9f44.yaml
 
new/python-senlinclient-1.10.1/releasenotes/notes/bug-1814171-b1c58797c9ca9f44.yaml
--- 
old/python-senlinclient-1.8.0/releasenotes/notes/bug-1814171-b1c58797c9ca9f44.yaml
  1970-01-01 01:00:00.000000000 +0100
+++ 
new/python-senlinclient-1.10.1/releasenotes/notes/bug-1814171-b1c58797c9ca9f44.yaml
 2019-03-08 01:47:21.000000000 +0100
@@ -0,0 +1,6 @@
+---
+fixes:
+  - |
+    [`bug 1814171 <https://bugs.launchpad.net/senlin/+bug/1814171>`_]
+    Fixed a bug so that cluster delete and node delete return action id
+    associated with the delete action.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/releasenotes/source/index.rst 
new/python-senlinclient-1.10.1/releasenotes/source/index.rst
--- old/python-senlinclient-1.8.0/releasenotes/source/index.rst 2018-08-08 
20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/releasenotes/source/index.rst        
2019-03-08 01:47:21.000000000 +0100
@@ -6,6 +6,7 @@
    :maxdepth: 1
 
    unreleased
+   rocky
    queens
    pike
    ocata
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
 
new/python-senlinclient-1.10.1/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
--- 
old/python-senlinclient-1.8.0/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
  2018-08-08 20:23:54.000000000 +0200
+++ 
new/python-senlinclient-1.10.1/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
 2019-03-08 01:47:21.000000000 +0100
@@ -2,13 +2,13 @@
 # Andi Chandler <[email protected]>, 2018. #zanata
 msgid ""
 msgstr ""
-"Project-Id-Version: Senlin Client Release Notes\n"
+"Project-Id-Version: python-senlinclient\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-02-28 14:44+0000\n"
+"POT-Creation-Date: 2018-08-13 16:27+0000\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2018-02-09 10:54+0000\n"
+"PO-Revision-Date: 2018-08-08 07:57+0000\n"
 "Last-Translator: Andi Chandler <[email protected]>\n"
 "Language-Team: English (United Kingdom)\n"
 "Language: en_GB\n"
@@ -71,9 +71,15 @@
 msgid "Added command for node-check and node-recover."
 msgstr "Added command for node-check and node-recover."
 
+msgid "Aded profile, policy, cluster and receiver functional test."
+msgstr "Added profile, policy, cluster and receiver functional test."
+
 msgid "Bug Fixes"
 msgstr "Bug Fixes"
 
+msgid "Changed CURRENT_API_VERSION to \"1.10\"."
+msgstr "Changed CURRENT_API_VERSION to \"1.10\"."
+
 msgid "Current Series Release Notes"
 msgstr "Current Series Release Notes"
 
@@ -105,6 +111,9 @@
 msgid "Fix resource update operations."
 msgstr "Fix resource update operations."
 
+msgid "Fix tox python3 overrides."
+msgstr "Fix tox python3 overrides."
+
 msgid "Fixed a bug that force deletion of cluster or node was not working."
 msgstr "Fixed a bug that force deletion of cluster or node was not working."
 
@@ -112,9 +121,18 @@
 msgstr ""
 "Fixed a bug that region name is not respected when connecting to cloud."
 
+msgid "Fixed tox python3 overrides."
+msgstr "Fixed tox python3 overrides."
+
+msgid "Followed the new PTI for document build."
+msgstr "Followed the new PTI for document build."
+
 msgid "Help message for metadata clean operations."
 msgstr "Help message for metadata clean operations."
 
+msgid "Improved functional test for python-senlinclient."
+msgstr "Improved functional test for python-senlinclient."
+
 msgid "New Features"
 msgstr "New Features"
 
@@ -143,6 +161,9 @@
 msgid "Remove unsupported sort key \"user\" for event-list."
 msgstr "Remove unsupported sort key \"user\" for event-list."
 
+msgid "Removed pypy because pypy is no longer supported by oslo libraries."
+msgstr "Removed pypy because pypy is no longer supported by oslo libraries."
+
 msgid "Senlin Client Release Notes"
 msgstr "Senlin Client Release Notes"
 
@@ -152,6 +173,9 @@
 msgid "Support node replace operation."
 msgstr "Support node replace operation."
 
+msgid "Switched testr switch to stestr."
+msgstr "Switched testr switch to stestr."
+
 msgid ""
 "The 'senlin' CLI will be removed in April 2017. This message is now "
 "explicitly printed when senlin CLI commands are invoked."
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po
 
new/python-senlinclient-1.10.1/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po
--- 
old/python-senlinclient-1.8.0/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po
     2018-08-08 20:23:54.000000000 +0200
+++ 
new/python-senlinclient-1.10.1/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po
    1970-01-01 01:00:00.000000000 +0100
@@ -1,42 +0,0 @@
-# Gérald LONLAS <[email protected]>, 2016. #zanata
-msgid ""
-msgstr ""
-"Project-Id-Version: Senlin Client Release Notes 1.4.1\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-08-09 13:26+0000\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2016-10-22 06:14+0000\n"
-"Last-Translator: Gérald LONLAS <[email protected]>\n"
-"Language-Team: French\n"
-"Language: fr\n"
-"X-Generator: Zanata 3.9.6\n"
-"Plural-Forms: nplurals=2; plural=(n > 1)\n"
-
-msgid "0.5.0"
-msgstr "0.5.0"
-
-msgid "1.0.0"
-msgstr "1.0.0"
-
-msgid "Bug Fixes"
-msgstr "Corrections de bugs"
-
-msgid "Current Series Release Notes"
-msgstr "Note de la release actuelle"
-
-msgid "New Features"
-msgstr "Nouvelles fonctionnalités"
-
-msgid "Newton Series Release Notes"
-msgstr "Note de release pour Newton"
-
-msgid "Other Notes"
-msgstr "Autres notes"
-
-msgid "Senlin Client Release Notes"
-msgstr "Note de release du Client Senlin"
-
-msgid "Upgrade Notes"
-msgstr "Notes de mises à jours"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po
 
new/python-senlinclient-1.10.1/releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po
--- 
old/python-senlinclient-1.8.0/releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po
  2018-08-08 20:23:54.000000000 +0200
+++ 
new/python-senlinclient-1.10.1/releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po
 1970-01-01 01:00:00.000000000 +0100
@@ -1,40 +0,0 @@
-# zzxwill <[email protected]>, 2016. #zanata
-msgid ""
-msgstr ""
-"Project-Id-Version: Senlin Client Release Notes\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-02-28 14:44+0000\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2016-06-25 02:41+0000\n"
-"Last-Translator: zzxwill <[email protected]>\n"
-"Language-Team: Chinese (China)\n"
-"Language: zh_CN\n"
-"X-Generator: Zanata 4.3.3\n"
-"Plural-Forms: nplurals=1; plural=0\n"
-
-msgid "0.5.0"
-msgstr "0.5.0"
-
-msgid "Added command for node-check and node-recover."
-msgstr "已为node-check和node-recover添加了命令。"
-
-msgid "Current Series Release Notes"
-msgstr "当前版本发布说明"
-
-msgid "New Features"
-msgstr "新特性"
-
-msgid ""
-"OSC commands for cluster scaling are changed from 'cluster scale in' and "
-"'cluster scale out' to 'cluster shrink' and 'cluster expand' respectively."
-msgstr ""
-"集群扩展的OSC命令分别从'cluster scale in'和'cluster scale out'改成了'cluster "
-"shrink'和'cluster expand'。"
-
-msgid "Senlin Client Release Notes"
-msgstr "Senlin Client发布说明"
-
-msgid "Upgrade Notes"
-msgstr "升级说明"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/releasenotes/source/rocky.rst 
new/python-senlinclient-1.10.1/releasenotes/source/rocky.rst
--- old/python-senlinclient-1.8.0/releasenotes/source/rocky.rst 1970-01-01 
01:00:00.000000000 +0100
+++ new/python-senlinclient-1.10.1/releasenotes/source/rocky.rst        
2019-03-08 01:47:21.000000000 +0100
@@ -0,0 +1,6 @@
+===================================
+ Rocky Series Release Notes
+===================================
+
+.. release-notes::
+   :branch: stable/rocky
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-senlinclient-1.8.0/requirements.txt 
new/python-senlinclient-1.10.1/requirements.txt
--- old/python-senlinclient-1.8.0/requirements.txt      2018-08-08 
20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/requirements.txt     2019-03-08 
01:47:21.000000000 +0100
@@ -6,7 +6,7 @@
 pbr!=2.1.0,>=2.0.0 # Apache-2.0
 PrettyTable<0.8,>=0.7.2 # BSD
 keystoneauth1>=3.4.0 # Apache-2.0
-openstacksdk>=0.11.2 # Apache-2.0
+openstacksdk>=0.24.0 # Apache-2.0
 osc-lib>=1.8.0 # Apache-2.0
 oslo.i18n>=3.15.3 # Apache-2.0
 oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-senlinclient-1.8.0/senlinclient/plugin.py 
new/python-senlinclient-1.10.1/senlinclient/plugin.py
--- old/python-senlinclient-1.8.0/senlinclient/plugin.py        2018-08-08 
20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/senlinclient/plugin.py       2019-03-08 
01:47:24.000000000 +0100
@@ -14,8 +14,9 @@
 
 import logging
 
+from openstack.config import cloud_region
+from openstack.config import defaults as config_defaults
 from openstack import connection
-from openstack import profile
 from osc_lib import utils
 
 LOG = logging.getLogger(__name__)
@@ -23,38 +24,84 @@
 DEFAULT_CLUSTERING_API_VERSION = '1'
 API_VERSION_OPTION = 'os_clustering_api_version'
 API_NAME = 'clustering'
-CURRENT_API_VERSION = '1.10'
+CURRENT_API_VERSION = '1.12'
 
 
-def create_connection(prof=None, **kwargs):
-    interface = kwargs.pop('interface', None)
-    region_name = kwargs.pop('region_name', None)
-    user_agent = kwargs.pop('user_agent', None)
-
-    if not prof:
-        prof = profile.Profile()
-    prof.set_api_version(API_NAME, CURRENT_API_VERSION)
-
-    if interface:
-        prof.set_interface(API_NAME, interface)
-    if region_name:
-        prof.set_region(API_NAME, region_name)
+def _make_key(service_type, key):
+    if not service_type:
+        return key
+    else:
+        service_type = service_type.lower().replace('-', '_')
+        return "_".join([service_type, key])
+
+
+def _get_config_from_profile(profile, **kwargs):
+    # Deal with clients still trying to use legacy profile objects
+    region_name = None
+    for service in profile.get_services():
+        if service.region:
+            region_name = service.region
+        service_type = service.service_type
+        if service.interface:
+            key = _make_key(service_type, 'interface')
+            kwargs[key] = service.interface
+        if service.version:
+            version = service.version
+            if version.startswith('v'):
+                version = version[1:]
+            key = _make_key(service_type, 'api_version')
+            kwargs[key] = version
+        if service.api_version:
+            version = service.api_version
+            key = _make_key(service_type, 'default_microversion')
+            kwargs[key] = version
+
+    config_kwargs = config_defaults.get_defaults()
+    config_kwargs.update(kwargs)
+    config = cloud_region.CloudRegion(
+        region_name=region_name, config=config_kwargs)
+    return config
+
+
+def create_connection(prof=None, cloud_region=None, **kwargs):
+    version_key = _make_key(API_NAME, 'api_version')
+    kwargs[version_key] = CURRENT_API_VERSION
+
+    if not cloud_region:
+        if prof:
+            cloud_region = _get_config_from_profile(prof, **kwargs)
+    else:
+        # If we got the CloudRegion from python-openstackclient and it doesn't
+        # already have a default microversion set, set it here.
+        microversion_key = _make_key(API_NAME, 'default_microversion')
+        cloud_region.config.setdefault(microversion_key, CURRENT_API_VERSION)
 
-    return connection.Connection(profile=prof, user_agent=user_agent, **kwargs)
+    user_agent = kwargs.pop('user_agent', None)
+    app_name = kwargs.pop('app_name', None)
+    app_version = kwargs.pop('app_version', None)
+    if user_agent is not None and (not app_name and not app_version):
+        app_name, app_version = user_agent.split('/', 1)
+
+    return connection.Connection(
+        config=cloud_region,
+        app_name=app_name,
+        app_version=app_version, **kwargs)
 
 
 def make_client(instance):
     """Returns a clustering proxy"""
+    # TODO(mordred) the ClientManager already has an OpenStackSDK connection,
+    # but it only has it once setup_auth has been called. For things that
+    # don't require auth, this is problematic, so we have to make our own.
+    # Use the CloudRegion stored on the ClientManager for now.
     conn = create_connection(
-        region_name=instance.region_name,
-        interface=instance.interface,
-        authenticator=instance.session.auth
+        cloud_region=instance._cli_options,
     )
 
     LOG.debug('Connection: %s', conn)
     LOG.debug('Clustering client initialized using OpenStackSDK: %s',
-              conn.cluster)
-    return conn.cluster
+              conn.clustering)
+    return conn.clustering
 
 
 def build_option_parser(parser):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/senlinclient/tests/functional/test_clusters.py 
new/python-senlinclient-1.10.1/senlinclient/tests/functional/test_clusters.py
--- 
old/python-senlinclient-1.8.0/senlinclient/tests/functional/test_clusters.py    
    2018-08-08 20:23:54.000000000 +0200
+++ 
new/python-senlinclient-1.10.1/senlinclient/tests/functional/test_clusters.py   
    2019-03-08 01:47:21.000000000 +0100
@@ -9,7 +9,6 @@
 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 # License for the specific language governing permissions and limitations
 # under the License.
-from tempest.lib import decorators
 
 from senlinclient.tests.functional import base
 
@@ -82,10 +81,6 @@
         self.assertEqual(cluster_data['timeout'], '300')
         self.assertEqual(new_pf['name'], node_data['profile_name'])
 
-    # (chenyb4) cluster update profile only need api microversion support,
-    # skip cluster update profile only before openstacksdk support
-    # api microversion.
-    @decorators.skip_because(bug="2003146")
     def test_cluster_update_profile_only(self):
         old_name = self.name_generate()
         old_pf = self.profile_create(old_name)
@@ -257,9 +252,6 @@
         self.assertEqual('', mem_del_data['node_ids'])
         self.assertNotIn(node['id'], mem_del_data['node_ids'])
 
-    # (chenyb4) cluster members replace need api microversion support,
-    # skip cluster members replace before openstacksdk support api microversion
-    @decorators.skip_because(bug="2003146")
     def test_cluster_members_replace(self):
         name = self.name_generate()
         pf = self.profile_create(name)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/senlinclient/tests/unit/test_format_utils.py 
new/python-senlinclient-1.10.1/senlinclient/tests/unit/test_format_utils.py
--- old/python-senlinclient-1.8.0/senlinclient/tests/unit/test_format_utils.py  
2018-08-08 20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/senlinclient/tests/unit/test_format_utils.py 
2019-03-08 01:47:24.000000000 +0100
@@ -10,9 +10,10 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-import json
 import yaml
 
+from oslo_serialization import jsonutils
+
 from osc_lib.tests import utils
 from senlinclient.common import format_utils
 
@@ -46,7 +47,7 @@
     def test_json_format(self):
         self.cmd = ShowJson(self.app, None)
         parsed_args = self.check_parser(self.cmd, [], [])
-        expected = json.dumps(dict(zip(columns, data)), indent=2)
+        expected = jsonutils.dumps(dict(zip(columns, data)), indent=2)
 
         self.cmd.run(parsed_args)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/senlinclient/tests/unit/test_plugin.py 
new/python-senlinclient-1.10.1/senlinclient/tests/unit/test_plugin.py
--- old/python-senlinclient-1.8.0/senlinclient/tests/unit/test_plugin.py        
2018-08-08 20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/senlinclient/tests/unit/test_plugin.py       
2019-03-08 01:47:24.000000000 +0100
@@ -12,7 +12,6 @@
 
 import mock
 from openstack import connection as sdk_connection
-from openstack import profile as sdk_profile
 import testtools
 
 from senlinclient import plugin
@@ -22,7 +21,15 @@
 
     @mock.patch.object(sdk_connection, 'Connection')
     def test_create_connection_with_profile(self, mock_connection):
+        class FakeService(object):
+            interface = 'public'
+            region = 'a_region'
+            version = '1'
+            api_version = None
+            service_type = 'clustering'
+
         mock_prof = mock.Mock()
+        mock_prof.get_services.return_value = [FakeService()]
         mock_conn = mock.Mock()
         mock_connection.return_value = mock_conn
         kwargs = {
@@ -31,20 +38,17 @@
             'auth_url': 'test_url'
         }
         res = plugin.create_connection(mock_prof, **kwargs)
-        mock_connection.assert_called_once_with(profile=mock_prof,
-                                                user_agent=None,
-                                                user_id='123',
-                                                password='abc',
-                                                auth_url='test_url')
+        mock_connection.assert_called_once_with(
+            app_name=None, app_version=None,
+            config=mock.ANY,
+            clustering_api_version=plugin.CURRENT_API_VERSION,
+            **kwargs
+        )
         self.assertEqual(mock_conn, res)
 
     @mock.patch.object(sdk_connection, 'Connection')
-    @mock.patch.object(sdk_profile, 'Profile')
-    def test_create_connection_without_profile(self, mock_profile,
-                                               mock_connection):
-        mock_prof = mock.Mock()
+    def test_create_connection_without_profile(self, mock_connection):
         mock_conn = mock.Mock()
-        mock_profile.return_value = mock_prof
         mock_connection.return_value = mock_conn
         kwargs = {
             'interface': 'public',
@@ -55,11 +59,14 @@
         }
         res = plugin.create_connection(**kwargs)
 
-        mock_prof.set_interface.assert_called_once_with('clustering', 'public')
-        mock_prof.set_region.assert_called_once_with('clustering', 'RegionOne')
-        mock_connection.assert_called_once_with(profile=mock_prof,
-                                                user_agent=None,
-                                                user_id='123',
-                                                password='abc',
-                                                auth_url='test_url')
+        mock_connection.assert_called_once_with(
+            app_name=None, app_version=None,
+            auth_url='test_url',
+            clustering_api_version=plugin.CURRENT_API_VERSION,
+            config=None,
+            interface='public',
+            password='abc',
+            region_name='RegionOne',
+            user_id='123'
+        )
         self.assertEqual(mock_conn, res)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/senlinclient/tests/unit/v1/fakes.py 
new/python-senlinclient-1.10.1/senlinclient/tests/unit/v1/fakes.py
--- old/python-senlinclient-1.8.0/senlinclient/tests/unit/v1/fakes.py   
2018-08-08 20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/senlinclient/tests/unit/v1/fakes.py  
2019-03-08 01:47:24.000000000 +0100
@@ -12,12 +12,11 @@
 
 import sys
 
-import json
 import mock
 from osc_lib.tests import utils
 import requests
-import six
 
+from oslo_serialization import jsonutils
 
 AUTH_TOKEN = "foobar"
 AUTH_URL = "http://0.0.0.0";
@@ -158,9 +157,7 @@
         self.status_code = status_code
 
         self.headers.update(headers)
-        self._content = json.dumps(data)
-        if not isinstance(self._content, six.binary_type):
-            self._content = self._content.encode()
+        self._content = jsonutils.dump_as_bytes(data)
 
 
 class FakeClusteringv1Client(object):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/senlinclient/tests/unit/v1/test_client.py 
new/python-senlinclient-1.10.1/senlinclient/tests/unit/v1/test_client.py
--- old/python-senlinclient-1.8.0/senlinclient/tests/unit/v1/test_client.py     
2018-08-08 20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/senlinclient/tests/unit/v1/test_client.py    
2019-03-08 01:47:21.000000000 +0100
@@ -220,8 +220,8 @@
         sc = client.Client()
 
         res = sc.cluster_add_nodes('FAKE_ID', ['NODE1', 'NODE2'])
-        self.assertEqual(self.service.cluster_add_nodes.return_value, res)
-        self.service.cluster_add_nodes.assert_called_once_with(
+        self.assertEqual(self.service.add_nodes_to_cluster.return_value, res)
+        self.service.add_nodes_to_cluster.assert_called_once_with(
             'FAKE_ID', ['NODE1', 'NODE2'])
 
     def test_cluster_del_nodes(self, mock_conn):
@@ -229,8 +229,9 @@
         sc = client.Client()
 
         res = sc.cluster_del_nodes('FAKE_ID', ['NODE1', 'NODE2'])
-        self.assertEqual(self.service.cluster_del_nodes.return_value, res)
-        self.service.cluster_del_nodes.assert_called_once_with(
+        self.assertEqual(self.service.remove_nodes_from_cluster.return_value,
+                         res)
+        self.service.remove_nodes_from_cluster.assert_called_once_with(
             'FAKE_ID', ['NODE1', 'NODE2'])
 
     def test_cluster_resize(self, mock_conn):
@@ -238,8 +239,8 @@
         sc = client.Client()
 
         res = sc.cluster_resize('FAKE_ID', foo='bar', zoo=1)
-        self.assertEqual(self.service.cluster_resize.return_value, res)
-        self.service.cluster_resize.assert_called_once_with(
+        self.assertEqual(self.service.resize_cluster.return_value, res)
+        self.service.resize_cluster.assert_called_once_with(
             'FAKE_ID', foo='bar', zoo=1)
 
     def test_cluster_scale_in(self, mock_conn):
@@ -247,8 +248,8 @@
         sc = client.Client()
 
         res = sc.cluster_scale_in('FAKE_ID', 3)
-        self.assertEqual(self.service.cluster_scale_in.return_value, res)
-        self.service.cluster_scale_in.assert_called_once_with(
+        self.assertEqual(self.service.scale_in_cluster.return_value, res)
+        self.service.scale_in_cluster.assert_called_once_with(
             'FAKE_ID', 3)
 
     def test_cluster_scale_out(self, mock_conn):
@@ -256,8 +257,8 @@
         sc = client.Client()
 
         res = sc.cluster_scale_out('FAKE_ID', 3)
-        self.assertEqual(self.service.cluster_scale_out.return_value, res)
-        self.service.cluster_scale_out.assert_called_once_with(
+        self.assertEqual(self.service.scale_out_cluster.return_value, res)
+        self.service.scale_out_cluster.assert_called_once_with(
             'FAKE_ID', 3)
 
     def test_cluster_policies(self, mock_conn):
@@ -283,8 +284,9 @@
         sc = client.Client()
 
         res = sc.cluster_attach_policy('FOO', 'BAR', zoo='car')
-        self.assertEqual(self.service.cluster_attach_policy.return_value, res)
-        self.service.cluster_attach_policy.assert_called_once_with(
+        self.assertEqual(self.service.attach_policy_to_cluster.return_value,
+                         res)
+        self.service.attach_policy_to_cluster.assert_called_once_with(
             'FOO', 'BAR', zoo='car')
 
     def test_cluster_detach_policy(self, mock_conn):
@@ -292,8 +294,9 @@
         sc = client.Client()
 
         res = sc.cluster_detach_policy('FOO', 'BAR')
-        self.assertEqual(self.service.cluster_detach_policy.return_value, res)
-        self.service.cluster_detach_policy.assert_called_once_with(
+        self.assertEqual(self.service.detach_policy_from_cluster.return_value,
+                         res)
+        self.service.detach_policy_from_cluster.assert_called_once_with(
             'FOO', 'BAR')
 
     def test_cluster_update_policy(self, mock_conn):
@@ -301,8 +304,8 @@
         sc = client.Client()
 
         res = sc.cluster_update_policy('FOO', 'BAR', foo='bar')
-        self.assertEqual(self.service.cluster_update_policy.return_value, res)
-        self.service.cluster_update_policy.assert_called_once_with(
+        self.assertEqual(self.service.update_cluster_policy.return_value, res)
+        self.service.update_cluster_policy.assert_called_once_with(
             'FOO', 'BAR', foo='bar')
 
     def test_check_cluster(self, mock_conn):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/senlinclient/tests/unit/v1/test_cluster.py 
new/python-senlinclient-1.10.1/senlinclient/tests/unit/v1/test_cluster.py
--- old/python-senlinclient-1.8.0/senlinclient/tests/unit/v1/test_cluster.py    
2018-08-08 20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/senlinclient/tests/unit/v1/test_cluster.py   
2019-03-08 01:47:21.000000000 +0100
@@ -432,7 +432,7 @@
     def setUp(self):
         super(TestClusterResize, self).setUp()
         self.cmd = osc_cluster.ResizeCluster(self.app, None)
-        self.mock_client.cluster_resize = mock.Mock(
+        self.mock_client.resize_cluster = mock.Mock(
             return_value=self.response)
 
     def test_cluster_resize_no_params(self):
@@ -460,7 +460,7 @@
                    'my_cluster', '--strict']
         parsed_args = self.check_parser(self.cmd, arglist, [])
         self.cmd.take_action(parsed_args)
-        self.mock_client.cluster_resize.assert_called_with('my_cluster',
+        self.mock_client.resize_cluster.assert_called_with('my_cluster',
                                                            **self.defaults)
 
     def test_cluster_resize_invalid_capacity(self):
@@ -481,7 +481,7 @@
         kwargs['number'] = 1
         parsed_args = self.check_parser(self.cmd, arglist, [])
         self.cmd.take_action(parsed_args)
-        self.mock_client.cluster_resize.assert_called_with('my_cluster',
+        self.mock_client.resize_cluster.assert_called_with('my_cluster',
                                                            **kwargs)
 
     def test_cluster_resize_invalid_adjustment(self):
@@ -501,7 +501,7 @@
         kwargs['adjustment_type'] = 'CHANGE_IN_PERCENTAGE'
         kwargs['number'] = 50.0
         self.cmd.take_action(parsed_args)
-        self.mock_client.cluster_resize.assert_called_with('my_cluster',
+        self.mock_client.resize_cluster.assert_called_with('my_cluster',
                                                            **kwargs)
 
     def test_cluster_resize_invalid_percentage(self):
@@ -568,14 +568,14 @@
     def setUp(self):
         super(TestClusterScaleIn, self).setUp()
         self.cmd = osc_cluster.ScaleInCluster(self.app, None)
-        self.mock_client.cluster_scale_in = mock.Mock(
+        self.mock_client.scale_in_cluster = mock.Mock(
             return_value=self.response)
 
     def test_cluster_scale_in(self):
         arglist = ['--count', '2', 'my_cluster']
         parsed_args = self.check_parser(self.cmd, arglist, [])
         self.cmd.take_action(parsed_args)
-        self.mock_client.cluster_scale_in.assert_called_with('my_cluster',
+        self.mock_client.scale_in_cluster.assert_called_with('my_cluster',
                                                              '2')
 
 
@@ -585,14 +585,14 @@
     def setUp(self):
         super(TestClusterScaleOut, self).setUp()
         self.cmd = osc_cluster.ScaleOutCluster(self.app, None)
-        self.mock_client.cluster_scale_out = mock.Mock(
+        self.mock_client.scale_out_cluster = mock.Mock(
             return_value=self.response)
 
-    def test_cluster_scale_in(self):
+    def test_cluster_scale_out(self):
         arglist = ['--count', '2', 'my_cluster']
         parsed_args = self.check_parser(self.cmd, arglist, [])
         self.cmd.take_action(parsed_args)
-        self.mock_client.cluster_scale_out.assert_called_with('my_cluster',
+        self.mock_client.scale_out_cluster.assert_called_with('my_cluster',
                                                               '2')
 
 
@@ -602,14 +602,14 @@
     def setUp(self):
         super(TestClusterPolicyAttach, self).setUp()
         self.cmd = osc_cluster.ClusterPolicyAttach(self.app, None)
-        self.mock_client.cluster_attach_policy = mock.Mock(
+        self.mock_client.attach_policy_to_cluster = mock.Mock(
             return_value=self.response)
 
     def test_cluster_policy_attach(self):
         arglist = ['--policy', 'my_policy', '--enabled', 'True', 'my_cluster']
         parsed_args = self.check_parser(self.cmd, arglist, [])
         self.cmd.take_action(parsed_args)
-        self.mock_client.cluster_attach_policy.assert_called_with(
+        self.mock_client.attach_policy_to_cluster.assert_called_with(
             'my_cluster',
             'my_policy',
             enabled=True)
@@ -621,14 +621,14 @@
     def setUp(self):
         super(TestClusterPolicyDetach, self).setUp()
         self.cmd = osc_cluster.ClusterPolicyDetach(self.app, None)
-        self.mock_client.cluster_detach_policy = mock.Mock(
+        self.mock_client.detach_policy_from_cluster = mock.Mock(
             return_value=self.response)
 
     def test_cluster_policy_detach(self):
         arglist = ['--policy', 'my_policy', 'my_cluster']
         parsed_args = self.check_parser(self.cmd, arglist, [])
         self.cmd.take_action(parsed_args)
-        self.mock_client.cluster_detach_policy.assert_called_with(
+        self.mock_client.detach_policy_from_cluster.assert_called_with(
             'my_cluster',
             'my_policy')
 
@@ -711,14 +711,14 @@
     def setUp(self):
         super(TestClusterNodeAdd, self).setUp()
         self.cmd = osc_cluster.ClusterNodeAdd(self.app, None)
-        self.mock_client.cluster_add_nodes = mock.Mock(
+        self.mock_client.add_nodes_to_cluster = mock.Mock(
             return_value=self.response)
 
     def test_cluster_node_add(self):
         arglist = ['--nodes', 'node1', 'my_cluster']
         parsed_args = self.check_parser(self.cmd, arglist, [])
         self.cmd.take_action(parsed_args)
-        self.mock_client.cluster_add_nodes.assert_called_with(
+        self.mock_client.add_nodes_to_cluster.assert_called_with(
             'my_cluster',
             ['node1'])
 
@@ -726,7 +726,7 @@
         arglist = ['--nodes', 'node1,node2', 'my_cluster']
         parsed_args = self.check_parser(self.cmd, arglist, [])
         self.cmd.take_action(parsed_args)
-        self.mock_client.cluster_add_nodes.assert_called_with(
+        self.mock_client.add_nodes_to_cluster.assert_called_with(
             'my_cluster',
             ['node1', 'node2'])
 
@@ -737,14 +737,14 @@
     def setUp(self):
         super(TestClusterNodeDel, self).setUp()
         self.cmd = osc_cluster.ClusterNodeDel(self.app, None)
-        self.mock_client.cluster_del_nodes = mock.Mock(
+        self.mock_client.remove_nodes_from_cluster = mock.Mock(
             return_value=self.response)
 
     def test_cluster_node_delete(self):
         arglist = ['-d', 'True', '--nodes', 'node1', 'my_cluster']
         parsed_args = self.check_parser(self.cmd, arglist, [])
         self.cmd.take_action(parsed_args)
-        self.mock_client.cluster_del_nodes.assert_called_with(
+        self.mock_client.remove_nodes_from_cluster.assert_called_with(
             'my_cluster',
             ['node1'],
             destroy_after_deletion=True)
@@ -753,7 +753,7 @@
         arglist = ['-d', 'False', '--nodes', 'node1', 'my_cluster']
         parsed_args = self.check_parser(self.cmd, arglist, [])
         self.cmd.take_action(parsed_args)
-        self.mock_client.cluster_del_nodes.assert_called_with(
+        self.mock_client.remove_nodes_from_cluster.assert_called_with(
             'my_cluster',
             ['node1'],
             destroy_after_deletion=False)
@@ -762,7 +762,7 @@
         arglist = ['--nodes', 'node1,node2', 'my_cluster']
         parsed_args = self.check_parser(self.cmd, arglist, [])
         self.cmd.take_action(parsed_args)
-        self.mock_client.cluster_del_nodes.assert_called_with(
+        self.mock_client.remove_nodes_from_cluster.assert_called_with(
             'my_cluster',
             ['node1', 'node2'],
             destroy_after_deletion=False)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/senlinclient/tests/unit/v1/test_cluster_policy.py 
new/python-senlinclient-1.10.1/senlinclient/tests/unit/v1/test_cluster_policy.py
--- 
old/python-senlinclient-1.8.0/senlinclient/tests/unit/v1/test_cluster_policy.py 
    2018-08-08 20:23:54.000000000 +0200
+++ 
new/python-senlinclient-1.10.1/senlinclient/tests/unit/v1/test_cluster_policy.py
    2019-03-08 01:47:21.000000000 +0100
@@ -89,12 +89,12 @@
         super(TestClusterPolicyUpdate, self).setUp()
         self.cmd = osc_cluster_policy.ClusterPolicyUpdate(self.app, None)
         fake_resp = {"action": "8bb476c3-0f4c-44ee-9f64-c7b0260814de"}
-        self.mock_client.cluster_update_policy = mock.Mock(
+        self.mock_client.update_cluster_policy = mock.Mock(
             return_value=fake_resp)
 
     def test_cluster_policy_update(self):
         arglist = ['--policy', 'my_policy', '--enabled', 'true', 'my_cluster']
         parsed_args = self.check_parser(self.cmd, arglist, [])
         self.cmd.take_action(parsed_args)
-        self.mock_client.cluster_update_policy.assert_called_with(
+        self.mock_client.update_cluster_policy.assert_called_with(
             'my_cluster', 'my_policy', enabled=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-senlinclient-1.8.0/senlinclient/v1/client.py 
new/python-senlinclient-1.10.1/senlinclient/v1/client.py
--- old/python-senlinclient-1.8.0/senlinclient/v1/client.py     2018-08-08 
20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/senlinclient/v1/client.py    2019-03-08 
01:47:21.000000000 +0100
@@ -221,7 +221,7 @@
         https://developer.openstack.org/api-ref/clustering/
         #add-nodes-to-a-cluster
         """
-        return self.service.cluster_add_nodes(cluster, nodes)
+        return self.service.add_nodes_to_cluster(cluster, nodes)
 
     def cluster_del_nodes(self, cluster, nodes):
         """Delete a node belongs to cluster
@@ -230,7 +230,7 @@
         https://developer.openstack.org/api-ref/clustering/
         #remove-nodes-from-a-cluster
         """
-        return self.service.cluster_del_nodes(cluster, nodes)
+        return self.service.remove_nodes_from_cluster(cluster, nodes)
 
     def cluster_replace_nodes(self, cluster, nodes):
         """Replace the nodes in a cluster with specified nodes
@@ -239,7 +239,7 @@
         https://developer.openstack.org/api-ref/clustering/
         #replace-nodes-in-a-cluster
         """
-        return self.service.cluster_replace_nodes(cluster, nodes)
+        return self.service.replace_nodes_in_cluster(cluster, nodes)
 
     def cluster_resize(self, cluster, **params):
         """Resize cluster
@@ -247,7 +247,7 @@
         Doc link:
         https://developer.openstack.org/api-ref/clustering/#resize-a-cluster
         """
-        return self.service.cluster_resize(cluster, **params)
+        return self.service.resize_cluster(cluster, **params)
 
     def cluster_scale_out(self, cluster, count):
         """Scale out cluster
@@ -255,7 +255,7 @@
         Doc link:
         https://developer.openstack.org/api-ref/clustering/#scale-out-a-cluster
         """
-        return self.service.cluster_scale_out(cluster, count)
+        return self.service.scale_out_cluster(cluster, count)
 
     def cluster_scale_in(self, cluster, count):
         """Scale in cluster
@@ -263,7 +263,7 @@
         Doc link:
         https://developer.openstack.org/api-ref/clustering/#scale-in-a-cluster
         """
-        return self.service.cluster_scale_in(cluster, count)
+        return self.service.scale_in_cluster(cluster, count)
 
     def cluster_policies(self, cluster, **queries):
         """List all policies attached to cluster
@@ -290,7 +290,7 @@
         https://developer.openstack.org/api-ref/clustering/
         #attach-a-policy-to-a-cluster
         """
-        return self.service.cluster_attach_policy(cluster, policy, **attrs)
+        return self.service.attach_policy_to_cluster(cluster, policy, **attrs)
 
     def cluster_detach_policy(self, cluster, policy):
         """Detach a policy from cluster
@@ -299,7 +299,7 @@
         https://developer.openstack.org/api-ref/clustering/
         #detach-a-policy-from-a-cluster
         """
-        return self.service.cluster_detach_policy(cluster, policy)
+        return self.service.detach_policy_from_cluster(cluster, policy)
 
     def cluster_update_policy(self, cluster, policy, **attrs):
         """Update the policy attachment
@@ -308,7 +308,7 @@
         https://developer.openstack.org/api-ref/clustering/
         #update-a-policy-on-a-cluster
         """
-        return self.service.cluster_update_policy(cluster, policy, **attrs)
+        return self.service.update_cluster_policy(cluster, policy, **attrs)
 
     def collect_cluster_attrs(self, cluster, path):
         """Collect cluster attributes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-senlinclient-1.8.0/senlinclient/v1/cluster.py 
new/python-senlinclient-1.10.1/senlinclient/v1/cluster.py
--- old/python-senlinclient-1.8.0/senlinclient/v1/cluster.py    2018-08-08 
20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/senlinclient/v1/cluster.py   2019-03-08 
01:47:21.000000000 +0100
@@ -358,9 +358,9 @@
         result = {}
         for cid in parsed_args.cluster:
             try:
-                cluster = senlin_client.delete_cluster(
+                cluster_delete_action = senlin_client.delete_cluster(
                     cid, False, parsed_args.force_delete)
-                result[cid] = ('OK', cluster.location.split('/')[-1])
+                result[cid] = ('OK', cluster_delete_action['id'])
             except Exception as ex:
                 result[cid] = ('ERROR', six.text_type(ex))
 
@@ -503,7 +503,7 @@
         action_args['min_step'] = min_step
         action_args['strict'] = parsed_args.strict
 
-        resp = senlin_client.cluster_resize(parsed_args.cluster, **action_args)
+        resp = senlin_client.resize_cluster(parsed_args.cluster, **action_args)
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
         else:
@@ -533,8 +533,12 @@
         self.log.debug("take_action(%s)", parsed_args)
         senlin_client = self.app.client_manager.clustering
 
-        resp = senlin_client.cluster_scale_in(parsed_args.cluster,
+        resp = senlin_client.scale_in_cluster(parsed_args.cluster,
                                               parsed_args.count)
+        status_code = resp.get('code', None)
+        if status_code in [409]:
+            raise exc.CommandError(_(
+                'Unable to scale in cluster: %s') % resp['error']['message'])
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
         else:
@@ -564,8 +568,12 @@
         self.log.debug("take_action(%s)", parsed_args)
         senlin_client = self.app.client_manager.clustering
 
-        resp = senlin_client.cluster_scale_out(parsed_args.cluster,
+        resp = senlin_client.scale_out_cluster(parsed_args.cluster,
                                                parsed_args.count)
+        status_code = resp.get('code', None)
+        if status_code in [409]:
+            raise exc.CommandError(_(
+                'Unable to scale out cluster: %s') % resp['error']['message'])
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
         else:
@@ -608,9 +616,9 @@
                                                  strict=True),
         }
 
-        resp = senlin_client.cluster_attach_policy(parsed_args.cluster,
-                                                   parsed_args.policy,
-                                                   **kwargs)
+        resp = senlin_client.attach_policy_to_cluster(parsed_args.cluster,
+                                                      parsed_args.policy,
+                                                      **kwargs)
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
         else:
@@ -640,8 +648,8 @@
     def take_action(self, parsed_args):
         self.log.debug("take_action(%s)", parsed_args)
         senlin_client = self.app.client_manager.clustering
-        resp = senlin_client.cluster_detach_policy(parsed_args.cluster,
-                                                   parsed_args.policy)
+        resp = senlin_client.detach_policy_from_cluster(parsed_args.cluster,
+                                                        parsed_args.policy)
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
         else:
@@ -750,7 +758,8 @@
         self.log.debug("take_action(%s)", parsed_args)
         senlin_client = self.app.client_manager.clustering
         node_ids = parsed_args.nodes.split(',')
-        resp = senlin_client.cluster_add_nodes(parsed_args.cluster, node_ids)
+        resp = senlin_client.add_nodes_to_cluster(parsed_args.cluster,
+                                                  node_ids)
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
         else:
@@ -792,8 +801,8 @@
         destroy = parsed_args.destroy_after_deletion
         destroy = strutils.bool_from_string(destroy, strict=True)
         kwargs = {"destroy_after_deletion": destroy}
-        resp = senlin_client.cluster_del_nodes(parsed_args.cluster, node_ids,
-                                               **kwargs)
+        resp = senlin_client.remove_nodes_from_cluster(
+            parsed_args.cluster, node_ids, **kwargs)
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
         else:
@@ -831,8 +840,8 @@
             key = nodepair.split('=')[0]
             value = nodepair.split('=')[1]
             nodepairs[key] = value
-        resp = senlin_client.cluster_replace_nodes(parsed_args.cluster,
-                                                   nodepairs)
+        resp = senlin_client.replace_nodes_in_cluster(parsed_args.cluster,
+                                                      nodepairs)
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
         else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-senlinclient-1.8.0/senlinclient/v1/cluster_policy.py 
new/python-senlinclient-1.10.1/senlinclient/v1/cluster_policy.py
--- old/python-senlinclient-1.8.0/senlinclient/v1/cluster_policy.py     
2018-08-08 20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/senlinclient/v1/cluster_policy.py    
2019-03-08 01:47:21.000000000 +0100
@@ -150,7 +150,7 @@
                                                  strict=True),
         }
 
-        resp = senlin_client.cluster_update_policy(parsed_args.cluster,
+        resp = senlin_client.update_cluster_policy(parsed_args.cluster,
                                                    parsed_args.policy,
                                                    **kwargs)
         if 'action' in resp:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-senlinclient-1.8.0/senlinclient/v1/node.py 
new/python-senlinclient-1.10.1/senlinclient/v1/node.py
--- old/python-senlinclient-1.8.0/senlinclient/v1/node.py       2018-08-08 
20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/senlinclient/v1/node.py      2019-03-08 
01:47:21.000000000 +0100
@@ -329,9 +329,9 @@
         result = {}
         for nid in parsed_args.node:
             try:
-                node = senlin_client.delete_node(
+                node_delete_action = senlin_client.delete_node(
                     nid, False, parsed_args.force_delete)
-                result[nid] = ('OK', node.location.split('/')[-1])
+                result[nid] = ('OK', node_delete_action['id'])
             except Exception as ex:
                 result[nid] = ('ERROR', six.text_type(ex))
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-senlinclient-1.8.0/setup.cfg 
new/python-senlinclient-1.10.1/setup.cfg
--- old/python-senlinclient-1.8.0/setup.cfg     2018-08-08 20:27:17.000000000 
+0200
+++ new/python-senlinclient-1.10.1/setup.cfg    2019-03-08 01:49:25.000000000 
+0100
@@ -4,7 +4,7 @@
 description-file = 
        README.rst
 author = OpenStack
-author-email = [email protected]
+author-email = [email protected]
 home-page = https://docs.openstack.org/python-senlinclient/latest/
 classifier = 
        Environment :: OpenStack
@@ -17,6 +17,7 @@
        Programming Language :: Python :: 2.7
        Programming Language :: Python :: 3
        Programming Language :: Python :: 3.5
+       Programming Language :: Python :: 3.6
 
 [files]
 packages = 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-senlinclient-1.8.0/test-requirements.txt 
new/python-senlinclient-1.10.1/test-requirements.txt
--- old/python-senlinclient-1.8.0/test-requirements.txt 2018-08-08 
20:23:54.000000000 +0200
+++ new/python-senlinclient-1.10.1/test-requirements.txt        2019-03-08 
01:47:21.000000000 +0100
@@ -3,7 +3,8 @@
 # process, which may cause wedges in the gate later.
 
 # Hacking already pins down pep8, pyflakes and flake8
-hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0
+bandit>=1.1.0 # Apache-2.0
+hacking>=1.1.0,<1.2.0 # Apache-2.0
 coverage!=4.4,>=4.0 # Apache-2.0
 fixtures>=3.0.0 # Apache-2.0/BSD
 requests-mock>=1.2.0 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-senlinclient-1.8.0/tox.ini 
new/python-senlinclient-1.10.1/tox.ini
--- old/python-senlinclient-1.8.0/tox.ini       2018-08-08 20:23:54.000000000 
+0200
+++ new/python-senlinclient-1.10.1/tox.ini      2019-03-08 01:47:21.000000000 
+0100
@@ -17,6 +17,11 @@
     stestr run --slowest {posargs}
 whitelist_externals = find
 
+[testenv:bandit]
+basepython = python3
+deps = -r{toxinidir}/test-requirements.txt
+commands = bandit -r senlinclient -x tests -n5 -ll
+
 [testenv:pep8]
 basepython = python3
 commands =
@@ -40,7 +45,7 @@
 setenv =
     PYTHON=coverage run --source senlinclient --parallel-mode
 commands =
-    stestr run '{posargs}'
+    stestr run {posargs}
     coverage combine
     coverage html -d cover
     coverage xml -o cover/coverage.xml


Reply via email to