Fixed SLA-Collector requests
[unfold.git] / sla / slicetabsla.py
index 6b350d4..564079b 100755 (executable)
@@ -20,6 +20,7 @@ from django.http import HttpResponse
 
 import json
 import traceback
+from math import ceil
 
 
 class Rol:
@@ -92,23 +93,59 @@ class SLAView (FreeAccessView, ThemeView):
         consumer_id = None
         agreement_id = None
         enforcements = {}
+        violations = {}
+        keys = ['provider','agreement','date','status','result','ok']
+        ag_info = []
 
         filter_ = None
         form = FilterForm(request.GET)
         if form.is_valid():
-             print "IS VALID"
-             filter_ = _get_filter_from_form(form)
+            filter_ = _get_filter_from_form(form)
 
         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)
+        print "--- AGREEMENTS ---"
+        print agreements
 
         for agreement in agreements:
-            enf = _get_enforcement(agreement.agreement_id)
-            enforcements[agreement.agreement_id] = enf.enabled
-        
-        for key, value in enforcements.items():
-            print key + ": " + value
+            row = []
+            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, provider)
+
+            if enf.enabled == 'true':
+                row.append('Evaluating') # Status
+                row.append('') # Result
+                row('') # Ok
+            else:
+                if agreement.guaranteestatus == "NON_DETERMINED":
+                    row.append('Provisioned') # Status
+                    row.append('') # Result
+                    row.append('') # Ok
+                
+                else:
+                    row.append('Finished') # Status
+
+                    violations_list = _get_agreement_violations(agreement.agreement_id, provider, "GT_Performance")
+                    
+                    if len(violations_list) > 0:
+                        value = '%.2f'%float(violations_list[0].actual_value)
+                        row.append('%d'%(float(value)*100)) # Result
+                    else:
+                        row.append('100') # Result
+
+                    if agreement.guaranteestatus == "VIOLATED":
+                        row.append('false') # Ok
+
+                    if agreement.guaranteestatus == "FULFILLED":
+                        row.append('true') # Ok
+
+            ag_info.append(dict(zip(keys,row)))
 
         template_env = {}
        # write something of our own instead
@@ -118,13 +155,16 @@ class SLAView (FreeAccessView, ThemeView):
         template_env['username'] = request.user
         template_env['slicename'] = slicename
         template_env['enforcements'] = enforcements
-       
+        template_env['last_violation_list'] = violations
+        template_env['ag_info'] = ag_info
+
+
        # the prelude object in page contains a summary of the requirements() for all plugins
        # define {js,css}_{files,chunks}
         prelude_env = page.prelude_env()
         template_env.update(prelude_env)
-        
-        return render_to_response (self.template_name, template_env, context_instance=RequestContext(request))
+
+        return render_to_response(self.template_name, template_env, context_instance=RequestContext(request))
 
 
 class AgreementsFilter(object):
@@ -167,8 +207,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():
@@ -187,10 +227,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):
@@ -223,13 +263,14 @@ def agreement_term_violations(request, agreement_id, guarantee_name):
     except EmptyPage:
         # If page is out of range (e.g. 9999), deliver first page.
         violation_page = paginator.page(1)
-    
     context = {
         'agreement_id': agreement_id,
         'guarantee_term': agreement.guaranteeterms[guarantee_name],
         'violations': violation_page,
         'agreement': agreement,
         'slicename': slicename,
+        'last_violation': violations[-1].actual_value
     }
     
     context.update(prelude_env)
@@ -261,18 +302,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:
@@ -280,6 +316,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")
@@ -290,7 +329,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:
@@ -307,16 +347,16 @@ 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
 
 
@@ -329,7 +369,7 @@ class AgreementSimple(APIView):
         #import pdb; pdb.set_trace()
         print "------------------------------------------------1"
         data = {}
-        for key, value in request.DATA.items():
+        for key, value in request.DATA.items(): # jgarcia review this
             new_key = key
             data[new_key] = value