From 01d8401d14c9a69676c330837e9460e5a63f3063 Mon Sep 17 00:00:00 2001 From: Maciej Szwed Date: Tue, 12 Nov 2019 15:20:20 +0100 Subject: [PATCH] SPDK drivers: Update RPC calls to match latest SPDK changes With latest SPDK release most of the old RPC calls has been deprecated and soon will be obsolete. This patch updates relevant calls to the latest version. Signed-off-by: Maciej Szwed Change-Id: I615e34f2f8df60eaea09e32b15437deb36f441c0 --- cinder/tests/unit/targets/test_spdknvmf.py | 20 +++++----- cinder/tests/unit/volume/drivers/test_spdk.py | 40 +++++++++---------- cinder/volume/drivers/spdk.py | 40 +++++++++---------- cinder/volume/targets/spdknvmf.py | 10 ++--- .../drivers/spdk-volume-driver.rst | 3 +- .../notes/rpc-update-50bef83f48d4f96f.yaml | 6 +++ 6 files changed, 63 insertions(+), 56 deletions(-) create mode 100644 releasenotes/notes/rpc-update-50bef83f48d4f96f.yaml diff --git a/cinder/tests/unit/targets/test_spdknvmf.py b/cinder/tests/unit/targets/test_spdknvmf.py index 1076b3b7e73..68b221a11ad 100644 --- a/cinder/tests/unit/targets/test_spdknvmf.py +++ b/cinder/tests/unit/targets/test_spdknvmf.py @@ -220,16 +220,16 @@ class JSONRPCException(Exception): class JSONRPCClient(object): def __init__(self, addr=None, port=None): - self.methods = {"get_bdevs": self.get_bdevs, + self.methods = {"bdev_get_bdevs": self.get_bdevs, "construct_nvmf_subsystem": self.construct_nvmf_subsystem, - "delete_nvmf_subsystem": self.delete_nvmf_subsystem, - "nvmf_subsystem_create": self.nvmf_subsystem_create, + "nvmf_delete_subsystem": self.delete_nvmf_subsystem, + "nvmf_create_subsystem": self.nvmf_subsystem_create, "nvmf_subsystem_add_listener": self.nvmf_subsystem_add_listener, "nvmf_subsystem_add_ns": self.nvmf_subsystem_add_ns, - "get_nvmf_subsystems": self.get_nvmf_subsystems} + "nvmf_get_subsystems": self.get_nvmf_subsystems} self.bdevs = copy.deepcopy(BDEVS) self.nvmf_subsystems = copy.deepcopy(NVMF_SUBSYSTEMS) @@ -362,7 +362,7 @@ class SpdkNvmfDriverTestCase(test.TestCase): def test__get_spdk_volume_name(self): with mock.patch.object(self.driver, "_rpc_call", self.jsonrpcclient.call): - bdevs = self.driver._rpc_call("get_bdevs") + bdevs = self.driver._rpc_call("bdev_get_bdevs") bdev_name = bdevs[0]['name'] volume_name = self.driver._get_spdk_volume_name(bdev_name) self.assertEqual(bdev_name, volume_name) @@ -373,7 +373,7 @@ class SpdkNvmfDriverTestCase(test.TestCase): with mock.patch.object(self.driver, "_rpc_call", self.jsonrpcclient.call): nqn = self.driver._get_nqn_with_volume_name("Nvme0n1p0") - nqn_tmp = self.driver._rpc_call("get_nvmf_subsystems")[1]['nqn'] + nqn_tmp = self.driver._rpc_call("nvmf_get_subsystems")[1]['nqn'] self.assertEqual(nqn, nqn_tmp) nqn = self.driver._get_nqn_with_volume_name("fake") self.assertIsNone(nqn) @@ -387,21 +387,21 @@ class SpdkNvmfDriverTestCase(test.TestCase): def test_create_nvmeof_target(self): with mock.patch.object(self.driver, "_rpc_call", self.jsonrpcclient.call): - subsystems_first = self.driver._rpc_call("get_nvmf_subsystems") + subsystems_first = self.driver._rpc_call("nvmf_get_subsystems") self.driver.create_nvmeof_target("Nvme0n1p1", "nqn.2016-06.io.spdk", "192.168.0.1", 4420, "rdma", -1, -1, "") - subsystems_last = self.driver._rpc_call("get_nvmf_subsystems") + subsystems_last = self.driver._rpc_call("nvmf_get_subsystems") self.assertEqual(len(subsystems_first) + 1, len(subsystems_last)) def test_delete_nvmeof_target(self): with mock.patch.object(self.driver, "_rpc_call", self.jsonrpcclient.call): - subsystems_first = self.driver._rpc_call("get_nvmf_subsystems") + subsystems_first = self.driver._rpc_call("nvmf_get_subsystems") target = Target() self.driver.delete_nvmeof_target(target) - subsystems_last = self.driver._rpc_call("get_nvmf_subsystems") + subsystems_last = self.driver._rpc_call("nvmf_get_subsystems") self.assertEqual(len(subsystems_first) - 1, len(subsystems_last)) target.name = "fake" self.driver.delete_nvmeof_target(target) diff --git a/cinder/tests/unit/volume/drivers/test_spdk.py b/cinder/tests/unit/volume/drivers/test_spdk.py index 9ecb2623ecb..0596df9f106 100644 --- a/cinder/tests/unit/volume/drivers/test_spdk.py +++ b/cinder/tests/unit/volume/drivers/test_spdk.py @@ -250,23 +250,23 @@ class JSONRPCException(Exception): class JSONRPCClient(object): def __init__(self, addr=None, port=None): - self.methods = {"get_bdevs": self.get_bdevs, - "get_lvol_stores": self.get_lvol_stores, - "destroy_lvol_bdev": self.destroy_lvol_bdev, - "snapshot_lvol_bdev": self.snapshot_lvol_bdev, - "clone_lvol_bdev": self.clone_lvol_bdev, - "construct_lvol_bdev": self.construct_lvol_bdev, - "resize_lvol_bdev": self.resize_lvol_bdev, - "get_nvmf_subsystems": self.get_nvmf_subsystems, + self.methods = {"bdev_get_bdevs": self.get_bdevs, + "bdev_lvol_get_lvstores": self.get_lvol_stores, + "bdev_lvol_delete": self.destroy_lvol_bdev, + "bdev_lvol_snapshot": self.snapshot_lvol_bdev, + "bdev_lvol_clone": self.clone_lvol_bdev, + "bdev_lvol_create": self.construct_lvol_bdev, + "bdev_lvol_resize": self.resize_lvol_bdev, + "nvmf_get_subsystems": self.get_nvmf_subsystems, "construct_nvmf_subsystem": self.construct_nvmf_subsystem, - "nvmf_subsystem_create": + "nvmf_create_subsystem": self.nvmf_subsystem_create, "nvmf_subsystem_add_listener": self.nvmf_subsystem_add_listener, "nvmf_subsystem_add_ns": self.nvmf_subsystem_add_ns, - "inflate_lvol_bdev": self.inflate_lvol_bdev} + "bdev_lvol_inflate": self.inflate_lvol_bdev} self.bdevs = copy.deepcopy(BDEVS) self.nvmf_subsystems = copy.deepcopy(NVMF_SUBSYSTEMS) self.lvol_stores = copy.deepcopy(LVOL_STORES) @@ -536,7 +536,7 @@ class SpdkDriverTestCase(test.TestCase): with mock.patch.object(self.driver, "_rpc_call", self.jsonrpcclient.call): bdev = self.driver._rpc_call( - "get_bdevs", params={"name": "lvs_test/lvol0"}) + "bdev_get_bdevs", params={"name": "lvs_test/lvol0"}) self.assertEqual( bdev[0]['driver_specific']['lvol']['lvol_store_uuid'], self.driver._get_spdk_lvs_uuid( @@ -547,7 +547,7 @@ class SpdkDriverTestCase(test.TestCase): def test__get_spdk_lvs_free_space(self): with mock.patch.object(self.driver, "_rpc_call", self.jsonrpcclient.call): - lvs = self.driver._rpc_call("get_lvol_stores") + lvs = self.driver._rpc_call("bdev_lvol_get_lvstores") lvol_store = None for lvol in lvs: if lvol['name'] == "lvs_test": @@ -583,7 +583,7 @@ class SpdkDriverTestCase(test.TestCase): bdev) volume_clone = Volume() volume_clone.name = "clone0" - self.driver._rpc_call("snapshot_lvol_bdev", + self.driver._rpc_call("bdev_lvol_snapshot", params={'snapshot_name': "snapshot0", 'lvol_name': "lvs_test/lvol2"}) bdev = self.driver._get_spdk_volume_name("lvs_test/snapshot0") @@ -628,19 +628,19 @@ class SpdkDriverTestCase(test.TestCase): db_volume = objects.Volume._from_db_object(ctxt, objects.Volume(), db_volume) volume_get.return_value = db_volume - start_bdevs_len = len(self.driver._rpc_call('get_bdevs')) + start_bdevs_len = len(self.driver._rpc_call('bdev_get_bdevs')) self.driver.create_volume(db_volume) - tmp_bdevs = self.driver._rpc_call('get_bdevs') + tmp_bdevs = self.driver._rpc_call('bdev_get_bdevs') self.assertEqual(start_bdevs_len + 1, len(tmp_bdevs)) volume = Volume() volume.name = "lvs_test/%s" % db_volume.name volume_name = self.driver._get_spdk_volume_name(volume.name) - self.driver._rpc_call('destroy_lvol_bdev', {"name": volume_name}) + self.driver._rpc_call('bdev_lvol_delete', {"name": volume_name}) self.driver.delete_volume(volume) bdev = self.driver._get_spdk_volume_name("lvs_test/%s" % db_volume.name) self.assertIsNone(bdev) - tmp_bdevs = self.driver._rpc_call('get_bdevs') + tmp_bdevs = self.driver._rpc_call('bdev_get_bdevs') self.assertEqual(start_bdevs_len, len(tmp_bdevs)) def get_volume_stats(self): @@ -654,7 +654,7 @@ class SpdkDriverTestCase(test.TestCase): self.jsonrpcclient.call): volume_clone = Volume() volume_clone.name = "clone0" - self.driver._rpc_call("snapshot_lvol_bdev", + self.driver._rpc_call("bdev_lvol_snapshot", params={'snapshot_name': "snapshot0", 'lvol_name': "lvs_test/lvol2"}) snapshot = Snapshot() @@ -688,7 +688,7 @@ class SpdkDriverTestCase(test.TestCase): self.jsonrpcclient.call): snapshot = Snapshot() snapshot.name = "snapshot0" - self.driver._rpc_call("snapshot_lvol_bdev", + self.driver._rpc_call("bdev_lvol_snapshot", params = {'snapshot_name': snapshot.name}) self.driver.delete_snapshot(snapshot) snapshot = self.driver._get_spdk_volume_name("lvs_test/" + @@ -750,7 +750,7 @@ class SpdkDriverTestCase(test.TestCase): volume = Volume() volume.name = "lvs_test/lvol0" self.driver.extend_volume(volume, 2) - bdev = self.driver._rpc_call("get_bdevs", + bdev = self.driver._rpc_call("bdev_get_bdevs", params={"name": "lvs_test/lvol0"}) self.assertEqual(2 * units.Gi, bdev[0]['num_blocks'] * bdev[0]['block_size']) diff --git a/cinder/volume/drivers/spdk.py b/cinder/volume/drivers/spdk.py index 35016819fc8..1cf64482135 100644 --- a/cinder/volume/drivers/spdk.py +++ b/cinder/volume/drivers/spdk.py @@ -92,7 +92,7 @@ class SPDKDriver(driver.VolumeDriver): pools_status = [] self.lvs = [] - output = self._rpc_call('get_lvol_stores') + output = self._rpc_call('bdev_lvol_get_lvstores') if output: for lvs in output: pool = {} @@ -128,14 +128,14 @@ class SPDKDriver(driver.VolumeDriver): lvs['free_size']) def _get_spdk_volume_name(self, name): - output = self._rpc_call('get_bdevs') + output = self._rpc_call('bdev_get_bdevs') for bdev in output: for alias in bdev['aliases']: if name in alias: return bdev['name'] def _get_spdk_lvs_uuid(self, spdk_name): - output = self._rpc_call('get_bdevs') + output = self._rpc_call('bdev_get_bdevs') for bdev in output: if spdk_name in bdev['name']: return bdev['driver_specific']['lvol']['lvol_store_uuid'] @@ -153,13 +153,13 @@ class SPDKDriver(driver.VolumeDriver): spdk_name = self._get_spdk_volume_name(name) if spdk_name is not None: params = {'name': spdk_name} - self._rpc_call('destroy_lvol_bdev', params) + self._rpc_call('bdev_lvol_delete', params) LOG.debug('SPDK bdev %s deleted', spdk_name) else: LOG.debug('Could not find volume %s using SPDK driver', name) def _create_volume(self, volume, snapshot=None): - output = self._rpc_call('get_lvol_stores') + output = self._rpc_call('bdev_lvol_get_lvstores') for lvs in output: free_size = (lvs['free_clusters'] * lvs['cluster_size']) if free_size / units.Gi >= volume.size: @@ -168,22 +168,22 @@ class SPDKDriver(driver.VolumeDriver): 'lvol_name': volume.name, 'size': volume.size * units.Gi, 'uuid': lvs['uuid']} - output2 = self._rpc_call('construct_lvol_bdev', params) + output2 = self._rpc_call('bdev_lvol_create', params) else: snapshot_spdk_name = ( self._get_spdk_volume_name(snapshot.name)) params = { 'clone_name': volume.name, 'snapshot_name': snapshot_spdk_name} - output2 = self._rpc_call('clone_lvol_bdev', params) + output2 = self._rpc_call('bdev_lvol_clone', params) spdk_name = self._get_spdk_volume_name(volume.name) params = {'name': spdk_name} - self._rpc_call('inflate_lvol_bdev', params) + self._rpc_call('bdev_lvol_inflate', params) if volume.size > snapshot.volume_size: params = {'name': spdk_name, 'size': volume.size * units.Gi} - self._rpc_call('resize_lvol_bdev', params) + self._rpc_call('bdev_lvol_resize', params) LOG.debug('SPDK created lvol: %s', output2) @@ -196,7 +196,7 @@ class SPDKDriver(driver.VolumeDriver): def do_setup(self, context): try: - payload = {'method': 'get_bdevs', 'jsonrpc': '2.0', 'id': 1} + payload = {'method': 'bdev_get_bdevs', 'jsonrpc': '2.0', 'id': 1} self.url = ('http://%(ip)s:%(port)s/' % {'ip': self.configuration.spdk_rpc_ip, 'port': self.configuration.spdk_rpc_port}) @@ -217,7 +217,7 @@ class SPDKDriver(driver.VolumeDriver): """Verify that requirements are in place to use LVM driver.""" # If configuration is incorrect we will get exception here - self._rpc_call('get_bdevs') + self._rpc_call('bdev_get_bdevs') def create_volume(self, volume): """Creates a logical volume.""" @@ -269,10 +269,10 @@ class SPDKDriver(driver.VolumeDriver): params = { 'lvol_name': spdk_name, 'snapshot_name': snapshot['name']} - self._rpc_call('snapshot_lvol_bdev', params) + self._rpc_call('bdev_lvol_snapshot', params) params = {'name': spdk_name} - self._rpc_call('inflate_lvol_bdev', params) + self._rpc_call('bdev_lvol_inflate', params) def delete_snapshot(self, snapshot): """Deletes a snapshot.""" @@ -281,12 +281,12 @@ class SPDKDriver(driver.VolumeDriver): return params = {'name': spdk_name} - bdev = self._rpc_call('get_bdevs', params) + bdev = self._rpc_call('bdev_get_bdevs', params) if 'clones' in bdev[0]['driver_specific']['lvol']: for clone in bdev[0]['driver_specific']['lvol']['clones']: spdk_name = self._get_spdk_volume_name(clone) params = {'name': spdk_name} - self._rpc_call('inflate_lvol_bdev', params) + self._rpc_call('bdev_lvol_inflate', params) self._delete_bdev(snapshot.name) @@ -306,21 +306,21 @@ class SPDKDriver(driver.VolumeDriver): params = { 'lvol_name': spdk_name, 'snapshot_name': snapshot_name} - self._rpc_call('snapshot_lvol_bdev', params) + self._rpc_call('bdev_lvol_snapshot', params) params = {'name': spdk_name} - self._rpc_call('inflate_lvol_bdev', params) + self._rpc_call('bdev_lvol_inflate', params) snapshot_spdk_name = self._get_spdk_volume_name(snapshot_name) params = { 'clone_name': volume.name, 'snapshot_name': snapshot_spdk_name} - self._rpc_call('clone_lvol_bdev', params) + self._rpc_call('bdev_lvol_clone', params) spdk_name = self._get_spdk_volume_name(volume.name) params = {'name': spdk_name} - self._rpc_call('inflate_lvol_bdev', params) + self._rpc_call('bdev_lvol_inflate', params) self._delete_bdev(snapshot_name) @@ -387,7 +387,7 @@ class SPDKDriver(driver.VolumeDriver): """Extend an existing volume's size.""" spdk_name = self._get_spdk_volume_name(volume.name) params = {'name': spdk_name, 'size': new_size * units.Gi} - self._rpc_call('resize_lvol_bdev', params) + self._rpc_call('bdev_lvol_resize', params) # ####### Interface methods for DataPath (Target Driver) ######## def ensure_export(self, context, volume): diff --git a/cinder/volume/targets/spdknvmf.py b/cinder/volume/targets/spdknvmf.py index 71b1693312f..480acc0303a 100644 --- a/cinder/volume/targets/spdknvmf.py +++ b/cinder/volume/targets/spdknvmf.py @@ -91,7 +91,7 @@ class SpdkNvmf(nvmeof.NVMeOF): return req.json()['result'] def _get_spdk_volume_name(self, name): - output = self._rpc_call('get_bdevs') + output = self._rpc_call('bdev_get_bdevs') for bdev in output: for alias in bdev['aliases']: @@ -99,7 +99,7 @@ class SpdkNvmf(nvmeof.NVMeOF): return bdev['name'] def _get_nqn_with_volume_name(self, name): - output = self._rpc_call('get_nvmf_subsystems') + output = self._rpc_call('nvmf_get_subsystems') spdk_name = self._get_spdk_volume_name(name) @@ -112,7 +112,7 @@ class SpdkNvmf(nvmeof.NVMeOF): def _get_first_free_node(self): cnode_num = [] - output = self._rpc_call('get_nvmf_subsystems') + output = self._rpc_call('nvmf_get_subsystems') # Get node numbers for nqn string like this: nqn.2016-06.io.spdk:cnode1 @@ -149,7 +149,7 @@ class SpdkNvmf(nvmeof.NVMeOF): 'allow_any_host': True, 'serial_number': serial, } - self._rpc_call('nvmf_subsystem_create', params) + self._rpc_call('nvmf_create_subsystem', params) listen_address = { 'trtype': transport_type, @@ -189,7 +189,7 @@ class SpdkNvmf(nvmeof.NVMeOF): if nqn is not None: try: params = {'nqn': nqn} - self._rpc_call('delete_nvmf_subsystem', params) + self._rpc_call('nvmf_delete_subsystem', params) LOG.debug('SPDK subsystem %s deleted', nqn) except Exception as e: LOG.debug('SPDK ERROR: subsystem not deleted: %s', e) diff --git a/doc/source/configuration/block-storage/drivers/spdk-volume-driver.rst b/doc/source/configuration/block-storage/drivers/spdk-volume-driver.rst index 63cac3c7590..93fa6d8823c 100644 --- a/doc/source/configuration/block-storage/drivers/spdk-volume-driver.rst +++ b/doc/source/configuration/block-storage/drivers/spdk-volume-driver.rst @@ -15,7 +15,8 @@ SPDK NVMe-oF target installation -------------------------------- Follow instructions available on https://spdk.io/doc/nvmf.html to install -and configure environment with SPDK NVMe-oF target application. +and configure environment with SPDK NVMe-oF target application. Starting +from Ussuri release SPDK release v19.10 or higher is required. Storage pools configuration --------------------------- diff --git a/releasenotes/notes/rpc-update-50bef83f48d4f96f.yaml b/releasenotes/notes/rpc-update-50bef83f48d4f96f.yaml new file mode 100644 index 00000000000..20b8c3e718e --- /dev/null +++ b/releasenotes/notes/rpc-update-50bef83f48d4f96f.yaml @@ -0,0 +1,6 @@ +--- +upgrade: + - | + SPDK target and volume drivers have been updated with new SPDK specific + RPC calls due to deprecation of some old RPC calls. Starting from Ussuri + release SPDK release v19.10 or higher is required.