def test_pre_populate_workers(self, thread): sched = mock.Mock() t = populate.pre_populate_workers(sched) thread.assert_called_once_with(target=populate._pre_populate_workers, args=(sched, ), name='PrePopulateWorkers') self.assertEqual(t.mock_calls, [mock.call.setDaemon(True), mock.call.start()])
def test_pre_populate_workers(self, thread): sched = mock.Mock() t = populate.pre_populate_workers(sched) thread.assert_called_once_with( target=populate._pre_populate_workers, args=(sched,), name='PrePopulateWorkers' ) self.assertEqual( [mock.call.setDaemon(True), mock.call.start()], t.mock_calls )
def main(argv=sys.argv[1:]): """Main Entry point into the astara-orchestrator This is the main entry point into the astara-orchestrator. On invocation of this method, logging, local network connectivity setup is performed. This information is obtained through the 'ak-config' file, passed as arguement to this method. Worker threads are spawned for handling various tasks that are associated with processing as well as responding to different Neutron events prior to starting a notification dispatch loop. :param argv: list of Command line arguments :returns: None :raises: None """ # TODO(rama) Error Handling to be added as part of the docstring # description # Change the process and thread name so the logs are cleaner. p = multiprocessing.current_process() p.name = 'pmain' t = threading.current_thread() t.name = 'tmain' ak_cfg.parse_config(argv) log.setup(cfg.CONF, 'astara-orchestrator') cfg.CONF.log_opt_values(LOG, logging.INFO) neutron = neutron_api.Neutron(cfg.CONF) # TODO(mark): develop better way restore after machine reboot # neutron.purge_management_interface() # bring the mgt tap interface up mgt_ip_address = neutron.ensure_local_service_port().split('/')[0] # Set up the queue to move messages between the eventlet-based # listening process and the scheduler. notification_queue = multiprocessing.Queue() # Ignore signals that might interrupt processing. daemon.ignore_signals() # If we see a SIGINT, stop processing. def _stop_processing(*args): notification_queue.put((None, None)) signal.signal(signal.SIGINT, _stop_processing) # Listen for notifications. notification_proc = multiprocessing.Process( target=notifications.listen, kwargs={'notification_queue': notification_queue}, name='notification-listener', ) notification_proc.start() if CONF.coordination.enabled: coordinator_proc = multiprocessing.Process( target=coordination.start, kwargs={'notification_queue': notification_queue}, name='coordinator', ) coordinator_proc.start() else: coordinator_proc = None metadata_proc = multiprocessing.Process(target=metadata.serve, args=(mgt_ip_address, ), name='metadata-proxy') metadata_proc.start() from astara.api import rug as rug_api rug_api_proc = multiprocessing.Process(target=rug_api.serve, name='rug-api') rug_api_proc.start() # Set up the notifications publisher Publisher = (notifications.Publisher if cfg.CONF.ceilometer.enabled else notifications.NoopPublisher) publisher = Publisher(topic=cfg.CONF.ceilometer.topic, ) # Set up a factory to make Workers that know how many threads to # run. worker_factory = functools.partial( worker.Worker, notifier=publisher, management_address=mgt_ip_address, ) # Set up the scheduler that knows how to manage the routers and # dispatch messages. sched = scheduler.Scheduler(worker_factory=worker_factory, ) # Prepopulate the workers with existing routers on startup populate.pre_populate_workers(sched) # Set up the periodic health check health.start_inspector(cfg.CONF.health_check_period, sched) # Block the main process, copying messages from the notification # listener to the scheduler try: shuffle_notifications(notification_queue, sched) finally: LOG.info(_LI('Stopping scheduler.')) sched.stop() LOG.info(_LI('Stopping notification publisher.')) publisher.stop() # Terminate the subprocesses for subproc in [ notification_proc, coordinator_proc, metadata_proc, rug_api_proc ]: if not subproc: continue LOG.info(_LI('Stopping %s.'), subproc.name) subproc.terminate()
def main(argv=sys.argv[1:]): """Main Entry point into the astara-orchestrator This is the main entry point into the astara-orchestrator. On invocation of this method, logging, local network connectivity setup is performed. This information is obtained through the 'ak-config' file, passed as arguement to this method. Worker threads are spawned for handling various tasks that are associated with processing as well as responding to different Neutron events prior to starting a notification dispatch loop. :param argv: list of Command line arguments :returns: None :raises: None """ # TODO(rama) Error Handling to be added as part of the docstring # description # Change the process and thread name so the logs are cleaner. p = multiprocessing.current_process() p.name = 'pmain' t = threading.current_thread() t.name = 'tmain' ak_cfg.parse_config(argv) log.setup(cfg.CONF, 'astara-orchestrator') cfg.CONF.log_opt_values(LOG, logging.INFO) neutron = neutron_api.Neutron(cfg.CONF) # TODO(mark): develop better way restore after machine reboot # neutron.purge_management_interface() # bring the mgt tap interface up mgt_ip_address = neutron.ensure_local_service_port().split('/')[0] # Set up the queue to move messages between the eventlet-based # listening process and the scheduler. notification_queue = multiprocessing.Queue() # Ignore signals that might interrupt processing. daemon.ignore_signals() # If we see a SIGINT, stop processing. def _stop_processing(*args): notification_queue.put((None, None)) signal.signal(signal.SIGINT, _stop_processing) # Listen for notifications. notification_proc = multiprocessing.Process( target=notifications.listen, kwargs={ 'notification_queue': notification_queue }, name='notification-listener', ) notification_proc.start() if CONF.coordination.enabled: coordinator_proc = multiprocessing.Process( target=coordination.start, kwargs={ 'notification_queue': notification_queue }, name='coordinator', ) coordinator_proc.start() else: coordinator_proc = None metadata_proc = multiprocessing.Process( target=metadata.serve, args=(mgt_ip_address,), name='metadata-proxy' ) metadata_proc.start() from astara.api import rug as rug_api rug_api_proc = multiprocessing.Process( target=rug_api.serve, name='rug-api' ) rug_api_proc.start() # Set up the notifications publisher Publisher = (notifications.Publisher if cfg.CONF.ceilometer.enabled else notifications.NoopPublisher) publisher = Publisher( topic=cfg.CONF.ceilometer.topic, ) # Set up a factory to make Workers that know how many threads to # run. worker_factory = functools.partial( worker.Worker, notifier=publisher, management_address=mgt_ip_address, ) # Set up the scheduler that knows how to manage the routers and # dispatch messages. sched = scheduler.Scheduler( worker_factory=worker_factory, ) # Prepopulate the workers with existing routers on startup populate.pre_populate_workers(sched) # Set up the periodic health check health.start_inspector(cfg.CONF.health_check_period, sched) # Block the main process, copying messages from the notification # listener to the scheduler try: shuffle_notifications(notification_queue, sched) finally: LOG.info(_LI('Stopping scheduler.')) sched.stop() LOG.info(_LI('Stopping notification publisher.')) publisher.stop() # Terminate the subprocesses for subproc in [notification_proc, coordinator_proc, metadata_proc, rug_api_proc]: if not subproc: continue LOG.info(_LI('Stopping %s.'), subproc.name) subproc.terminate()