Skip to content

[WIP] Allow CIDR update for the shared network when the network IPs are not in use (i.e. IPs not allocated to any instances) #10839

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: 4.19
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions engine/schema/src/main/java/com/cloud/vm/dao/NicDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ public interface NicDao extends GenericDao<NicVO, Long> {

List<NicVO> listByNetworkId(long networkId);

List<NicVO> listNonDeallocatedByNetworkId(long networkId);

NicVO findByNtwkIdAndInstanceId(long networkId, long instanceId);

NicVO findByInstanceIdAndNetworkIdIncludingRemoved(long networkId, long instanceId);
Expand Down
8 changes: 8 additions & 0 deletions engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,14 @@
return listBy(sc);
}

@Override
public List<NicVO> listNonDeallocatedByNetworkId(long networkId) {
SearchCriteria<NicVO> sc = NonReleasedSearch.create();
sc.setParameters("network", networkId);
sc.setParameters("state", Nic.State.Deallocating);
return listBy(sc);
}

Check warning on line 160 in engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java

View check run for this annotation

Codecov / codecov/patch

engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java#L155-L160

Added lines #L155 - L160 were not covered by tests

@Override
public NicVO findByNtwkIdAndInstanceId(long networkId, long instanceId) {
SearchCriteria<NicVO> sc = AllFieldsSearch.create();
Expand Down
39 changes: 31 additions & 8 deletions server/src/main/java/com/cloud/network/NetworkServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -3090,8 +3090,8 @@
if (dc.getNetworkType() == NetworkType.Basic) {
throw new InvalidParameterValueException("Guest VM CIDR can't be specified for zone with " + NetworkType.Basic + " networking");
}
if (network.getGuestType() != GuestType.Isolated) {
throw new InvalidParameterValueException("Can only allow IP Reservation in networks with guest type " + GuestType.Isolated);
if (network.getGuestType() != GuestType.Isolated && network.getGuestType() != GuestType.Shared) {
throw new InvalidParameterValueException("Can only allow IP Reservation in networks with guest types: " + GuestType.Isolated + " or " + GuestType.Shared);

Check warning on line 3094 in server/src/main/java/com/cloud/network/NetworkServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/NetworkServiceImpl.java#L3094

Added line #L3094 was not covered by tests
}
if (networkOfferingChanged) {
throw new InvalidParameterValueException("Cannot specify this network offering change and guestVmCidr at same time. Specify only one.");
Expand All @@ -3111,34 +3111,57 @@
// But in case networkCidr is a non null value (IP reservation already exists), it implies network cidr is networkCidr
if (networkCidr != null) {
if (!NetUtils.isNetworkAWithinNetworkB(guestVmCidr, networkCidr)) {
throw new InvalidParameterValueException("Invalid value of Guest VM CIDR. For IP Reservation, Guest VM CIDR should be a subset of network CIDR : " + networkCidr);
throw new InvalidParameterValueException("Invalid value of Guest VM CIDR. For IP Reservation, Guest VM CIDR should be a subset of network CIDR: " + networkCidr);

Check warning on line 3114 in server/src/main/java/com/cloud/network/NetworkServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/NetworkServiceImpl.java#L3114

Added line #L3114 was not covered by tests
}
} else {
if (!NetUtils.isNetworkAWithinNetworkB(guestVmCidr, network.getCidr())) {
throw new InvalidParameterValueException("Invalid value of Guest VM CIDR. For IP Reservation, Guest VM CIDR should be a subset of network CIDR : " + network.getCidr());
throw new InvalidParameterValueException("Invalid value of Guest VM CIDR. For IP Reservation, Guest VM CIDR should be a subset of network CIDR: " + network.getCidr());

Check warning on line 3118 in server/src/main/java/com/cloud/network/NetworkServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/NetworkServiceImpl.java#L3118

Added line #L3118 was not covered by tests
}
}

// This check makes sure there are no active IPs existing outside the guestVmCidr in the network
String[] guestVmCidrPair = guestVmCidr.split("\\/");
Long size = Long.valueOf(guestVmCidrPair[1]);
List<NicVO> nicsPresent = _nicDao.listByNetworkId(networkId);

String cidrIpRange[] = NetUtils.getIpRangeFromCidr(guestVmCidrPair[0], size);
s_logger.info("The start IP of the specified guest vm cidr is: " + cidrIpRange[0] + " and end IP is: " + cidrIpRange[1]);
long startIp = NetUtils.ip2Long(cidrIpRange[0]);
long endIp = NetUtils.ip2Long(cidrIpRange[1]);
long range = endIp - startIp + 1;
s_logger.info("The specified guest vm cidr has " + range + " IPs");

for (NicVO nic : nicsPresent) {
List<NicVO> nonDellocatedNicsPresent = _nicDao.listNonDeallocatedByNetworkId(networkId);

Check warning on line 3132 in server/src/main/java/com/cloud/network/NetworkServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/NetworkServiceImpl.java#L3132

Added line #L3132 was not covered by tests
if (network.getGuestType() == GuestType.Shared) {
if (CollectionUtils.isNotEmpty(nonDellocatedNicsPresent)) {
throw new InvalidParameterValueException("IPs are in use, cannot apply reservation");

Check warning on line 3135 in server/src/main/java/com/cloud/network/NetworkServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/NetworkServiceImpl.java#L3135

Added line #L3135 was not covered by tests
}
List<VlanVO> vlans = _vlanDao.listVlansByNetworkId(networkId);

Check warning on line 3137 in server/src/main/java/com/cloud/network/NetworkServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/NetworkServiceImpl.java#L3137

Added line #L3137 was not covered by tests
if (CollectionUtils.isNotEmpty(vlans)) {
for (VlanVO vlan : vlans) {
if (vlan == null) {
continue;

Check warning on line 3141 in server/src/main/java/com/cloud/network/NetworkServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/NetworkServiceImpl.java#L3141

Added line #L3141 was not covered by tests
}
String vlanIpRange = vlan.getIpRange();

Check warning on line 3143 in server/src/main/java/com/cloud/network/NetworkServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/NetworkServiceImpl.java#L3143

Added line #L3143 was not covered by tests
if (vlanIpRange == null) {
continue;

Check warning on line 3145 in server/src/main/java/com/cloud/network/NetworkServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/NetworkServiceImpl.java#L3145

Added line #L3145 was not covered by tests
}
String[] vlanRange = vlanIpRange.split("-");
String vlanStartIP = vlanRange[0];
String vlanEndIP = vlanRange[1];

Check warning on line 3149 in server/src/main/java/com/cloud/network/NetworkServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/NetworkServiceImpl.java#L3147-L3149

Added lines #L3147 - L3149 were not covered by tests
if (!NetUtils.isIpWithInCidrRange(vlanStartIP, guestVmCidr) || !NetUtils.isIpWithInCidrRange(vlanEndIP, guestVmCidr)) {
throw new InvalidParameterValueException(String.format("CIDR doesn't include the IP range %s, cannot apply reservation", vlanIpRange));

Check warning on line 3151 in server/src/main/java/com/cloud/network/NetworkServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/NetworkServiceImpl.java#L3151

Added line #L3151 was not covered by tests
}
}
}

Check warning on line 3154 in server/src/main/java/com/cloud/network/NetworkServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/NetworkServiceImpl.java#L3153-L3154

Added lines #L3153 - L3154 were not covered by tests
}

for (NicVO nic : nonDellocatedNicsPresent) {
if (nic.getIPv4Address() == null) {
continue;
}
long nicIp = NetUtils.ip2Long(nic.getIPv4Address());
//check if nic IP is outside the guest vm cidr
if ((nicIp < startIp || nicIp > endIp) && nic.getState() != Nic.State.Deallocating) {
throw new InvalidParameterValueException("Active IPs like " + nic.getIPv4Address() + " exist outside the Guest VM CIDR. Cannot apply reservation ");
throw new InvalidParameterValueException("Active IPs like " + nic.getIPv4Address() + " exist outside the Guest VM CIDR. Cannot apply reservation");

Check warning on line 3164 in server/src/main/java/com/cloud/network/NetworkServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/network/NetworkServiceImpl.java#L3164

Added line #L3164 was not covered by tests
}
}

Expand Down