Merge "Enable find_disks module to match by filesystem label"

This commit is contained in:
Jenkins 2016-01-29 12:58:08 +00:00 committed by Gerrit Code Review
commit d54e7182e1

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))