Ejemplo n.º 1
0
    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'
                         }))
Ejemplo n.º 2
0
    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))
Ejemplo n.º 3
0
    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'))
Ejemplo n.º 4
0
    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))
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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"))
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
 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
Ejemplo n.º 9
0
    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'))
Ejemplo n.º 10
0
    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)
Ejemplo n.º 11
0
    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)
Ejemplo n.º 12
0
    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))
Ejemplo n.º 13
0
    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)
Ejemplo n.º 14
0
    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)
Ejemplo n.º 15
0
    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'))
Ejemplo n.º 16
0
    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'))
Ejemplo n.º 17
0
    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": {}}
Ejemplo n.º 18
0
    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)
Ejemplo n.º 19
0
    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'))
Ejemplo n.º 20
0
    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)
Ejemplo n.º 21
0
    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'))
Ejemplo n.º 22
0
    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)
Ejemplo n.º 23
0
    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'))
Ejemplo n.º 24
0
    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'))
Ejemplo n.º 25
0
    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('&nbsp;&nbsp;')
                        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)