def test_kedr_memleak_load_cas_module(module, unload_modules, install_kedr):
    """
    title: Loading modules with kedr started with 'memleak' configuration
    description: Load and unload modules with kedr started to watch for memory leaks
    pass_criteria:
      - No memory leaks observed after loading and unloading module
    """
    with TestRun.step(f"Starting kedr against {module}"):
        Kedr.start(module.value)

    with TestRun.step(f"Loading {module}"):
        os_utils.load_kernel_module(module.value)

    with TestRun.step(f"Unloading {module}"):
        os_utils.unload_kernel_module(module.value,
                                      os_utils.ModuleRemoveMethod.modprobe)

    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 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()
示例#3
0
def unload_all_cas_modules():
    os_utils.unload_kernel_module(CasModule.cache.value,
                                  os_utils.ModuleRemoveMethod.rmmod)
    os_utils.unload_kernel_module(CasModule.disk.value,
                                  os_utils.ModuleRemoveMethod.rmmod)
示例#4
0
def reload_all_cas_modules():
    os_utils.unload_kernel_module(CasModule.cache.value, ModuleRemoveMethod.modprobe)
    os_utils.load_kernel_module(CasModule.cache.value)
示例#5
0
 def teardown(self):
     unload_output = os_utils.unload_kernel_module(self.module_name)
     if unload_output.exit_code != 0 \
             and "is not currently loaded" not in unload_output.stderr:
         TestRun.LOGGER.info(
             f"Failed to unload {self.module_name} module\n{unload_output}")
示例#6
0
 def teardown(self):
     if os_utils.is_kernel_module_loaded(self.module_name):
         os_utils.unload_kernel_module(self.module_name)