Exemplo n.º 1
0
    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()
Exemplo n.º 2
0
 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()
Exemplo n.º 3
0
    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}"
            )
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
    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()
Exemplo n.º 7
0
 def _umount_dataset(self, dataset: libzfs.ZFSDataset) -> None:
     if dataset.mountpoint is not None:
         dataset.umount()
Exemplo n.º 8
0
 def _umount_dataset(self, dataset: libzfs.ZFSDataset) -> None:
     if dataset.mountpoint is not None:
         dataset.umount()