|
|
|
@ -864,19 +864,28 @@ class DecortController(object):
|
|
|
|
|
api_params = dict(accountId = comp_dict['accountId'])
|
|
|
|
|
api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/vins/search", api_params)
|
|
|
|
|
vins_list = json.loads(api_resp.content.decode('utf8'))
|
|
|
|
|
if not len(vins_list):
|
|
|
|
|
self.result['failed'] = True
|
|
|
|
|
self.result['msg'] = ("compute_networks() cannot obtain VINS list for Account ID {}, "
|
|
|
|
|
"Compute ID {}.").format(comp_dict['accountId'], comp_dict['id'])
|
|
|
|
|
return
|
|
|
|
|
#
|
|
|
|
|
# We should not fail the module if ViNS list is empty - it is not an error, as in case of
|
|
|
|
|
# API failure "decort_api_call" will abort the module execution on its own. Hence the
|
|
|
|
|
# following code fragment is commented out
|
|
|
|
|
#
|
|
|
|
|
# if not len(vins_list):
|
|
|
|
|
# self.result['failed'] = True
|
|
|
|
|
# self.result['msg'] = ("compute_networks() cannot obtain VINS list for Account ID {}, "
|
|
|
|
|
# "Compute ID {}.").format(comp_dict['accountId'], comp_dict['id'])
|
|
|
|
|
# return
|
|
|
|
|
|
|
|
|
|
api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/extnet/list", api_params)
|
|
|
|
|
extnet_list = json.loads(api_resp.content.decode('utf8')) # list of dicts: "name" holds "NET_ADDR/NETMASK", "id" is ID
|
|
|
|
|
if not len(extnet_list):
|
|
|
|
|
self.result['failed'] = True
|
|
|
|
|
self.result['msg'] = ("compute_networks() cannot obtain External networks list for Account ID {}, "
|
|
|
|
|
"Compute ID {}.").format(comp_dict['accountId'], comp_dict['id'])
|
|
|
|
|
return
|
|
|
|
|
#
|
|
|
|
|
# Empty extnet_list does not constitute error condition, so we should not fail the module in
|
|
|
|
|
# this case. Therefore the following code fragment is commented out.
|
|
|
|
|
#
|
|
|
|
|
# if not len(extnet_list):
|
|
|
|
|
# self.result['failed'] = True
|
|
|
|
|
# self.result['msg'] = ("compute_networks() cannot obtain External networks list for Account ID {}, "
|
|
|
|
|
# "Compute ID {}.").format(comp_dict['accountId'], comp_dict['id'])
|
|
|
|
|
# return
|
|
|
|
|
|
|
|
|
|
# Prepare the lists of network interfaces for the compute instance:
|
|
|
|
|
vins_iface_list = [] # will contain dict(id=<int>, ipAddress=<str>, mac=<str>) for ifaces connected to ViNS(es)
|
|
|
|
@ -902,6 +911,19 @@ class DecortController(object):
|
|
|
|
|
mac=iface['mac'])
|
|
|
|
|
enet_iface_list.append(iface_data)
|
|
|
|
|
|
|
|
|
|
# If at this point compt_dict["interfaces"] lists some interfaces, but neither vins_iface_list
|
|
|
|
|
# nor enet_iface_list contain any members, it means that none of the ViNS or Ext Nets currently
|
|
|
|
|
# available to us match existing interfaces of the Compute instance.
|
|
|
|
|
# This is abnormal condition and we should not proceed any further.
|
|
|
|
|
if len(comp_dict['interfaces']) and (not len(vins_iface_list) and not len(enet_iface_list)):
|
|
|
|
|
self.result['failed'] = True
|
|
|
|
|
self.result['msg'] = ("compute_networks() no match between {} interface(s) of Compute ID {}"
|
|
|
|
|
"and available {} ViNS(es) or {} ExtNet(s).").format(len(comp_dict['interfaces']),
|
|
|
|
|
comp_dict['id'],
|
|
|
|
|
len(vins_list),
|
|
|
|
|
len(extnet_list))
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
vins_id_list = [ rec['id'] for rec in vins_iface_list ]
|
|
|
|
|
|
|
|
|
|
enet_id_list = [ rec['id'] for rec in enet_iface_list ]
|
|
|
|
|