From: Loic Dachary Date: Mon, 17 Aug 2015 22:04:32 +0000 (+0200) Subject: ceph-disk: rework get_partition_{type,uuid} X-Git-Tag: v9.1.0~252^2~1^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a10141809c41ec3cc4d89803cf346acf4913d83e;p=ceph.git ceph-disk: rework get_partition_{type,uuid} Mimic the get_partition_type implementation after get_partition_uuid and factorize them to reduce the code footprint. The get_partition_type implementation is based on blkid: it is complex and fragile. Since sgdisk is consistently used to create partitions, use it instead. It is already used for get_partition_uuid and there does not seem to be any reason for concern. http://tracker.ceph.com/issues/11881 Refs: #11881 Signed-off-by: Loic Dachary --- diff --git a/src/ceph-disk b/src/ceph-disk index 26c19f2e11b..7226dd51962 100755 --- a/src/ceph-disk +++ b/src/ceph-disk @@ -2587,84 +2587,16 @@ def split_dev_base_partnum(dev): return (base, partnum) def get_partition_type(part): - """ - Get the GPT partition type UUID. If we have an old blkid and can't - get it that way, use sgdisk and use the description instead (and hope - dmcrypt isn't being used). - """ - blkid, _ = command( - [ - 'blkid', - '-p', - '-o', 'udev', - part, - ] - ) - saw_part_entry = False - for line in blkid.splitlines(): - (key, value) = line.split('=') - if key == 'ID_PART_ENTRY_TYPE': - return value - if key == 'ID_PART_ENTRY_SCHEME': - table_type = value - if key.startswith('ID_PART_ENTRY_'): - saw_part_entry = True - - # hmm, is it in fact GPT? - table_type = None - base = get_partition_base(part) - blkid, _ = command( - [ - 'blkid', - '-p', - '-o', 'udev', - base - ] - ) - for line in blkid.splitlines(): - (key, value) = line.split('=') - if key == 'ID_PART_TABLE_TYPE': - table_type = value - if table_type != 'gpt': - return None # not even GPT - - if saw_part_entry: - return None # GPT, and blkid appears to be new, so we're done. - - # bah, fall back to sgdisk. - if 'blkid' not in warned_about: - LOG.warning('Old blkid does not support ID_PART_ENTRY_* fields, trying sgdisk; may not correctly identify ceph volumes with dmcrypt') - warned_about['blkid'] = True - (base, partnum) = split_dev_base_partnum(part) - sgdisk, _ = command( - [ - 'sgdisk', - '-p', - base, - ] - ) - - for line in sgdisk.splitlines(): - m = re.search('\s+(\d+)\s+\d+\s+\d+\s+\S+ \S+B\s+\S+\s+(.*)', line) - if m is not None: - num = m.group(1) - if num != partnum: - continue - desc = m.group(2) - # assume unencrypted ... blkid has failed us :( - if desc == 'ceph data': - return OSD_UUID - if desc == 'ceph journal': - return JOURNAL_UUID - - return None + return get_sgdisk_partition_info(part, 'Partition GUID code: (\S+)') +def get_partition_uuid(part): + return get_sgdisk_partition_info(part, 'Partition unique GUID: (\S+)') -def get_partition_uuid(dev): +def get_sgdisk_partition_info(dev, regexp): (base, partnum) = split_dev_base_partnum(dev) out, _ = command(['sgdisk', '-i', partnum, base]) for line in out.splitlines(): - m = re.match('Partition unique GUID: (\S+)', line) + m = re.match(regexp, line) if m: return m.group(1).lower() return None