myslice reputation plugin v0.3 - mutiple testbeds compatible
authorCostas Yiotis <coyiotis@netmode.ntua.gr>
Thu, 8 Jan 2015 11:10:47 +0000 (13:10 +0200)
committerCostas Yiotis <coyiotis@netmode.ntua.gr>
Thu, 8 Jan 2015 11:10:47 +0000 (13:10 +0200)
portal/reputationview.py
portal/templates/reputation.html

index 40f8506..f160d7d 100644 (file)
@@ -16,9 +16,12 @@ import hashlib
 import datetime\r
 import urllib2\r
 import ast\r
+import time\r
+\r
 from django.views.decorators.csrf import csrf_exempt\r
 from django.http                  import *\r
 \r
+\r
 def response_mimetype(request):\r
         \r
     if "application/json" in request.META['HTTP_ACCEPT']:\r
@@ -57,24 +60,26 @@ def timestamp_to_unix(timest):
 def slice_to_exp(slices_users):\r
     experiments = {}\r
     testbeds = {}\r
+    wildcard_testbeds = {}\r
+   \r
     \r
-    \r
-    for slice in slices_users:\r
+    for slice in slices_users:  \r
         nodes={}\r
         leases = slice['lease']\r
-        if leases is not None:\r
+         \r
+        if leases is not None and leases:\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 'omf:nitos' in testbed:\r
+                    testbed = 'omf:nitos'\r
                 if testbed in testbeds:\r
                     if node not in testbeds[testbed]:\r
                         testbeds[testbed].append(node)\r
@@ -93,18 +98,97 @@ def slice_to_exp(slices_users):
                                 f=1\r
                         if f==0:\r
                             nodes[node][str(start_t)]={'start_t':start_t, 'nodes':node, 'end_t':end_t}\r
+\r
+            ######### FOR PLE LIKE start ##################\r
+            for resource in slice['resource']:\r
+                testbed_start = resource.index('IDN+')+4\r
+                testbed_end = resource.index('+node+')\r
+                tb = resource[testbed_start:testbed_end]\r
+                node = resource[testbed_end+6:]\r
+                if 'ple:' in tb:\r
+                    tb = 'ple'\r
+                if 'omf:nitos' in tb:\r
+                    tb = 'omf:nitos'\r
+                if tb not in testbeds:\r
+                    try:\r
+                        if node not in wildcard_testbeds[slice['slice_hrn']][tb]:\r
+                            wildcard_testbeds[slice['slice_hrn']][tb].append([node])\r
+                    except:\r
+                        try:\r
+                            wildcard_testbeds[slice['slice_hrn']][tb] = [node]\r
+                        except:\r
+                            wildcard_testbeds[slice['slice_hrn']]={tb:[node]}\r
+                    \r
+            \r
+        else:\r
+            s = slice['slice_last_updated']\r
+            #s_time = int(time.mktime(datetime.datetime.strptime(s, "%Y%m%dT%H:%M:%Ss").timetuple()))\r
+            s_time = time.mktime(s.timetuple())                \r
+                \r
+            if slice['resource'] is not None:\r
+                                    \r
+                for resource in slice['resource']:\r
+                    testbed_start = resource.index('IDN+')+4\r
+                    testbed_end = resource.index('+node+')\r
+                    tb = resource[testbed_start:testbed_end]\r
+                    if 'ple:' in tb:\r
+                        tb = 'ple'\r
+                    if 'omf:nitos' in tb:\r
+                        tb = 'omf:nitos'\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
+                    if not node in nodes:  \r
+                        #nodes[node] = {str(start_t):{'start_t':s_time, 'nodes':node, 'end_t':int(time.time())}} \r
+                        nodes[node] = {str(start_t):{'start_t':s_time, 'nodes':node, 'end_t':s_time}}    \r
+            ######### FOR PLE LIKE end ##################\r
\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
+                key = str(exp) + str(nodes[n][exp]['end_t']) + slice['slice_hrn']\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
+                    \r
+                    \r
+                    ######### FOR PLE LIKE start ##################\r
+                    for item in wildcard_testbeds:\r
+                        if item == experiments[key]['slice_hrn']:\r
+                            for testbed in wildcard_testbeds[item]:\r
+                                \r
+                                if testbed not in testbeds:\r
+                                    testbeds[testbed] = wildcard_testbeds[item][testbed] \r
+                                \r
+                                for n in wildcard_testbeds[item][testbed]:\r
+                                    if n not in experiments[key]['nodes']:\r
+                                        experiments[key]['nodes'].append(n)                                           \r
+                    ######### FOR PLE LIKE end ##################\r
+                    \r
                 elif nodes[n][exp]['end_t'] == experiments[key]['end']:\r
                     experiments[key]['nodes'].append(nodes[n][exp]['nodes'])\r
                     \r
+                    \r
+                    ######### FOR PLE LIKE start ##################\r
+                    for item in wildcard_testbeds:\r
+                        if item == experiments[key]['slice_hrn']:\r
+                            for testbed in wildcard_testbeds[item]:\r
+                                \r
+                                if testbed not in testbeds:\r
+                                    testbeds[testbed] = wildcard_testbeds[item][testbed] \r
+                                \r
+                                for n in wildcard_testbeds[item][testbed]:\r
+                                    if n not in experiments[key]['nodes']:\r
+                                        experiments[key]['nodes'].append(n)                       \r
+                    ######### FOR PLE LIKE end ##################\r
+                    \r
     return (experiments,testbeds)\r
    \r
 class ReputationView (LoginRequiredAutoLogoutView, ThemeView):\r
@@ -120,10 +204,7 @@ class ReputationView (LoginRequiredAutoLogoutView, ThemeView):
         env = self.default_env()\r
         env['theme'] = self.theme\r
                 \r
-        return render_to_response(self.template, env, context_instance=RequestContext(request))\r
-\r
-\r
-    \r
+        return render_to_response(self.template, env, context_instance=RequestContext(request))    \r
     \r
     def get (self, request, state=None):\r
         env = self.default_env()\r
@@ -158,13 +239,13 @@ class ReputationView (LoginRequiredAutoLogoutView, ThemeView):
         slices_users = []\r
         \r
         #get slices\r
-        userslice_query = Query().get('slice').select('slice_urn', 'slice_hrn', 'users', 'resource', 'lease')\r
+        userslice_query = Query().get('slice').select('slice_urn', 'slice_hrn', 'users', 'resource', 'lease', 'slice_last_updated')\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
+                   \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
@@ -178,19 +259,18 @@ class ReputationView (LoginRequiredAutoLogoutView, ThemeView):
         \r
         #get a list of all the slices for the logged in user\r
         testbeds = []\r
-\r
+        #env['slices_users'] = json.dumps(slice_details, ensure_ascii=False)\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
+                                     , 'resource':slice['resource'], 'lease':slice['lease'], 'slice_last_updated':slice['slice_last_updated']  })  \r
                 \r
                              \r
-        env['slices_users'] = slices_users  ### For logging\r
-       \r
+        #env['slices_users'] = slices_users  ### For logging\r
         #####create slicelist for template & JSON\r
         experiments,testbeds =  slice_to_exp(slices_users)\r
-    \r
+            \r
         all_exp = []\r
         iddata = []\r
                           \r
@@ -217,9 +297,10 @@ class ReputationView (LoginRequiredAutoLogoutView, ThemeView):
             \r
             iddata.append(tempid)\r
             all_exp.append(experiment)\r
-        \r
-        \r
+            env['logging_test'] = json.dumps(all_exp, ensure_ascii=False)\r
+            env['slices_users'] = json.dumps(all_exp, ensure_ascii=False)\r
         ###### Check which experiments have not been rated yet. Pop from all_exp any experiment that has already been rated\r
+        \r
         unrated_exp = json_to_rest('http://survivor.lab.netmode.ntua.gr:4567/reputation/qid', iddata)    \r
         \r
         for item in all_exp:\r
@@ -228,8 +309,6 @@ class ReputationView (LoginRequiredAutoLogoutView, ThemeView):
             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
@@ -262,7 +341,7 @@ class ReputationView (LoginRequiredAutoLogoutView, ThemeView):
                     testbed['services'].append('N/A')\r
                 \r
         ###### Pass variables to template\r
-        env['logging_test'] = json.dumps(all_exp, ensure_ascii=False)\r
+        #env['logging_test'] = json.dumps(all_exp, ensure_ascii=False)\r
         env['serv_per_tb'] = json.dumps(serv_per_tb, ensure_ascii=False)\r
         env['reputation'] = reps\r
         env['rep_serv'] = services\r
index c000ee9..d30d2f9 100644 (file)
          </div>\r
          <div id="tabs-2">\r
                <h1>Experiment Evaluation</h1>\r
-               <p><b>List of your unrated experiments</b></p><div id="slicelist">\r
+               <p><b>List of your unrated experiments</b></p>\r
+               <div style=" width: 70% !important" id="slicelist">\r
                        \r
                        {% for aslice in slicelist %}\r
-                       <h3>Slice <b>{{ aslice.slice_hrn }}</b></h3>\r
+                               <h3>Slice <b>{{ aslice.slice_hrn }}</b></h3>\r
                        <div style="padding-bottom:0;padding-top:0;">\r
                            <ul><li>\r
                                    experiment from <b>{{ aslice.start_t }}</b> to <b>{{ aslice.end_t }}</b> | <a href="#" class="rate_button" data-resid={{ aslice.id }}>Rate it</a>\r
 <div id="scoreform" style="display:none">\r
     <ol>\r
         <li>\r
-            <span>How was your overall experience with NETMODE Testbed?</span> \r
+            <span>How was your overall experience with this Testbed?</span> \r
             <div id="q1">\r
             </div>\r
         </li>\r
             </div>\r
         </li>\r
         <li>\r
-            Would you use NETMODE testbed again?\r
+            Would you use this testbed again?\r
             <div id="q4">\r
                 <input type="radio" name="q4" value="1" />Yes\r
                 <input type="radio" name="q4" value="0" />No\r
@@ -237,9 +238,6 @@ $(function() {
 \r
 var data = jQuery.parseJSON('{{ json_data|safe }}');\r
 \r
-\r
-\r
-\r
 var resid = -1;\r
 var q1 = -1;\r
 var q2 = -1;\r
@@ -267,7 +265,7 @@ function initDialog() {
 \r
         $("a[data-resid='"+resid+"']").css("text-decoration", "line-through").unbind("click").removeAttr("href");\r
 \r
-        //TODO: check input if valid before submitting\r
+        //TODO: validate input before submitting\r
 \r
         sum = q1 + q2 + q3 + q4 + q5 + q6 + q7 +q8;\r
 \r
@@ -283,8 +281,6 @@ function initDialog() {
                                }       \r
                        }\r
                        \r
-\r
-                       \r
                        slicedata["user_eval"] = {'overall':q1, 'problems':q2, 'support':q3, 'reuse':q4, 'pay':q5, 'availability':q6, 'link_quality':q7, 'quality':q8};\r
                        testbeds_str = JSON.stringify(slicedata['testbeds'])\r
                        delete slicedata['testbeds'];\r