Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into onelab
authorLoic Baron <loic.baron@lip6.fr>
Fri, 8 Jan 2016 11:16:57 +0000 (12:16 +0100)
committerLoic Baron <loic.baron@lip6.fr>
Fri, 8 Jan 2016 11:16:57 +0000 (12:16 +0100)
13 files changed:
localauth/manifoldbackend.py
manifoldapi/manifoldapi.py
myslice/urls.py
portal/actions.py
portal/omn.py [new file with mode: 0644]
portal/slicetabcloud.py
portal/static/img/servicedirectory/bonfire.png [new file with mode: 0755]
portal/static/js/omn.js [new file with mode: 0644]
portal/templates/_widget-cloud-node.html [new file with mode: 0644]
portal/templates/omn/gui.html [new file with mode: 0644]
portal/templates/slice-tab-cloud.html
portal/templatetags/portal_filters.py
rest/sfa_api.py

index 504a85b..3e23515 100644 (file)
@@ -23,11 +23,12 @@ class ManifoldBackend:
         person = {}
 
         try:
-            username = token['username']
+            email = token['username']
+            username = email.split('@')[-1]
             password = token['password']
             request = token['request']
 
-            auth = {'AuthMethod': 'password', 'Username': username, 'AuthString': password}
+            auth = {'AuthMethod': 'password', 'Username': email, 'AuthString': password}
             api = ManifoldAPI(auth)
             sessions_result = api.forward(Query.create('local:session').to_dict())
             sessions = sessions_result.ok_value()
@@ -69,10 +70,10 @@ class ManifoldBackend:
 
         try:
             # Check if the user exists in Django's local database
-            user = User.objects.get(username=username)
+            user = User.objects.get(email=email)
         except User.DoesNotExist:
             # Create a user in Django's local database
-            user = User.objects.create_user(username, username, 'passworddoesntmatter')
+            user = User.objects.create_user(username, email, 'passworddoesntmatter')
             user.email = person['email']
 
         if 'firstname' in person:
index 29236c0..0fc4033 100644 (file)
@@ -27,11 +27,10 @@ class ManifoldAPI:
         
         # Manifold uses a self signed certificate
         # https://www.python.org/dev/peps/pep-0476/
-        if hasattr(ssl, '_create_unverified_context'): 
-            self.server = xmlrpclib.Server(self.url, verbose=False, allow_none=True,
-                                           context=ssl._create_unverified_context())
-        else :
-            self.server = xmlrpclib.Server(self.url, verbose=False, allow_none=True)
+        try:    turn_off_server_verify = { 'context' : ssl._create_unverified_context() } 
+        except: turn_off_server_verify = {}
+        self.server = xmlrpclib.Server(self.url, verbose=False, allow_none=True,
+                                       **turn_off_server_verify)
 
     # xxx temporary code for scaffolding a ManifolResult on top of an API that does not expose error info
     # as of march 2013 we work with an API that essentially either returns the value, or raises 
index b2e88bb..8f10828 100644 (file)
@@ -22,6 +22,8 @@ add_to_builtins('insert_above.templatetags.insert_tags')
 
 from settings import auxiliaries, INSTALLED_APPS
 
+from unfold.loginrequired import LoginRequiredView
+
 import portal.about
 import portal.institution
 import portal.registrationview
@@ -29,6 +31,7 @@ import portal.accountview
 import portal.contactview
 import portal.termsview
 import portal.supportview
+import portal.omn
 
 import portal.platformsview
 import portal.dashboardview
@@ -108,6 +111,8 @@ urls = [
     (r'^news/?$', portal.newsview.NewsView.as_view()),
     (r'^resources/(?P<slicename>[^/]+)/?$', portal.sliceresourceview.SliceResourceView.as_view()),
     (r'^users/(?P<slicename>[^/]+)/?$', portal.slicetabusers.SliceUserView.as_view()),
+    (r'^my_url/?$', portal.omn.OMNView.as_view()),
+    (r'^ontology/?$', portal.omn.OMNView.as_view()),
 
     # Testing sfa rest
     (r'^sfa_resources/(?P<slicename>[^/]+)/?$', portal.resources.ResourcesView.as_view()),
index 523a9e1..e0dc131 100644 (file)
@@ -1114,7 +1114,6 @@ def manifold_add_reference_user_accounts(wsgi_request, request):
         .select('user_id', 'config', 'email', 'status') \
         .filter_by('email', '==', request['email'])
     user_details = execute_admin_query(wsgi_request, user_query)
-
     # USER MAIN ACCOUNT != reference
     #print 'USER MAIN ACCOUNT != reference'
     list_accounts_query = Query().get('local:account')              \
@@ -1286,7 +1285,7 @@ def create_pending_user(wsgi_request, request, user_detail):
     msg.send()
    
     # saves the user to django auth_user table [needed for password reset]
-    user = User.objects.create_user(request['email'], request['email'], request['password'])
+    user = User.objects.create_user(request['email'].split('@')[-1], request['email'], request['password'])
 
     # Creating a manifold user
     user_id = manifold_add_user(wsgi_request, request)
diff --git a/portal/omn.py b/portal/omn.py
new file mode 100644 (file)
index 0000000..f101fa7
--- /dev/null
@@ -0,0 +1,17 @@
+from unfold.loginrequired   import LoginRequiredView
+from myslice.theme          import ThemeView
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+
+class OMNView (LoginRequiredView, ThemeView):
+    template_name = 'omn/gui.html'
+    def get (self, request, slicename=None, state=None):
+         username = self.request.user
+         my_var = "loading..."
+         env = { 'theme' : self.theme,
+                 'my_var': my_var,
+                 'request':self.request,
+               }
+         return render_to_response(self.template, env, context_instance=RequestContext(request))
+
index ce1dc31..5f15109 100644 (file)
@@ -18,6 +18,8 @@ from myslice.theme import ThemeView
 from myslice.configengine import ConfigEngine
 from myslice.settings import logger
 
+from rest.sfa_api import sfa_client
+
 from sfa.planetlab.plxrn import hash_loginbase
 
 import urllib2,json
@@ -41,7 +43,7 @@ class CloudView (LoginRequiredView, ThemeView):
 
         username = self.request.user    
         platforms = self.get_platforms(request)
-        cloud_platforms = ["onelab-cloud"]
+        cloud_platforms = ["onelab-cloud","fuseco"]
         len_platforms = len(platforms)
 
         #if 'action' in request.POST:
@@ -72,12 +74,20 @@ class CloudView (LoginRequiredView, ThemeView):
   
         username = self.request.user    
         platforms = self.get_platforms(request)
-        cloud_platforms = ["onelab-cloud"]
+        cloud_platforms = ["onelab-cloud","fuseco"]
         len_platforms = len(platforms)
+        result = sfa_client(request,'ListResources',platforms=cloud_platforms)
+
+        # Handle errors in ListResources, example AM is down
+        for key, value in result.iteritems():
+            logger.debug("key in result = %s" % key)
+            if 'error' in value:
+                cloud_platforms.remove(key)
 
         env = { 'theme' : self.theme,
                 'slicename':slicename, 
                 'platforms':platforms,
+                'result':result,
                 'cloud_platforms':cloud_platforms,
                 'len_platforms': len_platforms,
                 'request':self.request,
diff --git a/portal/static/img/servicedirectory/bonfire.png b/portal/static/img/servicedirectory/bonfire.png
new file mode 100755 (executable)
index 0000000..ff0940f
Binary files /dev/null and b/portal/static/img/servicedirectory/bonfire.png differ
diff --git a/portal/static/js/omn.js b/portal/static/js/omn.js
new file mode 100644 (file)
index 0000000..477221d
--- /dev/null
@@ -0,0 +1,106 @@
+var yasr = YASR(document.getElementById("yasr"), {
+       //this way, the URLs in the results are prettified using the defined prefixes in the query
+       getUsedPrefixes: yasqe.getPrefixesFromQuery
+});
+
+YASQE.defaults.sparql.showQueryButton = true;
+YASQE.defaults.sparql.endpoint = "http://lod.fed4fire.eu/sparql";
+YASQE.defaults.sparql.callbacks.success =  function(data){console.log("success", data);};
+YASQE.defaults.sparql.callbacks.complete = yasr.setResponse;
+YASQE.defaults.value = "SELECT ?name ?am ?endpoint WHERE {\n  ?infra <http://open-multinet.info/ontology/omn#hasService> ?am ;\n         rdfs:label ?name . \n  ?am rdf:type <http://open-multinet.info/ontology/omn-domain-geni-fire#AMService> ;\n      <http://open-multinet.info/ontology/omn#hasEndpoint> ?endpoint .\n} LIMIT 100"
+
+/**
+ * We use most of the default settings for the property and class autocompletion types. This includes:
+ * -  the pre/post processing of tokens
+ * -  detecting whether we are in a valid autocompletion position
+ * -  caching of the suggestion list. These are cached for a period of a month on the client side.
+ */
+
+var getAutocompletionsArrayFromCsv = function(csvString) {
+       var completionsArray = [];
+       csvString.split("\n").splice(1).forEach(function(url) {//remove first line, as this one contains the projection variable
+               completionsArray.push(url.substring(1, url.length-1));//remove quotes
+       });
+       return completionsArray;
+}
+
+
+
+var customPropertyCompleter = function(yasqe) {
+       //we use several functions from the regular property autocompleter (this way, we don't have to re-define code such as determining whether we are in a valid autocompletion position)
+       var returnObj = {
+               isValidCompletionPosition: function(){return YASQE.Autocompleters.properties.isValidCompletionPosition(yasqe)},
+               preProcessToken: function(token) {return YASQE.Autocompleters.properties.preProcessToken(yasqe, token)},
+               postProcessToken: function(token, suggestedString) {return YASQE.Autocompleters.properties.postProcessToken(yasqe, token, suggestedString)}
+       };
+
+       //In this case we assume the properties will fit in memory. So, turn on bulk loading, which will make autocompleting a lot faster
+       returnObj.bulk = true;
+       returnObj.async = true;
+
+       //and, as everything is in memory, enable autoShowing the completions
+       returnObj.autoShow = true;
+
+       returnObj.persistent = "customProperties";//this will store the sparql results in the client-cache for a month.
+       returnObj.get = function(token, callback) {
+               //all we need from these parameters is the last one: the callback to pass the array of completions to
+               var sparqlQuery = "PREFIX void: <http://rdfs.org/ns/void#>\n" +
+               "PREFIX ds: <http://bio2rdf.org/bio2rdf.dataset_vocabulary:>\n" +
+               "SELECT DISTINCT *\n" +
+               " { [] void:subset [\n" +
+               "   void:linkPredicate ?property;\n" +
+               "  ]\n" +
+               "} ORDER BY ?property";
+               $.ajax({
+                       data: {query: sparqlQuery},
+                       url: YASQE.defaults.sparql.endpoint,
+                       headers: {Accept: "text/csv"},//ask for csv. Simple, and uses less bandwidth
+                       success: function(data) {
+                               callback(getAutocompletionsArrayFromCsv(data));
+                       }
+               });
+       };
+       return returnObj;
+};
+//now register our new autocompleter
+YASQE.registerAutocompleter('customPropertyCompleter', customPropertyCompleter);
+
+
+//excellent, now do the same for the classes
+var customClassCompleter = function(yasqe) {
+       var returnObj = {
+               isValidCompletionPosition: function(){return YASQE.Autocompleters.classes.isValidCompletionPosition(yasqe)},
+               preProcessToken: function(token) {return YASQE.Autocompleters.classes.preProcessToken(yasqe, token)},
+               postProcessToken: function(token, suggestedString) {return YASQE.Autocompleters.classes.postProcessToken(yasqe, token, suggestedString)}
+       };
+       returnObj.bulk = true;
+       returnObj.async = true;
+       returnObj.autoShow = true;
+       returnObj.get = function(token, callback) {
+               var sparqlQuery = "PREFIX void: <http://rdfs.org/ns/void#>\n" +
+               "PREFIX ds: <http://bio2rdf.org/bio2rdf.dataset_vocabulary:>\n" +
+               "SELECT *\n" +
+               "{ [] void:subset [\n" +
+               "       a ds:Dataset-Type-Count;\n" +
+               "       void:class ?type\n"+
+               "   ]\n" +
+               "} ORDER BY ?type";
+               $.ajax({
+                       data: {query: sparqlQuery},
+                       url: YASQE.defaults.sparql.endpoint,
+                       headers: {Accept: "text/csv"},//ask for csv. Simple, and uses less bandwidth
+                       success: function(data) {
+                               callback(getAutocompletionsArrayFromCsv(data));
+                       }
+               });
+       };
+       return returnObj;
+};
+YASQE.registerAutocompleter('customClassCompleter', customClassCompleter);
+
+//And, to make sure we don't use the other property and class autocompleters, overwrite the default enabled completers
+YASQE.defaults.autocompleters = ['customClassCompleter', 'customPropertyCompleter'];
+
+
+//finally, initialize YASQE
+var yasqe = YASQE(document.getElementById("yasqe"));
diff --git a/portal/templates/_widget-cloud-node.html b/portal/templates/_widget-cloud-node.html
new file mode 100644 (file)
index 0000000..7bb0b72
--- /dev/null
@@ -0,0 +1,32 @@
+{% load portal_filters %}
+<div>
+    <h4><a href="#" onclick="$('#{{platform}}_div_add_{{node_urn|get_name_from_urn}}').toggle();"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Create new VMs on node {{node_urn|get_name_from_urn}}</a></h4>
+    <div id="{{platform}}_div_add_{{node_urn|get_name_from_urn}}" class="alert" style="background-color:#f1f1f1;display:none;margin-bottom:0px !important;padding-bottom:6px !important;">
+        <div id="{{platform}}_input_{{node_urn|get_name_from_urn}}" class="row">
+            <div class="col-md-1"></div>
+            <div class="col-md-3"><label for="{{platform}}_number_{{node_urn|get_name_from_urn}}">number:</label>
+            <input type="text" maxlength="2" id="{{platform}}_number_{{node_urn|get_name_from_urn}}" name="{{platform}}_number_{{node_urn|get_name_from_urn}}" style="width:2.2em;min-width:2.2em;height:30px;" value="1" class="form-control" required>
+            </div>
+            <div class="col-md-8"><label for="{{platform}}_sliver_name_{{node_urn|get_name_from_urn}}">name:</label>
+            <div class="form-group">
+            <input type="text" name="{{platform}}_sliver_name_{{node_urn|get_name_from_urn}}" id="{{platform}}_sliver_name_{{node_urn|get_name_from_urn}}" value="VM" maxlength="12" class="form-control" style="height:30px;" required>
+            </div>
+            </div>
+            <div class="col-md-1"></div>
+            <div id="{{platform}}_select_{{node_urn|get_name_from_urn}}" class="col-md-11"></div>
+        </div>
+        <div id="{{platform}}_add_{{node_urn|get_name_from_urn}}" class="row">
+            <div class="col-md-1">&nbsp; 
+            <input type="hidden" name="action" id="action" value="add">
+            <input type="hidden" name="platform" id="platform" value="{{platform}}">
+            </div>
+        </div>
+        <div class="row" style="padding-top:6px;">
+            <div class="col-md-1">&nbsp;</div>
+            <div class="col-md-11" id="{{platform}}_add_button_{{node_urn|get_name_from_urn}}" style="display:none;">
+            <input type="submit" form="{{platform}}_form_add" value="Add" onclick="send_add('{{platform}}','{{node_urn|get_name_from_urn}}');">
+            </div>
+        </div>
+    </div>
+
+</div>
diff --git a/portal/templates/omn/gui.html b/portal/templates/omn/gui.html
new file mode 100644 (file)
index 0000000..8d80e77
--- /dev/null
@@ -0,0 +1,56 @@
+{% extends "layout_wide.html" %}
+{% block head %}
+
+<script type="text/javascript">
+function load_ontology(platform, format){
+    $.post("/sfa/ListResources",{'output_format':format, 'platform':[platform]}, function( result ) {
+        data=result['netmode'];
+        data=data.replace(/>/g,'&gt;').
+         replace(/</g,'&lt;').
+         replace(/"/g,'&quot;');
+        $("#data").html(data);
+        $("#welcome").html("Loaded netmode RDF:");
+    });
+}
+$(document).ready(function() {   
+   load_ontology("netmode","ttl");
+   console.log("{{my_var}}");
+   $.getScript("/static/js/omn.js")
+});
+</script>
+
+<link rel="stylesheet" href="http://cdn.jsdelivr.net/g/yasqe@2.2(yasqe.min.css),yasr@2.4(yasr.min.css)" />
+<script src='http://cdn.jsdelivr.net/yasqe/2.2/yasqe.bundled.min.js'></script>
+<script src='http://cdn.jsdelivr.net/yasr/2.4/yasr.bundled.min.js'></script>
+<style>
+h2 {padding-top:1em; border-bottom:1px solid #333;}
+</style>
+{% endblock %}
+
+{% block content %}
+
+<br/>
+
+<h1>Fed4FIRE Ontology Plugin</h1>
+<h2>Intro</h2>
+Todo.
+
+<h2>Generated World Map</h2>
+Todo.
+
+<h2>Queries</h2>
+
+<h3>Examples</h3>
+<ul>
+<li><a href="http://portal.fed4fire.eu:8181/ontology?query=SELECT+%3Fname+%3Fam+%3Fendpoint+WHERE+%7B%0A++%3Finfra+%3Chttp%3A%2F%2Fopen-multinet.info%2Fontology%2Fomn%23hasService%3E+%3Fam+%3B%0A++++rdfs%3Alabel+%3Fname+.+%0A++%3Fam+rdf%3Atype+%3Chttp%3A%2F%2Fopen-multinet.info%2Fontology%2Fomn-domain-geni-fire%23AMService%3E+%3B%0A++++%3Chttp%3A%2F%2Fopen-multinet.info%2Fontology%2Fomn%23hasEndpoint%3E+%3Fendpoint+.%0A%7D+LIMIT+100%0A">
+Find all Aggregate Manager API's</a>
+</ul>
+
+<h3>User</h3>
+<div id="yasqe"></div>
+<div id="yasr"></div>
+
+<h2>Direct RDF stream</h2>
+<div id="welcome">Netmode RDF data: {{my_var}}</div>
+<pre><code id="data"></code></pre>
+{% endblock %}
index 436af69..247da1b 100644 (file)
@@ -1,58 +1,80 @@
 {% extends "layout_wide.html" %}
+{% load portal_filters %}
 
 {% block head %}
 <style>
 .disabled {
     z-index: 1000;
     background-color: #999999;
-    opacity: 0.3;
-    pointer-events: none;
+opacity: 0.3;
+         pointer-events: none;
 }
 </style>
 <script type="text/javascript">
 
 var global_list = {};
 var data = Array(); 
-var ad_rspec = Array(); 
-var request_rspec = Array(); 
-var manifest_rspec = Array(); 
+var ad_rspec = Object(); 
+var request_rspec = Object();
+var manifest_rspec = Object(); 
 var deleted_nodes = {}; 
 var added_nodes = {}; 
-
 var len_platforms = {{len_platforms}};
 
+var key_sliver = '';
+var key_slivername = '';
+var key_image = '';
+
 /* render_flavor & render_image */
 function render_option(obj){
     var option = document.createElement("option");
-    option.text = obj["@name"];
-    option.value = obj["@name"];
+    if(obj instanceof Object){
+        obj_name = obj["@name"];
+    }else{
+        obj_name = obj;
+    }
+    option.text = obj_name;
+    option.value = obj_name;
     return option;
 }
-function render_description(platform, obj, type){
+function render_description(platform, obj, type, node_name){
     if($('#'+platform+'_'+type).length==0){
-        $('#'+platform+'_add').append("<div id='"+platform+"_"+type+"'>");
+        $('#'+platform+'_add_'+node_name).append("<div id='"+platform+"_"+type+"'>");
     }
-    var d = platform+'_'+type+'_'+obj['@name'];
+    if(obj instanceof Array){
+        obj_name = obj["@name"];
+    }else{
+        obj_name = obj;
+    }
+    var d = platform+'_'+type+'_'+obj_name;
     d = d.replace(/ /g, '');
     id = d.replace( /(:|\.|\[|\])/g, "\\$1" );
     if($('#'+id).length==0){
         $('#'+platform+'_'+type).append("<div id='"+d+"' class='alert-success col-md-5' style='margin-top:10px;display:none;border-style:solid;border-color:#f1f1f1;border-width:2px;'></div>");
     }
     if($('#'+id+' div').length==0){
-        jQuery.each(obj, function(key,val){
-            if (key != 'openstack:image'){
-                $('#'+id).append("<div>"+key.replace('@','')+": "+val+"</div>");
-            }
-        });
+        if(obj instanceof Array){
+             jQuery.each(obj, function(key,val){
+                    if (key != 'openstack:image' && key != 'disk_image'){
+                        $('#'+id).append("<div>"+key.replace('@','')+": "+val+"</div>");
+                    }
+            });
+        }else{
+            // What do we do?
+        }
     }
 }
-function toogle_div(platform, value, type){
-    $("#"+platform+"_add").show();
-    // show the add button only if image is selected
-    if($("#"+platform+"_selectImage").val()!=null && $("#"+platform+"_selectImage").val()!=0 && value!=0){
-        $("#"+platform+"_add_button").show();
+function toogle_div(platform, value, type, node_name){
+    $("#"+platform+"_add_"+node_name).show();
+    if ( $("#"+platform+"_selectImage_"+node_name).length ) {
+        // show the add button only if image is selected
+        if($("#"+platform+"_selectImage_"+node_name).val()!=null && $("#"+platform+"_selectImage").val()!=0 && value!=0){
+            $("#"+platform+"_add_button_"+node_name).show();
+        }else{
+            $("#"+platform+"_add_button_"+node_name).hide();
+        }
     }else{
-        $("#"+platform+"_add_button").hide();
+        $("#"+platform+"_add_button_"+node_name).show();
     }
     $("[id^='"+platform+"_"+type+"_"+"']").hide();
     d = platform+'_'+type+'_'+value;
@@ -61,79 +83,122 @@ function toogle_div(platform, value, type){
     $('#'+id).show();
 }
 function render_cloud(platform, node){
-    elm = document.getElementById(platform+'_select');
+    console.log(node);
+    if ('@component_name' in node){
+        node_name = node['@component_name']
+    }else{
+        node_name = node['@component_id'].split('+').pop();
+    }
+    elm = document.getElementById(platform+'_select_'+node_name);
     //newElement = document.createElement('p');
     //elm.appendChild(newElement); 
-    global_list[platform]={};
+    global_list[platform][node_name]={};
     if('openstack:sliver' in node){
+        key_sliver = 'openstack:sliver';
+        key_slivername = '@sliver_name';
+    }else if('sliver_type' in node){
+        key_sliver = 'sliver_type';
+        key_slivername = '@name';
+    }
+    if (key_sliver != ''){
         selectFlavor = document.createElement('select');
-        selectFlavor.id = platform+"_selectFlavor";
-        selectFlavor.name = platform+"_selectFlavor";
+        selectFlavor.id = platform+"_selectFlavor_-_"+node_name;
+        selectFlavor.name = platform+"_selectFlavor_-_"+node_name;
         selectFlavor.onchange = function(){
             /* 1) Display corresponding Flavor div - hide others - reset selectImage value */
-            $("#"+platform+"_selectImage option[value=0]").prop('selected', true);
-            toogle_div(platform, this.value, 'flavor');
-            /* 3) Disable Images, Enable only compatible ones in selectImage */
-            $("[id^='"+platform+"_image_"+"']").hide();
-            $("#"+platform+"_selectImage option").attr("disabled",true);
-            $.each(global_list[platform][this.value], function (i,v){
-                $("#"+platform+"_selectImage option[value='" + v + "']").attr("disabled",false);
-            });
-            $("#"+platform+"_selectImage").attr("disabled",false);
+            name = this.id.split("_-_").pop();
+            toogle_div(platform, this.value, 'flavor', name);
+            if ( $("#"+platform+"_selectImage_"+name).length ) {
+                $("#"+platform+"_selectImage_"+name+" option[value=0]").prop('selected', true);
+                /* 3) Disable Images, Enable only compatible ones in selectImage */
+                $("[id^='"+platform+"_image_"+name+"']").hide();
+                $("#"+platform+"_selectImage_"+name+" option").attr("disabled",true);
+                $.each(global_list[platform][name][this.value], function (i,v){
+                    $("#"+platform+"_selectImage_"+name+" option[value='" + v + "']").attr("disabled",false);
+                });
+                $("#"+platform+"_selectImage_"+name).attr("disabled",false);
+            }
         }
         var option = document.createElement("option");
         option.text = "-- select a flavor --";
         option.value = 0;
         selectFlavor.appendChild(option);
-        jQuery.each( node['openstack:sliver'], function( i, sliver ) {
-            if('openstack:flavor' in sliver){
-                f = render_option(sliver['openstack:flavor']);
+        jQuery.each( node[key_sliver], function( i, sliver ) {
+                flavor = get_flavor(sliver);
+                f = render_option(flavor);
                 selectFlavor.appendChild(f);
-                flavor = sliver["openstack:flavor"];
                 /* 1) create hidden div to explain caracteristics of the flavor */
-                render_description(platform, flavor, 'flavor');
-                flavor_name = flavor['@name'];
-                global_list[platform][flavor_name]=[];
-                if ("openstack:image" in flavor){
+                render_description(platform, flavor, 'flavor', node_name);
+                if(flavor instanceof Object){
+                    flavor_name = flavor['@name'];
+                }else{
+                    flavor_name = flavor;
+                }
+                global_list[platform][node_name][flavor_name]=[];
+                if(flavor instanceof Object){
+                    if ("openstack:image" in flavor){
+                        images = flavor['openstack:image'];
+                        key_image = 'openstack:image';
+                    }else if("disk_image" in flavor){
+                        images = flavor['disk_image'];
+                        key_image = 'disk_image';
+                    }else{
+                        key_image = false;
+                    }
+                }else{
+                    key_image = false;
+                }
+                if(key_image){
                     selectImage = document.createElement('select');
-                    selectImage.id = platform+"_selectImage";
-                    selectImage.name = platform+"_selectImage";
+                    selectImage.id = platform+"_selectImage_"+node_name;
+                    selectImage.name = platform+"_selectImage_"+node_name;
                     selectImage.onchange = function(){
                         /* 2) display corresponding Image div - hide others */
-                        toogle_div(platform, this.value, 'image');
+                        toogle_div(platform, this.value, 'image', node_name);
                     }
                     var option = document.createElement("option");
                     option.text = "-- select an image --";
                     option.value = 0;
                     selectImage.appendChild(option);
-                    if(flavor["openstack:image"] instanceof Array){
-                        jQuery.each( flavor["openstack:image"], function( i, img ) {
-                           image = render_option(img);
-                           image.disabled = true;
-                           selectImage.appendChild(image);
-                           /* 2) create hidden div to explain caracteristics of the image */
-                           render_description(platform, img, 'image');
-                           global_list[platform][flavor_name].push(img['@name']);
+                    if(images instanceof Array){
+                        jQuery.each( images, function( i, img ) {
+                                image = render_option(img);
+                                image.disabled = true;
+                                selectImage.appendChild(image);
+                                /* 2) create hidden div to explain caracteristics of the image */
+                                render_description(platform, img, 'image', node_name);
+                                global_list[platform][node_name][flavor_name].push(img['@name']);
                         });
                     }else{
-                        image = render_option(flavor["openstack:image"]);
+                        image = render_option(images);
                         image.disabled = true;
                         selectImage.appendChild(image);
                         /* 2) create hidden div to explain caracteristics of the image */
-                        render_description(platform, flavor["openstack:image"], 'image');
-                        global_list[platform][flavor_name].push(flavor['openstack:image']['@name']);
+                        render_description(platform, images, 'image', node_name);
+                        global_list[platform][node_name][flavor_name].push(images['@name']);
                     }
                 }
-
-            }
         });
         elm.appendChild(selectFlavor); 
-        elm.appendChild(selectImage); 
+        if(key_image){
+            elm.appendChild(selectImage); 
+        }
+    }
+    $("#"+platform+"_selectFlavor_-_"+node_name).css("width","100px");
+    $("#"+platform+"_selectFlavor_-_"+node_name).css("height","30px");
+    if(key_image){
+        $("#"+platform+"_selectImage_"+node_name).css("width","100px");
+        $("#"+platform+"_selectImage_"+node_name).css("height","30px");
+    }
+}
+function get_flavor(sliver){
+    if(typeof sliver === 'string' || sliver instanceof String){
+        return sliver
+    } else if('openstack:flavor' in sliver){
+        return sliver['openstack:flavor'];
+    }else{
+        return sliver;
     }
-    $("#"+platform+"_selectFlavor").css("width","100px");
-    $("#"+platform+"_selectFlavor").css("height","30px");
-    $("#"+platform+"_selectImage").css("width","30px");
-    $("#"+platform+"_selectImage").css("height","30px");
 }
 function is_finished(len_platforms, pf_status){
     if(len_platforms == pf_status){
@@ -147,10 +212,10 @@ function sliver_name_exists(sliver_name){
         return true;
     }
     /*
-    if (sliver_name in deleted_nodes){
-        return true;
-    }
-    */
+       if (sliver_name in deleted_nodes){
+       return true;
+       }
+     */
     return false;
 }
 function find_sliver_name(sliver_name, num){
@@ -162,14 +227,14 @@ function find_sliver_name(sliver_name, num){
     }
 }
 
-function send_add(platform){ 
+function send_add(platform, node_name){ 
     $('#'+platform+'_pending_add').show();
-    sliver_name = $('#'+platform+'_sliver_name').val();
+    sliver_name = $('#'+platform+'_sliver_name_'+node_name).val();
     sliver_name = sliver_name.replace(' ','_');
-    flavor_name = $('#'+platform+'_selectFlavor').val();
-    image_name = $('#'+platform+'_selectImage').val();
+    flavor_name = $('#'+platform+'_selectFlavor_-_'+node_name).val();
+    image_name = $('#'+platform+'_selectImage_'+node_name).val();
 
-    num = $('#'+platform+'_number').val();
+    num = $('#'+platform+'_number_'+node_name).val();
     if (num > 1){
         for (i = 0; i < num; i++){
             // XXX Check if the name already exist in existing VMs and added_nodes
@@ -177,8 +242,8 @@ function send_add(platform){
             if (sliver_name_exists(vm_name)){
                 vm_name = find_sliver_name(sliver_name, num);
             }
-            node = get_node(vm_name, flavor_name, image_name);
-            request_rspec['rspec']['node'].push(node);
+            node = get_node(vm_name, flavor_name, image_name, node_name);
+            add_to_request_rspec(node);
             render_node(platform, node, 'pending_add');
             added_nodes[vm_name]=node;
         }
@@ -186,50 +251,67 @@ function send_add(platform){
         if (sliver_name_exists(sliver_name)){
             sliver_name = find_sliver_name(sliver_name, num);
         }
-        node = get_node(sliver_name, flavor_name, image_name);
-        request_rspec['rspec']['node'].push(node);
+        node = get_node(sliver_name, flavor_name, image_name, node_name);
+        add_to_request_rspec(node);
         render_node(platform, node, 'pending_add');
         added_nodes[sliver_name]=node;
     }
-    toogle_div(platform, flavor_name, 'flavor');
-    toogle_div(platform, image_name, 'image');
-    flavor_name = $('#'+platform+'_selectFlavor').val(0);
-    image_name = $('#'+platform+'_selectImage').val(0);
-    $('#'+platform+'_add').hide();
-    $('#'+platform+'_add_button').hide();
+    toogle_div(platform, flavor_name, 'flavor', node_name);
+    toogle_div(platform, image_name, 'image', node_name);
+    flavor_name = $('#'+platform+'_selectFlavor_-_'+node_name).val(0);
+    image_name = $('#'+platform+'_selectImage_'+node_name).val(0);
+    $('#'+platform+'_add_'+node_name).hide();
+    $('#'+platform+'_add_button_'+node_name).hide();
     $('#'+platform+'_div_pending').show();
     console.log(request_rspec);
     //jQuery('#'+platform+'_form_delete').submit();
 }
-function get_node(vm_name, flavor_name, image_name){
-        var node = {};
-        if(ad_rspec['rspec']['node'] instanceof Array) {
-            // Deep copy of the Array to avoid reference
-            node = jQuery.extend(true, {}, ad_rspec['rspec']['node'][0]);
-        }else{
-            // Deep copy of the Array to avoid reference
-            node = jQuery.extend(true, {}, ad_rspec['rspec']['node']);
-        }
-        if(node['openstack:sliver'] instanceof Array) {
-            node['openstack:sliver'] = node['openstack:sliver'][0];
-        }
-        node['openstack:sliver']['@sliver_name'] = vm_name;
-        console.log(vm_name);
+function get_node(vm_name, flavor_name, image_name, node_name){
+    var node = {};
+    if(ad_rspec['rspec']['node'] instanceof Array) {
+        // Deep copy of the Array to avoid reference
+        var i=0;
+        jQuery.each(ad_rspec['rspec']['node'], function(x, n){
+            if(n['@component_name']==node_name){
+                i = x;
+                return;
+            }
+        });
+        node = jQuery.extend(true, {}, ad_rspec['rspec']['node'][i]);
+    }else{
+        // Deep copy of the Array to avoid reference
+        node = jQuery.extend(true, {}, ad_rspec['rspec']['node']);
+    }
+    if(node[key_sliver] instanceof Array) {
+        node[key_sliver] = node[key_sliver][0];
+    }
+    node[key_sliver][key_slivername] = vm_name;
+    node["@client_id"] = vm_name;
+    console.log(vm_name);
+
+    flavor = Array();
 
-        if(node['openstack:sliver']['openstack:flavor'] instanceof Array) {
-            node['openstack:sliver']['openstack:flavor'] = node['openstack:sliver']['openstack:flavor'][0];
+    if('openstack:flavor' in node[key_sliver]){
+        flavor = {'@name':flavor_name,'openstack:image':{'@name':image_name}};
+        node[key_sliver]['openstack:flavor']=flavor;
+    }else{
+        if(typeof image_name === "undefined"){
+            flavor = {'@name':flavor_name};
+        }else{
+            flavor = {'@name':flavor_name,'disk_image':{'@name':image_name}};
         }
-        node['openstack:sliver']['openstack:flavor'] = Array();
-        node['openstack:sliver']['openstack:flavor'] = {'@name':flavor_name,'openstack:image':{'@name':image_name}};
+        node[key_sliver]=flavor;
+    }
 
-        $.each(node['openstack:sliver']['openstack:security_group'], function(i, group){
-            if(group['@name']=='default'){
-                node['openstack:sliver']['openstack:security_group'] = group;
+    if('openstack:security_group' in node[key_sliver]){
+        $.each(node[key_sliver]['openstack:security_group'], function(i, group){
+                if(group['@name']=='default'){
+                node[key_sliver]['openstack:security_group'] = group;
                 return false;
-            }
-        });
-        return node;
-
+                }
+                });
+    }
+    return node;
 }
 function send_delete(platform, sliver_name){
     $('#'+platform+'_pending_delete').show();
@@ -241,15 +323,25 @@ function send_delete(platform, sliver_name){
     $('#'+platform+'_div_pending').show();
     console.log(request_rspec);
 }
+function add_to_request_rspec(node){
+    if(request_rspec['rspec']['node'] instanceof Array) {
+        request_rspec['rspec']['node'].push(node);
+    }else{
+        n = request_rspec['rspec']['node'];
+        request_rspec['rspec']['node'] = Array();
+        request_rspec['rspec']['node'].push(n);
+        request_rspec['rspec']['node'].push(node);
+    }
+}
 function remove_node_from_request_rspec(sliver_name){
     var save_node = Array();
     jQuery.each( request_rspec['rspec']['node'], function( i, node ) {
-        if(node['openstack:sliver']['@sliver_name']==sliver_name){
+            if(node[key_sliver][key_slivername]==sliver_name){
             request_rspec['rspec']['node'].splice(i,1);
             save_node = node;
             return false;
-        }
-    });
+            }
+            });
     return save_node;
 }
 function cancel_add(platform,sliver_name){
@@ -263,6 +355,7 @@ function cancel_add(platform,sliver_name){
         $('#'+platform+'_pending_add').hide();
         if ($('#'+platform+'_pending_delete div').length==0){
             $('#'+platform+'_div_pending').hide();
+            $('#'+platform+'_pending_delete').hide();
         }
     }
 }
@@ -279,6 +372,7 @@ function cancel_delete(platform,sliver_name){
         $('#'+platform+'_pending_delete').hide();
         if ($('#'+platform+'_pending_add div').length==0){
             $('#'+platform+'_div_pending').hide();
+            $('#'+platform+'_pending_add').hide();
         }
     }
 }
@@ -302,35 +396,60 @@ function public_ip(platform,sliver_name,is_public){
 }
 
 function render_node(platform, node, state){
-    if('openstack:sliver' in node){
-        sliver = node['openstack:sliver']
-        var d = platform+'_'+state+'_'+sliver['@sliver_name'];
+    if(key_sliver in node){
+        sliver = node[key_sliver];
+        if(sliver instanceof Array){
+            client_id = sliver['@name'];
+        }else{
+            if ('@sliver_name' in sliver){
+                client_id = sliver['@sliver_name'];
+            }else{
+                client_id = node['@client_id'];
+            }
+        }
+        if ('@component_name' in node){
+            node_name = node['@component_name']
+        }else{
+            node_name = node['@component_id'].split('+').pop();
+        }
+
+        var d = platform+'_'+state+'_'+client_id;
         d = d.replace(/ /g, '');
         id = d.replace( /(:|\.|\[|\])/g, "\\$1" );
-        $("#"+platform+"_"+state).append("<div id='"+platform+'_'+state+'_'+sliver['@sliver_name']+"' class='row'></div>");
-        //$("#"+id).append("<input type='hidden' name='"+platform+"_"+sliver['@sliver_name']+"' value='"+sliver['@sliver_name']+"'>");
+        $("#"+platform+"_"+state).append("<div id='"+platform+'_'+state+'_'+client_id+"' class='row'></div>");
+        //$("#"+id).append("<input type='hidden' name='"+platform+"_"+client_id+"' value='"+client_id+"'>");
         if(state=='pending_add'){
-            $("#"+id).append("<div class='col-md-1' style='margin-left:0px;!important;'><input type='checkbox' id='publicip_"+platform+"_"+sliver['@sliver_name']+"' onclick=public_ip('"+platform+"','"+sliver['@sliver_name']+"',this.checked);></div>");
+            $("#"+id).append("<div class='col-md-1' style='width:40px;margin-left:0px;!important;'><input type='checkbox' id='publicip_"+platform+"_"+client_id+"' onclick=public_ip('"+platform+"','"+client_id+"',this.checked);></div>");
+        }else{
+            $("#"+id).append("<div class='col-md-1' style='width:40px;margin-left:0px;!important;'>&nbsp;</div>");
+        }
+        $("#"+id).append("<div class='col-md-2'>"+node_name+"</div>");
+        $("#"+id).append("<div class='col-md-2'>"+client_id+"</div>");
+        if('openstack:flavor' in node[key_sliver]){
+            $("#"+id).append("<div class='col-md-2'>"+sliver['openstack:flavor']['@name']+"</div>");
+            $("#"+id).append("<div class='col-md-3'>"+sliver['openstack:flavor']['openstack:image']['@name']+"</div>");
         }else{
-            $("#"+id).append("<div class='col-md-1' style='margin-left:0px;!important;'>&nbsp;</div>");
+            $("#"+id).append("<div class='col-md-2'>"+sliver['@name']+"</div>");
+            if('disk_image' in sliver){
+                $("#"+id).append("<div class='col-md-3'>"+sliver['disk_image']['@name']+"</div>");
+            }else{
+                $("#"+id).append("<div class='col-md-3'>&nbsp;</div>");
+            }
         }
-        $("#"+id).append("<div class='col-md-2' style='padding-left:0px;'>"+sliver['@sliver_name']+"</div>");
-        $("#"+id).append("<div class='col-md-3'>"+sliver['openstack:flavor']['@name']+"</div>");
-        $("#"+id).append("<div class='col-md-3'>"+sliver['openstack:flavor']['openstack:image']['@name']+"</div>");
 
         if(state=='existing'){
-            $("#"+id).append("<div class='col-md-1'><input id='"+platform+"_delete_"+sliver['@sliver_name']+"' type='submit' form='"+platform+"_form_delete' value='Delete' onclick=send_delete('"+platform+"','"+sliver['@sliver_name']+"');></div>");
+            $("#"+id).append("<div class='col-md-1'><input id='"+platform+"_delete_"+client_id+"' type='submit' form='"+platform+"_form_delete' value='Delete' onclick=send_delete('"+platform+"','"+client_id+"');></div>");
         }else if(state=='pending_add'){
-            $("#"+id).append("<div class='col-md-1'><input id='"+platform+"_cancel_"+sliver['@sliver_name']+"' type='submit' form='"+platform+"_form_cancel' value='Cancel' onclick=cancel_add('"+platform+"','"+sliver['@sliver_name']+"');></div>");
+            $("#"+id).append("<div class='col-md-1'><input id='"+platform+"_cancel_"+client_id+"' type='submit' form='"+platform+"_form_cancel' value='Cancel' onclick=cancel_add('"+platform+"','"+client_id+"');></div>");
         }else if (state=='pending_delete'){
-            $("#"+id).append("<div class='col-md-1'><input id='"+platform+"_cancel_"+sliver['@sliver_name']+"' type='submit' form='"+platform+"_form_cancel' value='Cancel' onclick=cancel_delete('"+platform+"','"+sliver['@sliver_name']+"');></div>");
+            $("#"+id).append("<div class='col-md-1'><input id='"+platform+"_cancel_"+client_id+"' type='submit' form='"+platform+"_form_cancel' value='Cancel' onclick=cancel_delete('"+platform+"','"+client_id+"');></div>");
         }else{
             console.log("state: "+state+" not impemented");
         }
         /*
-        sliver['openstack:address']
-        sliver['openstack:flavor']
-        */
+           sliver['openstack:address']
+           sliver['openstack:flavor']
+         */
     }
 }
 
@@ -338,21 +457,33 @@ function allocate(platform, slicename){
     $("#"+platform+"_main").addClass("disabled");
     $("#"+platform+"_wait").show();
     $("#"+platform+"_wait").spin();
+    console.log("allocate rspec = ")
+    console.log(request_rspec);
+    console.log("allocate json = ")
+    console.log(JSON.stringify(request_rspec));
     $.post("/sfa/Allocate",{'hrn':slicename, 'type':'slice', 'platform':[platform], 'rspec':JSON.stringify(request_rspec)}, function( result ) {
-        console.log(result);
-        clear_data(platform);
-        load_data(platform,slicename);
-        $("#"+platform+"_main").removeClass("disabled");
-        $("#"+platform+"_wait").hide();
-        mysliceAlert('Success: changes applied','success', true);
+            console.log(result);
+            clear_data(platform);
+            load_data(platform,slicename);
+            $("#"+platform+"_main").removeClass("disabled");
+            $("#"+platform+"_wait").hide();
+            if('error' in result[platform]){
+                mysliceAlert('Error: '+result[platform]['error_msg'],'danger', true);
+            }else if('code' in result[platform] && result[platform]['code']['am_code']==-1){
+                mysliceAlert('Error: '+result[platform]['output'],'danger', true);
+            }else{
+                mysliceAlert('Success: changes applied','success', true);
+            }
     });
 }
 function clear_data(platform){
     $('#'+platform+'_existing').children().remove();
     $('#'+platform+'_pending_delete').children().remove();
-    $("#"+platform+"_selectFlavor").remove();
-    $("#"+platform+"_selectImage").remove();
+    $('#'+platform+'_pending_delete').hide();
+    $("[id^="+platform+"_selectFlavor]").remove();
+    $("[id^="+platform+"_selectImage]").remove();
     $('#'+platform+'_pending_add').children().remove();
+    $('#'+platform+'_pending_add').hide();
     $('#'+platform+'_div_pending').hide();
 }
 function load_data(platform, slicename){
@@ -360,59 +491,67 @@ function load_data(platform, slicename){
     var platform_empty = Array();
 
     $.post("/sfa/Describe",{'hrn':slicename, 'type':'slice', 'platform':[platform]}, function( d ) {
-        data = d;
-        console.log(data);
-        if('parsed' in data[platform] && 'rspec' in data[platform]['parsed']){
+       console.log(data);
+       $("#"+platform+"_main").spin(false);
+       data = d;
+       if('parsed' in data[platform] && 'rspec' in data[platform]['parsed']){
            manifest_rspec = data[platform]['parsed']['rspec'];
            request_rspec = data[platform]['parsed'];
            request_rspec['rspec']['@type']='request';
            if('node' in manifest_rspec){
                if(manifest_rspec['node'] instanceof Array) {
                    jQuery.each( manifest_rspec['node'], function( i, node ) {
-                       render_node(platform,node, 'existing');
+                       render_node(platform, node, 'existing');
                    });
                }else{
-                   render_node(platform,manifest_rspec['node'], 'existing');
+                   render_node(platform, manifest_rspec['node'], 'existing');
                }
                $('#'+platform+'_existing').show();
            }
-        }
+       }else{
+           // Let's build a default request_rspec
+           request_rspec['rspec']=Object();
+           request_rspec['rspec']['@type']='request';
+           request_rspec['rspec']['node']=Array();
+       }
     });
     $.post("/sfa/ListResources",{'platform':[platform]}, function( d ) {
-        //$.extend(data,d);
-        //console.log(data);
-        if('parsed' in d[platform] && 'rspec' in d[platform]['parsed']){
-           ad_rspec = d[platform]['parsed'];
-           if('node' in ad_rspec['rspec']){
-               if(ad_rspec['rspec']['node'] instanceof Array) {
-                   jQuery.each( ad_rspec['rspec']['node'], function( i, node ) {
-                       render_cloud(platform,node);
-                   });
-               }else{
-                   render_cloud(platform,ad_rspec['rspec']['node']);
-               }
-           }else{
-               platform_empty.push(platform);
-           }
-        }else{
+            //$.extend(data,d);
+            console.log(data);
+            global_list[platform]={};
+            if('parsed' in d[platform] && 'rspec' in d[platform]['parsed']){
+            ad_rspec = d[platform]['parsed'];
+            if('node' in ad_rspec['rspec']){
+            if(ad_rspec['rspec']['node'] instanceof Array) {
+            jQuery.each( ad_rspec['rspec']['node'], function( i, node ) {
+                render_cloud(platform,node);
+                });
+            }else{
+            render_cloud(platform,ad_rspec['rspec']['node']);
+            }
+            }else{
             platform_empty.push(platform);
-        }
-        platform_status.push(platform);
-        if(is_finished(len_platforms,platform_status.length)){
-            $("#loading").hide();
-            if(platform_empty.length == len_platforms){
-                $("#warning_message").show();
             }
-        }
+            }else{
+            platform_empty.push(platform);
+            }
+            platform_status.push(platform);
+            if(is_finished(len_platforms,platform_status.length)){
+                $("#loading").hide();
+                if(platform_empty.length == len_platforms){
+                    $("#warning_message").show();
+                }
+            }
     });
 }
 $(document).ready(function() {
-{% for platform in platforms %}
-    {% if platform in cloud_platforms %}
-    load_data('{{platform}}', '{{slicename}}');
-    {% endif %}
-{% endfor %}
-});
+        {% for platform in platforms %}
+        {% if platform in cloud_platforms %}
+        $("#{{platform}}_main").spin();
+        load_data('{{platform}}', '{{slicename}}');
+        {% endif %}
+        {% endfor %}
+        });
 </script>
 {% endblock %}
 
@@ -420,63 +559,51 @@ $(document).ready(function() {
 {{post_values}}
 {% for platform in platforms %}
     {% if platform in cloud_platforms %}
-    <div id="{{platform}}_wait" style="display:none;margin-top:20px;position:absolute;margin-left:300px;"></div>
-    <div id="{{platform}}_main" style="padding-left:20px;padding-top:20px;padding-right:20px;padding-bottom:20px;border-style:solid;border-width:1px;width:700px;">
+
+    <div id="{{platform}}_wait" style="display:none;margin-top:35px;position:absolute;margin-left:50%;"></div>
+    <div id="{{platform}}_main" style="padding-left:20px;padding-top:20px;padding-right:20px;padding-bottom:20px;border-style:solid;border-width:1px;">
         <h2>{{ platform }}</h2>
         // display only if VMs already in slice
         <h4>VMs in slice {{slicename}}</h4>
-        <form id="{{platform}}_form_delete" method="post">
-        {% csrf_token %}
-        <div id="{{platform}}_existing" class="row alert alert-info" style="display:none;">
+        <div id="{{platform}}_existing" class="row alert alert-info" style='display:none;margin-left:0px;!important;margin-right:0px;!important;'>
         <input type="hidden" name="{{platform}}_vm" id="{{platform}}_vm">
         <input type="hidden" name="action" id="action" value="delete">
         <input type="hidden" name="platform" id="platform" value="{{platform}}">
         </div> 
-        </form>
-        <h4><a href="#" onclick="$('#{{platform}}_div_add').toggle();"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Create new VMs</a></h4>
-        <div id="{{platform}}_div_add" class="alert" style="background-color:#f1f1f1;display:none;margin-bottom:0px !important;padding-bottom:6px !important;">
-        <form id="{{platform}}_form_add" method="post" class="form-inline">
-        {% csrf_token %}
-        <div id="{{platform}}_input" class="row">
-            <div class="col-md-1"></div>
-            <div class="col-md-3"><label for="{{platform}}_number">number:</label>
-            <input type="text" maxlength="2" id="{{platform}}_number" name="{{platform}}_number" style="width:2.2em;min-width:2.2em;height:30px;" value="1" class="form-control" required>
-            </div>
-            <div class="col-md-8"><label for="{{platform}}_sliver_name">name:</label>
-            <div class="form-group">
-            <input type="text" name="{{platform}}_sliver_name" id="{{platform}}_sliver_name" value="VM" maxlength="12" class="form-control" style="height:30px;" required>
-            </div>
-            </div>
-            <div class="col-md-1"></div>
-            <div id="{{platform}}_select" class="col-md-11"></div>
-        </div>
-        <div id="{{platform}}_add" class="row">
-            <div class="col-md-1">&nbsp; 
-            <input type="hidden" name="action" id="action" value="add">
-            <input type="hidden" name="platform" id="platform" value="{{platform}}">
-            </div>
-        </div>
-        <div class="row" style="padding-top:6px;">
-            <div class="col-md-1">&nbsp;</div>
-            <div class="col-md-11" id="{{platform}}_add_button" style="display:none;">
-            <input type="submit" form="{{platform}}_form_add" value="Add" onclick="send_add('{{platform}}');">
-            </div>
-        </div>
-        </form>
+        <div id="{{platform}}_div_nodes">
+        {% for key, value in result.items %} 
+          {% if key == platform %}
+            {% if value.parsed.rspec.node|get_type == 'list' %}
+                {% for node in value.parsed.rspec.node %}
+                    {% for k,node_urn in node.items %} 
+                        {% if k == '@component_id' %}
+                        {% widget '_widget-cloud-node.html' %}
+                        {% endif %}
+                    {% endfor %}
+                {% endfor %}
+            {% else %}
+                {% for k,node_urn in value.parsed.rspec.node.items %}
+                    {% if k == '@component_id' %}
+                    {% widget '_widget-cloud-node.html' %}
+                    {% endif %}
+                {% endfor %}
+            {% endif %}
+          {% endif %}
+        {% endfor %}
         </div>
         <br>
         <div id="{{platform}}_div_pending" style="display:none;">
-        // display only pending changes
-        <h4>Pending changes</h4>
-        <form id="{{platform}}_form_reserve" method="post">
-        {% csrf_token %}
-        <div id="{{platform}}_pending_add" class="row alert alert-success" style="display:none;margin-bottom:3px !important;"></div> 
-        <div id="{{platform}}_pending_delete" class="row alert alert-danger" style="display:none;margin-bottom:3px !important;"></div> 
-        <br>
-        <input type="hidden" name="action" id="action" value="reserve">
-        <input type="hidden" name="platform" id="platform" value="{{platform}}">
-        <input type="submit" form="{{platform}}_form_reserve" value="Apply changes" onclick="allocate('{{platform}}','{{slicename}}');">
-        </form>
+            // display only pending changes
+            <h4>Pending changes</h4>
+            <form id="{{platform}}_form_reserve" method="post">
+            {% csrf_token %}
+            <div id="{{platform}}_pending_add" class="row alert alert-success" style="display:none;margin-bottom:3px !important;margin-left:0px;!important;margin-right:0px;!important;"></div> 
+            <div id="{{platform}}_pending_delete" class="row alert alert-danger" style="display:none;margin-bottom:3px !important;margin-left:0px;!important;margin-right:0px;!important;"></div> 
+            <br>
+            <input type="hidden" name="action" id="action" value="reserve">
+            <input type="hidden" name="platform" id="platform" value="{{platform}}">
+            <input type="submit" form="{{platform}}_form_reserve" value="Apply changes" onclick="allocate('{{platform}}','{{slicename}}');">
+            </form>
         </div>
     </div>
     {% endif %}
index 74f113a..7333efa 100644 (file)
@@ -47,4 +47,12 @@ def file_exists(filepath):
     else:
         index = filepath.rfind('/')
         new_filepath = filepath[:index] + '/image.png'
-        return new_filepath
\ No newline at end of file
+        return new_filepath
+
+@register.filter
+def get_type(value):
+    return type(value).__name__
+
+@register.filter
+def get_name_from_urn(value):
+    return value.split("+")[-1]
index 45e30a1..0a84093 100644 (file)
@@ -203,23 +203,23 @@ def sfa_client(request, method, hrn=None, urn=None, object_type=None, rspec=None
              #return HttpResponse(json.dumps({'error' : '-2'}), content_type="application/json")
              return {'error' : '-2'}
  
-        server = SfaServerProxy(server_url, pkey, cert)
+        server = SfaServerProxy(server_url, pkey, cert, verbose=False)#, timeout=5)
         #server = SFAProxy(server_url, pkey, cert)
-        if 'geni_rspec_version' in options:
-            # GetVersion to know if the AM supports the requested version
-            # if not ask for the default GENI v3
-            start_time = time.time()
-            result = server.GetVersion()
-            logger.debug("EXEC TIME - GetVersion() - %s sec." % (time.time() - start_time))
-            if 'geni_ad_rspec_versions' in result['value']:
-                for v in result['value']['geni_ad_rspec_versions']:
-                    if v['type'] == options['geni_rspec_version']:
-                        api_options['geni_rspec_version'] = {'type': options['geni_rspec_version']}
-                        break
-                    else:
-                        api_options['geni_rspec_version'] = {'type': 'GENI', 'version': '3'}
-        else:
-            api_options['geni_rspec_version'] = {'type': 'GENI', 'version': '3'}
+        #if 'geni_rspec_version' in api_options:
+        #    # GetVersion to know if the AM supports the requested version
+        #    # if not ask for the default GENI v3
+        #    start_time = time.time()
+        #    result = server.GetVersion()
+        #    logger.debug("EXEC TIME - GetVersion() - %s sec." % (time.time() - start_time))
+        #    if 'geni_ad_rspec_versions' in result['value']:
+        #        for v in result['value']['geni_ad_rspec_versions']:
+        #            if v['type'] == api_options['geni_rspec_version']:
+        #                api_options['geni_rspec_version'] = {'type': api_options['geni_rspec_version']}
+        #                break
+        #            else:
+        #                api_options['geni_rspec_version'] = {'type': 'GENI', 'version': '3'}
+        #else:
+        #    api_options['geni_rspec_version'] = {'type': 'GENI', 'version': '3'}
 
         try:
             # Get user config from Manifold
@@ -260,12 +260,9 @@ def sfa_client(request, method, hrn=None, urn=None, object_type=None, rspec=None
                 # AM API Calls
                 if server_am:
                     if method == "ListResources":
-                        logger.debug(api_options)
-                        #logger.debug(user_cred)
                         start_time = time.time()
                         result = server.ListResources([user_cred], api_options)
                         logger.debug("EXEC TIME - ListResources() - %s sec." % (time.time() - start_time))
-                        #logger.debug(result)
                         dict_result = xmltodict.parse(result['value'])
                         result['parsed'] = dict_result
                         if isinstance(dict_result['rspec']['node'], list):
@@ -380,7 +377,6 @@ def sfa_client(request, method, hrn=None, urn=None, object_type=None, rspec=None
                         logger.debug('method %s not handled by Registry' % method)
                         result = []
             if output_format is not None:
-                logger.debug("result = " % result)
                 if 'value' in result:
                     # TODO Python Caching 
                     # to avoid translating the same RSpec in the same format several times