nova部分源码分析
2016-04-20 16:50
239 查看
今天下午时间正在研读openstack的nova源码,无意之间走到了贝勒大哥的csdn博客,看到他主页页眉处,写着心酸几句话那,不由得说“此去经年,应是良城美景虚设,便纵有千种风情更与何人说”。苦涩涩的几翻话让我想起了过往。告诉自己:莫问前路无知己,天下谁人不识君。以此自勉。
回到主题:nova部分解析
def run_instances(self, context, **kwargs):
"""
准备实例,并且发送实例的信息和要运行实例的请求消息到远程调度器scheduler;
实现实例的简历和运行,由调度器完成;
"""
# 设置最小建立实例的数目;
min_count = int(kwargs.get('min_count', 1))
# 获取kwargs['kernel_id']指定的镜像image数据返回给kernel;
# 获取更新的kwargs['kernel_id'];
# 注:kernel_id为虚拟机内核ID值;
if kwargs.get('kernel_id'):
# _get_image:
# context:上下文信息;
# kwargs['kernel_id']:从参数信息中获取'kernel_id'值;
kernel = self._get_image(context, kwargs['kernel_id'])
# 根据kernel['id']查询数据库中匹配的S3镜像数据,获取它的uuid属性,并返回;
# 返回匹配的db.models.S3Image.uuid给kwargs['kernel_id'];
kwargs['kernel_id'] = ec2utils.id_to_glance_id(context, kernel['id'])
# 获取kwargs['ramdisk_id']指定的镜像image数据返回给ramdisk;
# 获取更新的kwargs['ramdisk_id'];
if kwargs.get('ramdisk_id'):
ramdisk = self._get_image(context, kwargs['ramdisk_id'])
# 根据ramdisk['id']查询数据库中匹配的S3镜像数据,获取它的uuid属性,并返回;
# 返回匹配的db.models.S3Image.uuid给kwargs['ramdisk_id'];
kwargs['ramdisk_id'] = ec2utils.id_to_glance_id(context, ramdisk['id'])
# 循环获取每一个块设备映射;
# 解析块设备映射bdm;
for bdm in kwargs.get('block_device_mapping', []):
_parse_block_device_mapping(bdm)
# 获取kwargs['image_id']指定的镜像image数据;
image = self._get_image(context, kwargs['image_id'])
# 根据image['id']查询数据库中匹配的S3镜像数据,获取它的uuid属性,并返回;
# 返回匹配的db.models.S3Image.uuid给image_uuid;
image_uuid = ec2utils.id_to_glance_id(context, image['id'])
# 获取镜像image的状态;
if image:
image_state = self._get_image_state(image)
else:
raise exception.ImageNotFoundEC2(image_id=kwargs['image_id'])
if image_state != 'available':
raise exception.EC2APIError(_('Image must be available'))
# create:准备实例,并且发送实例的信息和要运行实例的请求消息到远程调度器scheduler;
# 实现实例的简历和运行,由调度器完成,这部分代码实际上只是实现请求消息的发送;
(instances, resv_id) = self.compute_api.create(context,
# get_instance_type_by_name:通过给定的name检索单个实例类型信息;
# 以字典的形式返回查询结果;
instance_type=instance_types.get_instance_type_by_name(kwargs.get('instance_type', None)),
image_href=image_uuid,
max_count=int(kwargs.get('max_count', min_count)),
min_count=min_count,
kernel_id=kwargs.get('kernel_id'),
ramdisk_id=kwargs.get('ramdisk_id'),
key_name=kwargs.get('key_name'),
user_data=kwargs.get('user_data'),
security_group=kwargs.get('security_group'),
availability_zone=kwargs.get('placement', {}).get('availability_zone'),
block_device_mapping=kwargs.get('block_device_mapping', {}))
return self._format_run_instances(context, resv_id)
回到主题:nova部分解析
def run_instances(self, context, **kwargs):
"""
准备实例,并且发送实例的信息和要运行实例的请求消息到远程调度器scheduler;
实现实例的简历和运行,由调度器完成;
"""
# 设置最小建立实例的数目;
min_count = int(kwargs.get('min_count', 1))
# 获取kwargs['kernel_id']指定的镜像image数据返回给kernel;
# 获取更新的kwargs['kernel_id'];
# 注:kernel_id为虚拟机内核ID值;
if kwargs.get('kernel_id'):
# _get_image:
# context:上下文信息;
# kwargs['kernel_id']:从参数信息中获取'kernel_id'值;
kernel = self._get_image(context, kwargs['kernel_id'])
# 根据kernel['id']查询数据库中匹配的S3镜像数据,获取它的uuid属性,并返回;
# 返回匹配的db.models.S3Image.uuid给kwargs['kernel_id'];
kwargs['kernel_id'] = ec2utils.id_to_glance_id(context, kernel['id'])
# 获取kwargs['ramdisk_id']指定的镜像image数据返回给ramdisk;
# 获取更新的kwargs['ramdisk_id'];
if kwargs.get('ramdisk_id'):
ramdisk = self._get_image(context, kwargs['ramdisk_id'])
# 根据ramdisk['id']查询数据库中匹配的S3镜像数据,获取它的uuid属性,并返回;
# 返回匹配的db.models.S3Image.uuid给kwargs['ramdisk_id'];
kwargs['ramdisk_id'] = ec2utils.id_to_glance_id(context, ramdisk['id'])
# 循环获取每一个块设备映射;
# 解析块设备映射bdm;
for bdm in kwargs.get('block_device_mapping', []):
_parse_block_device_mapping(bdm)
# 获取kwargs['image_id']指定的镜像image数据;
image = self._get_image(context, kwargs['image_id'])
# 根据image['id']查询数据库中匹配的S3镜像数据,获取它的uuid属性,并返回;
# 返回匹配的db.models.S3Image.uuid给image_uuid;
image_uuid = ec2utils.id_to_glance_id(context, image['id'])
# 获取镜像image的状态;
if image:
image_state = self._get_image_state(image)
else:
raise exception.ImageNotFoundEC2(image_id=kwargs['image_id'])
if image_state != 'available':
raise exception.EC2APIError(_('Image must be available'))
# create:准备实例,并且发送实例的信息和要运行实例的请求消息到远程调度器scheduler;
# 实现实例的简历和运行,由调度器完成,这部分代码实际上只是实现请求消息的发送;
(instances, resv_id) = self.compute_api.create(context,
# get_instance_type_by_name:通过给定的name检索单个实例类型信息;
# 以字典的形式返回查询结果;
instance_type=instance_types.get_instance_type_by_name(kwargs.get('instance_type', None)),
image_href=image_uuid,
max_count=int(kwargs.get('max_count', min_count)),
min_count=min_count,
kernel_id=kwargs.get('kernel_id'),
ramdisk_id=kwargs.get('ramdisk_id'),
key_name=kwargs.get('key_name'),
user_data=kwargs.get('user_data'),
security_group=kwargs.get('security_group'),
availability_zone=kwargs.get('placement', {}).get('availability_zone'),
block_device_mapping=kwargs.get('block_device_mapping', {}))
return self._format_run_instances(context, resv_id)
相关文章推荐
- lucene查询方式介绍
- R 数字 字符 向量
- postgres 数据备份与恢复
- ajax基本格式
- HttpRuntime
- DataTable行操作
- Java中普通代码块,构造代码块,静态代码块区别及代码示例
- netstat
- C高级 服务器内核分析和构建 (一)
- c
- Oryx2源码学习
- MySQL数据类型
- Spring中整合Xfire发布webservice服务
- 2016/4/20
- n
- history.back()与history.go(-1)
- intel dpdk 在虚拟机 VMware 中安装部署
- 即时通讯(环信) bug
- IoC实践--ASP.NET MVC5 采用Unity依赖注入Controller详解
- visual studio中读取图像像素