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); };