server: Enhance bypass vlan overlap check (#3026)

This PR adds the possibility to select a checkbox for the parameter bypassvlanoverlapcheck to the ajax request createNetwork. The checkbox was added for Guest Network as well as for the L2 Guest Network. For L2 Guest Network a backend check for the existence of the flag bypassvlanoverlapcheck was added.
This commit is contained in:
Gerd Müller 2018-12-24 08:16:54 +01:00 committed by Rohit Yadav
parent 5067d560ce
commit cabef5305d
4 changed files with 31 additions and 5 deletions

View File

@ -40,7 +40,7 @@ public class CreateNetworkCmdByAdmin extends CreateNetworkCmd {
@Parameter(name=ApiConstants.VLAN, type=CommandType.STRING, description="the ID or VID of the network")
private String vlan;
@Parameter(name=ApiConstants.BYPASS_VLAN_OVERLAP_CHECK, type=CommandType.BOOLEAN, description="when true bypasses VLAN id/range overlap check during network creation for shared networks")
@Parameter(name=ApiConstants.BYPASS_VLAN_OVERLAP_CHECK, type=CommandType.BOOLEAN, description="when true bypasses VLAN id/range overlap check during network creation for shared and L2 networks")
private Boolean bypassVlanOverlapCheck;
/////////////////////////////////////////////////////

View File

@ -2281,7 +2281,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
}
if (! UuidUtils.validateUUID(vlanId)){
// For Isolated and L2 networks, don't allow to create network with vlan that already exists in the zone
if (ntwkOff.getGuestType() == GuestType.Isolated || ntwkOff.getGuestType() == GuestType.L2) {
if (ntwkOff.getGuestType() == GuestType.Isolated || !hasGuestBypassVlanOverlapCheck(bypassVlanOverlapCheck, ntwkOff)) {
if (_networksDao.listByZoneAndUriAndGuestType(zoneId, uri.toString(), null).size() > 0) {
throw new InvalidParameterValueException("Network with vlan " + vlanId + " already exists or overlaps with other network vlans in zone " + zoneId);
} else {
@ -2469,7 +2469,16 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
return network;
}
/**
/**
* Checks bypass VLAN id/range overlap check during network creation for guest networks
* @param bypassVlanOverlapCheck bypass VLAN id/range overlap check
* @param ntwkOff network offering
*/
private boolean hasGuestBypassVlanOverlapCheck(final boolean bypassVlanOverlapCheck, final NetworkOfferingVO ntwkOff) {
return bypassVlanOverlapCheck && ntwkOff.getGuestType() != GuestType.Isolated;
}
/**
* Checks for L2 network offering services. Only 2 cases allowed:
* - No services
* - User Data service only, provided by ConfigDrive

View File

@ -511,6 +511,7 @@ var dictionary = {
"label.by.type":"By Type",
"label.by.type.id":"By Type ID",
"label.by.zone":"By Zone",
"label.bypass.vlan.overlap.check": "Bypass VLAN id/range overlap",
"label.bytes.received":"Bytes Received",
"label.bytes.sent":"Bytes Sent",
"label.cache.mode":"Write-cache Type",

View File

@ -347,6 +347,10 @@ var addGuestNetworkDialog = {
label: 'label.vlan.id',
docID: 'helpGuestNetworkZoneVLANID'
},
bypassVlanOverlapCheck: {
label: 'label.bypass.vlan.overlap.check',
isBoolean: true
},
isolatedpvlanId: {
label: 'label.secondary.isolated.vlan.id'
},
@ -739,6 +743,9 @@ var addGuestNetworkDialog = {
if ($form.find('.form-item[rel=vlanId]').css("display") != "none"){
cloudStack.addVlanToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.vlanId)
}
if ($form.find('.form-item[rel=bypassVlanOverlapCheck]').css("display") != "none"){
array1.push("&bypassVlanOverlapCheck=" + encodeURIComponent((args.data.bypassVlanOverlapCheck == "on")));
}
if (($form.find('.form-item[rel=isolatedpvlanId]').css("display") != "none") && (args.data.isolatedpvlanId != null && args.data.isolatedpvlanId.length > 0)){
array1.push("&isolatedpvlan=" + encodeURIComponent(args.data.isolatedpvlanId));
}
@ -929,6 +936,7 @@ var addL2GuestNetwork = {
var networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
args.$select.change(function() {
var $vlan = args.$select.closest('form').find('[rel=vlan]');
var $bypassVlanOverlapCheck = args.$select.closest('form').find('[rel=bypassVlanOverlapCheck]');
var networkOffering = $.grep(
networkOfferingObjs, function(netoffer) {
return netoffer.id == args.$select.val();
@ -937,8 +945,10 @@ var addL2GuestNetwork = {
if (networkOffering.specifyvlan) {
$vlan.css('display', 'inline-block');
$bypassVlanOverlapCheck.css('display', 'inline-block');
} else {
$vlan.hide();
$bypassVlanOverlapCheck.hide();
}
});
@ -962,6 +972,11 @@ var addL2GuestNetwork = {
},
isHidden: true
},
bypassVlanOverlapCheck: {
label: 'label.bypass.vlan.overlap.check',
isBoolean: true,
isHidden: true
},
domain: {
label: 'label.domain',
@ -1036,7 +1051,8 @@ var addL2GuestNetwork = {
if (args.$form.find('.form-item[rel=vlan]').css('display') != 'none') {
$.extend(dataObj, {
vlan: args.data.vlan
vlan: args.data.vlan,
bypassVlanOverlapCheck: (args.data.bypassVlanOverlapCheck == "on")
});
}
@ -2884,4 +2900,4 @@ cloudStack.listDiskOfferings = function(options){
error: mergedOptions.error
});
return diskOfferings;
};
};