diff --git a/docker/kolla-ansible/find_disks.py b/docker/kolla-ansible/find_disks.py index d5761ceb0c..6ebf2b6a27 100644 --- a/docker/kolla-ansible/find_disks.py +++ b/docker/kolla-ansible/find_disks.py @@ -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))