You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by da...@apache.org on 2020/10/30 08:07:50 UTC

[cloudstack] branch master updated: Prevent deploying IPv6 network if Zone has no IPv6 DNS configured (#4177)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 6f559d2  Prevent deploying IPv6 network if Zone has no IPv6 DNS configured (#4177)
6f559d2 is described below

commit 6f559d285aea82b171b902cf512541e0e9ea2ecb
Author: Gabriel Beims Bräscher <ga...@apache.org>
AuthorDate: Fri Oct 30 05:07:20 2020 -0300

    Prevent deploying IPv6 network if Zone has no IPv6 DNS configured (#4177)
---
 .../configuration/ConfigurationManagerImpl.java    |  6 +-
 .../java/com/cloud/network/NetworkModelImpl.java   | 37 +++++++-----
 .../java/com/cloud/network/NetworkServiceImpl.java | 14 +++--
 .../java/com/cloud/network/NetworkModelTest.java   | 69 ++++++++++++++++++++++
 4 files changed, 103 insertions(+), 23 deletions(-)

diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
index 698f280..9b272d6 100755
--- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -3472,10 +3472,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
         }
 
         final boolean ipv4 = startIP != null;
-        final boolean ipv6 = startIPv6 != null;
+        final boolean ipv6 = ip6Cidr != null;
 
         if (!ipv4 && !ipv6) {
-            throw new InvalidParameterValueException("StartIP or StartIPv6 is missing in the parameters!");
+            throw new InvalidParameterValueException("StartIP or IPv6 CIDR is missing in the parameters!");
         }
 
         if (ipv4) {
@@ -3841,7 +3841,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
             ipv4 = true;
         }
 
-        if (startIPv6 != null) {
+        if (vlanIp6Cidr != null) {
             ipv6 = true;
         }
 
diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java
index b6eab90..4322478 100644
--- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java
+++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java
@@ -34,6 +34,7 @@ import java.util.TreeSet;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.utils.StringUtils;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
@@ -115,7 +116,6 @@ import com.cloud.user.AccountVO;
 import com.cloud.user.DomainManager;
 import com.cloud.user.User;
 import com.cloud.user.dao.AccountDao;
-import com.cloud.utils.StringUtils;
 import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
@@ -2207,15 +2207,9 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi
 
     @Override
     public void checkIp6Parameters(String startIPv6, String endIPv6, String ip6Gateway, String ip6Cidr) throws InvalidParameterValueException {
-        if (!NetUtils.isValidIp6(startIPv6)) {
-            throw new InvalidParameterValueException("Invalid format for the startIPv6 parameter");
-        }
-        if (!NetUtils.isValidIp6(endIPv6)) {
-            throw new InvalidParameterValueException("Invalid format for the endIPv6 parameter");
-        }
 
-        if (!(ip6Gateway != null && ip6Cidr != null)) {
-            throw new InvalidParameterValueException("ip6Gateway and ip6Cidr should be defined when startIPv6/endIPv6 are passed in");
+        if (StringUtils.isBlank(ip6Gateway) || StringUtils.isBlank(ip6Cidr)) {
+            throw new InvalidParameterValueException("ip6Gateway and ip6Cidr should be defined for an IPv6 network work properly");
         }
 
         if (!NetUtils.isValidIp6(ip6Gateway)) {
@@ -2224,16 +2218,29 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi
         if (!NetUtils.isValidIp6Cidr(ip6Cidr)) {
             throw new InvalidParameterValueException("Invalid ip6cidr");
         }
-        if (!NetUtils.isIp6InNetwork(startIPv6, ip6Cidr)) {
-            throw new InvalidParameterValueException("startIPv6 is not in ip6cidr indicated network!");
-        }
-        if (!NetUtils.isIp6InNetwork(endIPv6, ip6Cidr)) {
-            throw new InvalidParameterValueException("endIPv6 is not in ip6cidr indicated network!");
-        }
+
         if (!NetUtils.isIp6InNetwork(ip6Gateway, ip6Cidr)) {
             throw new InvalidParameterValueException("ip6Gateway is not in ip6cidr indicated network!");
         }
 
+        if (StringUtils.isNotBlank(startIPv6)) {
+            if (!NetUtils.isValidIp6(startIPv6)) {
+                throw new InvalidParameterValueException("Invalid format for the startIPv6 parameter");
+            }
+            if (!NetUtils.isIp6InNetwork(startIPv6, ip6Cidr)) {
+                throw new InvalidParameterValueException("startIPv6 is not in ip6cidr indicated network!");
+            }
+        }
+
+        if (StringUtils.isNotBlank(endIPv6)) {
+            if (!NetUtils.isValidIp6(endIPv6)) {
+                throw new InvalidParameterValueException("Invalid format for the endIPv6 parameter");
+            }
+            if (!NetUtils.isIp6InNetwork(endIPv6, ip6Cidr)) {
+                throw new InvalidParameterValueException("endIPv6 is not in ip6cidr indicated network!");
+            }
+        }
+
         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 c1ec079..cf0ee63 100644
--- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
@@ -726,10 +726,10 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C
         String ip6addr = null;
         //Isolated network can exist in Basic zone only, so no need to verify the zone type
         if (network.getGuestType() == Network.GuestType.Isolated) {
-            if ((ipv4Address != null || NetUtils.isIpv4(network.getGateway()) && org.apache.commons.lang3.StringUtils.isBlank(ipv6Address))) {
+            if ((ipv4Address != null || NetUtils.isIpv4(network.getGateway()) && isBlank(ipv6Address))) {
                 ipaddr = _ipAddrMgr.allocateGuestIP(network, ipv4Address);
             }
-            if (ipv6Address != null) {
+            if (isNotBlank(ipv6Address)) {
                 ip6addr = ipv6AddrMgr.allocateGuestIpv6(network, ipv6Address);
             }
         } else if (network.getGuestType() == Network.GuestType.Shared) {
@@ -763,7 +763,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C
             return null;
         }
 
-        if (ipaddr != null || ip6addr != null) {
+        if (isNotBlank(ipaddr) || isNotBlank(ip6addr)) {
             // we got the ip addr so up the nics table and secodary ip
             final String ip4AddrFinal = ipaddr;
             final String ip6AddrFinal = ip6addr;
@@ -1195,7 +1195,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C
         if (startIP != null) {
             ipv4 = true;
         }
-        if (startIPv6 != null) {
+        if (isNotBlank(ip6Cidr) && isNotBlank(ip6Gateway)) {
             ipv6 = true;
         }
 
@@ -1273,6 +1273,10 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C
             if (zone.getNetworkType() != NetworkType.Advanced || ntwkOff.getGuestType() != Network.GuestType.Shared) {
                 throw new InvalidParameterValueException("Can only support create IPv6 network with advance shared network!");
             }
+
+            if(isBlank(zone.getIp6Dns1()) && isBlank(zone.getIp6Dns2())) {
+                throw new InvalidParameterValueException("Can only create IPv6 network if the zone has IPv6 DNS! Please configure the zone IPv6 DNS1 and/or IPv6 DNS2.");
+            }
         }
 
         if (isNotBlank(isolatedPvlan) && (zone.getNetworkType() != NetworkType.Advanced || ntwkOff.getGuestType() == GuestType.Isolated)) {
@@ -2759,7 +2763,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C
         for (Network tier : migratedTiers) {
             String tierNetworkOfferingUuid = networkToOffering.get(tier.getUuid());
 
-            if (!StringUtils.isNotBlank(tierNetworkOfferingUuid)) {
+            if (!isNotBlank(tierNetworkOfferingUuid)) {
                 throwInvalidIdException("Failed to resume migrating VPC as the specified tierNetworkOfferings is not complete", String.valueOf(tier.getUuid()), "networkUuid");
             }
 
diff --git a/server/src/test/java/com/cloud/network/NetworkModelTest.java b/server/src/test/java/com/cloud/network/NetworkModelTest.java
index cd24a0b..af14cbd 100644
--- a/server/src/test/java/com/cloud/network/NetworkModelTest.java
+++ b/server/src/test/java/com/cloud/network/NetworkModelTest.java
@@ -35,6 +35,7 @@ import java.util.List;
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.network.dao.PhysicalNetworkDao;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
@@ -90,6 +91,11 @@ public class NetworkModelTest {
     private static final long PHYSICAL_NETWORK_1_ID = 1L;
     private static final long PHYSICAL_NETWORK_2_ID = 2L;
 
+    private static final String IPV6_CIDR = "fd59:16ba:559b:243d::/64";
+    private static final String IPV6_GATEWAY = "fd59:16ba:559b:243d::1";
+    private static final String START_IPV6 = "fd59:16ba:559b:243d:0:0:0:2";
+    private static final String END_IPV6 = "fd59:16ba:559b:243d:ffff:ffff:ffff:ffff";
+
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
@@ -194,4 +200,67 @@ public class NetworkModelTest {
                 addProviderToPhysicalNetwork(anyLong(), eq(Provider.ConfigDrive.getName()), isNull(Long.class), isNull(List.class));
     }
 
+    @Test
+    public void checkIp6ParametersTestAllGood() {
+        networkModel.checkIp6Parameters(START_IPV6, END_IPV6, IPV6_GATEWAY,IPV6_CIDR);
+    }
+
+    @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);
+    }
+
+    @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);
+    }
+
+    @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);
+    }
+
+    @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);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void checkIp6ParametersTestNullGateway() {
+        networkModel.checkIp6Parameters(START_IPV6, END_IPV6, null,IPV6_CIDR);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void checkIp6ParametersTestNullCidr() {
+        networkModel.checkIp6Parameters(START_IPV6, END_IPV6, IPV6_GATEWAY,null);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void checkIp6ParametersTestNullCidrAndNulGateway() {
+        networkModel.checkIp6Parameters(START_IPV6, END_IPV6, null,null);
+    }
+
+    @Test
+    public void checkIp6ParametersTestNullStartIpv6() {
+        networkModel.checkIp6Parameters(null, END_IPV6, IPV6_GATEWAY,IPV6_CIDR);
+    }
+
+    @Test
+    public void checkIp6ParametersTestNullEndIpv6() {
+        networkModel.checkIp6Parameters(START_IPV6, null, IPV6_GATEWAY,IPV6_CIDR);
+    }
+
+    @Test
+    public void checkIp6ParametersTestNullStartAndEndIpv6() {
+        networkModel.checkIp6Parameters(null, null, IPV6_GATEWAY,IPV6_CIDR);
+    }
+
 }