http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b0c27e48/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java
----------------------------------------------------------------------
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 2037d92..a6c17e3 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
@@ -31,18 +31,14 @@ import com.cloud.dc.DataCenter.NetworkType;
 import com.cloud.dc.VlanVO;
 import com.cloud.deploy.DeployDestination;
 import com.cloud.deploy.DeploymentPlan;
-import com.cloud.domain.Domain;
-import com.cloud.domain.DomainVO;
 import com.cloud.domain.dao.DomainDao;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientAddressCapacityException;
 import com.cloud.exception.InsufficientVirtualNetworkCapacityException;
 import com.cloud.host.HostVO;
 import com.cloud.host.dao.HostDao;
-import com.cloud.network.IpAddress;
 import com.cloud.network.Network;
 import com.cloud.network.Network.GuestType;
-import com.cloud.network.Network.Service;
 import com.cloud.network.Network.State;
 import com.cloud.network.NetworkProfile;
 import com.cloud.network.Networks;
@@ -50,11 +46,12 @@ import com.cloud.network.NuageVspDeviceVO;
 import com.cloud.network.PhysicalNetwork;
 import com.cloud.network.PhysicalNetwork.IsolationMethod;
 import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.NetworkDetailVO;
+import com.cloud.network.dao.NetworkDetailsDao;
 import com.cloud.network.dao.NetworkVO;
 import com.cloud.network.dao.NuageVspDao;
 import com.cloud.network.dao.PhysicalNetworkVO;
 import com.cloud.network.manager.NuageVspManager;
-import com.cloud.network.vpc.Vpc;
 import com.cloud.network.vpc.dao.VpcDao;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.dao.NetworkOfferingDao;
@@ -62,28 +59,25 @@ import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
 import com.cloud.user.Account;
 import com.cloud.user.AccountVO;
 import com.cloud.user.dao.AccountDao;
-import com.cloud.util.NuageVspUtil;
+import com.cloud.utils.StringUtils;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.net.NetUtils;
 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.google.common.base.Strings;
-import org.apache.commons.lang.StringUtils;
+import com.cloud.util.NuageVspEntityBuilder;
+import net.nuage.vsp.acs.client.api.model.VspNetwork;
+import net.nuage.vsp.acs.client.api.model.VspNic;
+import net.nuage.vsp.acs.client.api.model.VspStaticNat;
+import net.nuage.vsp.acs.client.api.model.VspVm;
+import org.apache.cloudstack.resourcedetail.VpcDetailVO;
+import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao;
 import org.apache.log4j.Logger;
 
 import javax.inject.Inject;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
 
 public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
     public static final Logger s_logger = 
Logger.getLogger(NuageVspGuestNetworkGuru.class);
@@ -108,6 +102,12 @@ public class NuageVspGuestNetworkGuru extends 
GuestNetworkGuru {
     NuageVspManager _nuageVspManager;
     @Inject
     ConfigurationManager _configMgr;
+    @Inject
+    NuageVspEntityBuilder _nuageVspEntityBuilder;
+    @Inject
+    NetworkDetailsDao _networkDetailsDao;
+    @Inject
+    VpcDetailsDao _vpcDetailsDao;
 
     public NuageVspGuestNetworkGuru() {
         super();
@@ -148,6 +148,15 @@ public class NuageVspGuestNetworkGuru extends 
GuestNetworkGuru {
                 throw new IllegalStateException("Network " + networkId + " is 
not in expected state Implementing, but is in state " + network.getState());
             }
 
+            //Get the Account details and find the type
+            AccountVO networksAccount = 
_accountDao.findById(network.getAccountId());
+            if (networksAccount.getType() == Account.ACCOUNT_TYPE_PROJECT) {
+                String errorMessage = "Networks created by account " + 
networksAccount.getAccountName() + " of type Project (" + 
Account.ACCOUNT_TYPE_PROJECT + ") " +
+                        "are not yet supported by NuageVsp provider";
+                s_logger.error(errorMessage);
+                throw new 
InsufficientVirtualNetworkCapacityException(errorMessage, Account.class, 
network.getAccountId());
+            }
+
             long dcId = dest.getDataCenter().getId();
             //Get physical network id
             Long physicalNetworkId = network.getPhysicalNetworkId();
@@ -155,80 +164,29 @@ public class NuageVspGuestNetworkGuru extends 
GuestNetworkGuru {
             if (physicalNetworkId == null) {
                 physicalNetworkId = _networkModel.findPhysicalNetworkId(dcId, 
offering.getTags(), offering.getTrafficType());
             }
-            implemented = new NetworkVO(network.getTrafficType(), 
network.getMode(), network.getBroadcastDomainType(), 
network.getNetworkOfferingId(), State.Allocated,
-                    network.getDataCenterId(), physicalNetworkId, 
offering.getRedundantRouter());
+
+            implemented = new NetworkVO(network.getId(), network, 
network.getNetworkOfferingId(), network.getGuruName(), network.getDomainId(), 
network.getAccountId(),
+                    network.getRelated(), network.getName(), 
network.getDisplayText(), network.getNetworkDomain(), network.getGuestType(), 
network.getDataCenterId(),
+                    physicalNetworkId, network.getAclType(), 
network.getSpecifyIpRanges(), network.getVpcId(), 
offering.getRedundantRouter());
+            implemented.setUuid(network.getUuid());
+            implemented.setState(State.Allocated);
             if (network.getGateway() != null) {
                 implemented.setGateway(network.getGateway());
             }
             if (network.getCidr() != null) {
                 implemented.setCidr(network.getCidr());
             }
-            List<String[]> ipAddressRanges = new ArrayList<String[]>();
-            String virtualRouterIp = getVirtualRouterIP(network, 
ipAddressRanges);
-            String networkUuid = implemented.getUuid();
+
+            VspNetwork vspNetwork = 
_nuageVspEntityBuilder.buildVspNetwork(implemented, true);
             String tenantId = context.getDomain().getName() + "-" + 
context.getAccount().getAccountId();
-            String broadcastUriStr = networkUuid + "/" + virtualRouterIp;
+            String broadcastUriStr = implemented.getUuid() + "/" + 
vspNetwork.getVirtualRouterIp();
             
implemented.setBroadcastUri(Networks.BroadcastDomainType.Vsp.toUri(broadcastUriStr));
             
implemented.setBroadcastDomainType(Networks.BroadcastDomainType.Vsp);
-            //Check if the network is associated to a VPC
-            Long vpcId = network.getVpcId();
-            boolean isVpc = (vpcId != null);
-            //Check owner of the Network
-            Domain networksDomain = _domainDao.findById(network.getDomainId());
-            //Get the Account details and find the type
-            AccountVO networksAccount = 
_accountDao.findById(network.getAccountId());
-            if (networksAccount.getType() == Account.ACCOUNT_TYPE_PROJECT) {
-                String errorMessage = "Networks created by account " + 
networksAccount.getAccountName() + " of type Project (" + 
Account.ACCOUNT_TYPE_PROJECT + ") " +
-                        "are not yet supported by NuageVsp provider";
-                s_logger.error(errorMessage);
-                throw new 
InsufficientVirtualNetworkCapacityException(errorMessage, Account.class, 
network.getAccountId());
-            }
-            String vpcName = null;
-            String vpcUuid = null;
-            String preConfiguredDomainTemplateName = 
NuageVspUtil.getPreConfiguredDomainTemplateName(_configDao, network, offering);
-            boolean isSharedNetwork = offering.getGuestType() == 
GuestType.Shared;
-            boolean isL3Network = !isVpc && (isSharedNetwork || 
isL3Network(network));
-
-            if (isVpc) {
-                Vpc vpcObj = _vpcDao.findById(vpcId);
-                vpcName = vpcObj.getName();
-                vpcUuid = vpcObj.getUuid();
-            }
-
-            if (isSharedNetwork) {
-                List<VlanVO> vlans = 
_vlanDao.listVlansByNetworkId(network.getId());
-                for (VlanVO vlan : vlans) {
-                    boolean isIpv4 = StringUtils.isNotBlank(vlan.getIpRange());
-                    String[] range = isIpv4 ? vlan.getIpRange().split("-") : 
vlan.getIp6Range().split("-");
-                    ipAddressRanges.add(range);
-                }
-            }
 
             HostVO nuageVspHost = getNuageVspHost(physicalNetworkId);
             List<String> dnsServers = _nuageVspManager.getDnsDetails(network);
-            List<String> gatewaySystemIds = 
_nuageVspManager.getGatewaySystemIds();
-            ImplementNetworkVspCommand.Builder cmdBuilder = new 
ImplementNetworkVspCommand.Builder()
-                    .networkDomainName(networksDomain.getName())
-                    .networkDomainPath(networksDomain.getPath())
-                    .networkDomainUuid(networksDomain.getUuid())
-                    .networkAccountName(networksAccount.getAccountName())
-                    .networkAccountUuid(networksAccount.getUuid())
-                    .networkName(network.getName())
-                    .networkCidr(network.getCidr())
-                    .networkGateway(network.getGateway())
-                    .networkAclId(network.getNetworkACLId())
-                    .dnsServers(dnsServers)
-                    .gatewaySystemIds(gatewaySystemIds)
-                    .networkUuid(network.getUuid())
-                    .isL3Network(isL3Network)
-                    .isVpc(isVpc)
-                    .isSharedNetwork(isSharedNetwork)
-                    .vpcName(vpcName)
-                    .vpcUuid(vpcUuid)
-                    .defaultEgressPolicy(offering.getEgressDefaultPolicy())
-                    .ipAddressRange(ipAddressRanges)
-                    .domainTemplateName(preConfiguredDomainTemplateName);
-            Answer answer = _agentMgr.easySend(nuageVspHost.getId(), 
cmdBuilder.build());
+            ImplementNetworkVspCommand cmd = new 
ImplementNetworkVspCommand(vspNetwork, dnsServers);
+            Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd);
 
             if (answer == null || !answer.getResult()) {
                 s_logger.error("ImplementNetworkVspCommand for network " + 
network.getUuid() + " failed on Nuage VSD " + 
nuageVspHost.getDetail("hostname"));
@@ -237,7 +195,18 @@ public class NuageVspGuestNetworkGuru extends 
GuestNetworkGuru {
                 }
                 return null;
             }
-            s_logger.info("Implemented OK, network " + networkUuid + " in 
tenant " + tenantId + " linked to " + implemented.getBroadcastUri());
+
+            if (StringUtils.isNotBlank(vspNetwork.getDomainTemplateName())) {
+                if (network.getVpcId() != null) {
+                    VpcDetailVO vpcDetail = new 
VpcDetailVO(network.getVpcId(), NuageVspManager.nuageDomainTemplateDetailName, 
vspNetwork.getDomainTemplateName(), false);
+                    _vpcDetailsDao.persist(vpcDetail);
+                } else {
+                    NetworkDetailVO networkDetail = new 
NetworkDetailVO(implemented.getId(), 
NuageVspManager.nuageDomainTemplateDetailName, 
vspNetwork.getDomainTemplateName(), false);
+                    _networkDetailsDao.persist(networkDetail);
+                }
+            }
+
+            s_logger.info("Implemented OK, network " + implemented.getUuid() + 
" in tenant " + tenantId + " linked to " + implemented.getBroadcastUri());
         } finally {
             _networkDao.releaseFromLockTable(network.getId());
         }
@@ -262,68 +231,38 @@ public class NuageVspGuestNetworkGuru extends 
GuestNetworkGuru {
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("Handling reserve() call back to with Create a 
new VM or add an interface to existing VM in network " + network.getName());
             }
-            nic.setBroadcastUri(network.getBroadcastUri());
-            nic.setIsolationUri(network.getBroadcastUri());
+
             DataCenter dc = _dcDao.findById(network.getDataCenterId());
-            Account networksAccount = 
_accountDao.findById(network.getAccountId());
-            DomainVO networksDomain = 
_domainDao.findById(network.getDomainId());
-            //Get the Account details and find the type
-            long networkOwnedBy = network.getAccountId();
-            AccountVO neworkAccountDetails = 
_accountDao.findById(networkOwnedBy);
+            AccountVO neworkAccountDetails = 
_accountDao.findById(network.getAccountId());
             if (neworkAccountDetails.getType() == 
Account.ACCOUNT_TYPE_PROJECT) {
                 throw new InsufficientVirtualNetworkCapacityException("CS 
project support is not yet implemented in NuageVsp", DataCenter.class, 
dc.getId());
             }
 
-            //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 nicFrmDB = _nicDao.findById(nic.getId());
-            NetworkOffering networkOffering = 
_ntwkOfferingDao.findById(network.getNetworkOfferingId());
-            boolean isDomainRouter = 
vm.getType().equals(VirtualMachine.Type.DomainRouter);
-            URI broadcastUri = network.getBroadcastUri();
-            if (Strings.isNullOrEmpty(broadcastUri.getPath()) || 
!broadcastUri.getPath().startsWith("/")) {
+            if (Strings.isNullOrEmpty(network.getBroadcastUri().getPath()) || 
!network.getBroadcastUri().getPath().startsWith("/")) {
                 throw new IllegalStateException("The broadcast URI path " + 
network.getBroadcastUri() + " is empty or in an incorrect format.");
             }
-            String domainRouterIp = 
network.getBroadcastUri().getPath().substring(1);
-            boolean isL3Network = isL3Network(network);
-            boolean isSharedNetwork = networkOffering.getGuestType() == 
GuestType.Shared;
-            Long vpcId = network.getVpcId();
-            String vpcUuid = null;
-            if (vpcId != null) {
-                Vpc vpcObj = _vpcDao.findById(vpcId);
-                vpcUuid = vpcObj.getUuid();
-            }
-            HostVO nuageVspHost = 
getNuageVspHost(network.getPhysicalNetworkId());
+
+            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());
 
-            ReserveVmInterfaceVspCommand.Builder cmdBuilder = new 
ReserveVmInterfaceVspCommand.Builder()
-                    .nicUuid(nicFrmDB.getUuid())
-                    .nicMacAddress(nic.getMacAddress())
-                    .networkUuid(network.getUuid())
-                    .isL3Network(isL3Network)
-                    .isSharedNetwork(isSharedNetwork)
-                    .vpcUuid(vpcUuid)
-                    .networkDomainUuid(networksDomain.getUuid())
-                    .networksAccountUuid(networksAccount.getUuid())
-                    .isDomainRouter(isDomainRouter)
-                    .domainRouterIp(domainRouterIp)
-                    .vmInstanceName(vm.getInstanceName())
-                    .vmUuid(vm.getUuid())
-                    .vmUserName(networksDomain.getUuid())
-                    .vmUserDomainName(networksAccount.getUuid())
-                    .useStaticIp(true)
-                    .staticIp(nic.getIPv4Address());
+            VspNetwork vspNetwork = 
_nuageVspEntityBuilder.buildVspNetwork(network, false);
+            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());
-                cmdBuilder = cmdBuilder.staticNatIpUuid(staticNatIp.getUuid())
-                        .staticNatIpAddress(staticNatIp.getAddress().addr())
-                        
.isStaticNatIpAllocated(staticNatIp.getState().equals(IpAddress.State.Allocated))
-                        .isOneToOneNat(staticNatIp.isOneToOneNat())
-                        .staticNatVlanUuid(staticNatVlan.getUuid())
-                        .staticNatVlanGateway(staticNatVlan.getVlanGateway())
-                        .staticNatVlanNetmask(staticNatVlan.getVlanNetmask());
+                vspStaticNat = _nuageVspEntityBuilder.buildVspStaticNat(null, 
staticNatIp, staticNatVlan, null);
             }
 
-            Answer answer = _agentMgr.easySend(nuageVspHost.getId(), 
cmdBuilder.build());
+            HostVO nuageVspHost = 
getNuageVspHost(network.getPhysicalNetworkId());
+            ReserveVmInterfaceVspCommand cmd = new 
ReserveVmInterfaceVspCommand(vspNetwork, vspVm, vspNic, vspStaticNat);
+            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())) {
@@ -332,8 +271,8 @@ public class NuageVspGuestNetworkGuru extends 
GuestNetworkGuru {
                 throw new InsufficientVirtualNetworkCapacityException("Failed 
to reserve VM in Nuage VSP.", Network.class, network.getId());
             }
 
-            if (isDomainRouter) {
-                nic.setIPv4Address(domainRouterIp);
+            if (vspVm.getDomainRouter() == Boolean.TRUE) {
+                nic.setIPv4Address(vspVm.getDomainRouterIp());
             }
 
         } finally {
@@ -378,32 +317,16 @@ public class NuageVspGuestNetworkGuru extends 
GuestNetworkGuru {
                 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());
             }
-            DomainVO networksDomain = 
_domainDao.findById(network.getDomainId());
-            NicVO nicFrmDd = _nicDao.findById(nic.getId());
-            NetworkOffering networkOffering = 
_ntwkOfferingDao.findById(network.getNetworkOfferingId());
-            boolean isL3Network = isL3Network(network);
-            boolean isSharedNetwork = networkOffering.getGuestType() == 
GuestType.Shared;
-            boolean isExpunging = vm.getVirtualMachine().getState() == 
VirtualMachine.State.Expunging;
-            Long vpcId = network.getVpcId();
-            String vpcUuid = null;
-            if (vpcId != null) {
-                Vpc vpcObj = _vpcDao.findById(vpcId);
-                vpcUuid = vpcObj.getUuid();
-            }
+
+            NicVO nicFromDb = _nicDao.findById(nic.getId());
+
+            VspNetwork vspNetwork = 
_nuageVspEntityBuilder.buildVspNetwork(network, false);
+            VspVm vspVm = 
_nuageVspEntityBuilder.buildVspVm(vm.getVirtualMachine(), network);
+            VspNic vspNic = 
_nuageVspEntityBuilder.buildVspNic(nicFromDb.getUuid(), nic);
             HostVO nuageVspHost = 
getNuageVspHost(network.getPhysicalNetworkId());
-            DeallocateVmVspCommand.Builder cmdBuilder = new 
DeallocateVmVspCommand.Builder()
-                    .networkUuid(network.getUuid())
-                    .nicFromDbUuid(nicFrmDd.getUuid())
-                    .nicMacAddress(nic.getMacAddress())
-                    .nicIp4Address(nic.getIPv4Address())
-                    .isL3Network(isL3Network)
-                    .isSharedNetwork(isSharedNetwork)
-                    .vpcUuid(vpcUuid)
-                    .networksDomainUuid(networksDomain.getUuid())
-                    .vmInstanceName(vm.getInstanceName())
-                    .vmUuid(vm.getUuid())
-                    .isExpungingState(isExpunging);
-            Answer answer = _agentMgr.easySend(nuageVspHost.getId(), 
cmdBuilder.build());
+
+            DeallocateVmVspCommand cmd = new 
DeallocateVmVspCommand(vspNetwork, vspVm, vspNic);
+            Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd);
             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())) {
@@ -451,27 +374,10 @@ public class NuageVspGuestNetworkGuru extends 
GuestNetworkGuru {
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("Handling trash() call back to delete the 
network " + network.getName() + " with uuid " + network.getUuid() + " from 
VSP");
             }
-            long domainId = network.getDomainId();
-            Domain domain = _domainDao.findById(domainId);
-            boolean isL3Network = isL3Network(network);
-            boolean isSharedNetwork = offering.getGuestType() == 
GuestType.Shared;
-            Long vpcId = network.getVpcId();
-            String vpcUuid = null;
-            if (vpcId != null) {
-                Vpc vpcObj = _vpcDao.findById(vpcId);
-                vpcUuid = vpcObj.getUuid();
-            }
-
-            String preConfiguredDomainTemplateName = 
NuageVspUtil.getPreConfiguredDomainTemplateName(_configDao, network, offering);
+            VspNetwork vspNetwork = 
_nuageVspEntityBuilder.buildVspNetwork(network, false);
             HostVO nuageVspHost = 
getNuageVspHost(network.getPhysicalNetworkId());
-            TrashNetworkVspCommand.Builder cmdBuilder = new 
TrashNetworkVspCommand.Builder()
-                    .domainUuid(domain.getUuid())
-                    .networkUuid(network.getUuid())
-                    .isL3Network(isL3Network)
-                    .isSharedNetwork(isSharedNetwork)
-                    .vpcUuid(vpcUuid)
-                    .domainTemplateName(preConfiguredDomainTemplateName);
-            Answer answer = _agentMgr.easySend(nuageVspHost.getId(), 
cmdBuilder.build());
+            TrashNetworkVspCommand cmd = new 
TrashNetworkVspCommand(vspNetwork);
+            Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd);
             if (answer == null || !answer.getResult()) {
                 s_logger.error("TrashNetworkNuageVspCommand for network " + 
network.getUuid() + " failed");
                 if ((null != answer) && (null != answer.getDetails())) {
@@ -485,51 +391,6 @@ public class NuageVspGuestNetworkGuru extends 
GuestNetworkGuru {
         return super.trash(network, offering);
     }
 
-    private String getVirtualRouterIP(Network network, Collection<String[]> 
ipAddressRanges) throws InsufficientVirtualNetworkCapacityException {
-        String virtualRouterIp;
-        //Check if the subnet has minimum 5 host in it.
-        String subnet = NetUtils.getCidrSubNet(network.getCidr());
-        String netmask = NetUtils.getCidrNetmask(network.getCidr());
-        long cidrSize = NetUtils.getCidrSize(netmask);
-
-        Set<Long> allIPsInCidr = NetUtils.getAllIpsFromCidr(subnet, cidrSize, 
new HashSet<Long>());
-        if (allIPsInCidr == null || !(allIPsInCidr instanceof TreeSet)) {
-            throw new IllegalStateException("The IPs in CIDR for subnet " + 
subnet + " where null or returned in a non-ordered set.");
-        }
-
-        if (allIPsInCidr.size() > 3) {
-            //get the second IP and see if it the networks GatewayIP
-            Iterator<Long> ipIterator = allIPsInCidr.iterator();
-            long vip = ipIterator.next();
-            if (NetUtils.ip2Long(network.getGateway()) == vip) {
-                vip = ipIterator.next();
-                virtualRouterIp = NetUtils.long2Ip(vip);
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("1st IP is used as gateway IP. Reserving " 
+ virtualRouterIp + " for the Virtual Router IP for Network(" + 
network.getName() + ")");
-                }
-            } else {
-                virtualRouterIp = NetUtils.long2Ip(vip);
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("1st IP is not used as the gateway IP. 
Reserving" + virtualRouterIp + " for the Virtual Router IP for Network(" + 
network.getName() + ")");
-                }
-            }
-            ipAddressRanges.add(new String[] {
-                NetUtils.long2Ip(ipIterator.next()),
-                NetUtils.getIpRangeEndIpFromCidr(subnet, cidrSize)
-            });
-            return virtualRouterIp;
-        }
-
-        throw new InsufficientVirtualNetworkCapacityException("VSP allocates 
an IP for VirtualRouter." + " So, subnet should have atleast minimum 4 hosts ", 
Network.class,
-                network.getId());
-    }
-
-    private boolean isL3Network(Network network) {
-        return 
_ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(),
 Service.SourceNat)
-                || 
_ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(),
 Service.StaticNat)
-                || network.getGuestType() == GuestType.Shared;
-    }
-
     private HostVO getNuageVspHost(long physicalNetworkId) {
         HostVO nuageVspHost;
         List<NuageVspDeviceVO> nuageVspDevices = 
_nuageVspDao.listByPhysicalNetwork(physicalNetworkId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b0c27e48/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManager.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManager.java
 
b/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManager.java
index 0aae22c..4861fb2 100644
--- 
a/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManager.java
+++ 
b/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManager.java
@@ -40,6 +40,8 @@ public interface NuageVspManager extends PluggableService {
 
     static final String nuageVPCOfferingDisplayText = "Nuage VSP VPC Offering";
 
+    static final String nuageDomainTemplateDetailName = "domainTemplateName";
+
     static final ConfigKey<Boolean> NuageVspConfigDns = new 
ConfigKey<Boolean>(Boolean.class, "nuagevsp.configure.dns", "Advanced", "true",
             "Defines if NuageVsp plugin needs to configure DNS setting for a 
VM or not. True will configure the DNS and false will not configure the DNS 
settings", true,
             Scope.Global, null);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b0c27e48/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java
 
b/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java
index f38a9c7..04b1ccc 100644
--- 
a/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java
+++ 
b/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java
@@ -27,8 +27,8 @@ import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
 import com.cloud.agent.api.PingNuageVspCommand;
 import com.cloud.agent.api.StartupCommand;
-import com.cloud.agent.api.manager.GetClientDefaultsAnswer;
-import com.cloud.agent.api.manager.GetClientDefaultsCommand;
+import com.cloud.agent.api.manager.GetApiDefaultsAnswer;
+import com.cloud.agent.api.manager.GetApiDefaultsCommand;
 import com.cloud.agent.api.manager.SupportedApiVersionCommand;
 import com.cloud.agent.api.sync.SyncDomainAnswer;
 import com.cloud.agent.api.sync.SyncDomainCommand;
@@ -37,7 +37,6 @@ import com.cloud.agent.api.sync.SyncNuageVspCmsIdCommand;
 import com.cloud.api.ApiDBUtils;
 import com.cloud.api.commands.AddNuageVspDeviceCmd;
 import com.cloud.api.commands.DeleteNuageVspDeviceCmd;
-import com.cloud.api.commands.IssueNuageVspResourceRequestCmd;
 import com.cloud.api.commands.ListNuageVspDevicesCmd;
 import com.cloud.api.commands.UpdateNuageVspDeviceCmd;
 import com.cloud.api.response.NuageVspDeviceResponse;
@@ -70,7 +69,6 @@ import 
com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
 import com.cloud.network.dao.PhysicalNetworkVO;
 import com.cloud.network.resource.NuageVspResource;
-import com.cloud.network.sync.NuageVspSync;
 import com.cloud.network.vpc.VpcManager;
 import com.cloud.network.vpc.VpcOffering;
 import com.cloud.network.vpc.VpcOfferingServiceMapVO;
@@ -106,7 +104,10 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+import com.cloud.util.NuageVspEntityBuilder;
 import net.nuage.vsp.acs.NuageVspPluginClientLoader;
+import net.nuage.vsp.acs.client.api.model.VspApiDefaults;
+import net.nuage.vsp.acs.client.api.model.VspDomain;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.Configurable;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
@@ -127,7 +128,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ScheduledExecutorService;
 
 import static com.cloud.agent.api.sync.SyncNuageVspCmsIdCommand.SyncType;
 
@@ -135,8 +135,6 @@ public class NuageVspManagerImpl extends ManagerBase 
implements NuageVspManager,
 
     private static final Logger s_logger = 
Logger.getLogger(NuageVspManagerImpl.class);
 
-    private static final int ONE_MINUTE_MULTIPLIER = 60 * 1000;
-
     public static final Map<Network.Service, Set<Network.Provider>> 
NUAGE_VSP_VPC_SERVICE_MAP;
     private static final ConfigKey[] NUAGE_VSP_CONFIG_KEYS = new 
ConfigKey<?>[] { NuageVspConfigDns, NuageVspDnsExternal, NuageVspConfigGateway,
             NuageVspSharedNetworkDomainTemplateName, 
NuageVspVpcDomainTemplateName, NuageVspIsolatedNetworkDomainTemplateName };
@@ -164,8 +162,6 @@ public class NuageVspManagerImpl extends ManagerBase 
implements NuageVspManager,
     @Inject
     NuageVspDao _nuageVspDao;
     @Inject
-    NuageVspSync _nuageVspSync;
-    @Inject
     DataCenterDao _dataCenterDao;
     @Inject
     ConfigurationDao _configDao;
@@ -187,8 +183,8 @@ public class NuageVspManagerImpl extends ManagerBase 
implements NuageVspManager,
     NetworkOfferingDao _networkOfferingDao;
     @Inject
     NetworkOfferingServiceMapDao _networkOfferingServiceMapDao;
-
-    private ScheduledExecutorService scheduler;
+    @Inject
+    NuageVspEntityBuilder _nuageVspEntityBuilder;
 
     @Inject
     MessageBus _messageBus;
@@ -212,7 +208,7 @@ public class NuageVspManagerImpl extends ManagerBase 
implements NuageVspManager,
     @Override
     public List<Class<?>> getCommands() {
         return Lists.<Class<?>>newArrayList(AddNuageVspDeviceCmd.class, 
DeleteNuageVspDeviceCmd.class, ListNuageVspDevicesCmd.class,
-                IssueNuageVspResourceRequestCmd.class, 
UpdateNuageVspDeviceCmd.class);
+                UpdateNuageVspDeviceCmd.class);
     }
 
     @Override
@@ -242,21 +238,21 @@ public class NuageVspManagerImpl extends ManagerBase 
implements NuageVspManager,
         }
 
         try {
-            NuageVspPluginClientLoader clientLoader = 
NuageVspPluginClientLoader.getClientLoader(null, null, 1, 1, null);
+            NuageVspPluginClientLoader clientLoader = 
NuageVspPluginClientLoader.getClientLoader(null, null, null, null, 1, 1, null);
 
-            Map<String, Object> clientDefaults = 
clientLoader.getNuageVspManagerClient().getClientDefaults();
-            String apiVersion = MoreObjects.firstNonNull(cmd.getApiVersion(), 
(String) clientDefaults.get("CURRENT_API_VERSION"));
+            VspApiDefaults apiDefaults = 
clientLoader.getNuageVspManagerClient().getApiDefaults();
+            String apiVersion = MoreObjects.firstNonNull(cmd.getApiVersion(), 
apiDefaults.getVersion());
             if 
(!clientLoader.getNuageVspManagerClient().isSupportedApiVersion(apiVersion)) {
                 throw new CloudRuntimeException("Unsupported API version : " + 
apiVersion);
             }
 
             int port = cmd.getPort();
             if (0 == port) {
-                port = 8443;
+                port = 443;
             }
             String cmsUserPasswordBase64 = 
NuageVspUtil.encodePassword(cmd.getPassword());
-            String retryCount = 
String.valueOf(MoreObjects.firstNonNull(cmd.getApiRetryCount(), 
clientDefaults.get("DEFAULT_API_RETRY_COUNT")));
-            String retryInterval = 
String.valueOf(MoreObjects.firstNonNull(cmd.getApiRetryInterval(), 
clientDefaults.get("DEFAULT_API_RETRY_INTERVAL")));
+            String retryCount = 
String.valueOf(MoreObjects.firstNonNull(cmd.getApiRetryCount(), 
apiDefaults.getRetryCount()));
+            String retryInterval = 
String.valueOf(MoreObjects.firstNonNull(cmd.getApiRetryInterval(), 
apiDefaults.getRetryInterval()));
             NuageVspResource.Configuration resourceConfiguration = new 
NuageVspResource.Configuration()
                     .name("Nuage VSD - " + cmd.getHostName())
                     .guid(UUID.randomUUID().toString())
@@ -284,22 +280,33 @@ public class NuageVspManagerImpl extends ManagerBase 
implements NuageVspManager,
             _hostDetailsDao.persist(detail);
 
             ConfigurationVO cmsIdConfig = 
_configDao.findByName("nuagevsp.cms.id");
+            NuageVspDeviceVO matchingNuageVspDevice = 
findMatchingNuageVspDevice(nuageVspDevice);
+            String cmsId;
+            if (matchingNuageVspDevice != null) {
+                cmsId = 
findNuageVspCmsIdForDevice(matchingNuageVspDevice.getId(), cmsIdConfig);
+            } else {
+                SyncNuageVspCmsIdCommand syncCmd = new 
SyncNuageVspCmsIdCommand(SyncType.REGISTER, null);
+                SyncNuageVspCmsIdAnswer answer = (SyncNuageVspCmsIdAnswer) 
_agentMgr.easySend(nuageVspDevice.getHostId(), syncCmd);
+                if (answer != null && answer.getSuccess()) {
+                    cmsId = answer.getNuageVspCmsId();
+                } else {
+                    throw new CloudRuntimeException("Failed to register CMS 
ID");
+                }
+            }
+
             host = findNuageVspHost(nuageVspDevice.getHostId());
-            SyncNuageVspCmsIdCommand syncCmd = new 
SyncNuageVspCmsIdCommand(SyncType.REGISTER, null);
-            SyncNuageVspCmsIdAnswer answer = (SyncNuageVspCmsIdAnswer) 
_agentMgr.easySend(nuageVspDevice.getHostId(), syncCmd);
-            if (answer != null && answer.getSuccess()) {
-                registerNewNuageVspDevice(cmsIdConfig, nuageVspDevice.getId() 
+ ":" + answer.getNuageVspCmsId());
+            registerNewNuageVspDevice(cmsIdConfig, nuageVspDevice.getId() + 
":" + cmsId);
 
-                detail = new DetailVO(host.getId(), "nuagevspcmsid", 
answer.getNuageVspCmsId());
-                _hostDetailsDao.persist(detail);
+            detail = new DetailVO(host.getId(), "nuagevspcmsid", cmsId);
+            _hostDetailsDao.persist(detail);
 
-                resourceConfiguration.nuageVspCmsId(answer.getNuageVspCmsId());
-                resource.configure(cmd.getHostName(), Maps.<String, 
Object>newHashMap(resourceConfiguration.build()));
+            resourceConfiguration.nuageVspCmsId(cmsId);
+            resource.configure(cmd.getHostName(), Maps.<String, 
Object>newHashMap(resourceConfiguration.build()));
 
+            if (matchingNuageVspDevice == null) {
                 auditDomainsOnVsp((HostVO) host, true, false);
-            } else {
-                throw new CloudRuntimeException("Failed to register CMS ID");
             }
+
             return nuageVspDevice;
         } catch (ConfigurationException e) {
             s_logger.error("Failed to configure Nuage VSD resource " + 
cmd.getHostName(), e);
@@ -372,13 +379,13 @@ public class NuageVspManagerImpl extends ManagerBase 
implements NuageVspManager,
             updateRequired = true;
         }
 
-        GetClientDefaultsCommand getClientDefaultsCmd = new 
GetClientDefaultsCommand();
-        GetClientDefaultsAnswer getClientDefaultsAnswer = 
(GetClientDefaultsAnswer) _agentMgr.easySend(nuageVspHost.getId(), 
getClientDefaultsCmd);
+        GetApiDefaultsCommand apiDefaultsCmd = new GetApiDefaultsCommand();
+        GetApiDefaultsAnswer apiDefaultsAnswer = (GetApiDefaultsAnswer) 
_agentMgr.easySend(nuageVspHost.getId(), apiDefaultsCmd);
         String apiVersion = MoreObjects.firstNonNull(command.getApiVersion(), 
resourceConfiguration.apiVersion());
         SupportedApiVersionCommand supportedApiVersionCmd = new 
SupportedApiVersionCommand(apiVersion);
         Answer supportedApiVersionAnswer = 
_agentMgr.easySend(nuageVspHost.getId(), supportedApiVersionCmd);
         if (!supportedApiVersionAnswer.getResult()) {
-            throw new CloudRuntimeException("Incorrect API version: Nuage 
plugin only supports " + getClientDefaultsAnswer.getCurrentApiVersion());
+            throw new CloudRuntimeException("Incorrect API version: Nuage 
plugin only supports " + apiDefaultsAnswer.getApiDefaults().getVersion());
         }
 
         String apiRelativePath = "/nuage/api/" + apiVersion;
@@ -474,25 +481,31 @@ public class NuageVspManagerImpl extends ManagerBase 
implements NuageVspManager,
             }
         }
 
+        NuageVspDeviceVO matchingNuageVspDevice = 
findMatchingNuageVspDevice(nuageVspDevice);
         ConfigurationVO cmsIdConfig = _configDao.findByName("nuagevsp.cms.id");
         HostVO host = findNuageVspHost(nuageVspDevice.getHostId());
-        if (!auditDomainsOnVsp(host, false, true)) {
-            return false;
-        }
-
         String nuageVspCmsId = 
findNuageVspCmsIdForDevice(nuageVspDevice.getId(), cmsIdConfig);
-        SyncNuageVspCmsIdCommand syncCmd = new 
SyncNuageVspCmsIdCommand(SyncType.UNREGISTER, nuageVspCmsId);
-        SyncNuageVspCmsIdAnswer answer = (SyncNuageVspCmsIdAnswer) 
_agentMgr.easySend(nuageVspDevice.getHostId(), syncCmd);
-        if (answer != null && answer.getSuccess()) {
-            String currentValue = cmsIdConfig.getValue();
-            String newValue = currentValue.replace(nuageVspDevice.getId() + 
":" + answer.getNuageVspCmsId(), "");
-            if (!Strings.isNullOrEmpty(newValue) && newValue.startsWith(";")) {
-                newValue = newValue.substring(1);
+        if (matchingNuageVspDevice == null) {
+            if (!auditDomainsOnVsp(host, false, true)) {
+                return false;
             }
-            _configDao.update("nuagevsp.cms.id", newValue);
-        } else {
-            return false;
+
+            SyncNuageVspCmsIdCommand syncCmd = new 
SyncNuageVspCmsIdCommand(SyncType.UNREGISTER, nuageVspCmsId);
+            SyncNuageVspCmsIdAnswer answer = (SyncNuageVspCmsIdAnswer) 
_agentMgr.easySend(nuageVspDevice.getHostId(), syncCmd);
+            if (answer == null || !answer.getSuccess()) {
+                return false;
+            }
+        }
+
+        String newValue = 
cmsIdConfig.getValue().replace(nuageVspDevice.getId() + ":" + nuageVspCmsId, 
"");
+        if (newValue.startsWith(";")) {
+            newValue = newValue.substring(1);
         }
+        if (newValue.endsWith(";")) {
+            newValue = newValue.substring(0, newValue.length() - 1);
+        }
+        newValue = newValue.replaceAll(";+", ";");
+        _configDao.update("nuagevsp.cms.id", newValue);
 
         HostVO nuageHost = _hostDao.findById(nuageVspDevice.getHostId());
         Long hostId = nuageHost.getId();
@@ -505,6 +518,22 @@ public class NuageVspManagerImpl extends ManagerBase 
implements NuageVspManager,
         return true;
     }
 
+    private NuageVspDeviceVO findMatchingNuageVspDevice(NuageVspDeviceVO 
nuageVspDevice) {
+        List<NuageVspDeviceVO> otherNuageVspDevices = _nuageVspDao.listAll();
+        for (NuageVspDeviceVO otherNuageVspDevice : otherNuageVspDevices) {
+            if (otherNuageVspDevice.getId() == nuageVspDevice.getId()) 
continue;
+
+            HostVO nuageVspDeviceHost = 
findNuageVspHost(nuageVspDevice.getHostId());
+            HostVO otherNuageVspDeviceHost = 
findNuageVspHost(otherNuageVspDevice.getHostId());
+            String nuageVspDeviceHostName = 
nuageVspDeviceHost.getDetail("hostname");
+            String otherNuageVspDeviceHostName = 
otherNuageVspDeviceHost.getDetail("hostname");
+            if (otherNuageVspDeviceHostName != null && 
otherNuageVspDeviceHostName.equals(nuageVspDeviceHostName)) {
+                return otherNuageVspDevice;
+            }
+        }
+        return null;
+    }
+
     @Override
     public List<NuageVspDeviceVO> listNuageVspDevices(ListNuageVspDevicesCmd 
cmd) {
         Long physicalNetworkId = cmd.getPhysicalNetworkId();
@@ -551,6 +580,8 @@ public class NuageVspManagerImpl extends ManagerBase 
implements NuageVspManager,
     }
 
     private void auditHost(HostVO host) {
+        if (host == null) return;
+
         _hostDao.loadDetails(host);
 
         boolean validateDomains = true;
@@ -585,7 +616,8 @@ public class NuageVspManagerImpl extends ManagerBase 
implements NuageVspManager,
         _hostDao.loadDetails(host);
         List<DomainVO> allDomains = _domainDao.listAll();
         for (DomainVO domain : allDomains) {
-            SyncDomainCommand cmd = new SyncDomainCommand(domain.getUuid(), 
domain.getName(), domain.getPath(), add, remove);
+            VspDomain vspDomain = 
_nuageVspEntityBuilder.buildVspDomain(domain);
+            SyncDomainCommand cmd = new SyncDomainCommand(vspDomain, add, 
remove);
             SyncDomainAnswer answer = (SyncDomainAnswer) 
_agentMgr.easySend(host.getId(), cmd);
             return answer.getSuccess();
         }
@@ -683,7 +715,8 @@ public class NuageVspManagerImpl extends ManagerBase 
implements NuageVspManager,
                     List<NuageVspDeviceVO> nuageVspDevices = 
_nuageVspDao.listAll();
                     for (NuageVspDeviceVO nuageVspDevice : nuageVspDevices) {
                         HostVO host = 
findNuageVspHost(nuageVspDevice.getHostId());
-                        SyncDomainCommand cmd = new 
SyncDomainCommand(domain.getUuid(), domain.getName(), domain.getPath(), true, 
false);
+                        VspDomain vspDomain = 
_nuageVspEntityBuilder.buildVspDomain(domain);
+                        SyncDomainCommand cmd = new 
SyncDomainCommand(vspDomain, true, false);
                         _agentMgr.easySend(host.getId(), cmd);
                     }
                 } finally {
@@ -700,7 +733,8 @@ public class NuageVspManagerImpl extends ManagerBase 
implements NuageVspManager,
                 List<NuageVspDeviceVO> nuageVspDevices = 
_nuageVspDao.listAll();
                 for (NuageVspDeviceVO nuageVspDevice : nuageVspDevices) {
                     HostVO host = findNuageVspHost(nuageVspDevice.getHostId());
-                    SyncDomainCommand cmd = new 
SyncDomainCommand(domain.getUuid(), domain.getName(), domain.getPath(), false, 
true);
+                    VspDomain vspDomain = 
_nuageVspEntityBuilder.buildVspDomain(domain);
+                    SyncDomainCommand cmd = new SyncDomainCommand(vspDomain, 
false, true);
                     _agentMgr.easySend(host.getId(), cmd);
                 }
             }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b0c27e48/plugins/network-elements/nuage-vsp/src/com/cloud/network/resource/NuageVspResource.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nuage-vsp/src/com/cloud/network/resource/NuageVspResource.java
 
b/plugins/network-elements/nuage-vsp/src/com/cloud/network/resource/NuageVspResource.java
index 8e14237..677fa9f 100644
--- 
a/plugins/network-elements/nuage-vsp/src/com/cloud/network/resource/NuageVspResource.java
+++ 
b/plugins/network-elements/nuage-vsp/src/com/cloud/network/resource/NuageVspResource.java
@@ -30,8 +30,6 @@ import com.cloud.agent.api.ReadyAnswer;
 import com.cloud.agent.api.ReadyCommand;
 import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupVspCommand;
-import com.cloud.agent.api.VspResourceAnswer;
-import com.cloud.agent.api.VspResourceCommand;
 import com.cloud.agent.api.element.ApplyAclRuleVspCommand;
 import com.cloud.agent.api.element.ApplyStaticNatVspCommand;
 import com.cloud.agent.api.element.ImplementVspCommand;
@@ -40,14 +38,13 @@ 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.guru.TrashNetworkVspCommand;
-import com.cloud.agent.api.manager.GetClientDefaultsAnswer;
-import com.cloud.agent.api.manager.GetClientDefaultsCommand;
+import com.cloud.agent.api.manager.GetApiDefaultsAnswer;
+import com.cloud.agent.api.manager.GetApiDefaultsCommand;
 import com.cloud.agent.api.manager.SupportedApiVersionCommand;
 import com.cloud.agent.api.sync.SyncDomainAnswer;
 import com.cloud.agent.api.sync.SyncDomainCommand;
 import com.cloud.agent.api.sync.SyncNuageVspCmsIdAnswer;
 import com.cloud.agent.api.sync.SyncNuageVspCmsIdCommand;
-import com.cloud.agent.api.sync.SyncVspCommand;
 import com.cloud.host.Host;
 import com.cloud.resource.ServerResource;
 import com.cloud.util.NuageVspUtil;
@@ -56,12 +53,11 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.google.common.base.Strings;
 import net.nuage.vsp.acs.NuageVspPluginClientLoader;
-import net.nuage.vsp.acs.client.NuageVspApiClient;
-import net.nuage.vsp.acs.client.NuageVspElementClient;
-import net.nuage.vsp.acs.client.NuageVspGuruClient;
-import net.nuage.vsp.acs.client.NuageVspManagerClient;
-import net.nuage.vsp.acs.client.NuageVspSyncClient;
-import org.apache.commons.lang3.tuple.Pair;
+import net.nuage.vsp.acs.client.api.NuageVspApiClient;
+import net.nuage.vsp.acs.client.api.NuageVspElementClient;
+import net.nuage.vsp.acs.client.api.NuageVspGuruClient;
+import net.nuage.vsp.acs.client.api.NuageVspManagerClient;
+import net.nuage.vsp.acs.client.common.model.Pair;
 import org.apache.log4j.Logger;
 
 import javax.naming.ConfigurationException;
@@ -91,7 +87,8 @@ public class NuageVspResource extends ManagerBase implements 
ServerResource {
     private String _name;
     private String _guid;
     private String _zoneId;
-    private String[] _cmsUserInfo;
+    private String _cmsUserLogin;
+    private String _cmsUserPassword;
     private String _hostName;
     private String _relativePath;
     private int _numRetries;
@@ -102,7 +99,6 @@ public class NuageVspResource extends ManagerBase implements 
ServerResource {
     protected NuageVspApiClient _nuageVspApiClient;
     protected NuageVspGuruClient _nuageVspGuruClient;
     protected NuageVspElementClient _nuageVspElementClient;
-    protected NuageVspSyncClient _nuageVspSyncClient;
     protected NuageVspManagerClient _nuageVspManagerClient;
     protected boolean _isNuageVspClientLoaded;
 
@@ -190,7 +186,8 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
         _relativePath = new 
StringBuffer().append("https://";).append(_hostName).append(":").append(port).append(apiRelativePath).toString();
 
         String cmsUserPass = NuageVspUtil.decodePassword(cmsUserPassBase64);
-        _cmsUserInfo = new String[] {CMS_USER_ENTEPRISE_NAME, cmsUser, 
cmsUserPass};
+        _cmsUserLogin = cmsUser;
+        _cmsUserPassword = cmsUserPass;
 
         _nuageVspCmsId = (String)params.get(NUAGE_VSP_CMS_ID);
 
@@ -199,8 +196,8 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
         try {
             login();
         } catch (ExecutionException | ConfigurationException e) {
-            s_logger.error("Failed to login to Nuage VSD on " + name + " as 
user " + cmsUser, e);
-            throw new CloudRuntimeException("Failed to login to Nuage VSD on " 
+ name + " as user " + cmsUser, e);
+            s_logger.error(e.getMessage(), e);
+            throw new CloudRuntimeException(e.getMessage(), e);
         }
 
         return true;
@@ -211,23 +208,14 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
         _nuageVspApiClient.login();
     }
 
-    protected <A extends NuageVspApiClient, B extends NuageVspElementClient, C 
extends NuageVspSyncClient, D extends NuageVspGuruClient> void 
loadNuageClient() {
-
-        try {
-            NuageVspPluginClientLoader clientLoader = 
NuageVspPluginClientLoader.getClientLoader(_relativePath, _cmsUserInfo, 
_numRetries, _retryInterval, _nuageVspCmsId);
-            _nuageVspApiClient = clientLoader.getNuageVspApiClient();
-            _nuageVspSyncClient = clientLoader.getNuageVspSyncClient();
-            _nuageVspGuruClient = clientLoader.getNuageVspGuruClient();
-            _nuageVspElementClient = clientLoader.getNuageVspElementClient();
-            _nuageVspManagerClient = clientLoader.getNuageVspManagerClient();
-            _isNuageVspClientLoaded = true;
-        } catch (ConfigurationException e) {
-            _isNuageVspClientLoaded = false;
-            String errorMessage = "Nuage Vsp Plugin client is not yet 
installed. Please install NuageVsp plugin client to use NuageVsp plugin in 
Cloudstack. ";
-            s_logger.error(errorMessage, e);
-            throw new CloudRuntimeException(errorMessage, e);
-        }
-
+    protected <A extends NuageVspApiClient, B extends NuageVspElementClient, C 
extends NuageVspGuruClient> void loadNuageClient() {
+        NuageVspPluginClientLoader clientLoader = 
NuageVspPluginClientLoader.getClientLoader(_relativePath, 
CMS_USER_ENTEPRISE_NAME,
+                _cmsUserLogin, _cmsUserPassword, _numRetries, _retryInterval, 
_nuageVspCmsId);
+        _nuageVspApiClient = clientLoader.getNuageVspApiClient();
+        _nuageVspGuruClient = clientLoader.getNuageVspGuruClient();
+        _nuageVspElementClient = clientLoader.getNuageVspElementClient();
+        _nuageVspManagerClient = clientLoader.getNuageVspManagerClient();
+        _isNuageVspClientLoaded = true;
     }
 
     @Override
@@ -265,12 +253,12 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
 
     @Override
     public PingCommand getCurrentStatus(long id) {
-        if (_relativePath == null || _relativePath.isEmpty()) {
+        if (Strings.isNullOrEmpty(_relativePath)) {
             s_logger.error("Refusing to ping Nuage VSD because the resource 
configuration is missing the relative path information");
             _shouldAudit = true;
             return null;
         }
-        if (_cmsUserInfo == null || _cmsUserInfo.length < 2) {
+        if (Strings.isNullOrEmpty(_cmsUserLogin) || 
Strings.isNullOrEmpty(_cmsUserPassword)) {
             s_logger.error("Refusing to ping Nuage VSD because the resource 
configuration is missing the CMS user information");
             _shouldAudit = true;
             return null;
@@ -278,7 +266,7 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
         try {
             login();
         } catch (ExecutionException | ConfigurationException e) {
-            s_logger.error("Failed to ping to Nuage VSD on " + _name + " as 
user " + _cmsUserInfo[1], e);
+            s_logger.error("Failed to ping to Nuage VSD on " + _name + " as 
user " + _cmsUserLogin, e);
             _shouldAudit = true;
             return null;
         }
@@ -293,8 +281,6 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
             return executeRequest((ReadyCommand)cmd);
         } else if (cmd instanceof MaintainCommand) {
             return executeRequest((MaintainCommand)cmd);
-        } else if (cmd instanceof VspResourceCommand) {
-            return executeRequest((VspResourceCommand)cmd);
         }
         //Guru commands
         else if (cmd instanceof ImplementNetworkVspCommand) {
@@ -317,16 +303,14 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
             return executeRequest((ShutDownVpcVspCommand)cmd);
         }
         //Sync Commands
-        else if (cmd instanceof SyncVspCommand) {
-            return executeRequest((SyncVspCommand)cmd);
-        } else if (cmd instanceof SyncNuageVspCmsIdCommand) {
+        else if (cmd instanceof SyncNuageVspCmsIdCommand) {
             return executeRequest((SyncNuageVspCmsIdCommand)cmd);
         } else if (cmd instanceof SyncDomainCommand) {
             return executeRequest((SyncDomainCommand)cmd);
         }
         //Other commands
-        else if (cmd instanceof GetClientDefaultsCommand) {
-            return executeRequest((GetClientDefaultsCommand)cmd);
+        else if (cmd instanceof GetApiDefaultsCommand) {
+            return executeRequest((GetApiDefaultsCommand)cmd);
         } else if (cmd instanceof SupportedApiVersionCommand) {
             return executeRequest((SupportedApiVersionCommand)cmd);
         }
@@ -357,29 +341,11 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
         return new MaintainAnswer(cmd);
     }
 
-    private Answer executeRequest(VspResourceCommand cmd) {
-        try {
-            isNuageVspApiLoaded();
-            if (cmd.getRequestType().equalsIgnoreCase("GETALL") || 
cmd.getRequestType().equalsIgnoreCase("GET") || 
cmd.getRequestType().equalsIgnoreCase("GETRELATED")) {
-                String resourceInfo = 
_nuageVspApiClient.executeRestApi(cmd.getRequestType(), cmd.getResource(), 
cmd.getResourceId(), cmd.getChildResource(),
-                        cmd.getEntityDetails(), cmd.getResourceFilter(), 
cmd.getProxyUserUuid(), cmd.getProxyUserDomainuuid());
-                return new VspResourceAnswer(cmd, resourceInfo, "Executed 
Issue Resource command");
-            }
-            return new VspResourceAnswer(cmd, false, cmd.getRequestType() + " 
is not yet supported");
-        } catch (ExecutionException | ConfigurationException e) {
-            s_logger.error("Failure during " + cmd + " on Nuage VSD " + 
_hostName, e);
-            return new VspResourceAnswer(cmd, e);
-        }
-    }
-
     private Answer executeRequest(ImplementNetworkVspCommand cmd) {
         try {
             isNuageVspGuruLoaded();
-            _nuageVspGuruClient.implement(cmd.getNetworkDomainName(), 
cmd.getNetworkDomainPath(), cmd.getNetworkDomainUuid(), 
cmd.getNetworkAccountName(),
-                    cmd.getNetworkAccountUuid(), cmd.getNetworkName(), 
cmd.getNetworkCidr(), cmd.getNetworkGateway(), cmd.getNetworkAclId(), 
cmd.getDnsServers(),
-                    cmd.getGatewaySystemIds(), cmd.isL3Network(), cmd.isVpc(), 
cmd.isSharedNetwork(), cmd.getNetworkUuid(), cmd.getVpcName(), cmd.getVpcUuid(),
-                    cmd.isDefaultEgressPolicy(), cmd.getIpAddressRange(), 
cmd.getDomainTemplateName());
-            return new Answer(cmd, true, "Created network mapping to " + 
cmd.getNetworkName() + " on Nuage VSD " + _hostName);
+            _nuageVspGuruClient.implement(cmd.getNetwork(), 
cmd.getDnsServers());
+            return new Answer(cmd, true, "Created network mapping to " + 
cmd.getNetwork().getName() + " on Nuage VSD " + _hostName);
         } catch (ExecutionException | ConfigurationException e) {
             s_logger.error("Failure during " + cmd + " on Nuage VSD " + 
_hostName, e);
             return new Answer(cmd, e);
@@ -389,11 +355,8 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
     private Answer executeRequest(ReserveVmInterfaceVspCommand cmd) {
         try {
             isNuageVspGuruLoaded();
-            _nuageVspGuruClient.reserve(cmd.getNicUuid(), 
cmd.getNicMacAddress(), cmd.getNetworkUuid(), cmd.isL3Network(),
-                    cmd.isSharedNetwork(), cmd.getVpcUuid(), 
cmd.getNetworkDomainUuid(), cmd.getNetworksAccountUuid(), cmd.isDomainRouter(), 
cmd.getDomainRouterIp(),
-                    cmd.getVmInstanceName(), cmd.getVmUuid(), 
cmd.useStaticIp(), cmd.getStaticIp(), cmd.getStaticNatIpUuid(), 
cmd.getStaticNatIpAddress(), cmd.isStaticNatIpAllocated(),
-                    cmd.isOneToOneNat(), cmd.getStaticNatVlanUuid(), 
cmd.getStaticNatVlanGateway(), cmd.getStaticNatVlanNetmask());
-            return new Answer(cmd, true, "Created NIC that maps to nicUuid" + 
cmd.getNicUuid() + " on Nuage VSD " + _hostName);
+            _nuageVspGuruClient.reserve(cmd.getNetwork(), cmd.getVm(), 
cmd.getNic(), cmd.getStaticNat());
+            return new Answer(cmd, true, "Created NIC that maps to nicUuid" + 
cmd.getNic().getUuid() + " on Nuage VSD " + _hostName);
         } catch (ExecutionException | ConfigurationException e) {
             s_logger.error("Failure during " + cmd + " on Nuage VSD " + 
_hostName, e);
             return new Answer(cmd, e);
@@ -403,9 +366,9 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
     private Answer executeRequest(DeallocateVmVspCommand cmd) {
         try {
             isNuageVspGuruLoaded();
-            _nuageVspGuruClient.deallocate(cmd.getNetworkUuid(), 
cmd.getNicFromDdUuid(), cmd.getNicMacAddress(), cmd.getNicIp4Address(), 
cmd.isL3Network(), cmd.isSharedNetwork(),
-                    cmd.getVpcUuid(), cmd.getNetworksDomainUuid(), 
cmd.getVmInstanceName(), cmd.getVmUuid(), cmd.isExpungingState());
-            return new Answer(cmd, true, "Deallocated VM " + 
cmd.getVmInstanceName() + " on Nuage VSD " + _hostName);
+
+            _nuageVspGuruClient.deallocate(cmd.getNetwork(), cmd.getVm(), 
cmd.getNic());
+            return new Answer(cmd, true, "Deallocated VM " + 
cmd.getVm().getName() + " on Nuage VSD " + _hostName);
         } catch (ExecutionException | ConfigurationException e) {
             s_logger.error("Failure during " + cmd + " on Nuage VSD " + 
_hostName, e);
             return new Answer(cmd, e);
@@ -415,8 +378,8 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
     private Answer executeRequest(TrashNetworkVspCommand cmd) {
         try {
             isNuageVspGuruLoaded();
-            _nuageVspGuruClient.trash(cmd.getDomainUuid(), 
cmd.getNetworkUuid(), cmd.isL3Network(), cmd.isSharedNetwork(), 
cmd.getVpcUuid(), cmd.getDomainTemplateName());
-            return new Answer(cmd, true, "Deleted network mapping to " + 
cmd.getNetworkUuid() + " on Nuage VSD " + _hostName);
+            _nuageVspGuruClient.trash(cmd.getNetwork());
+            return new Answer(cmd, true, "Deleted network mapping to " + 
cmd.getNetwork().getUuid() + " on Nuage VSD " + _hostName);
         } catch (ExecutionException | ConfigurationException e) {
             s_logger.error("Failure during " + cmd + " on Nuage VSD " + 
_hostName, e);
             return new Answer(cmd, e);
@@ -426,9 +389,8 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
     private Answer executeRequest(ApplyStaticNatVspCommand cmd) {
         try {
             isNuageVspElementLoaded();
-            _nuageVspElementClient.applyStaticNats(cmd.getNetworkDomainUuid(), 
cmd.getNetworkUuid(), cmd.getVpcOrSubnetUuid(), cmd.isL3Network(),
-                    cmd.isVpc(), cmd.getStaticNatDetails());
-            return new Answer(cmd, true, "Applied Static NAT to network 
mapping " + cmd.getVpcOrSubnetUuid() + " on Nuage VSD " + _hostName);
+            _nuageVspElementClient.applyStaticNats(cmd.getNetwork(), 
cmd.getStaticNatDetails());
+            return new Answer(cmd, true, "Applied Static NAT to network 
mapping " + cmd.getNetwork().getUuid() + " on Nuage VSD " + _hostName);
         } catch (ExecutionException | ConfigurationException e) {
             s_logger.error("Failure during " + cmd + " on Nuage VSD " + 
_hostName, e);
             return new Answer(cmd, e);
@@ -438,10 +400,9 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
     private Answer executeRequest(ImplementVspCommand cmd) {
         try {
             isNuageVspElementLoaded();
-            boolean success = 
_nuageVspElementClient.implement(cmd.getNetworkId(), 
cmd.getNetworkDomainUuid(), cmd.getNetworkUuid(), cmd.getNetworkName(), 
cmd.getVpcOrSubnetUuid(), cmd.isL2Network(),
-                    cmd.isL3Network(), cmd.isVpc(), cmd.isShared(), 
cmd.getDomainTemplateName(), cmd.isFirewallServiceSupported(), 
cmd.getDnsServers(), cmd.getIngressFirewallRules(),
-                    cmd.getEgressFirewallRules(), cmd.getAcsFipUuid(), 
cmd.isEgressDefaultPolicy());
-            return new Answer(cmd, success, "Implemented network " + 
cmd.getNetworkUuid() + " on Nuage VSD " + _hostName);
+            boolean success = 
_nuageVspElementClient.implement(cmd.getNetwork(), cmd.getDnsServers(), 
cmd.getIngressFirewallRules(),
+                    cmd.getEgressFirewallRules(), cmd.getFloatingIpUuids());
+            return new Answer(cmd, success, "Implemented network " + 
cmd.getNetwork().getUuid() + " on Nuage VSD " + _hostName);
         } catch (ExecutionException | ConfigurationException e) {
             s_logger.error("Failure during " + cmd + " on Nuage VSD " + 
_hostName, e);
             return new Answer(cmd, e);
@@ -451,9 +412,8 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
     private Answer executeRequest(ApplyAclRuleVspCommand cmd) {
         try {
             isNuageVspElementLoaded();
-            _nuageVspElementClient.applyAclRules(cmd.isNetworkAcl(), 
cmd.getNetworkUuid(), cmd.getNetworkDomainUuid(), cmd.getVpcOrSubnetUuid(), 
cmd.getNetworkName(),
-                    cmd.isL2Network(), cmd.getAclRules(), cmd.getNetworkId(), 
cmd.isEgressDefaultPolicy(), cmd.getAcsIngressAcl(), cmd.isNetworkReset(), 
cmd.getDomainTemplateName());
-            return new Answer(cmd, true, "Applied ACL Rule to network mapping 
" + cmd.getVpcOrSubnetUuid() + " on Nuage VSD " + _hostName);
+            _nuageVspElementClient.applyAclRules(cmd.getAclType(), 
cmd.getNetwork(), cmd.getAclRules(), cmd.isNetworkReset());
+            return new Answer(cmd, true, "Applied ACL Rule to network mapping 
" + cmd.getNetwork().getUuid() + " on Nuage VSD " + _hostName);
         } catch (ExecutionException | ConfigurationException e) {
             s_logger.error("Failure during " + cmd + " on Nuage VSD " + 
_hostName, e);
             return new Answer(cmd, e);
@@ -471,17 +431,6 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
         }
     }
 
-    private Answer executeRequest(SyncVspCommand cmd) {
-        try {
-            isNuageVspSyncLoaded();
-            _nuageVspSyncClient.syncWithNuageVsp(cmd.getNuageVspEntity());
-            return new Answer(cmd, true, "Synced " + cmd.getNuageVspEntity() + 
" on Nuage VSD " + _hostName);
-        } catch (ExecutionException | ConfigurationException e) {
-            s_logger.error("Failure during " + cmd + " on Nuage VSD " + 
_hostName, e);
-            return new Answer(cmd, e);
-        }
-    }
-
     private Answer executeRequest(SyncNuageVspCmsIdCommand cmd) {
         try {
             isNuageVspManagerLoaded();
@@ -504,7 +453,7 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
     private Answer executeRequest(SyncDomainCommand cmd) {
         try {
             isNuageVspManagerLoaded();
-            boolean success = 
_nuageVspManagerClient.syncDomainWithNuageVsp(cmd.getDomainUuid(), 
cmd.getDomainName(), cmd.getDomainPath(), cmd.isToAdd(), cmd.isToRemove());
+            boolean success = 
_nuageVspManagerClient.syncDomainWithNuageVsp(cmd.getDomain(), cmd.isToAdd(), 
cmd.isToRemove());
             return new SyncDomainAnswer(success);
         } catch (ExecutionException | ConfigurationException e) {
             s_logger.error("Failure during " + cmd + " on Nuage VSD " + 
_hostName, e);
@@ -512,14 +461,13 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
         }
     }
 
-    private Answer executeRequest(GetClientDefaultsCommand cmd) {
+    private Answer executeRequest(GetApiDefaultsCommand cmd) {
         try {
             isNuageVspManagerLoaded();
-            Map<String, Object> clientDefaults = 
_nuageVspManagerClient.getClientDefaults();
-            return new GetClientDefaultsAnswer(cmd, clientDefaults);
+            return new GetApiDefaultsAnswer(cmd, 
_nuageVspManagerClient.getApiDefaults());
         } catch (ExecutionException | ConfigurationException e) {
             s_logger.error("Failure during " + cmd + " on Nuage VSD " + 
_hostName, e);
-            return new GetClientDefaultsAnswer(cmd, e);
+            return new GetApiDefaultsAnswer(cmd, e);
         }
     }
 
@@ -552,12 +500,6 @@ public class NuageVspResource extends ManagerBase 
implements ServerResource {
         }
     }
 
-    protected void isNuageVspSyncLoaded() throws ConfigurationException {
-        if (!_isNuageVspClientLoaded || _nuageVspSyncClient == null) {
-            throw new ConfigurationException(NUAGE_VSP_PLUGIN_ERROR_MESSAGE);
-        }
-    }
-
     protected void isNuageVspManagerLoaded() throws ConfigurationException {
         if (!_isNuageVspClientLoaded || _nuageVspManagerClient == null) {
             throw new ConfigurationException(NUAGE_VSP_PLUGIN_ERROR_MESSAGE);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b0c27e48/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSync.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSync.java
 
b/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSync.java
deleted file mode 100644
index 4e1cc43..0000000
--- 
a/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSync.java
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-//
-
-package com.cloud.network.sync;
-
-
-public interface NuageVspSync {
-
-    public void syncWithNuageVsp(String nuageVspEntity);
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b0c27e48/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSyncImpl.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSyncImpl.java
 
b/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSyncImpl.java
deleted file mode 100644
index 9180c17..0000000
--- 
a/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSyncImpl.java
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-//
-
-package com.cloud.network.sync;
-
-import com.cloud.agent.AgentManager;
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.sync.SyncVspCommand;
-import com.cloud.host.HostVO;
-import com.cloud.host.dao.HostDao;
-import com.cloud.network.NuageVspDeviceVO;
-import com.cloud.network.dao.NuageVspDao;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
-import javax.inject.Inject;
-import java.util.List;
-
-@Component
-public class NuageVspSyncImpl implements NuageVspSync {
-
-    private static final Logger s_logger = 
Logger.getLogger(NuageVspSyncImpl.class);
-
-    @Inject
-    NuageVspDao _nuageVspDao;
-    @Inject
-    HostDao _hostDao;
-    @Inject
-    AgentManager _agentMgr;
-
-    public void syncWithNuageVsp(String nuageVspEntity) {
-        //Get the NuageVspDevice and get the host information.
-        //This information is used to query VSP and synch the corresponding
-        //entities
-        List<NuageVspDeviceVO> nuageVspDevices = _nuageVspDao.listAll();
-        for (NuageVspDeviceVO nuageVspDevice : nuageVspDevices) {
-            HostVO nuageVspHost = 
_hostDao.findById(nuageVspDevice.getHostId());
-            _hostDao.loadDetails(nuageVspHost);
-            SyncVspCommand cmd = new SyncVspCommand(nuageVspEntity);
-            Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd);
-            if (answer == null || !answer.getResult()) {
-                s_logger.error("SyncNuageVspCommand for Nuage VSP Host " + 
nuageVspHost.getUuid() + " failed");
-                if ((null != answer) && (null != answer.getDetails())) {
-                    s_logger.error(answer.getDetails());
-                }
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b0c27e48/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspEntityBuilder.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspEntityBuilder.java
 
b/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspEntityBuilder.java
new file mode 100644
index 0000000..135a552
--- /dev/null
+++ 
b/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspEntityBuilder.java
@@ -0,0 +1,368 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.util;
+
+import com.cloud.dc.VlanVO;
+import com.cloud.dc.dao.VlanDao;
+import com.cloud.domain.Domain;
+import com.cloud.domain.DomainVO;
+import com.cloud.domain.dao.DomainDao;
+import com.cloud.exception.InsufficientVirtualNetworkCapacityException;
+import com.cloud.network.Network;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.NetworkDetailsDao;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.vpc.NetworkACLItem;
+import com.cloud.network.vpc.VpcVO;
+import com.cloud.network.vpc.dao.VpcDao;
+import com.cloud.offerings.NetworkOfferingVO;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
+import com.cloud.user.AccountVO;
+import com.cloud.user.dao.AccountDao;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.VirtualMachine;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import net.nuage.vsp.acs.client.api.model.VspAclRule;
+import net.nuage.vsp.acs.client.api.model.VspDomain;
+import net.nuage.vsp.acs.client.api.model.VspNetwork;
+import net.nuage.vsp.acs.client.api.model.VspNic;
+import net.nuage.vsp.acs.client.api.model.VspStaticNat;
+import net.nuage.vsp.acs.client.api.model.VspVm;
+import net.nuage.vsp.acs.client.common.model.Pair;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+
+import javax.inject.Inject;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+public class NuageVspEntityBuilder {
+    private static final Logger s_logger = 
Logger.getLogger(NuageVspEntityBuilder.class);
+
+    @Inject
+    VpcDao _vpcDao;
+    @Inject
+    DomainDao _domainDao;
+    @Inject
+    AccountDao _accountDao;
+    @Inject
+    NetworkOfferingDao _networkOfferingDao;
+    @Inject
+    NetworkOfferingServiceMapDao _networkOfferingServiceMapDao;
+    @Inject
+    NetworkModel _networkModel;
+    @Inject
+    VlanDao _vlanDao;
+    @Inject
+    ConfigurationDao _configurationDao;
+    @Inject
+    IPAddressDao _ipAddressDao;
+    @Inject
+    NetworkDetailsDao _networkDetailsDao;
+
+    public VspDomain buildVspDomain(Domain domain) {
+        return new VspDomain.Builder()
+                .uuid(domain.getUuid())
+                .name(domain.getName())
+                .path(domain.getPath())
+                .build();
+    }
+
+    public VspNetwork buildVspNetwork(Network network, boolean 
fillAddressRange) {
+        VspNetwork.Builder vspNetworkBuilder = new VspNetwork.Builder()
+                .id(network.getId())
+                .uuid(network.getUuid())
+                .name(network.getName())
+                .cidr(network.getCidr())
+                .gateway(network.getGateway());
+
+        DomainVO domain = _domainDao.findById(network.getDomainId());
+        VspDomain vspDomain = buildVspDomain(domain);
+        vspNetworkBuilder.domain(vspDomain);
+
+        AccountVO account = _accountDao.findById(network.getAccountId());
+        
vspNetworkBuilder.accountUuid(account.getUuid()).accountName(account.getAccountName());
+
+        NetworkOfferingVO networkOffering = 
_networkOfferingDao.findById(network.getNetworkOfferingId());
+        
vspNetworkBuilder.egressDefaultPolicy(networkOffering.getEgressDefaultPolicy());
+
+        if (network.getVpcId() != null) {
+            VpcVO vpc = _vpcDao.findById(network.getVpcId());
+            vspNetworkBuilder.vpcUuid(vpc.getUuid())
+                    .vpcName(vpc.getName())
+                    .networkType(VspNetwork.NetworkType.Vpc);
+        } else {
+            if (networkOffering.getGuestType() == Network.GuestType.Shared) {
+                vspNetworkBuilder.networkType(VspNetwork.NetworkType.Shared);
+            } else if 
(_networkOfferingServiceMapDao.areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(),
 Network.Service.SourceNat)
+                    || 
_networkOfferingServiceMapDao.areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(),
 Network.Service.StaticNat)) {
+                vspNetworkBuilder.networkType(VspNetwork.NetworkType.L3);
+            } else {
+                vspNetworkBuilder.networkType(VspNetwork.NetworkType.L2);
+            }
+        }
+
+        boolean firewallServiceSupported = 
_networkModel.areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(),
 Network.Service.Firewall);
+        vspNetworkBuilder.firewallServiceSupported(firewallServiceSupported);
+
+        String preConfiguredDomainTemplateName = 
NuageVspUtil.getPreConfiguredDomainTemplateName(_configurationDao, 
_networkDetailsDao, network, networkOffering);
+        vspNetworkBuilder.domainTemplateName(preConfiguredDomainTemplateName);
+
+        if (fillAddressRange) {
+            try {
+                List<Pair<String, String>> ipAddressRanges = 
getIpAddressRanges(networkOffering, network);
+                vspNetworkBuilder.ipAddressRanges(ipAddressRanges);
+
+                String virtualRouterIp = getVirtualRouterIP(network, 
ipAddressRanges);
+                vspNetworkBuilder.virtualRouterIp(virtualRouterIp);
+            } catch (InsufficientVirtualNetworkCapacityException ex) {
+                s_logger.error("There is an insufficient network capacity in 
network " + network.getId(), ex);
+                throw new CloudRuntimeException("There is an insufficient 
network capacity in network " + network.getId(), ex);
+            }
+        }
+
+        return vspNetworkBuilder.build();
+    }
+
+    private List<Pair<String, String>> getIpAddressRanges(NetworkOfferingVO 
networkOffering, Network network) {
+        List<Pair<String, String>> ipAddressRanges = Lists.newArrayList();
+        if (networkOffering.getGuestType() == Network.GuestType.Shared) {
+            List<VlanVO> vlans = 
_vlanDao.listVlansByNetworkId(network.getId());
+            ipAddressRanges = Lists.newArrayList();
+            for (VlanVO vlan : vlans) {
+                boolean isIpv4 = StringUtils.isNotBlank(vlan.getIpRange());
+                String[] range = isIpv4 ? vlan.getIpRange().split("-") : 
vlan.getIp6Range().split("-");
+                if (range.length == 2) {
+                    ipAddressRanges.add(Pair.of(range[0], range[1]));
+                }
+            }
+            return ipAddressRanges;
+        }
+
+        String subnet = NetUtils.getCidrSubNet(network.getCidr());
+        String netmask = NetUtils.getCidrNetmask(network.getCidr());
+        long cidrSize = NetUtils.getCidrSize(netmask);
+        Set<Long> allIPsInCidr = NetUtils.getAllIpsFromCidr(subnet, cidrSize, 
new HashSet<Long>());
+        if (allIPsInCidr == null || !(allIPsInCidr instanceof TreeSet)) {
+            throw new IllegalStateException("The IPs in CIDR for subnet " + 
subnet + " where null or returned in a non-ordered set.");
+        }
+
+        Iterator<Long> ipIterator = allIPsInCidr.iterator();
+        long ip =  ipIterator.next();
+        if (NetUtils.ip2Long(network.getGateway()) == ip) {
+            ip = ipIterator.next();
+        }
+        ipAddressRanges.add(Pair.of(NetUtils.long2Ip(ip), 
NetUtils.getIpRangeEndIpFromCidr(subnet, cidrSize)));
+        return ipAddressRanges;
+    }
+
+    private String getVirtualRouterIP(Network network, List<Pair<String, 
String>> ipAddressRanges) throws InsufficientVirtualNetworkCapacityException {
+        Pair<String, String> lowestIpAddressRange = null;
+        if (ipAddressRanges.size() == 1) {
+            lowestIpAddressRange = Iterables.getOnlyElement(ipAddressRanges);
+        } else {
+            for (Pair<String, String> ipAddressRange : ipAddressRanges) {
+                if (lowestIpAddressRange == null || 
NetUtils.ip2Long(ipAddressRange.getLeft()) < 
NetUtils.ip2Long(lowestIpAddressRange.getLeft())) {
+                    lowestIpAddressRange = ipAddressRange;
+                }
+            }
+        }
+
+        if (lowestIpAddressRange == null) {
+            throw new InsufficientVirtualNetworkCapacityException("VSP 
allocates an IP for VirtualRouter." + " But no ip address ranges are 
specified", Network.class,
+                    network.getId());
+        } else if (NetUtils.ip2Long(lowestIpAddressRange.getRight()) - 
NetUtils.ip2Long(lowestIpAddressRange.getLeft()) < 2) {
+            throw new InsufficientVirtualNetworkCapacityException("VSP 
allocates an IP for VirtualRouter." + " So, subnet should have atleast minimum 
3 hosts", Network.class,
+                    network.getId());
+        }
+
+        String virtualRouterIp = lowestIpAddressRange.getLeft();
+        long lowestIp = NetUtils.ip2Long(lowestIpAddressRange.getLeft());
+        lowestIp = lowestIp + 1;
+        lowestIpAddressRange.setLeft(NetUtils.long2Ip(lowestIp));
+        return virtualRouterIp;
+    }
+
+    public VspVm buildVspVm(VirtualMachine vm, Network network) {
+        VspVm.Builder vspVmBuilder = new VspVm.Builder()
+                .uuid(vm.getUuid())
+                .name(vm.getInstanceName());
+
+        switch (vm.getState()) {
+            case Starting:
+                vspVmBuilder.state(VspVm.State.Starting); break;
+            case Running:
+                vspVmBuilder.state(VspVm.State.Running); break;
+            case Stopping:
+                vspVmBuilder.state(VspVm.State.Stopping); break;
+            case Stopped:
+                vspVmBuilder.state(VspVm.State.Stopped); break;
+            case Destroyed:
+                vspVmBuilder.state(VspVm.State.Destroyed); break;
+            case Expunging:
+                vspVmBuilder.state(VspVm.State.Expunging); break;
+            case Migrating:
+                vspVmBuilder.state(VspVm.State.Migrating); break;
+            case Error:
+                vspVmBuilder.state(VspVm.State.Error); break;
+            case Shutdowned:
+                vspVmBuilder.state(VspVm.State.Shutdowned); break;
+            default:
+                vspVmBuilder.state(VspVm.State.Unknown);
+        }
+
+        boolean isDomainRouter = 
vm.getType().equals(VirtualMachine.Type.DomainRouter);
+        vspVmBuilder.domainRouter(isDomainRouter);
+
+        if (network.getBroadcastUri() != null) {
+            String domainRouterIp = 
network.getBroadcastUri().getPath().substring(1);
+            vspVmBuilder.domainRouterIp(domainRouterIp);
+        }
+
+        return vspVmBuilder.build();
+    }
+
+    public VspNic buildVspNic(String nicUuid, NicProfile nicProfile) {
+        VspNic.Builder vspNicBuilder = new VspNic.Builder()
+                .uuid(nicUuid)
+                .macAddress(nicProfile.getMacAddress())
+                .useStaticIp(true)
+                .ip(nicProfile.getIPv4Address());
+        return vspNicBuilder.build();
+    }
+
+    public VspNic buildVspNic(NicVO nic) {
+        VspNic.Builder vspNicBuilder = new VspNic.Builder()
+                .uuid(nic.getUuid())
+                .macAddress(nic.getMacAddress())
+                .useStaticIp(true)
+                .ip(nic.getIPv4Address());
+        return vspNicBuilder.build();
+    }
+
+    public VspStaticNat buildVspStaticNat(Boolean forRevoke, IPAddressVO 
staticNatIp, VlanVO staticNatVlan, NicVO nic) {
+        VspStaticNat.Builder vspStaticNatBuilder = new VspStaticNat.Builder()
+                .ipUuid(staticNatIp.getUuid())
+                .ipAddress(staticNatIp.getAddress().addr())
+                .revoke(forRevoke)
+                .oneToOneNat(staticNatIp.isOneToOneNat())
+                .vlanUuid(staticNatVlan.getUuid())
+                .vlanGateway(staticNatVlan.getVlanGateway())
+                .vlanNetmask(staticNatVlan.getVlanNetmask());
+
+        if (nic != null) {
+            VspNic vspNic = buildVspNic(nic);
+            vspStaticNatBuilder.nic(vspNic);
+        }
+
+        return vspStaticNatBuilder.build();
+    }
+
+    public VspAclRule buildVspAclRule(FirewallRule firewallRule, Network 
network) {
+        VspAclRule.Builder vspAclRuleBuilder = new VspAclRule.Builder()
+                .uuid(firewallRule.getUuid())
+                .protocol(firewallRule.getProtocol())
+                .startPort(firewallRule.getSourcePortStart())
+                .endPort(firewallRule.getSourcePortEnd())
+                .sourceCidrList(firewallRule.getSourceCidrList())
+                .priority(-1)
+                .type(VspAclRule.ACLType.Firewall);
+
+        switch (firewallRule.getState()) {
+            case Active:
+                vspAclRuleBuilder.state(VspAclRule.ACLState.Active); break;
+            case Add:
+                vspAclRuleBuilder.state(VspAclRule.ACLState.Add); break;
+            case Revoke:
+                vspAclRuleBuilder.state(VspAclRule.ACLState.Revoke);
+        }
+
+        switch (firewallRule.getTrafficType()) {
+            case Ingress:
+                
vspAclRuleBuilder.trafficType(VspAclRule.ACLTrafficType.Ingress); break;
+            case Egress:
+                
vspAclRuleBuilder.trafficType(VspAclRule.ACLTrafficType.Egress);
+        }
+
+        NetworkOfferingVO networkOffering = 
_networkOfferingDao.findById(network.getNetworkOfferingId());
+        if (firewallRule.getTrafficType() == FirewallRule.TrafficType.Egress 
&& networkOffering.getEgressDefaultPolicy()) {
+            vspAclRuleBuilder.action(VspAclRule.ACLAction.Deny);
+        } else {
+            vspAclRuleBuilder.action(VspAclRule.ACLAction.Allow);
+        }
+
+        if (firewallRule.getSourceIpAddressId() != null) {
+            IPAddressVO ipAddress = 
_ipAddressDao.findById(firewallRule.getSourceIpAddressId());
+            if (ipAddress != null) {
+                vspAclRuleBuilder.sourceIpAddress(ipAddress.getVmIp() + "/32");
+            }
+        }
+
+        return vspAclRuleBuilder.build();
+    }
+
+    public VspAclRule buildVspAclRule(NetworkACLItem networkAcl) {
+        VspAclRule.Builder vspAclRuleBuilder = new VspAclRule.Builder()
+                .uuid(networkAcl.getUuid())
+                .protocol(networkAcl.getProtocol())
+                .startPort(networkAcl.getSourcePortStart())
+                .endPort(networkAcl.getSourcePortEnd())
+                .sourceIpAddress(null)
+                .sourceCidrList(networkAcl.getSourceCidrList())
+                .priority(networkAcl.getNumber())
+                .type(VspAclRule.ACLType.NetworkACL);
+
+        switch (networkAcl.getState()) {
+            case Active:
+                vspAclRuleBuilder.state(VspAclRule.ACLState.Active); break;
+            case Add:
+                vspAclRuleBuilder.state(VspAclRule.ACLState.Add); break;
+            case Revoke:
+                vspAclRuleBuilder.state(VspAclRule.ACLState.Revoke);
+        }
+
+        switch (networkAcl.getTrafficType()) {
+            case Ingress:
+                
vspAclRuleBuilder.trafficType(VspAclRule.ACLTrafficType.Ingress); break;
+            case Egress:
+                
vspAclRuleBuilder.trafficType(VspAclRule.ACLTrafficType.Egress);
+        }
+
+        switch (networkAcl.getAction()) {
+            case Allow:
+                vspAclRuleBuilder.action(VspAclRule.ACLAction.Allow); break;
+            case Deny:
+                vspAclRuleBuilder.action(VspAclRule.ACLAction.Deny);
+        }
+
+        return vspAclRuleBuilder.build();
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b0c27e48/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspUtil.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspUtil.java 
b/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspUtil.java
index 2300289..fedf048 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspUtil.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspUtil.java
@@ -20,6 +20,8 @@
 package com.cloud.util;
 
 import com.cloud.network.Network;
+import com.cloud.network.dao.NetworkDetailVO;
+import com.cloud.network.dao.NetworkDetailsDao;
 import com.cloud.network.manager.NuageVspManager;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.utils.StringUtils;
@@ -28,7 +30,12 @@ import org.apache.commons.codec.binary.Base64;
 
 public class NuageVspUtil {
 
-    public static String getPreConfiguredDomainTemplateName(ConfigurationDao 
configDao, Network network, NetworkOffering networkOffering) {
+    public static String getPreConfiguredDomainTemplateName(ConfigurationDao 
configDao, NetworkDetailsDao networkDetailsDao, Network network, 
NetworkOffering networkOffering) {
+        NetworkDetailVO domainTemplateNetworkDetail = 
networkDetailsDao.findDetail(network.getId(), 
NuageVspManager.nuageDomainTemplateDetailName);
+        if (domainTemplateNetworkDetail != null) {
+            return domainTemplateNetworkDetail.getValue();
+        }
+
         String configKey;
         if (network.getVpcId() != null) {
             configKey = NuageVspManager.NuageVspVpcDomainTemplateName.key();

Reply via email to