SLA Application:
[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
110         for agreement in agreements:
111             row = []
112             provider = agreement.context.provider
113             row.append(provider) # Provider
114             row.append(agreement) # Agreement
115             row.append(agreement.context.time_formatted()) # Date
116
117             enf = _get_enforcement(agreement.agreement_id, provider)
118
119             if enf.enabled == 'true':
120                 row.append('Evaluating') # Status
121                 row.append('') # Result
122                 row('') # Ok
123             else:
124                 if agreement.guaranteestatus == "NON_DETERMINED":
125                     row.append('Provisioned') # Status
126                     row.append('') # Result
127                     row.append('') # Ok
128                 
129                 else:
130                     row.append('Finished') # Status
131
132                     violations_list = _get_agreement_violations(agreement.agreement_id, provider, "GT_Performance")
133                     
134                     if len(violations_list) > 0:
135                         value = '%.2f'%float(violations_list[0].actual_value)
136                         row.append('%d'%(float(value)*100)) # Result
137                     else:
138                         row.append('100') # Result
139
140                     if agreement.guaranteestatus == "VIOLATED":
141                         row.append('false') # Ok
142
143                     if agreement.guaranteestatus == "FULFILLED":
144                         row.append('true') # Ok
145
146             ag_info.append(dict(zip(keys,row)))
147
148         template_env = {}
149        # write something of our own instead
150        # more general variables expected in the template
151         template_env['title'] = 'SLA Agreements'
152         template_env['agreements'] = agreements
153         template_env['username'] = request.user
154         template_env['slicename'] = slicename
155         template_env['enforcements'] = enforcements
156         template_env['last_violation_list'] = violations
157         template_env['ag_info'] = ag_info
158
159
160        # the prelude object in page contains a summary of the requirements() for all plugins
161        # define {js,css}_{files,chunks}
162         prelude_env = page.prelude_env()
163         template_env.update(prelude_env)
164
165         return render_to_response(self.template_name, template_env, context_instance=RequestContext(request))
166
167
168 class AgreementsFilter(object):
169     def __init__(self, status=None, provider=None, consumer=None):
170         self.status = status
171         self.provider = provider
172         self.consumer = consumer
173
174     def __repr__(self):
175         return "<AgreementsFilter(status={}, provider={}, consumer={})>".format(
176             self.status, self.provider, self.consumer
177         )
178
179     @staticmethod
180     def _check(expectedvalue, actualvalue):
181         if expectedvalue is None or expectedvalue == '':
182             return True
183         else:
184             return actualvalue == expectedvalue
185
186     def check(self, agreement):
187         """Check if this agreement satisfy the filter.
188
189         The agreement must be previously annotated
190         """
191         guaranteestatus = agreement.guaranteestatus
192         provider = agreement.context.provider
193         consumer = agreement.context.consumer
194         return (
195             AgreementsFilter._check(self.status, guaranteestatus) and
196             AgreementsFilter._check(self.provider, provider) and
197             AgreementsFilter._check(self.consumer, consumer)
198         )
199
200
201 class ContactForm(forms.Form):
202     subject = forms.CharField(max_length=100)
203     message = forms.CharField()
204     sender = forms.EmailField()
205     cc_myself = forms.BooleanField(required=False)
206
207
208 def _get_agreements_client(path=""):
209     return restclient.Factory.agreements(path)
210
211
212 def _get_violations_client():
213     return restclient.Factory.violations()
214
215 def _get_enforcements_client():
216     return restclient.Factory.enforcements()
217
218 def _get_consumer_id(request):
219     return request.user
220
221
222 def _get_agreement(agreement_id):
223
224     agreements_client = _get_agreements_client()
225     agreement, response = agreements_client.getbyid(agreement_id)
226     return agreement
227
228 def _get_enforcement(agreement_id, testbed):
229
230     enforcements_client = _get_enforcements_client()
231     enforcement, response = enforcements_client.getbyagreement(agreement_id, testbed)
232     return enforcement
233
234 def _get_filter_from_form(form):
235
236     data = form.cleaned_data
237     result = AgreementsFilter(
238         data["status"], data["provider"], data["consumer"])
239     return result
240
241 def agreement_term_violations(request, agreement_id, guarantee_name):
242
243     page = Page(request)
244     prelude_env = page.prelude_env()
245
246     annotator = wsag_helper.AgreementAnnotator()
247     agreement = _get_agreement(agreement_id)
248     violations = _get_agreement_violations(agreement_id, guarantee_name)
249     annotator.annotate_agreement(agreement)
250     
251     slicename = request.POST.get('slicename')
252     
253     paginator = Paginator(violations, 25) # Show 25 violations per page
254     page_num = request.GET.get('page')
255     
256     try:
257         violation_page = paginator.page(page_num)
258     except PageNotAnInteger:
259         # If page is not an integer, deliver first page.
260         violation_page = paginator.page(1)
261     except EmptyPage:
262         # If page is out of range (e.g. 9999), deliver first page.
263         violation_page = paginator.page(1)
264  
265     context = {
266         'agreement_id': agreement_id,
267         'guarantee_term': agreement.guaranteeterms[guarantee_name],
268         'violations': violation_page,
269         'agreement': agreement,
270         'slicename': slicename,
271         'last_violation': violations[-1].actual_value
272     }
273     
274     context.update(prelude_env)
275     
276     return render_to_response ('violations_template.html', context, context_instance=RequestContext(request))
277 #     return render(request, 'violations_template.html', context)
278
279 def agreement_details(request, agreement_id):
280     
281     page = Page(request)
282     prelude_env = page.prelude_env()
283     
284     annotator = wsag_helper.AgreementAnnotator()
285     agreement = _get_agreement(agreement_id)
286     violations = _get_agreement_violations(agreement_id)
287     status = _get_agreement_status(agreement_id)
288     annotator.annotate_agreement(agreement, status, violations)
289
290     violations_by_date = wsag_helper.get_violations_bydate(violations)
291     context = {
292         'agreement_id': agreement_id,
293         'agreement': agreement,
294         'status': status,
295         'violations_by_date': violations_by_date
296     }
297     
298     context.update(prelude_env)
299     
300     return render_to_response ('violations_template.html', context, context_instance=RequestContext(request))
301     #return render(request, 'agreement_detail.html', context)
302
303 def _get_agreement(agreement_id):
304
305     agreements_client = _get_agreements_client()
306     agreement, response = agreements_client.getbyid(agreement_id)
307     return agreement
308
309 def _get_agreements(agreement_id, slice=None, provider_id=None, consumer_id=None, filter_=None):
310
311     agreements_client = _get_agreements_client()
312     if agreement_id is None:
313         if consumer_id is not None:
314             agreements, response = agreements_client.getbyconsumer(consumer_id)
315         elif provider_id is not None:
316             agreements, response = agreements_client.getbyprovider(provider_id)
317         elif slice is not None:
318             agreements_client = _get_agreements_client("slice")
319             agreements, response = agreements_client.getbyslice(slice)
320         else:
321             raise ValueError(
322                 "Invalid values: consumer_id and provider_id are None")
323     else:
324         agreement, response = agreements_client.getbyid(agreement_id)
325         agreements = [agreement]
326
327     annotator = wsag_helper.AgreementAnnotator()
328     for agreement in agreements:
329         id_ = agreement.agreement_id
330         testbed = agreement.context.provider
331         status = _get_agreement_status(id_, testbed)
332         annotator.annotate_agreement(agreement, status)
333
334     if filter_ is not None:
335         print "FILTERING ", repr(filter_)
336         agreements = filter(filter_.check, agreements);
337     else:
338         print "NOT FILTERING"
339     return agreements
340
341
342 def _get_agreements_by_consumer(consumer_id):
343
344     agreements_client = _get_agreements_client()
345     agreements, response = agreements_client.getbyconsumer(consumer_id)
346     return agreements
347
348 def _get_agreement_status(agreement_id, testbed):
349
350     agreements_client = _get_agreements_client()
351     status, response = agreements_client.getstatus(agreement_id, testbed)
352     return status
353
354 def _get_agreement_violations(agreement_id, testbed, term=None):
355
356     violations_client = _get_violations_client()
357     violations, response = violations_client.getbyagreement(agreement_id, testbed, term)
358     return violations
359
360
361 class AgreementSimple(APIView):
362     def build_response(self, code, text):
363         response = HttpResponse(text, content_type="text/plain", status=code)
364         return response 
365
366     def post( self, request, **kwargs):
367         #import pdb; pdb.set_trace()
368         print "------------------------------------------------1"
369         data = {}
370         for key, value in request.DATA.items(): # jgarcia review this
371             new_key = key
372             data[new_key] = value
373         
374         try:
375             template_id = data['template_id']
376         except:
377             return self.build_response(400, 'Invalid template_id')
378
379         try:
380             user = data['user']
381         except:
382             return self.build_response(400, 'Invalid user')
383
384         try:
385             expiration_time = data['expiration_time']
386         except:
387             return self.build_response(400, 'Invalid expiration_time')
388
389         try:
390             print "Calling createagreementsimplified with template_id:",template_id,"and user:",user
391             result = fed4fireservice.createagreementsimplified(template_id, user, expiration_time)
392             print result
393         except Exception, e:
394             print traceback.format_exc()
395             print '%s (%s)' % (e, type(e))
396             
397             return self.build_response(400, 'Problem creating agreement')
398
399         return self.build_response(200, result)