# default port : if hostname starts with z -> use 8080 ; otherwise take 80
#hostname | grep -q '^z' && port=8080 || port=8080
-hostname | grep -q '^z' && port=8080 || port=80
+hostname | grep -q '^z' && port=8080 || port=8080
[[ -n "$@" ]] && port=$1
while true; do
// XXX This should be handled by manifold
manifold.raise_event(self.options.query_uuid, FILTER_REMOVED, [key, op]);
}
- }
+ };
},
init: function(options, element) {
# dataTableExt.afnSortData
"js/querytable.js",
] ,
- 'css_files': [ "css/dataTables.bootstrap.css",
+ 'css_files': [ #"css/dataTables.bootstrap.css",
# hopefully temporary, when/if datatables supports sPaginationType=bootstrap3
# for now we use full_numbers, with our own ad hoc css
"css/dataTables.full_numbers.css",
- "css/querytable.css" ,
+ #"css/querytable.css" ,
],
}
return reqs
#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)
- result_sfa_user = result_sfa_user[0]
- if 'keys' in result_sfa_user and result_sfa_user['keys'][0] == public_key:
- # updating manifold
- updated_config = json.dumps(account_config)
- user_params = { 'config': keypair, 'auth_type':'managed'}
- manifold_update_account(request, user_id, user_params)
- messages.success(request, 'Sucess: New Keypair Generated! Delegation of your credentials will be automatic.')
- else:
+ try:
+ result_sfa_user = result_sfa_user[0]
+ if 'keys' in result_sfa_user and result_sfa_user['keys'][0] == public_key:
+ # updating manifold
+ updated_config = json.dumps(account_config)
+ user_params = { 'config': keypair, 'auth_type':'managed'}
+ manifold_update_account(request, user_id, user_params)
+ messages.success(request, 'Sucess: New Keypair Generated! Delegation of your credentials will be automatic.')
+ else:
+ 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.')
return HttpResponseRedirect("/portal/account/")
else:
.select('platform_id')
reg_platform = execute_admin_query(wsgi_request, reg_platform_query)
- registry_platform_id = reg_platform[0]['platform_id']
+ reg_platform_id = reg_platform[0]['platform_id']
account_params = {
'platform_id' : reg_platform_id, # XXX ALERT !!
'user_id' : user_id,
env['person'] = self.request.user
user_query = Query().get('user').select('user_hrn','parent_authority').filter_by('user_hrn','==','$user_hrn')
user_details = execute_query(self.request, user_query)
- env['user_details'] = user_details[0]
+ try:
+ env['user_details'] = user_details[0]
+ except Exception,e:
+ env['error'] = "Please check your Credentials"
else:
env['person'] = None
from manifold.core.query import Query, AnalyzedQuery
from manifoldapi.manifoldapi import execute_query
+from myslice.configengine import ConfigEngine
+from plugins.querytable import QueryTable
+from plugins.googlemap import GoogleMap
+from plugins.queryupdater import QueryUpdater
+
from theme import ThemeView
class SliceResourceView (LoginRequiredView, ThemeView):
template_name = "slice-resource-view.html"
def get(self, request, slicename):
+
if request.GET.get('message') :
msg = "Slice successfully updated"
else :
msg = None
- return render_to_response(self.template, {"msg" : msg, "slice": slicename, "theme": self.theme, "username": request.user, "section":"resources"}, context_instance=RequestContext(request))
+
+ page = Page(request)
+ metadata = page.get_metadata()
+ page.expose_js_metadata()
+
+ resource_md = metadata.details_by_object('resource')
+ resource_fields = [column['name'] for column in resource_md['column']]
+
+ user_md = metadata.details_by_object('user')
+ user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
+
+ # TODO The query to run is embedded in the URL
+ main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
+ main_query.select(
+ 'slice_hrn',
+ 'resource.urn',
+ 'resource.hostname', 'resource.type',
+ 'resource.network_hrn',
+ 'lease.urn',
+ 'user.user_hrn',
+ #'application.measurement_point.counter'
+ )
+ # for internal use in the querytable plugin;
+ # needs to be a unique column present for each returned record
+ main_query_init_key = 'urn'
+ aq = AnalyzedQuery(main_query, metadata=metadata)
+ page.enqueue_query(main_query, analyzed_query=aq)
+
+ query_resource_all = Query.get('resource').select(resource_fields)
+ page.enqueue_query(query_resource_all)
+
+ sq_resource = aq.subquery('resource')
+ sq_lease = aq.subquery('lease')
+
+ list_resources = QueryTable(
+ page = page,
+ domid = 'resources-list',
+ title = 'List view',
+ query = sq_resource,
+ query_all = query_resource_all,
+ init_key = "urn",
+ checkboxes = True,
+ datatables_options = {
+ 'iDisplayLength': 25,
+ 'bLengthChange' : True,
+ 'bAutoWidth' : True,
+ },
+ )
+
+ # --------------------------------------------------------------------------
+ # RESOURCES
+ # the resources part is made of a Tabs (Geographic, List),
+
+ map_resources = GoogleMap(
+ page = page,
+ title = 'Geographic view',
+ domid = 'resources-map',
+ # tab's sons preferably turn this off
+ togglable = False,
+ query = sq_resource,
+ query_all = query_resource_all,
+ # this key is the one issued by google
+ googlemap_api_key = ConfigEngine().googlemap_api_key(),
+ # the key to use at init-time
+ init_key = main_query_init_key,
+ checkboxes = True,
+ # center on Paris
+ latitude = 49.,
+ longitude = 9,
+ zoom = 4,
+ )
+
+ # --------------------------------------------------------------------------
+ # QueryUpdater (Pending Operations)
+
+ pending_resources = QueryUpdater(
+ page = page,
+ title = 'Pending operations',
+ query = main_query,
+ togglable = True,
+ # start turned off, it will open up itself when stuff comes in
+ toggled = False,
+ domid = 'pending',
+ outline_complete = True,
+ )
+
+ template_env = {}
+ template_env['list_resources'] = list_resources.render(self.request)
+ template_env['map_resources'] = map_resources.render(self.request)
+ template_env['pending_resources'] = pending_resources.render(self.request)
+ template_env["theme"] = self.theme
+ template_env["username"] = request.user
+ template_env["slice"] = slicename
+ template_env["section"] = "resources"
+ template_env["msg"] = msg
+ template_env.update(page.prelude_env())
+
+ return render_to_response(self.template, template_env, context_instance=RequestContext(request))
h1 {
border-bottom:1px solid #DDDDDD;
- padding:0 0 5px 0;
- margin:0 0 15px 0;
+ padding:0 0 0 0;
+ margin:0 0 0 0;
font-size:18pt;
}
h1 img {
vertical-align:middle;
- margin-bottom:4px;
+ margin-bottom:6px;
}
h2 {
font-size:14pt;
font-size:13pt;
color:#201E62;
}
+
div.wrapper {
width:980px;
margin:0 auto;
/* NAV TABS */
.nav.nav-tabs {
- margin-bottom:25px;
}
.nav.nav-tabs li.active a {
}
/* SLICE VIEW */
+ul.nav-sliceview {}
+ul.nav-sliceview li {
+
+}
+ul.nav-sliceview li:first-child {
+ padding:0;
+}
+ul.nav-sliceview li:first-child a {
+ font-weight:bold;
+ padding:6px 15px 4px 15px;
+}
+ul.nav-sliceview li:first-child img {
+ margin:0 4px 1px 0;
+ padding:0;
+}
+
+
+
+
+
+
div#slice-view {
margin:0;
}
},
apply: function() {
- $('div#loading').show();
- this.pending = [];
- this.save();
- // setTimeout(function(){
- // $('div#loading').hide();
- // window.location.href = '/resources/' + this.slice + '?message=true';
- // },6000);
+
+ //$('div#loading').show();
+ //this.pending = [];
+ //this.save();
+ //setTimeout(function(){
+ //$('div#loading').hide();
+ //window.location.href = '/resources/' + this.slice + '?message=true';
+ //},6000);
- $.post("/rest/slice/", { 'fields': ['resource','slice_hrn'], 'filters': { 'slice_hrn' : this.slice } }, function(data) {
- console.log(data);
- resources = [];
- reserved = [];
- update = [];
- if ('resource' in data[0]) {
- $.each(data[0].resource, function(idx, r) {
- resources.push(r.urn);
- });
- }
- //myslice.pending
- console.log(myslice.pending);
- console.log(resources);
- $.each(resources.concat(myslice.pending), function(idx, v) {
- update.push({ 'resource': v });
- });
- console.log(update);
- $.post("/update/slice/", { 'filters': { 'slice_hrn' : 'ple.upmc.myslicedemo' }, 'params' : update }, function(data) {
- console.log(data);
- });
- });
- //console.log(this.slice);
+ $.post("/rest/slice/", { 'fields': ['resource','slice_hrn'], 'filters': { 'slice_hrn' : this.slice } }, function(data) {
+ console.log(data);
+ resources = [];
+ reserved = [];
+ update = [];
+ if ('resource' in data[0]) {
+ $.each(data[0].resource, function(idx, r) {
+ resources.push(r.urn);
+ });
+ }
+ //myslice.pending
+ console.log(myslice.pending);
+ console.log(resources);
+ $.each(resources.concat(myslice.pending), function(idx, v) {
+ update.push( v );
+ });
+ console.log(update);
+ $.post("/update/slice/", { 'filters': { 'slice_hrn' : myslice.slice }, 'params' : update }, function(data) {
+ console.log(data);
+ });
+ });
+ console.log(this.slice);
}
};
$(this).parent().addClass('active');
$('div.panel').hide();
$('div#'+$(this).data('panel')).show();
-
+ /*
if ($(this).data('panel') == 'map') {
mapInit();
}
+ */
});
$.get("/rest/network", function(data) {
{% block content %}
<div class="row">
- <h1><img src="{{ STATIC_URL }}img/icon_slices_small.png" alt="About MySlice" /> About</h1>
+ <h1><img src="{{ STATIC_URL }}icons/slices-xs.png" alt="About MySlice" /> About</h1>
</div>
<div class="row">
-{% insert_str prelude "js/bootstrap.js" %}
-{% insert_str prelude "css/bootstrap.css" %}
-{% insert_str prelude "css/topmenu.css" %}
-{% insert_str prelude "js/logout.js" %}
+
<div id="header">
<div class="wrapper">
<div class="logo">
<ul class="nav nav-tabs nav-resources">
<li class="active"><a data-panel="resources" href="#">Resources</a></li>
<li><a data-panel="map" href="#">Map</a></li>
+ <li><a data-panel="pending" href="#">Pending</a></li>
<li><a href="#"></a></li>
</ul>
</div>
<div class="row" style="height:100%;">
<div id="resources" class="panel">
+ {{list_resources}}
<table cellpadding="0" cellspacing="0" border="0" class="table" id="objectList"></table>
</div>
<div id="map" class="panel" style="height:370px;display:none;">
- <div id="map-canvas" style="height:100%;"></div>
+ {{map_resources}}
+ </div>
+ <div id="pending" class="panel" style="height:370px;display:none;">
+ {{pending_resources}}
</div>
</div>
</div>
-{% endblock %}
\ No newline at end of file
+{% endblock %}
{% extends "layout_wide.html" %}
{% block content %}
- <div class="col-md-2"></div>
- <div class="col-md-10">
- <div class="row">
- {% include theme|add:"_widget-slice-sections.html" %}
+<div class="wrapper">
+ <div class="row">
+ <div class="col-md-12">
+ {% include theme|add:"_widget-slice-sections.html" %}
+ </div>
+ </div>
+</div>
+<div class="container-fluid">
+ <div class="row">
+ <div class="col-md-2">
+ ll
</div>
- </div>
-
- <div class="col-md-2"></div>
- <div class="col-md-10">
- <br>
- <br>
- <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">
- </table>
- </div>
- </div>
-
+ <div class="col-md-10">
+ <br>
+ <br>
+ <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">
+ </table>
+ </div>
+ </div>
+ </div>
+</div>
<script>
$(document).ready(function() {
$.post("/rest/slice/",{'filters':{'slice_hrn':'{{slice}}'}}, function( data ) {
-<div class="col-md-8 slice-sections">
- <ul class="nav nav-pills nav-justified">
- <li {% if section == 'slice' %}class="active"{% endif %}><a href="/slice/{{ slice }}/">{{ slice }}</a></li>
- <li {% if section == 'testbeds' %}class="active"{% endif %}><a href="/testbeds/{{ slice }}/">Testbeds</a></li>
- <li {% if section == 'resources' %}class="active"{% endif %}><a href="/resources/{{ slice }}/">Resources</a></li>
- <li {% if section == 'users' %}class="active"{% endif %}><a href="/users/{{ slice }}/">Users</a></li>
- <li><a href="">Statistics</a></li>
- <li><a href="">Measurements</a></li>
- </ul>
-</div>
-<div class="col-md-4 slice-experiment">
- <a href="/portal/experiment"><button type="button" class="btn btn-default">Experiment</button></a>
-</div>
+<ul class="nav nav-tabs nav-sliceview">
+ <li class="active"><a href="/slice/{{ slice }}/"><img src="{{ STATIC_URL }}icons/slices-xs.png" alt="About MySlice" /> {{ slice }}</a></li>
+ <li><a href="/testbeds/{{ slice }}/">Testbeds</a></li>
+ <li><a href="/resources/{{ slice }}/">Resources</a></li>
+ <li><a href="/users/{{ slice }}/">Users</a></li>
+ <li><a href="">Statistics</a></li>
+ <li><a href="">Measurements</a></li>
+ <li><a href="/portal/experiment">Experiment</a></li>
+</ul>
+<script>
+ $(document).ready(function() {
+
+ });
+</script>
{% 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 "css/topmenu.css" %}
+{% insert_str prelude "js/logout.js" %}
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/{{ theme }}.css">
</head>
<body>
$(document).ready(function(){
{% for message in messages %}
$("#notifications").notify("create", {
- title: 'Test Notification',
+ title: 'Notification',
text: '{{ message }}'
},{
- expires: false,
+ expires: true,
speed: 1000
});
{% endfor %}