####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"
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();
+ });
},
<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>
class Factory(object):
@staticmethod
- def agreements(path):
+ def agreements(path=_AGREEMENTS_PATH):
"""Returns a REST client for Agreements
:rtype : Agreements
if "headers" not in kwargs:
kwargs["headers"] = {"accept": "application/xml"}
+
kwargs["auth"] = HTTPBasicAuth(settings.SLA_MANAGER_USER,
settings.SLA_MANAGER_PASSWORD)
)
"""
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>"
"""
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):
"""
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
# Builds AgreementInput from json\r
data = jsonparser.agreementinput_from_json(json_data)\r
# Read template from manager\r
- slatemplate, request = client_templates.getbyid(data.template_id)\r
+ slatemplate, request = client_templates.getbyid(data.template_id, data.template_id)\r
# Copy (overriding if necessary) from template to AgreementInput\r
final_data = data.from_template(slatemplate)\r
slaagreement = fed4fire.render_slaagreement(final_data)\r
\r
client_agreements = context.restfactory.agreements()\r
- return client_agreements.create(slaagreement)\r
+ return client_agreements.create(slaagreement, data.template_id)\r
\r
\r
-def createagreementsimplified(template_id, user, expiration_time):\r
+def createagreementsimplified(template_id, user, expiration_time, resources):\r
context = ServiceContext(\r
restclient.Factory(),\r
TemplateFactory()\r
\r
print "Expiration time: ", expiration_time\r
\r
- time = dateutil.parser.parse(expiration_time)\r
- print "ISO FORMAT: ", time.strftime('%Y-%m-%dT%H:%M:%S%Z')\r
+ # time = dateutil.parser.parse(expiration_time)\r
+ # print "ISO FORMAT: ", time.strftime('%Y-%m-%dT%H:%M:%S%Z')\r
+ print "ISO FORMAT: ", expiration_time.strftime('%Y-%m-%dT%H:%M:%S%Z')\r
\r
agreement = {\r
"agreement_id": str(uuid.uuid4()),\r
"template_id": template_id,\r
- "expiration_time": time.strftime('%Y-%m-%dT%H:%M:%S%Z'),\r
+ "expiration_time": expiration_time.strftime('%Y-%m-%dT%H:%M:%S%Z'),\r
"consumer": user,\r
}\r
\r
json_data = json.dumps(agreement)\r
\r
return createagreement(json_data, context)\r
-\r
-\r
-def main():\r
- createagreementsimplified("iMindsServiceWiLab2",\r
- "virtualwall",\r
- "2014-04-34T23:12:12")\r
-\r
-\r
-if __name__ == "__main__":\r
- main()\r
+
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>\r
<wsag:Agreement xmlns:wsag="http://www.ggf.org/namespaces/ws-agreement"\r
- {% if data.agreement_id %}AgreementId="{{data.agreement_id}}"{% endif %}>\r
+ {% if data.agreement_id %}wsag:AgreementId="{{data.agreement_id}}"{% endif %}>\r
{% if data.agreement_name %}<wsag:Name>{{data.agreement_name}}</wsag:Name>{% endif %}\r
\r
<wsag:Context>\r
{% endfor %}</wsag:Variables>\r
</wsag:ServiceProperties>\r
{% for term in data.guarantee_terms %}\r
- <wsag:GuaranteeTerm Name="{{term.name}}">\r
+ <wsag:GuaranteeTerm wsag:Name="{{term.name}}">\r
{# do not need servicescope #}\r
{% for scope in term.scopes %}\r
- <wsag:ServiceScope ServiceName="{{scope.servicename}}"/>\r
+ <wsag:ServiceScope wsag:ServiceName="{{scope.servicename}}"/>\r
{% endfor %}\r
<wsag:ServiceLevelObjective>\r
<wsag:KPITarget>\r
except ImportError:
from xml.etree import ElementTree
+from xml.etree.ElementTree import QName
+
import dateutil.parser
from wsag_model import Agreement
: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)
return name, result
def _parse_guarantees(self, elements):
-
result = {}
for element in elements:
key, value = self._parse_guarantee(element)
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:
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)
<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">
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'),