上节中讲到在创建卷快照的时候,nova-api在处理请求时,使用cinderclient调用volume_api(cinder-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,