diff -pruN 5.0.1-1/AUTHORS 5.2.0-0ubuntu1/AUTHORS
--- 5.0.1-1/AUTHORS	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/AUTHORS	2022-02-18 15:38:36.000000000 +0000
@@ -0,0 +1,176 @@
+Ade Lee <alee@redhat.com>
+Alan Bishop <abishop@redhat.com>
+Alex Kavanagh <alex@ajkavanagh.co.uk>
+Alfredo Moralejo <amoralej@redhat.com>
+Andreas Jaeger <aj@suse.com>
+Andreas Scheuring <andreas.scheuring@de.ibm.com>
+Angus Lees <gus@inodes.org>
+Anish Bhatt <anish@chelsio.com>
+Anthony Lee <anthony.mic.lee@hpe.com>
+Arne Recknagel <arecknag@de.ibm.com>
+Arnon Yaari <arnony@infinidat.com>
+Aviram Bar-Haim <aviramb@mellanox.com>
+Avishay Traeger <avishay@stratoscale.com>
+Bertrand Lallau <bertrand.lallau@gmail.com>
+Brian Rosmaita <rosmaita.fossdev@gmail.com>
+Cao Xuan Hoang <hoangcx@vn.fujitsu.com>
+ChangBo Guo(gcb) <eric.guo@easystack.cn>
+Charles Short <chucks@redhat.com>
+Charles Short <zulcss@gmail.com>
+Chhavi Agarwal <chhagarw@in.ibm.com>
+Chris M <cinder@tristero.net>
+Chris MacNaughton <chris.macnaughton@canonical.com>
+Christopher Uhler <christopher.uhler@veritas.com>
+Chuck Short <chucks@redhat.com>
+Corey Bryant <corey.bryant@canonical.com>
+Daniel Pawlik <daniel.pawlik@corp.ovh.com>
+David Vallee Delisle <dvd@redhat.com>
+Dirk Mueller <dirk@dmllr.de>
+Dmitry Guryanov <dguryanov@parallels.com>
+Dmitry Guryanov <dguryanov@virtuozzo.com>
+Doug Hellmann <doug@doughellmann.com>
+Earle F. Philhower, III <earle.philhower.iii@hgst.com>
+Eric Harney <eharney@redhat.com>
+Eric Young <eric.young@emc.com>
+Erik Olof Gunnar Andersson <eandersson@blizzard.com>
+Flavio Percoco <flaper87@gmail.com>
+Ghanshyam Mann <gmann@ghanshyammann.com>
+Gorka Eguileor <geguileo@redhat.com>
+Hahyun <hfamily15@gmail.com>
+Hamdy Khader <hamdyk@mellanox.com>
+Hemna <waboring@hemna.com>
+Hervé Beraud <hberaud@redhat.com>
+Ivan Kolodyazhny <e0ne@e0ne.info>
+Ivan Pchelintsev <Ivan.Pchelintsev@dell.com>
+Jack Lu <renxlu@cisco.com>
+Jay S. Bryant <jsbryant@us.ibm.com>
+Ji-Wei <ji.wei3@zte.com.cn>
+John Griffith <john.griffith8@gmail.com>
+Jon Bernard <jobernar@redhat.com>
+Jordan Pittier <jordan.pittier@scality.com>
+Jose Porrua <jose.porrua@netapp.com>
+Keiichi KII <k-keiichi@bx.jp.nec.com>
+Kendall Nelson <kennelson11@gmail.com>
+Kendall Nelson <kjnelson@us.ibm.com>
+Lee Yarwood <lyarwood@redhat.com>
+Liang Fang <liang.a.fang@intel.com>
+Lior Friedman <lior.friedman@kioxia.com>
+LisaLi <xiaoyan.li@intel.com>
+Liu Qing <liuqing@chinac.com>
+Lucian Petrut <lpetrut@cloudbasesolutions.com>
+Luigi Toscano <ltoscano@redhat.com>
+Lukas Bezdicka <lbezdick@redhat.com>
+Luong Anh Tuan <tuanla@vn.fujitsu.com>
+Maciej Kucia <maciej@kucia.net>
+Matan Sabag <matan.sabag@emc.com>
+Mathieu Gagné <mgagne@iweb.com>
+Matt Riedemann <mriedem@us.ibm.com>
+Matthew Booth <mbooth@redhat.com>
+Michael Price <michael.price@netapp.com>
+Michal Dulko <michal.dulko@intel.com>
+Michał Dulko <michal.dulko@intel.com>
+Mike Durnosvystov <glacierr.dev@gmail.com>
+Mike Perez <thingee@gmail.com>
+Monty Taylor <mordred@inaugust.com>
+Muli Ben-Yehuda <muli@lightbitslabs.com>
+Naga Venkata <naga.b@hpe.com>
+Nate Potter <nathaniel.potter@intel.com>
+Ondřej Nový <ondrej.novy@firma.seznam.cz>
+OpenStack Release Bot <infra-root@openstack.org>
+Patricia Domingues <patricia@linux.vnet.ibm.com>
+Patrick East <patrick.east@purestorage.com>
+Pawel Kaminski <pawelx.kaminski@intel.com>
+Peter Penchev <openstack-dev@storpool.com>
+Peter Wang <peter.wang13@emc.com>
+Philipp Reisner <philipp.reisner@linbit.com>
+Rafael Folco <rfolco@br.ibm.com>
+Rajat Dhasmana <rajatdhasmana@gmail.com>
+Rawan Herzallah <rawanh@mellanox.com>
+Rikimaru Honjo <honjo.rikimaru@po.ntt-tx.co.jp>
+Rui Yuan Dou <rydou@fiberhome.com>
+Ryan Rossiter <rlrossit@us.ibm.com>
+Sahid Orentino Ferdjaoui <sahid.ferdjaoui@canonical.com>
+Sam Wan <sam.wan@emc.com>
+Sean McGinnis <sean.mcginnis@gmail.com>
+Sean McGinnis <sean.mcginnis@huawei.com>
+Sean McGinnis <sean_mcginnis@dell.com>
+Sergey Vilgelm <sergey@vilgelm.info>
+Shilpa Jagannath <smanjara@redhat.com>
+Silvan Kaiser <silvan@quobyte.com>
+Sofia Enriquez <lsofia.enriquez@gmail.com>
+Sophie Huang <sh879n@att.com>
+Stefan Amann <stefan.amann@de.ibm.com>
+Stephen Finucane <sfinucan@redhat.com>
+Swapnil Kulkarni (coolsvap) <me@coolsvap.net>
+Szczerbik, Przemyslaw <przemyslawx.szczerbik@intel.com>
+Takashi Kajinami <tkajinam@redhat.com>
+Tejdeep Kautharam <tejdeep.kautharam@intel.com>
+Thelo Gaultier <thelo.gaultier@gmail.com>
+Thomas Bechtold <tbechtold@suse.com>
+Tomoki Sekiyama <tomoki.sekiyama@hds.com>
+Tony Breeds <tony@bakeyournoodle.com>
+Tony Xu <hhktony@gmail.com>
+Tushar Trambak Gite <tushargite96@gmail.com>
+Van Hung Pham <hungpv@vn.fujitsu.com>
+Victor Stinner <vstinner@redhat.com>
+Vipin Balachandran <vbala@vmware.com>
+Vladislav Belogrudov <vladislav.belogrudov@dell.com>
+Vu Cong Tuan <tuanvc@vn.fujitsu.com>
+Walter A. Boring IV <waboring@hemna.com>
+Walter A. Boring IV <walter.boring@hp.com>
+Walter A. Boring IV <walter.boring@hpe.com>
+Xiaojun Liao <xiaojunliao85@gmail.com>
+Xing Yang <xing.yang@emc.com>
+Yandong Xuan <xuanyandong@inspur.com>
+Yingxin <yingxin.cheng@intel.com>
+Yong Huang <yong.huang@emc.com>
+Yury Kulazhenkov <yury.kulazhenkov@dell.com>
+Yusuke Hayashi <hayashi-yusuke@jp.fujitsu.com>
+Zhao Liqiang <zhaoliqiang@cmss.chinamobile.com>
+ZhijunWei <wzj334965317@outlook.com>
+Zohar Mamedov <zohar.cloud@gmail.com>
+ankitagrawal <ankit11.agrawal@nttdata.com>
+caixiaoyu <caixiaoyu@cmss.chinamobile.com>
+caoyuan <cao.yuan@99cloud.net>
+cheng <shcli@cn.ibm.com>
+cheng li <shcli@cn.ibm.com>
+dengzhaosen <dengzhaosen@inspur.com>
+digvijay2016 <digvijay.ukirde@in.ibm.com>
+felix23ma <maqi@cmss.chinamobile.com>
+fuzihao <fuzihao@inspur.com>
+haobing1 <hao.bing1@zte.com.cn>
+howardlee <lihongweibj@inspur.com>
+iain MacDonnell <iain.macdonnell@oracle.com>
+imacdonn <iain.macdonnell@oracle.com>
+jacky06 <zhang.min@99cloud.net>
+jeremy.zhang <zhangjun_inspur@163.com>
+jichenjc <jichenjc@cn.ibm.com>
+kangyufei <kangyf@inspur.com>
+lihaijing <lihaijing@fiberhome.com>
+lisali <xiaoyan.li@intel.com>
+liuyamin <liuyamin@fiberhome.com>
+melissaml <ma.lei@99cloud.net>
+olegnest <Oleg_Nesterenkov@Dell.com>
+pengyuesheng <pengyuesheng@gohighsec.com>
+qingszhao <zhao.daqing@99cloud.net>
+qiufossen <qiujunting@inspur.com>
+shenjiatong <yshxxsjt715@gmail.com>
+tushargite96 <tushargite96@gmail.com>
+wang yong <wangyong2017@inspur.com>
+wanghongxu <wang19930902@gmail.com>
+wangxiyuan <wangxiyuan@huawei.com>
+weiweigu <gu.weiwei@zte.com.cn>
+whoami-rajat <rajatdhasmana@gmail.com>
+xianming mao <xianming.mao@easystack.cn>
+xuanyandong <xuanyandong@inspur.com>
+yenai <yenai@cmss.chinamobile.com>
+yuval brave <yuval@lightbitslabs.com>
+yuyafei <yu.yafei@zte.com.cn>
+zengjia <zengjia@awcloud.com>
+zhangboye <zhangboye@inspur.com>
+zhangdaolong <zhangdaolong@fiberhome.com>
+zhanghongtao <zhanghongtao0826@126.com>
+zhangsong <zhangsong@cmss.chinamobile.com>
+zhangyanxian <zhang.yanxian@zte.com.cn>
+zhangyanxian <zhangyanxianmail@163.com>
+zhaoleilc <15247232416@163.com>
diff -pruN 5.0.1-1/ChangeLog 5.2.0-0ubuntu1/ChangeLog
--- 5.0.1-1/ChangeLog	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/ChangeLog	2022-02-18 15:38:36.000000000 +0000
@@ -0,0 +1,892 @@
+CHANGES
+=======
+
+5.2.0
+-----
+
+* Failure to generate hostnqn in case missing "show-hostnqn" sub-command
+* Add "known issues" note to yoga os-brick release
+* nvmeof connector check controller already connected
+* Update requirements minima for Yoga release
+* Updating python testing as per Yoga testing runtime
+* Lightos connector - refactor disconnect volume
+* Robust md creation/ending
+* Reuse get\_host\_nqn code
+* nvmeof connector utilize replica\_count
+* NVMeOF connector support multipath-enabled kernels
+* releasenotes: add Lightbits LightOS connector release note
+* Lightbits LightOS driver
+* Prevent CI from running on irrelevant files
+
+5.1.0
+-----
+
+* Use file locks in connectors
+* Update notes about hacking on os-brick
+* multipath/iscsi: iSCSI connections are not reinitiated after reboot
+* Fix paths for NVMe devices (non-nguid)
+* Fix PowerFlex connector HTTPS certificate validation
+* mypy: utils.py
+* mypy: exception.py
+* Add Python3 yoga unit tests
+* Update master for stable/xena
+
+5.0.0
+-----
+
+* Add support for multiple volumes within subsystem to NVMe-OF connector
+* rbd windows: log the device number
+* LVM: Retry lv calls on segfault due to lvs failure
+* Replace deprecated tenacity.Retrying.call
+* Update mypy infrastructure
+* Drop lower-constraints jobs
+* linuxscsi: Only raise and log multipathd errors when required
+* Remove skip\_missing\_interpreters
+* encryptors: Remove workaround for bug #1633518
+* NVMe-oF: Return right nqn when missing hostnqn
+
+4.4.0
+-----
+
+* Don't log error trace when nvme is not used
+* zuul: add mypy experimental job
+* trivial: correct comment
+* Introduce mypy
+* NVMe-oF: Flush on disconnect
+* Ussuri+ is python3 only
+* multipath/iscsi: remove devices from multipath monitoring
+* vmware: Use cookiejar from oslo.vmware client directly
+* setup.cfg: Replace dashes with underscores
+* Enable bandit runs for tox
+* iSCSI: Fix flushing after multipath cfg change
+* Add Python3 xena unit tests
+* Update master for stable/wallaby
+
+4.3.0
+-----
+
+* NVMeOF connector driver connection information compatibility fix
+* Update requirements for wallaby release
+* Move os-brick to new hacking 4.0.0
+* Avoid unhandled exceptions during connecting to iSCSI portals
+* Enforce import order with flake8-import-order
+* Fix import order of libraries
+* Remove six
+* Changed minversion in tox to 3.18.0
+* Dropping explicit unicode literal
+* ScaleIO: More connection info backward compatibility
+* Update TOX\_CONSTRAINTS\_FILE
+
+4.2.0
+-----
+
+* NVMeOF Connector support MDRAID replication
+* connector: Fix comment of get\_connector\_properties regarding enforce\_multipath
+* Add fixtures to test-reqs
+* opencas: Use BrickException instead of Exception
+* Update requirements
+* rbd Windows support
+* Replace deprecated UPPER\_CONSTRAINTS\_FILE variable
+* Improve error handling on target query
+* RBD: catch read exceptions prior to modifying offset
+
+4.1.0
+-----
+
+* Add timeout default to execute command
+* Replace md5 with oslo version
+* Revert "Keep barbican integration job running on Bionic"
+* FC: Fix not flushing on detach
+* Keep barbican integration job running on Bionic
+* Update the OSSN-0085 note
+* Stop configuring install\_command in tox
+* New fix for rbd connector to work with ceph octopus
+* Revert "Fix for rbd connector to work with ceph octopus"
+* Add Python3 wallaby unit tests
+* Update master for stable/victoria
+
+4.0.0
+-----
+
+* Fix for rbd connector to work with ceph octopus
+* Add volume local cache support to os-brick
+* Remove CORAID AOE connector
+* Add note about removed cinder feature
+* Fix pygments style
+* Add code coverage job
+* Add release note for scaleio connector upgrade
+* Fix a typo in the explanatory note
+* Leverage the iSCSI mpath to get the WWN
+* bindep: remind people to sync the dependencies with devstack
+* ScaleIO: Connection info backward compatibility
+* Remove DRBD connector
+* Remove Veritas Hyperscale connector
+* Remove the HGST connector
+* Remove the ITRI DISCO connector
+* prepend platform info to by-path string
+* RBD: Implement volume extension
+
+3.2.1
+-----
+
+* RBD: Fix check\_valid\_device
+* RBD: Support non OpenStack usage
+* Add TODO to switch to new style rbd commands
+* Replace sg\_scan with lsscsi to get '[H:C:T:L]'
+* rbd: Warn if ceph udev rules are not configured
+* Bump hacking to 3.1.0
+
+3.2.0
+-----
+
+* Switch from unittest2 compat methods to Python 3.x methods
+* Add doc linting to pep8 target
+* rbd: Support 'rbd showmapped' output from ceph 13.2.0+
+* Fix os-brick in virtual environments
+* Bump pycodestyle to 2.6.0
+* Update lower-constraints versions
+* Add iscsi-initiator-utils requirement
+
+3.1.0
+-----
+
+* Remove VxFlex OS credentials from connection\_properties
+* Stop to use the \_\_future\_\_ module
+* iSCSI detect multipath DM with no WWN
+* Improve WWN detection
+* Add dependencies to releasenotes environment
+* Switch to newer openstackdocstheme and reno versions
+* Fix hacking min version to 3.0.1
+* Remove translation sections from setup.cfg
+* rbd: Correct local\_attach disconnect test and showmapped arguments
+* Switch from retrying to tenacity
+* Add oslo.context dependency
+* Add oslo.serialization dependency
+* Fix import order per hacking guidelines
+* Remove Babel requirement
+* 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
+* Cleanup py27 support
+* Update master for stable/ussuri
+
+3.0.1
+-----
+
+* Add release note for ussuri cycle release
+* Add NFS tempest job to check queue
+* rbd: Use showmapped to find the root RBD device during disconnect\_volume
+* doc/source/conf.py is not executable
+* Ussuri contrib docs community goal
+
+3.0.0
+-----
+
+* connectors/nvme: Wait until nvme device shows up in kernel
+* Skip cryptsetup password quality checking
+* Drop requirements for unsupported python versions
+* Raise hacking version to 2.0.0
+* Read mounts from /proc/mounts instead of running mount
+* Remove Sheepdog connector
+* Port the os-bricks jobs to Zuul v3
+
+2.11.0
+------
+
+* StorPool: wait for the device to be resized
+* Remove Python 2.7 support from testing and gates
+* iscsi: Add \_get\_device\_link retry when waiting for /dev/disk/by-id/ to populate
+* StorPool: parse the output of \`blockdev\` correctly
+* Fix tox 'bindep' environment
+* Split connector list by platform
+* FC improve logging
+* Update FC connection\_properties examples
+* Fix FC scan too broad
+* nvmeof: Fix broken UTs
+* Remove VxFlexOS connector external dependencies
+* Switch to Ussuri jobs
+* Add linuxscsi get\_device\_info unit test
+* nvmeof: Use subnqn to disconnect a volume
+* Update the constraints url
+* Require oslo.privsep 1.32.0
+* Update master for stable/train
+* Blacklist eventlet 0.25.0
+* Change PDF file name
+
+2.10.0
+------
+
+* encryptors: Introduce support for LUKS2
+* Rename nvme to nvmeof
+* Add pdf documentation build in tox
+* Fix param in s390x platform
+* encryptors: Deprecate the CryptsetupEncryptor
+* Blacklist sphinx 2.1.0 (autodoc bug)
+* Fix bad argument to iscsiadm in iSCSI discovery
+* Bump the openstackdocstheme extension to 1.20
+* Delete redundant code
+* Sync Sphinx requirement
+
+2.9.1
+-----
+
+* luks: Explicitly use the luks1 type to ensure LUKS v1 is used
+* iSCSI single path: Don't fail if there's no WWN
+* Add Python 3 Train unit tests
+* Make NFS already mounted message debug level
+* Check path alive before get scsi wwn
+* linuxscsi: Stop waiting for multipath devices during extend\_volume
+* luks: Default to LUKS v1 when formatting volumes
+* FC: Ignore some HBAs from map for single WWNN
+
+2.9.0
+-----
+
+* Provide setting to ignore lvm descriptor leak warnings
+* Ignore pep8 W503/W504
+* Replace git.openstack.org URLs with opendev.org URLs
+* OpenDev Migration Patch
+* Add generate\_connector\_list
+* Fix invalid escape sequence warnings
+* Update master for stable/stein
+
+2.8.1
+-----
+
+* Fix ScaleIO KeyError after upgrade
+* Revert "rename ScaleIO connector to VxFlex OS"
+* Revert "Fix VxFlexOs KeyError after upgrade"
+* Revert "Verify WWN of connected iSCSI devices if passed"
+* Remove trailing newline character in UUID
+* Fix VxFlexOs KeyError after upgrade
+* Remove py35 from setup.cfg
+
+2.8.0
+-----
+
+* Drop py35 jobs
+* add python 3.7 unit test job
+* Fix get keyring content failed when ceph auth disabled
+* rename ScaleIO connector to VxFlex OS
+* Py3: Fix invalid escape sequencees
+* Fix FC case sensitive scanning
+* Make sure looping calls are properly mocked
+* Add slowest test output to end of test run
+* Handle None value 'inititator\_target\_map'
+* Don't warn on missing dmidecode
+* iSCSI: log exception if portals not found
+* VMware: Detach backing vmdk during disconnect
+* Verify WWN of connected iSCSI devices if passed
+* Add missing params in NoOpEncryptor
+* Update hacking version
+* Add retry to \`nvme connect\` in nvme connector
+
+2.7.0
+-----
+
+* Support RSD scenario of nvme connector
+* Remove time checks from test\_custom\_execute\_timeout\_\* tests
+* Fix create ceph conf failed when cephx disable
+* Tests: Fix PrivRootwrapTestCase failure
+* Change openstack-dev to openstack-discuss
+* Fix NFS "already mounted" detection
+* Windows SMBFS: fix using share subdirs
+
+2.6.2
+-----
+
+* removing older python version 3.4 from setup.cfg
+* Context manager to handle shared\_targets
+* Fix a spelling mistake
+* Fix a spelling mistake
+* Retry executing command "nvme list" when fail
+* Remove unused connection properties
+* Improve VolumePathsNotFound message details
+
+2.6.1
+-----
+
+* Add LIO barbican tests to .zuul.yaml
+* Succeed on iSCSI detach when path just went down
+* Remove meanless debug log
+
+2.6.0
+-----
+
+* 'iscsiadm -m session' failure handling
+* The validation of iscsi session should be case insensitive
+* Improve docstrings
+* Optimize FC device checking
+* Ignore volume disconnect if it is not connected
+* Fix spelling mistakes
+* Cleanup Zuul config file
+* add lib-forward-testing-python3 test job
+* add python 3.6 unit test job
+* switch documentation job to new PTI
+* import zuul job settings from project-config
+* Improve detection of multipathd running
+* Improve iSCSI device detection speed
+* Replace assertRaisesRegexp with assertRaisesRegex
+* Add staticmethod decorator in InitiatorConnector
+* Modify the verification in RBDConnector
+* Fix multipath disconnect with path failure
+* Tests: Add unit tests for nfs mount race
+* Update reno for stable/rocky
+
+2.5.3
+-----
+
+* FC Allow for multipath volumes with different LUNs
+* Windows SMBFS: avoid mounting local shares by default
+* Remove testrepository
+* RemoteFS: don't fail in do\_mount if already mounted
+* Add release note link in README
+
+2.5.2
+-----
+
+* Handle multiple errors in multipath -l parsing
+
+2.5.1
+-----
+
+* fix tox python3 overrides
+* Switch to using stestr
+* FC fix for scanning only connected HBA's
+
+2.5.0
+-----
+
+* Trivial: Update pypi url to new url
+* adding sheepdog connector for PPC64
+* Fix FC: Only scan connected HBAs
+* add lower-constraints job
+* Include "nqn." in subsystem name
+* add a getter for connector mapping
+* uncap eventlet
+* Fix bindep for multipath
+* Updated from global requirements
+
+2.4.0
+-----
+
+* Accept ISCSI\_ERR\_NO\_OBJS\_FOUND from iscsiadm
+* Incorporate the connection\_properties input for PPC64
+* Adding support to extend attached ScaleIO volumes
+* Windows iSCSI: ensure disks are claimed by MPIO
+* Updated from global requirements
+* Updated from global requirements
+* Updated from global requirements
+* Windows FC: fix disk scan issues
+* Enable hacking-extensions H204, H205
+* Updated from global requirements
+* Update reno for stable/queens
+* s390x fc: Fix device path for Ubuntu with ds8k
+
+2.3.0
+-----
+
+* adding iSER connector for PPC64
+* adding VERITAS\_HYPERSCALE connector for PPC64
+* Updated from global requirements
+* adding VZSTORAGE connector for PPC64
+* Updated from global requirements
+* Update supported transports for iscsi connector
+* Remove the unnecessary pv\_list assign during LVM object init
+
+2.2.0
+-----
+
+* Remove requirement on oslo.serialization
+* Cleanup test-requirements
+* Updated from global requirements
+* Windows SMBFS: allow mounting vhd/x images
+* Windows: fix connectors 'disconnect\_volume' signature
+* Avoid tox\_install.sh for constraints support
+* Recover node.startup values after discovering
+* Add the StorPool brick connector
+
+2.1.1
+-----
+
+* set vg\_thin\_pool\_size to float type
+* Fix a typographical error in a release notes entry
+
+2.1.0
+-----
+
+* Make close on cryptsetup volumes idempotent
+* Make close on luks volumes idempotent
+* Remove setting of version/release from releasenotes
+* Adding NVMEoF for initiator CLI
+* Updated from global requirements
+* Fixing FC scanning
+* Updated from global requirements
+* Always set ignoreskipactivation on snapshot creation
+
+2.0.0
+-----
+
+* Enable Python hash randomization for tests
+* Remove legacy connector constants
+* Add .stestr.conf configuration
+* Fix \_remove\_scsi\_symlinks\_no\_links test
+* Protect against race within os.path.realpath
+* rescan fails for hba missing target wwn
+* Updated from global requirements
+* Updated from global requirements
+* Fix vmware migrate available volume bug
+* FC PPC64 device discovery issue
+* Add attribute 'name' to class RBDVolume
+* Updated from global requirements
+* Updated from global requirements
+* Fix iSCSI volume attachment over RDMA transport
+* doc: Restructure docs for doc-migration
+* doc: Remove cruft from conf.py
+* doc: Switch from oslosphinx to openstackdocstheme
+* Update reno for stable/pike
+* Fix ISCSIConnector.\_get\_potential\_volume\_paths logic
+* FC connector logs number of attempts incorrectly
+* Enable some off-by-default checks
+* Update and replace http with https for doc links
+* Get the right portal from output of iscsiadm command
+* Update and optimize documentation links
+* Updated from global requirements
+* Add client connect exception unit test for rbd
+
+1.15.1
+------
+
+* Don't obscure logs on iSCSI sendtargets failure
+* Return WWN in multipath\_id
+* Return symlinks for encrypted volumes
+
+1.15.0
+------
+
+* Revert "Don't use ignoreskipactivation for thin LVM"
+* Don't use ignoreskipactivation for thin LVM
+* Fix iSCSI cleanup fix on discovery backends
+* Fix manual scan for discovery type backends
+* Fix ceph incremental backup fail
+* Updated from global requirements
+
+1.14.0
+------
+
+* iSCSI multipath: improve logging on connect
+* Fix iSCSI cleanup issue when using discovery
+* Updated from global requirements
+* Add open-iscsi manual scan support
+* Refactor iSCSI connect
+* Fix slow test\_connect\_volume\_device\_not\_valid test
+* Add libssl to bindep
+* Refactor iSCSI disconnect
+* Updated from global requirements
+* Force LUN\_ID to an int
+
+1.13.1
+------
+
+* Fix supported connectors for Power platform
+* Removed invalid comments in tox.ini [flake8]
+* Stop ignoring H904 hacking rule in tox
+* Stop ignoring H405 hacking rule in tox
+* Stop ignoring E265 pycodestyle rule in tox
+* Stop ignoring E123 and E125 pycodestyle rules
+* Update hacking version to align with Cinder
+* Fixed the veritas connector path
+* Change code to be more Pythonic
+
+1.13.0
+------
+
+* Return correct device path from Veritas connector
+* Prevent rbd map again if it's already mapped
+* Check host device alive before multipath id discovery
+* Updated from global requirements
+* Changed way of providing RBD keyring from keyring\_path to client token
+* encryptors: Delay removal of legacy provider names
+* Change log level on \_get\_hba\_channel\_scsi\_target
+* Veritas os-brick connector should use privsep
+* Adding support for FibreChannelConnector for PPC64
+* Updated from global requirements
+
+1.12.0
+------
+
+* Fixed generated temp file problem for RBD backend
+* Replace random uuid with fake uuid in unit tests
+* Updated from global requirements
+* Mask logging of connection info for iSCSI connector
+* Include identity information in rbd commands
+* os-brick connector for Veritas HyperScale
+* Move vzstorage related code out of RemoteFsClient
+* Updated from global requirements
+* RBD: consider a custom keyring in connection info
+* Add Ocata release notes page
+* Using assertIsNone(x) instead of assertEqual(None, x)
+* Remove log translations
+* Updated from global requirements
+* Fix iSCSI multipath rescan
+* Retry multipath flush when map is in use
+* Fix multipath flush when using friendly names
+* Fix unittest run on s390x host
+
+1.11.0
+------
+
+* Updated from global requirements
+* Encryptors: Fix compat with Nova encryptors for Ocata
+* Add Python 3.5 classifier and venv
+
+1.10.0
+------
+
+* Fix a wrong indentation
+* s390 FC device path fix for Ubuntu
+
+1.9.0
+-----
+
+* Updated from global requirements
+* encryptors: Introduce encryption provider constants
+* Add debug to tox environment
+* Windows connectors: add device\_scan\_interval arg
+* Add curl to bindep
+* Removes unnecessary utf-8 encoding
+* Replace assertDictMatch with assertDictEqual
+* Add Constraints support and missing bindep.txt dependencies
+* Move castellan to test-reqs
+* Fix import method to follow community guideline
+* Remove the duplicate calls to rescan
+* Code cleanup in initiator/linuxfc.py
+* Updated from global requirements
+* linuxfc: log path when HBA not found
+* RBD: ensure temporary config gets deleted
+* os-brick: Add bindep support
+* Show team and repo badges on README
+* Updated from global requirements
+* Add developer docs url in README.rst(trivial)
+* encryptors: Workaround mangled passphrases
+* encryptors: Mock os\_brick.executor correctly
+* RBD: enclose ipv6 addresses in square brackets
+* Updated from global requirements
+* Mask passwords in utils.trace for func params
+
+1.8.0
+-----
+
+* Updated from global requirements
+* Raise specific exception for an invalid protocol connector
+* Updated from global requirements
+* Multipath device keeps old size when extending volume
+* Updated from global requirements
+* Delete deprecated Hacking in tox.ini
+
+1.7.0
+-----
+
+* Delete  MANIFEST.in in os-brick
+* Drop py33 support
+* Windows remotefs: create mountpoints at the expected location
+* linuxrbd: remove obsolete comment on close()
+* Enable release notes translation
+* Detect if Fibre Channel support exists
+* Close connection to ceph after cinder bakcup
+* Updated from global requirements
+* Updated from global requirements
+* Replace 'assertTrue(a not in b)' with 'assertNotIn(a, b)'
+* s390x iscsi support enablement
+* Docstrings should not start with a space
+* Use assertEqual() instead of assertDictEqual()
+* Stop calling multipath -r when attaching/detaching iSCSI volumes
+* DISCO: Log init message as debug
+* Change warning to info logging for connected volume rescans
+* standardize release note page ordering
+* Mock time.sleep for test\_lv\_deactivate\_timeout test
+* Update reno for stable/newton
+* Change assertTrue(isinstance()) with optimal assert
+* Remove self.\_\_dict\_\_ for formatting strings
+* Create connector aliases to the new connectors refactor
+* TrivialFix: Remove logging import unused
+
+1.6.0
+-----
+
+* Fix cmd execution stderr, stdout unicode errors
+* Mask out passwords when tracing
+* RBD: Fix typo in rados timeout assignment
+* Fixes with customized ceph cluster name
+* Add retries to iSCSI connect\_volume
+* Add connector for GPFS volumes
+* Add missing %s in print message
+* Fix linuxrbd to work with Python 3
+* Add tracing unit tests
+* Wrong param makes exception message throws inaccurate
+* Fix the typo in the file
+* Add connector for vmdk volumes
+* Fix iSCSI discovery with ISER transport
+* RemoteFsClient extend Executor
+* Add Windows Fibre Channel connector
+* Add Windows SMBFS connector
+* Fix FC multipath cleanup
+* Fix weak test\_vzstorage\_with\_mds\_list
+* Fix the mocking mess
+* Fix FC multipath rescan
+* Update the home-page info with the developer documentation
+* Splitting Out Connectors from connector.py
+* Remove race condition from lvextend
+
+1.5.0
+-----
+
+* Updated from global requirements
+* Mock write and read operations to filesystem
+* Local attach feature in RBD connector
+* Remove useless info logging in check\_valid\_device
+* ScaleIO to get volume name from connection properties
+* Add ignore for . directories
+* Upgrade tox to 2.0
+* Add trace facility
+* Fix string interpolation to delayed to be handled by the logging code
+* Replace assertEqual(None, \*) with assertIsNone in tests
+* Fix wrong path used in iscsi "multipath -l"
+* Updated from global requirements
+* Remove unused LOG to keep code clean
+* Fix multipath iSCSI encrypted volume attach failure
+* Updated from global requirements
+* release note for windows iSCSI
+* Add Windows iSCSI connector
+* Make code line length less than 79 characters
+* Updated from global requirements
+* Replace ip with portal to express more accurately
+* Fix argument order for assertEqual to (expected, observed)
+* Add fast8 to quickly test pep8 changes
+* Make RBDImageMetadata and RBDVolumeIOWrapper re-usable
+
+1.4.0
+-----
+
+* Copy encryptors from Nova to os-brick
+* Disconnect multipath iscsi may logout session
+* Add support for processutils.execute
+* Updated from global requirements
+* Mock time.sleep in ISCSIConnectorTestCase
+* Updated from global requirements
+* Updated from global requirements
+* Updated from global requirements
+* Ensure that the base connector is platform independent
+* Updated from global requirements
+* os-brick refactor get\_connector\_properties
+* Handle exception case with only target\_portals
+* Retire ISERConnector from documentation
+* LVM: Create thin pool with 100%FREE
+* Fix coverage generation
+* Trivial rootwrap -> privsep replacement
+* Updated from global requirements
+* Updated from global requirements
+
+1.3.0
+-----
+
+* LVM: Call supports\_thin\_provisioning as static
+* Add pylint tox env
+* Don't use oslo-incubator stuff
+* Update reno for stable/mitaka
+* Replace \_get\_multipath\_device\_name with \_discover\_mpath\_device
+* Fixes get\_all\_available\_volumes return value
+* Updated from global requirements
+* Fix Scality SOFS support
+* Actually run the RemoteFSClient unit tests
+* Mock time.sleep() in 3 unit tests
+
+1.1.0
+-----
+
+* Fix setting the multipath\_id
+* Updated from global requirements
+* Add sheepdog support
+* Include multipath -ll output in failed to parse warning
+
+1.0.0
+-----
+
+* Fix iSCSI Multipath
+* Add missing release notes
+* Lun id's > 255 should be converted to hex
+* Updated from global requirements
+* Fix output returned from get\_all\_available\_volumes
+* Raise exception in find\_multipath\_device
+* Updated from global requirements
+* Remove multipath -l logic from ISCSI connector
+* Add vzstorage protocol for remotefs connections
+* Add reno for release notes management
+* Fix get\_device\_size with newlines
+* Updated from global requirements
+
+0.8.0
+-----
+
+* Add connector for ITRI DISCO cinder driver
+* os-brick add extend\_volume API
+* os-brick add cinder local\_dev lvm code
+* Revert "Use assertTrue/False instead of assertEqual(T/F)"
+* Fix another unit test failure
+* Use assertTrue/False instead of assertEqual(T/F)
+* Actually log the command used in \_run\_iscsiadm
+* Updated from global requirements
+* remove python 2.6 trove classifier
+
+0.7.0
+-----
+
+* DRBD connector class
+* Updated from global requirements
+* Deprecated tox -downloadcache option removed
+* ScaleIO could connect wrong volume to VM
+* Allow RBDClient to be used from a with-statement
+* Updated from global requirements
+* Remove brackets from portal
+* Minor documentation fixes for the method parameters
+
+0.6.0
+-----
+
+* Add requests to project requirements
+* Add quobyte protocol for remotefs connections
+* Correct a log message
+* Brick add param documentation to connectors
+* Updated from global requirements
+* Multipath Device Action Being Parsed as Name
+* Fix iopsLimit parameter in ScaleIO connector
+* Parse FCoE sysfs device paths
+* Add new Connector APIs for path validation
+* Updated from global requirements
+* Fix test\_connect\_volume when skip is bypassed
+* Fetch and return SCSI WWN
+* Update minimum tox version to 1.8
+* Updated from global requirements
+* Wait for FC multipath devices to become writable
+* Check RBDConnector.disconnect\_volume device\_info argument
+* Updated from global requirements
+* Fix silent iSCSI login failures
+* Change os-brick to use ostestr
+* Updated from global requirements
+* Fix iSCSI multipath cleanup
+* Removed use of deprecated LOG.warn
+* Fix typo in vgc-cluster command in rootwrap file
+
+0.5.0
+-----
+
+* Change ignore-errors to ignore\_errors
+* Updated from global requirements
+* Add fancy pypi version and download images
+* iSCSI fix misleading Log warning on connect fail
+* Fix missing value types for log message
+* Log a message when can’t find multipath device
+* Removed unused dependency: discover
+* Use 'device' instead of 'volume\_path'
+
+0.4.0
+-----
+
+* Add support for --interface option in iscsiadm
+* FC Stop calling multipath command line
+* Updated from global requirements
+* Add rootwrap filters
+* Handle FC LUN IDs greater 255 correctly on s390x architectures
+* Fix incorrect comments in FibreChannelConnector
+* Adding CHAP discovery logic to os-brick
+* Updated from global requirements
+* Remove the iSCSI rescan during disconnect
+* Remotefs: add ScalityFS support
+* Updated from global requirements
+* Updated from global requirements
+* Change SCSI device removal backoff rate
+* Changed connector protocols to use constants
+* Updated from global requirements
+* Fix race in check and access of /dev/disk/by-path/
+* Updated from global requirements
+
+0.3.2
+-----
+
+* remotefs: add virtuozzo storage support
+* Perform port\_rescan on s390x platforms
+* FC discover existing devices for removal
+
+0.3.1
+-----
+
+* Use pbr's automatically generated changelog
+
+0.3.0
+-----
+
+* Updated from global requirements
+* Updated from global requirements
+* Update changelog to 0.3.0 being latest
+* Fix mock==1.1.0 break unit tests
+* Cleanup Python 3 changes
+* Prep for 0.2.1 release
+* Add connector driver for the ScaleIO cinder driver
+* Added ABCMeta class to the InitiatorConnector
+* Remove unused oslo incubator files
+* update os-brick to pass python3 tests
+* Updated from global requirements
+* FC Eliminate the need to return devices list
+* Switch to oslo.service
+* Add RBD connector
+* Add HGST Solutions connector
+* Support host type specific block volume attachment
+* Updated from global requirements
+* optimize multipath call to identify IQN
+* Updated from global requirements
+* Trivial exception parameter name fix for Huawei
+* Fix connecting unnecessary iSCSI sessions issue
+* Fix disconnecting necessary iSCSI sessions issue
+* Add retry to iSCSI delete
+* Updated from global requirements
+* Add missing connectors to factory test
+* Fix local connector test case inheritance
+
+0.2.0
+-----
+
+* Allow overriding the host field
+* Assign the platform after declaration
+* Added a unit test for masking iscsiadm passwords
+* Preparing for the 0.1.1 release
+* ISCSI be careful parsing iscsiadm output
+* Updated from global requirements
+* Drop use of 'oslo' namespace package
+
+0.1.0
+-----
+
+* Update README to work with release tools
+* Brick: Fix race in removing iSCSI device
+* Update os-brick requirements
+* Mask passwords with iscsiadm commands
+* Sync latest \_i18n module for os\_brick
+* Use oslo\_log instead of openstack.common.log
+* Sync loopingcall from oslo-incubator for os-brick
+* Fix wrong command for \_rescan\_multipath
+* Fix multipath device discovery when UFN is enabled
+* Use six.text\_type instead of unicode
+* Fix missing translations for log messages
+* Remove error messages from multipath command output before parsing
+* Remove mocks after each unit test finished
+* Correct project name in .gitreview
+* Adjust os-brick to support FCP on System z systems
+* Use target\_portals/iqns/luns for alternative target information
+* Fix comments style according to Hacking rules
+* Update the documentation for os-brick
+* Failover to alternative iSCSI portals on login failure
+* Remove some unused exceptions from Cinder
+* Brick os-brick up to par with cinder brick
+* renamed the project to os-brick
+* Created the Brick library from Cinder
diff -pruN 5.0.1-1/debian/changelog 5.2.0-0ubuntu1/debian/changelog
--- 5.0.1-1/debian/changelog	2021-10-01 09:21:00.000000000 +0000
+++ 5.2.0-0ubuntu1/debian/changelog	2022-03-02 19:26:12.000000000 +0000
@@ -1,86 +1,112 @@
-python-os-brick (5.0.1-1) unstable; urgency=medium
+python-os-brick (5.2.0-0ubuntu1) jammy; urgency=medium
 
-  * New upstream release.
+  * New upstream release for OpenStack Yoga.
+  * d/control: Align (Build-)Depends with upstream.
 
- -- Thomas Goirand <zigo@debian.org>  Fri, 01 Oct 2021 11:21:00 +0200
+ -- Corey Bryant <corey.bryant@canonical.com>  Wed, 02 Mar 2022 14:26:12 -0500
 
-python-os-brick (5.0.0-2) unstable; urgency=medium
+python-os-brick (5.1.0-0ubuntu1) jammy; urgency=medium
 
-  * Uploading to unstable.
+  * New upstream release for OpenStack Yoga.
+  * d/control: Bump debhelper compat to 13.
 
- -- Thomas Goirand <zigo@debian.org>  Wed, 29 Sep 2021 10:55:40 +0200
+ -- Corey Bryant <corey.bryant@canonical.com>  Wed, 12 Jan 2022 14:30:09 -0500
 
-python-os-brick (5.0.0-1) experimental; urgency=medium
+python-os-brick (5.0.1-0ubuntu1) impish; urgency=medium
 
-  * New upstream release.
+  * New upstream release for OpenStack Xena.
 
- -- Thomas Goirand <zigo@debian.org>  Tue, 24 Aug 2021 10:19:30 +0200
+ -- Chris MacNaughton <chris.macnaughton@ubuntu.com>  Wed, 06 Oct 2021 13:26:37 +0000
 
-python-os-brick (4.3.1-2) unstable; urgency=medium
+python-os-brick (5.0.0-0ubuntu1) impish; urgency=medium
 
-  * Upload to unstable.
+  * New upstream release for OpenStack Xena.
+  * d/control: Align (Build-)Depends with upstream.
 
- -- Thomas Goirand <zigo@debian.org>  Mon, 16 Aug 2021 14:50:13 +0200
+ -- Corey Bryant <corey.bryant@canonical.com>  Tue, 07 Sep 2021 14:06:51 -0400
 
-python-os-brick (4.3.1-1) experimental; urgency=medium
+python-os-brick (4.4.0-0ubuntu1) impish; urgency=medium
 
-  * New upstream release.
+  * New upstream release for OpenStack Xena.
+  * d/control: Align (Build-)Depends with upstream.
 
- -- Thomas Goirand <zigo@debian.org>  Tue, 30 Mar 2021 11:57:15 +0200
+ -- Chris MacNaughton <chris.macnaughton@ubuntu.com>  Wed, 09 Jun 2021 07:39:09 +0000
 
-python-os-brick (4.3.0-1) experimental; urgency=medium
+python-os-brick (4.3.1-0ubuntu2) hirsute; urgency=medium
 
-  * New upstream release.
-  * Removed (build-)depends versions when satisfied in Bullseye.
-  * Fixed (build-)depends for this release.
+  * d/control: Drop python3-coverage min version as it is not required.
 
- -- Thomas Goirand <zigo@debian.org>  Mon, 08 Mar 2021 10:51:56 +0100
+ -- Corey Bryant <corey.bryant@canonical.com>  Mon, 12 Apr 2021 13:57:46 -0400
 
-python-os-brick (4.0.1-2) unstable; urgency=medium
+python-os-brick (4.3.1-0ubuntu1) hirsute; urgency=medium
 
-  * Uploading to unstable.
-  * Add a debian/salsa-ci.yml.
+  * New upstream release candidate for OpenStack Wallaby.
+  * d/control: Align (Build-)Depends with upstream.
 
- -- Thomas Goirand <zigo@debian.org>  Thu, 15 Oct 2020 13:26:05 +0200
+ -- Chris MacNaughton <chris.macnaughton@ubuntu.com>  Wed, 07 Apr 2021 09:11:55 +0000
 
-python-os-brick (4.0.1-1) experimental; urgency=medium
+python-os-brick (4.2.0-0ubuntu1) hirsute; urgency=medium
 
-  * New upstream release.
+  * New upstream release for OpenStack Wallaby.
+  * d/control: Align (Build-)Depends with upstream.
 
- -- Thomas Goirand <zigo@debian.org>  Sun, 13 Sep 2020 16:45:37 +0200
+ -- Chris MacNaughton <chris.macnaughton@ubuntu.com>  Tue, 09 Mar 2021 16:25:07 +0000
 
-python-os-brick (4.0.0-1) experimental; urgency=medium
+python-os-brick (4.1.0-0ubuntu1) hirsute; urgency=medium
 
-  * New upstream release.
-  * Fixed (build-)depends for this release.
+  * d/control: Update VCS paths for move to lp:~ubuntu-openstack-dev.
+  * New upstream release for OpenStack Wallaby.
 
- -- Thomas Goirand <zigo@debian.org>  Mon, 07 Sep 2020 16:00:37 +0200
+ -- Chris MacNaughton <chris.macnaughton@ubuntu.com>  Thu, 21 Jan 2021 14:59:42 +0000
 
-python-os-brick (3.1.0-1) unstable; urgency=medium
+python-os-brick (4.0.1-0ubuntu1) groovy; urgency=medium
 
-  * New upstream release.
-  * Added python3-tenacity to (build-)depends.
+  * New upstream release for OpenStack Victoria.
 
- -- Thomas Goirand <zigo@debian.org>  Thu, 11 Jun 2020 19:19:01 +0200
+ -- Corey Bryant <corey.bryant@canonical.com>  Fri, 11 Sep 2020 15:56:21 -0400
 
-python-os-brick (3.0.1-2) unstable; urgency=medium
+python-os-brick (3.2.1-0ubuntu1) groovy; urgency=medium
 
-  * Uploading to unstable.
+  * New upstream release for OpenStack Victoria.
+  * d/control: Align (Build-)Depends with upstream.
 
- -- Thomas Goirand <zigo@debian.org>  Fri, 08 May 2020 18:11:15 +0200
+ -- Chris MacNaughton <chris.macnaughton@canonical.com>  Thu, 03 Sep 2020 08:08:39 +0000
 
-python-os-brick (3.0.1-1) experimental; urgency=medium
+python-os-brick (3.1.0-0ubuntu1) groovy; urgency=medium
 
-  * New upstream release.
-  * Fixed (build-)depends for this release.
+  * New upstream release for OpenStack Victoria.
+  * d/control: Align (Build-)Depends with upstream.
+  * d/control: Bump Standards-Version to 4.5.0.
+  * d/control: Update debhelper-compat to 12.
+  * d/rules: Update to use pybuild.
+  * d/control: Restrict versions to Groovy.
 
- -- Thomas Goirand <zigo@debian.org>  Mon, 06 Apr 2020 22:22:00 +0200
+ -- Chris MacNaughton <chris.macnaughton@canonical.com>  Fri, 12 Jun 2020 10:24:34 +0000
 
-python-os-brick (2.10.2-1) unstable; urgency=medium
+python-os-brick (3.0.1-0ubuntu1) focal; urgency=medium
 
-  * New upstream point release.
+  * New upstream release for OpenStack Ussuri.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Thu, 09 Apr 2020 14:26:45 -0400
 
- -- Thomas Goirand <zigo@debian.org>  Thu, 26 Mar 2020 12:32:59 +0100
+python-os-brick (3.0.0-0ubuntu1) focal; urgency=medium
+
+  * New upstream release for OpenStack Ussuri.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Thu, 12 Mar 2020 10:10:00 -0400
+
+python-os-brick (2.11.0-0ubuntu1) focal; urgency=low
+
+  * Merge from Debian unstable.  Remaining changes:
+    - d/gbp.conf: Retain for pristine-tar.
+    - d/watch: Get tarball from tarballs.openstack.org.
+    - d/control: Enable autopkgtest-pkg-python testsuite.
+    - d/control: Drop BD's on python-* packages.
+  * d/p/removes-privacy-breach-in-docs.patch: Rebased.
+  * New upstream release for OpenStack Ussuri.
+  * d/control: Align (Build-)Depends with upstream.
+
+ -- Sahid Orentino Ferdjaoui <sahid.ferdjaoui@canonical.com>  Mon, 03 Feb 2020 10:26:01 +0000
 
 python-os-brick (2.10.0-2) unstable; urgency=medium
 
@@ -104,6 +130,33 @@ python-os-brick (2.10.0-1) experimental;
 
  -- Thomas Goirand <zigo@debian.org>  Wed, 18 Sep 2019 09:21:14 +0200
 
+python-os-brick (2.10.0-0ubuntu1) eoan; urgency=medium
+
+  * New upstream release for OpenStack Train.
+  * d/control: Align (Build-)Depends with upstream.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Wed, 25 Sep 2019 14:18:29 -0400
+
+python-os-brick (2.9.1-0ubuntu3) eoan; urgency=medium
+
+  * d/rules: Ensure sphinx is built with python3.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Fri, 16 Aug 2019 09:43:28 -0400
+
+python-os-brick (2.9.1-0ubuntu2) eoan; urgency=medium
+
+  * d/control: Ensure reno min version aligns with Train.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Thu, 15 Aug 2019 15:19:11 -0400
+
+python-os-brick (2.9.1-0ubuntu1) eoan; urgency=medium
+
+  * New upstream release for OpenStack Train.
+  * d/control: Align (Build-)Depends with upstream.
+  * d/p/removes-privacy-breach-in-docs.patch: Rebased.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Tue, 30 Jul 2019 15:34:31 -0400
+
 python-os-brick (2.8.1-2) unstable; urgency=medium
 
   * Uploading to unstable.
@@ -117,6 +170,39 @@ python-os-brick (2.8.1-1) experimental;
 
  -- Thomas Goirand <zigo@debian.org>  Tue, 26 Mar 2019 17:03:48 +0100
 
+python-os-brick (2.8.1-0ubuntu2) eoan; urgency=medium
+
+  * d/control: Drop BDI's on python-* packages.
+  * d/control: Drop python-os-brick binary package.
+  * d/rules: Tweak to stop build and install of Python 2 parts.
+
+ -- Sahid Orentino Ferdjaoui <sahid.ferdjaoui@canonical.com>  Thu, 11 Jul 2019 10:58:49 +0200
+
+python-os-brick (2.8.1-0ubuntu1) disco; urgency=medium
+
+  * New upstream point release for OpenStack Stein.
+
+ -- James Page <james.page@ubuntu.com>  Fri, 22 Mar 2019 14:10:23 +0000
+
+python-os-brick (2.8.0-0ubuntu1) disco; urgency=medium
+
+  * New upstream release for OpenStack Stein.
+
+ -- James Page <james.page@ubuntu.com>  Tue, 12 Mar 2019 09:39:48 +0000
+
+python-os-brick (2.7.0-0ubuntu1) disco; urgency=medium
+
+  * New upstream release for OpenStack Stein.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Wed, 30 Jan 2019 13:24:14 -0500
+
+python-os-brick (2.6.1-0ubuntu1) disco; urgency=medium
+
+  * New upstream release for OpenStack Stein.
+  * d/control: Align (Build-)Depends with upstream.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Tue, 20 Nov 2018 10:34:42 -0500
+
 python-os-brick (2.5.5-1) unstable; urgency=medium
 
   * New upstream point release.
@@ -151,6 +237,34 @@ python-os-brick (2.5.3-1) experimental;
 
  -- Thomas Goirand <zigo@debian.org>  Wed, 22 Aug 2018 16:57:59 +0200
 
+python-os-brick (2.5.3-0ubuntu1) cosmic; urgency=medium
+
+  * New upstream release for OpenStack Rocky.
+  * d/control: Align (Build-)Depends with upstream.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Thu, 02 Aug 2018 13:27:16 -0400
+
+python-os-brick (2.5.0-0ubuntu1) cosmic; urgency=medium
+
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+  * d/p/removes-privacy-breach-in-docs.patch: Rebased.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Tue, 12 Jun 2018 11:58:24 -0400
+
+python-os-brick (2.4.0-0ubuntu1) cosmic; urgency=medium
+
+  * Merged from Debian unstable.  Remaining changes:
+    - d/gbp.conf: Retain for pristine-tar.
+    - d/watch: Get tarball from tarballs.openstack.org.
+    - d/control: Enable autopkgtest-pkg-python testsuite.
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+  * d/control: Update Standards-Version to 4.1.4.
+  * d/watch: Use https URL.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Wed, 16 May 2018 17:26:40 -0400
+
 python-os-brick (2.3.0-3) unstable; urgency=medium
 
   * Blacklist 2 timeout tests which don't seem deterministic.
@@ -176,6 +290,24 @@ python-os-brick (2.3.0-1) experimental;
 
  -- Thomas Goirand <zigo@debian.org>  Wed, 14 Feb 2018 08:50:24 +0000
 
+python-os-brick (2.3.0-0ubuntu1) bionic; urgency=medium
+
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+
+ -- James Page <james.page@ubuntu.com>  Fri, 26 Jan 2018 11:29:48 +0000
+
+python-os-brick (2.1.1-0ubuntu1) bionic; urgency=medium
+
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+  * d/*: wrap-and-sort -bast.
+  * d/control: Bumped Standards-Version to 4.1.2.
+  * d/p/*: Refresh.
+  * d/test-blacklist.txt: Blacklist racey test on busy systems.
+
+ -- James Page <james.page@ubuntu.com>  Fri, 08 Dec 2017 21:18:30 +0000
+
 python-os-brick (1.15.3-2) unstable; urgency=medium
 
   * Uploading to unstable.
@@ -202,6 +334,108 @@ python-os-brick (1.15.3-1) experimental;
 
  -- Thomas Goirand <zigo@debian.org>  Sun, 08 Oct 2017 23:21:45 +0200
 
+python-os-brick (1.15.2-0ubuntu1) artful; urgency=medium
+
+  * d/watch: Get tarball from tarballs.openstack.org.
+  * New upstream release.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Wed, 16 Aug 2017 10:21:27 -0400
+
+python-os-brick (1.15.1-0ubuntu2) artful; urgency=medium
+
+  * d/control: Set min python-requests to 2.14.2.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Thu, 03 Aug 2017 16:19:07 -0400
+
+python-os-brick (1.15.1-0ubuntu1) artful; urgency=medium
+
+  * New upstream release.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Fri, 28 Jul 2017 12:25:03 -0400
+
+python-os-brick (1.13.1-0ubuntu1) artful; urgency=medium
+
+  * d/p/rbd-params.patch: Dropped, included upstream.
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+  * d/rules,test-blacklist.txt: Switch to using ostestr for unit test
+    execution, blacklist failing test under py3.
+
+ -- James Page <james.page@ubuntu.com>  Fri, 02 Jun 2017 09:26:25 +0100
+
+python-os-brick (1.12.0-0ubuntu1) artful; urgency=medium
+
+  * New upstream release.
+  * d/p/rbd-params.patch: Pick fix to ensure that cinder identity
+    information is used with rbd local attachment (LP: #1680072).
+  * d/p/*: Refresh.
+  * Align (Build-)Depends with upstream milestone.
+
+ -- James Page <james.page@ubuntu.com>  Thu, 27 Apr 2017 10:01:34 +0100
+
+python-os-brick (1.11.0-0ubuntu1) zesty; urgency=medium
+
+  * New upstream release. 
+  * debian/control: Bump version dependencies
+
+ -- Chuck Short <zulcss@ubuntu.com>  Wed, 25 Jan 2017 09:20:47 -0500
+
+python-os-brick (1.10.0-0ubuntu1) zesty; urgency=medium
+
+  *  New upstream release.
+
+ -- Chuck Short <zulcss@ubuntu.com>  Fri, 20 Jan 2017 09:53:50 -0500
+
+python-os-brick (1.9.0-0ubuntu1) zesty; urgency=medium
+
+  * New upstream version.
+  * debian/control: Bump version dependencies
+
+ -- Chuck Short <zulcss@ubuntu.com>  Wed, 18 Jan 2017 07:39:53 -0500
+
+python-os-brick (1.8.0-0ubuntu1) zesty; urgency=medium
+
+  * New upstream version. 
+  * debian/control: Bump version dependencies.
+
+ -- Chuck Short <zulcss@ubuntu.com>  Fri, 11 Nov 2016 08:42:54 -0500
+
+python-os-brick (1.7.0-0ubuntu2) zesty; urgency=medium
+
+  * debian/tests: Add autopkgtest 
+
+ -- Chuck Short <zulcss@ubuntu.com>  Thu, 03 Nov 2016 09:34:12 -0400
+
+python-os-brick (1.7.0-0ubuntu1) zesty; urgency=medium
+
+  [ Corey Bryant ]
+  * d/gbp.conf: Update gbp configuration file.
+  * d/control: Update Vcs-* links and maintainers.
+
+  [ Chuck Short ]
+  * New upstream version.
+  * debian/control: Bump version dependencies
+
+ -- Chuck Short <zulcss@ubuntu.com>  Tue, 01 Nov 2016 13:43:16 -0400
+
+python-os-brick (1.6.1-0ubuntu1) yakkety; urgency=medium
+
+  [ Corey Bryant ]
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+
+  [ Corey Bryant ]
+  * New upstream release.
+  * d/control: Align (Build-)Depends with upstream.
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Fri, 02 Sep 2016 10:00:32 -0400
+
+python-os-brick (1.3.0-1) experimental; urgency=medium
+
+  * New upstream release.
+
+ -- Thomas Goirand <zigo@debian.org>  Mon, 06 Jun 2016 14:38:19 +0000
+
 python-os-brick (1.2.0-4) unstable; urgency=medium
 
   * Really add open-iscsi to solve live migration issues.
@@ -289,3 +523,4 @@ python-os-brick (0.2.0-1) unstable; urge
   * Initial release (Closes: #789601).
 
  -- James Page <james.page@ubuntu.com>  Mon, 22 Jun 2015 14:29:41 +0100
+
diff -pruN 5.0.1-1/debian/control 5.2.0-0ubuntu1/debian/control
--- 5.0.1-1/debian/control	2021-10-01 09:21:00.000000000 +0000
+++ 5.2.0-0ubuntu1/debian/control	2022-03-02 19:26:12.000000000 +0000
@@ -1,49 +1,53 @@
 Source: python-os-brick
 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:
  James Page <james.page@ubuntu.com>,
  Thomas Goirand <zigo@debian.org>,
 Build-Depends:
- debhelper-compat (= 10),
+ debhelper-compat (= 13),
  dh-python,
  openstack-pkg-tools,
  python3-all,
- python3-pbr (>= 5.5.1),
+ python3-pbr (>= 5.8.0),
  python3-setuptools,
- python3-sphinx,
+ python3-sphinx (>= 3.5.1),
 Build-Depends-Indep:
- python3-babel,
- python3-castellan (>= 3.7.0),
- python3-coverage (>= 5.1),
- python3-ddt,
+ python3-babel (>= 2.3.4),
+ python3-castellan (>= 3.10.0),
+ python3-coverage,
+ python3-ddt (>= 1.4.1),
  python3-eventlet (>= 0.30.1),
  python3-hacking,
  python3-openstackdocstheme <!nodoc>,
- python3-os-win (>= 5.4.0),
- python3-oslo.concurrency (>= 4.4.0),
- python3-oslo.context,
- python3-oslo.i18n,
- python3-oslo.log,
- python3-oslo.privsep,
- python3-oslo.serialization (>= 4.1.0),
- python3-oslo.service (>= 2.5.0),
- python3-oslo.utils (>= 4.8.0),
- python3-oslo.vmware (>= 3.8.0),
+ python3-os-win (>= 5.5.0),
+ python3-oslo.concurrency (>= 4.5.0),
+ python3-oslo.context (>= 1:3.4.0),
+ python3-oslo.i18n (>= 5.1.0),
+ python3-oslo.log (>= 4.6.1),
+ python3-oslo.privsep (>= 2.6.2),
+ python3-oslo.serialization (>= 4.2.0),
+ python3-oslo.service (>= 2.8.0),
+ python3-oslo.utils (>= 4.12.1),
+ python3-oslo.vmware (>= 3.10.0),
  python3-oslotest <!nocheck>,
  python3-reno,
- python3-requests,
- python3-retrying,
- python3-stestr (>= 3.1.0) <!nocheck>,
+ python3-requests (>= 2.25.1),
+ python3-retrying (>= 1.2.3),
+ python3-sphinx-feature-classification (>= 1.1.0),
+ python3-sphinxcontrib.apidoc (>= 0.3.0),
+ python3-stestr <!nocheck>,
  python3-tenacity (>= 6.3.1),
  python3-testscenarios <!nocheck>,
  python3-testtools <!nocheck>,
  subunit,
-Standards-Version: 4.5.1
-Vcs-Browser: https://salsa.debian.org/openstack-team/libs/python-os-brick
-Vcs-Git: https://salsa.debian.org/openstack-team/libs/python-os-brick.git
+Standards-Version: 4.5.0
+Vcs-Browser: https://git.launchpad.net/~ubuntu-openstack-dev/ubuntu/+source/python-os-brick
+Vcs-Git: https://git.launchpad.net/~ubuntu-openstack-dev/ubuntu/+source/python-os-brick
 Homepage: https://github.com/openstack/os-brick
+Testsuite: autopkgtest-pkg-python
 
 Package: os-brick-common
 Architecture: all
@@ -77,20 +81,20 @@ Architecture: all
 Depends:
  open-iscsi,
  os-brick-common (= ${binary:Version}),
- python3-babel,
+ python3-babel (>= 2.3.4),
  python3-eventlet (>= 0.30.1),
- python3-os-win (>= 5.4.0),
- python3-oslo.concurrency (>= 4.4.0),
- python3-oslo.context,
- python3-oslo.i18n,
- python3-oslo.log,
- python3-oslo.privsep,
- python3-oslo.serialization (>= 4.1.0),
- python3-oslo.service (>= 2.5.0),
- python3-oslo.utils (>= 4.8.0),
- python3-pbr (>= 5.5.1),
- python3-requests,
- python3-retrying,
+ python3-os-win (>= 5.5.0),
+ python3-oslo.concurrency (>= 4.5.0),
+ python3-oslo.context (>= 1:3.4.0),
+ python3-oslo.i18n (>= 5.1.0),
+ python3-oslo.log (>= 4.6.1),
+ python3-oslo.privsep (>= 2.6.2),
+ python3-oslo.serialization (>= 4.2.0),
+ python3-oslo.service (>= 2.8.0),
+ python3-oslo.utils (>= 4.12.1),
+ python3-pbr (>= 5.8.0),
+ python3-requests (>= 2.25.1),
+ python3-retrying (>= 1.2.3),
  python3-tenacity (>= 6.3.1),
  ${misc:Depends},
  ${python3:Depends},
diff -pruN 5.0.1-1/debian/gbp.conf 5.2.0-0ubuntu1/debian/gbp.conf
--- 5.0.1-1/debian/gbp.conf	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/debian/gbp.conf	2022-03-02 19:26:12.000000000 +0000
@@ -0,0 +1,7 @@
+[DEFAULT]
+debian-branch = master
+upstream-tag = %(version)s
+pristine-tar = True
+
+[buildpackage]
+export-dir = ../build-area
diff -pruN 5.0.1-1/debian/patches/removes-privacy-breach-in-docs.patch 5.2.0-0ubuntu1/debian/patches/removes-privacy-breach-in-docs.patch
--- 5.0.1-1/debian/patches/removes-privacy-breach-in-docs.patch	2021-10-01 09:21:00.000000000 +0000
+++ 5.2.0-0ubuntu1/debian/patches/removes-privacy-breach-in-docs.patch	2022-03-02 19:26:12.000000000 +0000
@@ -3,12 +3,10 @@ Description: Removes privacy breach in d
  privacy breach. Let's patch this out!
 Author: Thomas Goirand <zigo@debian.org>
 Forwarded: no
-Last-Update: 2019-09-18
+Last-Update: 2018-08-22
 
-Index: python-os-brick/README.rst
-===================================================================
---- python-os-brick.orig/README.rst
-+++ python-os-brick/README.rst
+--- a/README.rst
++++ b/README.rst
 @@ -2,23 +2,12 @@
  Team and repository tags
  ========================
diff -pruN 5.0.1-1/debian/rules 5.2.0-0ubuntu1/debian/rules
--- 5.0.1-1/debian/rules	2021-10-01 09:21:00.000000000 +0000
+++ 5.2.0-0ubuntu1/debian/rules	2022-03-02 19:26:12.000000000 +0000
@@ -1,10 +1,12 @@
 #!/usr/bin/make -f
 
+export PYBUILD_NAME=os-brick
+
 UPSTREAM_GIT := https://github.com/openstack/os-brick.git
 include /usr/share/openstack-pkg-tools/pkgos.make
 
 %:
-	dh $@ --buildsystem=python_distutils --with python3,sphinxdoc
+	dh $@ --buildsystem=pybuild --with python3,sphinxdoc
 
 override_dh_auto_clean:
 	rm -rf build
@@ -25,5 +27,5 @@ endif
 override_dh_sphinxdoc:
 ifeq (,$(findstring nodoc, $(DEB_BUILD_OPTIONS)))
 	PYTHONPATH=. python3 -m sphinx -b html doc/source debian/python-os-brick-doc/usr/share/doc/python-os-brick-doc/html
-	dh_sphinxdoc -O--buildsystem=python_distutils
+	dh_sphinxdoc -O--buildsystem=pybuild
 endif
diff -pruN 5.0.1-1/debian/salsa-ci.yml 5.2.0-0ubuntu1/debian/salsa-ci.yml
--- 5.0.1-1/debian/salsa-ci.yml	2021-10-01 09:21:00.000000000 +0000
+++ 5.2.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 5.0.1-1/debian/watch 5.2.0-0ubuntu1/debian/watch
--- 5.0.1-1/debian/watch	2021-10-01 09:21:00.000000000 +0000
+++ 5.2.0-0ubuntu1/debian/watch	2022-03-02 19:26:12.000000000 +0000
@@ -1,3 +1,3 @@
 version=3
 opts="uversionmangle=s/\.(b|rc)/~$1/" \
-https://github.com/openstack/os-brick/tags .*/(\d[\d\.]+)\.tar\.gz
+    https://tarballs.openstack.org/os-brick/ os-brick-(\d.*)\.tar\.gz
diff -pruN 5.0.1-1/.gitignore 5.2.0-0ubuntu1/.gitignore
--- 5.0.1-1/.gitignore	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/.gitignore	1970-01-01 00:00:00.000000000 +0000
@@ -1,65 +0,0 @@
-*/.*
-!.coveragerc
-!.gitignore
-!.mailmap
-!.testr.conf
-!.zuul.yaml
-/.*
-
-*.py[cod]
-
-# C extensions
-*.so
-
-# Packages
-*.egg
-*.egg-info
-dist
-build
-eggs
-parts
-bin
-var
-sdist
-develop-eggs
-.installed.cfg
-lib
-lib64
-
-# Installer logs
-pip-log.txt
-
-# Unit test / coverage reports
-.coverage
-.tox
-.venv
-tools/lintstack.head.py
-tools/pylint_exceptions
-cover
-
-# Translations
-*.mo
-
-# Mr Developer
-.mr.developer.cfg
-.project
-.pydevproject
-
-# Complexity
-output/*.html
-output/*/index.html
-
-# Sphinx
-doc/build
-
-# Release notes
-releasenotes/build/
-
-# pbr generates these
-AUTHORS
-ChangeLog
-
-# Editors
-*~
-.*.swp
-.*sw?
diff -pruN 5.0.1-1/.gitreview 5.2.0-0ubuntu1/.gitreview
--- 5.0.1-1/.gitreview	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/.gitreview	1970-01-01 00:00:00.000000000 +0000
@@ -1,5 +0,0 @@
-[gerrit]
-host=review.opendev.org
-port=29418
-project=openstack/os-brick.git
-defaultbranch=stable/xena
diff -pruN 5.0.1-1/mypy-files.txt 5.2.0-0ubuntu1/mypy-files.txt
--- 5.0.1-1/mypy-files.txt	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/mypy-files.txt	2022-02-18 15:37:53.000000000 +0000
@@ -1,4 +1,7 @@
+os_brick/exception.py
 os_brick/executor.py
+os_brick/i18n.py
+os_brick/utils.py
 os_brick/initiator/linuxscsi.py
 os_brick/initiator/connectors/base.py
 os_brick/initiator/connectors/base_iscsi.py
diff -pruN 5.0.1-1/os_brick/exception.py 5.2.0-0ubuntu1/os_brick/exception.py
--- 5.0.1-1/os_brick/exception.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/exception.py	2022-02-18 15:37:53.000000000 +0000
@@ -15,6 +15,7 @@
 """Exceptions for the Brick library."""
 
 import traceback
+from typing import Iterable, List, Optional  # noqa: H301
 
 from oslo_concurrency import processutils as putils
 from oslo_log import log as logging
@@ -34,7 +35,7 @@ class BrickException(Exception):
     """
     message = _("An unknown exception occurred.")
     code = 500
-    headers = {}
+    headers: dict = {}
     safe = False
 
     def __init__(self, message=None, **kwargs):
@@ -183,8 +184,9 @@ class ExceptionChainer(BrickException):
     logged with warning level.
     """
     def __init__(self, *args, **kwargs):
-        self._exceptions = []
-        self._repr = None
+        self._exceptions: List[tuple] = []
+        self._repr: Optional[str] = None
+        self._exc_msg_args = []
         super(ExceptionChainer, self).__init__(*args, **kwargs)
 
     def __repr__(self):
@@ -199,21 +201,24 @@ class ExceptionChainer(BrickException):
 
     __str__ = __repr__
 
-    def __nonzero__(self):
+    def __nonzero__(self) -> bool:
         # We want to be able to do boolean checks on the exception
         return bool(self._exceptions)
 
     __bool__ = __nonzero__  # For Python 3
 
-    def add_exception(self, exc_type, exc_val, exc_tb):
+    def add_exception(self, exc_type, exc_val, exc_tb) -> None:
         # Clear the representation cache
         self._repr = None
         self._exceptions.append((exc_type, exc_val, exc_tb))
 
-    def context(self, catch_exception, msg='', *msg_args):
+    def context(self,
+                catch_exception: bool,
+                msg: str = '',
+                *msg_args: Iterable):
         self._catch_exception = catch_exception
         self._exc_msg = msg
-        self._exc_msg_args = msg_args
+        self._exc_msg_args = list(msg_args)
         return self
 
     def __enter__(self):
diff -pruN 5.0.1-1/os_brick/initiator/connector.py 5.2.0-0ubuntu1/os_brick/initiator/connector.py
--- 5.0.1-1/os_brick/initiator/connector.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/initiator/connector.py	2022-02-18 15:37:53.000000000 +0000
@@ -64,6 +64,7 @@ unix_connector_list = [
     'os_brick.initiator.connectors.vmware.VmdkConnector',
     'os_brick.initiator.connectors.storpool.StorPoolConnector',
     'os_brick.initiator.connectors.nvmeof.NVMeOFConnector',
+    'os_brick.initiator.connectors.lightos.LightOSConnector',
 ]
 
 
@@ -114,6 +115,8 @@ _connector_mapping_linux = {
         'os_brick.initiator.connectors.nvmeof.NVMeOFConnector',
     initiator.NVMEOF:
         'os_brick.initiator.connectors.nvmeof.NVMeOFConnector',
+    initiator.LIGHTOS:
+        'os_brick.initiator.connectors.lightos.LightOSConnector',
 }
 
 # Mapping for the S390X platform
diff -pruN 5.0.1-1/os_brick/initiator/connectors/fibre_channel.py 5.2.0-0ubuntu1/os_brick/initiator/connectors/fibre_channel.py
--- 5.0.1-1/os_brick/initiator/connectors/fibre_channel.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/initiator/connectors/fibre_channel.py	2022-02-18 15:37:53.000000000 +0000
@@ -168,7 +168,7 @@ class FibreChannelConnector(base.BaseLin
         return volume_paths
 
     @utils.trace
-    @synchronized('extend_volume')
+    @synchronized('extend_volume', external=True)
     def extend_volume(self, connection_properties):
         """Update the local kernel's size information.
 
@@ -189,7 +189,7 @@ class FibreChannelConnector(base.BaseLin
             raise exception.VolumePathsNotFound()
 
     @utils.trace
-    @synchronized('connect_volume')
+    @synchronized('connect_volume', external=True)
     def connect_volume(self, connection_properties):
         """Attach the volume to instance_name.
 
@@ -314,7 +314,7 @@ class FibreChannelConnector(base.BaseLin
         return raw_devices
 
     @utils.trace
-    @synchronized('connect_volume')
+    @synchronized('connect_volume', external=True)
     def disconnect_volume(self, connection_properties, device_info,
                           force=False, ignore_errors=False):
         """Detach the volume from instance_name.
diff -pruN 5.0.1-1/os_brick/initiator/connectors/huawei.py 5.2.0-0ubuntu1/os_brick/initiator/connectors/huawei.py
--- 5.0.1-1/os_brick/initiator/connectors/huawei.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/initiator/connectors/huawei.py	2022-02-18 15:37:53.000000000 +0000
@@ -85,7 +85,7 @@ class HuaweiStorHyperConnector(base.Base
         return out['dev_addr']
 
     @utils.trace
-    @synchronized('connect_volume')
+    @synchronized('connect_volume', external=True)
     def connect_volume(self, connection_properties):
         """Connect to a volume.
 
@@ -116,7 +116,7 @@ class HuaweiStorHyperConnector(base.Base
         return device_info
 
     @utils.trace
-    @synchronized('connect_volume')
+    @synchronized('connect_volume', external=True)
     def disconnect_volume(self, connection_properties, device_info,
                           force=False, ignore_errors=False):
         """Disconnect a volume from the local host.
diff -pruN 5.0.1-1/os_brick/initiator/connectors/iscsi.py 5.2.0-0ubuntu1/os_brick/initiator/connectors/iscsi.py
--- 5.0.1-1/os_brick/initiator/connectors/iscsi.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/initiator/connectors/iscsi.py	2022-02-18 15:37:53.000000000 +0000
@@ -474,7 +474,7 @@ class ISCSIConnector(base.BaseLinuxConne
             root_helper=self._root_helper)
 
     @utils.trace
-    @synchronized('extend_volume')
+    @synchronized('extend_volume', external=True)
     def extend_volume(self, connection_properties: dict):
         """Update the local kernel's size information.
 
@@ -497,18 +497,10 @@ class ISCSIConnector(base.BaseLinuxConne
             raise exception.VolumePathsNotFound()
 
     @utils.trace
-    @synchronized('connect_volume')
+    @synchronized('connect_volume', external=True)
     def connect_volume(self, connection_properties: dict):
         """Attach the volume to instance_name.
 
-        NOTE: Will retry up to three times to handle the case where c-vol
-        and n-cpu are both using os-brick to manage iSCSI sessions but they
-        are on the same node and using different locking directories. In this
-        case, even though this call is synchronized, they will be separate
-        locks and can still overlap with connect and disconnect. Since a
-        disconnect during an initial attach can't cause IO failure (the device
-        has not been made available yet), we just try the connection again.
-
         :param connection_properties: The valid dictionary that describes all
                                       of the target volume attributes.
         :type connection_properties: dict
@@ -870,7 +862,7 @@ class ISCSIConnector(base.BaseLinuxConne
         return device_map
 
     @utils.trace
-    @synchronized('connect_volume')
+    @synchronized('connect_volume', external=True)
     def disconnect_volume(self, connection_properties, device_info,
                           force=False, ignore_errors=False):
         """Detach the volume from instance_name.
@@ -1051,6 +1043,17 @@ class ISCSIConnector(base.BaseLinuxConne
         return ips, iqns
 
     def _connect_to_iscsi_portal(self, connection_properties):
+        """Safely connect to iSCSI portal-target and return the session id."""
+        portal = connection_properties['target_portal'].split(",")[0]
+        target_iqn = connection_properties['target_iqn']
+
+        lock_name = f'connect_to_iscsi_portal-{portal}-{target_iqn}'
+        method = synchronized(
+            lock_name, external=True)(self._connect_to_iscsi_portal_unsafe)
+        return method(connection_properties)
+
+    @utils.retry((exception.BrickException))
+    def _connect_to_iscsi_portal_unsafe(self, connection_properties):
         """Connect to an iSCSI portal-target an return the session id."""
         portal = connection_properties['target_portal'].split(",")[0]
         target_iqn = connection_properties['target_iqn']
@@ -1066,9 +1069,17 @@ class ISCSIConnector(base.BaseLinuxConne
         out, err = self._run_iscsiadm(connection_properties, (),
                                       check_exit_code=(0, 21, 255))
         if err:
-            self._run_iscsiadm(connection_properties,
-                               ('--interface', self._get_transport(),
-                                '--op', 'new'))
+            out_new, err_new = self._run_iscsiadm(connection_properties,
+                                                  ('--interface',
+                                                   self._get_transport(),
+                                                   '--op', 'new'),
+                                                  check_exit_code=(0, 6))
+            if err_new:
+                # retry if iscsiadm returns 6 for "database failure"
+                LOG.debug("Retrying to connect to iSCSI portal %s", portal)
+                msg = (_("Encountered database failure for %s.") % (portal))
+                raise exception.BrickException(msg=msg)
+
         # Try to set the scan mode to manual
         res = self._iscsiadm_update(connection_properties,
                                     'node.session.scan', 'manual',
diff -pruN 5.0.1-1/os_brick/initiator/connectors/lightos.py 5.2.0-0ubuntu1/os_brick/initiator/connectors/lightos.py
--- 5.0.1-1/os_brick/initiator/connectors/lightos.py	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/initiator/connectors/lightos.py	2022-02-18 15:37:53.000000000 +0000
@@ -0,0 +1,340 @@
+# Copyright (C) 2016-2022 Lightbits Labs Ltd.
+# Copyright (C) 2020 Intel Corporation
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import glob
+import http.client
+import os
+import re
+import tempfile
+import time
+import traceback
+
+from oslo_concurrency import lockutils
+from oslo_concurrency import processutils as putils
+from oslo_log import log as logging
+
+from os_brick import exception
+from os_brick.i18n import _
+from os_brick.initiator.connectors import base
+from os_brick.privileged import lightos as priv_lightos
+from os_brick import utils
+
+
+DEVICE_SCAN_ATTEMPTS_DEFAULT = 5
+DISCOVERY_CLIENT_PORT = 6060
+LOG = logging.getLogger(__name__)
+
+synchronized = lockutils.synchronized_with_prefix('os-brick-')
+nvmec_pattern = ".*nvme[0-9]+[cp][0-9]+.*"
+nvmec_match = re.compile(nvmec_pattern)
+
+
+class LightOSConnector(base.BaseLinuxConnector):
+    """Connector class to attach/detach LightOS volumes using NVMe/TCP."""
+
+    WAIT_DEVICE_TIMEOUT = 60
+
+    def __init__(self,
+                 root_helper,
+                 driver=None,
+                 execute=None,
+                 device_scan_attempts=DEVICE_SCAN_ATTEMPTS_DEFAULT,
+                 message_queue=None,
+                 *args,
+                 **kwargs):
+        super(LightOSConnector, self).__init__(
+            root_helper,
+            driver=driver,
+            execute=execute,
+            device_scan_attempts=device_scan_attempts,
+            *args, **kwargs)
+        self.message_queue = message_queue
+        self.DISCOVERY_DIR_PATH = '/etc/discovery-client/discovery.d/'
+
+    @staticmethod
+    def get_connector_properties(root_helper, *args, **kwargs):
+        """The LightOS connector properties."""
+        props = {}
+        lightos_connector = LightOSConnector(root_helper=root_helper,
+                                             message_queue=None,
+                                             execute=kwargs.get('execute'))
+        hostnqn = utils.get_host_nqn()
+        found_dsc = lightos_connector.find_dsc()
+
+        if not found_dsc:
+            LOG.debug('LIGHTOS: did not find dsc, continuing anyway.')
+
+        if hostnqn:
+            LOG.debug("LIGHTOS: finally hostnqn: %s dsc: %s",
+                      hostnqn, found_dsc)
+            props['nqn'] = hostnqn
+            props['found_dsc'] = found_dsc
+        else:
+            LOG.debug('LIGHTOS: no hostnqn found.')
+
+        return props
+
+    def dsc_file_name(self, uuid):
+        return os.path.join(self.DISCOVERY_DIR_PATH, "%s.conf" % uuid)
+
+    def find_dsc(self):
+        conn = http.client.HTTPConnection("localhost", DISCOVERY_CLIENT_PORT)
+        try:
+            conn.request("HEAD", "/metrics")
+            resp = conn.getresponse()
+            return 'found' if resp.status == http.client.OK else ''
+        except Exception as e:
+            LOG.debug(f'LIGHTOS: {e}')
+            out = ''
+        return out
+
+    def dsc_need_connect(self, connection_info):
+        return not os.path.isfile(self.dsc_file_name(connection_info['uuid']))
+
+    def dsc_connect_volume(self, connection_info):
+        if not self.dsc_need_connect(connection_info):
+            return
+
+        subsysnqn = connection_info['subsysnqn']
+        uuid = connection_info['uuid']
+        hostnqn = utils.get_host_nqn()
+        with tempfile.NamedTemporaryFile(mode='w', delete=False) as dscfile:
+            dscfile.write('# os_brick connector dsc file for LightOS'
+                          ' volume: {}\n'.format(uuid))
+            for (ip, node) in connection_info['lightos_nodes'].items():
+                transport = node['transport_type']
+                host = node['target_portal']
+                port = node['target_port']
+                dscfile.write('-t {} -a {} -s {} -q {} -n {}\n'.format(
+                    transport, host, port, hostnqn, subsysnqn))
+            dscfile.flush()
+            try:
+                dest_name = self.dsc_file_name(uuid)
+                priv_lightos.move_dsc_file(dscfile.name, dest_name)
+            except Exception:
+                LOG.warning(
+                    "LIGHTOS: Failed to create dsc file for connection with"
+                    f" uuid:{uuid}")
+                raise
+
+    def dsc_disconnect_volume(self, connection_info):
+        uuid = connection_info['uuid']
+        try:
+            priv_lightos.delete_dsc_file(self.dsc_file_name(uuid))
+        except Exception:
+            LOG.warning("LIGHTOS: Failed delete dsc file uuid:{}".format(uuid))
+            raise
+
+    def monitor_db(self, lightos_db):
+        for connection_info in lightos_db.values():
+            self.dsc_connect_volume(connection_info)
+
+    def monitor_message_queue(self, message_queue, lightos_db):
+        while not message_queue.empty():
+            msg = message_queue.get()
+            op, connection = msg
+            LOG.debug("LIGHTOS: queue got op: %s, connection: %s",
+                      op, connection)
+            if op == 'delete':
+                LOG.info("LIGHTOS: Removing volume: %s from db",
+                         connection['uuid'])
+                if connection['uuid'] in lightos_db:
+                    del lightos_db[connection['uuid']]
+                else:
+                    LOG.warning("LIGHTOS: No volume: %s found in db",
+                                connection['uuid'])
+            elif op == 'add':
+                LOG.info("LIGHTOS: Adding volume: %s to db",
+                         connection['uuid'])
+                lightos_db[connection['uuid']] = connection
+
+    def lightos_monitor(self, lightos_db, message_queue):
+        '''Bookkeeping lightos connections.
+
+        This is useful when the connector is comming up to a running node with
+        connected volumes already exists.
+        This is used in the Nova driver to restore connections after reboot
+        '''
+        first_time = True
+        while True:
+            self.monitor_db(lightos_db)
+            # give us some time before trying to access the MQ
+            # for the first time
+            if first_time:
+                time.sleep(5)
+                first_time = False
+            else:
+                time.sleep(1)
+
+            self.monitor_message_queue(message_queue, lightos_db)
+
+    # This is part of our abstract interface
+    def get_search_path(self):
+        return '/dev'
+
+    # This is part of our abstract interface
+    def get_volume_paths(self, connection_properties):
+        path = connection_properties['device_path']
+        return [path]
+
+    def _check_device_exists_using_dev_lnk(self, uuid):
+        lnk_path = f"/dev/disk/by-id/nvme-uuid.{uuid}"
+        if os.path.exists(lnk_path):
+            devname = os.path.realpath(lnk_path)
+            if devname.startswith("/dev/nvme"):
+                LOG.info("LIGHTOS: devpath %s detected for uuid %s",
+                         devname, uuid)
+                return devname
+        return None
+
+    def _check_device_exists_reading_block_class(self, uuid):
+        file_path = "/sys/class/block/*/wwid"
+        wwid = "uuid." + uuid
+        for match_path in glob.glob(file_path):
+            try:
+                with open(match_path, "r") as f:
+                    match_wwid = f.readline()
+            except Exception:
+                LOG.warning("LIGHTOS: Failed to read file %s",
+                            match_path)
+                continue
+
+            if wwid != match_wwid.strip():
+                continue
+
+            # skip slave nvme devices, for example: nvme0c0n1
+            if nvmec_match.match(match_path.split("/")[-2]):
+                continue
+
+            LOG.info("LIGHTOS: matching uuid %s was found"
+                     " for device path %s", uuid, match_path)
+            return os.path.join("/dev", match_path.split("/")[-2])
+        return None
+
+    @utils.trace
+    def _get_device_by_uuid(self, uuid):
+        endtime = time.time() + self.WAIT_DEVICE_TIMEOUT
+        while time.time() < endtime:
+            try:
+                device = self._check_device_exists_using_dev_lnk(uuid)
+                if device:
+                    return device
+            except Exception as e:
+                LOG.debug(f'LIGHTOS: {e}')
+            device = self._check_device_exists_reading_block_class(uuid)
+            if device:
+                return device
+
+            time.sleep(1)
+        return None
+
+    def _get_size_by_uuid(self, uuid):
+        devpath = self._get_device_by_uuid(uuid)
+        devname = devpath.split("/")[-1]
+        try:
+            size_path_name = os.path.join("/sys/class/block/", devname, "size")
+            with open(size_path_name, "r") as f:
+                size_blks = f.read().strip()
+            bytesize = int(size_blks) * 512
+            return bytesize
+        except Exception:
+            LOG.warning("LIGHTOS: Could not find the size at for"
+                        " uuid %s in %s", uuid, devpath)
+            return None
+
+    @utils.trace
+    @synchronized('volume_op')
+    def connect_volume(self, connection_properties):
+        """Discover and attach the volume.
+
+        :param connection_properties: The dictionary that describes all
+                                      of the target volume attributes.
+               connection_properties must include:
+               nqn - NVMe subsystem name to the volume to be connected
+               target_port - NVMe target port that hosts the nqn sybsystem
+               target_portal - NVMe target ip that hosts the nqn sybsystem
+        :type connection_properties: dict
+        :returns: dict
+        """
+        device_info = {'type': 'block'}
+        uuid = connection_properties['uuid']
+        LOG.info("LIGHTOS: connect_volume called for volume %s, connection"
+                 " properties: %s",
+                 uuid, connection_properties)
+        self.dsc_connect_volume(connection_properties)
+
+        device_path = self._get_device_by_uuid(uuid)
+        if not device_path:
+            msg = _("Device with uuid %s did not show up" % uuid)
+            priv_lightos.delete_dsc_file(self.dsc_file_name(uuid))
+            raise exception.BrickException(message=msg)
+
+        device_info['path'] = device_path
+
+        # bookkeeping lightos connections - add connection
+        if self.message_queue:
+            self.message_queue.put(('add', connection_properties))
+
+        return device_info
+
+    @utils.trace
+    @synchronized('volume_op')
+    def disconnect_volume(self, connection_properties, device_info,
+                          force=False, ignore_errors=False):
+        """Disconnect a volume from the local host.
+
+        The connection_properties are the same as from connect_volume.
+        The device_info is returned from connect_volume.
+        :param connection_properties: The dictionary that describes all
+                                      of the target volume attributes.
+        :type connection_properties: dict
+        :param device_info: historical difference, but same as connection_props
+        :type device_info: dict
+        :param force: Whether to forcefully disconnect even if flush fails.
+        :type force: bool
+        :param ignore_errors: When force is True, this will decide whether to
+                              ignore errors or raise an exception once finished
+                              the operation.  Default is False.
+        :type ignore_errors: bool
+        """
+        # bookkeeping lightos connections - delete connection
+        if self.message_queue:
+            self.message_queue.put(('delete', connection_properties))
+        uuid = connection_properties['uuid']
+        LOG.debug('LIGHTOS: disconnect_volume called for volume %s', uuid)
+        device_path = self._get_device_by_uuid(uuid)
+        exc = exception.ExceptionChainer()
+        try:
+            if device_path:
+                self._linuxscsi.flush_device_io(device_path)
+        except putils.ProcessExecutionError as e:
+            exc.add_exception(type(e), e, traceback.format_exc())
+            if not (force or ignore_errors):
+                raise
+        try:
+            self.dsc_disconnect_volume(connection_properties)
+        except Exception as e:
+            exc.add_exception(type(e), e, traceback.format_exc())
+        if exc:
+            if not ignore_errors:
+                raise exc
+
+    @utils.trace
+    @synchronized('volume_op')
+    def extend_volume(self, connection_properties):
+        uuid = connection_properties['uuid']
+        new_size = self._get_size_by_uuid(uuid)
+        return new_size
diff -pruN 5.0.1-1/os_brick/initiator/connectors/nvmeof.py 5.2.0-0ubuntu1/os_brick/initiator/connectors/nvmeof.py
--- 5.0.1-1/os_brick/initiator/connectors/nvmeof.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/initiator/connectors/nvmeof.py	2022-02-18 15:37:53.000000000 +0000
@@ -28,7 +28,6 @@ try:
     from os_brick.initiator.connectors import nvmeof_agent
 except ImportError:
     nvmeof_agent = None
-from os_brick.privileged import nvmeof as priv_nvme
 from os_brick.privileged import rootwrap as priv_rootwrap
 from os_brick import utils
 
@@ -65,11 +64,12 @@ class NVMeOFConnector(base.BaseLinuxConn
         volume_replicas = connection_properties.get('volume_replicas')
         if not volume_replicas:  # compatibility
             return []
+        replica_count = connection_properties.get('replica_count')
 
         try:
-            if volume_replicas and len(volume_replicas) > 1:
+            if volume_replicas and replica_count > 1:
                 return ['/dev/md/' + connection_properties.get('alias')]
-            if volume_replicas and len(volume_replicas) == 1:
+            if volume_replicas and replica_count == 1:
                 return [NVMeOFConnector.get_nvme_device_path(
                     self, volume_replicas[0]['target_nqn'],
                     volume_replicas[0]['vol_uuid'])]
@@ -104,7 +104,7 @@ class NVMeOFConnector(base.BaseLinuxConn
         uuid = nvmf._get_host_uuid()
         suuid = nvmf._get_system_uuid()
         if cls.nvme_present():
-            nqn = nvmf._get_host_nqn()
+            nqn = utils.get_host_nqn()
         if uuid:
             ret['uuid'] = uuid
         if suuid:
@@ -128,16 +128,6 @@ class NVMeOFConnector(base.BaseLinuxConn
                 "Process execution error in _get_host_uuid: %s" % str(e))
             return None
 
-    def _get_host_nqn(self):
-        try:
-            with open('/etc/nvme/hostnqn', 'r') as f:
-                host_nqn = f.read().strip()
-        except IOError:
-            host_nqn = priv_nvme.create_hostnqn()
-        except Exception:
-            host_nqn = None
-        return host_nqn
-
     def _get_system_uuid(self):
         # RSD requires system_uuid to let Cinder RSD Driver identify
         # Nova node for later RSD volume attachment.
@@ -317,7 +307,7 @@ class NVMeOFConnector(base.BaseLinuxConn
         return self._is_nvme_available(nvme_name)
 
     @utils.trace
-    @synchronized('connect_volume')
+    @synchronized('connect_volume', external=True)
     def connect_volume(self, connection_properties):
         """Discover and attach the volume.
 
@@ -368,7 +358,7 @@ class NVMeOFConnector(base.BaseLinuxConn
         return device_info
 
     @utils.trace
-    @synchronized('connect_volume')
+    @synchronized('connect_volume', external=True)
     def disconnect_volume(self, connection_properties, device_info,
                           force=False, ignore_errors=False):
         """Flush the volume.
@@ -412,7 +402,7 @@ class NVMeOFConnector(base.BaseLinuxConn
                 raise
 
     @utils.trace
-    @synchronized('extend_volume')
+    @synchronized('extend_volume', external=True)
     def extend_volume(self, connection_properties):
         """Update the local kernel's size information.
 
@@ -445,6 +435,7 @@ class NVMeOFConnector(base.BaseLinuxConn
         """
 
         volume_replicas = connection_properties.get('volume_replicas')
+        replica_count = connection_properties.get('replica_count')
         volume_alias = connection_properties.get('alias')
 
         if volume_replicas:
@@ -463,9 +454,9 @@ class NVMeOFConnector(base.BaseLinuxConn
                 raise exception.VolumeDeviceNotFound(
                     device=volume_replicas)
 
-            if len(volume_replicas) > 1:
+            if replica_count > 1:
                 device_path = self._handle_replicated_volume(
-                    host_device_paths, volume_alias, len(volume_replicas))
+                    host_device_paths, volume_alias, replica_count)
             else:
                 device_path = self._handle_single_replica(
                     host_device_paths, volume_alias)
@@ -485,14 +476,15 @@ class NVMeOFConnector(base.BaseLinuxConn
                                       force=False, ignore_errors=False):
         device_path = None
         volume_replicas = connection_properties.get('volume_replicas')
+        replica_count = connection_properties.get('replica_count')
         if device_info and device_info.get('path'):
             device_path = device_info['path']
         elif connection_properties.get('device_path'):
             device_path = connection_properties['device_path']
-        elif volume_replicas and len(volume_replicas) > 1:
+        elif volume_replicas and replica_count > 1:
             device_path = '/dev/md/' + connection_properties['alias']
 
-        if volume_replicas and len(volume_replicas) > 1:
+        if volume_replicas and replica_count > 1:
             NVMeOFConnector.end_raid(self, device_path)
         else:
             if self._get_fs_type(device_path) == 'linux_raid_member':
@@ -500,8 +492,9 @@ class NVMeOFConnector(base.BaseLinuxConn
 
     def _extend_volume_replicated(self, connection_properties):
         volume_replicas = connection_properties.get('volume_replicas')
+        replica_count = connection_properties.get('replica_count')
 
-        if volume_replicas and len(volume_replicas) > 1:
+        if volume_replicas and replica_count > 1:
             device_path = '/dev/md/' + connection_properties['alias']
             NVMeOFConnector.run_mdadm(
                 self, ['mdadm', '--grow', '--size', 'max', device_path])
@@ -519,33 +512,19 @@ class NVMeOFConnector(base.BaseLinuxConn
 
     def _connect_target_volume(self, target_nqn, vol_uuid, portals):
         try:
-            host_device_path = NVMeOFConnector.get_nvme_device_path(
-                self, target_nqn, vol_uuid)
+            NVMeOFConnector._get_nvme_controller(self, target_nqn)
+            NVMeOFConnector.rescan(self, target_nqn, vol_uuid)
         except exception.VolumeDeviceNotFound:
-            host_device_path = None
-
-        if not host_device_path:
-            any_connect = NVMeOFConnector.connect_to_portals(
-                self, target_nqn, portals)
-            if not any_connect:
-                LOG.error(
-                    "No successful connections: %(host_devices)s",
-                    {'host_devices': target_nqn})
+            if not NVMeOFConnector.connect_to_portals(
+                    self, target_nqn, portals):
+                LOG.error("No successful connections to: %s", target_nqn)
                 raise exception.VolumeDeviceNotFound(device=target_nqn)
-
-            host_device_path = NVMeOFConnector.get_nvme_device_path(
-                self, target_nqn, vol_uuid)
-            if not host_device_path:
-                LOG.error(
-                    "No accessible volume device: %(host_devices)s",
-                    {'host_devices': target_nqn})
-                raise exception.VolumeDeviceNotFound(device=target_nqn)
-        else:
-            NVMeOFConnector.rescan(self, target_nqn, vol_uuid)
-            host_device_path = NVMeOFConnector.get_nvme_device_path(
-                self, target_nqn, vol_uuid)
-
-        return host_device_path
+        dev_path = NVMeOFConnector.get_nvme_device_path(
+            self, target_nqn, vol_uuid)
+        if not dev_path:
+            LOG.error("Target %s volume %s not found", target_nqn, vol_uuid)
+            raise exception.VolumeDeviceNotFound(device=vol_uuid)
+        return dev_path
 
     @staticmethod
     def connect_to_portals(executor, target_nqn, target_portals):
@@ -592,22 +571,21 @@ class NVMeOFConnector(base.BaseLinuxConn
         raise exception.VolumeDeviceNotFound(device=target_nqn)
 
     @staticmethod
-    @utils.retry(exception.VolumeDeviceNotFound)
+    @utils.retry(exception.VolumeDeviceNotFound, retries=5)
     def get_nvme_device_path(executor, target_nqn, vol_uuid):
         nvme_ctrl = NVMeOFConnector._get_nvme_controller(executor, target_nqn)
-        try:
-            blocks = glob.glob(
-                '/sys/class/nvme-fabrics/ctl/' + nvme_ctrl +
-                '/' + nvme_ctrl + 'n*')
-            for block in blocks:
+        uuid_paths = glob.glob('/sys/class/block/' + nvme_ctrl + 'n*/uuid')
+        for uuid_path in uuid_paths:
+            try:
                 uuid_lines, _err = executor._execute(
-                    'cat', block + '/uuid', run_as_root=True,
+                    'cat', uuid_path, run_as_root=True,
                     root_helper=executor._root_helper)
                 if uuid_lines.split('\n')[0] == vol_uuid:
-                    return '/dev/' + block[block.rfind('/') + 1:]
-        except putils.ProcessExecutionError as e:
-            LOG.exception(e)
-
+                    ignore = len('/uuid')
+                    return '/dev/' + uuid_path[
+                        uuid_path.rfind('/', 0, -ignore) + 1: -ignore]
+            except putils.ProcessExecutionError as e:
+                LOG.exception(e)
         raise exception.VolumeDeviceNotFound(device=vol_uuid)
 
     def _handle_replicated_volume(self, host_device_paths,
@@ -780,6 +758,19 @@ class NVMeOFConnector(base.BaseLinuxConn
 
         LOG.debug('[!] cmd = ' + str(cmd))
         NVMeOFConnector.run_mdadm(executor, cmd)
+        # sometimes under load, md is not created right away so we wait
+        for i in range(60):
+            try:
+                is_exist = os.path.exists("/dev/md/" + name)
+                LOG.debug("[!] md is_exist = %s", is_exist)
+                if is_exist:
+                    return
+                time.sleep(1)
+            except Exception:
+                LOG.debug('[!] Exception_wait_raid!')
+        msg = _("md: /dev/md/%s not found.") % name
+        LOG.error(msg)
+        raise exception.NotFound(message=msg)
 
     @staticmethod
     def end_raid(executor, device_path):
@@ -788,12 +779,11 @@ class NVMeOFConnector(base.BaseLinuxConn
             for i in range(10):
                 try:
                     cmd_out = NVMeOFConnector.stop_raid(
-                        executor, device_path)
+                        executor, device_path, True)
                     if not cmd_out:
                         break
                 except Exception:
-                    break
-                time.sleep(1)
+                    time.sleep(1)
             try:
                 is_exist = os.path.exists(device_path)
                 LOG.debug("[!] is_exist = %s", is_exist)
@@ -804,10 +794,10 @@ class NVMeOFConnector(base.BaseLinuxConn
                 LOG.debug('[!] Exception_stop_raid!')
 
     @staticmethod
-    def stop_raid(executor, md_path):
+    def stop_raid(executor, md_path, raise_exception=False):
         cmd = ['mdadm', '--stop', md_path]
         LOG.debug("[!] cmd = " + str(cmd))
-        cmd_out = NVMeOFConnector.run_mdadm(executor, cmd)
+        cmd_out = NVMeOFConnector.run_mdadm(executor, cmd, raise_exception)
         return cmd_out
 
     @staticmethod
diff -pruN 5.0.1-1/os_brick/initiator/connectors/scaleio.py 5.2.0-0ubuntu1/os_brick/initiator/connectors/scaleio.py
--- 5.0.1-1/os_brick/initiator/connectors/scaleio.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/initiator/connectors/scaleio.py	2022-02-18 15:37:53.000000000 +0000
@@ -75,6 +75,8 @@ class ScaleIOConnector(base.BaseLinuxCon
         self.volume_path = None
         self.iops_limit = None
         self.bandwidth_limit = None
+        self.verify_certificate = None
+        self.certificate_path = None
 
     def _get_guid(self):
         try:
@@ -204,7 +206,7 @@ class ScaleIOConnector(base.BaseLinuxCon
         r = requests.get(
             request,
             auth=(self.server_username, self.server_token),
-            verify=False
+            verify=self._verify_cert()
         )
 
         r = self._check_response(r, request)
@@ -250,7 +252,7 @@ class ScaleIOConnector(base.BaseLinuxCon
 
         r = requests.get(request,
                          auth=(self.server_username, self.server_token),
-                         verify=False)
+                         verify=self._verify_cert())
 
         r = self._check_response(r, request)
 
@@ -290,7 +292,7 @@ class ScaleIOConnector(base.BaseLinuxCon
             r = requests.get(
                 login_request,
                 auth=(self.server_username, self.server_password),
-                verify=False
+                verify=self._verify_cert()
             )
 
             token = r.json()
@@ -301,7 +303,7 @@ class ScaleIOConnector(base.BaseLinuxCon
             if is_get_request:
                 res = requests.get(request,
                                    auth=(self.server_username, token),
-                                   verify=False)
+                                   verify=self._verify_cert())
             else:
                 headers = {'content-type': 'application/json'}
                 res = requests.post(
@@ -309,7 +311,7 @@ class ScaleIOConnector(base.BaseLinuxCon
                     data=json.dumps(params),
                     headers=headers,
                     auth=(self.server_username, token),
-                    verify=False
+                    verify=self._verify_cert()
                 )
 
             self.server_token = token
@@ -317,6 +319,12 @@ class ScaleIOConnector(base.BaseLinuxCon
 
         return response
 
+    def _verify_cert(self):
+        verify_cert = self.verify_certificate
+        if self.verify_certificate and self.certificate_path:
+            verify_cert = self.certificate_path
+        return verify_cert
+
     def get_config(self, connection_properties):
         self.local_sdc_ip = connection_properties['hostIP']
         self.volume_name = connection_properties['scaleIO_volname']
@@ -331,12 +339,16 @@ class ScaleIOConnector(base.BaseLinuxCon
             connection_properties)
         self.iops_limit = connection_properties['iopsLimit']
         self.bandwidth_limit = connection_properties['bandwidthLimit']
+        self.verify_certificate = (
+            connection_properties.get('verify_certificate')
+        )
+        self.certificate_path = connection_properties.get('certificate_path')
         device_info = {'type': 'block',
                        'path': self.volume_path}
         return device_info
 
     @utils.trace
-    @lockutils.synchronized('scaleio', 'scaleio-')
+    @lockutils.synchronized('scaleio', 'scaleio-', external=True)
     def connect_volume(self, connection_properties):
         """Connect the volume.
 
@@ -382,7 +394,7 @@ class ScaleIOConnector(base.BaseLinuxCon
             data=json.dumps(params),
             headers=headers,
             auth=(self.server_username, self.server_token),
-            verify=False
+            verify=self._verify_cert()
         )
 
         r = self._check_response(r, request, False, params)
@@ -431,7 +443,7 @@ class ScaleIOConnector(base.BaseLinuxCon
                 data=json.dumps(params),
                 headers=headers,
                 auth=(self.server_username, self.server_token),
-                verify=False
+                verify=self._verify_cert()
             )
             r = self._check_response(r, request, False, params)
             if r.status_code != self.OK_STATUS_CODE:
@@ -450,7 +462,7 @@ class ScaleIOConnector(base.BaseLinuxCon
         return device_info
 
     @utils.trace
-    @lockutils.synchronized('scaleio', 'scaleio-')
+    @lockutils.synchronized('scaleio', 'scaleio-', external=True)
     def disconnect_volume(self, connection_properties, device_info,
                           force=False, ignore_errors=False):
         """Disconnect the ScaleIO volume.
@@ -495,7 +507,7 @@ class ScaleIOConnector(base.BaseLinuxCon
             data=json.dumps(params),
             headers=headers,
             auth=(self.server_username, self.server_token),
-            verify=False
+            verify=self._verify_cert()
         )
 
         r = self._check_response(r, request, False, params)
diff -pruN 5.0.1-1/os_brick/initiator/__init__.py 5.2.0-0ubuntu1/os_brick/initiator/__init__.py
--- 5.0.1-1/os_brick/initiator/__init__.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/initiator/__init__.py	2022-02-18 15:37:53.000000000 +0000
@@ -56,3 +56,4 @@ GPFS = "GPFS"
 STORPOOL = "STORPOOL"
 NVME = "NVME"
 NVMEOF = "NVMEOF"
+LIGHTOS = "LIGHTOS"
diff -pruN 5.0.1-1/os_brick/initiator/utils.py 5.2.0-0ubuntu1/os_brick/initiator/utils.py
--- 5.0.1-1/os_brick/initiator/utils.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/initiator/utils.py	2022-02-18 15:37:53.000000000 +0000
@@ -42,5 +42,6 @@ def guard_connection(device):
     else:
         # Cinder passes an OVO, but Nova passes a dictionary, so we use dict
         # key access that works with both.
-        with lockutils.lock(device['service_uuid'], 'os-brick-'):
+        with lockutils.lock(device['service_uuid'], 'os-brick-',
+                            external=True):
             yield
diff -pruN 5.0.1-1/os_brick/privileged/lightos.py 5.2.0-0ubuntu1/os_brick/privileged/lightos.py
--- 5.0.1-1/os_brick/privileged/lightos.py	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/privileged/lightos.py	2022-02-18 15:37:53.000000000 +0000
@@ -0,0 +1,30 @@
+# Copyright (C) 2016-2022 Lightbits Labs Ltd.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import shutil
+
+from oslo_utils import fileutils
+
+import os_brick.privileged
+
+
+@os_brick.privileged.default.entrypoint
+def delete_dsc_file(file_name):
+    return fileutils.delete_if_exists(file_name)
+
+
+@os_brick.privileged.default.entrypoint
+def move_dsc_file(src, dst):
+    return shutil.move(src, dst)
diff -pruN 5.0.1-1/os_brick/privileged/nvmeof.py 5.2.0-0ubuntu1/os_brick/privileged/nvmeof.py
--- 5.0.1-1/os_brick/privileged/nvmeof.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/privileged/nvmeof.py	2022-02-18 15:37:53.000000000 +0000
@@ -47,9 +47,16 @@ def create_hostnqn():
         # This is different from OSError's ENOENT, which is missing nvme
         # command.  This ENOENT is when nvme says there isn't an nqn.
         except putils.ProcessExecutionError as e:
-            if e.exit_code != errno.ENOENT:
+            err_msg = e.stdout[:e.stdout.find('\n')]
+            show_hostnqn_subcmd_missing = (
+                "ERROR: Invalid sub-command".casefold() in err_msg.casefold())
+            if show_hostnqn_subcmd_missing:
+                LOG.debug('Version too old cannot check current hostnqn.')
+            elif e.exit_code == errno.ENOENT:
+                LOG.debug('No nqn could be formed from dmi or systemd.')
+            else:
+                LOG.debug('Unknown error from nvme show-hostnqn: %s', err_msg)
                 raise
-            LOG.debug('No nqn could be formed from dmi or systemd.')
 
         if not host_nqn:
             LOG.debug('Generating nqn')
diff -pruN 5.0.1-1/os_brick/tests/base.py 5.2.0-0ubuntu1/os_brick/tests/base.py
--- 5.0.1-1/os_brick/tests/base.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/tests/base.py	2022-02-18 15:37:53.000000000 +0000
@@ -18,6 +18,8 @@ import os
 from unittest import mock
 
 import fixtures
+from oslo_concurrency import lockutils
+from oslo_config import fixture as config_fixture
 from oslo_utils import strutils
 import testtools
 
@@ -65,6 +67,13 @@ class TestCase(testtools.TestCase):
         patcher.start()
         self.addCleanup(patcher.stop)
 
+        # At runtime this would be set by the library user: Cinder, Nova, etc.
+        self.useFixture(fixtures.NestedTempfile())
+        lock_path = self.useFixture(fixtures.TempDir()).path
+        self.fixture = self.useFixture(config_fixture.Config(lockutils.CONF))
+        self.fixture.config(lock_path=lock_path, group='oslo_concurrency')
+        lockutils.set_defaults(lock_path)
+
     def _common_cleanup(self):
         """Runs after each test method to tear down test environment."""
 
diff -pruN 5.0.1-1/os_brick/tests/initiator/connectors/test_iscsi.py 5.2.0-0ubuntu1/os_brick/tests/initiator/connectors/test_iscsi.py
--- 5.0.1-1/os_brick/tests/initiator/connectors/test_iscsi.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/tests/initiator/connectors/test_iscsi.py	2022-02-18 15:37:53.000000000 +0000
@@ -1113,6 +1113,38 @@ Setting up iSCSI targets: unused
         self.assertListEqual(expected_cmds, actual_cmds)
         get_sessions_mock.assert_called_once_with()
 
+    @mock.patch.object(iscsi.ISCSIConnector, '_iscsiadm_update')
+    @mock.patch.object(iscsi.ISCSIConnector, '_get_transport',
+                       return_value='default')
+    @mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_sessions_full')
+    @mock.patch('os_brick.utils._time_sleep')
+    def test_connect_to_iscsi_portal_fail_op_new(self, sleep_mock,
+                                                 get_sessions_mock,
+                                                 get_transport_mock,
+                                                 iscsiadm_update_mock):
+        get_sessions_mock.return_value = []
+        with mock.patch.object(self.connector, '_execute') as exec_mock:
+            exec_mock.side_effect = [('', 21), ('', 6), ('', 21), ('', 6),
+                                     ('', 21), ('', 6)]
+            self.assertRaises(exception.BrickException,
+                              self.connector._connect_to_iscsi_portal,
+                              self.CON_PROPS)
+        expected_cmds = ['iscsiadm -m node -T tgt1 -p ip1:port1',
+                         'iscsiadm -m node -T tgt1 -p ip1:port1 '
+                         '--interface default --op new',
+                         'iscsiadm -m node -T tgt1 -p ip1:port1',
+                         'iscsiadm -m node -T tgt1 -p ip1:port1 '
+                         '--interface default --op new',
+                         'iscsiadm -m node -T tgt1 -p ip1:port1',
+                         'iscsiadm -m node -T tgt1 -p ip1:port1 '
+                         '--interface default --op new']
+        actual_cmds = [' '.join(args[0]) for args in exec_mock.call_args_list]
+        self.assertListEqual(expected_cmds, actual_cmds)
+        iscsiadm_update_mock.assert_not_called()
+
+        # Called twice by the retry mechanism
+        self.assertEqual(2, sleep_mock.call_count)
+
     @mock.patch.object(linuxscsi.LinuxSCSI, 'get_sysfs_wwn',
                        side_effect=(None, 'tgt2'))
     @mock.patch.object(iscsi.ISCSIConnector, '_connect_vol')
diff -pruN 5.0.1-1/os_brick/tests/initiator/connectors/test_lightos.py 5.2.0-0ubuntu1/os_brick/tests/initiator/connectors/test_lightos.py
--- 5.0.1-1/os_brick/tests/initiator/connectors/test_lightos.py	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/tests/initiator/connectors/test_lightos.py	2022-02-18 15:37:53.000000000 +0000
@@ -0,0 +1,240 @@
+# Copyright (C) 2016-2020 Lightbits Labs Ltd.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+import glob
+import http.client
+import queue
+from unittest import mock
+from unittest.mock import mock_open
+
+from os_brick import exception
+from os_brick.initiator.connectors import lightos
+from os_brick.initiator import linuxscsi
+from os_brick.privileged import lightos as priv_lightos
+from os_brick.tests.initiator import test_connector
+from os_brick import utils
+
+FAKE_NQN = "nqn.fake.qnq"
+
+FAKE_LIGHTOS_CLUSTER_NODES = {
+    "nodes": [
+        {"UUID": "926e6df8-73e1-11ec-a624-000000000001",
+         "nvmeEndpoint": "192.168.75.10:4420"},
+        {"UUID": "926e6df8-73e1-11ec-a624-000000000002",
+         "nvmeEndpoint": "192.168.75.11:4420"},
+        {"UUID": "926e6df8-73e1-11ec-a624-000000000003",
+         "nvmeEndpoint": "192.168.75.12:4420"}
+    ]
+}
+
+FAKE_SUBSYSNQN = "nqn.2014-08.org.nvmexpress:NVMf:uuid:"
+FAKE_LIGHTOS_CLUSTER_INFO = {
+    'UUID': "926e6df8-73e1-11ec-a624-07ba3880f6cc",
+    'subsystemNQN': "nqn.2014-08.org.nvmexpress:NVMf:uuid:"
+    "f4a89ce0-9fc2-4900-bfa3-00ad27995e7b",
+    'nodes_ips': ["10.17.167.4", "10.17.167.5", "10.17.167.6"]
+}
+FAKE_VOLUME_UUID = "926e6df8-73e1-11ec-a624-07ba3880f6cd"
+NUM_BLOCKS_IN_GIB = 2097152
+BLOCK_SIZE = 512
+
+
+def get_http_response_mock(status):
+    resp = mock.Mock()
+    resp.status = status
+    return resp
+
+
+class LightosConnectorTestCase(test_connector.ConnectorTestCase):
+
+    """Test cases for NVMe initiator class."""
+
+    def setUp(self):
+        super(LightosConnectorTestCase, self).setUp()
+        self.connector = lightos.LightOSConnector(None,
+                                                  execute=self.fake_execute)
+
+    @staticmethod
+    def _get_connection_info():
+        lightos_nodes = {}
+        for ip in FAKE_LIGHTOS_CLUSTER_INFO['nodes_ips']:
+            lightos_nodes[ip] = dict(
+                transport_type='tcp',
+                target_portal=ip,
+                target_port=8009
+            )
+        return dict(
+            subsysnqn=FAKE_LIGHTOS_CLUSTER_INFO['subsystemNQN'],
+            uuid=FAKE_LIGHTOS_CLUSTER_INFO['UUID'],
+            lightos_nodes=lightos_nodes
+        )
+
+    @mock.patch.object(utils, 'get_host_nqn',
+                       return_value=FAKE_NQN)
+    @mock.patch.object(lightos.LightOSConnector, 'find_dsc',
+                       return_value=True)
+    def test_get_connector_properties(self, mock_nqn, mock_dsc):
+        props = self.connector.get_connector_properties(None)
+        expected_props = {"nqn": FAKE_NQN, "found_dsc": True}
+        self.assertEqual(expected_props, props)
+
+    @mock.patch.object(lightos.http.client.HTTPConnection, "request",
+                       return_value=None)
+    @mock.patch.object(lightos.http.client.HTTPConnection, "getresponse",
+                       return_value=get_http_response_mock(http.client.OK))
+    def test_find_dsc_success(self, mocked_connection, mocked_response):
+        mocked_connection.request.return_value = None
+        mocked_response.getresponse.return_value = get_http_response_mock(
+            http.client.OK)
+        self.assertEqual(self.connector.find_dsc(), 'found')
+
+    @mock.patch.object(lightos.http.client.HTTPConnection, "request",
+                       return_value=None)
+    @mock.patch.object(lightos.http.client.HTTPConnection, "getresponse",
+                       return_value=get_http_response_mock(
+                           http.client.NOT_FOUND))
+    def test_find_dsc_failure(self, mocked_connection, mocked_response):
+        mocked_connection.request.return_value = None
+        mocked_response.getresponse.return_value = get_http_response_mock(
+            http.client.OK)
+        self.assertEqual(self.connector.find_dsc(), '')
+
+    @mock.patch.object(utils, 'get_host_nqn',
+                       return_value=FAKE_NQN)
+    @mock.patch.object(lightos.priv_lightos, 'move_dsc_file',
+                       return_value="/etc/discovery_client/discovery.d/v0")
+    @mock.patch.object(lightos.LightOSConnector,
+                       '_check_device_exists_using_dev_lnk',
+                       return_value="/dev/nvme0n1")
+    def test_connect_volume_succeed(self, mock_nqn, mock_move_file,
+                                    mock_check_device):
+        self.connector.connect_volume(self._get_connection_info())
+
+    @mock.patch.object(utils, 'get_host_nqn',
+                       return_value=FAKE_NQN)
+    @mock.patch.object(lightos.priv_lightos, 'move_dsc_file',
+                       return_value="/etc/discovery_client/discovery.d/v0")
+    @mock.patch.object(lightos.priv_lightos, 'delete_dsc_file',
+                       return_value=None)
+    @mock.patch.object(lightos.LightOSConnector, '_get_device_by_uuid',
+                       return_value=None)
+    def test_connect_volume_failure(self, mock_nqn, mock_move_file,
+                                    mock_delete_file, mock_get_device):
+        self.assertRaises(exception.BrickException,
+                          self.connector.connect_volume,
+                          self._get_connection_info())
+
+    @mock.patch.object(priv_lightos, 'delete_dsc_file', return_value=True)
+    def test_dsc_disconnect_volume_succeed(self, mock_priv_lightos):
+        self.connector.dsc_disconnect_volume(self._get_connection_info())
+
+    @mock.patch.object(priv_lightos, 'delete_dsc_file',
+                       side_effect=OSError("failed to delete file"))
+    def test_dsc_disconnect_volume_failure(self, execute_mock):
+        self.assertRaises(OSError,
+                          self.connector.dsc_disconnect_volume,
+                          self._get_connection_info())
+
+    @mock.patch.object(lightos.LightOSConnector,
+                       '_check_device_exists_using_dev_lnk',
+                       return_value=("/dev/nvme0n1"))
+    def test_get_device_by_uuid_succeed_with_link(self, execute_mock):
+        self.assertEqual(self.connector._get_device_by_uuid(FAKE_VOLUME_UUID),
+                         "/dev/nvme0n1")
+
+    @mock.patch.object(lightos.LightOSConnector,
+                       '_check_device_exists_reading_block_class',
+                       return_value=("/dev/nvme0n1"))
+    def test_get_device_by_uuid_succeed_with_block_class(self, execute_mock):
+        self.assertEqual(self.connector._get_device_by_uuid(FAKE_VOLUME_UUID),
+                         "/dev/nvme0n1")
+
+    @mock.patch.object(lightos.LightOSConnector,
+                       '_check_device_exists_using_dev_lnk',
+                       side_effect=[None, False, "/dev/nvme0n1"])
+    @mock.patch.object(lightos.LightOSConnector,
+                       '_check_device_exists_reading_block_class',
+                       side_effect=[None, False, "/dev/nvme0n1"])
+    def test_get_device_by_uuid_many_attempts(self, execute_mock, glob_mock):
+        self.assertEqual(self.connector._get_device_by_uuid(FAKE_VOLUME_UUID),
+                         '/dev/nvme0n1')
+
+    @mock.patch.object(lightos.LightOSConnector, 'dsc_connect_volume',
+                       return_value=None)
+    @mock.patch.object(lightos.LightOSConnector, '_get_device_by_uuid',
+                       return_value="/dev/nvme0n1")
+    def test_connect_volume(self, dsc_connect, path):
+        connection_properties = {"nqn": FAKE_NQN, "found_dsc": True,
+                                 "uuid": "123"}
+        expected_device_info = {'type': 'block', "path": "/dev/nvme0n1"}
+        device_info = self.connector.connect_volume(connection_properties)
+
+        self.assertEqual(expected_device_info, device_info)
+
+    @mock.patch.object(linuxscsi.LinuxSCSI, 'flush_device_io', autospec=True)
+    @mock.patch.object(lightos.LightOSConnector, '_get_device_by_uuid',
+                       return_value="/dev/nvme0n1")
+    @mock.patch.object(lightos.LightOSConnector, 'dsc_disconnect_volume')
+    def test_disconnect_volume(self, mock_disconnect, mock_uuid, mock_flush):
+        connection_properties = {"nqn": FAKE_NQN, "found_dsc": True,
+                                 "uuid": "123"}
+        self.connector.disconnect_volume(connection_properties, None)
+        mock_disconnect.assert_called_once_with(connection_properties)
+        mock_flush.assert_called_once_with(mock.ANY, "/dev/nvme0n1")
+
+    @mock.patch.object(lightos.LightOSConnector, '_get_device_by_uuid',
+                       return_value="/dev/nvme0n1")
+    @mock.patch("builtins.open", new_callable=mock_open,
+                read_data=f"{str(NUM_BLOCKS_IN_GIB)}\n")
+    def test_extend_volume(self, mock_execute, m_open):
+        connection_properties = {'uuid': FAKE_VOLUME_UUID}
+        self.assertEqual(self.connector.extend_volume(connection_properties),
+                         NUM_BLOCKS_IN_GIB * BLOCK_SIZE)
+
+    def test_monitor_message_queue_delete(self):
+        message_queue = queue.Queue()
+        connection = {"uuid": "123"}
+        message_queue.put(("delete", connection))
+        lightos_db = {"123": "fake_connection"}
+        self.connector.monitor_message_queue(message_queue, lightos_db)
+        self.assertEqual(len(lightos_db), 0)
+
+    def test_monitor_message_queue_add(self):
+        message_queue = queue.Queue()
+        connection = {"uuid": "123"}
+        lightos_db = {}
+        message_queue.put(("add", connection))
+        self.connector.monitor_message_queue(message_queue, lightos_db)
+        self.assertEqual(len(lightos_db), 1)
+
+    @mock.patch.object(lightos.os.path, 'exists', return_value=True)
+    @mock.patch.object(lightos.os.path, 'realpath',
+                       return_value="/dev/nvme0n1")
+    def test_check_device_exists_using_dev_lnk_succeed(self, mock_path_exists,
+                                                       mock_realpath):
+        found_dev = self.connector._check_device_exists_using_dev_lnk(
+            FAKE_VOLUME_UUID)
+        self.assertEqual("/dev/nvme0n1", found_dev)
+
+    def test_check_device_exists_using_dev_lnk_false(self):
+        self.assertIsNone(self.connector._check_device_exists_using_dev_lnk(
+            FAKE_VOLUME_UUID))
+
+    @mock.patch.object(glob, "glob", return_value=['/path/nvme0n1/wwid'])
+    @mock.patch("builtins.open", new_callable=mock_open,
+                read_data=f"uuid.{FAKE_VOLUME_UUID}\n")
+    def test_check_device_exists_reading_block_class(self, mock_glob, m_open):
+        found_dev = self.connector._check_device_exists_reading_block_class(
+            FAKE_VOLUME_UUID)
+        self.assertEqual("/dev/nvme0n1", found_dev)
diff -pruN 5.0.1-1/os_brick/tests/initiator/connectors/test_nvmeof.py 5.2.0-0ubuntu1/os_brick/tests/initiator/connectors/test_nvmeof.py
--- 5.0.1-1/os_brick/tests/initiator/connectors/test_nvmeof.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/tests/initiator/connectors/test_nvmeof.py	2022-02-18 15:37:53.000000000 +0000
@@ -24,6 +24,7 @@ from os_brick.initiator.connectors impor
 from os_brick.initiator import linuxscsi
 from os_brick.privileged import rootwrap as priv_rootwrap
 from os_brick.tests.initiator import test_connector
+from os_brick import utils
 
 
 TARGET_NQN = 'target.nqn'
@@ -45,7 +46,8 @@ volume_replicas = [{'target_nqn': 'faken
 connection_properties = {
     'alias': 'fakealias',
     'vol_uuid': 'fakevoluuid',
-    'volume_replicas': volume_replicas
+    'volume_replicas': volume_replicas,
+    'replica_count': 3
 }
 fake_portal = ('fake', 'portal', 'tcp')
 
@@ -137,7 +139,7 @@ class NVMeOFConnectorTestCase(test_conne
 
     @mock.patch.object(nvmeof.NVMeOFConnector, 'nvme_present',
                        return_value=True)
-    @mock.patch.object(nvmeof.NVMeOFConnector, '_get_host_nqn',
+    @mock.patch.object(utils, 'get_host_nqn',
                        return_value='fakenqn')
     @mock.patch.object(nvmeof.NVMeOFConnector, '_get_system_uuid',
                        return_value=None)
@@ -151,7 +153,7 @@ class NVMeOFConnectorTestCase(test_conne
         self.assertEqual(expected_props, props)
 
     @mock.patch.object(nvmeof.NVMeOFConnector, 'nvme_present')
-    @mock.patch.object(nvmeof.NVMeOFConnector, '_get_host_nqn', autospec=True)
+    @mock.patch.object(utils, 'get_host_nqn', autospec=True)
     @mock.patch.object(nvmeof.NVMeOFConnector, '_get_system_uuid',
                        autospec=True)
     @mock.patch.object(nvmeof.NVMeOFConnector, '_get_host_uuid', autospec=True)
@@ -177,7 +179,8 @@ class NVMeOFConnectorTestCase(test_conne
         mock_get_device_path.return_value = '/dev/nvme1n1'
         connection_properties = {
             'alias': 'fakealias',
-            'volume_replicas': [volume_replicas[0]]
+            'volume_replicas': [volume_replicas[0]],
+            'replica_count': 1
         }
         self.assertEqual(self.connector.get_volume_paths(
             connection_properties),
@@ -257,7 +260,8 @@ class NVMeOFConnectorTestCase(test_conne
         connection_properties1 = {
             'target_nqn': 'fakenqn',
             'vol_uuid': 'fakeuuid',
-            'volume_replicas': [volume_replicas[0]]
+            'volume_replicas': [volume_replicas[0]],
+            'replica_count': 1
         }
         mock_connect_target_volume.return_value = '/dev/nvme0n1'
         self.assertEqual(
@@ -401,6 +405,7 @@ class NVMeOFConnectorTestCase(test_conne
         connection_properties = {
             'vol_uuid': 'fakeuuid',
             'volume_replicas': volume_replicas,
+            'replica_count': 3,
             'device_path': '/dev/md/md1'
         }
         self.connector.disconnect_volume(connection_properties, None)
@@ -431,7 +436,8 @@ class NVMeOFConnectorTestCase(test_conne
         connection_properties = {
             'target_nqn': 'fakenqn',
             'vol_uuid': 'fakeuuid',
-            'volume_replicas': [volume_replicas[0]]
+            'volume_replicas': [volume_replicas[0]],
+            'replica_count': 1
         }
         mock_device_path.return_value = '/dev/nvme0n1'
         mock_device_size.return_value = 100
@@ -487,15 +493,18 @@ class NVMeOFConnectorTestCase(test_conne
         )
         mock_device_size.assert_called_with(device_path)
 
+    @mock.patch.object(nvmeof.NVMeOFConnector, '_get_nvme_controller')
     @mock.patch.object(nvmeof.NVMeOFConnector, 'rescan')
     @mock.patch.object(nvmeof.NVMeOFConnector, 'get_nvme_device_path')
     def test__connect_target_volume_with_connected_device(
-            self, mock_device_path, mock_rescan):
+            self, mock_device_path, mock_rescan, mock_controller):
         mock_device_path.return_value = '/dev/nvme0n1'
         self.assertEqual(
             self.connector._connect_target_volume(
                 'fakenqn', 'fakeuuid', [('fake', 'portal', 'tcp')]),
             '/dev/nvme0n1')
+        mock_controller.assert_called_with(self.connector, 'fakenqn')
+        mock_rescan.assert_called_with(self.connector, 'fakenqn', 'fakeuuid')
         mock_device_path.assert_called_with(
             self.connector, 'fakenqn', 'fakeuuid')
 
@@ -511,23 +520,23 @@ class NVMeOFConnectorTestCase(test_conne
         mock_device_path.assert_called_with(
             self.connector, TARGET_NQN, VOL_UUID)
 
+    @mock.patch.object(nvmeof.NVMeOFConnector, '_get_nvme_controller')
     @mock.patch.object(nvmeof.NVMeOFConnector, 'connect_to_portals')
-    @mock.patch.object(nvmeof.NVMeOFConnector, 'get_nvme_device_path')
     def test__connect_target_volume_no_portals_con(
-            self, mock_device_path, mock_portals):
-        mock_device_path.return_value = None
+            self, mock_portals, mock_controller):
+        mock_controller.side_effect = exception.VolumeDeviceNotFound()
         mock_portals.return_value = None
         self.assertRaises(exception.VolumeDeviceNotFound,
                           self.connector._connect_target_volume, 'fakenqn',
                           'fakeuuid', [fake_portal])
-        mock_device_path.assert_called_with(
-            self.connector, 'fakenqn', 'fakeuuid')
 
+    @mock.patch.object(nvmeof.NVMeOFConnector, '_get_nvme_controller')
     @mock.patch.object(nvmeof.NVMeOFConnector, 'connect_to_portals')
     @mock.patch.object(nvmeof.NVMeOFConnector, 'get_nvme_device_path')
     def test__connect_target_volume_new_device_path(
-            self, mock_device_path, mock_connect_portal):
-        mock_device_path.side_effect = (None, '/dev/nvme0n1')
+            self, mock_device_path, mock_connect_portal, mock_controller):
+        mock_controller.side_effect = exception.VolumeDeviceNotFound()
+        mock_device_path.return_value = '/dev/nvme0n1'
         self.assertEqual(
             self.connector._connect_target_volume(
                 'fakenqn', 'fakeuuid', [('fake', 'portal', 'tcp')]),
@@ -661,8 +670,10 @@ class NVMeOFConnectorTestCase(test_conne
             ['mdadm', '--assemble', '--run', '/dev/md/md1', '-o', '/dev/sda'],
             True)
 
+    @mock.patch.object(os.path, 'exists')
     @mock.patch.object(nvmeof.NVMeOFConnector, 'run_mdadm')
-    def test_create_raid_cmd_simple(self, mock_run_mdadm):
+    def test_create_raid_cmd_simple(self, mock_run_mdadm, mock_os):
+        mock_os.return_value = True
         self.assertIsNone(self.connector.create_raid(
             self.connector, ['/dev/sda'], '1', 'md1', 'name', True))
         mock_run_mdadm.assert_called_with(
@@ -670,6 +681,7 @@ class NVMeOFConnectorTestCase(test_conne
             ['mdadm', '-C', '-o', 'md1', '-R', '-N', 'name', '--level', '1',
              '--raid-devices=1', '--bitmap=internal', '--homehost=any',
              '--failfast', '--assume-clean', '/dev/sda'])
+        mock_os.assert_called_with('/dev/md/name')
 
     @mock.patch.object(nvmeof.NVMeOFConnector, 'stop_raid')
     @mock.patch.object(nvmeof.NVMeOFConnector, 'is_raid_exists')
@@ -679,7 +691,7 @@ class NVMeOFConnectorTestCase(test_conne
         self.assertIsNone(self.connector.end_raid(
             self.connector, '/dev/md/md1'))
         mock_raid_exists.assert_called_with(self.connector, '/dev/md/md1')
-        mock_stop_raid.assert_called_with(self.connector, '/dev/md/md1')
+        mock_stop_raid.assert_called_with(self.connector, '/dev/md/md1', True)
 
     @mock.patch.object(os.path, 'exists')
     @mock.patch.object(nvmeof.NVMeOFConnector, 'stop_raid')
@@ -691,7 +703,7 @@ class NVMeOFConnectorTestCase(test_conne
         self.assertIsNone(self.connector.end_raid(
             self.connector, '/dev/md/md1'))
         mock_raid_exists.assert_called_with(self.connector, '/dev/md/md1')
-        mock_stop_raid.assert_called_with(self.connector, '/dev/md/md1')
+        mock_stop_raid.assert_called_with(self.connector, '/dev/md/md1', True)
         mock_os.assert_called_with('/dev/md/md1')
 
     @mock.patch.object(os.path, 'exists')
@@ -704,16 +716,16 @@ class NVMeOFConnectorTestCase(test_conne
         self.assertIsNone(self.connector.end_raid(
             self.connector, '/dev/md/md1'))
         mock_raid_exists.assert_called_with(self.connector, '/dev/md/md1')
-        mock_stop_raid.assert_called_with(self.connector, '/dev/md/md1')
+        mock_stop_raid.assert_called_with(self.connector, '/dev/md/md1', True)
         mock_os.assert_called_with('/dev/md/md1')
 
     @mock.patch.object(nvmeof.NVMeOFConnector, 'run_mdadm')
     def test_stop_raid_simple(self, mock_run_mdadm):
         mock_run_mdadm.return_value = 'mdadm output'
         self.assertEqual(self.connector.stop_raid(
-            self.connector, '/dev/md/md1'), 'mdadm output')
+            self.connector, '/dev/md/md1', True), 'mdadm output')
         mock_run_mdadm.assert_called_with(
-            self.connector, ['mdadm', '--stop', '/dev/md/md1'])
+            self.connector, ['mdadm', '--stop', '/dev/md/md1'], True)
 
     @mock.patch.object(nvmeof.NVMeOFConnector, 'run_mdadm')
     def test_remove_raid_simple(self, mock_run_mdadm):
@@ -866,10 +878,10 @@ class NVMeOFConnectorTestCase(test_conne
     def test_get_nvme_device_path(self, mock_get_nvme_controller, mock_glob,
                                   mock_execute):
         mock_get_nvme_controller.return_value = 'nvme1'
-        block_dev_path = '/sys/class/nvme-fabrics/ctl/nvme1/nvme1n*'
-        mock_glob.side_effect = [['/sys/class/nvme-fabrics/ctl/nvme1/nvme1n1']]
+        block_dev_path = '/sys/class/block/nvme1n*/uuid'
+        mock_glob.return_value = ['/sys/class/block/nvme1n1/uuid']
         mock_execute.return_value = (VOL_UUID + "\n", "")
-        cmd = ['cat', '/sys/class/nvme-fabrics/ctl/nvme1/nvme1n1/uuid']
+        cmd = ['cat', '/sys/class/block/nvme1n1/uuid']
         result = self.connector.get_nvme_device_path(EXECUTOR, TARGET_NQN,
                                                      VOL_UUID)
         mock_get_nvme_controller.assert_called_with(EXECUTOR, TARGET_NQN)
@@ -948,21 +960,21 @@ class NVMeOFConnectorTestCase(test_conne
         mock_open.assert_called_once_with('/etc/nvme/hostnqn', 'r')
         self.assertEqual(HOST_NQN, host_nqn)
 
-    @mock.patch.object(nvmeof.priv_nvme, 'create_hostnqn')
+    @mock.patch.object(utils.priv_nvme, 'create_hostnqn')
     @mock.patch.object(builtins, 'open')
     def test_get_host_nqn_io_err(self, mock_open, mock_create):
         mock_create.return_value = mock.sentinel.nqn
         mock_open.side_effect = IOError()
-        result = self.connector._get_host_nqn()
+        result = utils.get_host_nqn()
         mock_open.assert_called_once_with('/etc/nvme/hostnqn', 'r')
         mock_create.assert_called_once_with()
         self.assertEqual(mock.sentinel.nqn, result)
 
-    @mock.patch.object(nvmeof.priv_nvme, 'create_hostnqn')
+    @mock.patch.object(utils.priv_nvme, 'create_hostnqn')
     @mock.patch.object(builtins, 'open')
     def test_get_host_nqn_err(self, mock_open, mock_create):
         mock_open.side_effect = Exception()
-        result = self.connector._get_host_nqn()
+        result = utils.get_host_nqn()
         mock_open.assert_called_once_with('/etc/nvme/hostnqn', 'r')
         mock_create.assert_not_called()
         self.assertIsNone(result)
diff -pruN 5.0.1-1/os_brick/tests/initiator/test_connector.py 5.2.0-0ubuntu1/os_brick/tests/initiator/test_connector.py
--- 5.0.1-1/os_brick/tests/initiator/test_connector.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/tests/initiator/test_connector.py	2022-02-18 15:37:53.000000000 +0000
@@ -28,6 +28,7 @@ from os_brick.initiator.connectors impor
 from os_brick.initiator import linuxfc
 from os_brick.privileged import rootwrap as priv_rootwrap
 from os_brick.tests import base as test_base
+from os_brick import utils
 
 MY_IP = '10.0.0.1'
 FAKE_SCSI_WWN = '1234567890'
@@ -45,7 +46,7 @@ class ConnectorUtilsTestCase(test_base.T
                        return_value=None)
     @mock.patch.object(nvmeof.NVMeOFConnector, '_get_host_uuid',
                        return_value=None)
-    @mock.patch.object(nvmeof.NVMeOFConnector, '_get_host_nqn',
+    @mock.patch.object(utils, 'get_host_nqn',
                        return_value=None)
     @mock.patch.object(iscsi.ISCSIConnector, 'get_initiator',
                        return_value='fakeinitiator')
diff -pruN 5.0.1-1/os_brick/tests/initiator/test_utils.py 5.2.0-0ubuntu1/os_brick/tests/initiator/test_utils.py
--- 5.0.1-1/os_brick/tests/initiator/test_utils.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/tests/initiator/test_utils.py	2022-02-18 15:37:53.000000000 +0000
@@ -59,4 +59,5 @@ class InitiatorUtilsTestCase(base.TestCa
         utils.ISCSI_SUPPORTS_MANUAL_SCAN = False
         with utils.guard_connection({'service_uuid': mock.sentinel.uuid,
                                      'shared_targets': True}):
-            mock_lock.assert_called_once_with(mock.sentinel.uuid, 'os-brick-')
+            mock_lock.assert_called_once_with(mock.sentinel.uuid, 'os-brick-',
+                                              external=True)
diff -pruN 5.0.1-1/os_brick/tests/privileged/test_nvmeof.py 5.2.0-0ubuntu1/os_brick/tests/privileged/test_nvmeof.py
--- 5.0.1-1/os_brick/tests/privileged/test_nvmeof.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/tests/privileged/test_nvmeof.py	2022-02-18 15:37:53.000000000 +0000
@@ -63,7 +63,37 @@ class PrivNVMeTestCase(base.TestCase):
                                      mock_chmod):
         hostnqn = mock.Mock()
         mock_exec.side_effect = [
-            putils.ProcessExecutionError(exit_code=errno.ENOENT),
+            putils.ProcessExecutionError(exit_code=errno.ENOENT,
+                                         stdout="totally exist sub-command"),
+            (hostnqn, mock.sentinel.err)
+        ]
+
+        res = privsep_nvme.create_hostnqn()
+
+        mock_mkdirs.assert_called_once_with('/etc/nvme',
+                                            mode=0o755,
+                                            exist_ok=True)
+        self.assertEqual(2, mock_exec.call_count)
+        mock_exec.assert_has_calls([mock.call('nvme', 'show-hostnqn'),
+                                    mock.call('nvme', 'gen-hostnqn')])
+
+        mock_open.assert_called_once_with('/etc/nvme/hostnqn', 'w')
+        stripped_hostnqn = hostnqn.strip.return_value
+        mock_open().write.assert_called_once_with(stripped_hostnqn)
+        mock_chmod.assert_called_once_with('/etc/nvme/hostnqn', 0o644)
+        self.assertEqual(stripped_hostnqn, res)
+
+    @mock.patch('os.chmod')
+    @mock.patch.object(builtins, 'open', new_callable=mock.mock_open)
+    @mock.patch('os.makedirs')
+    @mock.patch.object(rootwrap, 'custom_execute')
+    def test_create_hostnqn_generate_old_nvme_cli(self, mock_exec, mock_mkdirs,
+                                                  mock_open, mock_chmod):
+        hostnqn = mock.Mock()
+        mock_exec.side_effect = [
+            putils.ProcessExecutionError(
+                exit_code=231,
+                stdout="error: Invalid sub-command\n"),
             (hostnqn, mock.sentinel.err)
         ]
 
diff -pruN 5.0.1-1/os_brick/utils.py 5.2.0-0ubuntu1/os_brick/utils.py
--- 5.0.1-1/os_brick/utils.py	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick/utils.py	2022-02-18 15:37:53.000000000 +0000
@@ -16,17 +16,19 @@ import functools
 import inspect
 import logging as py_logging
 import time
+from typing import Callable, Tuple, Type, Union   # noqa: H301
 
 from oslo_concurrency import processutils
 from oslo_log import log as logging
 from oslo_utils import strutils
 
 from os_brick.i18n import _
+from os_brick.privileged import nvmeof as priv_nvme
 
 _time_sleep = time.sleep
 
 
-def _sleep(duration):
+def _sleep(secs: float) -> None:
     """Helper class to make it easier to work around tenacity's sleep calls.
 
     Apparently we are all idiots for wanting to test our code here [0], so this
@@ -34,7 +36,7 @@ def _sleep(duration):
 
     [0] https://github.com/jd/tenacity/issues/25
     """
-    _time_sleep(duration)
+    _time_sleep(secs)
 
 
 time.sleep = _sleep
@@ -47,17 +49,25 @@ LOG = logging.getLogger(__name__)
 
 class retry_if_exit_code(tenacity.retry_if_exception):
     """Retry on ProcessExecutionError specific exit codes."""
-    def __init__(self, codes):
+    def __init__(self, codes: Union[int, Tuple[int, ...]]):
         self.codes = (codes,) if isinstance(codes, int) else codes
         super(retry_if_exit_code, self).__init__(self._check_exit_code)
 
-    def _check_exit_code(self, exc):
-        return (exc and isinstance(exc, processutils.ProcessExecutionError) and
+    def _check_exit_code(self, exc: Type[Exception]) -> bool:
+        return (bool(exc) and
+                isinstance(exc, processutils.ProcessExecutionError) and
                 exc.exit_code in self.codes)
 
 
-def retry(retry_param, interval=1, retries=3, backoff_rate=2,
-          retry=tenacity.retry_if_exception_type):
+def retry(retry_param: Union[None,
+                             Type[Exception],
+                             Tuple[Type[Exception], ...],
+                             int,
+                             Tuple[int, ...]],
+          interval: float = 1,
+          retries: int = 3,
+          backoff_rate: float = 2,
+          retry: Callable = tenacity.retry_if_exception_type) -> Callable:
 
     if retries < 1:
         raise ValueError(_('Retries must be greater than or '
@@ -82,7 +92,7 @@ def retry(retry_param, interval=1, retri
     return _decorator
 
 
-def platform_matches(current_platform, connector_platform):
+def platform_matches(current_platform: str, connector_platform: str) -> bool:
     curr_p = current_platform.upper()
     conn_p = connector_platform.upper()
     if conn_p == 'ALL':
@@ -95,7 +105,7 @@ def platform_matches(current_platform, c
     return False
 
 
-def os_matches(current_os, connector_os):
+def os_matches(current_os: str, connector_os: str) -> bool:
     curr_os = current_os.upper()
     conn_os = connector_os.upper()
     if conn_os == 'ALL':
@@ -109,7 +119,7 @@ def os_matches(current_os, connector_os)
     return False
 
 
-def merge_dict(dict1, dict2):
+def merge_dict(dict1: dict, dict2: dict) -> dict:
     """Try to safely merge 2 dictionaries."""
     if type(dict1) is not dict:
         raise Exception("dict1 is not a dictionary")
@@ -121,7 +131,7 @@ def merge_dict(dict1, dict2):
     return dict3
 
 
-def trace(f):
+def trace(f: Callable) -> Callable:
     """Trace calls to the decorated function.
 
     This decorator should always be defined as the outermost decorator so it
@@ -189,7 +199,7 @@ def trace(f):
     return trace_logging_wrapper
 
 
-def convert_str(text):
+def convert_str(text: Union[bytes, str]) -> str:
     """Convert to native string.
 
     Convert bytes and Unicode strings to native strings:
@@ -200,3 +210,14 @@ def convert_str(text):
         return text.decode('utf-8')
     else:
         return text
+
+
+def get_host_nqn():
+    try:
+        with open('/etc/nvme/hostnqn', 'r') as f:
+            host_nqn = f.read().strip()
+    except IOError:
+        host_nqn = priv_nvme.create_hostnqn()
+    except Exception:
+        host_nqn = None
+    return host_nqn
diff -pruN 5.0.1-1/os_brick.egg-info/dependency_links.txt 5.2.0-0ubuntu1/os_brick.egg-info/dependency_links.txt
--- 5.0.1-1/os_brick.egg-info/dependency_links.txt	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick.egg-info/dependency_links.txt	2022-02-18 15:38:36.000000000 +0000
@@ -0,0 +1 @@
+
diff -pruN 5.0.1-1/os_brick.egg-info/not-zip-safe 5.2.0-0ubuntu1/os_brick.egg-info/not-zip-safe
--- 5.0.1-1/os_brick.egg-info/not-zip-safe	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick.egg-info/not-zip-safe	2022-02-18 15:38:36.000000000 +0000
@@ -0,0 +1 @@
+
diff -pruN 5.0.1-1/os_brick.egg-info/pbr.json 5.2.0-0ubuntu1/os_brick.egg-info/pbr.json
--- 5.0.1-1/os_brick.egg-info/pbr.json	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick.egg-info/pbr.json	2022-02-18 15:38:36.000000000 +0000
@@ -0,0 +1 @@
+{"git_version": "feb62fa", "is_release": true}
\ No newline at end of file
diff -pruN 5.0.1-1/os_brick.egg-info/PKG-INFO 5.2.0-0ubuntu1/os_brick.egg-info/PKG-INFO
--- 5.0.1-1/os_brick.egg-info/PKG-INFO	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick.egg-info/PKG-INFO	2022-02-18 15:38:36.000000000 +0000
@@ -0,0 +1,74 @@
+Metadata-Version: 1.2
+Name: os-brick
+Version: 5.2.0
+Summary: OpenStack Cinder brick library for managing local volume attaches
+Home-page: https://docs.openstack.org/os-brick/
+Author: OpenStack
+Author-email: openstack-discuss@lists.openstack.org
+License: UNKNOWN
+Description: ========================
+        Team and repository tags
+        ========================
+        
+        .. image:: https://governance.openstack.org/tc/badges/os-brick.svg
+            :target: https://governance.openstack.org/tc/reference/tags/index.html
+        
+        .. Change things from this point on
+        
+        =====
+        brick
+        =====
+        
+        .. image:: https://img.shields.io/pypi/v/os-brick.svg
+            :target: https://pypi.org/project/os-brick/
+            :alt: Latest Version
+        
+        .. image:: https://img.shields.io/pypi/dm/os-brick.svg
+            :target: https://pypi.org/project/os-brick/
+            :alt: Downloads
+        
+        OpenStack Cinder brick library for managing local volume attaches
+        
+        
+        Features
+        --------
+        
+        * Discovery of volumes being attached to a host for many transport protocols.
+        * Removal of volumes from a host.
+        
+        Hacking
+        -------
+        
+        Hacking on brick requires Python 3.6+. A recent tox is required, as is a recent
+        virtualenv (20.2.2 or newer).
+        
+        If "tox -e py34" fails with the error "db type could not be determined", remove
+        the .testrepository/ directory and then run "tox -e py34".
+        
+        For any other information, refer to the developer documents:
+          https://docs.openstack.org/os-brick/latest/
+        OR refer to the parent project, Cinder:
+          https://docs.openstack.org/cinder/latest/
+        Release notes for the project can be found at:
+          https://docs.openstack.org/releasenotes/os-brick
+        
+        * License: Apache License, Version 2.0
+        * Source: https://opendev.org/openstack/os-brick
+        * Bugs: https://bugs.launchpad.net/os-brick
+        
+        
+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
+Classifier: Programming Language :: Python :: 3.9
+Requires-Python: >=3.6
diff -pruN 5.0.1-1/os_brick.egg-info/requires.txt 5.2.0-0ubuntu1/os_brick.egg-info/requires.txt
--- 5.0.1-1/os_brick.egg-info/requires.txt	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick.egg-info/requires.txt	2022-02-18 15:38:36.000000000 +0000
@@ -0,0 +1,13 @@
+eventlet!=0.32.0,>=0.30.1
+os-win>=5.5.0
+oslo.concurrency>=4.5.0
+oslo.context>=3.4.0
+oslo.i18n>=5.1.0
+oslo.log>=4.6.1
+oslo.privsep>=2.6.2
+oslo.serialization>=4.2.0
+oslo.service>=2.8.0
+oslo.utils>=4.12.1
+pbr>=5.8.0
+requests>=2.25.1
+tenacity>=6.3.1
diff -pruN 5.0.1-1/os_brick.egg-info/SOURCES.txt 5.2.0-0ubuntu1/os_brick.egg-info/SOURCES.txt
--- 5.0.1-1/os_brick.egg-info/SOURCES.txt	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick.egg-info/SOURCES.txt	2022-02-18 15:38:37.000000000 +0000
@@ -0,0 +1,238 @@
+.coveragerc
+.mailmap
+.stestr.conf
+.zuul.yaml
+AUTHORS
+CONTRIBUTING.rst
+ChangeLog
+HACKING.rst
+LICENSE
+README.rst
+bindep.txt
+mypy-files.txt
+pylintrc
+requirements.txt
+setup.cfg
+setup.py
+test-requirements.txt
+tox.ini
+doc/requirements.txt
+doc/source/conf.py
+doc/source/index.rst
+doc/source/contributor/contributing.rst
+doc/source/install/index.rst
+doc/source/reference/index.rst
+doc/source/reference/os_brick/exception.rst
+doc/source/reference/os_brick/index.rst
+doc/source/reference/os_brick/initiator/connector.rst
+doc/source/reference/os_brick/initiator/index.rst
+doc/source/user/tutorial.rst
+etc/os-brick/rootwrap.d/os-brick.filters
+os_brick/__init__.py
+os_brick/exception.py
+os_brick/executor.py
+os_brick/i18n.py
+os_brick/utils.py
+os_brick/version.py
+os_brick.egg-info/PKG-INFO
+os_brick.egg-info/SOURCES.txt
+os_brick.egg-info/dependency_links.txt
+os_brick.egg-info/not-zip-safe
+os_brick.egg-info/pbr.json
+os_brick.egg-info/requires.txt
+os_brick.egg-info/top_level.txt
+os_brick/caches/__init__.py
+os_brick/caches/opencas.py
+os_brick/encryptors/__init__.py
+os_brick/encryptors/base.py
+os_brick/encryptors/cryptsetup.py
+os_brick/encryptors/luks.py
+os_brick/encryptors/nop.py
+os_brick/initiator/__init__.py
+os_brick/initiator/connector.py
+os_brick/initiator/host_driver.py
+os_brick/initiator/initiator_connector.py
+os_brick/initiator/linuxfc.py
+os_brick/initiator/linuxrbd.py
+os_brick/initiator/linuxscsi.py
+os_brick/initiator/utils.py
+os_brick/initiator/connectors/__init__.py
+os_brick/initiator/connectors/base.py
+os_brick/initiator/connectors/base_iscsi.py
+os_brick/initiator/connectors/base_rbd.py
+os_brick/initiator/connectors/fake.py
+os_brick/initiator/connectors/fibre_channel.py
+os_brick/initiator/connectors/fibre_channel_ppc64.py
+os_brick/initiator/connectors/fibre_channel_s390x.py
+os_brick/initiator/connectors/gpfs.py
+os_brick/initiator/connectors/huawei.py
+os_brick/initiator/connectors/iscsi.py
+os_brick/initiator/connectors/lightos.py
+os_brick/initiator/connectors/local.py
+os_brick/initiator/connectors/nvmeof.py
+os_brick/initiator/connectors/rbd.py
+os_brick/initiator/connectors/remotefs.py
+os_brick/initiator/connectors/scaleio.py
+os_brick/initiator/connectors/storpool.py
+os_brick/initiator/connectors/vmware.py
+os_brick/initiator/windows/__init__.py
+os_brick/initiator/windows/base.py
+os_brick/initiator/windows/fibre_channel.py
+os_brick/initiator/windows/iscsi.py
+os_brick/initiator/windows/rbd.py
+os_brick/initiator/windows/smbfs.py
+os_brick/local_dev/__init__.py
+os_brick/local_dev/lvm.py
+os_brick/privileged/__init__.py
+os_brick/privileged/lightos.py
+os_brick/privileged/nvmeof.py
+os_brick/privileged/rbd.py
+os_brick/privileged/rootwrap.py
+os_brick/privileged/scaleio.py
+os_brick/remotefs/__init__.py
+os_brick/remotefs/remotefs.py
+os_brick/remotefs/windows_remotefs.py
+os_brick/tests/__init__.py
+os_brick/tests/base.py
+os_brick/tests/test_brick.py
+os_brick/tests/test_exception.py
+os_brick/tests/test_executor.py
+os_brick/tests/test_utils.py
+os_brick/tests/caches/__init__.py
+os_brick/tests/caches/test_init.py
+os_brick/tests/caches/test_opencas.py
+os_brick/tests/encryptors/__init__.py
+os_brick/tests/encryptors/test_base.py
+os_brick/tests/encryptors/test_cryptsetup.py
+os_brick/tests/encryptors/test_luks.py
+os_brick/tests/encryptors/test_nop.py
+os_brick/tests/initiator/__init__.py
+os_brick/tests/initiator/test_connector.py
+os_brick/tests/initiator/test_host_driver.py
+os_brick/tests/initiator/test_linuxfc.py
+os_brick/tests/initiator/test_linuxrbd.py
+os_brick/tests/initiator/test_linuxscsi.py
+os_brick/tests/initiator/test_utils.py
+os_brick/tests/initiator/connectors/__init__.py
+os_brick/tests/initiator/connectors/test_base_iscsi.py
+os_brick/tests/initiator/connectors/test_base_rbd.py
+os_brick/tests/initiator/connectors/test_fibre_channel.py
+os_brick/tests/initiator/connectors/test_fibre_channel_ppc64.py
+os_brick/tests/initiator/connectors/test_fibre_channel_s390x.py
+os_brick/tests/initiator/connectors/test_gpfs.py
+os_brick/tests/initiator/connectors/test_huawei.py
+os_brick/tests/initiator/connectors/test_iscsi.py
+os_brick/tests/initiator/connectors/test_iser.py
+os_brick/tests/initiator/connectors/test_lightos.py
+os_brick/tests/initiator/connectors/test_local.py
+os_brick/tests/initiator/connectors/test_nvmeof.py
+os_brick/tests/initiator/connectors/test_rbd.py
+os_brick/tests/initiator/connectors/test_remotefs.py
+os_brick/tests/initiator/connectors/test_scaleio.py
+os_brick/tests/initiator/connectors/test_storpool.py
+os_brick/tests/initiator/connectors/test_vmware.py
+os_brick/tests/local_dev/__init__.py
+os_brick/tests/local_dev/fake_lvm.py
+os_brick/tests/local_dev/test_brick_lvm.py
+os_brick/tests/privileged/__init__.py
+os_brick/tests/privileged/test_nvmeof.py
+os_brick/tests/privileged/test_rbd.py
+os_brick/tests/privileged/test_rootwrap.py
+os_brick/tests/remotefs/__init__.py
+os_brick/tests/remotefs/test_remotefs.py
+os_brick/tests/remotefs/test_windows_remotefs.py
+os_brick/tests/windows/__init__.py
+os_brick/tests/windows/fake_win_conn.py
+os_brick/tests/windows/test_base.py
+os_brick/tests/windows/test_base_connector.py
+os_brick/tests/windows/test_factory.py
+os_brick/tests/windows/test_fibre_channel.py
+os_brick/tests/windows/test_iscsi.py
+os_brick/tests/windows/test_rbd.py
+os_brick/tests/windows/test_smbfs.py
+releasenotes/notes/add-luks2-support-13563cfe83aba69c.yaml
+releasenotes/notes/add-vstorage-protocol-b536f4e21d764801.yaml
+releasenotes/notes/add-windows-fibre-channel-030c095c149da321.yaml
+releasenotes/notes/add-windows-iscsi-15d6b1392695f978.yaml
+releasenotes/notes/add-windows-smbfs-d86edaa003130a31.yaml
+releasenotes/notes/add_custom_keyring_for_rbd_connection-eccbaae9ee5f3491.yaml
+releasenotes/notes/bp-lightbits-lightos-clustered-nvmetcp-connector-fd8dfd73330973e9.yaml
+releasenotes/notes/bug-1722432-2408dab55c903c5b.yaml
+releasenotes/notes/bug-1823200-scaleio-upgrade-3e83b5c9dd148714.yaml
+releasenotes/notes/bug-1823200-victoria-b414a1806cba3998.yaml
+releasenotes/notes/bug-1862443-e87ef38b60f9b979.yaml
+releasenotes/notes/bug-1865754-ceph-octopus-compatibility-0aa9b8bc1b028301.yaml
+releasenotes/notes/bug-1884052-798094496dccf23c.yaml
+releasenotes/notes/bug-1915678-901a6bd24ecede72.yaml
+releasenotes/notes/bug-1924652-2323f905f62ef8ba.yaml
+releasenotes/notes/bug-1929223-powerflex-connector-certificate-validation-cf9ffc98391115d5.yaml
+releasenotes/notes/bug-1938870-af85c420d1a108a9.yaml
+releasenotes/notes/bug-1944474-55c5ebb3a37801aa.yaml
+releasenotes/notes/bug-1945323-4140f5aff3558082.yaml
+releasenotes/notes/bug-nvmeof-connector-support-multipath-kernels-ff6f1f27fdea2c8e.yaml
+releasenotes/notes/default-timeout-26c838af8b7af9fc.yaml
+releasenotes/notes/delay-legacy-encryption-provider-name-deprecation-c0d07be3f0d92afd.yaml
+releasenotes/notes/deprecate-plain-cryptsetup-encryptor-0a279abc0b0d718c.yaml
+releasenotes/notes/disconnect-multipath-cfg-changed-637abc5ecf44fb10.yaml
+releasenotes/notes/drop-py2-7dcde3ccd0e167b0.yaml
+releasenotes/notes/external-locks-9f015988ebdc37d6.yaml
+releasenotes/notes/fc-always-check-single-wwnn-1595689da0eb673b.yaml
+releasenotes/notes/fc-flush-single-path-22ed6cc7b56a6d9b.yaml
+releasenotes/notes/fix-fc-scan-too-broad-3c576e1846b7f05f.yaml
+releasenotes/notes/fix-generate-hostnqn-in-case-old-nvmecli.yaml
+releasenotes/notes/fix-multipath-disconnect-819d01e6e981883e.yaml
+releasenotes/notes/fix-nvme-issues-8dfc15cb691389fe.yaml
+releasenotes/notes/improve-get_sysfs_wwn-df38ea88cdcdcc94.yaml
+releasenotes/notes/improve-iscsi-multipath-detection-f36f28a993f61936.yaml
+releasenotes/notes/introduce-encryption-provider-constants-a7cd0ce58da2bae8.yaml
+releasenotes/notes/iscsi_manual_scan_support-d64a1c3c8e1986b4.yaml
+releasenotes/notes/local-attach-in-rbd-connector-c06347fb164b084a.yaml
+releasenotes/notes/lvm-delete-error-76f2cc9d8dc91f01.yaml
+releasenotes/notes/multipath-improvements-596c2c6eadfba6ea.yaml
+releasenotes/notes/nvme-flush-f31ab337224e5d3d.yaml
+releasenotes/notes/nvme-hostnqn-c2611dc56729183b.yaml
+releasenotes/notes/nvme-rsd-support-d487afd77c534fa1.yaml
+releasenotes/notes/nvmeof-multiple-volumes-within-subsystem-support-05879c1c3bdf52c9.yaml
+releasenotes/notes/rbd-non-openstack-support-28ee093d7d3a700e.yaml
+releasenotes/notes/rbd-windows-support-ef6e8184842409dd.yaml
+releasenotes/notes/rbd_check_valid_device-2f50c0639adb8e7c.yaml
+releasenotes/notes/rbd_extend_volume-5bc6adc08f662c5b.yaml
+releasenotes/notes/refactor_iscsi_connect-dfbb24305a954783.yaml
+releasenotes/notes/refactor_iscsi_disconnect-557f4173bc1ae4ed.yaml
+releasenotes/notes/remove-aoe-7a97315a73c7b24f.yaml
+releasenotes/notes/remove-bug-1633518-workaround-75c2e26843660696.yaml
+releasenotes/notes/remove-disco-0809537ffb8c50eb.yaml
+releasenotes/notes/remove-drbd-21872230fcac1138.yaml
+releasenotes/notes/remove-hgst-daa7f07c307974d0.yaml
+releasenotes/notes/remove-hyperscale-468f1b61bf4dadf8.yaml
+releasenotes/notes/remove-old-constants-20021f5b30bde890.yaml
+releasenotes/notes/remove-sheepdog-611257b28bc88934.yaml
+releasenotes/notes/scaleio-extend-attached-ec44d3a72395882c.yaml
+releasenotes/notes/start-using-reno-23e8d5f1a30851a1.yaml
+releasenotes/notes/update-nvmeof-connector-6260a658c15a9a6e.yaml
+releasenotes/notes/ussuri-release-979d709dfa7df068.yaml
+releasenotes/notes/veritas-hyperscale-connector-fe56cec68b1947cd.yaml
+releasenotes/notes/vmware-vmdk-connector-19e6999e6cae43cd.yaml
+releasenotes/notes/yoga-known-issues-f1248af0e328d63e.yaml
+releasenotes/source/conf.py
+releasenotes/source/index.rst
+releasenotes/source/mitaka.rst
+releasenotes/source/newton.rst
+releasenotes/source/ocata.rst
+releasenotes/source/pike.rst
+releasenotes/source/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/wallaby.rst
+releasenotes/source/xena.rst
+releasenotes/source/_static/.placeholder
+releasenotes/source/_templates/.placeholder
+tools/fast8.sh
+tools/generate_connector_list.py
+tools/lintstack.py
+tools/lintstack.sh
+tools/mypywrap.sh
\ No newline at end of file
diff -pruN 5.0.1-1/os_brick.egg-info/top_level.txt 5.2.0-0ubuntu1/os_brick.egg-info/top_level.txt
--- 5.0.1-1/os_brick.egg-info/top_level.txt	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/os_brick.egg-info/top_level.txt	2022-02-18 15:38:36.000000000 +0000
@@ -0,0 +1 @@
+os_brick
diff -pruN 5.0.1-1/PKG-INFO 5.2.0-0ubuntu1/PKG-INFO
--- 5.0.1-1/PKG-INFO	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/PKG-INFO	2022-02-18 15:38:37.087080500 +0000
@@ -0,0 +1,74 @@
+Metadata-Version: 1.2
+Name: os-brick
+Version: 5.2.0
+Summary: OpenStack Cinder brick library for managing local volume attaches
+Home-page: https://docs.openstack.org/os-brick/
+Author: OpenStack
+Author-email: openstack-discuss@lists.openstack.org
+License: UNKNOWN
+Description: ========================
+        Team and repository tags
+        ========================
+        
+        .. image:: https://governance.openstack.org/tc/badges/os-brick.svg
+            :target: https://governance.openstack.org/tc/reference/tags/index.html
+        
+        .. Change things from this point on
+        
+        =====
+        brick
+        =====
+        
+        .. image:: https://img.shields.io/pypi/v/os-brick.svg
+            :target: https://pypi.org/project/os-brick/
+            :alt: Latest Version
+        
+        .. image:: https://img.shields.io/pypi/dm/os-brick.svg
+            :target: https://pypi.org/project/os-brick/
+            :alt: Downloads
+        
+        OpenStack Cinder brick library for managing local volume attaches
+        
+        
+        Features
+        --------
+        
+        * Discovery of volumes being attached to a host for many transport protocols.
+        * Removal of volumes from a host.
+        
+        Hacking
+        -------
+        
+        Hacking on brick requires Python 3.6+. A recent tox is required, as is a recent
+        virtualenv (20.2.2 or newer).
+        
+        If "tox -e py34" fails with the error "db type could not be determined", remove
+        the .testrepository/ directory and then run "tox -e py34".
+        
+        For any other information, refer to the developer documents:
+          https://docs.openstack.org/os-brick/latest/
+        OR refer to the parent project, Cinder:
+          https://docs.openstack.org/cinder/latest/
+        Release notes for the project can be found at:
+          https://docs.openstack.org/releasenotes/os-brick
+        
+        * License: Apache License, Version 2.0
+        * Source: https://opendev.org/openstack/os-brick
+        * Bugs: https://bugs.launchpad.net/os-brick
+        
+        
+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
+Classifier: Programming Language :: Python :: 3.9
+Requires-Python: >=3.6
diff -pruN 5.0.1-1/README.rst 5.2.0-0ubuntu1/README.rst
--- 5.0.1-1/README.rst	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/README.rst	2022-02-18 15:37:53.000000000 +0000
@@ -31,9 +31,8 @@ Features
 Hacking
 -------
 
-Hacking on brick requires python-gdbm (for Debian derived distributions),
-Python 2.7 and Python 3.4. A recent tox is required, as is a recent virtualenv
-(13.1.0 or newer).
+Hacking on brick requires Python 3.6+. A recent tox is required, as is a recent
+virtualenv (20.2.2 or newer).
 
 If "tox -e py34" fails with the error "db type could not be determined", remove
 the .testrepository/ directory and then run "tox -e py34".
diff -pruN 5.0.1-1/releasenotes/notes/bp-lightbits-lightos-clustered-nvmetcp-connector-fd8dfd73330973e9.yaml 5.2.0-0ubuntu1/releasenotes/notes/bp-lightbits-lightos-clustered-nvmetcp-connector-fd8dfd73330973e9.yaml
--- 5.0.1-1/releasenotes/notes/bp-lightbits-lightos-clustered-nvmetcp-connector-fd8dfd73330973e9.yaml	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/releasenotes/notes/bp-lightbits-lightos-clustered-nvmetcp-connector-fd8dfd73330973e9.yaml	2022-02-18 15:37:53.000000000 +0000
@@ -0,0 +1,10 @@
+---
+features:
+  - |
+    Lightbits LightOS connector: new os-brick connector for
+    Lightbits(TM) LightOS(R). Lightbits Labs
+    (https://www.lightbitslabs.com) LightOS is software-defined, cloud
+    native, high-performance, clustered scale-out and redundant
+    NVMe/TCP storage that performs like local NVMe flash. This
+    connector requires the Lightbits discovery-client, available from
+    Lightbits Labs.
diff -pruN 5.0.1-1/releasenotes/notes/bug-1929223-powerflex-connector-certificate-validation-cf9ffc98391115d5.yaml 5.2.0-0ubuntu1/releasenotes/notes/bug-1929223-powerflex-connector-certificate-validation-cf9ffc98391115d5.yaml
--- 5.0.1-1/releasenotes/notes/bug-1929223-powerflex-connector-certificate-validation-cf9ffc98391115d5.yaml	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/releasenotes/notes/bug-1929223-powerflex-connector-certificate-validation-cf9ffc98391115d5.yaml	2022-02-18 15:37:53.000000000 +0000
@@ -0,0 +1,5 @@
+---
+fixes:
+  - |
+    `Bug #1929223 <https://bugs.launchpad.net/os-brick/+bug/1929223>`_: Fixed
+    HTTPS certificate validation was disabled in PowerFlex connector.
diff -pruN 5.0.1-1/releasenotes/notes/bug-1938870-af85c420d1a108a9.yaml 5.2.0-0ubuntu1/releasenotes/notes/bug-1938870-af85c420d1a108a9.yaml
--- 5.0.1-1/releasenotes/notes/bug-1938870-af85c420d1a108a9.yaml	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/releasenotes/notes/bug-1938870-af85c420d1a108a9.yaml	2022-02-18 15:37:53.000000000 +0000
@@ -0,0 +1,5 @@
+---
+fixes:
+  - |
+    `Bug #1938870 <https://bugs.launchpad.net/cinder/+bug/1938870>`_: Fixed
+    KumoScale Driver replicated volume missing portals attaches without raid.
diff -pruN 5.0.1-1/releasenotes/notes/bug-1944474-55c5ebb3a37801aa.yaml 5.2.0-0ubuntu1/releasenotes/notes/bug-1944474-55c5ebb3a37801aa.yaml
--- 5.0.1-1/releasenotes/notes/bug-1944474-55c5ebb3a37801aa.yaml	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/releasenotes/notes/bug-1944474-55c5ebb3a37801aa.yaml	2022-02-18 15:37:53.000000000 +0000
@@ -0,0 +1,6 @@
+---
+fixes:
+  - |
+    `Bug #1944474 <https://bugs.launchpad.net/os-brick/+bug/1944474>`_: Fixed
+    missing retries to reinitiate iSCSI connections with high concurrency of
+    connections and with multipath enabled.
diff -pruN 5.0.1-1/releasenotes/notes/bug-nvmeof-connector-support-multipath-kernels-ff6f1f27fdea2c8e.yaml 5.2.0-0ubuntu1/releasenotes/notes/bug-nvmeof-connector-support-multipath-kernels-ff6f1f27fdea2c8e.yaml
--- 5.0.1-1/releasenotes/notes/bug-nvmeof-connector-support-multipath-kernels-ff6f1f27fdea2c8e.yaml	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/releasenotes/notes/bug-nvmeof-connector-support-multipath-kernels-ff6f1f27fdea2c8e.yaml	2022-02-18 15:37:53.000000000 +0000
@@ -0,0 +1,7 @@
+---
+fixes:
+  - |
+    NVMe-oF connector `bug #1943615
+    <https://bugs.launchpad.net/os-brick/+bug/1943615>`_: Fixed get nvme
+    device failing on kernels with multipath enabled by using the generic
+    form ``/sys/class/block/<ctrl>n*`` for finding nvme devices.
diff -pruN 5.0.1-1/releasenotes/notes/external-locks-9f015988ebdc37d6.yaml 5.2.0-0ubuntu1/releasenotes/notes/external-locks-9f015988ebdc37d6.yaml
--- 5.0.1-1/releasenotes/notes/external-locks-9f015988ebdc37d6.yaml	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/releasenotes/notes/external-locks-9f015988ebdc37d6.yaml	2022-02-18 15:37:53.000000000 +0000
@@ -0,0 +1,12 @@
+---
+upgrade:
+  - |
+    Services using os-brick need to set the ``lock_path`` configuration option
+    in their ``[oslo_concurrency]`` section since it doesn't have a valid
+    default (related `bug #1947370
+    <https://bugs.launchpad.net/cinder/+bug/1947370>`_).
+fixes:
+  - |
+    `Bug #1947370 <https://bugs.launchpad.net/cinder/+bug/1947370>`_: Fixed
+    race conditions on iSCSI with shared targets and NVMe ``connect_volume``
+    and ``disconnect_volume`` calls.
diff -pruN 5.0.1-1/releasenotes/notes/fix-generate-hostnqn-in-case-old-nvmecli.yaml 5.2.0-0ubuntu1/releasenotes/notes/fix-generate-hostnqn-in-case-old-nvmecli.yaml
--- 5.0.1-1/releasenotes/notes/fix-generate-hostnqn-in-case-old-nvmecli.yaml	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/releasenotes/notes/fix-generate-hostnqn-in-case-old-nvmecli.yaml	2022-02-18 15:37:53.000000000 +0000
@@ -0,0 +1,8 @@
+---
+fixes:
+  - |
+    The nvmeof connector relies on nvme-cli to query the host-nqn.
+    Versions of nvme-cli < 1.10 do not have the 'show-hostnqn' command,
+    which could cause the connector to fail to generate the hostnqn.
+    Fixed the connector to either get or generate the hostnqn with versions
+    of nvme-cli<1.10 that do not have 'show-hostnqn'.
diff -pruN 5.0.1-1/releasenotes/notes/yoga-known-issues-f1248af0e328d63e.yaml 5.2.0-0ubuntu1/releasenotes/notes/yoga-known-issues-f1248af0e328d63e.yaml
--- 5.0.1-1/releasenotes/notes/yoga-known-issues-f1248af0e328d63e.yaml	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/releasenotes/notes/yoga-known-issues-f1248af0e328d63e.yaml	2022-02-18 15:37:53.000000000 +0000
@@ -0,0 +1,10 @@
+---
+prelude: >
+    Welcome to the Yoga release of the os-brick library.
+issues:
+  - |
+    At release time, we became aware that recent changes to the
+    nvmeof connector were tested only in configurations where the
+    NVMe storage backend supports namespace AER.  One issue arising
+    from this is being tracked by `Bug #1961102
+    <https://bugs.launchpad.net/os-brick/+bug/1961102>`_.
diff -pruN 5.0.1-1/releasenotes/source/index.rst 5.2.0-0ubuntu1/releasenotes/source/index.rst
--- 5.0.1-1/releasenotes/source/index.rst	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/releasenotes/source/index.rst	2022-02-18 15:37:53.000000000 +0000
@@ -6,6 +6,7 @@
    :maxdepth: 1
 
    unreleased
+   xena
    wallaby
    victoria
    ussuri
diff -pruN 5.0.1-1/releasenotes/source/xena.rst 5.2.0-0ubuntu1/releasenotes/source/xena.rst
--- 5.0.1-1/releasenotes/source/xena.rst	1970-01-01 00:00:00.000000000 +0000
+++ 5.2.0-0ubuntu1/releasenotes/source/xena.rst	2022-02-18 15:37:53.000000000 +0000
@@ -0,0 +1,6 @@
+=========================
+Xena Series Release Notes
+=========================
+
+.. release-notes::
+   :branch: stable/xena
diff -pruN 5.0.1-1/requirements.txt 5.2.0-0ubuntu1/requirements.txt
--- 5.0.1-1/requirements.txt	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/requirements.txt	2022-02-18 15:37:53.000000000 +0000
@@ -2,16 +2,16 @@
 # of appearance. Changing the order has an impact on the overall integration
 # process, which may cause wedges in the gate later.
 
-pbr>=5.5.1 # Apache-2.0
-eventlet>=0.30.1 # MIT
-oslo.concurrency>=4.4.0 # Apache-2.0
-oslo.context>=3.1.1 # Apache-2.0
-oslo.log>=4.4.0 # Apache-2.0
-oslo.i18n>=5.0.1 # Apache-2.0
-oslo.privsep>=2.4.0 # Apache-2.0
-oslo.serialization>=4.1.0 # Apache-2.0
-oslo.service>=2.5.0 # Apache-2.0
-oslo.utils>=4.8.0 # Apache-2.0
+pbr>=5.8.0 # Apache-2.0
+eventlet>=0.30.1,!=0.32.0 # MIT
+oslo.concurrency>=4.5.0 # Apache-2.0
+oslo.context>=3.4.0 # Apache-2.0
+oslo.log>=4.6.1 # Apache-2.0
+oslo.i18n>=5.1.0 # Apache-2.0
+oslo.privsep>=2.6.2 # Apache-2.0
+oslo.serialization>=4.2.0 # Apache-2.0
+oslo.service>=2.8.0 # Apache-2.0
+oslo.utils>=4.12.1 # Apache-2.0
 requests>=2.25.1 # Apache-2.0
 tenacity>=6.3.1 # Apache-2.0
-os-win>=5.4.0 # Apache-2.0
+os-win>=5.5.0 # Apache-2.0
diff -pruN 5.0.1-1/setup.cfg 5.2.0-0ubuntu1/setup.cfg
--- 5.0.1-1/setup.cfg	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/setup.cfg	2022-02-18 15:38:37.091080700 +0000
@@ -1,34 +1,35 @@
 [metadata]
 name = os-brick
 summary = OpenStack Cinder brick library for managing local volume attaches
-description_file =
-    README.rst
+description_file = 
+	README.rst
 author = OpenStack
 author_email = openstack-discuss@lists.openstack.org
 home_page = https://docs.openstack.org/os-brick/
 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
+	Programming Language :: Python :: 3.9
 
 [files]
-packages =
-    os_brick
-data_files =
-    etc/ = etc/*
+packages = 
+	os_brick
+data_files = 
+	etc/ = etc/*
 
 [egg_info]
-tag_build =
+tag_build = 
 tag_date = 0
 tag_svn_revision = 0
 
@@ -43,3 +44,4 @@ warn_unused_ignores = true
 show_error_codes = true
 pretty = true
 html_report = mypy-report
+
diff -pruN 5.0.1-1/test-requirements.txt 5.2.0-0ubuntu1/test-requirements.txt
--- 5.0.1-1/test-requirements.txt	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/test-requirements.txt	2022-02-18 15:37:53.000000000 +0000
@@ -6,12 +6,12 @@ hacking>=4.0.0,<4.1.0 # Apache-2.0
 flake8-import-order # LGPLv3
 coverage>=5.5 # Apache-2.0
 ddt>=1.4.1 # MIT
-oslotest>=4.4.1 # Apache-2.0
+oslotest>=4.5.0 # Apache-2.0
 testscenarios>=0.5.0 # Apache-2.0/BSD
 testtools>=2.4.0 # MIT
-stestr>=3.1.0 # Apache-2.0
-oslo.vmware>=3.8.0 # Apache-2.0
-castellan>=3.7.0 # Apache-2.0
+stestr>=3.2.1 # Apache-2.0
+oslo.vmware>=3.10.0 # Apache-2.0
+castellan>=3.10.0 # Apache-2.0
 pycodestyle==2.6.0 # MIT
 doc8>=0.8.1 # Apache-2.0
 fixtures>=3.0.0 # Apache-2.0/BSD
diff -pruN 5.0.1-1/tox.ini 5.2.0-0ubuntu1/tox.ini
--- 5.0.1-1/tox.ini	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/tox.ini	2022-02-18 15:37:53.000000000 +0000
@@ -18,7 +18,7 @@ setenv =
     OS_STDERR_CAPTURE=1
 
 deps =
-       -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/xena}
+       -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
        -r{toxinidir}/requirements.txt
        -r{toxinidir}/test-requirements.txt
 
@@ -55,7 +55,7 @@ commands: bandit -r os_brick -x os_brick
 
 [testenv:pylint]
 deps =
-       -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/xena}
+       -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
        -r{toxinidir}/requirements.txt
        pylint==0.26.0
 commands = bash tools/lintstack.sh
@@ -77,7 +77,7 @@ commands =
 
 [testenv:docs]
 deps =
-  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/xena}
+  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
   -r{toxinidir}/doc/requirements.txt
 commands =
   rm -fr doc/build doc/source/contributor/api/ .autogenerated
diff -pruN 5.0.1-1/.zuul.yaml 5.2.0-0ubuntu1/.zuul.yaml
--- 5.0.1-1/.zuul.yaml	2021-09-30 16:15:57.000000000 +0000
+++ 5.2.0-0ubuntu1/.zuul.yaml	2022-02-18 15:37:53.000000000 +0000
@@ -2,7 +2,7 @@
     templates:
       - check-requirements
       - lib-forward-testing-python3
-      - openstack-python3-xena-jobs
+      - openstack-python3-yoga-jobs
       - publish-openstack-docs-pti
       - release-notes-jobs-python3
     check:
@@ -26,14 +26,12 @@
     name: os-brick-code-coverage
     parent: openstack-tox-cover
     timeout: 2400
-    irrelevant-files:
+    irrelevant-files: &non-code-files
       - ^(test-|)requirements.txt$
       - ^.*\.rst$
       - ^doc/.*$
       - ^releasenotes/.*$
-      - ^setup.cfg$
       - ^tools/.*$
-      - ^tox.ini$
 
 - job:
     name: os-brick-src-devstack-plugin-ceph
@@ -44,6 +42,10 @@
     parent: cinder-plugin-ceph-tempest
     required-projects:
       - opendev.org/openstack/os-brick
+    irrelevant-files: &doc-files
+      - ^.*\.rst$
+      - ^doc/.*$
+      - ^releasenotes/.*$
 
 - job:
     name: os-brick-src-tempest-lvm-lio-barbican
@@ -55,15 +57,18 @@
         * legacy-tempest-dsvm-full-lio-src-os-brick
     required-projects:
       - opendev.org/openstack/os-brick
+    irrelevant-files: *doc-files
 
 - job:
     name: os-brick-src-tempest-nfs
     parent: devstack-plugin-nfs-tempest-full
     required-projects:
       - opendev.org/openstack/os-brick
+    irrelevant-files: *doc-files
 
 - job:
     name: os-brick-mypy
     parent: openstack-tox
     vars:
       tox_envlist: mypy
+    irrelevant-files: *non-code-files
