From f021629df31328324ca429c29a827efab832eee0 Mon Sep 17 00:00:00 2001 From: John Griffith Date: Thu, 3 Oct 2013 15:54:20 -0600 Subject: [PATCH] Fix broken solidfire create-snapshot A previous change to enable secifying size for cloned volumes created introduced a bug that breaks the ability to create-snapshots when using the SolidFire driver (CID: I5628c7fa922780d6b0601e2daa79310a61085edc). The problem is that we use a shared method in the SF driver for both create-clone and create-snapshot, the added change only considers the clone case and does a get ref['size'] but in the case of snapshots this needs to be ref['volume_size']. Change-Id: I50603b3ac43f2c3c7e7811ec34de078a268519f7 Closes-Bug: 1234970 (cherry picked from commit 3cd27defb1c820ceadd8bbc6bfd5a405a7376cdb) --- cinder/tests/test_solidfire.py | 55 ++++++++++++++++++++++++++++++ cinder/volume/drivers/solidfire.py | 7 +++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/cinder/tests/test_solidfire.py b/cinder/tests/test_solidfire.py index da011a9b0a..eefbfff099 100644 --- a/cinder/tests/test_solidfire.py +++ b/cinder/tests/test_solidfire.py @@ -98,6 +98,12 @@ def fake_issue_api_request(obj, method, params, version='1.0'): LOG.info('Called Fake ModifyVolume...') return {'result': {}, 'id': 1} + elif method is 'CloneVolume': + return {'result': {'volumeID': 6}, 'id': 2} + + elif method is 'ModifyVolume': + return + elif method is 'ListVolumesForAccount' and version == '1.0': test_name = 'OS-VOLID-a720b3c0-d1f0-11e1-9b23-0800200c9a66' LOG.info('Called Fake ListVolumesForAccount...') @@ -135,6 +141,9 @@ def fake_volume_get(obj, key, default=None): def fake_update_cluster_status(self): return + def fake_get_model_info(self, account, vid): + return {'fake': 'fake-model'} + def test_create_with_qos_type(self): self.stubs.Set(SolidFireDriver, '_issue_api_request', self.fake_issue_api_request) @@ -183,6 +192,52 @@ def test_create_volume_non_512(self): '4096 4096') self.configuration.sf_emulate_512 = True + def test_create_snapshot(self): + self.stubs.Set(SolidFireDriver, '_issue_api_request', + self.fake_issue_api_request) + self.stubs.Set(SolidFireDriver, '_get_model_info', + self.fake_get_model_info) + testvol = {'project_id': 'testprjid', + 'name': 'testvol', + 'size': 1, + 'id': 'a720b3c0-d1f0-11e1-9b23-0800200c9a66', + 'volume_type_id': None, + 'created_at': timeutils.utcnow()} + + testsnap = {'project_id': 'testprjid', + 'name': 'testvol', + 'volume_size': 1, + 'id': 'b831c4d1-d1f0-11e1-9b23-0800200c9a66', + 'volume_id': 'a720b3c0-d1f0-11e1-9b23-0800200c9a66', + 'volume_type_id': None, + 'created_at': timeutils.utcnow()} + + sfv = SolidFireDriver(configuration=self.configuration) + model_update = sfv.create_volume(testvol) + sfv.create_snapshot(testsnap) + + def test_create_clone(self): + self.stubs.Set(SolidFireDriver, '_issue_api_request', + self.fake_issue_api_request) + self.stubs.Set(SolidFireDriver, '_get_model_info', + self.fake_get_model_info) + testvol = {'project_id': 'testprjid', + 'name': 'testvol', + 'size': 1, + 'id': 'a720b3c0-d1f0-11e1-9b23-0800200c9a66', + 'volume_type_id': None, + 'created_at': timeutils.utcnow()} + + testvol_b = {'project_id': 'testprjid', + 'name': 'testvol', + 'size': 1, + 'id': 'b831c4d1-d1f0-11e1-9b23-0800200c9a66', + 'volume_type_id': None, + 'created_at': timeutils.utcnow()} + + sfv = SolidFireDriver(configuration=self.configuration) + sfv.create_cloned_volume(testvol_b, testvol) + def test_initialize_connector_with_blocksizes(self): connector = {'initiator': 'iqn.2012-07.org.fake:01'} testvol = {'project_id': 'testprjid', diff --git a/cinder/volume/drivers/solidfire.py b/cinder/volume/drivers/solidfire.py index 8b3c5b2f7f..cbe09c11bb 100644 --- a/cinder/volume/drivers/solidfire.py +++ b/cinder/volume/drivers/solidfire.py @@ -347,9 +347,14 @@ def _do_clone_volume(self, src_uuid, src_project_id, v_ref): if src_project_id != v_ref['project_id']: sfaccount = self._create_sfaccount(v_ref['project_id']) + if v_ref.get('size', None): + new_size = v_ref['size'] + else: + new_size = v_ref['volume_size'] + params = {'volumeID': int(sf_vol['volumeID']), 'name': 'UUID-%s' % v_ref['id'], - 'newSize': int(v_ref['size'] * self.GB), + 'newSize': int(new_size * self.GB), 'newAccountID': sfaccount['accountID']} data = self._issue_api_request('CloneVolume', params)