From 70ade98160035b35a627d3cc42615c1b91ddd858 Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Wed, 23 Mar 2016 13:56:39 +0100 Subject: [PATCH] Datera: extend volume if larger than snapshot Extend volume if during create_volume_from_snapshot() the new volume is larger than the snapshot it was created from. Added new test case. Co-Authored-By: Xinli Guan Close-Bug: #1560613 Change-Id: Ia17a0e9f65ca570b6f97691a8701e9809f4960f8 Signed-off-by: Danny Al-Gaaf --- .../tests/unit/volume/drivers/test_datera.py | 28 +++++++++++++++++++ cinder/volume/drivers/datera/datera_api2.py | 3 ++ cinder/volume/drivers/datera/datera_api21.py | 3 ++ 3 files changed, 34 insertions(+) diff --git a/cinder/tests/unit/volume/drivers/test_datera.py b/cinder/tests/unit/volume/drivers/test_datera.py index 55ec9f18080..c3cb5695b80 100644 --- a/cinder/tests/unit/volume/drivers/test_datera.py +++ b/cinder/tests/unit/volume/drivers/test_datera.py @@ -350,6 +350,32 @@ class DateraVolumeTestCasev2(test.TestCase): self.assertIsNone( self.driver.create_volume_from_snapshot(self.volume, snapshot)) + @mock.patch.object(datera.DateraDriver, 'extend_volume') + def test_create_volume_from_snapshot_success_larger(self, mock_extend): + snapshot = _stub_snapshot(volume_id=self.volume['id']) + extend_volume = _stub_volume(size=2) + + mock_extend = mock.Mock() + if self._apiv == '2': + self.driver._extend_volume_2 = mock_extend + self.mock_api.side_effect = [ + stub_return_snapshots, + list(stub_return_snapshots.values())[0], + None] + self.driver.create_volume_from_snapshot(extend_volume, snapshot) + mock_extend.assert_called_once_with(extend_volume, + extend_volume['size']) + else: + self.driver._extend_volume_2_1 = mock_extend + self.mock_api.side_effect = [ + self._generate_fake_api_request("tenant"), + stub_return_snapshots_21, + {'data': stub_return_snapshots_21['data'][0]}, + None] + self.driver.create_volume_from_snapshot(extend_volume, snapshot) + mock_extend.assert_called_once_with(extend_volume, + extend_volume['size']) + def test_create_volume_from_snapshot_fails(self): self.mock_api.side_effect = exception.DateraAPIException snapshot = _stub_snapshot(volume_id=self.volume['id']) @@ -1152,9 +1178,11 @@ def _stub_volume(*args, **kwargs): def _stub_snapshot(*args, **kwargs): uuid = u'0bb34f0c-fea4-48e0-bf96-591120ac7e3c' name = u'snapshot-00000001' + size = 1 volume = {} volume['id'] = kwargs.get('id', uuid) volume['display_name'] = kwargs.get('display_name', name) + volume['volume_size'] = kwargs.get('size', size) volume['volume_id'] = kwargs.get('volume_id', None) return volume diff --git a/cinder/volume/drivers/datera/datera_api2.py b/cinder/volume/drivers/datera/datera_api2.py index 856ed28eddf..1734aa37b86 100644 --- a/cinder/volume/drivers/datera/datera_api2.py +++ b/cinder/volume/drivers/datera/datera_api2.py @@ -480,6 +480,9 @@ class DateraApi(object): body=app_params, api_version='2') + if (volume['size'] > snapshot['volume_size']): + self._extend_volume_2(volume, volume['size']) + # ========== # = Manage = # ========== diff --git a/cinder/volume/drivers/datera/datera_api21.py b/cinder/volume/drivers/datera/datera_api21.py index 09d890e9f53..5aba15c42aa 100644 --- a/cinder/volume/drivers/datera/datera_api21.py +++ b/cinder/volume/drivers/datera/datera_api21.py @@ -528,6 +528,9 @@ class DateraApi(object): api_version='2.1', tenant=tenant) + if (volume['size'] > snapshot['volume_size']): + self._extend_volume_2_1(volume, volume['size']) + # ========== # = Manage = # ==========