SLA plugin: fixed template shown in dialog
[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             // Get testbeds with sla and store them in localStorage
31             this.get_testbeds_with_sla();
32
33             // call function
34             //this.button_binding();
35         },
36
37         get_testbeds_with_sla: function () {
38             var self = this;
39             return $.get('/sla/testbeds/', function(data) {
40                 if (typeof(Storage) !== "undefined") {
41                     if (!localStorage.getItem("sla_testbeds")) {
42                         var testbeds = data;
43                         localStorage.setItem("sla_testbeds", testbeds);
44                     }
45                 }
46             }).done(function(data) {
47                 self.get_sla_templates(data);
48             });
49         },
50
51         get_sla_templates: function (testbeds) {
52             var self = this;
53
54             testbeds.forEach(function(testbed, index, array) {
55
56                 if(testbed=="omf:netmode") { // TODO: Remove
57
58                     $.ajax('/sla/agreements/templates/' + testbed)
59                      .always(function(data) {
60                         $(".modal-body #sla_template").html(data.responseText.replace(/<|>/g, ""));
61
62                         var content =
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>" +
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                         self.button_binding();
84                     });
85                 }
86             });
87         },
88
89         check_template_status: function() {
90             for (var testbed in this.accepted_slas) {
91                 if (!this.accepted_slas[testbed]) { return false; }
92             }
93
94             return true;
95         },
96
97         /* PLUGIN EVENTS */
98
99         /* GUI EVENTS */
100
101         button_binding: function() {
102             var self = this;
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();
108
109                 $(".sla-alert").show();
110                 $(this).button("complete");
111                 $(this).prop("disabled", true);
112
113                 if (is_ok) {
114                     // remove warnings
115                     $('#' + id).data("urns").forEach(function (urn, index, array) {
116                         data = {
117                             state: STATE_SET,
118                             key  : "resource",
119                             op   : STATE_SET_REMOVE,
120                             value: urn
121                         }
122
123                         manifold.raise_event(self.query_uuid, STATUS_REMOVE_WARNING, data);
124                     });
125                 }
126             });
127
128             $(".sla-alert-close").click(function() {
129                 $(this).closest(".sla-alert").hide();
130             });
131         },
132
133         create_sla: function(record) {
134             var self = this;
135
136             var urns = [];
137
138             if (record.resource.length != 0 && typeof record.resource[0] === "object") {
139
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);
143                     }
144                 });
145
146                 var data = {
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()
153                 };
154
155                 console.log(data);
156
157                 $.post("/sla/agreements/create/", data)
158                     .done(function (response) {
159                         console.log("SLA created");
160                     });
161             }
162         },
163
164         uncheck: function(urn)
165         {
166 //            $('#slamodal').on('hidden.bs.modal', function(e){
167 //                $('#' + (urn).replace(/"/g,'')).click();
168 //                console.log('#' + (data.value).replace(/"/g,''));
169 //            });
170         },
171
172         on_filter_added: function(filter)
173         {
174
175         },
176
177         on_field_state_changed: function(data)
178         {
179             var self = this;
180             self.query_uuid = self.options.query_uuid;
181
182             var testbeds = localStorage.getItem("sla_testbeds").split(",");
183             var urn_regexp = /\+(.*?)\+/;
184             // this.set_state(result, this.options.username);
185
186              switch(data.state) {
187                 case STATE_SET:
188                     switch(data.op) {
189                         case STATE_SET_IN_PENDING:
190                             if (typeof(data.value) == 'string') {
191                                 // data.value = urn
192                                 var urn = urn_regexp.exec(data.value)[1];
193                                 var pos = $.inArray(urn, testbeds);
194                                 if ( pos != -1) {
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")
201                                     //);
202                                 }
203                             }
204                             break;
205                         case STATE_SET_OUT:
206                             // data.value = urn
207                             if (typeof(data.value) == 'string') {
208                                 // data.value = urn
209                                 var urn = urn_regexp.exec(data.value)[1];
210                                 var pos = $.inArray(urn, testbeds);
211                                 if ( pos != -1) {
212                                     var id_ref = testbeds[pos].replace(/\.|:/g, "-");
213                                     var array = $("#" + id_ref).data("urns");
214                                     array.splice(array.indexOf(data.value), 1);
215
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);
221                                     }
222                                     //$( "#sla_offers_list" ).append(
223                                     //    $("<li>").text("Testbed " + testbeds[pos] + " offers SLA for its resources")
224                                     //);
225                                 }
226                             }
227                             break;
228                     }
229                     break;
230
231                 case STATE_WARNINGS:
232                     // Add resource to SLA
233                     // data.key = urn
234                     // data.value = {1: "SLA acceptance required..."}
235                     // this.change_status(data.key, data.value);
236                     break;
237              }
238         }, 
239
240         /* RECORD HANDLERS */
241         on_all_new_record: function(record)
242         {
243             //
244         },
245
246         on_new_record: function(record)
247         {
248             this.create_sla(record);
249         },
250
251         /* INTERNAL FUNCTIONS */
252
253         _supports_sla: function(resource_urn) {
254             return $.ajax("/sla/testbeds/");
255         },
256
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);
261             });
262         },
263
264     });
265
266     /* Plugin registration */
267     $.plugin('SlaDialog', SlaDialog);
268
269 })(jQuery);