Exemplo n.º 1
0
    def required_packages(self):
        packages = list()
        if not self.ultimately_present:
            return packages

        if self.__class__.blivet_device_class is not None:
            packages.extend(self.__class__.blivet_device_class._packages)

        fmt = get_format(self._volume['fs_type'])
        packages.extend(fmt.packages)
        if self._volume['encryption']:
            packages.extend(get_format('luks').packages)
        return packages
Exemplo n.º 2
0
    def _manage_one_encryption(self, device):
        ret = device
        # Make sure to handle adjusting both existing stacks and future stacks.
        if device == device.raw_device and self._spec_dict['encryption']:
            # add luks
            luks_name = "luks-%s" % device._name
            if not device.format.exists:
                fmt = device.format
            else:
                fmt = get_format(None)

            self._blivet.format_device(
                device,
                get_format(
                    "luks",
                    name=luks_name,
                    cipher=self._spec_dict.get('encryption_cipher'),
                    key_size=self._spec_dict.get('encryption_key_size'),
                    luks_version=self._spec_dict.get(
                        'encryption_luks_version'),
                    passphrase=self._spec_dict.get('encryption_passphrase')
                    or None,
                    key_file=self._spec_dict.get('encryption_key_file')
                    or None))

            if not device.format.has_key:
                raise BlivetAnsibleError(
                    "encrypted %s '%s' missing key/passphrase" %
                    (self._type, self._spec_dict['name']))

            luks_device = devices.LUKSDevice(luks_name,
                                             fmt=fmt,
                                             parents=[device])
            self._blivet.create_device(luks_device)
            ret = luks_device
        elif device != device.raw_device and not self._spec_dict['encryption']:
            # remove luks
            if not device.format.exists:
                fmt = device.format
            else:
                fmt = get_format(None)

            ret = self._device.raw_device
            self._blivet.destroy_device(device)
            if fmt.type is not None:
                self._blivet.format_device(ret, fmt)

        # XXX: blivet has to store cipher, key_size, luks_version for existing before we
        #      can support re-encrypting based on changes to those parameters

        return ret
Exemplo n.º 3
0
    def _create_members(self):
        """ Schedule actions as needed to ensure pool member devices exist. """
        members = list()

        for disk in self._disks:
            if not disk.isleaf or disk.format.type is not None:
                if safe_mode:
                    raise BlivetAnsibleError("cannot remove existing formatting and/or devices on disk '%s' (pool '%s') in safe mode" % (disk.name, self._pool['name']))
                else:
                    self._blivet.devicetree.recursive_remove(disk)

            if use_partitions:
                label = get_format("disklabel", device=disk.path)
                self._blivet.format_device(disk, label)
                member = self._blivet.new_partition(parents=[disk], size=Size("256MiB"), grow=True)
                self._blivet.create_device(member)
            else:
                member = disk

            if self._is_raid:
                self._blivet.format_device(member, fmt=get_format("mdmember"))
            else:
                self._blivet.format_device(member, self._get_format())
            members.append(member)


        if self._is_raid:
            raid_name = "%s-1" % self._pool['name']
            raid_level = self._pool['raid_level']

            try:
                raid_array = self._blivet.new_mdarray(name=raid_name, level=raid_level,
                                                  member_devices=len(members),
                                                  total_devices=(len(members)),
                                                  parents=members,
                                                  fmt=self._get_format())
            except ValueError as e:
                raise BlivetAnsibleError("cannot create RAID '%s': %s" % (raid_name, str(e)))

            self._blivet.create_device(raid_array)
            result = [raid_array]
        else:
            result = members

        if use_partitions:
            try:
                do_partitioning(self._blivet)
            except Exception:
                raise BlivetAnsibleError("failed to allocate partitions for pool '%s'" % self._pool['name'])

        return result
Exemplo n.º 4
0
    def _get_format(self):
        fmt = get_format("lvmpv")
        if not fmt.supported or not fmt.formattable:
            raise BlivetAnsibleError(
                "required tools for managing LVM are missing")

        return fmt
Exemplo n.º 5
0
    def _create_members(self):
        """ Schedule actions as needed to ensure pool member devices exist. """
        members = list()
        for disk in self._disks:
            if not disk.isleaf or disk.format.type is not None:
                if safe_mode and not packages_only:
                    raise BlivetAnsibleError("cannot remove existing formatting and/or devices on disk '%s' (pool '%s') in safe mode" % (disk.name, self._pool['name']))
                else:
                    self._blivet.devicetree.recursive_remove(disk)

            if use_partitions:
                label = get_format("disklabel", device=disk.path)
                self._blivet.format_device(disk, label)
                member = self._blivet.new_partition(parents=[disk], size=Size("256MiB"), grow=True)
                self._blivet.create_device(member)
            else:
                member = disk

            self._blivet.format_device(member, self._get_format())
            members.append(member)

        if use_partitions:
            try:
                do_partitioning(self._blivet)
            except Exception:
                raise BlivetAnsibleError("failed to allocation partitions for pool '%s'" % self._pool['name'])

        return members
    def _create(self):
        if self._device.format.type != "disklabel" or \
           self._device.format.label_type != disklabel_type:
            self._blivet.devicetree.recursive_remove(self._device, remove_device=False)

            label = get_format("disklabel", device=self._device.path, label_type=disklabel_type)
            self._blivet.format_device(self._device, label)
    def _create_members(self):
        """ Schedule actions as needed to ensure pool member devices exist. """
        members = list()
        for disk in self._disks:
            if not disk.isleaf:
                self._blivet.devicetree.recursive_remove(disk)

            if use_partitions:
                label = get_format("disklabel", device=disk.path)
                self._blivet.format_device(disk, label)
                member = self._blivet.new_partition(parents=[disk], size=Size("256MiB"), grow=True)
                self._blivet.create_device(member)
            else:
                member = disk

            self._blivet.format_device(member, self._get_format())
            members.append(member)

        if use_partitions:
            try:
                do_partitioning(self._blivet)
            except Exception:
                # FAIL: problem allocating partitions for pool backing devices
                raise BlivetAnsibleError("failed to allocation partitions for pool '%s'" % self._pool['name'])

        return members
Exemplo n.º 8
0
    def required_packages(self):
        packages = list()
        if self.ultimately_present and self.__class__.blivet_device_class is not None:
            packages.extend(self.__class__.blivet_device_class._packages)

        if self._pool['encryption']:
            packages.extend(get_format('luks').packages)

        return packages
Exemplo n.º 9
0
    def _get_format(self):
        """ Return a blivet.formats.DeviceFormat instance for this volume. """
        fmt = get_format(self._volume['fs_type'],
                         mountpoint=self._volume.get('mount_point'),
                         label=self._volume['fs_label'],
                         options=self._volume['fs_create_options'])
        if not fmt.supported or not fmt.formattable:
            raise BlivetAnsibleError("required tools for file system '%s' are missing" % self._volume['fs_type'])

        return fmt
Exemplo n.º 10
0
    def _create(self):
        if self._device.format.type != "disklabel" or \
           self._device.format.label_type != disklabel_type:
            if safe_mode and not packages_only:
                raise BlivetAnsibleError("cannot remove existing formatting and/or devices on disk '%s' "
                                         "(pool '%s') in safe mode" % (self._device.name, self._pool['name']))
            else:
                self._blivet.devicetree.recursive_remove(self._device, remove_device=False)

            label = get_format("disklabel", device=self._device.path, label_type=disklabel_type)
            self._blivet.format_device(self._device, label)
Exemplo n.º 11
0
    def _create_raid_members(self, member_names):
        members = list()

        for member_name in member_names:
            member_disk = self._blivet.devicetree.resolve_device(member_name)
            if member_disk is not None:
                if use_partitions:
                    # create partition table
                    label = get_format("disklabel", device=member_disk.path)
                    self._blivet.format_device(member_disk, label)

                    # create new partition
                    member = self._blivet.new_partition(parents=[member_disk], grow=True)
                    self._blivet.create_device(member)
                    self._blivet.format_device(member, fmt=get_format("mdmember"))
                    members.append(member)
                else:
                    self._blivet.format_device(member_disk, fmt=get_format("mdmember"))
                    members.append(member_disk)

        return members
Exemplo n.º 12
0
    def _reformat(self):
        """ Schedule actions as needed to ensure the volume is formatted as specified. """
        fmt = self._get_format()
        if self._device.format.type == fmt.type:
            return

        if safe_mode and (self._device.format.type is not None or
                          self._device.format.name != get_format(None).name):
            raise BlivetAnsibleError(
                "cannot remove existing formatting on volume '%s' in safe mode"
                % self._volume['name'])

        if self._device.format.status and (self._device.format.mountable or
                                           self._device.format.type == "swap"):
            self._device.format.teardown()
        self._blivet.format_device(self._device, fmt)
Exemplo n.º 13
0
    def _reformat(self):
        """ Schedule actions as needed to ensure the volume is formatted as specified. """
        global packages_only

        fmt = self._get_format()
        if self._device.format.type == fmt.type:
            return

        if safe_mode and (self._device.format.type is not None or self._device.format.name != get_format(None).name) and \
           not packages_only:
            raise BlivetAnsibleError("cannot remove existing formatting on volume '%s' in safe mode" % self._volume['name'])

        if self._device.format.status and not packages_only:
            self._device.format.teardown()
        if not self._device.isleaf:
            self._blivet.devicetree.recursive_remove(self._device, remove_device=False)
        self._blivet.format_device(self._device, fmt)