cloudstack-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CLOUDSTACK-10377) Nuage VSP regression fails in NetworksWithCleanup test since introduction of fix for CLOUDSTACK-9114 in ACS 4.11&master
Date Wed, 06 Jun 2018 06:48:00 GMT

    [ https://issues.apache.org/jira/browse/CLOUDSTACK-10377?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16502880#comment-16502880 ] 

ASF GitHub Bot commented on CLOUDSTACK-10377:
---------------------------------------------

rhtyd closed pull request #2672: CLOUDSTACK-10377: Fix Network restart for Nuage
URL: https://github.com/apache/cloudstack/pull/2672
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/api/src/com/cloud/vm/VirtualMachineProfile.java b/api/src/com/cloud/vm/VirtualMachineProfile.java
index ed02dcb9c67..977e27eb14f 100644
--- a/api/src/com/cloud/vm/VirtualMachineProfile.java
+++ b/api/src/com/cloud/vm/VirtualMachineProfile.java
@@ -56,6 +56,7 @@
         public static final Param VmSshPubKey = new Param("VmSshPubKey");
         public static final Param ControlNic = new Param("ControlNic");
         public static final Param ReProgramGuestNetworks = new Param("RestartNetwork");
+        public static final Param RollingRestart = new Param("RollingRestart");
         public static final Param PxeSeverType = new Param("PxeSeverType");
         public static final Param HaTag = new Param("HaTag");
         public static final Param HaOperation = new Param("HaOperation");
@@ -173,4 +174,6 @@ public boolean equals(Object obj) {
 
     Float getMemoryOvercommitRatio();
 
+    boolean isRollingRestart();
+
 }
diff --git a/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java b/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java
index 0afca735a13..4d03396c1cb 100644
--- a/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java
+++ b/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java
@@ -263,6 +263,11 @@ public Float getMemoryOvercommitRatio() {
         return memoryOvercommitRatio;
     }
 
+    @Override
+    public boolean isRollingRestart() {
+        return Boolean.TRUE.equals(getParameter(VirtualMachineProfile.Param.RollingRestart));
+    }
+
     @Override
     public List<String[]> getVmData() {
         return vmData;
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/element/NuageVspElement.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/element/NuageVspElement.java
index d5496b0157a..48c3d88d0d0 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/element/NuageVspElement.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/element/NuageVspElement.java
@@ -54,6 +54,7 @@
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
 import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupVspCommand;
 import com.cloud.agent.api.element.ApplyAclRuleVspCommand;
@@ -289,14 +290,41 @@ public boolean implement(Network network, NetworkOffering offering, DeployDestin
         VspDhcpDomainOption vspDhcpOptions = _nuageVspEntityBuilder.buildNetworkDhcpOption(network, offering);
         HostVO nuageVspHost = _nuageVspManager.getNuageVspHost(network.getPhysicalNetworkId());
         ImplementVspCommand cmd = new ImplementVspCommand(vspNetwork, ingressFirewallRules, egressFirewallRules, floatingIpUuids, vspDhcpOptions);
+        send(cmd, network);
+
+        return true;
+    }
+
+    private void send(Command cmd, Network network)
+            throws ResourceUnavailableException {
+        send(cmd, network.getPhysicalNetworkId(), Network.class, network);
+    }
+
+    private void send(Command cmd, Vpc vpc)
+            throws ResourceUnavailableException {
+        send(cmd, getPhysicalNetworkId(vpc.getZoneId()), Vpc.class, vpc);
+    }
+
+
+    private <R extends InternalIdentity> void send(Command cmd, long physicalNetworkId, Class<R> resourceClass,
+            R resource)
+            throws ResourceUnavailableException {
+        HostVO nuageVspHost = _nuageVspManager.getNuageVspHost(physicalNetworkId);
         Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd);
-        if (answer == null || !answer.getResult()) {
-            s_logger.error("ImplementVspCommand for network " + network.getUuid() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname"));
-            if ((null != answer) && (null != answer.getDetails())) {
-                throw new ResourceUnavailableException(answer.getDetails(), Network.class, network.getId());
+        if (isFailure(answer)) {
+            s_logger.error(cmd.getClass().getName() + " for " + resourceClass.getName() + " " + resource.getId() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname"));
+            if (hasFailureDetails(answer)) {
+                throw new ResourceUnavailableException(answer.getDetails(), resourceClass, resource.getId());
             }
         }
-        return true;
+    }
+
+    private boolean hasFailureDetails(Answer answer) {
+        return (null != answer) && (null != answer.getDetails());
+    }
+
+    private boolean isFailure(Answer answer) {
+        return answer == null || !answer.getResult();
     }
 
     private boolean applyACLRulesForVpc(Network network, NetworkOffering offering) throws ResourceUnavailableException {
@@ -358,15 +386,9 @@ public boolean shutdown(Network network, ReservationContext context, boolean cle
             NetworkOfferingVO networkOfferingVO = _ntwkOfferingDao.findById(network.getNetworkOfferingId());
             VspDhcpDomainOption vspDhcpOptions = _nuageVspEntityBuilder.buildNetworkDhcpOption(network, networkOfferingVO);
             VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(network);
-            HostVO nuageVspHost = _nuageVspManager.getNuageVspHost(network.getPhysicalNetworkId());
+
             ShutDownVspCommand cmd = new ShutDownVspCommand(vspNetwork, vspDhcpOptions);
-            Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd);
-            if (answer == null || !answer.getResult()) {
-                s_logger.error("ShutDownVspCommand for network " + network.getUuid() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname"));
-                if ((null != answer) && (null != answer.getDetails())) {
-                    throw new ResourceUnavailableException(answer.getDetails(), Network.class, network.getId());
-                }
-            }
+            send(cmd, network);
         }
         return true;
     }
@@ -501,14 +523,17 @@ public boolean removeDhcpSupportForSubnet(Network network) throws ResourceUnavai
 
     @Override
     public boolean setExtraDhcpOptions(Network network, long nicId, Map<Integer, String> dhcpOptions) {
+        if (network.isRollingRestart()) {
+            return true;
+        }
+
         VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(network);
         HostVO nuageVspHost = _nuageVspManager.getNuageVspHost(network.getPhysicalNetworkId());
         NicVO nic = _nicDao.findById(nicId);
 
         ExtraDhcpOptionsVspCommand extraDhcpOptionsVspCommand = new ExtraDhcpOptionsVspCommand(vspNetwork, nic.getUuid(), dhcpOptions);
         Answer answer = _agentMgr.easySend(nuageVspHost.getId(), extraDhcpOptionsVspCommand);
-
-        if (answer == null || !answer.getResult()) {
+        if (isFailure(answer)) {
             s_logger.error("[setExtraDhcpOptions] setting extra DHCP options for nic " + nic.getUuid() + " failed.");
             return false;
         }
@@ -539,15 +564,9 @@ public boolean applyStaticNats(Network config, List<? extends StaticNat> rules)
         }
 
         VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(config);
-        HostVO nuageVspHost = _nuageVspManager.getNuageVspHost(config.getPhysicalNetworkId());
         ApplyStaticNatVspCommand cmd = new ApplyStaticNatVspCommand(vspNetwork, vspStaticNatDetails);
-        Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd);
-        if (answer == null || !answer.getResult()) {
-            s_logger.error("ApplyStaticNatNuageVspCommand for network " + config.getUuid() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname"));
-            if ((null != answer) && (null != answer.getDetails())) {
-                throw new ResourceUnavailableException(answer.getDetails(), Network.class, config.getId());
-            }
-        }
+        send(cmd,
+             config);
 
         return true;
     }
@@ -611,16 +630,10 @@ public VspAclRule apply(@Nullable InternalIdentity input) {
             }
         });
 
-        HostVO nuageVspHost = _nuageVspManager.getNuageVspHost(network.getPhysicalNetworkId());
         VspAclRule.ACLType vspAclType = isNetworkAcl ? VspAclRule.ACLType.NetworkACL : VspAclRule.ACLType.Firewall;
         ApplyAclRuleVspCommand cmd = new ApplyAclRuleVspCommand(vspAclType, vspNetwork, vspAclRules, networkReset);
-        Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd);
-        if (answer == null || !answer.getResult()) {
-            s_logger.error("ApplyAclRuleNuageVspCommand for network " + network.getUuid() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname"));
-            if ((null != answer) && (null != answer.getDetails())) {
-                throw new ResourceUnavailableException(answer.getDetails(), Network.class, network.getId());
-            }
-        }
+        send(cmd,
+             network);
         return true;
     }
 
@@ -686,7 +699,6 @@ public String apply(@Nullable DomainRouterVO input) {
             });
 
             Domain vpcDomain = _domainDao.findById(vpc.getDomainId());
-            HostVO nuageVspHost = _nuageVspManager.getNuageVspHost(getPhysicalNetworkId(vpc.getZoneId()));
 
             String preConfiguredDomainTemplateName;
             VpcDetailVO domainTemplateNameDetail = _vpcDetailsDao.findDetail(vpc.getId(), NuageVspManager.nuageDomainTemplateDetailName);
@@ -710,14 +722,7 @@ public String apply(@Nullable DomainRouterVO input) {
             }
 
             ShutDownVpcVspCommand cmd = new ShutDownVpcVspCommand(vpcDomain.getUuid(), vpc.getUuid(), preConfiguredDomainTemplateName, domainRouterUuids, vpcDetails);
-            Answer answer =  _agentMgr.easySend(nuageVspHost.getId(), cmd);
-            if (answer == null || !answer.getResult()) {
-                s_logger.error("ShutDownVpcVspCommand for VPC " + vpc.getUuid() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname"));
-                if ((null != answer) && (null != answer.getDetails())) {
-                    throw new ResourceUnavailableException(answer.getDetails(), Vpc.class, vpc.getId());
-                }
-                return false;
-            }
+            send(cmd, vpc);
         }
         return true;
     }
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java
index 9ecefe49087..8d53f0f4268 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java
@@ -82,6 +82,7 @@
 import com.cloud.network.dao.NetworkVO;
 import com.cloud.network.dao.PhysicalNetworkVO;
 import com.cloud.network.manager.NuageVspManager;
+import com.cloud.network.router.VirtualRouter;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.dao.NetworkOfferingDao;
 import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
@@ -94,6 +95,7 @@
 import com.cloud.utils.db.DB;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.Ip;
+import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.Nic;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.NicVO;
@@ -101,6 +103,7 @@
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.dao.DomainRouterDao;
 import com.cloud.vm.dao.VMInstanceDao;
 
 public class NuageVspGuestNetworkGuru extends GuestNetworkGuru implements NetworkGuruAdditionalFunctions {
@@ -134,6 +137,8 @@
     DataCenterDetailsDao _dcDetailsDao;
     @Inject
     VlanDetailsDao _vlanDetailsDao;
+    @Inject
+    private DomainRouterDao _routerDao;
 
     public NuageVspGuestNetworkGuru() {
         super();
@@ -528,29 +533,34 @@ public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, D
             nic.setBroadcastUri(network.getBroadcastUri());
             nic.setIsolationUri(network.getBroadcastUri());
 
-            //NicProfile does not contain the NIC UUID. We need this information to set it in the VMInterface and VPort
-            //that we create in VSP
-            NicVO nicFromDb = _nicDao.findById(nic.getId());
-            IPAddressVO staticNatIp = _ipAddressDao.findByVmIdAndNetworkId(network.getId(), vm.getId());
             VspVm vspVm = _nuageVspEntityBuilder.buildVspVm(vm.getVirtualMachine(), network);
-            VspNic vspNic = _nuageVspEntityBuilder.buildVspNic(nicFromDb.getUuid(), nic);
-            VspStaticNat vspStaticNat = null;
-            if (staticNatIp != null) {
-                VlanVO staticNatVlan = _vlanDao.findById(staticNatIp.getVlanId());
-                vspStaticNat = _nuageVspEntityBuilder.buildVspStaticNat(null, staticNatIp, staticNatVlan, vspNic);
-            }
 
-            boolean defaultHasDns = getDefaultHasDns(networkHasDnsCache, nicFromDb);
-            VspDhcpVMOption dhcpOption = _nuageVspEntityBuilder.buildVmDhcpOption(nicFromDb, defaultHasDns, networkHasDns);
-            ReserveVmInterfaceVspCommand cmd = new ReserveVmInterfaceVspCommand(vspNetwork, vspVm, vspNic, vspStaticNat, dhcpOption);
-            Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd);
+            if (vm.isRollingRestart()) {
+                ((NetworkVO)network).setRollingRestart(true);
+            } else {
+                //NicProfile does not contain the NIC UUID. We need this information to set it in the VMInterface and VPort
+                //that we create in VSP
+                NicVO nicFromDb = _nicDao.findById(nic.getId());
+                IPAddressVO staticNatIp = _ipAddressDao.findByVmIdAndNetworkId(network.getId(), vm.getId());
+                VspNic vspNic = _nuageVspEntityBuilder.buildVspNic(nicFromDb.getUuid(), nic);
+                VspStaticNat vspStaticNat = null;
+                if (staticNatIp != null) {
+                    VlanVO staticNatVlan = _vlanDao.findById(staticNatIp.getVlanId());
+                    vspStaticNat = _nuageVspEntityBuilder.buildVspStaticNat(null, staticNatIp, staticNatVlan, vspNic);
+                }
 
-            if (answer == null || !answer.getResult()) {
-                s_logger.error("ReserveVmInterfaceNuageVspCommand failed for NIC " + nic.getId() + " attached to VM " + vm.getId() + " in network " + network.getId());
-                if ((null != answer) && (null != answer.getDetails())) {
-                    s_logger.error(answer.getDetails());
+                boolean defaultHasDns = getDefaultHasDns(networkHasDnsCache, nicFromDb);
+                VspDhcpVMOption dhcpOption = _nuageVspEntityBuilder.buildVmDhcpOption(nicFromDb, defaultHasDns, networkHasDns);
+                ReserveVmInterfaceVspCommand cmd = new ReserveVmInterfaceVspCommand(vspNetwork, vspVm, vspNic, vspStaticNat, dhcpOption);
+                Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd);
+
+                if (answer == null || !answer.getResult()) {
+                    s_logger.error("ReserveVmInterfaceNuageVspCommand failed for NIC " + nic.getId() + " attached to VM " + vm.getId() + " in network " + network.getId());
+                    if ((null != answer) && (null != answer.getDetails())) {
+                        s_logger.error(answer.getDetails());
+                    }
+                    throw new InsufficientVirtualNetworkCapacityException("Failed to reserve VM in Nuage VSP.", Network.class, network.getId());
                 }
-                throw new InsufficientVirtualNetworkCapacityException("Failed to reserve VM in Nuage VSP.", Network.class, network.getId());
             }
 
             if (vspVm.getDomainRouter() == Boolean.TRUE) {
@@ -695,15 +705,18 @@ public void deallocate(Network network, NicProfile nic, VirtualMachineProfile vm
         }
 
         try {
+            final VirtualMachine virtualMachine = vm.getVirtualMachine();
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("Handling deallocate() call back, which is called when a VM is destroyed or interface is removed, " + "to delete VM Interface with IP "
-                        + nic.getIPv4Address() + " from a VM " + vm.getInstanceName() + " with state " + vm.getVirtualMachine().getState());
+                        + nic.getIPv4Address() + " from a VM " + vm.getInstanceName() + " with state " + virtualMachine
+                                                                                                           .getState());
             }
 
             NicVO nicFromDb = _nicDao.findById(nic.getId());
 
-            VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(vm.getVirtualMachine().getDomainId(), network);
-            VspVm vspVm = _nuageVspEntityBuilder.buildVspVm(vm.getVirtualMachine(), network);
+            VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(virtualMachine
+                                                                             .getDomainId(), network);
+            VspVm vspVm = _nuageVspEntityBuilder.buildVspVm(virtualMachine, network);
             VspNic vspNic = _nuageVspEntityBuilder.buildVspNic(nicFromDb.getUuid(), nic);
             HostVO nuageVspHost = _nuageVspManager.getNuageVspHost(network.getPhysicalNetworkId());
 
@@ -723,6 +736,32 @@ public void deallocate(Network network, NicProfile nic, VirtualMachineProfile vm
             } else {
                 super.deallocate(network, nic, vm);
             }
+
+            if (virtualMachine.getType() == VirtualMachine.Type.DomainRouter) {
+                final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), VirtualRouter.Role.VIRTUAL_ROUTER);
+                final DomainRouterVO otherRouter = routers.stream()
+                                                          .filter(r -> r.getId() != vm.getId())
+                                                          .findFirst()
+                                                          .orElse(null);
+
+                if (otherRouter != null) {
+                    nicFromDb = _nicDao.findByNtwkIdAndInstanceId(network.getId(), otherRouter.getId());
+                    vspVm = _nuageVspEntityBuilder.buildVspVm(otherRouter, network);
+                    vspNic = _nuageVspEntityBuilder.buildVspNic(nicFromDb);
+
+                    VspDhcpVMOption dhcpOption = _nuageVspEntityBuilder.buildVmDhcpOption(nicFromDb, false, false);
+                    ReserveVmInterfaceVspCommand reserveCmd = new ReserveVmInterfaceVspCommand(vspNetwork, vspVm, vspNic, null, dhcpOption);
+
+                    answer = _agentMgr.easySend(nuageVspHost.getId(), reserveCmd);
+                    if (answer == null || !answer.getResult()) {
+                        s_logger.error("DeallocateVmNuageVspCommand for VM " + vm.getUuid() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname"));
+                        if ((null != answer) && (null != answer.getDetails())) {
+                            s_logger.error(answer.getDetails());
+                        }
+                    }
+                }
+
+            }
         } finally {
             if (network != null && lockedNetwork) {
                 _networkDao.releaseFromLockTable(network.getId());
diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/network/guru/NuageVspGuestNetworkGuruTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/network/guru/NuageVspGuestNetworkGuruTest.java
index b1d6771a36a..0708202c215 100644
--- a/plugins/network-elements/nuage-vsp/test/com/cloud/network/guru/NuageVspGuestNetworkGuruTest.java
+++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/guru/NuageVspGuestNetworkGuruTest.java
@@ -19,15 +19,34 @@
 
 package com.cloud.network.guru;
 
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
 
 import net.nuage.vsp.acs.client.api.model.NetworkRelatedVsdIds;
+
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.internal.util.collections.Sets;
@@ -39,10 +58,11 @@
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
+import com.cloud.agent.api.guru.DeallocateVmVspCommand;
 import com.cloud.agent.api.guru.ImplementNetworkVspCommand;
+import com.cloud.agent.api.guru.ReserveVmInterfaceVspCommand;
 import com.cloud.agent.api.manager.ImplementNetworkVspAnswer;
 import com.cloud.configuration.ConfigurationManager;
-import com.cloud.dc.DataCenter;
 import com.cloud.dc.DataCenter.NetworkType;
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.dao.DataCenterDao;
@@ -71,6 +91,7 @@
 import com.cloud.network.dao.PhysicalNetworkDao;
 import com.cloud.network.dao.PhysicalNetworkVO;
 import com.cloud.network.manager.NuageVspManager;
+import com.cloud.network.router.VirtualRouter;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.offerings.dao.NetworkOfferingDao;
@@ -78,26 +99,34 @@
 import com.cloud.user.Account;
 import com.cloud.user.AccountVO;
 import com.cloud.user.dao.AccountDao;
+import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.NicVO;
 import com.cloud.vm.ReservationContext;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.dao.DomainRouterDao;
 import com.cloud.vm.dao.NicDao;
 
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.hamcrest.Matchers.nullValue;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 public class NuageVspGuestNetworkGuruTest extends NuageTest {
+    private static final long DATACENTER_ID = 100L;
+    private static final long HOST_ID = 101L;
+    private static final long DOMAIN_ID = 1L;
+    private static final long ACCOUNT_ID = 2L;
+    private static final long OFFERING_ID = 40L;
     private static final long NETWORK_ID = 42L;
+    private static final long VM_ID = 242L;
+    private static final long NIC_ID = 342L;
+
+    private static final String DATACENTER_UUID = "uuid-datacenter-100";
+    private static final String HOST_UUID = "uuid-host-101";
+    private static final String DOMAIN_UUID = "uuid-domain-001";
+    private static final String ACCOUNT_UUID = "uuid-account-002";
+    private static final String OFFERING_UUID = "uuid-offering-040";
+    private static final String NETWORK_UUID = "uuid-network-000-42";
+    private static final String VM_UUID = "uuid-vm-002-42";
+    private static final String NIC_UUID = "uuid-nic-003-42";
+
     @Mock private PhysicalNetworkDao _physicalNetworkDao;
     @Mock private DataCenterDao _dataCenterDao;
     @Mock private NetworkOfferingServiceMapDao _networkOfferingServiceMapDao;
@@ -115,39 +144,42 @@
     @Mock private DataCenterDetailsDao _dcDetailsDao;
     @Mock private NetworkDetailsDao _networkDetailsDao;
     @Mock private PhysicalNetworkVO physnet;
+    @Mock private DomainRouterDao _routerDao;
+
+    private Account _account;
+    private Domain _domain;
+    private DataCenterVO _dc;
+    private ReservationContext _reservationContext;
 
     @InjectMocks
-    private NuageVspGuestNetworkGuru _nuageVspGuestNetworkGuru;
+    private NuageVspGuestNetworkGuru _nuageVspGuestNetworkGuru = new NuageVspGuestNetworkGuru();
 
     @Before
     public void setUp() throws Exception {
-        _nuageVspGuestNetworkGuru = new NuageVspGuestNetworkGuru();
-
         super.setUp();
 
-        _nuageVspGuestNetworkGuru._nuageVspEntityBuilder = _nuageVspEntityBuilder;
-
-        final DataCenterVO dc = mock(DataCenterVO.class);
-        when(dc.getNetworkType()).thenReturn(NetworkType.Advanced);
-        when(dc.getGuestNetworkCidr()).thenReturn("10.1.1.1/24");
-
-        when(_dataCenterDao.findById((Long)any())).thenReturn(dc);
+        _account = getMockAccount();
+        _domain = getMockDomain();
+        _dc = mockDataCenter();
+        _reservationContext = getMockReservationContext(_account, _domain);
 
         when(_physicalNetworkDao.findById(any(Long.class))).thenReturn(physnet);
-        when(physnet.getIsolationMethods()).thenReturn(Arrays.asList("VSP"));
+        when(physnet.getIsolationMethods()).thenReturn(Collections.singletonList("VSP"));
         when(physnet.getId()).thenReturn(NETWORK_ID);
 
         final HostVO host = mock(HostVO.class);
-        when(_hostDao.findById(NETWORK_ID)).thenReturn(host);
-        when(host.getId()).thenReturn(NETWORK_ID);
-        when(_agentManager.easySend(eq(NETWORK_ID), any(Command.class))).thenReturn(new Answer(null));
-        when(_agentManager.easySend(eq(NETWORK_ID), any(ImplementNetworkVspCommand.class))).thenAnswer(this::mockImplement);
+        when(host.getId()).thenReturn(HOST_ID);
+        when(host.getUuid()).thenReturn(HOST_UUID);
+        when(_hostDao.findById(HOST_ID)).thenReturn(host);
+
+        when(_agentManager.easySend(eq(HOST_ID), any(Command.class))).thenReturn(new Answer(null));
+        when(_agentManager.easySend(eq(HOST_ID), any(ImplementNetworkVspCommand.class))).thenAnswer(this::mockImplement);
         when(_nuageVspManager.getNuageVspHost(NETWORK_ID)).thenReturn(host);
 
         final NuageVspDeviceVO device = mock(NuageVspDeviceVO.class);
-        when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(device));
+        when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Collections.singletonList(device));
         when(device.getId()).thenReturn(1L);
-        when(device.getHostId()).thenReturn(NETWORK_ID);
+        when(device.getHostId()).thenReturn(HOST_ID);
     }
 
     Answer mockImplement(InvocationOnMock invocation) {
@@ -161,18 +193,7 @@ Answer mockImplement(InvocationOnMock invocation) {
 
     @Test
     public void testCanHandle() {
-        final NetworkOffering offering = mock(NetworkOffering.class);
-        when(offering.getId()).thenReturn(NETWORK_ID);
-        when(offering.getIsPersistent()).thenReturn(false);
-        when(_configurationManager.isOfferingForVpc(any(NetworkOffering.class))).thenReturn(false);
-
-        when(_networkOfferingServiceMapDao.canProviderSupportServiceInNetworkOffering(NETWORK_ID, Service.Connectivity, Network.Provider.NuageVsp)).thenReturn(true);
-        when(_networkOfferingServiceMapDao.canProviderSupportServiceInNetworkOffering(NETWORK_ID, Service.SourceNat, Network.Provider.NuageVsp)).thenReturn(true);
-
-        when(_networkModel.getNetworkOfferingServiceProvidersMap(NETWORK_ID)).thenReturn(ImmutableMap.of(
-                Service.Connectivity, Sets.newSet(Network.Provider.NuageVsp),
-                Service.SourceNat, Sets.newSet(Network.Provider.NuageVsp)
-        ));
+        final NetworkOffering offering = mockNetworkOffering(false);
 
         when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
         when(offering.getGuestType()).thenReturn(GuestType.Isolated);
@@ -191,8 +212,8 @@ public void testCanHandle() {
         when(offering.getGuestType()).thenReturn(GuestType.Isolated);
         assertThat(_nuageVspGuestNetworkGuru.canHandle(offering, NetworkType.Basic, physnet), is(false));
 
-        // Not supported: IsolationMethod != STT
-        when(physnet.getIsolationMethods()).thenReturn(Arrays.asList("VLAN"));
+        // Not supported: IsolationMethod != VSP
+        when(physnet.getIsolationMethods()).thenReturn(Collections.singletonList("VLAN"));
         assertThat(_nuageVspGuestNetworkGuru.canHandle(offering, NetworkType.Basic, physnet), is(false));
 
         // Not supported: Non-persistent VPC tier
@@ -202,272 +223,289 @@ public void testCanHandle() {
 
     @Test
     public void testDesign() {
-        final NuageVspDeviceVO device = mock(NuageVspDeviceVO.class);
-        when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(device));
-        when(device.getId()).thenReturn(1L);
-
-        final NetworkOffering offering = mock(NetworkOffering.class);
-        when(offering.getId()).thenReturn(NETWORK_ID);
-        when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
-        when(offering.getGuestType()).thenReturn(GuestType.Isolated);
+        final NetworkOffering offering = mockNetworkOffering(false);
         when(offering.getIsPersistent()).thenReturn(false);
-        when(_configurationManager.isOfferingForVpc(any(NetworkOffering.class))).thenReturn(false);
-
-        when(_networkOfferingServiceMapDao.canProviderSupportServiceInNetworkOffering(NETWORK_ID, Service.Connectivity, Network.Provider.NuageVsp)).thenReturn(true);
-        when(_networkOfferingServiceMapDao.canProviderSupportServiceInNetworkOffering(NETWORK_ID, Service.SourceNat, Network.Provider.NuageVsp)).thenReturn(true);
-
-        when(_networkModel.getNetworkOfferingServiceProvidersMap(NETWORK_ID)).thenReturn(ImmutableMap.of(
-                Service.Connectivity, Sets.newSet(Network.Provider.NuageVsp),
-                Service.SourceNat, Sets.newSet(Network.Provider.NuageVsp)
-        ));
 
-        final DeploymentPlan plan = mock(DeploymentPlan.class);
+        final DeploymentPlan plan = mockDeploymentPlan();
         final Network network = mock(Network.class);
-        final Account account = mock(Account.class);
 
-        final Network designednetwork = _nuageVspGuestNetworkGuru.design(offering, plan, network, account);
+        final Network designednetwork = _nuageVspGuestNetworkGuru.design(offering, plan, network, _account);
         assertThat(designednetwork, notNullValue(Network.class));
         assertThat(designednetwork.getBroadcastDomainType(), is(BroadcastDomainType.Vsp));
 
         // Can't design non-persistent VPC tier
         when(_configurationManager.isOfferingForVpc(any(NetworkOffering.class))).thenReturn(true);
-        assertThat(_nuageVspGuestNetworkGuru.design(offering, plan, network, account), nullValue(Network.class));
+        assertThat(_nuageVspGuestNetworkGuru.design(offering, plan, network, _account), nullValue(Network.class));
     }
 
     @Test
-    public void testDesignNoElementOnPhysicalNetwork() {
-        when(physnet.getIsolationMethods()).thenReturn(Arrays.asList("STT"));
-        when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Collections.<NuageVspDeviceVO>emptyList());
+    public void testDesignNoIsolationMethodVSP() {
+        when(physnet.getIsolationMethods()).thenReturn(Collections.singletonList("VLAN"));
 
-        final NetworkOffering offering = mock(NetworkOffering.class);
-        when(offering.getId()).thenReturn(NETWORK_ID);
-        when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
-        when(offering.getGuestType()).thenReturn(GuestType.Isolated);
+        final NetworkOffering offering = mockNetworkOffering(false);
 
-        final DeploymentPlan plan = mock(DeploymentPlan.class);
+        final DeploymentPlan plan = mockDeploymentPlan();
         final Network network = mock(Network.class);
-        final Account account = mock(Account.class);
 
-        final Network designednetwork = _nuageVspGuestNetworkGuru.design(offering, plan, network, account);
-        assertTrue(designednetwork == null);
+        assertThat(_nuageVspGuestNetworkGuru.design(offering, plan, network, _account), nullValue(Network.class));
     }
 
     @Test
-    public void testDesignNoIsolationMethodVSP() {
-        when(physnet.getIsolationMethods()).thenReturn(Arrays.asList("VLAN"));
-        when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Collections.<NuageVspDeviceVO>emptyList());
+    public void testReserve() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException, URISyntaxException {
+        final NetworkVO network = mockNetwork();
+        final NicProfile nicProfile = mockNicProfile();
+        final VirtualMachineProfile vmProfile = mockVirtualMachineProfile(VirtualMachine.State.Starting);
 
-        final NetworkOffering offering = mock(NetworkOffering.class);
-        when(offering.getId()).thenReturn(NETWORK_ID);
-        when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
-        when(offering.getGuestType()).thenReturn(GuestType.Isolated);
+        when(_networkDao.findById(NETWORK_ID)).thenReturn(network);
 
-        final DeploymentPlan plan = mock(DeploymentPlan.class);
-        final Network network = mock(Network.class);
-        final Account account = mock(Account.class);
+        _nuageVspGuestNetworkGuru.reserve(nicProfile, network, vmProfile, mock(DeployDestination.class), _reservationContext);
 
-        final Network designednetwork = _nuageVspGuestNetworkGuru.design(offering, plan, network, account);
-        assertTrue(designednetwork == null);
+        verify(_agentManager).easySend(anyLong(), any(Command.class));
     }
 
     @Test
-    public void testReserve() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException, URISyntaxException {
-        final NetworkVO network = mock(NetworkVO.class);
-        when(network.getId()).thenReturn(NETWORK_ID);
-        when(network.getUuid()).thenReturn("aaaaaa");
-        when(network.getDataCenterId()).thenReturn(NETWORK_ID);
-        when(network.getNetworkOfferingId()).thenReturn(NETWORK_ID);
-        when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
-        when(network.getDomainId()).thenReturn(NETWORK_ID);
-        when(network.getAccountId()).thenReturn(NETWORK_ID);
-        when(network.getVpcId()).thenReturn(null);
-        when(network.getBroadcastUri()).thenReturn(new URI("vsp://aaaaaa-aavvv/10.1.1.1"));
-
-        final DataCenterVO dataCenter = mock(DataCenterVO.class);
-        when(_dataCenterDao.findById(NETWORK_ID)).thenReturn(dataCenter);
-        final AccountVO networksAccount = mock(AccountVO.class);
-        when(networksAccount.getId()).thenReturn(NETWORK_ID);
-        when(networksAccount.getUuid()).thenReturn("aaaa-abbbb");
-        when(networksAccount.getType()).thenReturn(Account.ACCOUNT_TYPE_NORMAL);
-        when(_accountDao.findById(NETWORK_ID)).thenReturn(networksAccount);
-        final DomainVO networksDomain = mock(DomainVO.class);
-        when(networksDomain.getId()).thenReturn(NETWORK_ID);
-        when(networksDomain.getUuid()).thenReturn("aaaaa-bbbbb");
-        when(_domainDao.findById(NETWORK_ID)).thenReturn(networksDomain);
+    public void testReserveVRRollingRestart() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException, URISyntaxException {
+        final NetworkVO network = mockNetwork();
+        final NicProfile nicProfile = mockNicProfile();
+        final VirtualMachineProfile vmProfile = mockVRProfile(VirtualMachine.State.Starting);
 
-        final NicVO nicvo = mock(NicVO.class);
-        when(nicvo.getId()).thenReturn(NETWORK_ID);
-        when(nicvo.getMacAddress()).thenReturn("aa-aa-aa-aa-aa-aa");
-        when(nicvo.getUuid()).thenReturn("aaaa-fffff");
-        when(nicvo.getNetworkId()).thenReturn(NETWORK_ID);
-        when(nicvo.getInstanceId()).thenReturn(NETWORK_ID);
-        when(_nicDao.findById(NETWORK_ID)).thenReturn(nicvo);
-        when(_nicDao.findDefaultNicForVM(NETWORK_ID)).thenReturn(nicvo);
+        when(_networkDao.findById(NETWORK_ID)).thenReturn(network);
 
-        final VirtualMachine vm = mock(VirtualMachine.class);
-        when(vm.getId()).thenReturn(NETWORK_ID);
-        when(vm.getType()).thenReturn(VirtualMachine.Type.User);
+        _nuageVspGuestNetworkGuru.reserve(nicProfile, network, vmProfile, mock(DeployDestination.class), _reservationContext);
 
-        final VirtualMachineProfile vmProfile = mock(VirtualMachineProfile.class);
-        when(vmProfile.getType()).thenReturn(VirtualMachine.Type.User);
-        when(vmProfile.getInstanceName()).thenReturn("");
-        when(vmProfile.getUuid()).thenReturn("aaaa-bbbbb");
-        when(vmProfile.getVirtualMachine()).thenReturn(vm);
+        verifyZeroInteractions(_agentManager);
+        verify(network).setRollingRestart(true);
+    }
 
-        NicProfile nicProfile = mock(NicProfile.class);
-        when(nicProfile.getUuid()).thenReturn("aaa-bbbb");
-        when(nicProfile.getId()).thenReturn(NETWORK_ID);
-        when(nicProfile.getMacAddress()).thenReturn("aa-aa-aa-aa-aa-aa");
+    @Test
+    public void testImplementNetwork() throws URISyntaxException, InsufficientVirtualNetworkCapacityException {
+        final NetworkVO network = mockNetwork();
 
-        final NetworkOfferingVO ntwkoffering = mock(NetworkOfferingVO.class);
-        when(ntwkoffering.getId()).thenReturn(NETWORK_ID);
-        when(_networkOfferingDao.findById(NETWORK_ID)).thenReturn(ntwkoffering);
+        when(network.getState()).thenReturn(com.cloud.network.Network.State.Implementing);
 
-        when(_networkDao.acquireInLockTable(NETWORK_ID, 1200)).thenReturn(network);
-        when(_ipAddressDao.findByVmIdAndNetworkId(NETWORK_ID, NETWORK_ID)).thenReturn(null);
-        when(_domainDao.findById(NETWORK_ID)).thenReturn(mock(DomainVO.class));
+        final NetworkOffering offering = mockNetworkOffering(false);
 
-        final Answer answer = mock(Answer.class);
-        when(answer.getResult()).thenReturn(true);
-        when(_agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
+        final DeployDestination deployDest = mock(DeployDestination.class);
+        when(deployDest.getDataCenter()).thenReturn(_dc);
+        _nuageVspGuestNetworkGuru.implement(network, offering, deployDest, _reservationContext);
+    }
 
-        final ReservationContext reservationContext = mock(ReservationContext.class);
-        when(reservationContext.getAccount()).thenReturn(networksAccount);
-        when(reservationContext.getDomain()).thenReturn(networksDomain);
+    @Test
+    public void testDeallocate() throws Exception {
+        final NetworkVO network = mockNetwork();
+        final NicProfile nicProfile = mockNicProfile();
+        final VirtualMachineProfile vmProfile = mockVirtualMachineProfile(VirtualMachine.State.Expunging);
+
+        _nuageVspGuestNetworkGuru.deallocate(network, nicProfile, vmProfile);
+    }
+
+    @Test
+    public void testDeallocateVR() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException, URISyntaxException {
+        final NetworkVO network = mockNetwork();
+        final NicProfile nicProfile = mockNicProfile();
+        final VirtualMachineProfile vmProfile = mockVRProfile(VirtualMachine.State.Expunging);
 
         when(_networkDao.findById(NETWORK_ID)).thenReturn(network);
 
-        _nuageVspGuestNetworkGuru.reserve(nicProfile, network, vmProfile, mock(DeployDestination.class), reservationContext);
+        _nuageVspGuestNetworkGuru.deallocate(network, nicProfile, vmProfile);
     }
 
     @Test
-    public void testImplementNetwork() throws URISyntaxException, InsufficientVirtualNetworkCapacityException {
+    public void testDeallocateVRRollingRestart() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException, URISyntaxException {
+        final NetworkVO network = mockNetwork();
+        final NicProfile nicProfile = mockNicProfile();
+        final VirtualMachineProfile vmProfile = mockVRProfile(VirtualMachine.State.Expunging);
+
+        DomainRouterVO newVR = mock(DomainRouterVO.class);
+
+        when(_routerDao.listByNetworkAndRole(NETWORK_ID, VirtualRouter.Role.VIRTUAL_ROUTER)).thenReturn(Collections.singletonList(newVR));
+        when(_networkDao.findById(NETWORK_ID)).thenReturn(network);
+
+        _nuageVspGuestNetworkGuru.deallocate(network, nicProfile, vmProfile);
+
+        ArgumentCaptor<Command> argumentCaptor = ArgumentCaptor.forClass(Command.class);
+        verify(_agentManager, times(2)).easySend(eq(HOST_ID), argumentCaptor.capture());
+        final List<Command> commands = argumentCaptor.getAllValues();
+        assertThat(commands.get(0) instanceof DeallocateVmVspCommand, is(true));
+        assertThat(commands.get(1) instanceof ReserveVmInterfaceVspCommand, is(true));
+    }
+
+    @Test
+    public void testTrash() throws Exception {
         final NetworkVO network = mock(NetworkVO.class);
         when(network.getId()).thenReturn(NETWORK_ID);
-        when(network.getUuid()).thenReturn("aaaaaa");
-        when(network.getDataCenterId()).thenReturn(NETWORK_ID);
-        when(network.getNetworkOfferingId()).thenReturn(NETWORK_ID);
+        when(network.getUuid()).thenReturn(NETWORK_UUID);
+        when(network.getName()).thenReturn("trash");
+        when(network.getDomainId()).thenReturn(DOMAIN_ID);
+        when(network.getNetworkOfferingId()).thenReturn(OFFERING_ID);
         when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
-        when(network.getDomainId()).thenReturn(NETWORK_ID);
-        when(network.getAccountId()).thenReturn(NETWORK_ID);
+        when(network.getDataCenterId()).thenReturn(DATACENTER_ID);
+        when(network.getVpcId()).thenReturn(null);
+        when(_networkDao.acquireInLockTable(NETWORK_ID, 1200)).thenReturn(network);
+
+        final NetworkOffering offering = mockNetworkOffering(false);
+
+        when(_nuageVspManager.getDnsDetails(network.getDataCenterId())).thenReturn(new ArrayList<>());
+        when(_nuageVspManager.getGatewaySystemIds()).thenReturn(new ArrayList<>());
+
+        assertTrue(_nuageVspGuestNetworkGuru.trash(network, offering));
+    }
+
+    @Nonnull
+    private NetworkVO mockNetwork() throws URISyntaxException {
+        final NetworkVO network = mock(NetworkVO.class);
+        when(network.getId()).thenReturn(NETWORK_ID);
+        when(network.getUuid()).thenReturn(NETWORK_UUID);
+        when(network.getDataCenterId()).thenReturn(DATACENTER_ID);
+        when(network.getNetworkOfferingId()).thenReturn(OFFERING_ID);
+        when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
+        when(network.getDomainId()).thenReturn(DOMAIN_ID);
+        when(network.getAccountId()).thenReturn(ACCOUNT_ID);
         when(network.getVpcId()).thenReturn(null);
-        when(network.getState()).thenReturn(com.cloud.network.Network.State.Implementing);
         when(network.getTrafficType()).thenReturn(TrafficType.Guest);
-        when(network.getMode()).thenReturn(Mode.Static);
+        when(network.getMode()).thenReturn(Mode.Dhcp);
         when(network.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Vsp);
-        when(network.getBroadcastUri()).thenReturn(new URI("vsp://aaaaaa-aavvv/10.1.1.1"));
+        when(network.getBroadcastUri()).thenReturn(new URI("vsp://" + NETWORK_UUID + "/10.1.1.1"));
         when(network.getGateway()).thenReturn("10.1.1.1");
         when(network.getCidr()).thenReturn("10.1.1.0/24");
         when(network.getName()).thenReturn("iso");
 
-        final NetworkOffering offering = mock(NetworkOffering.class);
-        when(offering.getId()).thenReturn(NETWORK_ID);
+        when(_networkDao.acquireInLockTable(NETWORK_ID, 1200)).thenReturn(network);
+        when(_networkDao.findById(NETWORK_ID)).thenReturn(network);
+
+        return network;
+    }
+
+    @Nonnull
+    private NetworkOffering mockNetworkOffering(boolean forVpc) {
+        final NetworkOfferingVO offering = mock(NetworkOfferingVO.class);
+        when(offering.getId()).thenReturn(OFFERING_ID);
+        when(offering.getUuid()).thenReturn(OFFERING_UUID);
         when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
+        when(offering.getGuestType()).thenReturn(GuestType.Isolated);
+        when(offering.getForVpc()).thenReturn(forVpc);
+        when(offering.getIsPersistent()).thenReturn(false);
         when(offering.getTags()).thenReturn("aaaa");
         when(offering.getEgressDefaultPolicy()).thenReturn(true);
 
-        when(_networkModel.findPhysicalNetworkId(NETWORK_ID, "aaa", TrafficType.Guest)).thenReturn(NETWORK_ID);
+        when(_networkOfferingDao.findById(OFFERING_ID)).thenReturn(offering);
 
-        final ReservationContext reserveContext = mock(ReservationContext.class);
-        final Domain domain = mock(Domain.class);
-        when(domain.getId()).thenReturn(NETWORK_ID);
-        when(reserveContext.getDomain()).thenReturn(domain);
-        when(domain.getName()).thenReturn("aaaaa");
-        final Account account = mock(Account.class);
-        when(account.getId()).thenReturn(NETWORK_ID);
-        when(account.getAccountId()).thenReturn(NETWORK_ID);
-        when(reserveContext.getAccount()).thenReturn(account);
-        final DomainVO domainVo = mock(DomainVO.class);
-        when(_domainDao.findById(NETWORK_ID)).thenReturn(domainVo);
-        final AccountVO accountVo = mock(AccountVO.class);
-        when(_accountDao.findById(NETWORK_ID)).thenReturn(accountVo);
+        when(_configurationManager.isOfferingForVpc(offering)).thenReturn(forVpc);
 
-        when(_networkDao.acquireInLockTable(NETWORK_ID, 1200)).thenReturn(network);
-        when(_nuageVspManager.getDnsDetails(network.getDataCenterId())).thenReturn(new ArrayList<String>());
-        when(_nuageVspManager.getGatewaySystemIds()).thenReturn(new ArrayList<String>());
+        when(_networkOfferingServiceMapDao.canProviderSupportServiceInNetworkOffering(OFFERING_ID, Service.Connectivity, Network.Provider.NuageVsp)).thenReturn(true);
+        when(_networkOfferingServiceMapDao.canProviderSupportServiceInNetworkOffering(OFFERING_ID, Service.SourceNat, Network.Provider.NuageVsp)).thenReturn(true);
 
-        final DataCenter dc = mock(DataCenter.class);
-        when(dc.getId()).thenReturn(NETWORK_ID);
-        final DeployDestination deployDest = mock(DeployDestination.class);
-        when(deployDest.getDataCenter()).thenReturn(dc);
-        _nuageVspGuestNetworkGuru.implement(network, offering, deployDest, reserveContext);
+        when(_networkModel.getNetworkOfferingServiceProvidersMap(OFFERING_ID)).thenReturn(ImmutableMap.of(
+                Service.Connectivity, Sets.newSet(Network.Provider.NuageVsp),
+                Service.SourceNat, Sets.newSet(Network.Provider.NuageVsp)
+        ));
+
+        return offering;
     }
 
-    @Test
-    public void testDeallocate() throws Exception {
-        final NetworkVO network = mock(NetworkVO.class);
-        when(network.getId()).thenReturn(NETWORK_ID);
-        when(network.getUuid()).thenReturn("aaaaaa");
-        when(network.getNetworkOfferingId()).thenReturn(NETWORK_ID);
-        when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
-        when(network.getVpcId()).thenReturn(null);
-        when(network.getDomainId()).thenReturn(NETWORK_ID);
-        when(_networkDao.acquireInLockTable(NETWORK_ID, 1200)).thenReturn(network);
+    private DeploymentPlan mockDeploymentPlan() {
+        final DeploymentPlan deploymentPlan = mock(DeploymentPlan.class);
+        when(deploymentPlan.getDataCenterId()).thenReturn(DATACENTER_ID);
+        return deploymentPlan;
+    }
 
-        final NetworkOfferingVO offering = mock(NetworkOfferingVO.class);
-        when(offering.getId()).thenReturn(NETWORK_ID);
-        when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
-        when(_networkOfferingDao.findById(NETWORK_ID)).thenReturn(offering);
+    private DataCenterVO mockDataCenter() {
+        DataCenterVO dc = mock(DataCenterVO.class);
+        when(dc.getId()).thenReturn(DATACENTER_ID);
+        when(dc.getUuid()).thenReturn(DATACENTER_UUID);
+        when(dc.getNetworkType()).thenReturn(NetworkType.Advanced);
+        when(dc.getGuestNetworkCidr()).thenReturn("10.1.1.1/24");
+        when(_dataCenterDao.findById(DATACENTER_ID)).thenReturn(dc);
+
+        return dc;
+    }
 
+    @Nonnull
+    private Account getMockAccount() {
+        final AccountVO account = mock(AccountVO.class);
+        when(account.getId()).thenReturn(ACCOUNT_ID);
+        when(account.getAccountId()).thenReturn(ACCOUNT_ID);
+        when(account.getUuid()).thenReturn(ACCOUNT_UUID);
+        when(account.getDomainId()).thenReturn(DOMAIN_ID);
+        when(account.getType()).thenReturn(Account.ACCOUNT_TYPE_NORMAL);
+
+        when(_accountDao.findById(ACCOUNT_ID)).thenReturn(account);
+
+        return account;
+    }
+
+    @Nonnull
+    private Domain getMockDomain() {
         final DomainVO domain = mock(DomainVO.class);
-        when(domain.getUuid()).thenReturn("aaaaaa");
-        when(_domainDao.findById(NETWORK_ID)).thenReturn(domain);
+        when(domain.getId()).thenReturn(DOMAIN_ID);
+        when(domain.getUuid()).thenReturn(DOMAIN_UUID);
+        when(domain.getName()).thenReturn("aaaaa");
 
-        final NicVO nic = mock(NicVO.class);
-        when(nic.getId()).thenReturn(NETWORK_ID);
-        when(nic.getIPv4Address()).thenReturn("10.10.10.10");
-        when(nic.getMacAddress()).thenReturn("c8:60:00:56:e5:58");
-        when(_nicDao.findById(NETWORK_ID)).thenReturn(nic);
+        when(_domainDao.findById(DOMAIN_ID)).thenReturn(domain);
 
-        final NicProfile nicProfile = mock(NicProfile.class);
-        when(nicProfile.getId()).thenReturn(NETWORK_ID);
-        when(nicProfile.getIPv4Address()).thenReturn("10.10.10.10");
-        when(nicProfile.getMacAddress()).thenReturn("c8:60:00:56:e5:58");
+        return domain;
+    }
 
+    @Nonnull
+    private VirtualMachineProfile mockVirtualMachineProfile(VirtualMachine.State state) {
         final VirtualMachine vm = mock(VirtualMachine.class);
+        when(vm.getId()).thenReturn(VM_ID);
         when(vm.getType()).thenReturn(VirtualMachine.Type.User);
-        when(vm.getState()).thenReturn(VirtualMachine.State.Expunging);
+        when(vm.getState()).thenReturn(state);
 
         final VirtualMachineProfile vmProfile = mock(VirtualMachineProfile.class);
-        when(vmProfile.getUuid()).thenReturn("aaaaaa");
+        when(vmProfile.getType()).thenReturn(VirtualMachine.Type.User);
         when(vmProfile.getInstanceName()).thenReturn("Test-VM");
+        when(vmProfile.getUuid()).thenReturn(VM_UUID);
         when(vmProfile.getVirtualMachine()).thenReturn(vm);
-
-        _nuageVspGuestNetworkGuru.deallocate(network, nicProfile, vmProfile);
+        return vmProfile;
     }
 
-    @Test
-    public void testTrash() throws Exception {
-        final NetworkVO network = mock(NetworkVO.class);
-        when(network.getId()).thenReturn(NETWORK_ID);
-        when(network.getUuid()).thenReturn("aaaaaa");
-        when(network.getName()).thenReturn("trash");
-        when(network.getDomainId()).thenReturn(NETWORK_ID);
-        when(network.getNetworkOfferingId()).thenReturn(NETWORK_ID);
-        when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
-        when(network.getDataCenterId()).thenReturn(NETWORK_ID);
-        when(network.getVpcId()).thenReturn(null);
-        when(_networkDao.acquireInLockTable(NETWORK_ID, 1200)).thenReturn(network);
+    @Nonnull
+    private VirtualMachineProfile mockVRProfile(VirtualMachine.State state) {
+        final VirtualMachine vm = mock(VirtualMachine.class);
+        when(vm.getId()).thenReturn(VM_ID);
+        when(vm.getUuid()).thenReturn(VM_UUID);
+        when(vm.getType()).thenReturn(VirtualMachine.Type.DomainRouter);
+        when(vm.getState()).thenReturn(state);
 
-        final NetworkOfferingVO offering = mock(NetworkOfferingVO.class);
-        when(offering.getId()).thenReturn(NETWORK_ID);
-        when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
-        when(_networkOfferingDao.findById(NETWORK_ID)).thenReturn(offering);
 
-        final DomainVO domain = mock(DomainVO.class);
-        when(domain.getUuid()).thenReturn("aaaaaa");
-        when(_domainDao.findById(NETWORK_ID)).thenReturn(domain);
+        final VirtualMachineProfile vmProfile = mock(VirtualMachineProfile.class);
+        when(vmProfile.getType()).thenReturn(VirtualMachine.Type.DomainRouter);
+        when(vmProfile.getInstanceName()).thenReturn("Test-VR");
+        when(vmProfile.getId()).thenReturn(VM_ID);
+        when(vmProfile.getUuid()).thenReturn(VM_UUID);
+        when(vmProfile.getVirtualMachine()).thenReturn(vm);
+        when(vmProfile.isRollingRestart()).thenReturn(true);
+        return vmProfile;
+    }
 
-        final HostVO host = mock(HostVO.class);
-        when(host.getId()).thenReturn(NETWORK_ID);
-        final NuageVspDeviceVO nuageVspDevice = mock(NuageVspDeviceVO.class);
-        when(nuageVspDevice.getHostId()).thenReturn(NETWORK_ID);
-        when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(new NuageVspDeviceVO[]{nuageVspDevice}));
-        when(_hostDao.findById(NETWORK_ID)).thenReturn(host);
-        when(_nuageVspManager.getDnsDetails(network.getDataCenterId())).thenReturn(new ArrayList<String>());
-        when(_nuageVspManager.getGatewaySystemIds()).thenReturn(new ArrayList<String>());
+    @Nonnull
+    private NicProfile mockNicProfile() {
+        final NicVO nicvo = mock(NicVO.class);
+        when(nicvo.getId()).thenReturn(NIC_ID);
+        when(nicvo.getMacAddress()).thenReturn("c8:60:00:56:e5:58");
+        when(nicvo.getIPv4Address()).thenReturn("10.10.10.10");
+        when(nicvo.getUuid()).thenReturn("aaaa-fffff");
+        when(nicvo.getNetworkId()).thenReturn(NETWORK_ID);
+        when(nicvo.getInstanceId()).thenReturn(VM_ID);
+        when(_nicDao.findById(NIC_ID)).thenReturn(nicvo);
+        when(_nicDao.findDefaultNicForVM(VM_ID)).thenReturn(nicvo);
 
-        assertTrue(_nuageVspGuestNetworkGuru.trash(network, offering));
+        NicProfile nicProfile = mock(NicProfile.class);
+        when(nicProfile.getUuid()).thenReturn("aaa-bbbb");
+        when(nicProfile.getId()).thenReturn(NIC_ID);
+        when(nicProfile.getMacAddress()).thenReturn("c8:60:00:56:e5:58");
+        when(nicProfile.getIPv4Address()).thenReturn("10.10.10.10");
+        return nicProfile;
+    }
+
+    @Nonnull
+    private static ReservationContext getMockReservationContext(Account networksAccount, Domain networksDomain) {
+        final ReservationContext reservationContext = mock(ReservationContext.class);
+        when(reservationContext.getAccount()).thenReturn(networksAccount);
+        when(reservationContext.getDomain()).thenReturn(networksDomain);
+        return reservationContext;
     }
 
 }
diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java
index 7df1298e80c..9b481ed4a64 100644
--- a/server/src/com/cloud/network/element/VirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VirtualRouterElement.java
@@ -216,6 +216,10 @@ public boolean implement(final Network network, final NetworkOffering offering,
         final Map<VirtualMachineProfile.Param, Object> params = new HashMap<VirtualMachineProfile.Param, Object>(1);
         params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
 
+        if (network.isRollingRestart()) {
+            params.put(VirtualMachineProfile.Param.RollingRestart, true);
+        }
+
         final RouterDeploymentDefinition routerDeploymentDefinition =
                 routerDeploymentDefinitionBuilder.create()
                 .setGuestNetwork(network)
diff --git a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
index 9999ee62cb8..165cb7d28dc 100644
--- a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
@@ -153,6 +153,10 @@ public boolean implementVpc(final Vpc vpc, final DeployDestination dest, final R
         final Map<VirtualMachineProfile.Param, Object> params = new HashMap<VirtualMachineProfile.Param, Object>(1);
         params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
 
+        if (vpc.isRollingRestart()) {
+            params.put(VirtualMachineProfile.Param.RollingRestart, true);
+        }
+
         final RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create().setVpc(vpc).setDeployDestination(dest)
                 .setAccountOwner(_accountMgr.getAccount(vpc.getAccountId())).setParams(params).build();
 
@@ -194,6 +198,10 @@ public boolean implement(final Network network, final NetworkOffering offering,
         final Map<VirtualMachineProfile.Param, Object> params = new HashMap<VirtualMachineProfile.Param, Object>(1);
         params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
 
+        if (network.isRollingRestart()) {
+            params.put(VirtualMachineProfile.Param.RollingRestart, true);
+        }
+
         final RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create()
                 .setGuestNetwork(network)
                 .setVpc(vpc)
diff --git a/test/integration/plugins/nuagevsp/test_nuage_vpc_network.py b/test/integration/plugins/nuagevsp/test_nuage_vpc_network.py
index e1b51287096..167559ad3a3 100644
--- a/test/integration/plugins/nuagevsp/test_nuage_vpc_network.py
+++ b/test/integration/plugins/nuagevsp/test_nuage_vpc_network.py
@@ -20,7 +20,7 @@
 """
 # Import Local Modules
 from nuageTestCase import nuageTestCase
-from marvin.lib.base import Account
+from marvin.lib.base import Account, VPC
 # Import System Modules
 from nose.plugins.attrib import attr
 
@@ -118,6 +118,12 @@ def test_nuage_vpc_network(self):
         # VSD verification for ACL item
         self.verify_vsd_firewall_rule(acl_item)
 
+        self.restart_Vpc(vpc, cleanup=True)
+
+        self.validate_Network(vpc_network, state="Implemented")
+        vr = self.get_Router(vpc_network)
+        self.verify_vsd_router(vr)
+
     @attr(
         tags=["advanced", "nuagevsp", "multizone"], required_hardware="false")
     def test_nuage_vpc_network_multizone(self):
diff --git a/test/integration/plugins/nuagevsp/test_nuage_vsp.py b/test/integration/plugins/nuagevsp/test_nuage_vsp.py
index 54656fd1694..82160f03a26 100644
--- a/test/integration/plugins/nuagevsp/test_nuage_vsp.py
+++ b/test/integration/plugins/nuagevsp/test_nuage_vsp.py
@@ -19,7 +19,7 @@
 """
 # Import Local Modules
 from nuageTestCase import nuageTestCase
-from marvin.lib.base import Account, Nuage
+from marvin.lib.base import Account, Nuage, Network
 from marvin.cloudstackAPI import deleteNuageVspDevice
 # Import System Modules
 from nose.plugins.attrib import attr
@@ -158,7 +158,7 @@ def test_nuage_vsp_device(self):
                        "Physical Network...")
             self.validate_NuageVspDevice()
 
-    @attr(tags=["advanced", "nuagevsp"], required_hardware="false")
+    @attr(tags=["advanced", "nuagevsp", "isolated"], required_hardware="false")
     def test_nuage_vsp(self):
         """ Test Nuage VSP SDN plugin with basic Isolated Network functionality
         """
@@ -223,6 +223,12 @@ def test_nuage_vsp(self):
             # VSD verification
             self.verify_vsd_vm(vm_2)
 
+            Network.restart(network, self.api_client, cleanup=True)
+
+            self.validate_Network(network, state="Implemented")
+            vr = self.get_Router(network)
+            self.verify_vsd_router(vr)
+
             # Deleting the network
             self.debug("Deleting the Isolated Network with Nuage VSP Isolated "
                        "Network offering...")


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


> Nuage VSP regression fails in NetworksWithCleanup test since introduction of fix for CLOUDSTACK-9114 in ACS 4.11&master
> -----------------------------------------------------------------------------------------------------------------------
>
>                 Key: CLOUDSTACK-10377
>                 URL: https://issues.apache.org/jira/browse/CLOUDSTACK-10377
>             Project: CloudStack
>          Issue Type: Bug
>      Security Level: Public(Anyone can view this level - this is the default.) 
>    Affects Versions: 4.12, 4.11.1.0
>         Environment: ACS 4.11 or master with Nuage VSP 5.2.x
>            Reporter: Raf Smeets
>            Assignee: Frank Maximus
>            Priority: Major
>
> Nuage VSP regression fails in NetworksWithCleanup test since introduction of fix for CLOUDSTACK-9114 in ACS 4.11&master
> In Nuage Networks QA regression cycle, cloudstackExpress is failing for master & 4.11 in expressrestartNetworksWithCleanup test.
>  The error is Unable to create a deployment.
>  Issue is caused by fixing https://issues.apache.org/jira/browse/CLOUDSTACK-9114
>   
>  Reason is that for non-redundant routers, a strategy was implemented where first a new VR is deployed, then old VR is powered-off/destroyed, and the new VR is again re-programmed. With this strategy, two identical VRs may be up for a brief moment (few seconds) where both can serve traffic, however the new VR performs arp-ping on its interfaces to update neighbours. After the old VR is removed, the new VR is re-programmed which among many things performs another arpping. The theoretical downtime is therefore limited by the arp-cache refresh which can be up to 30 seconds. In my experiments, against various VMware, KVM and XenServer versions I found that the downtime was indeed less than 30s, usually between 5-20 seconds. Compared to older ACS versions, especially in cases where VRs deployment require full volume copy (like in VMware) a 10x-12x improvement was seen.BUT NUAGE PLUGIN FAILS AS IP ADDRESS IS ALREADY IN USE.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message