上篇文章我们分析了update_available_resourced定时任务,这篇文章我们来继续分析Nova Compute定时任务——report_driver_status和publish_service_capabilities定时任务。
一、report_driver_status定时任务
report_driver_status定时任务的主要功能是定时更新ComputeManager对象缓存的计算节点的capabilities信息。一个计算节点上的capabilities信息包括节点的硬件资源信息和hypervisor支持的特性。report_driver_status定时任务对应于ComputeManager类的_report_driver_status周期方法,该方法的定义如下
class ComputeManager(manager.SchedulerDependentManager):@manager.periodic_taskdef _report_driver_status(self, context):#获取当前时间curr_time = time.time()#如果ComputeManager对象缓存的capabilities已经过期if curr_time – self._last_host_check > CONF.host_state_interval:self._last_host_check = curr_time#获取最新的capabilities信息capabilities = self.driver.get_host_stats(refresh=True)for capability in (capabilities if isinstance(capabilities, list)else [capabilities]):capability['host_ip'] = CONF.my_ip#更新ComputeManager对象缓存的capabilities信息self.update_service_capabilities(capabilities)代码中主要涉及到了两个方法,我们逐一来分析一下:
1. LibvirtDriver类的get_host_stats方法
LibvirtDriver类的get_host_stats方法在上一篇文章分析update_available_resource定时任务时,我们详细分析过,这里就不再重复了,大家可以参见我的上一篇博文。
2. ComputeManager类的update_service_capabilities方法
ComputeManager类的update_service_capabilities方法的作用是更新缓存的计算节点的capabilities信息。ComputeManager类继承自SchedulerDependentManager类,update_service_capabilities方法定义在SchedulerDependentManager类中,其定义如下
class SchedulerDependentManager(Manager):def update_service_capabilities(self, capabilities):if not isinstance(capabilities, list):capabilities = [capabilities]self.last_capabilities = capabilities这个方法比较简单,就是更新last_capabilities成员变量。
二、publish_service_capabilities定时任务
publish_service_capabilities定时任务的功能是定时将ComputeManager对象缓存的capabilities信息发送给Nova Scheduler服务,它是和上面的report_driver_status定时任务配合使用的。publish_service_capabilities定时任务对应于publish_service_capabilities周期方法,其定义如下
class SchedulerDependentManager(Manager):@periodic_taskdef publish_service_capabilities(self, context):if self.last_capabilities: self.scheduler_rpcapi.update_service_capabilities(context, self.service_name, self.host, self.last_capabilities)可以看到publish_service_capabilities方法调用了scheduler_rpcapi变量的update_service_capabilities方法。scheduler_rpcapi变量对应于SchedulerAPI类,SchedulerAPI类的update_service_capabilities方法定义如下
class SchedulerAPI(nova.openstack.common.rpc.proxy.RpcProxy):def update_service_capabilities(self, ctxt, service_name, host, capabilities): self.fanout_cast(ctxt, self.make_msg('update_service_capabilities', service_name=service_name, host=host, capabilities=capabilities), version='2.4')SchedulerAPI类的update_service_capabilities方法调用了fanout_cast方法向Nova Scheduler服务发送RPC请求。fanout_cast会以广播的方式向所有的Nova Scheduler服务发送请求,所有的Nova Scheduler服务都需要处理该请求。
从上面的代码可以看到,通过RPC请求的是SchedulerManager类的update_service_capabilities方法,其定义如下
class SchedulerManager(manager.Manager):def update_service_capabilities(self, context, service_name, host, capabilities): #将capabilities封装成列表 if not isinstance(capabilities, list): capabilities = [capabilities] for capability in capabilities: if capability is None: capability = {} #调用SchedulerDriver的update_service_capabilities方法self.driver.update_service_capabilities(service_name, host, capability)SchedulerDriver对象是在配置文件中进行配置的,默认为FilterScheduler类。FilterScheduler类继承自Scheduler类,,Scheduler类的update_service_capabilities方法定义如下
巨龟千岁,却也平淡无奇;昙花瞬间,却能绚丽无比。