def test_ioclass_export_configuration(cache_mode): """ title: Export IO class configuration to a file description: | Test CAS ability to create a properly formatted file with current IO class configuration pass_criteria: - CAS default IO class configuration contains unclassified class only - CAS properly imports previously exported configuration """ with TestRun.LOGGER.step(f"Test prepare"): cache, core = prepare(cache_mode) saved_config_path = "/tmp/opencas_saved.conf" default_list = [IoClass.default()] with TestRun.LOGGER.step( f"Check IO class configuration (should contain only default class)" ): csv = casadm.list_io_classes(cache.cache_id, OutputFormat.csv).stdout if not IoClass.compare_ioclass_lists(IoClass.csv_to_list(csv), default_list): TestRun.LOGGER.error( "Default configuration does not match expected\n" f"Current:\n{csv}\n" f"Expected:{IoClass.list_to_csv(default_list)}") with TestRun.LOGGER.step( "Create and load configuration file for 33 IO classes " "with random names, allocation and priority values"): random_list = IoClass.generate_random_ioclass_list(33) IoClass.save_list_to_config_file( random_list, ioclass_config_path=ioclass_config_path) casadm.load_io_classes(cache.cache_id, ioclass_config_path) with TestRun.LOGGER.step( "Display and export IO class configuration - displayed configuration " "should be the same as created"): TestRun.executor.run( f"{casadm.list_io_classes_cmd(str(cache.cache_id), OutputFormat.csv.name)}" f" > {saved_config_path}") csv = fs_utils.read_file(saved_config_path) if not IoClass.compare_ioclass_lists(IoClass.csv_to_list(csv), random_list): TestRun.LOGGER.error( "Exported configuration does not match expected\n" f"Current:\n{csv}\n" f"Expected:{IoClass.list_to_csv(random_list)}") with TestRun.LOGGER.step("Stop Intel CAS"): casadm.stop_cache(cache.cache_id) with TestRun.LOGGER.step("Start cache and add core"): cache = casadm.start_cache(cache.cache_device, force=True) casadm.add_core(cache, core.core_device) with TestRun.LOGGER.step( "Check IO class configuration (should contain only default class)" ): csv = casadm.list_io_classes(cache.cache_id, OutputFormat.csv).stdout if not IoClass.compare_ioclass_lists(IoClass.csv_to_list(csv), default_list): TestRun.LOGGER.error( "Default configuration does not match expected\n" f"Current:\n{csv}\n" f"Expected:{IoClass.list_to_csv(default_list)}") with TestRun.LOGGER.step( "Load exported configuration file for 33 IO classes"): casadm.load_io_classes(cache.cache_id, saved_config_path) with TestRun.LOGGER.step( "Display IO class configuration - should be the same as created"): csv = casadm.list_io_classes(cache.cache_id, OutputFormat.csv).stdout if not IoClass.compare_ioclass_lists(IoClass.csv_to_list(csv), random_list): TestRun.LOGGER.error( "Exported configuration does not match expected\n" f"Current:\n{csv}\n" f"Expected:{IoClass.list_to_csv(random_list)}") with TestRun.LOGGER.step(f"Test cleanup"): fs_utils.remove(saved_config_path)
def test_standby_neg_cli_management(): """ title: Blocking management commands in standby state description: | Try executing management commands for a cache in standby state pass_criteria: - The execution is unsuccessful for blocked management commands - The execution is successful for allowed management commands - A proper error message is displayed for unsuccessful executions """ with TestRun.step("Prepare the device for the cache."): device = TestRun.disks["cache"] device.create_partitions( [Size(500, Unit.MebiByte), Size(500, Unit.MebiByte)]) cache_device = device.partitions[0] core_device = device.partitions[1] with TestRun.step("Prepare the standby instance"): cache_id = 1 cache = casadm.standby_init(cache_dev=cache_device, cache_id=cache_id, cache_line_size=32, force=True) ioclass_config_path = "/tmp/standby_cli_neg_mngt_test_ioclass_config_file.csv" TestRun.executor.run(f"rm -rf {ioclass_config_path}") random_ioclass_config = IoClass.generate_random_ioclass_list(5) IoClass.save_list_to_config_file( random_ioclass_config, ioclass_config_path=ioclass_config_path) blocked_mngt_commands = [ cli.get_param_cutoff_cmd(str(cache_id), "1"), cli.get_param_cleaning_cmd(str(cache_id)), cli.get_param_cleaning_alru_cmd(str(cache_id)), cli.get_param_cleaning_acp_cmd(str(cache_id)), cli.set_param_cutoff_cmd(str(cache_id), "1", threshold="1"), cli.set_param_cutoff_cmd(str(cache_id), policy="never"), cli.set_param_cleaning_cmd(str(cache_id), policy="nop"), cli.set_param_cleaning_alru_cmd(str(cache_id), wake_up="30"), cli.set_param_cleaning_acp_cmd(str(cache_id), wake_up="100"), cli.set_param_promotion_cmd(str(cache_id), policy="nhit"), cli.set_param_promotion_nhit_cmd(str(cache_id), threshold="5"), cli.set_cache_mode_cmd("wb", str(cache_id)), cli.add_core_cmd(str(cache_id), core_device.path), cli.remove_core_cmd(str(cache_id), "1"), cli.remove_inactive_cmd(str(cache_id), "1"), cli.reset_counters_cmd(str(cache_id)), cli.flush_cache_cmd(str(cache_id)), cli.flush_core_cmd(str(cache_id), "1"), cli.load_io_classes_cmd(str(cache_id), ioclass_config_path), cli.list_io_classes_cmd(str(cache_id), output_format="csv"), cli.script_try_add_cmd(str(cache_id), core_device.path, core_id=1), cli.script_purge_cache_cmd(str(cache_id)), cli.script_purge_core_cmd(str(cache_id), "1"), cli.script_detach_core_cmd(str(cache_id), "1"), cli.script_remove_core_cmd(str(cache_id), "1"), ] with TestRun.step( "Try to execute forbidden management commands in standby mode"): for cmd in blocked_mngt_commands: TestRun.LOGGER.info(f"Verify {cmd}") output = TestRun.executor.run_expect_fail(cmd) if not check_stderr_msg(output, operation_forbiden_in_standby): TestRun.LOGGER.error( f'Expected the following error message "{operation_forbiden_in_standby[0]}" ' f'Got "{output.stderr}" instead.') with TestRun.step("Stop the standby instance"): TestRun.executor.run(f"rm -rf {ioclass_config_path}") cache.stop()