Skip to content

Commit ba56a71

Browse files
committed
fix listPublicIpAddresses crash on shared networks with a virtual router
1 parent 1a48a87 commit ba56a71

3 files changed

Lines changed: 33 additions & 1 deletion

File tree

‎server/src/main/java/com/cloud/api/ApiDBUtils.java‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2351,6 +2351,10 @@ public static NicVO findByIp4AddressAndNetworkId(String ip4Address, long network
23512351
return s_nicDao.findByIp4AddressAndNetworkId(ip4Address, networkId);
23522352
}
23532353

2354+
public static NicVO findNonPlaceHolderByIp4AddressAndNetworkId(String ip4Address, long networkId) {
2355+
return s_nicDao.findNonPlaceHolderByIp4AddressAndNetworkId(ip4Address, networkId);
2356+
}
2357+
23542358
public static NicSecondaryIpVO findSecondaryIpByIp4AddressAndNetworkId(String ip4Address, long networkId) {
23552359
return s_nicSecondaryIpDao.findByIp4AddressAndNetworkId(ip4Address, networkId);
23562360
}

‎server/src/main/java/com/cloud/api/ApiResponseHelper.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1263,7 +1263,7 @@ private void setVpcIdInResponse(Long vpcId, Consumer<String> vpcUuidSetter, Cons
12631263

12641264
private void showVmInfoForSharedNetworks(boolean forVirtualNetworks, IpAddress ipAddr, IPAddressResponse ipResponse) {
12651265
if (!forVirtualNetworks) {
1266-
NicVO nic = ApiDBUtils.findByIp4AddressAndNetworkId(ipAddr.getAddress().toString(), ipAddr.getNetworkId());
1266+
NicVO nic = ApiDBUtils.findNonPlaceHolderByIp4AddressAndNetworkId(ipAddr.getAddress().toString(), ipAddr.getNetworkId());
12671267

12681268
if (nic == null) { // find in nic_secondary_ips, user vm only
12691269
NicSecondaryIpVO secondaryIp =

‎server/src/test/java/com/cloud/api/ApiResponseHelperTest.java‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.apache.cloudstack.api.response.ConsoleSessionResponse;
5050
import org.apache.cloudstack.api.response.DirectDownloadCertificateResponse;
5151
import org.apache.cloudstack.api.response.GuestOSCategoryResponse;
52+
import org.apache.cloudstack.api.response.IPAddressResponse;
5253
import org.apache.cloudstack.api.response.IpQuarantineResponse;
5354
import org.apache.cloudstack.api.response.NicSecondaryIpResponse;
5455
import org.apache.cloudstack.api.response.ResourceIconResponse;
@@ -64,6 +65,7 @@
6465
import com.cloud.configuration.Resource;
6566
import com.cloud.domain.DomainVO;
6667
import com.cloud.host.HostVO;
68+
import com.cloud.network.IpAddress;
6769
import com.cloud.network.Networks;
6870
import com.cloud.network.PhysicalNetworkTrafficType;
6971
import com.cloud.network.PublicIpQuarantine;
@@ -96,7 +98,9 @@
9698
import com.cloud.utils.net.Ip;
9799
import com.cloud.vm.ConsoleSessionVO;
98100
import com.cloud.vm.NicSecondaryIp;
101+
import com.cloud.vm.NicVO;
99102
import com.cloud.vm.VMInstanceVO;
103+
import com.cloud.vm.VirtualMachine;
100104

101105
import static org.junit.Assert.assertEquals;
102106
import static org.junit.Assert.assertFalse;
@@ -800,4 +804,28 @@ public void createConsoleSessionResponseTestShouldReturnFullResponse() {
800804
Assert.assertEquals(expected.getVmName(), response.getVmName());
801805
}
802806
}
807+
808+
@Test
809+
public void showVmInfoForSharedNetworksTestSkipsPlaceHolderNic() {
810+
IpAddress ipAddress = Mockito.mock(IpAddress.class);
811+
Mockito.when(ipAddress.getAddress()).thenReturn(new Ip("10.1.1.10"));
812+
Mockito.when(ipAddress.getNetworkId()).thenReturn(1L);
813+
NicVO nic = Mockito.mock(NicVO.class);
814+
Mockito.when(nic.getVmType()).thenReturn(VirtualMachine.Type.DomainRouter);
815+
Mockito.when(nic.getInstanceId()).thenReturn(2L);
816+
Mockito.when(vmInstanceVOMock.getUuid()).thenReturn("router-uuid");
817+
Mockito.when(vmInstanceVOMock.getHostName()).thenReturn("r-2-VM");
818+
Mockito.when(vmInstanceVOMock.getType()).thenReturn(VirtualMachine.Type.DomainRouter);
819+
IPAddressResponse response = new IPAddressResponse();
820+
821+
try (MockedStatic<ApiDBUtils> apiDBUtilsStaticMock = Mockito.mockStatic(ApiDBUtils.class)) {
822+
apiDBUtilsStaticMock.when(() -> ApiDBUtils.findNonPlaceHolderByIp4AddressAndNetworkId("10.1.1.10", 1L)).thenReturn(nic);
823+
apiDBUtilsStaticMock.when(() -> ApiDBUtils.findVMInstanceById(2L)).thenReturn(vmInstanceVOMock);
824+
825+
ReflectionTestUtils.invokeMethod(apiResponseHelper, "showVmInfoForSharedNetworks", false, ipAddress, response);
826+
827+
apiDBUtilsStaticMock.verify(() -> ApiDBUtils.findByIp4AddressAndNetworkId(Mockito.anyString(), Mockito.anyLong()), Mockito.never());
828+
Assert.assertEquals("router-uuid", ReflectionTestUtils.getField(response, "virtualMachineId"));
829+
}
830+
}
803831
}

0 commit comments

Comments
 (0)