1 from __future__ import print_function
3 # this somehow is not used anymore - should it not be ?
5 from datetime import datetime
7 from django.template import RequestContext
8 from django.shortcuts import render_to_response
9 from django.shortcuts import render
10 from django import forms
13 from unfold.loginrequired import LoginRequiredView, FreeAccessView
14 from unfold.page import Page
15 from sla.slaclient import restclient
16 from sla.slaclient import wsag_model
18 from myslice.theme import ThemeView
19 # from sla import SLAPlugin
20 from django.core.urlresolvers import reverse
21 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
23 import slaclient.service.fed4fire.fed4fireservice as fed4fireservice
24 from django.http import HttpResponse
26 from myslice.settings import logger, SLA_COLLECTOR_URL
29 # class AgreementsFilter(object):
30 # def __init__(self, status=None, provider=None, consumer=None):
31 # self.status = status
32 # self.provider = provider
33 # self.consumer = consumer
36 # return "<AgreementsFilter(status={}, provider={}, consumer={})>".format(
37 # self.status, self.provider, self.consumer
41 # def _check(expectedvalue, actualvalue):
42 # if expectedvalue is None or expectedvalue == '':
45 # return actualvalue == expectedvalue
47 # def check(self, agreement):
48 # """Check if this agreement satisfy the filter.
50 # The agreement must be previously annotated
52 # guaranteestatus = agreement.guaranteestatus
53 # provider = agreement.context.provider
54 # consumer = agreement.context.consumer
56 # AgreementsFilter._check(self.status, guaranteestatus) and
57 # AgreementsFilter._check(self.provider, provider) and
58 # AgreementsFilter._check(self.consumer, consumer)
62 # class FilterForm(forms.Form):
63 # _attrs = {'class': 'form-control'}
65 # status = forms.ChoiceField(
68 # (wsag_model.AgreementStatus.StatusEnum.FULFILLED, 'Fulfilled'),
69 # (wsag_model.AgreementStatus.StatusEnum.VIOLATED, 'Violated'),
70 # (wsag_model.AgreementStatus.StatusEnum.NON_DETERMINED, 'Non determined')],
71 # widget=forms.Select(attrs=_attrs),
74 # provider = forms.CharField(
75 # widget=forms.TextInput(attrs=_attrs),
78 # consumer = forms.CharField(
79 # widget=forms.TextInput(attrs=_attrs),
84 class SLAView(FreeAccessView, ThemeView):
85 template_name = 'slice-tab-sla.html'
87 def get(self, request, slicename):
91 # logger.debug("SLA slice name: {}".format(slicename))
97 keys = ['provider', 'agreement',
98 'date', 'status', 'result',
103 # form = FilterForm(request.GET)
104 # if form.is_valid():
105 # filter_ = _get_filter_from_form(form)
107 # consumer_id = _get_consumer_id(request)
109 # agreements = _get_agreements(agreement_id, consumer_id=consumer_id, filter_=filter_)
110 agreements = _get_agreements_by_slice(slicename)
112 for agreement in agreements:
114 provider = agreement.context.provider
115 row.append(provider) # Provider
116 row.append(agreement) # Agreement
117 row.append(agreement.context.time_formatted()) # Date
119 enf = _get_enforcement(agreement.agreement_id, provider)
120 logger.debug("SLA AAAAA: {}".format(agreement.guaranteestatus))
122 if enf.enabled == 'true':
123 row.append('Evaluating') # Status
124 row.append('') # Result
127 if agreement.guaranteestatus == "NON_DETERMINED":
128 row.append('Provisioned') # Status
129 row.append('') # Result
133 row.append('Finished') # Status
135 violations_list = _get_agreement_violations(agreement.agreement_id, provider, "GT_Performance")
137 if len(violations_list) > 0:
138 value = '%.2f' % float(violations_list[0].actual_value)
139 row.append('%d' % (float(value) * 100)) # Result
141 row.append('100') # Result
143 if agreement.guaranteestatus == "VIOLATED":
144 row.append('false') # Ok
146 if agreement.guaranteestatus == "FULFILLED":
147 row.append('true') # Ok
149 for _, terms in agreement.guaranteeterms.items():
151 s = ast.literal_eval(terms.scopes[0].scope.lstrip())
152 logger.debug('SLA scope: {}'.format(s))
155 except Exception as e:
156 logger.debug("SLA EXCEPTION: {}".format(e.message))
158 ag_info.append(dict(zip(keys, row)))
161 # write something of our own instead
162 # more general variables expected in the template
163 template_env['title'] = 'SLA Agreements'
164 template_env['agreements'] = agreements
165 template_env['username'] = request.user
166 template_env['slicename'] = slicename
167 template_env['enforcements'] = enforcements
168 template_env['last_violation_list'] = violations
169 template_env['ag_info'] = ag_info
171 # the prelude object in page contains a summary of the requirements() for all plugins
172 # define {js,css}_{files,chunks}
173 prelude_env = page.prelude_env()
174 template_env.update(prelude_env)
176 return render_to_response(self.template_name, template_env, context_instance=RequestContext(request))
179 # class AgreementsFilter(object):
180 # def __init__(self, status=None, provider=None, consumer=None):
181 # self.status = status
182 # self.provider = provider
183 # self.consumer = consumer
185 # def __repr__(self):
186 # return "<AgreementsFilter(status={}, provider={}, consumer={})>".format(
187 # self.status, self.provider, self.consumer
191 # def _check(expectedvalue, actualvalue):
192 # if expectedvalue is None or expectedvalue == '':
195 # return actualvalue == expectedvalue
197 # def check(self, agreement):
198 # """Check if this agreement satisfy the filter.
200 # The agreement must be previously annotated
202 # guaranteestatus = agreement.guaranteestatus
203 # provider = agreement.context.provider
204 # consumer = agreement.context.consumer
206 # AgreementsFilter._check(self.status, guaranteestatus) and
207 # AgreementsFilter._check(self.provider, provider) and
208 # AgreementsFilter._check(self.consumer, consumer)
212 # class ContactForm(forms.Form):
213 # subject = forms.CharField(max_length=100)
214 # message = forms.CharField()
215 # sender = forms.EmailField()
216 # cc_myself = forms.BooleanField(required=False)
219 def _get_agreements_client():
220 return restclient.Factory.agreements()
223 def _get_violations_client():
224 return restclient.Factory.violations()
227 def _get_enforcements_client():
228 return restclient.Factory.enforcements()
231 def _get_consumer_id(request):
235 def _get_agreement(agreement_id):
236 agreements_client = _get_agreements_client()
237 agreement, response = agreements_client.getbyid(agreement_id)
241 def _get_enforcement(agreement_id, testbed):
242 enforcements_client = _get_enforcements_client()
243 enforcement, response = enforcements_client.getbyagreement(agreement_id, testbed)
247 # def _get_filter_from_form(form):
249 # data = form.cleaned_data
250 # result = AgreementsFilter(
251 # data["status"], data["provider"], data["consumer"])
254 def agreement_term_violations(request, agreement_id, guarantee_name):
256 prelude_env = page.prelude_env()
258 annotator = wsag_helper.AgreementAnnotator()
259 agreement = _get_agreement(agreement_id)
260 violations = _get_agreement_violations(agreement_id, guarantee_name)
261 annotator.annotate_agreement(agreement)
263 slicename = request.POST.get('slicename')
265 paginator = Paginator(violations, 25) # Show 25 violations per page
266 page_num = request.GET.get('page')
269 violation_page = paginator.page(page_num)
270 except PageNotAnInteger:
271 # If page is not an integer, deliver first page.
272 violation_page = paginator.page(1)
274 # If page is out of range (e.g. 9999), deliver first page.
275 violation_page = paginator.page(1)
278 'agreement_id': agreement_id,
279 'guarantee_term': agreement.guaranteeterms[guarantee_name],
280 'violations': violation_page,
281 'agreement': agreement,
282 'slicename': slicename,
283 'last_violation': violations[-1].actual_value
286 context.update(prelude_env)
288 return render_to_response('violations_template.html', context, context_instance=RequestContext(request))
291 # return render(request, 'violations_template.html', context)
294 # TODO Change function to class
295 def agreement_details(request, agreement_id):
297 prelude_env = page.prelude_env()
299 annotator = wsag_helper.AgreementAnnotator()
300 agreement = _get_agreement(agreement_id)
301 violations = _get_agreement_violations(agreement_id)
302 status = _get_agreement_status(agreement_id)
303 annotator.annotate_agreement(agreement, status, violations)
305 violations_by_date = wsag_helper.get_violations_bydate(violations)
307 'agreement_id': agreement_id,
308 'agreement': agreement,
310 'violations_by_date': violations_by_date
313 context.update(prelude_env)
315 return render_to_response('violations_template.html', context, context_instance=RequestContext(request))
316 #return render(request, 'agreement_detail.html', context)
319 # def _get_agreements(agreement_id, slice=None, provider_id=None, consumer_id=None, filter_=None):
321 # agreements_client = _get_agreements_client()
322 # if agreement_id is None:
323 # if consumer_id is not None:
324 # agreements, response = agreements_client.getbyconsumer(consumer_id)
325 # elif provider_id is not None:
326 # agreements, response = agreements_client.getbyprovider(provider_id)
327 # elif slice is not None:
328 # agreements_client = _get_agreements_client("slice")
329 # agreements, response = agreements_client.getbyslice(slice)
332 # "Invalid values: consumer_id and provider_id are None")
334 # agreement, response = agreements_client.getbyid(agreement_id)
335 # agreements = [agreement]
337 # annotator = wsag_helper.AgreementAnnotator()
338 # for agreement in agreements:
339 # id_ = agreement.agreement_id
340 # testbed = agreement.context.provider
341 # status = _get_agreement_status(id_, testbed)
342 # annotator.annotate_agreement(agreement, status)
344 # if filter_ is not None:
345 # print "FILTERING ", repr(filter_)
346 # agreements = filter(filter_.check, agreements)
348 # print "NOT FILTERING"
351 def _get_agreements_by_slice(slice):
352 agreements_client = _get_agreements_client()
353 agreements, response = agreements_client.getbyslice(slice)
355 annotator = wsag_helper.AgreementAnnotator()
356 for agreement in agreements:
357 id_ = agreement.agreement_id
358 testbed = agreement.context.provider
359 status = _get_agreement_status(id_, testbed)
360 annotator.annotate_agreement(agreement, status)
365 # def _get_agreements_by_consumer(consumer_id):
367 # agreements_client = _get_agreements_client()
368 # agreements, response = agreements_client.getbyconsumer(consumer_id)
371 def _get_agreement_status(agreement_id, testbed):
372 agreements_client = _get_agreements_client()
373 status, response = agreements_client.getstatus(agreement_id, testbed)
377 def _get_agreement_violations(agreement_id, testbed, term=None):
378 violations_client = _get_violations_client()
379 violations, response = violations_client.getbyagreement(agreement_id, testbed, term)
383 class Testbeds(FreeAccessView, ThemeView):
384 def get(self, request, *args, **kwargs):
385 c = restclient.Client(SLA_COLLECTOR_URL)
386 #url = settings.SLA_MANAGER_URL.replace("/sla","")
387 #c = restclient.Client(url)
388 # print "**** URL ******", url
389 SLAtestbeds = c.get("testbeds/")
390 # Future work: get SLA description for each testbed
392 return HttpResponse(SLAtestbeds.text, content_type="application/json", status=SLAtestbeds.status_code)
395 class CreateAgreement(LoginRequiredView, ThemeView):
396 def post(self, request, *args, **kwargs):
398 c = restclient.Client(SLA_COLLECTOR_URL)
399 data = request.POST.copy()
401 testbed_urn_regex = r"\+(.*?)\+"
402 pattern = re.compile(testbed_urn_regex)
403 testbed_urn = pattern.search(data["SLIVER_INFO_AGGREGATE_URN"]).group(1)
405 tstmp = data["SLIVER_INFO_EXPIRATION"]
407 dt = datetime.fromtimestamp(float(tstmp))
408 gmt_2 = pytz.timezone("Etc/GMT-2") # FIXME: hardcoded for demo purposes
409 dlocal = gmt_2.localize(dt).isoformat()
411 data["SLIVER_INFO_EXPIRATION"] = dlocal
413 logger.debug("SLA Agreement parameters: {}".format(data))
416 response = c.post("agreements/create/", data=data, testbed=testbed_urn)
417 except Exception as e:
418 import traceback, sys
420 traceback.print_exc(file=sys.stdout)
421 logger.debug("SLA ERROR {}".format(e.message))
423 return HttpResponse(response.text, status=response.status_code)