Skip to content

Commit ecf3d04

Browse files
authored
add support for mount_options (#270)
* add support for mount_options When support for argument validation was added, that support did not include the `mount_options` parameter. This fix adds back that parameter. In addition, the volume module arguments are refactored so that the common volume parameters such as `mount_options` can be specified in one place. This adds a test for the `mount_options` parameter, and adds verification for that parameter. * only checkout mount_options if requested
1 parent d891f26 commit ecf3d04

File tree

3 files changed

+60
-43
lines changed

3 files changed

+60
-43
lines changed

library/blivet.py

Lines changed: 36 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
elements: dict
106106
'''
107107

108+
import copy
108109
import logging
109110
import os
110111
import traceback
@@ -1500,6 +1501,39 @@ def activate_swaps(b, pools, volumes):
15001501

15011502
def run_module():
15021503
# available arguments/parameters that a user can pass
1504+
common_volume_opts = dict(encryption=dict(type='bool'),
1505+
encryption_cipher=dict(type='str'),
1506+
encryption_key=dict(type='str'),
1507+
encryption_key_size=dict(type='int'),
1508+
encryption_luks_version=dict(type='str'),
1509+
encryption_password=dict(type='str'),
1510+
fs_create_options=dict(type='str'),
1511+
fs_label=dict(type='str', default=''),
1512+
fs_type=dict(type='str'),
1513+
mount_options=dict(type='str'),
1514+
mount_point=dict(type='str'),
1515+
name=dict(type='str'),
1516+
raid_level=dict(type='str'),
1517+
size=dict(type='str'),
1518+
state=dict(type='str', default='present', choices=['present', 'absent']),
1519+
type=dict(type='str'))
1520+
volume_opts = copy.deepcopy(common_volume_opts)
1521+
volume_opts.update(
1522+
dict(disks=dict(type='list'),
1523+
raid_device_count=dict(type='int'),
1524+
raid_spare_count=dict(type='int'),
1525+
raid_metadata_version=dict(type='str')))
1526+
pool_volume_opts = copy.deepcopy(common_volume_opts)
1527+
pool_volume_opts.update(
1528+
dict(cached=dict(type='bool'),
1529+
cache_devices=dict(type='list', elements='str', default=list()),
1530+
cache_mode=dict(type='str'),
1531+
cache_size=dict(type='str'),
1532+
compression=dict(type='bool'),
1533+
deduplication=dict(type='bool'),
1534+
raid_disks=dict(type='list', elements='str', default=list()),
1535+
vdo_pool_size=dict(type='str')))
1536+
15031537
module_args = dict(
15041538
pools=dict(type='list', elements='dict',
15051539
options=dict(disks=dict(type='list', elements='str', default=list()),
@@ -1517,49 +1551,9 @@ def run_module():
15171551
state=dict(type='str', default='present', choices=['present', 'absent']),
15181552
type=dict(type='str'),
15191553
volumes=dict(type='list', elements='dict', default=list(),
1520-
options=dict(cached=dict(type='bool'),
1521-
cache_devices=dict(type='list', elements='str', default=list()),
1522-
cache_mode=dict(type='str'),
1523-
cache_size=dict(type='str'),
1524-
compression=dict(type='bool'),
1525-
deduplication=dict(type='bool'),
1526-
encryption=dict(type='bool'),
1527-
encryption_cipher=dict(type='str'),
1528-
encryption_key=dict(type='str'),
1529-
encryption_key_size=dict(type='int'),
1530-
encryption_luks_version=dict(type='str'),
1531-
encryption_password=dict(type='str'),
1532-
fs_create_options=dict(type='str'),
1533-
fs_label=dict(type='str', default=''),
1534-
fs_type=dict(type='str'),
1535-
mount_point=dict(type='str'),
1536-
name=dict(type='str'),
1537-
raid_disks=dict(type='list', elements='str', default=list()),
1538-
raid_level=dict(type='str'),
1539-
size=dict(type='str'),
1540-
state=dict(type='str', default='present', choices=['present', 'absent']),
1541-
type=dict(type='str'),
1542-
vdo_pool_size=dict(type='str'))))),
1554+
options=pool_volume_opts))),
15431555
volumes=dict(type='list', elements='dict',
1544-
options=dict(disks=dict(type='list'),
1545-
encryption=dict(type='bool'),
1546-
encryption_cipher=dict(type='str'),
1547-
encryption_key=dict(type='str'),
1548-
encryption_key_size=dict(type='int'),
1549-
encryption_luks_version=dict(type='str'),
1550-
encryption_password=dict(type='str'),
1551-
fs_create_options=dict(type='str'),
1552-
fs_label=dict(type='str', default=''),
1553-
fs_type=dict(type='str'),
1554-
mount_point=dict(type='str'),
1555-
name=dict(type='str'),
1556-
raid_level=dict(type='str'),
1557-
raid_device_count=dict(type='int'),
1558-
raid_spare_count=dict(type='int'),
1559-
raid_metadata_version=dict(type='str'),
1560-
size=dict(type='str'),
1561-
state=dict(type='str', default='present', choices=['present', 'absent']),
1562-
type=dict(type='str'))),
1556+
options=volume_opts),
15631557
packages_only=dict(type='bool', required=False, default=False),
15641558
disklabel_type=dict(type='str', required=False, default=None),
15651559
safe_mode=dict(type='bool', required=False, default=True),

tests/test-verify-volume-fstab.yml

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@
1111
storage_test_fstab_expected_mount_point_matches: "{{ 1
1212
if (_storage_test_volume_present and storage_test_volume.mount_point and storage_test_volume.mount_point.startswith('/'))
1313
else 0 }}"
14+
storage_test_fstab_mount_options_matches: "{{ storage_test_fstab.stdout_lines |
15+
map('regex_search', ' ' + storage_test_volume.mount_point + ' .* ' + storage_test_volume.mount_options + ' +') |
16+
select('string')|list if (
17+
storage_test_volume.mount_options|d('none',true) != 'none'
18+
and storage_test_volume.mount_point|d('none',true) != 'none'
19+
) else [] }}"
20+
storage_test_fstab_expected_mount_options_matches: "{{ 1
21+
if (_storage_test_volume_present and storage_test_volume.mount_options)
22+
else 0 }}"
1423

1524
# device id
1625
- name: Verify that the device identifier appears in /etc/fstab
@@ -26,11 +35,22 @@
2635
msg: "Expected number ({{ storage_test_fstab_expected_mount_point_matches }}) of
2736
entries with volume '{{ storage_test_volume.name }}' mount point not found in /etc/fstab."
2837

29-
# todo: options
38+
# mount options
39+
- name: Verify mount_options
40+
assert:
41+
that: storage_test_fstab_mount_options_matches|length == storage_test_fstab_expected_mount_options_matches|int
42+
msg: "Expected number ({{ storage_test_fstab_expected_mount_options_matches }}) of
43+
entries with volume '{{ storage_test_volume.name }}' mount options not found in /etc/fstab."
44+
when:
45+
- __storage_verify_mount_options | d(false)
46+
- "'mount_options' in storage_test_volume"
47+
- "'mount_point' in storage_test_volume"
3048

3149
- name: Clean up variables
3250
set_fact:
3351
storage_test_fstab_id_matches: null
3452
storage_test_fstab_mount_point_matches: null
3553
storage_test_fstab_expected_id_matches: null
3654
storage_test_fstab_expected_mount_point_matches: null
55+
storage_test_fstab_mount_options_matches: null
56+
storage_test_fstab_expected_mount_options_matches: null

tests/tests_misc.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,11 @@
189189
fs_type: 'ext4'
190190
fs_create_options: '-F'
191191
mount_point: "{{ mount_location }}"
192+
mount_options: rw,noatime,defaults
192193

193194
- include_tasks: verify-role-results.yml
195+
vars:
196+
__storage_verify_mount_options: true
194197

195198
- name: Remove the disk volume created above
196199
include_role:

0 commit comments

Comments
 (0)