--- /dev/null
+from django.contrib.auth import authenticate, login, logout\r
+from django.template import RequestContext\r
+from django.shortcuts import render, render_to_response\r
+\r
+from manifoldapi.manifoldresult import ManifoldResult\r
+from ui.topmenu import topmenu_items, the_user\r
+from myslice.configengine import ConfigEngine\r
+from manifold.core.query import Query\r
+from unfold.page import Page\r
+from manifoldapi.manifoldapi import execute_admin_query, execute_query\r
+from unfold.loginrequired import LoginRequiredAutoLogoutView\r
+\r
+from myslice.theme import ThemeView\r
+import json\r
+import hashlib\r
+import datetime\r
+import urllib2\r
+import ast\r
+from django.views.decorators.csrf import csrf_exempt\r
+from django.http import *\r
+\r
+def response_mimetype(request):\r
+ \r
+ if "application/json" in request.META['HTTP_ACCEPT']:\r
+ return "application/json"\r
+ else:\r
+ return "text/plain"\r
+ \r
+\r
+def json_to_rest(url, data ):\r
+ \r
+ req = urllib2.Request(url)\r
+ req.add_header('Content-Type', 'application/json')\r
+ response = urllib2.urlopen(req, json.dumps(data))\r
+ \r
+ if data == "a":\r
+ mylist = ast.literal_eval(response.read())\r
+ else:\r
+ mylist = response.read().translate(None, '"[]').split(",")\r
+ \r
+ return (mylist)\r
+\r
+\r
+def unix_to_timestamp(timest):\r
+ try:\r
+ return datetime.datetime.fromtimestamp(int(timest)).strftime('%Y-%m-%d %H:%M:%S')\r
+ except:\r
+ return timest\r
+\r
+def timestamp_to_unix(timest):\r
+ try:\r
+ pass\r
+ except:\r
+ pass\r
+ \r
+ \r
+def slice_to_exp(slices_users):\r
+ experiments = {}\r
+ testbeds = {}\r
+ \r
+ \r
+ for slice in slices_users:\r
+ nodes={}\r
+ leases = slice['lease']\r
+ if leases is not None:\r
+ for lease in leases:\r
+ resource = lease['resource']\r
+ start_t = lease['start_time']\r
+ end_t = lease['end_time']\r
+ #node = lease['resource']\r
+ \r
+ testbed_start = resource.index('IDN+')+4\r
+ testbed_end = resource.index('+node+')\r
+ \r
+ testbed = resource[testbed_start:testbed_end]\r
+ node = resource[testbed_end+6:]\r
+ \r
+ if testbed in testbeds:\r
+ if node not in testbeds[testbed]:\r
+ testbeds[testbed].append(node)\r
+ else:\r
+ testbeds[testbed] = [node]\r
+ \r
+ #group nodes in consecutive timeslots\r
+ if not node in nodes: \r
+ nodes[node]={str(start_t):{'start_t':start_t, 'nodes':node, 'end_t':end_t}}\r
+ else:\r
+ if not str(start_t) in nodes[node]:\r
+ f=0\r
+ for n in nodes[node]:\r
+ if n[str(end_t)] == start_t:\r
+ n[str(end_t)] == end_t\r
+ f=1\r
+ if f==0:\r
+ nodes[node][str(start_t)]={'start_t':start_t, 'nodes':node, 'end_t':end_t}\r
+ \r
+ #group grouped nodes in experiments\r
+ for n in nodes:\r
+ for exp in nodes[n]:\r
+ key = str(exp) + str(nodes[n][exp]['end_t'])\r
+ \r
+ if key not in experiments:\r
+ experiments[key]={'slice_hrn':slice['slice_hrn'], \\r
+ 'start':nodes[n][exp]['start_t'], 'end':nodes[n][exp]['end_t'], 'nodes':[nodes[n][exp]['nodes']]} \r
+ elif nodes[n][exp]['end_t'] == experiments[key]['end']:\r
+ experiments[key]['nodes'].append(nodes[n][exp]['nodes'])\r
+ \r
+ return (experiments,testbeds)\r
+ \r
+class ReputationView (LoginRequiredAutoLogoutView, ThemeView):\r
+ template_name = 'reputation.html'\r
+ \r
+ # expose this so we can mention the backend URL on the welcome page\r
+ def default_env (self):\r
+ return { \r
+ 'MANIFOLD_URL':ConfigEngine().manifold_url(),\r
+ }\r
+\r
+ def post (self,request):\r
+ env = self.default_env()\r
+ env['theme'] = self.theme\r
+ \r
+ \r
+ \r
+ with open('/home/coyiotis/testlog.log') as f:\r
+ f.write(str('test'))\r
+ \r
+ \r
+ return render_to_response(self.template, env, context_instance=RequestContext(request))\r
+\r
+\r
+ \r
+ \r
+ def get (self, request, state=None):\r
+ env = self.default_env()\r
+ \r
+ ##### *** Reputation Plugin-specific START *** ############\r
+ with open('/home/coyiotis/testlog.log', 'w') as f:\r
+ f.write(str(request.GET))\r
+ for key in request.GET:\r
+ f.write('\n')\r
+ f.write(str(request.GET[key]))\r
+ \r
+ #The following 'if' is a dirty way for bypassing the JS AJAX cross-domain prevention policy...not pretty\r
+ if request.GET.has_key(u'slicedata[user_eval][overall]'):\r
+ dict_to_send = {}\r
+ dict_to_send['eid'] = str(request.GET[u'slicedata[id]'])\r
+ dict_to_send['slice_hrn'] = str(request.GET[u'slicedata[slice_hrn]'])\r
+ dict_to_send['user_hrn'] = str(request.GET[u'slicedata[user_hrn]'])\r
+ dict_to_send['start_tunix'] = str(request.GET[u'slicedata[start_tunix]'])\r
+ dict_to_send['end_tunix'] = str(request.GET[u'slicedata[end_tunix]'])\r
+ dict_to_send['start_t'] = str(request.GET[u'slicedata[start_t]'])\r
+ dict_to_send['end_t'] = str(request.GET[u'slicedata[end_t]'])\r
+ dict_to_send['testbeds'] = ast.literal_eval(str(request.GET[u'testbeds']))\r
+ dict_to_send['user_eval'] = {}\r
+ dict_to_send['user_eval']['reuse'] = str(request.GET[u'slicedata[user_eval][reuse]'])\r
+ dict_to_send['user_eval']['availability'] = str(request.GET[u'slicedata[user_eval][availability]'])\r
+ dict_to_send['user_eval']['pay'] = str(request.GET[u'slicedata[user_eval][pay]'])\r
+ dict_to_send['user_eval']['support'] = str(request.GET[u'slicedata[user_eval][support]'])\r
+ dict_to_send['user_eval']['overall'] = str(request.GET[u'slicedata[user_eval][overall]'])\r
+ dict_to_send['user_eval']['link_quality'] = str(request.GET[u'slicedata[user_eval][link_quality]'])\r
+ dict_to_send['user_eval']['problems'] = str(request.GET[u'slicedata[user_eval][problems]'])\r
+ dict_to_send['user_eval']['quality'] = str(request.GET[u'slicedata[user_eval][quality]'])\r
+ \r
+ slicedata_received = json_to_rest('http://survivor.lab.netmode.ntua.gr:4567/reputation/json', dict_to_send )\r
+ \r
+ return HttpResponse(json.dumps(slicedata_received), content_type = response_mimetype(self.request))\r
+\r
+ \r
+ slices_users = []\r
+ \r
+ #get slices\r
+ userslice_query = Query().get('slice').select('slice_urn', 'slice_hrn', 'users', 'resource', 'lease')\r
+ slice_details = execute_query(self.request, userslice_query)\r
+ \r
+ #get local users\r
+ local_user_query = Query().get('local:user').select('email','status','config')\r
+ local_user_details = execute_admin_query(self.request, local_user_query)\r
+ \r
+ #get users - create dict[email]=hrn\r
+ user_query = Query().get('user').select('user_hrn','user_urn','user_email')\r
+ user_details = execute_admin_query(self.request, user_query)\r
+ users_hrn = {}\r
+ for item in user_details:\r
+ users_hrn[item['user_email']] = item['user_hrn']\r
+ \r
+ #get currenct username (email)\r
+ if request.user.is_authenticated():\r
+ cur_username = request.user.username \r
+ \r
+ #get a list of all the slices for the logged in user\r
+ testbeds = []\r
+\r
+ for slice in slice_details:\r
+\r
+ if users_hrn[cur_username] in slice['users']:\r
+ slices_users.append({'slice_hrn':slice['slice_hrn'], 'user':cur_username, 'user_hrn':users_hrn[cur_username] \\r
+ , 'resource':slice['resource'], 'lease':slice['lease'] }) \r
+ \r
+ \r
+ env['slices_users'] = slices_users ### For logging\r
+ \r
+ #####create slicelist for template & JSON\r
+ experiments,testbeds = slice_to_exp(slices_users)\r
+ \r
+ all_exp = []\r
+ iddata = []\r
+ \r
+ for exp in experiments:\r
+ experiment = {}\r
+ experiment['slice_hrn'] = experiments[exp]['slice_hrn']\r
+ experiment['user_hrn'] = users_hrn[cur_username]\r
+ experiment['start_tunix'] = experiments[exp]['start']\r
+ experiment['end_tunix'] = experiments[exp]['end']\r
+ experiment['start_t'] = unix_to_timestamp(experiments[exp]['start'])\r
+ experiment['end_t'] = unix_to_timestamp(experiments[exp]['end'])\r
+ experiment['testbeds'] = {}\r
+ for exp_node in experiments[exp]['nodes']:\r
+ list_testbeds = [ key for key,val in testbeds.items()]\r
+ for tkey in list_testbeds:\r
+ if exp_node in testbeds[tkey]:\r
+ if tkey in experiment['testbeds']:\r
+ if exp_node not in experiment['testbeds'][tkey]:\r
+ experiment['testbeds'][tkey].append(exp_node)\r
+ else:\r
+ experiment['testbeds'][tkey] = [exp_node]\r
+ tempid = hashlib.sha1(str(experiment)).hexdigest() \r
+ experiment['id'] = tempid\r
+ \r
+ iddata.append(tempid)\r
+ all_exp.append(experiment)\r
+ \r
+ \r
+ ###### Check which experiments have not been rated yet. Pop from all_exp any experiment that has already been rated\r
+ unrated_exp = json_to_rest('http://survivor.lab.netmode.ntua.gr:4567/reputation/qid', iddata) \r
+ \r
+ for item in all_exp:\r
+ if item['id'] in unrated_exp:\r
+ pass\r
+ else:\r
+ all_exp.pop(all_exp.index(item))\r
+\r
+\r
+\r
+ ###### Get Reputation values from Reputation DB\r
+ reps = json_to_rest('http://survivor.lab.netmode.ntua.gr:4567/reputation/showrep', "a")\r
+ env['logging_test'] = reps \r
+ \r
+ services = []\r
+ for item in reps:\r
+ for serv in item['services']:\r
+ if serv.keys()[0] not in services:\r
+ services.append(serv.keys()[0])\r
+ \r
+ \r
+ #in json, sevices are in the form: 'services':[{'serv1':x}, {'serv2':y}], so we transform it to 'services':[x,y] based on\r
+ # the services dict above. If for a specific service there is no applicable value, we put N/A \r
+ for testbed in reps:\r
+ d = list(testbed['services'])\r
+ del testbed['services']\r
+ testbed['services'] = []\r
+ for s in services:\r
+ set_v = 0\r
+ for i in d:\r
+ try:\r
+ testbed['services'].append(i[s])\r
+ set_v=1\r
+ except:\r
+ pass\r
+ if set_v == 0 :\r
+ testbed['services'].append('N/A')\r
+ \r
+ ###### Pass variables to template\r
+ env['logging_test'] = json.dumps(all_exp, ensure_ascii=False)\r
+ env['reputation'] = reps\r
+ env['rep_serv'] = services\r
+ env['slicelist'] = all_exp\r
+ env['json_data'] = json.dumps(all_exp, ensure_ascii=False)\r
+ \r
+ ###### *** Reputation Plugin-specific END *** ############\r
+ \r
+ \r
+ if request.user.is_authenticated(): \r
+ env['person'] = self.request.user\r
+ else: \r
+ env['person'] = None\r
+ \r
+ env['theme'] = self.theme\r
+ #env['user_list']= user_list\r
+\r
+ env['username']=the_user(request)\r
+ env['topmenu_items'] = topmenu_items(None, request)\r
+ if state: env['state'] = state\r
+ elif not env['username']: env['state'] = None\r
+ # use one or two columns for the layout - not logged in users will see the login prompt\r
+ env['layout_1_or_2']="layout-unfold2.html" if not env['username'] else "layout-unfold1.html" \r
+ \r
+ return render_to_response(self.template, env, context_instance=RequestContext(request))\r
+ \r
+\r
+\r
+ \r
+\r
+ \r
+ \r
+ \r
+ \r
+
\ No newline at end of file