diff --git a/modules/cfg.py b/modules/cfg.py index b42a59f..7690d1e 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,35 @@ 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', 'eu-west-5'] +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', 'eu-west-5'] + +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 cf5a14b..e5df5d8 100644 --- a/modules/user_interface.py +++ b/modules/user_interface.py @@ -286,34 +286,66 @@ def get_vm_access_details(vm): ip_Public = None ip_Forwarder = None services = [] + internals = [] + n_id = None # 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'): + n_id = nic['ipConfig']['id'] + if 'autoIpConfig' in nic['ipConfig']: + if nic['ipConfig']['autoIpConfig']: + internal = nic['ipConfig']['autoIpConfig']['allocatedIp'] + else: + internal = 'Pending' + 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']: + n_id = ipConfig['id'] + # 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'): + 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 @@ -1477,12 +1509,22 @@ 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] + taggedLocations = [r for r in pubLocations if r['regionName'] in cfg.bmcRegionNames] else: - # Is not BMC blueprint + 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 if not r['regionName'] in cfg.bmcRegionNames] ui.print_obj(pubLocations, @@ -1857,10 +1899,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] + 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 @@ -2091,8 +2142,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': @@ -2489,10 +2544,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] + 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 @@ -2635,10 +2700,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] + 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 @@ -2702,10 +2776,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] + 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