OpenStack快照分析:(三)从磁盘启动云主机离线(在线)快照分析 (8)

上节中讲到在创建卷快照的时候,nova-api在处理请求时,使用cinderclient调用volume_apicinder-api)来通过http方式发送快照的请求,cinder-api会接受该请求,处理代码如下:

@wsgi.response(http_client.ACCEPTED)
@
validation.schema(snapshot.create)
def create(self, req, body):
   
"""Creates a new snapshot."""
    #
根据上下文的分析,当nova-api等其他client在发送创建卷快照的请求之后,本方法会接受到请求
    #
方法接收到的参数有:
    # req
Request对象,包含有本次请求的上下内容,包含有用于鉴权的凭证等内容
    # body
:快照的属性信息,包含有如下内容:
    #  {
    #      u'snapshot': {
    #           u'volume_id': u'60e16af2-0684-433c-a1b6-c1af1c2523fc',
    #           u'force': True,
    #           u'description': u'',
    #           u'name': u'snapshot for snapshot1',
    #           u'metadata': {}
    #      }
    #  }

   
kwargs = {}
   
# 首先还是获取上下文的context信息和获取快照属性中的信息
    context = req.environ[
'cinder.context']
    snapshot = body[
'snapshot']
   
# 获取快照的metadata信息,snapshot_id
    kwargs[
'metadata'] = snapshot.get('metadata', None)
    volume_id = snapshot[
'volume_id']
   
# 从数据库中获取卷信息
    volume =
self.volume_api.get(context, volume_id)
   
# 这里是获取传递进来的参数中是否使用强制快照,force=True表示采取强制快照
    force = snapshot.get(
'force', False)
   
# 参数类型转换,如果是非True/False的值,则抛异常
    force = strutils.bool_from_string(force
, strict=True)
    LOG.info(
"Create snapshot from volume %s", volume_id)
   
# 验证快照名及快照描述是否合法,长度不能超过256个字符
   
self.validate_name_and_description(snapshot, check_length=False)
   
# NOTE(thingee): v2 API allows name instead of display_name
   
# display_name代替name参数
   
if 'name' in snapshot:
        snapshot[
'display_name'] = snapshot.pop('name')
   
# 开始进行快照的操作,根据force值得不同走不通的分支,其实都是对_create_snapshot的封装
   
if force:
        new_snapshot =
self.volume_api.create_snapshot_force(context

                                                             volume

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxggp.html