openstack源码分析
tiantao2012
这个作者很懒,什么都没留下…
展开
-
nova 中os_type为window时需要使用localtime
nova中在如下的code中可以拿到os typeE:\nova\nova\compute\api.py def _inherit_properties_from_image(self, image, auto_disk_config): #可见属性信息是包含在image的镜像当中的 image_properties = image.get('properties'原创 2018-01-16 10:27:05 · 1361 阅读 · 0 评论 -
nova中的service 访问数据库的过程
nova中的访问数据库的接口都在E:\nova\nova\db\api.py,但是该模块只是一个代理,只剩的实现是IMPLIMPL的赋值如下:_BACKEND_MAPPING = {'sqlalchemy': 'nova.db.sqlalchemy.api'}IMPL = concurrency.TpoolDbapiWrapper(CONF, backend_mapping=_BACKE原创 2017-11-14 14:27:02 · 2138 阅读 · 0 评论 -
从neutron/setup.cfg 的[entry_points] 可以知道组成neutron个个子系统的源码路径
neutron代码的配置文件在neutron/setup.cfg 中[metadata]name = neutron从metadata 看出网络部分的name是neutron可以看出l3的代码路径是neutron/cmd/eventlet/agents/l3入口函数是main.neutron-l3-agent = neutron.cmd.eventlet.agents.l3:main类原创 2017-10-17 15:26:28 · 1007 阅读 · 0 评论 -
通过nova.utils.execute 执行shell命令
下面这段code 其实是执行rm -rf 这个命令,来删除一个路径下的东西 target = libvirt_utils.get_instance_path(instance) + '_resize' if os.path.exists(target): # Deletion can fail over NFS, so retry the原创 2017-10-25 17:33:41 · 1579 阅读 · 0 评论 -
nova resize时候的确认和取消操作
在执行resize的时候最后会让用户确实是否真的要resize还是要revert当前resize的操作。这种确认操作在在nova api中都有对应的操作先看如果要取消resize的操作。其入口代码在nova/api/openstack/compute/servers.py,方法是_action_revert_resize,如下 @wsgi.response(202) @extensi原创 2017-10-25 16:27:04 · 2095 阅读 · 1 评论 -
nova调用rados来实现snapshot
创建虚拟机快照的实现在\nova\compute\manager.py 中的_snapshot_instancedef _snapshot_instance(self, context, image_id, instance, expected_task_state): def update_task_state(ta原创 2017-11-02 14:59:03 · 864 阅读 · 0 评论 -
nova 中读取proc/meminfo
在nova/libvirt/host.py 中的get_memory_mb_used会读取proc/meminfo。源码如下:ef get_memory_mb_used(self): """Get the used memory size(MB) of physical computer. :returns: the total usage of memory原创 2017-11-02 09:45:15 · 819 阅读 · 0 评论 -
通过periodic_task.periodic_task 实现周期性任务的原理
在nova中可以通过添加@periodic_task.periodic_task 来产生一个周期任务。例如使用默认周期的任务: @periodic_task.periodic_task def _poll_rebooting_instances(self, context): if CONF.reboot_timeout > 0: filt原创 2017-10-24 17:26:46 · 6847 阅读 · 0 评论 -
nova中的volume接口
在nova/volume 这个目录下定义了nova访问volume的接口,这个路径下的__init__.py为空文件,因此只关注cinder.py首先通过def cinderclient(context, microversion=None, skip_version_check=False)函数得到cinder client,而cinderclient 中是通过keystore中保存的cin原创 2017-11-01 14:56:48 · 1112 阅读 · 0 评论 -
libvirt 中的image cache
在nova/virt/libvirt/driver.py 中的_create_image 会生成instance的镜像,且会调用cache来进行缓存到本地def _create_image(self, context, instance, disk_mapping, injection_info=None, suffix='',原创 2017-10-31 14:40:19 · 977 阅读 · 0 评论 -
LocalAPI和API的区别
从nova/conductor/__init__.py中可以看到conductor最终定义了四种classCONF = nova.conf.CONFdef API(*args, **kwargs): use_local = kwargs.pop('use_local', False) if CONF.conductor.use_local or use_local:原创 2017-10-30 16:00:01 · 1272 阅读 · 0 评论 -
importutils.import_class
在E:\nova\nova\service.py 中通过manager_class = importutils.import_class(self.manager_class_name) 得到一个class,然后就可以调用这个class例如:class Service(service.Service): """Service object for binaries running on原创 2017-11-14 14:31:01 · 2953 阅读 · 0 评论 -
nova 挂载volume
nova 挂载volume的入口在E:\nova\nova\api\openstack\compute\volumes.py 中的VolumeAttachmentController类的create方法 def create(self, req, server_id, body): """Attach a volume to an instance.""" con原创 2017-11-06 14:15:40 · 2079 阅读 · 0 评论 -
oslo_i18n
在nova中经常看到下面的code if requested_topology and not instance_topology: if pci_requests.requests: return (_("Requested instance NUMA topology together with "原创 2017-11-16 14:05:15 · 1429 阅读 · 0 评论 -
nova中的localfs
使用guestfs 可以在不用mount的情况下直接处理虚拟机的镜像文件,而使用localfs的话就需要将虚拟机的镜像文件mount到host中才能编辑镜像文件.localfs的实现路径为E:\nova\nova\virt\disk\vfs\localfs.pyclass VFSLocalFS(vfs.VFS): def __init__(self, image, partitio原创 2017-12-27 14:13:38 · 982 阅读 · 0 评论 -
nova 中的guestfs
guestfs 是使用libguestfs 库中的一个模块,提供修改虚拟机镜像配置的功能,它不要把虚拟机的镜像文件挂载到本地,而是提供了一个shell接口,可以编辑镜像文件。在nova中的实现了一个VFSGuestFS的类来操作guestfs提供的接口class VFSGuestFS(vfs.VFS): """This class implements a VFS module t原创 2017-12-27 14:12:40 · 830 阅读 · 0 评论 -
libvirt的file injection
在E:\nova\nova\virt\libvirt\driver.py 中的_create_and_inject_local_root 检查是否需要进行injectiondef _create_and_inject_local_root(self, context, instance, booted_from_volu原创 2017-12-25 11:27:25 · 706 阅读 · 0 评论 -
servicegroup的db实现
在E:\nova\nova\conf\service.py 中查看service的配置选项,可以看到有两个report_interval,service_down_time其注释已经写的很清楚其作用了.service_opts = [ # TODO(johngarbutt) we need a better default and minimum, in a backwards原创 2017-11-28 14:35:50 · 1145 阅读 · 0 评论 -
nova的pci 设备白名单
并不是所有的guest可以使用pci设备,在E:\nova\nova\pci\whitelist.py 中定义了白名单决定哪些guest可以使用pci device在class Whitelist(object)这个class的__init__ 中会调用_parse_white_list_from_config 来从配置文件中将guest使用pci设备的白名单加载进来 @stati原创 2017-11-28 14:34:24 · 1300 阅读 · 0 评论 -
oslo_utils 中的 timeutils
在E:\nova\nova\compute\manager.py 中有如下语句:from oslo_utils import timeutils在manager.py中使用timeutils的例子如下: with timeutils.StopWatch() as timer: self.network_api.deallocate_for_instanc原创 2017-12-15 10:20:18 · 1181 阅读 · 0 评论 -
servicegroup的mc实现
前面的博文分析过servicegroup的实现分为db和mc两种,前面已经说过db了,下来看看mc的实现,这里的mc全称应该是memcached_client的缩写class MemcachedDriver(base.Driver): def __init__(self, *args, **kwargs):#首先在init函数中为mc赋值 self.mc = ca原创 2017-12-06 14:30:22 · 899 阅读 · 0 评论 -
FixedIntervalLoopingCall
在nova中使用FixedIntervalLoopingCall 来实现周期运行的函数的用法如下: timer = loopingcall.FixedIntervalLoopingCall(_wait_for_destroy, old_domid) timer.原创 2017-12-04 14:11:00 · 1921 阅读 · 0 评论 -
nova 中的taskflow的实现
nova 中有自己实现简单的taskflow 类,并没有用第三方类库中的类.在E:\nova\nova\conductor\tasks\base.py 中有实现nova中的taskflowdef rollback_wrapper(original): @functools.wraps(original) def wrap(self): try:原创 2017-12-19 17:13:35 · 729 阅读 · 0 评论 -
compute和schedule通过scheduler_client进行rpc通讯
compute和schedule 节点之前都是通过rpc来通讯的,例如在E:\nova\nova\compute\manager.py 中一般通过self.scheduler_client来和schedule 通讯,例如下面的例子 def _update_scheduler_instance_info(self, context, instance): """Sends原创 2017-11-16 14:06:25 · 738 阅读 · 0 评论 -
compute中得到image的name
在nova/compute/manager.py 中的class ComputeManager(manager.Manager): def _build_and_run_instance(self, context, instance, image, request_spec): image_name = image.get('name')这里通过image.get得到这个image原创 2017-10-30 15:41:18 · 429 阅读 · 0 评论 -
nova中的API中的AdminActionsController入口
在E:\nova\nova\api\openstack\compute\admin_actions.py 路径下定义了admin的网络的api接口class AdminActionsController(wsgi.Controller): def __init__(self, *args, **kwargs): super(AdminActionsController,原创 2017-11-07 14:22:36 · 401 阅读 · 0 评论 -
context中包含的内容
在nova/service.py 中通过from nova import context 来导入context.py这样在start函数中就可以通过ctxt = context.get_admin_context()来得到context,那这个context里面到底都包含了啥呢?继续看nova.context.py 中的def get_admin_context(read_deleted="原创 2017-10-28 15:38:54 · 1132 阅读 · 0 评论 -
nova schedule 调度器之FilterSchedulerz中的 _get_all_host_states
在filter_scheduler.py 的_schedule 中首先会调用_get_all_host_states来获得所有host的状态。 def _get_all_host_states(self, context): """Template method, so a subclass can implement caching.""" re原创 2017-03-30 17:03:47 · 976 阅读 · 0 评论 -
nova schedule 调度器之FilterScheduler 申请到instance后HostState持有资源的更新
在filter_scheduler.py 的_schedule 中选出需要的host后,会调用chosen_host.obj.consume_from_request(spec_obj) 来更新resource资源.consume_from_request 是在host_manager.py中实现 def consume_from_request(self, spec_obj):原创 2017-03-30 15:34:04 · 937 阅读 · 0 评论 -
nova通过check_instance_lock对危险的操作保护
在computer/api.py 中一些函数前面有有一个装饰器check_instance_lock @check_instance_lock @check_instance_cell @check_instance_state(vm_state=None, task_state=None, must_have_l原创 2017-03-23 10:42:51 · 811 阅读 · 0 评论 -
nova schedule 调度器之FilterScheduler
def select_destinations(self, context, spec_obj): """Selects a filtered set of hosts and nodes.""" self.notifier.info( context, 'scheduler.select_destinations.start',原创 2017-03-29 17:15:40 · 1635 阅读 · 0 评论 -
nova scheduler调度器
当在conductor中通过_schedule_instances 来调用select_destinations def _schedule_instances(self, context, request_spec, filter_properties): scheduler_utils.setup_instance_group(context, request_spec,原创 2017-03-29 15:48:53 · 2116 阅读 · 0 评论 -
nova的soft_delete
在api/openstack/compute/servers.py 中实现_delete 函数用于删除镜像 def _delete(self, context, req, instance_uuid): instance = self._get_server(context, req, instance_uuid) context.can(serv原创 2017-03-22 16:58:38 · 1011 阅读 · 0 评论 -
nova schedule 调度器之FilterSchedulerz中的 get_weighed_hosts
在filter_scheduler.py 的_schedule 中会调用get_weighed_hosts 来为host计算权重 weighed_hosts = self.host_manager.get_weighed_hosts(hosts,spec_obj) 具体实现在host_manager.py的HostManager 类中 def get_weighed_hosts(se原创 2017-04-07 14:43:07 · 809 阅读 · 0 评论 -
nova创建虚拟机时资源的检测
在通过/nova/compute/manager.py:ComputeManager中的_build_and_run_instance来创建虚拟机的时候,会通过claim机制来监视当前的资源是否够创建虚拟机 def _build_and_run_instance(self, context, instance, image, injected_files, ad原创 2017-02-24 09:01:42 · 2246 阅读 · 0 评论 -
nova schedule
在nova/schedule 中的rpcapi.py中接收别的模块发送过来的请求def select_destinations(self, ctxt, spec_obj): version = '4.3' msg_args = {'spec_obj': spec_obj} if not self.client.can_send_versio原创 2017-01-10 11:47:34 · 602 阅读 · 0 评论 -
schedule service的启动
在noma/cmd下面文件都是启动nova service的起始code,以schedule为例。路径是nova/cmd/scheduler.pydef main(): config.parse_args(sys.argv) logging.setup(CONF, "nova") utils.monkey_patch() objects.regist原创 2017-01-05 14:50:06 · 2196 阅读 · 0 评论 -
nova schedule 调度器之FilterSchedulerz中的 get_filtered_hosts
在filter_scheduler.py 的_schedule 中会调用get_filtered_hosts 来对host 进行过滤。 hosts = self.host_manager.get_filtered_hosts(hosts, spec_obj, index=num)可以看到get_filtered_hosts是在host_manage原创 2017-04-06 16:19:47 · 1210 阅读 · 0 评论 -
nova service的heatbeat机制
nova conductor这个服务启动的入口函数在nova/cmd/conductor.py 中,我们重点关注heatbeat服务def main()://调用service的构造函数,其位于nova/service.py中 server = service.Service.create(binary='nova-conductor',原创 2017-09-07 16:21:14 · 851 阅读 · 0 评论 -
nova 创建qcow2的kernel image的过程
最终调用nova/virt/libvirt/driver.py 中的spawn来创建虚拟机 def spawn(self, context, instance, image_meta, injected_files, admin_password, network_info=None, block_device_info=None): disk_原创 2017-09-08 15:51:59 · 799 阅读 · 0 评论