def __init__(self): class MockConnection(object): def wait(self): return self._connected_to_api_server = MockConnection() self._zookeeper_client = FakeKazooClient() self.security_group_lock_prefix = '/vnc_cfg_api_locks/security_group' pass
class TestJobManager(test_case.JobTestCase): fake_zk_client = FakeKazooClient() @classmethod def setUpClass(cls, *args, **kwargs): cls.console_handler = logging.StreamHandler() cls.console_handler.setLevel(logging.DEBUG) logger.addHandler(cls.console_handler) super(TestJobManager, cls).setUpClass(*args, **kwargs) # end setUpClass @classmethod def tearDownClass(cls, *args, **kwargs): logger.removeHandler(cls.console_handler) super(TestJobManager, cls).tearDownClass(*args, **kwargs) # end tearDownClass # Test for a single playbook in the workflow template def test_execute_job_success(self): # create job template play_info = PlaybookInfoType(playbook_uri='job_manager_test.yml', vendor='Juniper', device_family='MX') playbooks_list = PlaybookInfoListType(playbook_info=[play_info]) job_template = JobTemplate(job_template_type='workflow', job_template_multi_device_job=False, job_template_playbooks=playbooks_list, name='Test_template') job_template_uuid = self._vnc_lib.job_template_create(job_template) # mocking creation of a process self.mock_play_book_execution() # mocking Sandesh TestJobManagerUtils.mock_sandesh_check() # getting details required for job manager execution job_input_json, log_utils = TestJobManagerUtils.get_min_details( job_template_uuid) wm = WFManager(log_utils.get_config_logger(), self._vnc_lib, job_input_json, log_utils, self.fake_zk_client) wm.start_job() self.assertEqual(wm.result_handler.job_result_status, JobStatus.SUCCESS) # Test for job success with multiple playbooks in the workflow template def test_execute_job_success_multiple_templates(self): # create job template play_info = PlaybookInfoType(playbook_uri='job_manager_test.yml', vendor='Juniper', device_family='MX') play_info1 = PlaybookInfoType( playbook_uri='job_manager_test_multiple.yml', vendor='Juniper', device_family='QFX') playbooks_list = PlaybookInfoListType( playbook_info=[play_info, play_info1]) job_template = JobTemplate(job_template_type='workflow', job_template_multi_device_job=False, job_template_playbooks=playbooks_list, name='Test_template1') job_template_uuid = self._vnc_lib.job_template_create(job_template) # mocking creation of a process self.mock_play_book_execution() # mocking Sandesh TestJobManagerUtils.mock_sandesh_check() # getting details required for job manager execution job_input_json, log_utils = TestJobManagerUtils.get_min_details( job_template_uuid) wm = WFManager(log_utils.get_config_logger(), self._vnc_lib, job_input_json, log_utils, self.fake_zk_client) wm.start_job() self.assertEqual(wm.result_handler.job_result_status, JobStatus.SUCCESS) # to test the case when only device vendor is passed in job_template_input def test_execute_job_with_vendor_only(self): play_info = PlaybookInfoType(playbook_uri='job_manager_test.yaml', vendor='Juniper') play_info1 = PlaybookInfoType( playbook_uri='job_manager_test_multiple.yml', vendor='Juniper') playbooks_list = PlaybookInfoListType( playbook_info=[play_info, play_info1]) job_template = JobTemplate(job_template_type='workflow', job_template_multi_device_job=True, job_template_playbooks=playbooks_list, name='Test_template_multidevice') job_template_uuid = self._vnc_lib.job_template_create(job_template) # mock the play book executor call self.mock_play_book_execution() TestJobManagerUtils.mock_sandesh_check() job_input_json, log_utils = self.get_details(job_template_uuid) wm = WFManager(log_utils.get_config_logger(), self._vnc_lib, job_input_json, log_utils, self.fake_zk_client) wm.start_job() self.assertEqual(wm.result_handler.job_result_status, JobStatus.SUCCESS) # to test the case when device vendor and multiple device families are # passed in job_template_input def test_execute_job_multiple_device_families(self): play_info_mx = PlaybookInfoType(playbook_uri='job_manager_test.yaml', vendor='Juniper', device_family='MX') play_info_qfx = PlaybookInfoType(playbook_uri='job_manager_test.yaml', vendor='Juniper', device_family='QFX') playbooks_list = PlaybookInfoListType( playbook_info=[play_info_qfx, play_info_mx]) job_template = JobTemplate(job_template_type='workflow', job_template_multi_device_job=True, job_template_playbooks=playbooks_list, name='Test_template_multidevfamilies') job_template_uuid = self._vnc_lib.job_template_create(job_template) # mock the play book executor call self.mock_play_book_execution() TestJobManagerUtils.mock_sandesh_check() job_input_json, log_utils = self.get_details(job_template_uuid) wm = WFManager(log_utils.get_config_logger(), self._vnc_lib, job_input_json, log_utils, self.fake_zk_client) wm.start_job() self.assertEqual(wm.result_handler.job_result_status, JobStatus.SUCCESS) # to test the case when device vendor and multiple device families are # passed in workflow_template_input along with multiple playbooks # TODO - The task weightage array from be gotten from the # TODO - workflow_template. Currently the test case # TODO - fails beacuse the task weightage array is hard coded. def test_execute_job_multiple_device_families_multiple_playbooks(self): play_info_mx = PlaybookInfoType(playbook_uri='job_manager_test.yaml', vendor='Juniper', device_family='MX') play_info_qfx = PlaybookInfoType(playbook_uri='job_manager_test.yaml', vendor='Juniper', device_family='QFX') play_info_2 = PlaybookInfoType(playbook_uri='job_manager_test2.yaml', vendor='Juniper') playbooks_list = PlaybookInfoListType( playbook_info=[play_info_qfx, play_info_mx, play_info_2]) job_template = JobTemplate(job_template_type='workflow', job_template_multi_device_job=True, job_template_playbooks=playbooks_list, name='Test_template_multi_devfamilies') job_template_uuid = self._vnc_lib.job_template_create(job_template) # mock the play book executor call self.mock_play_book_execution() TestJobManagerUtils.mock_sandesh_check() job_input_json, log_utils = self.get_details(job_template_uuid) wm = WFManager(log_utils.get_config_logger(), self._vnc_lib, job_input_json, log_utils, self.fake_zk_client) wm.start_job() self.assertEqual(wm.result_handler.job_result_status, JobStatus.SUCCESS) # to test the case when multiple device vendors and multiple_playbooks are # passed in job_template_input # TODO - Test case fails for the same reason as above. The # TODO - hardcoded array only considers chaining of two playbooks. def test_execute_job_multiple_vendors_multiple_playbooks(self): play_info_juniper_mx = PlaybookInfoType( playbook_uri='job_manager_test.yaml', vendor='Juniper', device_family='MX') play_info_juniper_qfx = PlaybookInfoType( playbook_uri='job_manager_test.yaml', vendor='Juniper', device_family='QFX') play_info_arista_df = PlaybookInfoType( playbook_uri='job_manager_test2.yaml', vendor='Arista', device_family='df') playbooks_list = PlaybookInfoListType(playbook_info=[ play_info_arista_df, play_info_juniper_qfx, play_info_juniper_mx ]) job_template = JobTemplate(job_template_type='workflow', job_template_multi_device_job=True, job_template_playbooks=playbooks_list, name='Test_template_multivendors') job_template_uuid = self._vnc_lib.job_template_create(job_template) # mock the play book executor call self.mock_play_book_execution() TestJobManagerUtils.mock_sandesh_check() job_input_json, log_utils = self.get_details(job_template_uuid) wm = WFManager(log_utils.get_config_logger(), self._vnc_lib, job_input_json, log_utils, self.fake_zk_client) wm.start_job() self.assertEqual(wm.result_handler.job_result_status, JobStatus.SUCCESS) # to test the case when no vendor is passed in workflow_template_input for # second playbook_info - Depending on the device vendor, the right # playbooks has to be picked. def test_execute_job_no_vendor(self): play_info_juniper_qfx = PlaybookInfoType( playbook_uri='job_manager_test.yaml', vendor='Juniper', device_family='QFX') play_info_vendor_agnostic = PlaybookInfoType( playbook_uri='job_manager_test2.yaml') playbooks_list = PlaybookInfoListType( playbook_info=[play_info_juniper_qfx, play_info_vendor_agnostic]) job_template = JobTemplate(job_template_type='workflow', job_template_multi_device_job=True, job_template_playbooks=playbooks_list, name='Test_template_no_vendor') job_template_uuid = self._vnc_lib.job_template_create(job_template) # mock the play book executor call # check if the playbook is getting executed after job_manager # validation self.mock_play_book_execution() TestJobManagerUtils.mock_sandesh_check() job_input_json, log_utils = self.get_details(job_template_uuid) wm = WFManager(log_utils.get_config_logger(), self._vnc_lib, job_input_json, log_utils, self.fake_zk_client) wm.start_job() self.assertEqual(wm.result_handler.job_result_status, JobStatus.SUCCESS) def get_details(self, job_template_uuid): job_input_json, log_utils = TestJobManagerUtils.get_min_details( job_template_uuid) job_input_json.update({ "params": { "device_list": ["aad74e24-a00b-4eb3-8412-f8b9412925c3"] }, "device_json": { "aad74e24-a00b-4eb3-8412-f8b9412925c3": { 'device_vendor': 'Juniper', 'device_family': 'MX', 'device_username': '******', 'device_password': '******', 'device_product': 'QFX-10002', 'device_fqname': ['default-global-system-config', 'random_device_fqname'] } } }) return job_input_json, log_utils def mock_play_book_execution(self): mock_subprocess32 = flexmock(subprocess32) playbook_id = uuid.uuid4() mock_unique_pb_id = flexmock(uuid) fake_process = flexmock(returncode=0, pid=123) fake_process.should_receive('wait') mock_subprocess32.should_receive('Popen').and_return(fake_process) mock_unique_pb_id.should_receive('uuid4').and_return(playbook_id) fake_process.should_receive('poll').and_return(123) # mock the call to invoke the playbook process flexmock(os.path).should_receive('exists').and_return(True) # mock the call to write an END to the file with open("/tmp/" + TestJobManagerUtils.execution_id, "a") as f: f.write(str(playbook_id) + 'END' + PLAYBOOK_EOL_PATTERN) # mock sys exit call flexmock(sys).should_receive('exit') fake_resp = flexmock(status_code=123) fake_request = flexmock(requests).should_receive('post').and_return( fake_resp)