X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sla%2Fslicetabsla.py;h=fea71f229dc0f50940dd54a5ab4338babb58f45d;hb=refs%2Fheads%2Ff4f-review;hp=196554040855d2c5928706914336cadc8ad8bd2f;hpb=6e24f5c8289f13a60d28a86543e8a84db63f4426;p=myslice.git diff --git a/sla/slicetabsla.py b/sla/slicetabsla.py index 19655404..fea71f22 100755 --- a/sla/slicetabsla.py +++ b/sla/slicetabsla.py @@ -20,6 +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: @@ -93,29 +99,56 @@ class SLAView (FreeAccessView, ThemeView): 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) + for agreement in agreements: - enf = _get_enforcement(agreement.agreement_id) + 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': - 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 + row.append('Evaluating') # Status + row.append('') # Result + row('') # Ok else: - violations[agreement.agreement_id] = 100 + 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 @@ -126,13 +159,15 @@ class SLAView (FreeAccessView, ThemeView): 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): @@ -175,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(): @@ -195,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): @@ -231,11 +266,7 @@ 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) - - print "\n******************" - print violations[-1] - print "******************\n" - + context = { 'agreement_id': agreement_id, 'guarantee_term': agreement.guaranteeterms[guarantee_name], @@ -274,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: @@ -293,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") @@ -303,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: @@ -320,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(): - 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)