def _expand_vm_settings(self, key, vm_number):
"""
Expand VM option with given key for given number of VMs
"""
tmp_value = self.getValue(key)
if isinstance(tmp_value, str):
scalar = True
master_value = tmp_value
tmp_value = [tmp_value]
else:
scalar = False
master_value = tmp_value[0]
master_value_str = str(master_value)
if master_value_str.find('#') >= 0:
self.__dict__[key] = []
for vmindex in range(vm_number):
value = master_value_str.replace('#VMINDEX', str(vmindex))
for macro, args, param, _, step in re.findall(_PARSE_PATTERN, value):
multi = int(step) if len(step) and int(step) else 1
if macro == '#EVAL':
# pylint: disable=eval-used
tmp_result = str(eval(param))
elif macro == '#MAC':
mac_value = netaddr.EUI(param).value
mac = netaddr.EUI(mac_value + vmindex * multi)
mac.dialect = netaddr.mac_unix_expanded
tmp_result = str(mac)
elif macro == '#IP':
ip_value = netaddr.IPAddress(param).value
tmp_result = str(netaddr.IPAddress(ip_value + vmindex * multi))
else:
raise RuntimeError('Unknown configuration macro {} in {}'.format(macro, key))
value = value.replace("{}{}".format(macro, args), tmp_result)
# retype value to original type if needed
if not isinstance(master_value, str):
value = ast.literal_eval(value)
self.__dict__[key].append(value)
else:
for vmindex in range(len(tmp_value), vm_number):
self.__dict__[key].append(master_value)
if scalar:
self.__dict__[key] = self.__dict__[key][0]
_LOGGER.debug("Expanding option: %s = %s", key, self.__dict__[key])
评论列表
文章目录