This is an automated email from the ASF dual-hosted git repository. pearl11594 pushed a commit to branch netris-update-vpc-and-tier-names in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit af27e88c828df27d48ef1d2f5b51d5e99ce63e78 Author: Nicolas Vazquez <[email protected]> AuthorDate: Fri Feb 28 10:04:10 2025 -0300 Increase code coverage (#54) * Increase code coverage * More unit tests * Remove credentials and mock api client * NetrisResource tests * Fix unit test --- .../apache/cloudstack/resource/NetrisResource.java | 5 +- .../cloudstack/service/NetrisApiClientImpl.java | 6 +- .../apache/cloudstack/service/NetrisElement.java | 2 +- .../resource/NetrisResourceObjectUtilsTest.java | 31 ++- .../cloudstack/resource/NetrisResourceTest.java | 141 +++++++++++++ .../service/NetrisApiClientImplTest.java | 81 ++++++-- .../cloudstack/service/NetrisElementTest.java | 141 +++++++++++++ .../service/NetrisGuestNetworkGuruTest.java | 226 +++++++++++++++++++++ .../service/NetrisPublicNetworkGuruTest.java | 225 ++++++++++++++++++++ 9 files changed, 831 insertions(+), 27 deletions(-) diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java index 2a02b5de1b4..e7419caf743 100644 --- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java @@ -362,7 +362,7 @@ public class NetrisResource implements ServerResource { boolean result = netrisApiClient.createOrUpdateLbRule(cmd); if (!result) { return new NetrisAnswer(cmd, false, String.format("Failed to create Netris LB rule for %s: %s, " + - "for private port: %s and public port: %s", getNetworkType(cmd.isVpc()), cmd.getName(), cmd.getPrivatePort(), cmd.getPublicPort(), cmd.getPublicPort())); + "for private port: %s and public port: %s", getNetworkType(cmd.isVpc()), cmd.getName(), cmd.getPrivatePort(), cmd.getPublicPort())); } return new NetrisAnswer(cmd, true, "OK"); } @@ -370,8 +370,7 @@ public class NetrisResource implements ServerResource { private Answer executeRequest(DeleteNetrisLoadBalancerRuleCommand cmd) { boolean result = netrisApiClient.deleteLbRule(cmd); if (!result) { - return new NetrisAnswer(cmd, false, String.format("Failed to delete Netris LB rule for %s: %s, " + - "for private port: %s and public port: %s", getNetworkType(cmd.isVpc()), cmd.getName())); + return new NetrisAnswer(cmd, false, String.format("Failed to delete Netris LB rule for %s: %s", getNetworkType(cmd.isVpc()), cmd.getName())); } return new NetrisAnswer(cmd, true, "OK"); } diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java index 0136a96cb79..25c24bf0bf5 100644 --- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java @@ -139,11 +139,11 @@ public class NetrisApiClientImpl implements NetrisApiClient { private static final String ANY_IP = "0.0.0.0/0"; private static final String[] PROTOCOL_LIST = new String[]{"TCP", "UDP", "ICMP", "ALL"}; - private static ApiClient apiClient; + protected ApiClient apiClient; - private final int siteId; + protected final int siteId; private final String siteName; - private final int tenantId; + protected final int tenantId; private final String tenantName; public NetrisApiClientImpl(String endpointBaseUrl, String username, String password, String siteName, String adminTenantName) { diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java index 27f8c99fcd0..5cc2a1c2a41 100644 --- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java @@ -159,7 +159,7 @@ public class NetrisElement extends AdapterBase implements DhcpServiceProvider, D return counterList; } - private static Map<Network.Service, Map<Network.Capability, String>> initCapabilities() { + protected static Map<Network.Service, Map<Network.Capability, String>> initCapabilities() { Map<Network.Service, Map<Network.Capability, String>> capabilities = new HashMap<>(); Map<Network.Capability, String> dhcpCapabilities = Map.of(Network.Capability.DhcpAccrossMultipleSubnets, "true"); diff --git a/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/resource/NetrisResourceObjectUtilsTest.java b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/resource/NetrisResourceObjectUtilsTest.java index e7d223672e4..acec5425929 100644 --- a/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/resource/NetrisResourceObjectUtilsTest.java +++ b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/resource/NetrisResourceObjectUtilsTest.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.resource; +import org.apache.cloudstack.agent.api.CreateNetrisVnetCommand; import org.apache.cloudstack.agent.api.CreateNetrisVpcCommand; import org.apache.cloudstack.agent.api.CreateOrUpdateNetrisNatCommand; import org.apache.cloudstack.agent.api.DeleteNetrisVpcCommand; @@ -28,7 +29,7 @@ public class NetrisResourceObjectUtilsTest { private static final long accountId = 2; private static final long domainId = 2; - private static final long vpcId = 10; + private static final long vpcId = 8; private static final String vpcName = "testVpc"; private static final String vpcCidr = "10.10.0.0/16"; @@ -40,6 +41,14 @@ public class NetrisResourceObjectUtilsTest { Assert.assertEquals(expectedNetrisVpcName, netrisVpcName); } + @Test + public void testCreateVpcNameWithSuffix() { + CreateNetrisVpcCommand cmd = new CreateNetrisVpcCommand(zoneId, accountId, domainId, vpcName, vpcCidr, vpcId, true); + String netrisVpcName = NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.VPC, String.valueOf(vpcId)); + String expectedNetrisVpcName = String.format("D%s-A%s-Z%s-V%s", domainId, accountId, zoneId, vpcId); + Assert.assertEquals(expectedNetrisVpcName, netrisVpcName); + } + @Test public void testCreateVpcIpamAllocationName() { CreateNetrisVpcCommand cmd = new CreateNetrisVpcCommand(zoneId, accountId, domainId, vpcName, vpcCidr, vpcId, true); @@ -66,4 +75,24 @@ public class NetrisResourceObjectUtilsTest { String expectedNetrisRuleName = String.format("D%s-A%s-Z%s-V%s-DNAT-R%s", domainId, accountId, zoneId, vpcId, ruleId); Assert.assertEquals(expectedNetrisRuleName, ruleName); } + + @Test + public void testSubnetName() { + String vNetName = "<NETRIS_VNET_NAME>"; + Long vpcTierNetworkId = 240L; + String vpcTierNetworkCidr = "10.10.30.0/24"; + String vpcTierNetworkGateway = "10.10.30.1"; + CreateNetrisVnetCommand cmd = new CreateNetrisVnetCommand(zoneId, accountId, domainId, vpcName, vpcId, vNetName, vpcTierNetworkId, vpcTierNetworkCidr, vpcTierNetworkGateway, true); + String subnetName = NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.IPAM_SUBNET, String.valueOf(vpcId), vpcTierNetworkCidr); + String expectedName = String.format("D%s-A%s-Z%s-V%s-%s", domainId, accountId, zoneId, vpcId, vpcTierNetworkCidr); + Assert.assertEquals(expectedName, subnetName); + } + + @Test + public void testSourceNatName() { + CreateOrUpdateNetrisNatCommand cmd = new CreateOrUpdateNetrisNatCommand(zoneId, accountId, domainId, vpcName, vpcId, null, null, true, vpcCidr); + String snatRuleName = NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.SNAT, String.valueOf(vpcId)); + String expectedName = String.format("D%s-A%s-Z%s-V%s-SNAT", domainId, accountId, zoneId, vpcId); + Assert.assertEquals(expectedName, snatRuleName); + } } diff --git a/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/resource/NetrisResourceTest.java b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/resource/NetrisResourceTest.java new file mode 100644 index 00000000000..2f96e2cac0e --- /dev/null +++ b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/resource/NetrisResourceTest.java @@ -0,0 +1,141 @@ +// 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 org.apache.cloudstack.resource; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; +import org.apache.cloudstack.agent.api.AddOrUpdateNetrisStaticRouteCommand; +import org.apache.cloudstack.agent.api.CreateNetrisACLCommand; +import org.apache.cloudstack.agent.api.CreateNetrisVnetCommand; +import org.apache.cloudstack.agent.api.CreateNetrisVpcCommand; +import org.apache.cloudstack.agent.api.CreateOrUpdateNetrisLoadBalancerRuleCommand; +import org.apache.cloudstack.agent.api.DeleteNetrisACLCommand; +import org.apache.cloudstack.agent.api.DeleteNetrisLoadBalancerRuleCommand; +import org.apache.cloudstack.agent.api.DeleteNetrisNatRuleCommand; +import org.apache.cloudstack.agent.api.DeleteNetrisStaticRouteCommand; +import org.apache.cloudstack.agent.api.DeleteNetrisVnetCommand; +import org.apache.cloudstack.agent.api.DeleteNetrisVpcCommand; +import org.apache.cloudstack.agent.api.ReleaseNatIpCommand; +import org.apache.cloudstack.agent.api.SetupNetrisPublicRangeCommand; +import org.apache.cloudstack.service.NetrisApiClient; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; + +import java.util.Arrays; +import java.util.List; + +public class NetrisResourceTest { + + @Mock + private NetrisApiClient netrisApiClient; + + @Spy + @InjectMocks + private NetrisResource netrisResource = new NetrisResource(); + + private AutoCloseable closeable; + + @Mock + private CreateNetrisVpcCommand createNetrisVpcCommand; + @Mock + private CreateNetrisVnetCommand createNetrisVnetCommand; + @Mock + private DeleteNetrisVnetCommand deleteNetrisVnetCommand; + @Mock + private DeleteNetrisVpcCommand deleteNetrisVpcCommand; + @Mock + private SetupNetrisPublicRangeCommand setupNetrisPublicRangeCommand; + @Mock + private DeleteNetrisNatRuleCommand deleteNetrisNatRuleCommand; + @Mock + private CreateNetrisACLCommand createNetrisACLCommand; + @Mock + private DeleteNetrisACLCommand deleteNetrisACLCommand; + @Mock + private AddOrUpdateNetrisStaticRouteCommand addOrUpdateNetrisStaticRouteCommand; + @Mock + private DeleteNetrisStaticRouteCommand deleteNetrisStaticRouteCommand; + @Mock + private ReleaseNatIpCommand releaseNatIpCommand; + @Mock + private CreateOrUpdateNetrisLoadBalancerRuleCommand createOrUpdateNetrisLoadBalancerRuleCommand; + @Mock + private DeleteNetrisLoadBalancerRuleCommand deleteNetrisLoadBalancerRuleCommand; + + @Before + public void setup() { + closeable = MockitoAnnotations.openMocks(this); + } + + @After + public void tearDown() throws Exception { + closeable.close(); + } + + @Test + public void testExecuteRequest() { + List<Command> commands = Arrays.asList(createNetrisVpcCommand, createNetrisVnetCommand, deleteNetrisVnetCommand, + deleteNetrisVpcCommand, setupNetrisPublicRangeCommand, deleteNetrisNatRuleCommand, createNetrisACLCommand, + deleteNetrisACLCommand, addOrUpdateNetrisStaticRouteCommand, deleteNetrisStaticRouteCommand, + releaseNatIpCommand, createOrUpdateNetrisLoadBalancerRuleCommand, deleteNetrisLoadBalancerRuleCommand); + + for (boolean res : new boolean[]{true, false}) { + setMocksToValue(res); + for (Command command : commands) { + Answer answer = netrisResource.executeRequest(command); + Assert.assertEquals(res, answer.getResult()); + } + } + + Mockito.verify(netrisApiClient, Mockito.times(2)).createVpc(createNetrisVpcCommand); + Mockito.verify(netrisApiClient, Mockito.times(2)).createVnet(createNetrisVnetCommand); + Mockito.verify(netrisApiClient, Mockito.times(2)).deleteVnet(deleteNetrisVnetCommand); + Mockito.verify(netrisApiClient, Mockito.times(2)).deleteVpc(deleteNetrisVpcCommand); + Mockito.verify(netrisApiClient, Mockito.times(2)).setupZoneLevelPublicRange(setupNetrisPublicRangeCommand); + Mockito.verify(netrisApiClient, Mockito.times(2)).deleteNatRule(deleteNetrisNatRuleCommand); + Mockito.verify(netrisApiClient, Mockito.times(2)).addAclRule(createNetrisACLCommand); + Mockito.verify(netrisApiClient, Mockito.times(2)).deleteAclRule(deleteNetrisACLCommand); + Mockito.verify(netrisApiClient, Mockito.times(2)).addOrUpdateStaticRoute(addOrUpdateNetrisStaticRouteCommand); + Mockito.verify(netrisApiClient, Mockito.times(2)).deleteStaticRoute(deleteNetrisStaticRouteCommand); + Mockito.verify(netrisApiClient, Mockito.times(2)).releaseNatIp(releaseNatIpCommand); + Mockito.verify(netrisApiClient, Mockito.times(2)).createOrUpdateLbRule(createOrUpdateNetrisLoadBalancerRuleCommand); + Mockito.verify(netrisApiClient, Mockito.times(2)).deleteLbRule(deleteNetrisLoadBalancerRuleCommand); + } + + private void setMocksToValue(boolean value) { + Mockito.when(netrisApiClient.createVpc(createNetrisVpcCommand)).thenReturn(value); + Mockito.when(netrisApiClient.createVnet(createNetrisVnetCommand)).thenReturn(value); + Mockito.when(netrisApiClient.deleteVnet(deleteNetrisVnetCommand)).thenReturn(value); + Mockito.when(netrisApiClient.deleteVpc(deleteNetrisVpcCommand)).thenReturn(value); + Mockito.when(netrisApiClient.setupZoneLevelPublicRange(setupNetrisPublicRangeCommand)).thenReturn(value); + Mockito.when(netrisApiClient.deleteNatRule(deleteNetrisNatRuleCommand)).thenReturn(value); + Mockito.when(netrisApiClient.addAclRule(createNetrisACLCommand)).thenReturn(value); + Mockito.when(netrisApiClient.deleteAclRule(deleteNetrisACLCommand)).thenReturn(value); + Mockito.when(netrisApiClient.addOrUpdateStaticRoute(addOrUpdateNetrisStaticRouteCommand)).thenReturn(value); + Mockito.when(netrisApiClient.deleteStaticRoute(deleteNetrisStaticRouteCommand)).thenReturn(value); + Mockito.when(netrisApiClient.releaseNatIp(releaseNatIpCommand)).thenReturn(value); + Mockito.when(netrisApiClient.createOrUpdateLbRule(createOrUpdateNetrisLoadBalancerRuleCommand)).thenReturn(value); + Mockito.when(netrisApiClient.deleteLbRule(deleteNetrisLoadBalancerRuleCommand)).thenReturn(value); + } +} diff --git a/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisApiClientImplTest.java b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisApiClientImplTest.java index d57fbae1c86..6ae440afbff 100644 --- a/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisApiClientImplTest.java +++ b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisApiClientImplTest.java @@ -16,45 +16,88 @@ // under the License. package org.apache.cloudstack.service; -import io.netris.ApiException; +import io.netris.ApiClient; +import io.netris.ApiResponse; +import io.netris.api.v1.AuthenticationApi; +import io.netris.api.v1.SitesApi; +import io.netris.api.v1.TenantsApi; import io.netris.model.GetSiteBody; -import io.netris.model.VPCListing; +import io.netris.model.SitesResponseOK; +import io.netris.model.response.AuthResponse; import io.netris.model.response.TenantResponse; +import io.netris.model.response.TenantsResponse; +import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; +import org.mockito.Spy; +import java.math.BigDecimal; import java.util.List; public class NetrisApiClientImplTest { - private static final String endpointUrl = "https://shapeblue-ctl.netris.dev"; - private static final String username = "netris"; - private static final String password = "qHHa$CZ2oJv*@!7mwoSR"; + private static final String endpointUrl = "https://my-netris-controller.localdomain"; + private static final String username = "user"; + private static final String password = "password"; private static final String siteName = "Datacenter-1"; private static final String adminTenantName = "Admin"; + private static final int siteId = 1; + private static final int adminTenantId = 1; - private static final NetrisApiClientImpl client = new NetrisApiClientImpl(endpointUrl, username, password, siteName, adminTenantName); + private MockedConstruction<ApiClient> apiClientMockedConstruction; - @Test - public void testNetrisAuthStatus() { - Assert.assertTrue(client.isSessionAlive()); + @Spy + @InjectMocks + private NetrisApiClientImpl client; + + @Before + public void setUp() { + GetSiteBody site = Mockito.mock(GetSiteBody.class); + SitesApi sitesApiMock = Mockito.mock(SitesApi.class); + Mockito.when(site.getName()).thenReturn(siteName); + Mockito.when(site.getId()).thenReturn(siteId); + TenantsApi tenantsApi = Mockito.mock(TenantsApi.class); + TenantResponse tenant = Mockito.mock(TenantResponse.class); + Mockito.when(tenant.getName()).thenReturn(adminTenantName); + Mockito.when(tenant.getId()).thenReturn(new BigDecimal(adminTenantId)); + + apiClientMockedConstruction = Mockito.mockConstruction(ApiClient.class, (mock, context) -> { + SitesResponseOK sitesResponse = Mockito.mock(SitesResponseOK.class); + Mockito.when(sitesResponse.getData()).thenReturn(List.of(site)); + Mockito.when(sitesApiMock.apiSitesGet()).thenReturn(sitesResponse); + Mockito.when(mock.getApiStubForMethod(SitesApi.class)).thenReturn(sitesApiMock); + Mockito.when(mock.getApiStubForMethod(TenantsApi.class)).thenReturn(tenantsApi); + ApiResponse<TenantsResponse> tenantsResponse = Mockito.mock(ApiResponse.class); + Mockito.when(tenantsApi.apiTenantsGet()).thenReturn(tenantsResponse); + TenantsResponse tenantsResponseData = Mockito.mock(TenantsResponse.class); + Mockito.when(tenantsResponseData.getData()).thenReturn(List.of(tenant)); + Mockito.when(tenantsResponse.getData()).thenReturn(tenantsResponseData); + AuthenticationApi authenticationApi = Mockito.mock(AuthenticationApi.class); + Mockito.when(mock.getApiStubForMethod(AuthenticationApi.class)).thenReturn(authenticationApi); + ApiResponse<AuthResponse> authResponseApiResponse = Mockito.mock(ApiResponse.class); + Mockito.when(authenticationApi.apiAuthGet()).thenReturn(authResponseApiResponse); + Mockito.when(authResponseApiResponse.getStatusCode()).thenReturn(200); + }); + client = new NetrisApiClientImpl(endpointUrl, username, password, siteName, adminTenantName); } - @Test - public void testListSites() { - List<GetSiteBody> sites = client.listSites(); - Assert.assertTrue(sites.size() > 0); + @After + public void tearDown() { + apiClientMockedConstruction.close(); } @Test - public void testListVpcs() { - List<VPCListing> vpcs = client.listVPCs(); - Assert.assertTrue(vpcs.size() > 0); + public void testConstructor() { + Assert.assertEquals(siteId, client.siteId); + Assert.assertEquals(adminTenantId, client.tenantId); } @Test - public void testListTenants() throws ApiException { - List<TenantResponse> tenants = client.listTenants(); - Assert.assertTrue(tenants.size() > 0); + public void testNetrisAuthStatus() { + Assert.assertTrue(client.isSessionAlive()); } } diff --git a/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisElementTest.java b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisElementTest.java new file mode 100644 index 00000000000..a2622549deb --- /dev/null +++ b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisElementTest.java @@ -0,0 +1,141 @@ +// 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 org.apache.cloudstack.service; + +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.domain.DomainVO; +import com.cloud.domain.dao.DomainDao; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; +import com.cloud.network.as.AutoScaleCounter; +import com.cloud.network.as.Counter; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkVO; +import com.cloud.network.netris.NetrisService; +import com.cloud.network.vpc.VpcVO; +import com.cloud.network.vpc.dao.VpcDao; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.vm.ReservationContext; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +public class NetrisElementTest { + + @Spy + @InjectMocks + private NetrisElement netrisElement = new NetrisElement();; + + @Mock + private NetrisService netrisService; + @Mock + private AccountManager accountManager; + @Mock + private NetworkDao networkDao; + @Mock + private DataCenterDao dataCenterDao; + @Mock + private DomainDao domainDao; + @Mock + private VpcDao vpcDao; + + private AutoCloseable closeable; + + private static long accountId = 2L; + private static long zoneId = 1L; + + @Before + public void setup() { + closeable = MockitoAnnotations.openMocks(this); + } + + @After + public void tearDown() throws Exception { + closeable.close(); + } + + @Test + public void testAutoscalingCounterList() { + List<AutoScaleCounter> counters = NetrisElement.getNetrisAutoScaleCounters(); + Assert.assertEquals(2, counters.size()); + Set<String> counterNamesSet = counters.stream().map(AutoScaleCounter::getName).collect(Collectors.toSet()); + Set<String> expected = Set.of(Counter.Source.CPU.name(), Counter.Source.MEMORY.name()); + Assert.assertEquals(expected, counterNamesSet); + } + + @Test + public void testInitCapabilities() { + Map<Network.Service, Map<Network.Capability, String>> capabilities = NetrisElement.initCapabilities(); + Assert.assertTrue(capabilities.containsKey(Network.Service.Dns)); + Assert.assertTrue(capabilities.containsKey(Network.Service.Dhcp)); + Assert.assertTrue(capabilities.containsKey(Network.Service.SourceNat)); + Assert.assertTrue(capabilities.containsKey(Network.Service.StaticNat)); + Assert.assertTrue(capabilities.containsKey(Network.Service.Lb)); + Assert.assertTrue(capabilities.containsKey(Network.Service.PortForwarding)); + Assert.assertTrue(capabilities.containsKey(Network.Service.NetworkACL)); + } + + @Test + public void testDeleteNetwork() throws ResourceUnavailableException { + long networkId = 210L; + long domainId = 2L; + long vpcId = 8L; + String vpcName = "testVpc"; + String networkName = "testVpcTier"; + String networkCidr = "10.10.30.0/24"; + VpcVO vpc = Mockito.mock(VpcVO.class); + Mockito.when(vpc.getName()).thenReturn(vpcName); + Network network = Mockito.mock(Network.class); + Mockito.when(network.getAccountId()).thenReturn(accountId); + Mockito.when(network.getId()).thenReturn(networkId); + Mockito.when(network.getDataCenterId()).thenReturn(zoneId); + Mockito.when(network.getName()).thenReturn(networkName); + Mockito.when(network.getCidr()).thenReturn(networkCidr); + Mockito.when(network.getVpcId()).thenReturn(vpcId); + Account account = Mockito.mock(Account.class); + Mockito.when(account.getId()).thenReturn(accountId); + Mockito.when(account.getDomainId()).thenReturn(domainId); + NetworkVO networkVO = Mockito.mock(NetworkVO.class); + Mockito.when(networkVO.getName()).thenReturn(networkName); + DataCenterVO dataCenterVO = Mockito.mock(DataCenterVO.class); + Mockito.when(dataCenterVO.getId()).thenReturn(zoneId); + DomainVO domain = Mockito.mock(DomainVO.class); + Mockito.when(domain.getId()).thenReturn(domainId); + Mockito.when(accountManager.getAccount(accountId)).thenReturn(account); + Mockito.when(networkDao.findById(networkId)).thenReturn(networkVO); + Mockito.when(dataCenterDao.findById(zoneId)).thenReturn(dataCenterVO); + Mockito.when(domainDao.findById(domainId)).thenReturn(domain); + Mockito.when(vpcDao.findById(vpcId)).thenReturn(vpc); + ReservationContext context = Mockito.mock(ReservationContext.class); + netrisElement.destroy(network, context); + Mockito.verify(netrisService).deleteVnetResource(zoneId, accountId, domainId, vpcName, vpcId, + networkName, networkId, networkCidr); + } +} diff --git a/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisGuestNetworkGuruTest.java b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisGuestNetworkGuruTest.java new file mode 100644 index 00000000000..9548855998a --- /dev/null +++ b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisGuestNetworkGuruTest.java @@ -0,0 +1,226 @@ +// 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 org.apache.cloudstack.service; + +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.domain.DomainVO; +import com.cloud.domain.dao.DomainDao; +import com.cloud.event.ActionEventUtils; +import com.cloud.exception.InsufficientVirtualNetworkCapacityException; +import com.cloud.network.Network; +import com.cloud.network.NetworkModel; +import com.cloud.network.Networks; +import com.cloud.network.dao.NetworkVO; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkVO; +import com.cloud.network.netris.NetrisService; +import com.cloud.network.vpc.VpcVO; +import com.cloud.network.vpc.dao.VpcDao; +import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; +import com.cloud.user.AccountVO; +import com.cloud.user.dao.AccountDao; +import com.cloud.vm.ReservationContext; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; + +import java.util.Arrays; +import java.util.List; + +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; + +public class NetrisGuestNetworkGuruTest { + + @Mock + private NetworkOfferingServiceMapDao networkOfferingServiceMapDao; + @Mock + private PhysicalNetworkDao physicalNetworkDao; + @Mock + private DataCenterDao dataCenterDao; + @Mock + private NetworkModel networkModel; + @Mock + private AccountDao accountDao; + @Mock + private DomainDao domainDao; + @Mock + private NetworkOfferingDao networkOfferingDao; + @Mock + private VpcDao vpcDao; + @Mock + private NetrisService netrisService; + + @Spy + @InjectMocks + private NetrisGuestNetworkGuru guru = new NetrisGuestNetworkGuru(); + + @Mock + private NetworkOfferingVO networkOffering; + @Mock + private PhysicalNetworkVO physicalNetwork; + @Mock + private DeploymentPlan plan; + @Mock + private NetworkVO network; + @Mock + private AccountVO account; + @Mock + private DomainVO domain; + @Mock + private DataCenterVO zone; + @Mock + private VpcVO vpc; + + private AutoCloseable closeable; + private MockedStatic<ActionEventUtils> actionEventUtilsMocked; + + private static final long networkOfferingId = 10L; + private static final long physicalNetworkId = 2L; + private static final long zoneId = 1L; + private static final long accountId = 2L; + private static final long domainId = 7L; + private static final long vpcId = 12L; + private static final long networkId = 210L; + private static final String networkName = "test-network"; + private static final String vpcName = "test-vpc"; + private static final String networkCidr = "172.20.10.0/24"; + + @Before + public void setup() { + closeable = MockitoAnnotations.openMocks(this); + Mockito.when(networkOffering.getId()).thenReturn(networkOfferingId); + Mockito.when(networkOffering.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + Mockito.when(networkOffering.getNetworkMode()).thenReturn(NetworkOffering.NetworkMode.NATTED); + Mockito.when(networkOffering.isRedundantRouter()).thenReturn(false); + Mockito.when(networkOfferingDao.findById(networkOfferingId)).thenReturn(networkOffering); + Mockito.when(physicalNetwork.getIsolationMethods()).thenReturn(List.of("netris")); + Mockito.when(physicalNetworkDao.findById(physicalNetworkId)).thenReturn(physicalNetwork); + Mockito.when(networkOfferingServiceMapDao.isProviderForNetworkOffering(networkOfferingId, Network.Provider.Netris)).thenReturn(true); + Mockito.when(plan.getPhysicalNetworkId()).thenReturn(physicalNetworkId); + Mockito.when(plan.getDataCenterId()).thenReturn(zoneId); + Mockito.when(dataCenterDao.findById(zoneId)).thenReturn(zone); + Mockito.when(zone.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced); + Mockito.when(zone.getGuestNetworkCidr()).thenReturn("172.20.0.0/16"); + Mockito.when(zone.getId()).thenReturn(zoneId); + List<Network.Service> offeringServices = Arrays.asList(Network.Service.Dns, Network.Service.Dhcp, + Network.Service.SourceNat, Network.Service.StaticNat, Network.Service.PortForwarding, + Network.Service.NetworkACL, Network.Service.Vpn); + Mockito.when(networkModel.listNetworkOfferingServices(networkOfferingId)).thenReturn(offeringServices); + Mockito.when(accountDao.findById(accountId)).thenReturn(account); + Mockito.when(account.getDomainId()).thenReturn(domainId); + Mockito.when(account.getId()).thenReturn(accountId); + Mockito.when(domain.getId()).thenReturn(domainId); + Mockito.when(domainDao.findById(domainId)).thenReturn(domain); + Mockito.when(network.getAccountId()).thenReturn(accountId); + Mockito.when(network.getNetworkOfferingId()).thenReturn(networkOfferingId); + Mockito.when(network.getVpcId()).thenReturn(vpcId); + Mockito.when(network.getName()).thenReturn(networkName); + Mockito.when(network.getId()).thenReturn(networkId); + Mockito.when(network.getCidr()).thenReturn(networkCidr); + Mockito.when(network.getGateway()).thenReturn("172.20.10.1"); + Mockito.when(network.getDataCenterId()).thenReturn(zoneId); + Mockito.when(network.getPhysicalNetworkId()).thenReturn(physicalNetworkId); + Mockito.when(network.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + Mockito.when(network.getBroadcastDomainType()).thenReturn(Networks.BroadcastDomainType.Netris); + Mockito.when(vpcDao.findById(vpcId)).thenReturn(vpc); + Mockito.when(vpc.getName()).thenReturn(vpcName); + Mockito.when(vpc.getId()).thenReturn(vpcId); + actionEventUtilsMocked = Mockito.mockStatic(ActionEventUtils.class); + Mockito.when(ActionEventUtils.onCompletedActionEvent(anyLong(), anyLong(), anyString(), anyString(), anyString(), anyLong(), anyString(), anyLong())).thenReturn(1L); + } + + @After + public void tearDown() throws Exception { + closeable.close(); + actionEventUtilsMocked.close(); + } + + @Test + public void testCanHandleNetrisOfferingNatted() { + Assert.assertTrue(guru.canHandle(networkOffering, DataCenter.NetworkType.Advanced, physicalNetwork)); + } + + @Test + public void testCanHandleNetrisOfferingRouted() { + Mockito.when(networkOffering.getNetworkMode()).thenReturn(NetworkOffering.NetworkMode.ROUTED); + Assert.assertTrue(guru.canHandle(networkOffering, DataCenter.NetworkType.Advanced, physicalNetwork)); + } + + @Test + public void testCannotHandleBasicNetwork() { + Assert.assertFalse(guru.canHandle(networkOffering, DataCenter.NetworkType.Basic, physicalNetwork)); + } + + @Test + public void testCannotHandleVlanIsolation() { + Mockito.when(physicalNetwork.getIsolationMethods()).thenReturn(List.of("vlan")); + Assert.assertFalse(guru.canHandle(networkOffering, DataCenter.NetworkType.Advanced, physicalNetwork)); + } + + @Test + public void testCannotHandleDifferentOfferingProvider() { + Mockito.when(networkOfferingServiceMapDao.isProviderForNetworkOffering(networkOfferingId, Network.Provider.Netris)).thenReturn(false); + Assert.assertFalse(guru.canHandle(networkOffering, DataCenter.NetworkType.Advanced, physicalNetwork)); + } + + @Test + public void testDesignNetrisNetwork() { + Network designedNetwork = guru.design(networkOffering, plan, network, networkName, 1L, account); + Assert.assertEquals(Networks.BroadcastDomainType.Netris, designedNetwork.getBroadcastDomainType()); + Assert.assertEquals(Network.State.Allocated, designedNetwork.getState()); + Assert.assertEquals(Networks.TrafficType.Guest, designedNetwork.getTrafficType()); + } + + @Test + public void testCreateNetrisVnetVpcNetworkRoutedMode() { + Mockito.when(networkOffering.getNetworkMode()).thenReturn(NetworkOffering.NetworkMode.ROUTED); + Mockito.when(netrisService.createVnetResource(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), + Mockito.anyString(), Mockito.anyLong(), Mockito.anyString(), Mockito.anyLong(), Mockito.anyString(), + Mockito.anyBoolean())).thenReturn(true); + guru.createNetrisVnet(network, zone); + Mockito.verify(netrisService).createVnetResource(zoneId, accountId, domainId, vpcName, vpcId, + networkName, networkId, networkCidr, true); + } + + @Test + public void testImplementNetrisVpcNetwork() throws InsufficientVirtualNetworkCapacityException { + DeployDestination destination = Mockito.mock(DeployDestination.class); + ReservationContext context = Mockito.mock(ReservationContext.class); + String vnet = "1234"; + Mockito.when(dataCenterDao.allocateVnet(Mockito.eq(zoneId), Mockito.eq(physicalNetworkId), + Mockito.eq(accountId), Mockito.nullable(String.class), Mockito.anyBoolean())).thenReturn(vnet); + actionEventUtilsMocked.when(() -> ActionEventUtils.onCompletedActionEvent(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyLong(), Mockito.anyString(), Mockito.anyLong())).thenReturn(1L); + Network implemented = guru.implement(network, networkOffering, destination, context); + Assert.assertEquals(String.format("netris://%s", vnet), implemented.getBroadcastUri().toString()); + Assert.assertEquals(Network.State.Implemented, implemented.getState()); + } +} diff --git a/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisPublicNetworkGuruTest.java b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisPublicNetworkGuruTest.java new file mode 100644 index 00000000000..531e343f6aa --- /dev/null +++ b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisPublicNetworkGuruTest.java @@ -0,0 +1,225 @@ +// 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 org.apache.cloudstack.service; + +import com.cloud.dc.VlanDetailsVO; +import com.cloud.dc.dao.VlanDetailsDao; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.InsufficientVirtualNetworkCapacityException; +import com.cloud.network.Network; +import com.cloud.network.NetworkModel; +import com.cloud.network.Networks; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.IPAddressVO; +import com.cloud.network.dao.NetworkVO; +import com.cloud.network.netris.NetrisService; +import com.cloud.network.vpc.VpcOfferingVO; +import com.cloud.network.vpc.VpcVO; +import com.cloud.network.vpc.dao.VpcDao; +import com.cloud.network.vpc.dao.VpcOfferingDao; +import com.cloud.network.vpc.dao.VpcOfferingServiceMapDao; +import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.user.AccountVO; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.net.Ip; +import com.cloud.vm.NicProfile; +import com.cloud.vm.VirtualMachineProfile; +import org.apache.cloudstack.api.ApiConstants; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; + +import java.util.Arrays; + +public class NetrisPublicNetworkGuruTest { + + @Mock + private NetworkModel networkModel; + @Mock + private IPAddressDao ipAddressDao; + @Mock + private VpcDao vpcDao; + @Mock + private VlanDetailsDao vlanDetailsDao; + @Mock + private VpcOfferingDao vpcOfferingDao; + @Mock + private VpcOfferingServiceMapDao vpcOfferingServiceMapDao; + @Mock + private NetrisService netrisService; + @Spy + @InjectMocks + private NetrisPublicNetworkGuru guru = new NetrisPublicNetworkGuru(); + + @Mock + private NetworkOfferingVO networkOffering; + @Mock + private DeploymentPlan deploymentPlan; + @Mock + private NetworkVO network; + @Mock + private AccountVO account; + @Mock + private NicProfile nicProfile; + @Mock + private VirtualMachineProfile virtualMachineProfile; + @Mock + private IPAddressVO ipAddressVpcVR; + @Mock + private IPAddressVO ipAddressVpcSourceNat; + @Mock + private VpcVO vpc; + + private AutoCloseable closeable; + + private static final long networkOfferingId = 10L; + private static final long physicalNetworkId = 2L; + private static final long zoneId = 1L; + private static final long vpcId = 12L; + private static final String vrNicIp = "10.10.10.10"; + private static final String vpcSourceNatIp = "10.10.20.20"; + + @Before + public void setup() { + closeable = MockitoAnnotations.openMocks(this); + Mockito.when(networkOffering.getId()).thenReturn(networkOfferingId); + Mockito.when(networkOffering.getTrafficType()).thenReturn(Networks.TrafficType.Public); + Mockito.when(networkOffering.isSystemOnly()).thenReturn(true); + Mockito.when(networkModel.isProviderForNetworkOffering(Network.Provider.Netris, networkOfferingId)).thenReturn(true); + Mockito.when(network.getBroadcastDomainType()).thenReturn(Networks.BroadcastDomainType.Netris); + Mockito.when(deploymentPlan.getDataCenterId()).thenReturn(zoneId); + Mockito.when(deploymentPlan.getPhysicalNetworkId()).thenReturn(physicalNetworkId); + Mockito.when(networkOffering.isRedundantRouter()).thenReturn(false); + Mockito.when(nicProfile.getIPv4Address()).thenReturn(vrNicIp); + Mockito.when(ipAddressDao.findByIp(vrNicIp)).thenReturn(ipAddressVpcVR); + Mockito.when(ipAddressVpcVR.getVpcId()).thenReturn(vpcId); + Mockito.when(vpcDao.findById(vpcId)).thenReturn(vpc); + Mockito.when(vpc.getId()).thenReturn(vpcId); + Mockito.when(ipAddressDao.listByAssociatedVpc(vpcId, true)) + .thenReturn(Arrays.asList(ipAddressVpcVR, ipAddressVpcSourceNat)); + Ip ipMock = Mockito.mock(Ip.class); + Mockito.when(ipMock.addr()).thenReturn(vrNicIp); + Mockito.when(ipAddressVpcVR.getAddress()).thenReturn(ipMock); + Ip ipVrMock = Mockito.mock(Ip.class); + Mockito.when(ipVrMock.addr()).thenReturn(vpcSourceNatIp); + Mockito.when(ipAddressVpcSourceNat.getAddress()).thenReturn(ipVrMock); + Mockito.when(ipAddressVpcSourceNat.isSourceNat()).thenReturn(true); + Mockito.when(ipAddressVpcSourceNat.isForSystemVms()).thenReturn(false); + Mockito.when(ipAddressVpcSourceNat.getVlanId()).thenReturn(4L); + VlanDetailsVO vlanDetailsVO = Mockito.mock(VlanDetailsVO.class); + Mockito.when(vlanDetailsVO.getValue()).thenReturn("true"); + Mockito.when(vlanDetailsDao.findDetail(4L, ApiConstants.NETRIS_DETAIL_KEY)).thenReturn(vlanDetailsVO); + } + + @After + public void tearDown() throws Exception { + closeable.close(); + } + + @Test + public void testCanHandleNetrisPublic() { + Assert.assertTrue(guru.canHandle(networkOffering)); + } + + @Test + public void testCannotHandleNonNetrisPublic() { + Mockito.when(networkModel.isProviderForNetworkOffering(Network.Provider.Netris, networkOfferingId)).thenReturn(false); + Assert.assertFalse(guru.canHandle(networkOffering)); + } + + @Test + public void testCannotHandleNonPublicTraffic() { + Mockito.when(networkOffering.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + Assert.assertFalse(guru.canHandle(networkOffering)); + } + + @Test + public void testDesignNetrisNetwork() { + String name = "test-network"; + long vpcId = 10L; + Network design = guru.design(networkOffering, deploymentPlan, network, name, vpcId, account); + Assert.assertEquals(Network.State.Setup, design.getState()); + Assert.assertEquals(Networks.BroadcastDomainType.Netris, design.getBroadcastDomainType()); + } + + @Test(expected = CloudRuntimeException.class) + public void testAllocateNetrisNetworkMissingIpAddress() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException { + Mockito.when(ipAddressDao.findByIp(vrNicIp)).thenReturn(null); + guru.allocate(network, nicProfile, virtualMachineProfile); + } + + @Test(expected = CloudRuntimeException.class) + public void testAllocateNetrisNetworkMissingVpc() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException { + Mockito.when(vpcDao.findById(vpcId)).thenReturn(null); + guru.allocate(network, nicProfile, virtualMachineProfile); + } + + @Test(expected = CloudRuntimeException.class) + public void testAllocateNetrisNetworkSourceNatIps() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException { + Mockito.when(vpcDao.findById(vpcId)).thenReturn(null); + guru.allocate(network, nicProfile, virtualMachineProfile); + } + + @Test(expected = CloudRuntimeException.class) + public void testAllocateNetrisNetworkMissingIps() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException { + Mockito.when(ipAddressDao.listByAssociatedVpc(vpcId, true)).thenReturn(null); + guru.allocate(network, nicProfile, virtualMachineProfile); + } + + @Test + public void testAllocateNetrisNetwork() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException { + long vpcOfferingId = 20L; + long accountId = 2L; + long domainId = 8L; + long networkId = 210L; + String vpcName = "test-vpc"; + String vpcCidr = "172.20.10.1/28"; + String networkName = "vpc-tier"; + Mockito.when(vpc.getAccountId()).thenReturn(accountId); + Mockito.when(vpc.getZoneId()).thenReturn(zoneId); + Mockito.when(vpc.getDomainId()).thenReturn(domainId); + Mockito.when(vpc.getVpcOfferingId()).thenReturn(vpcOfferingId); + Mockito.when(vpc.getName()).thenReturn(vpcName); + Mockito.when(vpc.getCidr()).thenReturn(vpcCidr); + Mockito.when(network.getName()).thenReturn(networkName); + Mockito.when(network.getId()).thenReturn(networkId); + VpcOfferingVO vpcOffering = Mockito.mock(VpcOfferingVO.class); + Mockito.when(vpcOfferingDao.findById(vpcOfferingId)).thenReturn(vpcOffering); + Mockito.when(vpcOffering.getNetworkMode()).thenReturn(NetworkOffering.NetworkMode.NATTED); + Mockito.when(vpcOfferingServiceMapDao.areServicesSupportedByVpcOffering( + vpcOfferingId, new Network.Service[]{Network.Service.SourceNat})).thenReturn(true); + Mockito.when(netrisService.createVpcResource(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), + Mockito.anyLong(), Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyString(), + Mockito.anyBoolean())).thenReturn(true); + Mockito.when(netrisService.createSnatRule(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), + Mockito.anyString(), Mockito.anyLong(), Mockito.anyString(), Mockito.anyLong(), + Mockito.anyBoolean(), Mockito.anyString(), Mockito.anyString())).thenReturn(true); + guru.allocate(network, nicProfile, virtualMachineProfile); + Mockito.verify(netrisService).createVpcResource(zoneId, accountId, domainId, vpcId, vpcName, true, + vpcCidr, true); + Mockito.verify(netrisService).createSnatRule(zoneId, accountId, domainId, vpcName, vpcId, networkName, + networkId, true, vpcCidr, vpcSourceNatIp); + } +}
