Enable find_disks module to match by filesystem label

Currently the only consumer of ansible find_disks module is Ceph. And
Ceph OSD deployment in kolla uses GPT partition label to detect and
identify disks for Ceph OSD use. This is not always true for all the
deployment.

The change here extended the find_disks module by:
- adding `name` argument to find disk by either partition name or
  filesystem label matching
- `partition_name` argument now becomes an alias to `name`
- adding `match_mode` argument to allow prefix matching. It is used for
  swift disk detection.
- return `fs_label` key / value in result for disk mounting purpose

Change-Id: I9c93400c1826f5148acf09e9fbe555e358dfdfcc
Partially-Implements: blueprint swift-physical-disk
This commit is contained in:
Qiu Yu 2016-01-25 17:09:55 -07:00 committed by Sam Yaple
parent 2361fddcff
commit 428b484397
1 changed files with 59 additions and 17 deletions

View File

@ -20,16 +20,24 @@
DOCUMENTATION = '''
---
module: find_disks
short_description: Return list of devices containing a specfied label
short_description: Return list of devices containing a specfied name or label
description:
- This will return a list of all devices with a GPT partition label with
the name specified.
- This will return a list of all devices with either GPT partition name
or filesystem label of the name specified.
options:
partition_name:
match_mode:
description:
- Partition name
- Label match mode, either strict or prefix
default: 'strict'
required: False
choices: [ "strict", "prefix" ]
type: str
name:
description:
- Partition name or filesystem label
required: True
type: bool
type: str
aliases: [ 'partition_name' ]
author: Sam Yaple
'''
@ -37,9 +45,23 @@ EXAMPLES = '''
- hosts: ceph-osd
tasks:
- name: Return all valid formated devices with the name KOLLA_CEPH_OSD
ceph_osd_list:
partition_name: 'KOLLA_CEPH_OSD'
find_disks:
name: 'KOLLA_CEPH_OSD'
register: osds
- hosts: swift-object-server
tasks:
- name: Return all valid devices with the name KOLLA_SWIFT
find_disks:
name: 'KOLLA_SWIFT'
register: swift_disks
- hosts: swift-object-server
tasks:
- name: Return all valid devices with wildcard name 'swift_d*'
find_disks:
name: 'swift_d' match_mode: 'prefix'
register: swift_disks
'''
import json
@ -48,21 +70,41 @@ import pyudev
def main():
argument_spec = dict(
partition_name=dict(required=True, type='str')
match_mode=dict(required=False, choices=['strict', 'prefix'],
default='strict'),
name=dict(aliases=['partition_name'], required=True, type='str')
)
module = AnsibleModule(argument_spec)
partition_name = module.params.get('partition_name')
match_mode = module.params.get('match_mode')
name = module.params.get('name')
def is_dev_matched_by_name(dev, name):
if dev.get('DEVTYPE', '') == 'partition':
dev_name = dev.get('ID_PART_ENTRY_NAME', '')
else:
dev_name = dev.get('ID_FS_LABEL', '')
if match_mode == 'strict':
return dev_name == name
elif match_mode == 'prefix':
return dev_name.startswith(name)
else:
return False
try:
ret = list()
ct = pyudev.Context()
for dev in ct.list_devices(subsystem='block', DEVTYPE='partition'):
if dev.get('ID_PART_ENTRY_NAME') == partition_name:
fs_uuid = dev.get('ID_FS_UUID')
if not fs_uuid:
fs_uuid = ''
dev_parent = dev.find_parent('block').device_node
ret.append({'device': dev_parent, 'fs_uuid': fs_uuid})
for dev in ct.list_devices(subsystem='block'):
if is_dev_matched_by_name(dev, name):
fs_uuid = dev.get('ID_FS_UUID', '')
fs_label = dev.get('ID_FS_LABEL', '')
if dev.get('DEVTYPE', '') == 'partition':
device_node = dev.find_parent('block').device_node
else:
device_node = dev.device_node
ret.append({'device': device_node,
'fs_uuid': fs_uuid,
'fs_label': fs_label})
module.exit_json(disks=json.dumps(ret))
except Exception as e:
module.exit_json(failed=True, msg=repr(e))