Beispiel #1
0
    def get_disk_available_mib(self, device_node):
        # Check that partition table format is GPT.
        # Return 0 if not.
        if not utils.disk_is_gpt(device_node=device_node):
            LOG.debug("Format of disk node %s is not GPT." % device_node)
            return 0

        pvs_command = '{} {}'.format('pvs | grep -w ', device_node)
        pvs_process = subprocess.Popen(pvs_command,
                                       stdout=subprocess.PIPE,
                                       shell=True)
        pvs_output = pvs_process.stdout.read()

        if pvs_output:
            LOG.debug(
                "Disk %s is completely used by a PV => 0 available mib." %
                device_node)
            return 0

        # Get sector size command.
        sector_size_bytes_cmd = '{} {}'.format('blockdev --getss', device_node)

        # Get total free space in sectors command.
        avail_space_sectors_cmd = '{} {} {}'.format(
            'sgdisk -p', device_node, "| grep \"Total free space\"")

        # Get the sector size.
        sector_size_bytes_process = subprocess.Popen(sector_size_bytes_cmd,
                                                     stdout=subprocess.PIPE,
                                                     shell=True)
        sector_size_bytes = sector_size_bytes_process.stdout.read().rstrip()

        # Get the free space.
        avail_space_sectors_process = subprocess.Popen(avail_space_sectors_cmd,
                                                       stdout=subprocess.PIPE,
                                                       shell=True)
        avail_space_sectors_output = avail_space_sectors_process.stdout.read()
        avail_space_sectors = re.findall(
            '\d+', avail_space_sectors_output)[0].rstrip()

        # Free space in MiB.
        avail_space_mib = (int(sector_size_bytes) * int(avail_space_sectors) /
                           (1024**2))

        # Keep 2 MiB for partition table.
        if avail_space_mib >= 2:
            avail_space_mib = avail_space_mib - 2
        else:
            avail_space_mib = 0

        return avail_space_mib
Beispiel #2
0
    def get_partition_info(self,
                           device_path,
                           device_node,
                           skip_gpt_check=False):
        """Obtain all information needed for the partitions on a disk.
        :param:   device_path: the disk's device path
        :param:   device_node: the disk's device node
        :returns: list of partitions"""
        # Check that partition table format is GPT. Return 0 if not.
        if ((not utils.disk_is_gpt(device_node=device_node))
                and (not skip_gpt_check)):
            LOG.debug("Format of disk node %s is not GPT." % device_node)
            return None

        ipartitions = []

        sgdisk_partitions = self.get_sgdisk_info(device_path)
        LOG.debug("PARTED sgdisk_part_info: %s" % str(sgdisk_partitions))

        for partition in sgdisk_partitions:
            partition_number = partition.get('part_number')
            size_mib = partition.get('size_mib')
            if 'nvme' in device_node:
                part_device_node = '{}p{}'.format(device_node,
                                                  partition_number)
            else:
                part_device_node = '{}{}'.format(device_node, partition_number)
            part_device_path = '{}-part{}'.format(device_path,
                                                  partition_number)
            start_mib = partition.get('start_mib')
            end_mib = partition.get('end_mib')

            part_type_guid = partition.get('type_guid').lower()
            part_type_name = partition.get('type_name').replace('.', ' ')
            part_uuid = partition.get('uuid').lower()

            part_attrs = {
                'device_node': part_device_node,
                'device_path': part_device_path,
                'start_mib': start_mib,
                'end_mib': end_mib,
                'size_mib': size_mib,
                'type_guid': part_type_guid,
                'type_name': part_type_name,
                'uuid': part_uuid,
            }

            ipartitions.append(part_attrs)

        return ipartitions