a8f8244c916cdb6a7ab10a721bc5fb529c771a72
[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             });
50         },
51
52         get_sla_templates: function (testbeds) {
53
54             testbeds.forEach(function(testbed, index, array) {
55
56                 if(testbed!="omf:netmode") { return } // TODO: remove
57
58                 $.get('/sla/agreements/templates/' + testbed, function(slo) {
59
60                     $(".modal-body #sla_template").append(slo);
61
62                     var content =
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>" +
66                         "/div>" +
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>" +
70                                 "Details" +
71                             "</button>" +
72                         "</div>" +
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>" +
76                                 "Accept" +
77                             "</button>" +
78                         "</div>" +
79                     "</div>";
80
81                     $("#sla_offers").append(content);
82                 });
83             });
84         },
85
86         check_template_status: function() {
87             for (var testbed in this.accepted_slas) {
88                 if (!this.accepted_slas[testbed]) { return false; }
89             }
90
91             return true;
92         },
93
94         /* PLUGIN EVENTS */
95
96         /* GUI EVENTS */
97
98         button_binding: function() {
99             var self = this;
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();
105
106                 $(".sla-alert").show();
107                 $(this).button("complete");
108                 $(this).prop("disabled", true);
109
110                 if (is_ok) {
111                     // remove warnings
112                     $('#' + id).data("urns").forEach(function (urn, index, array) {
113                         data = {
114                             state: STATE_SET,
115                             key  : "resource",
116                             op   : STATE_SET_REMOVE,
117                             value: urn
118                         }
119
120                         manifold.raise_event(self.query_uuid, STATUS_REMOVE_WARNING, data);
121                     });
122                 }
123             });
124
125             $(".sla-alert-close").click(function() {
126                 $(this).closest(".sla-alert").hide();
127             });
128         },
129
130         create_sla: function(record) {
131             var self = this;
132
133             var urns = [];
134
135             if (record.resource.length != 0 && typeof record.resource[0] === "object") {
136
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);
140                     }
141                 });
142
143                 var data = {
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()
150                 };
151
152                 console.log(data);
153
154                 $.post("/sla/agreements/create/", data)
155                     .done(function (response) {
156                         console.log("SLA created");
157                     });
158             }
159         },
160
161         uncheck: function(urn)
162         {
163 //            $('#slamodal').on('hidden.bs.modal', function(e){
164 //                $('#' + (urn).replace(/"/g,'')).click();
165 //                console.log('#' + (data.value).replace(/"/g,''));
166 //            });
167         },
168
169         on_filter_added: function(filter)
170         {
171
172         },
173
174         on_field_state_changed: function(data)
175         {
176             var self = this;
177             self.query_uuid = self.options.query_uuid;
178
179             var testbeds = localStorage.getItem("sla_testbeds").split(",");
180             var urn_regexp = /\+(.*?)\+/;
181             // this.set_state(result, this.options.username);
182
183              switch(data.state) {
184                 case STATE_SET:
185                     switch(data.op) {
186                         case STATE_SET_IN_PENDING:
187                             if (typeof(data.value) == 'string') {
188                                 // data.value = urn
189                                 var urn = urn_regexp.exec(data.value)[1];
190                                 var pos = $.inArray(urn, testbeds);
191                                 if ( pos != -1) {
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")
198                                     //);
199                                 }
200                             }
201                             break;
202                         case STATE_SET_OUT:
203                             // data.value = urn
204                             if (typeof(data.value) == 'string') {
205                                 // data.value = urn
206                                 var urn = urn_regexp.exec(data.value)[1];
207                                 var pos = $.inArray(urn, testbeds);
208                                 if ( pos != -1) {
209                                     var id_ref = testbeds[pos].replace(/\.|:/g, "-");
210                                     var array = $("#" + id_ref).data("urns");
211                                     array.splice(array.indexOf(data.value), 1);
212
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);
218                                     }
219                                     //$( "#sla_offers_list" ).append(
220                                     //    $("<li>").text("Testbed " + testbeds[pos] + " offers SLA for its resources")
221                                     //);
222                                 }
223                             }
224                             break;
225                     }
226                     break;
227
228                 case STATE_WARNINGS:
229                     // Add resource to SLA
230                     // data.key = urn
231                     // data.value = {1: "SLA acceptance required..."}
232                     // this.change_status(data.key, data.value);
233                     break;
234              }
235         }, 
236
237         /* RECORD HANDLERS */
238         on_all_new_record: function(record)
239         {
240             //
241         },
242
243         on_new_record: function(record)
244         {
245             this.create_sla(record);
246         },
247
248         /* INTERNAL FUNCTIONS */
249
250         _supports_sla: function(resource_urn) {
251             return $.ajax("/sla/testbeds/");
252         },
253
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);
258             });
259         },
260
261     });
262
263     /* Plugin registration */
264     $.plugin('SlaDialog', SlaDialog);
265
266 })(jQuery);