This is an automated email from the ASF dual-hosted git repository.

sureshanaparti pushed a commit to branch 4.19
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.19 by this push:
     new dc74d5ba888 Let network guru decide if ipv6 cidr size can't be equal 
to 64 (#9289)
dc74d5ba888 is described below

commit dc74d5ba88829b374f163294d928def9557955fa
Author: Vishesh <[email protected]>
AuthorDate: Wed Jun 26 02:43:26 2024 +0530

    Let network guru decide if ipv6 cidr size can't be equal to 64 (#9289)
---
 api/src/main/java/com/cloud/network/NetworkModel.java        |  2 ++
 api/src/main/java/com/cloud/network/guru/NetworkGuru.java    |  3 +++
 .../cloudstack/engine/orchestration/NetworkOrchestrator.java | 12 ++++++++++--
 .../com/cloud/configuration/ConfigurationManagerImpl.java    |  7 +++++++
 server/src/main/java/com/cloud/network/NetworkModelImpl.java |  2 ++
 .../src/main/java/com/cloud/network/NetworkServiceImpl.java  |  3 +++
 .../test/java/com/cloud/network/MockNetworkModelImpl.java    |  4 ++++
 server/src/test/java/com/cloud/network/NetworkModelTest.java | 12 ++++--------
 server/src/test/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

Reply via email to