1.查看body中adminPass是否指定
2.查看server的那么是否存在在body中
3.查看是否指定了具体的imageRef。如果没有指定的话看看有没有指定block_device_mapping或block_device_mapping_v2。
4.查看body中有没有指定personality,如果指定的话导入body中指定的config_drive
5.如果指定了personality,将这个项目下body中指定的需要被注入到虚拟机中的文件导入内存
6.查看是否指定了security_groups,如果没有指定则使用default这个group
7.获取body中network的值。这里network中可以有fixed ip、port之类的值,也可以只有uuid
8.查看body中有没有指定access ip
9.获取flavor的id
10.查看body中是否指定了key或user_data或availability_zone
11.对body中的block device做处理。
12.检查body中min_count和max_count是否存在,存在的话是否是有效值。
13.查看body是否设置了auto_disk_config这个字段。
14.查看对调度算法是否设置了hints,具体的参数是scheduler_hints
15.根据上面获取到的信息创建虚拟机
16.返回结果
其中第15步的详细过程是:
1.检查对应的用户是否有足够的权限创建虚拟机(通过policy.json文件)
2.查看neutron下的网络参数是否合理
3.检查是否提供了flavor id,没有提供的话使用默认的instance type
4.如果从image启动,那么获取一个glance的service类,同时获取image的元信息,通过这个类可以下载到具体的image。如果从volume启动,则获取volume的相关信息
5.通过image的信息,判定是否可以auto config
6.解析az参数的格式,如果是az:host:node,那么就解析成三个。如果是az::node,那么就解析两个。如果没有提供az这个参数的话,az就指定为CONF.default_schedule_zone。
7.获取block device的mapping关系
8.做一下和quota相关的检查
9.构造一个filter的字典
10.如果存在instance group的话,会做一些相关的操作。
11.在数据库中添加start状态的信息
12.调用scheduler,根据配置文件中的scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler这个driver,决定具体在哪来创建。具体的调度方法是先通过scheduler_default_filters参数中的filter对所有的host进行一个过滤,过滤出来的host再根据scheduler_weight_classes做一个权重的排序。最后对这些选出来的host的前scheduler_host_subset_size台中会做个随机的选择,选出一台作为我们的selected
host
13.发送一个notice,告诉大家我要建立虚机了
14.在数据库中记录虚机的信息
15.调用rpc,让compute节点建立虚机(调用compute的run_instance方法)
16.compute调用具体的driver的方法创建虚机。主要就是把相关的网络、磁盘啥的建立好,然后根据配置文件生成一个xml文件,最后才是调用libvirt根据这个xml生成我们的虚拟机。
参考:http://bingotree.cn/?p=470#more-470
转载请注明出处:http://blog.youkuaiyun.com/victor1984/article/details/43084419