summaryrefslogtreecommitdiff
path: root/lib/ansible/modules/cloud/vmware
diff options
context:
space:
mode:
authorAbhijeet Kasurde <akasurde@redhat.com>2018-03-01 09:36:54 +0530
committerGitHub <noreply@github.com>2018-03-01 09:36:54 +0530
commit0694aca2a098cc9303d69dd3bdfac702d781b4e4 (patch)
tree2ca3145a62450e8449a75f159bb1b8791239729c /lib/ansible/modules/cloud/vmware
parent6601e78dfa3e80fdfb87c4c1a5345890d90a516e (diff)
downloadansible-0694aca2a098cc9303d69dd3bdfac702d781b4e4.tar.gz
VMware: refactor configure disk logic (#36617)
This fix corrects logic related to disk parameters. Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>
Diffstat (limited to 'lib/ansible/modules/cloud/vmware')
-rw-r--r--lib/ansible/modules/cloud/vmware/vmware_guest.py47
1 files changed, 32 insertions, 15 deletions
diff --git a/lib/ansible/modules/cloud/vmware/vmware_guest.py b/lib/ansible/modules/cloud/vmware/vmware_guest.py
index d405faf85e..c608449a2a 100644
--- a/lib/ansible/modules/cloud/vmware/vmware_guest.py
+++ b/lib/ansible/modules/cloud/vmware/vmware_guest.py
@@ -1369,28 +1369,45 @@ class PyVmomiHelper(PyVmomi):
def get_configured_disk_size(self, expected_disk_spec):
# what size is it?
if [x for x in expected_disk_spec.keys() if x.startswith('size_') or x == 'size']:
- # size_tb, size_gb, size_mb, size_kb, size_b ...?
+ # size, size_tb, size_gb, size_mb, size_kb
if 'size' in expected_disk_spec:
- expected = ''.join(c for c in expected_disk_spec['size'] if c.isdigit())
- unit = expected_disk_spec['size'].replace(expected, '').lower()
- expected = int(expected)
+ size_regex = re.compile(r'(\d+(?:\.\d+)?)([tgmkTGMK][bB])')
+ disk_size_m = size_regex.match(expected_disk_spec['size'])
+ try:
+ if disk_size_m:
+ expected = disk_size_m.group(1)
+ unit = disk_size_m.group(2)
+ else:
+ raise ValueError
+
+ if re.match(r'\d+\.\d+', expected):
+ # We found float value in string, let's typecast it
+ expected = float(expected)
+ else:
+ # We found int value in string, let's typecast it
+ expected = int(expected)
+
+ if not expected or not unit:
+ raise ValueError
+
+ except (TypeError, ValueError, NameError):
+ # Common failure
+ self.module.fail_json(msg="Failed to parse disk size please review value"
+ " provided using documentation.")
else:
param = [x for x in expected_disk_spec.keys() if x.startswith('size_')][0]
unit = param.split('_')[-1].lower()
expected = [x[1] for x in expected_disk_spec.items() if x[0].startswith('size_')][0]
expected = int(expected)
- if unit == 'tb':
- return expected * 1024 * 1024 * 1024
- elif unit == 'gb':
- return expected * 1024 * 1024
- elif unit == 'mb':
- return expected * 1024
- elif unit == 'kb':
- return expected
-
- self.module.fail_json(
- msg='%s is not a supported unit for disk size. Supported units are kb, mb, gb or tb' % unit)
+ disk_units = dict(tb=3, gb=2, mb=1, kb=0)
+ if unit in disk_units:
+ unit = unit.lower()
+ return expected * (1024 ** disk_units[unit])
+ else:
+ self.module.fail_json(msg="%s is not a supported unit for disk size."
+ " Supported units are ['%s']." % (unit,
+ "', '".join(disk_units.keys())))
# No size found but disk, fail
self.module.fail_json(