def test_kedr_basic_io_raw(module, unload_modules, install_kedr): """ title: Basic IO test with kedr started with memory leaks profile description: | Load CAS modules, start kedr against one of them, start cache and add core, run simple 4 minute random IO, stop cache and unload modules pass_criteria: - No memory leaks observed """ with TestRun.step("Preparing cache device"): cache_device = TestRun.disks['cache'] cache_device.create_partitions([Size(500, Unit.MebiByte)]) cache_part = cache_device.partitions[0] with TestRun.step("Preparing core device"): core_device = TestRun.disks['core'] core_device.create_partitions([Size(1, Unit.GibiByte)]) core_part = core_device.partitions[0] with TestRun.step("Unload CAS modules if needed"): if os_utils.is_kernel_module_loaded(module.value): cas_module.unload_all_cas_modules() with TestRun.step(f"Starting kedr against {module.value}"): Kedr.start(module.value) with TestRun.step(f"Loading CAS modules"): os_utils.load_kernel_module(cas_module.CasModule.cache.value) with TestRun.step("Starting cache"): cache = casadm.start_cache(cache_part, force=True) with TestRun.step("Adding core"): core = cache.add_core(core_dev=core_part) with TestRun.step(f"Running IO"): (Fio().create_command() .io_engine(IoEngine.libaio) .run_time(timedelta(minutes=4)) .time_based() .read_write(ReadWrite.randrw) .target(f"{core.path}") .direct() ).run() with TestRun.step("Stopping cache"): cache.stop() with TestRun.step(f"Unloading CAS modules"): cas_module.unload_all_cas_modules() with TestRun.step(f"Checking for memory leaks for {module.value}"): try: Kedr.check_for_mem_leaks(module.value) except Exception as e: TestRun.LOGGER.error(f"{e}") with TestRun.step(f"Stopping kedr"): Kedr.stop()
def test_insufficient_memory_for_cas_module(): """ title: Negative test of ability to load OpenCAS kernel module with insufficient memory. description: | Check that OpenCAS kernel module won’t be loaded in case not enough memory is available. pass_criteria: - Loading OpenCAS kernel module returns error. """ with TestRun.step("Disable caching and memory over-committing."): disable_memory_affecting_functions() drop_caches() with TestRun.step("Measure memory usage without OpenCAS module."): if is_kernel_module_loaded(CasModule.cache.value): unload_kernel_module(CasModule.cache.value) unload_kernel_module(CasModule.disk.value) available_mem_before_cas = get_free_memory() with TestRun.step("Load OpenCAS module"): output = load_kernel_module(CasModule.cache.value) if output.exit_code != 0: TestRun.fail("Cannot load OpenCAS module!") with TestRun.step("Measure memory usage with OpenCAS module."): available_mem_with_cas = get_free_memory() memory_used_by_cas = available_mem_before_cas - available_mem_with_cas TestRun.LOGGER.info( f"OpenCAS module uses {memory_used_by_cas.get_value(Unit.MiB):.2f} MiB of DRAM." ) with TestRun.step("Unload OpenCAS module."): unload_kernel_module(CasModule.cache.value) unload_kernel_module(CasModule.disk.value) with TestRun.step("Allocate memory leaving not enough memory for OpenCAS module."): memory_to_leave = memory_used_by_cas * (3 / 4) try: allocate_memory(get_free_memory() - memory_to_leave) except Exception as ex: TestRun.LOGGER.error(f"{ex}") with TestRun.step( "Try to load OpenCAS module and check if error message is printed on failure." ): output = load_kernel_module(CasModule.cache.value) if output.stderr and output.exit_code != 0: memory_left = get_free_memory() TestRun.LOGGER.info( f"Memory left for OpenCAS module: {memory_left.get_value(Unit.MiB):0.2f} MiB." ) TestRun.LOGGER.info(f"Cannot load OpenCAS module as expected.\n{output.stderr}") else: TestRun.LOGGER.error("Loading OpenCAS module successfully finished, but should fail.") with TestRun.step("Set memory options to default"): unmount_ramfs() defaultize_memory_affecting_functions()
def check_if_installed(): TestRun.LOGGER.info("Check if Open-CAS-Linux is installed") output = TestRun.executor.run("which casadm") modules_loaded = os_utils.is_kernel_module_loaded(cas_module.CasModule.cache.value) if output.exit_code == 0 and modules_loaded: TestRun.LOGGER.info("CAS is installed") return True TestRun.LOGGER.info("CAS not installed") return False
def test_kedr_start_cache(module, unload_modules, install_kedr): """ title: Start cache and add core with kedr started against one of CAS modules description: | Load CAS modules, start kedr against one of them, start cache and add core, stop cache and unload modules pass_criteria: - No memory leaks observed """ with TestRun.step("Preparing cache device"): cache_device = TestRun.disks['cache'] cache_device.create_partitions([Size(500, Unit.MebiByte)]) cache_part = cache_device.partitions[0] with TestRun.step("Preparing core device"): core_device = TestRun.disks['core'] core_device.create_partitions([Size(1, Unit.GibiByte)]) core_part = core_device.partitions[0] with TestRun.step("Unload CAS modules if needed"): if os_utils.is_kernel_module_loaded(module.value): cas_module.unload_all_cas_modules() with TestRun.step(f"Starting kedr against {module.value}"): Kedr.start(module.value) with TestRun.step(f"Loading CAS modules"): os_utils.load_kernel_module(cas_module.CasModule.cache.value) with TestRun.step("Starting cache"): cache = casadm.start_cache(cache_part, force=True) with TestRun.step("Adding core"): cache.add_core(core_dev=core_part) with TestRun.step("Stopping cache"): cache.stop() with TestRun.step(f"Unloading CAS modules"): cas_module.unload_all_cas_modules() with TestRun.step(f"Checking for memory leaks for {module}"): try: Kedr.check_for_mem_leaks(module.value) except Exception as e: TestRun.LOGGER.error(f"{e}") with TestRun.step(f"Stopping kedr"): Kedr.stop()
def teardown(self): if os_utils.is_kernel_module_loaded(self.module_name): os_utils.unload_kernel_module(self.module_name)