Scheduler: adding/removing resources enforce warnings and recount number of unconfigu...
[myslice.git] / sla / slicetabsla.py
index b220af1..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:
@@ -104,15 +109,17 @@ class SLAView (FreeAccessView, ThemeView):
 
         consumer_id = _get_consumer_id(request)
 
-        agreements = _get_agreements(agreement_id, consumer_id=consumer_id, filter_=filter_)
+        #agreements = _get_agreements(agreement_id, consumer_id=consumer_id, filter_=filter_)
+        agreements = _get_agreements(agreement_id, slice=slicename)
 
         for agreement in agreements:
             row = []
-            row.append(agreement.context.provider) # Provider
+            provider = agreement.context.provider
+            row.append(provider) # Provider
             row.append(agreement) # Agreement
             row.append(agreement.context.time_formatted()) # Date
 
-            enf = _get_enforcement(agreement.agreement_id)
+            enf = _get_enforcement(agreement.agreement_id, provider)
 
             if enf.enabled == 'true':
                 row.append('Evaluating') # Status
@@ -127,7 +134,7 @@ class SLAView (FreeAccessView, ThemeView):
                 else:
                     row.append('Finished') # Status
 
-                    violations_list = _get_agreement_violations(agreement.agreement_id, "GT_Performance")
+                    violations_list = _get_agreement_violations(agreement.agreement_id, provider, "GT_Performance")
                     
                     if len(violations_list) > 0:
                         value = '%.2f'%float(violations_list[0].actual_value)
@@ -143,18 +150,6 @@ class SLAView (FreeAccessView, ThemeView):
 
             ag_info.append(dict(zip(keys,row)))
 
-            # enf = _get_enforcement(agreement.agreement_id)
-            # if enf.enabled == 'true':
-            #     enforcements[agreement.agreement_id] = "ACTIVE"
-            # else:
-            #     enforcements[agreement.agreement_id] = "UNACTIVE"
-            # violations_list = _get_agreement_violations(agreement.agreement_id, "GT_Performance")
-
-            # if len(violations_list):
-            #     violations[agreement.agreement_id] = float(violations_list[0]["actualValue"])*100
-            # else:
-            #     violations[agreement.agreement_id] = 100
-
         template_env = {}
        # write something of our own instead
        # more general variables expected in the template
@@ -215,8 +210,8 @@ class ContactForm(forms.Form):
     cc_myself = forms.BooleanField(required=False)
 
 
-def _get_agreements_client():
-    return restclient.Factory.agreements()
+def _get_agreements_client(path=""):
+    return restclient.Factory.agreements(path)
 
 
 def _get_violations_client():
@@ -235,10 +230,10 @@ def _get_agreement(agreement_id):
     agreement, response = agreements_client.getbyid(agreement_id)
     return agreement
 
-def _get_enforcement(agreement_id):
+def _get_enforcement(agreement_id, testbed):
 
     enforcements_client = _get_enforcements_client()
-    enforcement, response = enforcements_client.getbyagreement(agreement_id)
+    enforcement, response = enforcements_client.getbyagreement(agreement_id, testbed)
     return enforcement
 
 def _get_filter_from_form(form):
@@ -310,18 +305,13 @@ def agreement_details(request, agreement_id):
     return render_to_response ('violations_template.html', context, context_instance=RequestContext(request))
     #return render(request, 'agreement_detail.html', context)
 
-
-def _get_agreements_client():
-    return restclient.Factory.agreements()
-
-
 def _get_agreement(agreement_id):
 
     agreements_client = _get_agreements_client()
     agreement, response = agreements_client.getbyid(agreement_id)
     return agreement
 
-def _get_agreements(agreement_id, provider_id=None, consumer_id=None, filter_=None):
+def _get_agreements(agreement_id, slice=None, provider_id=None, consumer_id=None, filter_=None):
 
     agreements_client = _get_agreements_client()
     if agreement_id is None:
@@ -329,6 +319,9 @@ def _get_agreements(agreement_id, provider_id=None, consumer_id=None, filter_=No
             agreements, response = agreements_client.getbyconsumer(consumer_id)
         elif provider_id is not None:
             agreements, response = agreements_client.getbyprovider(provider_id)
+        elif slice is not None:
+            agreements_client = _get_agreements_client("slice")
+            agreements, response = agreements_client.getbyslice(slice)
         else:
             raise ValueError(
                 "Invalid values: consumer_id and provider_id are None")
@@ -339,7 +332,8 @@ def _get_agreements(agreement_id, provider_id=None, consumer_id=None, filter_=No
     annotator = wsag_helper.AgreementAnnotator()
     for agreement in agreements:
         id_ = agreement.agreement_id
-        status = _get_agreement_status(id_)
+        testbed = agreement.context.provider
+        status = _get_agreement_status(id_, testbed)
         annotator.annotate_agreement(agreement, status)
 
     if filter_ is not None:
@@ -356,55 +350,94 @@ def _get_agreements_by_consumer(consumer_id):
     agreements, response = agreements_client.getbyconsumer(consumer_id)
     return agreements
 
-def _get_agreement_status(agreement_id):
+def _get_agreement_status(agreement_id, testbed):
 
     agreements_client = _get_agreements_client()
-    status, response = agreements_client.getstatus(agreement_id)
+    status, response = agreements_client.getstatus(agreement_id, testbed)
     return status
 
-def _get_agreement_violations(agreement_id, term=None):
+def _get_agreement_violations(agreement_id, testbed, term=None):
 
     violations_client = _get_violations_client()
-    violations, response = violations_client.getbyagreement(agreement_id, term)
+    violations, response = violations_client.getbyagreement(agreement_id, testbed, term)
     return violations
 
 
 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)