Пример #1
0
    def test_rpc_consumer_isolation(self):
        class NeverCalled(object):
            def __getattribute__(*args):
                assert False, "I should never get called."

        server = rpc.get_server(messaging.Target(topic="compute", server=CONF.host), endpoints=[NeverCalled()])
        server.start()
Пример #2
0
    def start(self):
        verstr = version.version_string_with_package()
        LOG.info(_LI('Starting %(topic)s node (version %(version)s)'),
                  {'topic': self.topic, 'version': verstr})
        self.basic_config_check()
        self.manager.init_host()
        self.model_disconnected = False
        ctxt = context.get_admin_context()
        self.service_ref = objects.Service.get_by_host_and_binary(
            ctxt, self.host, self.binary)
        if self.service_ref:
            _update_service_ref(self.service_ref)

        else:
            try:
                self.service_ref = _create_service_ref(self, 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 = objects.Service.get_by_host_and_binary(
                    ctxt, self.host, self.binary)

        self.manager.pre_start_hook()

        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)

        endpoints = [
            self.manager,
            baserpc.BaseRPCAPI(self.manager.service_name, self.backdoor_port)
        ]
        endpoints.extend(self.manager.additional_endpoints)

        serializer = objects_base.NovaObjectSerializer()

        self.rpcserver = rpc.get_server(target, endpoints, serializer)
        self.rpcserver.start()

        self.manager.post_start_hook()

        LOG.debug("Join ServiceGroup membership for this service %s",
                  self.topic)
        # Add service to the ServiceGroup membership group.
        self.servicegroup_api.join(self.host, self.topic, self)

        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)
Пример #3
0
    def start(self):
        verstr = version.version_string_with_package()
        LOG.info(_LI('Starting %(topic)s node (version %(version)s)'),
                  {'topic': self.topic, 'version': verstr})
        self.basic_config_check()
        self.manager.init_host()
        self.model_disconnected = False
        ctxt = context.get_admin_context()
        self.service_ref = objects.Service.get_by_host_and_binary(
            ctxt, self.host, self.binary)
        if self.service_ref:
            _update_service_ref(self.service_ref)

        else:
            try:
                self.service_ref = _create_service_ref(self, 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 = objects.Service.get_by_host_and_binary(
                    ctxt, self.host, self.binary)

        self.manager.pre_start_hook()

        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)

        endpoints = [
            self.manager,
            baserpc.BaseRPCAPI(self.manager.service_name, self.backdoor_port)
        ]
        endpoints.extend(self.manager.additional_endpoints)

        serializer = objects_base.NovaObjectSerializer()

        self.rpcserver = rpc.get_server(target, endpoints, serializer)
        self.rpcserver.start()

        self.manager.post_start_hook()

        LOG.debug("Join ServiceGroup membership for this service %s",
                  self.topic)
        # Add service to the ServiceGroup membership group.
        self.servicegroup_api.join(self.host, self.topic, self)

        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)
Пример #4
0
    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()
        self.manager.init_host()
        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']
        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)

        self.manager.pre_start_hook()

        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用来指定该rpc server监听在哪些队列上
        target = messaging.Target(topic=self.topic, server=self.host)

        endpoints = [
            self.manager,
            baserpc.BaseRPCAPI(self.manager.service_name, self.backdoor_port)
        ]
        endpoints.extend(self.manager.additional_endpoints)

        serializer = objects_base.NovaObjectSerializer()
        #建立RPC调用服务
        self.rpcserver = rpc.get_server(target, endpoints, serializer)
        self.rpcserver.start()
        # Manager对象其实就是RPC API的入口。每个RPC API最终会转化为对Manger相应方法的调用,这个方法就是该RPC API的最终实现。
        self.manager.post_start_hook()

        LOG.debug("Join ServiceGroup membership for this service %s",
                  self.topic)
        # Add service to the ServiceGroup membership group.
        self.servicegroup_api.join(self.host, self.topic, self)

        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)
Пример #5
0
 def __init__(self):
     endpoints = [self]
     target = messaging.Target(topic='hyper-agent-callback',
                               version='1.0',
                               exchange='hyperagent',
                               server=cfg.CONF.host)
     self.server = rpc.get_server(target, endpoints)
     self.server.start()
     super(HyperAgentCallback, self).__init__()
Пример #6
0
 def __init__(self):
     endpoints = [self]
     target = messaging.Target(topic='hyper-agent-callback',
                               version='1.0',
                               exchange='hyperagent',
                               server=cfg.CONF.host)
     self.server = rpc.get_server(target, endpoints)
     self.server.start()
     super(HyperAgentCallback, self).__init__()
Пример #7
0
    def test_rpc_consumer_isolation(self):
        class NeverCalled(object):
            def __getattribute__(*args):
                assert False, "I should never get called."

        server = rpc.get_server(messaging.Target(topic='compute',
                                                 server=CONF.host),
                                endpoints=[NeverCalled()])
        server.start()
Пример #8
0
    def test_get_server(self, mock_get, mock_ser):
        rpc.TRANSPORT = mock.Mock()
        ser = mock.Mock()
        tgt = mock.Mock()
        ends = mock.Mock()
        mock_ser.return_value = ser
        mock_get.return_value = "server"

        server = rpc.get_server(tgt, ends, serializer="foo")

        mock_ser.assert_called_once_with("foo")
        mock_get.assert_called_once_with(rpc.TRANSPORT, tgt, ends, executor="eventlet", serializer=ser)
        self.assertEqual("server", server)
Пример #9
0
    def test_start_servers(self):
        self.flags(rpc_driver_queue_base="cells.intercell42", group="cells")
        fake_msg_runner = fakes.get_message_runner("api-cell")

        class FakeInterCellRPCDispatcher(object):
            def __init__(_self, msg_runner):
                self.assertEqual(fake_msg_runner, msg_runner)

        self.stubs.Set(rpc_driver, "InterCellRPCDispatcher", FakeInterCellRPCDispatcher)
        self.mox.StubOutWithMock(rpc, "get_server")

        for message_type in messaging.MessageRunner.get_message_types():
            topic = "cells.intercell42." + message_type
            target = oslo_messaging.Target(topic=topic, server=CONF.host)
            endpoints = [mox.IsA(FakeInterCellRPCDispatcher)]

            rpcserver = self.mox.CreateMockAnything()
            rpc.get_server(target, endpoints=endpoints).AndReturn(rpcserver)
            rpcserver.start()

        self.mox.ReplayAll()

        self.driver.start_servers(fake_msg_runner)
Пример #10
0
    def test_rpc_consumer_isolation(self):
        class NeverCalled(object):
            def __getattribute__(self, name):
                if name == 'target':
                    # oslo.messaging 5.31.0 explicitly looks for 'target'
                    # on the endpoint and checks it's type, so we can't avoid
                    # it here, just ignore it if that's the case.
                    return
                assert False, "I should never get called. name: %s" % name

        server = rpc.get_server(messaging.Target(topic='compute',
                                                 server=CONF.host),
                                endpoints=[NeverCalled()])
        server.start()
Пример #11
0
    def test_get_server(self, mock_get, mock_ser):
        rpc.TRANSPORT = mock.Mock()
        ser = mock.Mock()
        tgt = mock.Mock()
        ends = mock.Mock()
        mock_ser.return_value = ser
        mock_get.return_value = 'server'

        server = rpc.get_server(tgt, ends, serializer='foo')

        mock_ser.assert_called_once_with('foo')
        mock_get.assert_called_once_with(rpc.TRANSPORT, tgt, ends,
                                         executor='eventlet', serializer=ser)
        self.assertEqual('server', server)
Пример #12
0
    def test_rpc_consumer_isolation(self):
        class NeverCalled(object):

            def __getattribute__(self, name):
                if name == 'target':
                    # oslo.messaging 5.31.0 explicitly looks for 'target'
                    # on the endpoint and checks it's type, so we can't avoid
                    # it here, just ignore it if that's the case.
                    return
                assert False, "I should never get called. name: %s" % name

        server = rpc.get_server(messaging.Target(topic='compute',
                                                 server=CONF.host),
                                endpoints=[NeverCalled()])
        server.start()
Пример #13
0
    def test_get_server(self, mock_get, mock_ser, mock_TRANSPORT):
        ser = mock.Mock()
        tgt = mock.Mock()
        ends = mock.Mock()
        mock_ser.return_value = ser
        mock_get.return_value = 'server'

        server = rpc.get_server(tgt, ends, serializer='foo')

        mock_ser.assert_called_once_with('foo')
        access_policy = dispatcher.DefaultRPCAccessPolicy
        mock_get.assert_called_once_with(mock_TRANSPORT, tgt, ends,
                                         executor='eventlet', serializer=ser,
                                         access_policy=access_policy)
        self.assertEqual('server', server)
Пример #14
0
    def test_start_servers(self):
        self.flags(rpc_driver_queue_base='cells.intercell42', group='cells')
        fake_msg_runner = fakes.get_message_runner('api-cell')

        class FakeInterCellRPCDispatcher(object):
            def __init__(_self, msg_runner):
                self.assertEqual(fake_msg_runner, msg_runner)

        self.stubs.Set(rpc_driver, 'InterCellRPCDispatcher',
                       FakeInterCellRPCDispatcher)
        self.mox.StubOutWithMock(rpc, 'get_server')

        for message_type in messaging.MessageRunner.get_message_types():
            topic = 'cells.intercell42.' + message_type
            target = oslo_messaging.Target(topic=topic, server=CONF.host)
            endpoints = [mox.IsA(FakeInterCellRPCDispatcher)]

            rpcserver = self.mox.CreateMockAnything()
            rpc.get_server(target, endpoints=endpoints).AndReturn(rpcserver)
            rpcserver.start()

        self.mox.ReplayAll()

        self.driver.start_servers(fake_msg_runner)
Пример #15
0
    def add_host_rpc(self, host):
        """Add host rpc server for spec host."""
        LOG.info("Creating RPC server for host '%s'", host)
        if self.rpcservers.has_key(host):
            LOG.warn("RPC server '%s' already exits." % host)
            return
        
        target = messaging.Target(topic=self.topic, server=host)

        endpoints = [
                self.manager,
                baserpc.BaseRPCAPI(self.manager.service_name, self.backdoor_port)
        ]
        endpoints.extend(self.manager.additional_endpoints)
        serializer = objects_base.NovaObjectSerializer()

        rpcserver = rpc.get_server(target, endpoints, serializer)
        rpcserver.start()
        self.rpcservers[host] = rpcserver
        LOG.info("Creating RPC server for host '%s' end.", host)
Пример #16
0
    def start_servers(self, msg_runner):
        """Start RPC servers.

        Start up 2 separate servers for handling inter-cell
        communication via RPC.  Both handle the same types of
        messages, but requests/replies are separated to solve
        potential deadlocks. (If we used the same queue for both,
        it's possible to exhaust the RPC thread pool while we wait
        for replies.. such that we'd never consume a reply.)
        """
        topic_base = CONF.cells.rpc_driver_queue_base
        proxy_manager = InterCellRPCDispatcher(msg_runner)
        for msg_type in msg_runner.get_message_types():
            target = messaging.Target(topic='%s.%s' % (topic_base, msg_type),
                                      server=CONF.host)
            # NOTE(comstud): We do not need to use the object serializer
            # on this because object serialization is taken care for us in
            # the nova.cells.messaging module.
            server = rpc.get_server(target, endpoints=[proxy_manager])
            server.start()
            self.rpc_servers.append(server)
Пример #17
0
    def start_servers(self, msg_runner):
        """Start RPC servers.

        Start up 2 separate servers for handling inter-cell
        communication via RPC.  Both handle the same types of
        messages, but requests/replies are separated to solve
        potential deadlocks. (If we used the same queue for both,
        it's possible to exhaust the RPC thread pool while we wait
        for replies.. such that we'd never consume a reply.)
        """
        topic_base = CONF.cells.rpc_driver_queue_base
        proxy_manager = InterCellRPCDispatcher(msg_runner)
        for msg_type in msg_runner.get_message_types():
            target = messaging.Target(topic='%s.%s' % (topic_base, msg_type),
                                      server=CONF.host)
            # NOTE(comstud): We do not need to use the object serializer
            # on this because object serialization is taken care for us in
            # the nova.cells.messaging module.
            server = rpc.get_server(target, endpoints=[proxy_manager])
            server.start()
            self.rpc_servers.append(server)
Пример #18
0
    def __init__(self):
        super(HyperAgent, self).__init__()
        self.instance_id = cfg.CONF.host

        # the queue client for plug/unplug calls from nova driver
        endpoints = [self]
        target = messaging.Target(topic='hyper-agent-update',
                                  version='1.0',
                                  exchange='hyperagent',
                                  server=cfg.CONF.host)
        self.server = rpc.get_server(target, endpoints)

        # the call back to nova driver init
        self.call_back = HyperAgentCallback()

        # instance according to configuration
        self.vif_driver = importutils.import_object(
            cfg.CONF.hyper_agent_vif_driver,
            instance_id=self.instance_id,
            call_back=self.call_back)

        self.vif_driver.startup_init()

        self.server.start()
Пример #19
0
    def start(self):
        """Start the service.

        This includes starting an RPC service, initializing
        periodic tasks, etc.
        """
        # NOTE(melwitt): Clear the cell cache holding database transaction
        # context manager objects. We do this to ensure we create new internal
        # oslo.db locks to avoid a situation where a child process receives an
        # already locked oslo.db lock when it is forked. When a child process
        # inherits a locked oslo.db lock, database accesses through that
        # transaction context manager will never be able to acquire the lock
        # and requests will fail with CellTimeout errors.
        # See https://bugs.python.org/issue6721 for more information.
        # With python 3.7, it would be possible for oslo.db to make use of the
        # os.register_at_fork() method to reinitialize its lock. Until we
        # require python 3.7 as a mininum version, we must handle the situation
        # outside of oslo.db.
        context.CELL_CACHE = {}

        verstr = version.version_string_with_package()
        LOG.info('Starting %(topic)s node (version %(version)s)',
                  {'topic': self.topic, 'version': verstr})
        self.basic_config_check()
        self.manager.init_host()
        self.model_disconnected = False
        ctxt = context.get_admin_context()
        self.service_ref = objects.Service.get_by_host_and_binary(
            ctxt, self.host, self.binary)
        if self.service_ref:
            _update_service_ref(self.service_ref)

        else:
            try:
                self.service_ref = _create_service_ref(self, 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 = objects.Service.get_by_host_and_binary(
                    ctxt, self.host, self.binary)

        self.manager.pre_start_hook()

        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)

        endpoints = [
            self.manager,
            baserpc.BaseRPCAPI(self.manager.service_name, self.backdoor_port)
        ]
        endpoints.extend(self.manager.additional_endpoints)

        serializer = objects_base.NovaObjectSerializer()

        self.rpcserver = rpc.get_server(target, endpoints, serializer)
        self.rpcserver.start()

        self.manager.post_start_hook()

        LOG.debug("Join ServiceGroup membership for this service %s",
                  self.topic)
        # Add service to the ServiceGroup membership group.
        self.servicegroup_api.join(self.host, self.topic, self)

        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)
Пример #20
0
    def _start_compute_worker(self):
        # All the subprocess should do this re-init job to enable rpc clients
        rpc.init(CONF)

        objects_base.NovaObject.indirection_api =\
        conductor_rpcapi.ConductorAPI()

        self.__init__(self.host, self.binary, self.topic,
            self.manager_class_name, self.report_interval,
            self.periodic_enable, self.periodic_fuzzy_delay,
            self.periodic_interval_max, db_allowed=False)

        driver_class = self.servicegroup_api._driver_name_class_mapping['db']
        self.servicegroup_api._driver = importutils.import_object(driver_class,
            db_allowed=False)

        # Some subprocess only start RPC servers to answer the requests
        if self._is_main_worker() is False:
            LOG.debug("Creating RPC server for service %s", self.topic)

            if self.backdoor_port is not None:
                self.manager.backdoor_port = self.backdoor_port

            target = messaging.Target(topic=self.topic, server=self.host)
            endpoints = [
                self.manager,
                baserpc.BaseRPCAPI(self.manager.service_name, self.backdoor_port)
            ]
            endpoints.extend(self.manager.additional_endpoints)
            serializer = objects_base.NovaObjectSerializer()
            self.rpcserver = rpc.get_server(target, endpoints, serializer)
            self.rpcserver.start()
            return

        # Main subprocess do the initial and period jobs
        verstr = version.version_string_with_package()
        LOG.audit(_('Starting %(topic)s node (version %(version)s)'),
            {'topic': self.topic, 'version': verstr})
        self.basic_config_check()
        self.manager.init_host()
        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']
        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)

        self.manager.pre_start_hook()
        self.manager.post_start_hook()

        # Add service to the ServiceGroup membership group.
        LOG.debug("Join ServiceGroup membership for this service %s",
            self.topic)
        self.servicegroup_api.join(self.host, self.topic, self)

        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)
Пример #21
0
    def _start_compute_worker(self):
        # All the subprocess should do this re-init job to enable rpc clients
        rpc.init(CONF)

        objects_base.NovaObject.indirection_api =\
        conductor_rpcapi.ConductorAPI()

        self.__init__(self.host,
                      self.binary,
                      self.topic,
                      self.manager_class_name,
                      self.report_interval,
                      self.periodic_enable,
                      self.periodic_fuzzy_delay,
                      self.periodic_interval_max,
                      db_allowed=False)

        driver_class = self.servicegroup_api._driver_name_class_mapping['db']
        self.servicegroup_api._driver = importutils.import_object(
            driver_class, db_allowed=False)

        # Some subprocess only start RPC servers to answer the requests
        if self._is_main_worker() is False:
            LOG.debug("Creating RPC server for service %s", self.topic)

            if self.backdoor_port is not None:
                self.manager.backdoor_port = self.backdoor_port

            target = messaging.Target(topic=self.topic, server=self.host)
            endpoints = [
                self.manager,
                baserpc.BaseRPCAPI(self.manager.service_name,
                                   self.backdoor_port)
            ]
            endpoints.extend(self.manager.additional_endpoints)
            serializer = objects_base.NovaObjectSerializer()
            self.rpcserver = rpc.get_server(target, endpoints, serializer)
            self.rpcserver.start()
            return

        # Main subprocess do the initial and period jobs
        verstr = version.version_string_with_package()
        LOG.audit(_('Starting %(topic)s node (version %(version)s)'), {
            'topic': self.topic,
            'version': verstr
        })
        self.basic_config_check()
        self.manager.init_host()
        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']
        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)

        self.manager.pre_start_hook()
        self.manager.post_start_hook()

        # Add service to the ServiceGroup membership group.
        LOG.debug("Join ServiceGroup membership for this service %s",
                  self.topic)
        self.servicegroup_api.join(self.host, self.topic, self)

        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)
Пример #22
0
    def start(self):
        verstr = version.version_string_with_package()
        LOG.info(_LI('Starting %(topic)s node (version %(version)s)'),
                  {'topic': self.topic, 'version': verstr})
        self.basic_config_check()
        self.manager.init_host()
        self.model_disconnected = False
        ctxt = context.get_admin_context()
        self.service_ref = objects.Service.get_by_host_and_binary(
            ctxt, self.host, self.binary)
        if self.service_ref:
            _update_service_ref(self.service_ref)

        else:
            try:
                self.service_ref = _create_service_ref(self, 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 = objects.Service.get_by_host_and_binary(
                    ctxt, self.host, self.binary)

        self.manager.pre_start_hook()

        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)

        endpoints = [
            self.manager,
            baserpc.BaseRPCAPI(self.manager.service_name, self.backdoor_port)
        ]
        endpoints.extend(self.manager.additional_endpoints)

        serializer = objects_base.NovaObjectSerializer()

        self.rpcserver = rpc.get_server(target, endpoints, serializer)
        self.rpcserver.start()

        self.manager.post_start_hook()

        LOG.debug("Join ServiceGroup membership for this service %s",
                  self.topic)
        # Add service to the ServiceGroup membership group.
        self.servicegroup_api.join(self.host, self.topic, self)

        # WRS: Write volatile flag file indicating service has started.
        if CONF.service_enabled_flag:
            volatile_dir = '/var/run/nova'
            if os.path.isdir(volatile_dir):
                flag = "{}/.nova_{}_enabled".format(volatile_dir, self.topic)
                try:
                    open(flag, 'w').close()
                    LOG.info('service %(topic)s ready',
                             {'topic': self.topic})
                except Exception as e:
                    LOG.error(
                        'Cannot create file: %(file)s, error=%(error)s',
                        {'file': flag, 'error': e})

        if self.periodic_enable:
            if self.periodic_fuzzy_delay:
                initial_delay = random.randint(0, self.periodic_fuzzy_delay)
            else:
                initial_delay = None

            # WRS - Do not delay start of non-compute services. This improves
            # responsiveness of no-reboot-patching of controllers by making
            # the nova-scheduler weigher patch audit run immediately.
            if 'compute' not in self.binary:
                initial_delay = None
            self.tg.add_dynamic_timer(self.periodic_tasks,
                                     initial_delay=initial_delay,
                                     periodic_interval_max=
                                        self.periodic_interval_max)
Пример #23
0
    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()
        self.manager.init_host()
        self.model_disconnected = False
        ctxt = context.get_admin_context() # 将以Admin用户执行

        # 从nova-conductor获取服务的注册信息,不存在则重新注册
        try:
            # 获取本服务的ID
            self.service_ref = self.conductor_api.service_get_by_args(ctxt,
                    self.host, self.binary)
            self.service_id = self.service_ref['id']
        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)

        # 执行运行前的操作,在ComputeManager中
        # 是更新本节点可用资源信息
        self.manager.pre_start_hook()

        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)

        endpoints = [
            self.manager,
            baserpc.BaseRPCAPI(self.manager.service_name, self.backdoor_port)
        ]
        endpoints.extend(self.manager.additional_endpoints)

        serializer = objects_base.NovaObjectSerializer()

        self.rpcserver = rpc.get_server(target, endpoints, serializer)
        self.rpcserver.start()

        self.manager.post_start_hook()

        LOG.debug("Join ServiceGroup membership for this service %s",
                  self.topic)
        # Add service to the ServiceGroup membership group.
        self.servicegroup_api.join(self.host, self.topic, self)

        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)