def test_events_sequencing_with_diff_binding_key(self, mock_pipe_send): mock_pipe_send.side_effect = self.mocked_pipe_send conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() self.controller = controller wait_obj = multiprocessing.Event() setattr(controller, 'sequence_event_1_wait_obj', wait_obj) wait_obj = multiprocessing.Event() setattr(controller, 'sequence_event_2_wait_obj', wait_obj) event_1 = controller.create_event( id='SEQUENCE_EVENT_1', data='NO_DATA', serialize=True, binding_key='SEQUENCE_1') event_2 = controller.create_event( id='SEQUENCE_EVENT_2', data='NO_DATA', serialize=True, binding_key='SEQUENCE_2') controller.post_event(event_1) controller.post_event(event_2) controller._manager.manager_run() controller.sequence_event_1_wait_obj.wait(1) called = controller.sequence_event_1_wait_obj.is_set() self.assertTrue(called) controller.sequence_event_2_wait_obj.wait(1) called = controller.sequence_event_2_wait_obj.is_set() self.assertTrue(called)
def test_post_event_from_worker(self): conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() self.controller = controller # Check if 1 worker is added to manager pids = controller._manager._resource_map.keys() self.assertTrue(len(pids) == 1) self.assertTrue(pid in range(8888, 9999) for pid in pids) wait_obj = multiprocessing.Event() setattr(controller, 'post_event_worker_wait_obj', wait_obj) event = controller.create_event(id='TEST_POST_EVENT_FROM_WORKER', data='NO_DATA') worker_process = controller._worker_process.values()[0] worker_process.worker.controller.post_event(event) controller._manager.manager_run() # Check if event handler callback is invoked controller.post_event_worker_wait_obj.wait(1) called = controller.post_event_worker_wait_obj.is_set() self.assertTrue(called)
def test_events_sequencing_with_diff_binding_key(self, mock_pipe_send): mock_pipe_send.side_effect = self.mocked_pipe_send conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() self.controller = controller wait_obj = multiprocessing.Event() setattr(controller, 'sequence_event_1_wait_obj', wait_obj) wait_obj = multiprocessing.Event() setattr(controller, 'sequence_event_2_wait_obj', wait_obj) event_1 = controller.create_event(id='SEQUENCE_EVENT_1', data='NO_DATA', serialize=True, binding_key='SEQUENCE_1') event_2 = controller.create_event(id='SEQUENCE_EVENT_2', data='NO_DATA', serialize=True, binding_key='SEQUENCE_2') controller.post_event(event_1) controller.post_event(event_2) controller._manager.manager_run() controller.sequence_event_1_wait_obj.wait(1) called = controller.sequence_event_1_wait_obj.is_set() self.assertTrue(called) controller.sequence_event_2_wait_obj.wait(1) called = controller.sequence_event_2_wait_obj.is_set() self.assertTrue(called)
def test_post_event_from_worker(self): conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() self.controller = controller # Check if 1 worker is added to manager pids = controller._manager._resource_map.keys() self.assertTrue(len(pids) == 1) self.assertTrue(pid in range(8888, 9999) for pid in pids) wait_obj = multiprocessing.Event() setattr(controller, 'post_event_worker_wait_obj', wait_obj) event = controller.create_event( id='TEST_POST_EVENT_FROM_WORKER', data='NO_DATA') worker_process = controller._worker_process.values()[0] worker_process.worker.controller.post_event(event) controller._manager.manager_run() # Check if event handler callback is invoked controller.post_event_worker_wait_obj.wait(1) called = controller.post_event_worker_wait_obj.is_set() self.assertTrue(called)
def test_poll_event_with_no_worker(self, mock_pipe_send): mock_pipe_send.side_effect = self.mocked_pipe_send conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() self.controller = controller wait_obj = multiprocessing.Event() setattr(controller, 'poll_event_wait_obj', wait_obj) event = controller.create_event(id='POLL_EVENT', data='NO_DATA') # Update descriptor desc = nfp_event.EventDesc(**{}) setattr(event, 'desc', desc) # Explicitly make it none event.desc.worker = None controller.poll_event(event, spacing=1) # controller._manager.manager_run() start_time = time.time() # relinquish for 1sec time.sleep(1) controller.poll() controller.poll_event_wait_obj.wait(0.1) called = controller.poll_event_wait_obj.is_set() end_time = time.time() self.assertTrue(called) self.assertTrue(round(end_time - start_time) == 1.0)
def test_poll_event(self, mock_pipe_send): mock_pipe_send.side_effect = self.mocked_pipe_send conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() self.controller = controller wait_obj = multiprocessing.Event() setattr(controller, 'poll_event_wait_obj', wait_obj) event = controller.create_event( id='POLL_EVENT', data='NO_DATA') # Update descriptor desc = nfp_event.EventDesc(**{}) setattr(event, 'desc', desc) event.desc.worker = controller.get_childrens().keys()[0] controller.poll_event(event, spacing=1) # controller._manager.manager_run() start_time = time.time() # relinquish for 1sec time.sleep(1) controller.poll() controller.poll_event_wait_obj.wait(0.1) called = controller.poll_event_wait_obj.is_set() end_time = time.time() self.assertTrue(called) self.assertTrue(round(end_time - start_time) == 1.0)
def test_nfp_module_init(self): conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) wait_obj = multiprocessing.Event() setattr(controller, 'nfp_module_init_wait_obj', wait_obj) nfp_controller.load_nfp_modules(conf, controller) controller.nfp_module_init_wait_obj.wait(1) called = controller.nfp_module_init_wait_obj.is_set() self.assertTrue(called)
def test_nfp_module_init_wrong_path(self): conf = oslo_config.CONF conf.nfp_modules_path = ['tmp.nfp'] controller = nfp_controller.NfpController(oslo_config.CONF) wait_obj = multiprocessing.Event() setattr(controller, 'nfp_module_init_wait_obj', wait_obj) nfp_controller.load_nfp_modules(conf, controller) controller.nfp_module_init_wait_obj.wait(1) called = controller.nfp_module_init_wait_obj.is_set() self.assertFalse(called)
def test_nfp_module_init_wrong_path(self): conf = oslo_config.CONF conf.nfp_modules_path = 'tmp.nfp' controller = nfp_controller.NfpController(oslo_config.CONF) wait_obj = multiprocessing.Event() setattr(controller, 'nfp_module_init_wait_obj', wait_obj) nfp_controller.load_nfp_modules(conf, controller) controller.nfp_module_init_wait_obj.wait(1) called = controller.nfp_module_init_wait_obj.is_set() self.assertFalse(called)
def test_nfp_module_init(self): conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) wait_obj = multiprocessing.Event() setattr(controller, 'nfp_module_init_wait_obj', wait_obj) nfp_controller.load_nfp_modules(conf, controller) controller.nfp_module_init_wait_obj.wait(1) called = controller.nfp_module_init_wait_obj.is_set() self.assertTrue(called)
def test_poll_event_cancelled_from_worker(self, mock_compress): mock_compress.side_effect = self.mocked_compress conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf, singleton=False) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() self.controller = controller # Check if 1 worker is added to manager pids = controller._manager._resource_map.keys() self.assertEqual(len(pids), 1) self.assertTrue(pid in range(8888, 9999) for pid in pids) wait_obj = multiprocessing.Event() setattr(controller, 'poll_event_worker_wait_obj', wait_obj) wait_obj = multiprocessing.Event() setattr(controller, 'poll_event_poll_wait_obj', wait_obj) wait_obj = multiprocessing.Event() setattr(controller, 'poll_event_poll_cancel_wait_obj', wait_obj) event = controller.create_event( id='TEST_POLL_EVENT_CANCEL_FROM_WORKER', data='NO_DATA') worker_process = list(controller._worker_process.values())[0] worker_process.worker.controller.post_event(event) controller._manager.manager_run() # Check if event handler callback is invoked controller.poll_event_worker_wait_obj.wait(1) called = controller.poll_event_worker_wait_obj.is_set() self.assertTrue(called) time.sleep(1) # controller.poll() controller.poll_event_poll_wait_obj.wait(1) called = controller.poll_event_poll_wait_obj.is_set() self.assertTrue(called) time.sleep(1) # controller.poll() controller.poll_event_poll_wait_obj.wait(1) called = controller.poll_event_poll_wait_obj.is_set() self.assertTrue(called) controller.poll_event_poll_cancel_wait_obj.wait(1) called = controller.poll_event_poll_cancel_wait_obj.is_set() self.assertTrue(called)
def test_poll_event(self, mock_compress, mock_pipe_send): mock_pipe_send.side_effect = self.mocked_pipe_send mock_compress.side_effect = self.mocked_compress conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf, singleton=False) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() self.controller = controller
def test_load_distribution_to_workers(self, mock_compress, mock_pipe_send): mock_pipe_send.side_effect = self.mocked_pipe_send mock_compress.side_effect = self.mocked_compress conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf, singleton=False) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(3) controller._update_manager() # Load distribution as -> worker1 - 2, worker2 - 4, worker3 - 6 # 10 events to be distributed. # worker1 will get 5 # worker2 will get 4 # worker3 will get 1 # At the end all workers should be @load 7 # Initialize with above load init_load = [6, 4, 2] worker_pids = [] resource_map = controller._manager._resource_map for pid, em in six.iteritems(resource_map): load = init_load.pop() em._load = load worker_pids.append(pid) events = [ controller.create_event(id='EVENT_LOAD_1', data=worker_pids[0]), controller.create_event(id='EVENT_LOAD_2', data=worker_pids[0]), controller.create_event(id='EVENT_LOAD_3', data=worker_pids[0]), controller.create_event(id='EVENT_LOAD_4', data=worker_pids[1]), controller.create_event(id='EVENT_LOAD_5', data=worker_pids[0]), controller.create_event(id='EVENT_LOAD_6', data=worker_pids[1]), controller.create_event(id='EVENT_LOAD_7', data=worker_pids[0]), controller.create_event(id='EVENT_LOAD_8', data=worker_pids[1]), controller.create_event(id='EVENT_LOAD_9', data=worker_pids[2]) ] for i in range(0, 9): wait_obj = multiprocessing.Event() setattr(controller, 'nfp_event_load_wait_obj', wait_obj) event = events[i] controller.post_event(event) controller.nfp_event_load_wait_obj.wait(1) called = controller.nfp_event_load_wait_obj.is_set() self.assertTrue(called)
def test_load_distribution_to_workers(self, mock_pipe_send): mock_pipe_send.side_effect = self.mocked_pipe_send conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(3) controller._update_manager() # Load distribution as -> worker1 - 2, worker2 - 4, worker3 - 6 # 10 events to be distributed. # worker1 will get 5 # worker2 will get 4 # worker3 will get 1 # At the end all workers should be @load 7 # Initialize with above load init_load = [6, 4, 2] worker_pids = [] resource_map = controller._manager._resource_map for pid, em in resource_map.iteritems(): load = init_load.pop() em._load = load worker_pids.append(pid) events = [ controller.create_event(id='EVENT_LOAD_1', data=worker_pids[0]), controller.create_event(id='EVENT_LOAD_2', data=worker_pids[0]), controller.create_event(id='EVENT_LOAD_3', data=worker_pids[0]), controller.create_event(id='EVENT_LOAD_4', data=worker_pids[1]), controller.create_event(id='EVENT_LOAD_5', data=worker_pids[0]), controller.create_event(id='EVENT_LOAD_6', data=worker_pids[1]), controller.create_event(id='EVENT_LOAD_7', data=worker_pids[0]), controller.create_event(id='EVENT_LOAD_8', data=worker_pids[1]), controller.create_event(id='EVENT_LOAD_9', data=worker_pids[2])] for i in range(0, 9): wait_obj = multiprocessing.Event() setattr(controller, 'nfp_event_load_wait_obj', wait_obj) event = events[i] controller.post_event(event) controller.nfp_event_load_wait_obj.wait(1) called = controller.nfp_event_load_wait_obj.is_set() self.assertTrue(called)
def test_post_event_in_distributor(self, mock_pipe_send): mock_pipe_send.side_effect = self.mocked_pipe_send conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() wait_obj = multiprocessing.Event() setattr(controller, 'nfp_event_1_wait_obj', wait_obj) event = controller.create_event(id='EVENT_1', data='post_event_in_distributor') # Store in class object self.controller = controller controller.post_event(event) controller.nfp_event_1_wait_obj.wait(1) called = controller.nfp_event_1_wait_obj.is_set() self.assertTrue(called)
def test_poll_event_with_decorator_spacing(self, mock_compress, mock_pipe_send): mock_pipe_send.side_effect = self.mocked_pipe_send mock_compress.side_effect = self.mocked_compress conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf, singleton=False) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() self.controller = controller wait_obj = multiprocessing.Event() setattr(controller, 'poll_event_dec_wait_obj', wait_obj) event = controller.create_event( id='POLL_EVENT_DECORATOR', data='NO_DATA') # Update descriptor desc = nfp_event.EventDesc(**{}) setattr(event, 'desc', desc) # Explicitly make it none event.desc.worker = None ctx = nfp_context.get() ctx['log_context']['namespace'] = 'nfp_module' controller.poll_event(event) # controller._manager.manager_run() start_time = time.time() # relinquish for 2secs time.sleep(2) # controller.poll() controller.poll_event_dec_wait_obj.wait(0.1) called = controller.poll_event_dec_wait_obj.is_set() end_time = time.time() self.assertTrue(called) self.assertTrue(round(end_time - start_time) == 2.0)
def test_post_event_in_distributor(self, mock_pipe_send): mock_pipe_send.side_effect = self.mocked_pipe_send conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() wait_obj = multiprocessing.Event() setattr(controller, 'nfp_event_1_wait_obj', wait_obj) event = controller.create_event( id='EVENT_1', data='post_event_in_distributor') # Store in class object self.controller = controller controller.post_event(event) controller.nfp_event_1_wait_obj.wait(1) called = controller.nfp_event_1_wait_obj.is_set() self.assertTrue(called)
def test_event_ack_from_worker(self, mock_event_acked, mock_compress): mock_event_acked.side_effect = self._mocked_event_ack mock_compress.side_effect = self.mocked_compress conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf, singleton=False) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() self.controller = controller # Check if 1 worker is added to manager pids = controller._manager._resource_map.keys() self.assertTrue(len(pids) == 1) self.assertTrue(pid in range(8888, 9999) for pid in pids) wait_obj = multiprocessing.Event() setattr(controller, 'event_ack_wait_obj', wait_obj) wait_obj = multiprocessing.Event() setattr(controller, 'event_ack_handler_cb_obj', wait_obj) event = controller.create_event( id='TEST_EVENT_ACK_FROM_WORKER', data='NO_DATA') controller.post_event(event) controller._manager.manager_run() # wait for event to be acked controller.event_ack_wait_obj.wait(1) called = controller.event_ack_wait_obj.is_set() self.assertTrue(called) # Check if event handler callback is invoked controller.event_ack_handler_cb_obj.wait(1) called = controller.event_ack_handler_cb_obj.is_set() self.assertTrue(called)
def test_nfp_module_post_init_ignored(self): # None the post_init method in test handler from gbpservice.neutron.tests.unit.nfp.core import (nfp_module) del nfp_module.nfp_module_post_init conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) wait_obj = multiprocessing.Event() setattr(controller, 'nfp_module_post_init_wait_obj', wait_obj) nfp_modules = nfp_controller.load_nfp_modules(conf, controller) nfp_controller.nfp_modules_post_init(conf, nfp_modules, controller) controller.nfp_module_post_init_wait_obj.wait(1) called = controller.nfp_module_post_init_wait_obj.is_set() self.assertFalse(called)
def test_poll_event_with_decorator_spacing(self, mock_pipe_send): mock_pipe_send.side_effect = self.mocked_pipe_send conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() self.controller = controller wait_obj = multiprocessing.Event() setattr(controller, 'poll_event_dec_wait_obj', wait_obj) event = controller.create_event( id='POLL_EVENT_DECORATOR', data='NO_DATA') # Update descriptor desc = nfp_event.EventDesc(**{}) setattr(event, 'desc', desc) # Explicitly make it none event.desc.worker = None controller.poll_event(event) # controller._manager.manager_run() start_time = time.time() # relinquish for 2secs time.sleep(2) controller.poll() controller.poll_event_dec_wait_obj.wait(0.1) called = controller.poll_event_dec_wait_obj.is_set() end_time = time.time() self.assertTrue(called) self.assertTrue(round(end_time - start_time) == 2.0)
def test_nfp_module_post_init_ignored(self): # None the post_init method in test handler from gbpservice.neutron.tests.unit.nfp.core import ( nfp_module) del nfp_module.nfp_module_post_init conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf) wait_obj = multiprocessing.Event() setattr(controller, 'nfp_module_post_init_wait_obj', wait_obj) nfp_modules = nfp_controller.load_nfp_modules(conf, controller) nfp_controller.nfp_modules_post_init(conf, nfp_modules, controller) controller.nfp_module_post_init_wait_obj.wait(1) called = controller.nfp_module_post_init_wait_obj.is_set() self.assertFalse(called)
def test_events_sequencing_negative(self, mock_pipe_send): mock_pipe_send.side_effect = self.mocked_pipe_send conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf, singleton=False) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() self.controller = controller wait_obj = multiprocessing.Event() setattr(controller, 'sequence_event_1_wait_obj', wait_obj) wait_obj = multiprocessing.Event() setattr(controller, 'sequence_event_2_wait_obj', wait_obj) event_1 = controller.create_event( id='SEQUENCE_EVENT_1', data='NO_DATA', serialize=True, binding_key='SEQUENCE') event_2 = controller.create_event( id='SEQUENCE_EVENT_2', data='NO_DATA', serialize=True, binding_key='SEQUENCE') controller.post_event(event_1) controller.post_event(event_2) controller._manager.manager_run() controller.sequence_event_1_wait_obj.wait(1) called = controller.sequence_event_1_wait_obj.is_set() self.assertTrue(called) controller._manager.manager_run() controller.sequence_event_2_wait_obj.wait(1) called = controller.sequence_event_2_wait_obj.is_set() # Should not be called self.assertFalse(called) controller.event_complete(event_1) controller.event_complete(event_2) @mock.patch( 'gbpservice.nfp.core.controller.NfpController.pipe_send') @mock.patch( 'gbpservice.nfp.core.controller.NfpController.compress') def test_poll_event(self, mock_compress, mock_pipe_send): mock_pipe_send.side_effect = self.mocked_pipe_send mock_compress.side_effect = self.mocked_compress conf = oslo_config.CONF conf.nfp_modules_path = NFP_MODULES_PATH controller = nfp_controller.NfpController(conf, singleton=False) self.controller = controller nfp_controller.load_nfp_modules(conf, controller) # Mock launching of a worker controller.launch(1) controller._update_manager() self.controller = controller wait_obj = multiprocessing.Event() setattr(controller, 'poll_event_wait_obj', wait_obj) event = controller.create_event( id='POLL_EVENT', data='NO_DATA') # Update descriptor desc = nfp_event.EventDesc(**{}) setattr(event, 'desc', desc) event.desc.worker = controller.get_childrens().keys()[0] ctx = nfp_context.get() ctx['log_context']['namespace'] = 'nfp_module' controller.poll_event(event, spacing=1) # controller._manager.manager_run() start_time = time.time() # relinquish for 1sec time.sleep(1) # controller.poll() controller.poll_event_wait_obj.wait(0.1) called = controller.poll_event_wait_obj.is_set() end_time = time.time() self.assertTrue(called) self.assertTrue(round(end_time - start_time) == 1.0)