Skip to content

Commit e75e376

Browse files
GabrielBrascherPearl Dsilva
authored andcommitted
Prevent deploying IPv6 network if Zone has no IPv6 DNS configured (apache#4177)
1 parent d646dcf commit e75e376

4 files changed

Lines changed: 103 additions & 23 deletions

File tree

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3472,10 +3472,10 @@ public Vlan createVlanAndPublicIpRange(final CreateVlanIpRangeCmd cmd) throws In
34723472
}
34733473

34743474
final boolean ipv4 = startIP != null;
3475-
final boolean ipv6 = startIPv6 != null;
3475+
final boolean ipv6 = ip6Cidr != null;
34763476

34773477
if (!ipv4 && !ipv6) {
3478-
throw new InvalidParameterValueException("StartIP or StartIPv6 is missing in the parameters!");
3478+
throw new InvalidParameterValueException("StartIP or IPv6 CIDR is missing in the parameters!");
34793479
}
34803480

34813481
if (ipv4) {
@@ -3841,7 +3841,7 @@ public Vlan createVlanAndPublicIpRange(final long zoneId, final long networkId,
38413841
ipv4 = true;
38423842
}
38433843

3844-
if (startIPv6 != null) {
3844+
if (vlanIp6Cidr != null) {
38453845
ipv6 = true;
38463846
}
38473847

server/src/main/java/com/cloud/network/NetworkModelImpl.java

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import javax.inject.Inject;
3535
import javax.naming.ConfigurationException;
3636

37+
import com.cloud.utils.StringUtils;
3738
import org.apache.cloudstack.context.CallContext;
3839
import org.apache.commons.collections.CollectionUtils;
3940
import org.apache.log4j.Logger;
@@ -115,7 +116,6 @@
115116
import com.cloud.user.DomainManager;
116117
import com.cloud.user.User;
117118
import com.cloud.user.dao.AccountDao;
118-
import com.cloud.utils.StringUtils;
119119
import com.cloud.utils.component.AdapterBase;
120120
import com.cloud.utils.component.ManagerBase;
121121
import com.cloud.utils.db.DB;
@@ -2207,15 +2207,9 @@ public boolean isNetworkInlineMode(Network network) {
22072207

22082208
@Override
22092209
public void checkIp6Parameters(String startIPv6, String endIPv6, String ip6Gateway, String ip6Cidr) throws InvalidParameterValueException {
2210-
if (!NetUtils.isValidIp6(startIPv6)) {
2211-
throw new InvalidParameterValueException("Invalid format for the startIPv6 parameter");
2212-
}
2213-
if (!NetUtils.isValidIp6(endIPv6)) {
2214-
throw new InvalidParameterValueException("Invalid format for the endIPv6 parameter");
2215-
}
22162210

2217-
if (!(ip6Gateway != null && ip6Cidr != null)) {
2218-
throw new InvalidParameterValueException("ip6Gateway and ip6Cidr should be defined when startIPv6/endIPv6 are passed in");
2211+
if (StringUtils.isBlank(ip6Gateway) || StringUtils.isBlank(ip6Cidr)) {
2212+
throw new InvalidParameterValueException("ip6Gateway and ip6Cidr should be defined for an IPv6 network work properly");
22192213
}
22202214

22212215
if (!NetUtils.isValidIp6(ip6Gateway)) {
@@ -2224,16 +2218,29 @@ public void checkIp6Parameters(String startIPv6, String endIPv6, String ip6Gatew
22242218
if (!NetUtils.isValidIp6Cidr(ip6Cidr)) {
22252219
throw new InvalidParameterValueException("Invalid ip6cidr");
22262220
}
2227-
if (!NetUtils.isIp6InNetwork(startIPv6, ip6Cidr)) {
2228-
throw new InvalidParameterValueException("startIPv6 is not in ip6cidr indicated network!");
2229-
}
2230-
if (!NetUtils.isIp6InNetwork(endIPv6, ip6Cidr)) {
2231-
throw new InvalidParameterValueException("endIPv6 is not in ip6cidr indicated network!");
2232-
}
2221+
22332222
if (!NetUtils.isIp6InNetwork(ip6Gateway, ip6Cidr)) {
22342223
throw new InvalidParameterValueException("ip6Gateway is not in ip6cidr indicated network!");
22352224
}
22362225

2226+
if (StringUtils.isNotBlank(startIPv6)) {
2227+
if (!NetUtils.isValidIp6(startIPv6)) {
2228+
throw new InvalidParameterValueException("Invalid format for the startIPv6 parameter");
2229+
}
2230+
if (!NetUtils.isIp6InNetwork(startIPv6, ip6Cidr)) {
2231+
throw new InvalidParameterValueException("startIPv6 is not in ip6cidr indicated network!");
2232+
}
2233+
}
2234+
2235+
if (StringUtils.isNotBlank(endIPv6)) {
2236+
if (!NetUtils.isValidIp6(endIPv6)) {
2237+
throw new InvalidParameterValueException("Invalid format for the endIPv6 parameter");
2238+
}
2239+
if (!NetUtils.isIp6InNetwork(endIPv6, ip6Cidr)) {
2240+
throw new InvalidParameterValueException("endIPv6 is not in ip6cidr indicated network!");
2241+
}
2242+
}
2243+
22372244
int cidrSize = NetUtils.getIp6CidrSize(ip6Cidr);
22382245
// we only support cidr == 64
22392246
if (cidrSize != 64) {

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -726,10 +726,10 @@ public NicSecondaryIp allocateSecondaryGuestIP(final long nicId, IpAddresses req
726726
String ip6addr = null;
727727
//Isolated network can exist in Basic zone only, so no need to verify the zone type
728728
if (network.getGuestType() == Network.GuestType.Isolated) {
729-
if ((ipv4Address != null || NetUtils.isIpv4(network.getGateway()) && org.apache.commons.lang3.StringUtils.isBlank(ipv6Address))) {
729+
if ((ipv4Address != null || NetUtils.isIpv4(network.getGateway()) && isBlank(ipv6Address))) {
730730
ipaddr = _ipAddrMgr.allocateGuestIP(network, ipv4Address);
731731
}
732-
if (ipv6Address != null) {
732+
if (isNotBlank(ipv6Address)) {
733733
ip6addr = ipv6AddrMgr.allocateGuestIpv6(network, ipv6Address);
734734
}
735735
} else if (network.getGuestType() == Network.GuestType.Shared) {
@@ -763,7 +763,7 @@ public NicSecondaryIp allocateSecondaryGuestIP(final long nicId, IpAddresses req
763763
return null;
764764
}
765765

766-
if (ipaddr != null || ip6addr != null) {
766+
if (isNotBlank(ipaddr) || isNotBlank(ip6addr)) {
767767
// we got the ip addr so up the nics table and secodary ip
768768
final String ip4AddrFinal = ipaddr;
769769
final String ip6AddrFinal = ip6addr;
@@ -1195,7 +1195,7 @@ public Network createGuestNetwork(CreateNetworkCmd cmd) throws InsufficientCapac
11951195
if (startIP != null) {
11961196
ipv4 = true;
11971197
}
1198-
if (startIPv6 != null) {
1198+
if (isNotBlank(ip6Cidr) && isNotBlank(ip6Gateway)) {
11991199
ipv6 = true;
12001200
}
12011201

@@ -1273,6 +1273,10 @@ public Network createGuestNetwork(CreateNetworkCmd cmd) throws InsufficientCapac
12731273
if (zone.getNetworkType() != NetworkType.Advanced || ntwkOff.getGuestType() != Network.GuestType.Shared) {
12741274
throw new InvalidParameterValueException("Can only support create IPv6 network with advance shared network!");
12751275
}
1276+
1277+
if(isBlank(zone.getIp6Dns1()) && isBlank(zone.getIp6Dns2())) {
1278+
throw new InvalidParameterValueException("Can only create IPv6 network if the zone has IPv6 DNS! Please configure the zone IPv6 DNS1 and/or IPv6 DNS2.");
1279+
}
12761280
}
12771281

12781282
if (isNotBlank(isolatedPvlan) && (zone.getNetworkType() != NetworkType.Advanced || ntwkOff.getGuestType() == GuestType.Isolated)) {
@@ -2759,7 +2763,7 @@ private void verifyAlreadyMigratedTiers(long migratedVpcId, long vpcOfferingId,
27592763
for (Network tier : migratedTiers) {
27602764
String tierNetworkOfferingUuid = networkToOffering.get(tier.getUuid());
27612765

2762-
if (!StringUtils.isNotBlank(tierNetworkOfferingUuid)) {
2766+
if (!isNotBlank(tierNetworkOfferingUuid)) {
27632767
throwInvalidIdException("Failed to resume migrating VPC as the specified tierNetworkOfferings is not complete", String.valueOf(tier.getUuid()), "networkUuid");
27642768
}
27652769

server/src/test/java/com/cloud/network/NetworkModelTest.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.cloud.dc.DataCenter;
3636
import com.cloud.dc.DataCenterVO;
3737
import com.cloud.dc.dao.DataCenterDao;
38+
import com.cloud.exception.InvalidParameterValueException;
3839
import com.cloud.network.dao.PhysicalNetworkDao;
3940
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
4041
import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
@@ -90,6 +91,11 @@ public class NetworkModelTest {
9091
private static final long PHYSICAL_NETWORK_1_ID = 1L;
9192
private static final long PHYSICAL_NETWORK_2_ID = 2L;
9293

94+
private static final String IPV6_CIDR = "fd59:16ba:559b:243d::/64";
95+
private static final String IPV6_GATEWAY = "fd59:16ba:559b:243d::1";
96+
private static final String START_IPV6 = "fd59:16ba:559b:243d:0:0:0:2";
97+
private static final String END_IPV6 = "fd59:16ba:559b:243d:ffff:ffff:ffff:ffff";
98+
9399
@Before
94100
public void setUp() {
95101
MockitoAnnotations.initMocks(this);
@@ -194,4 +200,67 @@ public void testAddDisabledConfigDriveEntriesOnZoneAdvancedZoneNonExistingConfig
194200
addProviderToPhysicalNetwork(anyLong(), eq(Provider.ConfigDrive.getName()), isNull(Long.class), isNull(List.class));
195201
}
196202

203+
@Test
204+
public void checkIp6ParametersTestAllGood() {
205+
networkModel.checkIp6Parameters(START_IPV6, END_IPV6, IPV6_GATEWAY,IPV6_CIDR);
206+
}
207+
208+
@Test(expected = InvalidParameterValueException.class)
209+
public void checkIp6ParametersTestCidr32() {
210+
String ipv6cidr = "fd59:16ba:559b:243d::/32";
211+
String endipv6 = "fd59:16ba:ffff:ffff:ffff:ffff:ffff:ffff";
212+
networkModel.checkIp6Parameters(START_IPV6, endipv6, IPV6_GATEWAY,ipv6cidr);
213+
}
214+
215+
@Test(expected = InvalidParameterValueException.class)
216+
public void checkIp6ParametersTestCidr63() {
217+
String ipv6cidr = "fd59:16ba:559b:243d::/63";
218+
String endipv6 = "fd59:16ba:559b:243d:ffff:ffff:ffff:ffff";
219+
networkModel.checkIp6Parameters(START_IPV6, endipv6, IPV6_GATEWAY,ipv6cidr);
220+
}
221+
222+
@Test(expected = InvalidParameterValueException.class)
223+
public void checkIp6ParametersTestCidr65() {
224+
String ipv6cidr = "fd59:16ba:559b:243d::/65";
225+
String endipv6 = "fd59:16ba:559b:243d:7fff:ffff:ffff:ffff";
226+
networkModel.checkIp6Parameters(START_IPV6, endipv6, IPV6_GATEWAY,ipv6cidr);
227+
}
228+
229+
@Test(expected = InvalidParameterValueException.class)
230+
public void checkIp6ParametersTestCidr120() {
231+
String ipv6cidr = "fd59:16ba:559b:243d::/120";
232+
String endipv6 = "fd59:16ba:559b:243d:0:0:0:ff";
233+
networkModel.checkIp6Parameters(START_IPV6, endipv6, IPV6_GATEWAY,ipv6cidr);
234+
}
235+
236+
@Test(expected = InvalidParameterValueException.class)
237+
public void checkIp6ParametersTestNullGateway() {
238+
networkModel.checkIp6Parameters(START_IPV6, END_IPV6, null,IPV6_CIDR);
239+
}
240+
241+
@Test(expected = InvalidParameterValueException.class)
242+
public void checkIp6ParametersTestNullCidr() {
243+
networkModel.checkIp6Parameters(START_IPV6, END_IPV6, IPV6_GATEWAY,null);
244+
}
245+
246+
@Test(expected = InvalidParameterValueException.class)
247+
public void checkIp6ParametersTestNullCidrAndNulGateway() {
248+
networkModel.checkIp6Parameters(START_IPV6, END_IPV6, null,null);
249+
}
250+
251+
@Test
252+
public void checkIp6ParametersTestNullStartIpv6() {
253+
networkModel.checkIp6Parameters(null, END_IPV6, IPV6_GATEWAY,IPV6_CIDR);
254+
}
255+
256+
@Test
257+
public void checkIp6ParametersTestNullEndIpv6() {
258+
networkModel.checkIp6Parameters(START_IPV6, null, IPV6_GATEWAY,IPV6_CIDR);
259+
}
260+
261+
@Test
262+
public void checkIp6ParametersTestNullStartAndEndIpv6() {
263+
networkModel.checkIp6Parameters(null, null, IPV6_GATEWAY,IPV6_CIDR);
264+
}
265+
197266
}

0 commit comments

Comments
 (0)