Merge "Huawei driver supports snapshot revert"

This commit is contained in:
Zuul 2018-01-25 18:24:13 +00:00 committed by Gerrit Code Review
commit 81e708281f
6 changed files with 64 additions and 1 deletions

View File

@ -120,3 +120,8 @@ class HuaweiBase(object):
def delete_replica(self, context, replica_list, replica_snapshots,
replica, share_server=None):
"""Delete a replica."""
@abc.abstractmethod
def revert_to_snapshot(self, context, snapshot, share_access_rules,
snapshot_access_rules, share_server=None):
"""Revert a snapshot."""

View File

@ -207,6 +207,7 @@ class HuaweiNasDriver(driver.ShareDriver):
free_capacity_gb=0.0,
snapshot_support=self.plugin.snapshot_support,
create_share_from_snapshot_support=self.plugin.snapshot_support,
revert_to_snapshot_support=self.plugin.snapshot_support,
)
# huawei array doesn't support snapshot replication, so driver can't
@ -266,3 +267,11 @@ class HuaweiNasDriver(driver.ShareDriver):
replica_snapshots,
replica,
share_server)
def revert_to_snapshot(self, context, snapshot, share_access_rules,
snapshot_access_rules, share_server=None):
self.plugin.revert_to_snapshot(context,
snapshot,
share_access_rules,
snapshot_access_rules,
share_server)

View File

@ -1847,3 +1847,16 @@ class V3StorageConnection(driver.HuaweiBase):
LOG.exception('Failed to delete replica %s.',
replica['id'])
raise
def revert_to_snapshot(self, context, snapshot, share_access_rules,
snapshot_access_rules, share_server):
fs_id = self.helper.get_fsid_by_name(snapshot['share_name'])
if not fs_id:
msg = _("The source filesystem of snapshot %s "
"not exist.") % snapshot['id']
LOG.error(msg)
raise exception.ShareResourceNotFound(
share_id=snapshot['share_id'])
snapshot_id = self.helper._get_snapshot_id(fs_id, snapshot['id'])
self.helper.rollback_snapshot(snapshot_id)

View File

@ -1447,3 +1447,11 @@ class RestHelper(object):
self._assert_rest_result(result, msg)
self._assert_data_in_result(result, msg)
return result.get('data')
def rollback_snapshot(self, snap_id):
url = "/FSSNAPSHOT/ROLLBACK_FSSNAPSHOT"
data = jsonutils.dumps({"ID": snap_id})
result = self.call(url, data, "PUT")
msg = _('Failed to rollback snapshot %s.') % snap_id
self._assert_rest_result(result, msg)

View File

@ -2425,7 +2425,7 @@ class HuaweiShareDriverTestCase(test.TestCase):
"qos": True,
"snapshot_support": snapshot_support,
"create_share_from_snapshot_support": snapshot_support,
"revert_to_snapshot_support": False,
"revert_to_snapshot_support": snapshot_support,
"mount_snapshot_support": False,
"replication_domain": None,
"filter_function": None,
@ -4577,6 +4577,29 @@ class HuaweiShareDriverTestCase(test.TestCase):
self.assertEqual(expect_password, result['UserPassword'])
ET.parse.assert_called_once_with(self.fake_conf_file)
def test_revert_to_snapshot_success(self):
snapshot = {'id': 'fake-fs-id',
'share_name': 'share_fake_uuid'}
with mock.patch.object(
self.driver.plugin.helper, 'call') as mock_call:
mock_call.return_value = {
"error": {"code": 0},
"data": [{"ID": "4", "NAME": "share_fake_uuid"}]
}
self.driver.revert_to_snapshot(None, snapshot, None, None)
expect_snapshot_id = "4@share_snapshot_fake_fs_id"
mock_call.assert_called_with(
"/FSSNAPSHOT/ROLLBACK_FSSNAPSHOT",
jsonutils.dumps({"ID": expect_snapshot_id}), 'PUT')
def test_revert_to_snapshot_exception(self):
snapshot = {'id': 'fake-snap-id',
'share_name': 'not_exist_share_name',
'share_id': 'fake_share_id'}
self.assertRaises(exception.ShareResourceNotFound,
self.driver.revert_to_snapshot,
None, snapshot, None, None)
@ddt.ddt
class HuaweiDriverHelperTestCase(test.TestCase):

View File

@ -0,0 +1,5 @@
---
features:
- |
Huawei driver implements the snapshot reverting feature,
by Huawei storage's snapshot-rollback capability.