Fixed SLA-Collector requests
[myslice.git] / sla / slicetabsla.py
1 # this somehow is not used anymore - should it not be ?
2 from django.template import RequestContext
3 from django.shortcuts import render_to_response
4 from django.shortcuts import render
5 from django import forms
6
7 from unfold.loginrequired import FreeAccessView
8 from unfold.page import Page
9 from sla.slaclient import restclient
10 from sla.slaclient import wsag_model
11 import wsag_helper
12 from myslice.theme import ThemeView
13 # from sla import SLAPlugin
14 from django.core.urlresolvers import reverse
15 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
16
17 import slaclient.service.fed4fire.fed4fireservice as fed4fireservice
18 from rest_framework.views import APIView
19 from django.http import HttpResponse
20
21 import json
22 import traceback
23 from math import ceil
24
25
26 class Rol:
27     CONSUMER = "CONSUMER"
28     PROVIDER = "PROVIDER"
29
30
31 class AgreementsFilter(object):
32     def __init__(self, status=None, provider=None, consumer=None):
33         self.status = status
34         self.provider = provider
35         self.consumer = consumer
36
37     def __repr__(self):
38         return "<AgreementsFilter(status={}, provider={}, consumer={})>".format(
39             self.status, self.provider, self.consumer
40         )
41
42     @staticmethod
43     def _check(expectedvalue, actualvalue):
44         if expectedvalue is None or expectedvalue == '':
45             return True
46         else:
47             return actualvalue == expectedvalue
48
49     def check(self, agreement):
50         """Check if this agreement satisfy the filter.
51
52         The agreement must be previously annotated
53         """
54         guaranteestatus = agreement.guaranteestatus
55         provider = agreement.context.provider
56         consumer = agreement.context.consumer
57         return (
58             AgreementsFilter._check(self.status, guaranteestatus) and
59             AgreementsFilter._check(self.provider, provider) and
60             AgreementsFilter._check(self.consumer, consumer)
61         )
62
63
64 class FilterForm(forms.Form):
65     _attrs = {'class': 'form-control'}
66     exclude = ()
67     status = forms.ChoiceField(
68         choices=[
69             ('', 'All'),
70             (wsag_model.AgreementStatus.StatusEnum.FULFILLED, 'Fulfilled'),
71             (wsag_model.AgreementStatus.StatusEnum.VIOLATED, 'Violated'),
72             (wsag_model.AgreementStatus.StatusEnum.NON_DETERMINED, 'Non determined')],
73         widget=forms.Select(attrs=_attrs),
74         required=False
75     )
76     provider = forms.CharField(
77         widget=forms.TextInput(attrs=_attrs),
78         required=False
79     )
80     consumer = forms.CharField(
81         widget=forms.TextInput(attrs=_attrs),
82         required=False
83     )
84
85
86 class SLAView (FreeAccessView, ThemeView):
87     template_name = 'slice-tab-sla.html'
88
89     def get (self, request, slicename, state=None):
90
91         page=Page(request)
92
93         consumer_id = None
94         agreement_id = None
95         enforcements = {}
96         violations = {}
97         keys = ['provider','agreement','date','status','result','ok']
98         ag_info = []
99
100         filter_ = None
101         form = FilterForm(request.GET)
102         if form.is_valid():
103             filter_ = _get_filter_from_form(form)
104
105         consumer_id = _get_consumer_id(request)
106
107         #agreements = _get_agreements(agreement_id, consumer_id=consumer_id, filter_=filter_)
108         agreements = _get_agreements(agreement_id, slice=slicename)
109         print "--- AGREEMENTS ---"
110         print agreements
111
112         for agreement in agreements:
113             row = []
114             provider = agreement.context.provider
115             row.append(provider) # Provider
116             row.append(agreement) # Agreement
117             row.append(agreement.context.time_formatted()) # Date
118
119             enf = _get_enforcement(agreement.agreement_id, provider)
120
121             if enf.enabled == 'true':
122                 row.append('Evaluating') # Status
123                 row.append('') # Result
124                 row('') # Ok
125             else:
126                 if agreement.guaranteestatus == "NON_DETERMINED":
127                     row.append('Provisioned') # Status
128                     row.append('') # Result
129                     row.append('') # Ok
130                 
131                 else:
132                     row.append('Finished') # Status
133
134                     violations_list = _get_agreement_violations(agreement.agreement_id, provider, "GT_Performance")
135                     
136                     if len(violations_list) > 0:
137                         value = '%.2f'%float(violations_list[0].actual_value)
138                         row.append('%d'%(float(value)*100)) # Result
139                     else:
140                         row.append('100') # Result
141
142                     if agreement.guaranteestatus == "VIOLATED":
143                         row.append('false') # Ok
144
145                     if agreement.guaranteestatus == "FULFILLED":
146                         row.append('true') # Ok
147
148             ag_info.append(dict(zip(keys,row)))
149
150         template_env = {}
151        # write something of our own instead
152        # more general variables expected in the template
153         template_env['title'] = 'SLA Agreements'
154         template_env['agreements'] = agreements
155         template_env['username'] = request.user
156         template_env['slicename'] = slicename
157         template_env['enforcements'] = enforcements
158         template_env['last_violation_list'] = violations
159         template_env['ag_info'] = ag_info
160
161
162        # the prelude object in page contains a summary of the requirements() for all plugins
163        # define {js,css}_{files,chunks}
164         prelude_env = page.prelude_env()
165         template_env.update(prelude_env)
166
167         return render_to_response(self.template_name, template_env, context_instance=RequestContext(request))
168
169
170 class AgreementsFilter(object):
171     def __init__(self, status=None, provider=None, consumer=None):
172         self.status = status
173         self.provider = provider
174         self.consumer = consumer
175
176     def __repr__(self):
177         return "<AgreementsFilter(status={}, provider={}, consumer={})>".format(
178             self.status, self.provider, self.consumer
179         )
180
181     @staticmethod
182     def _check(expectedvalue, actualvalue):
183         if expectedvalue is None or expectedvalue == '':
184             return True
185         else:
186             return actualvalue == expectedvalue
187
188     def check(self, agreement):
189         """Check if this agreement satisfy the filter.
190
191         The agreement must be previously annotated
192         """
193         guaranteestatus = agreement.guaranteestatus
194         provider = agreement.context.provider
195         consumer = agreement.context.consumer
196         return (
197             AgreementsFilter._check(self.status, guaranteestatus) and
198             AgreementsFilter._check(self.provider, provider) and
199             AgreementsFilter._check(self.consumer, consumer)
200         )
201
202
203 class ContactForm(forms.Form):
204     subject = forms.CharField(max_length=100)
205     message = forms.CharField()
206     sender = forms.EmailField()
207     cc_myself = forms.BooleanField(required=False)
208
209
210 def _get_agreements_client(path=""):
211     return restclient.Factory.agreements(path)
212
213
214 def _get_violations_client():
215     return restclient.Factory.violations()
216
217 def _get_enforcements_client():
218     return restclient.Factory.enforcements()
219
220 def _get_consumer_id(request):
221     return request.user
222
223
224 def _get_agreement(agreement_id):
225
226     agreements_client = _get_agreements_client()
227     agreement, response = agreements_client.getbyid(agreement_id)
228     return agreement
229
230 def _get_enforcement(agreement_id, testbed):
231
232     enforcements_client = _get_enforcements_client()
233     enforcement, response = enforcements_client.getbyagreement(agreement_id, testbed)
234     return enforcement
235
236 def _get_filter_from_form(form):
237
238     data = form.cleaned_data
239     result = AgreementsFilter(
240         data["status"], data["provider"], data["consumer"])
241     return result
242
243 def agreement_term_violations(request, agreement_id, guarantee_name):
244
245     page = Page(request)
246     prelude_env = page.prelude_env()
247
248     annotator = wsag_helper.AgreementAnnotator()
249     agreement = _get_agreement(agreement_id)
250     violations = _get_agreement_violations(agreement_id, guarantee_name)
251     annotator.annotate_agreement(agreement)
252     
253     slicename = request.POST.get('slicename')
254     
255     paginator = Paginator(violations, 25) # Show 25 violations per page
256     page_num = request.GET.get('page')
257     
258     try:
259         violation_page = paginator.page(page_num)
260     except PageNotAnInteger:
261         # If page is not an integer, deliver first page.
262         violation_page = paginator.page(1)
263     except EmptyPage:
264         # If page is out of range (e.g. 9999), deliver first page.
265         violation_page = paginator.page(1)
266  
267     context = {
268         'agreement_id': agreement_id,
269         'guarantee_term': agreement.guaranteeterms[guarantee_name],
270         'violations': violation_page,
271         'agreement': agreement,
272         'slicename': slicename,
273         'last_violation': violations[-1].actual_value
274     }
275     
276     context.update(prelude_env)
277     
278     return render_to_response ('violations_template.html', context, context_instance=RequestContext(request))
279 #     return render(request, 'violations_template.html', context)
280
281 def agreement_details(request, agreement_id):
282     
283     page = Page(request)
284     prelude_env = page.prelude_env()
285     
286     annotator = wsag_helper.AgreementAnnotator()
287     agreement = _get_agreement(agreement_id)
288     violations = _get_agreement_violations(agreement_id)
289     status = _get_agreement_status(agreement_id)
290     annotator.annotate_agreement(agreement, status, violations)
291
292     violations_by_date = wsag_helper.get_violations_bydate(violations)
293     context = {
294         'agreement_id': agreement_id,
295         'agreement': agreement,
296         'status': status,
297         'violations_by_date': violations_by_date
298     }
299     
300     context.update(prelude_env)
301     
302     return render_to_response ('violations_template.html', context, context_instance=RequestContext(request))
303     #return render(request, 'agreement_detail.html', context)
304
305 def _get_agreement(agreement_id):
306
307     agreements_client = _get_agreements_client()
308     agreement, response = agreements_client.getbyid(agreement_id)
309     return agreement
310
311 def _get_agreements(agreement_id, slice=None, provider_id=None, consumer_id=None, filter_=None):
312
313     agreements_client = _get_agreements_client()
314     if agreement_id is None:
315         if consumer_id is not None:
316             agreements, response = agreements_client.getbyconsumer(consumer_id)
317         elif provider_id is not None:
318             agreements, response = agreements_client.getbyprovider(provider_id)
319         elif slice is not None:
320             agreements_client = _get_agreements_client("slice")
321             agreements, response = agreements_client.getbyslice(slice)
322         else:
323             raise ValueError(
324                 "Invalid values: consumer_id and provider_id are None")
325     else:
326         agreement, response = agreements_client.getbyid(agreement_id)
327         agreements = [agreement]
328
329     annotator = wsag_helper.AgreementAnnotator()
330     for agreement in agreements:
331         id_ = agreement.agreement_id
332         testbed = agreement.context.provider
333         status = _get_agreement_status(id_, testbed)
334         annotator.annotate_agreement(agreement, status)
335
336     if filter_ is not None:
337         print "FILTERING ", repr(filter_)
338         agreements = filter(filter_.check, agreements);
339     else:
340         print "NOT FILTERING"
341     return agreements
342
343
344 def _get_agreements_by_consumer(consumer_id):
345
346     agreements_client = _get_agreements_client()
347     agreements, response = agreements_client.getbyconsumer(consumer_id)
348     return agreements
349
350 def _get_agreement_status(agreement_id, testbed):
351
352     agreements_client = _get_agreements_client()
353     status, response = agreements_client.getstatus(agreement_id, testbed)
354     return status
355
356 def _get_agreement_violations(agreement_id, testbed, term=None):
357
358     violations_client = _get_violations_client()
359     violations, response = violations_client.getbyagreement(agreement_id, testbed, term)
360     return violations
361
362
363 class AgreementSimple(APIView):
364     def build_response(self, code, text):
365         response = HttpResponse(text, content_type="text/plain", status=code)
366         return response 
367
368     def post( self, request, **kwargs):
369         #import pdb; pdb.set_trace()
370         print "------------------------------------------------1"
371         data = {}
372         for key, value in request.DATA.items(): # jgarcia review this
373             new_key = key
374             data[new_key] = value
375         
376         try:
377             template_id = data['template_id']
378         except:
379             return self.build_response(400, 'Invalid template_id')
380
381         try:
382             user = data['user']
383         except:
384             return self.build_response(400, 'Invalid user')
385
386         try:
387             expiration_time = data['expiration_time']
388         except:
389             return self.build_response(400, 'Invalid expiration_time')
390
391         try:
392             print "Calling createagreementsimplified with template_id:",template_id,"and user:",user
393             result = fed4fireservice.createagreementsimplified(template_id, user, expiration_time)
394             print result
395         except Exception, e:
396             print traceback.format_exc()
397             print '%s (%s)' % (e, type(e))
398             
399             return self.build_response(400, 'Problem creating agreement')
400
401         return self.build_response(200, result)