From: Loic Baron Date: Fri, 8 Jan 2016 11:16:57 +0000 (+0100) Subject: Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into onelab X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=79ffdb8b0d0fe78e5d5b8491ffe8fdd940943621;hp=75b26254fbc898b1adb7aab4eb654b2ef5dcb375;p=unfold.git Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into onelab --- diff --git a/localauth/manifoldbackend.py b/localauth/manifoldbackend.py index 504a85be..3e235151 100644 --- a/localauth/manifoldbackend.py +++ b/localauth/manifoldbackend.py @@ -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: diff --git a/manifoldapi/manifoldapi.py b/manifoldapi/manifoldapi.py index 29236c0f..0fc40339 100644 --- a/manifoldapi/manifoldapi.py +++ b/manifoldapi/manifoldapi.py @@ -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 diff --git a/myslice/urls.py b/myslice/urls.py index b2e88bb6..8f108280 100644 --- a/myslice/urls.py +++ b/myslice/urls.py @@ -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[^/]+)/?$', portal.sliceresourceview.SliceResourceView.as_view()), (r'^users/(?P[^/]+)/?$', 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[^/]+)/?$', portal.resources.ResourcesView.as_view()), diff --git a/portal/actions.py b/portal/actions.py index 523a9e1e..e0dc131f 100644 --- a/portal/actions.py +++ b/portal/actions.py @@ -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 index 00000000..f101fa75 --- /dev/null +++ b/portal/omn.py @@ -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)) + diff --git a/portal/slicetabcloud.py b/portal/slicetabcloud.py index ce1dc31d..5f151093 100644 --- a/portal/slicetabcloud.py +++ b/portal/slicetabcloud.py @@ -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 index 00000000..ff0940f1 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 index 00000000..477221dd --- /dev/null +++ b/portal/static/js/omn.js @@ -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 ?am ;\n rdfs:label ?name . \n ?am rdf:type ;\n ?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: \n" + + "PREFIX ds: \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: \n" + + "PREFIX ds: \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 index 00000000..7bb0b729 --- /dev/null +++ b/portal/templates/_widget-cloud-node.html @@ -0,0 +1,32 @@ +{% load portal_filters %} +
+

Create new VMs on node {{node_urn|get_name_from_urn}}

+ + +
diff --git a/portal/templates/omn/gui.html b/portal/templates/omn/gui.html new file mode 100644 index 00000000..8d80e77d --- /dev/null +++ b/portal/templates/omn/gui.html @@ -0,0 +1,56 @@ +{% extends "layout_wide.html" %} +{% block head %} + + + + + + + +{% endblock %} + +{% block content %} + +
+ +

Fed4FIRE Ontology Plugin

+

Intro

+Todo. + +

Generated World Map

+Todo. + +

Queries

+ +

Examples

+ + +

User

+
+
+ +

Direct RDF stream

+
Netmode RDF data: {{my_var}}
+
+{% endblock %} diff --git a/portal/templates/slice-tab-cloud.html b/portal/templates/slice-tab-cloud.html index 436af696..247da1ba 100644 --- a/portal/templates/slice-tab-cloud.html +++ b/portal/templates/slice-tab-cloud.html @@ -1,58 +1,80 @@ {% extends "layout_wide.html" %} +{% load portal_filters %} {% block head %} {% endblock %} @@ -420,63 +559,51 @@ $(document).ready(function() { {{post_values}} {% for platform in platforms %} {% if platform in cloud_platforms %} - -
+ + +

{{ platform }}

// display only if VMs already in slice

VMs in slice {{slicename}}

-
- {% csrf_token %} -