blob: 18072a80528818168849b8a0439834712e2f3ba5 [file] [log] [blame]
lombardofr1e320062018-10-30 22:16:25 +01001/*
2 Copyright 2018 EveryUP srl
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15*/
16
17//GraphEditor instance
18var graph_editor = new TCD3.ModelGraphEditor();
19
20var type_view = {
21 "nsd": ["vnf", "ns_vl"],
22 "vnfd": ["vdu", "cp", "vnf_vl", "int_cp"]
23};
24
lombardofre428af72018-11-15 17:25:25 +010025var map = {
26 'ip-address': 'IP', 'vnfd-id': 'Vnfd Id', 'vnfd-ref': 'Vnfd Ref', 'vim-account-id': 'Vim Id',
27 'member-vnf-index-ref': 'Member index', 'created-time': 'Created', 'id': 'Id', 'mgmt-network': 'Mgmt network',
28 'name': 'Name', 'type': 'Type', 'vim-network-name': 'Vim network name', 'connection-point-id': 'Cp Id',
29 'vdu-id-ref': 'Vdu Id', 'nsr-id-ref': 'Nsr Id'
30};
31
lombardofr1e320062018-10-30 22:16:25 +010032var params = {
33 node: {
34 type: type_view[getUrlParameter('type')],
35 group: []
36 },
37 link: {
38 group: [],
39 view: [getUrlParameter('type')]
40 }
41};
42
43$(document).ready(function () {
44
45 graph_editor.addListener("filters_changed", changeFilter);
46 graph_editor.addListener("node:selected", refreshElementInfo);
47 graph_editor.addListener("node:deselected", refreshElementInfo);
48
49 // graph_editor initialization
50 graph_editor.init({
51 width: $('#graph_editor_container').width(),
52 height: $('#graph_editor_container').height(),
53
54 data_url: window.location.href,
55 //desc_id: getUrlParameter('id'),
56 gui_properties: osm_gui_properties,
lombardofre428af72018-11-15 17:25:25 +010057 edit_mode: true,
lombardofr1e320062018-10-30 22:16:25 +010058 behaviorsOnEvents: {
59 viewBased: false,
60 behaviors: buildBehaviorsOnEvents()
61 }
62 });
63 graph_editor.handleFiltersParams(params);
lombardofre428af72018-11-15 17:25:25 +010064 initDropOnGraph();
lombardofr1e320062018-10-30 22:16:25 +010065
lombardofre428af72018-11-15 17:25:25 +010066
67 $("#side_form").submit(function (event) {
68 event.preventDefault(); //prevent default action
69 console.log("ON submit")
70 var form_data = new FormData(this); //Encode form elements for submission
71 var formDataJson = {};
72 form_data.forEach(function (value, key) {
73 formDataJson[key] = value;
74 });
lombardofrc43f2852018-11-16 09:44:36 +010075 var dialog = bootbox.dialog({
76 message: '<div class="text-center"><i class="fa fa-spin fa-spinner"></i> Updating...</div>',
77 closeButton: true
78 });
lombardofre428af72018-11-15 17:25:25 +010079 if (graph_editor._selected_node) {
80 graph_editor.updateDataNode(graph_editor._selected_node, formDataJson, function () {
lombardofrc43f2852018-11-16 09:44:36 +010081 dialog.modal('hide');
lombardofre428af72018-11-15 17:25:25 +010082 }, function (result) {
83 var data = result.responseJSON;
84 var title = "Error " + (data && data.code ? data.code : 'unknown');
85 var message = data && data.detail ? data.detail : 'No detail available.';
lombardofrc43f2852018-11-16 09:44:36 +010086 dialog.modal('hide');
lombardofre428af72018-11-15 17:25:25 +010087 bootbox.alert({
88 title: title,
89 message: message
90 });
91 })
92 } else {
93 graph_editor.updateGraphParams(formDataJson, function () {
lombardofrc43f2852018-11-16 09:44:36 +010094 dialog.modal('hide');
lombardofre428af72018-11-15 17:25:25 +010095 }, function (result) {
96 var data = result.responseJSON;
97 var title = "Error " + (data && data.code ? data.code : 'unknown');
98 var message = data && data.detail ? data.detail : 'No detail available.';
lombardofrc43f2852018-11-16 09:44:36 +010099 dialog.modal('hide');
lombardofre428af72018-11-15 17:25:25 +0100100 bootbox.alert({
101 title: title,
102 message: message
103 });
104 })
105 }
106
107 });
lombardofr1e320062018-10-30 22:16:25 +0100108});
109
110
lombardofre428af72018-11-15 17:25:25 +0100111function initDropOnGraph() {
112
113 var dropZone = document.getElementById('graph_editor_container');
114 dropZone.ondrop = function (e) {
115 var group = graph_editor.getCurrentGroup();
116 e.preventDefault();
117 var elemet_id = e.dataTransfer.getData("text/plain");
118
119 var nodetype = $('#' + elemet_id).attr('type-name');
120 var random_name = nodetype + "_" + generateUID();
lombardofre65ab992018-11-20 23:47:32 +0100121 console.log(nodetype)
lombardofre428af72018-11-15 17:25:25 +0100122 var node_information = {
123 'id': random_name,
124 'info': {
125 'type': nodetype,
126 'property': {
127 'custom_label': random_name
128 },
129 'group': null,
130 'desc_id': getUrlParameter('id'),
131 'desc_type': getUrlParameter('type'),
132 'osm': {}
133 },
134 'x': e.layerX,
135 'y': e.layerY
136 };
lombardofre428af72018-11-15 17:25:25 +0100137
lombardofre65ab992018-11-20 23:47:32 +0100138 if (nodetype === 'vnf') {
lombardofre428af72018-11-15 17:25:25 +0100139 node_information['id'] = $('#' + elemet_id).attr('desc_id');
lombardofre428af72018-11-15 17:25:25 +0100140 }
lombardofre65ab992018-11-20 23:47:32 +0100141
142 graph_editor.addNode(node_information, function () {
143 console.log("OK")
144 }, function (error) {
145 showAlert(error)
146 })
147
lombardofre428af72018-11-15 17:25:25 +0100148 };
149
150 dropZone.ondragover = function (ev) {
151 console.log("ondragover");
152 return false;
153 };
154
155 dropZone.ondragleave = function () {
156 console.log("ondragleave");
157 return false;
158 };
159}
160
lombardofr1e320062018-10-30 22:16:25 +0100161
162function handleForce(el) {
163 graph_editor.handleForce((el.getAttribute('aria-pressed') === "true"));
164}
165
166function changeFilter(e, c) {
167 if (c && c.link && c.link.view[0]) {
168 updateLegend(c.link.view[0]);
lombardofre428af72018-11-15 17:25:25 +0100169 updatePalette(c.link.view[0]);
lombardofr1e320062018-10-30 22:16:25 +0100170 }
lombardofre428af72018-11-15 17:25:25 +0100171 layerDetails(graph_editor.getCurrentFilters())
lombardofr1e320062018-10-30 22:16:25 +0100172}
173
174function resetFilters() {
175 graph_editor.handleFiltersParams(params);
176}
177
178function buildBehaviorsOnEvents() {
lombardofre428af72018-11-15 17:25:25 +0100179 var contextmenuNodesAction = [];
lombardofr1e320062018-10-30 22:16:25 +0100180 return {
181 'nodes': contextmenuNodesAction
182 };
183
184}
185
186function refreshElementInfo(event, element) {
187 if (event.type === 'node:selected') {
188 switch (element.info.type) {
lombardofre428af72018-11-15 17:25:25 +0100189 case 'vnf':
lombardofr1e320062018-10-30 22:16:25 +0100190 vnfDetails(element.info.osm);
191 break;
192 case 'vdu':
193 vduDetails(element.info.osm);
194 break;
195 case 'int_cp':
lombardofr462eec22018-11-22 10:50:33 +0100196 intcpDetails(element.info.osm);
197 break;
lombardofr1e320062018-10-30 22:16:25 +0100198 case 'cp':
199 cpDetails(element.info.osm);
200 break;
201 case 'vnf_vl':
202 case 'ns_vl':
203 vlDetails(element.info.osm);
204 break;
205 }
206 }
207 else if (event.type === 'node:deselected') {
208 layerDetails(graph_editor.getCurrentFilters())
209 }
210}
211
212function layerDetails(filters) {
lombardofre428af72018-11-15 17:25:25 +0100213 var side = $('#side_form');
lombardofr1e320062018-10-30 22:16:25 +0100214 var graph_parameters = graph_editor.getGraphParams();
215 var layer_template = '';
lombardofre428af72018-11-15 17:25:25 +0100216 if (graph_parameters['view'] && filters.link.view.length > 0 && filters.link.view[0]) {
217 if (filters.link.view[0] === 'nsd') {
218 layer_template = getMainSectionWithSubmitButton('NSD');
219 layer_template += getChildrenTable(graph_parameters['view']['nsd']);
lombardofr1e320062018-10-30 22:16:25 +0100220 }
lombardofre428af72018-11-15 17:25:25 +0100221 else if (filters.link.view[0] === 'vnfd') {
222 layer_template = getMainSectionWithSubmitButton('VNFD');
223
224 layer_template += getChildrenTable(graph_parameters['view']['vnfd']);
lombardofr1e320062018-10-30 22:16:25 +0100225 }
226 }
227
228 side.empty();
229 side.append(layer_template)
230}
231
232function updateLegend(view) {
233 var legend = $('#legenda');
234 var nodes = type_view[view];
235 var legend_template = '';
236 var nodes_properties = osm_gui_properties['nodes'];
lombardofre428af72018-11-15 17:25:25 +0100237 for (var n in nodes) {
lombardofr1e320062018-10-30 22:16:25 +0100238 var node = nodes[n];
lombardofre428af72018-11-15 17:25:25 +0100239 if (nodes_properties[node]) {
lombardofr1e320062018-10-30 22:16:25 +0100240 legend_template += '<div class="node">' +
lombardofre428af72018-11-15 17:25:25 +0100241 '<div class="icon" style="background-color:' + nodes_properties[node].color + '"></div>' +
242 '<div class="name">' + nodes_properties[node].name + '</div></div>';
lombardofr1e320062018-10-30 22:16:25 +0100243 }
244 }
245
246 legend.empty();
247 legend.append(legend_template)
248
249}
250
lombardofre428af72018-11-15 17:25:25 +0100251function updatePalette(view) {
252 var palette = $('#palette');
253 var palette_template = '';
254 palette.empty();
255 if (view === 'vnfd') {
256 var nodes = type_view[view];
257 var nodes_properties = osm_gui_properties['nodes'];
258 for (var n in nodes) {
259 var node = nodes[n];
260 if (nodes_properties[node]) {
261 palette_template += '<div id="drag_' + n + '" class="node ui-draggable"' +
lombardofre65ab992018-11-20 23:47:32 +0100262 'type-name="' + node + '" draggable="true" ondragstart="nodeDragStart(event)">' +
lombardofre428af72018-11-15 17:25:25 +0100263 '<div class="icon" style="background-color:' + nodes_properties[node].color + '"></div>' +
264 '<div class="name">' + nodes_properties[node].name + '</div></div>';
265 }
266 }
267
268 palette.append(palette_template)
269 } else if (view === 'nsd') {
270 $.ajax({
271 url: '/projects/descriptors/composer/availablenodes?layer=nsd',
272 type: 'GET',
273 cache: false,
274 success: function (result) {
275 palette_template += '<div id="drag_ns_vl" class="node ui-draggable"' +
276 'type-name="ns_vl" draggable="true" ondragstart="nodeDragStart(event)">' +
277 '<div class="icon" style="background-color:' + osm_gui_properties['nodes']['ns_vl'].color + '"></div>' +
278 '<div class="name">' + osm_gui_properties['nodes']['ns_vl'].name + '</div></div>';
279 palette_template += getSubSection('VNFD');
280 for (var d in result['descriptors']) {
281 var desc = result['descriptors'][d];
282 palette_template += '<div id="drag_' + desc.id + '" class="node ui-draggable"' +
283 'type-name="vnf" desc_id="' + desc.id + '" draggable="true" ondragstart="nodeDragStart(event)">' +
284 '<div class="icon" style="background-color:#605ca8"></div>' +
285 '<div class="name">' + desc.name + '</div></div>';
286 }
287 palette.append(palette_template)
288 },
289 error: function (result) {
290 showAlert(result);
291 }
292 });
293 }
294
295}
296
lombardofr1e320062018-10-30 22:16:25 +0100297
298function vnfDetails(vnfr) {
lombardofre428af72018-11-15 17:25:25 +0100299 var side = $('#side_form');
lombardofr1e320062018-10-30 22:16:25 +0100300 var vnfr_template = getMainSection('VNF');
301
lombardofre428af72018-11-15 17:25:25 +0100302 vnfr_template += getChildrenTable(vnfr, true);
lombardofr1e320062018-10-30 22:16:25 +0100303 side.empty();
304 side.append(vnfr_template)
305}
306
307function vduDetails(vdur) {
lombardofre428af72018-11-15 17:25:25 +0100308 var side = $('#side_form');
309 var vdur_template = getMainSectionWithSubmitButton('VDU');
lombardofr1e320062018-10-30 22:16:25 +0100310 vdur_template += getChildrenTable(vdur);
311
lombardofr1e320062018-10-30 22:16:25 +0100312 side.empty();
313 side.append(vdur_template)
314}
315
lombardofr462eec22018-11-22 10:50:33 +0100316function intcpDetails(cp) {
317 var side = $('#side_form');
318 var cp_template = getMainSection('Int. Connection Point');
319
320 cp_template += getChildrenTable(cp, true);
321 side.empty();
322 side.append(cp_template);
323}
324
lombardofr1e320062018-10-30 22:16:25 +0100325function cpDetails(cp) {
lombardofre428af72018-11-15 17:25:25 +0100326 var side = $('#side_form');
327 var cp_template = getMainSectionWithSubmitButton('Connection Point');
lombardofr1e320062018-10-30 22:16:25 +0100328
329 cp_template += getChildrenTable(cp);
330 side.empty();
331 side.append(cp_template);
332}
333
334function vlDetails(vl) {
lombardofre428af72018-11-15 17:25:25 +0100335 var side = $('#side_form');
336 var vl_template = getMainSectionWithSubmitButton('Virtual Link');
lombardofr1e320062018-10-30 22:16:25 +0100337
338 vl_template += getChildrenTable(vl);
339 side.empty();
340 side.append(vl_template);
341}
342
343
344function getMainSection(title) {
345 return '<div class="section"><span style="font-weight: 500;">' + title + '</span></div>';
346}
347
lombardofre428af72018-11-15 17:25:25 +0100348function getMainSectionWithSubmitButton(title) {
349 return '<div class="section"><span style="font-weight: 500;">' + title + '</span>' +
350 '<div class="status"><button id="update_button" class="btn btn-xs btn-default" ><i class="fa fa-save"></i> SAVE</button></div></div>';
351}
352
lombardofr1e320062018-10-30 22:16:25 +0100353function getSubSection(title) {
354 return '<div class="section"><span>' + title + '</span></div>';
355}
356
357function getMainSectionWithStatus(title, status) {
358 var template = '<div class="section"><span style="font-weight: 500;">' + title + '</span>';
359 if (status)
360 template += '<div class="status active"><span class="indicator"></span> ACTIVE</div>';
361 else
362 template += '<div class="status"><span class="indicator"></span>NO ACTIVE</div>';
363 template += '</div>';
364 return template;
365}
366
lombardofre428af72018-11-15 17:25:25 +0100367function getChildrenTable(data, ro) {
lombardofr1e320062018-10-30 22:16:25 +0100368 var template = '<table class="children">';
369
370 for (var key in data) {
lombardofre428af72018-11-15 17:25:25 +0100371 if (typeof data[key] !== 'object') {
lombardofr1e320062018-10-30 22:16:25 +0100372 var key_map = (map[key]) ? map[key] : key;
lombardofre428af72018-11-15 17:25:25 +0100373 if (ro)
374 template += '<tr><td>' + key_map + '</td><td>' + data[key] + '</td></tr>';
375 else
376 template += '<tr><td>' + key_map + '</td><td><input name="' + key + '" class="form-control input-sm" type="text" value="' + data[key] + '"></td></tr>';
377
lombardofr1e320062018-10-30 22:16:25 +0100378 }
379 }
380 template += '</table>';
381 return template;
lombardofre428af72018-11-15 17:25:25 +0100382}
383
384function openHelp() {
385 $('#modalTopologyInfoButton').modal('show');
386}
387
388function openTextedit() {
389 window.location.href = '/projects/descriptors/' + getUrlParameter('type') + '/' + getUrlParameter('id')
lombardofr1e320062018-10-30 22:16:25 +0100390}