CLIENT GUI Framework
[vnfsdk/refrepo.git] / openo-portal / portal-lifecyclemgr / src / main / webapp / lifecyclemgr / js / gsolcm.js
1 /*\r
2  * Copyright 2016-2017 ZTE Corporation.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *         http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 var templateParameters = {\r
17     changed: true,\r
18     parameters: [],\r
19     vimInfos: []\r
20 };\r
21 \r
22 var lcmHandler = function () {\r
23     this._addOwnEvents();\r
24     jQuery.i18n.properties({\r
25         language:'en-US',\r
26         name:'lcm-template-parameters-i18n',\r
27         path:'i18n/',\r
28         mode:'map'\r
29     });\r
30 };\r
31 \r
32 lcmHandler.prototype = {\r
33     _addOwnEvents: function () {\r
34         $('#createNS').click(this.okAction);\r
35     },\r
36     okAction: function () {\r
37         if(!checkLocation(templateParameters.parameters)) {\r
38                 alert('Location must be selected in Template Parameters');\r
39                 return;\r
40         }\r
41         $.isLoading({ text: "Creating service..." });\r
42         var serviceInstance = {\r
43             serviceTemplateId: $("#svcTempl").val(),\r
44             serviceName: $('#svcName').val(),\r
45             description: $('#svcDesc').val(),\r
46             inputParameters: collectServiceParameters(templateParameters.parameters)\r
47         };\r
48         var gatewayService = '/openoapi/servicegateway/v1/services';\r
49         $.when(\r
50             fetchServiceTemplateBy(serviceInstance.serviceTemplateId)\r
51         ).then(\r
52             function(template) {\r
53                 serviceInstance.templateName = template.name;\r
54                 serviceInstance.serviceType = template.serviceType;\r
55                 return createNetworkServiceInstance(template, serviceInstance, gatewayService);\r
56             }\r
57         ).then(\r
58             function(response) {\r
59                 $.isLoading('hide');\r
60                 if(response.status === 'success') {\r
61                     updateTable(response.instance);\r
62                     $('#vmAppDialog').removeClass('in').css('display', 'none');\r
63                 } else {\r
64                     showErrorMessage('Create service failed', response.errorResult);\r
65                 }\r
66             }\r
67         );\r
68     }\r
69 };\r
70 \r
71 function showErrorMessage(title, result) {\r
72     var info = '<br/>' + '<h5>' + title + '</h5><hr/>';\r
73     info = info + '<h6>Status: ' + result.status + '</h6><p/>';\r
74     info = info + '<h6>Description: </h6>';\r
75     if(result.statusDescription.forEach === undefined) {\r
76         info = info + '<h6>' + result.statusDescription + '</h6><p/>';\r
77     } else {\r
78         result.statusDescription.forEach(function(message) {\r
79             info = info + '<h6>' + message + '</h6><p/>';\r
80         });    \r
81     }\r
82     info = info + '<h6>Error code: '+ result.errorCode + '</h6>';\r
83     $.bootstrapGrowl(info, {\r
84         type: 'danger',\r
85         align: 'center',\r
86         width: "auto",\r
87         delay: 10000,\r
88         allow_dismiss: true\r
89     });\r
90 }\r
91 \r
92 function checkLocation(parameters) {\r
93         var checkPass = true;\r
94         var i = 0;\r
95         for(i = 0; i < parameters.length; i++) {\r
96                 if(parameters[i].type === 'location') {\r
97                         var value = $('#' + parameters[i].id).val();\r
98                         if(value === undefined || value === 'select') {\r
99                                 checkPass = false;\r
100                         }\r
101                 }\r
102         }\r
103         return checkPass;\r
104 }\r
105 \r
106 function initParameterTab() {\r
107         // Service template was not changed. Do not re-initiate the parameter tab.\r
108     if (!templateParameters.changed) {\r
109         return;\r
110     }\r
111     var templateId = $("#svcTempl").val();\r
112     if ('select' === templateId) {\r
113         document.getElementById("templateParameterTab").innerHTML = '';\r
114         return;\r
115     }\r
116         $.when(\r
117                 fetchServiceTemplateBy(templateId)\r
118         ).then(\r
119             function(template) {\r
120                 if(template.serviceType === 'GSO') {\r
121                         return fetchGsoTemplateInputParameters(templateId, template);\r
122                 } else if(template.serviceType === 'NFVO') {\r
123                         return fetchNfvoTemplateInputParameters(templateId, template);\r
124                 } else if(template.serviceType === 'SDNO') {\r
125                         return fetchSdnoTemplateInputParameters(templateId, template);\r
126                 }\r
127             }\r
128         ).then(\r
129             function(parameters) {\r
130                 var components = transformToComponents(parameters);\r
131                 document.getElementById("templateParameterTab").innerHTML = components;\r
132             }\r
133         );\r
134 }\r
135 \r
136 function fetchServiceTemplateBy(templateId) {\r
137     var defer = $.Deferred();\r
138     var serviceTemplateUri = '/openoapi/catalog/v1/servicetemplates/' + templateId;\r
139     var template = {};\r
140     $.when(\r
141         $.ajax({\r
142             type: "GET",\r
143             url: serviceTemplateUri,\r
144             contentType: "application/json"\r
145         })\r
146     ).then(\r
147         function(response) {\r
148             template.name = response.templateName;\r
149             template.gsarId = response.csarId;\r
150             template.id = response.id;\r
151             template.nodeType = '';\r
152             return fetchCsar(template.gsarId);\r
153         }\r
154     ).then(\r
155         function(response) {\r
156             if(response.type === 'GSAR') {\r
157                 template.serviceType = 'GSO';\r
158             } else if(response.type === 'NSAR' || response.type === 'NFAR') {\r
159                 template.serviceType = 'NFVO';\r
160             } else if(response.type === 'SSAR') {\r
161                 template.serviceType = "SDNO";\r
162             }\r
163             defer.resolve(template)\r
164         }\r
165     );\r
166     return defer;\r
167 }\r
168 \r
169 function fetchCsar(csarId) {\r
170         var queryCsarUri = '/openoapi/catalog/v1/csars/' + csarId;\r
171         return $.ajax({\r
172                 type: "GET",\r
173                 url: queryCsarUri,\r
174                 contentType: "application/json"\r
175         });\r
176 }\r
177 \r
178 function fetchGsoTemplateInputParameters(templateId, template) {\r
179         var defer = $.Deferred();\r
180     $.when(\r
181         fetchTemplateParameterDefinitions(templateId),\r
182         fetchGsoNestingTemplateParameters(templateId),\r
183         fetchVimInfo(),\r
184         fetchSdnController()\r
185     ).then(\r
186         function (templateParameterResponse, nestingTempatesParas, vimInfoResponse, sdnControllersResponse) {\r
187             var inputs = templateParameterResponse[0].inputs.map(function(input) {\r
188                 input.showName = input.name;\r
189                 if(template.nodeType === null || template.nodeType === undefined || template.nodeType.length === 0) {\r
190                     input.i18nKey = input.name;    \r
191                 } else {\r
192                     input.i18nKey = template.nodeType + '.' +input.name;    \r
193                 }\r
194                 return input;\r
195             });\r
196                 var inputParas = concat(inputs, nestingTempatesParas);\r
197                 var vims = translateToVimInfo(vimInfoResponse[0]);\r
198             var sdnControllers = translateToSdnControllers(sdnControllersResponse[0]);\r
199             templateParameters = translateToTemplateParameters(inputParas, vims, sdnControllers);\r
200             defer.resolve(templateParameters);\r
201         }\r
202     );\r
203     return defer;\r
204 }\r
205 \r
206 function fetchGsoNestingTemplateParameters(templateId) {\r
207         var defer = $.Deferred();\r
208         $.when(\r
209                 fetchNodeTemplates(templateId)\r
210         ).then(\r
211             function(nodeTemplates) {\r
212                 var count = nodeTemplates.length;\r
213                 if(count ===0) {\r
214                         defer.resolve([]);\r
215                         return;\r
216                 }\r
217                 var nestingParasAggregatation = aggregate(count, function(nestingParas) {\r
218                         defer.resolve(nestingParas);\r
219                 });\r
220                 nodeTemplates.forEach(function(nodeTemplate) {\r
221                         var nestingNodeUri = '/openoapi/catalog/v1/servicetemplates/nesting?nodeTypeIds=' + nodeTemplate.type;\r
222                         $.when(\r
223                                 $.ajax({\r
224                                         type: "GET",\r
225                                         url: nestingNodeUri\r
226                                 })\r
227                         ).then(\r
228                             function(serviceTemplates) {\r
229                                 var nodeAggregatation = aggregate(serviceTemplates.length, function(oneNodeParameters) {\r
230                                         nestingParasAggregatation.notify(oneNodeParameters);\r
231                                 });\r
232                                 serviceTemplates.forEach(function(serviceTemplate) {\r
233                             if(serviceTemplate === null || serviceTemplate === undefined || serviceTemplate.inputs === undefined || serviceTemplate.csarId === undefined)\r
234                             {\r
235                                 nodeAggregatation.notify([]);\r
236                                 return;\r
237                             }\r
238                                         var inputs = serviceTemplate.inputs.map(function(input) {\r
239                                 input.showName = input.name;\r
240                                                 input.name = nodeTemplate.type + '.' + input.name;\r
241                                 input.i18nKey = nodeTemplate.type + '.' + input.name;\r
242                                                 return input;\r
243                                         });\r
244                                         $.when(\r
245                                                 fetchCsar(serviceTemplate.csarId)\r
246                                         ).then(\r
247                                             function(response) {\r
248                                                 if(response.type === 'NSAR' || response.type === 'NFAR') {\r
249                                                         inputs.push({\r
250                                                                 name: nodeTemplate.type + '.location',\r
251                                                                 type: 'location',\r
252                                                                 description: nodeTemplate.name + ' Location',\r
253                                                                 required: 'true',\r
254                                             showName: nodeTemplate.name + ' Location',\r
255                                             i18nKey: nodeTemplate.name + ' Location'\r
256                                                         });\r
257                                         inputs.push({\r
258                                             name: nodeTemplate.type + '.sdncontroller',\r
259                                             type: 'sdncontroller',\r
260                                             description: nodeTemplate.name + ' SDN Controller',\r
261                                             required: 'true',\r
262                                             showName: nodeTemplate.name + ' SDN Controller',\r
263                                             i18nKey: nodeTemplate.name + ' SDN Controller'\r
264                                         });\r
265                                     }\r
266                                                 nodeAggregatation.notify(inputs);\r
267                                             }\r
268                                         );\r
269                                 });\r
270                             }\r
271                         );\r
272                 });\r
273             }\r
274         );\r
275         return defer;\r
276 }\r
277 \r
278 function fetchNodeTemplates(templateId) {\r
279         var nodeTemplateUri = '/openoapi/catalog/v1/servicetemplates/'+ templateId +'/nodetemplates';\r
280         return $.ajax({\r
281                 type: "GET",\r
282                 url: nodeTemplateUri\r
283         });\r
284 }\r
285 \r
286 function aggregate(n, deferFun) {\r
287         var aggregation = $.Deferred();\r
288         var count = n;\r
289         var result = [];\r
290         aggregation.progress(function(array) {\r
291                 pushAll(result, array);\r
292                 count--;\r
293                 if(count === 0) {\r
294                         deferFun(result);\r
295                 }\r
296         });\r
297         return aggregation;\r
298 }\r
299 \r
300 function concat(array1, array2) {\r
301         var result = [];\r
302         pushAll(result, array1);\r
303         pushAll(result, array2);\r
304         return result;\r
305 }\r
306 \r
307 function pushAll(acc, array) {\r
308         var result = acc;\r
309         array.forEach(function(element) {\r
310                 result.push(element)\r
311         })\r
312         return result;\r
313 }\r
314 \r
315 function translateToTemplateParameters(inputs, vims, controllers) {\r
316     var inputParameters = [];\r
317     var i;\r
318     for (i = 0; i < inputs.length; i += 1) {\r
319         inputParameters[i] = {\r
320             name: inputs[i].name,\r
321             type: inputs[i].type,\r
322             description: inputs[i].description,\r
323             defaultValue: inputs[i].defaultValue,\r
324             required: inputs[i].required,\r
325             id: 'parameters_' + i,\r
326             value: inputs[i].defaultValue || '',\r
327             showName: inputs[i].showName\r
328         };\r
329     }\r
330     return {changed: false, parameters: inputParameters, vimInfos: vims, sdnControllers: controllers};\r
331 }\r
332 \r
333 function fetchNfvoTemplateInputParameters(templateId, template) {\r
334         var defer = $.Deferred();\r
335         $.when(\r
336                 fetchTemplateParameterDefinitions(templateId),\r
337                 fetchVimInfo(),\r
338         fetchSdnController()\r
339         ).then(\r
340             function (templateParameterResponse, vimInfoResponse, sdnControllerResponse) {\r
341                 var vims = translateToVimInfo(vimInfoResponse[0]);\r
342             var sdnControllers = translateToSdnControllers(sdnControllerResponse[0]);\r
343                 var inputParas = templateParameterResponse[0].inputs;\r
344             inputParas = inputParas.map(function(input) {\r
345                 input.showName = input.name;\r
346                 input.i18nKey = template.nodeType + '.' + input.name;\r
347                 return input;\r
348             });\r
349                 inputParas.push({\r
350                         name: 'location',\r
351                         type: 'location',\r
352                         description: 'Location',\r
353                         required: 'true',\r
354                 showName: 'Location',\r
355                 i18nKey: 'Location'\r
356                 });\r
357             inputParas.push({\r
358                 name: 'sdncontroller',\r
359                 type: 'sdncontroller',\r
360                 description: 'SDN Controller',\r
361                 required: 'true',\r
362                 showName: 'SDN Controller',\r
363                 i18nKey: 'SDN Controller'\r
364             });\r
365                 templateParameters = translateToTemplateParameters(inputParas, vims, sdnControllers);\r
366             defer.resolve(templateParameters);  \r
367             }\r
368         );\r
369         return defer;\r
370 }\r
371 \r
372 function fetchSdnoTemplateInputParameters(templateId, template) {\r
373         var defer = $.Deferred();\r
374         $.when(\r
375                 fetchTemplateParameterDefinitions(templateId)\r
376         ).then(\r
377             function (templateParameterResponse) {\r
378             var inputs = templateParameterResponse.inputs.map(function(input) {\r
379                 input.showName = input.name;\r
380                 input.i18nKey = template.nodeType + '.' + input.name;\r
381                 return input;\r
382             })\r
383                 templateParameters = translateToTemplateParameters(inputs, [], []);\r
384             defer.resolve(templateParameters);  \r
385             }\r
386         );\r
387         return defer;\r
388 }\r
389 \r
390 function fetchTemplateParameterDefinitions(templateId) {\r
391     var queryParametersUri = '/openoapi/catalog/v1/servicetemplates/' + templateId + '/parameters';\r
392     return $.ajax({\r
393         type: "GET",\r
394         url: queryParametersUri\r
395     });\r
396 }\r
397 \r
398 function fetchVimInfo() {\r
399     var vimQueryUri = '/openoapi/extsys/v1/vims';\r
400     return $.ajax({\r
401         type: "GET",\r
402         url: vimQueryUri\r
403     });\r
404 }\r
405 \r
406 function fetchSdnController() {\r
407     var sdnControllerUri = '/openoapi/extsys/v1/sdncontrollers';\r
408     return $.ajax({\r
409         type: "GET",\r
410         url: sdnControllerUri\r
411     });\r
412 }\r
413 \r
414 function translateToVimInfo(vims) {\r
415         return vims.map(function (vim) {\r
416                 return {\r
417                         optionId: vim.vimId,\r
418                         optionName: vim.name\r
419                 };\r
420         });\r
421 }\r
422 \r
423 function translateToSdnControllers(controllers) {\r
424     return controllers.map(function(controller) {\r
425         return {\r
426             optionId: controller.sdnControllerId,\r
427             optionName: controller.name\r
428         };\r
429     });\r
430 }\r
431 \r
432 function transformToComponents(templateParas) {\r
433         var inputs = templateParas.parameters;\r
434         var vimInfos = templateParas.vimInfos;\r
435     var sdnControllers = templateParas.sdnControllers;\r
436         var components = '';\r
437         inputs.forEach(function (inputPara) {\r
438                 if(inputPara.type === 'location') {\r
439                         components = components + generateComboxComponent(inputPara, vimInfos);\r
440                 } else if(inputPara.type === 'sdncontroller') {\r
441             components = components + generateComboxComponent(inputPara, sdnControllers);\r
442         } else {\r
443                         components = components + generateComponent(inputPara);\r
444                 }\r
445         });\r
446         return components;\r
447 }\r
448 \r
449 function generateComboxComponent(inputPara, items) {\r
450     var component = '<div class="form-group" style="margin-left:25px;margin-bottom:15px;">' +\r
451         '<label class="col-sm-3 control-label">' +\r
452         '<span>'+ inputPara.showName +'</span>' +\r
453         '<span class="required">*</span>' +\r
454         '</label>' +\r
455         '<div class="col-sm-7">' +\r
456         '<select class="form-control" style ="padding-top: 0px;padding-bottom: 0px;"' +\r
457         ' id="' + inputPara.id + '" name="'+ inputPara.name +'">' +\r
458         transformToOptions(items) +\r
459         '</select></div></div>';\r
460     return component;\r
461 }\r
462 \r
463 function transformToOptions(items) {\r
464     var options = '<option value="select">--select--</option>';\r
465     var i;\r
466     for (i = 0; i < items.length; i += 1) {\r
467         var option = '<option value="' + items[i].optionId + '">' + items[i].optionName + '</option>';\r
468         options = options + option;\r
469     }\r
470     return options;\r
471 }\r
472 \r
473 function generateComponent(inputPara) {\r
474         var component = '<div class="mT15 form-group" style="margin-left:25px;">' +\r
475             '<label class="col-sm-3 control-label">' +\r
476             '<span>' + showName(inputPara) + '</span>' + generateRequiredLabel(inputPara) +\r
477             '</label>' +\r
478             '<div class="col-sm-7">' +\r
479             '<input type="text" id="' + inputPara.id + '" name="parameter description" class="form-control" placeholder="' +\r
480             showName(inputPara) + '" value="' + inputPara.value + '" />' +\r
481             '</div></div>';\r
482     return component;\r
483 }\r
484 \r
485 function showName(inputPara) {\r
486     var name = $.i18n.prop(inputPara.name)\r
487     if(name.length === 0 || name.slice(0, 1) === '[') {\r
488         name = inputPara.showName;\r
489     }\r
490     return name;\r
491 }\r
492 \r
493 function generateRequiredLabel(parameter) {\r
494     var requiredLabel = '';\r
495     if (parameter.required === 'true') {\r
496         requiredLabel = '<span class="required">*</span>';\r
497     }\r
498     return requiredLabel;\r
499 }\r
500 \r
501 function createNetworkServiceInstance(template, serviceInstance, gatewayService) {\r
502     if (template.serviceType === 'GSO') {\r
503         return createGsoServiceInstance(gatewayService, serviceInstance, template);\r
504     } else if (template.serviceType === 'NFVO') {\r
505         return createNfvoServiceInstance(gatewayService, serviceInstance, template);\r
506     } else if (template.serviceType === 'SDNO') {\r
507         return createSdnoServiceInstance(gatewayService, serviceInstance);\r
508     }\r
509 }\r
510 \r
511 function createGsoServiceInstance(gatewayService, serviceInstance, serviceTemplate) {\r
512     var defer = $.Deferred();\r
513     var gsoLcmUri = '/openoapi/gso/v1/services';\r
514     var parameter = {\r
515         'service': {\r
516                 'name': serviceInstance.serviceName,\r
517                 'description': serviceInstance.description,\r
518                 'serviceDefId': serviceTemplate.gsarId,\r
519                 'templateId': serviceInstance.serviceTemplateId,\r
520                 'templateName': serviceTemplate.name,\r
521                 'gatewayUri': gsoLcmUri,\r
522                 'parameters': serviceInstance.inputParameters\r
523         }\r
524     };\r
525     $.when($.ajax({\r
526         type: "POST",\r
527         url: gatewayService,\r
528         contentType: "application/json",\r
529         dataType: "json",\r
530         data: JSON.stringify(parameter)\r
531     })).then(function(response) {\r
532         if(response.result.status === 'success') {\r
533             serviceInstance.serviceId = response.serviceId;\r
534             var gsoServiceUri = '/openoapi/gso/v1/services/' + response.serviceId;\r
535             var timerDefer = $.Deferred();\r
536             var timeout = 3600000;\r
537             var fun = function() {\r
538                 if(timeout === 0) {\r
539                     timerDefer.resolve({\r
540                         status: 'fail', \r
541                         statusDescription: 'Operation is timeout!', \r
542                         errorCode: ''\r
543                     });\r
544                     return;\r
545                 }\r
546                 timeout = timeout - 1000;\r
547                 $.when(\r
548                     $.ajax({\r
549                         type: "GET",\r
550                         url: gsoServiceUri\r
551                     })\r
552                 ).then(\r
553                     function(response) {\r
554                         if(response.result === 'success' || response.result === 'failed') {\r
555                             timerDefer.resolve(response);\r
556                         }\r
557                     }\r
558                 );\r
559             };\r
560             var timerId = setInterval(fun, 1000);\r
561             $.when(timerDefer).then(\r
562                 function(responseDesc) {\r
563                     clearInterval(timerId);\r
564                     if(responseDesc.result === 'success') {\r
565                         defer.resolve({status: 'success', instance: serviceInstance});\r
566                     } else {\r
567                         defer.resolve({\r
568                             status: 'fail', \r
569                             errorResult: {\r
570                                 status: responseDesc.result, \r
571                                 statusDescription: 'fail to create the service', \r
572                                 errorCode: ''\r
573                             }});\r
574                     }\r
575                 }\r
576              );\r
577         } else {\r
578             defer.resolve({status: 'fail', errorResult: {status:'fail', statusDescription: 'fail to create the service', errorCode: ''}});\r
579         }\r
580     });\r
581     return defer;\r
582 }\r
583 \r
584 function createNfvoServiceInstance(gatewayService, serviceInstance, template) {\r
585     var nfvoLcmUri = '/openoapi/nslcm/v1';\r
586     serviceInstance.nsdId = template.id;\r
587     return createServiceInstance(gatewayService, nfvoLcmUri, serviceInstance);\r
588 }\r
589 \r
590 function createSdnoServiceInstance(gatewayService, serviceInstance) {\r
591     var sdnoLcmUri = '/openoapi/sdnonslcm/v1';\r
592     serviceInstance.nsdId = serviceInstance.serviceTemplateId;\r
593     return createServiceInstance(gatewayService, sdnoLcmUri, serviceInstance);\r
594 }\r
595 \r
596 function createServiceInstance(gatewayService, lcmUri, serviceInstance) {\r
597     var nsUri = lcmUri + '/ns';\r
598     var defer = $.Deferred();\r
599     var sParameter = {\r
600         'nsdId': serviceInstance.nsdId,\r
601         'nsName': serviceInstance.serviceName,\r
602         'description': serviceInstance.description,\r
603         'gatewayUri': nsUri\r
604     };\r
605     $.when($.ajax({\r
606         type: "POST",\r
607         url: gatewayService,\r
608         contentType: "application/json",\r
609         dataType: "json",\r
610         data: JSON.stringify(sParameter)\r
611     })).then(function(response) {\r
612         if(response.result.status === 'success') {\r
613             var nsInstanceId = response.serviceId;\r
614             serviceInstance.serviceId = nsInstanceId;\r
615             var initNsUrl = nsUri + '/' + nsInstanceId + '/instantiate';\r
616             var parameter = {\r
617                 'gatewayUri': initNsUrl,\r
618                 'nsInstanceId': nsInstanceId,\r
619                 'additionalParamForNs': serviceInstance.inputParameters\r
620             };\r
621             return $.ajax({\r
622                 type: "POST",\r
623                 url: gatewayService,\r
624                 contentType: "application/json",\r
625                 dataType: "json",\r
626                 data: JSON.stringify(parameter)\r
627             });\r
628         } else {\r
629             return response;\r
630         }\r
631     }).then(function(response) {\r
632         if(response.result.status === 'success') {\r
633             var jobId = response.serviceId;\r
634             var jobStatusUri = lcmUri + '/jobs/' + jobId;\r
635             var timerDefer = $.Deferred();\r
636             var timeout = 3600000;\r
637             var fun = function() {\r
638                 if(timeout === 0) {\r
639                     timerDefer.resolve({\r
640                         status: 'fail', \r
641                         statusDescription: 'Operation is timeout!', \r
642                         errorCode: ''\r
643                     });\r
644                     return;\r
645                 }\r
646                 timeout = timeout - 1000;\r
647                 $.when(\r
648                     $.ajax({\r
649                         type: "GET",\r
650                         url: jobStatusUri\r
651                     })\r
652                 ).then(\r
653                     function(jobResponse) {\r
654                         var responseDesc = jobResponse.responseDescriptor;\r
655                         if(responseDesc.status === 'finished' || responseDesc.status === 'error') {\r
656                             timerDefer.resolve(responseDesc);\r
657                         }\r
658                     }\r
659                 );\r
660             };\r
661             var timerId = setInterval(fun, 1000);\r
662             $.when(timerDefer).then(\r
663                 function(responseDesc) {\r
664                     clearInterval(timerId);\r
665                     if(responseDesc.status === 'finished') {\r
666                         defer.resolve({status: 'success', instance: serviceInstance});\r
667                     } else {\r
668                         defer.resolve({\r
669                             status: 'fail', \r
670                             errorResult: {\r
671                                 status: responseDesc.status, \r
672                                 statusDescription: responseDesc.statusDescription, \r
673                                 errorCode: responseDesc.errorCode\r
674                             }});\r
675                     }\r
676                 }\r
677              );\r
678         } else {\r
679             defer.resolve({status: 'fail', errorResult: response.result});\r
680         }\r
681     });\r
682     return defer;\r
683 }\r
684 \r
685 \r
686 function collectServiceParameters(parameters) {\r
687     var serviceParameters = {};\r
688     var i;\r
689     for (i = 0; i < parameters.length; i += 1) {\r
690         var value = $('#' + parameters[i].id).val();\r
691         serviceParameters[parameters[i].name] = value;\r
692     }\r
693     return serviceParameters;\r
694 }\r
695 \r
696 function updateTable(serviceInstance) {\r
697     serviceInstance.createTime = formatDate(new Date());\r
698     $('#sai').bootstrapTable("append", serviceInstance);\r
699 }\r
700 \r
701 function formatDate(date) {\r
702     var year = date.getFullYear();\r
703     var month = date.getMonth() + 1;\r
704     var day = date.getDate();\r
705     var hh = date.getHours();\r
706     var mm = date.getMinutes();\r
707     var ss = date.getSeconds();\r
708     return year + "-" + month + "-" + day + " " + hh + ":" + mm + ":" + ss;\r
709 }\r
710 \r
711 function deleteNe(rowId, row) {\r
712     var deleteHandle = function(result) {\r
713         if(result) {\r
714             $.isLoading({ text: "Deleting service..." });\r
715             var instanceId = row.serviceId;\r
716             var serviceType = row.serviceType;\r
717             var gatewayService = '/openoapi/servicegateway/v1/services/' + instanceId + '/terminate';\r
718             var remove = function () {\r
719                 $.isLoading( "hide" );\r
720                 $('#sai').bootstrapTable('remove', {field: 'serviceId', values: [instanceId]});\r
721             };\r
722             var failFun = function(responseDesc) {\r
723                 $.isLoading( "hide" );\r
724                 showErrorMessage("Delete service failed", responseDesc);\r
725             }\r
726             if(serviceType === 'GSO') {\r
727                 deleteGsoServiceInstance(gatewayService, instanceId, remove, failFun);\r
728             } else if (serviceType === 'NFVO') {\r
729                 var nfvoLcmUri = '/openoapi/nslcm/v1';\r
730                 deleteNonGsoServiceInstance(gatewayService, nfvoLcmUri, instanceId, remove, failFun);\r
731             } else if (serviceType === 'SDNO') {\r
732                 var sdnoLcmUri = '/openoapi/sdnonslcm/v1';\r
733                 deleteNonGsoServiceInstance(gatewayService, sdnoLcmUri, instanceId, remove, failFun);\r
734             }\r
735         }\r
736     };\r
737     bootbox.confirm("Do you confirm to delete service?", deleteHandle);\r
738 }\r
739 \r
740 function deleteGsoServiceInstance(gatewayService, instanceId, remove, failFun) {\r
741     var gsoLcmUri = '/openoapi/gso/v1/services';\r
742     $.when(\r
743         deleteNetworkServiceInstance(gatewayService, gsoLcmUri, instanceId)\r
744     ).then(\r
745         function(response) {\r
746             var gsoServiceUri = '/openoapi/gso/v1/services/toposequence/' + instanceId;\r
747             var timerDefer = $.Deferred();\r
748             var timeout = 3600000;\r
749             var fun = function() {\r
750                 if(timeout === 0) {\r
751                     timerDefer.resolve({\r
752                         status: 'fail', \r
753                         statusDescription: 'Operation is timeout!', \r
754                         errorCode: ''\r
755                     });\r
756                     return;\r
757                 }\r
758                 timeout = timeout - 1000;\r
759                 $.when(\r
760                     $.ajax({\r
761                         type: "GET",\r
762                         url: gsoServiceUri\r
763                     })\r
764                 ).then(\r
765                     function(response) {\r
766                         if(response.length == 0) {\r
767                             timerDefer.resolve({status:'success', statusDescription: 'success to delete the service', errorCode: ''});\r
768                         }\r
769                     }\r
770                 );\r
771             };\r
772             var timerId = setInterval(fun, 1000);\r
773             $.when(timerDefer).then(\r
774                 function(responseDesc) {\r
775                     clearInterval(timerId);\r
776                     remove();\r
777                     if(responseDesc.status != 'success'){\r
778                         failFun({status: "fail", statusDescription: "delete service failed.", errorCode: "500"});\r
779                     }              \r
780                 }\r
781              );           \r
782         }\r
783     );\r
784 }\r
785 \r
786 function deleteNonGsoServiceInstance(gatewayService, lcmUri, instanceId, remove, failFun) {\r
787     var nsUri = lcmUri + '/ns';\r
788     $.when(\r
789         terminateNetworkServiceInstance(gatewayService, nsUri, instanceId)\r
790     ).then(\r
791         function(response) {                \r
792             var jobId = response.jobId;\r
793             var jobStatusUri = lcmUri + '/jobs/' + jobId;\r
794             var timerDefer = $.Deferred();\r
795             var timeout = 3600000;\r
796             var fun = function() {\r
797                 if(timeout === 0) {\r
798                     timerDefer.resolve({\r
799                         status: 'fail', \r
800                         statusDescription: 'Operation is timeout!', \r
801                         errorCode: ''\r
802                     });\r
803                     return;\r
804                 }\r
805                 timeout = timeout - 1000;\r
806                 $.when(\r
807                     $.ajax({\r
808                         type: "GET",\r
809                         url: jobStatusUri\r
810                     })\r
811                 ).then(\r
812                     function(jobResponse) {\r
813                         var responseDesc = jobResponse.responseDescriptor;\r
814                         if(responseDesc.status === 'finished' || responseDesc.status === 'error') {\r
815                             timerDefer.resolve(responseDesc);\r
816                         }\r
817                     }\r
818                 );\r
819             };\r
820             var timerId = setInterval(fun, 1000);\r
821             $.when(timerDefer).then(\r
822                 function(responseDesc) {\r
823                     clearInterval(timerId);\r
824                     if(responseDesc.status === 'finished') {\r
825                         $.when(\r
826                             deleteNetworkServiceInstance(gatewayService, nsUri, instanceId)\r
827                         ).then(\r
828                             function(nsResponse) {\r
829                                 if(nsResponse.status === 'success') {\r
830                                     remove();\r
831                                 } else {\r
832                                     failFun(nsResponse);\r
833                                 }\r
834                             }\r
835                         ).fail(function() {\r
836                             failFun({status: "fail", statusDescription: "delete service failed.", errorCode: "500"});\r
837                         });\r
838                     } else {\r
839                         failFun(responseDesc);\r
840                     }\r
841                 }\r
842             );\r
843         }\r
844     ).fail(function() {\r
845         failFun({status: "fail", statusDescription: "delete service failed.", errorCode: "500"});\r
846     });\r
847 }\r
848 \r
849 function deleteNetworkServiceInstance(gatewayService, nsUri, instanceId) {\r
850     var instanceUri = nsUri + '/' + instanceId;\r
851     var parameter = {\r
852         'operation': "DELETE",\r
853         'gatewayUri': instanceUri\r
854     };\r
855     return $.ajax({\r
856         type: "POST",\r
857         url: gatewayService,\r
858         contentType: "application/json",\r
859         dataType: "json",\r
860         data: JSON.stringify(parameter)\r
861     });\r
862 }\r
863 \r
864 function terminateNetworkServiceInstance(gatewayService, nsUri, instanceId) {\r
865     var instanceUri = nsUri + '/' + instanceId;\r
866     var nsTerminateUri = instanceUri + '/terminate';\r
867     var terminateParameter = {\r
868         'nsInstanceId': instanceId,\r
869         'terminationType': "graceful",\r
870         'gracefulTerminationTimeout': "60",\r
871         'operation': "POST",\r
872         'gatewayUri': nsTerminateUri\r
873     };\r
874     return $.ajax({\r
875         type: "POST",\r
876         url: gatewayService,\r
877         contentType: "application/json",\r
878         dataType: "json",\r
879         data: JSON.stringify(terminateParameter)\r
880     });\r
881 }\r