from django.contrib import messages
from django.contrib.auth.decorators import login_required
+from myslice.configengine import ConfigEngine
from myslice.theme import ThemeView
from portal.account import Account, get_expiration
page.add_js_files ( [ "js/jquery.validate.js", "js/my_account.register.js", "js/my_account.edit_profile.js","js/jquery-ui.js" ] )
page.add_css_files ( [ "css/onelab.css", "css/account_view.css","css/plugin.css" ] )
+ # Execute a Query to delegate credentials if necessary
+ sfa_user_query = Query().get('myslice:user').select('user_hrn').filter_by('user_hrn','==','$user_hrn')
+ sfa_user_result = execute_query(self.request, sfa_user_query)
+
user_query = Query().get('local:user').select('config','email','status')
user_details = execute_query(self.request, user_query)
context.update(prelude_env)
return context
+@login_required
+def get_myslice_platform(request):
+ platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled','config').filter_by('platform','==','myslice')
+ platform_details = execute_query(request, platform_query)
+ for platform_detail in platform_details:
+ return platform_detail
+
+@login_required
+def get_myslice_account(request):
+ platform_myslice = get_myslice_platform(request)
+ account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config').filter_by('platform_id','==',platform_myslice['platform_id'])
+ account_details = execute_query(request, account_query)
+ for account_detail in account_details:
+ return account_detail
@login_required
#my_acc form value processing
platform_query = Query().get('local:platform').select('platform_id','platform')
platform_details = execute_query(request, platform_query)
- # getting the user_id from the session
- for user_detail in user_details:
- user_id = user_detail['user_id']
- user_email = user_detail['email']
+ # getting the user_id from the session
+ for user_detail in user_details:
+ user_id = user_detail['user_id']
+ user_email = user_detail['email']
+ try:
+ if user_email == request.user.email:
+ authorize_query = True
+ else:
+ print "SECURITY: %s tried to update %s" % (user_email, request.user.email)
+ messages.error(request, 'You are not authorized to modify another user.')
+ return HttpResponseRedirect("/portal/account/")
+ except Exception,e:
+ print "Exception = %s" % e
for account_detail in account_details:
for platform_detail in platform_details:
# updating sfa
public_key = public_key.replace('"', '');
user_pub_key = {'keys': public_key}
- #sfa_update_user(request, user_hrn, user_pub_key)
+
sfa_update_user(request, user_hrn, user_pub_key)
result_sfa_user = sfa_get_user(request, user_hrn, public_key)
try:
raise Exception,"Keys are not matching"
except Exception,e:
messages.error(request, 'Error: An error occured during the update of your public key at the Registry, or your public key is not matching the one stored.')
+ print "Exception in accountview ", e
return HttpResponseRedirect("/portal/account/")
else:
messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
return HttpResponseRedirect("/portal/account/")
+ # Download sfi_config
+ elif 'dl_sfi_config' in request.POST:
+ platform_detail = get_myslice_platform(request)
+ platform_config = json.loads(platform_detail['config'])
+ account_detail = get_myslice_account(request)
+ account_config = json.loads(account_detail['config'])
+
+ user_hrn = account_config.get('user_hrn','N/A')
+ t_user_hrn = user_hrn.split('.')
+ authority_hrn = t_user_hrn[0] + '.' + t_user_hrn[1]
+ import socket
+ hostname = socket.gethostbyaddr(socket.gethostname())[0]
+ registry = platform_config.get('registry','N/A')
+ admin_user = platform_config.get('user','N/A')
+ if 'localhost' in registry:
+ port = registry.split(':')[-1:][0]
+ registry = "http://" + hostname +':'+ port
+ manifold_host = ConfigEngine().manifold_url()
+ if 'localhost' in manifold_host:
+ manifold_host = manifold_host.replace('localhost',hostname)
+ sfi_config = '[sfi]\n'
+ sfi_config += 'auth = '+ authority_hrn +'\n'
+ sfi_config += 'user = '+ user_hrn +'\n'
+ sfi_config += 'registry = '+ registry +'\n'
+ sfi_config += 'sm = http://sfa3.planet-lab.eu:12346/\n\n'
+ sfi_config += '[myslice]\n'
+ sfi_config += 'backend = '+ manifold_host +'\n'
+ sfi_config += 'delegate = '+ admin_user +'\n'
+ sfi_config += 'platform = myslice\n'
+ sfi_config += 'username = '+ user_email +'\n'
+ response = HttpResponse(sfi_config, content_type='text/plain')
+ response['Content-Disposition'] = 'attachment; filename="sfi_config"'
+ return response
+
#clear all creds
elif 'clear_cred' in request.POST:
try:
def sfa_get_user(request, user_hrn, pub):
query_sfa_user = Query.get('user').filter_by('user_hrn', '==', user_hrn)
- result_sfa_user = execute_query(request, query_sfa_user)
+ result_sfa_user = execute_admin_query(request, query_sfa_user)
return result_sfa_user
def sfa_update_user(request, user_hrn, user_params):
if 'email' in user_params:
user_params['user_email'] = user_params['email']
query = Query.update('user').filter_by('user_hrn', '==', user_hrn).set(user_params).select('user_hrn')
- results = execute_query(request,query)
+ results = execute_admin_query(request,query)
return results
def sfa_add_authority(request, authority_params):
}
table.profile button {
- width: 80px;
+ width: 100px;
vertical-align: middle;
float: right;
margin-right: 15px;
}
#delete {
- width: 80px;
+ width: 100px;
vertical-align: middle;
float: right;
margin-right: 15px;
}
#upload_key {
- width: 80px;
+ width: 100px;
vertical-align: middle;
float: right;
margin-right: 15px;
#generate_keypair {
position:relative;
- width: 175px;
+ width: 215px;
float: right;
margin-right: 15px;
}
.wide_button {
- width: 175px;
+ width: 215px;
}
.api_cell {
</td>
{%endif%}
</tr>
+ <tr class="even" id="sfi_config_row">
+ <td class="key">sfi_config </td>
+ <td class="value">use sfi_config file with sfi.py package (pip install sfa)<a href="#"></a>
+ <button type="submit" name="dl_sfi_config" class="btn btn-default btn-xs" title="Download your privaye key" id="dl_sfi_config">
+ <span class="glyphicon glyphicon-download"></span> Download
+ </button>
+ </td>
+ </tr>
<tr class="even">
<td colspan="2">
<p class="message" id="pkey_del_msg"><b> Tradeoff:</b> Ease-of-use vs Security.<br>
-{% extends "layout_wide.html" %}
+{% extends "layout.html" %}
{% block content %}
+<div class="row">
+ <div class="col-md-12">
+ <div class="breadcrumbs">
+ Account > <a href="/account">{{ person.email }}</a>
+ </div>
+ </div>
+ {%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>
{% if messages %}
<ul class="messages">
{% for message in messages %}
{% endfor %}
</ul>
{% endif %}
-<div class="container">
- <div class="row">
- <div class="col-md-12">
- <ul class="nav nav-tabs nav-section">
- <li class="active"><a href="#profile"><img src="{{ STATIC_URL }}icons/user-xs.png" alt="User Account" /> User Profile</a></li>
- <li><a href="#account">Account</a></li>
- <li><a href="#access">Testbed Access</a></li>
- </ul>
- </div>
- </div>
+<div class="row">
+ <div class="col-md-12">
+ <ul class="nav nav-tabs nav-section">
+ <li class="active"><a href="#profile">User Profile</a></li>
+ <li><a href="#account">Account</a></li>
+ <li><a href="#access">Testbed Access</a></li>
+ </ul>
+ </div>
</div>
-<div class="container tab-content">
+<div class="tab-content">
<div class="tab-pane active row" id="profile">
<div class="col-md-12">
<table class="profile">
<tr>
<td colspan="2">
- <div>Platform: Myslice</div>
+ <div><h3>Platform: Myslice</h3></div>
</td>
</tr>
<tr>
<td class="key">Email</td>
<td class="value">
<span id="emailval" class="value" >{{ person.email }}</span>
- <button class="btn btn-default btn-xs" type="button" id="edit_email" onclick="editAlert();" title="To change your affiliation please contact the administrator">
+ <button class="btn btn-default" type="button" id="edit_email" onclick="editAlert();" title="To change your affiliation please contact the administrator">
<span class="glyphicon glyphicon-question-sign"></span> Edit
</button>
</td>
<tr class="even">
<td class="key">Generate Keys</td>
<td>
- <input type="submit" name="generate" class="btn btn-danger btn-xs" value="Generate a new Key Pair" id="generate_keypair"
+ <input type="submit" name="generate" class="btn btn-primary" value="Generate a new Key Pair" id="generate_keypair"
onclick="return confirm('Are you sure? If you do so, your current credentials will be overwritten.');"
title="It will generate a new key Pair and your current credentials will be overwritten."/>
</td>
<td class="value">
<span id="keyval" class="value">******** </span>
<span class="hide_this" id="span_upload">
- <button type="button" class="btn btn-default btn-xs" title="Cancel" id="cancel_upload"> Cancel </button>
+ <button type="button" class="btn btn-default" title="Cancel" id="cancel_upload"> Cancel </button>
<div style='display:none;'>
<input type='hidden' name='upload' /></div>
<input type="file" name="pubkey" class="required" id="pubkey"/>
{%if 'N/A' not in user_private_key%}
<td class="key">Private Key </td> <!-- Hide if priv_key doesn't exist in myslice platform -->
<td class="value">********<a href="#"></a>
- <button type="submit" name="dl_pkey" class="btn btn-default btn-xs" title="Download your privaye key" id="dl_pkey">
+ <button type="submit" name="dl_pkey" class="btn btn-default" title="Download your privaye key" id="dl_pkey">
<span class="glyphicon glyphicon-download"></span> Download
</button>
<input class="btn btn-danger btn-xs" id="delete" name="delete" type="submit" value="Delete" title="Delete your private key"
{%else%}
<td class="key">Private Key </td> <!-- Hide if priv_key doesn't exist in myslice platform -->
<td class="value">********<a href="#"></a>
- <button type="submit" name="dl_pkey" class="btn btn-default btn-xs disabled" title="Download your privaye key" id="dl_pkey">
+ <button type="submit" name="dl_pkey" class="btn btn-default disabled" title="Download your privaye key" id="dl_pkey">
<span class="glyphicon glyphicon-download"></span> Download
</button>
<input class="btn btn-danger btn-xs disabled" id="delete" name="delete" type="submit" title="Delete your private key" value="Delete" />
</td>
{%endif%}
</tr>
- <tr class="odd">
- {%if 'N/A' not in user_private_key%}
- <td class="key">Identity</td>
- <td>
- <button type="submit" name="dl_identity" class="btn btn-default btn-xs" title="You will require it to use jfed" id="dl_identity">
- <span class="glyphicon glyphicon-download"></span> Download
+ <tr class="even" id="sfi_config_row">
+ <td class="key">sfi_config </td>
+ <td class="value">use sfi_config file with sfi.py package (pip install sfa)<a href="#"></a>
+ <button type="submit" name="dl_sfi_config" class="btn btn-default btn-xs" title="Download your privaye key" id="dl_sfi_config">
+ <span class="glyphicon glyphicon-download"></span> Download
</button>
- </td>
- {%else%}
- <td class="key">Identity</td>
- <td>
- <button type="submit" name="dl_identity" class="btn btn-default btn-xs disabled" title="You will require it to use jfed" id="dl_identity">
- <span class="glyphicon glyphicon-download"></span> Download
- </button>
- </td>
- {%endif%}
- </tr>
+ </td>
+ </tr>
+
<tr class="even">
<td colspan="2">
- <p class="message" id="pkey_del_msg"><b> Tradeoff:</b> Ease-of-use vs Security.<br>
- <b>Ease-of-use:</b> Automatic account delegation. Don't delete private key.<br>
- <b>Security:</b> Manual account delegation. Download & Delete private key.
+ <p class="command">
+ <a href="#" style="color:green" data-toggle="modal" data-target="#tradeoffmodal">Automatic vs. Manual delegation of credentials:</a>
+ Trade-off between ease-of-use & security</p>
</p>
</td>
</tr>
<button class="btn btn-default btn-xs" name= "dl_user_cert" type="submit" title="Download User Certificate">
<span class="glyphicon glyphicon-download"></span> Certificate
</button>
- <button class="btn btn-default btn-xs" name= "dl_user_p12" type="submit" title="Download User PKCS12">
- <span class="glyphicon glyphicon-download"></span> PKCS p12
- </button>
+ <button class="btn btn-default btn-xs" name= "dl_user_p12" type="submit" title="Download User PKCS12">
+ <span class="glyphicon glyphicon-download"></span> PKCS p12
+ </button>
</td>
</tr>
{%endfor%}
{%endif%}
</div>
</div>
+<!-- Modal- No credentials -->
+<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+ <h4 class="modal-title" id="myModalLabel">No credentials are delegated to the portal</h4>
+ </div>
+ <div class="modal-body" style="text-align:justify;">
+ <p>You are getting this message for any of the following reasons:</p>
+ <ul>
+ <li>If your account is still pending for validation</li>
+ <li>If you press the "Clear Credentials" button</li>
+ <li>If you "Generate a new key pair"</li>
+ <li>If a new slice is added to your account</li>
+ </ul>
+ <p>Unless your account has not yet been validated, it is sufficient to refresh the page or go back to the home page.
+ The portal will then regenerate your credentials. In some cases it may take more time than usual. If nothing works,
+ then please logout and login back into to the portal.
+ </p>
+ <h3>Manual delegation of credentials</h3>
+ <p>
+ You have selected upon sign-up to upload your public key. As you have uploaded your own public key,
+ the portal can no longer generate your credentials automatically. In order to have your credentials
+ delegated to the portal, please follow these instructions:
+ </p>
+ <ul>
+ <li>Your account must first be validated by the manager of your organization.</li>
+ <li>In order for the portal to contact testbeds on your behalf, so as to list and reserve resources, you will need to
+ <a href="/portal/manual_delegation" target="_blank">delegate your credentials to the portal.</a></li>
+ </ul>
+ </p>
+ <h3>Contact support</h3>
+ <p>If you don't have the above mentioned cases and still have this message, please <a href="/contact/" target="_blank">contact us</a>.</p>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+ </div>
+ </div>
+ </div>
+</div>
+
+
+<!-- Modal- Trade-off Message -->
+<div class="modal fade" id="tradeoffmodal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+ <h4 class="modal-title" id="myModalLabel">
+ Automatic vs. Manual delegation of credentials
+ </h4>
+ </div>
+ <div class="modal-body" style="text-align:justify;">
+ <h3>Automatic delegation of credentials</h3>
+ <p>Don't delete private key, ease-of-use option:</p>
+ <ul>
+ <li>
+ This means that you will keep your private key in the portal and it will automatically delegate your credentials on your behalf.
+ </li>
+ <li>
+ This option does not provide as high of a level of security; however, your private key will still only be used in the portal and
+ will be available to you and the OneLab admins only.
+ </li>
+ </ul>
+ <h3>Manual delegation of credentials</h3>
+ <p>Download & Delete private key, higher security option:</p>
+ <ul>
+ <li>If you delete your private key, you will have more security but the portal will no longer be able to delegate credentials
+ on your behalf, and you will have to manually
+ <a href="/portal/manual_delegation" target="_blank">delegate your credentials to the portal.</a>
+ </li>
+ </ul>
+ <h3>Contact support</h3>
+ <p>For more information, please <a href="/contact/" target="_blank">contact us</a>.</p>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+ </div>
+ </div>
+ </div>
+</div>
+
+
<div class="tab-pane row" id="access">
<div class="col-md-12">
<td class="odd"> {{ row.account_type }} </td>
<td class="odd"> {{ row.account_reference }} </td>
<td class="odd">
- <button class="btn btn-danger btn-xs" name="delete_{{row.platform_name}}" type="submit" title="Delete account from this platform">
+ <button class="btn btn-danger" name="delete_{{row.platform_name}}" type="submit" title="Delete account from this platform">
<span class="glyphicon glyphicon-minus"></span>
</button>
</td>
+++ /dev/null
-{# This is required by insert_above #}{% insert_handler %}<!DOCTYPE html>
-<html lang="en"><head>
-<title>Fed4Fire Portal - {{ section }}</title>
-<meta name="viewport" content="width=device-width, initial-scale=1.0">
-<link rel="shortcut icon" href="/static/img/myslice-icon.png">
-{# This is where insert_str will end up #}{% media_container prelude %}
-{% include 'messages-transient-header.html' %}
-<script type="text/javascript"> {# raw js code - use {% insert prelude_js %} ... {% endinsert %} #} {% container prelude_js %}</script>
-<script src="{{ STATIC_URL }}js/jquery.dataTables.min.js"></script>
-<script src="{{ STATIC_URL }}js/bootstrap.datatables.js"></script>
-<script src="{{ STATIC_URL }}js/myslice.js"></script>
-<script src="{{ STATIC_URL }}js/myslice-ui.js"></script>
-<style type="text/css">{# In case we need to add raw css code #}{% container prelude_css %}</style>
-{{ header_prelude }}
-{% block head %} {% endblock head %}
-{# let's add these ones no matter what #}
-{% insert_str prelude "js/jquery.min.js" %}
-{% insert_str prelude "js/angular/angular.min.js" %}
-{% insert_str prelude "js/jquery.html5storage.min.js" %}
-{% insert_str prelude "js/messages-runtime.js" %}
-{% insert_str prelude "js/class.js" %}
-{% insert_str prelude "js/plugin-helper.js" %}
-{% insert_str prelude "js/mustache.js" %}
-{% insert_str prelude "js/hashtable.js" %}
-{% insert_str prelude "js/plugin.js" %}
-{% insert_str prelude "js/manifold.js" %}
-{% insert_str prelude "css/manifold.css" %}
-{% insert_str prelude "css/plugin.css" %}
-{% insert_str prelude "js/bootstrap.js" %}
-{% insert_str prelude "css/bootstrap.css" %}
-{% insert_str prelude "js/bootstrap-datepicker.js" %}
-{% insert_str prelude "css/datepicker.css" %}
-{% insert_str prelude "js/bootstrap-slider.js" %}
-{% insert_str prelude "css/slider.css" %}
-{% insert_str prelude "css/topmenu.css" %}
-{% insert_str prelude "js/logout.js" %}
-<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/{{ theme }}.css">
-</head>
-<body ng-app="ManifoldApp">
-{% block container %}
- {% block topmenu %}
- {% include theme|add:"__widget-topmenu.html" %}
- {% endblock topmenu %}
- {% include 'messages-transient.html' %}
- {% block base_content %}
- {% endblock %}
-{% endblock container %}
-</body>
-</html>
{% widget '_widget-news.html' %}
</div> -->
{% if username %}
+<!-- Modal- No credentials -->
+<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+ <h4 class="modal-title" id="myModalLabel">No credentials are delegated to the portal</h4>
+ </div>
+ <div class="modal-body" style="text-align:justify;">
+ <p>You are getting this message for any of the following reasons:</p>
+ <ul>
+ <li>If your account is still pending for validation</li>
+ <li>If you press the "Clear Credentials" button</li>
+ <li>If you "Generate a new key pair"</li>
+ <li>If a new slice is added to your account</li>
+ </ul>
+ <p>Unless your account has not yet been validated, it is sufficient to refresh the page or go back to the home page.
+ The portal will then regenerate your credentials. In some cases it may take more time than usual. If nothing works,
+ then please logout and login back into to the portal.
+ </p>
+ <h3>Manual delegation of credentials</h3>
+ <p>
+ You have selected upon sign-up to upload your public key. As you have uploaded your own public key,
+ the portal can no longer generate your credentials automatically. In order to have your credentials
+ delegated to the portal, please follow these instructions:
+ </p>
+ <ul>
+ <li>Your account must first be validated by the manager of your organization.</li>
+ <li>In order for the portal to contact testbeds on your behalf, so as to list and reserve resources, you will need to
+ <a href="/portal/manual_delegation" target="_blank">delegate your credentials to the portal.</a></li>
+ </ul>
+ </p>
+ <h3>Contact support</h3>
+ <p>If you don't have the above mentioned cases and still have this message, please <a href="/contact/" target="_blank">contact us</a>.</p>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+ </div>
+ </div>
+ </div>
+</div>
<div class="container dashboard">
<div class="row">
+ {%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%}
+ {%if 'is_pi' in pi %}
<div class="col-md-3">
<h3>
EXPERIMENT
<a href="#"><img src="{{ STATIC_URL }}img/icon_slices.png" alt="" /></a>
</div>
<div>
- <button id="slicerequestbtn" type="button" style="width: 150px;" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> Request slice</button>
+ <button id="slicerequestbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> Create Slice</button>
+ </div>
+ <div>
+ <p><strong>Your slices </strong>
+ <span title="A slice 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 OneLab portal, you will only see slices that you have created through OneLab. If you have created slices elsewhere,
+ such as on the PlanetLab Europe portal, those slices will not appear here."
+ class="glyphicon glyphicon-info-sign">
+ </span>
+
+ </p>
</div>
<div>
<div id="home-slice-list"><img src="{{ STATIC_URL }}img/loading.gif" alt="Loading Slices" /></div>
</div>
- <div>
- <h3 title="Some tools do their own slice creation and management.">Experiment now</h3>
- </div>
- <div>
- <a class="btn btn-primary" style="width: 150px;"
+ <h3 title="Some tools do their own slice creation and management.">Experiment now</h3>
+ <a class="btn btn-primary" style="width: 150px;"
href='http://jfed.iminds.be/releases/r1389/webstart/experimenter/jfed-experimenter.jnlp'
title="Click here to start your experiment with jFed"
onclick="return launchApplication('http://jfed.iminds.be/releases/r1389/webstart/experimenter/jfed-experimenter.jnlp');">
<span class="glyphicon glyphicon-cloud"></span> jFed</a>
- </div>
</div>
<div class="col-md-3">
<h3>MANAGEMENT</h3>
SUPPORT
</h3>
<div>
- <a href="http://doc.fed4fire.eu/support.html"><img src="{{ STATIC_URL }}img/icon_support.png" alt="" /></a>
+ <a href="/portal/support"><img src="{{ STATIC_URL }}img/icon_support.png" alt="" /></a>
</div>
<div>
- <button id="ticketbtn" type="button" style="width: 150px;" class="btn btn-default"><span class="glyphicon glyphicon-envelope"></span> Contact</button>
+ <button id="ticketbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-envelope"></span> Contact</button>
</div>
<p></p>
<div>
<a href="/portal/account/"><img src="{{ STATIC_URL }}img/icon_user_color.png" alt="" /></a>
</div>
<div>
- <button id="logoutbtn" type="button" style="width: 150px;" class="btn btn-default" data-username="{{ username }}"><span class="glyphicon glyphicon-off"></span> Logout</button>
+ <button id="logoutbtn" type="button" class="btn btn-default" data-username="{{ username }}"><span class="glyphicon glyphicon-off"></span> Logout</button>
+ </div>
+ <div>
+ {% if person.last_name %}
+ {{person.first_name}} {{person.last_name}}<br />
+ {% endif %}
+ <span class="label">Username:</span> <a href='/portal/account/' title="Click here to see and edit your account details.">{{person.email}}</a>
+ </div>
+ </div>
+ </div>
+ {%else%}
+ <div class="row">
+ <div class="col-md-4">
+ <h3>
+ EXPERIMENT
+ </h3>
+ <div>
+ <a href="#"><img src="{{ STATIC_URL }}img/icon_slices.png" alt="" /></a>
+ </div>
+ <div>
+ <button id="slicerequestbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> Request Slice</button>
+ </div>
+ <div>
+ <p><strong>Your slices </strong>
+ <span title="A slice 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 OneLab portal, you will only see slices that you have created through OneLab. If you have created slices elsewhere,
+ such as on the PlanetLab Europe portal, those slices will not appear here."
+ class="glyphicon glyphicon-info-sign">
+ </span>
+ </p>
+ </div>
+ <div>
+ <div id="home-slice-list"><img src="{{ STATIC_URL }}img/loading.gif" alt="Loading Slices" /></div>
+ </div>
+ {% if pending_slices %}
+ <p><strong>Pending slices</strong>
+ <span title="Slices that you have requested and are pending for validation by the contact person of your organization."
+ class="glyphicon glyphicon-info-sign">
+ <ul>
+ {% for slices in pending_slices %}
+ <li>{{slices}}</li>
+ {% endfor %}
+ </ul>
+ </span>
+ </p>
+ {%endif%}
+ <h3 title="Some tools do their own slice creation and management.">Experiment now</h3>
+ <a class="btn btn-primary" style="width: 150px;"
+ href='http://jfed.iminds.be/releases/r1389/webstart/experimenter/jfed-experimenter.jnlp'
+ title="Click here to start your experiment with jFed"
+ onclick="return launchApplication('http://jfed.iminds.be/releases/r1389/webstart/experimenter/jfed-experimenter.jnlp');">
+ <span class="glyphicon glyphicon-cloud"></span> jFed</a>
+ </div>
+ <div class="col-md-4">
+ <h3>
+ SUPPORT
+ </h3>
+ <div>
+ <a href="/portal/support"><img src="{{ STATIC_URL }}img/icon_support.png" alt="" /></a>
+ </div>
+ <div>
+ <button id="ticketbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-envelope"></span> Contact</button>
+ </div>
+ <p></p>
+ <div>
+ <button id="statbtn" type="button" style="width: 150px;" class="btn btn-default"><span class="glyphicon glyphicon-stats"></span>Testbeds' status</button>
+ </div>
+ </div>
+
+ <div class="col-md-4">
+ <h3>
+ ACCOUNT
+ </h3>
+ <div>
+ <a href="/portal/account/"><img src="{{ STATIC_URL }}img/icon_user_color.png" alt="" /></a>
+ </div>
+ <div>
+ <button id="logoutbtn" type="button" class="btn btn-default" data-username="{{ username }}"><span class="glyphicon glyphicon-off"></span> Logout</button>
</div>
<div>
{% if person.last_name %}
{{person.first_name}} {{person.last_name}}<br />
{% endif %}
- <span class="label">Email:</span> <a href='/portal/account/'>{{person.email}}</a>
+ <span class="label">Username:</span> <a href='/portal/account/' title="Click here to see and edit your account details.">{{person.email}}</a>
</div>
</div>
</div>
+ {%endif%}
+
</div>
{% else %}
<div class="container-fluid home">
$('div#'+$(this).data('panel')).show();
});
$('button#validaterequestbtn').click(function() {
- window.location="/portal/validate/";
+ window.location="/portal/institution#requests";
});
$('button#ticketbtn').click(function() {
window.location="/portal/contact/";
$('button#slicerequestbtn').click(function() {
window.location="/portal/slice_request/";
});
-/*-------
-List of slices has been moved in
-portal/templates/base.html
-This should go into session
---------*/
+
+ /*
+ Launch queries to get the resources and leases in Manifold Cache
+ */
+
+ $.post("/rest/resource/", function( data ) {
+ });
+ $.post("/rest/lease/", function( data ) {
+ });
+
+ /*-------
+ List of slices has been moved in
+ portal/templates/base.html
+ This is now in localStorage
+ --------*/
+ // myslice.user is in LocalStorage
+ if(myslice.user.slices.length>0){
+ $.each( myslice.user.slices, function(i, val) {
+ /*
+ Launch a Query for each slice to get resources and leases in Manifold Cache
+ */
+ $.post("/rest/slice/", { 'filters': { 'slice_hrn' : val } }, function(data) {
+ });
+ });
+ }
});
</script>
+
+<!--for jfed tool-->
<script type="text/javascript" src="{{STATIC_URL}}js/fed4fire_dtjava_orig.js"></script>
<script>
function launchApplication(jnlpfile) {
return false;
}
</script>
+{# widget "_widget-monitor.html" #}
+{# widget "_widget-stats-top-slices.html" #}
+
{% endblock %}
--- /dev/null
+{% extends "layout_wide.html" %}
+
+{% block head %}
+<script type="text/javascript" src="{{STATIC_URL}}/js/institution.js"></script>
+{% endblock head %}
+
+{% block content %}
+<div class="container">
+ <div class="row">
+ <div class="col-md-12">
+ <div class="breadcrumbs">
+ Management > Institution: <span id="authority_name"></span>
+ </div>
+ </div>
+ </div>
+</div>
+<div class="container">
+ <div class="row">
+ <div class="col-md-12">
+ <ul class="nav nav-tabs nav-section">
+ <li class="active"><a href="#about">About</a></li>
+ <li><a href="#users">Users</a></li>
+ <li><a href="#slices">Slices</a></li>
+ <li><a href="#requests">Requests</a></li>
+ </ul>
+ </div>
+ </div>
+</div>
+<div class="container tab-content">
+ <div class="tab-pane active row" id="about">
+ </div>
+
+ <div class="tab-pane row" id="users" data-authority="{{user_details.parent_authority}}">
+ <div class="col-md-12 el">
+ <div id="user-tab-loading"><img src="{{ STATIC_URL }}img/loading.gif" alt="Loading Slices" /></div>
+ <div id="user-tab-loaded" style="display:none;">
+ <table id="user-tab" class="table">
+ <tr>
+ <th>+/-</th>
+ <th>Email</th>
+ <th>User hrn</th>
+ <!--
+ <th>First name</th>
+ <th>Last name</th>
+ <th>Enabled</th>
+ -->
+ </tr>
+ </table>
+
+ </div>
+ {%if 'is_pi' in pi %}
+ <div>
+ <button id="deleteusers" type="button" class="btn btn-danger"><span class="glyphicon glyphicon-remove"></span> Delete selected users</button>
+ </div>
+ {% endif %}
+ </div>
+ </div>
+
+ <div class="tab-pane row" id="slices">
+ <div class="col-md-12 el">
+ <div id="slice-tab-loading"><img src="{{ STATIC_URL }}img/loading.gif" alt="Loading Slices" /></div>
+ <div id="slice-tab-loaded" style="display:none;">
+ <table id="slice-tab" class="table">
+ <tr>
+ <th>+/-</th>
+ <th>Slice hrn</th>
+ <th>Users</th>
+ <th>Url</th>
+ <!-- <th>nodes</th> -->
+ <th>Creation</th>
+ </tr>
+ </table>
+ </div>
+ {% if 'is_pi' in pi %}
+ <div>
+ {% if 'is_pi' in pi %}
+ <button id="createslice" type="button" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> Create slice</button>
+ {% else %}
+ <button id="createslice" type="button" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> Request slice</button>
+ {% endif %}
+ <button id="renewslices" type="button" class="btn btn-primary"><span class="glyphicon glyphicon-refresh"></span> Renew Slices</button>
+ <button id="deleteslices" type="button" class="btn btn-danger"><span class="glyphicon glyphicon-remove"></span> Delete Slices</button>
+ </div>
+ {% endif %}
+ </div>
+ </div>
+ <div class="tab-pane row" id="requests">
+ </div>
+</div>
+<script>
+$(document).ready(function() {
+ {% if person %}
+ {% if user_details.parent_authority %}
+
+ $.post("/rest/slice/",{'fields':['slice_hrn','users','url','slice_date_created'],'filters':{'parent_authority':'{{user_details.parent_authority}}'}}, function( data ) {
+ var list_slices = [];
+ var table_slices = [];
+ /* "slice_hrn", "slice_description", "slice_type", "parent_authority", "created", "nodes", "slice_url", "slice_last_updated", "users", "slice_urn", "slice_expires" */
+ $.each( data, function( key, val ) {
+ list_slices.push( "<li><a href=\"portal/slice/"+val.slice_hrn+"\">" + val.slice_hrn + "</a></li>" );
+ if(val.nodes=="undefined" || val.nodes==null){
+ nodes_length=0;
+ }else{
+ nodes_length=val.nodes.length;
+ }
+ console.log(val);
+ if(val.users=="undefined" || val.users==null){
+ users_length=0;
+ }else{
+ users_length=val.users.length;
+ }
+
+ if(val.url=="undefined" || val.url==null){
+ slice_url="";
+ }else{
+ slice_url="<a href='"+val.url+"' target='_blank'>"+val.url+"</a>";
+ }
+
+ slice_row = "<tr id='"+val.slice_hrn+"'>";
+ slice_row += "<td><input type='checkbox' class='slice' id='"+val.slice_hrn+"'></td>";
+ slice_row += "<td><a href=\"/slice/"+val.slice_hrn+"\">" + val.slice_hrn + "</a></td>";
+ slice_row += "<td>"+users_length+"</td>";
+ slice_row += "<td>"+slice_url+"</td>";
+ //slice_row += "<td>"+nodes_length+"</td>";
+ slice_row += "<td>"+val.slice_date_created+"</td>";
+ slice_row += "</tr>";
+ table_slices.push(slice_row);
+
+ });
+
+ /* $("div#slice-list").html($( "<ul/>", { html: list_slices.join( "" ) })); */
+ $("table#slice-tab tr:last").after(table_slices.join( "" ));
+ $("div#slice-tab-loaded").css("display","block");
+ $("div#slice-tab-loading").css("display","none");
+ });
+
+
+ $.post("/rest/user/",{'fields':['user_hrn','user_email'],'filters':{'parent_authority':'{{user_details.parent_authority}}'}}, function( data ) {
+ var list_users = [];
+ var table_users = [];
+ /* Available fields
+ user_gid, user_enabled, slices, pi_authorities, keys, parent_authority, user_first_name,
+ user_urn, user_last_name, user_phone, user_hrn, user_email, user_type
+ */
+ $.each( data, function( key, val ) {
+ list_users.push( "<li><a href=\"portal/user/"+val.user_email+"\">" + val.user_email + "</a></li>" );
+ user_row = "<tr id='"+val.user_hrn+"'>";
+ user_row += "<td><input type='checkbox' class='user' id='"+val.user_hrn+"'></td>";
+ user_row += "<td>"+val.user_email+"</td>";
+ user_row += "<td>"+val.user_hrn+"</td>";
+ /*
+ user_row += "<td>"+val.user_first_name+"</td>";
+ user_row += "<td>"+val.user_last_name+"</td>";
+ user_row += "<td>"+val.user_enabled+"</td>";
+ */
+ user_row += "</tr>";
+ table_users.push(user_row);
+ });
+ $("table#user-tab tr:last").after(table_users.join( "" ));
+ $("div#user-tab-loaded").css("display","block");
+ $("div#user-tab-loading").css("display","none");
+ });
+
+ {% endif %}
+ {% endif %}
+
+}); // End document.ready
+
+$(document).ready(function() {
+ $('.nav-tabs a').click(function (e) {
+ e.preventDefault();
+ $(this).tab('show');
+ var id = $(this).attr('href').substr(1);
+ if ((id == 'requests') || (id == 'about'))
+ $("#" + id).load('/management/' + id);
+ });
+ var hash = window.location.hash;
+ if (hash) {
+ $('.nav-tabs a[href='+hash+']').click();
+ } else {
+ $('.nav-tabs a[href=#about]').click();
+ }
+});
+</script>
+{% endblock %}
--- /dev/null
+{% load portal_filters %}
+<div class="col-md-6">
+ <div>
+ <img src="{{ STATIC_URL|add:'img/institutions/'|add:authority.authority_hrn|add:'.gif'|file_exists }}" alt="{{authority.name}}">
+ </div>
+ <br />
+ {% if authority.name and authority.url %}
+ <h3><a href="{{authority.url}}">{{authority.name}}</a></h3>
+ {% elif authority.name %}
+ <h3>{{authority.name}}</h3>
+ {% endif %}
+ <p>
+ {% if authority.address %}
+ {{authority.address}} <br />
+ {% endif %}
+ {% if authority.postcode %}
+ {{authority.postcode}}
+ {% endif %}
+ {% if authority.address %}
+ {{authority.city}} <br />
+ {% endif %}
+ {% if authority.address %}
+ {{authority.country}}
+ {% endif %}
+ </p>
+ <br />
+
+ {% if authority.address %}
+ <h4>Onelab membership</h4>
+ <p>
+ {{ authority.onelab_membership }}
+ </p>
+ {% endif %}
+</div>
+<div class="col-md-6">
+ {% if authority.legal %}
+ <h4>Legal Contact:</h4>
+ <p>
+ {% for c in authority_contacts.legal %}
+ {{ c }} <br />
+ {% endfor %}
+ </p>
+ <br />
+ {% endif %}
+ {% if authority.scientific %}
+ <h4>Scientific Contact:</h4>
+ <p>
+ {% for c in authority_contacts.scientific %}
+ {{ c }} <br />
+ {% endfor %}
+ </p>
+ <br />
+ {% endif %}
+ {% if authority.technical %}
+ <h4>Technical Contact:</h4>
+ <p>
+ {% for c in authority_contacts.technical %}
+ {{ c }} <br />
+ {% endfor %}
+ </p>
+ {% endif %}
+</div>
+<script>$(document).ready(function() {
+{% if authority.name %}
+ auth_name = "{{authority.name}}";
+{% else %}
+ auth_name = "{{authority.authority_hrn}}";
+{% endif %}
+ $('#authority_name').text(auth_name);
+});
+</script>
--- /dev/null
+<script type="text/javascript">
+ $(document).ready(function() {
+ $("li#nav-request").addClass("active");
+ });
+ function on_click_event() {
+ var ids = [];
+ $('.portal__validate__checkbox').each(function(i, el) {
+ if ($(el).prop('checked')) {
+ // portal__validate__checkbox__slice__2
+ var id_array = $(el).attr('id').split('__');
+ // push(slice__2)
+ ids.push(id_array[3] + '__' + id_array[4]);
+ }
+ });
+ if (ids.length > 0) {
+ var id_str = ids.join('/');
+ // XXX spinner
+ $.getJSON('/portal/validate_action/' + id_str,
+ function(status) {
+ $.each(status, function(request_type__id, request_status) {
+ // request_status: NAME -> dict (status, description)
+ var status_str = '';
+ $.each(request_status, function(name, result) {
+ if (status_str != '')
+ status_str += ' -- ';
+
+ if (result.status) {
+ status_str += '<font color="green">OK</font>';
+ $('#portal__validate__checkbox__' + request_type__id).hide();
+ } else {
+ status_str += '<font color="red">ERROR: ' + result.description + '</font>';
+ }
+ });
+ $('#portal__status__' + request_type__id).html(status_str);
+
+
+ });
+ }
+ );
+ }
+ }
+</script>
+
+<div class="col-md-12">
+ <h2>From your authorities</h2>
+</div>
+{% if my_authorities %}
+
+ {% for authority, requests in my_authorities.items %}
+
+ <div class="col-md-12">
+ <h2>{{authority}}</h2>
+ </div>
+
+ <table class="table">
+ <th>
+ <td>Type</td>
+ <td>Id</td>
+ <td>Details</td>
+ <td>Timestamp</td>
+ <td>Status</td>
+ </th>
+ {% for request in requests %}
+
+ <tr>
+ <td>
+ {% if request.allowed == 'allowed' %}
+ <input class='portal__validate__checkbox' id='portal__validate__checkbox__{{request.type}}__{{request.id}}' type='checkbox'/>
+ {% else %}
+ {% if request.allowed == 'expired' %}
+ expired
+ {% else %} {# denied #}
+ denied
+ {% endif %}
+ {% endif %}
+ </td>
+ <td>{{ request.type }}</td>
+ <td>{{ request.id }}</td>
+ <td>
+ {% if request.type == 'user' %}
+ <b>{{request.first_name}} {{request.last_name}}</b> <a href="mailto:{{request.email}}">{{request.email}}</a>
+ {% else %}
+ {% if request.type == 'slice' %}
+ <b>{{request.slice_name}}</b> -- Number of nodes: {{request.number_of_nodes}} -- Type of nodes: {{request.type_of_nodes}} -- Purpose: {{request.purpose}}
+ {% else %} {# authority #}
+ <b>{{request.site_name}}</b> ({{request.site_authority}}) -- {{request.address_city}}, {{request.address_country}}
+ {% endif %}
+ {% endif %}
+ </td>
+ <td>{{ request.timestamp }}</td>
+
+ <td><span id='portal__status__{{request.type}}__{{request.id}}'></span></td>
+
+ <!--<div class='portal_validate_request {{request.type}} {% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}'> -->
+ </tr>
+
+ {% endfor %}
+ </table>
+ {% endfor %}
+
+{% else %}
+ <div class="col-md-12">
+ <i>There is no pending request waiting for validation.</i>
+ </div>
+{% endif %}
+<div>nnllknjkn<br /><br /></div>
+<div class="col-md-12">
+ <h2>From your sub-authorities</h2>
+</div>
+{% if sub_authorities %}
+
+ {% for authority, requests in sub_authorities.items %}
+ <div class="col-md-12">
+ <h2>{{authority}}</h2>
+ </div>
+
+ <table class="table">
+ <th>
+ <td>Type</td>
+ <td>Id</td>
+ <td>Details</td>
+ <td>Timestamp</td>
+ <td>Status</td>
+ </th>
+ {% for request in requests %}
+ <tr>
+ <td>
+ {% if request.allowed == 'allowed' %}
+ <input class='portal__validate__checkbox' id='portal__validate__checkbox__{{request.type}}__{{request.id}}' type='checkbox'/>
+ {% else %}
+ {% if request.allowed == 'expired' %}
+ expired
+ {% else %} {# denied #}
+ denied
+ {% endif %}
+ {% endif %}
+ </td>
+ <td>{{ request.type }}</td>
+ <td>{{ request.id }}</td>
+ <td>
+ {% if request.type == 'user' %}
+ Login: {{request.login}} -- First name: {{request.first_name}} -- Last name: {{request.last_name}} -- Email: {{request.email}}
+ {% else %}
+ {% if request.type == 'slice' %}
+ Slice name: {{request.slice_name}} -- Number of nodes: {{request.number_of_nodes}} -- Type of nodes: {{request.type_of_nodes}} -- Purpose: {{request.purpose}}
+ {% else %} {# authority #}
+ Authority name: {{request.site_name}} -- authority_hrn: {{request.site_authority}} -- City: {{request.address_city}} -- Country: {{request.address_country}}
+ {% endif %}
+ {% endif %}
+ </td>
+ <td>{{ request.timestamp }}</td>
+
+ <td><span id='portal__status__{{request.type}}__{{request.id}}'></span></td>
+
+ <!--<div class='portal_validate_request {{request.type}} {% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}'> -->
+ </tr>
+ {% endfor %}
+ </table>
+ {% endfor %}
+{% else %}
+<div class="col-md-12">
+ <i>There is no pending request waiting for validation.</i>
+</div>
+{% endif %}
+
+<div class="col-md-12">
+ <h2>From your authorities with delegation</h2>
+</div>
+
+{% if delegation_authorities %}
+
+ {% for authority, requests in delegation_authorities.items %}
+ <div class="col-md-12">
+ <h3>{{authority}}</h3>
+ </div>
+ <table class="table">
+ <th>
+ <td>Type</td>
+ <td>Id</td>
+ <td>Details</td>
+ <td>Timestamp</td>
+ <td>Status</td>
+ </th>
+ {% for request in requests %}
+ <tr>
+ <td>
+ {% if request.allowed == 'allowed' %}
+ <input class='portal__validate__checkbox' id='portal__validate__checkbox__{{request.type}}__{{request.id}}' type='checkbox'/>
+ {% else %}
+ {% if request.allowed == 'expired' %}
+ expired
+ {% else %} {# denied #}
+ denied
+ {% endif %}
+ {% endif %}
+ </td>
+ <td>{{ request.type }}</td>
+ <td>{{ request.id }}</td>
+ <td>
+ {% if request.type == 'user' %}
+ Login: {{request.login}} -- First name: {{request.first_name}} -- Last name: {{request.last_name}} -- Email: {{request.email}}
+ {% else %}
+ {% if request.type == 'slice' %}
+ Slice name: {{request.slice_name}} -- Number of nodes: {{request.number_of_nodes}} -- Type of nodes: {{request.type_of_nodes}} -- Purpose: {{request.purpose}}
+ {% else %} {# authority #}
+ Authority name: {{request.site_name}} -- authority_hrn: {{request.site_authority}} -- City: {{request.address_city}} -- Country: {{request.address_country}}
+ {% endif %}
+ {% endif %}
+ </td>
+ <td>{{ request.timestamp }}</td>
+
+ <td><span id='portal__status__{{request.type}}__{{request.id}}'></span></td>
+
+ <!--<div class='portal_validate_request {{request.type}} {% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}'> -->
+ </tr>
+ {% endfor %}
+ </table>
+ {% endfor %}
+{% else %}
+<div class="col-md-12">
+ <i>There is no pending request waiting for validation.</i>
+</div>
+{% endif %}
+<div class="col-md-12">
+ <button class="btn btn-onelab" type="button" id="portal__validate" onclick="on_click_event();"><span class="glyphicon glyphicon-ok"></span> Validate</button>
+</div>
--- /dev/null
+{% extends "layout_wide.html" %}
+{% load portal_filters %}
+
+{% block head %}
+<!-- <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=AIzaSyC1RUj824JAiHRVqgc2CSIg4CpKHhh84Lw&sensor=false"></script> -->
+<script src="{{ STATIC_URL }}js/onelab_slice-resource-view.js"></script>
+<script>
+ //myslice.slice = "{{ slice }}";
+
+$(document).ready(function() {
+ $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
+ // find the plugin object inside the tab content referenced by the current tabs
+ $('.plugin', $($(e.target).attr('href'))).trigger('shown.bs.tab');
+ $('.plugin', $($(e.target).attr('href'))).trigger('show');
+ });
+});
+</script>
+{% endblock %}
+
+{% block content %}
+{% widget '_widget-slice-sections.html' %}
+<div class="container-fluid container-resource">
+ <div class="row">
+ <div class="col-md-2">
+ <!-- <div id="select-platform" class="list-group"></div> -->
+ {{filter_testbeds}}
+ </div>
+ <div class="col-md-10" style="height:100%;">
+ <div class="row">
+ {% if msg %}
+ <div class="col-md-12"><p class="alert-success">{{ msg }}</p></div>
+ {% endif %}
+ </div>
+
+ <div class="row">
+ <div class="col-md-6">
+ {{ filter_status }}
+ </div>
+ <div class="col-md-1">
+ {{ apply }}
+ </div>
+ </div>
+ <!--
+ <div class="list-group-item list-resources">
+ <span class="list-group-item-heading" style="padding-left: 0;">Resource status:</span>
+ <a class="list-group-item active" data-panel="resources" href="#" style='display: inline-block !important;'>All</a>
+ <a class="list-group-item" data-panel="reserved" href="#" style='display: inline-block !important;'>Reserved</a>
+ <a class="list-group-item" data-panel="pending" href="#" style='display: inline-block !important;'>Pending <span class="badge" id="badge-pending" data-number="0"></span></a>
+ </div>
+ -->
+
+ <div class="row">
+ <div class="col-md-12">
+ <ul class="nav nav-tabs">
+ <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>
+ </ul>
+ </div>
+ </div>
+
+ <!-- Modal - columns selector -->
+ <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+ <h4 class="modal-title" id="myModalLabel">Columns selector</h4>
+ </div>
+ <div class="modal-body">
+ {{columns_editor}}
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="row">
+ <div class="col-md-12">
+ <div class="tab-content" style="height:100%;">
+ <div class="tab-pane active" id="resourcelist">
+ <!-- Button trigger modal - columns selector -->
+ <button class="btn btn-default btn-sm" style="float:right;" data-toggle="modal" data-target="#myModal">...</button>
+ {{list_resources}}
+ <!-- <table cellpadding="0" cellspacing="0" border="0" class="table" id="objectList"></table> -->
+ </div>
+ <div class="tab-pane" id="resourcemap">
+ {{map_resources}}
+ </div>
+ <div class="tab-pane" id="resourcescheduler">
+ {{scheduler}}
+ </div>
+
+ <!--
+ <div id="reserved" class="tab-pane" style="height:370px;display:none;">
+ <table width="80%">
+ <tr><th width="50%" style="text-align:center;">resources</th><th width="50%" style="text-align:center;">leases</th></tr>
+ <tr>
+ <td style="text-align:center">{{list_reserved_resources}}</td>
+ <td style="text-align:center">{{list_reserved_leases}}</td>
+ </tr>
+ </table>
+ </div>
+ <div id="pending" class="tab-pane" style="height:370px;display:none;">
+ {{pending_resources}}
+ </div>
+ <div id="sla_dialog" class="tab-pane" style="height:370px;display:none;">
+ {{sla_dialog}}
+ </div>
+ -->
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+{% endblock %}
--- /dev/null
+{% extends "layout_wide.html" %}
+
+{% block head %}
+{% endblock %}
+
+{% block content %}
+{% include theme|add:"_widget-slice-sections.html" %}
+
+<div class="container-fluid tab-content container-slice">
+ <div class="tab-pane active row" id="info">...</div>
+ <div class="tab-pane row" id="testbeds">...</div>
+ <div class="tab-pane row" id="resources">...</div>
+ <div class="tab-pane row" id="users">...</div>
+ <!-- <div class="tab-pane row" id="statistics">...</div> -->
+ <!-- <div class="tab-pane row" id="measurements">...</div> -->
+ <div class="tab-pane row" id="experiment">...</div>
+</div>
+{% endblock %}
--- /dev/null
+{% extends "layout.html" %}
+{% load i18n %}
+
+{% block content %}
+ <div class="row">
+ <div class="col-md-12">
+ <div class="breadcrumbs">
+ Experiment > Request a new Slice
+ </div>
+ </div>
+ </div>
+
+ {% if errors %}
+ <div class="row">
+ <div class="col-md-12">
+ <ul class="error">
+ {% for error in errors %}
+ <li>{{ error }}</li>
+ {% endfor %}
+ </ul>
+ </div>
+ </div>
+ {% endif %}
+
+ <div class="row">
+ <div class="col-md-8 el">
+ <form role="form" method="post">
+ {% csrf_token %}
+ <div class="form-group" style="display:none">
+ <input type="email" class="form-control" id="email" style="width:300px" value="{{ email }}" readonly="readonly">
+ </div>
+ <div class="form-group">
+ <input type="text" class="form-control" name="slice_name" id="slice_name" style="width:300px" placeholder="Slice name" value="{{slice_name}}"
+ title="Please enter a name for your slice"required="required">
+ </div>
+ <div class="form-group">
+ {%if 'is_pi' in pi %}
+ <input type="text" class="form-control" id="authority_hrn" name="org_name" style="width:300px" placeholder="Organization"
+ title="An authority responsible for vetting your slice" required="required">
+ {%else%}
+ <input type="text" class="form-control" id="authority_hrn" name="org_name" placeholder="Organization" style="width:300px;"
+ title="An authority responsible for vetting your slice" required="required" readonly>
+ {%endif%}
+ </div>
+ <div class="form-group">
+ <input type="text" class="form-control" name="url" id="url" style="width:300px" placeholder="Experiment URL (if one exists)"
+ title="Please provide the url of your experiment if you have one." value="{{url}}">
+ </div>
+ <div class="form-group">
+ <textarea id="purpose" name="purpose" class="form-control" rows="6" placeholder="Experiment purpose" style="width:300px"
+ title="Purpose of your experiment (informative)" required="required">{{ purpose }}</textarea>
+ </div>
+ {%if 'is_pi' in pi %}
+ <button type="submit" id=submit_pi class="btn btn-onelab"><span class="glyphicon glyphicon-plus"></span> Create slice</button>
+ {%else%}
+ <button type="submit" class="btn btn-onelab"><span class="glyphicon glyphicon-plus"></span> Request slice</button>
+ {%endif%}
+ </form>
+
+ </div>
+ </div>
+
+<script>
+jQuery(document).ready(function(){
+
+ /*$("#authority_hrn").load("/rest/user/", {"fields" : ["parent_authority"], "filters": {"user_hrn": "{{ user_hrn }}"}}, function(data) {
+ var jsonData = JSON.parse(data);
+ $(this).attr("value", jsonData[0]['parent_authority']);
+ });*/
+ $("#authority_hrn").val("{{authority_name}}");
+ var availableTags = [
+ {% if authorities %}
+ {% for authority in authorities %}
+ {% if authority.name %}
+ {value:"{{ authority.name }}",label:"{{authority.name}}"},
+ // to show only full name
+ // {% else %}
+ // {value:"{{ authority.authority_hrn }}",label:"{{authority.authority_hrn}}"},
+ {% endif %}
+ {% endfor %}
+ {% else %}
+ {value:"",label:"No authority found !!!"}
+ {% endif %}
+ ];
+ // sorting the list
+ availableTags.sort(function(a,b){
+ var nameA=a.value.toLowerCase(), nameB=b.value.toLowerCase();
+ if (nameA < nameB) {
+ return -1;
+ }
+ if (nameA > nameB) {
+ return 1;
+ }
+ return 0;
+ });
+ $( "#authority_hrn" ).autocomplete({
+ source: availableTags,
+ minLength: 0,
+ select: function( event, ui ) {console.log(jQuery(this));}
+ });
+
+ $("#submit_pi").click(function() {
+ localStorage.clear();
+ });
+});
+</script>
+{% endblock %}
+
+<div class="container">
+ <div class="row">
+ <div class="col-md-12">
+ <div class="breadcrumbs">
+ Experiment > Slice: {{ slice }}
+ </div>
+ </div>
+ </div>
+</div>
+<div class="container-fluid container-slice">
+<div class="row">
+ <div class="col-md-12">
{% if section == "resources" %}
<ul class="nav nav-tabs nav-section">
- <li><a href="/slice/{{ slice }}#info"><img src="{{ STATIC_URL }}icons/slices-xs.png" alt="About MySlice" /> {{ slice }}</a></li>
-<!-- <li><a href="/slice/{{ slice }}#testbeds">Testbeds</a></li> -->
+
+ <!-- <li><a href="/slice/{{ slice }}#testbeds">Testbeds</a></li> -->
<li class="active"><a class="link" href="/resources/{{ slice }}">Resources</a></li>
<li><a href="/slice/{{ slice }}#users">Users</a></li>
- <li class="sla"><a href="/slice/{{ slice }}#sla">SLA</a></li>
-
-<!-- <li><a href="/slice/{{ slice }}#experiment">Statistics</a></li>
- <li><a href="/slice/{{ slice }}#measurements">Measurements</a></li>
- <li><a href="/slice/{{ slice }}#experiment" data-toggle="tab">Experiment</a></li> -->
-
+ <li><a href="/slice/{{ slice }}#info">Information</a></li>
+ <!-- <li><a href="/slice/{{ slice }}#experiment">Statistics</a></li> -->
+ <!-- <li><a href="/slice/{{ slice }}#experiment">Measurements</a></li> -->
+ <li><a href="/slice/{{ slice }}#experiment">Tools</a></li>
</ul>
{% else %}
<ul class="nav nav-tabs nav-section">
- <li class="active"><a href="#info"><img src="{{ STATIC_URL }}icons/slices-xs.png" alt="About MySlice" /> {{ slice }}</a></li>
- <!--<li class="testbeds"><a href="#testbeds">Testbeds</a></li> -->
+ <!-- <li class="testbeds"><a href="#testbeds">Testbeds</a></li> -->
<li><a class="link" href="/resources/{{ slice }}">Resources</a></li>
<li class="users"><a href="#users">Users</a></li>
-
- <!-- <li class="statistics"><a href="#experiment">Statistics</a></li>
- <li class="measurements"><a href="#experiment">Measurements</a></li>
- <li class="experiment"><a href="#experiment" data-toggle="tab">Experiment</a></li> -->
- <li class="sla"><a href="#sla">SLA</a></li>
-
+ <li class="active"><a href="#info">Information</a></li>
+ <!-- <li class="statistics"><a href="#experiment">Statistics</a></li> -->
+ <!-- <li class="measurements"><a href="#experiment">Measurements</a></li> -->
+ <li class="experiment"><a href="#experiment">Tools</a></li>
</ul>
+
<script>
$(document).ready(function() {
$('.nav-tabs a').click(function (e) {
var id = $(this).attr('href').substr(1);
$("#" + id).load('/' + id + '/{{ slice }}/');
});
- $('div#info').load('/info/{{ slice }}/');
+
+ var hash = window.location.hash;
+ if (hash) {
+ $('.nav-tabs a[href='+hash+']').click();
+ } else {
+ $('div#info').load('/info/{{ slice }}/');
+ }
});
</script>
{% endif %}
+</div>
+</div>
+</div>
\ No newline at end of file
<ul>
<li id="nav-account"><a href="/portal/account/">{{ username }}</a></li>
<li>|</li>
- <li id="nav-institution" class=""><a href="/portal/institution">AUTHORITY</a></li>
+ <!--<li id="nav-institution" class=""><a href="/portal/institution">AUTHORITY</a></li>-->
<li class="slices">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
SLICES <span class="caret"></span>
</ul>
</div>
</li>
- <li id="nav-request"><a href="/portal/validate">REQUESTS</a></li>
<li id="nav-service"><a href="/portal/servicedirectory">SERVICES</a></li>
<li id="nav-support"><a href="http://doc.fed4fire.eu/support.html">SUPPORT</a></li>
<li>|</li>
</td>
{%endif%}
</tr>
+ <tr class="even" id="sfi_config_row">
+ <td class="key">sfi_config </td>
+ <td class="value">use sfi_config file with sfi.py package (pip install sfa)<a href="#"></a>
+ <button type="submit" name="dl_sfi_config" class="btn btn-default btn-xs" title="Download your privaye key" id="dl_sfi_config">
+ <span class="glyphicon glyphicon-download"></span> Download
+ </button>
+ </td>
+ </tr>
+
<tr class="even">
<td colspan="2">
<p class="command">