def acl_rules(self, duthost, testbed_devices, setup, acl_table): """ setup/teardown ACL rules based on test class requirements :param duthost: DUT host object :param localhost: localhost object :param setup: setup information :param acl_table: table creating fixture :return: """ localhost = testbed_devices['localhost'] loganalyzer = LogAnalyzer(ansible_host=duthost, marker_prefix='acl_rules') loganalyzer.load_common_config() try: loganalyzer.expect_regex = [LOG_EXPECT_ACL_RULE_CREATE_RE] with loganalyzer: self.setup_rules(duthost, setup, acl_table) self.post_setup_hook(duthost, localhost) except LogAnalyzerError as err: # cleanup config DB in case of log analysis error self.teardown_rules(duthost, setup) raise err try: yield finally: loganalyzer.expect_regex = [LOG_EXPECT_ACL_RULE_REMOVE_RE] with loganalyzer: self.teardown_rules(duthost, setup)
def acl_table(duthost, acl_table_config): """ fixture to apply ACL table configuration and remove after tests :param duthost: DUT object :param acl_table_config: ACL table configuration dictionary :return: forwards acl_table_config """ name = acl_table_config['name'] conf = acl_table_config['config_file'] loganalyzer = LogAnalyzer(ansible_host=duthost, marker_prefix='acl') loganalyzer.load_common_config() try: loganalyzer.expect_regex = [LOG_EXPECT_ACL_TABLE_CREATE_RE] with loganalyzer: logger.info('creating ACL table: applying {}'.format(conf)) # TODO: use sonic config CLI duthost.command('sonic-cfggen -j {} --write-to-db'.format(conf)) except LogAnalyzerError as err: # cleanup config DB if create failed duthost.command('config acl remove table {}'.format(name)) raise err try: yield acl_table_config finally: loganalyzer.expect_regex = [LOG_EXPECT_ACL_TABLE_REMOVE_RE] with loganalyzer: logger.info('removing ACL table {}'.format(name)) duthost.command('config acl remove table {}'.format(name)) # save cleaned configuration duthost.command('config save -y')
def acl(duthost, acl_setup): """ setup/teardown ACL rules based on test class requirements :param duthost: DUT host object :param acl_setup: setup information :return: """ loganalyzer = LogAnalyzer(ansible_host=duthost, marker_prefix='acl') loganalyzer.load_common_config() try: loganalyzer.expect_regex = [LOG_EXPECT_ACL_RULE_CREATE_RE] with loganalyzer: setup_acl_rules(duthost, acl_setup) except LogAnalyzerError as err: # cleanup config DB in case of log analysis error teardown_acl(duthost, acl_setup) raise err try: yield finally: loganalyzer.expect_regex = [LOG_EXPECT_ACL_RULE_REMOVE_RE] with loganalyzer: teardown_acl(duthost, acl_setup)
def run_test(self, duthost, storm_hndle, expect_regex, syslog_marker, action): """ Storm generation/restoration on all ports and verification Args: duthost (AnsibleHost): DUT instance storm_hndle (PFCMultiStorm): class PFCMultiStorm intance expect_regex (list): list of expect regexs to be matched in the syslog syslog_marker (string): marker prefix written to the syslog action (string): storm/restore action """ loganalyzer = LogAnalyzer(ansible_host=duthost, marker_prefix=syslog_marker) ignore_file = os.path.join(TEMPLATES_DIR, "ignore_pfc_wd_messages") reg_exp = loganalyzer.parse_regexp_file(src=ignore_file) loganalyzer.ignore_regex.extend(reg_exp) loganalyzer.expect_regex = [] loganalyzer.expect_regex.extend(expect_regex) loganalyzer.match_regex = [] with loganalyzer: if action == "storm": storm_hndle.start_pfc_storm() elif action == "restore": storm_hndle.stop_pfc_storm() time.sleep(5)
def test_dynamic_minimum_table(duthost, mocker_factory): air_flow_dirs = ['p2c', 'c2p', 'unk'] max_temperature = 45000 # 45 C cooling_cur_state = get_cooling_cur_state(duthost) if cooling_cur_state >= COOLING_CUR_STATE_THRESHOLD: pytest.skip('The cooling level {} is higher than threshold {}.'.format( cooling_cur_state, COOLING_CUR_STATE_THRESHOLD)) mocker = mocker_factory(duthost, 'MinTableMocker') loganalyzer = LogAnalyzer(ansible_host=duthost, marker_prefix='thermal_control') loganalyzer.load_common_config() for index in range(len(air_flow_dirs)): air_flow_index = random.randint(0, len(air_flow_dirs) - 1) air_flow_dir = air_flow_dirs[air_flow_index] air_flow_dirs.remove(air_flow_dir) temperature = random.randint(0, max_temperature) trust_state = True if random.randint(0, 1) else False logging.info( 'Testing with air_flow_dir={}, temperature={}, trust_state={}'. format(air_flow_dir, temperature, trust_state)) expect_minimum_cooling_level = mocker.get_expect_cooling_level( air_flow_dir, temperature, trust_state) loganalyzer.expect_regex = [ LOG_EXPECT_CHANGE_MIN_COOLING_LEVEL_RE.format( expect_minimum_cooling_level) ] with loganalyzer: mocker.mock_min_table(air_flow_dir, temperature, trust_state) time.sleep(THERMAL_CONTROL_TEST_WAIT_TIME) temperature = random.randint(0, max_temperature) logging.info( 'Testing with air_flow_dir={}, temperature={}, trust_state={}'. format(air_flow_dir, temperature, not trust_state)) expect_minimum_cooling_level = mocker.get_expect_cooling_level( air_flow_dir, temperature, not trust_state) loganalyzer.expect_regex = [ LOG_EXPECT_CHANGE_MIN_COOLING_LEVEL_RE.format( expect_minimum_cooling_level) ] with loganalyzer: mocker.mock_min_table(air_flow_dir, temperature, not trust_state) time.sleep(THERMAL_CONTROL_TEST_WAIT_TIME)
def check_thermal_control_load_invalid_file(duthost, file_name): """ @summary: Load an invalid thermal policy file check thermal control daemon is up and there is an error log printed """ loganalyzer = LogAnalyzer(ansible_host=duthost, marker_prefix='thermal_control') with ThermalPolicyFileContext(duthost, file_name): loganalyzer.expect_regex = [LOG_EXPECT_POLICY_FILE_INVALID] with loganalyzer: restart_thermal_control_daemon(duthost)
def test_thermal_control_fan_status(testbed_devices, mocker_factory): """ @summary: Make FAN absence, over speed and under speed, check logs and LED color. """ dut = testbed_devices["dut"] loganalyzer = LogAnalyzer(ansible_host=dut, marker_prefix='thermal_control') loganalyzer.load_common_config() with ThermalPolicyFileContext(dut, THERMAL_POLICY_VALID_FILE): fan_mocker = mocker_factory(dut, 'FanStatusMocker') if fan_mocker is None: pytest.skip("No FanStatusMocker for %s, skip rest of the testing in this case" % dut.facts['asic_type']) logging.info('Mock FAN status data...') fan_mocker.mock_data() # make data random restart_thermal_control_daemon(dut) wait_until(THERMAL_CONTROL_TEST_WAIT_TIME, THERMAL_CONTROL_TEST_CHECK_INTERVAL, fan_mocker.check_all_fan_speed, 60) check_thermal_algorithm_status(dut, mocker_factory, False) single_fan_mocker = mocker_factory(dut, 'SingleFanMocker') time.sleep(THERMAL_CONTROL_TEST_WAIT_TIME) if single_fan_mocker.is_fan_removable(): loganalyzer.expect_regex = [LOG_EXPECT_FAN_REMOVE_RE] with loganalyzer: logging.info('Mocking an absence FAN...') single_fan_mocker.mock_absence() check_cli_output_with_mocker(dut, single_fan_mocker, CMD_PLATFORM_FANSTATUS, THERMAL_CONTROL_TEST_WAIT_TIME) loganalyzer.expect_regex = [LOG_EXPECT_FAN_REMOVE_CLEAR_RE] with loganalyzer: logging.info('Make the absence FAN back to presence...') single_fan_mocker.mock_presence() check_cli_output_with_mocker(dut, single_fan_mocker, CMD_PLATFORM_FANSTATUS, THERMAL_CONTROL_TEST_WAIT_TIME) loganalyzer.expect_regex = [LOG_EXPECT_FAN_OVER_SPEED_RE] with loganalyzer: logging.info('Mocking an over speed FAN...') single_fan_mocker.mock_over_speed() check_cli_output_with_mocker(dut, single_fan_mocker, CMD_PLATFORM_FANSTATUS, THERMAL_CONTROL_TEST_WAIT_TIME) loganalyzer.expect_regex = [LOG_EXPECT_FAN_OVER_SPEED_CLEAR_RE] with loganalyzer: logging.info('Make the over speed FAN back to normal...') single_fan_mocker.mock_normal_speed() check_cli_output_with_mocker(dut, single_fan_mocker, CMD_PLATFORM_FANSTATUS, THERMAL_CONTROL_TEST_WAIT_TIME) loganalyzer.expect_regex = [LOG_EXPECT_FAN_UNDER_SPEED_RE] with loganalyzer: logging.info('Mocking an under speed FAN...') single_fan_mocker.mock_under_speed() check_cli_output_with_mocker(dut, single_fan_mocker, CMD_PLATFORM_FANSTATUS, THERMAL_CONTROL_TEST_WAIT_TIME) loganalyzer.expect_regex = [LOG_EXPECT_FAN_UNDER_SPEED_CLEAR_RE] with loganalyzer: logging.info('Make the under speed FAN back to normal...') single_fan_mocker.mock_normal_speed() check_cli_output_with_mocker(dut, single_fan_mocker, CMD_PLATFORM_FANSTATUS, THERMAL_CONTROL_TEST_WAIT_TIME)
def mirroring(duthost, neighbor_ip, mirror_setup, gre_version): """ fixture gathers all configuration fixtures :param duthost: DUT host :param mirror_setup: mirror_setup fixture :param mirror_config: mirror_config fixture """ logger.info("Adding mirror_session to DUT") acl_rule_file = os.path.join(mirror_setup['dut_tmp_dir'], ACL_RULE_PERSISTENT_FILE) extra_vars = { 'acl_table_name': EVERFLOW_TABLE_NAME, } logger.info('Extra variables for MIRROR table:\n{}'.format( pprint.pformat(extra_vars))) duthost.host.options['variable_manager'].extra_vars.update(extra_vars) duthost.template(src=os.path.join(TEMPLATE_DIR, ACL_RULE_PERSISTENT_TEMPLATE), dest=acl_rule_file) duthost.command('config mirror_session add {} {} {} {} {} {} {}'.format( SESSION_INFO['name'], SESSION_INFO['src_ip'], neighbor_ip, SESSION_INFO['dscp'], SESSION_INFO['ttl'], SESSION_INFO['gre'], SESSION_INFO['queue'])) logger.info('Loading acl mirror rules ...') load_rule_cmd = "acl-loader update full {} --session_name={}".format( acl_rule_file, SESSION_INFO['name']) duthost.command('{}'.format(load_rule_cmd)) try: yield finally: loganalyzer = LogAnalyzer(ansible_host=duthost, marker_prefix='acl') loganalyzer.load_common_config() try: loganalyzer.expect_regex = [LOG_EXCEPT_MIRROR_SESSION_REMOVE] with loganalyzer: teardown_mirroring(duthost, mirror_setup['dut_tmp_dir']) except LogAnalyzerError as err: raise err
def execute_test(self, duthost, syslog_marker, ignore_regex=None, expect_regex=None, expect_errors=False): """ Helper function that loads each template on the DUT and verifies the expected behavior Args: duthost (AnsibleHost): instance syslog_marker (string): marker prefix name to be inserted in the syslog ignore_regex (string): file containing regexs to be ignored by loganalyzer expect_regex (string): regex pattern that is expected to be present in the syslog expect_erros (bool): if the test expects an error msg in the syslog or not. Default: False Returns: None """ loganalyzer = LogAnalyzer(ansible_host=duthost, marker_prefix=syslog_marker) if ignore_regex: ignore_file = os.path.join(TEMPLATES_DIR, ignore_regex) reg_exp = loganalyzer.parse_regexp_file(src=ignore_file) loganalyzer.ignore_regex.extend(reg_exp) if expect_regex: loganalyzer.expect_regex = [] loganalyzer.expect_regex.extend(expect_regex) loganalyzer.match_regex = [] with loganalyzer(fail=not expect_errors): cmd = "sonic-cfggen -j {}/{}.json --write-to-db".format( DUT_RUN_DIR, syslog_marker) out = duthost.command(cmd) pytest_assert( out["rc"] == 0, "Failed to execute cmd {}: Error: {}".format( cmd, out["stderr"]))