def test_load_after_clean_shutdown(reboot_type, cache_mode, filesystem): """ title: Planned system shutdown test. description: Test for data consistency after clean system shutdown. pass_criteria: - DUT should reboot successfully. - Checksum of file on core device should be the same before and after reboot. """ with TestRun.step("Prepare CAS device."): cache_disk = TestRun.disks['cache'] cache_disk.create_partitions([Size(1, Unit.GibiByte)]) cache_dev = cache_disk.partitions[0] core_dev = TestRun.disks['core'] cache = casadm.start_cache(cache_dev, cache_mode, force=True) core = cache.add_core(core_dev) core.create_filesystem(filesystem, blocksize=int(Size(1, Unit.Blocks4096))) core.mount(mount_point) with TestRun.step("Create file on cache and count its checksum."): test_file = File(os.path.join(mount_point, "test_file")) Dd()\ .input("/dev/zero")\ .output(test_file.full_path)\ .block_size(Size(1, Unit.KibiByte))\ .count(1024)\ .run() test_file.refresh_item() test_file_md5 = test_file.md5sum() sync() drop_caches(DropCachesMode.ALL) with TestRun.step("Reset platform."): if reboot_type == "soft": TestRun.executor.reboot() else: power_control = TestRun.plugin_manager.get_plugin('power_control') power_control.power_cycle() with TestRun.step("Load cache."): casadm.load_cache(cache_dev) core.mount(mount_point) with TestRun.step("Check file md5sum."): test_file.refresh_item() if test_file_md5 != test_file.md5sum(): TestRun.LOGGER.error( "Checksums does not match - file is corrupted.") else: TestRun.LOGGER.info("File checksum is correct.") with TestRun.step("Remove test file."): test_file.remove()
def test_cas_startup(cache_mode, filesystem): """ title: Test for starting CAS on system startup. pass_criteria: - System does not crash. - CAS modules are loaded before partitions are mounted. - Cache is loaded before partitions are mounted. - Exported object is mounted after startup is complete. """ with TestRun.step( "Prepare partitions for cache (200MiB) and for core (400MiB)"): cache_dev = TestRun.disks['cache'] cache_dev.create_partitions([Size(200, Unit.MebiByte)]) cache_part = cache_dev.partitions[0] core_dev = TestRun.disks['core'] core_dev.create_partitions([Size(400, Unit.MebiByte)]) core_part = core_dev.partitions[0] with TestRun.step("Start cache and add core"): cache = casadm.start_cache(cache_part, cache_mode, force=True) core = cache.add_core(core_part) with TestRun.step("Create and mount filesystem"): core.create_filesystem(filesystem) core.mount(mountpoint) with TestRun.step("Create test file and calculate md5 checksum"): (Dd().input("/dev/urandom").output(filepath).count(16).block_size( Size(1, Unit.MebiByte)).run()) test_file = File(filepath) md5_before = test_file.md5sum() with TestRun.step("Add mountpoint fstab and create intelcas.conf"): fstab.add_mountpoint(device=core, mount_point=mountpoint, fs_type=filesystem) InitConfig.create_init_config_from_running_configuration() with TestRun.step("Reboot"): TestRun.executor.reboot() with TestRun.step("Check if cache is started"): caches = list(get_caches()) if len(caches) != 1: TestRun.fail(f"Expected one cache, got {len(caches)}!") if caches[0].cache_id != cache.cache_id: TestRun.fail("Invalid cache id!") with TestRun.step("Check if core is added"): cores = list(get_cores(cache.cache_id)) if len(cores) != 1: TestRun.fail(f"Expected one core, got {len(cores)}!") if cores[0].core_id != core.core_id: TestRun.fail("Invalid core id!") with TestRun.step("Check if filesystem is mounted"): if not core.is_mounted(): TestRun.fail("Core is not mounted!") with TestRun.step("Check if md5 checksum matches"): md5_after = test_file.md5sum() if md5_before != md5_after: TestRun.fail("md5 checksum mismatch!") with TestRun.step("Test cleanup"): fstab.remove_mountpoint(device=core) core.unmount() InitConfig.create_default_init_config() casadm.stop_all_caches()
def test_recovery_all_options(cache_mode, cache_line_size, cleaning_policy, filesystem): """ title: Test for recovery after reset with various cache options. description: Verify that unflushed data can be safely recovered after reset. pass_criteria: - CAS recovers successfully after reboot - No data corruption """ with TestRun.step("Prepare cache and core devices."): cache_disk = TestRun.disks['cache'] core_disk = TestRun.disks['core'] cache_disk.create_partitions([Size(200, Unit.MebiByte)]) core_disk.create_partitions([Size(2000, Unit.MebiByte)] * 2) cache_device = cache_disk.partitions[0] core_device = core_disk.partitions[0] test_file = File(os.path.join(mount_point, filename)) file_operation(test_file.full_path, pattern, ReadWrite.write) file_md5 = test_file.md5sum() with TestRun.step(f"Make {filesystem} on core device."): core_device.create_filesystem(filesystem) with TestRun.step("Mount core device."): core_device.mount(mount_point) file_operation(test_file.full_path, other_pattern, ReadWrite.write) os_utils.drop_caches(DropCachesMode.ALL) with TestRun.step("Unmount core device."): core_device.unmount() with TestRun.step( f"Start cache in {cache_mode.name} with given configuration."): cache = casadm.start_cache(cache_device, cache_mode, cache_line_size, force=True) cache.set_cleaning_policy(cleaning_policy) if cleaning_policy == CleaningPolicy.acp: cache.set_params_acp( FlushParametersAcp(wake_up_time=Time(seconds=1))) with TestRun.step("Add core."): core = cache.add_core(core_device) with TestRun.step("Mount CAS device."): core.mount(mount_point) file_operation(test_file.full_path, pattern, ReadWrite.write) with TestRun.step( "Change cache mode to Write-Through without flush option."): cache.set_cache_mode(CacheMode.WT, flush=False) with TestRun.step("Reset platform."): os_utils.sync() core.unmount() TestRun.LOGGER.info( f"Number of dirty blocks in cache: {cache.get_dirty_blocks()}") power_cycle_dut() with TestRun.step("Try to start cache without load and force option."): try: casadm.start_cache(cache_device, cache_mode, cache_line_size) TestRun.fail("Cache started without load or force option.") except Exception: TestRun.LOGGER.info( "Cache did not start without load and force option.") with TestRun.step("Load cache and stop it with flush."): cache = casadm.load_cache(cache_device) cache.stop() with TestRun.step("Check md5sum of tested file on core device."): core_device.mount(mount_point) cas_md5 = test_file.md5sum() core_device.unmount() if cas_md5 == file_md5: TestRun.LOGGER.info( "Source and target file checksums are identical.") else: TestRun.fail("Source and target file checksums are different.")