--------------- 紧接上篇 nova实例创建(2) --------------------
5. 分析create方法
在最开始的run_instances方法中可知创建实例是通过self.compute_api.create
方法来实现的,该方法是在/nova/compute/api.py
里
# 建立所有类型的实例都要执行 # 返回一个元组(实例或者是reservation_id的元组) # 元组里面的实例可以是"None"或者是实例字典的一个列表,这要取决于是否等待scheduler返回的信息 @hooks.add_hook("create_instance") def create(self, context, instance_type, image_href, kernel_id=None, ramdisk_id=None, min_count=None, max_count=None, display_name=None, display_description=None, key_name=None, key_data=None, security_group=None, availability_zone=None, user_data=None, metadata=None, injected_files=None, admin_password=None, block_device_mapping=None, access_ip_v4=None, access_ip_v6=None, requested_networks=None, config_drive=None, auto_disk_config=None, scheduler_hints=None, legacy_bdm=True, shutdown_terminate=None, check_server_group_quota=False):
5.1 首先对执行create方法的资格进行验证
# 验证是否有资格执行create这个方法 # policy是nova中的一个资格验证机制 self._check_create_policies(context, availability_zone, requested_networks, block_device_mapping)
5.2 检测多个实例情况下IP和端口的使用情况
if requested_networks and max_count > 1: # 检测多个实例是否同时占用一个固定IP,如果是,引发异常 self._check_multiple_instances_and_specified_ip(requested_networks) if utils.is_neutron(): # 检测多个实例是否使用同一个端口,如果不是,引发异常 self._check_multiple_instances_neutron_ports( requested_networks)
5.3 验证所有参数并最后发送请求消息给调度器
# 验证所有的输入实例参数 # 发送要运行实例(‘run_instance’)的请求消息到远程调度器 return self._create_instance( context, instance_type, image_href, kernel_id, ramdisk_id, min_count, max_count, display_name, display_description, key_name, key_data, security_group, availability_zone, user_data, metadata, injected_files, admin_password, access_ip_v4, access_ip_v6, requested_networks, config_drive, block_device_mapping, auto_