Tools page using REST SFA API
authorLoic Baron <loic.baron@lip6.fr>
Fri, 29 May 2015 08:30:15 +0000 (10:30 +0200)
committerLoic Baron <loic.baron@lip6.fr>
Fri, 29 May 2015 08:30:15 +0000 (10:30 +0200)
portal/slicetabexperiment.py
portal/templates/slice-tab-experiment.html
rest/sfa_api.py

index cc20df2..7ed6d31 100644 (file)
@@ -31,85 +31,89 @@ class ExperimentView (FreeAccessView, ThemeView):
   
         username = self.request.user    
         
-        query_current_resources = Query.get('slice').select('resource','parent_authority').filter_by('slice_hrn','==',slicename)
-        current_resources = execute_query(request, query_current_resources)
+        pf_query = Query().get('local:platform').filter_by('disabled', '==', '0').filter_by('gateway_type', '==', 'sfa').select('platform')
+        res_platforms = execute_query(request, pf_query)
+        platforms = [p['platform'] for p in res_platforms]
+        #query_current_resources = Query.get('slice').select('resource','parent_authority').filter_by('slice_hrn','==',slicename)
+        #current_resources = execute_query(request, query_current_resources)
 
-        parent_authority = current_resources[0]['parent_authority']
-        
-        split_slicename = slicename.split('.')
-        ple_slicename = hash_loginbase(parent_authority) + '_' + split_slicename[-1]
+        #parent_authority = current_resources[0]['parent_authority']
+        #
+        #split_slicename = slicename.split('.')
+        #ple_slicename = hash_loginbase(parent_authority) + '_' + split_slicename[-1]
 
-        ple_resource_list=[]
-        nitos_resource_list=[]
-        nitos_paris_resource_list=[]
-        iotlab_resource_list=[]
-        try:
-            for resources in current_resources:
-                list_res = resources['resource']
-                for res in list_res:
-                    split_list = res.split('+') # split the resource urn
-                    if [s for s in split_list if 'ple' in s]: # find ple resources
-                        res_hrn = split_list[-1] # last element is resource hrn
-                        ple_resource_list.append(res_hrn)
-                    if [s for s in split_list if 'omf:paris.fit-nitos.fr' in s]: # find nitos_paris resources
-                        res_hrn = split_list[-1] # last element is resource hrn
-                        nitos_paris_resource_list.append(res_hrn)
-                    if [s for s in split_list if 'iotlab' in s]: # find iotlab resources
-                        res_hrn = split_list[-1] # last element is resource hrn
-                        iotlab_resource_list.append(res_hrn)
-                    if [s for s in split_list if 'omf:nitos.indoor' in s]: # find nitos_indoor resources
-                        res_hrn = split_list[-1] # last element is resource hrn
-                        nitos_resource_list.append(res_hrn)
-                    if [s for s in split_list if 'omf:nitos.outdoor' in s]: # find nitos_outdoor resources
-                        res_hrn = split_list[-1] # last element is resource hrn
-                        nitos_resource_list.append(res_hrn)
+        #ple_resource_list=[]
+        #nitos_resource_list=[]
+        #nitos_paris_resource_list=[]
+        #iotlab_resource_list=[]
+        #try:
+        #    for resources in current_resources:
+        #        list_res = resources['resource']
+        #        for res in list_res:
+        #            split_list = res.split('+') # split the resource urn
+        #            if [s for s in split_list if 'ple' in s]: # find ple resources
+        #                res_hrn = split_list[-1] # last element is resource hrn
+        #                ple_resource_list.append(res_hrn)
+        #            if [s for s in split_list if 'omf:paris.fit-nitos.fr' in s]: # find nitos_paris resources
+        #                res_hrn = split_list[-1] # last element is resource hrn
+        #                nitos_paris_resource_list.append(res_hrn)
+        #            if [s for s in split_list if 'iotlab' in s]: # find iotlab resources
+        #                res_hrn = split_list[-1] # last element is resource hrn
+        #                iotlab_resource_list.append(res_hrn)
+        #            if [s for s in split_list if 'omf:nitos.indoor' in s]: # find nitos_indoor resources
+        #                res_hrn = split_list[-1] # last element is resource hrn
+        #                nitos_resource_list.append(res_hrn)
+        #            if [s for s in split_list if 'omf:nitos.outdoor' in s]: # find nitos_outdoor resources
+        #                res_hrn = split_list[-1] # last element is resource hrn
+        #                nitos_resource_list.append(res_hrn)
 
 
-        except Exception as e:
-            logger.error("Exception in slicetabexperiment.py in OneLab resource search {}".format(e))
-        
-        #logger.debug("list of ple res hrns")
-        #logger.debug(ple_resource_list)
-        #logger.debug("list of nit_paris res hrns")
-        #logger.debug(nitos_paris_resource_list)
-        #logger.debug("list of iotLab res hrns")
-        #logger.debug(iotlab_resource_list)
-        #logger.debug("list of nitos res hrns")
-        #logger.debug(nitos_resource_list)
+        #except Exception as e:
+        #    logger.error("Exception in slicetabexperiment.py in OneLab resource search {}".format(e))
+        #
+        ##logger.debug("list of ple res hrns")
+        ##logger.debug(ple_resource_list)
+        ##logger.debug("list of nit_paris res hrns")
+        ##logger.debug(nitos_paris_resource_list)
+        ##logger.debug("list of iotLab res hrns")
+        ##logger.debug(iotlab_resource_list)
+        ##logger.debug("list of nitos res hrns")
+        ##logger.debug(nitos_resource_list)
 
-        all_users = list() 
-        #get all  iotlab users
-        all_users = list() 
-        try:
-            engine = ConfigEngine()
-            userData = "Basic " + (engine.iotlab_admin_user() + ":" + engine.iotlab_admin_password()).encode("base64").rstrip()
-            req = urllib2.Request(engine.iotlab_url())
-            req.add_header('Accept', 'application/json')
-            req.add_header("Content-type", "application/x-www-form-urlencoded")
-            req.add_header('Authorization', userData)
-            # make the request and print the results
-            res = urllib2.urlopen(req)
-            all_users = json.load(res) 
-        except urllib2.URLError as e:
-            logger.error("There is a problem in getting iotlab users {}".format(e.reason))
+        #all_users = list() 
+        ##get all  iotlab users
+        #all_users = list() 
+        #try:
+        #    engine = ConfigEngine()
+        #    userData = "Basic " + (engine.iotlab_admin_user() + ":" + engine.iotlab_admin_password()).encode("base64").rstrip()
+        #    req = urllib2.Request(engine.iotlab_url())
+        #    req.add_header('Accept', 'application/json')
+        #    req.add_header("Content-type", "application/x-www-form-urlencoded")
+        #    req.add_header('Authorization', userData)
+        #    # make the request and print the results
+        #    res = urllib2.urlopen(req)
+        #    all_users = json.load(res) 
+        #except urllib2.URLError as e:
+        #    logger.error("There is a problem in getting iotlab users {}".format(e.reason))
        
 
-        #getting the login from email
-        #initial value  no-account == contact_admin
-        iot_login = 'contact_admin'
-        username = str(username)
-        for user in all_users:
-            if user['email'] == username:
-                iot_login = user['login']
+        ##getting the login from email
+        ##initial value  no-account == contact_admin
+        #iot_login = 'contact_admin'
+        #username = str(username)
+        #for user in all_users:
+        #    if user['email'] == username:
+        #        iot_login = user['login']
         env = { 'theme' : self.theme,
                 'slicename':slicename, 
-                'ple_slicename':ple_slicename, 
-                'username':username, 
-                'ple_resources':ple_resource_list, 
-                'nitos_resources': nitos_resource_list, 
-                'nitos_paris_resources':nitos_paris_resource_list, 
-                'iotlab_resources':iotlab_resource_list, 
-                'iot_login':iot_login,
+                'platforms':platforms,
+                #'ple_slicename':ple_slicename, 
+                #'username':username, 
+                #'ple_resources':ple_resource_list, 
+                #'nitos_resources': nitos_resource_list, 
+                #'nitos_paris_resources':nitos_paris_resource_list, 
+                #'iotlab_resources':iotlab_resource_list, 
+                #'iot_login':iot_login,
                 'request':self.request,
               }
         return render_to_response(self.template, env, context_instance=RequestContext(request))
index 96c7734..bfa9cee 100644 (file)
@@ -1,20 +1,76 @@
 <div class="col-md-10 col-md-offset-1">
-       {% if ple_resources or iotlab_resources or nitos_resources or nitos_paris_resources%}
-               <h2>How to access your reserved resources</h2>
-       {% endif %}
-       {% if ple_resources %}
+<script type="text/javascript">
+    $(document).ready(function() {
+        console.log('{{platforms}}');
+           {% for platform in platforms %}
+        // /sfa/Describe?hrn=onelab.upmc.projectx.slicex&platform[]={{platform}}&type=slice
+        $.post("/sfa/Describe",{'hrn':'{{slicename}}', 'type':'slice', 'platform':['{{platform}}']}, function( data ) {
+            if('parsed' in data['{{platform}}'] && 'rspec' in data['{{platform}}']['parsed']){
+                rspec = data['{{platform}}']['parsed']['rspec'];
+                if('node' in rspec){
+                    jQuery.each( rspec['node'], function( i, node ) {
+                        render_node('{{platform}}',node);
+                    });
+                }
+            }
+        });
+           {% endfor %}
+    });
+    
+    function render_node(platform, node){
+        console.log(platform,node);
+        if('@component_manager_id' in node){
+            // urn:publicid:IDN+ple+authority+cm
+            t_urn = node['@component_manager_id'].split('+');
+            //if(t_urn[1].indexOf(":") > -1)
+            testbed = t_urn[1];
+            if(!$('#'+testbed).length){
+                testbed = 'default';
+            }
+        }else{
+            testbed = 'default';
+        }
+        if('services' in node && 'login' in node['services']){
+            console.log(node['services']['login']);
+            login = node['services']['login'];
+            if('@port' in login && login['@port']!='22'){
+                $('#'+testbed).append("<p class='command'>$ ssh "+login['@username']+"@"+login['@hostname']+" -p "+login['@port']+"</p>");
+            }else{
+                $('#'+testbed).append("<p class='command'>$ ssh "+login['@username']+"@"+login['@hostname']+"</p>");
+            }
+       
+        }else if('@component_name' in node){
+            console.log(node['@component_name']);
+        }else{
+            console.log(node);
+        }
+        $("#access").show();
+
+        $('#'+testbed).show();
+        if($('#'+testbed+'_header').length){
+            $('#'+testbed+'_header').show();
+        }
+        if($('#'+testbed+'_footer').length){
+            $('#'+testbed+'_footer').show();
+        }
+    }
+</script>
+<div id="access" style="display:none;">
+    <h2>How to access your reserved resources</h2>
+</div>
+<div id="default">
+</div>
+<div id="ple_header" style="display:none;">
        <h3>PlanetLab Europe</h3>
        
        <p>
                PlanetLab Europe resources are accessible directly via SSH. Your SSH public key is deployed automatically
                on the reserved nodes. To access your slice on a resource just type the following command:
        </p>
-       <p class="command">
-       {%for resource in ple_resources %}
-               <b>Resource</b><br>
-               $ ssh {{ple_slicename}}@{{resource}}<br>
-       {%endfor%}
-       </p>
+</div>
+<div id="ple" style="display:none;">
+</div>
+<div id="ple_footer" style="display:none;">
        <p><strong>NOTE:</strong> Your original slicename <b>{{slicename}}</b> has been converted to PlanetLab specific format <b>{{ple_slicename}}</b> in order to do SSH.</p>
        <p>
                Be aware that after you reserve a PlanetLab Europe resource your slice will be deployed with a delay of about 15 minutes, 
             <i>This bash script will be deployed on all PLE nodes of your slice</i>
         </div>
         <textarea style="width:100%; height:100px;" id="initscript_code"></textarea><br>
+<!-- TODO !!!
+        <div>
+            <select>
+                <option>All</option>
+                <option>node1</option>
+                <option>node2</option>
+            </select>
+        </div>
+-->
         <button name="deploy" class="btn btn-success btn-sm" onclick="deploy('{{slicename}}');">Deploy</button>
         <button name="delete" class="btn btn-danger btn-xs" onclick="del('{{slicename}}');">Delete</button>
     </div>
     <script type="text/javascript">
     $(document).ready(function() {
-        $.post("/initscript/get/",{'slice_hrn':'onelab.upmc.express'}, function( data ) {
+        $.post("/initscript/get/",{'slice_hrn':'{{slicename}}'}, function( data ) {
             console.log(data);
             jQuery('#initscript_code').val(data['initscript_code']);
         });
     }
     </script>
     <br>
-       {% endif %}
-
-       {% if iotlab_resources %}       
+</div>
+<div id="iotlab_header" style="display:none;">
        <h3>FIT IoT-Lab</h3>
        <p>FIT IoT-Lab resources are accessible directly via SSH and <a href="https://www.iot-lab.info/testbed/" target="_blank">web GUI.</a>
                To acess IoT-Lab resources using web GUI, use the same login and  password of OneLab portal. To acess Iot-Lab resources using SSH type
                the following command:
        </p>
-       <p class="command">
-               ssh {{iot_login}}@grenoble.iot-lab.info
-       </p>
-       {% endif %}
-       {% if nitos_resources or nitos_paris_resources %}
-       <h3>NITOS</h3>
+</div>
+<div id="iotlab" style="display:none;">
+</div>
+<div id="nitos_header" style="display:none;">
+       <h3>NITOS Volos (Greece)</h3>
        
        <p>
         NITOS resources are not directly accessible. You will need to log in on a gateway server and from there access the node.
         You will find the ssh commands to connect to NITOS nodes below:
        </p>
-
-       {% if nitos_resources %}        
        <h4>NITLab</h4>
        <p class="command">
            $ ssh {{slicename}}@nitlab.inf.uth.gr #nodes 001-040<br>
         $ ssh {{slicename}}@nitlab2.inf.uth.gr #nodes 041-049<br>
         $ ssh {{slicename}}@nitlab3.inf.uth.gr #nodes > 049
     </p>
-       
+</div>
+<div id="nitos" style="display:none;">
        <p>Loading an OMF-compatible image on your resource:</p>
        <p class="command">
-       {%for resource in nitos_resources %}
                <b>Resource</b><br>
         $ omf6 stat -t {{resource}} #check the status of the node<br>
         $ omf6 tell -a on -t {{resource}}  #turn on/off the node <br>
        $ omf6 load -i baseline.ndz -t {{resource}}  #for orbit-like node (002-009) use "baseline_orbit.ndz"<br>
-               $ ssh root@{{resource}}  #ssh to the node<br>
-       {%endfor%}
        </p>
+</div>
+<div id="nitos_footer" style="display:none;">
     <p><b>NOTE:</b> Nodes 002-009 are orbit-like nodes. For these nodes use "baseline_orbit.ndz". All these images come with OMF5.4 resource controller. To do OMF6 experiments use "baseline_omf6_1_1.ndz" and  "baseline_orbit_omf6_1_1.ndz" for grid nodes and orbit nodes respectively. </p>
-       {% endif %}
-
+</div>
        {% if nitos_paris_resources %}
        <h4>FIT NITOS-Lab Paris</h4>
         <p class="command">
        $ ssh root@{{resource}}  #ssh to the node<br><br>
        {%endfor%}
        </p>
-       {%endif%}
 
        <p>
                On the node itself you will have to modify the file /etc/omf-resctl-5.3/omf-resctl.yaml (OMF5.4 only) according to your slice settings and then
index e771164..b75611b 100644 (file)
@@ -204,7 +204,7 @@ def sfa_client(request, method, hrn=None, urn=None, object_type=None, rspec=None
                     if method == "ListResources":
                         result = server.ListResources([user_cred], api_options)
                         dict_result = xmltodict.parse(result['value'])
-                        result['json'] = json.dumps(dict_result)
+                        result['parsed'] = dict_result
                         if isinstance(dict_result['rspec']['node'], list):
                             columns.extend(dict_result['rspec']['node'][0].keys())
                         else:
@@ -224,7 +224,7 @@ def sfa_client(request, method, hrn=None, urn=None, object_type=None, rspec=None
                             result = server.Describe([urn] ,[object_cred], api_options)
                             dict_result = xmltodict.parse(result['value']['geni_rspec'])
 
-                        result['json'] = json.dumps(dict_result)
+                        result['parsed'] = dict_result
                         if 'rspec' in dict_result and 'node' in dict_result['rspec']:
                             if isinstance(dict_result['rspec']['node'], list):
                                 columns.extend(dict_result['rspec']['node'][0].keys())