mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
* Fix 2 regex in parted related to parted version string and to parsing partition size output.
* Added changelog fragment.
* Updated changelog as per recommendation.
* Fix the regex matching the parted version. The space character at the end of the string may or may not be always present
* provided sample version output and corrected regex to match
* add/correct changelog fragment
* split parted_version function to allow creating a test unit
* test unit for parted version info
* ansible-test sanity fixes
* review fix
* Update changelogs/fragments/1695-parted-updatedregex.yaml
Co-authored-by: Felix Fontein <felix@fontein.de>
* comment fixes
* better function name
* Update plugins/modules/system/parted.py
Co-authored-by: Felix Fontein <felix@fontein.de>
* comment fixes
Co-authored-by: Claude Robitaille <claude@cbcr.me>
Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 43da5b88db
)
Co-authored-by: Anatoly Pugachev <matorola@gmail.com>
This commit is contained in:
parent
ad5b8a813f
commit
0b13c1eb45
3 changed files with 66 additions and 14 deletions
4
changelogs/fragments/1695-parted-updatedregex.yaml
Normal file
4
changelogs/fragments/1695-parted-updatedregex.yaml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
bugfixes:
|
||||||
|
- parted - change the regex that decodes the partition size to better support different formats that parted uses.
|
||||||
|
Change the regex that validates parted's version string
|
||||||
|
(https://github.com/ansible-collections/community.general/pull/1695).
|
|
@ -241,7 +241,7 @@ def parse_unit(size_str, unit=''):
|
||||||
"""
|
"""
|
||||||
Parses a string containing a size or boundary information
|
Parses a string containing a size or boundary information
|
||||||
"""
|
"""
|
||||||
matches = re.search(r'^(-?[\d.]+)([\w%]+)?$', size_str)
|
matches = re.search(r'^(-?[\d.]+) *([\w%]+)?$', size_str)
|
||||||
if matches is None:
|
if matches is None:
|
||||||
# "<cylinder>,<head>,<sector>" format
|
# "<cylinder>,<head>,<sector>" format
|
||||||
matches = re.search(r'^(\d+),(\d+),(\d+)$', size_str)
|
matches = re.search(r'^(\d+),(\d+),(\d+)$', size_str)
|
||||||
|
@ -500,6 +500,33 @@ def check_parted_label(device):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def parse_parted_version(out):
|
||||||
|
"""
|
||||||
|
Returns version tuple from the output of "parted --version" command
|
||||||
|
"""
|
||||||
|
lines = [x for x in out.split('\n') if x.strip() != '']
|
||||||
|
if len(lines) == 0:
|
||||||
|
return None, None, None
|
||||||
|
|
||||||
|
# Sample parted versions (see as well test unit):
|
||||||
|
# parted (GNU parted) 3.3
|
||||||
|
# parted (GNU parted) 3.4.5
|
||||||
|
# parted (GNU parted) 3.3.14-dfc61
|
||||||
|
matches = re.search(r'^parted.+\s(\d+)\.(\d+)(?:\.(\d+))?', lines[0].strip())
|
||||||
|
|
||||||
|
if matches is None:
|
||||||
|
return None, None, None
|
||||||
|
|
||||||
|
# Convert version to numbers
|
||||||
|
major = int(matches.group(1))
|
||||||
|
minor = int(matches.group(2))
|
||||||
|
rev = 0
|
||||||
|
if matches.group(3) is not None:
|
||||||
|
rev = int(matches.group(3))
|
||||||
|
|
||||||
|
return major, minor, rev
|
||||||
|
|
||||||
|
|
||||||
def parted_version():
|
def parted_version():
|
||||||
"""
|
"""
|
||||||
Returns the major and minor version of parted installed on the system.
|
Returns the major and minor version of parted installed on the system.
|
||||||
|
@ -512,21 +539,10 @@ def parted_version():
|
||||||
msg="Failed to get parted version.", rc=rc, out=out, err=err
|
msg="Failed to get parted version.", rc=rc, out=out, err=err
|
||||||
)
|
)
|
||||||
|
|
||||||
lines = [x for x in out.split('\n') if x.strip() != '']
|
(major, minor, rev) = parse_parted_version(out)
|
||||||
if len(lines) == 0:
|
if major is None:
|
||||||
module.fail_json(msg="Failed to get parted version.", rc=0, out=out)
|
module.fail_json(msg="Failed to get parted version.", rc=0, out=out)
|
||||||
|
|
||||||
matches = re.search(r'^parted.+(\d+)\.(\d+)(?:\.(\d+))?$', lines[0])
|
|
||||||
if matches is None:
|
|
||||||
module.fail_json(msg="Failed to get parted version.", rc=0, out=out)
|
|
||||||
|
|
||||||
# Convert version to numbers
|
|
||||||
major = int(matches.group(1))
|
|
||||||
minor = int(matches.group(2))
|
|
||||||
rev = 0
|
|
||||||
if matches.group(3) is not None:
|
|
||||||
rev = int(matches.group(3))
|
|
||||||
|
|
||||||
return major, minor, rev
|
return major, minor, rev
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ __metaclass__ = type
|
||||||
|
|
||||||
from ansible_collections.community.general.tests.unit.compat.mock import patch, call
|
from ansible_collections.community.general.tests.unit.compat.mock import patch, call
|
||||||
from ansible_collections.community.general.plugins.modules.system import parted as parted_module
|
from ansible_collections.community.general.plugins.modules.system import parted as parted_module
|
||||||
|
from ansible_collections.community.general.plugins.modules.system.parted import parse_parted_version
|
||||||
from ansible_collections.community.general.plugins.modules.system.parted import parse_partition_info
|
from ansible_collections.community.general.plugins.modules.system.parted import parse_partition_info
|
||||||
from ansible_collections.community.general.tests.unit.plugins.modules.utils import AnsibleExitJson, AnsibleFailJson, ModuleTestCase, set_module_args
|
from ansible_collections.community.general.tests.unit.plugins.modules.utils import AnsibleExitJson, AnsibleFailJson, ModuleTestCase, set_module_args
|
||||||
|
|
||||||
|
@ -17,6 +18,32 @@ BYT;
|
||||||
2:106MB:368MB:262MB:ext2::;
|
2:106MB:368MB:262MB:ext2::;
|
||||||
3:368MB:256061MB:255692MB:::;"""
|
3:368MB:256061MB:255692MB:::;"""
|
||||||
|
|
||||||
|
parted_version_info = {"""
|
||||||
|
parted (GNU parted) 3.3
|
||||||
|
Copyright (C) 2019 Free Software Foundation, Inc.
|
||||||
|
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
|
||||||
|
This is free software: you are free to change and redistribute it.
|
||||||
|
There is NO WARRANTY, to the extent permitted by law.
|
||||||
|
|
||||||
|
Written by <http://git.debian.org/?p=parted/parted.git;a=blob_plain;f=AUTHORS>.
|
||||||
|
""": (3, 3, 0), """
|
||||||
|
parted (GNU parted) 3.4.5
|
||||||
|
Copyright (C) 2019 Free Software Foundation, Inc.
|
||||||
|
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
|
||||||
|
This is free software: you are free to change and redistribute it.
|
||||||
|
There is NO WARRANTY, to the extent permitted by law.
|
||||||
|
|
||||||
|
Written by <http://git.debian.org/?p=parted/parted.git;a=blob_plain;f=AUTHORS>.
|
||||||
|
""": (3, 4, 5), """
|
||||||
|
parted (GNU parted) 3.3.14-dfc61
|
||||||
|
Copyright (C) 2019 Free Software Foundation, Inc.
|
||||||
|
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
|
||||||
|
This is free software: you are free to change and redistribute it.
|
||||||
|
There is NO WARRANTY, to the extent permitted by law.
|
||||||
|
|
||||||
|
Written by <http://git.debian.org/?p=parted/parted.git;a=blob_plain;f=AUTHORS>.
|
||||||
|
""": (3, 3, 14)}
|
||||||
|
|
||||||
# corresponding dictionary after parsing by parse_partition_info
|
# corresponding dictionary after parsing by parse_partition_info
|
||||||
parted_dict1 = {
|
parted_dict1 = {
|
||||||
"generic": {
|
"generic": {
|
||||||
|
@ -311,3 +338,8 @@ class TestParted(ModuleTestCase):
|
||||||
})
|
})
|
||||||
with patch('ansible_collections.community.general.plugins.modules.system.parted.get_device_info', return_value=parted_dict3):
|
with patch('ansible_collections.community.general.plugins.modules.system.parted.get_device_info', return_value=parted_dict3):
|
||||||
self.execute_module(changed=True)
|
self.execute_module(changed=True)
|
||||||
|
|
||||||
|
def test_version_info(self):
|
||||||
|
"""Test that the parse_parted_version returns the expected tuple"""
|
||||||
|
for key, value in parted_version_info.items():
|
||||||
|
self.assertEqual(parse_parted_version(key), value)
|
||||||
|
|
Loading…
Reference in a new issue