Skip to content

Commit b777e5a

Browse files
weizhouapachedhslove
authored andcommitted
Routed: fix create network exception when auto-allocation is disabled (apache#11624)
* Routed: fix create network exception when auto-allocation is disabled for regular users * routed: throw InvalidParameterValueException instead of CloudRuntimeException which gives vague message to regular users
1 parent 659f0a0 commit b777e5a

File tree

2 files changed

+30
-16
lines changed

2 files changed

+30
-16
lines changed

server/src/main/java/org/apache/cloudstack/network/RoutedIpv4ManagerImpl.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -607,22 +607,32 @@ public Ipv4GuestSubnetNetworkMap getOrCreateIpv4SubnetForVpc(Vpc vpc, Integer vp
607607
}
608608

609609
protected Ipv4GuestSubnetNetworkMap getOrCreateIpv4SubnetForGuestNetworkOrVpcInternal(Integer cidrSize, Long ownerDomainId, Long ownerAccountId, Long zoneId) {
610-
validateNetworkCidrSize(ownerAccountId, cidrSize);
610+
validateNetworkCidrSize(cidrSize);
611611
List<DataCenterIpv4GuestSubnetVO> subnets = getZoneSubnetsForAccount(ownerDomainId, ownerAccountId, zoneId);
612612
for (DataCenterIpv4GuestSubnetVO subnet : subnets) {
613-
Ipv4GuestSubnetNetworkMap result = getOrCreateIpv4SubnetForGuestNetworkOrVpcInternal(cidrSize, subnet);
613+
Ipv4GuestSubnetNetworkMap result = getIpv4SubnetForGuestNetworkOrVpcInternal(cidrSize, subnet);
614+
if (result != null) {
615+
return result;
616+
}
617+
}
618+
Boolean isAutoAllocationEnabled = RoutedIPv4NetworkCidrAutoAllocationEnabled.valueIn(ownerAccountId);
619+
if (!Boolean.TRUE.equals(isAutoAllocationEnabled)) {
620+
throw new InvalidParameterValueException("CIDR auto-allocation is disabled for this account");
621+
}
622+
for (DataCenterIpv4GuestSubnetVO subnet : subnets) {
623+
Ipv4GuestSubnetNetworkMap result = createIpv4SubnetForGuestNetworkOrVpcInternal(cidrSize, subnet);
614624
if (result != null) {
615625
return result;
616626
}
617627
}
618628
return null;
619629
}
620630

621-
protected Ipv4GuestSubnetNetworkMap getOrCreateIpv4SubnetForGuestNetworkOrVpcInternal(Integer cidrSize, DataCenterIpv4GuestSubnetVO subnet) {
622-
Ipv4GuestSubnetNetworkMap map = ipv4GuestSubnetNetworkMapDao.findFirstAvailable(subnet.getId(), cidrSize);
623-
if (map != null) {
624-
return map;
625-
}
631+
protected Ipv4GuestSubnetNetworkMap getIpv4SubnetForGuestNetworkOrVpcInternal(Integer cidrSize, DataCenterIpv4GuestSubnetVO subnet) {
632+
return ipv4GuestSubnetNetworkMapDao.findFirstAvailable(subnet.getId(), cidrSize);
633+
}
634+
635+
protected Ipv4GuestSubnetNetworkMap createIpv4SubnetForGuestNetworkOrVpcInternal(Integer cidrSize, DataCenterIpv4GuestSubnetVO subnet) {
626636
try {
627637
return createIpv4SubnetFromParentSubnet(subnet, cidrSize);
628638
} catch (Exception ex) {
@@ -631,6 +641,14 @@ protected Ipv4GuestSubnetNetworkMap getOrCreateIpv4SubnetForGuestNetworkOrVpcInt
631641
return null;
632642
}
633643

644+
protected Ipv4GuestSubnetNetworkMap getOrCreateIpv4SubnetForGuestNetworkOrVpcInternal(Integer cidrSize, DataCenterIpv4GuestSubnetVO subnet) {
645+
Ipv4GuestSubnetNetworkMap map = getIpv4SubnetForGuestNetworkOrVpcInternal(cidrSize, subnet);
646+
if (map != null) {
647+
return map;
648+
}
649+
return createIpv4SubnetForGuestNetworkOrVpcInternal(cidrSize, subnet);
650+
}
651+
634652
protected void getOrCreateIpv4SubnetForGuestNetworkOrVpcInternal(String networkCidr, Long ownerDomainId, Long ownerAccountId, Long zoneId) {
635653
Ipv4GuestSubnetNetworkMapVO subnetMap = ipv4GuestSubnetNetworkMapDao.findBySubnet(networkCidr);
636654
if (subnetMap != null) {
@@ -693,13 +711,9 @@ private void checkConflicts(List<Ipv4GuestSubnetNetworkMapVO> subnetsForNetwork,
693711
}
694712
}
695713

696-
private void validateNetworkCidrSize(long accountId, Integer networkCidrSize) {
714+
private void validateNetworkCidrSize(Integer networkCidrSize) {
697715
if (networkCidrSize == null) {
698-
throw new CloudRuntimeException("network/vpc CidrSize is null");
699-
}
700-
Boolean isAutoAllocationEnabled = RoutedIPv4NetworkCidrAutoAllocationEnabled.valueIn(accountId);
701-
if (!Boolean.TRUE.equals(isAutoAllocationEnabled)) {
702-
throw new CloudRuntimeException("CIDR auto-allocation is disabled for this account");
716+
throw new InvalidParameterValueException("network/vpc CidrSize is null");
703717
}
704718
}
705719

@@ -755,7 +769,7 @@ protected String createIpv4SubnetStringFromParentSubnet(DataCenterIpv4GuestSubne
755769
// Allocate a subnet automatically
756770
String networkCidr = getFreeNetworkCidr(subnetsInFreeIpRanges, networkCidrSize);
757771
if (networkCidr == null) {
758-
throw new CloudRuntimeException("Failed to automatically allocate a subnet with specified cidrsize");
772+
throw new InvalidParameterValueException("Failed to automatically allocate a subnet with specified cidrsize");
759773
}
760774
return networkCidr;
761775
}

server/src/test/java/org/apache/cloudstack/network/RoutedIpv4ManagerImplTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -545,12 +545,12 @@ public void testGetOrCreateIpv4SubnetForGuestNetworkOrVpcInternalByCidrSize2() {
545545
DataCenterIpv4GuestSubnetVO subnet3 = Mockito.mock(DataCenterIpv4GuestSubnetVO.class);
546546
when(dataCenterIpv4GuestSubnetDao.listNonDedicatedByDataCenterId(zoneId)).thenReturn(Arrays.asList(subnet3));
547547

548-
doReturn(null).doReturn(null).doReturn(ipv4GuestSubnetNetworkMap).when(routedIpv4Manager).getOrCreateIpv4SubnetForGuestNetworkOrVpcInternal(eq(cidrSize), any());
548+
doReturn(null).doReturn(null).doReturn(ipv4GuestSubnetNetworkMap).when(routedIpv4Manager).getIpv4SubnetForGuestNetworkOrVpcInternal(eq(cidrSize), any());
549549

550550
Ipv4GuestSubnetNetworkMap result = routedIpv4Manager.getOrCreateIpv4SubnetForGuestNetworkOrVpcInternal(cidrSize, domainId, accountId, zoneId);
551551

552552
Assert.assertEquals(ipv4GuestSubnetNetworkMap, result);
553-
verify(routedIpv4Manager, times(3)).getOrCreateIpv4SubnetForGuestNetworkOrVpcInternal(eq(cidrSize), any());
553+
verify(routedIpv4Manager, times(3)).getIpv4SubnetForGuestNetworkOrVpcInternal(eq(cidrSize), any());
554554
}
555555

556556
@Test

0 commit comments

Comments
 (0)