Skip to content

Commit 3862a9b

Browse files
Update CIDR/Gateway of the shared network from the Guest IP range(s) (and some code improvements)
1 parent bf46458 commit 3862a9b

File tree

4 files changed

+115
-16
lines changed

4 files changed

+115
-16
lines changed

plugins/network-elements/bigswitch/src/main/java/com/cloud/network/element/BigSwitchBcfElement.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -673,13 +673,13 @@ public boolean applyNetworkACLs(Network network,
673673
SubnetUtils utils;
674674
String cidr = null;
675675
List<String> cidrList;
676-
for(NetworkACLItem r: rules){
677-
if(r.getState()==NetworkACLItem.State.Revoke){
676+
for (NetworkACLItem r: rules) {
677+
if (r.getState() == NetworkACLItem.State.Revoke) {
678678
continue;
679679
}
680680
cidrList = r.getSourceCidrList();
681-
if(cidrList != null){
682-
if(cidrList.size()>1 || !r.getSourcePortEnd().equals(r.getSourcePortStart())){
681+
if (cidrList != null) {
682+
if (cidrList.size() > 1 || !r.getSourcePortEnd().equals(r.getSourcePortStart())){
683683
throw new ResourceUnavailableException("One CIDR and one port only please.",
684684
Network.class, network.getId());
685685
} else {
@@ -690,7 +690,7 @@ public boolean applyNetworkACLs(Network network,
690690
cidr = "";
691691
} else {
692692
utils = new SubnetUtils(cidr);
693-
if(!utils.getInfo().getNetworkAddress().equals(utils.getInfo().getAddress())){
693+
if (!utils.getInfo().getNetworkAddress().equals(utils.getInfo().getAddress())){
694694
throw new ResourceUnavailableException("Invalid CIDR in Network ACL rule.",
695695
Network.class, network.getId());
696696
}
@@ -712,8 +712,8 @@ public boolean applyFWRules(Network network,
712712
continue;
713713
}
714714
cidrList = r.getSourceCidrList();
715-
if(cidrList != null){
716-
if(cidrList.size()>1 || !r.getSourcePortEnd().equals(r.getSourcePortStart())){
715+
if (cidrList != null) {
716+
if (cidrList.size() > 1 || !r.getSourcePortEnd().equals(r.getSourcePortStart())){
717717
throw new ResourceUnavailableException("One CIDR and one port only please.",
718718
Network.class, network.getId());
719719
} else {
@@ -724,7 +724,7 @@ public boolean applyFWRules(Network network,
724724
cidr = "";
725725
} else {
726726
utils = new SubnetUtils(cidr);
727-
if(!utils.getInfo().getNetworkAddress().equals(utils.getInfo().getAddress())){
727+
if (!utils.getInfo().getNetworkAddress().equals(utils.getInfo().getAddress())){
728728
throw new ResourceUnavailableException("Invalid CIDR in Firewall rule.",
729729
Network.class, network.getId());
730730
}

server/src/main/java/com/cloud/api/ApiResponseHelper.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2410,10 +2410,11 @@ public NetworkResponse createNetworkResponse(ResponseView view, Network network)
24102410
response.setType(network.getGuestType().toString());
24112411
}
24122412

2413-
response.setGateway(network.getGateway());
2413+
response.setGateway(com.cloud.utils.StringUtils.getFirstValueFromCommaSeparatedString(network.getGateway()));
2414+
String cidr = com.cloud.utils.StringUtils.getFirstValueFromCommaSeparatedString(network.getCidr());
24142415

24152416
// FIXME - either set netmask or cidr
2416-
response.setCidr(network.getCidr());
2417+
response.setCidr(cidr);
24172418
if (network.getNetworkCidr() != null) {
24182419
response.setNetworkCidr((network.getNetworkCidr()));
24192420
}
@@ -2424,18 +2425,18 @@ public NetworkResponse createNetworkResponse(ResponseView view, Network network)
24242425
if (network.getNetworkCidr() != null) {
24252426
response.setNetmask(NetUtils.cidr2Netmask(network.getNetworkCidr()));
24262427
}
2427-
if (((network.getCidr()) != null) && (network.getNetworkCidr() == null)) {
2428-
response.setNetmask(NetUtils.cidr2Netmask(network.getCidr()));
2428+
if ((cidr != null) && (network.getNetworkCidr() == null)) {
2429+
response.setNetmask(NetUtils.cidr2Netmask(cidr));
24292430
}
24302431

2431-
response.setIp6Gateway(network.getIp6Gateway());
2432-
response.setIp6Cidr(network.getIp6Cidr());
2432+
response.setIp6Gateway(com.cloud.utils.StringUtils.getFirstValueFromCommaSeparatedString(network.getIp6Gateway()));
2433+
response.setIp6Cidr(com.cloud.utils.StringUtils.getFirstValueFromCommaSeparatedString(network.getIp6Cidr()));
24332434

24342435
// create response for reserved IP ranges that can be used for
24352436
// non-cloudstack purposes
24362437
String reservation = null;
2437-
if ((network.getCidr() != null) && (NetUtils.isNetworkAWithinNetworkB(network.getCidr(), network.getNetworkCidr()))) {
2438-
String[] guestVmCidrPair = network.getCidr().split("\\/");
2438+
if ((cidr != null) && (NetUtils.isNetworkAWithinNetworkB(cidr, network.getNetworkCidr()))) {
2439+
String[] guestVmCidrPair = cidr.split("\\/");
24392440
String[] guestCidrPair = network.getNetworkCidr().split("\\/");
24402441

24412442
Long guestVmCidrSize = Long.valueOf(guestVmCidrPair[1]);

server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5038,6 +5038,29 @@ public Vlan createVlanAndPublicIpRange(final long zoneId, final long networkId,
50385038
final VlanVO vlan = commitVlanAndIpRange(zoneId, networkId, physicalNetworkId, podId, startIP, endIP, vlanGateway, vlanNetmask, vlanId, domain, vlanOwner, vlanIp6Gateway, vlanIp6Cidr,
50395039
ipv4, zone, vlanType, ipv6Range, ipRange, forSystemVms);
50405040

5041+
if (vlan != null) {
5042+
final NetworkVO networkVO = _networkDao.findById(networkId);
5043+
if (ipv4) {
5044+
String networkCidr = networkVO.getCidr();
5045+
String newCidr = NetUtils.getCidrFromGatewayAndNetmask(vlanGateway, vlanNetmask);
5046+
String newNetworkCidr = com.cloud.utils.StringUtils.updateCommaSeparatedStringWithValue(networkCidr, newCidr, true);
5047+
networkVO.setCidr(newNetworkCidr);
5048+
5049+
String networkGateway = networkVO.getGateway();
5050+
String newNetworkGateway = com.cloud.utils.StringUtils.updateCommaSeparatedStringWithValue(networkGateway, vlanGateway, true);
5051+
networkVO.setGateway(newNetworkGateway);
5052+
} else if (ipv6) {
5053+
String networkIp6Cidr = networkVO.getIp6Cidr();
5054+
String newNetworkIp6Cidr = com.cloud.utils.StringUtils.updateCommaSeparatedStringWithValue(networkIp6Cidr, vlanIp6Cidr, true);
5055+
networkVO.setCidr(newNetworkIp6Cidr);
5056+
5057+
String networkIp6Gateway = networkVO.getIp6Gateway();
5058+
String newNetworkIp6Gateway = com.cloud.utils.StringUtils.updateCommaSeparatedStringWithValue(networkIp6Gateway, vlanIp6Gateway, true);
5059+
networkVO.setIp6Gateway(newNetworkIp6Gateway);
5060+
}
5061+
_networkDao.update(networkId, networkVO);
5062+
}
5063+
50415064
return vlan;
50425065
}
50435066

@@ -6071,6 +6094,30 @@ public boolean deleteVlanIpRange(final DeleteVlanIpRangeCmd cmd) {
60716094
private boolean deleteAndPublishVlanAndPublicIpRange(final long userId, final long vlanDbId, final Account caller) {
60726095
VlanVO deletedVlan = deleteVlanAndPublicIpRange(userId, vlanDbId, caller);
60736096
if (deletedVlan != null) {
6097+
final boolean ipv4 = deletedVlan.getVlanGateway() != null;
6098+
final boolean ipv6 = deletedVlan.getIp6Gateway() != null;
6099+
final long networkId = deletedVlan.getNetworkId();
6100+
final NetworkVO networkVO = _networkDao.findById(networkId);
6101+
if (ipv4) {
6102+
String networkCidr = networkVO.getCidr();
6103+
String cidrToRemove = NetUtils.getCidrFromGatewayAndNetmask(deletedVlan.getVlanGateway(), deletedVlan.getVlanNetmask());
6104+
String newNetworkCidr = com.cloud.utils.StringUtils.updateCommaSeparatedStringWithValue(networkCidr, cidrToRemove, false);
6105+
networkVO.setCidr(newNetworkCidr);
6106+
6107+
String networkGateway = networkVO.getGateway();
6108+
String newNetworkGateway = com.cloud.utils.StringUtils.updateCommaSeparatedStringWithValue(networkGateway, deletedVlan.getVlanGateway(), false);
6109+
networkVO.setGateway(newNetworkGateway);
6110+
} else if (ipv6) {
6111+
String networkIp6Cidr = networkVO.getIp6Cidr();
6112+
String newNetworkIp6Cidr = com.cloud.utils.StringUtils.updateCommaSeparatedStringWithValue(networkIp6Cidr, deletedVlan.getIp6Cidr(), false);
6113+
networkVO.setCidr(newNetworkIp6Cidr);
6114+
6115+
String networkIp6Gateway = networkVO.getIp6Gateway();
6116+
String newNetworkIp6Gateway = com.cloud.utils.StringUtils.updateCommaSeparatedStringWithValue(networkIp6Gateway, deletedVlan.getIp6Gateway(), false);
6117+
networkVO.setIp6Gateway(newNetworkIp6Gateway);
6118+
}
6119+
_networkDao.update(networkId, networkVO);
6120+
60746121
messageBus.publish(_name, MESSAGE_DELETE_VLAN_IP_RANGE_EVENT, PublishScope.LOCAL, deletedVlan);
60756122
return true;
60766123
}

utils/src/main/java/com/cloud/utils/StringUtils.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,17 @@
2424
import com.fasterxml.jackson.databind.ObjectMapper;
2525

2626
import java.nio.charset.Charset;
27+
import java.util.Arrays;
2728
import java.util.ArrayList;
2829
import java.util.HashMap;
2930
import java.util.List;
31+
import java.util.LinkedHashSet;
3032
import java.util.Map;
3133
import java.util.Set;
3234
import java.util.TreeSet;
3335
import java.util.regex.Matcher;
3436
import java.util.regex.Pattern;
37+
import java.util.stream.Collectors;
3538

3639
public class StringUtils extends org.apache.commons.lang3.StringUtils {
3740
private static final char[] hexChar = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
@@ -394,4 +397,52 @@ public static String rangeToNumbers(String inputNumbersAndRanges) {
394397

395398
return result.toString();
396399
}
400+
401+
/**
402+
* Converts the comma separated numbers and ranges to numbers
403+
* @param originalString the original string (can be null or empty) containing list of comma separated values that has to be updated
404+
* @param value the value to add to, or remove from the original string
405+
* @param add if true, adds the input value; if false, removes it
406+
* @return String containing the modified original string (or null if empty)
407+
*/
408+
public static String updateCommaSeparatedStringWithValue(String originalString, String value, boolean add) {
409+
if (org.apache.commons.lang3.StringUtils.isEmpty(value)) {
410+
return originalString;
411+
}
412+
413+
Set<String> values = new LinkedHashSet<>();
414+
415+
if (org.apache.commons.lang3.StringUtils.isNotEmpty(originalString)) {
416+
values.addAll(Arrays.stream(originalString.split(","))
417+
.map(String::trim)
418+
.filter(s -> !s.isEmpty())
419+
.collect(Collectors.toList()));
420+
}
421+
422+
if (add) {
423+
values.add(value);
424+
} else {
425+
values.remove(value);
426+
}
427+
428+
return values.isEmpty() ? null : String.join(",", values);
429+
}
430+
431+
/**
432+
* Returns the first value from a comma-separated string.
433+
* @param inputString the input string (can be null or empty) containing list of comma separated values
434+
* @return the first value, or null if none found
435+
*/
436+
public static String getFirstValueFromCommaSeparatedString(String inputString) {
437+
if (org.apache.commons.lang3.StringUtils.isEmpty(inputString)) {
438+
return inputString;
439+
}
440+
441+
String[] values = inputString.split(",");
442+
if (values.length > 0) {
443+
return values[0].trim();
444+
}
445+
446+
return null;
447+
}
397448
}

0 commit comments

Comments
 (0)