From: nlebreto Date: Wed, 11 Dec 2013 10:04:11 +0000 (+0100) Subject: r1.3 move bonfire.py code to sfa/bonfire repository X-Git-Tag: sfa-3.0-2-bonfire-r1-3^0 X-Git-Url: http://git.onelab.eu/?p=sfa.git;a=commitdiff_plain;h=e7605f6cb1ebbdb7cd4c6e7495d58d03aeda863b r1.3 move bonfire.py code to sfa/bonfire repository --- diff --git a/sfa/bonfire/__init__.py b/sfa/bonfire/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sfa/bonfire/bonfire.py b/sfa/bonfire/bonfire.py new file mode 100644 index 00000000..15fb3d60 --- /dev/null +++ b/sfa/bonfire/bonfire.py @@ -0,0 +1,205 @@ +#!/usr/bin/python +# -*- coding:utf-8 -*- +#yum -y install python-pip +#pip install requests +import requests +import xml.etree.ElementTree as ET +import subprocess +import time + +# module for bonfire to connect with sfa (following the Rspec) +# inspired by the following documenation : +# https://svn.planet-lab.org/wiki/SfaDeveloperDummyTutorial#RunningSFAinDummyflavour + +# 1) list all the resources from bonfire's point of view +# python -c 'import bonfire; print bonfire.bonsources()' + +# 2) retrieve the url, the name and the key that will currently use by sfa for a compute N°3656 located at fr-inria +# python -c 'import bonfire; print bonfire.rsa_user_bonfire("fr-inria", "3656") + +# 3) create a new user and slice for sfa wrap +# python -c 'import bonfire; print bonfire.new_user_slice() + +# 4) changing the status to running status for the experiment 2911 +# python -c 'import bonfire; print bonfire.provisioning("2911") + +# 5) stop virtual machine n°3756 at fr-inira testbed +# python -c 'import bonfire; print bonfire.stop_vm("fr-inria", "3756") + +# 6) create an experiment bonfire with the slice id n°2345423 and the experiment owner : foo+bar.stuff+emulab+professor +# python -c 'import bonfire; print bonfire.create_fed4fire_exp("nlebreto", "nlebreto", "desc", "300", "2345423", "foo+bar.stuff+emulab+professor") + + + +# ########################################################## # + + +# retrieve the url, the name and the key that will currently use by sfa +def rsa_user_bonfire(testbed, num_compute): + url = "https://api.integration.bonfire.grid5000.fr/" + "locations/" + testbed + "/computes/" + num_compute + pagebonfirecompute = callcurl(url) + xmlreduit = ET.fromstring(pagebonfirecompute) + hash = {} + hash["url"] = url + for name in xmlreduit: + if name.tag == "{http://api.bonfire-project.eu/doc/schemas/occi}groups": + hash["name"] = name.text + for context in name: + if context.tag == "{http://api.bonfire-project.eu/doc/schemas/occi}authorized_keys": + hash["keys"] = context.text + return hash + +# create a new user and slice for sfa wrap +def new_user_slice(): + n = rsa_user_bonfire("fr-inria", "3656") + #url = n["url"] + "." + n["name"] + # fix to do add -k id_rsa.pub (pb key convert) + url = "topdomain.dummy." + n["name"] + txtcreateuser = "sfaadmin.py reg register -x {0} -t user -e {1}@dummy.net".format(url, n["name"]) + createusersfa = subprocess.Popen(txtcreateuser, shell=True) + #slice = n["url"] + "." + n["name"] + "_" + n["name"] + slice = "topdomain.dummy." + n["name"] + "_slice" + txtslice = "sfaadmin.py reg register -x {0} -t slice -r {1}".format(slice, url) + createslice = subprocess.Popen(txtslice, shell=True) + +# create a experiment bonfire with the slice id and the experiment owner +def create_fed4fire_exp(name, groups, description, walltime, slice_id, exp_owner): + # fix this to have the exact mapping to retrieve slice + # xmldescription='' + name +'' + groups + '' + description + '' + walltime + 'ready' + slice_id + '' + exp_owner + '' + postexp("https://api.integration.bonfire.grid5000.fr/experiments", 'testnlebretonlebretosdg3000ready2345423foo+bar.stuff+emulab+professor') + +# simple post method for request +def postexp(url, xmldescription): + headers = {'content-type': 'application/vnd.bonfire+xml'} + r = requests.post(url, data=xmldescription, headers=headers, verify=False, auth=('nlebreto', 'GDRU_23tc$')) + +# stop a virtual machine for bonfire +# changing the state to stopped state +def stop_vm(testbed, num_compute): + url = "https://api.integration.bonfire.grid5000.fr/" + "locations/" + testbed + "/computes/" + num_compute + xmldescription = 'stopped' + headers = {'content-type': 'application/vnd.bonfire+xml'} + requests.put(url, data=xmldescription, headers=headers, verify=False, auth=('nlebreto', 'GDRU_23tc$')) + +# provisioning : set an experiment to running +# changing the status to running status +def provisioning(num_experiment): + url = "https://api.integration.bonfire.grid5000.fr/experiments/" + num_experiment + xmldescription = 'running' + headers = {'content-type': 'application/vnd.bonfire+xml'} + requests.put(url, data=xmldescription, headers=headers, verify=False, auth=('nlebreto', 'GDRU_23tc$')) + +# retrieving the url, the name and the keys for a specific compute +def rsa_user_bonfire(testbed, num_compute): + url = "https://api.integration.bonfire.grid5000.fr/" + "locations/" + testbed + "/computes/" + num_compute + pagebonfirecompute = callcurl(url) + xmlreduit = ET.fromstring(pagebonfirecompute) + hash = {} + hash["url"] = url + for name in xmlreduit: + if name.tag == "{http://api.bonfire-project.eu/doc/schemas/occi}groups": + hash["name"] = name.text + for context in name: + if context.tag == "{http://api.bonfire-project.eu/doc/schemas/occi}authorized_keys": + hash["keys"] = context.text + return hash + +# do a curl request +def callcurl(url): + r = requests.get(url, verify=False, auth=('nlebreto', 'GDRU_23tc$')) + if r.status_code == 200: + return r.text + +# create the url page +def buildpagehttp(part1, part2, locations): + res = [] + for page in locations: + res.append(part1 + page + "/" + part2) + return res + +def boucle(itemname, xmltree, hashrspec, name): + for item in xmltree.findall(itemname): + hashrspec[name.text][itemname] = item.text + +# method to list all information from testbeds +def jfedfeat(bonfires, pageurl): + pageforstatus = callcurl(pageurl) + xmlreduit = ET.fromstring(pageforstatus) + hashrspec = {} + itemshost = ["DISK_USAGE", "MEM_USAGE", "CPU_USAGE", "MAX_DISK", "MAX_MEM", "MAX_CPU", + "FREE_DISK", "FREE_MEM", "FREE_CPU", "FREE_MEM", "FREE_CPU", "USED_DISK", + "USED_MEM", "USED_CPU", "RUNNING_VMS" + ] + # retrieve info for xml tree + for host in xmlreduit.findall('HOST'): + for name in host.findall('NAME'): + hashrspec[name.text] = {"name" : name.text} + for hostshare in host.findall('HOST_SHARE'): + for itemshostname in itemshost: + boucle(itemshostname, hostshare, hashrspec, name) + + # jfed feature + for clef in hashrspec: + bonfires.append("" + + " " + + " " + + " " + + " " + + " " + + " ") + for infohost in itemshost: + bonfires.append(" ") + bonfires.append("") + +# remove the useless xml tag version +def remove_needless_txt(txt): + txt=str(txt) + txt=txt.replace("\n","\n") + txt=txt.replace("\n","\n") + return txt + +# list all bonfire resources following the sfa specification +def bonsources(): + # parameters + locations = ["fr-inria", "be-ibbt", "uk-epcc"] + urlnetworks = buildpagehttp("https://api.integration.bonfire.grid5000.fr/locations/", "networks", locations) + urlstorages = buildpagehttp("https://api.integration.bonfire.grid5000.fr/locations/", "storages", locations) + urlcomputes = buildpagehttp("https://api.integration.bonfire.grid5000.fr/locations/", "computes", locations) + # main code + bonfires = [] + generatedtime = time.strftime("%FT%T%Z") + sfabegin = "" + bonfires.append("") + bonfires.append(sfabegin) + bonfires.append("") + manag_exp = remove_needless_txt(callcurl("https://api.bonfire-project.eu/managed_experiments")) + bonfires.append(manag_exp) + bonfires.append("") + jfedfeat(bonfires, "http://frontend.bonfire.grid5000.fr/one-status.xml") + jfedfeat(bonfires, "http://bonfire.epcc.ed.ac.uk/one-status.xml") + jfedfeat(bonfires, "http://bonfire.psnc.pl/one-status.xml") + jfedfeat(bonfires, "http://nebulosus.rus.uni-stuttgart.de/one-status.xml") + bonfires.append("") + for xmlnetworks in urlnetworks: + bonfires.append(remove_needless_txt(callcurl(xmlnetworks))) + bonfires.append("") + for xmlstorages in urlstorages: + bonfires.append(remove_needless_txt(callcurl(xmlstorages))) + bonfires.append("") + for xmlcomputes in urlcomputes: + bonfires.append(remove_needless_txt(callcurl(xmlcomputes))) + bonfires.append("") + exp = callcurl("https://api.integration.bonfire.grid5000.fr/experiments") + rexp = remove_needless_txt(exp) + bonfires.append(rexp) + bonfires.append("") + reserv = callcurl("https://api.integration.bonfire.grid5000.fr/locations/fr-inria/reservations") + rreserv = remove_needless_txt(reserv) + bonfires.append(rreserv) + bonfires.append("") + bonfires.append("") + bonfires = "\n".join(bonfires) + bonfires = bonfires.replace("\n\n","") + return bonfires diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index 0f60bce6..8aec7c1e 100644 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -15,9 +15,6 @@ import pickle import json import shutil -# import bonfire.py for listing bonfire resources -import bonfire - from lxml import etree from StringIO import StringIO from optparse import OptionParser @@ -1143,9 +1140,6 @@ use this if you mean an authority instead""") save_rspec_to_file(value, options.file) if (self.options.raw is None) and (options.file is None): display_rspec(value, options.format) - #adding resources from bonfire - bonfire_resources = bonfire.bonsources() - display_rspec(bonfire_resources, options.format) return