From cbc315b164a9b49b8afa4cc3dece0d574dd705eb Mon Sep 17 00:00:00 2001 From: balamurugang Date: Tue, 9 Feb 2016 21:27:02 +0530 Subject: [PATCH] In Edit case of a Parent port, subinterface ref is getting set to empty - Fixed it * In case of edit a parent port vmiRef was set to empty array because of that the reference to the subInterface was removed - Fixed it. * Added The name along with the UUID in the landing page grid. * In landing page grid row It shows (N more) after 3 data exist In other place it is followed as 2 so, Changed to 2. * Not showing the sub-interface if it is a parent port. * dropdownAutoWidth : false, is added for the drop down's to avoid the drop down growing beyond the view area. * Sub-interface cannot be removed In UI the checkbox is disabled * In Delete case, If it is a parent port We show a message saying even the subinterface will be delete do you want to conform then sending all the UUID of children so that the children will be removed first and then the parent will be removed. Service Health Check is added in UI. Closes-Bug: #1549112 API FIX * The sub-interface remove is not supported in delete we are trying to update the parent port so it was throwing some error - Fixed it. * vm ref in subinterface was added for DNS resolution and stats. Now it is not required * The subinterface are removed and then the parentport is removed. * The delete is handled in both delete and delete all Removed the reference of that VM from the created/edited Sub-interface. Closes-Bug: #1540789 The flow was like attach of VM will happen first and then the IP was created because of that the ip was not setting to VM To avoid that The interface IP is added first and then the compute is getting attachecd. Removel of VM ref from the subinterface also solves the issue Instance name is replaced by '-' under monitor-instance tab Closes-Bug: #1538531 Port page not able to load sometimes Issue: TypeError: self.deviceOwner is not a function - Placed the function return as inline. So it will be not be looking for that variable. Closes-Bug: #1542295 Change-Id: I0e198219f85904f30b2420ecac79ce332c1b29bc Closes-Bug: #1543632 --- .../networking/port/api/portsconfig.api.js | 342 ++++++++++++------ .../ui/js/models/allowAddressPairModel.js | 2 +- .../networking/port/ui/js/models/portModel.js | 156 ++++++-- .../port/ui/js/views/portEditView.js | 242 ++++++++----- .../port/ui/js/views/portFormatters.js | 86 ++++- .../port/ui/js/views/portGridView.js | 19 +- 6 files changed, 590 insertions(+), 257 deletions(-) diff --git a/webroot/config/networking/port/api/portsconfig.api.js b/webroot/config/networking/port/api/portsconfig.api.js index 96685efd5..abbc0cc69 100644 --- a/webroot/config/networking/port/api/portsconfig.api.js +++ b/webroot/config/networking/port/api/portsconfig.api.js @@ -255,9 +255,9 @@ function createPortValidate (request, data, response, appData, callback) delete portPostData['virtual-machine-interface']['virtual_machine_refs']; } - if ('virtual_machine_interface_refs' in portPostData['virtual-machine-interface']){ +/* if ('virtual_machine_interface_refs' in portPostData['virtual-machine-interface']){ delete portPostData['virtual-machine-interface']['virtual_machine_interface_refs']; - } + }*/ var lrUUID = ""; if ('logical_router_back_refs' in portPostData['virtual-machine-interface']) { @@ -268,7 +268,8 @@ function createPortValidate (request, data, response, appData, callback) } if (('virtual_machine_interface_device_owner' in portPostData['virtual-machine-interface']) && (portPostData['virtual-machine-interface']["virtual_machine_interface_device_owner"]).substring(0,7) == "compute"){ - portPostData["virtual-machine-interface"]["virtual_machine_interface_device_owner"] = ""; + //portPostData["virtual-machine-interface"]["virtual_machine_interface_device_owner"] = ""; + delete portPostData["virtual-machine-interface"]["virtual_machine_interface_device_owner"]; } configApiServer.apiPost(portsCreateURL, portPostData, appData, function(error, vmisData) { @@ -288,19 +289,19 @@ function createPortValidate (request, data, response, appData, callback) return; } portSendResponse(error, request, vmiData, orginalPortData, apiLogicalRouterData, appData, function (err, results) { - if(err){ + //if(err){ callback(err, results); return; - } - putVMISubInterface(orginalPortData, vmiData, results, appData, function(err, results){ - callback(err, results); - }); + //} + //putVMISubInterface(orginalPortData, vmiData, results, appData, function(err, results){ + // callback(err, results); + //}); }); }); }); }); } - +/* function putVMISubInterface (orginalPortData, currentVMIDetail, results, appData, callback) { if ('virtual_machine_interface_properties' in orginalPortData['virtual-machine-interface'] && @@ -324,47 +325,33 @@ function putVMISubInterface (orginalPortData, currentVMIDetail, results, appData }; configApiServer.apiPut(subInterfacePutURL, vmiSubInterfaceJSON, appData, function (error, data) { - var vmRefs = - vmiData['virtual-machine-interface']['virtual_machine_refs']; - if (null == vmRefs) { callback(error, data); - return; - } - var putData = {}; - putData['virtual-machine-interface'] = { - 'fq_name': - results['virtual-machine-interface']['fq_name'], - 'uuid': results['virtual-machine-interface']['uuid'], - 'virtual_machine_refs': commonUtils.cloneObj(vmRefs) - }; - - var vmiUrl = '/virtual-machine-interface/' + - results['virtual-machine-interface']['uuid']; - configApiServer.apiPut(vmiUrl, putData, appData, - function(error, data) { - callback(error, data); - }); }); }); } else { callback(null, results); } -} +}*/ function VMIJSONStructureSubInterface(vmiSubInterfaceDetail, currentVMIDetail){ var primaryInterfaceObject = {}; primaryInterfaceObject['virtual-machine-interface'] = {}; - primaryInterfaceObject['virtual-machine-interface'] = vmiSubInterfaceDetail; + //primaryInterfaceObject['virtual-machine-interface'] = vmiSubInterfaceDetail; + primaryInterfaceObject['virtual-machine-interface'].fq_name = vmiSubInterfaceDetail.fq_name; + primaryInterfaceObject['virtual-machine-interface'].uuid = vmiSubInterfaceDetail.uuid; + primaryInterfaceObject['virtual-machine-interface'].parent_type = vmiSubInterfaceDetail.parent_type; var vmirefIndex = 0; - if(primaryInterfaceObject['virtual-machine-interface']['virtual_machine_interface_refs'] != null && - primaryInterfaceObject['virtual-machine-interface']['virtual_machine_interface_refs'] != undefined){ - vmirefIndex = primaryInterfaceObject['virtual-machine-interface']['virtual_machine_interface_refs'].length; + if(vmiSubInterfaceDetail['virtual_machine_interface_refs'] != null && + vmiSubInterfaceDetail['virtual_machine_interface_refs'] != undefined){ + vmirefIndex = vmiSubInterfaceDetail['virtual_machine_interface_refs'].length; + primaryInterfaceObject['virtual-machine-interface']['virtual_machine_interface_refs'] + = vmiSubInterfaceDetail['virtual_machine_interface_refs']; } else { primaryInterfaceObject['virtual-machine-interface']['virtual_machine_interface_refs'] = []; } primaryInterfaceObject['virtual-machine-interface']['virtual_machine_interface_refs'][vmirefIndex] = {}; primaryInterfaceObject['virtual-machine-interface']['virtual_machine_interface_refs'][vmirefIndex]["uuid"] = currentVMIDetail['virtual-machine-interface']["uuid"]; - primaryInterfaceObject['virtual-machine-interface']['virtual_machine_interface_refs'][vmirefIndex]["to"] = currentVMIDetail['virtual-machine-interface']["fq_name"] + primaryInterfaceObject['virtual-machine-interface']['virtual_machine_interface_refs'][vmirefIndex]["to"] = currentVMIDetail['virtual-machine-interface']["fq_name"]; return primaryInterfaceObject; } @@ -560,32 +547,30 @@ function portSendResponse (error, req, portConfig, orginalPortData, apiLogicalRo } } } - - if("virtual_machine_interface_device_owner" in orginalPortData["virtual-machine-interface"] && - (orginalPortData["virtual-machine-interface"]["virtual_machine_interface_device_owner"]).substring(0,7) == "compute") { - body = {}; - body.portID = portConfig["virtual-machine-interface"]["uuid"]; - //body.netID = portConfig["virtual-machine-interface"]["virtual_network_refs"][0]["uuid"]; - body.vmUUID = orginalPortData["virtual-machine-interface"]["virtual_machine_refs"][0]["uuid"]; - attachVMICompute(req, body, function (novaError, results){ - updateAvailableDataforCreate(DataObjectArr, instIpPostDataObjArr, portConfig, fixedIpPoolRefLen, appData, function(error, result){ - if(novaError != null){ - if(error != null){ - error.messages += "
" +novaError.messages; - } else { - error = novaError; - } - } - callback(error, result); + updateAvailableDataforCreate(DataObjectArr, instIpPostDataObjArr, portConfig, fixedIpPoolRefLen, appData, function(error, result) { + if (error) { + callback(error, null); + return; + } + if ("virtual_machine_interface_device_owner" in orginalPortData["virtual-machine-interface"] && + (orginalPortData["virtual-machine-interface"]["virtual_machine_interface_device_owner"]).substring(0,7) == "compute") { + body = {}; + body.portID = portConfig["virtual-machine-interface"]["uuid"]; + //body.netID = portConfig["virtual-machine-interface"]["virtual_network_refs"][0]["uuid"]; + body.vmUUID = orginalPortData["virtual-machine-interface"]["virtual_machine_refs"][0]["uuid"]; + attachVMICompute(req, body, function (novaError, results){ + callback(novaError, results); + return; }); - }); - } else { - updateAvailableDataforCreate(DataObjectArr, instIpPostDataObjArr, portConfig, fixedIpPoolRefLen, appData, function(error, result){ + } else { callback(error, result); - }); - } + return; + } + }); } + + function updateAvailableDataforCreate(DataObjectArr, instIpPostDataObjArr, portConfig, fixedIpPoolRefLen, appData, callback) { async.map(instIpPostDataObjArr, createInstIP, function(err, result) { @@ -596,7 +581,7 @@ function updateAvailableDataforCreate(DataObjectArr, instIpPostDataObjArr, portC async.map(DataObjectArr, commonUtils.getServerResponseByRestApi(configApiServer, true), function(error, results) { - callback(error, portConfig); + callback(error, portConfig); }); }); @@ -704,7 +689,6 @@ function compareUpdateVMI (error, request, portPutData, vmiData, appData, callba var deleteFloatingIpLen = 0; var createVMISubInterfaceLen = 0; var deleteVMISubInterfaceLen = 0; - if ("floating_ip_back_refs" in portPutData["virtual-machine-interface"] || "floating_ip_back_refs" in vmiData["virtual-machine-interface"]) { filterUpdateFloatingIP(error, portPutData, vmiData, function(createFloatingIp,deleteFloatingip){ @@ -847,6 +831,8 @@ function compareUpdateVMI (error, request, portPutData, vmiData, appData, callba portPutData["virtual-machine-interface"]["virtual_machine_refs"][0]["uuid"]) { portPutData["virtual-machine-interface"]["virtual_machine_interface_device_owner"] = vmiData["virtual-machine-interface"]["virtual_machine_interface_device_owner"]; + delete(portPutData["virtual-machine-interface"]["virtual_machine_interface_device_owner"]); + delete(portPutData["virtual-machine-interface"]["virtual_machine_refs"]); boolDeviceOwnerChange = false; } } @@ -920,16 +906,20 @@ function processDataObjects (error, DataObjectArr, DataObjectDelArr, vmiData, po commonUtils.getServerResponseByRestApi(configApiServer, true), function(error, result) { if(error){ - callback(error, results); + callback(error, result); return; } linkUnlinkDetails(error, result, DataObjectLenDetail, portPutData, boolDeviceOwnerChange, vmiData, request, appData, function(error, results, subIntfObjArr){ + if (error) { + callback(error, results); + return; + } async.map(subIntfObjArr, commonUtils.getAPIServerResponse(configApiServer.apiPut, true), function(err, results) { - if(error){ - callback(error, results); + if(err){ + callback(err, results); return; } deleteAllReference(DataObjectDelArr, @@ -1041,6 +1031,9 @@ function removeBackRef (portPutData) if ("logical_router_back_refs" in portPutData["virtual-machine-interface"]) { delete portPutData["virtual-machine-interface"]["logical_router_back_refs"]; } + if ("floating_ip_back_refs" in portPutData["virtual-machine-interface"]) { + delete portPutData["virtual-machine-interface"]["floating_ip_back_refs"]; + } if ('virtual_machine_interface_refs' in portPutData['virtual-machine-interface']) { delete @@ -1109,9 +1102,7 @@ function linkUnlinkDetails (error, result, DataObjectLenDetail, portPutData, boo vmiData['virtual-machine-interface']['uuid']; var vmiPutData = { 'virtual-machine-interface' : { 'fq_name': vmiData['virtual-machine-interface']['fq_name'], - 'uuid': vmiData['virtual-machine-interface']['uuid'], - 'virtual_machine_refs': - result[i]['virtual-machine-interface']['virtual_machine_refs'] + 'uuid': vmiData['virtual-machine-interface']['uuid'] } } @@ -1165,32 +1156,55 @@ function linkUnlinkDetails (error, result, DataObjectLenDetail, portPutData, boo } } } - - if(boolDeviceOwnerChange == true) { - deviceOwnerChange(error, result, DataObjectArr, DataObjectLenDetail, portPutData, vmiData, request, appData, function(error, data, DataObjectArr){ - if(error){ - callback(error, data, subIntfObjArr); - return; + + if (DataObjectArr != null && DataObjectArr.length > 0) { + async.map(DataObjectArr, + commonUtils.getAPIServerResponse(configApiServer.apiPut, true), + function(error, results) { + if (error != null) { + error.messages += error.messages; + callback(error, results, subIntfObjArr); } - if(DataObjectArr != null && DataObjectArr.length > 0){ + setDeviceOwner (error, result, DataObjectLenDetail, + portPutData, vmiData, boolDeviceOwnerChange, request, + appData, function(error, result) { + callback(error, result, subIntfObjArr); + return; + }) + }); + } else { + setDeviceOwner (error, result, DataObjectLenDetail, + portPutData, vmiData, boolDeviceOwnerChange, request, + appData, function(error, result) { + callback(error, result, subIntfObjArr); + return; + }) + } +} + +function setDeviceOwner(error, result, DataObjectLenDetail, + portPutData, vmiData, boolDeviceOwnerChange, request, + appData, callback) { + var DataObjectArr = []; + if (boolDeviceOwnerChange == true) { + deviceOwnerChange(error, result, DataObjectArr, DataObjectLenDetail, + portPutData, vmiData, request, appData, function( + error, data, DataObjectArr){ + if (DataObjectArr != null && DataObjectArr.length > 0) { async.map(DataObjectArr, commonUtils.getAPIServerResponse(configApiServer.apiPut, true), function(error, results) { - callback(error, results, subIntfObjArr); - return; + callback(error, results); + return; }); } else { - callback(error, result, subIntfObjArr); + callback(error, DataObjectArr); return; } - }); - } else { - async.map(DataObjectArr, - commonUtils.getAPIServerResponse(configApiServer.apiPut, true), - function(error, results) { - callback(error, results, subIntfObjArr); return; }); + } else { + callback(error, DataObjectArr); } } @@ -1215,6 +1229,9 @@ function deviceOwnerChange(error, result, DataObjectArr, DataObjectLenDetail, po vmiData["virtual-machine-interface"]["virtual_machine_interface_device_owner"] = ""; } } + if (!("virtual_machine_interface_device_owner" in vmiData["virtual-machine-interface"])) { + vmiData["virtual-machine-interface"]["virtual_machine_interface_device_owner"] = ""; + } if ("virtual_machine_interface_device_owner" in portPutData["virtual-machine-interface"] && "virtual_machine_interface_device_owner" in vmiData["virtual-machine-interface"]) { var serverIndex = DataObjectLenDetail["LogicalRouterServerStartIndex"]; @@ -1254,7 +1271,7 @@ function deviceOwnerChange(error, result, DataObjectArr, DataObjectLenDetail, po } else if (portPutData["virtual-machine-interface"]["virtual_machine_interface_device_owner"] == "network:router_interface") { //Add new router entrey if(result[uiIndex] != null){ - if(DataObjectLenDetail["LogicalRouterUICount"] == 1) + if(DataObjectLenDetail["LogicalRouterUICount"] == 1) { var logicalRouterURL = '/logical-router/'+result[uiIndex]['logical-router']['uuid']; var responceData = {}; var responceData = createlogicalRouterDataObject(responceData,portPutData,result[uiIndex]); @@ -1265,12 +1282,13 @@ function deviceOwnerChange(error, result, DataObjectArr, DataObjectLenDetail, po var domainProject = []; domainProject.push(portPutData["virtual-machine-interface"]["logical_router_back_refs"][0]["to"][0]); domainProject.push(portPutData["virtual-machine-interface"]["logical_router_back_refs"][0]["to"][1]); - callback(error, rtData, DataObjectArr); + callback(error, result, DataObjectArr); return; } else { callback(error, result, DataObjectArr); return; } + } } else { //No attach/edit callback(error, result, DataObjectArr); @@ -1283,7 +1301,6 @@ function deviceOwnerChange(error, result, DataObjectArr, DataObjectLenDetail, po return; } } - if (vmiData["virtual-machine-interface"]["virtual_machine_interface_device_owner"] == "network:router_interface") { if (portPutData["virtual-machine-interface"]["virtual_machine_interface_device_owner"] != "network:router_interface" || ((portPutData["virtual-machine-interface"]["virtual_machine_interface_device_owner"] == "network:router_interface") && @@ -1378,7 +1395,6 @@ function deviceOwnerChange(error, result, DataObjectArr, DataObjectLenDetail, po } } } - if (vmiData["virtual-machine-interface"]["virtual_machine_interface_device_owner"] == "") { if (portPutData["virtual-machine-interface"]["virtual_machine_interface_device_owner"] == "network:router_interface") { var logicalRouterURL = '/logical-router/'+result[uiIndex]['logical-router']['uuid']; @@ -1754,6 +1770,43 @@ function deletePortsCB (dataObject, callback) var appData = dataObject.appData; var portId = dataObject.uuid; var request = dataObject.request; + var userData = dataObject.userData; + if (userData != null) { + var dataObjArr = []; + var userDataLen = userData.length; + for (var i = 0; i < userDataLen; i++) { + dataObjArr.push({"portId" : userData[i], + "appData" : appData, + "request" :request}) + } + async.mapLimit(dataObjArr, 100, deletePortPerUUID, function(error, data) { + if (error) { + callback(null, {'error': error, 'data': data}); + return; + } + var dataObj = {"portId" : portId, + "appData" : appData, + "request" : request}; + deletePortPerUUID (dataObj, function(error, data) { + callback(null, {'error': error, 'data': data}); + return; + }); + }); + } else { + var dataObj = {"portId" : portId, + "appData" : appData, + "request" : request}; + deletePortPerUUID (dataObj, function(error, data) { + callback(null, {'error': error, 'data': data}); + return; + }) + } +} + +function deletePortPerUUID (dataObj, callback) { + var portId = dataObj.portId; + var appData = dataObj.appData; + var request = dataObj.request; readVMIwithUUID(portId, appData, function(err, vmiData){ if(err){ callback(null, {'error': err, 'data': vmiData}); @@ -1886,7 +1939,7 @@ function deletePortAsync (dataObj, callback) function(error, results) { vmiDelFloatingIP(error, results, dataObj['vmiData'], dataObj['appData'], function(err, data){ - callback(error, results); + callback(err, results); //return; }); }); @@ -1899,7 +1952,7 @@ function deletePortAsync (dataObj, callback) function(error, results) { removeRefSubInterface(error, results, dataObj['vmiData'], dataObj['appData'], function(err, data){ - callback(error, results); + callback(err, results); //return; }); }); @@ -1912,7 +1965,7 @@ function deletePortAsync (dataObj, callback) function(error, results) { vmiDelLogicalInterface(error, results, dataObj['vmiData'], dataObj['appData'], function(err, data){ - callback(error, results); + callback(err, results); //return; }); }); @@ -1925,7 +1978,7 @@ function deletePortAsync (dataObj, callback) function(error, results) { delSubnet(error, results, dataObj['vmiData'], dataObj['appData'], function(err, data){ - callback(error, results); + callback(err, results); //return; }); }); @@ -1938,7 +1991,7 @@ function deletePortAsync (dataObj, callback) function(error, results) { delVm(error, results, dataObj['appData'], function(err, data){ - callback(error, results); + callback(err, results); //return; }); }); @@ -1951,7 +2004,7 @@ function deletePortAsync (dataObj, callback) function(error, results) { vmiDelLogicalRout(error, results, dataObj['vmiData'], dataObj['appData'], function(err, data){ - callback(error, results); + callback(err, results); return; }); }); @@ -2080,7 +2133,7 @@ function getReadDelVMICb (err, vmiData, request, appData, callback) } //Subnet Interface Reference - if ( 'virtual_machine_interface_refs' in vmiData['virtual-machine-interface']) { + /* if ( 'virtual_machine_interface_refs' in vmiData['virtual-machine-interface']) { vmiRef = vmiData['virtual-machine-interface']['virtual_machine_interface_refs']; vmiRefLen = vmiRef.length; } @@ -2099,7 +2152,7 @@ function getReadDelVMICb (err, vmiData, request, appData, callback) vmiSubInterfaceObj['vmiData'] = vmiData; vmiSubInterfaceObj['appData'] = appData; allDataObj.push(vmiSubInterfaceObj); - } + }*/ //subnet if ('virtual-machine-interface' in vmiData && @@ -2337,7 +2390,7 @@ function removeRefSubInterface(error, results, vmiData, appData, callback) if('virtual_machine_interface_properties' in results[i]['virtual-machine-interface'] && "sub_interface_vlan_tag" in results[i]['virtual-machine-interface']['virtual_machine_interface_properties']) { //delete only sub_interface_vlan_tag to make sure it wont affect if a port is created from the SI which has extra fields. - delete results[i]['virtual-machine-interface']['virtual_machine_interface_properties']['sub_interface_vlan_tag']; + delete results[i]['virtual-machine-interface']['virtual_machine_interface_properties']['sub_interface_vlan_tag']; } j--; vmiRefLen--; @@ -2667,32 +2720,85 @@ function getVMIDetails (req, res, appData) getVMIDetailsCB(vmiURL, appData, res); } -function deleteAllPorts (req, res, appData) -{ - var projUUID = req.param('uuid'); - var reqUrl = '/virtual-machine-interfaces?parent_id=' + projUUID; - var dataObjArr = []; - - configApiServer.apiGet(reqUrl, appData, function(err, vmiData) { - if ((null != err) || (null == vmiData) || - (!vmiData['virtual-machine-interfaces'].length)) { - commonUtils.handleJSONResponse(err, res, null); - return; - } - var vmiCnt = vmiData['virtual-machine-interfaces'].length; - dataObjArr[0] = {}; - dataObjArr[0]['deleteIDs'] = []; - dataObjArr[0]['type'] = 'virtual-machine-interface'; - for (var i = 0; i < vmiCnt; i++) { - dataObjArr[0]['deleteIDs'].push(vmiData['virtual-machine-interfaces'][i]['uuid']); - } - configUtil.deleteMultiObjectCB(dataObjArr, req, appData, - function(err, data) { - commonUtils.handleJSONResponse(err, res, data); - }); - }); +function deleteAllPorts (req, res, appData) +{ + var projUUID = req.param('uuid'); + var reqUrl = '/virtual-machine-interfaces?parent_id=' + projUUID + "&detail=true"; + var dataObjArr = []; + + configApiServer.apiGet(reqUrl, appData, function(err, vmiData) { + if ((null != err) || (null == vmiData) || + (!vmiData['virtual-machine-interfaces'].length)) { + commonUtils.handleJSONResponse(err, res, null); + return; + } + var vmiCnt = vmiData['virtual-machine-interfaces'].length; + /*dataObjArr[0] = {}; + dataObjArr[0]['deleteIDs'] = []; + dataObjArr[0]['type'] = 'virtual-machine-interface';*/ + var primaryVMIs = {}; + for (var i = 0; i < vmiCnt; i++) { + var vmi = vmiData['virtual-machine-interfaces'][i]["virtual-machine-interface"]; + if(vmi.hasOwnProperty('virtual_machine_interface_refs') && + vmi['virtual_machine_interface_refs'].length > 0) { + //either sub interface or primary interface + if(vmi.hasOwnProperty('virtual_machine_interface_properties') && + vmi['virtual_machine_interface_properties'].hasOwnProperty('sub_interface_vlan_tag') && + !isNaN(vmi['virtual_machine_interface_properties']['sub_interface_vlan_tag']) && + vmi['virtual_machine_interface_refs'].length == 1) { + //sub interface + var primaryVMIRef = vmi['virtual_machine_interface_refs'][0].uuid; + if(null == primaryVMIs[primaryVMIRef] || + typeof primaryVMIs[primaryVMIRef] == "undefined") { + primaryVMIs[primaryVMIRef] = []; + } + primaryVMIs[primaryVMIRef].push(vmi.uuid); + } else { + //primary interface + if(null == primaryVMIs[vmi.uuid] || + typeof primaryVMIs[vmi.uuid] == "undefined") { + primaryVMIs[vmi.uuid] = []; + continue; + } + } + } else { + //independent VMIs + if(null == dataObjArr[0] || + typeof dataObjArr[0] === "undefined") { + dataObjArr[0] = {}; + dataObjArr[0]['deleteIDs'] = []; + dataObjArr[0]['type'] = 'virtual-machine-interface'; + dataObjArr[0]['userData'] = null; + } + dataObjArr[0]['deleteIDs'].push(vmi.uuid); + } + //dataObjArr[0]['deleteIDs'].push(vmiData['virtual-machine-interfaces'][i]['uuid']); + } + + for (var pVMI_UUID in primaryVMIs) { + if(!(primaryVMIs.hasOwnProperty(pVMI_UUID))) + continue; + var dataObjArrLen = dataObjArr.length; + dataObjArr[dataObjArrLen] = {}; + dataObjArr[dataObjArrLen]['deleteIDs'] = []; + dataObjArr[dataObjArrLen]['deleteIDs'].push(pVMI_UUID); + dataObjArr[dataObjArrLen]["type"] = "virtual-machine-interface"; + var subVMIs = primaryVMIs[pVMI_UUID]; + for(var sVMI_UUID in subVMIs) { + if(!(subVMIs.hasOwnProperty(sVMI_UUID))) + continue; + if(!(dataObjArr[dataObjArrLen].hasOwnProperty('userData'))) { + dataObjArr[dataObjArrLen]['userData'] = []; + } + dataObjArr[dataObjArrLen]['userData'].push(subVMIs[sVMI_UUID]); + } + } + configUtil.deleteMultiObjectCB(dataObjArr, req, appData, + function(err, data) { + commonUtils.handleJSONResponse(err, res, data); + }); + }); } - function buildVMIData (vmiData, dataObj) { var fip = dataObj['fip']; diff --git a/webroot/config/networking/port/ui/js/models/allowAddressPairModel.js b/webroot/config/networking/port/ui/js/models/allowAddressPairModel.js index d0ec4c1d6..ac9db691b 100644 --- a/webroot/config/networking/port/ui/js/models/allowAddressPairModel.js +++ b/webroot/config/networking/port/ui/js/models/allowAddressPairModel.js @@ -48,7 +48,7 @@ define([ } }, 'mac': function(value, attr, finalObj) { - if(value != "" && + if(value != "" && typeof value == "string" && isValidMACAddress(value) == false){ return "Enter valid MAC Address in Allowed address pairs"; } diff --git a/webroot/config/networking/port/ui/js/models/portModel.js b/webroot/config/networking/port/ui/js/models/portModel.js index 16bf84a99..03463f730 100644 --- a/webroot/config/networking/port/ui/js/models/portModel.js +++ b/webroot/config/networking/port/ui/js/models/portModel.js @@ -44,6 +44,7 @@ define([ 'logicalRouterValue':'', 'virtual_machine_refs':[], 'virtualMachineValue':'', + 'service_health_check_refs':'', 'virtual_machine_interface_mac_addresses': { 'mac_address':[] @@ -90,6 +91,7 @@ define([ 'templateGeneratorData': 'rawData', 'disable_sub_interface' : false, 'subnetGroupVisible': true, + 'isParent' : false, 'ecmp_hashing_include_fields': {/* 'hashing_configured': false, 'source_ip': true, @@ -168,7 +170,6 @@ define([ } } } - //Modal config default Fixed IP formatting var fixedIPModels = []; var fixedipList = modelConfig["instance_ip_back_refs"]; @@ -256,6 +257,17 @@ define([ modelConfig['staticRoute'].push(SRVal); } } + //Modal config default Health Check formatting + healthCheck = getValueByJsonPath(modelConfig, 'service_health_check_refs', []); + if (healthCheck.length > 0) { + var healthCheckTo = getValueByJsonPath(healthCheck[0], 'to', ''); + var healthCheckuuid = getValueByJsonPath(healthCheck[0], + 'uuid', ''); + if (healthCheckTo != "" && healthCheckuuid != "") { + healthCheckVal = healthCheckTo.join(":") + " " + healthCheckuuid; + modelConfig['service_health_check_refs'] = healthCheckVal; + } + } //Modal config default ECMP formatting var ecmpHashIncFields = []; @@ -322,6 +334,10 @@ define([ //Modal config default Port Binding formatting var portBinding = []; + var devOwner = getValueByJsonPath(modelConfig, 'virtual_machine_interface_device_owner'); + if ("compute" == devOwner.substring(0,7)) { + devOwner = "compute"; + } var portBindingList = modelConfig["virtual_machine_interface_bindings"]["key_value_pair"]; if(portBindingList != null && portBindingList.length > 0) { @@ -332,10 +348,11 @@ define([ port_binding_obj.value == "direct" ) { port_binding_obj.key = "SR-IOV (vnic_type:direct)"; } - if(port_binding_obj.key == "SR-IOV (vnic_type:direct)" || + if(devOwner == "compute" && + (port_binding_obj.key == "SR-IOV (vnic_type:direct)" || port_binding_obj.key == "vnic_type" || port_binding_obj.key == "vif_type" || - port_binding_obj.key == "vif_details") { + port_binding_obj.key == "vif_details")) { port_binding_obj.disablePortBindKey = true; } var portBindingModel = new PortBindingModel(port_binding_obj); @@ -412,6 +429,13 @@ define([ modelConfig["disable_sub_interface"] = true; } } + if(vlanTag == ""){ + var vmiRefTo = getValueByJsonPath(modelConfig, + "virtual_machine_interface_refs",[]); + if (vmiRefTo.length > 0) { + modelConfig['isParent'] = true; + } + } modelConfig['deviceOwnerValue'] = deviceOwnerValue; return modelConfig; }, @@ -483,6 +507,16 @@ define([ return "Device Owner UUID cannot be empty."; } }, + 'deviceOwnerValue': function(value, attr, finalObj) { + if (value == "router") { + if (finalObj.isParent == true) { + return "Router cannot be set to a parent port."; + } + if (finalObj.is_sub_interface == true) { + return "Router cannot be set to a Sub Interface."; + } + } + }, 'portBindingCollection': function(value, attr, finalObj) { if(value.length > 0) { var portBindingLength = value.length; @@ -822,7 +856,10 @@ define([ aapLocal[i] = {}; var prefix = 32; var ip = aapCollection[i].ipPrefixVal(); - aapLocal[i]["mac"] = aapCollection[i].mac(); + //aapLocal[i]["mac"] = null; + if (aapCollection[i].mac() != "") { + aapLocal[i]["mac"] = aapCollection[i].mac(); + } if(ip != ""){ aapLocal[i]["ip"] = {}; if(ip.split("/").length == 2) { @@ -946,6 +983,18 @@ define([ } else { newPortData.interface_route_table_refs = []; } + // Health Check + var healthCheck = getValueByJsonPath(newPortData, + "service_health_check_refs",""); + if(healthCheck != "") { + var healthCheckArr = healthCheck.split(" "); + newPortData.service_health_check_refs = []; + newPortData.service_health_check_refs[0] = {}; + newPortData.service_health_check_refs[0].to = healthCheckArr[0].split(":"); + newPortData.service_health_check_refs[0].uuid = healthCheckArr[1]; + } else { + newPortData.service_health_checks_refs = []; + } /* ECMP Hashing */ var ecmpHashIncFields = this.getNonDefaultECMPHashingFields(); var count = 0; @@ -1096,10 +1145,10 @@ define([ newPortData.virtual_machine_interface_refs[0].uuid = uuid; newPortData.virtual_machine_interface_refs[0].to = to; } else { - newPortData.virtual_machine_interface_refs = []; - //if(selectedParentVMIObject.length > 0) { - // newPortData["virtual_machine_interface_refs"] = selectedParentVMIObject; - //} + newPortData.virtual_machine_interface_properties.sub_interface_vlan_tag = null; + if (newPortData.isParent != true) { + newPortData.virtual_machine_interface_refs = []; + } } newPortData.virtual_machine_interface_properties.interface_mirror = {} if (newPortData.is_mirror == true) { @@ -1188,6 +1237,7 @@ define([ delete(newPortData.mirrorToAnalyzerIpAddress); delete(newPortData.mirrorToRoutingInstance); delete(newPortData.mirrorToUdpPort); + delete(newPortData.isParent); if("parent_href" in newPortData) { delete(newPortData.parent_href); } @@ -1250,30 +1300,74 @@ define([ deletePort: function(selectedGridData, callbackObj) { var ajaxConfig = {}, returnFlag = false; var delDataID = []; - for(var i=0;i 0) { + var sentData = delDataID; + ajaxConfig.async = false; + ajaxConfig.type = "POST"; + ajaxConfig.data = JSON.stringify(sentData); + ajaxConfig.url = "/api/tenants/config/delete"; + contrail.ajaxHandler(ajaxConfig, function () { + if (contrail.checkIfFunction(callbackObj.init)) { + callbackObj.init(); + } + }, function (response) { + if (contrail.checkIfFunction(callbackObj.success)) { + callbackObj.success(); + } + returnFlag = true; + }, function (error) { + if (contrail.checkIfFunction(callbackObj.error)) { + callbackObj.error(error); + } + returnFlag = false; + }); + } return returnFlag; }, deleteAllPort: function(callbackObj) { diff --git a/webroot/config/networking/port/ui/js/views/portEditView.js b/webroot/config/networking/port/ui/js/views/portEditView.js index 6708378e8..86300a8ec 100644 --- a/webroot/config/networking/port/ui/js/views/portEditView.js +++ b/webroot/config/networking/port/ui/js/views/portEditView.js @@ -128,12 +128,20 @@ define([ var selectedGridData = options['selectedGridData'], elId = 'deletePortID'; var items = ""; + var errorString = ""; var rowIdxLen = selectedGridData.length; for (var i = 0; i < rowIdxLen; i++) { - items += - selectedGridData[i]["name"]; - if (i < rowIdxLen - 1) { - items += ','; + var isParentPortBool = portFormatter.isParentPort(selectedGridData[i]); + if (isParentPortBool != true) { + if (items != "") { + items += ', '; + } + items += selectedGridData[i]["name"]; + } else { + if (errorString != "") { + errorString += ", "; + } + errorString += selectedGridData[i]["name"]; } } var delTemplate = @@ -142,12 +150,19 @@ define([ var delLayout = delTemplate({prefixId: prefixId, item: ctwl.TEXT_PORT, itemId: items}) + var errorMessage = false; + if (errorString != "") { + errorMessage = "Deleting Primary Interface(s) "+errorString+" deletes all its sub interfaces. Do you want to continue?"; + } cowu.createModal({'modalId': modalId, 'className': 'modal-700', 'title': options['title'], 'btnName': 'Confirm', 'body': delLayout, 'onSave': function () { + self.model.showErrorAttr(prefixId + cowc.FORM_SUFFIX_ID, + errorMessage); self.model.deletePort(selectedGridData, { init: function () { - self.model.showErrorAttr(elId, false); + self.model.showErrorAttr(prefixId + cowc.FORM_SUFFIX_ID, + false); cowu.enableModalLoading(modalId); }, success: function () { @@ -156,7 +171,8 @@ define([ }, error: function (error) { cowu.disableModalLoading(modalId, function () { - self.model.showErrorAttr(elId, error.responseText); + self.model.showErrorAttr(prefixId + cowc.FORM_SUFFIX_ID, + error.responseText); }); } }); @@ -165,7 +181,7 @@ define([ kbValidation.unbind(self); $("#" + modalId).modal('hide'); }}); - this.model.showErrorAttr(elId, false); + this.model.showErrorAttr(prefixId + cowc.FORM_SUFFIX_ID, errorMessage); Knockback.applyBindings(this.model, document.getElementById(modalId)); kbValidation.bind(this); @@ -183,7 +199,7 @@ define([ 'body': delLayout, 'onSave': function () { self.model.deleteAllPort({ init: function () { - self.model.showErrorAttr(elId, false); + self.model.showErrorAttr(prefixId + cowc.FORM_SUFFIX_ID, false); cowu.enableModalLoading(modalId); }, success: function () { @@ -192,7 +208,8 @@ define([ }, error: function (error) { cowu.disableModalLoading(modalId, function () { - self.model.showErrorAttr(elId, error.responseText); + self.model.showErrorAttr(prefixId + cowc.FORM_SUFFIX_ID, + error.responseText); }); } }); @@ -201,7 +218,7 @@ define([ kbValidation.unbind(self); $("#" + modalId).modal('hide'); }}); - this.model.showErrorAttr(elId, false); + this.model.showErrorAttr(prefixId + cowc.FORM_SUFFIX_ID, false); Knockback.applyBindings(this.model, document.getElementById(modalId)); kbValidation.bind(this); @@ -248,6 +265,9 @@ define([ var routingInstance = {}; routingInstance.data = []; routingInstance.data[0] = {'type':'routing-instances', 'fields':''}; + var healthCheck = {}; + healthCheck.data = []; + healthCheck.data[0] = {'type':'service-health-checks', 'fields':''}; return { elementId: cowu.formatElementId([prefixId, ctwl.TITLE_EDIT_PORT]), view: "SectionView", @@ -262,6 +282,7 @@ define([ disabled: isDisable, path: 'virtualNetworkName', dataBindValue: 'virtualNetworkName', + dropdownAutoWidth : false, class: "span6", elementConfig:{ allowClear: true, @@ -485,6 +506,36 @@ define([ } } }] + },{ + columns: [{ + elementId: 'ServiceHealthCheck', + view: 'FormDropdownView', + name: 'Static Routes', + viewConfig: { + label:'Service Health Check', + path: 'service_health_check_refs', + dataBindValue: 'service_health_check_refs', + elementConfig:{ + allowClear: true, + placeholder: 'Service Health Check', + dataTextField: "text", + dataValueField: "value", + dropdownAutoWidth : false, + dataSource : { + type: 'remote', + requestType: 'post', + postData: JSON.stringify(healthCheck), + url:'/api/tenants/config/get-config-list', + parse: function(result) { + return portFormatter.healthCheckDDFormatter( + result, + isDisable, + self); + } + } + } + } + }] }, { columns: [{ elementId: 'allowedAddressPairCollection', @@ -579,9 +630,81 @@ define([ } } ] - }, - this.deviceOwner(isDisable, selectedProjectVal) - , { + },{ + columns: [{ + elementId: 'deviceOwnerValue', + name: "Device Owner", + view: "FormDropdownView", + viewConfig: { + visible : "!isVCenter()", + path: 'deviceOwnerValue', + dataBindValue: 'deviceOwnerValue', + class: "span6", + label: "Device Owner", + elementConfig:{ + allowClear: true, + dataTextField: "text", + dataValueField: "value", + data : [ + {"text":"None","value":"none"}, + {"text":"Compute","value":"compute"}, + {"text":"Router","value":"router"} + ] + } + } + },{ + elementId: 'virtualMachineValue', + view: "FormComboboxView", + viewConfig: { + path: 'virtualMachineValue', + label: "Compute UUID", + dataBindValue: 'virtualMachineValue', + class: "span6", + visible: "deviceComputeShow()", + elementConfig:{ + dataTextField: "text", + dataValueField: "value", + defaultValueId : 0, + dataSource : { + type: 'remote', + url:'/api/tenants/config/listVirtualMachines', + parse: function(result) { + return portFormatter.computeUUIDFormatter( + result, + isDisable, + self); + } + } + } + } + },{ + elementId: 'logicalRouterValue', + view: "FormDropdownView", + viewConfig: { + path: 'logicalRouterValue', + label: "Router", + dataBindValue: 'logicalRouterValue', + class: "span6", + visible: "deviceRouterShow()", + elementConfig:{ + dataTextField: "text", + dataValueField: "value", + //defaultValueId : 0, + dropdownAutoWidth : false, + dataSource : { + type: 'remote', + url:"/api/tenants/config/list-logical-routers?projUUID=" + +selectedProjectVal, + parse: function(result) { + return portFormatter.routerFormater( + result, + isDisable, + self); + } + } + }} + }] + } , { columns: [{ elementId: 'portBindingCollection', view: 'FormEditableGridView', @@ -651,12 +774,14 @@ define([ }] } }] - },{ + }, { columns: [{ elementId: 'is_sub_interface', name: "Sub Interface", view: "FormCheckboxView", viewConfig: { + visible : "!isParent()", + disabled: "disable_sub_interface", path: 'is_sub_interface', label: "Sub Interface", templateId: cowc.TMPL_CHECKBOX_LABEL_RIGHT_VIEW, @@ -695,6 +820,7 @@ define([ dataTextField: "text", dataValueField: "value", //defaultValueId : 0, + dropdownAutoWidth : false, dataSource : { type: 'remote', url:"/api/tenants/config/get-virtual-machines-ips?uuid=" @@ -726,6 +852,7 @@ define([ elementConfig:{ dataTextField: "text", dataValueField: "value", + dropdownAutoWidth : false, //defaultValueId : 0, dataSource : { type: 'remote', @@ -829,6 +956,7 @@ define([ placeholder: 'Select Routing Instance', dataTextField: "text", dataValueField: "value", + dropdownAutoWidth : false, dataSource : { type: 'remote', requestType: 'post', @@ -989,91 +1117,11 @@ define([ } }] }] - } - }] - }] - }] - } - } - }, - deviceOwner : function(isDisable, selectedProjectVal) { - if(!isVCenter()) { - return({ - columns: [{ - elementId: 'deviceOwnerValue', - name: "Device Owner", - view: "FormDropdownView", - viewConfig: { - visible: true, - path: 'deviceOwnerValue', - dataBindValue: 'deviceOwnerValue', - class: "span6", - label: "Device Owner", - elementConfig:{ - allowClear: true, - dataTextField: "text", - dataValueField: "value", - data : [ - {"text":"None","value":"none"}, - {"text":"Compute","value":"compute"}, - {"text":"Router","value":"router"} - ] - } - } - },{ - elementId: 'virtualMachineValue', - view: "FormComboboxView", - viewConfig: { - path: 'virtualMachineValue', - label: "Compute UUID", - dataBindValue: 'virtualMachineValue', - class: "span6", - visible: "deviceComputeShow()", - elementConfig:{ - dataTextField: "text", - dataValueField: "value", - defaultValueId : 0, - dataSource : { - type: 'remote', - url:'/api/tenants/config/listVirtualMachines', - parse: function(result) { - return portFormatter.computeUUIDFormatter( - result, - isDisable, - self); - } - } } - } - },{ - elementId: 'logicalRouterValue', - view: "FormDropdownView", - viewConfig: { - path: 'logicalRouterValue', - label: "Router", - dataBindValue: 'logicalRouterValue', - class: "span6", - visible: "deviceRouterShow()", - elementConfig:{ - dataTextField: "text", - dataValueField: "value", - //defaultValueId : 0, - dataSource : { - type: 'remote', - url:"/api/tenants/config/list-logical-routers?projUUID=" - +selectedProjectVal, - parse: function(result) { - return portFormatter.routerFormater( - result, - isDisable, - self); - } - } - }} }] - }); - } else { - return ({columns: []}); + }] + }] + } } } }); diff --git a/webroot/config/networking/port/ui/js/views/portFormatters.js b/webroot/config/networking/port/ui/js/views/portFormatters.js index ccaafa10c..1fb468433 100644 --- a/webroot/config/networking/port/ui/js/views/portFormatters.js +++ b/webroot/config/networking/port/ui/js/views/portFormatters.js @@ -23,6 +23,17 @@ define([ } return vmiData; } + this.uuidWithName = function(d, c, v, cd, dc) { + var uuidName = "-"; + var uuid = getValueByJsonPath(dc, "uuid", "") + var name = getValueByJsonPath(dc, "fq_name;2", "") + if(uuid != name){ + uuidName = name + " (" + uuid+ ")"; + } else { + uuidName = uuid; + } + return uuidName; + }; //Start of grid data formating// //Grid column label: Network// //Grid column expand label : Network// @@ -40,15 +51,15 @@ define([ var instIP = getValueByJsonPath(dc, "instance_ip_back_refs", []); if(instIP.length > 0) { var instIP_length = instIP.length; - for(var i = 0; i < instIP_length && i < 3 ;i++) { + for(var i = 0; i < instIP_length && i < 2 ;i++) { var ip = getValueByJsonPath(instIP[i], "fixedip;ip", ""); instanceIP += ip; if(instanceIP != "") { instanceIP += "
"; } } - if(instIP_length > 3) { - instanceIP += "(" + Number(Number(instIP_length)-3)+" more)"; + if(instIP_length > 2) { + instanceIP += "(" + Number(Number(instIP_length)-2)+" more)"; } } else { instanceIP = "-"; @@ -61,14 +72,14 @@ define([ var fipData = getValueByJsonPath(dc, "floating_ip_back_refs", []); if(fipData.length > 0) { var fip_length = fipData.length; - for(var i = 0; i < fip_length && i < 3 ;i++) { + for(var i = 0; i < fip_length && i < 2 ;i++) { floatingIP += fipData[i]["floatingip"]["ip"]; if(floatingIP != "") { floatingIP += "
"; } } - if(fip_length > 3) { - floatingIP += "(" + Number(Number(fip_length)-3)+" more)"; + if(fip_length > 2) { + floatingIP += "(" + Number(Number(fip_length)-2)+" more)"; } } else { floatingIP = "-"; @@ -247,6 +258,26 @@ define([ } return staticRout; }; + + //Grid column expand label: Service Health Check// + this.serviceHealthCheckFormatter = function(d, c, v, cd, dc) { + var serviceHealthCheck = ""; + var serviceHealthCheckValues = getValueByJsonPath(dc, + "service_health_check_refs", + []); + if(serviceHealthCheckValues.length > 0) { + var serviceHealthChecklength = serviceHealthCheckValues.length; + for(var i = 0; i < serviceHealthChecklength;i++) { + var serviceHealthCheckTo = + getValueByJsonPath(serviceHealthCheckValues[i], "to", []); + temp = ctwu.formatCurrentFQName(serviceHealthCheckTo); + serviceHealthCheck += temp; + } + } else { + serviceHealthCheck = "-"; + } + return serviceHealthCheck; + }; //Grid column expand label: Static Routes// this.ECMPHashingFormatter = function(d, c, v, cd, dc) { var ecmp = getValueByJsonPath(dc, "ecmp_hashing_include_fields", ""), @@ -673,6 +704,26 @@ define([ } return lrReturn; } + /* + Create / Edit Health check drop down data formatter + */ + this.healthCheckDDFormatter = function(response, edit, portModel) { + var healthCheckDataReturn = []; + var healthCheckData = response[0]["service-health-checks"]; + var healthCheckLen = healthCheckData.length; + var healthCheckVal = {}; + for(var i = 0; i < healthCheckLen; i++) { + var healthCheckFQName = getValueByJsonPath(healthCheckData[i], 'fq_name', []); + var healthCheckUUID = getValueByJsonPath(healthCheckData[i], 'uuid', ''); + if(healthCheckFQName.length > 0) { + healthCheckVal = healthCheckFQName.join(":") + " " + healthCheckUUID; + var text = ctwu.formatCurrentFQName(healthCheckFQName); + healthCheckDataReturn.push({value: healthCheckVal, text: text}); + } + } + return healthCheckDataReturn; + } + /* Create / Edit Sub Interface drop down data formatter */ @@ -828,6 +879,29 @@ define([ } return fqn; }; + this.isParentPort = function(selectedGridData) { + var vlanTag = getValueByJsonPath(selectedGridData, + "virtual_machine_interface_properties;sub_interface_vlan_tag",""); + var vmiRefTo = getValueByJsonPath(selectedGridData, + "virtual_machine_interface_refs",[]); + if (vmiRefTo.length > 0 && vlanTag == "") { + return true; + } + return false; + }; + this.getVMIRelation = function(selectedGridData) { + var vlanTag = getValueByJsonPath(selectedGridData, + "virtual_machine_interface_properties;sub_interface_vlan_tag",""); + var vmiRefTo = getValueByJsonPath(selectedGridData, + "virtual_machine_interface_refs",[]); + if (vmiRefTo.length > 0 && vlanTag == "") { + return "primaryInterface"; + } + if (vmiRefTo.length > 0 && vlanTag != "") { + return "subInterface"; + } + return "vmi"; + }; } return PortFormatters; }); diff --git a/webroot/config/networking/port/ui/js/views/portGridView.js b/webroot/config/networking/port/ui/js/views/portGridView.js index 06cf00133..18f05c7da 100644 --- a/webroot/config/networking/port/ui/js/views/portGridView.js +++ b/webroot/config/networking/port/ui/js/views/portGridView.js @@ -426,8 +426,8 @@ define([ formatter: "DHCPFormatter" } }, - self.deviceOwner(), - self.deviceOwnerUUID() + this.deviceOwner(), + this.deviceOwnerUUID() ,{ key: 'interface_route_table_refs', name:"interface_route_table_refs", @@ -436,6 +436,14 @@ define([ templateGeneratorConfig:{ formatter: "staticRoutFormatter" } + }, { + key: 'service_health_check_refs', + name:"service_health_check_refs", + label:"Service Health Check", + templateGenerator: 'TextGenerator', + templateGeneratorConfig:{ + formatter: "serviceHealthCheckFormatter" + } }, { key: 'virtual_machine_interface_properties', name:"virtual_machine_interface_properties", @@ -501,8 +509,8 @@ define([ formatter: "subInterfaceVXLANUUID" } }, { - key: 'virtual_machine_interface_refs', - name:"virtual_machine_interface_refs", + key: 'virtual_machine_interface_properties.sub_interface_vlan_tag', + name:"virtual_machine_interface_refs.sub_interface_vlan_tag", label:"Parent Port", templateGenerator: 'TextGenerator', templateGeneratorConfig:{ @@ -611,6 +619,9 @@ define([ this.mirrorFormatter = function(v, dc) { return portFormatters.mirrorFormatter("", "", v, "", dc); }; + this.serviceHealthCheckFormatter = function(v, dc) { + return portFormatters.serviceHealthCheckFormatter("", "", v, "", dc); + }; this.localPrefFormater = function(v, dc) { return portFormatters.localPrefFormater("", "", v, "", dc); };