def delete_dataset_recursive(self, dataset: libzfs.ZFSDataset, delete_snapshots: bool = True, delete_origin_snapshot: bool = True) -> None: for child in dataset.children: self.delete_dataset_recursive(child) if dataset.mountpoint is not None: if self.logger is not None: self.logger.spam(f"Unmounting {dataset.name}") dataset.umount() if delete_snapshots is True: for snapshot in dataset.snapshots: if self.logger is not None: self.logger.verbose(f"Deleting snapshot {snapshot.name}") snapshot.delete() origin = None if delete_origin_snapshot is True: origin_property = dataset.properties["origin"] if origin_property.value != "": origin = origin_property if self.logger is not None: self.logger.verbose(f"Deleting dataset {dataset.name}") dataset.delete() if origin is not None: if self.logger is not None: self.logger.verbose(f"Deleting snapshot {origin}") origin_snapshot = self.get_snapshot(origin.value) origin_snapshot.delete()
def _promote( self, dataset: libzfs.ZFSDataset, logger: typing.Optional['iocage.Logger.Logger'] = None) -> None: if logger is not None: logger.verbose(f"Promoting ZFS dataset {dataset.name}") dataset.promote()
def clone_dataset( self, source: libzfs.ZFSDataset, target: str, delete_existing: bool=False ) -> None: """Clone a ZFSDataset from a source to a target dataset name.""" # delete target dataset if it already exists try: existing_dataset = self.get_dataset(target) except libzfs.ZFSException: pass else: if delete_existing is False: raise libioc.errors.DatasetExists( dataset_name=target ) self.logger.verbose( f"Deleting existing dataset {target}" ) if existing_dataset.mountpoint is not None: existing_dataset.umount() existing_dataset.delete() del existing_dataset snapshot_name = append_snapshot_datetime("clone") snapshot_identifier = f"{source.name}@{snapshot_name}" try: snapshot = self.get_snapshot(snapshot_identifier) delete_snapshot = False except libzfs.ZFSException: source.snapshot(snapshot_identifier, recursive=True) snapshot = self.get_snapshot(snapshot_identifier) delete_snapshot = True snapshot_error = None try: self.clone_snapshot(snapshot, target) except libzfs.ZFSException as e: snapshot_error = e if delete_snapshot is True: snapshot.delete(recursive=True) if snapshot_error is not None: raise libioc.errors.SnapshotCreation( reason=str(snapshot_error), logger=self.logger ) if self._has_logger: self.logger.verbose( f"Successfully cloned {source} to {target}" )
def _set_zfs_property(self, dataset: libzfs.ZFSDataset, name: str, value: str) -> None: current_value = self._get_dataset_property(dataset, name) if current_value != value: self.logger.verbose(f"Set ZFS property {name}='{value}'" f" on dataset '{dataset.name}'") dataset.properties[name] = libzfs.ZFSUserProperty(value)
def _set_zfs_property( self, dataset: libzfs.ZFSDataset, name: str, value: str ) -> None: current_value = self._get_dataset_property(dataset, name) if current_value != value: self.logger.verbose( f"Set ZFS property {name}='{value}'" f" on dataset '{dataset.name}'" ) dataset.properties[name] = libzfs.ZFSUserProperty(value)
def delete_dataset_recursive( self, dataset: libzfs.ZFSDataset, delete_snapshots: bool=True, delete_origin_snapshot: bool=False ) -> None: """Recursively delete a dataset.""" for child in dataset.children: self.delete_dataset_recursive(child) if dataset.mountpoint is not None: if self._has_logger: self.logger.spam(f"Unmounting {dataset.name}") dataset.umount() if delete_snapshots is True: for snapshot in dataset.snapshots: if self._has_logger: self.logger.verbose( f"Deleting snapshot {snapshot.name}" ) snapshot.delete(recursive=True) origin = None if delete_origin_snapshot is True: origin_property = dataset.properties["origin"] if origin_property.value != "": origin = origin_property if self._has_logger: self.logger.verbose(f"Deleting dataset {dataset.name}") try: dataset.umount() self.logger.spam(f"Dataset {dataset.name} unmounted") except libzfs.ZFSException: pass dataset.delete() if origin is not None: if self._has_logger: self.logger.verbose(f"Deleting snapshot {origin}") origin_snapshot = self.get_snapshot(origin.value) origin_snapshot.delete()
def _umount_dataset(self, dataset: libzfs.ZFSDataset) -> None: if dataset.mountpoint is not None: dataset.umount()
def _umount_dataset(self, dataset: libzfs.ZFSDataset) -> None: if dataset.mountpoint is not None: dataset.umount()