分享

OpenStack建立实例完整过程源码详细分析(3)

xioaxu790 发表于 2014-6-10 11:15:54 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 10540
问题导读:
1、如何分析models.S3Image的定义?



前言
1、OpenStack建立实例完整过程源码详细分析(1)

2、OpenStack建立实例完整过程源码详细分析(2)

本文,继续接上一篇内容:

继续解析方法def show(self, context, image_id):
  1. def show(self, context, image_id):      
  2.         """                       
  3.         # 调用之一传进来的参数:   
  4.         # context:上下文信息;   
  5.         # image_id=internal_id:实例镜像的ID值(从EC2 ID值变换了格式以后得到的);   
  6.         """      
  7.         # id_to_glance_id:根据数据库内置ID值(实例或者说是镜像的ID)获取数据库中相应的UUID值,赋值给image_uuid;      
  8.         image_uuid = ec2utils.id_to_glance_id(context, image_id)      
  9.                      
  10.         # 这里的service:service = service or glance.get_default_image_service();      
  11.         # 获取service或者是GlanceImageService的对象(glance.get_default_image_service()指向的);      
  12.         # 所以这里调用的还是/nova/image/glance.py中的show方法;      
  13.         image = self.service.show(context, image_uuid)      
  14.               
  15.         # 转换镜像中的image_uuid到image_id;      
  16.         # 更新image当中的相关属性,返回更新后的image数据;      
  17.         return self._translate_uuid_to_id(context, image)
复制代码

1.2.3 self._translate_uuid_to_id(context, image)
  1. def _translate_uuid_to_id(self, context, image):  
  2.     """
  3.     调用glance_id_to_id方法转换image_copy['id']、image_copy['properties']['kernel_id']和image_copy['properties']['ramdisk_id'];
  4.     更新image当中的相关属性,返回更新后的image数据;
  5.     """  
  6.       
  7.     # 拷贝image对象给image_copy;  
  8.     image_copy = image.copy()  
  9.   
  10.     try:  
  11.         image_uuid = image_copy['id']  
  12.     except KeyError:  
  13.         pass  
  14.     else:              
  15.         image_copy['id'] = ec2utils.glance_id_to_id(context, image_uuid)  
  16.   
  17.     for prop in ['kernel_id', 'ramdisk_id']:  
  18.         try:  
  19.             image_uuid = image_copy['properties'][prop]  
  20.         except (KeyError, ValueError):  
  21.             pass  
  22.         else:  
  23.             image_id = ec2utils.glance_id_to_id(context, image_uuid)  
  24.             image_copy['properties'][prop] = image_id  
  25.   
  26.     return image_copy  
复制代码

总体来讲,这个方法实现的功能就是调用glance_id_to_id方法,转换image_copy['id']、image_copy['properties']['kernel_id']和image_copy['properties']['ramdisk_id'];
    具体来看方法glance_id_to_id,这个方法实现了根据给定的glance_id值,查找到匹配的S3格式镜像数据信息,进一步获取镜像的id值返回:
  1. def glance_id_to_id(context, glance_id):  
  2.     """
  3.     根据给定的glance_id值,查找到匹配的S3格式镜像数据信息,进一步获取镜像的id值返回;
  4.     """  
  5.     if glance_id is None:  
  6.         return  
  7.       
  8.     # s3_image_get_by_uuid:通过给定的glance_id查找本地的S3格式的镜像;  
  9.     try:  
  10.         return db.s3_image_get_by_uuid(context, glance_id)['id']  
  11.     except exception.NotFound:  
  12.         return db.s3_image_create(context, glance_id)['id']
复制代码

方法s3_image_get_by_uuid实现了通过给定的image_uuid值到数据库中查找匹配的S3格式镜像数据信息,进入方法s3_image_get_by_uuid:
  1. def s3_image_get_by_uuid(context, image_uuid):  
  2.     """
  3.     通过给定的image_uuid查找S3格式的镜像数据信息;
  4.     """  
  5.     result = model_query(context, models.S3Image, read_deleted="yes").\  
  6.                  filter_by(uuid=image_uuid).\  
  7.                  first()  
  8.   
  9.     if not result:  
  10.         raise exception.ImageNotFound(image_id=image_uuid)  
  11.   
  12.     return result  
复制代码

我们再看models.S3Image的定义:
  1. class S3Image(BASE, NovaBase):  
  2.     """Compatibility layer for the S3 image service talking to Glance."""  
  3.     __tablename__ = 's3_images'  
  4.     id = Column(Integer, primary_key=True, nullable=False, autoincrement=True)  
  5.     uuid = Column(String(36), nullable=False)
复制代码

正如前面我们所说过的,这个类从NovaBase类继承,这也是model_query方法所要求的。看看这个类,我们可以理解为,它创建了一个数据库中的表s3_images,并且定义数据表的结构,有两个属性id和uuid;
    所以我们就能够知道glance_id_to_id(context, glance_id)实现的是根据给定的glance_id值,查询数据库,找到匹配的表信息,获取它的S3Image.id值并返回,分别赋值给:image_copy['id']、image_copy['properties']['kernel_id']和image_copy['properties']['ramdisk_id'];
   
因为方法_translate_uuid_to_id中开始有一语句:
  1. image_copy = image.copy()  
复制代码

拷贝image的对象给image_copy,注意这里所用的拷贝方法不是deepcopy,所以虽然实现拷贝但是实际上二者共享同一数据,所以image_copy改变的id值,同样image元数据中同样更新,所以直接返回了image_copy给方法def _get_image(self, context, ec2_id):
  1. def _get_image(self, context, ec2_id):  
  2.         """
  3.         获取ec2_id指定的镜像image数据;
  4.         """  
  5.         try:  
  6.         ......  
  7.             image = self.image_service.show(context, internal_id)
复制代码

至此,源码分析(1)中所指出的方法def _get_image(self, context, ec2_id)中的语句:image = self.image_service.show(context, internal_id)全部解析完成;

    至此,方法_get_image(self, context, ec2_id):也全部解析完成,这个方法实现的就是尝试链接glance客户端,根据ec2_id值获取匹配的镜像元数据分别赋值给kernel、ramdisk和image;

上一篇:
OpenStack建立实例完整过程源码详细分析(2)

已有(1)人评论

跳转到指定楼层
lbwahoo 发表于 2014-7-17 21:49:19
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条