def test_getUserAuthData(self, get_project_ids, getStaticSitesInfo, getCachedSiteList, getStaticSitesProjectIDs): cred = MagicMock() cred.get_cred.return_value = {"project": "project_name"} getCachedSiteList.return_value = { 'CESGA': ('https://fedcloud-osservices.egi.cesga.es:5000', '', '11548G0') } getStaticSitesInfo.return_value = [{ "name": "static_site_name", "api_version": "1.1" }] get_project_ids.return_value = {"vo_name": "project_id"} getStaticSitesProjectIDs.return_value = {"vo_name_st": "project_id_st"} res = utils.getUserAuthData("token", cred, "user") self.assertEquals(res, ( "type = InfrastructureManager; token = token\\nid = ost1; type = OpenStack;" " username = egi.eu; tenant = openid; auth_version = 3.x_oidc_access_token;" " host = https://fedcloud-osservices.egi.cesga.es:5000; password = '******';" " domain = project_name")) res = utils.getUserAuthData("token", cred, "user", "vo_name", "CESGA") self.assertEquals(res, ( "type = InfrastructureManager; token = token\\nid = ost1; type = OpenStack;" " username = egi.eu; tenant = openid; auth_version = 3.x_oidc_access_token;" " host = https://fedcloud-osservices.egi.cesga.es:5000; password = '******';" " domain = project_id")) self.assertEqual(cred.write_creds.call_args_list[0][0], ('CESGA', 'user', { 'project': 'project_id' }))
def managevm(op=None, infid=None, vmid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data, "Accept": "application/json"} op = op.lower() if op in ["stop", "start", "reboot"]: url = "%s/infrastructures/%s/vms/%s/%s" % (settings.imUrl, infid, vmid, op) response = requests.put(url, headers=headers) elif op == "terminate": url = "%s/infrastructures/%s/vms/%s" % (settings.imUrl, infid, vmid) response = requests.delete(url, headers=headers) else: flash("Error: invalid operation: %s." % op, 'error') return redirect(url_for('showinfrastructures')) if response.ok: flash("Operation '%s' successfully made on VM ID: %s" % (op, vmid), 'info') else: flash( "Error making %s op on VM %s: \n%s" % (op, vmid, response.text), 'error') if op == "terminate": return redirect(url_for('showinfrastructures')) else: return redirect(url_for('showvminfo', infid=infid, vmid=vmid))
def addresourcesform(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data, "Accept": "text/plain"} url = "%s/infrastructures/%s/radl" % (settings.imUrl, infid) response = requests.get(url, headers=headers) if response.ok: systems = [] try: radl = radl_parse.parse_radl(response.text) systems = radl.systems except Exception as ex: flash("Error parsing RADL: \n%s" % str(ex), 'error') return render_template('addresource.html', infid=infid, systems=systems) else: flash("Error getting RADL: \n%s" % (response.text), 'error') return redirect(url_for('showinfrastructures'))
def managevm(op=None, infid=None, vmid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) try: if op == "reconfigure": response = im.reconfigure_inf(infid, auth_data, [vmid]) if op == "resize": form_data = request.form.to_dict() cpu = int(form_data['cpu']) memory = int(form_data['memory']) system_name = form_data['system_name'] radl = "system %s (cpu.count >= %d and memory.size >= %dg)" % ( system_name, cpu, memory) response = im.resize_vm(infid, vmid, radl, auth_data) else: response = im.manage_vm(op, infid, vmid, auth_data) except Exception as ex: flash("Error: %s." % ex, 'error') return redirect(url_for('showinfrastructures')) if response.ok: flash("Operation '%s' successfully made on VM ID: %s" % (op, vmid), 'info') else: flash( "Error making %s op on VM %s: \n%s" % (op, vmid, response.text), 'error') if op == "terminate": return redirect(url_for('showinfrastructures')) else: return redirect(url_for('showvminfo', infId=infid, vmId=vmid))
def getimages(cred_id=None): res = "" local = request.args.get('local', None) if local: access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"], cred_id) try: response = im.get_cloud_images(cred_id, auth_data) if not response.ok: raise Exception(response.text) for image in response.json()["images"]: res += '<option name="selectedSiteImage" value=%s>%s</option>' % ( image['uri'], image['name']) except Exception as ex: res += '<option name="selectedSiteImage" value=%s>%s</option>' % ( ex, ex) else: site, _, vo = utils.get_site_info(cred_id, cred, session["userid"]) for image_name, image_id in appdb.get_images(site['id'], vo): res += '<option name="selectedImage" value=%s>%s</option>' % ( image_id, image_name) return res
def test_getUserAuthData(self, getCachedSiteList, getCachedProjectIDs): cred = MagicMock() with flask.Flask(__name__).test_request_context() as flask_context: cred.get_creds.return_value = [{ 'enabled': 1, 'type': 'OpenNebula', 'id': 'one', 'username': '******', 'password': '******' }, { 'enabled': 1, 'type': 'fedcloud', 'id': 'fed', 'host': 'https://api.cloud.ifca.es:5000', 'vo': 'vo_name' }] getCachedSiteList.return_value = { 'CESGA': { 'url': 'https://fedcloud-osservices.egi.cesga.es:5000', 'state': '', 'id': '11548G0' }, 'IFCA': { 'url': 'https://api.cloud.ifca.es:5000', 'state': '', 'id': 'ifca' } } getCachedProjectIDs.return_value = { "vo_name_st": "project_id_st", "vo_name": "project_id" } flask_context.g.settings = MagicMock() flask_context.g.settings.im_auth = "" res = utils.getUserAuthData("token", cred, "user") self.assertEquals(res, ( "type = InfrastructureManager; token = token\\nid = one; type = OpenNebula;" " username = user; password = pass\\n" "id = fed; type = OpenStack; username = egi.eu;" " tenant = openid; auth_version = 3.x_oidc_access_token; host =" " https://api.cloud.ifca.es:5000; password = '******'; domain = project_id" )) flask_context.g.settings.im_auth = "Bearer" res = utils.getUserAuthData("token", cred, "user") self.assertEquals(res, ("Bearer token"))
def showvminfo(infid=None, vmid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data, "Accept": "application/json"} url = "%s/infrastructures/%s/vms/%s" % (settings.imUrl, infid, vmid) response = requests.get(url, headers=headers) vminfo = {} state = "" nets = "" deployment = "" if not response.ok: flash("Error retrieving VM info: \n" + response.text, 'error') else: app.logger.debug("VM Info: %s" % response.text) vminfo = utils.format_json_radl(response.json()["radl"]) if "cpu.arch" in vminfo: del vminfo["cpu.arch"] if "state" in vminfo: state = vminfo["state"] del vminfo["state"] if "provider.type" in vminfo: deployment = vminfo["provider.type"] del vminfo["provider.type"] if "provider.host" in vminfo: if "provider.port" in vminfo: deployment += ": %s:%s" % (vminfo["provider.host"], vminfo["provider.port"]) del vminfo["provider.port"] else: deployment += ": " + vminfo["provider.host"] del vminfo["provider.host"] cont = 0 while "net_interface.%s.ip" % cont in vminfo: if cont > 0: nets += Markup('<br/>') nets += Markup('<i class="fa fa-network-wired"></i>') nets += " %s: %s" % (cont, vminfo["net_interface.%s.ip" % cont]) del vminfo["net_interface.%s.ip" % cont] cont += 1 cont = 0 while "net_interface.%s.connection" % cont in vminfo: del vminfo["net_interface.%s.connection" % cont] cont += 1 for elem in vminfo: if elem.endswith("size") and isinstance(vminfo[elem], int): vminfo[elem] = "%d GB" % (vminfo[elem] / 1073741824) return render_template('vminfo.html', infid=infid, vmid=vmid, vminfo=vminfo, state=state, nets=nets, deployment=deployment)
def getusage(cred_id=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"], cred_id) try: response = im.get_cloud_quotas(cred_id, auth_data) if not response.ok: raise Exception(response.text) return json.dumps(response.json()["quotas"]) except Exception as ex: return "Error loading site quotas: %s!" % str(ex), 400
def createdep(): form_data = request.form.to_dict() vo = form_data['extra_opts.selectedVO'] site = form_data['extra_opts.selectedSite'] access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"], vo, site) app.logger.debug("Form data: " + json.dumps(request.form.to_dict())) with io.open(settings.toscaDir + request.args.get('template')) as stream: template = yaml.full_load(stream) if form_data['extra_opts.selectedImage'] != "": image = "appdb://%s/%s?%s" % (form_data['extra_opts.selectedSite'], form_data['extra_opts.selectedImage'], form_data['extra_opts.selectedVO']) elif form_data['extra_opts.selectedSiteImage'] != "": site_url = utils.get_ost_image_url(form_data['extra_opts.selectedSite']) image = "ost://%s/%s" % (site_url, form_data['extra_opts.selectedSiteImage']) else: flash("No correct image selected.", "error") return redirect(url_for('showinfrastructures')) template = add_image_to_template(template, image) template = add_auth_to_template(template, auth_data) inputs = {k: v for (k, v) in form_data.items() if not k.startswith("extra_opts.")} app.logger.debug("Parameters: " + json.dumps(inputs)) template = set_inputs_to_template(template, inputs) payload = yaml.dump(template, default_flow_style=False, sort_keys=False) headers = {"Authorization": auth_data, "Content-Type": "text/yaml"} url = "%s/infrastructures?async=1" % settings.imUrl response = requests.post(url, headers=headers, data=payload) if not response.ok: flash("Error creating infrastrucrure: \n" + response.text, "error") else: try: inf_id = os.path.basename(response.text) infra.write_infra(inf_id, {"name": form_data['infra_name']}) except Exception as ex: flash("Error storing Infrastructure name: %s" % str(ex), "warning") return redirect(url_for('showinfrastructures'))
def inflog(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data} url = "%s/infrastructures/%s/contmsg" % (settings.imUrl, infid) response = requests.get(url, headers=headers, verify=False) if not response.ok: log = "Not found" else: log = response.text return render_template('inflog.html', log=log)
def template(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data} url = "%s/infrastructures/%s/tosca" % (settings.imUrl, infid) response = requests.get(url, headers=headers) if not response.ok: flash("Error getting template: \n" + response.text, "error") template = "" else: template = response.text return render_template('deptemplate.html', template=template)
def manage_inf(infid=None, op=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) reload = None try: if op in ["start", "stop"]: response = im.manage_inf(op, infid, auth_data) if not response.ok: raise Exception(response.text) flash( "Operation '%s' successfully made on Infrastructure ID: %s" % (op, infid), 'info') reload = infid elif op == "delete": form_data = request.form.to_dict() force = False if 'force' in form_data and form_data['force'] != "0": force = True # Specially added for OSCAR clusters success, msg = utils.delete_dns_record(infid, im, auth_data) if not success: app.logger.error('Error deleting DNS record: %s', (msg)) response = im.delete_inf(infid, force, auth_data) if not response.ok: raise Exception(response.text) flash("Infrastructure '%s' successfuly deleted." % infid, "info") try: infra_data = infra.get_infra(infid) infra_data["state"]["state"] = "deleting" infra.write_infra(infid, infra_data) scheduler.add_job('delete_infra_%s' % infid, delete_infra, trigger='interval', seconds=60, args=(infid, )) except Exception as dex: app.logger.error( 'Error setting infra state to deleting.: %s', (dex)) elif op == "reconfigure": response = im.reconfigure_inf(infid, auth_data) if not response.ok: raise Exception(response.text) flash("Reconfiguration process successfuly started.", "info") except Exception as ex: flash("Error in '%s' operation: %s." % (op, ex), 'error') return redirect(url_for('showinfrastructures', reload=reload))
def inflog(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) log = "Not found" try: response = im.get_inf_property(infid, 'contmsg', auth_data) if not response.ok: raise Exception(response.text) log = add_colors(response.text) except Exception as ex: flash("Error: %s." % ex, 'error') return render_template('inflog.html', log=log)
def template(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) template = "" try: response = im.get_inf_property(infid, 'tosca', auth_data) if not response.ok: raise Exception(response.text) template = response.text except Exception as ex: flash("Error getting template: \n%s" % ex, "error") return render_template('deptemplate.html', template=template)
def infreconfigure(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data} url = "%s/infrastructures/%s/reconfigure" % (settings.imUrl, infid) response = requests.put(url, headers=headers) if response.ok: flash("Infrastructure successfuly reconfigured.", "info") else: flash("Error reconfiguring Infrastructure: \n" + response.text, "error") return redirect(url_for('showinfrastructures'))
def addresources(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data, "Accept": "text/plain"} form_data = request.form.to_dict() url = "%s/infrastructures/%s/radl" % (settings.imUrl, infid) response = requests.get(url, headers=headers) if response.ok: radl = None try: radl = radl_parse.parse_radl(response.text) radl.deploys = [] for system in radl.systems: if "%s_num" % system.name in form_data: vm_num = int(form_data["%s_num" % system.name]) if vm_num > 0: radl.deploys.append(deploy(system.name, vm_num)) except Exception as ex: flash( "Error parsing RADL: \n%s\n%s" % (str(ex), response.text), 'error') if radl: headers = { "Authorization": auth_data, "Accept": "application/json" } url = "%s/infrastructures/%s" % (settings.imUrl, infid) response = requests.post(url, headers=headers, data=str(radl)) if response.ok: num = len(response.json()["uri-list"]) flash("%d nodes added successfully" % num, 'info') else: flash("Error adding nodesL: \n%s" % (response.text), 'error') return redirect(url_for('showinfrastructures')) else: flash("Error getting RADL: \n%s" % (response.text), 'error') return redirect(url_for('showinfrastructures'))
def infrastructure_state(): access_token = oidc_blueprint.session.token['access_token'] infid = request.args['infid'] if not infid: return {"state": "error", "vm_states": {}} auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) try: state = im.get_inf_state(infid, auth_data) try: infra.write_infra(infid, {"state": state}) except Exception as ex: app.logger.error("Error saving infrastructure state: %s" % ex) return state except Exception: return {"state": "error", "vm_states": {}}
def showinfrastructures(): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data, "Accept": "application/json"} url = "%s/infrastructures" % settings.imUrl response = requests.get(url, headers=headers) infrastructures = {} if not response.ok: flash("Error retrieving infrastructure list: \n" + response.text, 'error') else: app.logger.debug("Infrastructures: %s" % response.text) state_res = response.json() if "uri-list" in state_res: inf_id_list = [elem["uri"] for elem in state_res["uri-list"]] else: inf_id_list = [] for inf_id in inf_id_list: url = "%s/state" % inf_id response = requests.get(url, headers=headers) if not response.ok: flash( "Error retrieving infrastructure %s state: \n%s" % (inf_id, response.text), 'warning') else: inf_state = response.json() infrastructures[os.path.basename( inf_id)] = inf_state['state'] try: infra_name = infra.get_infra( os.path.basename(inf_id))["name"] except Exception: infra_name = "" infrastructures[os.path.basename( inf_id)]['name'] = infra_name return render_template('infrastructures.html', infrastructures=infrastructures)
def addresources(infid=None): access_token = oidc_blueprint.session.token['access_token'] form_data = request.form.to_dict() auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) try: response = im.get_inf_property(infid, 'radl', auth_data) except Exception as ex: flash("Error: %s." % ex, 'error') if response.ok: radl = None try: radl = radl_parse.parse_radl(response.text) radl.deploys = [] for system in radl.systems: sys_dep = deploy(system.name, 0) if "%s_num" % system.name in form_data: vm_num = int(form_data["%s_num" % system.name]) if vm_num > 0: sys_dep.vm_number = vm_num radl.deploys.append(sys_dep) except Exception as ex: flash( "Error parsing RADL: \n%s\n%s" % (str(ex), response.text), 'error') if radl: try: response = im.addresource_inf(infid, str(radl), auth_data) if not response.ok: raise Exception(response.text) num = len(response.json()["uri-list"]) flash("%d nodes added successfully" % num, 'info') except Exception as ex: flash("Error adding nodes: \n%s\n%s" % (ex, response.text), 'error') return redirect(url_for('showinfrastructures')) else: flash("Error getting RADL: \n%s" % (response.text), 'error') return redirect(url_for('showinfrastructures'))
def infoutputs(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data} url = "%s/infrastructures/%s/outputs" % (settings.imUrl, infid) response = requests.get(url, headers=headers, verify=False) if not response.ok: outputs = {} else: outputs = response.json()["outputs"] for elem in outputs: if isinstance(outputs[elem], str) and (outputs[elem].startswith('http://') or outputs[elem].startswith('https://')): outputs[elem] = Markup("<a href='%s' target='_blank'>%s</a>" % (outputs[elem], outputs[elem])) return render_template('outputs.html', infid=infid, outputs=outputs)
def infdel(infid=None, force=0): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data} url = "%s/infrastructures/%s?async=1" % (settings.imUrl, infid) if force: url += "&force=1" response = requests.delete(url, headers=headers) if not response.ok: flash("Error deleting infrastructure: " + response.text, "error") else: flash("Infrastructure '%s' successfuly deleted." % infid, "info") try: infra.delete_infra(infid) except Exception as ex: flash("Error deleting infrastructure name: %s" + str(ex), "warning") return redirect(url_for('showinfrastructures'))
def infoutputs(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) outputs = {} try: response = im.get_inf_property(infid, 'outputs', auth_data) if not response.ok: raise Exception(response.text) outputs = response.json()["outputs"] for elem in outputs: if isinstance(outputs[elem], str) and (outputs[elem].startswith('http://') or outputs[elem].startswith('https://')): outputs[elem] = Markup( "<a href='%s' target='_blank'>%s</a>" % (outputs[elem], outputs[elem])) except Exception as ex: flash("Error: %s." % ex, 'error') return render_template('outputs.html', infid=infid, outputs=outputs)
def addresourcesform(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) try: response = im.get_inf_property(infid, 'radl', auth_data) if not response.ok: raise Exception(response.text) systems = [] try: radl = radl_parse.parse_radl(response.text) systems = radl.systems except Exception as ex: flash("Error parsing RADL: \n%s" % str(ex), 'error') return render_template('addresource.html', infid=infid, systems=systems) except Exception as ex: flash("Error getting RADL: \n%s" % ex, 'error') return redirect(url_for('showinfrastructures'))
def createdep(): form_data = request.form.to_dict() app.logger.debug("Form data: " + json.dumps(request.form.to_dict())) cred_id = form_data['extra_opts.selectedCred'] cred_data = cred.get_cred(cred_id, session["userid"]) access_token = oidc_blueprint.session.token['access_token'] image = None if cred_data['type'] in [ 'fedcloud', 'OpenStack', 'OpenNebula', 'Linode', 'Orange', 'GCE' ]: if form_data['extra_opts.selectedImage'] != "": site, _, vo = utils.get_site_info(cred_id, cred, session["userid"]) image = "appdb://%s/%s?%s" % ( site['name'], form_data['extra_opts.selectedImage'], vo) elif form_data['extra_opts.selectedSiteImage'] != "": image = form_data['extra_opts.selectedSiteImage'] else: image_id = form_data['extra_opts.imageID'] protocol_map = { 'EC2': 'aws', 'Kubernetes': 'docker', 'Azure': 'azr' } image = "%s://%s" % (protocol_map.get(cred_data['type']), image_id) if not image: flash("No correct image specified.", "error") return redirect(url_for('showinfrastructures')) auth_data = utils.getUserAuthData(access_token, cred, session["userid"], cred_id) with io.open(settings.toscaDir + request.args.get('template')) as stream: template = yaml.full_load(stream) template = add_image_to_template(template, image) template = add_image_to_template(template, image) template = add_auth_to_template(template, auth_data) # Specially added for OSCAR clusters template = add_record_name_to_template(template, utils.generate_random_name()) inputs = { k: v for (k, v) in form_data.items() if not k.startswith("extra_opts.") } app.logger.debug("Parameters: " + json.dumps(inputs)) template = set_inputs_to_template(template, inputs) payload = yaml.dump(template, default_flow_style=False, sort_keys=False) try: response = im.create_inf(payload, auth_data) if not response.ok: raise Exception(response.text) try: inf_id = os.path.basename(response.text) infra.write_infra( inf_id, { "name": form_data['infra_name'], "state": { "state": "pending", "vm_states": {} } }) except Exception as ex: flash("Error storing Infrastructure name: %s" % str(ex), "warning") except Exception as ex: flash("Error creating infrastrucrure: \n%s." % ex, 'error') return redirect(url_for('showinfrastructures'))
def showvminfo(): access_token = oidc_blueprint.session.token['access_token'] vmid = request.args['vmId'] infid = request.args['infId'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) try: response = im.get_vm_info(infid, vmid, auth_data) except Exception as ex: flash("Error: %s." % ex, 'error') vminfo = {} state = "" nets = "" disks = "" deployment = "" if not response.ok: flash("Error retrieving VM info: \n" + response.text, 'error') else: app.logger.debug("VM Info: %s" % response.text) radl_json = response.json()["radl"] outports = utils.get_out_ports(radl_json) vminfo = utils.format_json_radl(radl_json) if "cpu.arch" in vminfo: del vminfo["cpu.arch"] if "state" in vminfo: state = vminfo["state"] del vminfo["state"] if "provider.type" in vminfo: deployment = vminfo["provider.type"] del vminfo["provider.type"] if "provider.host" in vminfo: if "provider.port" in vminfo: deployment += ": %s:%s" % (vminfo["provider.host"], vminfo["provider.port"]) del vminfo["provider.port"] else: deployment += ": " + vminfo["provider.host"] del vminfo["provider.host"] if "disk.0.os.name" in vminfo: del vminfo["disk.0.os.name"] cont = 0 while "net_interface.%s.connection" % cont in vminfo: if "net_interface.%s.ip" % cont in vminfo: if cont > 0: nets += Markup('<br/>') nets += Markup('<i class="fa fa-network-wired"></i>') nets += Markup( ' <span class="badge badge-secondary">%s</span>' % cont) nets += ": %s" % vminfo["net_interface.%s.ip" % cont] del vminfo["net_interface.%s.ip" % cont] if "net_interface.%s.dns_name" % cont in vminfo: nets += " (%s)" % vminfo["net_interface.%s.dns_name" % cont] del vminfo["net_interface.%s.dns_name" % cont] cont += 1 cont = 0 while "net_interface.%s.connection" % cont in vminfo: del vminfo["net_interface.%s.connection" % cont] cont += 1 for elem in vminfo: if elem.endswith("size") and isinstance(vminfo[elem], int): vminfo[elem] = "%d GB" % (vminfo[elem] / 1073741824) cont = 0 while "disk.%s.size" % cont in vminfo or "disk.%s.image.url" % cont in vminfo: if cont > 0: disks += Markup('<br/>') disks += Markup( '<i class="fa fa-database"></i> <span class="badge badge-secondary">' '%s</span><br/>' % cont) prop_map = { "size": "Size", "image.url": "URL", "device": "Device", "mount_path": "Mount Path", "fstype": "F.S. type", "os.flavour": "O.S. Flavor", "os.version": "O.S. Version" } for name, label in prop_map.items(): prop = "disk.%s.%s" % (cont, name) if prop in vminfo: disks += Markup(' ') disks += "- %s: %s" % (label, vminfo[prop]) disks += Markup('<br/>') del vminfo[prop] cont += 1 str_outports = "" for port in outports: str_outports += Markup( '<i class="fas fa-project-diagram"></i> <span class="badge ' 'badge-secondary">%s</span>' % port.get_remote_port()) if not port.is_range(): if port.get_remote_port() != port.get_local_port(): str_outports += Markup( ' <i class="fas fa-long-arrow-alt-right">' '</i> <span class="badge badge-secondary">%s</span>' % port.get_local_port()) else: str_outports += Markup( ' : </i> <span class="badge badge-secondary">%s</span>' % port.get_local_port()) str_outports += Markup('<br/>') return render_template('vminfo.html', infid=infid, vmid=vmid, vminfo=vminfo, outports=str_outports, state=state, nets=nets, deployment=deployment, disks=disks)