3 * Description: Plugin to allow SLA acceptance and creation to MySlice portal
5 * Requires: js/plugin.js
6 * Author: Javier GarcĂa Lloreda <javier.garcial.external@atos.net>
7 * Copyright: Copyright Atos Spain S.A.
13 var SlaDialog = Plugin.extend({
18 init: function(options, element) {
19 this.classname = "SlaDialog";
20 this._super(options, element);
22 /* Member variables */
26 /* Setup query and record handlers */
27 this.listen_query(options.query_uuid);
29 /* GUI setup and event binding */
32 this.button_binding();
34 // Get testbeds with sla and store them in localStorage
35 this.get_testbeds_with_sla();
38 get_testbeds_with_sla: function () {
40 return $.get('/sla/testbeds/', function(data) {
41 if (typeof(Storage) !== "undefined") {
42 if (!localStorage.getItem("sla_testbeds")) {
44 localStorage.setItem("sla_testbeds", testbeds);
47 }).done(function(data) {
48 self.get_sla_templates(data);
49 alert("sla templates recovered: " + data);
53 get_sla_templates: function (testbeds) {
55 testbeds.forEach(function(testbed, index, array) {
57 if(testbed!="omf:netmode") { return } // TODO: remove
59 $.get('/sla/agreements/templates/' + testbed, function(slo) {
61 $(".modal-body #sla_template").append(slo);
64 "<div id=" + testbed + " class='row' data-urns='[]' style='display: none'>" +
65 "<div class='col-md-6'>" +
66 "<p>Testbed <span class='provider'>" + testbed + "</span> offers the following SLA for its resources</p>" +
68 "<div class='col-md-1'>" +
69 "<button class='sla-info-button btn btn-default' data-toggle='modal' data-target='#sla_template_modal'>" +
70 "<span class='glyphicon glyphicon-info-sign'></span>" +
74 "<div class='col-md-1'>" +
75 "<button class='sla-accept-button btn btn-default' data-complete-text='Accepted' autocomplete='off'>" +
76 "<span class='glyphicon glyphicon-ok'></span>" +
82 $("#sla_offers").append(content);
87 check_template_status: function() {
88 for (var testbed in this.accepted_slas) {
89 if (!this.accepted_slas[testbed]) { return false; }
99 button_binding: function() {
101 $(".sla-accept-button").click(function() {
102 // set SLA as accepted and remove warnings
103 var id = $(this).closest(".row").attr("id");
104 self.accepted_slas[id] = true;
105 var is_ok = self.check_template_status();
107 $(".sla-alert").show();
108 $(this).button("complete");
109 $(this).prop("disabled", true);
113 $('#' + id).data("urns").forEach(function (urn, index, array) {
117 op : STATE_SET_REMOVE,
121 manifold.raise_event(self.query_uuid, STATUS_REMOVE_WARNING, data);
126 $(".sla-alert-close").click(function() {
127 $(this).closest(".sla-alert").hide();
131 create_sla: function(record) {
136 if (record.resource.length != 0 && typeof record.resource[0] === "object") {
138 record.resource.forEach(function(r) {
139 if ($.inArray(r.component_id, record.resource) == -1) { // if not already selected
140 urns.push(r.component_id);
145 "SLIVER_INFO_AGGREGATE_URN": record.resource[0].component_manager_id,
146 "SLIVER_INFO_EXPIRATION": record.lease[0].end_time, // FIXME: only working with leases
147 "SLIVER_INFO_SLICE_URN": record.slice_urn,
148 "SLIVER_INFO_CREATOR_URN": record.users[0],
149 "SLIVER_INFO_URN": urns,
150 "SLIVER_INFO_SLA_ID": self._getUUID()
155 $.post("/sla/agreements/create/", data)
156 .done(function (response) {
157 console.log("SLA created");
162 uncheck: function(urn)
164 // $('#slamodal').on('hidden.bs.modal', function(e){
165 // $('#' + (urn).replace(/"/g,'')).click();
166 // console.log('#' + (data.value).replace(/"/g,''));
170 on_filter_added: function(filter)
175 on_field_state_changed: function(data)
178 self.query_uuid = self.options.query_uuid;
180 var testbeds = localStorage.getItem("sla_testbeds").split(",");
181 var urn_regexp = /\+(.*?)\+/;
182 // this.set_state(result, this.options.username);
187 case STATE_SET_IN_PENDING:
188 if (typeof(data.value) == 'string') {
190 var urn = urn_regexp.exec(data.value)[1];
191 var pos = $.inArray(urn, testbeds);
193 var id_ref = testbeds[pos].replace(/\.|:/g, "-");
194 $("#" + id_ref).data("urns").push(data.value);
195 $("#" + id_ref).show();
196 self.accepted_slas[id_ref] = false;
197 //$( "#sla_offers_list" ).append(
198 // $("<li>").text("Testbed " + testbeds[pos] + " offers SLA for its resources")
205 if (typeof(data.value) == 'string') {
207 var urn = urn_regexp.exec(data.value)[1];
208 var pos = $.inArray(urn, testbeds);
210 var id_ref = testbeds[pos].replace(/\.|:/g, "-");
211 var array = $("#" + id_ref).data("urns");
212 array.splice(array.indexOf(data.value), 1);
214 if ($("#" + id_ref).data("urns").length == 0) {
215 $("#" + id_ref).hide();
216 delete self.accepted_slas[id_ref];
217 $(".sla-accept-button").button("reset");
218 $(".sla-accept-button").prop("disabled", false);
220 //$( "#sla_offers_list" ).append(
221 // $("<li>").text("Testbed " + testbeds[pos] + " offers SLA for its resources")
230 // Add resource to SLA
232 // data.value = {1: "SLA acceptance required..."}
233 // this.change_status(data.key, data.value);
238 /* RECORD HANDLERS */
239 on_all_new_record: function(record)
244 on_new_record: function(record)
246 this.create_sla(record);
249 /* INTERNAL FUNCTIONS */
251 _supports_sla: function(resource_urn) {
252 return $.ajax("/sla/testbeds/");
255 _getUUID: function() {
256 return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
257 var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8);
258 return v.toString(16);
264 /* Plugin registration */
265 $.plugin('SlaDialog', SlaDialog);