Skip to content

Commit bac2cd6

Browse files
server: null-check public IP before the DNS/Source NAT guard in createPublicLoadBalancerRule
createPublicLoadBalancerRule resolved ipVO only when an ipAddrId was supplied, then at the port-53 check did (srcPortStart == DNS_PORT && ipVO.isSourceNat()). For an elastic-LB rule created without an explicit IP (ipAddrId == null) the system IP is allocated later, so ipVO was still null and creating a rule on port 53 threw a NullPointerException. The ipVO == null validation only runs further down. Guard the check with ipVO != null so the DNS/Source NAT conflict test is skipped when there is no IP yet; the flow then reaches the existing can't-find-source-IP parameter error. Adds a regression test creating a port-53 rule with a null ipAddrId (NullPointerException before the fix).
1 parent 3a79799 commit bac2cd6

2 files changed

Lines changed: 37 additions & 1 deletion

File tree

server/src/main/java/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1706,7 +1706,7 @@ public LoadBalancer createPublicLoadBalancerRule(String xId, String name, String
17061706
IpAddress systemIp = null;
17071707
NetworkOffering off = _entityMgr.findById(NetworkOffering.class, network.getNetworkOfferingId());
17081708

1709-
if (srcPortStart == DNS_PORT && ipVO.isSourceNat()) {
1709+
if (srcPortStart == DNS_PORT && ipVO != null && ipVO.isSourceNat()) {
17101710
List<NetworkOfferingServiceMapVO> offeringServices = _networkOfferingServiceDao.listByNetworkOfferingId(network.getNetworkOfferingId());
17111711
for (NetworkOfferingServiceMapVO serviceMapVo: offeringServices) {
17121712
if (serviceMapVo.getService().equals(Service.Dns.getName())) {

server/src/test/java/com/cloud/network/lb/LoadBalancingRulesManagerImplTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,16 @@
1717

1818
package com.cloud.network.lb;
1919

20+
import com.cloud.exception.InvalidParameterValueException;
2021
import com.cloud.network.Network;
22+
import com.cloud.network.NetworkModel;
2123
import com.cloud.network.dao.LoadBalancerVO;
2224
import com.cloud.network.dao.NetworkDao;
2325
import com.cloud.network.dao.NetworkVO;
26+
import com.cloud.offering.NetworkOffering;
27+
import com.cloud.user.Account;
28+
import com.cloud.user.AccountManager;
29+
import com.cloud.utils.db.EntityManager;
2430
import com.cloud.utils.exception.CloudRuntimeException;
2531
import org.apache.cloudstack.api.ServerApiException;
2632
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -48,6 +54,21 @@ public class LoadBalancingRulesManagerImplTest{
4854
@Mock
4955
NetworkOrchestrationService _networkMgr;
5056

57+
@Mock
58+
EntityManager _entityMgr;
59+
60+
@Mock
61+
AccountManager _accountMgr;
62+
63+
@Mock
64+
NetworkModel _networkModel;
65+
66+
@Mock
67+
NetworkVO networkMock;
68+
69+
private long accountId = 10L;
70+
private long networkId = 4L;
71+
5172
@Spy
5273
@InjectMocks
5374
LoadBalancingRulesManagerImpl lbr = new LoadBalancingRulesManagerImpl();
@@ -101,4 +122,19 @@ public void testGetLoadBalancerServiceProviderFail() {
101122

102123
Network.Provider provider = lbr.getLoadBalancerServiceProvider(loadBalancerMock);
103124
}
125+
126+
@Test(expected = InvalidParameterValueException.class)
127+
public void createPublicLoadBalancerRuleWithDnsPortAndNoIpDoesNotNpe() throws Exception {
128+
long lbOwnerId = accountId;
129+
long networkOfferingId = 7L;
130+
when(_accountMgr.getAccount(lbOwnerId)).thenReturn(Mockito.mock(Account.class));
131+
when(_networkModel.getNetwork(networkId)).thenReturn(networkMock);
132+
when(networkMock.getNetworkOfferingId()).thenReturn(networkOfferingId);
133+
NetworkOffering off = Mockito.mock(NetworkOffering.class);
134+
when(_entityMgr.findById(NetworkOffering.class, networkOfferingId)).thenReturn(off);
135+
when(off.isElasticLb()).thenReturn(false);
136+
137+
lbr.createPublicLoadBalancerRule("xid", "name", "desc", 53, 53, 53, 53,
138+
null, "tcp", "roundrobin", networkId, lbOwnerId, false, "tcp", null, null);
139+
}
104140
}

0 commit comments

Comments
 (0)