SLA plugin: template integration with SLA Dashboard
[myslice.git] / plugins / sladialog / static / js / sladialog.js
1 /**
2  * SlaDialog
3  * Description: Plugin to allow SLA acceptance and creation to MySlice portal
4  *              in Fed4FIRE
5  * Requires:    js/plugin.js
6  * Author:      Javier GarcĂ­a Lloreda <javier.garcial.external@atos.net>
7  * Copyright:   Copyright Atos Spain S.A.
8  * License:     GPLv3
9  */
10
11 (function($){
12
13     var SlaDialog = Plugin.extend({
14
15         accepted_slas: {},
16         queries: [],
17
18         init: function(options, element) {
19                 this.classname = "SlaDialog";
20             this._super(options, element);
21
22             /* Member variables */
23
24             /* Plugin events */
25
26             /* Setup query and record handlers */
27             this.listen_query(options.query_uuid);
28             
29             /* GUI setup and event binding */
30
31             // call function
32             this.button_binding();
33
34             // Get testbeds with sla and store them in localStorage
35             this.get_testbeds_with_sla();
36         },
37
38         get_testbeds_with_sla: function () {
39             var self = this;
40             return $.get('/sla/testbeds/', function(data) {
41                 if (typeof(Storage) !== "undefined") {
42                     if (!localStorage.getItem("sla_testbeds")) {
43                         var testbeds = data;
44                         localStorage.setItem("sla_testbeds", testbeds);
45                     }
46                 }
47             }).done(function(data) {
48                 self.get_sla_templates(data);
49                 alert("sla templates recovered: " + data);
50             });
51         },
52
53         get_sla_templates: function (testbeds) {
54
55             testbeds.forEach(function(testbed, index, array) {
56
57                 if(testbed!="omf:netmode") { return } // TODO: remove
58
59                 $.get('/sla/agreements/templates/' + testbed, function(slo) {
60
61                     $(".modal-body #sla_template").append(slo);
62
63                     var content =
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>" +
67                         "/div>" +
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>" +
71                                 "Details" +
72                             "</button>" +
73                         "</div>" +
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>" +
77                                 "Accept" +
78                             "</button>" +
79                         "</div>" +
80                     "</div>";
81
82                     $("#sla_offers").append(content);
83                 });
84             });
85         },
86
87         check_template_status: function() {
88             for (var testbed in this.accepted_slas) {
89                 if (!this.accepted_slas[testbed]) { return false; }
90             }
91
92             return true;
93         },
94
95         /* PLUGIN EVENTS */
96
97         /* GUI EVENTS */
98
99         button_binding: function() {
100             var self = this;
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();
106
107                 $(".sla-alert").show();
108                 $(this).button("complete");
109                 $(this).prop("disabled", true);
110
111                 if (is_ok) {
112                     // remove warnings
113                     $('#' + id).data("urns").forEach(function (urn, index, array) {
114                         data = {
115                             state: STATE_SET,
116                             key  : "resource",
117                             op   : STATE_SET_REMOVE,
118                             value: urn
119                         }
120
121                         manifold.raise_event(self.query_uuid, STATUS_REMOVE_WARNING, data);
122                     });
123                 }
124             });
125
126             $(".sla-alert-close").click(function() {
127                 $(this).closest(".sla-alert").hide();
128             });
129         },
130
131         create_sla: function(record) {
132             var self = this;
133
134             var urns = [];
135
136             if (record.resource.length != 0 && typeof record.resource[0] === "object") {
137
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);
141                     }
142                 });
143
144                 var data = {
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()
151                 };
152
153                 console.log(data);
154
155                 $.post("/sla/agreements/create/", data)
156                     .done(function (response) {
157                         console.log("SLA created");
158                     });
159             }
160         },
161
162         uncheck: function(urn)
163         {
164 //            $('#slamodal').on('hidden.bs.modal', function(e){
165 //                $('#' + (urn).replace(/"/g,'')).click();
166 //                console.log('#' + (data.value).replace(/"/g,''));
167 //            });
168         },
169
170         on_filter_added: function(filter)
171         {
172
173         },
174
175         on_field_state_changed: function(data)
176         {
177             var self = this;
178             self.query_uuid = self.options.query_uuid;
179
180             var testbeds = localStorage.getItem("sla_testbeds").split(",");
181             var urn_regexp = /\+(.*?)\+/;
182             // this.set_state(result, this.options.username);
183
184              switch(data.state) {
185                 case STATE_SET:
186                     switch(data.op) {
187                         case STATE_SET_IN_PENDING:
188                             if (typeof(data.value) == 'string') {
189                                 // data.value = urn
190                                 var urn = urn_regexp.exec(data.value)[1];
191                                 var pos = $.inArray(urn, testbeds);
192                                 if ( pos != -1) {
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")
199                                     //);
200                                 }
201                             }
202                             break;
203                         case STATE_SET_OUT:
204                             // data.value = urn
205                             if (typeof(data.value) == 'string') {
206                                 // data.value = urn
207                                 var urn = urn_regexp.exec(data.value)[1];
208                                 var pos = $.inArray(urn, testbeds);
209                                 if ( pos != -1) {
210                                     var id_ref = testbeds[pos].replace(/\.|:/g, "-");
211                                     var array = $("#" + id_ref).data("urns");
212                                     array.splice(array.indexOf(data.value), 1);
213
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);
219                                     }
220                                     //$( "#sla_offers_list" ).append(
221                                     //    $("<li>").text("Testbed " + testbeds[pos] + " offers SLA for its resources")
222                                     //);
223                                 }
224                             }
225                             break;
226                     }
227                     break;
228
229                 case STATE_WARNINGS:
230                     // Add resource to SLA
231                     // data.key = urn
232                     // data.value = {1: "SLA acceptance required..."}
233                     // this.change_status(data.key, data.value);
234                     break;
235              }
236         }, 
237
238         /* RECORD HANDLERS */
239         on_all_new_record: function(record)
240         {
241             //
242         },
243
244         on_new_record: function(record)
245         {
246             this.create_sla(record);
247         },
248
249         /* INTERNAL FUNCTIONS */
250
251         _supports_sla: function(resource_urn) {
252             return $.ajax("/sla/testbeds/");
253         },
254
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);
259             });
260         },
261
262     });
263
264     /* Plugin registration */
265     $.plugin('SlaDialog', SlaDialog);
266
267 })(jQuery);