1、mania/share/manager.py 2144行,调用delete_share_instance删除share instance
def delete_share_instance(self, context, share_instance_id, force=False):
"""Delete a share instance."""
context = context.elevated()
share_instance = self._get_share_instance(context, share_instance_id)
share_server = self._get_share_server(context, share_instance)
try:
self.access_helper.update_access_rules(
context,
share_instance_id,
delete_rules="all",
share_server=share_server
)
except exception.ShareResourceNotFound:
LOG.warning(_LW("Share instance %s does not exist in the "
"backend."), share_instance_id)
except Exception:
with excutils.save_and_reraise_exception() as exc_context:
if force:
msg = _LE("The driver was unable to delete access rules "
"for the instance: %s. Will attempt to delete "
"the instance anyway.")
LOG.error(msg, share_instance_id)
exc_context.reraise = False
else:
self.db.share_instance_update(
context,
share_instance_id,
{'status': constants.STATUS_ERROR_DELETING})
try:
self.driver.delete_share(context, share_instance,
share_server=share_server)
except exception.ShareResourceNotFound:
LOG.warning(_LW("Share instance %s does not exist in the "
"backend."), share_instance_id)
except Exception:
with excutils.save_and_reraise_exception() as exc_context:
if force:
msg = _LE("The driver was unable to delete the share "
"instance: %s on the backend. Since this "
"operation is forced, the instance will be "
"deleted from Manila's database. A cleanup on "
"the backend may be necessary.")
LOG.error(msg, share_instance_id)
exc_context.reraise = False
else:
self.db.share_instance_update(
context,
share_instance_id,
{'status': constants.STATUS_ERROR_DELETING})
self.db.share_instance_delete(context, share_instance_id)
LOG.info(_LI("Share instance %s: deleted successfully."),
share_instance_id)
self._check_delete_share_server(context, share_instance)
2、在2175行,有如下方法
self.driver.delete_share(context, share_instance,
share_server=share_server)
3、self.driver.delete_share调用mania/share/drivers/generic.py中的delete_share
def delete_share(self, context, share, share_server=None):
"""Deletes share."""
helper = self._get_helper(share)
if not self.driver_handles_share_servers:
share_server = self.service_instance_manager.get_common_server()
if self._is_share_server_active(context, share_server):
helper.remove_export(
share_server['backend_details'], share['name'])
self._unmount_device(share, share_server['backend_details'])
self._detach_volume(self.admin_context, share,
share_server['backend_details'])
# Note(jun): It is an intended breakage to deal with the cases
# with any reason that caused absence of Nova instances.
self._deallocate_container(self.admin_context, share)
self.private_storage.delete(share['id'])
4、generic.py中的delete_share执行如下操作:
remove_export:移除所有nfs export,remove_export位于mania/share/drivers/helpers.py156行,remove_export没有做实际操作,remove_export实际由manager.py中delete_share_instance方法2151行,self.access_helper.update_access_rules完成
卸载volume文件系统:self._umount_device
卸载cinder volume:self._detach_volume
删除cinder volume,保留nova instance,如果有新的share instance 创建,会将保留的nova instance用于提供share instance
5、manager.py中delete_share_instance方法2151行,self.access_helper.update_access_rules 调用,mania/share/access.py中的update_access_rules
def update_access_rules(self, context, share_instance_id, add_rules=None,
delete_rules=None, share_server=None):
"""Update access rules in driver and database for given share instance.
:param context: current context
:param share_instance_id: Id of the share instance model
:param add_rules: list with ShareAccessMapping models or None - rules
which should be added
:param delete_rules: list with ShareAccessMapping models, "all", None
- rules which should be deleted. If "all" is provided - all rules will
be deleted.
:param share_server: Share server model or None
"""
share_instance = self.db.share_instance_get(
context, share_instance_id, with_share_data=True)
share_id = share_instance["share_id"]
@utils.synchronized(
"update_access_rules_for_share_%s" % share_id, external=True)
def _update_access_rules_locked(*args, **kwargs):
return self._update_access_rules(*args, **kwargs)
_update_access_rules_locked(
context=context,
share_instance_id=share_instance_id,
add_rules=add_rules,
delete_rules=delete_rules,
share_server=share_server,
)
6、update_access_rules通过self._update_access_rules方法,调用self.driver.update_access完成access的删除
7、self.driver.update_access即generic.py中的upate_access,genery.py update_access调用mania/share/drivers/helpers.py中class NFSHelper的upate_access方法完成access的删除
delete_share_instance(manager.py)------>update_access_rules(access.py)
| |
| |
| |
| ------>upate_access(generic.py)
| |
| |
| |
| ------>update_access(helpers.py,NFSHelper)
|
|
|
|
------>delete_share(generic.py)
转载于:https://blog.51cto.com/penguintux/1882540