nova部分源码分析

本文深入探讨了Nova源码中的run_instances方法,详细解析了如何准备实例、发送请求到调度器以及实现实例创建与运行的过程。重点介绍了镜像、内核和RAM盘的获取、块设备映射的解析以及实例创建的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        今天下午时间正在研读openstack的nova源码,无意之间走到了贝勒大哥的csdn博客,看到他主页页眉处,写着心酸几句话那,不由得说“此去经年,应是良城美景虚设,便纵有千种风情更与何人说”。苦涩涩的几翻话让我想起了过往。告诉自己:莫问前路无知己,天下谁人不识君。以此自勉。

       回到主题:nova部分解析

  1. def run_instances(self, context, **kwargs):  
  2.         """ 
  3.         准备实例,并且发送实例的信息和要运行实例的请求消息到远程调度器scheduler; 
  4.         实现实例的简历和运行,由调度器完成; 
  5.         """  
  6.           
  7.         # 设置最小建立实例的数目;  
  8.         min_count = int(kwargs.get('min_count'1))  
  9.           
  10.         # 获取kwargs['kernel_id']指定的镜像image数据返回给kernel;  
  11.         # 获取更新的kwargs['kernel_id'];  
  12.         # 注:kernel_id为虚拟机内核ID值;  
  13.         if kwargs.get('kernel_id'):  
  14.             # _get_image:  
  15.             # context:上下文信息;  
  16.             # kwargs['kernel_id']:从参数信息中获取'kernel_id'值;  
  17.             kernel = self._get_image(context, kwargs['kernel_id'])  
  18.             # 根据kernel['id']查询数据库中匹配的S3镜像数据,获取它的uuid属性,并返回;  
  19.             # 返回匹配的db.models.S3Image.uuid给kwargs['kernel_id'];  
  20.             kwargs['kernel_id'] = ec2utils.id_to_glance_id(context, kernel['id'])  
  21.               
  22.         # 获取kwargs['ramdisk_id']指定的镜像image数据返回给ramdisk;  
  23.         # 获取更新的kwargs['ramdisk_id'];  
  24.         if kwargs.get('ramdisk_id'):  
  25.             ramdisk = self._get_image(context, kwargs['ramdisk_id'])              
  26.             # 根据ramdisk['id']查询数据库中匹配的S3镜像数据,获取它的uuid属性,并返回;  
  27.             # 返回匹配的db.models.S3Image.uuid给kwargs['ramdisk_id'];  
  28.             kwargs['ramdisk_id'] = ec2utils.id_to_glance_id(context, ramdisk['id'])  
  29.               
  30.         # 循环获取每一个块设备映射;  
  31.         # 解析块设备映射bdm;  
  32.         for bdm in kwargs.get('block_device_mapping', []):  
  33.             _parse_block_device_mapping(bdm)  
  34.   
  35.         # 获取kwargs['image_id']指定的镜像image数据;  
  36.         image = self._get_image(context, kwargs['image_id'])  
  37.         # 根据image['id']查询数据库中匹配的S3镜像数据,获取它的uuid属性,并返回;  
  38.         # 返回匹配的db.models.S3Image.uuid给image_uuid;  
  39.         image_uuid = ec2utils.id_to_glance_id(context, image['id'])  
  40.   
  41.         # 获取镜像image的状态;  
  42.         if image:  
  43.             image_state = self._get_image_state(image)  
  44.         else:  
  45.             raise exception.ImageNotFoundEC2(image_id=kwargs['image_id'])  
  46.   
  47.         if image_state != 'available':  
  48.             raise exception.EC2APIError(_('Image must be available'))  
  49.   
  50.           
  51.         # create:准备实例,并且发送实例的信息和要运行实例的请求消息到远程调度器scheduler;  
  52.         # 实现实例的简历和运行,由调度器完成,这部分代码实际上只是实现请求消息的发送;  
  53.         (instances, resv_id) = self.compute_api.create(context,  
  54.             # get_instance_type_by_name:通过给定的name检索单个实例类型信息;  
  55.             # 以字典的形式返回查询结果;  
  56.             instance_type=instance_types.get_instance_type_by_name(kwargs.get('instance_type'None)),  
  57.             image_href=image_uuid,  
  58.             max_count=int(kwargs.get('max_count', min_count)),  
  59.             min_count=min_count,  
  60.             kernel_id=kwargs.get('kernel_id'),  
  61.             ramdisk_id=kwargs.get('ramdisk_id'),  
  62.             key_name=kwargs.get('key_name'),  
  63.             user_data=kwargs.get('user_data'),  
  64.             security_group=kwargs.get('security_group'),  
  65.             availability_zone=kwargs.get('placement', {}).get('availability_zone'),  
  66.             block_device_mapping=kwargs.get('block_device_mapping', {}))  
  67.         return self._format_run_instances(context, resv_id)  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值