diff -pruN 2.2.1-2/AUTHORS 2.3.0-0ubuntu1/AUTHORS
--- 2.2.1-2/AUTHORS	1970-01-01 00:00:00.000000000 +0000
+++ 2.3.0-0ubuntu1/AUTHORS	2021-08-02 09:40:22.000000000 +0000
@@ -0,0 +1,103 @@
+10074432 <liu.xuefeng1@zte.com.cn>
+Aaron-DH <dinghh@awcloud.com>
+Andreas Jaeger <aj@suse.com>
+Ayush Garg <ayush.garg@nectechnologies.in>
+Bo Tran <ministry.96.nd@gmail.com>
+Cao Xuan Hoang <hoangcx@vn.fujitsu.com>
+Christopher Stone <cstone@blizzard.com>
+Cindia-blue <lxinhui@vmware.com>
+Corey Bryant <corey.bryant@canonical.com>
+Doug Hellmann <doug@doughellmann.com>
+Duc Truong <dtruong@blizzard.com>
+EldonZhao <xyz_213083464@126.com>
+Erik Olof Gunnar Andersson <eandersson@blizzard.com>
+Ethan Lynn <xjunlin@cn.ibm.com>
+Ethan Lynn <xuanlangjian@gmail.com>
+Flavio Percoco <flaper87@gmail.com>
+ForestLee <lichl@hotmail.com>
+Ghanshyam Mann <gmann@ghanshyammann.com>
+Haiwei Xu <hai-xu@xr.jp.nec.com>
+Haiwei Xu <xu-haiwei@mxw.nes.nec.co.jp>
+Hangdong Zhang <hdzhang@fiberhome.com>
+Hervé Beraud <hberaud@redhat.com>
+Hoang Trung Hieu <hieuht@vn.fujitsu.com>
+Ian Wienand <iwienand@redhat.com>
+James E. Blair <jeblair@redhat.com>
+Jeffrey Guan <double12gzh@gmail.com>
+Jeremy Liu <liujiong@gohighsec.com>
+Jeremy Stanley <fungi@yuggoth.org>
+Jude Cross <jucross@blizzard.com>
+KATO Tomoyuki <kato.tomoyuki@jp.fujitsu.com>
+LiuNanke <nanke.liu@easystack.cn>
+Liuqing Jing <lawrancejing@gmail.com>
+Lu lei <lei.lu@easystack.cn>
+Luigi Toscano <ltoscano@redhat.com>
+Monty Taylor <mordred@inaugust.com>
+Navneet Gupta <navneet@us.ibm.com>
+Nguyen Hai <nguyentrihai93@gmail.com>
+Ondřej Nový <ondrej.novy@firma.seznam.cz>
+OpenStack Release Bot <infra-root@openstack.org>
+PanFengyun <fengyun.pan@easystack.cn>
+QI ZHANG <qizh@cn.ibm.com>
+Qiming <tengqim@cn.ibm.com>
+Qiming Teng <tengqim@cn.ibm.com>
+Saju <sanjufoss@gmail.com>
+Sean McGinnis <sean.mcginnis@gmail.com>
+Sharat Sharma <sharat.sharma@nectechnologies.in>
+Stephen Finucane <stephenfin@redhat.com>
+Tang Chen <chen.tang@easystack.cn>
+Thomas Bechtold <tbechtold@suse.com>
+Thomas Herve <therve@redhat.com>
+Tony Breeds <tony@bakeyournoodle.com>
+Tovin Seven <vinhnt@vn.fujitsu.com>
+Vieri <15050873171@163.com>
+Vu Cong Tuan <tuanvc@vn.fujitsu.com>
+XueFeng Liu <liu.xuefeng1@zte.com.cn>
+Yanyan Hu <yanyanhu@cn.ibm.com>
+Yuanbin.Chen <cybing4@gmail.com>
+ZhijunWei <wzj334965317@outlook.com>
+ZhongShengping <chdzsp@163.com>
+bhavani.cr <bhavani.r@nectechnologies.in>
+blkart <blkart.org@gmail.com>
+blue55 <yllan@fiberhome.com>
+caishan <caishan1993@foxmail.com>
+cao.yuan <cao.yuan@99cloud.net>
+chenke <chen.ke14@zte.com.cn>
+chenpengzi <1523688226@qq.com>
+chohoor <chohoor@gmail.com>
+dixiaoli <dixiaobj@cn.ibm.com>
+gecong1973 <ge.cong@zte.com.cn>
+gengchc2 <geng.changcai2@zte.com.cn>
+gugug <gu.jin@99cloud.net>
+howardlee <lihongweibj@inspur.com>
+huangtianhua <huangtianhua@huawei.com>
+jacky06 <zhang.min@99cloud.net>
+jolie <guoshan@awcloud.com>
+jonnary <liu.xuefeng1@zte.com.cn>
+kavithahr <kavitha.r@nectechnologies.in>
+lawrancejing <lawrancejing@gmail.com>
+liyi <liyi8611@gmail.com>
+lvdongbing <dongbing.lv@kylin-cloud.com>
+malei <malei@maleideMacBook-Pro.local>
+mathspanda <mathspanda826@gmail.com>
+miaohb <miao.hongbao@zte.com.cn>
+pallavi <pallavi.s@nectechnologies.in>
+pawnesh.kumar <pawnesh.kumar@nectechnologies.in>
+pengdake <19921207pq@gmail.com>
+qinchunhua <qin.chunhua@zte.com.cn>
+qingszhao <zhao.daqing@99cloud.net>
+shangxiaobj <shangxiaobj@inspur.com>
+shu-mutou <shu-mutou@rf.jp.nec.com>
+sunjia <sunjia@inspur.com>
+sunxifa <sunxifa@inspur.com>
+tengqm <tengqim@cn.ibm.com>
+venkatamahesh <venkatamaheshkotha@gmail.com>
+wu.shiming <wushiming@yovole.com>
+xiaolihope <dixiaobj@cn.ibm.com>
+xiaozhuangqing <zhuangqing.xiao@easystack.cn>
+xu-haiwei <hai-xu@xr.jp.nec.com>
+yanyanhu <yanyanhu@cn.ibm.com>
+zhangguoqing <zhang.guoqing@99cloud.net>
+zhangyanxian <zhangyanxianmail@163.com>
+zhurong <aaronzhu1121@gmail.com>
+zzxwill <zzxwill@gmail.com>
diff -pruN 2.2.1-2/ChangeLog 2.3.0-0ubuntu1/ChangeLog
--- 2.2.1-2/ChangeLog	1970-01-01 00:00:00.000000000 +0000
+++ 2.3.0-0ubuntu1/ChangeLog	2021-08-02 09:40:22.000000000 +0000
@@ -0,0 +1,937 @@
+CHANGES
+=======
+
+2.3.0
+-----
+
+* Fix lower-constraints
+
+2.2.1
+-----
+
+* Remove unicode from python client
+* Update TOX\_CONSTRAINTS\_FILE
+* Fix config and metadata in cluster update
+* Adds --wait argument for cluster CLI interactions
+
+2.2.0
+-----
+
+* Send config parameters in cluster update
+* Remove install unnecessary packages
+* Add Python3 wallaby unit tests
+* Update master for stable/victoria
+* trivial: Drop references to os-testr
+
+2.1.1
+-----
+
+* Native Zuul v3 port of the legacy functional job
+* [goal] Migrate testing to ubuntu focal
+* drop mock from lower-constraints
+* Stop to use the \_\_future\_\_ module
+
+2.1.0
+-----
+
+* Switch to newer openstackdocstheme and reno versions
+* Remove translation sections from setup.cfg
+* Update hacking for Python3
+* Remove all usage of six library
+* Bump default tox env from py37 to py38
+* Add py38 package metadata
+* Use unittest.mock instead of third party mock
+* Add Python3 victoria unit tests
+* Update master for stable/ussuri
+* Cleanup py27 support
+
+2.0.1
+-----
+
+* Flush confirmation messages
+
+2.0.0
+-----
+
+* Change default API version to 1.14
+* Drop python 2.7 support and testing
+* Add action update command
+* Add support for node tainted field
+* Update master for stable/train
+* Return meta-data field for events list
+
+1.11.0
+------
+
+* Update api-ref location
+* Add Python 3 Train unit tests
+* Switch to the new canonical constraints URL on master
+* Fix uint test test\_json\_format and Solve pep8 msgfmt error
+* Replace git.openstack.org URLs with opendev.org URLs
+* OpenDev Migration Patch
+* Dropping the py35 testing
+* Replace openstack.org git:// URLs with https://
+* Imported Translations from Zanata
+* Update master for stable/stein
+
+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"
+* fix tox python3 overrides
+* pypy is no longer supported by oslo libraries
+* Fix docs cli authorize environment variables
+* Updated from global requirements
+* Follow the new PTI for document build
+* add lower-constraints job
+* Updated from global requirements
+* Updated from global requirements
+* Updated from global requirements
+* Add cli and contributor documents file
+* Fix request return resp not exist 'action' key
+* Updated from global requirements
+* Add node functional test and fix type list test
+* Imported Translations from Zanata
+* Remove run\_tests.sh
+* Updated from global requirements
+* Fix request version returns value handling error
+* Retrieve profile type by type name and version
+* Change event and node module describe error
+* Imported Translations from Zanata
+* Add profile, policy functional test
+* Remove unnecessary definition
+* Zuul: Remove project name
+* Update reno for stable/queens
+* Add back client module
+
+1.7.0
+-----
+
+* Receiver update faild when action value None
+* Zuul: Remove project name
+
+1.6.0
+-----
+
+* Q3 release note
+* Add basic functional tests
+* Updated from global requirements
+* Refactored make\_client
+* Add support for region\_name and interface for client connection
+* Updated from global requirements
+* Fix cluster/node force delete parameter location error
+* Update the home page
+* Delete TODO file support action create,delete operation
+* Retire senlin command line tool
+
+1.5.0
+-----
+
+* Updated from global requirements
+* Avoid tox\_install.sh for constraints support
+* Remove setting of version/release from releasenotes
+* Updated from global requirements
+* Fix delete cluster/node miss force-delete parameter
+* Updated from global requirements
+* Fix the ineffective url links in python-senlinclient docs
+* Switch to Zuul v3 testing
+* Imported Translations from Zanata
+* Add force parameter for cluster and node deletion
+* Updated from global requirements
+* Add profile type ops cli
+* Updated from global requirements
+* Updated from global requirements
+* Support node-adopt/preview CLI
+* Imported Translations from Zanata
+* Fix unit test failure
+* Updated from global requirements
+* Update reno for stable/pike
+* fixes support for osprofiler
+
+1.4.0
+-----
+
+* OSC command for node op and cluster op
+* Add an installation doc
+* Updated from global requirements
+* Updated from global requirements
+* Fix receiver-update mistake
+* Revise \`senlin service-list\`
+* Add --config option parameter for cluster-create command
+* Fix \`openstack cluster service\`
+* Revise service list help info
+* Updated from global requirements
+* Fix \`openstack cluster service\` Exception raised This patch fixes \`openstack cluster service\` Closes-bug: #1705069
+* List services doc link cannot be found
+* Update and optimize documentation links
+* Fix senlin cluster policy list error
+* Updated from global requirements
+* Unify style of 'domain' field
+* Profile id or name is a default profile
+* fix setup.cfg cluster service path error
+* Fix openstackdocstheme settings
+* Cleanup sphinx building
+* import cli-reference from openstack-manuals
+* Support to cluster-op and node-op operations
+* Updated from global requirements
+* Updated from global requirements
+* Enable some off-by-default checks
+* Make --os-profile load from environment variables
+* Support  receiver update operation
+* Add services list
+* Updated from global requirements
+* Fix html\_last\_updated\_fmt for Python3
+* Updated from global requirements
+* Fix development document api-ref link error
+* Updated from global requirements
+* remove redundant value when cluster-show
+* Updated from global requirements
+* Delete TODO about event-delete, The event-delete has been abandoned
+* Check node status before do cluster-recover action
+* Updated from global requirements
+
+1.3.0
+-----
+
+* Updated from global requirements
+* Updated from global requirements
+* Revise command reminder when we run \`openstack cluster resize\`
+* Revise command reminder when we run \`senlin cluster-resize\`
+* Remove log translations
+* Updated from global requirements
+* Param "response" is not used any more in  python-senlinclient/senlinclient/tests/unit/v1/test\_build\_info.py
+* delete bash\_completion in subcommand
+* Support check before do node-recover action
+* Support profile-only to cluster update
+* Fix hacking requirement for testing
+* Updated from global requirements
+* Using fixtures.MockPatch instead of mockpatch.Patch
+* The python 3.4 support is removed
+* Initial test hooks for functional test
+* Fixed warnings when building docs
+* Fix cluster update failed problem
+* Avoid import internal classes from SDK (3)
+* Avoid import internal classes from SDK (2)
+* Avoid import internal classes from SDK
+* Update imoprt order
+* Replace six.itervalues with dict.values()
+* Enable coverage report in console output
+* Updated from global requirements
+* Print support status while listing policy types
+* Support status output for profile type list
+* Add oslo\_debug\_helper to tox.ini
+* Remove a py34 environment from tox
+* Replaces yaml.load() with yaml.safe\_load()
+* Revert "Revert "Revert "Revert "Fix \`openstack  cluster profile validate\` bug""""
+* Fix SDK version problem
+* Updated from global requirements
+* Update reno for stable/ocata
+
+1.2.0
+-----
+
+* Release note for python-senlinclient 1.2.0
+* Fix senlin cluster-policy-detach cannot disable
+* Fix cluster\_collect interface
+* Updated from global requirements
+* Add deprecation of cluster-run cli
+* Updated from global requirements
+* Add missing requirements
+* Updated from global requirements
+* Client support for "destroy\_after\_deletion" in cluster del nodes
+* Add filter "user\_id" for receiver list
+* Remove unnecessary coding format in the head of files
+* Add parameter in CLUSTER\_DEL\_NODES action
+* Add user\_id in receiver list
+* Trivial: Modify the description of policy validate
+* Updated from global requirements
+* Trivial: Modify the description of profile validate
+* Revert "Revert "Revert "Fix \`openstack  cluster profile validate\` bug"""
+* Fix \`openstack  cluster policy show\` bug
+* Fix \`openstack  cluster policy vaildate\` bug
+* Revert "Revert "Fix \`openstack  cluster profile validate\` bug""
+* Revert "Revert "Get project\_id and user\_id when show profile""
+* Add Constraints support
+* Revert "Fix \`openstack  cluster profile validate\` bug"
+* Revise help string profile list
+* Revert "Get project\_id and user\_id when show profile"
+* Enhance the parameter check for "path" in cluster collect
+* Fix \`openstack  cluster profile validate\` bug
+* Client support for node replace
+* Get project\_id and user\_id when show profile
+* Updated from global requirements
+* Add metadata clean help
+* Delete pbr generated files
+* Fix import method to follow community guideline
+
+1.1.0
+-----
+
+* Release note for python-senlinclient 1.1.0
+* Fix resource update issues
+* Correct deprecation of scale-in and scale-out cli
+* Show team and repo badges on README
+* Fix error in policy-show
+* Updated from global requirements
+* Fix project\_id show in 'senlin xyz\_list -g'
+* Delete python bytecode file
+* Trivial: Fix a typo in cluster-run's error message
+* Fix error in cluster collect
+* Point out valid filter keys in \`openstack cluster member list\`
+* Fix cluster\_id field when listing events
+* key=value should be key2=value2
+* Revise the help message of cluster-collect
+* Revise the help info of cluster collect
+* Revise key1=value to key1=value1
+* Support  "global\_project" arguments for action-list
+* Point out valid sort keys in \`openstack cluster member list\`
+* Revise 'openstack cluster node members list'
+* The output of action list filtered by "target" returns empty
+* The output of event-list by filter "cluster\_id" return empty
+* Modify development doc url in CONTRIBUTING.rst
+* Updated from global requirements
+* Revise the help message of policy binding list
+* Add "cluster\_id" column to  \`openstack cluster event list\`
+* Add sort key "oid" in event list
+* Remove unsupported sort key "user"
+* Updated from global requirements
+* Revise "enabled" related code in ClusterPolicyUpdate
+* cluster policy attach cannot work
+* policy binding update cannot work
+* Policy binding attach cannot work
+* Support xyz\_update purging metadata
+* Add filters "policy\_type" and "policy\_name" for policy binding list
+* Rework do\_action\_list function's "full\_id" handling
+* Updated from global requirements
+* Fix target ID display when listing actions
+* Add filter "is\_enabled" for policy binding list
+* Updated from global requirements
+* Show project\_id field when xyz-list with global-project
+* Add AUTHORS and ChangeLog into gitignore
+* All dictionary options need be a string
+* profile's name also can be use in some commands
+* Add receiver type instruction
+* Updated from global requirements
+* Rework take\_action function in class ListAction
+* Fix error in "action list"
+* Modify several marker's help
+* Change osprofiler option "--profile" to "--os-profile"
+* Add plug-in summary for osc doc
+* action-list's given id not event id
+* Change the type of the parameter "enabled" to boolean
+* event-list cannot display correctly according to the sort option
+* Fix the incorrect version and release details
+* Enable release notes translation
+* Changed the link to home-page
+* Fix list of event with timestamp field
+* Updated from global requirements
+* Fix doc build if git is absent
+* \`openstack cluster event list --help\` bug
+* revise the "cluster-policy-attach"
+* Fix help msg of node-check and node-recover
+* Updated from global requirements
+* Replace 'MagicMock' with 'Mock'
+* Fix error in build-info
+* Fix error in action list
+* Fix 'type\_name' in \`openstack cluster profile list\`
+* Fix profile list
+* Fix \`openstack cluster event list\` bug
+* Fix \`openstack cluster action list\` bug
+* Fix error in do\_profile\_type\_list
+* Profile list can not display the "type" column
+* Make shell main() specify return value in exit code
+* fix indentation of reno toctree
+* Remove six.moves module
+* Show 'dependents' property in node details
+* Fix receiver list
+* Updated from global requirements
+* Update reno for stable/newton
+* senlin profile-create has no argument -t
+
+1.0.0
+-----
+
+* Release notes for newton-3 milestone
+* Clarify senlin CLI deprecation message
+* Fix output from cluster/node delete
+* Revise params of 'receiver create' command
+* Remove \*openstack/common\* from flake8 excclude list in tox.ini
+* OSC plugin command for cluster-run
+* Updated from global requirements
+* Fix "openstack cluster policy binding list <cluster>"
+* Fix cluster-policy-list
+* Add 'cluster-run' command
+* Updated from global requirements
+* Updated from global requirements
+* Fix get\_node
+* Fix \_show\_node error
+* Remove mox3 in test-requirement.txt of senlinclient
+* py3:Rmove six.iteritems/iterkeys in python-senlinclient
+* Imported Translations from Zanata
+* Add policy validate operation to senlinclient
+* Add profile validate operation to senlinclient
+* Imported Translations from Zanata
+* Reorder required parameters
+* Remove 'ProfileAction' and related arguments
+* Remove local cached version of Resource class
+* Add cluster\_collect support
+* Add support to micro-version
+* Updated from global requirements
+* Remove discover from test-requirements
+* Fix typo
+* Fix nodes display in cluster-show
+* Update senlinclient for new sdk version
+* Updated from global requirements
+* Updated from global requirements
+* Add Python 3.5 classifier and venv
+* Updated from global requirements
+* Prints  '-' instead of 'None' when data is None
+* Updated from global requirements
+* Updated from global requirements
+* Imported Translations from Zanata
+* Delete extra space
+* Use osc\_lib instead of cliff
+* Updated from global requirements
+* Use osc-lib instead of openstackclient
+* Enhance message related to OS\_PROJECT\_DOMAIN\_NAME
+* Imported Translations from Zanata
+* Imported Translations from Zanata
+* Fix openstack cluster resize
+* Remove unused POT file
+
+0.5.0
+-----
+
+* Added release notes for a new release
+* Updated from global requirements
+* Updated from global requirements
+* Updated from global requirements
+* Updated from global requirements
+* Updated from global requirements
+* Updated from global requirements
+* Updated from global requirements
+* Add reno for release notes management
+* Trival fix: Update README
+* Updated from global requirements
+* Updated from global requirements
+* Correct some typos
+* Updated from global requirements
+* Pramater doesn't align to comments
+* Removed the invalid link for Module Index
+* Add link to API doc in client module
+* Revert "Remove senlin CLI commands"
+* Support more parameters for senlinclient creation
+* Rename cluster scaling command
+* Remove senlin CLI commands
+* Refactor osc support
+* Add deprecation warnings for senlin commands
+* Add OSC command for senlin node-check/recover
+* Spelling mistakes on 'Clustering service command-line client' page
+
+0.4.1
+-----
+
+* Fix event list sorting
+* Add OSC command and enable more than one arguements
+* Add cluster check and recover into CLI
+* Updated from global requirements
+
+0.4.0
+-----
+
+* Fix node update receive a assertion error
+* Sort resource show columns
+* Update OSC metavars
+* Add OSC plugin for openstack cluster build info
+* Add OSC plugin for openstack cluster action show
+* Add OSC plugin for openstack cluster action list
+* Add OSC plugin for openstack cluster event show
+* Add OSC plugin for openstack cluster event list
+* Add OSC plugin for openstack cluster receiver delete
+* Add OSC plugin for openstack cluster receiver create
+* Add OSC plugin for openstack cluster receiver show
+* Add OpenstackClient plugin for cluster members del
+* Add OpenstackClient plugin for cluster members add
+* Add OpenstackClient plugin for cluster members list
+* Add OpenstackClient plugin for cluster policy binding update
+* Add OpenstackClient plugin for cluster policy binding show
+* Add OpenstackClient plugin for cluster policy binding list
+* Add OSC plugin for openstack cluster policy detach
+* Add OSC plugin for openstack cluster policy attach
+* Add OSC plugin for openstack cluster scale out
+* Add OSC plugin for openstack cluster scale in
+* Add OSC plugin for openstack cluster resize
+* Add OSC plugin for openstack cluster delete
+* Add OSC plugin for openstack cluster receiver list
+* Fix senlin help receiver-list
+* Fix SDK exception parsing
+* Add OSC plugin for openstack cluster update
+* Add OSC plugin for cluster policy type show
+* OSC plugin for openstack cluster policy type list
+* Add OSC plugin for openstack cluster create
+* Add OSC plugin for openstack cluster show
+* Add OpenstackClient plugin for cluster policy delete
+* Add OpenstackClient plugin for cluster policy update
+* Add OpenstackClient plugin for cluster policy create
+* Add OpenstackClient plugin for cluster policy show
+* OSC plugin for openstack cluster list
+* Add "--filter" for command openstack cluster profile list
+* Add OpenstackClient plugin for cluster policy list
+* Add filters option to policy-list command
+* Fix translation setup
+* Ensure cluster is specified when creating receivers
+* Updated from global requirements
+* Add OpenstackClient plugin for cluster node delete
+* Add OpenstackClient plugin for cluster node update
+* Add OpenstackClient plugin for cluster node create
+* Add OpenstackClient plugin for cluster node show
+* Remove profile permission
+* Add OpenstackClient plugin for cluster profile update
+* Add OpenstackClient plugin for cluster node list
+* Add OpenstackClient plugin for cluster profile create
+* Add OpenstackClient plugin for cluster profile type show
+* Add OpenstackClient plugin for cluster profile delete
+* Add filters option to profile-list command
+* Add JsonFormat display option
+* Add OpenstackClient plugin for cluster profile type list
+* Add OpenstackClient plugin for cluster profile list
+* Updated from global requirements
+* Add OpenstackClient plugin for cluster profile show
+* Add node check and recover into CLI
+* Add the unit test for utils module
+* Apply list\_formatter on two properties
+* Handle ResourceNotFound when resource is not found
+* Make ignore\_missing False when deleting resource
+* Parse exceptions from openstacksdk
+* Updated from global requirements
+* Fix cluster\_update\_policy parameter passing error
+* Remove nested cluster support
+* Updated from global requirements
+* Change 'status\_code' to 'http\_status' to parse SDK's exception
+
+0.3.0
+-----
+
+* Remove argparse from requirements
+* Updated from global requirements
+* Update the word 'Senin' to 'Senlin'
+* Add back show\_details for node-show
+* Unit test for v1 client
+* The param endpoint in doc string is deprecated
+* Updated from global requirements
+* Fix update\_policy parameter passing error
+* Remove cluster-policy-enable/disable
+* Fix meta var problem in cluster-policy-list
+* Remove node join/leave from senlinclient
+* Remove 'permission' from senlin client
+* Remove 'level', 'cooldown' and 'priority' properties in client
+* Replace deprecated library function os.popen() with subprocess
+* Revise client to support new sorting option
+* Remove references to oslo incubator modules
+* Add test case for common/utils
+* Remove usless models.py module
+
+0.2.1
+-----
+
+* Make sort keys work for node-list and action-list
+* Fix cluster-policy-list command
+* Switch to use SDK calls in client
+* Put 'policy' out of params for do\_cluster\_policy\_attach
+* Rename timestamp fields according to server change
+* Remove 'show-deleted' from command line options
+* Make cluster action calls use SDK interface
+* Fix redundent paginated in senlinclient
+* Fix formatters used for listing actions
+* Fix shell message for action list
+* Make cluster CRUD calls invoke SDK
+* Directly use SDK calls in client (1)
+* Use SDK calls when possible
+* Unit test for /v1/shell.py part3
+* Client support to receivers
+* Make event-list sort\_keys all workable
+* Replace inner methods with lambda function
+* Remove MANIFEST.in
+* Updated from global requirements
+* Don't show show\_deleted column in node-list when not needed
+* Deprecated tox -downloadcache option removed
+* Updated from global requirements
+* Make cluster-policy-update help message clear
+* Add test case for v1/shell.py part2
+* Fix pep8 error about D300
+* Try to show policy after policy created
+* Cluster's timeout is in seconds not minutes
+* Make desired\_capacity default to min\_size if min\_size specified
+* Add py34 to tox.ini
+* Add choices to -F argument
+* Fix profile/policy schema calls
+* Remove ClusterNode model from client side
+* Specify keystoneauth1 exception more
+* Fix nit in the help msg of cluster-node-del
+* Remove py26 support
+* Fix profile update parameters passing error
+* Fix help message error for node\_create
+* Updated from global requirements
+* Fix action api calls
+* Fix some wrong help messages
+* Add short id support to cluster-policy-list
+* Updated from global requirements
+* Fix parse\_exception to handle exception from keystoneauth1
+* Remove Trigger related sources in client side
+
+0.1.8
+-----
+
+* Fix 'action' call on cluster/node objects
+* Make '\_short\_id' method a public method
+
+0.1.7
+-----
+
+* Fix 'endpoint missing' error caused by SDK's change
+
+0.1.6
+-----
+
+* Fix bug introduced by openstacksdk
+* Add 'global\_project' option for cluster-list
+* Add test case for v1/shell module - part 1
+* Updated from global requirements
+* Updated from global requirements
+* Remove spec file profile-update command
+* Fix typo s/beteen/between/
+* Delete .pyc files before running test
+* Sync with oslo-incubator
+
+0.1.5
+-----
+
+* Remove unused methods in client module
+* Revised client interface
+* Adapt resource path to server revision
+* Update gitignore file
+* Updated from global requirements
+* Delete deprecated 'policy' option for webhook create
+* Update .gitreview for new namespace
+* Strips off the quotes when showing nested table
+* Updated from global requirements
+* Fix help message for cluster\_scale\_in/out
+* Updated from global requirements
+
+0.1.4
+-----
+
+* Fix client constructor for ease of use
+* Format list fields in action list
+* Remove default value when attaching a policy
+
+0.1.3
+-----
+
+* Remove unused requirements
+* Update requirement of python-openstacksdk to openstacksdk
+
+0.1.2
+-----
+
+* Fix misc errors in setup.cfg
+
+0.1.1
+-----
+
+* Revise client constructor
+* Fix the sphinx build path in .gitignore file
+* Word error in the help info of cluster-create -m
+* Handle None value in formatter
+* Updated from global requirements
+* Add test case for shell(part2)
+* Fix a bug in do\_action\_show
+* Fix node-update behavior
+* Add resource\_key to event models
+* Shell unit test (1)
+
+0.2
+---
+
+* v0.2 branch
+
+v0.2
+----
+
+* Revise support to profile-create/show
+* Add short Id support to event list
+* Remove 'type' parameter for policy creation
+* Add resource\_key for Action resource
+* Initial support to triggers
+* Updated from global requirements
+* Add deleted\_time to webhook\_list
+* Avoid deleting metadata incorrectly when doing profile\_update
+* Fix crendential type problem in webhook operations in client side
+* Credential option should not be 'required' when creating webhook
+* Fix TypeError when doing cluster-scale-in
+* Sync ProfileAction implementation with latest SDK code
+* Updated from global requirements
+* Add unit test cases for sdk module
+* Unit test for client module
+* Unit test for cliargs module
+* Updated from global requirements
+* Remove private copy of clustering\_service
+* Fix filters param passing
+* Preparation for senlinclient test cases
+* Revise parse\_exception in the client side
+* Updated from global requirements
+* Use correct default domain name in senlinrc
+* Fix cluster-resize operation param checking
+* Updated from global requirements
+* Fix resource listing error
+* Fix profile name update error
+* Use PATCH method to update resources
+* Updated from global requirements
+* Parse exception from SDK
+* Fix list operation based on sdk interface
+* Updated from global requirements
+* Remove thin methods which is not used
+* Updated from global requirements
+* Updated from global requirements
+* Fix arg name for sort-dir
+* Replace 'start\_time' with 'created\_time' for sorting
+* Fix list sorting in command line
+* Fix some cluster-list option bugs
+* Make "--metadata" option "-M" instead of "-d"
+* Make --show-deleted and --sort-dir option names consistent
+* Fix minor error in node-list command
+* Remove profile-type-show command
+* Remove 'permission' from cli output
+* Fix senlinrc to support keystone v2 and v3 on the client side
+* Support keystone v2 and v3
+* Updated from global requirements
+* Disable rollback by default
+* Updated from global requirements
+* Bump oslo.utils version to 1.6.0
+* Handle AttributeError when creating a profile
+* Change max\_size's default value to -1 when creating a cluster
+* Revise webhook-create support in client
+* Sync with global requirements
+* Revise comment format in doc to pass pep8 check
+* Delete some dead code from client model
+* Replace sdk user\_reference module with profile
+* Try please flake8 for imports grouping
+* Resize operation support from client
+* Fixed an error in webhook\_show
+* Updated pot file
+* Rename 'tags' to 'metadata'
+* Add docs generated to version control
+* Sync package version requirements
+* Add min\_size and max\_size properties to Cluster
+* Replace cluster size with new property desired\_capacity
+* Remove '...' from short-id style listing
+* Add --details argument to node-show
+* Add webhook support
+* Add options for tennat\_id/tenant\_name
+* Fix initial gate errors
+* add context support for profile
+* Make update always do a node retrieval first
+* Added support to OS\_TRUST\_ID
+* Added support to list nodes with global tenant
+* Added support to cluster-policy-show operation
+* Make ; parsing optional
+* Revised cluster-policy-list operation
+* Fixed cluster\_update operation error
+* Ignore return value from update()
+* Revised cluster-update operation support
+* Added support to policy-update operation
+* Added support to profile-update operation
+* Allow profile to be updated
+* Fixed profile creation errors
+* Added support to project field in node objects
+* Revised event list/show support
+* Fixed PEP8 error
+* Improved Event object model
+* Removed support to profile/policy type template
+* Fix user name argument parsing
+* Bump six version to 1.9.0
+* Always use block for YAML dumping
+* Added policy schema show support
+* Initial support to profile-type-schema
+* Make scale-out argument count optional
+* Added format\_output method
+* Make node-list ordered by created\_time by default
+* Added support to other useful fields when listing policies
+* Reworkd policy operations
+* Revised cluster model and clusterpolicy model
+* Cluster policy listing support
+* Initial support to policy operations
+* Initial support to node-join/leave operations
+* Added required constraints to some operations
+* Added del\_nodes support
+* Added one TODO item
+* Make profile a required argument
+* Support to cluster-node-add operation
+* Added formatter for ID fields
+* Make node\_create/node\_show work with new API design
+* Revised cluster-create and cluster-show commands
+* Make at least profile-create API work
+* Support profile resource\_key when do profile-show
+* Tolerate empty dict in print\_dict
+* Define UNVERSIONED=None in clustering\_service.py
+* Added short ID support for node-list
+* Enable client module to handle any exception
+* Remove unused imports
+* Make list\_short capable of handling other exceptions
+* Handle requests exception
+* Make deleted\_time show conditional
+* assign alias to client module
+* Remove init\_time from list show
+* Added cluster deletion support
+* Fixed one PEP8 error
+* Fixed cluster list column name error
+* Make error message more clear when username is assigned
+* Fixed object listing logic
+* Simplified exception translation
+* Basic support for cluster show
+* Added dict dump method for clusters
+* Added formatter for list in the context of a dict
+* Added feature to show IDs in short-form
+* Move senlinrc into tools subdir
+* Initial support to cluster create
+* Added trust-based authentication as TODO
+* New item about setting up senlin connection
+* Removed some items that were completed
+* Fixed flake8 errors
+* Major revision to shell main module
+* Revised listing functions to take advantage of exception handling
+* Implement exception handling for client module
+* Override print\_list function for exception catching
+* Added function to create connection via SDK
+* Major revision to client side exception handling
+* Added action-list and action-show support
+* Added node show support
+* Added node list command and fixed related errors
+* Fixed list() method errors
+* Added customization of create() method
+* Added exception support (WIP)
+* Bump oslo.i18n version requirement
+* Added support to bash completion
+* Add support to profile show
+* Add conversion to dict for profile
+* Added capabiity to print nested table
+* Revised profile list implementation
+* Introduce HTTP exception into common
+* Fixed typo in dictionary key
+* Removed non-existant fields from Profile
+* Fixed common client to return object from create
+* Fixed help message for API VERSION option
+* Make v3 the default backend for authentication
+* Added profile\_create and profile\_list operation
+* Remove dict translation for list operation
+* Remove dict translation for create action
+* Clarified help message
+* Added version information
+* Added support to both v2.0 and v3 authentication
+* Revised requirements file
+* Added utility functions to process spec files
+* Added FileFormatError exception
+* Fixed pbr version string error
+* Remove old client module
+* Added keystone V3 support
+* Fix oslo.i18n namespace error
+* Add heatclient to requirements.txt
+* Revised error message for project\_id validation
+* Added build info alike dictionary retrieval support
+* Senlin RC file initial version
+* Initial version of V1 client
+* New version of V1 shell
+* Fix error in service name imported
+* Top priority task: create os.senlin.stack profile
+* Reimplemented client shell
+* Added Versions to the client-side models
+* Initial version of command line argument parser
+* Added new item about checking identity arguments
+* Fix oslo namespace errors
+* Revised sdk interface
+* Revised common client to use session
+* Added TODO item about support to HTTPS
+* Revised TODO list
+* Remove http.py since we don't use this client
+* Modify i18n import
+* Clustering service module for openstacksdk
+* Fix import errors in cliutils
+* Remove deprecating apiclient module
+* Rename old client.py to old\_client.py
+* New object models for interacting with server
+* Remove old-style object models
+* Added sort\_keys and sort\_dirs support
+* Fixed error in original reference
+* New clusters file, replacing old ones
+* Remove clusters file, to be replaced
+* Placeholder for openstacksdk interface
+* Add openstacksdk to the dependency list
+* Revised TODO list
+* Bump oslo.utils to 1.2.0
+* Added todos for apiclient migration
+* Removed httpretty as suggested in other projects
+* New item for unit tests
+* Remove node\_join and node\_leave operations
+* Replace enable/disable with policy\_update
+* Remove list\_nodes method from cluster
+* Removed enable/disable cluster policy operations
+* Added supported\_formats
+* Move exc module to common subdir
+* Added more operations to clusters
+* Added several TODO items
+* More operations added
+* Remove profile method, not needed now
+* Move exception file
+* Fix typo error
+* Initial version
+* Initial version
+* Initial version
+* Initial version
+* Initial version
+* Fixed left error
+* Initial version
+* Initial version
+* Initial version
+* Initial version
+* Initial version
+* Initial version
+* Initial commit
diff -pruN 2.2.1-2/debian/changelog 2.3.0-0ubuntu1/debian/changelog
--- 2.2.1-2/debian/changelog	2021-08-16 09:38:07.000000000 +0000
+++ 2.3.0-0ubuntu1/debian/changelog	2021-09-07 19:38:58.000000000 +0000
@@ -1,126 +1,128 @@
-python-senlinclient (2.2.1-2) unstable; urgency=medium
+python-senlinclient (2.3.0-0ubuntu1) impish; urgency=medium
 
-  * d/control: Add me to uploaders field
-  * d/copyright: Add me to copyright file
-  * Upload to unstable
+  * New upstream release for OpenStack Xena.
+  * d/control: Align (Build-)Depends with upstream.
 
- -- Michal Arbet <michal.arbet@ultimum.io>  Mon, 16 Aug 2021 11:38:07 +0200
+ -- Corey Bryant <corey.bryant@canonical.com>  Tue, 07 Sep 2021 15:38:58 -0400
 
-python-senlinclient (2.2.1-1) experimental; urgency=medium
+python-senlinclient (2.2.1-0ubuntu1) hirsute; urgency=medium
 
-  * New upstream release.
-  * Removed build-depends version of openstack-pkg-tools in advance of
-    Bullseye release.
-  * Bump standards-version to 4.5.1.
-
- -- Thomas Goirand <zigo@debian.org>  Thu, 11 Mar 2021 16:21:03 +0100
+  * New upstream release for OpenStack Wallaby.
 
-python-senlinclient (2.1.1-2) unstable; urgency=medium
+ -- Corey Bryant <corey.bryant@canonical.com>  Wed, 17 Mar 2021 11:18:51 -0400
 
-  * Uploading to unstable.
-  * Fixed debian/watch.
-  * Add a debian/salsa-ci.yml.
+python-senlinclient (2.2.0-0ubuntu1) hirsute; urgency=medium
 
- -- Thomas Goirand <zigo@debian.org>  Fri, 16 Oct 2020 17:20:09 +0200
+  * d/control: Update VCS paths for move to lp:~ubuntu-openstack-dev.
+  * New upstream release for OpenStack Wallaby.
 
-python-senlinclient (2.1.1-1) experimental; urgency=medium
-
-  * New upstream release.
-  * Fixed (build-)depends for this release.
-  * Switch to debhelper-compat 11.
+ -- Chris MacNaughton <chris.macnaughton@ubuntu.com>  Mon, 07 Dec 2020 12:00:33 +0000
 
- -- Thomas Goirand <zigo@debian.org>  Thu, 17 Sep 2020 08:40:19 +0200
+python-senlinclient (2.1.1-0ubuntu1) groovy; urgency=medium
 
-python-senlinclient (2.1.0-1) experimental; urgency=medium
+  * New upstream release for OpenStack Victoria.
+  * d/control: Align (Build-)Depends with upstream.
 
-  * New upstream release.
-  * Fixed (build-)depends for this release.
+ -- Corey Bryant <corey.bryant@canonical.com>  Fri, 18 Sep 2020 12:37:43 -0400
 
- -- Thomas Goirand <zigo@debian.org>  Thu, 10 Sep 2020 12:20:10 +0200
+python-senlinclient (2.1.0-0ubuntu1) groovy; urgency=medium
 
-python-senlinclient (2.0.1-2) unstable; urgency=medium
+  * New upstream release for OpenStack Victoria.
+  * d/control: Align (Build-)Depends with upstream.
 
-  * Uploading to unstable.
+ -- Chris MacNaughton <chris.macnaughton@canonical.com>  Wed, 29 Jul 2020 13:47:54 +0000
 
- -- Thomas Goirand <zigo@debian.org>  Fri, 08 May 2020 23:38:12 +0200
+python-senlinclient (2.0.1-0ubuntu1) focal; urgency=medium
 
-python-senlinclient (2.0.1-1) experimental; urgency=medium
+  * New upstream release for OpenStack Ussuri.
+  * d/control: Drop remaining py2 BDs.
+  * d/rules: Switch to pybuild.
 
-  * New upstream release.
+ -- Corey Bryant <corey.bryant@canonical.com>  Thu, 09 Apr 2020 15:33:02 -0400
 
- -- Thomas Goirand <zigo@debian.org>  Wed, 08 Apr 2020 16:59:28 +0200
+python-senlinclient (2.0.0-0ubuntu1) focal; urgency=medium
 
-python-senlinclient (1.11.0-2) unstable; urgency=medium
+  * New upstream release for OpenStack Ussuri.
 
-  [ Ondřej Nový ]
-  * Bump Standards-Version to 4.4.1.
+ -- Corey Bryant <corey.bryant@canonical.com>  Wed, 11 Mar 2020 16:35:46 -0400
 
-  [ Thomas Goirand ]
-  * Uploading to unstable.
+python-senlinclient (1.11.0-0ubuntu1) eoan; urgency=medium
 
- -- Thomas Goirand <zigo@debian.org>  Mon, 21 Oct 2019 01:49:07 +0200
+  * New upstream release for OpenStack Train.
+  * d/control: Align (Build-)Depends with upstream.
 
-python-senlinclient (1.11.0-1) experimental; urgency=medium
+ -- Corey Bryant <corey.bryant@canonical.com>  Mon, 09 Sep 2019 15:06:22 -0400
 
-  [ Ondřej Nový ]
-  * Use debhelper-compat instead of debian/compat.
-  * Bump Standards-Version to 4.4.0.
+python-senlinclient (1.9.0-0ubuntu2) eoan; urgency=medium
 
-  [ Thomas Goirand ]
-  * New upstream release.
+  * d/control: Drop BDI's on python-* packages.
+  * d/control: Drop python-senlinclient binary package.
+  * d/*.postinst,prerm,postrm: Drop, alternatives no longer needed.
+  * d/rules: Tweak to stop build and install of Python 2 parts.
 
- -- Thomas Goirand <zigo@debian.org>  Mon, 23 Sep 2019 17:37:35 +0200
+ -- Sahid Orentino Ferdjaoui <sahid.ferdjaoui@canonical.com>  Thu, 11 Jul 2019 14:34:19 +0200
 
-python-senlinclient (1.10.1-2) unstable; urgency=medium
+python-senlinclient (1.9.0-0ubuntu1) disco; urgency=medium
 
-  * Uploading to unstable.
+  * New upstream release for OpenStack Stein.
+  * d/control: Align (Build-)Depends with upstream.
 
- -- Thomas Goirand <zigo@debian.org>  Wed, 17 Jul 2019 14:31:55 +0200
+ -- Corey Bryant <corey.bryant@canonical.com>  Wed, 14 Nov 2018 14:47:07 -0500
 
-python-senlinclient (1.10.1-1) experimental; urgency=medium
+python-senlinclient (1.7.0-2ubuntu1) cosmic; urgency=low
 
-  * New upstream release.
-  * Removed Python 2 support.
+  * Merge from Debian unstable.  Remaining changes:
+    - d/control: Bump debhelper compat to 10.
+    - d/control: Update Standards-Version to 4.1.2.
+    - d/control: Enable autopkgtest-pkg-python testsuite.
+    - d/gbp.conf: Retain for gbp and pristine-tar config.
+    - d/watch: Get tarball from pypi.debian.net.
 
- -- Thomas Goirand <zigo@debian.org>  Sat, 23 Mar 2019 22:45:58 +0100
+ -- Corey Bryant <corey.bryant@canonical.com>  Fri, 15 Jun 2018 10:02:46 -0400
 
-python-senlinclient (1.8.0-2) unstable; urgency=medium
+python-senlinclient (1.7.0-2) unstable; urgency=medium
 
   * Uploading to unstable.
 
- -- Thomas Goirand <zigo@debian.org>  Tue, 04 Sep 2018 22:43:38 +0200
+ -- Thomas Goirand <zigo@debian.org>  Sun, 25 Feb 2018 21:56:07 +0000
 
-python-senlinclient (1.8.0-1) experimental; urgency=medium
+python-senlinclient (1.7.0-1) experimental; urgency=medium
 
   [ Ondřej Nový ]
-  * d/control: Use team+openstack@tracker.debian.org as maintainer
+  * d/control: Set Vcs-* to salsa.debian.org
+  * Running wrap-and-sort -bast
 
   [ Thomas Goirand ]
   * New upstream release.
-  * Bumped Standards-Version: to 4.2.0 (no change).
-  * Building doc with Python 3.
   * Fixed (build-)depends for this release.
+  * Removed .postinst, since /usr/bin/senlin doesn't exist anymore.
 
- -- Thomas Goirand <zigo@debian.org>  Wed, 22 Aug 2018 13:45:22 +0200
+ -- Thomas Goirand <zigo@debian.org>  Tue, 13 Feb 2018 21:49:07 +0000
 
-python-senlinclient (1.7.0-2) unstable; urgency=medium
+python-senlinclient (1.7.0-0ubuntu2) bionic; urgency=medium
 
-  * Uploading to unstable.
+  * d/python{3}-senlin.p*: Drop management of senlin binary as its
+    no longer shipped (use osc instead).
 
- -- Thomas Goirand <zigo@debian.org>  Sun, 25 Feb 2018 21:56:07 +0000
+ -- James Page <james.page@ubuntu.com>  Wed, 14 Feb 2018 12:14:23 +0000
 
-python-senlinclient (1.7.0-1) experimental; urgency=medium
+python-senlinclient (1.7.0-0ubuntu1) bionic; urgency=medium
 
-  [ Ondřej Nový ]
-  * d/control: Set Vcs-* to salsa.debian.org
-  * Running wrap-and-sort -bast
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Tue, 13 Feb 2018 08:41:45 -0500
+
+python-senlinclient (1.5.0-0ubuntu1) bionic; urgency=medium
 
-  [ Thomas Goirand ]
   * New upstream release.
-  * Fixed (build-)depends for this release.
-  * Removed .postinst, since /usr/bin/senlin doesn't exist anymore.
+  * d/*: wrap-and-sort -bast.
+  * d/control: Align (Build-)Depends with upstream.
+  * d/control: Update Standards-Version to 4.1.2.
+  * d/control: Bump debhelper compat to 10.
+  * d/p/drop-openstackdoctheme.patch: Dropped. No longer needed.
 
- -- Thomas Goirand <zigo@debian.org>  Tue, 13 Feb 2018 21:49:07 +0000
+ -- Corey Bryant <corey.bryant@canonical.com>  Thu, 25 Jan 2018 08:38:40 -0500
 
 python-senlinclient (1.4.0-2) unstable; urgency=medium
 
@@ -154,6 +156,71 @@ python-senlinclient (1.4.0-1) experiment
 
  -- Thomas Goirand <zigo@debian.org>  Wed, 04 Oct 2017 11:55:16 +0200
 
+python-senlinclient (1.4.0-0ubuntu1) artful; urgency=medium
+
+  * d/watch: Get tarball from tarballs.openstack.org.
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+  * d/p/drop-openstackdoctheme.patch: Temporarily drop openstackdocstheme
+    sphinx extension until sphinx>=1.6.2 is available.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Wed, 16 Aug 2017 10:03:49 -0400
+
+python-senlinclient (1.3.0-0ubuntu1) artful; urgency=medium
+
+  * d/watch: Use pypi.debian.net.
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+
+ -- James Page <james.page@ubuntu.com>  Fri, 02 Jun 2017 09:27:03 +0100
+
+python-senlinclient (1.2.0-0ubuntu1) zesty; urgency=medium
+
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+
+ -- Chuck Short <zulcss@ubuntu.com>  Thu, 26 Jan 2017 09:42:05 -0500
+
+python-senlinclient (1.1.0-0ubuntu1) zesty; urgency=medium
+
+  * d/gbp.conf: Update gbp configuration file.
+  * d/control: Update Vcs-* links and maintainers.
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Fri, 09 Dec 2016 09:08:11 -0500
+
+python-senlinclient (1.0.0-0ubuntu1) yakkety; urgency=medium
+
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Fri, 02 Sep 2016 12:48:56 -0400
+
+python-senlinclient (0.5.0-1) experimental; urgency=medium
+
+  * New upstream release.
+  * Fixed (build-)depends for this release.
+  * Using pkgos-dh_auto_{test,install} from openstack-pkg-tools >= 52~.
+
+ -- Thomas Goirand <zigo@debian.org>  Wed, 13 Jul 2016 10:46:38 +0200
+
+python-senlinclient (0.4.1-1) experimental; urgency=medium
+
+  [ Ondřej Nový ]
+  * Standards-Version is 3.9.8 now (no change)
+  * d/rules: Removed UPSTREAM_GIT with default value
+  * d/copyright: Changed source URL to https protocol
+
+  [ Corey Bryant ]
+  * New upstream release.
+  * d/gbp.conf: Update branch for Newton.
+
+  [ Thomas Goirand ]
+  * Added Corey Bryant <corey.bryant@canonical.com> as Uploaders:.
+
+ -- Thomas Goirand <zigo@debian.org>  Mon, 06 Jun 2016 10:30:09 +0000
+
 python-senlinclient (0.4.0-2) unstable; urgency=medium
 
   * Uploading to unstable.
@@ -200,3 +267,4 @@ python-senlinclient (0.1.8-1) unstable;
   * Initial release. (Closes: #807405)
 
  -- Thomas Goirand <zigo@debian.org>  Tue, 08 Dec 2015 14:28:25 +0100
+
diff -pruN 2.2.1-2/debian/compat 2.3.0-0ubuntu1/debian/compat
--- 2.2.1-2/debian/compat	1970-01-01 00:00:00.000000000 +0000
+++ 2.3.0-0ubuntu1/debian/compat	2021-09-07 19:38:58.000000000 +0000
@@ -0,0 +1 @@
+10
diff -pruN 2.2.1-2/debian/control 2.3.0-0ubuntu1/debian/control
--- 2.2.1-2/debian/control	2021-08-16 09:37:05.000000000 +0000
+++ 2.3.0-0ubuntu1/debian/control	2021-09-07 19:38:58.000000000 +0000
@@ -1,48 +1,56 @@
 Source: python-senlinclient
 Section: python
 Priority: optional
-Maintainer: Debian OpenStack <team+openstack@tracker.debian.org>
+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+XSBC-Original-Maintainer: Debian OpenStack <openstack-devel@lists.alioth.debian.org>
 Uploaders:
  Thomas Goirand <zigo@debian.org>,
  David Della Vecchia <ddv@canonical.com>,
- Michal Arbet <michal.arbet@ultimum.io>,
 Build-Depends:
- debhelper-compat (= 11),
+ debhelper (>= 10),
  dh-python,
  openstack-pkg-tools,
  python3-all,
- python3-pbr,
+ python3-pbr (>= 2.0.0),
  python3-setuptools,
- python3-sphinx,
+ python3-sphinx (>= 2.0.0),
 Build-Depends-Indep:
- python3-coverage,
- python3-fixtures,
+ python3-babel (>= 2.3.4),
+ python3-bandit (>= 1.1.0),
+ python3-coverage (>= 4.0),
+ python3-fixtures (>= 3.0.0),
+ python3-git,
  python3-hacking,
- python3-heatclient,
- python3-keystoneauth1,
- python3-mox3,
- python3-openstackclient,
- python3-openstackdocstheme <!nodoc>,
- python3-openstacksdk,
- python3-osc-lib,
- python3-oslo.i18n,
- python3-oslo.serialization,
- python3-oslo.utils,
- python3-oslotest,
- python3-prettytable,
- python3-requests,
- python3-requests-mock,
- python3-stestr,
+ python3-heatclient (>= 1.10.0),
+ python3-keystoneauth1 (>= 3.11.0),
+ python3-mock (>= 2.0.0),
+ python3-mox3 (>= 0.7.0),
+ python3-openstackclient (>= 3.12.0),
+ python3-openstackdocstheme (>= 2.2.1),
+ python3-openstacksdk (>= 0.24.0),
+ python3-osc-lib (>= 1.11.0),
+ python3-oslo.i18n (>= 3.15.3),
+ python3-oslo.serialization (>= 2.18.0),
+ python3-oslo.utils (>= 3.33.0),
+ python3-oslotest (>= 1:3.2.0),
+ python3-pkg-resources (>= 21.0.0),
+ python3-prettytable (>= 0.7.2),
+ python3-reno,
+ python3-requests (>= 2.14.2),
+ python3-requests-mock (>= 1.2.0),
+ python3-six (>= 1.10.0),
+ python3-stestr (>= 2.0.0),
  python3-subunit,
- python3-tempest,
- python3-testscenarios,
- python3-testtools,
- python3-yaml,
- subunit,
-Standards-Version: 4.5.1
-Vcs-Browser: https://salsa.debian.org/openstack-team/clients/python-senlinclient
-Vcs-Git: https://salsa.debian.org/openstack-team/clients/python-senlinclient.git
+ python3-tempest (>= 1:17.1.0),
+ python3-testrepository,
+ python3-testscenarios (>= 0.4),
+ python3-testtools (>= 2.2.0),
+ python3-yaml (>= 5.3.1),
+Standards-Version: 4.1.2
+Vcs-Browser: https://git.launchpad.net/~ubuntu-openstack-dev/ubuntu/+source/python-senlinclient
+Vcs-Git: https://git.launchpad.net/~ubuntu-openstack-dev/ubuntu/+source/python-senlinclient
 Homepage: https://github.com/openstack/python-senlinclient
+Testsuite: autopkgtest-pkg-python
 
 Package: python-senlinclient-doc
 Build-Profiles: <!nodoc>
@@ -61,17 +69,19 @@ Description: OpenStack Clustering API Cl
 Package: python3-senlinclient
 Architecture: all
 Depends:
- python3-heatclient,
- python3-keystoneauth1,
- python3-openstacksdk,
- python3-osc-lib,
- python3-oslo.i18n,
- python3-oslo.serialization,
- python3-oslo.utils,
- python3-pbr,
- python3-prettytable,
- python3-requests,
- python3-yaml,
+ python3-babel (>= 2.3.4),
+ python3-heatclient (>= 1.10.0),
+ python3-keystoneauth1 (>= 3.11.0),
+ python3-openstacksdk (>= 0.24.0),
+ python3-osc-lib (>= 1.11.0),
+ python3-oslo.i18n (>= 3.15.3),
+ python3-oslo.serialization (>= 2.18.0),
+ python3-oslo.utils (>= 3.33.0),
+ python3-pbr (>= 2.0.0),
+ python3-prettytable (>= 0.7.2),
+ python3-requests (>= 2.14.2),
+ python3-six (>= 1.10.0),
+ python3-yaml (>= 5.3.1),
  ${misc:Depends},
  ${python3:Depends},
 Suggests:
diff -pruN 2.2.1-2/debian/copyright 2.3.0-0ubuntu1/debian/copyright
--- 2.2.1-2/debian/copyright	2021-08-16 09:38:03.000000000 +0000
+++ 2.3.0-0ubuntu1/debian/copyright	2021-09-07 19:38:58.000000000 +0000
@@ -8,7 +8,6 @@ License: Apache-2
 
 Files: debian/*
 Copyright: (c) 2014-2016, Thomas Goirand <zigo@debian.org>
-           (c) 2021, Michal Arbet <michal.arbet@ultimum.io>
 License: Apache-2
 
 License: Apache-2
diff -pruN 2.2.1-2/debian/gbp.conf 2.3.0-0ubuntu1/debian/gbp.conf
--- 2.2.1-2/debian/gbp.conf	1970-01-01 00:00:00.000000000 +0000
+++ 2.3.0-0ubuntu1/debian/gbp.conf	2021-09-07 19:38:58.000000000 +0000
@@ -0,0 +1,7 @@
+[DEFAULT]
+debian-branch = master
+upstream-tag = %(version)s
+pristine-tar = True
+
+[buildpackage]
+export-dir = ../build-area
diff -pruN 2.2.1-2/debian/python3-senlinclient.postrm 2.3.0-0ubuntu1/debian/python3-senlinclient.postrm
--- 2.2.1-2/debian/python3-senlinclient.postrm	2021-08-16 09:36:35.000000000 +0000
+++ 2.3.0-0ubuntu1/debian/python3-senlinclient.postrm	1970-01-01 00:00:00.000000000 +0000
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-set -e
-
-if [ "$1" = "remove" ] || [ "$1" = "disappear" ] ; then
-	update-alternatives --remove senlin /usr/bin/python3-senlin
-fi
-
-#DEBHELPER#
-
-exit 0
diff -pruN 2.2.1-2/debian/python3-senlinclient.prerm 2.3.0-0ubuntu1/debian/python3-senlinclient.prerm
--- 2.2.1-2/debian/python3-senlinclient.prerm	2021-08-16 09:36:35.000000000 +0000
+++ 2.3.0-0ubuntu1/debian/python3-senlinclient.prerm	1970-01-01 00:00:00.000000000 +0000
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-set -e
-
-if [ "$1" = "remove" ] ; then
-	update-alternatives --remove senlin /usr/bin/python3-senlin
-fi
-
-#DEBHELPER#
-
-exit 0
diff -pruN 2.2.1-2/debian/rules 2.3.0-0ubuntu1/debian/rules
--- 2.2.1-2/debian/rules	2021-08-16 09:36:35.000000000 +0000
+++ 2.3.0-0ubuntu1/debian/rules	2021-09-07 19:38:58.000000000 +0000
@@ -1,29 +1,39 @@
 #!/usr/bin/make -f
 
+export PYBUILD_NAME=python-senlinclient
+
 include /usr/share/openstack-pkg-tools/pkgos.make
 
 %:
-	dh $@ --buildsystem=python_distutils --with python3,sphinxdoc
-
-override_dh_auto_clean:
-	rm -rf build
-
-override_dh_auto_build:
-	echo "Do nothing..."
+	dh $@ --buildsystem=pybuild --with python3,sphinxdoc
 
 override_dh_auto_install:
 	pkgos-dh_auto_install --no-py2
 
+override_dh_python3:
+	dh_python3 --shebang=/usr/bin/python3
+
 override_dh_auto_test:
 ifeq (,$(findstring nocheck, $(DEB_BUILD_OPTIONS)))
 	pkgos-dh_auto_test --no-py2 'senlinclient\.tests\.unit\.(?!(.*test_shell.ShellTest.test_do_add_profiler_args.*))'
 endif
 
 override_dh_sphinxdoc:
-ifeq (,$(findstring nodoc, $(DEB_BUILD_OPTIONS)))
-	PYTHONPATH=. python3 -m sphinx -b html doc/source debian/python-senlinclient-doc/usr/share/doc/python-senlinclient-doc/html
-	dh_sphinxdoc -O--buildsystem=python_distutils
+ifeq (,$(findstring nodocs, $(DEB_BUILD_OPTIONS)))
+	sphinx-build -b html doc/source debian/python-senlinclient-doc/usr/share/doc/python-senlinclient-doc/html
+	dh_sphinxdoc -O--buildsystem=pybuild
 endif
 
-override_dh_python3:
-	dh_python3 --shebang=/usr/bin/python3
+override_dh_clean:
+	dh_clean -O--buildsystem=pybuild
+	rm -rf build
+
+# Commands not to run
+override_dh_installcatalogs:
+override_dh_installemacsen override_dh_installifupdown:
+override_dh_installinfo override_dh_installmenu override_dh_installmime:
+override_dh_installmodules override_dh_installlogcheck:
+override_dh_installpam override_dh_installppp override_dh_installudev override_dh_installwm:
+override_dh_installxfonts override_dh_gconf override_dh_icons override_dh_perl override_dh_usrlocal:
+override_dh_installcron override_dh_installdebconf:
+override_dh_installlogrotate override_dh_installgsettings:
diff -pruN 2.2.1-2/debian/salsa-ci.yml 2.3.0-0ubuntu1/debian/salsa-ci.yml
--- 2.2.1-2/debian/salsa-ci.yml	2021-08-16 09:36:35.000000000 +0000
+++ 2.3.0-0ubuntu1/debian/salsa-ci.yml	1970-01-01 00:00:00.000000000 +0000
@@ -1,3 +0,0 @@
-include:
-  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
-  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
diff -pruN 2.2.1-2/debian/watch 2.3.0-0ubuntu1/debian/watch
--- 2.2.1-2/debian/watch	2021-08-16 09:36:35.000000000 +0000
+++ 2.3.0-0ubuntu1/debian/watch	2021-09-07 19:38:58.000000000 +0000
@@ -1,3 +1,3 @@
 version=3
-opts="uversionmangle=s/\.0rc/~rc/;s/\.0b1/~b1/;s/\.0b2/~b2/;s/\.0b3/~b3/" \
-https://github.com/openstack/python-senlinclient/tags .*/(\d[brc\d\.]+)\.tar\.gz
+opts="uversionmangle=s/\.(b|rc)/~$1/" \
+    http://tarballs.openstack.org/python-senlinclient/ python-senlinclient-(\d.*)\.tar\.gz
diff -pruN 2.2.1-2/doc/source/contributor/index.rst 2.3.0-0ubuntu1/doc/source/contributor/index.rst
--- 2.2.1-2/doc/source/contributor/index.rst	2021-01-03 03:04:45.000000000 +0000
+++ 2.3.0-0ubuntu1/doc/source/contributor/index.rst	2021-08-02 09:39:50.000000000 +0000
@@ -28,7 +28,7 @@ Running the tests
 -----------------
 There are a number of ways to run unit tests currently, and there's a
 combination of frameworks used depending on what commands you use.  The
-preferred method is to use tox, which calls ostestr via the tox.ini file.
+preferred method is to use tox, which calls stestr via the tox.ini file.
 To run all tests simply run::
 
     tox
@@ -52,4 +52,4 @@ Or all tests in the test_node.py file::
     tox -epy27 senlinclient.tests.unit.v1.test_node
 
 For more information on these options and how to run tests, please see the
-`ostestr documentation <https://docs.openstack.org/os-testr/latest/>`_.
+`stestr documentation <https://stestr.readthedocs.io/en/latest/index.html>`_.
diff -pruN 2.2.1-2/.gitignore 2.3.0-0ubuntu1/.gitignore
--- 2.2.1-2/.gitignore	2021-01-03 03:04:45.000000000 +0000
+++ 2.3.0-0ubuntu1/.gitignore	1970-01-01 00:00:00.000000000 +0000
@@ -1,67 +0,0 @@
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-env/
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-*.egg-info/
-.installed.cfg
-*.egg
-*.eggs
-
-# PyInstaller
-#  Usually these files are written by a python script from a template
-#  before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-cover/
-htmlcov/
-.tox/
-.coverage
-.coverage.*
-.idea
-.cache
-.stestr/
-coverage.xml
-
-# Translations
-*.mo
-
-# Django stuff:
-*.log
-
-# Sphinx documentation
-doc/build/
-
-# PyBuilder
-target/
-
-# Files created by releasenotes build
-releasenotes/build
-
-# pbr generated files
-AUTHORS
-ChangeLog
-
-# swap file
-*.swp
diff -pruN 2.2.1-2/.gitreview 2.3.0-0ubuntu1/.gitreview
--- 2.2.1-2/.gitreview	2021-01-03 03:04:45.000000000 +0000
+++ 2.3.0-0ubuntu1/.gitreview	1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-[gerrit]
-host=review.opendev.org
-port=29418
-project=openstack/python-senlinclient.git
diff -pruN 2.2.1-2/lower-constraints.txt 2.3.0-0ubuntu1/lower-constraints.txt
--- 2.2.1-2/lower-constraints.txt	2021-01-03 03:04:45.000000000 +0000
+++ 2.3.0-0ubuntu1/lower-constraints.txt	2021-08-02 09:39:50.000000000 +0000
@@ -15,9 +15,7 @@ dulwich==0.15.0
 extras==1.0.0
 fasteners==0.7.0
 fixtures==3.0.0
-flake8==2.5.5
 future==0.16.0
-hacking==0.12.0
 idna==2.6
 imagesize==0.7.1
 iso8601==0.1.11
@@ -26,10 +24,9 @@ jmespath==0.9.0
 jsonpatch==1.16
 jsonpointer==1.13
 jsonschema==2.6.0
-keystoneauth1==3.4.0
+keystoneauth1==3.11.0
 linecache2==1.0.0
 MarkupSafe==1.0
-mccabe==0.2.1
 monotonic==0.6
 mox3==0.20.0
 msgpack-python==0.4.0
@@ -39,7 +36,6 @@ netifaces==0.10.4
 openstacksdk==0.24.0
 os-client-config==1.28.0
 os-service-types==1.2.0
-os-testr==1.0.0
 osc-lib==1.11.0
 oslo.concurrency==3.25.0
 oslo.config==5.2.0
@@ -51,13 +47,10 @@ oslo.utils==3.33.0
 oslotest==3.2.0
 paramiko==2.0.0
 pbr==2.0.0
-pep8==1.5.7
 positional==1.2.1
 prettytable==0.7.2
 pyasn1==0.1.8
 pycparser==2.18
-pyflakes==0.8.1
-Pygments==2.2.0
 pyinotify==0.9.6
 pyOpenSSL==17.1.0
 pyparsing==2.1.0
@@ -72,8 +65,8 @@ python-novaclient==9.1.0
 python-openstackclient==3.12.0
 python-subunit==1.0.0
 python-swiftclient==3.2.0
-pytz==2013.6
-PyYAML==3.13
+pytz==2015.7
+PyYAML==5.3.1
 requests==2.14.2
 requests-mock==1.2.0
 requestsexceptions==1.2.0
diff -pruN 2.2.1-2/PKG-INFO 2.3.0-0ubuntu1/PKG-INFO
--- 2.2.1-2/PKG-INFO	1970-01-01 00:00:00.000000000 +0000
+++ 2.3.0-0ubuntu1/PKG-INFO	2021-08-02 09:40:23.138812500 +0000
@@ -0,0 +1,42 @@
+Metadata-Version: 1.2
+Name: python-senlinclient
+Version: 2.3.0
+Summary: OpenStack Clustering API Client Library
+Home-page: https://docs.openstack.org/python-senlinclient/latest/
+Author: OpenStack
+Author-email: openstack-discuss@lists.openstack.org
+License: UNKNOWN
+Description: ========================
+        Team and repository tags
+        ========================
+        
+        .. image:: https://governance.openstack.org/tc/badges/python-senlinclient.svg
+            :target: https://governance.openstack.org/tc/reference/tags/index.html
+        
+        .. Change things from this point on
+        
+        OpenStackClient Plugin for Senlin Clustering Service
+        ====================================================
+        
+        This is a client library for Senlin built on the Senlin clustering API. It
+        provides a plugin for the openstackclient command-line tool.
+        
+        Development takes place via the usual OpenStack processes as outlined in the
+        `developer guide <https://docs.openstack.org/infra/manual/developers.html>`_.
+        The master repository is in `Git <https://opendev.org/openstack/python-senlinclient>`_.
+        
+        
+Platform: UNKNOWN
+Classifier: Environment :: OpenStack
+Classifier: Intended Audience :: Information Technology
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Requires-Python: >=3.6
diff -pruN 2.2.1-2/python_senlinclient.egg-info/dependency_links.txt 2.3.0-0ubuntu1/python_senlinclient.egg-info/dependency_links.txt
--- 2.2.1-2/python_senlinclient.egg-info/dependency_links.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.3.0-0ubuntu1/python_senlinclient.egg-info/dependency_links.txt	2021-08-02 09:40:22.000000000 +0000
@@ -0,0 +1 @@
+
diff -pruN 2.2.1-2/python_senlinclient.egg-info/entry_points.txt 2.3.0-0ubuntu1/python_senlinclient.egg-info/entry_points.txt
--- 2.2.1-2/python_senlinclient.egg-info/entry_points.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.3.0-0ubuntu1/python_senlinclient.egg-info/entry_points.txt	2021-08-02 09:40:22.000000000 +0000
@@ -0,0 +1,65 @@
+[openstack.cli.extension]
+clustering = senlinclient.plugin
+
+[openstack.clustering.v1]
+cluster_action_list = senlinclient.v1.action:ListAction
+cluster_action_show = senlinclient.v1.action:ShowAction
+cluster_action_update = senlinclient.v1.action:UpdateAction
+cluster_build_info = senlinclient.v1.build_info:BuildInfo
+cluster_check = senlinclient.v1.cluster:CheckCluster
+cluster_collect = senlinclient.v1.cluster:ClusterCollect
+cluster_create = senlinclient.v1.cluster:CreateCluster
+cluster_delete = senlinclient.v1.cluster:DeleteCluster
+cluster_event_list = senlinclient.v1.event:ListEvent
+cluster_event_show = senlinclient.v1.event:ShowEvent
+cluster_expand = senlinclient.v1.cluster:ScaleOutCluster
+cluster_list = senlinclient.v1.cluster:ListCluster
+cluster_members_add = senlinclient.v1.cluster:ClusterNodeAdd
+cluster_members_del = senlinclient.v1.cluster:ClusterNodeDel
+cluster_members_list = senlinclient.v1.cluster:ClusterNodeList
+cluster_members_replace = senlinclient.v1.cluster:ClusterNodeReplace
+cluster_node_adopt = senlinclient.v1.node:AdoptNode
+cluster_node_check = senlinclient.v1.node:CheckNode
+cluster_node_create = senlinclient.v1.node:CreateNode
+cluster_node_delete = senlinclient.v1.node:DeleteNode
+cluster_node_list = senlinclient.v1.node:ListNode
+cluster_node_op = senlinclient.v1.node:NodeOp
+cluster_node_recover = senlinclient.v1.node:RecoverNode
+cluster_node_show = senlinclient.v1.node:ShowNode
+cluster_node_update = senlinclient.v1.node:UpdateNode
+cluster_op = senlinclient.v1.cluster:ClusterOp
+cluster_policy_attach = senlinclient.v1.cluster:ClusterPolicyAttach
+cluster_policy_binding_list = senlinclient.v1.cluster_policy:ClusterPolicyList
+cluster_policy_binding_show = senlinclient.v1.cluster_policy:ClusterPolicyShow
+cluster_policy_binding_update = senlinclient.v1.cluster_policy:ClusterPolicyUpdate
+cluster_policy_create = senlinclient.v1.policy:CreatePolicy
+cluster_policy_delete = senlinclient.v1.policy:DeletePolicy
+cluster_policy_detach = senlinclient.v1.cluster:ClusterPolicyDetach
+cluster_policy_list = senlinclient.v1.policy:ListPolicy
+cluster_policy_show = senlinclient.v1.policy:ShowPolicy
+cluster_policy_type_list = senlinclient.v1.policy_type:PolicyTypeList
+cluster_policy_type_show = senlinclient.v1.policy_type:PolicyTypeShow
+cluster_policy_update = senlinclient.v1.policy:UpdatePolicy
+cluster_policy_validate = senlinclient.v1.policy:ValidatePolicy
+cluster_profile_create = senlinclient.v1.profile:CreateProfile
+cluster_profile_delete = senlinclient.v1.profile:DeleteProfile
+cluster_profile_list = senlinclient.v1.profile:ListProfile
+cluster_profile_show = senlinclient.v1.profile:ShowProfile
+cluster_profile_type_list = senlinclient.v1.profile_type:ProfileTypeList
+cluster_profile_type_ops = senlinclient.v1.profile_type:ProfileTypeOperations
+cluster_profile_type_show = senlinclient.v1.profile_type:ProfileTypeShow
+cluster_profile_update = senlinclient.v1.profile:UpdateProfile
+cluster_profile_validate = senlinclient.v1.profile:ValidateProfile
+cluster_receiver_create = senlinclient.v1.receiver:CreateReceiver
+cluster_receiver_delete = senlinclient.v1.receiver:DeleteReceiver
+cluster_receiver_list = senlinclient.v1.receiver:ListReceiver
+cluster_receiver_show = senlinclient.v1.receiver:ShowReceiver
+cluster_receiver_update = senlinclient.v1.receiver:UpdateReceiver
+cluster_recover = senlinclient.v1.cluster:RecoverCluster
+cluster_resize = senlinclient.v1.cluster:ResizeCluster
+cluster_run = senlinclient.v1.cluster:ClusterRun
+cluster_service_list = senlinclient.v1.service:ListService
+cluster_show = senlinclient.v1.cluster:ShowCluster
+cluster_shrink = senlinclient.v1.cluster:ScaleInCluster
+cluster_update = senlinclient.v1.cluster:UpdateCluster
+
diff -pruN 2.2.1-2/python_senlinclient.egg-info/not-zip-safe 2.3.0-0ubuntu1/python_senlinclient.egg-info/not-zip-safe
--- 2.2.1-2/python_senlinclient.egg-info/not-zip-safe	1970-01-01 00:00:00.000000000 +0000
+++ 2.3.0-0ubuntu1/python_senlinclient.egg-info/not-zip-safe	2021-08-02 09:40:22.000000000 +0000
@@ -0,0 +1 @@
+
diff -pruN 2.2.1-2/python_senlinclient.egg-info/pbr.json 2.3.0-0ubuntu1/python_senlinclient.egg-info/pbr.json
--- 2.2.1-2/python_senlinclient.egg-info/pbr.json	1970-01-01 00:00:00.000000000 +0000
+++ 2.3.0-0ubuntu1/python_senlinclient.egg-info/pbr.json	2021-08-02 09:40:22.000000000 +0000
@@ -0,0 +1 @@
+{"git_version": "9e21cdf", "is_release": true}
\ No newline at end of file
diff -pruN 2.2.1-2/python_senlinclient.egg-info/PKG-INFO 2.3.0-0ubuntu1/python_senlinclient.egg-info/PKG-INFO
--- 2.2.1-2/python_senlinclient.egg-info/PKG-INFO	1970-01-01 00:00:00.000000000 +0000
+++ 2.3.0-0ubuntu1/python_senlinclient.egg-info/PKG-INFO	2021-08-02 09:40:22.000000000 +0000
@@ -0,0 +1,42 @@
+Metadata-Version: 1.2
+Name: python-senlinclient
+Version: 2.3.0
+Summary: OpenStack Clustering API Client Library
+Home-page: https://docs.openstack.org/python-senlinclient/latest/
+Author: OpenStack
+Author-email: openstack-discuss@lists.openstack.org
+License: UNKNOWN
+Description: ========================
+        Team and repository tags
+        ========================
+        
+        .. image:: https://governance.openstack.org/tc/badges/python-senlinclient.svg
+            :target: https://governance.openstack.org/tc/reference/tags/index.html
+        
+        .. Change things from this point on
+        
+        OpenStackClient Plugin for Senlin Clustering Service
+        ====================================================
+        
+        This is a client library for Senlin built on the Senlin clustering API. It
+        provides a plugin for the openstackclient command-line tool.
+        
+        Development takes place via the usual OpenStack processes as outlined in the
+        `developer guide <https://docs.openstack.org/infra/manual/developers.html>`_.
+        The master repository is in `Git <https://opendev.org/openstack/python-senlinclient>`_.
+        
+        
+Platform: UNKNOWN
+Classifier: Environment :: OpenStack
+Classifier: Intended Audience :: Information Technology
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Requires-Python: >=3.6
diff -pruN 2.2.1-2/python_senlinclient.egg-info/requires.txt 2.3.0-0ubuntu1/python_senlinclient.egg-info/requires.txt
--- 2.2.1-2/python_senlinclient.egg-info/requires.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.3.0-0ubuntu1/python_senlinclient.egg-info/requires.txt	2021-08-02 09:40:22.000000000 +0000
@@ -0,0 +1,11 @@
+PrettyTable>=0.7.2
+PyYAML>=5.3.1
+keystoneauth1>=3.11.0
+openstacksdk>=0.24.0
+osc-lib>=1.11.0
+oslo.i18n>=3.15.3
+oslo.serialization!=2.19.1,>=2.18.0
+oslo.utils>=3.33.0
+pbr!=2.1.0,>=2.0.0
+python-heatclient>=1.10.0
+requests>=2.14.2
diff -pruN 2.2.1-2/python_senlinclient.egg-info/SOURCES.txt 2.3.0-0ubuntu1/python_senlinclient.egg-info/SOURCES.txt
--- 2.2.1-2/python_senlinclient.egg-info/SOURCES.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.3.0-0ubuntu1/python_senlinclient.egg-info/SOURCES.txt	2021-08-02 09:40:23.000000000 +0000
@@ -0,0 +1,135 @@
+.stestr.conf
+.zuul.yaml
+AUTHORS
+CONTRIBUTING.rst
+ChangeLog
+LICENSE
+README.rst
+TODO
+bindep.txt
+lower-constraints.txt
+requirements.txt
+setup.cfg
+setup.py
+test-requirements.txt
+tox.ini
+doc/.gitignore
+doc/Makefile
+doc/requirements.txt
+doc/source/conf.py
+doc/source/index.rst
+doc/source/cli/index.rst
+doc/source/contributor/index.rst
+doc/source/install/index.rst
+python_senlinclient.egg-info/PKG-INFO
+python_senlinclient.egg-info/SOURCES.txt
+python_senlinclient.egg-info/dependency_links.txt
+python_senlinclient.egg-info/entry_points.txt
+python_senlinclient.egg-info/not-zip-safe
+python_senlinclient.egg-info/pbr.json
+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
+releasenotes/notes/cluster-run-210247ab70b289a5.yaml
+releasenotes/notes/cluster-scaling-command-e0d96f2cd0c7ca5f.yaml
+releasenotes/notes/deletion-output-a841931367a2689d.yaml
+releasenotes/notes/drop-py-2-7-cced38f13fd3b44c.yaml
+releasenotes/notes/fix-region-732c2be90e58c347.yaml
+releasenotes/notes/force-delete-c8d6cf4d6f049cb2.yaml
+releasenotes/notes/micro-version-1.10-dabb632bfa40b79b.yaml
+releasenotes/notes/micro-version-a292ce3b00d886af.yaml
+releasenotes/notes/node-check-recover-469bf81db9f9f1ec.yaml
+releasenotes/notes/others-e13ff69738d062c6.yaml
+releasenotes/notes/policy-validate-193a5ebb7db3440a.yaml
+releasenotes/notes/profile-validate-587f1a964e93c0bf.yaml
+releasenotes/notes/python-3.5-c9fd8e34c4046357.yaml
+releasenotes/notes/receiver-create-8305d4efbdf35f35.yaml
+releasenotes/notes/retire-senlin-cli-8ba21807b584993d.yaml
+releasenotes/notes/senlinclient-1.1.0-daf1f24c73ee8b17.yaml
+releasenotes/notes/senlinclient-1.2.0-4680ea85ba2dc6c8.yaml
+releasenotes/notes/test-function-test-d90d7af1994a5f88.yaml
+releasenotes/source/conf.py
+releasenotes/source/index.rst
+releasenotes/source/newton.rst
+releasenotes/source/ocata.rst
+releasenotes/source/pike.rst
+releasenotes/source/queens.rst
+releasenotes/source/rocky.rst
+releasenotes/source/stein.rst
+releasenotes/source/train.rst
+releasenotes/source/unreleased.rst
+releasenotes/source/ussuri.rst
+releasenotes/source/victoria.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
+senlinclient/common/__init__.py
+senlinclient/common/exc.py
+senlinclient/common/format_utils.py
+senlinclient/common/i18n.py
+senlinclient/common/utils.py
+senlinclient/locale/zh_CN/LC_MESSAGES/senlinclient.po
+senlinclient/tests/__init__.py
+senlinclient/tests/functional/__init__.py
+senlinclient/tests/functional/base.py
+senlinclient/tests/functional/test_actions.py
+senlinclient/tests/functional/test_cluster_policy.py
+senlinclient/tests/functional/test_clusters.py
+senlinclient/tests/functional/test_events.py
+senlinclient/tests/functional/test_help.py
+senlinclient/tests/functional/test_nodes.py
+senlinclient/tests/functional/test_policies.py
+senlinclient/tests/functional/test_policy_types.py
+senlinclient/tests/functional/test_profile_types.py
+senlinclient/tests/functional/test_profiles.py
+senlinclient/tests/functional/test_readonly_senlin.py
+senlinclient/tests/functional/test_receivers.py
+senlinclient/tests/functional/test_version.py
+senlinclient/tests/functional/policies/deletion_policy.yaml
+senlinclient/tests/functional/profiles/cirros_basic.yaml
+senlinclient/tests/test_specs/deletion_policy.yaml
+senlinclient/tests/test_specs/nova_server.yaml
+senlinclient/tests/unit/__init__.py
+senlinclient/tests/unit/fakes.py
+senlinclient/tests/unit/test_format_utils.py
+senlinclient/tests/unit/test_plugin.py
+senlinclient/tests/unit/test_utils.py
+senlinclient/tests/unit/v1/__init__.py
+senlinclient/tests/unit/v1/fakes.py
+senlinclient/tests/unit/v1/test_action.py
+senlinclient/tests/unit/v1/test_build_info.py
+senlinclient/tests/unit/v1/test_client.py
+senlinclient/tests/unit/v1/test_cluster.py
+senlinclient/tests/unit/v1/test_cluster_policy.py
+senlinclient/tests/unit/v1/test_event.py
+senlinclient/tests/unit/v1/test_node.py
+senlinclient/tests/unit/v1/test_policy.py
+senlinclient/tests/unit/v1/test_policy_type.py
+senlinclient/tests/unit/v1/test_profile.py
+senlinclient/tests/unit/v1/test_profile_type.py
+senlinclient/tests/unit/v1/test_receiver.py
+senlinclient/tests/unit/v1/test_service.py
+senlinclient/v1/__init__.py
+senlinclient/v1/action.py
+senlinclient/v1/build_info.py
+senlinclient/v1/client.py
+senlinclient/v1/cluster.py
+senlinclient/v1/cluster_policy.py
+senlinclient/v1/event.py
+senlinclient/v1/node.py
+senlinclient/v1/policy.py
+senlinclient/v1/policy_type.py
+senlinclient/v1/profile.py
+senlinclient/v1/profile_type.py
+senlinclient/v1/receiver.py
+senlinclient/v1/service.py
+tools/senlinrc
\ No newline at end of file
diff -pruN 2.2.1-2/python_senlinclient.egg-info/top_level.txt 2.3.0-0ubuntu1/python_senlinclient.egg-info/top_level.txt
--- 2.2.1-2/python_senlinclient.egg-info/top_level.txt	1970-01-01 00:00:00.000000000 +0000
+++ 2.3.0-0ubuntu1/python_senlinclient.egg-info/top_level.txt	2021-08-02 09:40:22.000000000 +0000
@@ -0,0 +1 @@
+senlinclient
diff -pruN 2.2.1-2/requirements.txt 2.3.0-0ubuntu1/requirements.txt
--- 2.2.1-2/requirements.txt	2021-01-03 03:04:45.000000000 +0000
+++ 2.3.0-0ubuntu1/requirements.txt	2021-08-02 09:39:50.000000000 +0000
@@ -3,13 +3,13 @@
 # process, which may cause wedges in the gate later.
 
 pbr!=2.1.0,>=2.0.0 # Apache-2.0
-PrettyTable<0.8,>=0.7.2 # BSD
-keystoneauth1>=3.4.0 # Apache-2.0
+PrettyTable>=0.7.2 # BSD
+keystoneauth1>=3.11.0 # Apache-2.0
 openstacksdk>=0.24.0 # Apache-2.0
 osc-lib>=1.11.0 # Apache-2.0
 oslo.i18n>=3.15.3 # Apache-2.0
 oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0
 oslo.utils>=3.33.0 # Apache-2.0
 python-heatclient>=1.10.0 # Apache-2.0
-PyYAML>=3.13 # MIT
+PyYAML>=5.3.1 # MIT
 requests>=2.14.2 # Apache-2.0
diff -pruN 2.2.1-2/senlinclient/common/exc.py 2.3.0-0ubuntu1/senlinclient/common/exc.py
--- 2.2.1-2/senlinclient/common/exc.py	2021-01-03 03:04:45.000000000 +0000
+++ 2.3.0-0ubuntu1/senlinclient/common/exc.py	2021-08-02 09:39:50.000000000 +0000
@@ -38,6 +38,10 @@ class FileFormatError(BaseException):
     """Illegal file format detected."""
 
 
+class PollingExceededError(BaseException):
+    """Desired resource state not achived within polling period."""
+
+
 class HTTPException(BaseException):
     """Base exception for all HTTP-derived exceptions."""
     code = 'N/A'
diff -pruN 2.2.1-2/senlinclient/common/utils.py 2.3.0-0ubuntu1/senlinclient/common/utils.py
--- 2.2.1-2/senlinclient/common/utils.py	2021-01-03 03:04:45.000000000 +0000
+++ 2.3.0-0ubuntu1/senlinclient/common/utils.py	2021-08-02 09:39:50.000000000 +0000
@@ -12,15 +12,21 @@
 
 
 from heatclient.common import template_utils
+import logging
+from openstack import exceptions as sdk_exc
 from oslo_serialization import jsonutils
 from oslo_utils import importutils
 import prettytable
+import time
 import yaml
 
 from senlinclient.common import exc
 from senlinclient.common.i18n import _
 
 
+log = logging.getLogger(__name__)
+
+
 def import_versioned_module(version, submodule=None):
     module = 'senlinclient.v%s' % version
     if submodule:
@@ -153,3 +159,78 @@ def process_stack_spec(spec):
     }
 
     return new_spec
+
+
+def await_action(senlin_client, action_id,
+                 poll_count_max=10, poll_interval=5):
+
+    def check_action():
+        try:
+            action = senlin_client.get_action(action_id)
+        except sdk_exc.ResourceNotFound:
+            raise exc.CommandError(_('Action not found: %s')
+                                   % action_id)
+        action_states = ['succeeded', 'failed', 'cancelled']
+        if action.status.lower() in action_states:
+            log.info("Action %s completed with status %s."
+                     % (action.id, action.status))
+            return True
+        log.info("Awaiting action %s completion status (current: %s)."
+                 % (action.id, action.status))
+        return False
+
+    _check(check_action, poll_count_max, poll_interval)
+
+
+def await_cluster_status(senlin_client, cluster_id, statuses=None,
+                         poll_count_max=10, poll_interval=5):
+
+    if not statuses or len(statuses) <= 0:
+        statuses = ['ACTIVE', 'ERROR', 'WARNING']
+
+    def check_status():
+        try:
+            cluster = senlin_client.get_cluster(cluster_id)
+        except sdk_exc.ResourceNotFound:
+            raise exc.CommandError(_('Cluster not found: %s') % cluster_id)
+
+        if cluster.status.lower() in [fs.lower() for fs in statuses]:
+            return True
+        log.info("Awaiting cluster status (desired: %s - current: %s)." %
+                 (', '.join(statuses), cluster.status))
+        return False
+
+    _check(check_status, poll_count_max, poll_interval)
+
+
+def await_cluster_delete(senlin_client, cluster_id,
+                         poll_count_max=10, poll_interval=5):
+
+    def check_deleted():
+        try:
+            senlin_client.get_cluster(cluster_id)
+        except sdk_exc.ResourceNotFound:
+            log.info("Successfully deleted cluster %s." % cluster_id)
+            return True
+        log.info("Awaiting cluster deletion for %s." % cluster_id)
+        return False
+
+    _check(check_deleted, poll_count_max, poll_interval)
+
+
+def _check(check_func, poll_count_max=10, poll_interval=5):
+    # a negative poll_count_max is considered indefinite
+
+    poll_increment = 1
+    if poll_count_max < 0:
+        poll_count_max = 1
+        poll_increment = 0
+
+    poll_count = 0
+    while poll_count < poll_count_max:
+        if check_func():
+            return
+
+        time.sleep(poll_interval)
+        poll_count += poll_increment
+    raise exc.PollingExceededError()
diff -pruN 2.2.1-2/senlinclient/tests/unit/test_utils.py 2.3.0-0ubuntu1/senlinclient/tests/unit/test_utils.py
--- 2.2.1-2/senlinclient/tests/unit/test_utils.py	2021-01-03 03:04:45.000000000 +0000
+++ 2.3.0-0ubuntu1/senlinclient/tests/unit/test_utils.py	2021-08-02 09:39:50.000000000 +0000
@@ -14,6 +14,7 @@ from heatclient.common import template_u
 from unittest import mock
 
 import testtools
+import time
 
 from senlinclient.common import exc
 from senlinclient.common.i18n import _
@@ -97,3 +98,40 @@ class UtilTest(testtools.TestCase):
     def test_list_formatter_with_empty_list(self):
         params = []
         self.assertEqual('', utils.list_formatter(params))
+
+    @mock.patch.object(utils, '_check')
+    def test_await_cluster_action(self, mock_check):
+        utils.await_action('fake-client', 'test-action-id')
+        mock_check.assert_called_once()
+
+    @mock.patch.object(utils, '_check')
+    def test_await_cluster_status(self, mock_check):
+        utils.await_cluster_status('fake-client', 'ACTIVE')
+        mock_check.assert_called_once()
+
+    @mock.patch.object(utils, '_check')
+    def test_await_cluster_delete(self, mock_check):
+        utils.await_cluster_delete('fake-client', 'test-cluster-id')
+        mock_check.assert_called_once()
+
+    def test_check(self):
+        check_func = mock.Mock(return_value=True)
+
+        try:
+            utils._check(check_func)
+        except Exception:
+            self.fail("_check() unexpectedly raised an exception")
+
+        check_func.assert_called()
+
+    @mock.patch.object(time, 'sleep')
+    def test_check_raises(self, mock_sleep):
+        mock_check_func = mock.Mock(return_value=False)
+
+        poll_count = 2
+        poll_interval = 1
+
+        self.assertRaises(exc.PollingExceededError, utils._check,
+                          mock_check_func, poll_count, poll_interval)
+        mock_check_func.assert_called()
+        mock_sleep.assert_called()
diff -pruN 2.2.1-2/senlinclient/tests/unit/v1/test_cluster.py 2.3.0-0ubuntu1/senlinclient/tests/unit/v1/test_cluster.py
--- 2.2.1-2/senlinclient/tests/unit/v1/test_cluster.py	2021-01-03 03:04:45.000000000 +0000
+++ 2.3.0-0ubuntu1/senlinclient/tests/unit/v1/test_cluster.py	2021-08-02 09:39:50.000000000 +0000
@@ -18,6 +18,7 @@ from unittest import mock
 from openstack import exceptions as sdk_exc
 from osc_lib import exceptions as exc
 
+from senlinclient.common import utils as senlin_utils
 from senlinclient.tests.unit.v1 import fakes
 from senlinclient.v1 import cluster as osc_cluster
 
@@ -202,13 +203,14 @@ class TestClusterCreate(TestCluster):
     def setUp(self):
         super(TestClusterCreate, self).setUp()
         self.cmd = osc_cluster.CreateCluster(self.app, None)
+        self.cluster_id = '7d85f602-a948-4a30-afd4-e84f47471c15'
         fake_cluster = mock.Mock(
             config={},
             created_at="2015-02-11T15:13:20",
             data={},
             desired_capacity=0,
             domain_id=None,
-            id="7d85f602-a948-4a30-afd4-e84f47471c15",
+            id=self.cluster_id,
             init_time="2015-02-10T14:26:11",
             max_size=-1,
             metadata={},
@@ -265,6 +267,24 @@ class TestClusterCreate(TestCluster):
         self.cmd.take_action(parsed_args)
         self.mock_client.create_cluster.assert_called_with(**kwargs)
 
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_create_with_wait(self, mock_await):
+        arglist = ['test_cluster', '--profile', 'mystack',
+                   '--min-size', '1', '--max-size', '10',
+                   '--desired-capacity', '2', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await.assert_called_once_with(self.mock_client, self.cluster_id)
+
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_create_without_wait(self, mock_await):
+        arglist = ['test_cluster', '--profile', 'mystack',
+                   '--min-size', '1', '--max-size', '10',
+                   '--desired-capacity', '2']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await.assert_not_called()
+
 
 class TestClusterUpdate(TestCluster):
 
@@ -334,6 +354,24 @@ class TestClusterUpdate(TestCluster):
                                   parsed_args)
         self.assertIn('Cluster not found: c6b8b252', str(error))
 
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_update_with_wait(self, mock_await):
+        arglist = ['--name', 'new_cluster', '--metadata', 'nk1=nv1;nk2=nv2',
+                   '--profile', 'new_profile', '--timeout', '30', '45edadcb',
+                   '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await.assert_called_once_with(self.mock_client,
+                                           self.fake_cluster.id)
+
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_update_without_wait(self, mock_await):
+        arglist = ['--name', 'new_cluster', '--metadata', 'nk1=nv1;nk2=nv2',
+                   '--profile', 'new_profile', '--timeout', '30', '45edadcb']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await.assert_not_called()
+
 
 class TestClusterDelete(TestCluster):
     def setUp(self):
@@ -422,6 +460,45 @@ class TestClusterDelete(TestCluster):
         mock_stdin.readline.assert_called_with()
         self.mock_client.delete_cluster.assert_not_called()
 
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_delete')
+    def test_cluster_delete_with_wait(self, mock_await_cluster,
+                                      mock_await_action):
+        fake_action = {'id': 'fake-action-id'}
+        self.mock_client.delete_cluster = mock.Mock(return_value=fake_action)
+        arglist = ['my_cluster', '--force', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_called_once_with(self.mock_client,
+                                                  fake_action['id'])
+        mock_await_cluster.assert_called_once_with(self.mock_client,
+                                                   'my_cluster')
+
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_delete')
+    def test_cluster_delete_without_wait(self, mock_await_cluster,
+                                         mock_await_action):
+        fake_action = {'id': 'fake-action-id'}
+        self.mock_client.delete_cluster = mock.Mock(return_value=fake_action)
+        arglist = ['my_cluster', '--force']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+        mock_await_cluster.assert_not_called()
+
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_delete')
+    def test_cluster_delete_with_wait_bad_action(self, mock_await_cluster,
+                                                 mock_await_action):
+        self.mock_client.delete_cluster.side_effect = (
+            Exception('test exception')
+        )
+        arglist = ['my_cluster', '--force', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+        mock_await_cluster.assert_not_called()
+
 
 class TestClusterResize(TestCluster):
     response = {"action": "8bb476c3-0f4c-44ee-9f64-c7b0260814de"}
@@ -565,6 +642,46 @@ class TestClusterResize(TestCluster):
         self.assertEqual('Max size cannot be less than the specified '
                          'capacity.', str(error))
 
+    @mock.patch.object(osc_cluster, '_show_cluster')
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_resize_with_wait(self, mock_await_status,
+                                      mock_await_action, mock_show):
+        arglist = ['--capacity', '2', 'my_cluster', "--wait"]
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_called_once_with(self.mock_client,
+                                                  self.response['action'])
+        mock_await_status.assert_called_once_with(self.mock_client,
+                                                  'my_cluster')
+        mock_show.assert_called_once()
+
+    @mock.patch.object(osc_cluster, '_show_cluster')
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_resize_without_wait(self, mock_await_status,
+                                         mock_await_action, mock_show):
+        arglist = ['--capacity', '2', 'my_cluster']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+        mock_await_status.assert_not_called()
+        mock_show.assert_not_called()
+
+    @mock.patch.object(osc_cluster, '_show_cluster')
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_resize_with_wait_no_action(self, mock_await_status,
+                                                mock_await_action, mock_show):
+        error = 'test error'
+        self.mock_client.resize_cluster = mock.Mock(return_value=error)
+        arglist = ['--capacity', '2', 'my_cluster', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+        mock_await_status.assert_not_called()
+        mock_show.assert_not_called()
+
 
 class TestClusterScaleIn(TestCluster):
     response = {"action": "8bb476c3-0f4c-44ee-9f64-c7b0260814de"}
@@ -582,6 +699,48 @@ class TestClusterScaleIn(TestCluster):
         self.mock_client.scale_in_cluster.assert_called_with('my_cluster',
                                                              '2')
 
+    @mock.patch.object(osc_cluster, '_show_cluster')
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_scale_in_with_wait(self, mock_await_status,
+                                        mock_await_action, mock_show):
+        arglist = ['--count', '2', 'my_cluster', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_called_once_with(self.mock_client,
+                                                  self.response['action'])
+        mock_await_status.assert_called_once_with(self.mock_client,
+                                                  'my_cluster')
+        mock_show.assert_called_once()
+
+    @mock.patch.object(osc_cluster, '_show_cluster')
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_scale_in_without_wait(self, mock_await_status,
+                                           mock_await_action, mock_show):
+        arglist = ['--count', '2', 'my_cluster']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+        mock_await_status.assert_not_called()
+        mock_show.assert_not_called()
+
+    @mock.patch.object(osc_cluster, '_show_cluster')
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_scale_in_with_wait_no_action(self, mock_await_status,
+                                                  mock_await_action,
+                                                  mock_show):
+        arglist = ['--count', '2', 'my_cluster', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        error = {'error': 'test-error'}
+        self.mock_client.scale_in_cluster = mock.Mock(return_value=error)
+
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+        mock_await_status.assert_not_called()
+        mock_show.assert_not_called()
+
 
 class TestClusterScaleOut(TestCluster):
     response = {"action": "8bb476c3-0f4c-44ee-9f64-c7b0260814de"}
@@ -599,6 +758,48 @@ class TestClusterScaleOut(TestCluster):
         self.mock_client.scale_out_cluster.assert_called_with('my_cluster',
                                                               '2')
 
+    @mock.patch.object(osc_cluster, '_show_cluster')
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_scale_out_with_wait(self, mock_await_status,
+                                         mock_await_action, mock_show):
+        arglist = ['--count', '2', 'my_cluster', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_called_once_with(self.mock_client,
+                                                  self.response['action'])
+        mock_await_status.assert_called_once_with(self.mock_client,
+                                                  'my_cluster')
+        mock_show.assert_called_once()
+
+    @mock.patch.object(osc_cluster, '_show_cluster')
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_scale_out_without_wait(self, mock_await_status,
+                                            mock_await_action, mock_show):
+        arglist = ['--count', '2', 'my_cluster']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+        mock_await_status.assert_not_called()
+        mock_show.assert_not_called()
+
+    @mock.patch.object(osc_cluster, '_show_cluster')
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_scale_out_with_wait_no_action(self, mock_await_status,
+                                                   mock_await_action,
+                                                   mock_show):
+        arglist = ['--count', '2', 'my_cluster', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        error = {'error': 'test-error'}
+        self.mock_client.scale_out_cluster = mock.Mock(return_value=error)
+
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+        mock_await_status.assert_not_called()
+        mock_show.assert_not_called()
+
 
 class TestClusterPolicyAttach(TestCluster):
     response = {"action": "8bb476c3-0f4c-44ee-9f64-c7b0260814de"}
@@ -618,6 +819,32 @@ class TestClusterPolicyAttach(TestCluste
             'my_policy',
             enabled=True)
 
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_policy_attach_with_wait(self, mock_await_action):
+        arglist = ['--policy', 'my_policy', 'my_cluster', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_called_once_with(self.mock_client,
+                                                  self.response['action'])
+
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_policy_attach_without_wait(self, mock_await_action):
+        arglist = ['--policy', 'my_policy', 'my_cluster']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_policy_attach_with_wait_no_action(self,
+                                                       mock_await_action):
+        arglist = ['--policy', 'my_policy', 'my_cluster', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        error = {'error': 'test-error'}
+        self.mock_client.attach_policy_to_cluster = \
+            mock.Mock(return_value=error)
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+
 
 class TestClusterPolicyDetach(TestCluster):
     response = {"action": "8bb476c3-0f4c-44ee-9f64-c7b0260814de"}
@@ -636,6 +863,32 @@ class TestClusterPolicyDetach(TestCluste
             'my_cluster',
             'my_policy')
 
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_policy_dettach_with_wait(self, mock_await_action):
+        arglist = ['--policy', 'my_policy', 'my_cluster', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_called_once_with(self.mock_client,
+                                                  self.response['action'])
+
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_policy_dettach_without_wait(self, mock_await_action):
+        arglist = ['--policy', 'my_policy', 'my_cluster']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_policy_dettach_with_wait_no_action(self,
+                                                        mock_await_action):
+        arglist = ['--policy', 'my_policy', 'my_cluster', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        error = {'error': 'test-error'}
+        self.mock_client.detach_policy_from_cluster = \
+            mock.Mock(return_value=error)
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+
 
 class TestClusterNodeList(TestCluster):
     columns = ['id', 'name', 'index', 'status', 'physical_id', 'created_at']
@@ -734,6 +987,40 @@ class TestClusterNodeAdd(TestCluster):
             'my_cluster',
             ['node1', 'node2'])
 
+    @mock.patch.object(osc_cluster, "_show_cluster")
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_node_add_with_wait(self, mock_await_action, mock_show):
+        arglist = ['--nodes', 'node1', 'my_cluster', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+
+        mock_await_action.assert_called_once_with(self.mock_client,
+                                                  self.response['action'])
+        mock_show.assert_called_once_with(self.mock_client, 'my_cluster')
+
+    @mock.patch.object(osc_cluster, "_show_cluster")
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_node_add_without_wait(self, mock_await_action, mock_show):
+        arglist = ['--nodes', 'node1', 'my_cluster']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+
+        mock_await_action.assert_not_called()
+        mock_show.assert_not_called()
+
+    @mock.patch.object(osc_cluster, "_show_cluster")
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_node_add_with_wait_no_action(self, mock_await_action,
+                                                  mock_show):
+        arglist = ['--nodes', 'node1', 'my_cluster', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        error = {'error': 'test-error'}
+        self.mock_client.add_nodes_to_cluster = mock.Mock(return_value=error)
+        self.cmd.take_action(parsed_args)
+
+        mock_await_action.assert_not_called()
+        mock_show.assert_not_called()
+
 
 class TestClusterNodeDel(TestCluster):
     response = {"action": "8bb476c3-0f4c-44ee-9f64-c7b0260814de"}
@@ -771,6 +1058,43 @@ class TestClusterNodeDel(TestCluster):
             ['node1', 'node2'],
             destroy_after_deletion=False)
 
+    @mock.patch.object(osc_cluster, "_show_cluster")
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_node_delete_with_wait(self, mock_await_action, mock_show):
+        arglist = ['--nodes', 'node1', 'my_cluster', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+
+        mock_await_action.assert_called_once_with(self.mock_client,
+                                                  self.response['action'])
+        mock_show.assert_called_once_with(self.mock_client, 'my_cluster')
+
+    @mock.patch.object(osc_cluster, "_show_cluster")
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_node_delete_without_wait(self, mock_await_action,
+                                              mock_show):
+        arglist = ['--nodes', 'node1', 'my_cluster']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+
+        mock_await_action.assert_not_called()
+        mock_show.assert_not_called()
+
+    @mock.patch.object(osc_cluster, "_show_cluster")
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_node_delete_with_wait_no_action(self, mock_await_action,
+                                                     mock_show):
+        arglist = ['--nodes', 'node1', 'my_cluster', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        error = {'error': 'test-error'}
+        self.mock_client.remove_nodes_from_cluster = \
+            mock.Mock(return_value=error)
+
+        self.cmd.take_action(parsed_args)
+
+        mock_await_action.assert_not_called()
+        mock_show.assert_not_called()
+
 
 class TestClusterCheck(TestCluster):
     response = {"action": "8bb476c3-0f4c-44ee-9f64-c7b0260814de"}
@@ -798,6 +1122,48 @@ class TestClusterCheck(TestCluster):
                                   parsed_args)
         self.assertIn('Cluster not found: cluster1', str(error))
 
+    @mock.patch.object(osc_cluster, "_list_cluster_summaries")
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_check_with_wait(self, mock_await_action,
+                                     mock_await_status, mock_list):
+        arglist = ['cluster1', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+
+        mock_await_action.assert_called_with(self.mock_client,
+                                             self.response['action'])
+        mock_await_status.assert_called_with(self.mock_client, 'cluster1')
+        mock_list.assert_called_with(self.mock_client, {'cluster1'})
+
+    @mock.patch.object(osc_cluster, "_list_cluster_summaries")
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_check_without_wait(self, mock_await_action,
+                                        mock_await_status, mock_list):
+        arglist = ['cluster1']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+
+        mock_await_action.assert_not_called()
+        mock_await_status.assert_not_called()
+        mock_list.assert_not_called()
+
+    @mock.patch.object(osc_cluster, "_list_cluster_summaries")
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_check_with_wait_no_action(self, mock_await_action,
+                                               mock_await_status, mock_list):
+        arglist = ['cluster1', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        error = {'error': 'test-error'}
+        self.mock_client.check_cluster = mock.Mock(return_value=error)
+        self.cmd.take_action(parsed_args)
+
+        mock_await_action.assert_not_called()
+        mock_await_status.assert_not_called()
+        mock_list.assert_not_called()
+
 
 class TestClusterRecover(TestCluster):
     response = {"action": "8bb476c3-0f4c-44ee-9f64-c7b0260814de"}
@@ -826,6 +1192,48 @@ class TestClusterRecover(TestCluster):
                                   parsed_args)
         self.assertIn('Cluster not found: cluster1', str(error))
 
+    @mock.patch.object(osc_cluster, "_list_cluster_summaries")
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_recover_with_wait(self, mock_await_action,
+                                       mock_await_status, mock_list):
+        arglist = ['cluster1', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+
+        mock_await_action.assert_called_with(self.mock_client,
+                                             self.response['action'])
+        mock_await_status.assert_called_with(self.mock_client, 'cluster1')
+        mock_list.assert_called_with(self.mock_client, {'cluster1'})
+
+    @mock.patch.object(osc_cluster, "_list_cluster_summaries")
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_recover_without_wait(self, mock_await_action,
+                                          mock_await_status, mock_list):
+        arglist = ['cluster1']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+
+        mock_await_action.assert_not_called()
+        mock_await_status.assert_not_called()
+        mock_list.assert_not_called()
+
+    @mock.patch.object(osc_cluster, "_list_cluster_summaries")
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    @mock.patch.object(senlin_utils, 'await_action')
+    def test_cluster_recover_with_wait_no_action(self, mock_await_action,
+                                                 mock_await_status, mock_list):
+        arglist = ['cluster1', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        error = {'error': 'test-error'}
+        self.mock_client.recover_cluster = mock.Mock(return_value=error)
+        self.cmd.take_action(parsed_args)
+
+        mock_await_action.assert_not_called()
+        mock_await_status.assert_not_called()
+        mock_list.assert_not_called()
+
 
 class TestClusterOp(TestCluster):
 
@@ -856,6 +1264,48 @@ class TestClusterOp(TestCluster):
                                   parsed_args)
         self.assertIn('Cluster not found: cluster1', str(error))
 
+    @mock.patch.object(osc_cluster, '_show_cluster')
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_op_with_wait(self, mock_await_status,
+                                  mock_await_action, mock_show):
+        arglist = ['--operation', 'dance', 'cluster1', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_called_once_with(self.mock_client,
+                                                  self.response['action'])
+        mock_await_status.assert_called_once_with(self.mock_client,
+                                                  'cluster1')
+        mock_show.assert_called_once()
+
+    @mock.patch.object(osc_cluster, '_show_cluster')
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_op_without_wait(self, mock_await_status,
+                                     mock_await_action, mock_show):
+        arglist = ['--operation', 'dance', 'cluster1']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+        mock_await_status.assert_not_called()
+        mock_show.assert_not_called()
+
+    @mock.patch.object(osc_cluster, '_show_cluster')
+    @mock.patch.object(senlin_utils, 'await_action')
+    @mock.patch.object(senlin_utils, 'await_cluster_status')
+    def test_cluster_op_with_wait_no_action(self, mock_await_status,
+                                            mock_await_action, mock_show):
+        arglist = ['--operation', 'dance', 'cluster1', '--wait']
+        parsed_args = self.check_parser(self.cmd, arglist, [])
+        error = {'error': 'test-error'}
+        self.mock_client.perform_operation_on_cluster = \
+            mock.Mock(return_value=error)
+
+        self.cmd.take_action(parsed_args)
+        mock_await_action.assert_not_called()
+        mock_await_status.assert_not_called()
+        mock_show.assert_not_called()
+
 
 class TestClusterCollect(TestCluster):
     response = [
diff -pruN 2.2.1-2/senlinclient/v1/cluster.py 2.3.0-0ubuntu1/senlinclient/v1/cluster.py
--- 2.2.1-2/senlinclient/v1/cluster.py	2021-01-03 03:04:45.000000000 +0000
+++ 2.3.0-0ubuntu1/senlinclient/v1/cluster.py	2021-08-02 09:39:50.000000000 +0000
@@ -210,6 +210,11 @@ class CreateCluster(command.ShowOne):
             metavar='<cluster-name>',
             help=_('Name of the cluster to create')
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster creation to complete')
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -230,6 +235,8 @@ class CreateCluster(command.ShowOne):
         }
 
         cluster = senlin_client.create_cluster(**attrs)
+        if parsed_args.wait:
+            senlin_utils.await_cluster_status(senlin_client, cluster.id)
         return _show_cluster(senlin_client, cluster.id)
 
 
@@ -262,7 +269,6 @@ class UpdateCluster(command.ShowOne):
                    "If false, it will be applied to all existing nodes. "
                    "If true, any newly created nodes will use the new profile,"
                    "but existing nodes will not be changed. Default is False.")
-
         )
         parser.add_argument(
             '--timeout',
@@ -288,6 +294,11 @@ class UpdateCluster(command.ShowOne):
             metavar='<cluster>',
             help=_('Name or ID of cluster to be updated')
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster update to complete')
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -304,12 +315,23 @@ class UpdateCluster(command.ShowOne):
                 parsed_args.profile_only,
                 strict=True,
             ),
-            'metadata': senlin_utils.format_parameters(parsed_args.metadata),
-            'config': senlin_utils.format_parameters(parsed_args.config),
             'timeout': parsed_args.timeout,
         }
 
+        if parsed_args.config is not None:
+            attrs['config'] = senlin_utils.format_parameters(
+                parsed_args.config)
+        if parsed_args.metadata is not None:
+            attrs['metadata'] = senlin_utils.format_parameters(
+                parsed_args.metadata)
+
         senlin_client.update_cluster(cluster, **attrs)
+        if parsed_args.wait:
+            # PATCH operations do not currently return an action to await.
+            # introducing a delay to allow the cluster to transition state
+            # out of ACTIVE before inspection.
+            time.sleep(1)
+            senlin_utils.await_cluster_status(senlin_client, cluster.id)
         return _show_cluster(senlin_client, cluster.id)
 
 
@@ -336,6 +358,11 @@ class DeleteCluster(command.Command):
             action='store_true',
             help=_('Skip yes/no prompt (assume yes).')
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster delete to complete')
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -361,17 +388,21 @@ class DeleteCluster(command.Command):
         result = {}
         for cid in parsed_args.cluster:
             try:
-                cluster_delete_action = senlin_client.delete_cluster(
+                action = senlin_client.delete_cluster(
                     cid, False, parsed_args.force_delete)
-                result[cid] = ('OK', cluster_delete_action['id'])
+                result[cid] = ('OK', action['id'])
             except Exception as ex:
                 result[cid] = ('ERROR', str(ex))
 
-        for rid, res in result.items():
-            senlin_utils.print_action_result(rid, res)
+        for cid, a in result.items():
+            senlin_utils.print_action_result(cid, a)
+            if parsed_args.wait:
+                if a[0] == 'OK':
+                    senlin_utils.await_action(senlin_client, a[1])
+                    senlin_utils.await_cluster_delete(senlin_client, cid)
 
 
-class ResizeCluster(command.Command):
+class ResizeCluster(command.ShowOne):
     """Resize a cluster."""
 
     log = logging.getLogger(__name__ + ".ResizeCluster")
@@ -432,6 +463,11 @@ class ResizeCluster(command.Command):
             metavar='<cluster>',
             help=_('Name or ID of cluster to operate on')
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster resize to complete')
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -446,6 +482,7 @@ class ResizeCluster(command.Command):
         min_size = parsed_args.min_size
         max_size = parsed_args.max_size
         min_step = parsed_args.min_step
+        wait = parsed_args.wait
 
         if sum(v is not None for v in (capacity, adjustment, percentage,
                                        min_size, max_size)) == 0:
@@ -507,13 +544,21 @@ class ResizeCluster(command.Command):
         action_args['strict'] = parsed_args.strict
 
         resp = senlin_client.resize_cluster(parsed_args.cluster, **action_args)
+
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
+            if wait:
+                senlin_utils.await_action(senlin_client, resp['action'])
+                senlin_utils.await_cluster_status(senlin_client,
+                                                  parsed_args.cluster)
+                return _show_cluster(senlin_client, parsed_args.cluster)
         else:
             print('Request error: %s' % resp)
 
+        return '', ''
 
-class ScaleInCluster(command.Command):
+
+class ScaleInCluster(command.ShowOne):
     """Scale in a cluster by the specified number of nodes."""
 
     log = logging.getLogger(__name__ + ".ScaleInCluster")
@@ -530,6 +575,11 @@ class ScaleInCluster(command.Command):
             metavar='<cluster>',
             help=_('Name or ID of cluster to operate on')
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster scale-in to complete')
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -544,11 +594,18 @@ class ScaleInCluster(command.Command):
                 'Unable to scale in cluster: %s') % resp['error']['message'])
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
+            if parsed_args.wait:
+                senlin_utils.await_action(senlin_client, resp['action'])
+                senlin_utils.await_cluster_status(senlin_client,
+                                                  parsed_args.cluster)
+                return _show_cluster(senlin_client, parsed_args.cluster)
         else:
             print('Request error: %s' % resp)
 
+        return '', ''
 
-class ScaleOutCluster(command.Command):
+
+class ScaleOutCluster(command.ShowOne):
     """Scale out a cluster by the specified number of nodes."""
 
     log = logging.getLogger(__name__ + ".ScaleOutCluster")
@@ -565,6 +622,11 @@ class ScaleOutCluster(command.Command):
             metavar='<cluster>',
             help=_('Name or ID of cluster to operate on')
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster scale-out to complete')
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -579,9 +641,16 @@ class ScaleOutCluster(command.Command):
                 'Unable to scale out cluster: %s') % resp['error']['message'])
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
+            if parsed_args.wait:
+                senlin_utils.await_action(senlin_client, resp['action'])
+                senlin_utils.await_cluster_status(senlin_client,
+                                                  parsed_args.cluster)
+                return _show_cluster(senlin_client, parsed_args.cluster)
         else:
             print('Request error: %s' % resp)
 
+        return '', ''
+
 
 class ClusterPolicyAttach(command.Command):
     """Attach policy to cluster."""
@@ -608,6 +677,11 @@ class ClusterPolicyAttach(command.Comman
             metavar='<cluster>',
             help=_('Name or ID of cluster to operate on')
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster policy-attach to complete')
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -624,6 +698,8 @@ class ClusterPolicyAttach(command.Comman
                                                       **kwargs)
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
+            if parsed_args.wait:
+                senlin_utils.await_action(senlin_client, resp['action'])
         else:
             print('Request error: %s' % resp)
 
@@ -646,6 +722,11 @@ class ClusterPolicyDetach(command.Comman
             metavar='<cluster>',
             help=_('Name or ID of cluster to operate on')
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster policy-detach to complete')
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -655,6 +736,8 @@ class ClusterPolicyDetach(command.Comman
                                                         parsed_args.policy)
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
+            if parsed_args.wait:
+                senlin_utils.await_action(senlin_client, resp['action'])
         else:
             print('Request error: %s' % resp)
 
@@ -737,7 +820,7 @@ class ClusterNodeList(command.Lister):
         )
 
 
-class ClusterNodeAdd(command.Command):
+class ClusterNodeAdd(command.ShowOne):
     """Add specified nodes to cluster."""
     log = logging.getLogger(__name__ + ".ClusterNodeAdd")
 
@@ -755,6 +838,11 @@ class ClusterNodeAdd(command.Command):
             metavar='<cluster>',
             help=_('Name or ID of cluster to operate on')
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster members add to complete')
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -765,11 +853,16 @@ class ClusterNodeAdd(command.Command):
                                                   node_ids)
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
+            if parsed_args.wait:
+                senlin_utils.await_action(senlin_client, resp['action'])
+                return _show_cluster(senlin_client, parsed_args.cluster)
         else:
             print('Request error: %s' % resp)
 
+        return '', ''
+
 
-class ClusterNodeDel(command.Command):
+class ClusterNodeDel(command.ShowOne):
     """Delete specified nodes from cluster."""
     log = logging.getLogger(__name__ + ".ClusterNodeDel")
 
@@ -795,6 +888,11 @@ class ClusterNodeDel(command.Command):
             metavar='<cluster>',
             help=_('Name or ID of cluster to operate on')
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster members delete to complete')
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -808,11 +906,16 @@ class ClusterNodeDel(command.Command):
             parsed_args.cluster, node_ids, **kwargs)
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
+            if parsed_args.wait:
+                senlin_utils.await_action(senlin_client, resp['action'])
+                return _show_cluster(senlin_client, parsed_args.cluster)
         else:
             print('Request error: %s' % resp)
 
+        return '', ''
+
 
-class ClusterNodeReplace(command.Command):
+class ClusterNodeReplace(command.ShowOne):
     """Replace the nodes in a cluster with specified nodes."""
     log = logging.getLogger(__name__ + ".ClusterNodeReplace")
 
@@ -833,6 +936,11 @@ class ClusterNodeReplace(command.Command
             metavar='<cluster>',
             help=_('Name or ID of cluster to operate on')
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster members replace to complete')
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -847,11 +955,16 @@ class ClusterNodeReplace(command.Command
                                                       nodepairs)
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
+            if parsed_args.wait:
+                senlin_utils.await_action(senlin_client, resp['action'])
+                return _show_cluster(senlin_client, parsed_args.cluster)
         else:
             print('Request error: %s' % resp)
 
+        return '', ''
+
 
-class CheckCluster(command.Command):
+class CheckCluster(command.Lister):
     """Check the cluster(s)."""
     log = logging.getLogger(__name__ + ".CheckCluster")
 
@@ -863,11 +976,19 @@ class CheckCluster(command.Command):
             nargs='+',
             help=_('ID or name of cluster(s) to operate on.')
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster check to complete')
+        )
         return parser
 
     def take_action(self, parsed_args):
         self.log.debug("take_action(%s)", parsed_args)
         senlin_client = self.app.client_manager.clustering
+
+        cluster_actions = {}
+
         for cid in parsed_args.cluster:
             try:
                 resp = senlin_client.check_cluster(cid)
@@ -877,11 +998,39 @@ class CheckCluster(command.Command):
                 print('Cluster check request on cluster %(cid)s is '
                       'accepted by action %(action)s.'
                       % {'cid': cid, 'action': resp['action']})
+                cluster_actions[cid] = resp['action']
             else:
                 print('Request error: %s' % resp)
 
+        # generate the output after all actions have been accepted/rejected
+        if parsed_args.wait and len(cluster_actions) > 0:
+            for cid, action in cluster_actions.items():
+                senlin_utils.await_action(senlin_client, action)
+                senlin_utils.await_cluster_status(senlin_client, cid)
+            return _list_cluster_summaries(senlin_client,
+                                           cluster_actions.keys())
+
+        return '', ''
+
 
-class RecoverCluster(command.Command):
+def _list_cluster_summaries(senlin_client, cluster_ids):
+    clusters = []
+    for cluster_id in cluster_ids:
+        try:
+            cluster = senlin_client.get_cluster(cluster_id)
+        except sdk_exc.ResourceNotFound:
+            raise exc.CommandError(_('Cluster not found: %s') % cluster_id)
+
+        clusters.append(cluster)
+
+    columns = ['ID', 'Name', 'Status', 'Status Reason']
+    formatters = {}
+    props = (utils.get_item_properties(c, columns, formatters=formatters)
+             for c in clusters)
+    return columns, props
+
+
+class RecoverCluster(command.Lister):
     """Recover the cluster(s)."""
     log = logging.getLogger(__name__ + ".RecoverCluster")
 
@@ -893,7 +1042,6 @@ class RecoverCluster(command.Command):
             nargs='+',
             help=_('ID or name of cluster(s) to operate on.')
         )
-
         parser.add_argument(
             '--check',
             metavar='<boolean>',
@@ -901,6 +1049,11 @@ class RecoverCluster(command.Command):
             help=_("Whether the cluster should check it's nodes status before "
                    "doing cluster recover. Default is false")
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster recover to complete')
+        )
 
         return parser
 
@@ -912,6 +1065,7 @@ class RecoverCluster(command.Command):
             'check': strutils.bool_from_string(parsed_args.check, strict=True)
         }
 
+        cluster_actions = {}
         for cid in parsed_args.cluster:
             try:
                 resp = senlin_client.recover_cluster(cid, **params)
@@ -921,9 +1075,20 @@ class RecoverCluster(command.Command):
                 print('Cluster recover request on cluster %(cid)s is '
                       'accepted by action %(action)s.'
                       % {'cid': cid, 'action': resp['action']})
+                cluster_actions[cid] = resp['action']
             else:
                 print('Request error: %s' % resp)
 
+        # generate the output after all actions have been accepted/rejected
+        if parsed_args.wait and len(cluster_actions) > 0:
+            for cid, action in cluster_actions.items():
+                senlin_utils.await_action(senlin_client, action)
+                senlin_utils.await_cluster_status(senlin_client, cid)
+            return _list_cluster_summaries(senlin_client,
+                                           cluster_actions.keys())
+
+        return '', ''
+
 
 class ClusterCollect(command.Lister):
     """Collect attributes across a cluster."""
@@ -966,7 +1131,7 @@ class ClusterCollect(command.Lister):
                  for a in attrs))
 
 
-class ClusterOp(command.Lister):
+class ClusterOp(command.ShowOne):
     """Perform an operation on all nodes across a cluster."""
     log = logging.getLogger(__name__ + ".ClusterOp")
 
@@ -991,6 +1156,11 @@ class ClusterOp(command.Lister):
             metavar='<cluster>',
             help=_('ID or name of cluster to operate on.')
         )
+        parser.add_argument(
+            '--wait',
+            action='store_true',
+            help=_('Wait for cluster operation to complete')
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -1009,9 +1179,15 @@ class ClusterOp(command.Lister):
             raise exc.CommandError(_('Cluster not found: %s') % cid)
         if 'action' in resp:
             print('Request accepted by action: %s' % resp['action'])
+            if parsed_args.wait:
+                senlin_utils.await_action(senlin_client, resp['action'])
+                senlin_utils.await_cluster_status(senlin_client, cid)
+                return _show_cluster(senlin_client, cid)
         else:
             print('Request error: %s' % resp)
 
+        return '', ''
+
 
 class ClusterRun(command.Command):
     """Run scripts on cluster."""
diff -pruN 2.2.1-2/setup.cfg 2.3.0-0ubuntu1/setup.cfg
--- 2.2.1-2/setup.cfg	2021-01-03 03:04:45.000000000 +0000
+++ 2.3.0-0ubuntu1/setup.cfg	2021-08-02 09:40:23.138812500 +0000
@@ -1,92 +1,96 @@
 [metadata]
 name = python-senlinclient
 summary = OpenStack Clustering API Client Library
-description-file =
-    README.rst
+description-file = 
+	README.rst
 author = OpenStack
 author-email = openstack-discuss@lists.openstack.org
 home-page = https://docs.openstack.org/python-senlinclient/latest/
 python-requires = >=3.6
-classifier =
-    Environment :: OpenStack
-    Intended Audience :: Information Technology
-    Intended Audience :: System Administrators
-    License :: OSI Approved :: Apache Software License
-    Operating System :: POSIX :: Linux
-    Programming Language :: Python
-    Programming Language :: Python :: Implementation :: CPython
-    Programming Language :: Python :: 3 :: Only
-    Programming Language :: Python :: 3
-    Programming Language :: Python :: 3.6
-    Programming Language :: Python :: 3.7
-    Programming Language :: Python :: 3.8
+classifier = 
+	Environment :: OpenStack
+	Intended Audience :: Information Technology
+	Intended Audience :: System Administrators
+	License :: OSI Approved :: Apache Software License
+	Operating System :: POSIX :: Linux
+	Programming Language :: Python
+	Programming Language :: Python :: Implementation :: CPython
+	Programming Language :: Python :: 3 :: Only
+	Programming Language :: Python :: 3
+	Programming Language :: Python :: 3.6
+	Programming Language :: Python :: 3.7
+	Programming Language :: Python :: 3.8
 
 [files]
-packages =
-    senlinclient
+packages = 
+	senlinclient
 
 [entry_points]
-openstack.cli.extension =
-    clustering = senlinclient.plugin
+openstack.cli.extension = 
+	clustering = senlinclient.plugin
+openstack.clustering.v1 = 
+	cluster_action_list = senlinclient.v1.action:ListAction
+	cluster_action_show = senlinclient.v1.action:ShowAction
+	cluster_action_update = senlinclient.v1.action:UpdateAction
+	cluster_build_info = senlinclient.v1.build_info:BuildInfo
+	cluster_check = senlinclient.v1.cluster:CheckCluster
+	cluster_create = senlinclient.v1.cluster:CreateCluster
+	cluster_delete = senlinclient.v1.cluster:DeleteCluster
+	cluster_event_list = senlinclient.v1.event:ListEvent
+	cluster_event_show = senlinclient.v1.event:ShowEvent
+	cluster_list = senlinclient.v1.cluster:ListCluster
+	cluster_members_list = senlinclient.v1.cluster:ClusterNodeList
+	cluster_members_add = senlinclient.v1.cluster:ClusterNodeAdd
+	cluster_members_del = senlinclient.v1.cluster:ClusterNodeDel
+	cluster_members_replace = senlinclient.v1.cluster:ClusterNodeReplace
+	cluster_node_adopt = senlinclient.v1.node:AdoptNode
+	cluster_node_check = senlinclient.v1.node:CheckNode
+	cluster_node_create = senlinclient.v1.node:CreateNode
+	cluster_node_delete = senlinclient.v1.node:DeleteNode
+	cluster_node_list = senlinclient.v1.node:ListNode
+	cluster_node_recover = senlinclient.v1.node:RecoverNode
+	cluster_node_show = senlinclient.v1.node:ShowNode
+	cluster_node_update = senlinclient.v1.node:UpdateNode
+	cluster_node_op = senlinclient.v1.node:NodeOp
+	cluster_policy_attach = senlinclient.v1.cluster:ClusterPolicyAttach
+	cluster_policy_binding_list = senlinclient.v1.cluster_policy:ClusterPolicyList
+	cluster_policy_binding_show = senlinclient.v1.cluster_policy:ClusterPolicyShow
+	cluster_policy_binding_update = senlinclient.v1.cluster_policy:ClusterPolicyUpdate
+	cluster_policy_create = senlinclient.v1.policy:CreatePolicy
+	cluster_policy_delete = senlinclient.v1.policy:DeletePolicy
+	cluster_policy_detach = senlinclient.v1.cluster:ClusterPolicyDetach
+	cluster_policy_list = senlinclient.v1.policy:ListPolicy
+	cluster_policy_show = senlinclient.v1.policy:ShowPolicy
+	cluster_policy_validate = senlinclient.v1.policy:ValidatePolicy
+	cluster_policy_type_list = senlinclient.v1.policy_type:PolicyTypeList
+	cluster_policy_type_show = senlinclient.v1.policy_type:PolicyTypeShow
+	cluster_policy_update = senlinclient.v1.policy:UpdatePolicy
+	cluster_profile_create = senlinclient.v1.profile:CreateProfile
+	cluster_profile_delete = senlinclient.v1.profile:DeleteProfile
+	cluster_profile_list = senlinclient.v1.profile:ListProfile
+	cluster_profile_show = senlinclient.v1.profile:ShowProfile
+	cluster_profile_type_ops = senlinclient.v1.profile_type:ProfileTypeOperations
+	cluster_profile_type_list = senlinclient.v1.profile_type:ProfileTypeList
+	cluster_profile_type_show = senlinclient.v1.profile_type:ProfileTypeShow
+	cluster_profile_update = senlinclient.v1.profile:UpdateProfile
+	cluster_profile_validate = senlinclient.v1.profile:ValidateProfile
+	cluster_receiver_create = senlinclient.v1.receiver:CreateReceiver
+	cluster_receiver_update = senlinclient.v1.receiver:UpdateReceiver
+	cluster_receiver_delete = senlinclient.v1.receiver:DeleteReceiver
+	cluster_receiver_list = senlinclient.v1.receiver:ListReceiver
+	cluster_receiver_show = senlinclient.v1.receiver:ShowReceiver
+	cluster_recover = senlinclient.v1.cluster:RecoverCluster
+	cluster_resize = senlinclient.v1.cluster:ResizeCluster
+	cluster_shrink = senlinclient.v1.cluster:ScaleInCluster
+	cluster_expand = senlinclient.v1.cluster:ScaleOutCluster
+	cluster_show = senlinclient.v1.cluster:ShowCluster
+	cluster_update = senlinclient.v1.cluster:UpdateCluster
+	cluster_collect = senlinclient.v1.cluster:ClusterCollect
+	cluster_run = senlinclient.v1.cluster:ClusterRun
+	cluster_service_list = senlinclient.v1.service:ListService
+	cluster_op = senlinclient.v1.cluster:ClusterOp
+
+[egg_info]
+tag_build = 
+tag_date = 0
 
-openstack.clustering.v1 =
-    cluster_action_list = senlinclient.v1.action:ListAction
-    cluster_action_show = senlinclient.v1.action:ShowAction
-    cluster_action_update = senlinclient.v1.action:UpdateAction
-    cluster_build_info = senlinclient.v1.build_info:BuildInfo
-    cluster_check = senlinclient.v1.cluster:CheckCluster
-    cluster_create = senlinclient.v1.cluster:CreateCluster
-    cluster_delete = senlinclient.v1.cluster:DeleteCluster
-    cluster_event_list = senlinclient.v1.event:ListEvent
-    cluster_event_show = senlinclient.v1.event:ShowEvent
-    cluster_list = senlinclient.v1.cluster:ListCluster
-    cluster_members_list = senlinclient.v1.cluster:ClusterNodeList
-    cluster_members_add = senlinclient.v1.cluster:ClusterNodeAdd
-    cluster_members_del = senlinclient.v1.cluster:ClusterNodeDel
-    cluster_members_replace = senlinclient.v1.cluster:ClusterNodeReplace
-    cluster_node_adopt = senlinclient.v1.node:AdoptNode
-    cluster_node_check = senlinclient.v1.node:CheckNode
-    cluster_node_create = senlinclient.v1.node:CreateNode
-    cluster_node_delete = senlinclient.v1.node:DeleteNode
-    cluster_node_list = senlinclient.v1.node:ListNode
-    cluster_node_recover = senlinclient.v1.node:RecoverNode
-    cluster_node_show = senlinclient.v1.node:ShowNode
-    cluster_node_update = senlinclient.v1.node:UpdateNode
-    cluster_node_op = senlinclient.v1.node:NodeOp
-    cluster_policy_attach = senlinclient.v1.cluster:ClusterPolicyAttach
-    cluster_policy_binding_list = senlinclient.v1.cluster_policy:ClusterPolicyList
-    cluster_policy_binding_show = senlinclient.v1.cluster_policy:ClusterPolicyShow
-    cluster_policy_binding_update = senlinclient.v1.cluster_policy:ClusterPolicyUpdate
-    cluster_policy_create = senlinclient.v1.policy:CreatePolicy
-    cluster_policy_delete = senlinclient.v1.policy:DeletePolicy
-    cluster_policy_detach = senlinclient.v1.cluster:ClusterPolicyDetach
-    cluster_policy_list = senlinclient.v1.policy:ListPolicy
-    cluster_policy_show = senlinclient.v1.policy:ShowPolicy
-    cluster_policy_validate = senlinclient.v1.policy:ValidatePolicy
-    cluster_policy_type_list = senlinclient.v1.policy_type:PolicyTypeList
-    cluster_policy_type_show = senlinclient.v1.policy_type:PolicyTypeShow
-    cluster_policy_update = senlinclient.v1.policy:UpdatePolicy
-    cluster_profile_create = senlinclient.v1.profile:CreateProfile
-    cluster_profile_delete = senlinclient.v1.profile:DeleteProfile
-    cluster_profile_list = senlinclient.v1.profile:ListProfile
-    cluster_profile_show = senlinclient.v1.profile:ShowProfile
-    cluster_profile_type_ops = senlinclient.v1.profile_type:ProfileTypeOperations
-    cluster_profile_type_list = senlinclient.v1.profile_type:ProfileTypeList
-    cluster_profile_type_show = senlinclient.v1.profile_type:ProfileTypeShow
-    cluster_profile_update = senlinclient.v1.profile:UpdateProfile
-    cluster_profile_validate = senlinclient.v1.profile:ValidateProfile
-    cluster_receiver_create = senlinclient.v1.receiver:CreateReceiver
-    cluster_receiver_update = senlinclient.v1.receiver:UpdateReceiver
-    cluster_receiver_delete = senlinclient.v1.receiver:DeleteReceiver
-    cluster_receiver_list = senlinclient.v1.receiver:ListReceiver
-    cluster_receiver_show = senlinclient.v1.receiver:ShowReceiver
-    cluster_recover = senlinclient.v1.cluster:RecoverCluster
-    cluster_resize = senlinclient.v1.cluster:ResizeCluster
-    cluster_shrink = senlinclient.v1.cluster:ScaleInCluster
-    cluster_expand = senlinclient.v1.cluster:ScaleOutCluster
-    cluster_show = senlinclient.v1.cluster:ShowCluster
-    cluster_update = senlinclient.v1.cluster:UpdateCluster
-    cluster_collect = senlinclient.v1.cluster:ClusterCollect
-    cluster_run = senlinclient.v1.cluster:ClusterRun
-    cluster_service_list = senlinclient.v1.service:ListService
-    cluster_op = senlinclient.v1.cluster:ClusterOp
diff -pruN 2.2.1-2/tox.ini 2.3.0-0ubuntu1/tox.ini
--- 2.2.1-2/tox.ini	2021-01-03 03:04:45.000000000 +0000
+++ 2.3.0-0ubuntu1/tox.ini	2021-08-02 09:39:50.000000000 +0000
@@ -11,7 +11,7 @@ setenv = VIRTUAL_ENV={envdir}
 usedevelop = True
 install_command = pip install {opts} {packages}
 deps =
-       -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
+       -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
        -r{toxinidir}/requirements.txt
        -r{toxinidir}/test-requirements.txt
 commands =
@@ -54,13 +54,13 @@ commands = oslo_debug_helper -t senlincl
 
 [testenv:docs]
 deps =
-  -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
+  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
   -r{toxinidir}/doc/requirements.txt
 commands = sphinx-build -W -b html doc/source doc/build/html
 
 [testenv:releasenotes]
 deps =
-  -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
+  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
   -r{toxinidir}/doc/requirements.txt
 commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html
 
