#  'status': u'creating', 
           
#  'display_name': u'snapshot
for snapshot1', 
           
#  'created_at': u'2016-06-24T09:23:00.517279',
           
#  'display_description':
u'', 
           
#  'volume_size': 20, 
           
#  'volume_id':
u'60e16af2-0684-433c-a1b6-c1af1c2523fc', 
           
#  'progress': None, 
           
#  'project_id':
u'25520b29dce346d38bc4b055c5ffbfcb', 
           
#  'id':
u'cede2421-ea68-4a8e-937d-c27074b9024b', 
           
#  'size': 20
           
# }
            snapshot =
self.volume_api.create_snapshot_force(
                context, volume['id'], name, volume['display_description'])
           
# 接着会根据bdm信息,来构建快照的dict格式属性信息,返回一个BlockDeviceDict对象,属性如下:
           
# {
           
#  'guest_format': None, 
           
#  'boot_index': 0, 
           
#  'no_device': None, 
           
#  'connection_info': None, 
           
#  'snapshot_id':
u'cede2421-ea68-4a8e-937d-c27074b9024b',
           
#  'volume_size': 20, 
           
#  'device_name':
u'/dev/vda', 
           
#  'disk_bus': u'virtio', 
           
#  'image_id': None, 
           
#  'source_type': 'snapshot',
           
#  'device_type': u'disk', 
           
#  'volume_id': None, 
           
#  'destination_type':
'volume', 
           
#  'delete_on_termination':
False
           
# }
            mapping_dict =
block_device.snapshot_from_bdm(snapshot['id'], bdm)
           
# 过滤掉已经在数据库中存在的字段
       
    mapping_dict =
mapping_dict.get_image_mapping()
           
# 将云主机所有的映射关系都添加到mapping中
            mapping.append(mapping_dict)
        return mapping
    self._record_action_start(context, instance, instance_actions.CREATE_IMAGE)
    # 调用“snapshot_instance”,获取云主机所有的mapping关系
    mapping =
snapshot_instance(self, context, instance, bdms)
    # 如果此时卷的文件系统已静默,这里则进行解冻处理,实现过程就是通过rpc.case发送异步请求给nova-compute
    # nova-compute接收到消息后,会等到快照完成后对文件系统进行解冻(需要agent支持)
    if quiesced:
       
self.compute_rpcapi.unquiesce_instance(context, instance, mapping)
    # 更新云主机metadata信息中的properties信息
    if mapping:
       
properties['block_device_mapping'] = mapping
       
properties['bdm_v2'] = True
    # 到这一步时,会到添加一条记录到glance快照(镜像)数据库条目
    #(会在Dashboard的镜像面板显示一条名为snapshot1的快照记录),
    # 快照的大部分信息都拷贝至系统盘属性,这是因为卷快照是可以直接用来启动云主机的,
    # 另外'block_device_mapping'属性中包含所有的volume设备快照信息(如果有的话),
    # 每个volume设备快照信息作为一条记录,记录在image_properties数据表;
    # 
      {
         'name':
u'snapshot1',
         'min_ram':
u'0',
         'min_disk':
u'20',
         'is_public':
False,
         'properties':
{
                 'bdm_v2':
True,
                 'block_device_mapping':
[{
                          'guest_format':
None,
                          'boot_index':
0,
                          'no_device':
None,
                          'image_id':
None,
                          'volume_id':
None,
                          'device_name':
u'/dev/vda',
                          'disk_bus':
u'virtio',
                          'volume_size':
20,
                          'source_type':
'snapshot',
                          'device_type':
u'disk',
                          'snapshot_id':
u'cede2421-ea68-4a8e-937d-c27074b9024b',
                          'destination_type':
'volume',
                          'delete_on_termination':
False
                 }],
                 'base_image_ref':
u'',
                 'root_device_name':
u'/dev/vda'
         },
         'size':
0
    }
    return self.image_api.create(context, image_meta)
OpenStack快照分析:(三)从磁盘启动云主机离线(在线)快照分析 (4)
内容版权声明:除非注明,否则皆为本站原创文章。

