def test_boot_environment_listed(root_dataset, capsys): parent_dataset = zfs_utility.dataset_parent(root_dataset) boot_environment = f"zedenv-{datetime.datetime.now().isoformat()}" verbose = True existing = None columns = ["name", "origin", "creation"] zedenv.cli.create.zedenv_create(parent_dataset, root_dataset, boot_environment, verbose, existing, None) be_list = zedenv.cli.list.configure_boot_environment_list( zfs_utility.dataset_parent(root_dataset), columns, True) assert any(f"{boot_environment}" in s for s in be_list)
def test_boot_environment_destroyed(root_dataset, created_boot_environment): parent_dataset = zfs_utility.dataset_parent(root_dataset) verbose = True noconfirm = True noop = True zedenv.cli.destroy.zedenv_destroy(created_boot_environment, parent_dataset, root_dataset, verbose, noconfirm, noop)
def created_boot_environment(root_dataset): parent_dataset = zfs_utility.dataset_parent(root_dataset) boot_environment = f"zedenv-{datetime.datetime.now().isoformat()}" verbose = True existing = None zedenv.cli.create.zedenv_create(parent_dataset, root_dataset, boot_environment, verbose, existing) return boot_environment
def root(mount_dataset: str = "/") -> Optional[str]: """ Root of boot environment datasets, e.g. zpool/ROOT """ mountpoint_dataset = pyzfscmds.system.agnostic.mountpoint_dataset( mount_dataset) if mountpoint_dataset is None: return None return zfs_utility.dataset_parent(mountpoint_dataset)
def test_boot_environment_created(root_dataset): parent_dataset = zfs_utility.dataset_parent(root_dataset) boot_environment = f"zedenv-{datetime.datetime.now().isoformat()}" verbose = True existing = None zedenv.cli.create.zedenv_create(parent_dataset, root_dataset, boot_environment, verbose, existing) assert zfs_utility.dataset_exists(f"{parent_dataset}/{boot_environment}")
def test_is_clone(zpool, test_dataset): dataset = "/".join([zpool, test_dataset]) clone_root = zfs_utility.dataset_parent(dataset) snapname = f"pyzfscmds-{datetime.datetime.now().isoformat()}" pyzfscmds.cmd.zfs_snapshot(dataset, snapname) clone_name = f"{clone_root}/pyzfscmds-{datetime.datetime.now().isoformat()}" pyzfscmds.cmd.zfs_clone(f"{dataset}@{snapname}", clone_name) assert zfs_utility.is_clone(clone_name)
def test_same_boot_environment_created(root_dataset): parent_dataset = zfs_utility.dataset_parent(root_dataset) boot_environment = f"zedenv-{datetime.datetime.now().isoformat()}" verbose = True existing = None zedenv.cli.create.zedenv_create(parent_dataset, root_dataset, boot_environment, verbose, existing) with pytest.raises(SystemExit): zedenv.cli.create.zedenv_create(parent_dataset, root_dataset, boot_environment, verbose, existing)
def create_clone(dataset_name, snapname, properties: list = None, create_parent=False): clone_root = zfs_utility.dataset_parent(dataset_name) clone_suffix = f"pyzfscmds-{datetime.datetime.now().isoformat()}" try: pyzfscmds.cmd.zfs_snapshot(dataset_name, snapname) pyzfscmds.cmd.zfs_clone(f"{dataset_name}@{snapname}", f"{clone_root}/{clone_suffix}", properties=properties, create_parent=create_parent) except (RuntimeError, TypeError): raise return f"{clone_root}/{clone_suffix}"
def test_boot_environment_destroy_fails(root_dataset, created_boot_environment): """ Wont fail if not root on ZFS """ parent_dataset = zfs_utility.dataset_parent(root_dataset) verbose = True noconfirm = True noop = True bootloader = None zedenv.cli.activate.zedenv_activate(created_boot_environment, parent_dataset, verbose, bootloader, noconfirm, noop) with pytest.raises(SystemExit): zedenv.cli.destroy.zedenv_destroy(created_boot_environment, parent_dataset, root_dataset, verbose, noconfirm, noop)
def get_clones(root_dataset: str, existing: Optional[str]) -> list: parent_dataset = zfs_utility.dataset_parent(root_dataset) clone_data = [] list_dataset = None # Dataset we are listing clones under if existing: existing_dataset = f"{parent_dataset}/{existing}" if zfs_utility.is_snapshot(existing_dataset): snap_suffix = existing_dataset.rsplit('@', 1)[-1] list_dataset = zfs_utility.snapshot_parent_dataset( existing_dataset) else: if zfs_utility.dataset_exists(existing_dataset): snap_suffix = zedenv.lib.be.snapshot(existing, parent_dataset) list_dataset = f"{parent_dataset}/{existing}" else: ZELogger.log( { "level": "EXCEPTION", "message": f"The dataset {existing_dataset} doesn't exist." }, exit_on_error=True) else: snap_suffix = zedenv.lib.be.snapshot( zfs_utility.dataset_child_name(root_dataset), parent_dataset) list_dataset = root_dataset clones = None try: clones = pyzfscmds.cmd.zfs_list(list_dataset, recursive=True, columns=["name"]) except RuntimeError as e: ZELogger.log( { "level": "EXCEPTION", "message": f"Failed to list datasets under {root_dataset}." }, exit_on_error=True) for c in [line for line in clones.splitlines()]: if zfs_utility.dataset_exists(f"{c}@{snap_suffix}", zfs_type="snapshot"): if c == list_dataset: child = "" else: child = zfs_utility.dataset_child_name(c) clone_props = zedenv.lib.be.properties(c, [["canmount", "off"]]) clone_data.append({ "snapshot": f"{c}@{snap_suffix}", "properties": clone_props, "datasetchild": child }) else: ZELogger.log( { "level": "EXCEPTION", "message": f"Failed to find snapshot {c}@{snap_suffix}." }, exit_on_error=True) return clone_data
def test_dataset_parent(): assert zfs_utility.dataset_parent( test_dataset_names['root'] ) == test_dataset_names['boot_environment_root']