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)
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)
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 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) wm.start_job() self.assertEqual(wm.result_handler.job_result_status, JobStatus.SUCCESS)
def test_execute_job_multiple_vendors(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_test.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='device', job_template_job_runtime='ansible', 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() self.mock_sandesh_check() execution_id = uuid.uuid4() # Hardcoding a sample auth token since its a madatory value passed # by the api server while invoking the job manager. Here since we # are directly invoking the job manager, we are passing a dummy # auth token for testing. This value is not used internally since # the calls that use the auth token are mocked sample_auth_token = "6e7d7f87faa54fac96a2a28ec752336a" job_input_json = {"job_template_id": job_template_uuid, "input": {"playbook_data": "some playbook data"}, "job_execution_id": str(execution_id), "auth_token": sample_auth_token, "params": {"device_list": ["aad74e24-a00b-4eb3-8412-f8b9412925c3"]}, "device_json": { "aad74e24-a00b-4eb3-8412-f8b9412925c3": {'device_vendor': 'Juniper', 'device_family': 'MX' } }, "args": {"collectors": ['127.0.0.1:8086']}} args = {"collectors": ['127.0.0.1:8086']} log_utils = JobLogUtils(sandesh_instance_id=str(execution_id), config_args=json.dumps(args)) jm = JobManager(log_utils.get_config_logger(), self._vnc_lib, job_input_json, log_utils) jm.start_job() self.assertEqual(jm.result_handler.job_result_status, JobStatus.SUCCESS)
def test_execute_job_no_pb_file_on_path(self): # create job template play_info = PlaybookInfoType(playbook_uri='job_manager_test.yaml') playbooks_list = PlaybookInfoListType(playbook_info=[play_info]) job_template = JobTemplate(job_template_type='device', job_template_job_runtime='ansible', job_template_multi_device_job=False, job_template_playbooks=TestJobManagerUtils. playbooks_list, name='single_device_template') job_template_uuid = self._vnc_lib.job_template_create(job_template) playbook_info = {"uri": "job_manager_test.yaml"} TestJobManagerUtils.mock_sandesh_check() 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) # mock the call to invoke the playbook process flexmock(os.path).should_receive('exists').and_return(False) sys_exit_msg = self.assertRaises(SystemExit, wm.start_job) self.assertEqual(sys_exit_msg.code, MsgBundle. getMessage(MsgBundle. JOB_SUMMARY_MESSAGE_HDR) + MsgBundle. getMessage(MsgBundle. JOB_SINGLE_DEVICE_FAILED_MESSAGE_HDR) + MsgBundle. getMessage(MsgBundle.PLAYBOOK_NOT_FOUND, playbook_uri=playbook_info['uri']))
def test_job_template_create(self): exe_info_list = ExecutableInfoListType() exe_info_list.set_executable_info([ ExecutableInfoType(executable_path='/tmp/fake', executable_args='a b c', job_completion_weightage=10) ]) playbook_info_list = PlaybookInfoListType() playbook_info_list.set_playbook_info([ PlaybookInfoType(playbook_uri='/tmp/fake/uri/playbook.yaml', multi_device_playbook=False, job_completion_weightage=5) ]) prop_map = { 'name': 'jt-{}'.format(self.id()), 'parent_obj': self.gsc, 'parent_type': 'global-system-config', 'display_name': 'job template test', 'job_template_executables': exe_info_list, 'job_template_output_schema': 'some_string', 'job_template_output_ui_schema': 'some_string', 'job_template_concurrency_level': 'fabric', 'job_template_description': 'test template', 'job_template_type': 'workflow', 'job_template_input_ui_schema': 'some_string', 'job_template_synchronous_job': False, 'job_template_input_schema': 'some_string', 'job_template_playbooks': playbook_info_list, 'annotations': {} } obj = self.set_properties(JobTemplate(), prop_map) self.assertSchemaObjCreateOrUpdate(obj)
def test_execute_job_with_recovery(self): # Create a job template play_info_1 = PlaybookInfoType( playbook_uri='job_manager_test_error.yml', vendor='Juniper', device_family='MX', sequence_no=0) play_info_2 = PlaybookInfoType( playbook_uri='job_manager_test_recovery.yml', vendor='Juniper', device_family='QFX', sequence_no=1, recovery_playbook=True) playbooks_list = PlaybookInfoListType([play_info_1, play_info_2]) job_template = JobTemplate(job_template_type='workflow', job_template_multi_device_job=False, job_template_playbooks=playbooks_list, name='Test_template_with_recovery') job_template_uuid = self._vnc_lib.job_template_create(job_template) # Mock creation of a process self.mock_play_book_execution(rc=42) # Mock 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.FAILURE) expected_job_result_message = "Finished cleaning up after the error" self.assertTrue(wm.result_handler.job_result_message, expected_job_result_message)
class TestJobManagerUtils(object): play_info = PlaybookInfoType(playbook_uri='job_manager_test.yaml', vendor='Juniper') playbooks_list = PlaybookInfoListType(playbook_info=[play_info]) execution_id = "6d69febf-82da-4998-8ba9-dbff8f6e7a5b" args = {"collectors": ['127.0.0.1:8086']} fake_schema = { "$schema": "http://json-schema.org/draft-04/schema#", "title": "InventoryItem", "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "number", "minimum": 0 }, "sku": { "description": "Stock Keeping Unit", "type": "integer" } }, "required": ["name", "price"] } @classmethod def get_min_details(cls, job_template_id): job_input_json = { "job_template_id": job_template_id, "input": { "playbook_data": "some playbook data" }, "job_execution_id": TestJobManagerUtils.execution_id, "fabric_fq_name": "Global-system-config:fabric-1", "auth_token": "6e7d7f87faa54fac96a2a28ec752336a", "api_server_host": ['1.1.1.1'], "analytics_server_list": ['2.2.2.2'], "args": TestJobManagerUtils.args } log_utils = JobLogUtils( sandesh_instance_id=TestJobManagerUtils.execution_id, config_args=json.dumps(TestJobManagerUtils.args)) return job_input_json, log_utils @classmethod def mock_sandesh_check(cls): mocked_sandesh_utils = flexmock() flexmock(SandeshUtils, __new__=mocked_sandesh_utils) mocked_sandesh_utils.should_receive('__init__') mocked_sandesh_utils.should_receive('wait_for_connection_establish') mocked_sandesh_utils.should_receive('close_sandesh_connection')
def test_execute_job_success(self): # create job template play_info = PlaybookInfoType(playbook_uri='job_manager_test.yaml', vendor='Juniper', device_family='MX') playbooks_list = PlaybookInfoListType(playbook_info=[play_info]) job_template = JobTemplate(job_template_type='device', job_template_job_runtime='ansible', 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) self.mock_play_book_execution() TestJobManagerUtils.mock_sandesh_check() job_input_json, log_utils = TestJobManagerUtils.get_min_details( job_template_uuid) jm = JobManager(log_utils.get_config_logger(), self._vnc_lib, job_input_json, log_utils) jm.start_job() self.assertEqual(jm.result_handler.job_result_status, JobStatus.SUCCESS)