def __init__(self, host, binary, topic, manager, report_interval=None, periodic_enable=None, periodic_fuzzy_delay=None, periodic_interval_max=None, db_allowed=True, *args, **kwargs): super(Service, self).__init__() self.host = host self.binary = binary self.topic = topic self.manager_class_name = manager manager_class = importutils.import_class(self.manager_class_name) self.manager = manager_class(host=self.host, *args, **kwargs) self.rpcserver = None self.report_interval = report_interval self.periodic_enable = periodic_enable self.periodic_fuzzy_delay = periodic_fuzzy_delay self.periodic_interval_max = periodic_interval_max self.saved_args, self.saved_kwargs = args, kwargs self.backdoor_port = None """ conductor.API需要进行进一步实现; """ self.conductor_api = conductor.API(use_local=db_allowed) self.conductor_api.wait_until_ready(context.get_admin_context()) """
def kill(self): """ Destroy the service object in the datastore. """ self.stop() try: self.conductor_api.service_destroy(context.get_admin_context(), self.service_id) except exception.NotFound: LOG.warn(_('Service killed that has no database entry'))
def periodic_tasks(self, raise_on_error=False): """Tasks to be run at a periodic interval.""" ctxt = context.get_admin_context() return self.manager.periodic_tasks(ctxt, raise_on_error=raise_on_error)
def start(self): verstr = version.version_string_with_package() LOG.audit(_('Starting %(topic)s node (version %(version)s)'), { 'topic': self.topic, 'version': verstr }) self.basic_config_check() """ 服务中的初始化操作; @@@@这里很重要; 需要实现hosts/vms/scheduler中的init_host方法; """ self.manager.init_host() """ ====================================================================================== self.manager = <nova.cert.manager.CertManager object at 0x3ed4550> self.manager.init_host = <bound method CertManager.init_host of <nova.cert.manager.CertManager object at 0x3ed4550>> ====================================================================================== ====================================================================================== self.manager = <nova.conductor.manager.ConductorManager object at 0x248f490> self.manager.init_host = <bound method ConductorManager.init_host of <nova.conductor.manager.ConductorManager object at 0x248f490>> ====================================================================================== ====================================================================================== self.manager = <nova.scheduler.manager.SchedulerManager object at 0x369d490> self.manager.init_host = <bound method SchedulerManager.init_host of <nova.scheduler.manager.SchedulerManager object at 0x369d490>> ====================================================================================== ====================================================================================== self.manager = <nova.compute.manager.ComputeManager object at 0x2beba90> self.manager.init_host = <bound method ComputeManager.init_host of <nova.compute.manager.ComputeManager object at 0x2beba90>> ====================================================================================== ====================================================================================== self.manager = <nova.console.manager.ConsoleProxyManager object at 0x2898490> self.manager.init_host = <bound method ConsoleProxyManager.init_host of <nova.console.manager.ConsoleProxyManager object at 0x2898490>> ====================================================================================== """ self.model_disconnected = False ctxt = context.get_admin_context() try: self.service_ref = self.conductor_api.service_get_by_args( ctxt, self.host, self.binary) self.service_id = self.service_ref['id'] """ ====================================================================================== ctxt = <nova.context.RequestContext object at 0x1f996d0> self.host = node01.shinian.com self.binary = nova-scheduler self.service_ref = {'binary': u'nova-scheduler', 'deleted': 0L, 'created_at': '2015-01-08T02:46:44.000000', 'updated_at': '2015-01-30T09:29:40.000000', 'report_count': 192315L, 'topic': u'scheduler', 'host': u'node01.shinian.com', 'disabled': False, 'deleted_at': None, 'disabled_reason': None, 'id': 2L} self.service_id = 2 ====================================================================================== """ except exception.NotFound: try: self.service_ref = self._create_service_ref(ctxt) except (exception.ServiceTopicExists, exception.ServiceBinaryExists): # NOTE(danms): If we race to create a record with a sibling # worker, don't fail here. self.service_ref = self.conductor_api.service_get_by_args( ctxt, self.host, self.binary) """ 在计算服务初始化之后,且在计算服务完全应用之前,务必要确认更新 可用的资源信息; @@@@这里很重要; 需要在hosts和vms中实现这个方法,同上面的init_host方法,还未解决; """ self.manager.pre_start_hook() """ RPC机制的应用; @@@@这里很重要; """ if self.backdoor_port is not None: self.manager.backdoor_port = self.backdoor_port LOG.debug(_("Creating RPC server for service %s") % self.topic) target = messaging.Target(topic=self.topic, server=self.host) """ self.topic = scheduler self.host = node01.shinian.com target = <Target topic=scheduler, server=node01.shinian.com> """ endpoints = [ self.manager, baserpc.BaseRPCAPI(self.manager.service_name, self.backdoor_port) ] """ ====================================================================================== self.manager = <nova.scheduler.manager.SchedulerManager object at 0x2b71210> self.manager.service_name = scheduler self.backdoor_port = None endpoints = [<nova.scheduler.manager.SchedulerManager object at 0x2b71210>, <nova.baserpc.BaseRPCAPI object at 0x4e3ee10>] ====================================================================================== """ endpoints.extend(self.manager.additional_endpoints) """ ====================================================================================== endpoints = [<nova.scheduler.manager.SchedulerManager object at 0x2e341d0>, <nova.baserpc.BaseRPCAPI object at 0x50aafd0>, <nova.scheduler.manager._SchedulerManagerV3Proxy object at 0x2e9df90>] ====================================================================================== """ """ objects_base.XdrsObjectSerializer需要进行进一步实现,还未完成; """ serializer = objects_base.XdrsObjectSerializer() self.rpcserver = rpc.get_server(target, endpoints, serializer) self.rpcserver.start() if self.periodic_enable: if self.periodic_fuzzy_delay: initial_delay = random.randint(0, self.periodic_fuzzy_delay) else: initial_delay = None """ 启动线程,周期性任务的实现; @@@@这里很重要; """ self.tg.add_dynamic_timer( self.periodic_tasks, initial_delay=initial_delay, periodic_interval_max=self.periodic_interval_max)
def start(self): verstr = version.version_string_with_package() LOG.audit(_('Starting %(topic)s node (version %(version)s)'), {'topic': self.topic, 'version': verstr}) self.basic_config_check() """ 服务中的初始化操作; @@@@这里很重要; 需要实现hosts/vms/scheduler中的init_host方法; """ self.manager.init_host() """ ====================================================================================== self.manager = <nova.cert.manager.CertManager object at 0x3ed4550> self.manager.init_host = <bound method CertManager.init_host of <nova.cert.manager.CertManager object at 0x3ed4550>> ====================================================================================== ====================================================================================== self.manager = <nova.conductor.manager.ConductorManager object at 0x248f490> self.manager.init_host = <bound method ConductorManager.init_host of <nova.conductor.manager.ConductorManager object at 0x248f490>> ====================================================================================== ====================================================================================== self.manager = <nova.scheduler.manager.SchedulerManager object at 0x369d490> self.manager.init_host = <bound method SchedulerManager.init_host of <nova.scheduler.manager.SchedulerManager object at 0x369d490>> ====================================================================================== ====================================================================================== self.manager = <nova.compute.manager.ComputeManager object at 0x2beba90> self.manager.init_host = <bound method ComputeManager.init_host of <nova.compute.manager.ComputeManager object at 0x2beba90>> ====================================================================================== ====================================================================================== self.manager = <nova.console.manager.ConsoleProxyManager object at 0x2898490> self.manager.init_host = <bound method ConsoleProxyManager.init_host of <nova.console.manager.ConsoleProxyManager object at 0x2898490>> ====================================================================================== """ self.model_disconnected = False ctxt = context.get_admin_context() try: self.service_ref = self.conductor_api.service_get_by_args(ctxt, self.host, self.binary) self.service_id = self.service_ref['id'] """ ====================================================================================== ctxt = <nova.context.RequestContext object at 0x1f996d0> self.host = node01.shinian.com self.binary = nova-scheduler self.service_ref = {'binary': u'nova-scheduler', 'deleted': 0L, 'created_at': '2015-01-08T02:46:44.000000', 'updated_at': '2015-01-30T09:29:40.000000', 'report_count': 192315L, 'topic': u'scheduler', 'host': u'node01.shinian.com', 'disabled': False, 'deleted_at': None, 'disabled_reason': None, 'id': 2L} self.service_id = 2 ====================================================================================== """ except exception.NotFound: try: self.service_ref = self._create_service_ref(ctxt) except (exception.ServiceTopicExists, exception.ServiceBinaryExists): # NOTE(danms): If we race to create a record with a sibling # worker, don't fail here. self.service_ref = self.conductor_api.service_get_by_args(ctxt, self.host, self.binary) """ 在计算服务初始化之后,且在计算服务完全应用之前,务必要确认更新 可用的资源信息; @@@@这里很重要; 需要在hosts和vms中实现这个方法,同上面的init_host方法,还未解决; """ self.manager.pre_start_hook() """ RPC机制的应用; @@@@这里很重要; """ if self.backdoor_port is not None: self.manager.backdoor_port = self.backdoor_port LOG.debug(_("Creating RPC server for service %s") % self.topic) target = messaging.Target(topic=self.topic, server=self.host) """ self.topic = scheduler self.host = node01.shinian.com target = <Target topic=scheduler, server=node01.shinian.com> """ endpoints = [ self.manager, baserpc.BaseRPCAPI(self.manager.service_name, self.backdoor_port) ] """ ====================================================================================== self.manager = <nova.scheduler.manager.SchedulerManager object at 0x2b71210> self.manager.service_name = scheduler self.backdoor_port = None endpoints = [<nova.scheduler.manager.SchedulerManager object at 0x2b71210>, <nova.baserpc.BaseRPCAPI object at 0x4e3ee10>] ====================================================================================== """ endpoints.extend(self.manager.additional_endpoints) """ ====================================================================================== endpoints = [<nova.scheduler.manager.SchedulerManager object at 0x2e341d0>, <nova.baserpc.BaseRPCAPI object at 0x50aafd0>, <nova.scheduler.manager._SchedulerManagerV3Proxy object at 0x2e9df90>] ====================================================================================== """ """ objects_base.XdrsObjectSerializer需要进行进一步实现,还未完成; """ serializer = objects_base.XdrsObjectSerializer() self.rpcserver = rpc.get_server(target, endpoints, serializer) self.rpcserver.start() if self.periodic_enable: if self.periodic_fuzzy_delay: initial_delay = random.randint(0, self.periodic_fuzzy_delay) else: initial_delay = None """ 启动线程,周期性任务的实现; @@@@这里很重要; """ self.tg.add_dynamic_timer(self.periodic_tasks, initial_delay=initial_delay, periodic_interval_max= self.periodic_interval_max)