Skip to content

Commit

Permalink
Re-enable broken CG code in NetApp driver
Browse files Browse the repository at this point in the history
Override the new create_share_group_snapshot() method in the driver class
and call the old CG snapshot code if the share group specifies CG
support, otherwise fall back on the new (existing) code.

This patch also removes dead code from the old CG feature from Newton and
earlier releases.

Change-Id: Ief71b9900c2c84e0df1d12d303517fa20ff7908b
Closes-bug: #1659023
  • Loading branch information
bswartz committed Aug 11, 2017
1 parent c6f073b commit 80fe5f1
Show file tree
Hide file tree
Showing 6 changed files with 224 additions and 151 deletions.
47 changes: 28 additions & 19 deletions manila/share/drivers/netapp/dataontap/cluster_mode/drv_multi_svm.py
Expand Up @@ -71,25 +71,6 @@ def extend_share(self, share, new_size, **kwargs):
def shrink_share(self, share, new_size, **kwargs):
self.library.shrink_share(share, new_size, **kwargs)

def create_consistency_group(self, context, cg_dict, **kwargs):
return self.library.create_consistency_group(context, cg_dict,
**kwargs)

def create_consistency_group_from_cgsnapshot(self, context, cg_dict,
cgsnapshot_dict, **kwargs):
return self.library.create_consistency_group_from_cgsnapshot(
context, cg_dict, cgsnapshot_dict, **kwargs)

def delete_consistency_group(self, context, cg_dict, **kwargs):
return self.library.delete_consistency_group(context, cg_dict,
**kwargs)

def create_cgsnapshot(self, context, snap_dict, **kwargs):
return self.library.create_cgsnapshot(context, snap_dict, **kwargs)

def delete_cgsnapshot(self, context, snap_dict, **kwargs):
return self.library.delete_cgsnapshot(context, snap_dict, **kwargs)

def ensure_share(self, context, share, **kwargs):
pass

Expand Down Expand Up @@ -225,3 +206,31 @@ def migration_complete(self, context, source_share, destination_share,
context, source_share, destination_share,
source_snapshots, snapshot_mappings, share_server=share_server,
destination_share_server=destination_share_server)

def create_share_group_snapshot(self, context, snap_dict,
share_server=None):
fallback_create = super(NetAppCmodeMultiSvmShareDriver,
self).create_share_group_snapshot
return self.library.create_group_snapshot(context, snap_dict,
fallback_create,
share_server)

def delete_share_group_snapshot(self, context, snap_dict,
share_server=None):
fallback_delete = super(NetAppCmodeMultiSvmShareDriver,
self).delete_share_group_snapshot
return self.library.delete_group_snapshot(context, snap_dict,
fallback_delete,
share_server)

def create_share_group_from_share_group_snapshot(
self, context, share_group_dict, snapshot_dict,
share_server=None):
fallback_create = super(
NetAppCmodeMultiSvmShareDriver,
self).create_share_group_from_share_group_snapshot
return self.library.create_group_from_snapshot(context,
share_group_dict,
snapshot_dict,
fallback_create,
share_server)
Expand Up @@ -71,25 +71,6 @@ def extend_share(self, share, new_size, **kwargs):
def shrink_share(self, share, new_size, **kwargs):
self.library.shrink_share(share, new_size, **kwargs)

def create_consistency_group(self, context, cg_dict, **kwargs):
return self.library.create_consistency_group(context, cg_dict,
**kwargs)

def create_consistency_group_from_cgsnapshot(self, context, cg_dict,
cgsnapshot_dict, **kwargs):
return self.library.create_consistency_group_from_cgsnapshot(
context, cg_dict, cgsnapshot_dict, **kwargs)

def delete_consistency_group(self, context, cg_dict, **kwargs):
return self.library.delete_consistency_group(context, cg_dict,
**kwargs)

def create_cgsnapshot(self, context, snap_dict, **kwargs):
return self.library.create_cgsnapshot(context, snap_dict, **kwargs)

def delete_cgsnapshot(self, context, snap_dict, **kwargs):
return self.library.delete_cgsnapshot(context, snap_dict, **kwargs)

def ensure_share(self, context, share, **kwargs):
pass

Expand Down Expand Up @@ -241,3 +222,31 @@ def migration_complete(self, context, source_share, destination_share,
context, source_share, destination_share,
source_snapshots, snapshot_mappings, share_server=share_server,
destination_share_server=destination_share_server)

def create_share_group_snapshot(self, context, snap_dict,
share_server=None):
fallback_create = super(NetAppCmodeSingleSvmShareDriver,
self).create_share_group_snapshot
return self.library.create_group_snapshot(context, snap_dict,
fallback_create,
share_server)

def delete_share_group_snapshot(self, context, snap_dict,
share_server=None):
fallback_delete = super(NetAppCmodeSingleSvmShareDriver,
self).delete_share_group_snapshot
return self.library.delete_group_snapshot(context, snap_dict,
fallback_delete,
share_server)

def create_share_group_from_share_group_snapshot(
self, context, share_group_dict, snapshot_dict,
share_server=None):
fallback_create = super(
NetAppCmodeSingleSvmShareDriver,
self).create_share_group_from_share_group_snapshot
return self.library.create_group_from_snapshot(context,
share_group_dict,
snapshot_dict,
fallback_create,
share_server)
84 changes: 51 additions & 33 deletions manila/share/drivers/netapp/dataontap/cluster_mode/lib_base.py
Expand Up @@ -258,6 +258,9 @@ def get_share_stats(self, filter_function=None, goodness_function=None):
'storage_protocol': 'NFS_CIFS',
'pools': self._get_pools(filter_function=filter_function,
goodness_function=goodness_function),
'share_group_stats': {
'consistent_snapshot_support': 'host',
},
}

if (self.configuration.replication_domain and
Expand Down Expand Up @@ -1096,23 +1099,14 @@ def manage_existing_snapshot(self, snapshot, driver_options):
def unmanage_snapshot(self, snapshot):
"""Removes the specified snapshot from Manila management."""

@na_utils.trace
def create_consistency_group(self, context, cg_dict, share_server=None):
"""Creates a consistency group.
cDOT has no persistent CG object, so apart from validating the
share_server info is passed correctly, this method has nothing to do.
"""
vserver, vserver_client = self._get_vserver(share_server=share_server)

@na_utils.trace
def create_consistency_group_from_cgsnapshot(
self, context, cg_dict, cgsnapshot_dict, share_server=None):
"""Creates a consistency group from an existing CG snapshot."""
vserver, vserver_client = self._get_vserver(share_server=share_server)

# Ensure there is something to do
if not cgsnapshot_dict['cgsnapshot_members']:
if not cgsnapshot_dict['share_group_snapshot_members']:
return None, None

clone_list = self._collate_cg_snapshot_info(cg_dict, cgsnapshot_dict)
Expand Down Expand Up @@ -1153,12 +1147,13 @@ def _collate_cg_snapshot_info(self, cg_dict, cgsnapshot_dict):

clone_info = {'share': share}

for cgsnapshot_member in cgsnapshot_dict['cgsnapshot_members']:
if (share['source_cgsnapshot_member_id'] ==
for cgsnapshot_member in (
cgsnapshot_dict['share_group_snapshot_members']):
if (share['source_share_group_snapshot_member_id'] ==
cgsnapshot_member['id']):
clone_info['snapshot'] = {
'share_id': cgsnapshot_member['share_id'],
'id': cgsnapshot_member['cgsnapshot_id']
'id': cgsnapshot_dict['id']
}
break

Expand All @@ -1171,31 +1166,14 @@ def _collate_cg_snapshot_info(self, cg_dict, cgsnapshot_dict):

return clone_list

@na_utils.trace
def delete_consistency_group(self, context, cg_dict, share_server=None):
"""Deletes a consistency group.
cDOT has no persistent CG object, so apart from validating the
share_server info is passed correctly, this method has nothing to do.
"""
try:
vserver, vserver_client = self._get_vserver(
share_server=share_server)
except (exception.InvalidInput,
exception.VserverNotSpecified,
exception.VserverNotFound) as error:
LOG.warning("Could not determine share server for consistency "
"group being deleted: %(cg)s. Deletion of CG "
"record will proceed anyway. Error: %(error)s",
{'cg': cg_dict['id'], 'error': error})

@na_utils.trace
def create_cgsnapshot(self, context, snap_dict, share_server=None):
"""Creates a consistency group snapshot."""
vserver, vserver_client = self._get_vserver(share_server=share_server)

share_names = [self._get_backend_share_name(member['share_id'])
for member in snap_dict.get('cgsnapshot_members', [])]
for member in
snap_dict.get('share_group_snapshot_members', [])]
snapshot_name = self._get_backend_cg_snapshot_name(snap_dict['id'])

if share_names:
Expand All @@ -1220,7 +1198,8 @@ def delete_cgsnapshot(self, context, snap_dict, share_server=None):
return None, None

share_names = [self._get_backend_share_name(member['share_id'])
for member in snap_dict.get('cgsnapshot_members', [])]
for member in (
snap_dict.get('share_group_snapshot_members', []))]
snapshot_name = self._get_backend_cg_snapshot_name(snap_dict['id'])

for share_name in share_names:
Expand All @@ -1236,6 +1215,45 @@ def delete_cgsnapshot(self, context, snap_dict, share_server=None):

return None, None

@staticmethod
def _is_group_cg(context, share_group):
return 'host' == share_group.consistent_snapshot_support

@na_utils.trace
def create_group_snapshot(self, context, snap_dict, fallback_create,
share_server=None):
share_group = snap_dict['share_group']
if self._is_group_cg(context, share_group):
return self.create_cgsnapshot(context, snap_dict,
share_server=share_server)
else:
return fallback_create(context, snap_dict,
share_server=share_server)

@na_utils.trace
def delete_group_snapshot(self, context, snap_dict, fallback_delete,
share_server=None):
share_group = snap_dict['share_group']
if self._is_group_cg(context, share_group):
return self.delete_cgsnapshot(context, snap_dict,
share_server=share_server)
else:
return fallback_delete(context, snap_dict,
share_server=share_server)

@na_utils.trace
def create_group_from_snapshot(self, context, share_group,
snapshot_dict, fallback_create,
share_server=None):
share_group2 = snapshot_dict['share_group']
if self._is_group_cg(context, share_group2):
return self.create_consistency_group_from_cgsnapshot(
context, share_group, snapshot_dict,
share_server=share_server)
else:
return fallback_create(context, share_group, snapshot_dict,
share_server=share_server)

@na_utils.trace
def _adjust_qos_policy_with_volume_resize(self, share, new_size,
vserver_client):
Expand Down

0 comments on commit 80fe5f1

Please sign in to comment.