var CONSTRAINT_RESERVABLE_LEASE_MSG = "Configuration required: this resource needs to be scheduled";
+var CONSTRAINT_SLA = 1;
+
+var CONSTRAINT_SLA_MSG = "SLA acceptance required: testbed offers SLA for its resources"
+
// A structure for storing queries
function QueryExt(query, parent_query_ext, main_query_ext, update_query_ext, disabled, domain_query_ext) {
{
var query, data;
+ // JGLL: TODO These lines should be moved to a different part of the code
+ // to avoid a call every time a resource is selected or deselected -> where?
+ function get_testbeds_with_sla() {
+ return $.ajax({
+ url: '/sla/testbeds/',
+ async: true
+ });
+ }
+
query = query_ext.query;
switch(query.object) {
}
}
+ // JGLL: SLA code
+ /*get_testbeds_with_sla()
+ .done( function(testbeds) {
+ var urn_regexp = /\+(.*?)\+/;
+ var testbed_urn = urn_regexp.exec(record.urn)[1];
+
+ var warnings = manifold.query_store.get_record_state(query.query_uuid, record_key, STATE_WARNINGS);
+
+ if ($.inArray(testbed_urn, testbeds) != -1) {
+ // JGLL: Set a warning on resources covered by testbeds offering SLAs
+ // CONSTRAINT_SLA
+
+ if (event_type == STATE_SET_ADD) {
+ var warn = CONSTRAINT_SLA_MSG;
+ warnings[CONSTRAINT_SLA] = warn;
+ } else {
+ delete warnings[CONSTRAINT_SLA]
+ }
+ }
+
+ manifold.query_store.set_record_state(query.query_uuid, record_key, STATE_WARNINGS, warnings);
+
+ // Signal the change to plugins (even if the constraint does not apply, so that the plugin can display a checkmark)
+ data = {
+ state: STATE_WARNINGS,
+ key : record_key,
+ op : null,
+ value : warnings
+ }
+
+ manifold.raise_record_event(query.query_uuid, FIELD_STATE_CHANGED, data);
+ })
+ .fail( function(err) {
+ console.log("SLA - Error retrieving testbeds that support SLAs");
+ });*/
+
/* This was redundant */
- // manifold.query_store.recount(query.query_uuid);
+ // manifold.query_store.recount(query.query_uuid);
break;
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
'portal',
+ #SLA
+ #'sla',
]
# with django-1.7 we leave south and use native migrations
# managing database migrations
####SLA#####
-SLA_MANAGER_URL = "http://157.193.215.125:4001/sla-collector/sla"
-#SLA_MANAGER_URL = "http://172.24.76.28:8000/sla"
-SLA_MANAGER_USER = "portal"
-SLA_MANAGER_PASSWORD = "password"
+SLA_COLLECTOR_URL = "http://157.193.215.125:4001/sla-collector/sla"
+SLA_COLLECTOR_USER = "portal"
+SLA_COLLECTOR_PASSWORD = "password"
url(r'^portal/', include('portal.urls')),
# SLA
-# url(r'^sla/', include('sla.urls')),
+ #url(r'^sla/', include('sla.urls')),
]
urls.extend( components.urls() )
metadata = self.page.get_metadata()
md_fields = metadata.details_by_object('resource')
+ sla_column_info = {
+ 'name': 'sla_supported',
+ 'default': '',
+ 'is_array': False,
+ 'description': '',
+ 'type': 'bool',
+ 'qualifier': None
+ }
+
+ if sla_column_info not in md_fields['column']:
+ md_fields['column'].append(sla_column_info)
+
# XXX use django templating system here
for md_field in sorted(md_fields['column']):
if md_field['type'] == 'string':
//alert("1");\r
</script>\r
</div>\r
+</div>
\ No newline at end of file
+#sla_dialog {
+ //margin-top: 2em;
+ margin-left: 1em;
+}
+
+#sla_offers div.row p {
+ line-height: 40px;
+}
+
+span.provider {
+ font-weight: bold;
+}
\ No newline at end of file
var SlaDialog = Plugin.extend({
+ accepted_slas: {},
+
/** XXX to check
* @brief Plugin constructor
* @param options : an associative array of setting values
/* GUI setup and event binding */
// call function
+ this.button_binding();
},
return cols[0];
},
+ check_template_status: function() {
+ for (var testbed in this.accepted_slas) {
+ if (!this.accepted_slas[testbed]) { return false; }
+ }
+
+ return true;
+ },
+
/* PLUGIN EVENTS */
// on_show like in querytable
/* GUI EVENTS */
+ button_binding: function() {
+ var self = this;
+ $(".sla-accept-button").click(function() {
+ // set SLA as accepted and remove warnings
+ var id = $(this).closest(".row").attr("id");
+ self.accepted_slas[id] = true;
+ var is_ok = self.check_template_status();
+
+ if (is_ok) {
+ // remove warnings
+ // var warnings = manifold.query_store.get_record_state(resource_query.query_uuid, resource_key, STATE_WARNINGS);
+ }
+ });
+ },
+
+ create_sla: function(record) {
+ var self = this;
+
+ var urns = [];
+
+ record.resource.forEach(function(r) {
+ if ($.inArray(r.component_id, record.resource) == -1) { // if not already selected
+ urns.push(r.component_id);
+ }
+ });
+
+ if (record.resource.length != 0 && typeof record.resource[0] !== "undefined") {
+ var data = {
+ "SLIVER_INFO_AGGREGATE_URN": record.resource[0].component_manager_id,
+ "SLIVER_INFO_EXPIRATION": record.lease[0].end_time, // FIXME: only working with leases
+ "SLIVER_INFO_SLICE_URN": record.slice_urn,
+ "SLIVER_INFO_CREATOR_URN": record.users[0],
+ "SLIVER_INFO_URN": urns,
+ "SLIVER_INFO_SLA_ID": self._getUUID()
+ };
+
+ console.log(data);
+
+ $.post("/sla/agreements/create/", data)
+ .done(function (response) {
+ console.log("SLA created");
+ });
+ }
+ },
+
uncheck: function(urn)
{
- $('#slamodal').on('hidden.bs.modal', function(e){
- $('#' + (urn).replace(/"/g,'')).click();
- console.log('#' + (data.value).replace(/"/g,''));
- });
+// $('#slamodal').on('hidden.bs.modal', function(e){
+// $('#' + (urn).replace(/"/g,'')).click();
+// console.log('#' + (data.value).replace(/"/g,''));
+// });
},
// a function to bind events here: click change
},
- on_field_state_changed: function(result)
+ on_field_state_changed: function(data)
{
- console.log("triggered state_changed: "+result);
+ var self = this;
// this.set_state(result, this.options.username);
+
+ switch(data.state) {
+ case STATE_SET:
+ switch(data.op) {
+ case STATE_SET_IN_PENDING:
+ if (typeof(data.value) == 'string') {
+ // data.value = urn
+ this._supports_sla(data.value)
+ .done( function(testbeds) {
+ var urn_regexp = /\+(.*?)\+/;
+ var urn = urn_regexp.exec(data.value)[1];
+ var pos = $.inArray(urn, testbeds);
+ if ( pos != -1) {
+ var id_ref = testbeds[pos].replace(/\.|:/g, "-");
+ $("#" + id_ref).data("urns").push(data.value);
+ $("#" + id_ref).show();
+ self.accepted_slas[id_ref] = false;
+ //$( "#sla_offers_list" ).append(
+ // $("<li>").text("Testbed " + testbeds[pos] + " offers SLA for its resources")
+ //);
+ }
+ });
+ }
+ break;
+ case STATE_SET_OUT:
+ // data.value = urn
+ if (typeof(data.value) == 'string') {
+ // data.value = urn
+ this._supports_sla(data.value)
+ .done( function(testbeds) {
+ var urn_regexp = /\+(.*?)\+/;
+ var urn = urn_regexp.exec(data.value)[1];
+ var pos = $.inArray(urn, testbeds);
+ if ( pos != -1) {
+ var id_ref = testbeds[pos].replace(/\.|:/g, "-");
+ var array = $("#" + id_ref).data("urns");
+ array.splice(array.indexOf(data.value), 1);
+
+ if ($("#" + id_ref).data("urns").length == 0) {
+ $("#" + id_ref).hide();
+ delete self.accepted_slas[id_ref];
+ }
+ //$( "#sla_offers_list" ).append(
+ // $("<li>").text("Testbed " + testbeds[pos] + " offers SLA for its resources")
+ //);
+ }
+ });
+ }
+ break;
+ }
+ break;
+
+ case STATE_WARNINGS:
+ // Add resource to SLA
+ // data.key = urn
+ // data.value = {1: "SLA acceptance required..."}
+ // this.change_status(data.key, data.value);
+ break;
+ }
},
// ... be sure to list all events here
on_new_record: function(record)
{
-
+ this.create_sla(record);
},
/* INTERNAL FUNCTIONS */
// only convention, not strictly enforced at the moment
},
+ _supports_sla: function(resource_urn) {
+ return $.ajax("/sla/testbeds/");
+ },
+
+
+
+ _getUUID: function() {
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+ var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8);
+ return v.toString(16);
+ });
+ },
+
});
/* Plugin registration */
<div id={{ domid }}>
-<div class="modal fade" id="slamodal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"
- data-backdrop="static" data-keyboard="false">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <h4 class="modal-title" id="myModalLabel">Selected testbed(s) provide the following SLAs</h4>
- </div>
- <div class="modal-body" id="modal-body">
- <table class="table" id="sla-modal-table">
- <thead>
- <tr>
- <th>Testbed</th>
- <th>SLA Description</th>
- <th>Accept</th>
- </tr>
- </thead>
- <tbody id="sla-table-body">
- </tbody>
- </table>
- </div>
- <div class="modal-footer">
- <button type="button" id="cancel_sla" class="btn btn-default" data-dismiss="modal">Cancel</button>
- <button type="button" id="submit_sla" class="btn btn-primary">Submit</button>
- </div>
+ <div id="sla_offers" class="container">
+ <div id="fuseco-fokus-fraunhofer-de" class="row" data-urns="[]" style="display: none">
+ <div class="col-md-6">
+ <p>Testbed <span class="provider">fuseco.fokus.fraunhofer.de</span> offers the following SLA for its resources</p>
+ </div>
+ <div class="col-md-1">
+ <button class="sla-info-button btn btn-default">
+ <span class="glyphicon glyphicon-info-sign"></span>
+ Details
+ </button>
+ </div>
+ <div class="col-md-1">
+ <button class="sla-accept-button btn btn-default">
+ <span class="glyphicon glyphicon-ok"></span>
+ Accept
+ </button>
+ </div>
+ </div>
+ <div id="omf-netmode" class="row" data-urns="[]" style="display: none">
+ <div class="col-md-6">
+ <p>Testbed <span class="provider">omf:netmode</span> offers the following SLA for its resources</p>
+ </div>
+ <div class="col-md-1">
+ <button class="sla-info-button btn btn-default">
+ <span class="glyphicon glyphicon-info-sign"></span>
+ Details
+ </button>
+ </div>
+ <div class="col-md-1">
+ <button class="sla-accept-button btn btn-default">
+ <span class="glyphicon glyphicon-ok"></span>
+ Accept
+ </button>
+ </div>
+ </div>
+ <div id="wilab2-ilabt-iminds-be" class="row" data-urns="[]" style="display: none">
+ <div class="col-md-6">
+ <p>Testbed <span class="provider">wilab2.ilabt.iminds.be</span> offers the following SLA for its resources</p>
+ </div>
+ <div class="col-md-1">
+ <button class="sla-info-button btn btn-default">
+ <span class="glyphicon glyphicon-info-sign"></span>
+ Details
+ </button>
+ </div>
+ <div class="col-md-1">
+ <button class="sla-accept-button btn btn-default">
+ <span class="glyphicon glyphicon-ok"></span>
+ Accept
+ </button>
+ </div>
+ </div>
+ <div id="wall2-ilabt-iminds-be" class="row" data-urns="[]" style="display: none">
+ <div class="col-md-6">
+ <p>Testbed <span class="provider">wall2.ilabt.iminds.be</span> offers the following SLA for its resources</p>
+ </div>
+ <div class="col-md-1">
+ <button class="sla-info-button btn btn-default">
+ <span class="glyphicon glyphicon-info-sign"></span>
+ Details
+ </button>
+ </div>
+ <div class="col-md-1">
+ <button class="sla-accept-button btn btn-default">
+ <span class="glyphicon glyphicon-ok"></span>
+ Accept
+ </button>
+ </div>
+ </div>
</div>
- </div>
-</div>
-<!-- <div class="modal fade" id="slamodal-virtualwall" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"
- data-backdrop="static" data-keyboard="false">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <h4 class="modal-title" id="modalTitleId">Provider iMinds offers the following SLA</h4>
- </div>
- <div class="modal-body" id="modal-body">
- <p>SLA description</p>
- <p>Testbed guarantees 0.99 Uptime rate for 0.99 rate of the VirtualWall resources during the sliver lifetime</p>
- </div>
- <div class="modal-footer">
- <button type="button" id="dismiss_sla_vwall" class="btn btn-default" data-dismiss="modal">Dismiss</button>
- <button type="button" id="accept_sla_vwall" class="btn btn-primary">Accept</button>
- </div>
- </div>
- </div>
-</div> -->
-</div>
+</div>
\ No newline at end of file
# },
# )
- # # --------------------------------------------------------------------------
- # # SLA View and accept dialog
- #
- # sla_dialog = SlaDialog(
- # page = page,
- # title = 'sla dialog',
- # query = main_query,
- # togglable = False,
- # # start turned off, it will open up itself when stuff comes in
- # toggled = True,
- # domid = 'sla_dialog',
- # outline_complete = True,
- # username = request.user,
- # )
- #
+ # --------------------------------------------------------------------------
+ # SLA View and accept dialog
+
+ sla_dialog = SlaDialog(
+ page = page,
+ title = 'sla dialog',
+ query = main_query,
+ #togglable = False,
+ # start turned off, it will open up itself when stuff comes in
+ #toggled = True,
+ domid = 'sla_dialog',
+ #outline_complete = True,
+ username = request.user,
+ )
+
## check user is pi or not
platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config')
# template_env['vm_form'] = univbrisvtamform.render(self.request)
# template_env['pending_resources'] = pending_resources.render(self.request)
- # template_env['sla_dialog'] = '' # sla_dialog.render(self.request)
+ template_env['sla_dialog'] = sla_dialog.render(self.request)
template_env["theme"] = self.theme
template_env["username"] = request.user
template_env["pi"] = pi
<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="#resourcesla" role="tab" data-toggle="tab">SLA offers</a></li>
</ul>
</div>
</div>
<div class="tab-pane" id="resourcemap">
{{map_resources}}
</div>
+ <div class="tab-pane" id="resourcesla">
+ {{sla_dialog}}
+ </div>
<div class="tab-pane" id="resourcescheduler">
{{scheduler}}
</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 class="tab-pane row" id="sla">...</div>
</div>
{% endblock %}
<!-- <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>
+ <li><a href="/slice/{{ slice }}#sla">SLA status</a></li>
</ul>
{% else %}
<ul class="nav nav-tabs nav-section">
<!-- <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>
+ <li class="sla"><a href="#sla">SLA status</a></li>
</ul>
<script>
if ($(this).hasClass('link')) return;
e.preventDefault();
$(this).tab('show');
- var id = $(this).attr('href').substr(1);
+ var id = $(this).attr('href').substr(1);
$("#" + id).load('/' + id + '/{{ slice }}/');
});
+++ /dev/null
-This is the README.txt file for sla-dashboard application.\r
-\r
-sla-dashboard application is composed by the following directories:\r
-* sladashboard: the app related to the application itself. The settings\r
- file maybe need to be modified: read below.\r
-* slagui: the sla dashboard GUI project.\r
-* slaclient: this project contains all the code needed to connect to\r
- SLA Manager REST interface, and the conversion from xml/json to python\r
- objects.\r
-* samples: this directory contains sample files to load in the SLA Manager for\r
- testing.\r
-* bin: some useful scripts\r
-\r
-\r
-Software requirements\r
----------------------\r
-Python version: 2.7.x\r
-\r
-The required python packages are listed in requirements.txt\r
-\r
-Installing the requirements inside a virtualenv is recommended.\r
-\r
-SLA Manager (java backend) needs to be running in order to use the dashboard.\r
-\r
-Installing\r
-----------\r
-(to be corrected/completed)\r
-\r
-#\r
-# Install virtualenv\r
-#\r
-$ pip install virtualenv\r
-\r
-\r
-#\r
-# Create virtualenv.\r
-# E.g.: VIRTUALENVS_DIR=~/virtualenvs\r
-#\r
-$ virtualenv $VIRTUALENVS_DIR/sla-dashboard\r
-\r
-#\r
-# Activate virtualenv\r
-#\r
-$ . $VIRTUALENVS_DIR/sla-dashboard/bin/activate\r
-\r
-#\r
-# Change to application dir and install requirements\r
-#\r
-$ cd $SLA_DASHBOARD\r
-$ pip install -r requirements.txt\r
-\r
-#\r
-# Create needed tables for sessions, admin, etc\r
-#\r
-$ ./manage.py syncdb\r
-\r
-Settings\r
---------\r
-\r
-* sladashboard/settings.py:\r
- - SLA_MANAGER_URL : The URL of the SLA Manager REST interface.\r
- - DEBUG: Please, set this to FALSE in production\r
-\r
-* sladashboard/urls.py:\r
- - dashboard root url: the slagui project is accessed by default\r
- in $server:$port/slagui. Change "slagui" with the desired path.\r
-\r
-\r
-Running\r
--------\r
-NOTE: this steps are not suitable in production mode.\r
-\r
-#\r
-# Activate virtualenv\r
-#\r
-$ . $VIRTUALENVS_DIR/sla-dashboard/bin/activate\r
-\r
-#\r
-# Cd to application dir\r
-#\r
-$ cd $SLA_DASHBOARD\r
-\r
-#\r
-# Start server listing in port 8000 (change port as desired)\r
-#\r
-$ ./manage.py runserver 0.0.0.0:8000\r
-\r
-#\r
-# Test\r
-#\r
-curl http://localhost:8000/slagui
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<wsag:Template xmlns:wsag="http://www.ggf.org/namespaces/ws-agreement"
- TemplateId="iMindsServiceTemplate">
- <wsag:Name>Template for iMinds service</wsag:Name>
- <wsag:Context>
- <wsag:AgreementInitiator>iMinds</wsag:AgreementInitiator>
- <wsag:ServiceProvider>AgreementInitiator</wsag:ServiceProvider>
- <wsag:ExpirationTime>2015-03-07T12:00:00:000</wsag:ExpirationTime>
- <sla:Service xmlns:sla="http://sla.atos.eu">iMinds service</sla:Service>
- </wsag:Context>
- <wsag:Terms>
- <wsag:All>
- <!-- FUNCTIONAL DESCRIPTION -->
- <wsag:ServiceDescriptionTerm wsag:Name="SDTName1" wsag:ServiceName="iMinds service">
- The template for iMinds service
- </wsag:ServiceDescriptionTerm>
-
- <!-- OPTIONAL SERVICE REFERENCE -->
-
- <!-- OPTIONAL SERVICE PROPERTIES : non funcional properties-->
- <wsag:ServiceProperties wsag:Name="NonFunctional" wsag:ServiceName="iMinds service">
- <wsag:VariableSet>
- <wsag:Variable Name="UpTime" Metric="xs:double">
- <wsag:Location>iMinds/UpTime</wsag:Location>
- </wsag:Variable>
- <wsag:Variable Name="Performance" Metric="xs:decimal">
- <wsag:Location>iMinds/Performance</wsag:Location>
- </wsag:Variable>
- </wsag:VariableSet>
- </wsag:ServiceProperties>
- <wsag:GuaranteeTerm Name="GT_CPULoad">
- <wsag:ServiceScope ServiceName="iMinds service"/>
- <wsag:ServiceLevelObjective>
- <wsag:KPITarget>
- <wsag:KPIName>UpTime</wsag:KPIName>
- <wsag:CustomServiceLevel>
- {"constraint" : "UpTime GT 75"}
- </wsag:CustomServiceLevel>
- </wsag:KPITarget>
- </wsag:ServiceLevelObjective>
- </wsag:GuaranteeTerm>
- <wsag:GuaranteeTerm Name="GT_Performance">
- <wsag:ServiceScope ServiceName="iMinds service"/>
- <wsag:ServiceLevelObjective>
- <wsag:KPITarget>
- <wsag:KPIName>Performance</wsag:KPIName>
- <wsag:CustomServiceLevel>
- {"constraint" : "Performance GT 50"}
- </wsag:CustomServiceLevel>
- </wsag:KPITarget>
- </wsag:ServiceLevelObjective>
- </wsag:GuaranteeTerm>
- </wsag:All>
- </wsag:Terms>
-</wsag:Template>
+++ /dev/null
-curl -u normal_user:password -H "Content-type: application/xml" -d@providerIMinds.xml localhost:8080/sla-service/providers -X POST
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<provider>
- <uuid>iMinds</uuid>
- <name>iMinds Testbed</name>
-</provider>
+++ /dev/null
-curl -Umyuser:mypassword -H "Content-type: application/json" -d@simpleAgreementCreationParameters.json localhost:8000/sla/agreements/simplecreate -X POST
\ No newline at end of file
+++ /dev/null
-{"template_id":"iMindsServiceTemplate","user":"imauser"}
+++ /dev/null
-curl -u normal_user:password -H "Content-type: application/xml" -d@TemplateIMindsService.xml localhost:8080/sla-service/templateso -X POST
\ No newline at end of file
+++ /dev/null
-#!/usr/bin/env bash
-#
-# To be executed from application root path
-#
-
-#cmd=$($(grep SLA_MANAGER sladashboard/settings.py) && eval $cmd & print $SLA_MANAGER))
-#eval $(grep SLA_MANAGER_URL sladashboard/settings.py)
-#echo SLA_MANAGER_URL=$SLA_MANAGER_URL
-
-SLA_MANAGER_URL="http://localhost:8080/sla-service"
-
-#
-echo \#Add provider virtualwall
-#
-curl -H "Content-type: application/xml" -d @samples/provider-virtualwall.xml $SLA_MANAGER_URL/providers -X POST
-
-#
-echo \#Add provider wiLab2
-#
-curl -H "Content-type: application/xml" -d @samples/provider-wilab2.xml $SLA_MANAGER_URL/providers -X POST
-
-#
-echo \#Add template
-#
-curl -H "Content-type: application/xml" -d @samples/template.xml $SLA_MANAGER_URL/templates -X POST
-
-#
-echo \#Add agreement03
-#
-curl -H "Content-type: application/xml" -d @samples/agreement03.xml $SLA_MANAGER_URL/agreements -X POST
-curl -H "Content-type: application/xml" -d @samples/enforcement03.xml $SLA_MANAGER_URL/enforcements -X POST
-#curl $SLA_MANAGER_URL/enforcements/agreement03/start -X PUT
-
-#
-echo \#Add agreement04
-#
-curl -H "Content-type: application/xml" -d @samples/agreement04.xml $SLA_MANAGER_URL/agreements -X POST
-curl -H "Content-type: application/xml" -d @samples/enforcement04.xml $SLA_MANAGER_URL/enforcements -X POST
-#curl $SLA_MANAGER_URL/enforcements/agreement04/start -X PUT
-
-#
-#echo \#Add agreement05
-#
-#curl -H "Content-type: application/xml" -d@samples/agreement05.xml $SLA_MANAGER_URL/agreements -X POST
-#curl -d@samples/enforcement05.xml -H "Content-type: application/xml" $SLA_MANAGER_URL/enforcements -X POST
-#curl $SLA_MANAGER_URL/enforcements/agreement05/start -X PUT
-
+++ /dev/null
-#!/bin/bash
-
-if [ $# -eq 1 ] ; then
- curl localhost:8080/sla-service/enforcements/agreement0$1/start -X PUT
-else
- curl localhost:8080/sla-service/enforcements/agreement03/start -X PUT
- curl localhost:8080/sla-service/enforcements/agreement04/start -X PUT
-fi
-
+++ /dev/null
-#!/bin/bash
-
-if [ $# -eq 1 ] ; then
- curl localhost:8080/sla-service/enforcements/agreement0$1/stop -X PUT
-else
- curl localhost:8080/sla-service/enforcements/agreement03/stop -X PUT
- curl localhost:8080/sla-service/enforcements/agreement04/stop -X PUT
-fi
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<wsag:Agreement xmlns:wsag="http://www.ggf.org/namespaces/ws-agreement"\r
- AgreementId="agreement03">\r
-\r
- <wsag:Name>ExampleAgreement</wsag:Name>\r
- <wsag:Context>\r
- <wsag:AgreementInitiator>experimenter01</wsag:AgreementInitiator>\r
- <wsag:AgreementResponder>virtualwall</wsag:AgreementResponder>\r
- <wsag:ServiceProvider>AgreementResponder</wsag:ServiceProvider>\r
- <wsag:ExpirationTime>2014-03-07T12:00:00</wsag:ExpirationTime>\r
- <wsag:TemplateId>template</wsag:TemplateId>\r
- <sla:Service xmlns:sla="http://sla.atos.eu">Testbed_guarantee_0.99_Uptime_rate_for_0.99_rate_of_the_resources_during_the_sliver</sla:Service>\r
- </wsag:Context>\r
- <wsag:Terms>\r
- <wsag:All>\r
- \r
- <wsag:ServiceProperties Name="ServiceProperties" ServiceName="ServiceName">\r
- <wsag:VariableSet>\r
- <wsag:Variable Name="UpTime" Metric="xs:double">\r
- <wsag:Location>qos:UpTime</wsag:Location>\r
- </wsag:Variable>\r
- <wsag:Variable Name="Performance" Metric="xs:double">\r
- <wsag:Location>qos:Performance</wsag:Location>\r
- </wsag:Variable>\r
- </wsag:VariableSet>\r
- </wsag:ServiceProperties>\r
-\r
- <!-- Uptime GuaranteTerm-->\r
- <wsag:GuaranteeTerm Name="GT_UpTime">\r
- <wsag:ServiceScope ServiceName="sla:virtualwall" />\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>UpTime</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "UpTime GT 0.99"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
-\r
- <!-- Resource Performance GuaranteTerm-->\r
- <wsag:GuaranteeTerm Name="GT_Performance">\r
- <wsag:ServiceScope ServiceName="sla:virtualwall" />\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>Performance</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "Performance GT 0.99"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- </wsag:All>\r
- </wsag:Terms>\r
-</wsag:Agreement>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<wsag:Agreement xmlns:wsag="http://www.ggf.org/namespaces/ws-agreement"\r
- AgreementId="agreement04">\r
-\r
- <wsag:Name>ExampleAgreement</wsag:Name>\r
- <wsag:Context>\r
- <wsag:AgreementInitiator>experimenter01</wsag:AgreementInitiator>\r
- <wsag:AgreementResponder>wiLab2</wsag:AgreementResponder>\r
- <wsag:ServiceProvider>AgreementResponder</wsag:ServiceProvider>\r
- <wsag:ExpirationTime>2014-03-07T12:00:00</wsag:ExpirationTime>\r
- <wsag:TemplateId>template</wsag:TemplateId>\r
- <sla:Service xmlns:sla="http://sla.atos.eu">Testbed_guarantee_0.99_Uptime_rate_for_0.99_rate_of_the_resources_during_the_sliver</sla:Service>\r
- </wsag:Context>\r
- <wsag:Terms>\r
- <wsag:All>\r
- \r
- <wsag:ServiceProperties Name="ServiceProperties" ServiceName="ServiceName">\r
- <wsag:VariableSet>\r
- <wsag:Variable Name="UpTime" Metric="xs:double">\r
- <wsag:Location>qos:UpTime</wsag:Location>\r
- </wsag:Variable>\r
- <wsag:Variable Name="Performance" Metric="xs:double">\r
- <wsag:Location>qos:Performance</wsag:Location>\r
- </wsag:Variable>\r
- </wsag:VariableSet>\r
- </wsag:ServiceProperties>\r
-\r
- <!-- Uptime GuaranteTerm-->\r
- <wsag:GuaranteeTerm Name="GT_UpTime">\r
- <wsag:ServiceScope ServiceName="sla:wiLab2" />\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>UpTime</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "UpTime GT 0.99"}\r
- </wsag:CustomServiceLevel> \r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
-\r
- <!-- Resource Performance GuaranteTerm-->\r
- <wsag:GuaranteeTerm Name="GT_Performance">\r
- <wsag:ServiceScope ServiceName="sla:wiLab2" />\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>Performance</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "Performance GT 0.99"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- </wsag:All>\r
- </wsag:Terms>\r
-</wsag:Agreement>\r
+++ /dev/null
-<enforcement_job>
- <agreement_id>agreement03</agreement_id>
- <enabled>false</enabled>
-</enforcement_job>
+++ /dev/null
-<enforcement_job>
- <agreement_id>agreement04</agreement_id>
- <enabled>false</enabled>
-</enforcement_job>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<wsag:Agreement xmlns:wsag="http://www.ggf.org/namespaces/ws-agreement">\r
- <wsag:Name>ExampleAgreement</wsag:Name>\r
- <wsag:Context>\r
- <wsag:AgreementInitiator>RandomClient</wsag:AgreementInitiator>\r
- <wsag:AgreementResponder>Provider01</wsag:AgreementResponder>\r
- <!-- The AgreementResponder (in this case) is mandatory if sla is multi \r
- service provider -->\r
- <wsag:ServiceProvider>AgreementResponder</wsag:ServiceProvider>\r
- <wsag:ExpirationTime>2014-03-07T12:00</wsag:ExpirationTime>\r
- <wsag:TemplateId>contract-template-2007-12-04</wsag:TemplateId>\r
- </wsag:Context>\r
- <wsag:Terms>\r
- <wsag:All>\r
- <!-- FUNCTIONAL DESCRIPTION -->\r
- <!-- <wsag:ServiceDescriptionTerm wsag:Name="SDTName" wsag:ServiceName="ServiceName"> \r
- DSL expression </wsag:ServiceDescriptionTerm> -->\r
-\r
- <!-- OPTIONAL SERVICE REFERENCE -->\r
-\r
- <!-- OPTIONAL SERVICE PROPERTIES : non funcional properties -->\r
- <wsag:ServiceProperties wsag:Name="NonFunctional"\r
- wsag:ServiceName="ServiceName">\r
- <wsag:Variables>\r
- <wsag:Variable wsag:Name="ResponseTime" wsag:Metric="xs:double">\r
- <wsag:Location>qos:ResponseTime</wsag:Location>\r
- </wsag:Variable>\r
- </wsag:Variables>\r
- </wsag:ServiceProperties>\r
- <wsag:GuaranteeTerm wsag:Name="GT_ResponseTime">\r
- <wsag:ServiceScope wsag:ServiceName="ServiceName" />\r
- <!-- The qualifying conditions that must be met before the guarantee \r
- is evaluated -->\r
- <!-- <wsag:QualifyingCondition>state EQ 'ready'</wsag:QualifyingCondition> -->\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>ResponseTime</wsag:KPIName> <!-- same name as property for the moment -->\r
- <wsag:CustomServiceLevel>{"contraint" : "ResponseTime LT 100"}</wsag:CustomServiceLevel> <!-- the ServiceProperty is referenced here -->\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- </wsag:All>\r
- </wsag:Terms>\r
-</wsag:Agreement>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<wsag:Agreement xmlns:wsag="http://www.ggf.org/namespaces/ws-agreement"\r
- AgreementId="agreement02">\r
-\r
- <wsag:Name>ExampleAgreement</wsag:Name>\r
- <wsag:Context>\r
- <wsag:AgreementInitiator>RandomClient</wsag:AgreementInitiator>\r
- <wsag:AgreementResponder>provider-prueba</wsag:AgreementResponder>\r
- <!--\r
- The AgreementResponder (in this case) is mandatory if sla is multi service provider \r
- -->\r
- <wsag:ServiceProvider>AgreementResponder</wsag:ServiceProvider>\r
- <wsag:ExpirationTime>2014-03-07T12:00:00</wsag:ExpirationTime>\r
- <wsag:TemplateId>template02</wsag:TemplateId>\r
- </wsag:Context>\r
- <wsag:Terms>\r
- <wsag:All>\r
- <!-- FUNCTIONAL DESCRIPTION -->\r
- <wsag:ServiceDescriptionTerm Name="SDTName1" ServiceName="ServiceName">\r
- DSL expression\r
- </wsag:ServiceDescriptionTerm>\r
- <wsag:ServiceDescriptionTerm Name="SDTName2" ServiceName="ServiceName">\r
- DSL expression\r
- </wsag:ServiceDescriptionTerm>\r
- \r
- <!-- OPTIONAL SERVICE REFERENCE -->\r
- \r
- <!-- OPTIONAL SERVICE PROPERTIES : non funcional properties-->\r
- <wsag:ServiceProperties Name="NonFunctional" ServiceName="ServiceName">\r
- <wsag:VariableSet>\r
- <wsag:Variable Name="ResponseTime" Metric="xs:double">\r
- <wsag:Location>qos:ResponseTime</wsag:Location>\r
- </wsag:Variable>\r
- <wsag:Variable Name="Performance" Metric="xs:double">\r
- <wsag:Location>qos:Performance</wsag:Location>\r
- </wsag:Variable>\r
- </wsag:VariableSet>\r
- </wsag:ServiceProperties>\r
- <wsag:GuaranteeTerm Name="GT_ResponseTime">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <!-- The qualifying conditions that must be met before the guarantee is evaluated -->\r
- <!-- \r
- <wsag:QualifyingCondition>state EQ 'ready'</wsag:QualifyingCondition>\r
- -->\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>ResponseTime</wsag:KPIName> <!-- same name as property for the moment -->\r
- <wsag:CustomServiceLevel>{"constraint" : "ResponseTime LT 0.9"}</wsag:CustomServiceLevel> <!-- the ServiceProperty is referenced here -->\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- <wsag:GuaranteeTerm Name="GT_Performance">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>Performance</wsag:KPIName> <!-- same name as property for the moment -->\r
- <wsag:CustomServiceLevel>{"constraint" : "Performance GT 0.1"}</wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- <wsag:BusinessValueList>\r
- <wsag:Importante>3</wsag:Importante> <!-- optional importance (integer) -->\r
- <wsag:Penalty>\r
- <wsag:AssessmentInterval>\r
- <wsag:Count>10</wsag:Count>\r
- </wsag:AssessmentInterval>\r
- <wsag:ValueUnit>EUR</wsag:ValueUnit>\r
- <wsag:ValueExpression>99</wsag:ValueExpression>\r
- </wsag:Penalty>\r
- \r
- <wsag:Reward></wsag:Reward>\r
- <wsag:Preference></wsag:Preference>\r
- <wsag:CustomBusinessValue></wsag:CustomBusinessValue>\r
- </wsag:BusinessValueList>\r
- </wsag:GuaranteeTerm>\r
- </wsag:All>\r
- </wsag:Terms>\r
-</wsag:Agreement>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<wsag:Agreement xmlns:wsag="http://www.ggf.org/namespaces/ws-agreement"\r
- AgreementId="agreement03">\r
-\r
- <wsag:Name>ExampleAgreement</wsag:Name>\r
- <wsag:Context>\r
- <wsag:AgreementInitiator>experimenter01</wsag:AgreementInitiator>\r
- <wsag:AgreementResponder>virtualwall</wsag:AgreementResponder>\r
- <wsag:ServiceProvider>AgreementResponder</wsag:ServiceProvider>\r
- <wsag:ExpirationTime>2014-03-07T12:00:00</wsag:ExpirationTime>\r
- <wsag:TemplateId>template02</wsag:TemplateId>\r
- <sla:Service xmlns:sla="http://sla.atos.eu">Testbed_guarantee_0.75_Uptime_rate_for_0.8_rate_of_the_resources_during_the_sliver</sla:Service>\r
- </wsag:Context>\r
- <wsag:Terms>\r
- <wsag:All>\r
- <!--\r
- <wsag:ServiceDescriptionTerm Name="SDTName1" ServiceName="ServiceName">\r
- { "servicename": "service-prueba" }\r
- </wsag:ServiceDescriptionTerm>\r
- -->\r
- <wsag:ServiceProperties Name="ServiceProperties" ServiceName="ServiceName">\r
- <wsag:VariableSet>\r
- <wsag:Variable Name="ResponseTime" Metric="xs:double">\r
- <wsag:Location>service-prueba/ResponseTime</wsag:Location>\r
- </wsag:Variable>\r
- <wsag:Variable Name="Performance" Metric="xs:double">\r
- <wsag:Location>service-prueba/Performance</wsag:Location>\r
- </wsag:Variable>\r
- </wsag:VariableSet>\r
- </wsag:ServiceProperties>\r
- <wsag:GuaranteeTerm Name="GT_ResponseTime">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>ResponseTime</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "ResponseTime BETWEEN (0, 200)"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- <wsag:GuaranteeTerm Name="GT_Performance">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>Performance</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "Performance BETWEEN (0.1,1)"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- </wsag:All>\r
- </wsag:Terms>\r
-</wsag:Agreement>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<wsag:Agreement xmlns:wsag="http://www.ggf.org/namespaces/ws-agreement"\r
- AgreementId="agreement04">\r
-\r
- <wsag:Name>ExampleAgreement</wsag:Name>\r
- <wsag:Context>\r
- <wsag:AgreementInitiator>experimenter01</wsag:AgreementInitiator>\r
- <wsag:AgreementResponder>wiLab2</wsag:AgreementResponder>\r
- <wsag:ServiceProvider>AgreementResponder</wsag:ServiceProvider>\r
- <wsag:ExpirationTime>2014-03-07T12:00:00</wsag:ExpirationTime>\r
- <wsag:TemplateId>template02</wsag:TemplateId>\r
- <sla:Service xmlns:sla="http://sla.atos.eu">Testbed_guarantee_0.80_uptime_rate_for_0.75_rate_of_the_resources_during_the_sliver</sla:Service>\r
- </wsag:Context>\r
- <wsag:Terms>\r
- <wsag:All>\r
- <wsag:ServiceProperties Name="ServiceProperties" ServiceName="ServiceName">\r
- <wsag:VariableSet>\r
- <wsag:Variable Name="metric1" Metric="xs:double">\r
- <wsag:Location>metric1</wsag:Location>\r
- </wsag:Variable>\r
- <wsag:Variable Name="metric2" Metric="xs:double">\r
- <wsag:Location>metric2</wsag:Location>\r
- </wsag:Variable>\r
- <wsag:Variable Name="metric3" Metric="xs:double">\r
- <wsag:Location>metric3</wsag:Location>\r
- </wsag:Variable>\r
- </wsag:VariableSet>\r
- </wsag:ServiceProperties>\r
- <wsag:GuaranteeTerm Name="GT_Metric1">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>metric1</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "metric1 BETWEEN (0.1, 1)"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- <wsag:GuaranteeTerm Name="GT_Metric2">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>metric2</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "metric2 BETWEEN (0.15, 1)"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- <wsag:GuaranteeTerm Name="GT_Metric3">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>metric3</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "metric3 BETWEEN (0.2, 1)"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- </wsag:All>\r
- </wsag:Terms>\r
-</wsag:Agreement>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<wsag:Agreement xmlns:wsag="http://www.ggf.org/namespaces/ws-agreement"\r
- AgreementId="agreement05">\r
-\r
- <wsag:Name>ExampleAgreement</wsag:Name>\r
- <wsag:Context>\r
- <wsag:AgreementInitiator>client-prueba</wsag:AgreementInitiator>\r
- <wsag:AgreementResponder>f4c993580-03fe-41eb-8a21-a56709f9370f</wsag:AgreementResponder>\r
- <wsag:ServiceProvider>AgreementResponder</wsag:ServiceProvider>\r
- <wsag:ExpirationTime>2014-03-07T12:00:00</wsag:ExpirationTime>\r
- <wsag:TemplateId>template02</wsag:TemplateId>\r
- <sla:Service xmlns:sla="http://sla.atos.eu">service5</sla:Service>\r
- </wsag:Context>\r
- <wsag:Terms>\r
- <wsag:All>\r
- <wsag:ServiceProperties Name="ServiceProperties" ServiceName="ServiceName">\r
- <wsag:VariableSet>\r
- <wsag:Variable Name="metric1" Metric="xs:double">\r
- <wsag:Location>metric1</wsag:Location>\r
- </wsag:Variable>\r
- <wsag:Variable Name="metric2" Metric="xs:double">\r
- <wsag:Location>metric2</wsag:Location>\r
- </wsag:Variable>\r
- <wsag:Variable Name="metric3" Metric="xs:double">\r
- <wsag:Location>metric3</wsag:Location>\r
- </wsag:Variable>\r
- <wsag:Variable Name="metric4" Metric="xs:double">\r
- <wsag:Location>metric4</wsag:Location>\r
- </wsag:Variable>\r
- </wsag:VariableSet>\r
- </wsag:ServiceProperties>\r
- <wsag:GuaranteeTerm Name="GT_Metric1">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>metric1</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "metric1 BETWEEN (0.05, 1)"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- <wsag:GuaranteeTerm Name="GT_Metric2">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>metric2</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "metric2 BETWEEN (0.1, 1)"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- <wsag:GuaranteeTerm Name="GT_Metric3">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>metric3</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "metric3 BETWEEN (0.15, 1)"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- <wsag:GuaranteeTerm Name="GT_Metric4">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>metric4</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "metric4 BETWEEN (0.2, 1)"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- </wsag:All>\r
- </wsag:Terms>\r
-</wsag:Agreement>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<wsag:Agreement xmlns:wsag="http://www.ggf.org/namespaces/ws-agreement"\r
- AgreementId="agreement05">\r
-\r
- <wsag:Name>ExampleAgreement</wsag:Name>\r
- <wsag:Context>\r
- <wsag:AgreementInitiator>experimenter01</wsag:AgreementInitiator>\r
- <wsag:AgreementResponder>virtualwall</wsag:AgreementResponder>\r
- <wsag:ServiceProvider>AgreementResponder</wsag:ServiceProvider>\r
- <wsag:ExpirationTime>2014-03-07T12:00:00</wsag:ExpirationTime>\r
- <wsag:TemplateId>template02</wsag:TemplateId>\r
- <sla:Service xmlns:sla="http://sla.atos.eu">service5</sla:Service>\r
- </wsag:Context>\r
- <wsag:Terms>\r
- <wsag:All>\r
- <wsag:ServiceProperties Name="ServiceProperties" ServiceName="ServiceName">\r
- <wsag:VariableSet>\r
- <wsag:Variable Name="metric1" Metric="xs:double">\r
- <wsag:Location>metric1</wsag:Location>\r
- </wsag:Variable>\r
- <wsag:Variable Name="metric2" Metric="xs:double">\r
- <wsag:Location>metric2</wsag:Location>\r
- </wsag:Variable>\r
- <wsag:Variable Name="metric3" Metric="xs:double">\r
- <wsag:Location>metric3</wsag:Location>\r
- </wsag:Variable>\r
- <wsag:Variable Name="metric4" Metric="xs:double">\r
- <wsag:Location>metric4</wsag:Location>\r
- </wsag:Variable>\r
- </wsag:VariableSet>\r
- </wsag:ServiceProperties>\r
- <wsag:GuaranteeTerm Name="GT_Metric1">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>metric1</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "metric1 BETWEEN (0.05, 1)"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- <wsag:GuaranteeTerm Name="GT_Metric2">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>metric2</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "metric2 BETWEEN (0.1, 1)"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- <wsag:GuaranteeTerm Name="GT_Metric3">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>metric3</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "metric3 BETWEEN (0.15, 1)"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- <wsag:GuaranteeTerm Name="GT_Metric4">\r
- <wsag:ServiceScope ServiceName="ServiceName"/>\r
- <wsag:ServiceLevelObjective>\r
- <wsag:KPITarget>\r
- <wsag:KPIName>metric4</wsag:KPIName>\r
- <wsag:CustomServiceLevel>\r
- {"constraint" : "metric4 BETWEEN (0.2, 1)"}\r
- </wsag:CustomServiceLevel>\r
- </wsag:KPITarget>\r
- </wsag:ServiceLevelObjective>\r
- </wsag:GuaranteeTerm>\r
- </wsag:All>\r
- </wsag:Terms>\r
-</wsag:Agreement>\r
+++ /dev/null
-<enforcement_job>
- <agreement_id>agreement04</agreement_id>
- <enabled>false</enabled>
-</enforcement_job>
+++ /dev/null
-<enforcement_job>
- <agreement_id>agreement02</agreement_id>
- <enabled>true</enabled>
-</enforcement_job>
+++ /dev/null
-<enforcement_job>
- <agreement_id>agreement05</agreement_id>
- <enabled>true</enabled>
-</enforcement_job>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-From http://serviceqos.wikispaces.com/WSAgExample
- -->
-<wsag:Template xmlns:wsag="http://www.ggf.org/namespaces/ws-agreement" TemplateId="contract-template-2007-12-04">
- <wsag:Name>ExampleTemplate</wsag:Name>
- <wsag:Context>
- <wsag:AgreementInitiator>Provider</wsag:AgreementInitiator>
- <wsag:ServiceProvider>AgreementInitiator</wsag:ServiceProvider>
- <wsag:ExpirationTime>2013-12-15-1200</wsag:ExpirationTime>
- <wsag:TemplateId>contract-template-2013-12-15</wsag:TemplateId>
- </wsag:Context>
- <wsag:Terms>
- <wsag:All>
- <!-- functional description -->
- <wsag:ServiceDescriptionTerm
- wsag:Name="General"
- wsag:ServiceName="Service0001">
- A GPS service
- </wsag:ServiceDescriptionTerm>
- <wsag:ServiceDescriptionTerm
- wsag:Name="GetCoordsOperation"
- wsag:ServiceName="GPSService0001">
- operation to call to get the coords
- </wsag:ServiceDescriptionTerm>
- <!-- domain specific reference to a service (additional or optional to SDT) -->
- <wsag:ServiceReference
- wsag:Name="CoordsRequest"
- wsag:ServiceName="GPSService0001">
- <wsag:EndpointReference>
- <wsag:Address>http://www.gps.com/coordsservice/getcoords</wsag:Address>
- <wsag:ServiceName>gps:CoordsRequest</wsag:ServiceName>
- </wsag:EndpointReference>
- </wsag:ServiceReference>
- <!-- non-functional properties -->
- <wsag:ServiceProperties
- wsag:Name="AvailabilityProperties"
- wsag:ServiceName="GPS0001">
- <wsag:Variables>
- <wsag:Variable
- wsag:Name="ResponseTime"
- wsag:Metric="metric:Duration">
- <wsag:Location>qos:ResponseTime</wsag:Location>
- </wsag:Variable>
- </wsag:Variables>
- </wsag:ServiceProperties>
- <wsag:ServiceProperties
- wsag:Name="UsabilityProperties"
- wsag:ServiceName="GPS0001">
- <wsag:Variables>
- <wsag:Variable
- wsag:Name="CoordDerivation"
- wsag:Metric="metric:CoordDerivationMetric">
- <wsag:Location>qos:CoordDerivation</wsag:Location>
- </wsag:Variable>
- </wsag:Variables>
- </wsag:ServiceProperties>
- <!-- statements to offered service level(s) -->
- <wsag:GuaranteeTerm
- Name="FastReaction" Obligated="ServiceProvider">
- <wsag:ServiceScope ServiceName="GPS0001">
- http://www.gps.com/coordsservice/getcoords
- </wsag:ServiceScope>
- <wsag:QualifyingCondition>
- applied when current time in week working hours
- </wsag:QualifyingCondition>
- <wsag:ServiceLevelObjective>
- <wsag:KPITarget>
- <wsag:KPIName>FastResponseTime</wsag:KPIName>
- <wsag:Target>
- //Variable/@Name="ResponseTime" LOWERTHAN 1 second
- </wsag:Target>
- </wsag:KPITarget>
- </wsag:ServiceLevelObjective>
- </wsag:GuaranteeTerm>
- </wsag:All>
- </wsag:Terms>
-</wsag:Template>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<provider>
- <uuid>virtualwall</uuid>
- <name>virtualwall</name>
-</provider>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<provider>
- <uuid>wiLab2</uuid>
- <name>wiLab2</name>
-</provider>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<wsag:Template xmlns:wsag="http://www.ggf.org/namespaces/ws-agreement"
- TemplateId="template">
- <wsag:Name>ExampleTemplate2</wsag:Name>
- <wsag:Context>
- <wsag:ExpirationTime>2014-03-07T12:00:00:000</wsag:ExpirationTime>
- </wsag:Context>
- <wsag:Terms>
- <wsag:All>
- <!-- FUNCTIONAL DESCRIPTION -->
- <wsag:ServiceDescriptionTerm wsag:Name="SDTName1" wsag:ServiceName="ServiceName">
- DSL expression
- </wsag:ServiceDescriptionTerm>
- <wsag:ServiceDescriptionTerm wsag:Name="SDTName2" wsag:ServiceName="ServiceName">
- DSL expression
- </wsag:ServiceDescriptionTerm>
-
- <!-- OPTIONAL SERVICE REFERENCE -->
-
- <!-- OPTIONAL SERVICE PROPERTIES : non funcional properties-->
- <wsag:ServiceProperties wsag:Name="NonFunctional" wsag:ServiceName="ServiceName">
- <wsag:Variables>
- <wsag:Variable wsag:Name="ResponseTime" wsag:Metric="xs:double">
- <wsag:Location>qos:ResponseTime</wsag:Location>
- </wsag:Variable>
- <wsag:Variable wsag:Name="Performance" wsag:Metric="xs:double">
- <wsag:Location>qos:Performance</wsag:Location>
- </wsag:Variable>
- </wsag:Variables>
- </wsag:ServiceProperties>
- <wsag:GuaranteeTerm wsag:Name="GT_ResponseTime">
- <wsag:ServiceScope wsag:ServiceName="ServiceName"/>
- <!-- The qualifying conditions that must be met before the guarantee is evaluated -->
- <!--
- <wsag:QualifyingCondition>state EQ 'ready'</wsag:QualifyingCondition>
- -->
- <wsag:ServiceLevelObjective>
- <wsag:KPITarget>
- <wsag:KPIName>ResponseTime</wsag:KPIName> <!-- same name as property for the moment -->
- <wsag:CustomServiceLevel>{"constraint" : "ResponseTime LT qos:ResponseTime"}</wsag:CustomServiceLevel> <!-- the ServiceProperty is referenced here -->
- </wsag:KPITarget>
- </wsag:ServiceLevelObjective>
- </wsag:GuaranteeTerm>
- <wsag:GuaranteeTerm wsag:Name="GT_Performance">
- <wsag:ServiceScope wsag:ServiceName="ServiceName"/>
- <wsag:ServiceLevelObjective>
- <wsag:KPITarget>
- <wsag:KPIName>Performance</wsag:KPIName> <!-- same name as property for the moment -->
- <wsag:CustomServiceLevel>{"constraint" : "Performance GT qos:Performance"}</wsag:CustomServiceLevel>
- </wsag:KPITarget>
- </wsag:ServiceLevelObjective>
- <wsag:BusinessValueList>
- <wsag:Importante>3</wsag:Importante> <!-- optional importance (integer) -->
- <wsag:Penalty>
- <wsag:AssessmentInterval>
- <wsag:Count>10</wsag:Count>
- </wsag:AssessmentInterval>
- <wsag:ValueUnit>EUR</wsag:ValueUnit>
- <wsag:ValueExpression>99</wsag:ValueExpression>
- </wsag:Penalty>
-
- <wsag:Reward></wsag:Reward>
- <wsag:Preference></wsag:Preference>
- <wsag:CustomBusinessValue></wsag:CustomBusinessValue>
- </wsag:BusinessValueList>
- </wsag:GuaranteeTerm>
- </wsag:All>
- </wsag:Terms>
-</wsag:Template>
import requests
from requests.auth import HTTPBasicAuth
+from myslice.settings import logger
import xmlconverter
import wsag_model
_VIOLATIONS_PATH = "violations"
_ENFORCEMENTJOBS_PATH = "enforcements"
-rooturl = settings.SLA_MANAGER_URL
+rooturl = settings.SLA_COLLECTOR_URL
class Factory(object):
@staticmethod
- def agreements(path=_AGREEMENTS_PATH):
+ def agreements():
"""Returns a REST client for Agreements
:rtype : Agreements
"""
- return Agreements(rooturl, path)
+ return Agreements(rooturl)
@staticmethod
def providers():
c = Client("http://localhost:8080/service")
c.get("/resource", headers = { "accept": "application/json" })
"""
- url = _buildpath_(self.rooturl, path)
+ url = _buildpath(self.rooturl, path)
if "testbed" in kwargs:
url = url + "?testbed=" + kwargs["testbed"]
if "headers" not in kwargs:
kwargs["headers"] = {"accept": "application/xml"}
- kwargs["auth"] = HTTPBasicAuth(settings.SLA_MANAGER_USER,
- settings.SLA_MANAGER_PASSWORD)
+
+ kwargs["auth"] = HTTPBasicAuth(settings.SLA_COLLECTOR_USER,
+ settings.SLA_COLLECTOR_PASSWORD)
# for key, values in kwargs.iteritems():
# print key, values
+ logger.debug('SLA GET {}'.format(url))
result = requests.get(url, **kwargs)
- print "GET {} {} {}".format(
- result.url, result.status_code, result.text[0:70])
- print result.encoding
+ logger.debug('SLA GET {} - result: {}'.format(result.url, result.status_code))
+ # print "GET {} {} {}".format(
+ # result.url, result.status_code, result.text[0:70])
+ # print result.encoding
return result
}
)
"""
- url = _buildpath_(self.rooturl, path)
+ url = _buildpath(self.rooturl, path)
if "testbed" in kwargs:
url = url + "?testbed=" + kwargs["testbed"]
+ del kwargs["testbed"]
if "headers" not in kwargs:
kwargs["headers"] = {"accept": "application/xml",
"content-type": "application/xml"}
kwargs["auth"] = HTTPBasicAuth(settings.SLA_MANAGER_USER,
- settings.SLA_MANAGER_PASSWORD)
+ settings.SLA_MANAGER_PASSWORD)
result = requests.post(url, data, **kwargs)
location = result.headers["location"] \
resource = _Resource._processresult(r, self.converter)
return resource, r
- def get(self, path, params):
+ def get(self, path="", params={}):
"""Generic query over resource: GET /resource?q1=v1&q2=v2...
:param dict[str,str] params: values to pass as get parameters
"""
- if path is None:
- path = ""
r = self.client.get(path, params=params)
resources = self._processresult(r, self.listconverter)
The final url to the resource is root_url + "/" + path
"""
- resourceurl = _buildpath_(root_url, path)
- converter = xmlconverter.AgreementConverter()
- self.res = _Resource(resourceurl, converter)
+ self.resourceurl = _buildpath(root_url, path)
+ self.converter = xmlconverter.AgreementConverter()
+ self.res = _Resource(self.resourceurl, self.converter)
def getall(self):
"""
:param str agreementid :
:rtype : wsag_model.AgreementStatus
"""
- path = _buildpath_(_AGREEMENTS_PATH, agreementid, "guaranteestatus")
+ # path = _buildpath(_AGREEMENTS_PATH, agreementid, "guaranteestatus")
+ path = _buildpath(agreementid, "guaranteestatus")
r = self.res.client.get(path, headers={'accept': 'application/json'},
params={'testbed': testbed})
json_obj = r.json()
-
status = wsag_model.AgreementStatus.json_decode(json_obj)
return status, r
:rtype : list[wsag_model.Agreement]
"""
- return self.res.get(slicename, dict())
+ self.resourceurl = _buildpath(rooturl, 'slice')
+ self.res = _Resource(self.resourceurl, self.converter)
+ return self.res.get(slicename)
def create(self, agreement, testbed):
"""Create a new agreement
The final url to the resource is root_url + "/" + path
"""
- resourceurl = _buildpath_(root_url, path)
+ resourceurl = _buildpath(root_url, path)
converter = xmlconverter.AgreementConverter()
self.res = _Resource(resourceurl, converter)
The final url to the resource is root_url + "/" + path
"""
- resourceurl = _buildpath_(root_url, path)
+ resourceurl = _buildpath(root_url, path)
converter = xmlconverter.ProviderConverter()
self.res = _Resource(resourceurl, converter)
The final url to the resource is root_url + "/" + path
"""
- resourceurl = _buildpath_(root_url, path)
+ resourceurl = _buildpath(root_url, path)
converter = xmlconverter.ViolationConverter()
self.res = _Resource(resourceurl, converter)
The final url to the resource is root_url + "/" + path
"""
- resourceurl = _buildpath_(root_url, path)
+ resourceurl = _buildpath(root_url, path)
converter = xmlconverter.EnforcementConverter()
self.res = _Resource(resourceurl, converter)
return self.res.getbyid(agreement_id, params={"testbed": testbed})
-def _buildpath_(*paths):
+def _buildpath(*paths):
if "" in paths:
paths = [path for path in paths if path != ""]
s = "<GuaranteeTermStatus(name='{}' status='{}')>"
return s.format(self.name, self.status)
- def __init__(self):
+ def __init__(self, lst=None):
self.agreement_id = ""
self.guaranteestatus = ""
- self.guaranteeterms = []
+ if lst is None:
+ self.guaranteeterms = []
+ else:
+ self.guaranteeterms = lst
def __repr__(self):
return (
c.convert(root.getroot())
"""
+from myslice.settings import logger
try:
# Much faster and lighter library (C implementation)
:rtype: wsag_model.Agreement
"""
for name, value in xmlroot.attrib.items():
- print '{0}="{1}"'.format(name, value)
+ logger.debug('SLA xmlconverter: {} = {}'.format(name, value))
+ # print '{0}="{1}"'.format(name, value)
if xmlroot.tag in self.agreement_tags:
result = Agreement()
nss = self._namespaces
for element in elements:
servicename = _get_attribute(element, "ServiceName")
- for var in element.findall("wsag:Variables/wsag:Variable", nss):
+ for var in element.findall("wsag:VariableSet/wsag:Variable", nss):
key, value = self._parse_property(var, servicename)
result[key] = value
+from __future__ import print_function
+
# this somehow is not used anymore - should it not be ?
+import ast
+from datetime import datetime
+import pytz
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.shortcuts import render
from django import forms
+import re
-from unfold.loginrequired import FreeAccessView
+from unfold.loginrequired import LoginRequiredView, FreeAccessView
from unfold.page import Page
from sla.slaclient import restclient
from sla.slaclient import wsag_model
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
import slaclient.service.fed4fire.fed4fireservice as fed4fireservice
-from rest_framework.views import APIView
from django.http import HttpResponse
-import json
-import traceback
-import re
-from math import ceil
-from datetime import datetime
-from dateutil.relativedelta import relativedelta
-from dateutil.tz import tzlocal
-from django.conf import settings
-
-
-class Rol:
- CONSUMER = "CONSUMER"
- PROVIDER = "PROVIDER"
-
-
-class AgreementsFilter(object):
- def __init__(self, status=None, provider=None, consumer=None):
- self.status = status
- self.provider = provider
- self.consumer = consumer
-
- def __repr__(self):
- return "<AgreementsFilter(status={}, provider={}, consumer={})>".format(
- self.status, self.provider, self.consumer
- )
-
- @staticmethod
- def _check(expectedvalue, actualvalue):
- if expectedvalue is None or expectedvalue == '':
- return True
- else:
- return actualvalue == expectedvalue
-
- def check(self, agreement):
- """Check if this agreement satisfy the filter.
-
- The agreement must be previously annotated
- """
- guaranteestatus = agreement.guaranteestatus
- provider = agreement.context.provider
- consumer = agreement.context.consumer
- return (
- AgreementsFilter._check(self.status, guaranteestatus) and
- AgreementsFilter._check(self.provider, provider) and
- AgreementsFilter._check(self.consumer, consumer)
- )
-
-
-class FilterForm(forms.Form):
- _attrs = {'class': 'form-control'}
- exclude = ()
- status = forms.ChoiceField(
- choices=[
- ('', 'All'),
- (wsag_model.AgreementStatus.StatusEnum.FULFILLED, 'Fulfilled'),
- (wsag_model.AgreementStatus.StatusEnum.VIOLATED, 'Violated'),
- (wsag_model.AgreementStatus.StatusEnum.NON_DETERMINED, 'Non determined')],
- widget=forms.Select(attrs=_attrs),
- required=False
- )
- provider = forms.CharField(
- widget=forms.TextInput(attrs=_attrs),
- required=False
- )
- consumer = forms.CharField(
- widget=forms.TextInput(attrs=_attrs),
- required=False
- )
-
-
-class SLAView (FreeAccessView, ThemeView):
+from myslice.settings import logger, SLA_COLLECTOR_URL
+
+
+# class AgreementsFilter(object):
+# def __init__(self, status=None, provider=None, consumer=None):
+# self.status = status
+# self.provider = provider
+# self.consumer = consumer
+#
+# def __repr__(self):
+# return "<AgreementsFilter(status={}, provider={}, consumer={})>".format(
+# self.status, self.provider, self.consumer
+# )
+#
+# @staticmethod
+# def _check(expectedvalue, actualvalue):
+# if expectedvalue is None or expectedvalue == '':
+# return True
+# else:
+# return actualvalue == expectedvalue
+#
+# def check(self, agreement):
+# """Check if this agreement satisfy the filter.
+#
+# The agreement must be previously annotated
+# """
+# guaranteestatus = agreement.guaranteestatus
+# provider = agreement.context.provider
+# consumer = agreement.context.consumer
+# return (
+# AgreementsFilter._check(self.status, guaranteestatus) and
+# AgreementsFilter._check(self.provider, provider) and
+# AgreementsFilter._check(self.consumer, consumer)
+# )
+
+
+# class FilterForm(forms.Form):
+# _attrs = {'class': 'form-control'}
+# exclude = ()
+# status = forms.ChoiceField(
+# choices=[
+# ('', 'All'),
+# (wsag_model.AgreementStatus.StatusEnum.FULFILLED, 'Fulfilled'),
+# (wsag_model.AgreementStatus.StatusEnum.VIOLATED, 'Violated'),
+# (wsag_model.AgreementStatus.StatusEnum.NON_DETERMINED, 'Non determined')],
+# widget=forms.Select(attrs=_attrs),
+# required=False
+# )
+# provider = forms.CharField(
+# widget=forms.TextInput(attrs=_attrs),
+# required=False
+# )
+# consumer = forms.CharField(
+# widget=forms.TextInput(attrs=_attrs),
+# required=False
+# )
+
+
+class SLAView(FreeAccessView, ThemeView):
template_name = 'slice-tab-sla.html'
- def get (self, request, slicename, state=None):
+ def get(self, request, slicename):
+
+ page = Page(request)
- page=Page(request)
+ # logger.debug("SLA slice name: {}".format(slicename))
- consumer_id = None
+ # consumer_id = None
agreement_id = None
enforcements = {}
violations = {}
- keys = ['provider','agreement','date','status','result','ok']
+ keys = ['provider', 'agreement',
+ 'date', 'status', 'result',
+ 'ok', 'slivers']
ag_info = []
- filter_ = None
- form = FilterForm(request.GET)
- if form.is_valid():
- filter_ = _get_filter_from_form(form)
+ # filter_ = None
+ # form = FilterForm(request.GET)
+ # if form.is_valid():
+ # filter_ = _get_filter_from_form(form)
- consumer_id = _get_consumer_id(request)
+ # consumer_id = _get_consumer_id(request)
- #agreements = _get_agreements(agreement_id, consumer_id=consumer_id, filter_=filter_)
- agreements = _get_agreements(agreement_id, slice=slicename)
+ # agreements = _get_agreements(agreement_id, consumer_id=consumer_id, filter_=filter_)
+ agreements = _get_agreements_by_slice(slicename)
for agreement in agreements:
row = []
provider = agreement.context.provider
- row.append(provider) # Provider
- row.append(agreement) # Agreement
- row.append(agreement.context.time_formatted()) # Date
+ row.append(provider) # Provider
+ row.append(agreement) # Agreement
+ row.append(agreement.context.time_formatted()) # Date
enf = _get_enforcement(agreement.agreement_id, provider)
+ logger.debug("SLA AAAAA: {}".format(agreement.guaranteestatus))
if enf.enabled == 'true':
- row.append('Evaluating') # Status
- row.append('') # Result
- row('') # Ok
+ row.append('Evaluating') # Status
+ row.append('') # Result
+ row.append('') # Ok
else:
if agreement.guaranteestatus == "NON_DETERMINED":
- row.append('Provisioned') # Status
- row.append('') # Result
- row.append('') # Ok
-
+ row.append('Provisioned') # Status
+ row.append('') # Result
+ row.append('') # Ok
+
else:
- row.append('Finished') # Status
+ row.append('Finished') # Status
violations_list = _get_agreement_violations(agreement.agreement_id, provider, "GT_Performance")
-
+
if len(violations_list) > 0:
- value = '%.2f'%float(violations_list[0].actual_value)
- row.append('%d'%(float(value)*100)) # Result
+ value = '%.2f' % float(violations_list[0].actual_value)
+ row.append('%d' % (float(value) * 100)) # Result
else:
- row.append('100') # Result
+ row.append('100') # Result
if agreement.guaranteestatus == "VIOLATED":
- row.append('false') # Ok
+ row.append('false') # Ok
if agreement.guaranteestatus == "FULFILLED":
- row.append('true') # Ok
+ row.append('true') # Ok
- ag_info.append(dict(zip(keys,row)))
+ for _, terms in agreement.guaranteeterms.items():
+ try:
+ s = ast.literal_eval(terms.scopes[0].scope.lstrip())
+ logger.debug('SLA scope: {}'.format(s))
+ row.append(s)
+ break
+ except Exception as e:
+ logger.debug("SLA EXCEPTION: {}".format(e.message))
+
+ ag_info.append(dict(zip(keys, row)))
template_env = {}
- # write something of our own instead
- # more general variables expected in the template
+ # write something of our own instead
+ # more general variables expected in the template
template_env['title'] = 'SLA Agreements'
template_env['agreements'] = agreements
template_env['username'] = request.user
template_env['last_violation_list'] = violations
template_env['ag_info'] = ag_info
-
- # the prelude object in page contains a summary of the requirements() for all plugins
- # define {js,css}_{files,chunks}
+ # the prelude object in page contains a summary of the requirements() for all plugins
+ # define {js,css}_{files,chunks}
prelude_env = page.prelude_env()
template_env.update(prelude_env)
return render_to_response(self.template_name, template_env, context_instance=RequestContext(request))
-class AgreementsFilter(object):
- def __init__(self, status=None, provider=None, consumer=None):
- self.status = status
- self.provider = provider
- self.consumer = consumer
-
- def __repr__(self):
- return "<AgreementsFilter(status={}, provider={}, consumer={})>".format(
- self.status, self.provider, self.consumer
- )
-
- @staticmethod
- def _check(expectedvalue, actualvalue):
- if expectedvalue is None or expectedvalue == '':
- return True
- else:
- return actualvalue == expectedvalue
-
- def check(self, agreement):
- """Check if this agreement satisfy the filter.
-
- The agreement must be previously annotated
- """
- guaranteestatus = agreement.guaranteestatus
- provider = agreement.context.provider
- consumer = agreement.context.consumer
- return (
- AgreementsFilter._check(self.status, guaranteestatus) and
- AgreementsFilter._check(self.provider, provider) and
- AgreementsFilter._check(self.consumer, consumer)
- )
-
-
-class ContactForm(forms.Form):
- subject = forms.CharField(max_length=100)
- message = forms.CharField()
- sender = forms.EmailField()
- cc_myself = forms.BooleanField(required=False)
-
-
-def _get_agreements_client(path=""):
- return restclient.Factory.agreements(path)
+# class AgreementsFilter(object):
+# def __init__(self, status=None, provider=None, consumer=None):
+# self.status = status
+# self.provider = provider
+# self.consumer = consumer
+#
+# def __repr__(self):
+# return "<AgreementsFilter(status={}, provider={}, consumer={})>".format(
+# self.status, self.provider, self.consumer
+# )
+#
+# @staticmethod
+# def _check(expectedvalue, actualvalue):
+# if expectedvalue is None or expectedvalue == '':
+# return True
+# else:
+# return actualvalue == expectedvalue
+#
+# def check(self, agreement):
+# """Check if this agreement satisfy the filter.
+#
+# The agreement must be previously annotated
+# """
+# guaranteestatus = agreement.guaranteestatus
+# provider = agreement.context.provider
+# consumer = agreement.context.consumer
+# return (
+# AgreementsFilter._check(self.status, guaranteestatus) and
+# AgreementsFilter._check(self.provider, provider) and
+# AgreementsFilter._check(self.consumer, consumer)
+# )
+
+
+# class ContactForm(forms.Form):
+# subject = forms.CharField(max_length=100)
+# message = forms.CharField()
+# sender = forms.EmailField()
+# cc_myself = forms.BooleanField(required=False)
+
+
+def _get_agreements_client():
+ return restclient.Factory.agreements()
def _get_violations_client():
return restclient.Factory.violations()
+
def _get_enforcements_client():
return restclient.Factory.enforcements()
+
def _get_consumer_id(request):
return request.user
def _get_agreement(agreement_id):
-
agreements_client = _get_agreements_client()
agreement, response = agreements_client.getbyid(agreement_id)
return agreement
-def _get_enforcement(agreement_id, testbed):
+def _get_enforcement(agreement_id, testbed):
enforcements_client = _get_enforcements_client()
enforcement, response = enforcements_client.getbyagreement(agreement_id, testbed)
return enforcement
-def _get_filter_from_form(form):
- data = form.cleaned_data
- result = AgreementsFilter(
- data["status"], data["provider"], data["consumer"])
- return result
+# def _get_filter_from_form(form):
+#
+# data = form.cleaned_data
+# result = AgreementsFilter(
+# data["status"], data["provider"], data["consumer"])
+# return result
def agreement_term_violations(request, agreement_id, guarantee_name):
-
page = Page(request)
prelude_env = page.prelude_env()
agreement = _get_agreement(agreement_id)
violations = _get_agreement_violations(agreement_id, guarantee_name)
annotator.annotate_agreement(agreement)
-
+
slicename = request.POST.get('slicename')
-
- paginator = Paginator(violations, 25) # Show 25 violations per page
+
+ paginator = Paginator(violations, 25) # Show 25 violations per page
page_num = request.GET.get('page')
-
+
try:
violation_page = paginator.page(page_num)
except PageNotAnInteger:
except EmptyPage:
# If page is out of range (e.g. 9999), deliver first page.
violation_page = paginator.page(1)
-
+
context = {
'agreement_id': agreement_id,
'guarantee_term': agreement.guaranteeterms[guarantee_name],
'slicename': slicename,
'last_violation': violations[-1].actual_value
}
-
+
context.update(prelude_env)
-
- return render_to_response ('violations_template.html', context, context_instance=RequestContext(request))
+
+ return render_to_response('violations_template.html', context, context_instance=RequestContext(request))
+
+
# return render(request, 'violations_template.html', context)
+
+# TODO Change function to class
def agreement_details(request, agreement_id):
-
page = Page(request)
prelude_env = page.prelude_env()
-
+
annotator = wsag_helper.AgreementAnnotator()
agreement = _get_agreement(agreement_id)
violations = _get_agreement_violations(agreement_id)
'status': status,
'violations_by_date': violations_by_date
}
-
- context.update(prelude_env)
-
- return render_to_response ('violations_template.html', context, context_instance=RequestContext(request))
- #return render(request, 'agreement_detail.html', context)
-def _get_agreement(agreement_id):
+ context.update(prelude_env)
- agreements_client = _get_agreements_client()
- agreement, response = agreements_client.getbyid(agreement_id)
- return agreement
+ return render_to_response('violations_template.html', context, context_instance=RequestContext(request))
+ #return render(request, 'agreement_detail.html', context)
-def _get_agreements(agreement_id, slice=None, provider_id=None, consumer_id=None, filter_=None):
+# def _get_agreements(agreement_id, slice=None, provider_id=None, consumer_id=None, filter_=None):
+#
+# agreements_client = _get_agreements_client()
+# if agreement_id is None:
+# if consumer_id is not None:
+# agreements, response = agreements_client.getbyconsumer(consumer_id)
+# elif provider_id is not None:
+# agreements, response = agreements_client.getbyprovider(provider_id)
+# elif slice is not None:
+# agreements_client = _get_agreements_client("slice")
+# agreements, response = agreements_client.getbyslice(slice)
+# else:
+# raise ValueError(
+# "Invalid values: consumer_id and provider_id are None")
+# else:
+# agreement, response = agreements_client.getbyid(agreement_id)
+# agreements = [agreement]
+#
+# annotator = wsag_helper.AgreementAnnotator()
+# for agreement in agreements:
+# id_ = agreement.agreement_id
+# testbed = agreement.context.provider
+# status = _get_agreement_status(id_, testbed)
+# annotator.annotate_agreement(agreement, status)
+#
+# if filter_ is not None:
+# print "FILTERING ", repr(filter_)
+# agreements = filter(filter_.check, agreements)
+# else:
+# print "NOT FILTERING"
+# return agreements
+
+def _get_agreements_by_slice(slice):
agreements_client = _get_agreements_client()
- if agreement_id is None:
- if consumer_id is not None:
- agreements, response = agreements_client.getbyconsumer(consumer_id)
- elif provider_id is not None:
- agreements, response = agreements_client.getbyprovider(provider_id)
- elif slice is not None:
- agreements_client = _get_agreements_client("slice")
- agreements, response = agreements_client.getbyslice(slice)
- else:
- raise ValueError(
- "Invalid values: consumer_id and provider_id are None")
- else:
- agreement, response = agreements_client.getbyid(agreement_id)
- agreements = [agreement]
+ agreements, response = agreements_client.getbyslice(slice)
annotator = wsag_helper.AgreementAnnotator()
for agreement in agreements:
status = _get_agreement_status(id_, testbed)
annotator.annotate_agreement(agreement, status)
- if filter_ is not None:
- print "FILTERING ", repr(filter_)
- agreements = filter(filter_.check, agreements);
- else:
- print "NOT FILTERING"
return agreements
-def _get_agreements_by_consumer(consumer_id):
-
- agreements_client = _get_agreements_client()
- agreements, response = agreements_client.getbyconsumer(consumer_id)
- return agreements
+# def _get_agreements_by_consumer(consumer_id):
+#
+# agreements_client = _get_agreements_client()
+# agreements, response = agreements_client.getbyconsumer(consumer_id)
+# return agreements
def _get_agreement_status(agreement_id, testbed):
-
agreements_client = _get_agreements_client()
status, response = agreements_client.getstatus(agreement_id, testbed)
return status
-def _get_agreement_violations(agreement_id, testbed, term=None):
+def _get_agreement_violations(agreement_id, testbed, term=None):
violations_client = _get_violations_client()
violations, response = violations_client.getbyagreement(agreement_id, testbed, term)
return violations
-class AgreementSimple(APIView):
+class Testbeds(FreeAccessView, ThemeView):
+ def get(self, request, *args, **kwargs):
+ c = restclient.Client(SLA_COLLECTOR_URL)
+ #url = settings.SLA_MANAGER_URL.replace("/sla","")
+ #c = restclient.Client(url)
+ # print "**** URL ******", url
+ SLAtestbeds = c.get("testbeds/")
+ # Future work: get SLA description for each testbed
+
+ return HttpResponse(SLAtestbeds.text, content_type="application/json", status=SLAtestbeds.status_code)
+
+
+class CreateAgreement(LoginRequiredView, ThemeView):
+ def post(self, request, *args, **kwargs):
- regex = r"[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"
+ c = restclient.Client(SLA_COLLECTOR_URL)
+ data = request.POST.copy()
- def build_response(self, code, text):
- response = HttpResponse(text, content_type="text/plain", status=code)
- return response
+ testbed_urn_regex = r"\+(.*?)\+"
+ pattern = re.compile(testbed_urn_regex)
+ testbed_urn = pattern.search(data["SLIVER_INFO_AGGREGATE_URN"]).group(1)
- def post(self, request, **kwargs):
- #import pdb; pdb.set_trace()
- print "------------------------------------------------1"
- data = request.POST
+ tstmp = data["SLIVER_INFO_EXPIRATION"]
- url = settings.SLA_MANAGER_URL
- c = restclient.Client(url)
- # for key, value in request.DATA.items(): # jgarcia review this
- # data[key] = value
-
- # print "---- DATA: ----"
- # print "Data type: ", type(data)
- # for key in data:
- # print key, data.getlist(key)
+ dt = datetime.fromtimestamp(float(tstmp))
+ gmt_2 = pytz.timezone("Etc/GMT-2") # FIXME: hardcoded for demo purposes
+ dlocal = gmt_2.localize(dt).isoformat()
+
+ data["SLIVER_INFO_EXPIRATION"] = dlocal
+
+ logger.debug("SLA Agreement parameters: {}".format(data))
try:
- # template_id = data['template_id']
- testbeds = data.getlist("testbeds")
- user = data["user"]
- resources = data.getlist("resources")
- slice_id = data["slice"]
- except:
- print "FAIL!"
- return self.build_response(400, 'Invalid data')
-
- selected_resources = {}
-
- now = datetime.now(tzlocal())
- expiration_time = now + relativedelta(years=1)
-
- for testbed in testbeds:
- selected_resources[testbed] = [r for r in resources if testbed in r]
- template_id = testbed
- try:
- print "Calling createagreementsimplified with template_id:",template_id,"and user:",user
- result = fed4fireservice.createagreementsimplified(
- template_id, user, expiration_time, selected_resources)
- print result
- except Exception, e:
- print traceback.format_exc()
- print '%s (%s)' % (e, type(e))
- return self.build_response(400, 'Problem creating agreement')
-
- agreement_id = re.compile(self.regex).search(result.text).group(0)
-
- data = '{{ "id": "{}", \
- "slice": "{}", \
- "testbed": "{}" }}'.format(agreement_id, slice_id, testbed)
-
- c.post(
- "sliver",
- data,
- headers = {
- "content-type": "application/json",
- "accept": "application/xml"
- }
- )
-
- return self.build_response(200, result)
-
-class Testbeds(APIView):
- def get(self, request, **kwargs):
- c = restclient.Client("http://157.193.215.125:4001/sla-collector")
- #url = settings.SLA_MANAGER_URL.replace("/sla","")
- #c = restclient.Client(url)
- print "**** URL ******", url
- SLAtestbeds = c.get("testbeds")
- # Future work: get SLA description for each testbed
+ response = c.post("agreements/create/", data=data, testbed=testbed_urn)
+ except Exception as e:
+ import traceback, sys
- return HttpResponse(SLAtestbeds.text, content_type="application/json", status=SLAtestbeds.status_code)
+ traceback.print_exc(file=sys.stdout)
+ logger.debug("SLA ERROR {}".format(e.message))
+
+ return HttpResponse(response.text, status=response.status_code)
-<div class="col-md-2">
+<div class="col-md-1">
</div>
- <div class="col-md-9">
+ <div class="col-md-10">
<div class="row" id="agreements" style="padding-top:1em;">
<dd>{{ row.agreement.context.testbed_formatted }}</dd>
<dt>Expiration date:</dt>
<dd>{{ row.date|default:" " }}</dd>
+
+ <dt>Covered slivers:</dt>
+ {% for sliver in row.slivers %}
+ <dd>{{ sliver|default:" " }}</dd>
+ {% endfor %}
+
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<td>{{ row.provider }}</td>
- <td><a class="agreement-detail" data-toggle="modal" data-target="#agreementModal{{row.agreement.agreement_id}}">{{ row.agreement.context.template_id }}</a></td>
+ <td><a class="agreement-detail" data-toggle="modal" data-target="#agreementModal{{row.agreement.agreement_id}}">{{ row.agreement.agreement_id }}</a></td>
<td>{{ row.date }}</td>
<td>{{ row.status }}</td>
+++ /dev/null
-{
- "auto_complete":
- {
- "selected_items":
- [
- ]
- },
- "buffers":
- [
- {
- "file": "slice-tab-sla.html",
- "settings":
- {
- "buffer_size": 6021,
- "line_ending": "Unix"
- }
- }
- ],
- "build_system": "",
- "command_palette":
- {
- "height": 0.0,
- "selected_items":
- [
- ],
- "width": 0.0
- },
- "console":
- {
- "height": 0.0,
- "history":
- [
- ]
- },
- "distraction_free":
- {
- "menu_visible": true,
- "show_minimap": false,
- "show_open_files": false,
- "show_tabs": false,
- "side_bar_visible": false,
- "status_bar_visible": false
- },
- "file_history":
- [
- ],
- "find":
- {
- "height": 0.0
- },
- "find_in_files":
- {
- "height": 0.0,
- "where_history":
- [
- ]
- },
- "find_state":
- {
- "case_sensitive": false,
- "find_history":
- [
- ],
- "highlight": true,
- "in_selection": false,
- "preserve_case": false,
- "regex": false,
- "replace_history":
- [
- ],
- "reverse": false,
- "show_context": true,
- "use_buffer2": true,
- "whole_word": false,
- "wrap": true
- },
- "groups":
- [
- {
- "selected": 0,
- "sheets":
- [
- {
- "buffer": 0,
- "file": "slice-tab-sla.html",
- "semi_transient": false,
- "settings":
- {
- "buffer_size": 6021,
- "regions":
- {
- },
- "selection":
- [
- [
- 0,
- 0
- ]
- ],
- "settings":
- {
- "syntax": "Packages/HTML/HTML.tmLanguage"
- },
- "translation.x": 0.0,
- "translation.y": 0.0,
- "zoom_level": 1.0
- },
- "stack_index": 0,
- "type": "text"
- }
- ]
- }
- ],
- "incremental_find":
- {
- "height": 0.0
- },
- "input":
- {
- "height": 0.0
- },
- "layout":
- {
- "cells":
- [
- [
- 0,
- 0,
- 1,
- 1
- ]
- ],
- "cols":
- [
- 0.0,
- 1.0
- ],
- "rows":
- [
- 0.0,
- 1.0
- ]
- },
- "menu_visible": true,
- "output.find_results":
- {
- "height": 0.0
- },
- "project": "violations_template.sublime-project",
- "replace":
- {
- "height": 0.0
- },
- "save_all_on_build": true,
- "select_file":
- {
- "height": 0.0,
- "selected_items":
- [
- ],
- "width": 0.0
- },
- "select_project":
- {
- "height": 0.0,
- "selected_items":
- [
- ],
- "width": 0.0
- },
- "select_symbol":
- {
- "height": 0.0,
- "selected_items":
- [
- ],
- "width": 0.0
- },
- "settings":
- {
- },
- "show_minimap": true,
- "show_open_files": false,
- "show_tabs": true,
- "side_bar_visible": true,
- "side_bar_width": 150.0,
- "status_bar_visible": true,
- "template_settings":
- {
- }
-}
slicetabsla.agreement_details, name='agreement_details'),
url(r'^agreements/(?P<agreement_id>[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/guarantees/(?P<guarantee_name>\w+)/violations$',
slicetabsla.agreement_term_violations, name='agreement_term_violations'),
- url(r'^agreements/simplecreate/?$',
- slicetabsla.AgreementSimple.as_view(), name="agreementsimple"),
+ url(r'^agreements/create/$',
+ slicetabsla.CreateAgreement.as_view(), name="agreement_create"),
+ # url(r'^agreements/simplecreate/?$',
+ # slicetabsla.AgreementSimple.as_view(), name="agreementsimple"),
)
import re\r
import datetime\r
+from myslice.settings import logger\r
\r
from slaclient import wsag_model\r
from slaclient.wsag_model import AgreementStatus\r
"""\r
a = agreement\r
\r
+ logger.debug("SLA STATUS: {}".format(status))\r
+\r
if status is not None:\r
a.guaranteestatus = status.guaranteestatus\r
a.statusclass = self._get_statusclass(status.guaranteestatus)\r