2bfe351a2cfa8d496095f5f489b490a4de658ea0
[vnfsdk/refrepo.git] / openo-portal / portal-lifecyclemgr / src / main / webapp / lifecyclemgr / js / gsolcm.js
1 /*
2  * Copyright 2016 ZTE Corporation.
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 "AS IS" 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 var templateParameters = {
17     changed: true,
18     parameters: []
19 };
20
21 var lcmHandler = function () {
22     this._addOwnEvents();
23 };
24
25 lcmHandler.prototype = {
26     _addOwnEvents: function () {
27         $('#createNS').click(this.okAction);
28     },
29     okAction: function () {
30         var vimLocation = $('#vim_location').val();
31         if(vimLocation == 'select') {
32             alert('Location must be selected in Template Parameters');
33             return;
34         }
35
36         var serviceInstance = {
37             serviceTemplateId: $("#svcTempl").val(),
38             serviceName: $('#svcName').val(),
39             description: $('#svcDesc').val(),
40             inputParameters: collectServiceParameters(templateParameters.parameters),
41             vimLocation: vimLocation
42         };
43         var gatewayService = '/openoapi/servicegateway/v1/services';
44         $.when(
45             fetchServiceTemplateBy(serviceInstance.serviceTemplateId)
46         ).then(
47             function(template) {
48                 serviceInstance.templateName = template.name;
49                 serviceInstance.serviceType = template.serviceType;
50                 return createNetworkServiceInstance(template, serviceInstance, gatewayService);
51             }
52         ).then(
53             function(serviceInstance) {
54                 updateTable(serviceInstance);
55                 $('#vmAppDialog').removeClass('in').css('display', 'none');
56             }
57         );
58     }
59 };
60
61 function initParameterTab() {
62     // Service template was not changed. Do not re-initiate the parameter tab.
63     if (!templateParameters.changed) {
64         return;
65     }
66     var templateId = $("#svcTempl").val();
67     if ('select' === templateId) {
68         document.getElementById("templateParameterTab").innerHTML = '';
69         return;
70     }
71     $.when(
72         generateTemplateParametersComponent(templateId),
73         generateLocationComponent(templateId)
74     ).then(
75         function (templateParameters, location) {
76             document.getElementById("templateParameterTab").innerHTML = templateParameters + location;
77         }
78     );
79 }
80
81 function generateTemplateParametersComponent(templateId) {
82     var defer = $.Deferred();
83     $.when(
84         fetchTemplateParameterDefinitions(templateId),
85         fetchGsoNestingTemplateParameters(templateId)
86     ).then(
87         function (templateParameterResponse, nestingTempatesParas) {
88                 var inputParas = concat(templateParameterResponse[0].inputs, nestingTempatesParas);
89             templateParameters = translateToTemplateParameters(inputParas);
90             defer.resolve(transformToComponents(templateParameters.parameters));
91         }
92     );
93     return defer;
94 }
95
96 function fetchGsoNestingTemplateParameters(templateId) {
97         var defer = $.Deferred();
98         var nestingParams = [];
99         $.when(
100                 fetchServiceTemplateBy(templateId)
101         ).then(
102             function(template) {
103                 if(template.serviceType === 'GSO') {
104                         return fetchNodeTemplates(templateId);
105                 }
106                 // There are no nesting template parameters for non GSO.
107                 defer.resolve([]);
108             }
109         ).then(
110             function(nodeTemplates) {
111                 var count = nodeTemplates.length;
112                 if(count ===0) {
113                         defer.resolve([]);
114                         return;
115                 }
116                 var params = $.Deferred();
117                 params.progress(function(inputs) {
118                         pushAll(nestingParams, inputs);
119                         count--;
120                         if(count === 0) {
121                                 defer.resolve(nestingParams);
122                         }
123                 });
124                 nodeTemplates.forEach(function(nodeTemplate) {
125                         var nestingNodeUri = '/openoapi/catalog/v1/servicetemplates/nesting?nodeTypeIds=' + nodeTemplate.type;
126                         $.when(
127                                 $.ajax({
128                                         type: "GET",
129                                         url: nestingNodeUri
130                                 })
131                         ).then(
132                             function(serviceTemplates) {
133                                 var oneNodeParameters = []
134                                 serviceTemplates.forEach(function(serviceTemplate) {
135                                         pushAll(oneNodeParameters, serviceTemplate.inputs.map(function(input) {
136                                                 input.name = nodeTemplate.type + '.' + input.name;
137                                                 return input;
138                                         }));
139                                 })
140                                 params.notify(oneNodeParameters);
141                             }
142                         );
143                 });
144             }
145         );
146         return defer;
147 }
148
149 function fetchNodeTemplates(templateId) {
150         var nodeTemplateUri = '/openoapi/catalog/v1/servicetemplates/'+ templateId +'/nodetemplates';
151         return $.ajax({
152                 type: "GET",
153                 url: nodeTemplateUri
154         });
155 }
156
157 function concat(array1, array2) {
158         var result = [];
159         pushAll(result, array1);
160         pushAll(result, array2);
161         return result;
162 }
163
164 function pushAll(acc, array) {
165         var result = acc;
166         array.forEach(function(element) {
167                 result.push(element)
168         })
169         return result;
170 }
171
172 function generateLocationComponent(templateId) {
173     var defer = $.Deferred();
174     $.when(
175         fetchServiceTemplateBy(templateId)
176     ).then(
177         function (template) {
178             if(template.serviceType === 'SDNO') {
179                 // SDNO need not config location parameter.
180                 defer.resolve('');
181                 return;
182             }
183             $.when(
184                 fetchVimInfo()
185             ).then(
186                 function (vimsResponse) {
187                     var vims = translateToVimInfo(vimsResponse);
188                     defer.resolve(transformToLocationComponent(vims));
189                 }
190             )
191         }
192     );
193     return defer;
194 }
195
196 function fetchTemplateParameterDefinitions(templateId) {
197     var queryParametersUri = '/openoapi/catalog/v1/servicetemplates/' + templateId + '/parameters';
198     return $.ajax({
199         type: "GET",
200         url: queryParametersUri
201     });
202 }
203
204 function fetchVimInfo() {
205     var vimQueryUri = '/openoapi/extsys/v1/vims';
206     return $.ajax({
207         type: "GET",
208         url: vimQueryUri
209     });
210 }
211
212 function translateToTemplateParameters(inputs) {
213     var inputParameters = [];
214     var i;
215     for (i = 0; i < inputs.length; i += 1) {
216         inputParameters[i] = {
217             name: inputs[i].name,
218             type: inputs[i].type,
219             description: inputs[i].description,
220             defaultValue: inputs[i].defaultValue,
221             required: inputs[i].required,
222             id: 'parameter_' + i,
223             value: inputs[i].defaultValue || ''
224         };
225     }
226     return {changed: false, parameters: inputParameters};
227 }
228
229 function translateToVimInfo(vims) {
230     var result = [];
231     var i;
232     for (i = 0; i < vims.length; i += 1) {
233         var option = '<option value="' + vims[i].vimId + '">' + vims[i].name + '</option>';
234         result[i] = {
235             vimId: vims[i].vimId,
236             vimName: vims[i].name
237         };
238     }
239     return result;
240 }
241
242 function transformToComponents(parameters) {
243     var components = '';
244     var i;
245     for (i = 0; i < parameters.length; i += 1) {
246         var component = '<div class="mT15 form-group" style="margin-left:25px;">' +
247             '<label class="col-sm-3 control-label">' +
248             '<span>' + parameters[i].description + '</span>' + generateRequiredLabel(parameters[i]) +
249             '</label>' +
250             '<div class="col-sm-7">' +
251             '<input type="text" id="' + parameters[i].id + '" name="parameter description" class="form-control" placeholder="' +
252             parameters[i].description + '" value="' + parameters[i].value + '" />' +
253             '</div></div>';
254         components = components + component;
255     }
256     return components;
257 }
258
259 function generateRequiredLabel(parameter) {
260     var requiredLabel = '';
261     if (parameter.required === 'true') {
262         requiredLabel = '<span class="required">*</span>';
263     }
264     return requiredLabel;
265 }
266
267 function transformToLocationComponent(vims) {
268     var component = '<div class="form-group" style="margin-left:25px;margin-bottom:15px;">' +
269         '<label class="col-sm-3 control-label">' +
270         '<span>Location</span>' +
271         '<span class="required">*</span>' +
272         '</label>' +
273         '<div class="col-sm-7">' +
274         '<select class="form-control" style ="padding-top: 0px;padding-bottom: 0px;"' +
275         ' id="vim_location" name="vim_location">' +
276         transformToOptions(vims) +
277         '</select></div></div>';
278     return component;
279 }
280
281 function transformToOptions(vims) {
282     var options = '<option value="select">--select--</option>';
283     var i;
284     for (i = 0; i < vims.length; i += 1) {
285         var option = '<option value="' + vims[i].vimId + '">' + vims[i].vimName + '</option>';
286         options = options + option;
287     }
288     return options;
289 }
290
291 function fetchServiceTemplateBy(templateId) {
292     var defer = $.Deferred();
293     var serviceTemplateUri = '/openoapi/catalog/v1/servicetemplates/' + templateId;
294     var template = {};
295     $.when(
296         $.ajax({
297             type: "GET",
298             url: serviceTemplateUri,
299             contentType: "application/json"
300         })
301     ).then(
302         function(response) {
303             template.name = response.templateName;
304             template.gsarId = response.csarId;
305             var queryCsarUri = '/openoapi/catalog/v1/csars/' + template.gsarId;
306             return $.ajax({
307                 type: "GET",
308                 url: queryCsarUri,
309                 contentType: "application/json"
310             });
311         }
312     ).then(
313         function(response) {
314             if(response.type === 'GSAR') {
315                 template.serviceType = 'GSO';
316             } else if(response.type === 'NSAR' || response.type === 'NFAR') {
317                 template.serviceType = 'NFVO';
318             } else if(response.type === 'SSAR') {
319                 template.serviceType = "SDNO";
320             }
321             defer.resolve(template)
322         }
323     );
324     return defer;
325 }
326
327 function createNetworkServiceInstance(template, serviceInstance, gatewayService) {
328     if (template.serviceType === 'GSO') {
329         return createGsoServiceInstance(gatewayService, serviceInstance, template);
330     } else if (template.serviceType === 'NFVO') {
331         return createNfvoServiceInstance(gatewayService, serviceInstance);
332     } else if (template.serviceType === 'SDNO') {
333         return createSdnoServiceInstance(gatewayService, serviceInstance);
334     }
335 }
336
337 function createGsoServiceInstance(gatewayService, serviceInstance, serviceTemplate) {
338     var defer = $.Deferred();
339     serviceInstance.inputParameters.location = serviceInstance.vimLocation;
340     var gsoLcmUri = '/openoapi/gso/v1/services';
341     var parameter = {
342         'service': {
343                 'name': serviceInstance.serviceName,
344                 'description': serviceInstance.description,
345                 'serviceDefId': serviceTemplate.gsarId,
346                 'templateId': serviceInstance.serviceTemplateId,
347                 'templateName': serviceTemplate.templateName,
348                 'gatewayUri': gsoLcmUri,
349                 'parameters': serviceInstance.inputParameters
350         }
351     };
352     $.when($.ajax({
353         type: "POST",
354         url: gatewayService,
355         contentType: "application/json",
356         dataType: "json",
357         data: JSON.stringify(parameter)
358     })).then(function(response) {
359         serviceInstance.serviceId = response.serviceId;
360         defer.resolve(serviceInstance);
361     });
362     return defer;
363 }
364
365 function createNfvoServiceInstance(gatewayService, serviceInstance) {
366     var nfvoLcmNsUri = '/openoapi/nslcm/v1.0/ns';
367     serviceInstance.inputParameters.location = serviceInstance.vimLocation;
368     return createServiceInstance(gatewayService, nfvoLcmNsUri, serviceInstance);
369 }
370
371 function createSdnoServiceInstance(gatewayService, serviceInstance) {
372     var sdnoLcmNsUri = '/openoapi/sdnonslcm/v1/ns';
373     return createServiceInstance(gatewayService, sdnoLcmNsUri, serviceInstance);
374 }
375
376 function createServiceInstance(gatewayService, nsUri, serviceInstance) {
377     var defer = $.Deferred();
378     var sParameter = {
379         'nsdId': serviceInstance.serviceTemplateId,
380         'nsName': serviceInstance.serviceName,
381         'description': serviceInstance.description,
382         'gatewayUri': nsUri
383     };
384     $.when($.ajax({
385         type: "POST",
386         url: gatewayService,
387         contentType: "application/json",
388         dataType: "json",
389         data: JSON.stringify(sParameter)
390     })).then(function(response) {
391         var nsInstanceId = response.serviceId;
392         serviceInstance.serviceId = nsInstanceId;
393         var initNsUrl = nsUri + '/' + nsInstanceId + '/Instantiate';
394         var parameter = {
395             'gatewayUri': initNsUrl,
396             'nsInstanceId': nsInstanceId,
397             'additionalParamForNs': serviceInstance.inputParameters
398         };
399         return $.ajax({
400             type: "POST",
401             url: gatewayService,
402             contentType: "application/json",
403             dataType: "json",
404             data: JSON.stringify(parameter)
405         });
406     }).then(function() {
407         defer.resolve(serviceInstance);
408     });
409     return defer;
410 }
411
412
413 function collectServiceParameters(parameters) {
414     var serviceParameters = {};
415     var i;
416     for (i = 0; i < parameters.length; i += 1) {
417         serviceParameters[parameters[i].name] = $('#' + parameters[i].id).val();
418     }
419     return serviceParameters;
420 }
421
422 function updateTable(serviceInstance) {
423     serviceInstance.createTime = formatDate(new Date());
424     $('#sai').bootstrapTable("append", serviceInstance);
425 }
426
427 function formatDate(date) {
428     var year = date.getFullYear();
429     var month = date.getMonth() + 1;
430     var day = date.getDate();
431     var hh = date.getHours();
432     var mm = date.getMinutes();
433     var ss = date.getSeconds();
434     return year + "-" + month + "-" + day + " " + hh + ":" + mm + ":" + ss;
435 }
436
437 function deleteNe(rowId, row) {
438     var instanceId = row.serviceId;
439     var serviceType = row.serviceType;
440     var gatewayService = '/openoapi/servicegateway/v1/services/' + instanceId + '/terminate';
441     var remove = function () {
442         $('#sai').bootstrapTable('remove', {field: 'serviceId', values: [instanceId]});
443     };
444     if(serviceType === 'GSO') {
445         deleteGsoServiceInstance(gatewayService, instanceId, remove)
446     } else if (serviceType === 'NFVO') {
447         var nfvoNsUri = '/openoapi/nslcm/v1.0/ns';
448         deleteNonGsoServiceInstance(gatewayService, nfvoNsUri, instanceId, remove);
449     } else if (serviceType === 'SDNO') {
450         var sdnoNsUri = '/openoapi/sdnonslcm/v1/ns';
451         deleteNonGsoServiceInstance(gatewayService, sdnoNsUri, instanceId, remove);
452     }
453 }
454
455 function deleteGsoServiceInstance(gatewayService, instanceId, remove) {
456     var gsoLcmUri = '/openoapi/gso/v1/services';
457     $.when(
458         deleteNetworkServiceInstance(gatewayService, gsoLcmUri, instanceId)
459     ).then(
460         function() {
461             remove();
462         }
463     );
464 }
465
466 function deleteNonGsoServiceInstance(gatewayService, nsUri, instanceId, remove) {
467     $.when(
468         terminateNetworkServiceInstance(gatewayService, nsUri, instanceId)
469     ).then(
470         function() {
471             return deleteNetworkServiceInstance(gatewayService, nsUri, instanceId);
472         }
473     ).then(
474         function() {
475             remove();
476         }
477     )
478 }
479
480 function deleteNetworkServiceInstance(gatewayService, nsUri, instanceId) {
481     var instanceUri = nsUri + '/' + instanceId;
482     var parameter = {
483         'operation': "DELETE",
484         'gatewayUri': instanceUri
485     };
486     return $.ajax({
487         type: "POST",
488         url: gatewayService,
489         contentType: "application/json",
490         dataType: "json",
491         data: JSON.stringify(parameter)
492     });
493 }
494
495 function terminateNetworkServiceInstance(gatewayService, nsUri, instanceId) {
496     var instanceUri = nsUri + '/' + instanceId;
497     var nsTerminateUri = instanceUri + '/terminate';
498     var terminateParameter = {
499         'nsInstanceId': instanceId,
500         'terminationType': "graceful",
501         'gracefulTerminationTimeout': "60",
502         'operation': "POST",
503         'gatewayUri': nsTerminateUri
504     };
505     return $.ajax({
506         type: "POST",
507         url: gatewayService,
508         contentType: "application/json",
509         dataType: "json",
510         data: JSON.stringify(terminateParameter)
511     });
512 }