From: Javier GarcĂa <javier.garcial.external@atos.net> Date: Fri, 29 Aug 2014 12:01:24 +0000 (+0200) Subject: Cleaned code and improved communication with SLA Collector X-Git-Tag: myslice-1.1~27^2~2 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=aed78ef2aa329dbc3d15aa9dca4795e5cc4464ed;p=myslice.git Cleaned code and improved communication with SLA Collector --- diff --git a/myslice/settings.py b/myslice/settings.py index 5faef7f8..fe71e108 100644 --- a/myslice/settings.py +++ b/myslice/settings.py @@ -294,5 +294,6 @@ CSRF_FAILURE_VIEW = 'manifoldapi.manifoldproxy.csrf_failure' ####SLA##### SLA_MANAGER_URL = "http://157.193.215.125:4001/sla-collector/sla" +#SLA_MANAGER_URL = "http://172.24.76.28:8000/sla" SLA_MANAGER_USER = "portal" SLA_MANAGER_PASSWORD = "password" diff --git a/plugins/queryupdater/static/js/queryupdater.js b/plugins/queryupdater/static/js/queryupdater.js index 5d017b9d..2e736293 100644 --- a/plugins/queryupdater/static/js/queryupdater.js +++ b/plugins/queryupdater/static/js/queryupdater.js @@ -75,228 +75,104 @@ do_checksla: function(e) { var username = e.data.options.username; var urn = data.value; - var arrayselectedresources = data.selected_resources; + var arraySelectedResources = data.selected_resources; - var accepted_sla = Array(); + var accepted_sla = []; var count = 0; var self = e.data; - // XXX check that the query is not disabled - - console.log("DATA VALUE: " + data.value); + // var testbedsWithSLA = ["iminds", "fuseco", "netmode"]; + var testbedsWithSLA; - //<p>SLA description</p> - //<p>Testbed guarantees 0.99 Uptime rate for 0.99 rate of the VirtualWall resources during the sliver lifetime</p> - //<p>SLA description</p> - //<p>Testbed guarantees 0.99 Uptime rate for 0.99 rate of the WiLab2 resources during the sliver lifetime</p> - var promt = $('#modal-body'); - - // id="myModalLabel" - var flagVW = false; - var flagWi = false; + var sliverPattern = /IDN\+(.+)\+(node|channel)\+/; + var list = []; - promt.append('<p>SLA description</p>'); + var promt = $('#sla-table-body'); - var wilabForm = ""; - wilabForm += "<ul>"; - for(var iter = 0; iter < arrayselectedresources.length; iter++){ - var list = '<li class="wi'+iter+'" name=wi"'+iter+'">'+arrayselectedresources[iter].toLowerCase()+'</li>'; - - if (arrayselectedresources[iter].toLowerCase().indexOf("wilab2") >= 0){ - - accepted_sla.push({"wilab2":false}); - wilabForm += list; - flagWi = true; - - } - - } - wilabForm += "</ul>"; - - //var wallmessage = '<p>SLA description</p><p>Testbed guarantees 0.99 Uptime rate for 0.99 rate of the VirtualWall resources during the sliver lifetime</p>'; - - var wallForm = ""; - wallForm += "<ul>"; - for(var iter = 0; iter < arrayselectedresources.length; iter++){ - var list = '<li class="wall'+iter+'" name=wall"'+iter+'" >'+arrayselectedresources[iter].toLowerCase()+'</li>'; - - if (arrayselectedresources[iter].toLowerCase().indexOf("wall2") >= 0){ - - accepted_sla.push({"wall2":false}); - wallForm += list; - flagVW = true; - + $.get("/sla/testbeds/", function(data) { + testbedsWithSLA = data; + + console.log("Testbeds with SLA: " + testbedsWithSLA); + + $(arraySelectedResources).each(function () { + var sliverMatch = sliverPattern.exec(this); + var sliverId = sliverMatch[1]; + for (var i = 0; i < testbedsWithSLA.length; i++) { + if(this.indexOf(testbedsWithSLA[i].toLowerCase()) >= 0){ // If it has SLA + if (list.indexOf(sliverId) == -1) { // If it is not in the list + list.push(sliverId); + } + } + } + }); + + if (list.length > 0) { + for (var i = 0; i < list.length; i++) { + var element = $('<tr>'); + element.append( + $('<td>').append(list[i]), + $('<td>').append('99% of Uptime for 99% of resources'), + $('<td align="center">').append('<input type="checkbox" name="slaaccept" value="' + list[i] + '"/> <br />') + ); + promt.append(element); + } + + $('#sla_dialog').show(); + $('#slamodal').modal('show'); + } else { + //manifold.raise_event(self.options.query_uuid, RUN_UPDATE); } - - } - wallForm += "</ul>"; - - var flagDouble = false; - if(flagWi) - { - flagDouble = true; - promt.append('<p>Testbed guarantees 0.99 Uptime rate for 0.99 rate of the WiLab2 resources during the sliver lifetime</p>'); - //promt.append(wilabForm); - promt.append('<br />'); - } - if(flagVW) - { - //promt.append(wallmessage); - flagDouble = true; - promt.append('<p>Testbed guarantees 0.99 Uptime rate for 0.99 rate of the VirtualWall resources during the sliver lifetime</p>'); - //promt.append(wallForm); - promt.append('<br />'); - } - - - // var wimessage = '<p>SLA description</p><p>Testbed guarantees 0.99 Uptime rate for 0.99 rate of the VirtualWall resources during the sliver lifetime</p>' - - if(flagWi || flagVW){ - $('#sla_dialog').show(); - - $('#slamodal-wilab2').modal('show'); - } - else - { - - - var username = e.data.options.username; - var urn = data.value; - // XXX check that the query is not disabled - - self.spin(); - console.log("do_update"); - // XXX check that the query is not disabled - manifold.raise_event(self.options.query_uuid, RUN_UPDATE); - return; - } - - $("#accept_sla_wilab2").click(function(){ - console.log("SLA ACCEPTED"); - console.log("With username: " + username); - - // var promt = $('#modal-body'); - // var notchecked = true; - // for (var i=0;i<50;i++) - // { - // var wielement = $('#wi'+i); - // var wallElement = $('#wall'+i); - // if(wielement != null && !wielement.checked) - // { - // notchecked = false; - // } - // if(wallElement!= null && !wallElement.checked) - // { - // notchecked = false; - // } - // } - - if(flagDouble) - { - $.post("/sla/agreements/simplecreate", - { "template_id": "iMindsServiceWiLab2", - "user": username, - "expiration_time": new Date().toISOString() - }); - $.post("/sla/agreements/simplecreate", - { "template_id": "iMindsServiceVirtualwall", - "user": username, - "expiration_time": new Date().toISOString() - }); - - $('#slamodal-wilab2').modal('hide'); - accepted_sla["wilab2"] = true; - - //manifold.raise_event(self.options.query_uuid, RUN_UPDATE); - } - $('#modal-body').empty(); - }); + }); - $("#dismiss_sla_wilab2").click(function(){ - console.log("SLA NOT ACCEPTED"); - $('#slamodal-wilab2').modal('hide'); - $('#modal-body').empty(); - }); + $("#submit_sla").unbind().click(function(){ + console.log("With username: " + username); + + var notChecked = $("input[name='slaaccept']:not(:checked)"); - // } else { - // this.do_update(e); - // } + if (notChecked.length > 0) { + for (var i = 0; i < notChecked.length; i++) { + console.log("SLA not accepted: " + notChecked[i].value); + } - // for(var iter = 0; iter < arrayselectedresources.length; iter++){ - // var list = '<input type="checkbox" name="'+iter+'" >'+arrayselectedresources[iter].toLowerCase()+'<br>'; - // promt.append(list); - // if (arrayselectedresources[iter].toLowerCase().indexOf("wall2") >= 0){ + alert("All SLAs have to be accepted to continue with the reservation"); + } else { + // $(list).each(function () { + // var date = new Date(); + // date.setYear(date.getFullYear() + 1); - - // accepted_sla.push({"wall2":false}); + // $.post("/sla/agreements/simplecreate", + // { "template_id": this.toString(), + // "user": username, + // "expiration_time": date.toISOString() + // }); - // $('#sla_dialog').show(); - // $('#slamodal-virtualwall').modal('show'); - - - // $("#accept_sla_vwall").click(function(){ - // console.log("SLA ACCEPTED"); - // console.log("With username: " + username); - - // $.post("/sla/agreements/simplecreate", - // { "template_id": "iMindsServiceVirtualwall", - // "user": username, - // "expiration_time": new Date() - // }); - // $('#slamodal-virtualwall').modal('hide'); - // accepted_sla["wall2"] = true; - // }); - - // $("#dismiss_sla_vwall").click(function(){ - // console.log("SLA NOT ACCEPTED"); - // $('#slamodal-vir').modal('hide'); - // }); - - // } - - // if (arrayselectedresources[iter].toLowerCase().indexOf("wilab2") >= 0){ - - // accepted_sla.push({"wilab2":false}); - - // $('#sla_dialog').show(); - // $('#slamodal-wilab2').modal('show'); - - - // $("#accept_sla_wilab2").click(function(){ - // console.log("SLA ACCEPTED"); - // console.log("With username: " + username); - - // $.post("/sla/agreements/simplecreate", - // { "template_id": "iMindsServiceWiLab2", - // "user": username, - // "expiration_time": new Date() - // }); - - // $('#slamodal-wilab2').modal('hide'); - // accepted_sla["wilab2"] = true; - // }); - - // $("#dismiss_sla_wilab2").click(function(){ - // console.log("SLA NOT ACCEPTED"); - // $('#slamodal-wilab2').modal('hide'); - // }); - - - // } - - // } - - // for(var sla in accepted_sla){ - // if(accepted_sla[sla] == true){ - // count += 1; - // } - // } - - // if(count == accepted_sla.length){ - // this.do_update(e); - // } + // }); + + $.ajax({ + url: "/sla/agreements/simplecreate", + data: { testbeds: list, + user: username, + resources: arraySelectedResources, + slice: main_query.filters.slice()[0][2] + }, + type: "post", + traditional: true + }); + + console.log(main_query.filters.slice()[0][2]); + + $('#slamodal').modal('hide'); + $('#sla-table-body').empty(); + //manifold.raise_event(self.options.query_uuid, RUN_UPDATE); + } + }); + + $("#cancel_sla").unbind().click(function(){ + $('#slamodal').modal('hide'); + $('#sla-table-body').empty(); + }); }, diff --git a/plugins/sladialog/templates/sladialog.html b/plugins/sladialog/templates/sladialog.html index ce27c2e4..cb50c29b 100644 --- a/plugins/sladialog/templates/sladialog.html +++ b/plugins/sladialog/templates/sladialog.html @@ -1,18 +1,27 @@ <div id={{ domid }}> -<div class="modal fade" id="slamodal-wilab2" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" +<div class="modal fade" id="slamodal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> - <h4 class="modal-title" id="myModalLabel">Provider iMinds offers the following SLA</h4> + <h4 class="modal-title" id="myModalLabel">Selected testbed(s) provide the following SLAs</h4> </div> <div class="modal-body" id="modal-body"> - <!-- <p>SLA description</p> - <p>Testbed guarantees 0.99 Uptime rate for 0.99 rate of the WiLab2 resources during the sliver lifetime</p> --> + <table class="table" id="sla-modal-table"> + <thead> + <tr> + <th>Testbed</th> + <th>SLA Description</th> + <th>Accept</th> + </tr> + </thead> + <tbody id="sla-table-body"> + </tbody> + </table> </div> <div class="modal-footer"> - <button type="button" id="dismiss_sla_wilab2" class="btn btn-default" data-dismiss="modal">Dismiss</button> - <button type="button" id="accept_sla_wilab2" class="btn btn-primary">Accept</button> + <button type="button" id="cancel_sla" class="btn btn-default" data-dismiss="modal">Cancel</button> + <button type="button" id="submit_sla" class="btn btn-primary">Submit</button> </div> </div> </div> diff --git a/sla/slaclient/restclient.py b/sla/slaclient/restclient.py index ab38cc4d..ec5da1dd 100755 --- a/sla/slaclient/restclient.py +++ b/sla/slaclient/restclient.py @@ -43,7 +43,7 @@ rooturl = settings.SLA_MANAGER_URL class Factory(object): @staticmethod - def agreements(path): + def agreements(path=_AGREEMENTS_PATH): """Returns a REST client for Agreements :rtype : Agreements @@ -117,6 +117,7 @@ class Client(object): if "headers" not in kwargs: kwargs["headers"] = {"accept": "application/xml"} + kwargs["auth"] = HTTPBasicAuth(settings.SLA_MANAGER_USER, settings.SLA_MANAGER_PASSWORD) @@ -150,12 +151,17 @@ class Client(object): ) """ url = _buildpath_(self.rooturl, path) - url = url + "?testbed=iminds" # TODO remove hardcoded string - kwargs["auth"] = HTTPBasicAuth(settings.SLA_MANAGER_USER, - settings.SLA_MANAGER_PASSWORD) + + if "testbed" in kwargs: + url = url + "?testbed=" + kwargs["testbed"] + if "headers" not in kwargs: - kwargs = {"accept": "application/xml", - "content-type": "application/xml"} + kwargs["headers"] = {"accept": "application/xml", + "content-type": "application/xml"} + + kwargs["auth"] = HTTPBasicAuth(settings.SLA_MANAGER_USER, + settings.SLA_MANAGER_PASSWORD) + result = requests.post(url, data, **kwargs) location = result.headers["location"] \ if "location" in result.headers else "<null>" @@ -312,12 +318,12 @@ class Agreements(object): """ return self.res.get(slicename, dict()) - def create(self, agreement): + def create(self, agreement, testbed): """Create a new agreement :param str agreement: sla template in ws-agreement format. """ - return self.res.create(agreement) + return self.res.create(agreement, params={'testbed': testbed}) class Templates(object): @@ -340,12 +346,12 @@ class Templates(object): """ return self.res.getall() - def getbyid(self, provider_id): + def getbyid(self, provider_id, testbed): """Get a template :rtype: wsag_model.Template """ - return self.res.getbyid(provider_id, None) + return self.res.getbyid(provider_id, {"testbed": testbed}) def create(self, template): """Create a new template diff --git a/sla/slaclient/service/fed4fire/fed4fireservice.py b/sla/slaclient/service/fed4fire/fed4fireservice.py index f11e8a1c..adec86bc 100755 --- a/sla/slaclient/service/fed4fire/fed4fireservice.py +++ b/sla/slaclient/service/fed4fire/fed4fireservice.py @@ -105,16 +105,16 @@ def createagreement(json_data, context): # Builds AgreementInput from json data = jsonparser.agreementinput_from_json(json_data) # Read template from manager - slatemplate, request = client_templates.getbyid(data.template_id) + slatemplate, request = client_templates.getbyid(data.template_id, data.template_id) # Copy (overriding if necessary) from template to AgreementInput final_data = data.from_template(slatemplate) slaagreement = fed4fire.render_slaagreement(final_data) client_agreements = context.restfactory.agreements() - return client_agreements.create(slaagreement) + return client_agreements.create(slaagreement, data.template_id) -def createagreementsimplified(template_id, user, expiration_time): +def createagreementsimplified(template_id, user, expiration_time, resources): context = ServiceContext( restclient.Factory(), TemplateFactory() @@ -122,26 +122,18 @@ def createagreementsimplified(template_id, user, expiration_time): print "Expiration time: ", expiration_time - time = dateutil.parser.parse(expiration_time) - print "ISO FORMAT: ", time.strftime('%Y-%m-%dT%H:%M:%S%Z') + # time = dateutil.parser.parse(expiration_time) + # print "ISO FORMAT: ", time.strftime('%Y-%m-%dT%H:%M:%S%Z') + print "ISO FORMAT: ", expiration_time.strftime('%Y-%m-%dT%H:%M:%S%Z') agreement = { "agreement_id": str(uuid.uuid4()), "template_id": template_id, - "expiration_time": time.strftime('%Y-%m-%dT%H:%M:%S%Z'), + "expiration_time": expiration_time.strftime('%Y-%m-%dT%H:%M:%S%Z'), "consumer": user, } json_data = json.dumps(agreement) return createagreement(json_data, context) - - -def main(): - createagreementsimplified("iMindsServiceWiLab2", - "virtualwall", - "2014-04-34T23:12:12") - - -if __name__ == "__main__": - main() + \ No newline at end of file diff --git a/sla/slaclient/templates/fed4fire/django/agreement.xml b/sla/slaclient/templates/fed4fire/django/agreement.xml index 096a7e3c..9b4c8262 100755 --- a/sla/slaclient/templates/fed4fire/django/agreement.xml +++ b/sla/slaclient/templates/fed4fire/django/agreement.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <wsag:Agreement xmlns:wsag="http://www.ggf.org/namespaces/ws-agreement" - {% if data.agreement_id %}AgreementId="{{data.agreement_id}}"{% endif %}> + {% if data.agreement_id %}wsag:AgreementId="{{data.agreement_id}}"{% endif %}> {% if data.agreement_name %}<wsag:Name>{{data.agreement_name}}</wsag:Name>{% endif %} <wsag:Context> @@ -26,10 +26,10 @@ {% endfor %}</wsag:Variables> </wsag:ServiceProperties> {% for term in data.guarantee_terms %} - <wsag:GuaranteeTerm Name="{{term.name}}"> + <wsag:GuaranteeTerm wsag:Name="{{term.name}}"> {# do not need servicescope #} {% for scope in term.scopes %} - <wsag:ServiceScope ServiceName="{{scope.servicename}}"/> + <wsag:ServiceScope wsag:ServiceName="{{scope.servicename}}"/> {% endfor %} <wsag:ServiceLevelObjective> <wsag:KPITarget> diff --git a/sla/slaclient/xmlconverter.py b/sla/slaclient/xmlconverter.py index 54b365ef..d32a591f 100755 --- a/sla/slaclient/xmlconverter.py +++ b/sla/slaclient/xmlconverter.py @@ -28,6 +28,8 @@ try: except ImportError: from xml.etree import ElementTree +from xml.etree.ElementTree import QName + import dateutil.parser from wsag_model import Agreement @@ -198,12 +200,17 @@ class AgreementConverter(Converter): :param Element xmlroot: root element of xml to convert. :rtype: wsag_model.Agreement """ + for name, value in xmlroot.attrib.items(): + print '{0}="{1}"'.format(name, value) + if xmlroot.tag in self.agreement_tags: result = Agreement() - result.agreement_id = xmlroot.attrib["AgreementId"] + agreementId = str(QName(self._namespaces["wsag"], "AgreementId")) + result.agreement_id = xmlroot.attrib[agreementId] elif xmlroot.tag in self.template_tags: result = Template() - result.template_id = xmlroot.attrib["TemplateId"] + templateId = str(QName(self._namespaces["wsag"], "TemplateId")) + result.template_id = xmlroot.attrib[templateId] else: raise ValueError("Not valid root element name: " + xmlroot.tag) @@ -311,7 +318,6 @@ class AgreementConverter(Converter): return name, result def _parse_guarantees(self, elements): - result = {} for element in elements: key, value = self._parse_guarantee(element) diff --git a/sla/slicetabsla.py b/sla/slicetabsla.py index 73863083..fea71f22 100755 --- a/sla/slicetabsla.py +++ b/sla/slicetabsla.py @@ -20,7 +20,12 @@ from django.http import HttpResponse import json import traceback +import re from math import ceil +from datetime import datetime +from dateutil.relativedelta import relativedelta +from dateutil.tz import tzlocal +from django.conf import settings class Rol: @@ -359,41 +364,80 @@ def _get_agreement_violations(agreement_id, testbed, term=None): class AgreementSimple(APIView): + + regex = r"[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}" + def build_response(self, code, text): response = HttpResponse(text, content_type="text/plain", status=code) return response - def post( self, request, **kwargs): + def post(self, request, **kwargs): #import pdb; pdb.set_trace() print "------------------------------------------------1" - data = {} - for key, value in request.DATA.items(): # jgarcia review this - new_key = key - data[new_key] = value + data = request.POST + + url = settings.SLA_MANAGER_URL + c = restclient.Client(url) + # for key, value in request.DATA.items(): # jgarcia review this + # data[key] = value - try: - template_id = data['template_id'] - except: - return self.build_response(400, 'Invalid template_id') + # print "---- DATA: ----" + # print "Data type: ", type(data) + # for key in data: + # print key, data.getlist(key) try: - user = data['user'] + # template_id = data['template_id'] + testbeds = data.getlist("testbeds") + user = data["user"] + resources = data.getlist("resources") + slice_id = data["slice"] except: - return self.build_response(400, 'Invalid user') + print "FAIL!" + return self.build_response(400, 'Invalid data') + + selected_resources = {} + + now = datetime.now(tzlocal()) + expiration_time = now + relativedelta(years=1) + + for testbed in testbeds: + selected_resources[testbed] = [r for r in resources if testbed in r] + template_id = testbed + try: + print "Calling createagreementsimplified with template_id:",template_id,"and user:",user + result = fed4fireservice.createagreementsimplified( + template_id, user, expiration_time, selected_resources) + print result + except Exception, e: + print traceback.format_exc() + print '%s (%s)' % (e, type(e)) + return self.build_response(400, 'Problem creating agreement') + + agreement_id = re.compile(self.regex).search(result.text).group(0) + + data = '{{ "id": "{}", \ + "slice": "{}", \ + "testbed": "{}" }}'.format(agreement_id, slice_id, testbed) + + c.post( + "sliver", + data, + headers = { + "content-type": "application/json", + "accept": "application/xml" + } + ) - try: - expiration_time = data['expiration_time'] - except: - return self.build_response(400, 'Invalid expiration_time') + return self.build_response(200, result) - try: - print "Calling createagreementsimplified with template_id:",template_id,"and user:",user - result = fed4fireservice.createagreementsimplified(template_id, user, expiration_time) - print result - except Exception, e: - print traceback.format_exc() - print '%s (%s)' % (e, type(e)) - - return self.build_response(400, 'Problem creating agreement') +class Testbeds(APIView): + def get(self, request, **kwargs): + c = restclient.Client("http://157.193.215.125:4001/sla-collector") + #url = settings.SLA_MANAGER_URL.replace("/sla","") + #c = restclient.Client(url) + print "**** URL ******", url + SLAtestbeds = c.get("testbeds") + # Future work: get SLA description for each testbed - return self.build_response(200, result) + return HttpResponse(SLAtestbeds.text, content_type="application/json", status=SLAtestbeds.status_code) diff --git a/sla/templates/slice-tab-sla.html b/sla/templates/slice-tab-sla.html index 2742078f..725d7d9c 100755 --- a/sla/templates/slice-tab-sla.html +++ b/sla/templates/slice-tab-sla.html @@ -35,7 +35,7 @@ <dd>Testbed guarantees 0.99 Uptime rate for 0.99 rate of the resources during the sliver lifetime</dd> <dt>Testbed</dt> <dd>{{ row.agreement.context.testbed_formatted }}</dd> - <dt>Accepted on:</dt> + <dt>Expiration date:</dt> <dd>{{ row.date|default:" " }}</dd> </div> <div class="modal-footer"> diff --git a/sla/urls.py b/sla/urls.py index 93b93852..e385bafd 100755 --- a/sla/urls.py +++ b/sla/urls.py @@ -4,6 +4,7 @@ from sla import slicetabsla urlpatterns = patterns('', url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), + url(r'^testbeds/', slicetabsla.Testbeds.as_view(), name="testbeds"), url(r'^(?P<slicename>[^/]+)/?$', slicetabsla.SLAView.as_view(), name="agreements_summary"), url(r'^agreements/(?P<agreement_id>[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/detail$', slicetabsla.agreement_details, name='agreement_details'), url(r'^agreements/(?P<agreement_id>[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/guarantees/(?P<guarantee_name>\w+)/violations$', slicetabsla.agreement_term_violations, name='agreement_term_violations'),