diff --git a/library/blivet.py b/library/blivet.py index eb8bb11..e927121 100644 --- a/library/blivet.py +++ b/library/blivet.py @@ -104,6 +104,7 @@ try: from blivet3.formats import get_format from blivet3.partitioning import do_partitioning from blivet3.size import Size + from blivet3.udev import trigger from blivet3.util import set_up_logging BLIVET_PACKAGE = 'blivet3' except ImportError: @@ -116,6 +117,7 @@ except ImportError: from blivet.formats import get_format from blivet.partitioning import do_partitioning from blivet.size import Size + from blivet.udev import trigger from blivet.util import set_up_logging BLIVET_PACKAGE = 'blivet' except ImportError: @@ -821,7 +823,10 @@ class BlivetPool(BlivetBase): def _look_up_disks(self): """ Look up the pool's disks in blivet's device tree. """ - if not self._pool['disks']: + if self._disks: + return + + if not self._device and not self._pool['disks']: raise BlivetAnsibleError("no disks specified for pool '%s'" % self._pool['name']) elif not isinstance(self._pool['disks'], list): raise BlivetAnsibleError("pool disks must be specified as a list") @@ -832,7 +837,7 @@ class BlivetPool(BlivetBase): if device is not None: # XXX fail if any disk isn't resolved? disks.append(device) - if self._pool['disks'] and not disks: + if self._pool['disks'] and not self._device and not disks: raise BlivetAnsibleError("unable to resolve any disks specified for pool '%s' (%s)" % (self._pool['name'], self._pool['disks'])) self._disks = disks @@ -974,9 +979,9 @@ class BlivetPool(BlivetBase): """ Schedule actions to configure this pool according to the yaml input. """ global safe_mode # look up the device - self._look_up_disks() self._look_up_device() self._apply_defaults() + self._look_up_disks() # schedule destroy if appropriate, including member type change if not self.ultimately_present: @@ -999,6 +1004,7 @@ class BlivetPartitionPool(BlivetPool): return self._device.partitionable def _look_up_device(self): + self._look_up_disks() self._device = self._disks[0] def _create(self): @@ -1354,6 +1360,13 @@ def run_module(): actions.append(action) + def ensure_udev_update(action): + if action.is_create: + sys_path = action.device.path + if os.path.islink(sys_path): + sys_path = os.readlink(action.device.path) + trigger(action='change', subsystem='block', name=os.path.basename(sys_path)) + def action_dict(action): return dict(action=action.type_desc_str, fs_type=action.format.type if action.is_format else None, @@ -1395,6 +1408,7 @@ def run_module(): if scheduled: # execute the scheduled actions, committing changes to disk callbacks.action_executed.add(record_action) + callbacks.action_executed.add(ensure_udev_update) try: b.devicetree.actions.process(devices=b.devicetree.devices, dry_run=module.check_mode) except Exception as e: diff --git a/tests/tests_existing_lvm_pool.yml b/tests/tests_existing_lvm_pool.yml new file mode 100644 index 0000000..854ac0d --- /dev/null +++ b/tests/tests_existing_lvm_pool.yml @@ -0,0 +1,54 @@ +--- +- hosts: all + become: true + vars: + mount_location: '/opt/test1' + volume_group_size: '5g' + volume_size: '4g' + pool_name: foo + + tasks: + - include_role: + name: linux-system-roles.storage + + - include_tasks: get_unused_disk.yml + vars: + min_size: "{{ volume_group_size }}" + max_return: 1 + + - name: Create one LVM logical volume under one volume group + include_role: + name: linux-system-roles.storage + vars: + storage_pools: + - name: "{{ pool_name }}" + disks: "{{ unused_disks }}" + volumes: + - name: test1 + size: "{{ volume_size }}" + + - include_tasks: verify-role-results.yml + + - name: Create another volume in the existing pool, identified only by name. + include_role: + name: linux-system-roles.storage + vars: + storage_pools: + - name: "{{ pool_name }}" + volumes: + - name: newvol + size: '2 GiB' + fs_type: ext4 + fs_label: newvol + + - include_tasks: verify-role-results.yml + + - name: Clean up. + include_role: + name: linux-system-roles.storage + vars: + storage_pools: + - name: "{{ pool_name }}" + state: absent + + - include_tasks: verify-role-results.yml