From f4ebd885eef032b37f0563674bdafde0c3d363be Mon Sep 17 00:00:00 2001 From: Biswajit Mandal Date: Tue, 23 Feb 2016 14:49:31 +0530 Subject: [PATCH] Related-Bug: #1548710 1. Adding Instance IPs of VMIs in port tuple name. 2. Making v2 as default visible version while creating ST. 3. In VMI list, show the IP first and then uuid. Change-Id: I6f01eb181a8f6e87da03442ce80c8ec3f6d9a855 --- .../api/serviceinstanceconfig.api.js | 2 +- .../instances/ui/js/models/PortTupleModel.js | 54 +++------ .../instances/ui/js/models/svcInstModel.js | 104 +++++++++++++++++- .../services/instances/ui/js/svcInst.utils.js | 23 ++-- .../instances/ui/js/views/svcInstListView.js | 16 +-- .../ui/js/models/svcTemplateCfgModel.js | 4 +- 6 files changed, 138 insertions(+), 65 deletions(-) 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 a61bc9136..9628667c4 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', []); @@ -400,15 +407,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',