http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d0467731/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTest.java
----------------------------------------------------------------------
diff --git 
a/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTest.java
 
b/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTest.java
index 6941e9a..10d4b42 100644
--- 
a/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTest.java
+++ 
b/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTest.java
@@ -1,9 +1,19 @@
 package org.cloud.network.router.deployment;
 
 import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.fail;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -14,7 +24,6 @@ import java.util.List;
 import java.util.Map;
 
 import 
org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -27,29 +36,59 @@ import com.cloud.dc.DataCenter;
 import com.cloud.dc.DataCenter.NetworkType;
 import com.cloud.dc.HostPodVO;
 import com.cloud.dc.Pod;
+import com.cloud.dc.dao.HostPodDao;
 import com.cloud.deploy.DeployDestination;
+import com.cloud.deploy.DeploymentPlan;
 import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.IpAddressManager;
 import com.cloud.network.Network;
+import com.cloud.network.Network.Provider;
+import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkModel;
 import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.VirtualRouterProvider.Type;
+import com.cloud.network.addr.PublicIp;
 import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
+import com.cloud.network.dao.VirtualRouterProviderDao;
+import com.cloud.network.element.VirtualRouterProviderVO;
+import com.cloud.network.router.NetworkGeneralHelper;
+import com.cloud.network.router.VirtualRouter.Role;
+import com.cloud.offerings.NetworkOfferingVO;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+import com.cloud.service.ServiceOfferingVO;
 import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile.Param;
 import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.dao.VMInstanceDao;
 
 @RunWith(MockitoJUnitRunner.class)
 public class RouterDeploymentDefinitionTest {
 
+    private static final long OFFERING_ID = 16L;
+    private static final String 
NUMBER_OF_ROUTERS_TO_DEPLOY_IS_NOT_THE_EXPECTED = "Number of routers to deploy 
is not the expected";
     private static final String 
ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED = "Only the provided as 
default destination was expected";
     protected static final Long DATA_CENTER_ID = 100l;
+    protected static final Long NW_ID = 102l;
     protected static final Long POD_ID1 = 111l;
     protected static final Long POD_ID2 = 112l;
     protected static final Long POD_ID3 = 113l;
-    protected static final Long NW_ID = 102l;
+    protected static final Long ROUTER1_ID = 121l;
+    protected static final Long ROUTER2_ID = 122l;
+    private static final long PROVIDER_ID = 131L;
+    private static final long PHYSICAL_NW_ID = 141L;
 
     // General delegates (Daos, Mgrs...)
     @Mock
@@ -69,11 +108,32 @@ public class RouterDeploymentDefinitionTest {
     @Mock
     protected HostPodVO mockHostPodVO3;
     @Mock
-    protected NetworkVO mockNwLock;
+    protected NetworkVO mockNw;
+    @Mock
+    NetworkOfferingVO mockNwOfferingVO;
     @Mock
     protected Account mockOwner;
     @Mock
     protected DomainRouterDao mockRouterDao;
+    @Mock
+    protected NetworkGeneralHelper mockNetworkGeneralHelper;
+    @Mock
+    protected VMInstanceDao mockVmDao;
+    @Mock
+    protected HostPodDao mockPodDao;
+    @Mock
+    protected VirtualRouterProviderDao mockVrProviderDao;
+    @Mock
+    protected PhysicalNetworkServiceProviderDao physicalProviderDao;
+    @Mock
+    protected NetworkModel mockNetworkModel;
+    @Mock
+    protected IpAddressManager mockIpAddrMgr;
+    @Mock
+    protected NetworkOfferingDao mockNetworkOfferingDao;
+    @Mock
+    protected AccountManager mockAccountMgr;
+
 
     protected List<HostPodVO> mockPods = new ArrayList<>();
     protected Map<Param, Object> params = new HashMap<>();
@@ -92,26 +152,72 @@ public class RouterDeploymentDefinitionTest {
         when(this.mockHostPodVO1.getId()).thenReturn(POD_ID1);
         when(this.mockHostPodVO2.getId()).thenReturn(POD_ID2);
         when(this.mockHostPodVO3.getId()).thenReturn(POD_ID3);
-        when(this.mockNwLock.getId()).thenReturn(NW_ID);
+        when(this.mockNw.getId()).thenReturn(NW_ID);
 
         this.deployment = this.builder.create()
-                .setGuestNetwork(this.mockNwLock)
+                .setGuestNetwork(this.mockNw)
                 .setDeployDestination(this.mockDestination)
+                .setAccountOwner(this.mockOwner)
                 .build();
     }
 
     @Test
+    public void testRedundancyProperty() {
+        // Set and confirm is redundant
+        RouterDeploymentDefinition deployment1 = this.builder.create()
+                .setGuestNetwork(this.mockNw)
+                .setDeployDestination(this.mockDestination)
+                .makeRedundant()
+                .build();
+        assertTrue("The builder ignored \".makeRedundant()\"", 
deployment1.isRedundant());
+        RouterDeploymentDefinition deployment2 = this.builder.create()
+                .setGuestNetwork(this.mockNw)
+                .setDeployDestination(this.mockDestination)
+                .setRedundant(true)
+                .build();
+        assertTrue("The builder ignored \".setRedundant(true)\"", 
deployment2.isRedundant());
+    }
+
+    @Test
+    public void testConstructionFieldsAndFlags() {
+        // Vpc type
+        assertFalse(this.deployment.isVpcRouter());
+        // Offering null
+        this.deployment.offeringId = null;
+        assertNull(this.deployment.getOfferingId());
+        // Offering null
+        ServiceOfferingVO offeringVO = mock(ServiceOfferingVO.class);
+        this.deployment.offeringId = OFFERING_ID;
+        assertEquals(OFFERING_ID, this.deployment.getOfferingId().longValue());
+        // Routers
+        assertNotNull(this.deployment.getRouters());
+        // Guest network
+        assertNotNull(this.deployment.getGuestNetwork());
+        // Deploy Destination
+        assertNotNull(this.deployment.getDest());
+        // Account owner
+        assertNotNull(this.deployment.getOwner());
+        // Deployment plan
+        this.deployment.plan = mock(DeploymentPlan.class);
+        assertNotNull(this.deployment.getPlan());
+        // Redundant : by default is not
+        assertFalse(this.deployment.isRedundant());
+        this.deployment.isRedundant = true;
+        assertTrue(this.deployment.isRedundant());
+    }
+
+    @Test
     public void testLock() {
         // Prepare
         when(this.mockNwDao.acquireInLockTable(NW_ID, 
NetworkOrchestrationService.NetworkLockTimeout.value()))
-        .thenReturn(mockNwLock);
+        .thenReturn(mockNw);
 
         // Execute
         this.deployment.lock();
 
         // Assert
         verify(this.mockNwDao, times(1)).acquireInLockTable(NW_ID, 600);
-        Assert.assertNotNull(this.deployment.tableLockId);
+        assertNotNull(this.deployment.tableLockId);
     }
 
     @Test(expected = ConcurrentOperationException.class)
@@ -125,7 +231,7 @@ public class RouterDeploymentDefinitionTest {
 
         // Assert
         verify(this.mockNwDao, times(1)).acquireInLockTable(NW_ID, 600);
-        Assert.assertNotNull(this.deployment.tableLockId);
+        assertNotNull(this.deployment.tableLockId);
     }
 
     @Test
@@ -176,8 +282,8 @@ public class RouterDeploymentDefinitionTest {
     @Test
     public void testGenerateDeploymentPlanBasic() {
         // Prepare
-        when(this.mockDestination.getPod()).thenReturn(mockPod);
-        when(mockDataCenter.getNetworkType()).thenReturn(NetworkType.Basic);
+        when(this.mockDestination.getPod()).thenReturn(this.mockPod);
+        
when(this.mockDataCenter.getNetworkType()).thenReturn(NetworkType.Basic);
 
         // Execute
         this.deployment.generateDeploymentPlan();
@@ -260,9 +366,9 @@ public class RouterDeploymentDefinitionTest {
         List<DeployDestination> destinations = 
this.deployment.findDestinations();
 
         // Assert
-        
Assert.assertEquals(ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED,
+        assertEquals(ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED,
                 1, destinations.size());
-        
Assert.assertEquals(ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED,
+        assertEquals(ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED,
                 this.mockDestination, destinations.get(0));
     }
 
@@ -276,9 +382,9 @@ public class RouterDeploymentDefinitionTest {
         List<DeployDestination> destinations = 
this.deployment.findDestinations();
 
         // Assert
-        
Assert.assertEquals(ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED,
+        assertEquals(ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED,
                 1, destinations.size());
-        
Assert.assertEquals(ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED,
+        assertEquals(ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED,
                 this.mockDestination, destinations.get(0));
     }
 
@@ -292,7 +398,7 @@ public class RouterDeploymentDefinitionTest {
         this.mockPods.add(this.mockHostPodVO1);
         this.mockPods.add(this.mockHostPodVO2);
         this.mockPods.add(this.mockHostPodVO3);
-        RouterDeploymentDefinition deployment = Mockito.spy(this.deployment);
+        RouterDeploymentDefinition deployment = spy(this.deployment);
         doReturn(mockPods).when(deployment).listByDataCenterIdVMTypeAndStates(
                 DATA_CENTER_ID, VirtualMachine.Type.User,
                 VirtualMachine.State.Starting, VirtualMachine.State.Running);
@@ -318,41 +424,577 @@ public class RouterDeploymentDefinitionTest {
         List<DeployDestination> destinations = deployment.findDestinations();
 
         // Assert that 2 were added (for the 1st and 3rd
-        Assert.assertEquals("",
+        assertEquals("",
                 2, destinations.size());
-        Assert.assertEquals("",
+        assertEquals("",
                 this.mockDataCenter, destinations.get(0).getDataCenter());
-        Assert.assertEquals("",
+        assertEquals("",
                 this.mockHostPodVO1, destinations.get(0).getPod());
-        Assert.assertEquals("",
+        assertEquals("",
                 this.mockDataCenter, destinations.get(1).getDataCenter());
-        Assert.assertEquals("",
+        assertEquals("",
                 this.mockHostPodVO3, destinations.get(1).getPod());
     }
 
+    @Test(expected = CloudRuntimeException.class)
+    public void testFindDestinationsMoreThan1PodPerBasicZone() {
+        // Prepare
+        
when(this.mockDataCenter.getNetworkType()).thenReturn(NetworkType.Basic);
+        when(this.mockDestination.getPod()).thenReturn(null);
+
+        // Stub local method listByDataCenterIdVMTypeAndStates
+        this.mockPods.add(this.mockHostPodVO1);
+        this.mockPods.add(this.mockHostPodVO2);
+        // Deployment under test is a Mockito spy
+        RouterDeploymentDefinition deploymentUT = Mockito.spy(this.deployment);
+        
doReturn(mockPods).when(deploymentUT).listByDataCenterIdVMTypeAndStates(
+                DATA_CENTER_ID, VirtualMachine.Type.User,
+                VirtualMachine.State.Starting, VirtualMachine.State.Running);
+
+        // Leave this one empty to force adding add destination for this pod
+        List<DomainRouterVO> virtualRouters1 = new ArrayList<>();
+        when(this.mockRouterDao.listByPodIdAndStates(POD_ID1,
+                VirtualMachine.State.Starting, 
VirtualMachine.State.Running)).thenReturn(virtualRouters1);
+
+        // This list is not empty, so it will not add any for this pod, and 
continue with next pod
+        List<DomainRouterVO> virtualRouters2 = new ArrayList<>();
+        DomainRouterVO domainRouterVO1 = mock(DomainRouterVO.class);
+        DomainRouterVO domainRouterVO2 = mock(DomainRouterVO.class);
+        virtualRouters2.add(domainRouterVO1);
+        virtualRouters2.add(domainRouterVO2);
+        when(this.mockRouterDao.listByPodIdAndStates(POD_ID2,
+                VirtualMachine.State.Starting, 
VirtualMachine.State.Running)).thenReturn(virtualRouters2);
+
+        // Execute
+        deploymentUT.findDestinations();
+
+        // Assert by expected exception
+    }
+
+    @Test
+    public void testPlanDeploymentRoutersBasic() {
+        // Prepare
+        
when(this.mockDataCenter.getNetworkType()).thenReturn(NetworkType.Basic);
+        when(this.mockDestination.getPod()).thenReturn(this.mockPod);
+
+        // Execute
+        this.deployment.planDeploymentRouters();
+
+        // Assert
+        verify(this.mockRouterDao, 
times(1)).listByNetworkAndPodAndRole(this.mockNw.getId(),
+                POD_ID1, Role.VIRTUAL_ROUTER);
+    }
+
+    @Test
+    public void testPlanDeploymentRoutersNonBasic() {
+        // Prepare
+        when(mockDataCenter.getNetworkType()).thenReturn(NetworkType.Advanced);
+        when(this.mockDestination.getPod()).thenReturn(this.mockPod);
+
+        // Execute
+        this.deployment.planDeploymentRouters();
+
+        // Assert
+        verify(this.mockRouterDao, times(1)).listByNetworkAndRole(
+                this.mockNw.getId(), Role.VIRTUAL_ROUTER);
+    }
+
     @Test
     public void testListByDataCenterIdVMTypeAndStates() {
-        // TODO Implement this test
+        // Prepare
+        VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class);
+        final SearchBuilder<VMInstanceVO> vmInstanceSearch = 
mock(SearchBuilder.class);
+        
when(this.mockVmDao.createSearchBuilder()).thenReturn(vmInstanceSearch);
+        when(vmInstanceSearch.entity()).thenReturn(vmInstanceVO);
+        when(vmInstanceVO.getType()).thenReturn(VirtualMachine.Type.Instance);
+        when(vmInstanceVO.getState()).thenReturn(VirtualMachine.State.Stopped);
+        when(vmInstanceVO.getPodIdToDeployIn()).thenReturn(POD_ID1);
+
+        final SearchBuilder<HostPodVO> podIdSearch = mock(SearchBuilder.class);
+        when(this.mockPodDao.createSearchBuilder()).thenReturn(podIdSearch);
+        final SearchCriteria<HostPodVO> sc = mock(SearchCriteria.class);
+        HostPodVO hostPodVO = mock(HostPodVO.class);
+        when(podIdSearch.entity()).thenReturn(hostPodVO);
+        when(hostPodVO.getId()).thenReturn(POD_ID1);
+        when(hostPodVO.getDataCenterId()).thenReturn(DATA_CENTER_ID);
+        when(podIdSearch.create()).thenReturn(sc);
+
+        final List<HostPodVO> expectedPods = mock(List.class);
+        when(this.mockPodDao.search(sc, null)).thenReturn(expectedPods);
+
+        // Execute
+        final List<HostPodVO> pods = 
this.deployment.listByDataCenterIdVMTypeAndStates(DATA_CENTER_ID,
+                VirtualMachine.Type.User,
+                VirtualMachine.State.Starting,
+                VirtualMachine.State.Running);
+
+        // Assert
+        assertNotNull(pods);
+        assertEquals(expectedPods, pods);
+        verify(sc, times(1)).setParameters("dc", DATA_CENTER_ID);
+        verify(sc, times(1)).setJoinParameters("vmInstanceSearch", "type", 
VirtualMachine.Type.User);
+        verify(sc, times(1)).setJoinParameters("vmInstanceSearch", "states",
+                VirtualMachine.State.Starting, VirtualMachine.State.Running);
+        verify(this.mockPodDao, times(1)).search(sc, null);
     }
 
     @Test
-    public void testFindOrDeployVirtualRouter() {
-        // TODO Implement this test
+    public void testFindOrDeployVirtualRouter() throws 
ConcurrentOperationException,
+    InsufficientCapacityException, ResourceUnavailableException {
+        // Prepare
+        RouterDeploymentDefinition deploymentUT = spy(this.deployment);
+        doNothing().when(deploymentUT).findOrDeployVirtualRouter();
+
+        // Execute
+        deploymentUT.deployVirtualRouter();
+
+        // Assert
+        verify(this.mockNetworkGeneralHelper, 
times(1)).startRouters(deploymentUT);
     }
 
+    @Test(expected = ConcurrentOperationException.class)
+    public void testDeployVirtualRouter() throws ConcurrentOperationException,
+            InsufficientCapacityException, ResourceUnavailableException {
+
+        // Prepare
+        List<DeployDestination> mockDestinations = new ArrayList<>();
+        mockDestinations.add(mock(DeployDestination.class));
+        mockDestinations.add(mock(DeployDestination.class));
+
+        RouterDeploymentDefinition deploymentUT = spy(this.deployment);
+        doNothing().when(deploymentUT).lock();
+        doNothing().when(deploymentUT).checkPreconditions();
+        doReturn(mockDestinations).when(deploymentUT).findDestinations();
+        doNothing().when(deploymentUT).planDeploymentRouters();
+        doNothing().when(deploymentUT).generateDeploymentPlan();
+        // Let's test that if the last step fails in the last iteration it 
unlocks the table
+        ConcurrentOperationException exception =
+                new ConcurrentOperationException(null);
+        doNothing().doThrow(exception).when(deploymentUT).executeDeployment();
+        doNothing().when(deploymentUT).unlock();
+
+        // Execute
+        try {
+            deploymentUT.findOrDeployVirtualRouter();
+        } catch (ConcurrentOperationException e) {
+            throw e;
+        } finally {
+            // Assert
+            verify(deploymentUT, times(1)).lock();
+            verify(deploymentUT, times(1)).checkPreconditions();
+            verify(deploymentUT, times(1)).findDestinations();
+            verify(deploymentUT, times(2)).planDeploymentRouters();
+            verify(deploymentUT, times(2)).generateDeploymentPlan();
+            verify(deploymentUT, times(2)).executeDeployment();
+            verify(deploymentUT, times(1)).unlock();
+        }
+
+        fail();
+    }
+
+    /**
+     * If any router is NOT redundant, then it shouldn't update routers
+     */
     @Test
-    public void testDeployVirtualRouter() {
-        // TODO Implement this test
+    public void testSetupPriorityOfRedundantRouterWithNonRedundantRouters() {
+        // Prepare
+        this.deployment.routers = new ArrayList<>();
+        final DomainRouterVO routerVO1 = mock(DomainRouterVO.class);
+        this.deployment.routers.add(routerVO1);
+        when(routerVO1.getIsRedundantRouter()).thenReturn(true);
+        when(routerVO1.getState()).thenReturn(VirtualMachine.State.Stopped);
+        final DomainRouterVO routerVO2 = mock(DomainRouterVO.class);
+        this.deployment.routers.add(routerVO2);
+        when(routerVO2.getIsRedundantRouter()).thenReturn(false);
+        when(routerVO2.getState()).thenReturn(VirtualMachine.State.Stopped);
+        // If this deployment is not redundant nothing will be executed
+        this.deployment.isRedundant = true;
+
+        // Execute
+        this.deployment.setupPriorityOfRedundantRouter();
+
+        // Assert
+        verify(routerVO1, times(0)).setPriority(anyInt());
+        verify(routerVO1, times(0)).setIsPriorityBumpUp(anyBoolean());
+        verify(this.mockRouterDao, times(0)).update(anyLong(), 
(DomainRouterVO) anyObject());
     }
 
+    /**
+     * If any router is NOT Stopped, then it shouldn't update routers
+     */
     @Test
-    public void testExecuteDeployment() {
-        // TODO Implement this test
+    public void testSetupPriorityOfRedundantRouterWithRunningRouters() {
+        // Prepare
+        this.deployment.routers = new ArrayList<>();
+        final DomainRouterVO routerVO1 = mock(DomainRouterVO.class);
+        this.deployment.routers.add(routerVO1);
+        when(routerVO1.getIsRedundantRouter()).thenReturn(true);
+        when(routerVO1.getState()).thenReturn(VirtualMachine.State.Stopped);
+        final DomainRouterVO routerVO2 = mock(DomainRouterVO.class);
+        this.deployment.routers.add(routerVO2);
+        when(routerVO2.getIsRedundantRouter()).thenReturn(true);
+        when(routerVO2.getState()).thenReturn(VirtualMachine.State.Running);
+        // If this deployment is not redundant nothing will be executed
+        this.deployment.isRedundant = true;
+
+        // Execute
+        this.deployment.setupPriorityOfRedundantRouter();
+
+        // Assert
+        verify(routerVO1, times(0)).setPriority(anyInt());
+        verify(routerVO1, times(0)).setIsPriorityBumpUp(anyBoolean());
+        verify(this.mockRouterDao, times(0)).update(anyLong(), 
(DomainRouterVO) anyObject());
     }
 
+    /**
+     * Given all routers are redundant and Stopped, then it should update ALL 
routers
+     */
     @Test
-    public void testPlanDeploymentRouters() {
-        // TODO Implement this test
+    public void testSetupPriorityOfRedundantRouter() {
+        // Prepare
+        this.deployment.routers = new ArrayList<>();
+        final DomainRouterVO routerVO1 = mock(DomainRouterVO.class);
+        this.deployment.routers.add(routerVO1);
+        when(routerVO1.getId()).thenReturn(ROUTER1_ID);
+        when(routerVO1.getIsRedundantRouter()).thenReturn(true);
+        when(routerVO1.getState()).thenReturn(VirtualMachine.State.Stopped);
+        final DomainRouterVO routerVO2 = mock(DomainRouterVO.class);
+        this.deployment.routers.add(routerVO2);
+        when(routerVO2.getId()).thenReturn(ROUTER2_ID);
+        when(routerVO2.getIsRedundantRouter()).thenReturn(true);
+        when(routerVO2.getState()).thenReturn(VirtualMachine.State.Stopped);
+        // If this deployment is not redundant nothing will be executed
+        this.deployment.isRedundant = true;
+
+        // Execute
+        this.deployment.setupPriorityOfRedundantRouter();
+
+        // Assert
+        verify(routerVO1, times(1)).setPriority(0);
+        verify(routerVO1, times(1)).setIsPriorityBumpUp(false);
+        verify(this.mockRouterDao, times(1)).update(ROUTER1_ID, routerVO1);
+        verify(routerVO2, times(1)).setPriority(0);
+        verify(routerVO2, times(1)).setIsPriorityBumpUp(false);
+        verify(this.mockRouterDao, times(1)).update(ROUTER2_ID, routerVO2);
+    }
+
+    /**
+     * If this is not a redundant deployment, then we shouldn't reset 
priorities
+     */
+    @Test
+    public void testSetupPriorityOfRedundantRouterWithNonRedundantDeployment() 
{
+        // Prepare
+        this.deployment.routers = new ArrayList<>();
+        final DomainRouterVO routerVO1 = mock(DomainRouterVO.class);
+        this.deployment.routers.add(routerVO1);
+        when(routerVO1.getIsRedundantRouter()).thenReturn(true);
+        when(routerVO1.getState()).thenReturn(VirtualMachine.State.Stopped);
+        final DomainRouterVO routerVO2 = mock(DomainRouterVO.class);
+        this.deployment.routers.add(routerVO2);
+        when(routerVO2.getIsRedundantRouter()).thenReturn(true);
+        when(routerVO2.getState()).thenReturn(VirtualMachine.State.Stopped);
+
+        // Execute
+        this.deployment.setupPriorityOfRedundantRouter();
+
+        // Assert
+        verify(routerVO1, times(0)).setPriority(anyInt());
+        verify(routerVO1, times(0)).setIsPriorityBumpUp(anyBoolean());
+        verify(this.mockRouterDao, times(0)).update(anyLong(), 
(DomainRouterVO) anyObject());
+    }
+
+    @Test
+    public void testGetNumberOfRoutersToDeploy() {
+        // Prepare
+        this.deployment.routers = new ArrayList<>(); // Empty list
+
+        // Execute and assert
+        assertEquals(NUMBER_OF_ROUTERS_TO_DEPLOY_IS_NOT_THE_EXPECTED,
+                1, this.deployment.getNumberOfRoutersToDeploy());
+
+        // Execute and assert, just the same but for redundant deployment
+        this.deployment.isRedundant = true;
+        assertEquals(NUMBER_OF_ROUTERS_TO_DEPLOY_IS_NOT_THE_EXPECTED,
+                2, this.deployment.getNumberOfRoutersToDeploy());
+
+        // Just the same, instead of an empty list, a 1 items list
+        this.deployment.routers.add(mock(DomainRouterVO.class));
+        this.deployment.isRedundant = false;
+        assertEquals(NUMBER_OF_ROUTERS_TO_DEPLOY_IS_NOT_THE_EXPECTED,
+                0, this.deployment.getNumberOfRoutersToDeploy());
+
+        this.deployment.isRedundant = true;
+        assertEquals(NUMBER_OF_ROUTERS_TO_DEPLOY_IS_NOT_THE_EXPECTED,
+                1, this.deployment.getNumberOfRoutersToDeploy());
+    }
+
+    @Test
+    public void testFindVirtualProvider() {
+        // Prepare
+        
when(this.mockNetworkModel.getPhysicalNetworkId(this.deployment.guestNetwork)).thenReturn(PHYSICAL_NW_ID);
+        Type type = Type.VirtualRouter;
+        PhysicalNetworkServiceProviderVO physicalNwSrvProvider = 
mock(PhysicalNetworkServiceProviderVO.class);
+        when(this.physicalProviderDao.findByServiceProvider(PHYSICAL_NW_ID, 
type.toString()))
+            .thenReturn(physicalNwSrvProvider);
+        when(physicalNwSrvProvider.getId()).thenReturn(PROVIDER_ID);
+
+        VirtualRouterProviderVO vrProvider = 
mock(VirtualRouterProviderVO.class);
+        when(this.mockVrProviderDao.findByNspIdAndType(PROVIDER_ID, type))
+            .thenReturn(vrProvider);
+
+        // Execute
+        this.deployment.findVirtualProvider();
+
+        // Assert
+        assertEquals("Didn't find and set the VirtualRouterProvider as 
expected",
+                vrProvider, this.deployment.getVirtualProvider());
+    }
+
+    @Test(expected = CloudRuntimeException.class)
+    public void testFindVirtualProviderWithNullPhyNwSrvProvider() {
+        // Prepare
+        
when(this.mockNetworkModel.getPhysicalNetworkId(this.deployment.guestNetwork)).thenReturn(PHYSICAL_NW_ID);
+        Type type = Type.VirtualRouter;
+        when(this.physicalProviderDao.findByServiceProvider(PHYSICAL_NW_ID, 
type.toString()))
+            .thenReturn(null);
+
+        // Execute
+        this.deployment.findVirtualProvider();
+    }
+
+    @Test(expected = CloudRuntimeException.class)
+    public void testFindVirtualProviderWithNullVrProvider() {
+        // Prepare
+        
when(this.mockNetworkModel.getPhysicalNetworkId(this.deployment.guestNetwork)).thenReturn(PHYSICAL_NW_ID);
+        Type type = Type.VirtualRouter;
+        PhysicalNetworkServiceProviderVO physicalNwSrvProvider = 
mock(PhysicalNetworkServiceProviderVO.class);
+        when(this.physicalProviderDao.findByServiceProvider(PHYSICAL_NW_ID, 
type.toString()))
+            .thenReturn(physicalNwSrvProvider);
+        when(physicalNwSrvProvider.getId()).thenReturn(PROVIDER_ID);
+
+        when(this.mockVrProviderDao.findByNspIdAndType(PROVIDER_ID, type))
+            .thenReturn(null);
+
+        // Execute
+        this.deployment.findVirtualProvider();
+    }
+
+    @Test
+    public void testFindSourceNatIPPublicNw() throws 
InsufficientAddressCapacityException, ConcurrentOperationException {
+        // Prepare
+        PublicIp sourceNatIp = mock(PublicIp.class);
+        when(this.mockIpAddrMgr.assignSourceNatIpAddressToGuestNetwork(
+                this.mockOwner, this.mockNw)).thenReturn(sourceNatIp);
+        this.deployment.publicNetwork = true;
+
+        // It should be null until this method finds it
+        assertNull(this.deployment.sourceNatIp);
+        // Execute
+        this.deployment.findSourceNatIP();
+
+        // Assert
+        assertEquals("SourceNatIP was not correctly found and set", 
sourceNatIp, this.deployment.sourceNatIp);
+    }
+
+    @Test
+    public void testFindSourceNatIPNonPublicNw() throws 
InsufficientAddressCapacityException, ConcurrentOperationException {
+        // Prepare
+        PublicIp sourceNatIp = mock(PublicIp.class);
+        when(this.mockIpAddrMgr.assignSourceNatIpAddressToGuestNetwork(
+                this.mockOwner, this.mockNw)).thenReturn(sourceNatIp);
+        this.deployment.publicNetwork = false;
+
+        // It should be null until this method finds it
+        assertNull(this.deployment.sourceNatIp);
+        // Execute
+        this.deployment.findSourceNatIP();
+
+        // Assert
+        assertEquals("SourceNatIP should remain null given a non public 
network",
+                null, this.deployment.sourceNatIp);
+    }
+
+    @Test
+    public void testFindOfferingIdReceivingNewOne() {
+        // Prepare
+        this.deployment.offeringId = 1L;
+        when(this.mockNw.getNetworkOfferingId()).thenReturn(OFFERING_ID);
+        
when(this.mockNetworkOfferingDao.findById(OFFERING_ID)).thenReturn(this.mockNwOfferingVO);
+        
when(this.mockNwOfferingVO.getServiceOfferingId()).thenReturn(OFFERING_ID);
+
+        // Execute
+        this.deployment.findOfferingId();
+
+        // Assert
+        assertEquals("Given that no Offering was found, the previous Offering 
Id should be kept",
+                OFFERING_ID, this.deployment.offeringId.longValue());
+    }
+
+    @Test
+    public void testFindOfferingIdReceivingKeepingPrevious() {
+        // Prepare
+        this.deployment.offeringId = 1L;
+        when(this.mockNw.getNetworkOfferingId()).thenReturn(OFFERING_ID);
+        
when(this.mockNetworkOfferingDao.findById(OFFERING_ID)).thenReturn(this.mockNwOfferingVO);
+        when(this.mockNwOfferingVO.getServiceOfferingId()).thenReturn(null);
+
+        // Execute
+        this.deployment.findOfferingId();
+
+        // Assert
+        assertEquals("Found Offering Id didn't replace previous one",
+                1L, this.deployment.offeringId.longValue());
+    }
+
+    @Test
+    public void testDeployAllVirtualRouters()
+            throws ConcurrentOperationException, 
InsufficientCapacityException, ResourceUnavailableException {
+
+        // Prepare
+        this.deployment.routers = new ArrayList<>();
+        this.deployment.isRedundant = true;
+        //this.deployment.routers.add(routerVO1);
+        RouterDeploymentDefinition deploymentUT = Mockito.spy(this.deployment);
+        doReturn(2).when(deploymentUT).getNumberOfRoutersToDeploy();
+        doReturn(null).when(deploymentUT).createRouterNetworks();
+
+        final DomainRouterVO routerVO1 = mock(DomainRouterVO.class);
+        final DomainRouterVO routerVO2 = mock(DomainRouterVO.class);
+        when(this.mockNetworkGeneralHelper.deployRouter(deploymentUT, null, 
false, null))
+            .thenReturn(routerVO1).thenReturn(routerVO2);
+
+        // Execute
+        deploymentUT.deployAllVirtualRouters();
+
+        // Assert
+        verify(this.mockRouterDao, 
times(1)).addRouterToGuestNetwork(routerVO1, this.mockNw);
+        verify(this.mockRouterDao, 
times(1)).addRouterToGuestNetwork(routerVO2, this.mockNw);
+        assertEquals("First router to deploy was not added to list of 
available routers",
+                routerVO1, this.deployment.routers.get(0));
+        assertEquals("Second router to deploy was not added to list of 
available routers",
+                routerVO2, this.deployment.routers.get(1));
+    }
+
+    @Test
+    public void testExecuteDeploymentPublicNw()
+            throws ConcurrentOperationException, 
InsufficientCapacityException, ResourceUnavailableException {
+        // Prepare
+        this.deployment.isRedundant = true;
+        RouterDeploymentDefinition deploymentUT = Mockito.spy(this.deployment);
+        doNothing().when(deploymentUT).setupPriorityOfRedundantRouter();
+        doReturn(2).when(deploymentUT).getNumberOfRoutersToDeploy();
+        doNothing().when(deploymentUT).findVirtualProvider();
+        doNothing().when(deploymentUT).findOfferingId();
+        doNothing().when(deploymentUT).findSourceNatIP();
+        doNothing().when(deploymentUT).deployAllVirtualRouters();
+
+        
when(this.mockNetworkModel.isNetworkSystem(this.mockNw)).thenReturn(true);
+        Account newAccountOwner = mock(Account.class);
+        
when(this.mockAccountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM)).thenReturn(newAccountOwner);
+
+        when(this.mockNetworkModel.isProviderSupportServiceInNetwork(
+                            NW_ID, Service.SourceNat, 
Provider.VirtualRouter)).thenReturn(true);
+
+        // Execute
+        deploymentUT.executeDeployment();
+
+        // Assert
+        assertEquals("New account owner not properly set", newAccountOwner, 
deploymentUT.owner);
+        verify(deploymentUT, times(1)).findVirtualProvider();
+        verify(deploymentUT, times(1)).findOfferingId();
+        verify(deploymentUT, times(1)).findSourceNatIP();
+        verify(deploymentUT, times(1)).deployAllVirtualRouters();
+    }
+
+    @Test
+    public void testExecuteDeploymentNonRedundant()
+            throws ConcurrentOperationException, 
InsufficientCapacityException, ResourceUnavailableException {
+        // Prepare
+        this.deployment.isRedundant = false;
+        RouterDeploymentDefinition deploymentUT = Mockito.spy(this.deployment);
+        doNothing().when(deploymentUT).setupPriorityOfRedundantRouter();
+        doReturn(2).when(deploymentUT).getNumberOfRoutersToDeploy();
+        doNothing().when(deploymentUT).findVirtualProvider();
+        doNothing().when(deploymentUT).findOfferingId();
+        doNothing().when(deploymentUT).findSourceNatIP();
+        doNothing().when(deploymentUT).deployAllVirtualRouters();
+
+        
when(this.mockNetworkModel.isNetworkSystem(this.mockNw)).thenReturn(true);
+        Account newAccountOwner = mock(Account.class);
+        
when(this.mockAccountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM)).thenReturn(newAccountOwner);
+
+        when(this.mockNetworkModel.isProviderSupportServiceInNetwork(
+                            NW_ID, Service.SourceNat, 
Provider.VirtualRouter)).thenReturn(true);
+
+        // Execute
+        deploymentUT.executeDeployment();
+
+        // Assert
+        assertEquals("New account owner not properly set", newAccountOwner, 
deploymentUT.owner);
+        verify(deploymentUT, times(1)).findVirtualProvider();
+        verify(deploymentUT, times(1)).findOfferingId();
+        verify(deploymentUT, times(1)).findSourceNatIP();
+        verify(deploymentUT, times(1)).deployAllVirtualRouters();
+    }
+
+    @Test
+    public void testExecuteDeploymentRedundantNonPublicNw()
+            throws ConcurrentOperationException, 
InsufficientCapacityException, ResourceUnavailableException {
+        // Prepare
+        this.deployment.isRedundant = true;
+        RouterDeploymentDefinition deploymentUT = Mockito.spy(this.deployment);
+        doNothing().when(deploymentUT).setupPriorityOfRedundantRouter();
+        doReturn(2).when(deploymentUT).getNumberOfRoutersToDeploy();
+        doNothing().when(deploymentUT).findVirtualProvider();
+        doNothing().when(deploymentUT).findOfferingId();
+        doNothing().when(deploymentUT).findSourceNatIP();
+        doNothing().when(deploymentUT).deployAllVirtualRouters();
+
+        
when(this.mockNetworkModel.isNetworkSystem(this.mockNw)).thenReturn(true);
+        Account newAccountOwner = mock(Account.class);
+        
when(this.mockAccountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM)).thenReturn(newAccountOwner);
+
+        when(this.mockNetworkModel.isProviderSupportServiceInNetwork(
+                            NW_ID, Service.SourceNat, 
Provider.VirtualRouter)).thenReturn(false);
+
+        // Execute
+        deploymentUT.executeDeployment();
+
+        // Assert
+        assertEquals("New account owner not properly set", newAccountOwner, 
deploymentUT.owner);
+        assertEquals("Since is redundant deployment in non public nw there 
should be 0 routers to start",
+                0, this.deployment.routers.size());
+        verify(this.mockNetworkModel, times(1)).isNetworkSystem(this.mockNw);
+        verify(deploymentUT, times(0)).findVirtualProvider();
+        verify(deploymentUT, times(0)).findOfferingId();
+        verify(deploymentUT, times(0)).findSourceNatIP();
+        verify(deploymentUT, times(0)).deployAllVirtualRouters();
+    }
+
+    @Test
+    public void testExecuteDeploymentNoRoutersToDeploy()
+            throws ConcurrentOperationException, 
InsufficientCapacityException, ResourceUnavailableException {
+        // Prepare
+        this.deployment.isRedundant = true;
+        this.deployment.publicNetwork = false;
+        RouterDeploymentDefinition deploymentUT = Mockito.spy(this.deployment);
+        doNothing().when(deploymentUT).setupPriorityOfRedundantRouter();
+        doReturn(0).when(deploymentUT).getNumberOfRoutersToDeploy();
+        doNothing().when(deploymentUT).findVirtualProvider();
+        doNothing().when(deploymentUT).findOfferingId();
+        doNothing().when(deploymentUT).findSourceNatIP();
+        doNothing().when(deploymentUT).deployAllVirtualRouters();
+
+        // Execute
+        deploymentUT.executeDeployment();
+
+        // Assert
+        assertEquals("New account owner not properly set", this.mockOwner, 
deploymentUT.owner);
+        verify(this.mockNetworkModel, 
times(0)).isNetworkSystem((Network)anyObject());
+        verify(deploymentUT, times(0)).findVirtualProvider();
+        verify(deploymentUT, times(0)).findOfferingId();
+        verify(deploymentUT, times(0)).findSourceNatIP();
+        verify(deploymentUT, times(0)).deployAllVirtualRouters();
     }
 
     @Test

Reply via email to