/* * Copyright 2016 ZTE Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var templateParameters = { changed: true, parameters: [], vimInfos: [] }; var lcmHandler = function () { this._addOwnEvents(); }; lcmHandler.prototype = { _addOwnEvents: function () { $('#createNS').click(this.okAction); }, okAction: function () { if(!checkLocation(templateParameters.parameters)) { alert('Location must be selected in Template Parameters'); return; } var serviceInstance = { serviceTemplateId: $("#svcTempl").val(), serviceName: $('#svcName').val(), description: $('#svcDesc').val(), inputParameters: collectServiceParameters(templateParameters.parameters) }; var gatewayService = '/openoapi/servicegateway/v1/services'; $.when( fetchServiceTemplateBy(serviceInstance.serviceTemplateId) ).then( function(template) { serviceInstance.templateName = template.name; serviceInstance.serviceType = template.serviceType; return createNetworkServiceInstance(template, serviceInstance, gatewayService); } ).then( function(serviceInstance) { updateTable(serviceInstance); $('#vmAppDialog').removeClass('in').css('display', 'none'); } ); } }; function checkLocation(parameters) { var checkPass = true; var i = 0; for(i = 0; i < parameters.length; i++) { if(parameters[i].type === 'location') { var value = $('#' + parameters[i].id).val(); if(value === undefined || value === 'select') { checkPass = false; } } } return checkPass; } function initParameterTab() { // Service template was not changed. Do not re-initiate the parameter tab. if (!templateParameters.changed) { return; } var templateId = $("#svcTempl").val(); if ('select' === templateId) { document.getElementById("templateParameterTab").innerHTML = ''; return; } $.when( fetchServiceTemplateBy(templateId) ).then( function(template) { if(template.serviceType === 'GSO') { return fetchGsoTemplateInputParameters(templateId); } else if(template.serviceType === 'NFVO') { return fetchNfvoTemplateInputParameters(templateId); } else if(template.serviceType === 'SDNO') { return fetchSdnoTemplateInputParameters(templateId); } } ).then( function(parameters) { var components = transformToComponents(parameters); document.getElementById("templateParameterTab").innerHTML = components; } ); } function fetchServiceTemplateBy(templateId) { var defer = $.Deferred(); var serviceTemplateUri = '/openoapi/catalog/v1/servicetemplates/' + templateId; var template = {}; $.when( $.ajax({ type: "GET", url: serviceTemplateUri, contentType: "application/json" }) ).then( function(response) { template.name = response.templateName; template.gsarId = response.csarId; template.id = response.id; return fetchCsar(template.gsarId); } ).then( function(response) { if(response.type === 'GSAR') { template.serviceType = 'GSO'; } else if(response.type === 'NSAR' || response.type === 'NFAR') { template.serviceType = 'NFVO'; } else if(response.type === 'SSAR') { template.serviceType = "SDNO"; } defer.resolve(template) } ); return defer; } function fetchCsar(csarId) { var queryCsarUri = '/openoapi/catalog/v1/csars/' + csarId; return $.ajax({ type: "GET", url: queryCsarUri, contentType: "application/json" }); } function fetchGsoTemplateInputParameters(templateId) { var defer = $.Deferred(); $.when( fetchTemplateParameterDefinitions(templateId), fetchGsoNestingTemplateParameters(templateId), fetchVimInfo(), fetchSdnController() ).then( function (templateParameterResponse, nestingTempatesParas, vimInfoResponse, sdnControllersResponse) { var inputParas = concat(templateParameterResponse[0].inputs, nestingTempatesParas); var vims = translateToVimInfo(vimInfoResponse[0]); var sdnControllers = translateToSdnControllers(sdnControllersResponse[0]); templateParameters = translateToTemplateParameters(inputParas, vims, sdnControllers); defer.resolve(templateParameters); } ); return defer; } function fetchGsoNestingTemplateParameters(templateId) { var defer = $.Deferred(); $.when( fetchNodeTemplates(templateId) ).then( function(nodeTemplates) { var count = nodeTemplates.length; if(count ===0) { defer.resolve([]); return; } var nestingParasAggregatation = aggregate(count, function(nestingParas) { defer.resolve(nestingParas); }); nodeTemplates.forEach(function(nodeTemplate) { var nestingNodeUri = '/openoapi/catalog/v1/servicetemplates/nesting?nodeTypeIds=' + nodeTemplate.type; $.when( $.ajax({ type: "GET", url: nestingNodeUri }) ).then( function(serviceTemplates) { var nodeAggregatation = aggregate(serviceTemplates.length, function(oneNodeParameters) { nestingParasAggregatation.notify(oneNodeParameters); }); serviceTemplates.forEach(function(serviceTemplate) { if(serviceTemplate === null || serviceTemplate === undefined || serviceTemplate.inputs === undefined || serviceTemplate.csarId === undefined) { nodeAggregatation.notify([]); return; } var inputs = serviceTemplate.inputs.map(function(input) { input.name = nodeTemplate.type + '.' + input.name; return input; }); $.when( fetchCsar(serviceTemplate.csarId) ).then( function(response) { if(response.type === 'NSAR' || response.type === 'NFAR') { inputs.push({ name: nodeTemplate.type + '.location', type: 'location', description: nodeTemplate.name + ' Location', required: 'true' }); inputs.push({ name: nodeTemplate.type + '.sdncontroller', type: 'sdncontroller', description: nodeTemplate.name + ' SDN Controller', required: 'true' }); } nodeAggregatation.notify(inputs); } ); }); } ); }); } ); return defer; } function fetchNodeTemplates(templateId) { var nodeTemplateUri = '/openoapi/catalog/v1/servicetemplates/'+ templateId +'/nodetemplates'; return $.ajax({ type: "GET", url: nodeTemplateUri }); } function aggregate(n, deferFun) { var aggregation = $.Deferred(); var count = n; var result = []; aggregation.progress(function(array) { pushAll(result, array); count--; if(count === 0) { deferFun(result); } }); return aggregation; } function concat(array1, array2) { var result = []; pushAll(result, array1); pushAll(result, array2); return result; } function pushAll(acc, array) { var result = acc; array.forEach(function(element) { result.push(element) }) return result; } function translateToTemplateParameters(inputs, vims, controllers) { var inputParameters = []; var i; for (i = 0; i < inputs.length; i += 1) { inputParameters[i] = { name: inputs[i].name, type: inputs[i].type, description: inputs[i].description, defaultValue: inputs[i].defaultValue, required: inputs[i].required, id: 'parameters_' + i, value: inputs[i].defaultValue || '' }; } return {changed: false, parameters: inputParameters, vimInfos: vims, sdnControllers: controllers}; } function fetchNfvoTemplateInputParameters(templateId) { var defer = $.Deferred(); $.when( fetchTemplateParameterDefinitions(templateId), fetchVimInfo(), fetchSdnController() ).then( function (templateParameterResponse, vimInfoResponse, sdnControllerResponse) { var vims = translateToVimInfo(vimInfoResponse[0]); var sdnControllers = translateToSdnControllers(sdnControllerResponse[0]); var inputParas = templateParameterResponse[0].inputs; inputParas.push({ name: 'location', type: 'location', description: 'Location', required: 'true' }); inputParas.push({ name: 'sdncontroller', type: 'sdncontroller', description: 'SDN Controller', required: 'true' }); templateParameters = translateToTemplateParameters(inputParas, vims, sdnControllers); defer.resolve(templateParameters); } ); return defer; } function fetchSdnoTemplateInputParameters(templateId) { var defer = $.Deferred(); $.when( fetchTemplateParameterDefinitions(templateId) ).then( function (templateParameterResponse) { templateParameters = translateToTemplateParameters(templateParameterResponse.inputs, [], []); defer.resolve(templateParameters); } ); return defer; } function fetchTemplateParameterDefinitions(templateId) { var queryParametersUri = '/openoapi/catalog/v1/servicetemplates/' + templateId + '/parameters'; return $.ajax({ type: "GET", url: queryParametersUri }); } function fetchVimInfo() { var vimQueryUri = '/openoapi/extsys/v1/vims'; return $.ajax({ type: "GET", url: vimQueryUri }); } function fetchSdnController() { var sdnControllerUri = '/openoapi/extsys/v1/sdncontrollers'; return $.ajax({ type: "GET", url: sdnControllerUri }); } function translateToVimInfo(vims) { return vims.map(function (vim) { return { optionId: vim.vimId, optionName: vim.name }; }); } function translateToSdnControllers(controllers) { return controllers.map(function(controller) { return { optionId: controller.sdnControllerId, optionName: controller.name }; }); } function transformToComponents(templateParas) { var inputs = templateParas.parameters; var vimInfos = templateParas.vimInfos; var sdnControllers = templateParas.sdnControllers; var components = ''; inputs.forEach(function (inputPara) { if(inputPara.type === 'location') { components = components + generateComboxComponent(inputPara, vimInfos); } else if(inputPara.type === 'sdncontroller') { components = components + generateComboxComponent(inputPara, sdnControllers); } else { components = components + generateComponent(inputPara); } }); return components; } function generateComboxComponent(inputPara, items) { var component = '