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);
52 get_sla_templates: function (testbeds) {
54 testbeds.forEach(function(testbed, index, array) {
56 if(testbed!="omf:netmode") { return } // TODO: remove
58 $.get('/sla/agreements/templates/' + testbed, function(slo) {
60 $(".modal-body #sla_template").append(slo);
63 "<div id=" + testbed + " class='row' data-urns='[]' style='display: none'>" +
64 "<div class='col-md-6'>" +
65 "<p>Testbed <span class='provider'>" + testbed + "</span> offers the following SLA for its resources</p>" +
67 "<div class='col-md-1'>" +
68 "<button class='sla-info-button btn btn-default' data-toggle='modal' data-target='#sla_template_modal'>" +
69 "<span class='glyphicon glyphicon-info-sign'></span>" +
73 "<div class='col-md-1'>" +
74 "<button class='sla-accept-button btn btn-default' data-complete-text='Accepted' autocomplete='off'>" +
75 "<span class='glyphicon glyphicon-ok'></span>" +
81 $("#sla_offers").append(content);
86 check_template_status: function() {
87 for (var testbed in this.accepted_slas) {
88 if (!this.accepted_slas[testbed]) { return false; }
98 button_binding: function() {
100 $(".sla-accept-button").click(function() {
101 // set SLA as accepted and remove warnings
102 var id = $(this).closest(".row").attr("id");
103 self.accepted_slas[id] = true;
104 var is_ok = self.check_template_status();
106 $(".sla-alert").show();
107 $(this).button("complete");
108 $(this).prop("disabled", true);
112 $('#' + id).data("urns").forEach(function (urn, index, array) {
116 op : STATE_SET_REMOVE,
120 manifold.raise_event(self.query_uuid, STATUS_REMOVE_WARNING, data);
125 $(".sla-alert-close").click(function() {
126 $(this).closest(".sla-alert").hide();
130 create_sla: function(record) {
135 if (record.resource.length != 0 && typeof record.resource[0] === "object") {
137 record.resource.forEach(function(r) {
138 if ($.inArray(r.component_id, record.resource) == -1) { // if not already selected
139 urns.push(r.component_id);
144 "SLIVER_INFO_AGGREGATE_URN": record.resource[0].component_manager_id,
145 "SLIVER_INFO_EXPIRATION": record.lease[0].end_time, // FIXME: only working with leases
146 "SLIVER_INFO_SLICE_URN": record.slice_urn,
147 "SLIVER_INFO_CREATOR_URN": record.users[0],
148 "SLIVER_INFO_URN": urns,
149 "SLIVER_INFO_SLA_ID": self._getUUID()
154 $.post("/sla/agreements/create/", data)
155 .done(function (response) {
156 console.log("SLA created");
161 uncheck: function(urn)
163 // $('#slamodal').on('hidden.bs.modal', function(e){
164 // $('#' + (urn).replace(/"/g,'')).click();
165 // console.log('#' + (data.value).replace(/"/g,''));
169 on_filter_added: function(filter)
174 on_field_state_changed: function(data)
177 self.query_uuid = self.options.query_uuid;
179 var testbeds = localStorage.getItem("sla_testbeds").split(",");
180 var urn_regexp = /\+(.*?)\+/;
181 // this.set_state(result, this.options.username);
186 case STATE_SET_IN_PENDING:
187 if (typeof(data.value) == 'string') {
189 var urn = urn_regexp.exec(data.value)[1];
190 var pos = $.inArray(urn, testbeds);
192 var id_ref = testbeds[pos].replace(/\.|:/g, "-");
193 $("#" + id_ref).data("urns").push(data.value);
194 $("#" + id_ref).show();
195 self.accepted_slas[id_ref] = false;
196 //$( "#sla_offers_list" ).append(
197 // $("<li>").text("Testbed " + testbeds[pos] + " offers SLA for its resources")
204 if (typeof(data.value) == 'string') {
206 var urn = urn_regexp.exec(data.value)[1];
207 var pos = $.inArray(urn, testbeds);
209 var id_ref = testbeds[pos].replace(/\.|:/g, "-");
210 var array = $("#" + id_ref).data("urns");
211 array.splice(array.indexOf(data.value), 1);
213 if ($("#" + id_ref).data("urns").length == 0) {
214 $("#" + id_ref).hide();
215 delete self.accepted_slas[id_ref];
216 $(".sla-accept-button").button("reset");
217 $(".sla-accept-button").prop("disabled", false);
219 //$( "#sla_offers_list" ).append(
220 // $("<li>").text("Testbed " + testbeds[pos] + " offers SLA for its resources")
229 // Add resource to SLA
231 // data.value = {1: "SLA acceptance required..."}
232 // this.change_status(data.key, data.value);
237 /* RECORD HANDLERS */
238 on_all_new_record: function(record)
243 on_new_record: function(record)
245 this.create_sla(record);
248 /* INTERNAL FUNCTIONS */
250 _supports_sla: function(resource_urn) {
251 return $.ajax("/sla/testbeds/");
254 _getUUID: function() {
255 return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
256 var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8);
257 return v.toString(16);
263 /* Plugin registration */
264 $.plugin('SlaDialog', SlaDialog);