From 7c9775435ab97f7589952afc243e81eceb40321e Mon Sep 17 00:00:00 2001 From: Christophe Augello Date: Wed, 30 May 2018 15:14:15 +0200 Subject: [PATCH 1/6] fixes #191 --- modules/user_interface.py | 68 +++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 21 deletions(-) diff --git a/modules/user_interface.py b/modules/user_interface.py index cf5a14b..141b036 100644 --- a/modules/user_interface.py +++ b/modules/user_interface.py @@ -286,31 +286,57 @@ def get_vm_access_details(vm): ip_Public = None ip_Forwarder = None services = [] + internals = [] # Get private IPs - if 'autoIpConfig' in nic['ipConfig']: - internal = nic['ipConfig']['autoIpConfig']['allocatedIp'] - elif 'staticIpConfig' in nic['ipConfig']: - internal = nic['ipConfig']['staticIpConfig']['ip'] - n['internalIP'] = internal + if nic.get('ipConfig'): + if 'autoIpConfig' in nic['ipConfig']: + internal = nic['ipConfig']['autoIpConfig']['allocatedIp'] + elif 'staticIpConfig' in nic['ipConfig']: + internal = nic['ipConfig']['staticIpConfig']['ip'] + # Get FQDN + if 'fqdn' in nic['ipConfig']: + fqdn = nic['ipConfig']['fqdn'] + n['fqdn'] = fqdn + # Get public IP + if nic['ipConfig']['hasPublicIp']: + try: + ip_Elastic = nic['ipConfig']['elasticIpAddress'] + except: + try: + ip_Public = nic['ipConfig']['publicIp'] + except: + pass + elif 'publicIp' in nic['ipConfig']: + ip_Forwarder = nic['ipConfig']['publicIp'] + #Handles vlan interfaces + elif nic.get('vlanInterfaces'): + for vlan in nic['vlanInterfaces']: + if vlan.get('ipConfigurations'): + for ipConfig in vlan['ipConfigurations']: + # Get FQDN + if 'fqdn' in ipConfig: + fqdn = ipConfig['fqdn'] + n['fqdn'] = fqdn + # Get public IP + if ipConfig['hasPublicIp']: + try: + ip_Elastic = ipConfig['elasticIpAddress'] + except: + try: + ip_Public = ipConfig['publicIp'] + except: + pass + elif 'publicIp' in ipConfig: + ip_Forwarder = ipConfig['publicIp'] + #Get private IPs + if ipConfig.get('staticIpConfig'): + internals.append(str(ipConfig['staticIpConfig']['ip'].encode('ascii','ignore'))) + internal = ' '.join(map(str, internals)) # Get extra private IPs for addtlIp in nic.get('additionalIpConfig', []): ip_Additional.append(addtlIp['staticIpConfig']['ip']) - n['internalIPs'] = ip_Additional - # Get FQDN - if 'fqdn' in nic['ipConfig']: - fqdn = nic['ipConfig']['fqdn'] - n['fqdn'] = fqdn - # Get public IP - if nic['ipConfig']['hasPublicIp']: - try: - ip_Elastic = nic['ipConfig']['elasticIpAddress'] - except: - try: - ip_Public = nic['ipConfig']['publicIp'] - except: - pass - elif 'publicIp' in nic['ipConfig']: - ip_Forwarder = nic['ipConfig']['publicIp'] + n['internalIPs'] = ip_Additional + # Check for services for svc in vm.get('suppliedServices', []): if svc['external'] and 'externalPort' in svc and svc['useLuidForIpConfig'] and nic['ipConfig']['id'] == svc['ipConfigLuid'] and not svc['name'].startswith('dummy'): From 94f8c12ad76c0f85196bd08dae1a66285b757e62 Mon Sep 17 00:00:00 2001 From: Christophe Augello Date: Mon, 13 Aug 2018 16:48:11 +0200 Subject: [PATCH 2/6] implement region tagging --- modules/cfg.py | 26 +++++++++++---- modules/user_interface.py | 70 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 87 insertions(+), 9 deletions(-) diff --git a/modules/cfg.py b/modules/cfg.py index b42a59f..5e9b379 100644 --- a/modules/cfg.py +++ b/modules/cfg.py @@ -7,7 +7,7 @@ # Version info __version__ = '1.35.0' -__date__ = '2017/09/26' +__date__ = '2017/09/26' version = "{} v{} last mod {}".format(prog, __version__, __date__) # Defaults @@ -26,7 +26,7 @@ learnerBlueprintTag = [ "#is_learner_blueprint", "#learner_bp", - ] +] # Both learner and admin will only be able to publish blueprints that have a # bmc tag to a bmc region; blueprints lacking a bmc tag will not be publishable @@ -34,13 +34,27 @@ bmcBlueprintTag = [ "#is_bmc_blueprint", "#bmc", - ] +] # List of BMC (bare-metal-cloud) regionNames -bmcRegionNames = [ - 'us-east-5', - ] +bmcRegionNames = ['us-east-5', 'us-southwest-1', 'eu-central-3'] +amazonBlueprintTag = ['#amazon'] +amazonRegionNames = [ + 'us-west-1', 'us-west-2', 'us-east-3', 'us-east-1', 'ap-northeast-2', + 'ap-south-1', 'eu-central-1', 'eu-west-1', 'eu-west-3', 'ap-northeast-1', + 'ca-central-1', 'sa-east-1', 'ap-southeast-2', 'ap-southeast-1' +] + +googleBlueprintTag = ['#google'] +googleRegionNames = [ + 'europe-west-6', 'mumbai-2', 'us-central-1', 'us-east-4', 'eu-west-4', + 'ap-southeast-3', 'ap-southeast-4', 'eu-central-2', 'us-east-6', + 'sa-east-2', 'us-west-3', 'ap-northeast-3', 'eu-west-2', 'ap-east-1' +] + +oracleBlueprintTag = ['#oracle'] +oracleRegionNames = ['us-east-5', 'us-southwest-1', 'eu-central-3'] # This will hold the options namespace generated by argparse opts = None diff --git a/modules/user_interface.py b/modules/user_interface.py index 141b036..0ba4cc5 100644 --- a/modules/user_interface.py +++ b/modules/user_interface.py @@ -1507,8 +1507,20 @@ def ui_command_find_pub_locations(self, outputFile='@EDITOR'): # Is BMC blueprint pubLocations = [r for r in pubLocations if r['regionName'] in cfg.bmcRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.amazonBlueprintTag): + # Is amazon blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.amazonRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.googleBlueprintTag): + # Is google blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.googleRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.oracleBlueprintTag): + # Is oracle blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.oracleRegionNames] else: - # Is not BMC blueprint + # Is not region tagged pubLocations = [r for r in pubLocations if not r['regionName'] in cfg.bmcRegionNames] ui.print_obj(pubLocations, @@ -1887,6 +1899,18 @@ def ui_complete_new(self, parameters, text, current_param): # Is BMC blueprint pubLocations = [r for r in pubLocations if r['regionName'] in cfg.bmcRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.amazonBlueprintTag): + # Is amazon blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.amazonRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.googleBlueprintTag): + # Is google blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.googleRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.oracleBlueprintTag): + # Is oracle blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.oracleRegionNames] else: # Is not BMC blueprint pubLocations = [r for r in pubLocations @@ -2117,8 +2141,12 @@ def loop_query_status(self, desiredState=None, intervalSec=20, totalMin=30, quie app = rClient.get_application(self.appId, aspect='deployment') if app['published']: if desiredState == 'STARTED': - groupsNoAutostart = [g['id'] for g in app['deployment']['vmOrderGroups'] if g.get('skipStartupSequence', False)] - vmStates = list(set([vm['state'] for vm in app['deployment']['vms'] if vm['vmOrderGroupId'] not in groupsNoAutostart])) + vmStates = None + if app['deployment'].get('vmOrderGroups'): + groupsNoAutostart = [g['id'] for g in app['deployment']['vmOrderGroups'] if g.get('skipStartupSequence', False)] + vmStates = list(set([vm['state'] for vm in app['deployment']['vms'] if vm['vmOrderGroupId'] not in groupsNoAutostart])) + else: + vmStates = list(set([vm['state'] for vm in app['deployment']['vms']])) if len(vmStates) == 1 and 'STARTED' in vmStates: break elif desiredState == 'STOPPED': @@ -2519,6 +2547,18 @@ def ui_command_find_pub_locations(self, outputFile='@EDITOR'): # Is BMC blueprint pubLocations = [r for r in pubLocations if r['regionName'] in cfg.bmcRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.amazonBlueprintTag): + # Is amazon blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.amazonRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.googleBlueprintTag): + # Is google blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.googleRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.oracleBlueprintTag): + # Is oracle blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.oracleRegionNames] else: # Is not BMC blueprint pubLocations = [r for r in pubLocations @@ -2665,6 +2705,18 @@ def ui_command_publish(self, region='@prompt', startAllVms='true', loopQueryStat # Is BMC blueprint pubLocations = [r for r in pubLocations if r['regionName'] in cfg.bmcRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.amazonBlueprintTag): + # Is amazon blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.amazonRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.googleBlueprintTag): + # Is google blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.googleRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.oracleBlueprintTag): + # Is oracle blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.oracleRegionNames] else: # Is not BMC blueprint pubLocations = [r for r in pubLocations @@ -2732,6 +2784,18 @@ def ui_complete_publish(self, parameters, text, current_param): # Is BMC blueprint pubLocations = [r for r in pubLocations if r['regionName'] in cfg.bmcRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.amazonBlueprintTag): + # Is amazon blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.amazonRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.googleBlueprintTag): + # Is google blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.googleRegionNames] + elif bpDescription and any(tag in bpDescription for tag in cfg.oracleBlueprintTag): + # Is oracle blueprint + pubLocations = [r for r in pubLocations + if r['regionName'] in cfg.oracleRegionNames] else: # Is not BMC blueprint pubLocations = [r for r in pubLocations From 28254afc83a73672090c909e6df217c27634f82d Mon Sep 17 00:00:00 2001 From: Christophe Augello Date: Tue, 14 Aug 2018 11:38:51 +0200 Subject: [PATCH 3/6] fix vlan nic ipconfig id --- modules/user_interface.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/user_interface.py b/modules/user_interface.py index 0ba4cc5..5c90011 100644 --- a/modules/user_interface.py +++ b/modules/user_interface.py @@ -286,9 +286,11 @@ def get_vm_access_details(vm): ip_Public = None ip_Forwarder = None services = [] - internals = [] + internals = [] + n_id = None # Get private IPs if nic.get('ipConfig'): + n_id = nic['ipConfig']['id'] if 'autoIpConfig' in nic['ipConfig']: internal = nic['ipConfig']['autoIpConfig']['allocatedIp'] elif 'staticIpConfig' in nic['ipConfig']: @@ -313,6 +315,7 @@ def get_vm_access_details(vm): for vlan in nic['vlanInterfaces']: if vlan.get('ipConfigurations'): for ipConfig in vlan['ipConfigurations']: + n_id = ipConfig['id'] # Get FQDN if 'fqdn' in ipConfig: fqdn = ipConfig['fqdn'] @@ -339,7 +342,7 @@ def get_vm_access_details(vm): # Check for services for svc in vm.get('suppliedServices', []): - if svc['external'] and 'externalPort' in svc and svc['useLuidForIpConfig'] and nic['ipConfig']['id'] == svc['ipConfigLuid'] and not svc['name'].startswith('dummy'): + if svc['external'] and 'externalPort' in svc and svc['useLuidForIpConfig'] and n_id == svc['ipConfigLuid'] and not svc['name'].startswith('dummy'): services.append(svc) if svc['name'] == 'ssh' and not vm['ssh']['fqdn']: vm['ssh']['fqdn'] = deets['ssh_fqdn'] = fqdn From f42c783ea322370c97c54f94738688adcf5bd481 Mon Sep 17 00:00:00 2001 From: Christophe Augello Date: Tue, 21 Aug 2018 16:15:13 +0200 Subject: [PATCH 4/6] append region tags --- modules/cfg.py | 8 +++ modules/user_interface.py | 128 +++++++++++++++++--------------------- 2 files changed, 66 insertions(+), 70 deletions(-) diff --git a/modules/cfg.py b/modules/cfg.py index 5e9b379..00a9f91 100644 --- a/modules/cfg.py +++ b/modules/cfg.py @@ -55,6 +55,14 @@ oracleBlueprintTag = ['#oracle'] oracleRegionNames = ['us-east-5', 'us-southwest-1', 'eu-central-3'] + +regionCatalog = { + "#is_bmc_blueprint": bmcRegionNames, + "#bmc": bmcRegionNames, + "#amazon": amazonRegionNames, + "#google": googleRegionNames, + "#oracle": oracleRegionNames +} # This will hold the options namespace generated by argparse opts = None diff --git a/modules/user_interface.py b/modules/user_interface.py index 5c90011..b39c210 100644 --- a/modules/user_interface.py +++ b/modules/user_interface.py @@ -1506,22 +1506,20 @@ def ui_command_find_pub_locations(self, outputFile='@EDITOR'): # BMC blueprint? bpDescription = rCache.get_bp(self.bpId).get('description') # Remove bmc regions or remove everything BUT bmc regions + + taggedLocations = [] if bpDescription and any(tag in bpDescription for tag in cfg.bmcBlueprintTag): # Is BMC blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.bmcRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.amazonBlueprintTag): - # Is amazon blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.amazonRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.googleBlueprintTag): - # Is google blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.googleRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.oracleBlueprintTag): - # Is oracle blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.oracleRegionNames] + taggedLocations = [r for r in pubLocations if r['regionName'] in cfg.bmcRegionNames] + else: + for tag, regionList in cfg.regionCatalog.iteritems(): + if bpDescription and tag in bpDescription: + locs = [r for r in pubLocations if r['regionName'] in regionList] + for l in locs: + taggedLocations.append(l) + + if taggedLocations: + pubLocations = taggedLocations else: # Is not region tagged pubLocations = [r for r in pubLocations @@ -1898,22 +1896,19 @@ def ui_complete_new(self, parameters, text, current_param): # BMC blueprint? bpDescription = rCache.get_bp(bpId).get('description') # Remove bmc regions or remove everything BUT bmc regions + taggedLocations = [] if bpDescription and any(tag in bpDescription for tag in cfg.bmcBlueprintTag): # Is BMC blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.bmcRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.amazonBlueprintTag): - # Is amazon blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.amazonRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.googleBlueprintTag): - # Is google blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.googleRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.oracleBlueprintTag): - # Is oracle blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.oracleRegionNames] + taggedLocations = [r for r in pubLocations if r['regionName'] in cfg.bmcRegionNames] + else: + for tag, regionList in cfg.regionCatalog.iteritems(): + if bpDescription and tag in bpDescription: + locs = [r for r in pubLocations if r['regionName'] in regionList] + for l in locs: + taggedLocations.append(l) + + if taggedLocations: + pubLocations = taggedLocations else: # Is not BMC blueprint pubLocations = [r for r in pubLocations @@ -2546,22 +2541,20 @@ def ui_command_find_pub_locations(self, outputFile='@EDITOR'): bpId = rCache.get_app(self.appId)['baseBlueprintId'] bpDescription = rCache.get_bp(bpId).get('description') # Remove bmc regions or remove everything BUT bmc regions + taggedLocations = [] if bpDescription and any(tag in bpDescription for tag in cfg.bmcBlueprintTag): # Is BMC blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.bmcRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.amazonBlueprintTag): - # Is amazon blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.amazonRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.googleBlueprintTag): - # Is google blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.googleRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.oracleBlueprintTag): - # Is oracle blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.oracleRegionNames] + taggedLocations = [r for r in pubLocations if r['regionName'] in cfg.bmcRegionNames] + else: + for tag, regionList in cfg.regionCatalog.iteritems(): + if bpDescription and tag in bpDescription: + locs = [r for r in pubLocations if r['regionName'] in regionList] + for l in locs: + taggedLocations.append(l) + + + if taggedLocations: + pubLocations = taggedLocations else: # Is not BMC blueprint pubLocations = [r for r in pubLocations @@ -2704,22 +2697,19 @@ def ui_command_publish(self, region='@prompt', startAllVms='true', loopQueryStat bpId = rCache.get_app(self.appId)['baseBlueprintId'] bpDescription = rCache.get_bp(bpId).get('description') # Remove bmc regions or remove everything BUT bmc regions + taggedLocations = [] if bpDescription and any(tag in bpDescription for tag in cfg.bmcBlueprintTag): # Is BMC blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.bmcRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.amazonBlueprintTag): - # Is amazon blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.amazonRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.googleBlueprintTag): - # Is google blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.googleRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.oracleBlueprintTag): - # Is oracle blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.oracleRegionNames] + taggedLocations = [r for r in pubLocations if r['regionName'] in cfg.bmcRegionNames] + else: + for tag, regionList in cfg.regionCatalog.iteritems(): + if bpDescription and tag in bpDescription: + locs = [r for r in pubLocations if r['regionName'] in regionList] + for l in locs: + taggedLocations.append(l) + + if taggedLocations: + pubLocations = taggedLocations else: # Is not BMC blueprint pubLocations = [r for r in pubLocations @@ -2783,22 +2773,20 @@ def ui_complete_publish(self, parameters, text, current_param): bpId = rCache.get_app(self.appId)['baseBlueprintId'] bpDescription = rCache.get_bp(bpId).get('description') # Remove bmc regions or remove everything BUT bmc regions + taggedLocations = [] if bpDescription and any(tag in bpDescription for tag in cfg.bmcBlueprintTag): # Is BMC blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.bmcRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.amazonBlueprintTag): - # Is amazon blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.amazonRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.googleBlueprintTag): - # Is google blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.googleRegionNames] - elif bpDescription and any(tag in bpDescription for tag in cfg.oracleBlueprintTag): - # Is oracle blueprint - pubLocations = [r for r in pubLocations - if r['regionName'] in cfg.oracleRegionNames] + taggedLocations = [r for r in pubLocations if r['regionName'] in cfg.bmcRegionNames] + else: + for tag, regionList in cfg.regionCatalog.iteritems(): + if bpDescription and tag in bpDescription: + locs = [r for r in pubLocations if r['regionName'] in regionList] + for l in locs: + taggedLocations.append(l) + + + if taggedLocations: + pubLocations = taggedLocations else: # Is not BMC blueprint pubLocations = [r for r in pubLocations From 49e2f0947d44b332a37e7d347ece440be0088aaf Mon Sep 17 00:00:00 2001 From: Christophe Augello Date: Tue, 4 Sep 2018 14:07:42 +0200 Subject: [PATCH 5/6] add missing eu-west-5 region --- modules/cfg.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/cfg.py b/modules/cfg.py index 00a9f91..7690d1e 100644 --- a/modules/cfg.py +++ b/modules/cfg.py @@ -37,7 +37,7 @@ ] # List of BMC (bare-metal-cloud) regionNames -bmcRegionNames = ['us-east-5', 'us-southwest-1', 'eu-central-3'] +bmcRegionNames = ['us-east-5', 'us-southwest-1', 'eu-central-3', 'eu-west-5'] amazonBlueprintTag = ['#amazon'] amazonRegionNames = [ @@ -54,7 +54,7 @@ ] oracleBlueprintTag = ['#oracle'] -oracleRegionNames = ['us-east-5', 'us-southwest-1', 'eu-central-3'] +oracleRegionNames = ['us-east-5', 'us-southwest-1', 'eu-central-3', 'eu-west-5'] regionCatalog = { "#is_bmc_blueprint": bmcRegionNames, From d68ec56564fe1d14ed4f05d7294521622ccc8860 Mon Sep 17 00:00:00 2001 From: Marian Orszagh Date: Mon, 8 Oct 2018 11:57:38 +0200 Subject: [PATCH 6/6] Fix dynamically allocated IP state bug --- modules/user_interface.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/user_interface.py b/modules/user_interface.py index b39c210..e5df5d8 100644 --- a/modules/user_interface.py +++ b/modules/user_interface.py @@ -292,7 +292,10 @@ def get_vm_access_details(vm): if nic.get('ipConfig'): n_id = nic['ipConfig']['id'] if 'autoIpConfig' in nic['ipConfig']: - internal = nic['ipConfig']['autoIpConfig']['allocatedIp'] + if nic['ipConfig']['autoIpConfig']: + internal = nic['ipConfig']['autoIpConfig']['allocatedIp'] + else: + internal = 'Pending' elif 'staticIpConfig' in nic['ipConfig']: internal = nic['ipConfig']['staticIpConfig']['ip'] # Get FQDN