diff --git a/webroot/config/services/instances/api/serviceinstanceconfig.api.js b/webroot/config/services/instances/api/serviceinstanceconfig.api.js index 83ba5dcf3..9c8599ff7 100644 --- a/webroot/config/services/instances/api/serviceinstanceconfig.api.js +++ b/webroot/config/services/instances/api/serviceinstanceconfig.api.js @@ -2102,8 +2102,8 @@ function deletePortTuplesAndSI (portTupleUUIDList, siID, appData, callback) if ((null == portTupleUUIDList) || (!portTupleUUIDList.length)) { configApiServer.apiDelete(siDelURL, appData, function(error, data) { callback(error, data); - return; }); + return; } var portTuplesCnt = portTupleUUIDList.length; diff --git a/webroot/config/services/instances/ui/js/models/PortTupleModel.js b/webroot/config/services/instances/ui/js/models/PortTupleModel.js index 8164d39b6..5a2eb2636 100644 --- a/webroot/config/services/instances/ui/js/models/PortTupleModel.js +++ b/webroot/config/services/instances/ui/js/models/PortTupleModel.js @@ -15,6 +15,7 @@ define([ defaultConfig: { portTupleName: "", + portTupleDisplayName: "", portTupleData: null, intfTypes: [], disable: false @@ -42,28 +43,37 @@ define([ var vnVmis = modelConfig.parentIntfs; var vmisCnt = vmis.length; + var vmiTypeToObjMap = {}; for (var i = 0; i < vmisCnt; i++) { var intfType = vmis[i]['virtual_machine_interface_properties'] ['service_interface_type']; + vmiTypeToObjMap[intfType] = vmis[i]; + } + + var intfTypes = getValueByJsonPath(modelConfig, 'intfTypes', []); + var intfCnt = intfTypes.length; + for (var i = 0; i < intfCnt; i++) { + intfType = intfTypes[i]; + var vmiObj = vmiTypeToObjMap[intfType]; + if (null == vmiObj) { + continue; + } var vnName = vnVmis[intfType]; var vmiList = []; if (window.vnVmiMaps[vnName]) { vmiList = window.vnVmiMaps[vnName]; } - var vmi = vmis[i]['fq_name'].join(':') + "~~" + vmis[i]['uuid']; + var vmi = vmiObj['fq_name'].join(':') + "~~" + vmiObj['uuid']; var propModel = new InterfaceTypesModel({interfaceType: intfType, - interface: vmis[i]['fq_name'].join(':') + - "~~" + vmis[i]['uuid'], + interface: vmiObj['fq_name'].join(':') + + "~~" + vmiObj['uuid'], vmiListData: vmiList, disable: modelConfig['disable']}); propModels.push(propModel); } if (!vmisCnt) { - var intfTypes = getValueByJsonPath(modelConfig, 'intfTypes', - []); - var intfCnt = intfTypes.length; var vmi = null; for (var i = 0; i < intfCnt; i++) { var vnName = vnVmis[intfTypes[i]]; @@ -83,38 +93,6 @@ define([ modelConfig['portTupleInterfaces'] = propCollectionModel; return modelConfig; }, - addPortTupleInterface: function() { - var svcTmpl = $('#service_template_dropdown').val(); - var svcTmpls = $(gridElId).data('svcInstTmplts'); - var svcTmplFqn = getCookie('domain') + ":" + - svcTmpl.split(' - [')[0]; - var svcTmplObj = svcTmpls[svcTmplFqn]; - var intfTypes = - getValueByJsonPath(svcTmplObj, - 'service_template_properties;interface_type', - []); - var origList = []; - var intfCnt = intfTypes.length; - for (var i = 0; i < intfCnt; i++) { - origList.push(intfTypes[i]['service_interface_type']); - } - var props = this.model().attributes.model().get('portTupleInterfaces'); - if (props.length >= intfTypes.length) { - return; - } - var count = props.length; - var vmi = window.vmiList.length > 0 ? window.vmiList[0].value : ""; - var propsList = []; - for (var i = 0; i < count; i++) { - var model = props.at(i); - propsList.push(model.attributes.interfaceType()); - } - var newIntf = _.difference(origList, propsList); - var newProp = - new InterfaceTypesModel({'interfaceType': newIntf[0], - 'interface': vmi}); - props.add([newProp]); - }, deletePortTuple: function() { var portTupleCollection =this .model().collection; var portTupleEntry = this.model(); diff --git a/webroot/config/services/instances/ui/js/models/svcInstModel.js b/webroot/config/services/instances/ui/js/models/svcInstModel.js index f9c7105ab..8ab6ab389 100644 --- a/webroot/config/services/instances/ui/js/models/svcInstModel.js +++ b/webroot/config/services/instances/ui/js/models/svcInstModel.js @@ -631,9 +631,13 @@ define([ var intfs = this.getInterfaceTypeVNMap(modelConfig['interfaces'].toJSON()); for (var i = 0; i < portTuplesCnt; i++) { + var portTupleDispName = + this.getPortTupleDisplayName(portTupleList[i]['to'][3], + portTupleList[i], intfTypes); var portTupleModel = new PortTupleModel({portTupleName: portTupleList[i]['to'][3], + portTupleDisplayName: portTupleDispName, portTupleData: portTupleList[i], intfTypes: intfTypes, @@ -649,6 +653,87 @@ define([ return modelConfig; }, + getPortTupleDisplayName: function(portTupleName, portTupleData, + intfTypes) { + var vmis = getValueByJsonPath(portTupleData, + 'virtual-machine-interfaces', []); + var dispName = "port-tuple"; + var splitArr = portTupleName.split('-port-tuple'); + if (splitArr.length > 0) { + var newArr = splitArr[1].split('-'); + if (newArr.length > 0) { + dispName += newArr[0]; + } + } + var vmisCnt = vmis.length; + var vmiTypeToObjMap = {}; + for (var i = 0; i < vmisCnt; i++) { + var vmiType = + getValueByJsonPath(vmis[i], + 'virtual_machine_interface_properties;service_interface_type', + null); + if (null == vmiType) { + /* Weired */ + console.error('service interface type is null'); + continue; + } + vmiTypeToObjMap[vmiType] = vmis[i]; + } + var intfTypesCnt = intfTypes.length; + for (var i = 0; i < intfTypesCnt; i++) { + var vmiObj = vmiTypeToObjMap[intfTypes[i]]; + if (null == vmiObj) { + continue; + } + if (0 == i) { + dispName += ' : '; + } + var vmiId = vmiObj['uuid']; + var instIps = window.vmiToInstIpsMap[vmiId]; + if ((null != instIps) && (instIps.length > 0)) { + dispName += instIps[0]; + } + if (i < vmisCnt - 1) { + dispName += ', '; + } + } + return dispName; + }, + setPortTupleName: function(model, portTupleEntry) { + var intfTypes = portTupleEntry.intfTypes(); + var ctIntfType = model.get('interfaceType'); + var intfIdx = intfTypes.indexOf(ctIntfType); + if (-1 == intfIdx) { + return; + } + var portTupleDispName = portTupleEntry.portTupleDisplayName(); + var portTupleSplit = portTupleDispName.split(' : '); + var ips = []; + if (null != portTupleSplit[1]) { + ips = portTupleSplit[1].split(', '); + } + var intf = model.get('interface'); + var vmiId = intf.split('~~')[1]; + var intfCnt = intfTypes.length; + var dispStr = portTupleSplit[0] + ' : '; + for (var i = 0; i < intfCnt; i++) { + if (i == intfIdx) { + /* Set the IP here */ + var instIps = window.vmiToInstIpsMap[vmiId]; + if ((null != instIps) && (instIps.length > 0)) { + dispStr += instIps[0]; + } + } else { + if (null != ips[i]) { + dispStr += ips[i]; + } + } + if (i < intfCnt - 1) { + dispStr += ', '; + } + } + portTupleEntry['portTupleDisplayName'](dispStr); + }, deleteModelCollectionData: function(model, type) { var collection = model.attributes[type]; var len = collection.length; @@ -724,6 +809,7 @@ define([ }, addPortTuple: function() { var svcInstName = this.model().get('display_name'); + var self = this; if ((null == svcInstName) || (!svcInstName.trim().length)) { var model = this.model(); var attr = cowu.getAttributeFromPath('display_name'); @@ -784,15 +870,29 @@ define([ tmpPortTupleId.toString() + '-' + newUUID['hex']; var intfs = this.getInterfaceTypeVNMap(this.model().get('interfaces').toJSON()); + var intfTypes = this.getIntfTypes(true); + var portTupleDispName = + this.getPortTupleDisplayName(portTupleName, null, intfTypes); var newPortTupleEntry = new PortTupleModel({portTupleName: portTupleName, + portTupleDisplayName: portTupleDispName, portTupleData: {}, - intfTypes: this.getIntfTypes(true), + intfTypes: intfTypes, parentIntfs: intfs, disable: false}); - kbValidation.bind(this.editView, {collection: newPortTupleEntry.model().attributes.portTupleInterfaces}); + var portTupleIntfsColl = + newPortTupleEntry.model().attributes.portTupleInterfaces; + var portTupleIntfsCollLen = portTupleIntfsColl.length; + for (var i = 0; i < portTupleIntfsCollLen; i++) { + var model = portTupleIntfsColl.models[i]['attributes'].model(); + self.newPortTupleEntry = newPortTupleEntry; + model.on('change:interface', function(model, newValue) { + self.setPortTupleName(model, + self.newPortTupleEntry); + }); + } portTupleCollection.add([newPortTupleEntry]); }, getInterfaceTypeVNMap: function(intfData) { diff --git a/webroot/config/services/instances/ui/js/svcInst.utils.js b/webroot/config/services/instances/ui/js/svcInst.utils.js index 37595e095..e08e25f1c 100644 --- a/webroot/config/services/instances/ui/js/svcInst.utils.js +++ b/webroot/config/services/instances/ui/js/svcInst.utils.js @@ -55,27 +55,30 @@ define([ if ((domain == domProj[0]) && (project == domProj[1])) { text = vmi['uuid']; if (instIpAddrs.length > 0) { - text = text + ' - (' + instIpAddrs.join(', ') + ')'; + text = '(' + instIpAddrs.join(', ') + ') - ' + text; } return {text: text, id: - vmi['fq_name'].join(':') + "~~" + vmi['uuid']}; + vmi['fq_name'].join(':') + "~~" + vmi['uuid'], + instIps: instIpAddrs}; } else { var tmpFqn = JSON.parse(JSON.stringify(vmi['fq_name'])); var domProj = tmpFqn.splice(0, 2); text = vmi['uuid'] + " (" + domProj.join(':') + ")"; if (instIpAddrs.length > 0) { - text = text + ' - (' + instIpAddrs.join(', ') + ')'; + text = '(' + instIpAddrs.join(', ') + ') - ' + text; } return {text: text +" (" + domProj.join(':') + ")", id: vmi['fq_name'].join(':') + - "~~" + vmi['uuid']}; + "~~" + vmi['uuid'], + instIps: instIpAddrs}; } return {}; }, this.vmiListFormatter = function(vmis) { var vnVmiMaps = {}; + var vmiToInstIpsMap = {}; var vnList = []; if ((null == vmis) || (!vmis.length)) { return ({vnList: @@ -85,6 +88,7 @@ define([ var vmisCnt = vmis.length; var tmpVNIds = {}; window.allVMIList = []; + window.vmiToInstIpsMap = {}; for (var i = 0; i < vmisCnt; i++) { var vmi = getValueByJsonPath(vmis[i], @@ -94,6 +98,9 @@ define([ } var builtVMI = this.buildVMI(vmi); window.allVMIList.push(builtVMI); + if (null != builtVMI.instIps) { + window.vmiToInstIpsMap[vmi.uuid] = builtVMI.instIps; + } var vmRefs = getValueByJsonPath(vmi, 'virtual_machine_refs', []); @@ -405,15 +412,15 @@ define([ iconClass: 'icon-minus'} ], columns: [{ - elementId: 'portTupleName', + elementId: 'portTupleDisplayName', view: 'FormInputView', class: "", width: "600", - name: 'Tuple Name', + name: 'Tuple', viewConfig: { disabled: true, templateId: cowc.TMPL_EDITABLE_GRID_INPUT_VIEW, - path: 'portTupleName', - dataBindValue: 'portTupleName()' + path: 'portTupleDisplayName', + dataBindValue: 'portTupleDisplayName()' } }] } diff --git a/webroot/config/services/instances/ui/js/views/svcInstListView.js b/webroot/config/services/instances/ui/js/views/svcInstListView.js index f359b1960..8489cbe09 100644 --- a/webroot/config/services/instances/ui/js/views/svcInstListView.js +++ b/webroot/config/services/instances/ui/js/views/svcInstListView.js @@ -235,14 +235,6 @@ define([ { 'type': 'route-aggregates', }, - { - 'type': 'virtual-machine-interfaces', - /* - 'parent_fq_name_str': getCookie('domain') + ':' + - getCookie('project'), - 'parent_type': 'project' - */ - }, { 'type': 'virtual-networks', 'parent_fq_name_str': contrail.getCookie('domain') + @@ -263,7 +255,6 @@ define([ window.interfaceRouteTableList = []; window.routingPolicyList = []; window.routeAggregateList = []; - window.vmiList = []; window.allVNList = []; if (null == response) { return; @@ -280,10 +271,7 @@ define([ window.routeAggregateList = buildTextValueByConfigList(response[3], 'route-aggregates'); - window.vmiList = - buildTextValueByConfigList(response[4], - 'virtual-machine-interfaces'); - window.allVNList = svcInstUtils.virtNwListFormatter(response[5]); + window.allVNList = svcInstUtils.virtNwListFormatter(response[4]); if (window.allVNList.length > 0) { window.allVNList.unshift({'text':"Auto Configured", 'id':"autoConfigured"}); @@ -294,7 +282,7 @@ define([ window.interfaceRouteTableList = []; window.routingPolicyList = []; window.routeAggregateList = []; - window.vmiList = []; + window.allVNList = []; } }, { diff --git a/webroot/config/services/templates/ui/js/models/svcTemplateCfgModel.js b/webroot/config/services/templates/ui/js/models/svcTemplateCfgModel.js index 8b88fa825..fb952357b 100644 --- a/webroot/config/services/templates/ui/js/models/svcTemplateCfgModel.js +++ b/webroot/config/services/templates/ui/js/models/svcTemplateCfgModel.js @@ -22,14 +22,14 @@ define([ 'service_mode': 'transparent', 'service_type': 'firewall', 'flavor': null, - 'version': 1, + 'version': 2, 'service_scaling': false, 'vrouter_instance_type': null, 'ordered_interfaces': true, 'interface_type': [] }, 'user_created_service_virtualization_type': 'virtual-machine', - 'user_created_version': 1, + 'user_created_version': 2, 'user_created_service_scaling': false, 'user_created_service_mode': 'transparent', 'user_created_service_type': 'firewall',