Skip to content

Commit ae67d19

Browse files
committed
Routed: add unit tests
1 parent c1bd1e1 commit ae67d19

File tree

6 files changed

+460
-18
lines changed

6 files changed

+460
-18
lines changed

server/src/test/java/com/cloud/bgp/BGPServiceImplTest.java

Lines changed: 133 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,64 @@
1818

1919
package com.cloud.bgp;
2020

21+
import com.cloud.exception.ResourceUnavailableException;
22+
import com.cloud.network.Network;
23+
import com.cloud.network.NetworkModel;
24+
import com.cloud.network.dao.NetworkServiceMapDao;
25+
import com.cloud.network.element.VirtualRouterElement;
26+
import com.cloud.network.element.VpcVirtualRouterElement;
27+
import com.cloud.network.vpc.Vpc;
28+
import com.cloud.network.vpc.dao.VpcServiceMapDao;
29+
import com.cloud.user.AccountVO;
30+
import com.cloud.user.dao.AccountDao;
31+
import org.apache.cloudstack.network.BgpPeerVO;
32+
import org.apache.cloudstack.network.RoutedIpv4Manager;
33+
import org.apache.cloudstack.network.dao.BgpPeerDao;
34+
2135
import org.junit.Assert;
2236
import org.junit.Test;
2337
import org.junit.runner.RunWith;
2438
import org.mockito.InjectMocks;
25-
39+
import org.mockito.Mock;
40+
import org.mockito.Mockito;
2641
import org.mockito.Spy;
2742
import org.mockito.junit.MockitoJUnitRunner;
2843

44+
import java.util.ArrayList;
45+
import java.util.Arrays;
46+
import java.util.List;
47+
48+
import static org.mockito.ArgumentMatchers.any;
49+
import static org.mockito.ArgumentMatchers.eq;
50+
import static org.mockito.Mockito.doReturn;
51+
import static org.mockito.Mockito.verify;
52+
import static org.mockito.Mockito.when;
53+
2954
@RunWith(MockitoJUnitRunner.class)
3055
public class BGPServiceImplTest {
3156

3257
@Spy
3358
@InjectMocks
3459
BGPServiceImpl bGPServiceImplSpy = new BGPServiceImpl();
3560

61+
@Mock
62+
RoutedIpv4Manager routedIpv4Manager;
63+
64+
@Mock
65+
NetworkServiceMapDao ntwkSrvcDao;
66+
67+
@Mock
68+
NetworkModel networkModel;
69+
70+
@Mock
71+
BgpPeerDao bgpPeerDao;
72+
73+
@Mock
74+
AccountDao accountDao;
75+
76+
@Mock
77+
VpcServiceMapDao vpcServiceMapDao;
78+
3679
@Test
3780
public void testASNumbersOverlap() {
3881
Assert.assertEquals(bGPServiceImplSpy.isASNumbersOverlap(1,2,3,4), false);
@@ -42,4 +85,93 @@ public void testASNumbersOverlap() {
4285
Assert.assertEquals(bGPServiceImplSpy.isASNumbersOverlap(1,4,2,3), true);
4386
Assert.assertEquals(bGPServiceImplSpy.isASNumbersOverlap(3,4,1,2), false);
4487
}
88+
89+
@Test
90+
public void testApplyBgpPeersForIsolatedNetwork() throws ResourceUnavailableException {
91+
Long networkId = 11L;
92+
Network network = Mockito.mock(Network.class);
93+
when(network.getId()).thenReturn(networkId);
94+
when(network.getVpcId()).thenReturn(null);
95+
96+
when(routedIpv4Manager.isDynamicRoutedNetwork(network)).thenReturn(true);
97+
when(ntwkSrvcDao.getProviderForServiceInNetwork(networkId, Network.Service.Gateway)).thenReturn("VirtualRouter");
98+
VirtualRouterElement virtualRouterElement = Mockito.mock(VirtualRouterElement.class);
99+
when(networkModel.getElementImplementingProvider("VirtualRouter")).thenReturn(virtualRouterElement);
100+
101+
BgpPeerVO bgpPeer1 = Mockito.mock(BgpPeerVO.class);
102+
List<BgpPeerVO> bgpPeers = Arrays.asList(bgpPeer1);
103+
when(bgpPeerDao.listNonRevokeByNetworkId(networkId)).thenReturn(bgpPeers);
104+
doReturn(true).when(virtualRouterElement).applyBgpPeers(null, network, bgpPeers);
105+
106+
bGPServiceImplSpy.applyBgpPeers(network, true);
107+
108+
verify(virtualRouterElement).applyBgpPeers(null, network, bgpPeers);
109+
}
110+
111+
@Test
112+
public void testApplyBgpPeersForVpcTier() throws ResourceUnavailableException {
113+
Long networkId = 11L;
114+
Long accountId = 12L;
115+
Long vpcId = 13L;
116+
Long zoneId = 1L;
117+
Network network = Mockito.mock(Network.class);
118+
when(network.getId()).thenReturn(networkId);
119+
when(network.getVpcId()).thenReturn(vpcId);
120+
when(network.getAccountId()).thenReturn(accountId);
121+
when(network.getDataCenterId()).thenReturn(zoneId);
122+
123+
when(routedIpv4Manager.isDynamicRoutedNetwork(network)).thenReturn(true);
124+
when(ntwkSrvcDao.getProviderForServiceInNetwork(networkId, Network.Service.Gateway)).thenReturn("VirtualRouter");
125+
VirtualRouterElement virtualRouterElement = Mockito.mock(VirtualRouterElement.class);
126+
when(networkModel.getElementImplementingProvider("VirtualRouter")).thenReturn(virtualRouterElement);
127+
128+
when(bgpPeerDao.listNonRevokeByVpcId(vpcId)).thenReturn(new ArrayList<>());
129+
130+
AccountVO owner = Mockito.mock(AccountVO.class);
131+
when(accountDao.findByIdIncludingRemoved(accountId)).thenReturn(owner);
132+
133+
Long bgpPeerId1 = 14L;
134+
BgpPeerVO bgpPeer1 = Mockito.mock(BgpPeerVO.class);
135+
when(bgpPeerDao.findById(bgpPeerId1)).thenReturn(bgpPeer1);
136+
when(routedIpv4Manager.getBgpPeerIdsForAccount(owner, zoneId)).thenReturn(Arrays.asList(bgpPeerId1));
137+
138+
doReturn(true).when(virtualRouterElement).applyBgpPeers(eq(null), eq(network), any());
139+
140+
bGPServiceImplSpy.applyBgpPeers(network, true);
141+
142+
verify(virtualRouterElement).applyBgpPeers(eq(null), eq(network), any());
143+
}
144+
145+
@Test
146+
public void testApplyBgpPeersForVpcWithBgpPeers() throws ResourceUnavailableException {
147+
Long accountId = 12L;
148+
Long vpcId = 13L;
149+
Long zoneId = 1L;
150+
Vpc vpc = Mockito.mock(Vpc.class);
151+
when(vpc.getId()).thenReturn(vpcId);
152+
when(vpc.getAccountId()).thenReturn(accountId);
153+
when(vpc.getZoneId()).thenReturn(zoneId);
154+
155+
when(routedIpv4Manager.isDynamicRoutedVpc(vpc)).thenReturn(true);
156+
when(vpcServiceMapDao.getProviderForServiceInVpc(vpcId, Network.Service.Gateway)).thenReturn("VPCVirtualRouter");
157+
VpcVirtualRouterElement vpcVirtualRouterElement = Mockito.mock(VpcVirtualRouterElement.class);
158+
when(networkModel.getElementImplementingProvider("VPCVirtualRouter")).thenReturn(vpcVirtualRouterElement);
159+
160+
when(bgpPeerDao.listNonRevokeByVpcId(vpcId)).thenReturn(new ArrayList<>());
161+
162+
AccountVO owner = Mockito.mock(AccountVO.class);
163+
when(accountDao.findByIdIncludingRemoved(accountId)).thenReturn(owner);
164+
165+
Long bgpPeerId1 = 14L;
166+
BgpPeerVO bgpPeer1 = Mockito.mock(BgpPeerVO.class);
167+
when(bgpPeerDao.findById(bgpPeerId1)).thenReturn(bgpPeer1);
168+
when(routedIpv4Manager.getBgpPeerIdsForAccount(owner, zoneId)).thenReturn(Arrays.asList(bgpPeerId1));
169+
170+
doReturn(true).when(vpcVirtualRouterElement).applyBgpPeers(eq(vpc), eq(null), any());
171+
172+
bGPServiceImplSpy.applyBgpPeers(vpc, true);
173+
174+
verify(vpcVirtualRouterElement).applyBgpPeers(eq(vpc), eq(null), any());
175+
}
45176
}
177+

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

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@
2222
import static org.mockito.ArgumentMatchers.eq;
2323
import static org.mockito.ArgumentMatchers.nullable;
2424
import static org.mockito.Mockito.doNothing;
25+
import static org.mockito.Mockito.doThrow;
2526
import static org.mockito.Mockito.mock;
2627
import static org.mockito.Mockito.times;
2728
import static org.mockito.Mockito.when;
2829
import static org.mockito.Mockito.doReturn;
2930

3031
import java.lang.reflect.Field;
3132
import java.util.ArrayList;
33+
import java.util.Arrays;
3234
import java.util.Calendar;
3335
import java.util.Date;
3436
import java.util.HashMap;
@@ -46,6 +48,7 @@
4648
import com.cloud.utils.net.Ip;
4749
import com.cloud.exception.InsufficientAddressCapacityException;
4850
import org.apache.cloudstack.alert.AlertService;
51+
import org.apache.cloudstack.api.command.admin.network.CreateNetworkCmdByAdmin;
4952
import org.apache.cloudstack.api.command.user.address.UpdateQuarantinedIpCmd;
5053
import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
5154
import org.apache.cloudstack.api.command.user.network.UpdateNetworkCmd;
@@ -753,7 +756,7 @@ public void testCheckAndUpdateNetworkSuccess() {
753756
}
754757

755758
@Test
756-
public void testCreateIpv4RoutedNetwork() throws InsufficientCapacityException, ResourceAllocationException {
759+
public void testCreateIpv4RoutedNetwork() {
757760
registerCallContext();
758761
CreateNetworkCmd cmd = Mockito.mock(CreateNetworkCmd.class);
759762
Mockito.when(cmd.getCidrSize()).thenReturn(24);
@@ -777,6 +780,89 @@ public void testCreateIpv4RoutedNetwork() throws InsufficientCapacityException,
777780
Mockito.verify(routedIpv4Manager).assignIpv4SubnetToNetwork(nullable(Network.class));
778781
}
779782

783+
@Test
784+
public void testCreateIpv4RoutedNetworkWithBgpPeersFailure1() {
785+
registerCallContext();
786+
CreateNetworkCmdByAdmin cmd = Mockito.mock(CreateNetworkCmdByAdmin.class);
787+
Mockito.when(cmd.getCidrSize()).thenReturn(24);
788+
List<Long> bgpPeerIds = Arrays.asList(11L, 12L);
789+
Mockito.when(cmd.getBgpPeerIds()).thenReturn(bgpPeerIds);
790+
791+
prepareCreateNetworkDnsMocks(cmd, Network.GuestType.Isolated, false, true, true);
792+
when(networkOfferingVO.getNetworkMode()).thenReturn(NetworkOffering.NetworkMode.ROUTED);
793+
when(networkOfferingVO.getRoutingMode()).thenReturn(NetworkOffering.RoutingMode.Static);
794+
when(routedIpv4Manager.isVirtualRouterGateway(networkOfferingVO)).thenReturn(true);
795+
796+
DataCenterVO zone = Mockito.mock(DataCenterVO.class);
797+
when(cmd.getZoneId()).thenReturn(zoneId);
798+
when(dcDao.findById(zoneId)).thenReturn(zone);
799+
when(zone.getId()).thenReturn(zoneId);
800+
801+
try {
802+
service.createGuestNetwork(cmd);
803+
} catch (InsufficientCapacityException | ResourceAllocationException e) {
804+
Assert.fail(String.format("failure with exception: %s", e.getMessage()));
805+
} catch (InvalidParameterValueException ex) {
806+
Assert.assertEquals("The BGP peers of VPC tiers will inherit from the VPC, do not add separately.", ex.getMessage());
807+
}
808+
}
809+
810+
@Test
811+
public void testCreateIpv4RoutedNetworkWithBgpPeersFailure2() {
812+
registerCallContext();
813+
CreateNetworkCmdByAdmin cmd = Mockito.mock(CreateNetworkCmdByAdmin.class);
814+
Mockito.when(cmd.getCidrSize()).thenReturn(24);
815+
List<Long> bgpPeerIds = Arrays.asList(11L, 12L);
816+
Mockito.when(cmd.getBgpPeerIds()).thenReturn(bgpPeerIds);
817+
818+
prepareCreateNetworkDnsMocks(cmd, Network.GuestType.Isolated, false, false, true);
819+
when(networkOfferingVO.getNetworkMode()).thenReturn(NetworkOffering.NetworkMode.ROUTED);
820+
when(networkOfferingVO.getRoutingMode()).thenReturn(NetworkOffering.RoutingMode.Static);
821+
when(routedIpv4Manager.isVirtualRouterGateway(networkOfferingVO)).thenReturn(true);
822+
823+
DataCenterVO zone = Mockito.mock(DataCenterVO.class);
824+
when(cmd.getZoneId()).thenReturn(zoneId);
825+
when(dcDao.findById(zoneId)).thenReturn(zone);
826+
when(zone.getId()).thenReturn(zoneId);
827+
828+
try {
829+
service.createGuestNetwork(cmd);
830+
} catch (InsufficientCapacityException | ResourceAllocationException e) {
831+
Assert.fail(String.format("failure with exception: %s", e.getMessage()));
832+
} catch (InvalidParameterValueException ex) {
833+
Assert.assertEquals("The network offering does not support Dynamic routing", ex.getMessage());
834+
}
835+
}
836+
837+
@Test
838+
public void testCreateIpv4RoutedNetworkWithBgpPeersFailure3() {
839+
registerCallContext();
840+
CreateNetworkCmdByAdmin cmd = Mockito.mock(CreateNetworkCmdByAdmin.class);
841+
Mockito.when(cmd.getCidrSize()).thenReturn(24);
842+
List<Long> bgpPeerIds = Arrays.asList(11L, 12L);
843+
Mockito.when(cmd.getBgpPeerIds()).thenReturn(bgpPeerIds);
844+
845+
prepareCreateNetworkDnsMocks(cmd, Network.GuestType.Isolated, false, false, true);
846+
when(networkOfferingVO.getNetworkMode()).thenReturn(NetworkOffering.NetworkMode.ROUTED);
847+
when(networkOfferingVO.getRoutingMode()).thenReturn(NetworkOffering.RoutingMode.Static);
848+
when(routedIpv4Manager.isVirtualRouterGateway(networkOfferingVO)).thenReturn(true);
849+
when(routedIpv4Manager.isDynamicRoutedNetwork(networkOfferingVO)).thenReturn(true);
850+
doThrow(new InvalidParameterValueException("validation error")).when(routedIpv4Manager).validateBgpPeers(nullable(Account.class), nullable(Long.class), any(List.class));
851+
852+
DataCenterVO zone = Mockito.mock(DataCenterVO.class);
853+
when(cmd.getZoneId()).thenReturn(zoneId);
854+
when(dcDao.findById(zoneId)).thenReturn(zone);
855+
when(zone.getId()).thenReturn(zoneId);
856+
857+
try {
858+
service.createGuestNetwork(cmd);
859+
} catch (InsufficientCapacityException | ResourceAllocationException e) {
860+
Assert.fail(String.format("failure with exception: %s", e.getMessage()));
861+
} catch (InvalidParameterValueException ex) {
862+
Assert.assertEquals("validation error", ex.getMessage());
863+
}
864+
}
865+
780866
@Test
781867
public void testCheckAndUpdateNetworkResetSuccess() {
782868
NetworkVO networkVO = new NetworkVO();

server/src/test/java/com/cloud/network/element/VirtualRouterElementTest.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import com.cloud.network.router.VirtualRouter.RedundantState;
6666
import com.cloud.network.router.VpcVirtualNetworkApplianceManagerImpl;
6767
import com.cloud.network.rules.dao.PortForwardingRulesDao;
68+
import com.cloud.network.vpc.VpcVO;
6869
import com.cloud.offering.NetworkOffering;
6970
import com.cloud.offerings.NetworkOfferingVO;
7071
import com.cloud.offerings.dao.NetworkOfferingDao;
@@ -98,7 +99,11 @@
9899
import com.cloud.vm.dao.VMInstanceDao;
99100
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
100101
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
102+
import org.apache.cloudstack.network.BgpPeerVO;
101103
import org.apache.cloudstack.network.router.deployment.RouterDeploymentDefinitionBuilder;
104+
import org.apache.cloudstack.network.topology.NetworkTopology;
105+
import org.apache.cloudstack.network.topology.NetworkTopologyContext;
106+
import org.junit.Assert;
102107
import org.junit.Ignore;
103108
import org.junit.Test;
104109
import org.junit.runner.RunWith;
@@ -111,6 +116,7 @@
111116
import org.mockito.stubbing.Answer;
112117

113118
import java.util.ArrayList;
119+
import java.util.Arrays;
114120
import java.util.List;
115121
import java.util.stream.Collectors;
116122

@@ -122,6 +128,7 @@
122128
import static org.mockito.ArgumentMatchers.anyLong;
123129
import static org.mockito.Mockito.doReturn;
124130
import static org.mockito.Mockito.lenient;
131+
import static org.mockito.Mockito.verify;
125132
import static org.mockito.Mockito.when;
126133

127134
@RunWith(MockitoJUnitRunner.class)
@@ -178,6 +185,7 @@ public class VirtualRouterElementTest {
178185
@Mock private ResourceManager _resourceMgr;
179186
@Mock private UserVmManager _userVmMgr;
180187
@Mock private VirtualMachineManager _itMgr;
188+
@Mock private NetworkTopologyContext networkTopologyContext;
181189

182190
@InjectMocks
183191
private RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder;
@@ -517,4 +525,52 @@ public void verifyAutoScaleCounters() {
517525
assertTrue(counterNames.contains(AutoScaleCounterType.Memory.getName()));
518526
assertTrue(counterNames.contains(AutoScaleCounterType.VirtualRouter.getName()));
519527
}
528+
529+
@Test
530+
public void testApplyBgpPeersForVpc() throws ResourceUnavailableException {
531+
List<BgpPeerVO> bgpPeers = Mockito.mock(List.class);
532+
VpcVO vpc = Mockito.mock(VpcVO.class);
533+
534+
DomainRouterVO router = Mockito.mock(DomainRouterVO.class);
535+
when(router.getState()).thenReturn(VirtualMachine.State.Running);
536+
long zoneId = 10L;
537+
long vpcId = 11L;
538+
when(vpc.getId()).thenReturn(vpcId);
539+
when(vpc.getZoneId()).thenReturn(zoneId);
540+
when(_routerDao.listByVpcId(vpcId)).thenReturn(Arrays.asList(router));
541+
DataCenterVO dc = Mockito.mock(DataCenterVO.class);
542+
when(_dcDao.findById(zoneId)).thenReturn(dc);
543+
NetworkTopology networkTopology = Mockito.mock(NetworkTopology.class);
544+
when(networkTopologyContext.retrieveNetworkTopology(dc)).thenReturn(networkTopology);
545+
doReturn(true).when(networkTopology).applyBgpPeers(any(), any(), any());
546+
547+
boolean result = virtualRouterElement.applyBgpPeers(vpc, null, bgpPeers);
548+
549+
Assert.assertTrue(result);
550+
verify(networkTopology).applyBgpPeers(any(), any(), any());
551+
}
552+
553+
@Test
554+
public void testApplyBgpPeersForNetwork() throws ResourceUnavailableException {
555+
List<BgpPeerVO> bgpPeers = Mockito.mock(List.class);
556+
NetworkVO network = Mockito.mock(NetworkVO.class);
557+
558+
DomainRouterVO router = Mockito.mock(DomainRouterVO.class);
559+
when(router.getState()).thenReturn(VirtualMachine.State.Running);
560+
long zoneId = 10L;
561+
long networkId = 11L;
562+
when(network.getId()).thenReturn(networkId);
563+
when(network.getDataCenterId()).thenReturn(zoneId);
564+
when(_routerDao.listByNetworkAndRole(networkId, VirtualRouter.Role.VIRTUAL_ROUTER)).thenReturn(Arrays.asList(router));
565+
DataCenterVO dc = Mockito.mock(DataCenterVO.class);
566+
when(_dcDao.findById(zoneId)).thenReturn(dc);
567+
NetworkTopology networkTopology = Mockito.mock(NetworkTopology.class);
568+
when(networkTopologyContext.retrieveNetworkTopology(dc)).thenReturn(networkTopology);
569+
doReturn(true).when(networkTopology).applyBgpPeers(any(), any(), any());
570+
571+
boolean result = virtualRouterElement.applyBgpPeers(null, network, bgpPeers);
572+
573+
Assert.assertTrue(result);
574+
verify(networkTopology).applyBgpPeers(any(), any(), any());
575+
}
520576
}

0 commit comments

Comments
 (0)