From dc74d5ba88829b374f163294d928def9557955fa Mon Sep 17 00:00:00 2001 From: Vishesh Date: Wed, 26 Jun 2024 02:43:26 +0530 Subject: [PATCH] Let network guru decide if ipv6 cidr size can't be equal to 64 (#9289) --- .../main/java/com/cloud/network/NetworkModel.java | 2 ++ .../java/com/cloud/network/guru/NetworkGuru.java | 3 +++ .../engine/orchestration/NetworkOrchestrator.java | 12 ++++++++++-- .../configuration/ConfigurationManagerImpl.java | 7 +++++++ .../java/com/cloud/network/NetworkModelImpl.java | 2 ++ .../java/com/cloud/network/NetworkServiceImpl.java | 3 +++ .../java/com/cloud/network/MockNetworkModelImpl.java | 4 ++++ .../java/com/cloud/network/NetworkModelTest.java | 12 ++++-------- .../java/com/cloud/vpc/MockNetworkModelImpl.java | 5 +++++ 9 files changed, 40 insertions(+), 10 deletions(-) diff --git a/api/src/main/java/com/cloud/network/NetworkModel.java b/api/src/main/java/com/cloud/network/NetworkModel.java index 53ac735cf05..699dcbf6c50 100644 --- a/api/src/main/java/com/cloud/network/NetworkModel.java +++ b/api/src/main/java/com/cloud/network/NetworkModel.java @@ -317,6 +317,8 @@ public interface NetworkModel { void checkIp6Parameters(String startIPv6, String endIPv6, String ip6Gateway, String ip6Cidr) throws InvalidParameterValueException; + void checkIp6CidrSizeEqualTo64(String ip6Cidr) throws InvalidParameterValueException; + void checkRequestedIpAddresses(long networkId, IpAddresses ips) throws InvalidParameterValueException; String getStartIpv6Address(long id); diff --git a/api/src/main/java/com/cloud/network/guru/NetworkGuru.java b/api/src/main/java/com/cloud/network/guru/NetworkGuru.java index 52f654007f2..c4f2beba63e 100644 --- a/api/src/main/java/com/cloud/network/guru/NetworkGuru.java +++ b/api/src/main/java/com/cloud/network/guru/NetworkGuru.java @@ -208,4 +208,7 @@ public interface NetworkGuru extends Adapter { boolean isMyTrafficType(TrafficType type); + default boolean isSlaacV6Only() { + return true; + } } diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 91367186b64..4da4d7031a2 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -769,6 +769,14 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra continue; } + // Ensure cidr size is equal to 64 for + // - networks other than shared networks + // - shared networks with SLAAC V6 only + if (predefined != null && StringUtils.isNotBlank(predefined.getIp6Cidr()) && + (!GuestType.Shared.equals(offering.getGuestType()) || guru.isSlaacV6Only())) { + _networkModel.checkIp6CidrSizeEqualTo64(predefined.getIp6Cidr()); + } + if (network.getId() != -1) { if (network instanceof NetworkVO) { networks.add((NetworkVO) network); @@ -2684,8 +2692,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra } } - if (ipv6 && NetUtils.getIp6CidrSize(ip6Cidr) != 64) { - throw new InvalidParameterValueException("IPv6 subnet should be exactly 64-bits in size"); + if (ipv6 && !GuestType.Shared.equals(ntwkOff.getGuestType())) { + _networkModel.checkIp6CidrSizeEqualTo64(ip6Cidr); } //TODO(VXLAN): Support VNI specified diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java index eb72a626036..114c49aae82 100644 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -4767,6 +4767,9 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati newIp6Gateway = MoreObjects.firstNonNull(newIp6Gateway, network.getIp6Gateway()); newIp6Cidr = MoreObjects.firstNonNull(newIp6Cidr, network.getIp6Cidr()); _networkModel.checkIp6Parameters(newIp6StartIp, newIp6EndIp, newIp6Gateway, newIp6Cidr); + if (!GuestType.Shared.equals(network.getGuestType())) { + _networkModel.checkIp6CidrSizeEqualTo64(newIp6Cidr); + } return true; } return false; @@ -5242,6 +5245,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati endIpv6 = ObjectUtils.allNull(endIpv6, currentEndIPv6) ? null : MoreObjects.firstNonNull(endIpv6, currentEndIPv6); _networkModel.checkIp6Parameters(startIpv6, endIpv6, ip6Gateway, ip6Cidr); + final Network network = _networkModel.getNetwork(vlanRange.getNetworkId()); + if (!GuestType.Shared.equals(network.getGuestType())) { + _networkModel.checkIp6CidrSizeEqualTo64(ip6Cidr); + } if (!ObjectUtils.allNull(startIpv6, endIpv6) && ObjectUtils.anyNull(startIpv6, endIpv6)) { throw new InvalidParameterValueException(String.format("Invalid IPv6 range %s-%s", startIpv6, endIpv6)); diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index f6824c9477e..2a604796d6e 100644 --- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java @@ -2413,7 +2413,9 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi throw new InvalidParameterValueException("endIPv6 is not in ip6cidr indicated network!"); } } + } + public void checkIp6CidrSizeEqualTo64(String ip6Cidr) { int cidrSize = NetUtils.getIp6CidrSize(ip6Cidr); // we only support cidr == 64 if (cidrSize != 64) { diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index 91e19c00e90..c58463ac708 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -1516,6 +1516,9 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C endIPv6 = startIPv6; } _networkModel.checkIp6Parameters(startIPv6, endIPv6, ip6Gateway, ip6Cidr); + if (!GuestType.Shared.equals(ntwkOff.getGuestType())) { + _networkModel.checkIp6CidrSizeEqualTo64(ip6Cidr); + } if (zone.getNetworkType() != NetworkType.Advanced || ntwkOff.getGuestType() != Network.GuestType.Shared) { throw new InvalidParameterValueException("Can only support create IPv6 network with advance shared network!"); diff --git a/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java b/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java index 3df12a4ed84..395be635aea 100644 --- a/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java +++ b/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java @@ -839,7 +839,11 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel { @Override public void checkIp6Parameters(String startIPv6, String endIPv6, String ip6Gateway, String ip6Cidr) throws InvalidParameterValueException { // TODO Auto-generated method stub + } + @Override + public void checkIp6CidrSizeEqualTo64(String ip6Cidr) throws InvalidParameterValueException { + // TODO Auto-generated method stub } @Override diff --git a/server/src/test/java/com/cloud/network/NetworkModelTest.java b/server/src/test/java/com/cloud/network/NetworkModelTest.java index 13f38dea638..eaa44dd344b 100644 --- a/server/src/test/java/com/cloud/network/NetworkModelTest.java +++ b/server/src/test/java/com/cloud/network/NetworkModelTest.java @@ -238,29 +238,25 @@ public class NetworkModelTest { @Test(expected = InvalidParameterValueException.class) public void checkIp6ParametersTestCidr32() { String ipv6cidr = "fd59:16ba:559b:243d::/32"; - String endipv6 = "fd59:16ba:ffff:ffff:ffff:ffff:ffff:ffff"; - networkModel.checkIp6Parameters(START_IPV6, endipv6, IPV6_GATEWAY,ipv6cidr); + networkModel.checkIp6CidrSizeEqualTo64(ipv6cidr); } @Test(expected = InvalidParameterValueException.class) public void checkIp6ParametersTestCidr63() { String ipv6cidr = "fd59:16ba:559b:243d::/63"; - String endipv6 = "fd59:16ba:559b:243d:ffff:ffff:ffff:ffff"; - networkModel.checkIp6Parameters(START_IPV6, endipv6, IPV6_GATEWAY,ipv6cidr); + networkModel.checkIp6CidrSizeEqualTo64(ipv6cidr); } @Test(expected = InvalidParameterValueException.class) public void checkIp6ParametersTestCidr65() { String ipv6cidr = "fd59:16ba:559b:243d::/65"; - String endipv6 = "fd59:16ba:559b:243d:7fff:ffff:ffff:ffff"; - networkModel.checkIp6Parameters(START_IPV6, endipv6, IPV6_GATEWAY,ipv6cidr); + networkModel.checkIp6CidrSizeEqualTo64(ipv6cidr); } @Test(expected = InvalidParameterValueException.class) public void checkIp6ParametersTestCidr120() { String ipv6cidr = "fd59:16ba:559b:243d::/120"; - String endipv6 = "fd59:16ba:559b:243d:0:0:0:ff"; - networkModel.checkIp6Parameters(START_IPV6, endipv6, IPV6_GATEWAY,ipv6cidr); + networkModel.checkIp6CidrSizeEqualTo64(ipv6cidr); } @Test(expected = InvalidParameterValueException.class) diff --git a/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java b/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java index ebee9fec02d..ad332c00fa4 100644 --- a/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java +++ b/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java @@ -857,6 +857,11 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel { // TODO Auto-generated method stub } + @Override + public void checkIp6CidrSizeEqualTo64(String ip6Cidr) throws InvalidParameterValueException { + // TODO Auto-generated method stub + } + @Override public void checkRequestedIpAddresses(long networkId, IpAddresses ips) throws InvalidParameterValueException { // TODO Auto-generated method stub