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 */
30 // Get testbeds with sla and store them in localStorage
31 this.get_testbeds_with_sla();
34 //this.button_binding();
37 get_testbeds_with_sla: function () {
39 return $.get('/sla/testbeds/', function(data) {
40 if (typeof(Storage) !== "undefined") {
41 if (!localStorage.getItem("sla_testbeds")) {
43 localStorage.setItem("sla_testbeds", testbeds);
46 }).done(function(data) {
47 self.get_sla_templates(data);
51 get_sla_templates: function (testbeds) {
54 testbeds.forEach(function(testbed, index, array) {
56 if(testbed=="omf:netmode") { // TODO: Remove
58 $.ajax('/sla/agreements/templates/' + testbed)
59 .always(function(data) {
60 $(".modal-body #sla_template").html(data.responseText.replace(/<|>/g, ""));
63 "<div id=" + testbed.replace(/\.|:/g, "-") + " 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);
83 self.button_binding();
89 check_template_status: function() {
90 for (var testbed in this.accepted_slas) {
91 if (!this.accepted_slas[testbed]) { return false; }
101 button_binding: function() {
103 $(".sla-accept-button").click(function() {
104 // set SLA as accepted and remove warnings
105 var id = $(this).closest(".row").attr("id");
106 self.accepted_slas[id] = true;
107 var is_ok = self.check_template_status();
109 $(".sla-alert").show();
110 $(this).button("complete");
111 $(this).prop("disabled", true);
115 $('#' + id).data("urns").forEach(function (urn, index, array) {
119 op : STATE_SET_REMOVE,
123 manifold.raise_event(self.query_uuid, STATUS_REMOVE_WARNING, data);
128 $(".sla-alert-close").click(function() {
129 $(this).closest(".sla-alert").hide();
133 create_sla: function(record) {
138 if (record.resource.length != 0 && typeof record.resource[0] === "object") {
140 record.resource.forEach(function(r) {
141 if ($.inArray(r.component_id, record.resource) == -1) { // if not already selected
142 urns.push(r.component_id);
147 "SLIVER_INFO_AGGREGATE_URN": record.resource[0].component_manager_id,
148 "SLIVER_INFO_EXPIRATION": record.lease[0].end_time, // FIXME: only working with leases
149 "SLIVER_INFO_SLICE_URN": record.slice_urn,
150 "SLIVER_INFO_CREATOR_URN": record.users[0],
151 "SLIVER_INFO_URN": urns,
152 "SLIVER_INFO_SLA_ID": self._getUUID()
157 $.post("/sla/agreements/create/", data)
158 .done(function (response) {
159 console.log("SLA created");
164 uncheck: function(urn)
166 // $('#slamodal').on('hidden.bs.modal', function(e){
167 // $('#' + (urn).replace(/"/g,'')).click();
168 // console.log('#' + (data.value).replace(/"/g,''));
172 on_filter_added: function(filter)
177 on_field_state_changed: function(data)
180 self.query_uuid = self.options.query_uuid;
182 var testbeds = localStorage.getItem("sla_testbeds").split(",");
183 var urn_regexp = /\+(.*?)\+/;
184 // this.set_state(result, this.options.username);
189 case STATE_SET_IN_PENDING:
190 if (typeof(data.value) == 'string') {
192 var urn = urn_regexp.exec(data.value)[1];
193 var pos = $.inArray(urn, testbeds);
195 var id_ref = testbeds[pos].replace(/\.|:/g, "-");
196 $("#" + id_ref).data("urns").push(data.value);
197 $("#" + id_ref).show();
198 self.accepted_slas[id_ref] = false;
199 //$( "#sla_offers_list" ).append(
200 // $("<li>").text("Testbed " + testbeds[pos] + " offers SLA for its resources")
207 if (typeof(data.value) == 'string') {
209 var urn = urn_regexp.exec(data.value)[1];
210 var pos = $.inArray(urn, testbeds);
212 var id_ref = testbeds[pos].replace(/\.|:/g, "-");
213 var array = $("#" + id_ref).data("urns");
214 array.splice(array.indexOf(data.value), 1);
216 if ($("#" + id_ref).data("urns").length == 0) {
217 $("#" + id_ref).hide();
218 delete self.accepted_slas[id_ref];
219 $(".sla-accept-button").button("reset");
220 $(".sla-accept-button").prop("disabled", false);
222 //$( "#sla_offers_list" ).append(
223 // $("<li>").text("Testbed " + testbeds[pos] + " offers SLA for its resources")
232 // Add resource to SLA
234 // data.value = {1: "SLA acceptance required..."}
235 // this.change_status(data.key, data.value);
240 /* RECORD HANDLERS */
241 on_all_new_record: function(record)
246 on_new_record: function(record)
248 this.create_sla(record);
251 /* INTERNAL FUNCTIONS */
253 _supports_sla: function(resource_urn) {
254 return $.ajax("/sla/testbeds/");
257 _getUUID: function() {
258 return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
259 var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8);
260 return v.toString(16);
266 /* Plugin registration */
267 $.plugin('SlaDialog', SlaDialog);