This is an automated email from the ASF dual-hosted git repository.
DaanHoogland pushed a commit to branch 4.20
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.20 by this push:
new 4b2d387287a server: null-check requested IP in
assignSourceNatPublicIpAddress (#14025)
4b2d387287a is described below
commit 4b2d387287a3d49adeef183716fb4ab0d0c1fdf3
Author: Ramgopal Nagaboina <[email protected]>
AuthorDate: Thu Oct 1 10:41:33 2026 -0400
server: null-check requested IP in assignSourceNatPublicIpAddress (#14025)
---
.../com/cloud/network/IpAddressManagerImpl.java | 2 +-
.../network/IpAddressManagerImplSourceNatTest.java | 58 ++++++++++++++++++++++
2 files changed, 59 insertions(+), 1 deletion(-)
diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
index 25bc29a3568..d4743a6aec9 100644
--- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
@@ -828,7 +828,7 @@ public class IpAddressManagerImpl extends ManagerBase
implements IpAddressManage
if(networkPublicIp != null)
return null;
IPAddressVO ipAddressVO = _ipAddressDao.findByIpAndDcId(dcId,
requestedIp);
- if (ipAddressVO.getState() != State.Free) {
+ if (ipAddressVO == null || ipAddressVO.getState() != State.Free) {
throw new InsufficientAddressCapacityException("can not assign to
this network", Network.class, networkId);
}
return fetchNewPublicIp(dcId, podId, null, owner, type, networkId,
true, true, requestedIp, null, isSystem, null, null, forSystemVms);
diff --git
a/server/src/test/java/com/cloud/network/IpAddressManagerImplSourceNatTest.java
b/server/src/test/java/com/cloud/network/IpAddressManagerImplSourceNatTest.java
new file mode 100644
index 00000000000..d5c9eead860
--- /dev/null
+++
b/server/src/test/java/com/cloud/network/IpAddressManagerImplSourceNatTest.java
@@ -0,0 +1,58 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.network;
+
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import com.cloud.dc.Vlan.VlanType;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.user.Account;
+
+@RunWith(MockitoJUnitRunner.class)
+public class IpAddressManagerImplSourceNatTest {
+
+ @Mock
+ private IPAddressDao _ipAddressDao;
+
+ @InjectMocks
+ private IpAddressManagerImpl ipAddressManagerImpl = new
IpAddressManagerImpl();
+
+ @Test(expected = InsufficientAddressCapacityException.class)
+ public void assignSourceNatPublicIpAddressThrowsWhenRequestedIpNotFound()
throws Exception {
+ // findByIpAndDcId returns null when the requested IP is not a known
+ // public IP in the zone. The method must throw a capacity exception
+ // rather than dereference the null IPAddressVO with getState().
+ long dcId = 1L;
+ long networkId = 2L;
+ String requestedIp = "10.1.1.1";
+ Account owner = Mockito.mock(Account.class);
+
+ when(_ipAddressDao.findByIpAndNetworkIdAndDcId(networkId, dcId,
requestedIp)).thenReturn(null);
+ when(_ipAddressDao.findByIpAndDcId(dcId,
requestedIp)).thenReturn(null);
+
+ ipAddressManagerImpl.assignSourceNatPublicIpAddress(dcId, null, owner,
VlanType.VirtualNetwork,
+ networkId, requestedIp, false, false);
+ }
+}