Cleaned code and improved communication with SLA Collector
authorJavier García <javier.garcial.external@atos.net>
Fri, 29 Aug 2014 12:01:24 +0000 (14:01 +0200)
committerJavier García <javier.garcial.external@atos.net>
Fri, 29 Aug 2014 12:01:24 +0000 (14:01 +0200)
myslice/settings.py
plugins/queryupdater/static/js/queryupdater.js
plugins/sladialog/templates/sladialog.html
sla/slaclient/restclient.py
sla/slaclient/service/fed4fire/fed4fireservice.py
sla/slaclient/templates/fed4fire/django/agreement.xml
sla/slaclient/xmlconverter.py
sla/slicetabsla.py
sla/templates/slice-tab-sla.html
sla/urls.py

index 5faef7f..fe71e10 100644 (file)
@@ -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"
index 5d017b9..2e73629 100644 (file)
         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();
+            }); 
         },
 
      
index ce27c2e..cb50c29 100644 (file)
@@ -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>
index ab38cc4..ec5da1d 100755 (executable)
@@ -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
index f11e8a1..adec86b 100755 (executable)
@@ -105,16 +105,16 @@ def createagreement(json_data, context):
     # 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
@@ -122,26 +122,18 @@ def createagreementsimplified(template_id, user, expiration_time):
 \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
index 096a7e3..9b4c826 100755 (executable)
@@ -1,6 +1,6 @@
 <?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
index 54b365e..d32a591 100755 (executable)
@@ -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)
index 7386308..fea71f2 100755 (executable)
@@ -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)
index 2742078..725d7d9 100755 (executable)
@@ -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:"&nbsp;" }}</dd>
                        </div>
                        <div class="modal-footer">
index 93b9385..e385baf 100755 (executable)
@@ -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'),