def test_exclusions(self): argument_composer = ArgumentComposer() argument_composer.classifications_to_include = [] argument_composer.patches_to_include = [] argument_composer.patches_to_exclude = ["ssh*", "test"] runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True) self.assertEqual(runtime.package_filter.is_exclusion_list_present(), True) self.assertEqual(runtime.package_filter.check_for_exclusion("ssh"), True) self.assertEqual( runtime.package_filter.check_for_exclusion("ssh-client"), True) self.assertEqual( runtime.package_filter.check_for_exclusion("custom-ssh"), False) self.assertEqual(runtime.package_filter.check_for_exclusion("test"), True) self.assertEqual(runtime.package_filter.check_for_exclusion("kernel"), False) self.assertEqual( runtime.package_filter.check_for_exclusion(["kernel", "firefox"]), False) self.assertEqual( runtime.package_filter.check_for_exclusion( ["firefox", "ssh-client"]), True) runtime.stop()
def test_inclusion_type_critical(self): """Unit test for yum package manager with inclusion and Classification = Critical""" self.runtime.set_legacy_test_type('HappyPath') package_manager = self.container.get('package_manager') self.assertIsNotNone(package_manager) self.runtime.stop() argument_composer = ArgumentComposer() argument_composer.classifications_to_include = [ Constants.PackageClassification.CRITICAL ] argument_composer.patches_to_exclude = ["ssh*", "test"] argument_composer.patches_to_include = ["ssh", "tar*"] self.runtime = RuntimeCompositor( argument_composer.get_composed_arguments(), True, Constants.YUM) self.container = self.runtime.container package_filter = self.container.get('package_filter') self.assertIsNotNone(package_filter) # test for get_available_updates available_updates, package_versions = package_manager.get_available_updates( package_filter) self.assertIsNotNone(available_updates) self.assertIsNotNone(package_versions) self.assertEqual(len(available_updates), 2) self.assertEqual(len(package_versions), 2) self.assertEqual(available_updates[0], "libgcc.i686") self.assertEqual(available_updates[1], "tar.x86_64") self.assertEqual(package_versions[0], "4.8.5-28.el7") self.assertEqual(package_versions[1], "2:1.26-34.el7")
def test_exclusions_with_python_arch(self): argument_composer = ArgumentComposer() argument_composer.classifications_to_include = [] argument_composer.patches_to_include = [] argument_composer.patches_to_exclude = [ "python", "ssh.i686", "all*", "added" ] runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True) self.assertEqual(runtime.package_filter.is_exclusion_list_present(), True) self.assertEqual( runtime.package_filter.check_for_exclusion("python.x86_64"), True) self.assertEqual( runtime.package_filter.check_for_exclusion("python.i686"), True) self.assertEqual( runtime.package_filter.check_for_exclusion("python.test"), False) self.assertEqual(runtime.package_filter.check_for_exclusion("python."), False) self.assertEqual( runtime.package_filter.check_for_exclusion("ssh.i686"), True) self.assertEqual(runtime.package_filter.check_for_exclusion("all"), True) self.assertEqual(runtime.package_filter.check_for_exclusion("added"), True) self.assertEqual( runtime.package_filter.check_for_exclusion("added.v4"), False) self.assertEqual(runtime.package_filter.check_for_exclusion("random"), False) runtime.stop()
def test_reboot_setting_default_config(self): argument_composer = ArgumentComposer() argument_composer.reboot_setting = "" runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True, Constants.YUM) reboot_manager = runtime.reboot_manager self.assertEqual(reboot_manager.is_setting(Constants.REBOOT_IF_REQUIRED), True) runtime.stop()
def test_reboot_time_available(self): runtime = RuntimeCompositor(ArgumentComposer().get_composed_arguments(), True) reboot_manager = runtime.reboot_manager self.assertEqual(reboot_manager.is_reboot_time_available(20), True) self.assertEqual(reboot_manager.is_reboot_time_available(15), True) self.assertEqual(reboot_manager.is_reboot_time_available(14), False) runtime.stop()
def test_inclusion_only(self): """Unit test for yum package manager with inclusion only and NotSelected Classifications""" self.runtime.set_legacy_test_type('HappyPath') package_manager = self.container.get('package_manager') self.assertIsNotNone(package_manager) self.runtime.stop() argument_composer = ArgumentComposer() argument_composer.classifications_to_include = [ Constants.PackageClassification.UNCLASSIFIED ] argument_composer.patches_to_include = ["ssh", "tar*"] argument_composer.patches_to_exclude = ["ssh*", "test"] self.runtime = RuntimeCompositor( argument_composer.get_composed_arguments(), True, Constants.YUM) self.container = self.runtime.container package_filter = self.container.get('package_filter') self.assertIsNotNone(package_filter) # test for get_available_updates available_updates, package_versions = package_manager.get_available_updates( package_filter) self.assertIsNotNone(available_updates) self.assertIsNotNone(package_versions) self.assertEqual(len(available_updates), 1) self.assertEqual(len(package_versions), 1) self.assertEqual(available_updates[0], "tar.x86_64") self.assertEqual(package_versions[0], "2:1.26-34.el7")
def test_inclusion_dependency_only(self): """Unit test for yum with test dependencies in Inclusion & NotSelected Classifications""" self.runtime.set_legacy_test_type('HappyPath') package_manager = self.container.get('package_manager') self.assertIsNotNone(package_manager) self.runtime.stop() argument_composer = ArgumentComposer() argument_composer.classifications_to_include = [ Constants.PackageClassification.UNCLASSIFIED ] argument_composer.patches_to_include = [ "ssh", "selinux-policy-targeted.noarch" ] argument_composer.patches_to_exclude = ["ssh*", "test"] self.runtime = RuntimeCompositor( argument_composer.get_composed_arguments(), True, Constants.YUM) self.container = self.runtime.container package_filter = self.container.get('package_filter') self.assertIsNotNone(package_filter) # test for get_available_updates available_updates, package_versions = package_manager.get_available_updates( package_filter) self.assertIsNotNone(available_updates) self.assertIsNotNone(package_versions) self.assertEqual(len(available_updates), 1) self.assertEqual(len(package_versions), 1) self.assertEqual(available_updates[0], "selinux-policy-targeted.noarch") self.assertEqual(package_versions[0], "3.13.1-102.el7_3.16")
def test_reboot_always_runs_only_once_if_no_reboot_is_required(self): reboot_setting_in_api = 'Always' argument_composer = ArgumentComposer() argument_composer.reboot_setting = reboot_setting_in_api runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True, Constants.YUM) reboot_manager = runtime.reboot_manager # Validate single reboot scenario runtime.status_handler.is_reboot_pending = True self.assertEqual( reboot_manager.start_reboot_if_required_and_time_available(20), True) # mock completing the reboot once, with no reboot required runtime.status_handler.set_installation_reboot_status( Constants.RebootStatus.REQUIRED) runtime.status_handler.set_installation_reboot_status( Constants.RebootStatus.STARTED) runtime.status_handler.is_reboot_pending = False runtime.status_handler.set_installation_reboot_status( Constants.RebootStatus.COMPLETED) # no further reboot should be required self.assertEqual( reboot_manager.start_reboot_if_required_and_time_available(20), False) runtime.stop()
def test_inclusion_notexist(self): """Unit test for yum with Inclusion which does not exist & NotSelected Classifications""" self.runtime.set_legacy_test_type('HappyPath') package_manager = self.container.get('package_manager') self.assertIsNotNone(package_manager) self.runtime.stop() argument_composer = ArgumentComposer() argument_composer.classifications_to_include = [ Constants.PackageClassification.UNCLASSIFIED ] argument_composer.patches_to_include = ["ssh"] argument_composer.patches_to_exclude = ["ssh*", "test"] self.runtime = RuntimeCompositor( argument_composer.get_composed_arguments(), True, Constants.YUM) self.container = self.runtime.container package_filter = self.container.get('package_filter') self.assertIsNotNone(package_filter) # test for get_available_updates available_updates, package_versions = package_manager.get_available_updates( package_filter) self.assertIsNotNone(available_updates) self.assertIsNotNone(package_versions) self.assertEqual(len(available_updates), 0) self.assertEqual(len(package_versions), 0)
def test_reboot_setting(self, reboot_setting_in_api='Never', reboot_setting_in_code=Constants.REBOOT_NEVER): argument_composer = ArgumentComposer() argument_composer.reboot_setting = reboot_setting_in_api runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True, Constants.YUM) reboot_manager = runtime.reboot_manager self.assertEqual(reboot_manager.is_setting(reboot_setting_in_code), True) runtime.stop()
def test_reboot_always_time_not_available(self): reboot_setting_in_api = 'Always' argument_composer = ArgumentComposer() argument_composer.reboot_setting = reboot_setting_in_api runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True, Constants.YUM) reboot_manager = runtime.reboot_manager self.assertEqual(reboot_manager.start_reboot_if_required_and_time_available(10), False) runtime.stop()
class TestTelemetryWriter(unittest.TestCase): def setUp(self): self.runtime = RuntimeCompositor( ArgumentComposer().get_composed_arguments(), True) self.container = self.runtime.container def tearDown(self): self.runtime.stop() def test_something(self): self.assertEqual(True, True)
def test_invalid_classifications(self): argument_composer = ArgumentComposer() argument_composer.classifications_to_include = ['Security', "Other"] argument_composer.patches_to_include = [] argument_composer.patches_to_exclude = [] runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True) self.assertEqual( runtime.package_filter.is_invalid_classification_combination(), True) runtime.stop()
def test_check_available_time(self): argument_composer = ArgumentComposer() argument_composer.start_time = ( datetime.datetime.utcnow() - datetime.timedelta(minutes=39)).strftime("%Y-%m-%dT%H:%M:%S.9999Z") argument_composer.maximum_duration = "PT1H" runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True) self.assertEqual( runtime.maintenance_window.is_package_install_time_available(), True) runtime.stop()
def test_with_none_for_classifications(self): argument_composer = ArgumentComposer() argument_composer.classifications_to_include = None argument_composer.patches_to_include = [] argument_composer.patches_to_exclude = [] runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True) self.assertEqual( runtime.package_filter.is_invalid_classification_combination(), False) runtime.stop()
def test_included_classifications(self): argument_composer = ArgumentComposer() argument_composer.classifications_to_include = ['Critical', 'Security'] argument_composer.patches_to_include = [] argument_composer.patches_to_exclude = [] runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True) self.assertEqual( runtime.package_filter.is_msft_critsec_classification_only(), True) self.assertEqual( runtime.package_filter.is_msft_other_classification_only(), False) runtime.stop()
class TestContainer(unittest.TestCase): def setUp(self): self.runtime = RuntimeCompositor(ArgumentComposer().get_composed_arguments(), True, package_manager_name=Constants.ZYPPER) self.container = self.runtime.container def tearDown(self): self.runtime.stop() def test_get_unsupported_service(self): """Try get a registered service""" try: self.container.get('unsupported_service') except KeyError as ex: self.assertEqual("'No component for: unsupported_service'", str(ex))
def test_RemainingTime_after_duration_complete(self): argument_composer = ArgumentComposer() argument_composer.start_time = "2017-02-15T18:15:12.9828835Z" argument_composer.maximum_duration = "PT1H" runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True) current_time = datetime.datetime.strptime('2017-02-15 19:16:20', "%Y-%m-%d %H:%M:%S") remaining_time = runtime.maintenance_window.get_remaining_time_in_minutes( current_time) self.assertEqual(int(remaining_time), 0) runtime.stop()
class TestConfigurationFactory(unittest.TestCase): def setUp(self): self.argument_composer = ArgumentComposer().get_composed_arguments() self.runtime = RuntimeCompositor(self.argument_composer, True, package_manager_name=Constants.ZYPPER) self.container = self.runtime.container def tearDown(self): self.runtime.stop() def test_get_prod_config_correctly(self): bootstrapper = Bootstrapper(self.argument_composer, capture_stdout=False) config_factory = bootstrapper.configuration_factory self.assertTrue(config_factory) config = config_factory.get_configuration(Constants.PROD, Constants.YUM) self.assertEqual(config['package_manager_name'], Constants.YUM) self.assertEqual(config['config_env'], Constants.PROD) def test_get_test_config_correctly(self): bootstrapper = Bootstrapper(self.argument_composer, capture_stdout=False) config_factory = bootstrapper.configuration_factory self.assertTrue(config_factory) config = config_factory.get_configuration(Constants.TEST, Constants.APT) self.assertEqual(config['package_manager_name'], Constants.APT) self.assertEqual(config['config_env'], Constants.TEST) def test_get_dev_config_correctly(self): bootstrapper = Bootstrapper(self.argument_composer, capture_stdout=False) config_factory = bootstrapper.configuration_factory self.assertTrue(config_factory) config = config_factory.get_configuration(Constants.DEV, Constants.APT) self.assertEqual(config['package_manager_name'], Constants.APT) self.assertEqual(config['config_env'], Constants.DEV)
class TestPatchAssessor(unittest.TestCase): def setUp(self): self.runtime = RuntimeCompositor( ArgumentComposer().get_composed_arguments(), legacy_mode=True) self.container = self.runtime.container def tearDown(self): self.runtime.stop() def test_assessment_success(self): self.assertTrue(self.runtime.patch_assessor.start_assessment()) def test_assessment_fail(self): self.runtime.set_legacy_test_type('UnalignedPath') self.assertRaises(Exception, self.runtime.patch_assessor.start_assessment) def test_get_all_updates_fail(self): self.runtime.set_legacy_test_type('UnalignedPath') self.assertRaises(Exception, self.runtime.package_manager.get_all_updates) def test_get_all_security_updates_fail(self): self.runtime.set_legacy_test_type('UnalignedPath') self.assertRaises(Exception, self.runtime.package_manager.get_security_updates) def test_assessment_fail_with_status_update(self): self.runtime.package_manager.refresh_repo = self.mock_refresh_repo self.runtime.set_legacy_test_type('UnalignedPath') self.assertRaises(Exception, self.runtime.patch_assessor.start_assessment) with open(self.runtime.execution_config.status_file_path, 'r') as file_handle: file_contents = json.loads(file_handle.read()) self.assertTrue( 'Unexpected return code (100) from package manager on command: LANG=en_US.UTF8 sudo apt-get -s dist-upgrade' in str(file_contents)) def mock_refresh_repo(self): pass
def test_included_classifications_short_term_accomodations(self): # this test should be removed once the accommodations in execution config are removed argument_composer = ArgumentComposer() argument_composer.classifications_to_include = ['Security', 'Other'] argument_composer.patches_to_include = [] argument_composer.patches_to_exclude = [] runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True) self.assertEqual( runtime.package_filter.is_invalid_classification_combination(), False) # this will fail after accommodations are removed. self.assertEqual( runtime.package_filter.is_msft_all_classification_included(), True) # this will fail after accommodations are removed. self.assertEqual( runtime.package_filter.is_msft_critsec_classification_only(), False) self.assertEqual( runtime.package_filter.is_msft_other_classification_only(), False) runtime.stop()
def healthstore_writes_helper(self, health_store_id, maintenance_run_id, expected_patch_version): current_time = datetime.datetime.utcnow() td = datetime.timedelta(hours=0, minutes=20) job_start_time = (current_time - td).strftime("%Y-%m-%dT%H:%M:%S.9999Z") argument_composer = ArgumentComposer() argument_composer.maximum_duration = 'PT1H' argument_composer.start_time = job_start_time argument_composer.health_store_id = health_store_id argument_composer.maintenance_run_id = maintenance_run_id runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True, Constants.YUM) runtime.set_legacy_test_type('SuccessInstallPath') installed_update_count, update_run_successful, maintenance_window_exceeded = runtime.patch_installer.install_updates( runtime.maintenance_window, runtime.package_manager, simulate=True) runtime.patch_installer.mark_installation_completed() with runtime.env_layer.file_system.open( runtime.execution_config.status_file_path, 'r') as file_handle: substatus_file_data = json.load( file_handle)[0]["status"]["substatus"][1] self.assertEqual( True, json.loads(substatus_file_data['formattedMessage']['message']) ['shouldReportToHealthStore']) self.assertEqual( expected_patch_version, json.loads(substatus_file_data['formattedMessage']['message']) ['patchVersion']) runtime.stop()
def test_iso8601_duration_to_timedelta_str_conversion(self): runtime = RuntimeCompositor( ArgumentComposer().get_composed_arguments(), True) self.assertEqual( "2:00:00", runtime.execution_config. _ExecutionConfig__convert_iso8601_duration_to_timedelta_str( "PT2H")) self.assertEqual( "0:03:00", runtime.execution_config. _ExecutionConfig__convert_iso8601_duration_to_timedelta_str( "PT3M")) self.assertEqual( "0:00:40", runtime.execution_config. _ExecutionConfig__convert_iso8601_duration_to_timedelta_str( "PT40S")) self.assertEqual( "0:03:40", runtime.execution_config. _ExecutionConfig__convert_iso8601_duration_to_timedelta_str( "PT3M40S")) self.assertEqual( "12:03:40", runtime.execution_config. _ExecutionConfig__convert_iso8601_duration_to_timedelta_str( "PT12H3M40S")) self.assertEqual( "1:00:40", runtime.execution_config. _ExecutionConfig__convert_iso8601_duration_to_timedelta_str( "PT1H40S")) with self.assertRaises(Exception): runtime.env_layer.datetime.convert_iso8601_duration_to_timedelta_str( "P1DT12H3M40S") runtime.stop()
def test_inclusion_type_all(self): """Unit test for yum package manager Classification = all and IncludedPackageNameMasks not specified.""" self.runtime.set_legacy_test_type('HappyPath') package_manager = self.container.get('package_manager') self.assertIsNotNone(package_manager) self.runtime.stop() argument_composer = ArgumentComposer() argument_composer.classifications_to_include = [ Constants.PackageClassification.UNCLASSIFIED ] argument_composer.patches_to_exclude = ["ssh*", "test"] self.runtime = RuntimeCompositor( argument_composer.get_composed_arguments(), True, Constants.YUM) self.container = self.runtime.container package_filter = self.container.get('package_filter') # test for get_available_updates available_updates, package_versions = package_manager.get_available_updates( package_filter) self.assertIsNotNone(available_updates) self.assertIsNotNone(package_versions) self.assertEqual(len(available_updates), 5) self.assertEqual(len(package_versions), 5) self.assertEqual(available_updates[0], "selinux-policy.noarch") self.assertEqual(package_versions[0], "3.13.1-102.el7_3.16") self.assertEqual(available_updates[1], "selinux-policy-targeted.noarch") self.assertEqual(package_versions[1], "3.13.1-102.el7_3.16") self.assertEqual(available_updates[2], "libgcc.i686") self.assertEqual(package_versions[2], "4.8.5-28.el7") self.assertEqual(available_updates[3], "tar.x86_64") self.assertEqual(package_versions[3], "2:1.26-34.el7") self.assertEqual(available_updates[4], "tcpdump.x86_64") self.assertEqual(package_versions[4], "14:4.9.2-3.el7")
def test_inclusion_type_other(self): """Unit test for yum package manager with inclusion and Classification = Other""" self.runtime.set_legacy_test_type('HappyPath') package_manager = self.container.get('package_manager') self.assertIsNotNone(package_manager) self.runtime.stop() argument_composer = ArgumentComposer() argument_composer.classifications_to_include = [ Constants.PackageClassification.OTHER ] argument_composer.patches_to_include = ["ssh", "tcpdump"] argument_composer.patches_to_exclude = ["ssh*", "test"] self.runtime = RuntimeCompositor( argument_composer.get_composed_arguments(), True, Constants.YUM) self.container = self.runtime.container package_filter = self.container.get('package_filter') self.assertIsNotNone(package_filter) # test for get_available_updates available_updates, package_versions = package_manager.get_available_updates( package_filter) self.assertIsNotNone(available_updates) self.assertIsNotNone(package_versions) self.assertEqual(len(available_updates), 4) self.assertEqual(len(package_versions), 4) self.assertEqual(available_updates[0], "selinux-policy.noarch") self.assertEqual(package_versions[0], "3.13.1-102.el7_3.16") self.assertEqual(available_updates[1], "selinux-policy-targeted.noarch") self.assertEqual(package_versions[1], "3.13.1-102.el7_3.16") self.assertEqual(available_updates[2], "tar.x86_64") self.assertEqual(package_versions[2], "2:1.26-34.el7") self.assertEqual(available_updates[3], "tcpdump.x86_64") self.assertEqual(package_versions[3], "14:4.9.2-3.el7")
def test_operation_success_for_non_autopatching_request(self): argument_composer = ArgumentComposer() runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True, Constants.ZYPPER) runtime.set_legacy_test_type('SuccessInstallPath') CoreMain(argument_composer.get_composed_arguments()) with runtime.env_layer.file_system.open(runtime.execution_config.status_file_path, 'r') as file_handle: substatus_file_data = json.load(file_handle)[0]["status"]["substatus"] self.assertEquals(len(substatus_file_data), 2) self.assertTrue(substatus_file_data[0]["name"] == Constants.PATCH_ASSESSMENT_SUMMARY) self.assertTrue(substatus_file_data[0]["status"] == Constants.STATUS_SUCCESS.lower()) self.assertTrue(substatus_file_data[1]["name"] == Constants.PATCH_INSTALLATION_SUMMARY) self.assertTrue(substatus_file_data[1]["status"] == Constants.STATUS_SUCCESS.lower()) runtime.stop()
def test_zypper_install_updates_maintenance_window_exceeded(self): current_time = datetime.datetime.utcnow() td = datetime.timedelta(hours=1, minutes=2) job_start_time = (current_time - td).strftime("%Y-%m-%dT%H:%M:%S.9999Z") argument_composer = ArgumentComposer() argument_composer.maximum_duration = 'PT1H' argument_composer.start_time = job_start_time runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True, Constants.ZYPPER) # Path change runtime.set_legacy_test_type('FailInstallPath') installed_update_count, update_run_successful, maintenance_window_exceeded = runtime.patch_installer.install_updates( runtime.maintenance_window, runtime.package_manager, simulate=True) self.assertEqual(0, installed_update_count) self.assertTrue(update_run_successful) self.assertTrue(maintenance_window_exceeded) runtime.stop()
def test_operation_fail_for_autopatching_request(self): argument_composer = ArgumentComposer() argument_composer.maintenance_run_id = str(datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ")) runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True, Constants.ZYPPER) runtime.set_legacy_test_type('FailInstallPath') CoreMain(argument_composer.get_composed_arguments()) with runtime.env_layer.file_system.open(runtime.execution_config.status_file_path, 'r') as file_handle: substatus_file_data = json.load(file_handle)[0]["status"]["substatus"] self.assertEquals(len(substatus_file_data), 3) self.assertTrue(substatus_file_data[0]["name"] == Constants.PATCH_ASSESSMENT_SUMMARY) self.assertTrue(substatus_file_data[0]["status"] == Constants.STATUS_SUCCESS.lower()) self.assertTrue(substatus_file_data[1]["name"] == Constants.PATCH_INSTALLATION_SUMMARY) self.assertTrue(substatus_file_data[1]["status"] == Constants.STATUS_ERROR.lower()) self.assertEqual(len(json.loads(substatus_file_data[1]["formattedMessage"]["message"])["errors"]["details"]), 1) self.assertTrue(substatus_file_data[2]["name"] == Constants.PATCH_METADATA_FOR_HEALTHSTORE) self.assertTrue(substatus_file_data[2]["status"] == Constants.STATUS_SUCCESS.lower()) substatus_file_data_patch_metadata_summary = json.loads(substatus_file_data[2]["formattedMessage"]["message"]) self.assertTrue(substatus_file_data_patch_metadata_summary["patchVersion"], Constants.PATCH_VERSION_UNKNOWN) self.assertFalse(substatus_file_data_patch_metadata_summary["shouldReportToHealthStore"]) runtime.stop()
def test_operation_success_for_autopatching_request(self): # test with valid datetime string for maintenance run id argument_composer = ArgumentComposer() maintenance_run_id = "9/28/2020 02:00:00 PM +00:00" argument_composer.maintenance_run_id = str(maintenance_run_id) runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True, Constants.ZYPPER) runtime.set_legacy_test_type('SuccessInstallPath') CoreMain(argument_composer.get_composed_arguments()) with runtime.env_layer.file_system.open(runtime.execution_config.status_file_path, 'r') as file_handle: substatus_file_data = json.load(file_handle)[0]["status"]["substatus"] self.assertEquals(len(substatus_file_data), 3) self.assertTrue(substatus_file_data[0]["name"] == Constants.PATCH_ASSESSMENT_SUMMARY) self.assertTrue(substatus_file_data[0]["status"] == Constants.STATUS_SUCCESS.lower()) self.assertTrue(substatus_file_data[1]["name"] == Constants.PATCH_INSTALLATION_SUMMARY) self.assertTrue(substatus_file_data[1]["status"] == Constants.STATUS_SUCCESS.lower()) self.assertTrue(substatus_file_data[2]["name"] == Constants.PATCH_METADATA_FOR_HEALTHSTORE) self.assertTrue(substatus_file_data[2]["status"] == Constants.STATUS_SUCCESS.lower()) substatus_file_data_patch_metadata_summary = json.loads(substatus_file_data[2]["formattedMessage"]["message"]) self.assertEqual(substatus_file_data_patch_metadata_summary["patchVersion"], "2020.09.28") self.assertTrue(substatus_file_data_patch_metadata_summary["shouldReportToHealthStore"]) runtime.stop()
def setUp(self): self.argument_composer = ArgumentComposer().get_composed_arguments() self.runtime = RuntimeCompositor(self.argument_composer, True, package_manager_name=Constants.ZYPPER) self.container = self.runtime.container