"facility" : None,
"testbed" : None,
}
-
+
if objects is not None:
for o in objects :
if (o in log) :
log[o] = objects[o]
-
+
try :
result = urllib2.urlopen(server, urllib.urlencode(log))
logger.info("===============>> activity: {} <{}> {}".format(action, request.user,message))
logger.error(e.strerror)
dbfile = ''.join([os.path.dirname(os.path.abspath(__file__)), "/errors.db"])
+ logger.error("===============>> activity: database path: " + dbfile)
conn = None
try:
conn = lite.connect(dbfile)
def logCheck():
"""Checking local database for logs adn sending it to monitoring server"""
dbfile = ''.join([os.path.dirname(os.path.abspath(__file__)), "/errors.db"])
+ logger.error("[activity] database path: " + dbfile)
conn = None
#trying to connect local db adn pull unsent logs
def execute_query(request, query):
- logger.debug("EXECUTE QUERY: request - {}".format(request.session.items()))
+ #logger.debug("EXECUTE QUERY: request - {}".format(request.session.items()))
if not 'manifold' in request.session or not 'auth' in request.session['manifold']:
#manifold_api_session_auth = SessionCache().get_auth(request)
#from manifoldapi.manifoldquery import ManifoldQuery
from manifold.core.query import Query
from manifold.core.result_value import ResultValue
-from manifoldapi.manifoldapi import ManifoldAPI
-from manifoldapi.manifoldresult import ManifoldException
+from manifoldapi import ManifoldAPI
+from manifoldresult import ManifoldException
# from unfold.sessioncache import SessionCache
//
// +) If a reservable node is added to the slice, then it should have a corresponding lease
// XXX Not always a resource
- var is_reservable = (record.exclusive == true);
+ var is_reservable = (record.exclusive == 'true' || record.exclusive == true);
if (is_reservable) {
// var warnings = manifold.query_store.get_record_state(query.query_uuid, record_key, STATE_WARNINGS);
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'
-
+# test
+ALLOWED_HOSTS = '*onelab.eu'
from unfold.loginrequired import LoginRequiredView
import portal.about
+import portal.certificate
import portal.institution
import portal.registrationview
import portal.accountview
#
url(r'^register/?$', portal.registrationview.RegistrationView.as_view(), name='registration'),
url(r'^account/?$', portal.accountview.AccountView.as_view(), name='account'),
+ url(r'^get_cert/?$', portal.certificate.CertificateView.as_view(), name='certificate'),
url(r'^account/account_process/?$', portal.accountview.account_process),
url(r'^contact/?$', portal.contactview.ContactView.as_view(), name='contact'),
url(r'^terms/?$', portal.termsview.TermsView.as_view(), name='terms'),
filter_status = this.dataset['status'];
self.select_tab(filter_status);
+ // manifoldapi/static/js/manifold.js
+ // See this.apply_filters
+
// ... and communicate the appropriate filters to the manager
// NOTE: we use the manifold namespace for internal filters
if (self.prev_filter_status) {
sPaginationType: 'bootstrap',
// Handle the null values & the error : Datatables warning Requested unknown parameter
// http://datatables.net/forums/discussion/5331/datatables-warning-...-requested-unknown-parameter/p2
- aoColumnDefs: [{sDefaultContent: '', aTargets: [ '_all' ]}],
+ aoColumnDefs: [{sDefaultContent: '', aTargets: [ '_all' ], "sType": "mysort"}],
// WARNING: this one causes tables in a 'tabs' that are not exposed at the time this is run to show up empty
// sScrollX: '100%', /* Horizontal scrolling */
bProcessing: true, /* Loading */
return result=$('td:eq('+iColumn+') input', tr).prop('checked') ? '1' : '0';
});
};
+
+ // use sType: "mysort" for any columns you wish to use these routines
+ // http://datatables.net/forums/discussion/7546/alpha-numeric-sort
+ jQuery.fn.dataTableExt.oSort['mysort-asc'] = function(a,b) {
+ var r = new RegExp("<([a-zA-Z]+).*?>(.*?)</\\1>");
+ if (r.exec(a) != null){
+ a = r.exec(a)[2];
+ }
+ if (r.exec(b) != null){
+ b = r.exec(b)[2];
+ }
+ a = a.replace(/[^A-Za-z0-9]/, "");
+ b = b.replace(/[^A-Za-z0-9]/, "");
+ var re = new RegExp("^([a-zA-Z]*)(.*)");
+ var x = re.exec(a);
+ var y = re.exec(b);
+
+ // you might want to force the first portion to lowercase
+ // for case insensitive matching
+ // x[1] = x[1].toLowerCase();
+ // y[1] = y[1].toLowerCase();
+
+ if (x[1] > y[1]) return 1;
+ if (x[1] < y[1]) return -1;
+
+ // if you want to force the 2nd part to only be numeric:
+ x[2] = parseInt(x[2]);
+ y[2] = parseInt(y[2]);
+
+ return ((x[2] < y[2]) ? -1 : ((x[2] > y[2]) ? 1 : 0));
+ };
+
+ jQuery.fn.dataTableExt.oSort['mysort-desc'] = function(a,b) {
+ var r = new RegExp("<([a-zA-Z]+).*?>(.*?)</\\1>");
+ if (r.exec(a) != null){
+ a = r.exec(a)[2];
+ }
+ if (r.exec(b) != null){
+ b = r.exec(b)[2];
+ }
+ a = a.replace(/[^A-Za-z0-9]/, "");
+ b = b.replace(/[^A-Za-z0-9]/, "");
+ var re = new RegExp("^([a-zA-Z]*)(.*)");
+ var x = re.exec(a);
+ var y = re.exec(b);
+
+ // you might want to force the first portion to lowercase
+ // for case insensitive matching
+ // x[1] = x[1].toLowerCase();
+ // y[1] = y[1].toLowerCase();
+
+ if (x[1] > y[1]) return -1;
+ if (x[1] < y[1]) return 1;
+
+ // if you want to force the 2nd part to only be numeric:
+ x[2] = parseInt(x[2]);
+ y[2] = parseInt(y[2]);
+
+ return ((x[2] < y[2]) ? 1 : ((x[2] > y[2]) ? -1 : 0));
+ };
from portal.models import PendingUser, PendingSlice, PendingAuthority, PendingProject, PendingJoin
from unfold.page import Page
+import hashlib
import json
from django.contrib.auth.models import User
msg.send()
# saves the user to django auth_user table [needed for password reset]
- user = User.objects.create_user(request['email'].split('@')[-1], request['email'], request['password'])
+ # Django username must be less than 30 char so we use a hash
+ user = User.objects.create_user(hashlib.sha1(request['email']).hexdigest(), request['email'], request['password'])
# Creating a manifold user
user_id = manifold_add_user(wsgi_request, request)
--- /dev/null
+# this somehow is not used anymore - should it not be ?
+from django.core.context_processors import csrf
+from django.http import HttpResponseRedirect
+from django.contrib.auth import authenticate, login, logout
+from django.template import RequestContext
+from django.shortcuts import render_to_response
+from django.shortcuts import render
+
+from unfold.loginrequired import LoginRequiredAutoLogoutView
+
+from manifoldapi.manifoldresult import ManifoldResult
+from ui.topmenu import topmenu_items, the_user
+from myslice.configengine import ConfigEngine
+
+from myslice.theme import ThemeView
+
+from portal.actions import get_jfed_identity
+
+class CertificateView (LoginRequiredAutoLogoutView, ThemeView):
+ template_name = 'certificate.html'
+
+ # expose this so we can mention the backend URL on the welcome page
+ def default_env (self):
+ return {
+ 'MANIFOLD_URL':ConfigEngine().manifold_url(),
+ }
+
+ def post (self,request):
+ env = self.default_env()
+ env['theme'] = self.theme
+ return render_to_response(self.template, env, context_instance=RequestContext(request))
+
+ def get (self, request, state=None):
+ env = self.default_env()
+
+ if request.user.is_authenticated():
+ env['person'] = self.request.user
+ else:
+ env['person'] = None
+
+ env['theme'] = self.theme
+
+ env['username'] = the_user(request)
+ env['topmenu_items'] = topmenu_items(None, request)
+ if state:
+ env['state'] = state
+ elif not env['username']:
+ env['state'] = None
+ # use one or two columns for the layout - not logged in users will see the login prompt
+ #env['layout_1_or_2'] = "layout-unfold2.html" if not env['username'] else "layout-unfold1.html"
+
+ env['certificate'] = get_jfed_identity(request)
+ return render_to_response(self.template, env, context_instance=RequestContext(request))
+
if key == "hash_code":
hash_code=value
- if PendingUser.objects.filter(email_hash__iexact = hash_code).filter(status__iexact = 'False'):
+ #if PendingUser.objects.filter(email_hash__iexact = hash_code).filter(status__iexact = 'False'):
+ if PendingUser.objects.filter(email_hash__iexact = hash_code):
activation = 'success'
pending_users = PendingUser.objects.filter(email_hash__iexact = hash_code)
pending_user = pending_users[0]
Copyrights © 2015 UPMC Sorbonne Universités. All rights reserved.
</div>
<div class="col-md-3 copy">
- powered by <a href="http://myslice.info" target="_blank"><img src="//myslice.info/images/logo.png" style="width:50px;"></a>
+ powered by <a href="http://myslice.info" target="_blank"><img src="//www.myslice.info/images/logo.png" style="width:50px;"></a>
<a href="/portal/release_notes" id="portal_version"></a>
</div>
</div>
-<img src="{{current_site}}/static/img/{{theme.logo}}">
+<img src="{{current_site}}/static/img/{{theme.logo}}" width="80px">
<br>
<p>We have received a user signup request for your email address at {{current_site}}</p>
<p>You have the following user details:</p>
--- /dev/null
+<pre style="word-wrap: break-word; white-space: pre-wrap;">
+{{certificate}}
+</pre>
-<img src="{{current_site}}/static/img/{{theme.logo}}">
+<img src="{{current_site}}/static/img/{{theme.logo}}" width="80px">
<br>
<h1>User details</h1>
<br>
--- /dev/null
+{% extends "layout_base.html" %}
+{% load portal_filters %}
+
+{% block content %}
+<!-- <div class="row">
+{% widget '_widget-news.html' %}
+</div> -->
+{% if username %}
+
+{% block head %}
+<script type="text/javascript" src="https://java.com/js/dtjava.js"></script>
+{% endblock head %}
+
+{% widget "_widget-no_credentials.html" %}
+<div class="container dashboard">
+ <div class="row">
+ <div class="col-md-12" id="credentials_msg" style="display:none;">
+ {%if 'no_creds' in user_cred %}
+ <p class="command"><a href="#" style="color:red" data-toggle="modal" data-target="#myModal">NO CREDENTIALS</a> are delegated to the portal!</p>
+ {%endif%}
+ {%if 'creds_expired' in user_cred %}
+ <p class="command"><a href="#" style="color:red" data-toggle="modal" data-target="#myModal">EXPIRED CREDENTIALS</a> Please delegate again your credentials to the portal!</p>
+ {%endif%}
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-sm-4">
+ <h3>
+ <a href="/portal/slice_request/"><img src="{{ STATIC_URL }}img/icon_slices_small.png" alt="" />EXPERIMENT</a>
+ </h3>
+ <div>
+ <span class="glyphicon glyphicon-cog"></span> <a href="/portal/project_request/">Create/Join project</a>
+ </div>
+ <div class="dashboard-create-slice">
+ <span class="glyphicon glyphicon-plus"></span> <a href="/portal/slice_request/">Create slice</a>
+ </div>
+ <div class="projects-tree">
+ Your projects and slices
+ <span title="A <b>slice</b> is a set of testbed resources on which you can conduct an experiment.
+ Either ask your colleagues to give you access to an existing slice or request a new slice by clicking 'Request Slice'.
+ However, on the Fed4FIRE portal, you will only see slices that you have created through Fed4FIRE. If you have created slices elsewhere,
+ those slices will not appear here. <br /><br /> A <b>project</b> is a sub-authority under the responsability of your institution gathering users,
+ who will be able to create slices for their experiments." class="glyphicon glyphicon-info-sign"> </span>
+
+ <div id="home-project-tree"><img class="projects-loading" src="{{ STATIC_URL }}img/loading.gif" alt="Loading projects" /></div>
+ </div>
+ {% include theme|add:"_jfed_button.html" %}
+ </div>
+ <div class="col-sm-4">
+ <div class="row">
+ <div class="col-sm-12">
+ <h3>
+ <a href="/portal/account/"><img src="{{ STATIC_URL }}img/icon_user_small.png" alt="" /></a><a href="/portal/account/">ACCOUNT</a>
+ </h3>
+ {% if person.last_name %}
+ <p>
+ {{person.first_name}} {{person.last_name}}
+ </p>
+ {% endif %}
+ <p>
+ <span class="glyphicon glyphicon-user"></span> <a href='/portal/account/' title="Click here to see and edit your account details.">{{person.email}}</a>
+ </p>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-sm-12">
+ <h3>
+ <a href="/portal/institution"><img src="{{ STATIC_URL }}img/icon_authority_color_small.png" alt="" /></a><a href="/portal/institution">MANAGEMENT</a>
+ </h3>
+
+ <div>
+ <span class="glyphicon glyphicon-ok"></span> <a href="/portal/institution#requests">Validate Requests</a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="col-sm-4">
+ <div class="row">
+ <div class="col-sm-12">
+ <h3>
+ <a href="/portal/support"><img src="{{ STATIC_URL }}img/icon_support_small.png" alt="" /></a><a href="/portal/support">SUPPORT</a>
+ </h3>
+ <p>
+ <span class="glyphicon glyphicon-envelope"></span> <a href="/portal/contact/">Contact</a>
+ </p>
+ <p>
+ <span class="glyphicon glyphicon-book"></span> <a href="http://doc.onelab.eu" target="_blank">Documentation & Tutorials</a>
+ </p>
+ {% include theme|add:"_dashboard_links.html" %}
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+{% else %}
+<div class="container-fluid home">
+ <div class="">
+ <div class="col-sm-2"></div>
+ {% widget '_slogan.html' %}
+ <div class="col-sm-5 col-sm-offset-1">
+ <div class="row">
+ {% widget '_widget-login-user.html' %}
+ </div>
+ </div>
+ <div class="col-sm-1"></div>
+ </div>
+ </div>
+
+<script type="text/javascript">
+ $(document).ready(function() {
+ localStorage.clear();
+ });
+</script>
+
+{% endif %}
+
+
+<script type="text/javascript">
+ var config = {
+ java8_jnlp: 'http://jfed.iminds.be/jfed-f4f-java8.jnlp',
+ java7_jnlp: 'http://jfed.iminds.be/jfed-f4f-java7.jnlp'
+ };
+
+ var certkey = "{{jfed_identity}}";
+
+ $(document).ready(function() {
+ {%if 'no_creds' in user_cred or 'creds_expired' in user_cred %}
+ localStorage.clear();
+ /*
+ $.post("/cache/clear/", function( data ) {
+ });
+ */
+ {% endif %}
+ $('a.home-tab').click(function() {
+ $('ul.nav-tabs li').removeClass('active');
+ $(this).parent().addClass('active');
+ $('div.home-panel').hide();
+ $('div#'+$(this).data('panel')).show();
+ });
+
+ });
+</script>
+<script src='https://authority.ilabt.iminds.be/js/jquery/jquery-ui.min.js'></script>
+<script src="//java.com/js/dtjava.js"></script>
+<script src='https://authority.ilabt.iminds.be/js/jfed_webstart_f4fportal.js'></script>
+<link rel='stylesheet' href='https://authority.ilabt.iminds.be/js/jquery/jquery-ui.css' />
+
+{% if theme == 'onelab' %}
+{% widget "_widget-monitor.html" %}
+{% endif %}
+{% endblock %}
--- /dev/null
+{% extends "layout.html" %}
+
+{% block content %}
+
+<div class="col-md-8">
+ <br>
+ <h2>Manual Delegation</h2>
+ <h3>Install SFA</h3>
+
+ <p>
+ In order to delegate your credentials to the OneLab portal, you need to install SFA tools.<br>
+ </p>
+ <p>
+ <strong>[Requirement: python 2.7 or higher]</strong>
+ </p>
+ <h4>For Mac and Linux</h4>
+ <p class="command">
+ $ sudo easy_install pip<br>
+ $ sudo pip install sfa
+ </p>
+ <h4>For Windows</h4>
+ <p>Please download <a target="_blank" href="https://bootstrap.pypa.io/get-pip.py">get-pip.py</a></p>
+ <p class="command">
+ $ python get-pip.py<br>
+ $ pip install sfa
+ </p>
+
+ <p>
+ To get more information about pip, please visit: <a target="_blank" href="https://pip.pypa.io/en/latest/installing.html">https://pip.pypa.io/en/latest/installing.html</a>
+ </p>
+ <p>
+ More details about SFA is available at the following address:
+ <a target="_blank" href="http://svn.planet-lab.org/wiki/SFATutorialInstall#installingthroughpipfromPyPI">Installing SFA</a>
+ </p>
+
+ <h3>Configuring SFA</h3>
+
+ <p>
+ Once SFA tools are successfully installed, you need to configure the SFA client aka SFI
+ </p>
+ <p class="command">
+ $ mkdir ~/.sfi <br>
+ $ cd ~/.sfi <br>
+ $ cp ~/.ssh/id_rsa ~/.sfi/user-hrn.pkey
+ </p>
+
+ <p>
+ Here, 'user-hrn' is your SFA hrn. If e.g., your OneLab account email is mohammed-yasin.rahman at upmc.fr, then your user-hrn is <b><i>'onelab.upmc.mohammed-yasin_rahman'.</i></b></p>
+ <p>
+ In this example, a user-hrn is built using the root authority i.e, <b><i>'onelab'</i></b> followed by a <b>'.'</b> then the sub authority i.e., <b><i>'upmc'</i></b>
+ followed by a <b>'.'</b> and then the last fragment in the hrn is made of the local part of your email adress i.e., <b><i>'mohammed-yasin_rahman'</i></b>
+ (with dots replaced with underscores).
+ </p>
+
+ <p>
+ Next, you will setup your ~/.sfi/sfi_config. The following represents the sfi_config file for a OneLab user:
+ </p>
+
+ <p class="command">
+ [sfi]<br>
+ auth = onelab.upmc<br>
+ user = onelab.upmc.mohammed-yasin_rahman<br>
+ registry = http://portal.onelab.eu:6080/<br>
+ sm = http://sfa3.planet-lab.eu:12346/<br>
+ </p>
+
+ <p>
+ Here again, <b><i>'user'</i></b> is your user-hrn, and <b><i>'auth'</i></b> is the authority that you belong to, in most cases you should just drop the last part of your hrn.
+ </p>
+ <p>
+ Add the the following to sfi_config for delegating credentials to OneLab portal:
+ </p>
+ <p class="command">
+ [myslice]<br>
+ <br>
+ backend = http://portal.onelab.eu:7080<br>
+ delegate = onelab.myslice<br>
+ platform = myslice<br>
+ username = mohammed-yasin.rahman@lip6.fr
+ </p>
+ <p>
+ Test the SFA layer:
+ </p>
+ <p class="command">
+ $ sfi.py version
+ </p>
+ <p>
+ And finally delegate your credentials to the portal
+ </p>
+ <p class="command">
+ $ sfi.py myslice
+ </p>
+ <p>
+ The complete tutorial is available at the following address:
+ <a target="_blank" href="http://trac.myslice.info/wiki/InstallSfa">http://trac.myslice.info/wiki/InstallSfa</a>
+ </p>
+
+ <br />
+
+</div>
+{% endblock %}
+
var imgsrc;
+ /*
if(item.name.toLowerCase().indexOf("santander") >= 0){
- imgsrc = "smartsantander.png";
+ imgsrc = "{{ STATIC_URL }}img/servicedirectory/smartsantander.png";
} else if(item.name.toLowerCase().indexOf("hadoop") >= 0){
- imgsrc = "hadoop.png";
+ imgsrc = "{{ STATIC_URL }}img/servicedirectory/hadoop.png";
} else if(item.name.toLowerCase().indexOf("openstack") >= 0){
- imgsrc = "openstack.png";
+ imgsrc = "{{ STATIC_URL }}img/servicedirectory/openstack.png";
}
+ */
var row = $('<div class="row">').append(
$('<div>').addClass("col-md-3 portfolio-item").append(
$('<a href="' + item.APILink + '">').append(
- $('<img>').attr('src', "{{ STATIC_URL }}img/servicedirectory/" + imgsrc)
+ $('<img>').attr('src', item.iconURL)
)
),
$('<div>').addClass("col-md-6 portfolio-item").append(
</div>
<div class="row">
- <div class="col-md-8">
+ <div class="col-md-9">
{{ filter_status }}
</div>
<div class="col-md-1">
<li class="active"><a href="#resourcelist" role="tab" data-toggle="tab">Table</a></li>
<li> <a href="#resourcemap" role="tab" data-toggle="tab">Map</a></li>
<li> <a href="#resourcescheduler" role="tab" data-toggle="tab">Scheduler</a></li>
- <!--<li> <a href="#resourcesasap" role="tab" data-toggle="tab">ASAP</a></li> -->
+ <!-- <li> <a href="#resourcesasap" role="tab" data-toggle="tab">ASAP</a></li> -->
</ul>
</div>
</div>
<div class="tab-pane" id="resourcescheduler">
{{scheduler}}
</div>
- <!-- <div class="tab-pane" id="resourcesasap">
+ <div class="tab-pane" id="resourcesasap">
{{asap}}
- </div> -->
+ </div>
<!--
<div id="reserved" class="tab-pane" style="height:370px;display:none;">
{% 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 ) {
+ console.log(data);
if('parsed' in data['{{platform}}'] && 'rspec' in data['{{platform}}']['parsed']){
rspec = data['{{platform}}']['parsed']['rspec'];
if('node' in rspec){
-<img src="{{portal_url}}/static/img/{{theme.logo}}">
+<img src="{{portal_url}}/static/img/{{theme.logo}}" width="80px">
<br>
<p>Dear OneLab user,</p>
<p></p>
-<img src="{{current_site}}/static/img/{{theme.logo}}">
+<img src="{{current_site}}/static/img/{{theme.logo}}" width="80px">
<br>
<p>Dear {{theme.label}} user,</p>
<p></p>
-<img src="{{current_site}}/static/img/{{theme.logo}}" width="80px">
+<img src="{{current_site}}/static/img/{{theme.logo}}" width="80px">
<br>
<h1>NEW USER REQUEST</h1>
<br>
# ListResources(slice_hrn)
api_options['geni_slice_urn'] = urn
result = server.ListResources([object_cred], api_options)
+ logger.debug(result)
dict_result = xmltodict.parse(result['value'])
# else GetVersion = v3
else:
from myslice.settings import config
url = config.manifold_url()
- metadata = MetaData (url, metadata_auth)
+ metadata = MetaData(url, metadata_auth)
metadata.fetch(self.request)
# store it for next time
- manifold['metadata']=metadata
+ manifold['metadata']=metadata.to_json()
# SessionCache().store_metadata(self.request, metadata)
logger.debug("Page.get_metadata: return new value")
return metadata