You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by re...@apache.org on 2015/11/18 12:11:15 UTC

[1/7] git commit: updated refs/heads/master to 95ae796

Repository: cloudstack
Updated Branches:
  refs/heads/master 228935df4 -> 95ae7963d


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/test/integration/component/test_nuage_vsp.py
----------------------------------------------------------------------
diff --git a/test/integration/component/test_nuage_vsp.py b/test/integration/component/test_nuage_vsp.py
index ee7fc68..e7bd10e 100644
--- a/test/integration/component/test_nuage_vsp.py
+++ b/test/integration/component/test_nuage_vsp.py
@@ -23,7 +23,11 @@ from marvin.cloudstackTestCase import cloudstackTestCase
 from marvin.cloudstackAPI import (listPhysicalNetworks,
                                   listNetworkServiceProviders,
                                   addNetworkServiceProvider,
-                                  addNuageVspDevice)
+                                  deleteNetworkServiceProvider,
+                                  deleteNuageVspDevice,
+                                  updateNetworkServiceProvider,
+                                  addNuageVspDevice,
+                                  destroyVirtualMachine)
 from marvin.lib.utils import (cleanup_resources)
 from marvin.lib.base import (Account,
                              VirtualMachine,
@@ -34,6 +38,9 @@ from marvin.lib.common import (get_domain,
                                get_zone,
                                get_template)
 
+import logging
+import unittest
+
 
 class Services:
 
@@ -41,12 +48,13 @@ class Services:
     """
 
     def __init__(self):
+        print "in __init__"
         self.services = {
             "account": {
                 "email": "cloudstack@cloudmonkey.com",
                 "firstname": "cloudstack",
                 "lastname": "bob",
-                "username": "bobbuilder",
+                "username": "admin",
                 "password": "password",
             },
             "service_offering": {
@@ -61,17 +69,17 @@ class Services:
                 "username": "root",
                 "password": "password",
                 "ssh_port": 22,
-                "hypervisor": 'XenServer',
+                "hypervisor": 'KVM',
                 "privateport": 22,
                 "publicport": 22,
                 "protocol": 'TCP',
             },
             "nuage_vsp_device": {
-                "hostname": '192.168.0.7',
-                "username": 'testusername',
-                "password": 'testpassword',
+                "hostname": '172.31.222.162',
+                "username": 'cloudstackuser1',
+                "password": 'cloudstackuser1',
                 "port": '8443',
-                "apiversion": 'v1_0',
+                "apiversion": 'v3_2',
                 "retrycount": '4',
                 "retryinterval": '60'
             },
@@ -92,12 +100,15 @@ class Services:
                     "SourceNat": 'NuageVsp',
                     "Firewall": 'NuageVsp'
                 },
+                "serviceCapabilityList": {
+                    "SourceNat": {"SupportedSourceNatTypes": "perzone"},
+                }
             },
             "network": {
                 "name": "nuage",
                 "displaytext": "nuage",
             },
-            "ostype": 'CentOS 5.3 (64-bit)',
+            "ostype": 'CentOS 5.5 (64-bit)',
             "sleep": 60,
             "timeout": 10
         }
@@ -107,6 +118,7 @@ class TestNuageVsp(cloudstackTestCase):
 
     @classmethod
     def setUpClass(cls):
+        print "In setup class"
         cls._cleanup = []
         cls.testClient = super(TestNuageVsp, cls).getClsTestClient()
         cls.api_client = cls.testClient.getApiClient()
@@ -125,10 +137,14 @@ class TestNuageVsp(cloudstackTestCase):
         try:
 
             resp = listPhysicalNetworks.listPhysicalNetworksCmd()
+            print "in cls.setupClass- resp: %s" % resp
             resp.zoneid = cls.zone.id
             physical_networks = cls.api_client.listPhysicalNetworks(resp)
-            if isinstance(physical_networks, list):
-                physical_network = physical_networks[0]
+            for pn in physical_networks:
+                if pn.isolationmethods=='VSP':
+                    physical_network = pn
+            #if isinstance(physical_networks, list):
+            #    physical_network = physical_networks[1]
             resp = listNetworkServiceProviders.listNetworkServiceProvidersCmd()
             resp.name = 'NuageVsp'
             resp.physicalnetworkid = physical_network.id
@@ -141,11 +157,17 @@ class TestNuageVsp(cloudstackTestCase):
                 resp_add_nsp.name = 'NuageVsp'
                 resp_add_nsp.physicalnetworkid = physical_network.id
                 cls.api_client.addNetworkServiceProvider(resp_add_nsp)
+                #Get NSP ID
+                nw_service_providers = cls.api_client.listNetworkServiceProviders(
+                    resp)
+                cls.debug("NuageVsp NSP ID: %s" % nw_service_providers[0].id)
+
                 resp_add_device = addNuageVspDevice.addNuageVspDeviceCmd()
                 resp_add_device.physicalnetworkid = physical_network.id
                 resp_add_device.username = cls.nuage_services["username"]
                 resp_add_device.password = cls.nuage_services["password"]
                 resp_add_device.hostname = cls.nuage_services["hostname"]
+                resp_add_device.port = cls.nuage_services["port"]
                 resp_add_device.apiversion = cls.nuage_services[
                    "apiversion"]
                 resp_add_device.retrycount = cls.nuage_services[
@@ -154,6 +176,13 @@ class TestNuageVsp(cloudstackTestCase):
                     "retryinterval"]
                 cls.nuage = cls.api_client.addNuageVspDevice(
                     resp_add_device)
+                #Enable NuageVsp NSP 
+                cls.debug("NuageVsp NSP ID : %s" % nw_service_providers[0].id)
+                resp_up_nsp = \
+                    updateNetworkServiceProvider.updateNetworkServiceProviderCmd()
+                resp_up_nsp.id = nw_service_providers[0].id
+                resp_up_nsp.state = 'Enabled'
+                cls.api_client.updateNetworkServiceProvider(resp_up_nsp)
 
             cls.network_offering = NetworkOffering.create(
                 cls.api_client,
@@ -172,7 +201,7 @@ class TestNuageVsp(cloudstackTestCase):
             cls._cleanup.append(cls.service_offering)
         except Exception as e:
             cls.tearDownClass()
-            raise Exception("Warning: Exception in setUpClass: %s" % e)
+            raise unittest.SkipTest("Unable to add VSP device")
         return
 
     @classmethod
@@ -183,6 +212,7 @@ class TestNuageVsp(cloudstackTestCase):
             raise Exception("Warning: Exception during cleanup : %s" % e)
         return
 
+
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
         self.dbclient = self.testClient.getDbConnection()
@@ -195,6 +225,7 @@ class TestNuageVsp(cloudstackTestCase):
         self.cleanup = [self.account]
         return
 
+
     def tearDown(self):
         try:
             self.debug("Cleaning up the resources")
@@ -204,7 +235,7 @@ class TestNuageVsp(cloudstackTestCase):
             raise Exception("Warning: Exception during cleanup : %s" % e)
         return
 
-    @attr(tags=["invalid"])
+    @attr(tags=["advanced"])
     def test_network_vsp(self):
         """Test nuage Network and VM Creation
         """
@@ -217,7 +248,9 @@ class TestNuageVsp(cloudstackTestCase):
             accountid=self.account.name,
             domainid=self.account.domainid,
             networkofferingid=self.network_offering.id,
-            zoneid=self.zone.id
+            zoneid=self.zone.id,
+            gateway = "10.1.1.1",
+            netmask = '255.255.255.0'
         )
         self.debug("Created network with ID: %s" % self.network.id)
 
@@ -292,7 +325,7 @@ class TestNuageVsp(cloudstackTestCase):
 
         VirtualMachine.delete(virtual_machine_1, self.apiclient, expunge=True)
 
-        # Deleting a single VM
+        # # Deleting a single VM
         VirtualMachine.delete(virtual_machine_2, self.apiclient, expunge=True)
 
         # Delete Network

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/test/integration/component/test_vpcnetwork_nuage.py
----------------------------------------------------------------------
diff --git a/test/integration/component/test_vpcnetwork_nuage.py b/test/integration/component/test_vpcnetwork_nuage.py
new file mode 100644
index 0000000..be76fa6
--- /dev/null
+++ b/test/integration/component/test_vpcnetwork_nuage.py
@@ -0,0 +1,295 @@
+# 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.
+""" Tests for NuageNetwork VPC
+"""
+#Import Local Modules
+from marvin.cloudstackTestCase import cloudstackTestCase, unittest
+from marvin.lib.utils import (cleanup_resources)
+from marvin.cloudstackAPI import (listPhysicalNetworks,
+                                  listNetworkServiceProviders,
+                                  addNetworkServiceProvider,
+                                  updateNetworkServiceProvider,
+                                  addNuageVspDevice,
+                                  destroyVirtualMachine)
+from marvin.lib.base import (VirtualMachine,
+                             ServiceOffering,
+                             Account,
+                             NetworkOffering,
+                             Network,
+                             VPC,
+                             VpcOffering,
+                             NetworkACL,
+                             NetworkACLList)
+from marvin.lib.common import (get_zone,
+                               get_domain,
+                               get_template,
+                               wait_for_cleanup,
+                               list_networks)
+
+from nose.plugins.attrib import attr
+
+class Services:
+
+    """Test NuageVsp plugin
+    """
+
+    def __init__(self):
+        self.services = {
+            "account": {
+                "email": "cloudstack@cloudmonkey.com",
+                "firstname": "cloudstack",
+                "lastname": "bob",
+                "username": "admin",
+                "password": "password",
+                },
+            "service_offering": {
+                "name": "Tiny Instance",
+                "displaytext": "Tiny Instance",
+                "cpunumber": 1,
+                "cpuspeed": 100,    # in MHz
+                "memory": 128,       # In MBs
+            },
+            "virtual_machine": {
+                "displayname": "TestVM",
+                "username": "root",
+                "password": "password",
+                "ssh_port": 22,
+                "hypervisor": 'KVM',
+                "privateport": 22,
+                "publicport": 22,
+                "protocol": 'TCP',
+                },
+            "nuage_vsp_device": {
+                #"hostname": '192.168.0.7',
+                #"hostname": '10.31.43.226',
+                "hostname": '172.31.222.162',
+                "username": 'cloudstackuser1',
+                "password": 'cloudstackuser1',
+                "port": '8443',
+                "apiversion": 'v3_2',
+                "retrycount": '4',
+                "retryinterval": '60'
+            },
+            # services supported by Nuage for VPC networks.
+            "vpc_network_offering": {
+                "name": 'nuage_vpc_marvin',
+                "displaytext": 'nuage_vpc_marvin',
+                "guestiptype": 'Isolated',
+                "supportedservices": 'UserData,Dhcp,SourceNat,StaticNat,NetworkACL,Connectivity',
+                "traffictype": 'GUEST',
+                "useVpc": 'on',
+                "serviceProviderList": {
+                    "Dhcp": "NuageVsp",
+                    "SourceNat": "NuageVsp",
+                    "StaticNat": "NuageVsp",
+                    "NetworkACL": "NuageVsp",
+                    "UserData": "VpcVirtualRouter",
+                    "Connectivity": "NuageVsp"
+                },
+                "serviceCapabilityList": {
+                    "SourceNat": {"SupportedSourceNatTypes": "perzone"}
+                }
+            },
+            "vpc": {
+                "name": "vpc-networkacl-nuage",
+                "displaytext": "vpc-networkacl-nuage",
+                "cidr": '10.1.0.0/16'
+            },
+            "vpcnetwork": {
+                "name": "nuagevpcnetwork",
+                "displaytext": "nuagevpcnetwork",
+                "netmask": '255.255.255.128'
+            },
+            "ostype": 'CentOS 5.5 (64-bit)',
+            "sleep": 60,
+            "timeout": 10
+        }
+
+
+class TestVpcNetworkNuage(cloudstackTestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        cls._cleanup = []
+        cls.testClient = super(TestVpcNetworkNuage, cls).getClsTestClient()
+        cls.api_client = cls.testClient.getApiClient()
+
+        cls.services = Services().services
+        # Get Zone, Domain and templates
+        cls.domain = get_domain(cls.api_client)
+        cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
+        cls.template = get_template(
+            cls.api_client,
+            cls.zone.id,
+            cls.services["ostype"]
+        )
+        # nuage vsp device brings the Nuage virtual service platform into play
+        cls.nuage_services = cls.services["nuage_vsp_device"]
+        try:
+
+            resp = listPhysicalNetworks.listPhysicalNetworksCmd()
+            print "in cls.setupClass- resp: %s" % resp
+            resp.zoneid = cls.zone.id
+            physical_networks = cls.api_client.listPhysicalNetworks(resp)
+            for pn in physical_networks:
+                if pn.isolationmethods=='VSP':
+                    physical_network = pn
+            #if isinstance(physical_networks, list):
+            #    physical_network = physical_networks[1]
+            resp = listNetworkServiceProviders.listNetworkServiceProvidersCmd()
+            resp.name = 'NuageVsp'
+            resp.physicalnetworkid = physical_network.id
+            nw_service_providers = cls.api_client.listNetworkServiceProviders(
+                resp)
+            if not isinstance(nw_service_providers, list):
+                # create network service provider and add nuage vsp device
+                resp_add_nsp = \
+                    addNetworkServiceProvider.addNetworkServiceProviderCmd()
+                resp_add_nsp.name = 'NuageVsp'
+                resp_add_nsp.physicalnetworkid = physical_network.id
+                cls.api_client.addNetworkServiceProvider(resp_add_nsp)
+                #Get NSP ID
+                nw_service_providers = cls.api_client.listNetworkServiceProviders(
+                    resp)
+                cls.debug("NuageVsp NSP ID: %s" % nw_service_providers[0].id)
+
+                resp_add_device = addNuageVspDevice.addNuageVspDeviceCmd()
+                resp_add_device.physicalnetworkid = physical_network.id
+                resp_add_device.username = cls.nuage_services["username"]
+                resp_add_device.password = cls.nuage_services["password"]
+                resp_add_device.hostname = cls.nuage_services["hostname"]
+                resp_add_device.port = cls.nuage_services["port"]
+                resp_add_device.apiversion = cls.nuage_services[
+                    "apiversion"]
+                resp_add_device.retrycount = cls.nuage_services[
+                    "retrycount"]
+                resp_add_device.retryinterval = cls.nuage_services[
+                    "retryinterval"]
+                cls.nuage = cls.api_client.addNuageVspDevice(
+                    resp_add_device)
+                #Enable NuageVsp NSP
+                cls.debug("NuageVsp NSP ID : %s" % nw_service_providers[0].id)
+                resp_up_nsp = \
+                    updateNetworkServiceProvider.updateNetworkServiceProviderCmd()
+                resp_up_nsp.id = nw_service_providers[0].id
+                resp_up_nsp.state = 'Enabled'
+                cls.api_client.updateNetworkServiceProvider(resp_up_nsp)
+
+            cls.network_offering = NetworkOffering.create(
+                cls.api_client,
+                cls.services["vpc_network_offering"],
+                conservemode=False
+            )
+            cls._cleanup.append(cls.network_offering)
+
+            cls.network_offering.update(cls.api_client, state='Enabled')
+            cls.services["virtual_machine"]["zoneid"] = cls.zone.id
+            cls.services["virtual_machine"]["template"] = cls.template.id
+            cls.service_offering = ServiceOffering.create(
+                cls.api_client,
+                cls.services["service_offering"]
+            )
+            cls._cleanup.append(cls.service_offering)
+        except Exception as e:
+            cls.tearDownClass()
+            raise unittest.SkipTest("Unable to add VSP device")
+        return
+
+    @attr(tags=["advanced"])
+    def test_vpcnetwork_nuage(self):
+        """Test network VPC for Nuage"""
+
+        # 1) Create VPC with Nuage VPC offering
+        vpcOffering = VpcOffering.list(self.apiclient,name="Nuage VSP VPC offering")
+        self.assert_(vpcOffering is not None and len(vpcOffering)>0, "Nuage VPC offering not found")
+        vpc = VPC.create(
+                apiclient=self.apiclient,
+                services=self.services["vpc"],
+                networkDomain="vpc.networkacl",
+                vpcofferingid=vpcOffering[0].id,
+                zoneid=self.zone.id,
+                account=self.account.name,
+                domainid=self.account.domainid
+        )
+        self.assert_(vpc is not None, "VPC creation failed")
+
+        # 2) Create ACL
+        aclgroup = NetworkACLList.create(apiclient=self.apiclient, services={}, name="acl", description="acl", vpcid=vpc.id)
+        self.assertIsNotNone(aclgroup, "Failed to create NetworkACL list")
+        self.debug("Created a network ACL list %s" % aclgroup.name)
+
+        # 3) Create ACL Item
+        aclitem = NetworkACL.create(apiclient=self.apiclient, services={},
+            protocol="TCP", number="10", action="Deny", aclid=aclgroup.id, cidrlist=["0.0.0.0/0"])
+        self.assertIsNotNone(aclitem, "Network failed to aclItem")
+        self.debug("Added a network ACL %s to ACL list %s" % (aclitem.id, aclgroup.name))
+
+        # 4) Create network with ACL
+        nwNuage = Network.create(
+            self.apiclient,
+            self.services["vpcnetwork"],
+            accountid=self.account.name,
+            domainid=self.account.domainid,
+            networkofferingid=self.network_offering.id,
+            zoneid=self.zone.id,
+            vpcid=vpc.id,
+            aclid=aclgroup.id,
+            gateway='10.1.0.1'
+        )
+        self.debug("Network %s created in VPC %s" %(nwNuage.id, vpc.id))
+
+        # 5) Deploy a vm
+        vm = VirtualMachine.create(
+            self.apiclient,
+            self.services["virtual_machine"],
+            accountid=self.account.name,
+            domainid=self.account.domainid,
+            serviceofferingid=self.service_offering.id,
+            networkids=[str(nwNuage.id)]
+        )
+        self.assert_(vm is not None, "VM failed to deploy")
+        self.assert_(vm.state == 'Running', "VM is not running")
+        self.debug("VM %s deployed in VPC %s" %(vm.id, vpc.id))
+
+    @classmethod
+    def tearDownClass(cls):
+        try:
+            cleanup_resources(cls.api_client, cls._cleanup)
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+        return
+
+    def setUp(self):
+        self.apiclient = self.testClient.getApiClient()
+        self.dbclient = self.testClient.getDbConnection()
+        self.account = Account.create(
+            self.apiclient,
+            self.services["account"],
+            admin=True,
+            domainid=self.domain.id
+        )
+        self.cleanup = [self.account]
+        return
+
+    def tearDown(self):
+        try:
+            self.debug("Cleaning up the resources")
+            cleanup_resources(self.apiclient, self.cleanup)
+            self.debug("Cleanup complete!")
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+        return


[6/7] git commit: updated refs/heads/master to 95ae796

Posted by re...@apache.org.
CLOUDSTACK-8832 : Update Nuage VSP plugin to work with Nuage VSP release 3.2


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/645f8758
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/645f8758
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/645f8758

Branch: refs/heads/master
Commit: 645f8758df3a2d22d4583d385492187285393a89
Parents: fb4e6ed
Author: Nick Livens <ni...@nuagenetworks.net>
Authored: Tue Oct 27 14:56:57 2015 +0100
Committer: Nick Livens <ni...@nuagenetworks.net>
Committed: Tue Oct 27 14:56:57 2015 +0100

----------------------------------------------------------------------
 api/src/com/cloud/agent/api/Answer.java         |  22 +
 api/src/com/cloud/agent/api/Command.java        |  20 +
 api/src/com/cloud/event/EventTypes.java         |   1 +
 api/src/com/cloud/network/Network.java          |   1 -
 client/tomcatconf/commands.properties.in        |   1 +
 core/src/com/cloud/agent/api/PingCommand.java   |  22 +
 .../src/com/cloud/network/dao/IPAddressDao.java |   2 +
 .../com/cloud/network/dao/IPAddressDaoImpl.java |   8 +
 .../cloud/network/vpc/NetworkACLItemDao.java    |   2 +-
 .../com/cloud/network/vpc/VpcOfferingVO.java    |   8 +
 .../network/vpc/dao/NetworkACLItemDaoImpl.java  |   5 +-
 plugins/network-elements/nuage-vsp/pom.xml      |   7 +
 .../src/com/cloud/agent/api/CmdBuilder.java     |  24 +
 .../cloud/agent/api/PingNuageVspCommand.java    |  56 ++
 .../com/cloud/agent/api/StartupVspCommand.java  |   5 +
 .../com/cloud/agent/api/VspResourceAnswer.java  |  20 +-
 .../com/cloud/agent/api/VspResourceCommand.java |  53 +-
 .../api/element/ApplyAclRuleVspAnswer.java      |  34 -
 .../api/element/ApplyAclRuleVspCommand.java     | 195 ++++-
 .../api/element/ApplyStaticNatVspAnswer.java    |  34 -
 .../api/element/ApplyStaticNatVspCommand.java   | 104 ++-
 .../agent/api/element/ImplementVspCommand.java  | 297 ++++++++
 .../agent/api/element/ShutDownVpcVspAnswer.java |  34 -
 .../api/element/ShutDownVpcVspCommand.java      |  63 +-
 .../agent/api/guru/DeallocateVmVspAnswer.java   |  34 -
 .../agent/api/guru/DeallocateVmVspCommand.java  | 162 +++-
 .../api/guru/ImplementNetworkVspAnswer.java     |  35 -
 .../api/guru/ImplementNetworkVspCommand.java    | 278 ++++++-
 .../agent/api/guru/ReleaseVmVspAnswer.java      |  34 -
 .../agent/api/guru/ReleaseVmVspCommand.java     |  54 --
 .../api/guru/ReserveVmInterfaceVspAnswer.java   |  44 --
 .../api/guru/ReserveVmInterfaceVspCommand.java  | 327 +++++++-
 .../agent/api/guru/TrashNetworkVspAnswer.java   |  34 -
 .../agent/api/guru/TrashNetworkVspCommand.java  |  97 ++-
 .../api/manager/GetClientDefaultsAnswer.java    |  81 ++
 .../api/manager/GetClientDefaultsCommand.java   |  38 +
 .../api/manager/SupportedApiVersionCommand.java |  61 ++
 .../cloud/agent/api/sync/SyncDomainAnswer.java  |  57 ++
 .../cloud/agent/api/sync/SyncDomainCommand.java |  93 +++
 .../agent/api/sync/SyncNuageVspCmsIdAnswer.java |  73 ++
 .../api/sync/SyncNuageVspCmsIdCommand.java      |  72 ++
 .../com/cloud/agent/api/sync/SyncVspAnswer.java |  34 -
 .../cloud/agent/api/sync/SyncVspCommand.java    |  22 +-
 .../api/commands/AddNuageVspDeviceCmd.java      |  25 +-
 .../api/commands/DeleteNuageVspDeviceCmd.java   |  21 +-
 .../IssueNuageVspResourceRequestCmd.java        |  34 +-
 .../api/commands/ListNuageVspDevicesCmd.java    |  28 +-
 .../api/commands/UpdateNuageVspDeviceCmd.java   | 180 +++++
 .../api/response/NuageVspDeviceResponse.java    |   5 +-
 .../api/response/NuageVspResourceResponse.java  |   3 +-
 .../src/com/cloud/network/NuageVspDeviceVO.java |   5 +-
 .../src/com/cloud/network/dao/NuageVspDao.java  |   8 +
 .../com/cloud/network/dao/NuageVspDaoImpl.java  |  20 +-
 .../cloud/network/element/NuageVspElement.java  | 342 +++++++--
 .../network/guru/NuageVspGuestNetworkGuru.java  | 512 ++++++++-----
 .../cloud/network/manager/NuageVspManager.java  |  53 +-
 .../network/manager/NuageVspManagerImpl.java    | 748 ++++++++++++++++---
 .../network/resource/NuageVspResource.java      | 543 ++++++++++----
 .../cloud/network/sync/NuageVspSyncImpl.java    |  35 +-
 .../src/com/cloud/util/NuageVspUtil.java        |  40 +
 .../vsp/acs/NuageVspPluginClientLoader.java     |  89 ++-
 .../nuage/vsp/acs/client/NuageVspApiClient.java |  10 +-
 .../vsp/acs/client/NuageVspElementClient.java   |  16 +-
 .../vsp/acs/client/NuageVspGuruClient.java      |  23 +-
 .../vsp/acs/client/NuageVspManagerClient.java   |  42 ++
 .../vsp/acs/client/NuageVspSyncClient.java      |   6 +-
 .../test/com/cloud/agent/api/CommandsTest.java  | 151 ++++
 .../network/element/NuageVspElementTest.java    | 137 +++-
 .../guru/NuageVspGuestNetworkGuruTest.java      | 212 ++++--
 .../network/manager/NuageVspManagerTest.java    |  37 +-
 .../network/resource/NuageVspResourceTest.java  | 199 +++--
 .../cloud/network/sync/NuageVspSyncTest.java    |  23 +-
 .../configuration/ConfigurationManagerImpl.java |   7 +-
 .../cloud/network/guru/DirectNetworkGuru.java   |   6 +-
 test/integration/component/test_nuage_vsp.py    |  61 +-
 .../component/test_vpcnetwork_nuage.py          | 295 ++++++++
 76 files changed, 5184 insertions(+), 1380 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/api/src/com/cloud/agent/api/Answer.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/Answer.java b/api/src/com/cloud/agent/api/Answer.java
index fd6a0d1..17bba76 100644
--- a/api/src/com/cloud/agent/api/Answer.java
+++ b/api/src/com/cloud/agent/api/Answer.java
@@ -59,4 +59,26 @@ public class Answer extends Command {
     public static UnsupportedAnswer createUnsupportedVersionAnswer(final Command cmd) {
         return new UnsupportedAnswer(cmd, "Unsuppored Version.");
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof Answer)) return false;
+        if (!super.equals(o)) return false;
+
+        Answer answer = (Answer) o;
+
+        if (result != answer.result) return false;
+        if (details != null ? !details.equals(answer.details) : answer.details != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result1 = super.hashCode();
+        result1 = 31 * result1 + (result ? 1 : 0);
+        result1 = 31 * result1 + (details != null ? details.hashCode() : 0);
+        return result1;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/api/src/com/cloud/agent/api/Command.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/Command.java b/api/src/com/cloud/agent/api/Command.java
index 2341a99..4a698e4 100644
--- a/api/src/com/cloud/agent/api/Command.java
+++ b/api/src/com/cloud/agent/api/Command.java
@@ -73,4 +73,24 @@ public abstract class Command {
     public boolean allowCaching() {
         return true;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof Command)) return false;
+
+        Command command = (Command) o;
+
+        if (wait != command.wait) return false;
+        if (contextMap != null ? !contextMap.equals(command.contextMap) : command.contextMap != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = contextMap != null ? contextMap.hashCode() : 0;
+        result = 31 * result + wait;
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/api/src/com/cloud/event/EventTypes.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java
index 9a264a5..7349c1f 100644
--- a/api/src/com/cloud/event/EventTypes.java
+++ b/api/src/com/cloud/event/EventTypes.java
@@ -434,6 +434,7 @@ public class EventTypes {
 
     // external network mapping events
     public static final String EVENT_EXTERNAL_VSP_VSD_ADD = "PHYSICAL.NUAGE.VSD.ADD";
+    public static final String EVENT_EXTERNAL_VSP_VSD_UPDATE = "PHYSICAL.NUAGE.VSD.UPDATE";
     public static final String EVENT_EXTERNAL_VSP_VSD_DELETE = "PHYSICAL.NUAGE.VSD.DELETE";
     // AutoScale
     public static final String EVENT_COUNTER_CREATE = "COUNTER.CREATE";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/api/src/com/cloud/network/Network.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java
index d39489e..7cc5441 100644
--- a/api/src/com/cloud/network/Network.java
+++ b/api/src/com/cloud/network/Network.java
@@ -134,7 +134,6 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
         public static final Provider Opendaylight = new Provider("Opendaylight", false);
         // add Nuage Vsp Providers
         public static final Provider NuageVsp = new Provider("NuageVsp", false);
-        public static final Provider NuageVspVpc = new Provider("NuageVspVpc", false);
         public static final Provider BrocadeVcs = new Provider("BrocadeVcs", false);
         // add GloboDns provider
         public static final Provider GloboDns = new Provider("GloboDns", true);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in
index 473c635..4f93b97 100644
--- a/client/tomcatconf/commands.properties.in
+++ b/client/tomcatconf/commands.properties.in
@@ -644,6 +644,7 @@ deleteStratoshereSsp=1
 #### nuage vsp commands
 
 addNuageVspDevice=1
+updateNuageVspDevice=1
 deleteNuageVspDevice=1
 listNuageVspDevices=1
 issueNuageVspResourceRequest=15

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/core/src/com/cloud/agent/api/PingCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/PingCommand.java b/core/src/com/cloud/agent/api/PingCommand.java
index 8136c3d..1d62c5d 100644
--- a/core/src/com/cloud/agent/api/PingCommand.java
+++ b/core/src/com/cloud/agent/api/PingCommand.java
@@ -45,4 +45,26 @@ public class PingCommand extends Command {
     public boolean executeInSequence() {
         return false;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof PingCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        PingCommand that = (PingCommand) o;
+
+        if (hostId != that.hostId) return false;
+        if (hostType != that.hostType) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (hostType != null ? hostType.hashCode() : 0);
+        result = 31 * result + (int) (hostId ^ (hostId >>> 32));
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/engine/schema/src/com/cloud/network/dao/IPAddressDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/IPAddressDao.java b/engine/schema/src/com/cloud/network/dao/IPAddressDao.java
index fbf5c57..24d77db 100644
--- a/engine/schema/src/com/cloud/network/dao/IPAddressDao.java
+++ b/engine/schema/src/com/cloud/network/dao/IPAddressDao.java
@@ -87,4 +87,6 @@ public interface IPAddressDao extends GenericDao<IPAddressVO, Long> {
     void lockRange(long vlandbId);
 
     List<IPAddressVO> listByAssociatedVmId(long vmId);
+
+    IPAddressVO findByVmIdAndNetworkId(long networkId, long vmId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java b/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
index 61bc1b7..63278c2 100644
--- a/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
@@ -459,6 +459,14 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, Long> implemen
     }
 
     @Override
+    public IPAddressVO findByVmIdAndNetworkId(long networkId, long vmId) {
+        SearchCriteria<IPAddressVO> sc = AllFieldsSearch.create();
+        sc.setParameters("network", networkId);
+        sc.setParameters("associatedWithVmId", vmId);
+        return findOneBy(sc);
+    }
+
+    @Override
     public void lockRange(long vlandbId) {
         SearchCriteria<IPAddressVO> sc = AllFieldsSearch.create();
         sc.setParameters("vlan", vlandbId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java b/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java
index 9ab6365..21794cb 100644
--- a/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java
+++ b/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java
@@ -29,7 +29,7 @@ public interface NetworkACLItemDao extends GenericDao<NetworkACLItemVO, Long> {
 
     boolean revoke(NetworkACLItemVO rule);
 
-    List<NetworkACLItemVO> listByACL(long aclId);
+    List<NetworkACLItemVO> listByACL(Long aclId);
 
     int getMaxNumberByACL(long aclId);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java b/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java
index bd13a02..62e8cf3 100644
--- a/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java
+++ b/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java
@@ -99,6 +99,14 @@ public class VpcOfferingVO implements VpcOffering {
         this.redundantRouter = redundantRouter;
     }
 
+    public VpcOfferingVO(String name, String displayText, boolean isDefault, Long serviceOfferingId,
+                         boolean supportsDistributedRouter, boolean offersRegionLevelVPC) {
+        this(name, displayText, serviceOfferingId);
+        this.isDefault = isDefault;
+        this.supportsDistributedRouter = supportsDistributedRouter;
+        this.offersRegionLevelVPC = offersRegionLevelVPC;
+    }
+
     @Override
     public long getId() {
         return id;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java
index 201197c..15f9014 100644
--- a/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java
@@ -21,6 +21,7 @@ import java.util.List;
 import javax.ejb.Local;
 import javax.inject.Inject;
 
+import com.google.common.collect.Lists;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -115,7 +116,9 @@ public class NetworkACLItemDaoImpl extends GenericDaoBase<NetworkACLItemVO, Long
     }
 
     @Override
-    public List<NetworkACLItemVO> listByACL(long aclId) {
+    public List<NetworkACLItemVO> listByACL(Long aclId) {
+        if (aclId == null) return Lists.newArrayList();
+
         SearchCriteria<NetworkACLItemVO> sc = AllFieldsSearch.create();
         sc.setParameters("aclId", aclId);
         List<NetworkACLItemVO> list = listBy(sc);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/pom.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/pom.xml b/plugins/network-elements/nuage-vsp/pom.xml
index 36b53f7..fb258f8 100644
--- a/plugins/network-elements/nuage-vsp/pom.xml
+++ b/plugins/network-elements/nuage-vsp/pom.xml
@@ -28,6 +28,13 @@
     <version>4.6.0-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>${cs.lang3.version}</version>
+    </dependency>
+  </dependencies>
   <build>
     <plugins>
       <plugin>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/CmdBuilder.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/CmdBuilder.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/CmdBuilder.java
new file mode 100644
index 0000000..514afb6
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/CmdBuilder.java
@@ -0,0 +1,24 @@
+//
+// 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.agent.api;
+
+public interface CmdBuilder<T> {
+    T build();
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/PingNuageVspCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/PingNuageVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/PingNuageVspCommand.java
new file mode 100644
index 0000000..c7505d9
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/PingNuageVspCommand.java
@@ -0,0 +1,56 @@
+//
+// 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.agent.api;
+
+import com.cloud.host.Host;
+
+public class PingNuageVspCommand extends PingCommand {
+
+    private final boolean shouldAudit;
+
+    public PingNuageVspCommand(Host.Type type, long id, boolean shouldAudit) {
+        super(type, id);
+        this.shouldAudit = shouldAudit;
+    }
+
+    public boolean shouldAudit() {
+        return shouldAudit;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof PingNuageVspCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        PingNuageVspCommand that = (PingNuageVspCommand) o;
+
+        if (shouldAudit != that.shouldAudit) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (shouldAudit ? 1 : 0);
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/StartupVspCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/StartupVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/StartupVspCommand.java
index 6dba882..2e289fb 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/StartupVspCommand.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/StartupVspCommand.java
@@ -21,9 +21,14 @@ package com.cloud.agent.api;
 
 import com.cloud.host.Host;
 
+/**
+ * The super class implementations for equals and hashCode are acceptable because this class does not track any state
+ * in addition to the super class.
+ */
 public class StartupVspCommand extends StartupCommand {
 
     public StartupVspCommand() {
         super(Host.Type.L2Networking);
     }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceAnswer.java
index 9327809..979dcd3 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceAnswer.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceAnswer.java
@@ -21,7 +21,7 @@ package com.cloud.agent.api;
 
 public class VspResourceAnswer extends Answer {
 
-    String _resourceInfo;
+    private String _resourceInfo;
 
     public VspResourceAnswer(Command cmd, String resourceInfo, String details) {
         super(cmd, true, details);
@@ -39,4 +39,22 @@ public class VspResourceAnswer extends Answer {
     public String getResourceInfo() {
         return this._resourceInfo;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        VspResourceAnswer that = (VspResourceAnswer) o;
+
+        if (_resourceInfo != null ? !_resourceInfo.equals(that._resourceInfo) : that._resourceInfo != null)
+            return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return _resourceInfo != null ? _resourceInfo.hashCode() : 0;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceCommand.java
index f7e1417..6e03dab 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceCommand.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceCommand.java
@@ -21,14 +21,14 @@ package com.cloud.agent.api;
 
 public class VspResourceCommand extends Command {
 
-    String _method;
-    String _resource;
-    String _resourceId;
-    String _childResource;
-    Object _entityDetails;
-    String _resourceFilter;
-    String _proxyUserUuid;
-    String _proxyUserDomainuuid;
+    private final String _method;
+    private final String _resource;
+    private final String _resourceId;
+    private final String _childResource;
+    private final Object _entityDetails;
+    private final String _resourceFilter;
+    private final String _proxyUserUuid;
+    private final String _proxyUserDomainuuid;
 
     public VspResourceCommand(String method, String resource, String resourceId, String childResource, Object entityDetails, String resourceFilter, String proxyUserUuid,
             String proxyUserDomainuuid) {
@@ -79,4 +79,41 @@ public class VspResourceCommand extends Command {
     public boolean executeInSequence() {
         return false;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        VspResourceCommand that = (VspResourceCommand) o;
+
+        if (_childResource != null ? !_childResource.equals(that._childResource) : that._childResource != null)
+            return false;
+        if (_entityDetails != null ? !_entityDetails.equals(that._entityDetails) : that._entityDetails != null)
+            return false;
+        if (_method != null ? !_method.equals(that._method) : that._method != null) return false;
+        if (_proxyUserDomainuuid != null ? !_proxyUserDomainuuid.equals(that._proxyUserDomainuuid) : that._proxyUserDomainuuid != null)
+            return false;
+        if (_proxyUserUuid != null ? !_proxyUserUuid.equals(that._proxyUserUuid) : that._proxyUserUuid != null)
+            return false;
+        if (_resource != null ? !_resource.equals(that._resource) : that._resource != null) return false;
+        if (_resourceFilter != null ? !_resourceFilter.equals(that._resourceFilter) : that._resourceFilter != null)
+            return false;
+        if (_resourceId != null ? !_resourceId.equals(that._resourceId) : that._resourceId != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = _method != null ? _method.hashCode() : 0;
+        result = 31 * result + (_resource != null ? _resource.hashCode() : 0);
+        result = 31 * result + (_resourceId != null ? _resourceId.hashCode() : 0);
+        result = 31 * result + (_childResource != null ? _childResource.hashCode() : 0);
+        result = 31 * result + (_entityDetails != null ? _entityDetails.hashCode() : 0);
+        result = 31 * result + (_resourceFilter != null ? _resourceFilter.hashCode() : 0);
+        result = 31 * result + (_proxyUserUuid != null ? _proxyUserUuid.hashCode() : 0);
+        result = 31 * result + (_proxyUserDomainuuid != null ? _proxyUserDomainuuid.hashCode() : 0);
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspAnswer.java
deleted file mode 100644
index 2b41266..0000000
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspAnswer.java
+++ /dev/null
@@ -1,34 +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.agent.api.element;
-
-import com.cloud.agent.api.Answer;
-
-public class ApplyAclRuleVspAnswer extends Answer {
-
-    public ApplyAclRuleVspAnswer(ApplyAclRuleVspCommand cmd, boolean success, String details) {
-        super(cmd, success, details);
-    }
-
-    public ApplyAclRuleVspAnswer(ApplyAclRuleVspCommand cmd, Exception e) {
-        super(cmd, e);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspCommand.java
index 5376466..7b1d40b 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspCommand.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspCommand.java
@@ -19,31 +19,46 @@
 
 package com.cloud.agent.api.element;
 
+import com.cloud.agent.api.CmdBuilder;
+import com.cloud.agent.api.Command;
+
 import java.util.List;
 import java.util.Map;
 
-import com.cloud.agent.api.Command;
-
 public class ApplyAclRuleVspCommand extends Command {
 
-    String _networkUuid;
-    String _networkDomainUuid;
-    String _vpcOrSubnetUuid;
-    boolean _isL3Network;
-    List<Map<String, Object>> _aclRules;
-    boolean _isVpc;
-    long _networkId;
+    private final boolean _networkAcl;
+    private final String _networkUuid;
+    private final String _networkDomainUuid;
+    private final String _vpcOrSubnetUuid;
+    private final String _networkName;
+    private final boolean _isL2Network;
+    private final List<Map<String, Object>> _aclRules;
+    private final long _networkId;
+    private final boolean _egressDefaultPolicy;
+    private final Boolean _acsIngressAcl;
+    private final boolean _networkReset;
+    private final String _domainTemplateName;
 
-    public ApplyAclRuleVspCommand(String networkUuid, String networkDomainUuid, String vpcOrSubnetUuid, boolean isL3Network, List<Map<String, Object>> aclRules, boolean isVpc,
-            long networkId) {
+    private ApplyAclRuleVspCommand(boolean networkAcl, String networkUuid, String networkDomainUuid, String vpcOrSubnetUuid, String networkName, boolean isL2Network,
+            List<Map<String, Object>> aclRules, long networkId, boolean egressDefaultPolicy, Boolean acsIngressAcl, boolean networkReset, String domainTemplateName) {
         super();
+        this._networkAcl = networkAcl;
         this._networkUuid = networkUuid;
         this._networkDomainUuid = networkDomainUuid;
         this._vpcOrSubnetUuid = vpcOrSubnetUuid;
-        this._isL3Network = isL3Network;
+        this._networkName = networkName;
+        this._isL2Network = isL2Network;
         this._aclRules = aclRules;
-        this._isVpc = isVpc;
         this._networkId = networkId;
+        this._egressDefaultPolicy = egressDefaultPolicy;
+        this._acsIngressAcl = acsIngressAcl;
+        this._networkReset = networkReset;
+        this._domainTemplateName = domainTemplateName;
+    }
+
+    public boolean isNetworkAcl() {
+        return _networkAcl;
     }
 
     public String getNetworkUuid() {
@@ -58,20 +73,117 @@ public class ApplyAclRuleVspCommand extends Command {
         return _vpcOrSubnetUuid;
     }
 
-    public boolean isL3Network() {
-        return _isL3Network;
+    public String getNetworkName() {
+        return _networkName;
+    }
+
+    public boolean isL2Network() {
+        return _isL2Network;
     }
 
     public List<Map<String, Object>> getAclRules() {
         return _aclRules;
     }
 
-    public boolean isVpc() {
-        return _isVpc;
+    public long getNetworkId() {
+        return _networkId;
     }
 
-    public long getNetworkId() {
-        return this._networkId;
+    public boolean isEgressDefaultPolicy() {
+        return _egressDefaultPolicy;
+    }
+
+    public Boolean getAcsIngressAcl() {
+        return _acsIngressAcl;
+    }
+
+    public boolean isNetworkReset() {
+        return _networkReset;
+    }
+
+    public String getDomainTemplateName() {
+        return _domainTemplateName;
+    }
+
+    public static class Builder implements CmdBuilder<ApplyAclRuleVspCommand> {
+        private boolean _networkAcl;
+        private String _networkUuid;
+        private String _networkDomainUuid;
+        private String _vpcOrSubnetUuid;
+        private String _networkName;
+        private boolean _isL2Network;
+        private List<Map<String, Object>> _aclRules;
+        private long _networkId;
+        private boolean _egressDefaultPolicy;
+        private Boolean _acsIngressAcl;
+        private boolean _networkReset;
+        private String _domainTemplateName;
+
+        public Builder networkAcl(boolean networkAcl) {
+            this._networkAcl = networkAcl;
+            return this;
+        }
+
+        public Builder networkUuid(String networkUuid) {
+            this._networkUuid = networkUuid;
+            return this;
+        }
+
+        public Builder networkDomainUuid(String networkDomainUuid) {
+            this._networkDomainUuid = networkDomainUuid;
+            return this;
+        }
+
+        public Builder vpcOrSubnetUuid(String vpcOrSubnetUuid) {
+            this._vpcOrSubnetUuid = vpcOrSubnetUuid;
+            return this;
+        }
+
+        public Builder networkName(String networkName) {
+            this._networkName = networkName;
+            return this;
+        }
+
+        public Builder isL2Network(boolean isL2Network) {
+            this._isL2Network = isL2Network;
+            return this;
+        }
+
+        public Builder aclRules(List<Map<String, Object>> aclRules) {
+            this._aclRules = aclRules;
+            return this;
+        }
+
+        public Builder networkId(long networkId) {
+            this._networkId = networkId;
+            return this;
+        }
+
+        public Builder egressDefaultPolicy(boolean egressDefaultPolicy) {
+            this._egressDefaultPolicy = egressDefaultPolicy;
+            return this;
+        }
+
+        public Builder acsIngressAcl(Boolean acsIngressAcl) {
+            this._acsIngressAcl = acsIngressAcl;
+            return this;
+        }
+
+        public Builder networkReset(boolean networkReset) {
+            this._networkReset = networkReset;
+            return this;
+        }
+
+        public Builder domainTemplateName(String domainTemplateName) {
+            this._domainTemplateName = domainTemplateName;
+            return this;
+        }
+
+        @Override
+        public ApplyAclRuleVspCommand build() {
+            return new ApplyAclRuleVspCommand(_networkAcl, _networkUuid, _networkDomainUuid, _vpcOrSubnetUuid, _networkName, _isL2Network, _aclRules,
+                    _networkId, _egressDefaultPolicy, _acsIngressAcl, _networkReset, _domainTemplateName);
+        }
     }
 
     @Override
@@ -79,4 +191,49 @@ public class ApplyAclRuleVspCommand extends Command {
         return false;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ApplyAclRuleVspCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        ApplyAclRuleVspCommand that = (ApplyAclRuleVspCommand) o;
+
+        if (_egressDefaultPolicy != that._egressDefaultPolicy) return false;
+        if (_isL2Network != that._isL2Network) return false;
+        if (_networkAcl != that._networkAcl) return false;
+        if (_networkId != that._networkId) return false;
+        if (_networkReset != that._networkReset) return false;
+        if (_aclRules != null ? !_aclRules.equals(that._aclRules) : that._aclRules != null) return false;
+        if (_acsIngressAcl != null ? !_acsIngressAcl.equals(that._acsIngressAcl) : that._acsIngressAcl != null)
+            return false;
+        if (_domainTemplateName != null ? !_domainTemplateName.equals(that._domainTemplateName) : that._domainTemplateName != null)
+            return false;
+        if (_networkDomainUuid != null ? !_networkDomainUuid.equals(that._networkDomainUuid) : that._networkDomainUuid != null)
+            return false;
+        if (_networkName != null ? !_networkName.equals(that._networkName) : that._networkName != null) return false;
+        if (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false;
+        if (_vpcOrSubnetUuid != null ? !_vpcOrSubnetUuid.equals(that._vpcOrSubnetUuid) : that._vpcOrSubnetUuid != null)
+            return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_networkAcl ? 1 : 0);
+        result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0);
+        result = 31 * result + (_networkDomainUuid != null ? _networkDomainUuid.hashCode() : 0);
+        result = 31 * result + (_vpcOrSubnetUuid != null ? _vpcOrSubnetUuid.hashCode() : 0);
+        result = 31 * result + (_networkName != null ? _networkName.hashCode() : 0);
+        result = 31 * result + (_isL2Network ? 1 : 0);
+        result = 31 * result + (_aclRules != null ? _aclRules.hashCode() : 0);
+        result = 31 * result + (int) (_networkId ^ (_networkId >>> 32));
+        result = 31 * result + (_egressDefaultPolicy ? 1 : 0);
+        result = 31 * result + (_acsIngressAcl != null ? _acsIngressAcl.hashCode() : 0);
+        result = 31 * result + (_networkReset ? 1 : 0);
+        result = 31 * result + (_domainTemplateName != null ? _domainTemplateName.hashCode() : 0);
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspAnswer.java
deleted file mode 100644
index c40c1a3..0000000
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspAnswer.java
+++ /dev/null
@@ -1,34 +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.agent.api.element;
-
-import com.cloud.agent.api.Answer;
-
-public class ApplyStaticNatVspAnswer extends Answer {
-
-    public ApplyStaticNatVspAnswer(ApplyStaticNatVspCommand cmd, boolean success, String details) {
-        super(cmd, success, details);
-    }
-
-    public ApplyStaticNatVspAnswer(ApplyStaticNatVspCommand cmd, Exception e) {
-        super(cmd, e);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspCommand.java
index b013634..cc4e930 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspCommand.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspCommand.java
@@ -19,23 +19,29 @@
 
 package com.cloud.agent.api.element;
 
+import com.cloud.agent.api.CmdBuilder;
+import com.cloud.agent.api.Command;
+
 import java.util.List;
 import java.util.Map;
 
-import com.cloud.agent.api.Command;
-
 public class ApplyStaticNatVspCommand extends Command {
 
-    String _networkDomainUuid;
-    String _vpcOrSubnetUuid;
-    boolean _isL3Network;
-    List<Map<String, Object>> _staticNatDetails;
+    private final String _networkDomainUuid;
+    private final String _networkUuid;
+    private final String _vpcOrSubnetUuid;
+    private final boolean _isL3Network;
+    private final boolean _isVpc;
+    private final List<Map<String, Object>> _staticNatDetails;
 
-    public ApplyStaticNatVspCommand(String networkDomainUuid, String vpcOrSubnetUuid, boolean isL3Network, List<Map<String, Object>> staticNatDetails) {
+    private ApplyStaticNatVspCommand(String networkDomainUuid, String networkUuid, String vpcOrSubnetUuid, boolean isL3Network, boolean isVpc,
+            List<Map<String, Object>> staticNatDetails) {
         super();
         this._networkDomainUuid = networkDomainUuid;
+        this._networkUuid = networkUuid;
         this._vpcOrSubnetUuid = vpcOrSubnetUuid;
         this._isL3Network = isL3Network;
+        this._isVpc = isVpc;
         this._staticNatDetails = staticNatDetails;
     }
 
@@ -43,6 +49,10 @@ public class ApplyStaticNatVspCommand extends Command {
         return _networkDomainUuid;
     }
 
+    public String getNetworkUuid() {
+        return _networkUuid;
+    }
+
     public String getVpcOrSubnetUuid() {
         return _vpcOrSubnetUuid;
     }
@@ -51,13 +61,93 @@ public class ApplyStaticNatVspCommand extends Command {
         return _isL3Network;
     }
 
+    public boolean isVpc() {
+        return _isVpc;
+    }
+
     public List<Map<String, Object>> getStaticNatDetails() {
         return _staticNatDetails;
     }
 
+    public static class Builder implements CmdBuilder<ApplyStaticNatVspCommand> {
+        private String _networkDomainUuid;
+        private String _networkUuid;
+        private String _vpcOrSubnetUuid;
+        private boolean _isL3Network;
+        private boolean _isVpc;
+        private List<Map<String, Object>> _staticNatDetails;
+
+        public Builder networkDomainUuid(String networkDomainUuid) {
+            this._networkDomainUuid = networkDomainUuid;
+            return this;
+        }
+
+        public Builder networkUuid(String networkUuid) {
+            this._networkUuid = networkUuid;
+            return this;
+        }
+
+        public Builder vpcOrSubnetUuid(String vpcOrSubnetUuid) {
+            this._vpcOrSubnetUuid = vpcOrSubnetUuid;
+            return this;
+        }
+
+        public Builder isL3Network(boolean isL3Network) {
+            this._isL3Network = isL3Network;
+            return this;
+        }
+
+        public Builder isVpc(boolean isVpc) {
+            this._isVpc = isVpc;
+            return this;
+        }
+
+        public Builder staticNatDetails(List<Map<String, Object>> staticNatDetails) {
+            this._staticNatDetails = staticNatDetails;
+            return this;
+        }
+
+        @Override
+        public ApplyStaticNatVspCommand build() {
+            return new ApplyStaticNatVspCommand(_networkDomainUuid, _networkUuid, _vpcOrSubnetUuid, _isL3Network, _isVpc, _staticNatDetails);
+        }
+    }
+
     @Override
     public boolean executeInSequence() {
         return false;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ApplyStaticNatVspCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        ApplyStaticNatVspCommand that = (ApplyStaticNatVspCommand) o;
+
+        if (_isL3Network != that._isL3Network) return false;
+        if (_isVpc != that._isVpc) return false;
+        if (_networkDomainUuid != null ? !_networkDomainUuid.equals(that._networkDomainUuid) : that._networkDomainUuid != null)
+            return false;
+        if (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false;
+        if (_staticNatDetails != null ? !_staticNatDetails.equals(that._staticNatDetails) : that._staticNatDetails != null)
+            return false;
+        if (_vpcOrSubnetUuid != null ? !_vpcOrSubnetUuid.equals(that._vpcOrSubnetUuid) : that._vpcOrSubnetUuid != null)
+            return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_networkDomainUuid != null ? _networkDomainUuid.hashCode() : 0);
+        result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0);
+        result = 31 * result + (_vpcOrSubnetUuid != null ? _vpcOrSubnetUuid.hashCode() : 0);
+        result = 31 * result + (_isL3Network ? 1 : 0);
+        result = 31 * result + (_isVpc ? 1 : 0);
+        result = 31 * result + (_staticNatDetails != null ? _staticNatDetails.hashCode() : 0);
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ImplementVspCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ImplementVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ImplementVspCommand.java
new file mode 100644
index 0000000..c1de6b9
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ImplementVspCommand.java
@@ -0,0 +1,297 @@
+//
+// 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.agent.api.element;
+
+import com.cloud.agent.api.CmdBuilder;
+import com.cloud.agent.api.Command;
+
+import java.util.List;
+import java.util.Map;
+
+public class ImplementVspCommand extends Command {
+
+    private final long _networkId;
+    private final String _networkDomainUuid;
+    private final String _networkUuid;
+    private final String _networkName;
+    private final String _vpcOrSubnetUuid;
+    private final boolean _isL2Network;
+    private final boolean _isL3Network;
+    private final boolean _isVpc;
+    private final boolean _isShared;
+    private final String _domainTemplateName;
+    private final boolean _isFirewallServiceSupported;
+    private final List<String> _dnsServers;
+    private final List<Map<String, Object>> _ingressFirewallRules;
+    private final List<Map<String, Object>> _egressFirewallRules;
+    private final List<String> _acsFipUuid;
+    private final boolean _egressDefaultPolicy;
+
+    private ImplementVspCommand(long networkId, String networkDomainUuid, String networkUuid, String networkName, String vpcOrSubnetUuid, boolean isL2Network, boolean isL3Network,
+            boolean isVpc, boolean isShared, String domainTemplateName, boolean isFirewallServiceSupported, List<String> dnsServers, List<Map<String, Object>> ingressFirewallRules,
+            List<Map<String, Object>> egressFirewallRules, List<String> acsFipUuid, boolean egressDefaultPolicy) {
+        super();
+        this._networkId = networkId;
+        this._networkDomainUuid = networkDomainUuid;
+        this._networkUuid = networkUuid;
+        this._networkName = networkName;
+        this._vpcOrSubnetUuid = vpcOrSubnetUuid;
+        this._isL2Network = isL2Network;
+        this._isL3Network = isL3Network;
+        this._isVpc = isVpc;
+        this._isShared = isShared;
+        this._domainTemplateName = domainTemplateName;
+        this._isFirewallServiceSupported = isFirewallServiceSupported;
+        this._dnsServers = dnsServers;
+        this._ingressFirewallRules = ingressFirewallRules;
+        this._egressFirewallRules = egressFirewallRules;
+        this._acsFipUuid = acsFipUuid;
+        this._egressDefaultPolicy = egressDefaultPolicy;
+    }
+
+    public long getNetworkId() {
+        return _networkId;
+    }
+
+    public String getNetworkDomainUuid() {
+        return _networkDomainUuid;
+    }
+
+    public String getNetworkUuid() {
+        return _networkUuid;
+    }
+
+    public String getNetworkName() {
+        return _networkName;
+    }
+
+    public String getVpcOrSubnetUuid() {
+        return _vpcOrSubnetUuid;
+    }
+
+    public boolean isL2Network() {
+        return _isL2Network;
+    }
+
+    public boolean isL3Network() {
+        return _isL3Network;
+    }
+
+    public boolean isVpc() {
+        return _isVpc;
+    }
+
+    public boolean isShared() {
+        return _isShared;
+    }
+
+    public String getDomainTemplateName() {
+        return _domainTemplateName;
+    }
+
+    public boolean isFirewallServiceSupported() {
+        return _isFirewallServiceSupported;
+    }
+
+    public List<String> getDnsServers() {
+        return _dnsServers;
+    }
+
+    public List<Map<String, Object>> getIngressFirewallRules() {
+        return _ingressFirewallRules;
+    }
+
+    public List<Map<String, Object>> getEgressFirewallRules() {
+        return _egressFirewallRules;
+    }
+
+    public List<String> getAcsFipUuid() {
+        return _acsFipUuid;
+    }
+
+    public boolean isEgressDefaultPolicy() {
+        return _egressDefaultPolicy;
+    }
+
+    public static class Builder implements CmdBuilder<ImplementVspCommand> {
+        private long _networkId;
+        private String _networkDomainUuid;
+        private String _networkUuid;
+        private String _networkName;
+        private String _vpcOrSubnetUuid;
+        private boolean _isL2Network;
+        private boolean _isL3Network;
+        private boolean _isVpc;
+        private boolean _isShared;
+        private String _domainTemplateName;
+        private boolean _isFirewallServiceSupported;
+        private List<String> _dnsServers;
+        private List<Map<String, Object>> _ingressFirewallRules;
+        private List<Map<String, Object>> _egressFirewallRules;
+        private List<String> _acsFipUuid;
+        private boolean _egressDefaultPolicy;
+
+        public Builder networkId(long networkId) {
+            this._networkId = networkId;
+            return this;
+        }
+
+        public Builder networkDomainUuid(String networkDomainUuid) {
+            this._networkDomainUuid = networkDomainUuid;
+            return this;
+        }
+
+        public Builder networkUuid(String networkUuid) {
+            this._networkUuid = networkUuid;
+            return this;
+        }
+
+        public Builder networkName(String networkName) {
+            this._networkName = networkName;
+            return this;
+        }
+
+        public Builder vpcOrSubnetUuid(String vpcOrSubnetUuid) {
+            this._vpcOrSubnetUuid = vpcOrSubnetUuid;
+            return this;
+        }
+
+        public Builder isL2Network(boolean isL2Network) {
+            this._isL2Network = isL2Network;
+            return this;
+        }
+
+        public Builder isL3Network(boolean isL3Network) {
+            this._isL3Network = isL3Network;
+            return this;
+        }
+
+        public Builder isVpc(boolean isVpc) {
+            this._isVpc = isVpc;
+            return this;
+        }
+
+        public Builder isShared(boolean isShared) {
+            this._isShared = isShared;
+            return this;
+        }
+
+        public Builder domainTemplateName(String domainTemplateName) {
+            this._domainTemplateName = domainTemplateName;
+            return this;
+        }
+
+        public Builder isFirewallServiceSupported(boolean isFirewallServiceSupported) {
+            this._isFirewallServiceSupported = isFirewallServiceSupported;
+            return this;
+        }
+
+        public Builder dnsServers(List<String> dnsServers) {
+            this._dnsServers = dnsServers;
+            return this;
+        }
+
+        public Builder ingressFirewallRules(List<Map<String, Object>> ingressFirewallRules) {
+            this._ingressFirewallRules = ingressFirewallRules;
+            return this;
+        }
+
+        public Builder egressFirewallRules(List<Map<String, Object>> egressFirewallRules) {
+            this._egressFirewallRules = egressFirewallRules;
+            return this;
+        }
+
+        public Builder acsFipUuid(List<String> acsFipUuid) {
+            this._acsFipUuid = acsFipUuid;
+            return this;
+        }
+
+        public Builder egressDefaultPolicy(boolean egressDefaultPolicy) {
+            this._egressDefaultPolicy = egressDefaultPolicy;
+            return this;
+        }
+
+        @Override
+        public ImplementVspCommand build() {
+            return new ImplementVspCommand(_networkId, _networkDomainUuid, _networkUuid, _networkName, _vpcOrSubnetUuid, _isL2Network, _isL3Network, _isVpc, _isShared,
+                    _domainTemplateName, _isFirewallServiceSupported, _dnsServers, _ingressFirewallRules, _egressFirewallRules, _acsFipUuid, _egressDefaultPolicy);
+        }
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ImplementVspCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        ImplementVspCommand that = (ImplementVspCommand) o;
+
+        if (_egressDefaultPolicy != that._egressDefaultPolicy) return false;
+        if (_isFirewallServiceSupported != that._isFirewallServiceSupported) return false;
+        if (_isL2Network != that._isL2Network) return false;
+        if (_isL3Network != that._isL3Network) return false;
+        if (_isShared != that._isShared) return false;
+        if (_isVpc != that._isVpc) return false;
+        if (_networkId != that._networkId) return false;
+        if (_acsFipUuid != null ? !_acsFipUuid.equals(that._acsFipUuid) : that._acsFipUuid != null) return false;
+        if (_dnsServers != null ? !_dnsServers.equals(that._dnsServers) : that._dnsServers != null) return false;
+        if (_domainTemplateName != null ? !_domainTemplateName.equals(that._domainTemplateName) : that._domainTemplateName != null)
+            return false;
+        if (_egressFirewallRules != null ? !_egressFirewallRules.equals(that._egressFirewallRules) : that._egressFirewallRules != null)
+            return false;
+        if (_ingressFirewallRules != null ? !_ingressFirewallRules.equals(that._ingressFirewallRules) : that._ingressFirewallRules != null)
+            return false;
+        if (_networkDomainUuid != null ? !_networkDomainUuid.equals(that._networkDomainUuid) : that._networkDomainUuid != null)
+            return false;
+        if (_networkName != null ? !_networkName.equals(that._networkName) : that._networkName != null) return false;
+        if (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false;
+        if (_vpcOrSubnetUuid != null ? !_vpcOrSubnetUuid.equals(that._vpcOrSubnetUuid) : that._vpcOrSubnetUuid != null)
+            return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (int) (_networkId ^ (_networkId >>> 32));
+        result = 31 * result + (_networkDomainUuid != null ? _networkDomainUuid.hashCode() : 0);
+        result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0);
+        result = 31 * result + (_networkName != null ? _networkName.hashCode() : 0);
+        result = 31 * result + (_vpcOrSubnetUuid != null ? _vpcOrSubnetUuid.hashCode() : 0);
+        result = 31 * result + (_isL2Network ? 1 : 0);
+        result = 31 * result + (_isL3Network ? 1 : 0);
+        result = 31 * result + (_isVpc ? 1 : 0);
+        result = 31 * result + (_isShared ? 1 : 0);
+        result = 31 * result + (_domainTemplateName != null ? _domainTemplateName.hashCode() : 0);
+        result = 31 * result + (_isFirewallServiceSupported ? 1 : 0);
+        result = 31 * result + (_dnsServers != null ? _dnsServers.hashCode() : 0);
+        result = 31 * result + (_ingressFirewallRules != null ? _ingressFirewallRules.hashCode() : 0);
+        result = 31 * result + (_egressFirewallRules != null ? _egressFirewallRules.hashCode() : 0);
+        result = 31 * result + (_acsFipUuid != null ? _acsFipUuid.hashCode() : 0);
+        result = 31 * result + (_egressDefaultPolicy ? 1 : 0);
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspAnswer.java
deleted file mode 100644
index 592216e..0000000
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspAnswer.java
+++ /dev/null
@@ -1,34 +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.agent.api.element;
-
-import com.cloud.agent.api.Answer;
-
-public class ShutDownVpcVspAnswer extends Answer {
-
-    public ShutDownVpcVspAnswer(ShutDownVpcVspCommand cmd, boolean success, String details) {
-        super(cmd, success, details);
-    }
-
-    public ShutDownVpcVspAnswer(ShutDownVpcVspCommand cmd, Exception e) {
-        super(cmd, e);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspCommand.java
index fc05559..4c41e51 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspCommand.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspCommand.java
@@ -19,17 +19,20 @@
 
 package com.cloud.agent.api.element;
 
+import com.cloud.agent.api.CmdBuilder;
 import com.cloud.agent.api.Command;
 
 public class ShutDownVpcVspCommand extends Command {
 
-    String _domainUuid;
-    String _vpcUuid;
+    private final String _domainUuid;
+    private final String _vpcUuid;
+    private final String _domainTemplateName;
 
-    public ShutDownVpcVspCommand(String domainUuid, String vpcUuid) {
+    private ShutDownVpcVspCommand(String domainUuid, String vpcUuid, String domainTemplateName) {
         super();
         this._domainUuid = domainUuid;
         this._vpcUuid = vpcUuid;
+        this._domainTemplateName = domainTemplateName;
     }
 
     public String getDomainUuid() {
@@ -40,9 +43,63 @@ public class ShutDownVpcVspCommand extends Command {
         return _vpcUuid;
     }
 
+    public String getDomainTemplateName() {
+        return _domainTemplateName;
+    }
+
+    public static class Builder implements CmdBuilder<ShutDownVpcVspCommand> {
+        private String _domainUuid;
+        private String _vpcUuid;
+        private String _domainTemplateName;
+
+        public Builder domainUuid(String domainUuid) {
+            this._domainUuid = domainUuid;
+            return this;
+        }
+
+        public Builder vpcUuid(String vpcUuid) {
+            this._vpcUuid = vpcUuid;
+            return this;
+        }
+
+        public Builder domainTemplateName(String domainTemplateName) {
+            this._domainTemplateName = domainTemplateName;
+            return this;
+        }
+
+        @Override
+        public ShutDownVpcVspCommand build() {
+            return new ShutDownVpcVspCommand(_domainUuid, _vpcUuid, _domainTemplateName);
+        }
+    }
+
     @Override
     public boolean executeInSequence() {
         return false;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ShutDownVpcVspCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        ShutDownVpcVspCommand that = (ShutDownVpcVspCommand) o;
+
+        if (_domainTemplateName != null ? !_domainTemplateName.equals(that._domainTemplateName) : that._domainTemplateName != null)
+            return false;
+        if (_domainUuid != null ? !_domainUuid.equals(that._domainUuid) : that._domainUuid != null) return false;
+        if (_vpcUuid != null ? !_vpcUuid.equals(that._vpcUuid) : that._vpcUuid != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_domainUuid != null ? _domainUuid.hashCode() : 0);
+        result = 31 * result + (_vpcUuid != null ? _vpcUuid.hashCode() : 0);
+        result = 31 * result + (_domainTemplateName != null ? _domainTemplateName.hashCode() : 0);
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspAnswer.java
deleted file mode 100644
index 57ecf29..0000000
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspAnswer.java
+++ /dev/null
@@ -1,34 +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.agent.api.guru;
-
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
-
-public class DeallocateVmVspAnswer extends Answer {
-
-    public DeallocateVmVspAnswer(Command command, Exception e) {
-        super(command, e);
-    }
-
-    public DeallocateVmVspAnswer(DeallocateVmVspCommand cmd, boolean success, String details) {
-        super(cmd, success, details);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspCommand.java
index 19c904f..421fa4c 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspCommand.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspCommand.java
@@ -19,40 +19,45 @@
 
 package com.cloud.agent.api.guru;
 
+import com.cloud.agent.api.CmdBuilder;
 import com.cloud.agent.api.Command;
 
 public class DeallocateVmVspCommand extends Command {
 
-    String _networkUuid;
-    String _nicFrmDdUuid;
-    String _nicMacAddress;
-    String _nicIp4Address;
-    boolean _isL3Network;
-    String _vpcUuid;
-    String _networksDomainUuid;
-    String _vmInstanceName;
-    String _vmUuid;
-
-    public DeallocateVmVspCommand(String networkUuid, String nicFrmDdUuid, String nicMacAddress, String nicIp4Address, boolean isL3Network, String vpcUuid,
-            String networksDomainUuid, String vmInstanceName, String vmUuid) {
+    private final String _networkUuid;
+    private final String _nicFromDdUuid;
+    private final String _nicMacAddress;
+    private final String _nicIp4Address;
+    private final boolean _isL3Network;
+    private final boolean _isSharedNetwork;
+    private final String _vpcUuid;
+    private final String _networksDomainUuid;
+    private final String _vmInstanceName;
+    private final String _vmUuid;
+    private final boolean _isExpungingState;
+
+    private DeallocateVmVspCommand(String networkUuid, String nicFromDdUuid, String nicMacAddress, String nicIp4Address, boolean isL3Network, boolean isSharedNetwork, String vpcUuid,
+            String networksDomainUuid, String vmInstanceName, String vmUuid, boolean isExpungingState) {
         super();
         this._networkUuid = networkUuid;
-        this._nicFrmDdUuid = nicFrmDdUuid;
+        this._nicFromDdUuid = nicFromDdUuid;
         this._nicMacAddress = nicMacAddress;
         this._nicIp4Address = nicIp4Address;
         this._isL3Network = isL3Network;
+        this._isSharedNetwork = isSharedNetwork;
         this._vpcUuid = vpcUuid;
         this._networksDomainUuid = networksDomainUuid;
         this._vmInstanceName = vmInstanceName;
         this._vmUuid = vmUuid;
+        this._isExpungingState = isExpungingState;
     }
 
     public String getNetworkUuid() {
         return _networkUuid;
     }
 
-    public String getNicFrmDdUuid() {
-        return _nicFrmDdUuid;
+    public String getNicFromDdUuid() {
+        return _nicFromDdUuid;
     }
 
     public String getNicMacAddress() {
@@ -67,6 +72,10 @@ public class DeallocateVmVspCommand extends Command {
         return _isL3Network;
     }
 
+    public boolean isSharedNetwork() {
+        return _isSharedNetwork;
+    }
+
     public String getVpcUuid() {
         return _vpcUuid;
     }
@@ -83,9 +92,132 @@ public class DeallocateVmVspCommand extends Command {
         return _vmUuid;
     }
 
+    public boolean isExpungingState() {
+        return _isExpungingState;
+    }
+
+    public static class Builder implements CmdBuilder<DeallocateVmVspCommand> {
+        private String _networkUuid;
+        private String _nicFromDdUuid;
+        private String _nicMacAddress;
+        private String _nicIp4Address;
+        private boolean _isL3Network;
+        private boolean _isSharedNetwork;
+        private String _vpcUuid;
+        private String _networksDomainUuid;
+        private String _vmInstanceName;
+        private String _vmUuid;
+        private boolean _isExpungingState;
+
+        public Builder networkUuid(String networkUuid) {
+            this._networkUuid = networkUuid;
+            return this;
+        }
+
+        public Builder nicFromDbUuid(String nicFromDbUuid) {
+            this._nicFromDdUuid = nicFromDbUuid;
+            return this;
+        }
+
+        public Builder nicMacAddress(String nicMacAddress) {
+            this._nicMacAddress = nicMacAddress;
+            return this;
+        }
+
+        public Builder nicIp4Address(String nicIp4Address) {
+            this._nicIp4Address = nicIp4Address;
+            return this;
+        }
+
+        public Builder isL3Network(boolean isL3Network) {
+            this._isL3Network = isL3Network;
+            return this;
+        }
+
+        public Builder isSharedNetwork(boolean isSharedNetwork) {
+            this._isSharedNetwork = isSharedNetwork;
+            return this;
+        }
+
+        public Builder vpcUuid(String vpcUuid) {
+            this._vpcUuid = vpcUuid;
+            return this;
+        }
+
+        public Builder networksDomainUuid(String networksDomainUuid) {
+            this._networksDomainUuid = networksDomainUuid;
+            return this;
+        }
+
+        public Builder vmInstanceName(String vmInstanceName) {
+            this._vmInstanceName = vmInstanceName;
+            return this;
+        }
+
+        public Builder vmUuid(String vmUuid) {
+            this._vmUuid = vmUuid;
+            return this;
+        }
+
+        public Builder isExpungingState(boolean isExpungingState) {
+            this._isExpungingState = isExpungingState;
+            return this;
+        }
+
+        @Override
+        public DeallocateVmVspCommand build() {
+            return new DeallocateVmVspCommand(_networkUuid,_nicFromDdUuid, _nicMacAddress, _nicIp4Address, _isL3Network, _isSharedNetwork, _vpcUuid,
+                    _networksDomainUuid, _vmInstanceName, _vmUuid, _isExpungingState);
+        }
+    }
+
     @Override
     public boolean executeInSequence() {
         return false;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof DeallocateVmVspCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        DeallocateVmVspCommand that = (DeallocateVmVspCommand) o;
+
+        if (_isExpungingState != that._isExpungingState) return false;
+        if (_isL3Network != that._isL3Network) return false;
+        if (_isSharedNetwork != that._isSharedNetwork) return false;
+        if (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false;
+        if (_networksDomainUuid != null ? !_networksDomainUuid.equals(that._networksDomainUuid) : that._networksDomainUuid != null)
+            return false;
+        if (_nicFromDdUuid != null ? !_nicFromDdUuid.equals(that._nicFromDdUuid) : that._nicFromDdUuid != null)
+            return false;
+        if (_nicIp4Address != null ? !_nicIp4Address.equals(that._nicIp4Address) : that._nicIp4Address != null)
+            return false;
+        if (_nicMacAddress != null ? !_nicMacAddress.equals(that._nicMacAddress) : that._nicMacAddress != null)
+            return false;
+        if (_vmInstanceName != null ? !_vmInstanceName.equals(that._vmInstanceName) : that._vmInstanceName != null)
+            return false;
+        if (_vmUuid != null ? !_vmUuid.equals(that._vmUuid) : that._vmUuid != null) return false;
+        if (_vpcUuid != null ? !_vpcUuid.equals(that._vpcUuid) : that._vpcUuid != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0);
+        result = 31 * result + (_nicFromDdUuid != null ? _nicFromDdUuid.hashCode() : 0);
+        result = 31 * result + (_nicMacAddress != null ? _nicMacAddress.hashCode() : 0);
+        result = 31 * result + (_nicIp4Address != null ? _nicIp4Address.hashCode() : 0);
+        result = 31 * result + (_isL3Network ? 1 : 0);
+        result = 31 * result + (_isSharedNetwork ? 1 : 0);
+        result = 31 * result + (_vpcUuid != null ? _vpcUuid.hashCode() : 0);
+        result = 31 * result + (_networksDomainUuid != null ? _networksDomainUuid.hashCode() : 0);
+        result = 31 * result + (_vmInstanceName != null ? _vmInstanceName.hashCode() : 0);
+        result = 31 * result + (_vmUuid != null ? _vmUuid.hashCode() : 0);
+        result = 31 * result + (_isExpungingState ? 1 : 0);
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspAnswer.java
deleted file mode 100644
index 87e7b32..0000000
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspAnswer.java
+++ /dev/null
@@ -1,35 +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.agent.api.guru;
-
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
-
-public class ImplementNetworkVspAnswer extends Answer {
-
-    public ImplementNetworkVspAnswer(Command command, Exception e) {
-        super(command, e);
-    }
-
-    public ImplementNetworkVspAnswer(ImplementNetworkVspCommand cmd, boolean success, String details) {
-        super(cmd, success, details);
-    }
-
-}


[7/7] git commit: updated refs/heads/master to 95ae796

Posted by re...@apache.org.
Merge pull request #801 from nlivens/updated-nuage-vsp-plugin

CLOUDSTACK-8832 : Update Nuage VSP plugin to work with Nuage VSP release 3.2

* pr/801:
  CLOUDSTACK-8832 : Update Nuage VSP plugin to work with Nuage VSP release 3.2

Signed-off-by: Remi Bergsma <gi...@remi.nl>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/95ae7963
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/95ae7963
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/95ae7963

Branch: refs/heads/master
Commit: 95ae7963d5652595d62d6ace39de2eec9670413c
Parents: 228935d 645f875
Author: Remi Bergsma <gi...@remi.nl>
Authored: Wed Nov 18 12:09:09 2015 +0100
Committer: Remi Bergsma <gi...@remi.nl>
Committed: Wed Nov 18 12:09:09 2015 +0100

----------------------------------------------------------------------
 api/src/com/cloud/agent/api/Answer.java         |  22 +
 api/src/com/cloud/agent/api/Command.java        |  20 +
 api/src/com/cloud/event/EventTypes.java         |   1 +
 api/src/com/cloud/network/Network.java          |   1 -
 client/tomcatconf/commands.properties.in        |   1 +
 core/src/com/cloud/agent/api/PingCommand.java   |  22 +
 .../src/com/cloud/network/dao/IPAddressDao.java |   2 +
 .../com/cloud/network/dao/IPAddressDaoImpl.java |   8 +
 .../cloud/network/vpc/NetworkACLItemDao.java    |   2 +-
 .../com/cloud/network/vpc/VpcOfferingVO.java    |   8 +
 .../network/vpc/dao/NetworkACLItemDaoImpl.java  |   5 +-
 plugins/network-elements/nuage-vsp/pom.xml      |   7 +
 .../src/com/cloud/agent/api/CmdBuilder.java     |  24 +
 .../cloud/agent/api/PingNuageVspCommand.java    |  56 ++
 .../com/cloud/agent/api/StartupVspCommand.java  |   5 +
 .../com/cloud/agent/api/VspResourceAnswer.java  |  20 +-
 .../com/cloud/agent/api/VspResourceCommand.java |  53 +-
 .../api/element/ApplyAclRuleVspAnswer.java      |  34 -
 .../api/element/ApplyAclRuleVspCommand.java     | 195 ++++-
 .../api/element/ApplyStaticNatVspAnswer.java    |  34 -
 .../api/element/ApplyStaticNatVspCommand.java   | 104 ++-
 .../agent/api/element/ImplementVspCommand.java  | 297 ++++++++
 .../agent/api/element/ShutDownVpcVspAnswer.java |  34 -
 .../api/element/ShutDownVpcVspCommand.java      |  63 +-
 .../agent/api/guru/DeallocateVmVspAnswer.java   |  34 -
 .../agent/api/guru/DeallocateVmVspCommand.java  | 162 +++-
 .../api/guru/ImplementNetworkVspAnswer.java     |  35 -
 .../api/guru/ImplementNetworkVspCommand.java    | 278 ++++++-
 .../agent/api/guru/ReleaseVmVspAnswer.java      |  34 -
 .../agent/api/guru/ReleaseVmVspCommand.java     |  54 --
 .../api/guru/ReserveVmInterfaceVspAnswer.java   |  44 --
 .../api/guru/ReserveVmInterfaceVspCommand.java  | 327 +++++++-
 .../agent/api/guru/TrashNetworkVspAnswer.java   |  34 -
 .../agent/api/guru/TrashNetworkVspCommand.java  |  97 ++-
 .../api/manager/GetClientDefaultsAnswer.java    |  81 ++
 .../api/manager/GetClientDefaultsCommand.java   |  38 +
 .../api/manager/SupportedApiVersionCommand.java |  61 ++
 .../cloud/agent/api/sync/SyncDomainAnswer.java  |  57 ++
 .../cloud/agent/api/sync/SyncDomainCommand.java |  93 +++
 .../agent/api/sync/SyncNuageVspCmsIdAnswer.java |  73 ++
 .../api/sync/SyncNuageVspCmsIdCommand.java      |  72 ++
 .../com/cloud/agent/api/sync/SyncVspAnswer.java |  34 -
 .../cloud/agent/api/sync/SyncVspCommand.java    |  22 +-
 .../api/commands/AddNuageVspDeviceCmd.java      |  25 +-
 .../api/commands/DeleteNuageVspDeviceCmd.java   |  21 +-
 .../IssueNuageVspResourceRequestCmd.java        |  34 +-
 .../api/commands/ListNuageVspDevicesCmd.java    |  28 +-
 .../api/commands/UpdateNuageVspDeviceCmd.java   | 180 +++++
 .../api/response/NuageVspDeviceResponse.java    |   5 +-
 .../api/response/NuageVspResourceResponse.java  |   3 +-
 .../src/com/cloud/network/NuageVspDeviceVO.java |   5 +-
 .../src/com/cloud/network/dao/NuageVspDao.java  |   8 +
 .../com/cloud/network/dao/NuageVspDaoImpl.java  |  20 +-
 .../cloud/network/element/NuageVspElement.java  | 342 +++++++--
 .../network/guru/NuageVspGuestNetworkGuru.java  | 512 ++++++++-----
 .../cloud/network/manager/NuageVspManager.java  |  53 +-
 .../network/manager/NuageVspManagerImpl.java    | 748 ++++++++++++++++---
 .../network/resource/NuageVspResource.java      | 543 ++++++++++----
 .../cloud/network/sync/NuageVspSyncImpl.java    |  35 +-
 .../src/com/cloud/util/NuageVspUtil.java        |  40 +
 .../vsp/acs/NuageVspPluginClientLoader.java     |  89 ++-
 .../nuage/vsp/acs/client/NuageVspApiClient.java |  10 +-
 .../vsp/acs/client/NuageVspElementClient.java   |  16 +-
 .../vsp/acs/client/NuageVspGuruClient.java      |  23 +-
 .../vsp/acs/client/NuageVspManagerClient.java   |  42 ++
 .../vsp/acs/client/NuageVspSyncClient.java      |   6 +-
 .../test/com/cloud/agent/api/CommandsTest.java  | 151 ++++
 .../network/element/NuageVspElementTest.java    | 137 +++-
 .../guru/NuageVspGuestNetworkGuruTest.java      | 212 ++++--
 .../network/manager/NuageVspManagerTest.java    |  37 +-
 .../network/resource/NuageVspResourceTest.java  | 199 +++--
 .../cloud/network/sync/NuageVspSyncTest.java    |  23 +-
 .../configuration/ConfigurationManagerImpl.java |   7 +-
 .../cloud/network/guru/DirectNetworkGuru.java   |   6 +-
 test/integration/component/test_nuage_vsp.py    |  61 +-
 .../component/test_vpcnetwork_nuage.py          | 295 ++++++++
 76 files changed, 5184 insertions(+), 1380 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/95ae7963/plugins/network-elements/nuage-vsp/pom.xml
----------------------------------------------------------------------
diff --cc plugins/network-elements/nuage-vsp/pom.xml
index 8dcf833,fb258f8..c1268e4
--- a/plugins/network-elements/nuage-vsp/pom.xml
+++ b/plugins/network-elements/nuage-vsp/pom.xml
@@@ -25,9 -25,16 +25,16 @@@
    <parent>
      <groupId>org.apache.cloudstack</groupId>
      <artifactId>cloudstack-plugins</artifactId>
 -    <version>4.6.0-SNAPSHOT</version>
 +    <version>4.7.0-SNAPSHOT</version>
      <relativePath>../../pom.xml</relativePath>
    </parent>
+   <dependencies>
+     <dependency>
+       <groupId>org.apache.commons</groupId>
+       <artifactId>commons-lang3</artifactId>
+       <version>${cs.lang3.version}</version>
+     </dependency>
+   </dependencies>
    <build>
      <plugins>
        <plugin>


[4/7] git commit: updated refs/heads/master to 95ae796

Posted by re...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDaoImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDaoImpl.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDaoImpl.java
index bc55f43..ec60c49 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDaoImpl.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDaoImpl.java
@@ -19,15 +19,13 @@
 
 package com.cloud.network.dao;
 
-import javax.ejb.Local;
-
 import com.cloud.network.NuageVspDeviceVO;
+import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import org.springframework.stereotype.Component;
 
-import com.cloud.utils.db.GenericDaoBase;
-
+import javax.ejb.Local;
 import java.util.List;
 
 @Component
@@ -35,12 +33,17 @@ import java.util.List;
 public class NuageVspDaoImpl extends GenericDaoBase<NuageVspDeviceVO, Long>
         implements NuageVspDao {
 
-    protected final SearchBuilder<NuageVspDeviceVO> physicalNetworkIdSearch;
+    private final SearchBuilder<NuageVspDeviceVO> physicalNetworkIdSearch;
+    private final SearchBuilder<NuageVspDeviceVO> hostIdSearch;
 
     public NuageVspDaoImpl() {
         physicalNetworkIdSearch = createSearchBuilder();
         physicalNetworkIdSearch.and("physicalNetworkId", physicalNetworkIdSearch.entity().getPhysicalNetworkId(), SearchCriteria.Op.EQ);
         physicalNetworkIdSearch.done();
+
+        hostIdSearch = createSearchBuilder();
+        hostIdSearch.and("hostId", hostIdSearch.entity().getHostId(), SearchCriteria.Op.EQ);
+        hostIdSearch.done();
     }
 
     @Override
@@ -49,4 +52,11 @@ public class NuageVspDaoImpl extends GenericDaoBase<NuageVspDeviceVO, Long>
         sc.setParameters("physicalNetworkId", physicalNetworkId);
         return search(sc, null);
     }
+
+    @Override
+    public List<NuageVspDeviceVO> listByHost(long hostId) {
+        SearchCriteria<NuageVspDeviceVO> sc = hostIdSearch.create();
+        sc.setParameters("hostId", hostId);
+        return search(sc, null);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/network/element/NuageVspElement.java
----------------------------------------------------------------------
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 e777268..d9243d4 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
@@ -19,34 +19,20 @@
 
 package com.cloud.network.element;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-
-import org.apache.cloudstack.api.InternalIdentity;
-import org.apache.cloudstack.network.ExternalNetworkDeviceManager;
-import org.apache.log4j.Logger;
-
 import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupVspCommand;
-import com.cloud.agent.api.element.ApplyAclRuleVspAnswer;
 import com.cloud.agent.api.element.ApplyAclRuleVspCommand;
-import com.cloud.agent.api.element.ApplyStaticNatVspAnswer;
 import com.cloud.agent.api.element.ApplyStaticNatVspCommand;
+import com.cloud.agent.api.element.ImplementVspCommand;
+import com.cloud.agent.api.element.ShutDownVpcVspCommand;
 import com.cloud.dc.VlanVO;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.VlanDao;
 import com.cloud.deploy.DeployDestination;
 import com.cloud.domain.Domain;
 import com.cloud.domain.dao.DomainDao;
-import com.cloud.exception.CloudException;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.ResourceUnavailableException;
@@ -60,17 +46,28 @@ import com.cloud.network.Network.Service;
 import com.cloud.network.NetworkModel;
 import com.cloud.network.Networks;
 import com.cloud.network.NuageVspDeviceVO;
+import com.cloud.network.PhysicalNetwork;
 import com.cloud.network.PhysicalNetworkServiceProvider;
 import com.cloud.network.PublicIpAddress;
+import com.cloud.network.dao.FirewallRulesCidrsDao;
+import com.cloud.network.dao.FirewallRulesDao;
 import com.cloud.network.dao.IPAddressDao;
 import com.cloud.network.dao.IPAddressVO;
 import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.dao.NetworkServiceMapDao;
 import com.cloud.network.dao.NuageVspDao;
+import com.cloud.network.dao.PhysicalNetworkDao;
+import com.cloud.network.dao.PhysicalNetworkVO;
+import com.cloud.network.manager.NuageVspManager;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRule.FirewallRuleType;
+import com.cloud.network.rules.FirewallRuleVO;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.network.vpc.NetworkACLItem;
+import com.cloud.network.vpc.NetworkACLItemDao;
+import com.cloud.network.vpc.NetworkACLItemVO;
+import com.cloud.network.vpc.PrivateGateway;
+import com.cloud.network.vpc.StaticRouteProfile;
 import com.cloud.network.vpc.Vpc;
 import com.cloud.network.vpc.dao.VpcDao;
 import com.cloud.offering.NetworkOffering;
@@ -81,17 +78,34 @@ import com.cloud.resource.ResourceManager;
 import com.cloud.resource.ResourceStateAdapter;
 import com.cloud.resource.ServerResource;
 import com.cloud.resource.UnableDeleteHostException;
+import com.cloud.util.NuageVspUtil;
 import com.cloud.utils.component.AdapterBase;
+import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.NicVO;
 import com.cloud.vm.ReservationContext;
 import com.cloud.vm.VirtualMachineProfile;
 import com.cloud.vm.dao.NicDao;
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+import org.apache.cloudstack.api.InternalIdentity;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.network.ExternalNetworkDeviceManager;
+import org.apache.log4j.Logger;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 @Local(value = {NetworkElement.class, ConnectivityProvider.class, IpDeployer.class, SourceNatServiceProvider.class, StaticNatServiceProvider.class, FirewallServiceProvider.class,
-        DhcpServiceProvider.class, NetworkACLServiceProvider.class})
+        DhcpServiceProvider.class, VpcProvider.class, NetworkACLServiceProvider.class})
 public class NuageVspElement extends AdapterBase implements ConnectivityProvider, IpDeployer, SourceNatServiceProvider, StaticNatServiceProvider, FirewallServiceProvider,
-        DhcpServiceProvider, NetworkACLServiceProvider, ResourceStateAdapter {
+        DhcpServiceProvider, ResourceStateAdapter, VpcProvider, NetworkACLServiceProvider {
 
     private static final Logger s_logger = Logger.getLogger(NuageVspElement.class);
 
@@ -129,6 +143,18 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
     AgentManager _agentMgr;
     @Inject
     NetworkOfferingDao _ntwkOfferingDao;
+    @Inject
+    ConfigurationDao _configDao;
+    @Inject
+    NuageVspManager _nuageVspManager;
+    @Inject
+    FirewallRulesDao _firewallRulesDao;
+    @Inject
+    FirewallRulesCidrsDao _firewallRulesCidrsDao;
+    @Inject
+    PhysicalNetworkDao _physicalNetworkDao;
+    @Inject
+    NetworkACLItemDao _networkACLItemDao;
 
     @Override
     public boolean applyIps(Network network, List<? extends PublicIpAddress> ipAddress, Set<Service> service) throws ResourceUnavailableException {
@@ -149,9 +175,12 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
         // L3 Support : Generic
         capabilities.put(Service.Gateway, null);
 
+        // Security Group
+        capabilities.put(Service.SecurityGroup, null);
+
         // L3 Support : SourceNat
         Map<Capability, String> sourceNatCapabilities = new HashMap<Capability, String>();
-        sourceNatCapabilities.put(Capability.SupportedSourceNatTypes, "peraccount");
+        sourceNatCapabilities.put(Capability.SupportedSourceNatTypes, "perzone");
         sourceNatCapabilities.put(Capability.RedundantRouter, "false");
         capabilities.put(Service.SourceNat, sourceNatCapabilities);
 
@@ -194,7 +223,13 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
     @Override
     public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException,
             ResourceUnavailableException, InsufficientCapacityException {
-        s_logger.debug("Entering NuageElement implement function for network " + network.getDisplayText() + " (state " + network.getState() + ")");
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("Entering NuageElement implement function for network " + network.getDisplayText() + " (state " + network.getState() + ")");
+        }
+
+        if (network.getVpcId() != null) {
+            return applyACLRulesForVpc(network, offering);
+        }
 
         if (!canHandle(network, Service.Connectivity)) {
             return false;
@@ -205,9 +240,85 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
             return false;
         }
 
+        boolean egressDefaultPolicy = offering.getEgressDefaultPolicy();
+        Domain networkDomain = _domainDao.findById(network.getDomainId());
+        boolean isFirewallServiceSupported = _networkModel.areServicesSupportedByNetworkOffering(offering.getId(), Service.Firewall);
+        List<String> dnsServers = _nuageVspManager.getDnsDetails(network);
+
+        boolean isL2Network = false, isL3Network = false, isShared = false;
+        String subnetUuid = network.getUuid();
+        if (offering.getGuestType() == Network.GuestType.Shared) {
+            isShared = true;
+            subnetUuid = networkDomain.getUuid();
+        } else if (_ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offering.getId(), Service.SourceNat)
+                || _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offering.getId(), Service.StaticNat)
+                || _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offering.getId(), Service.Connectivity)) {
+            isL3Network = true;
+        } else {
+            isL2Network = true;
+        }
+
+        String preConfiguredDomainTemplateName = NuageVspUtil.getPreConfiguredDomainTemplateName(_configDao, network, offering);
+        List<Map<String, Object>> ingressFirewallRules = getFirewallRulesToApply(network.getId(), FirewallRule.TrafficType.Ingress, egressDefaultPolicy);
+        List<Map<String, Object>> egressFirewallRules = getFirewallRulesToApply(network.getId(), FirewallRule.TrafficType.Egress, egressDefaultPolicy);
+
+        List<IPAddressVO> ips = _ipAddressDao.listStaticNatPublicIps(network.getId());
+        List<String> acsFipUuid = new ArrayList<String>();
+        for (IPAddressVO ip : ips) {
+            acsFipUuid.add(ip.getUuid());
+        }
+
+        HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId());
+        ImplementVspCommand.Builder cmdBuilder = new ImplementVspCommand.Builder()
+                .networkId(network.getId())
+                .networkDomainUuid(networkDomain.getUuid())
+                .networkUuid(network.getUuid())
+                .networkName(network.getName())
+                .vpcOrSubnetUuid(subnetUuid)
+                .isL2Network(isL2Network)
+                .isL3Network(isL3Network)
+                .isVpc(false)
+                .isShared(isShared)
+                .domainTemplateName(preConfiguredDomainTemplateName)
+                .isFirewallServiceSupported(isFirewallServiceSupported)
+                .dnsServers(dnsServers)
+                .ingressFirewallRules(ingressFirewallRules)
+                .egressFirewallRules(egressFirewallRules)
+                .acsFipUuid(acsFipUuid)
+                .egressDefaultPolicy(egressDefaultPolicy);
+        Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmdBuilder.build());
+        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());
+            }
+        }
+
         return true;
     }
 
+    private boolean applyACLRulesForVpc(Network network, NetworkOffering offering) throws ResourceUnavailableException {
+        List<NetworkACLItemVO> rules = _networkACLItemDao.listByACL(network.getNetworkACLId());
+        if (_networkModel.areServicesSupportedByNetworkOffering(offering.getId(), Network.Service.NetworkACL)) {
+            applyACLRules(network, rules, true, null, false);
+        }
+        return true;
+    }
+
+    private List<Map<String, Object>> getFirewallRulesToApply(long networkId, FirewallRule.TrafficType trafficType, final boolean egressDefaultPolicy) {
+        List<FirewallRuleVO> firewallRulesToApply = _firewallRulesDao.listByNetworkPurposeTrafficType(networkId, FirewallRule.Purpose.Firewall, trafficType);
+        for (FirewallRuleVO rule : firewallRulesToApply) {
+            // load cidrs if any
+            rule.setSourceCidrList(_firewallRulesCidrsDao.getSourceCidrs(rule.getId()));
+        }
+        return Lists.transform(firewallRulesToApply, new Function<FirewallRuleVO, Map<String, Object>>() {
+            @Override
+            public Map<String, Object> apply(FirewallRuleVO firewallRuleVO) {
+                return getACLRuleDetails(firewallRuleVO, egressDefaultPolicy);
+            }
+        });
+    }
+
     @Override
     public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException,
             ResourceUnavailableException, InsufficientCapacityException {
@@ -258,7 +369,7 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
 
     @Override
     public boolean canEnableIndividualServices() {
-        return false;
+        return true;
     }
 
     @Override
@@ -303,13 +414,17 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
         }
 
         if (!_networkModel.isProviderForNetwork(getProvider(), network.getId())) {
-            s_logger.debug("NuageElement is not a provider for network " + network.getDisplayText());
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug("NuageVsp is not a provider for network " + network.getDisplayText());
+            }
             return false;
         }
 
         if (service != null) {
             if (!_ntwkSrvcDao.canProviderSupportServiceInNetwork(network.getId(), service, getProvider())) {
-                s_logger.debug("NuageElement can't provide the " + service.getName() + " service on network " + network.getDisplayText());
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("NuageVsp can't provide the " + service.getName() + " service on network " + network.getDisplayText());
+                }
                 return false;
             }
         }
@@ -360,6 +475,7 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
             //client to process the request
             sourceNatDetail.put("sourceNatIpUuid", sourceNatIp.getUuid());
             sourceNatDetail.put("sourceNatIpAddress", sourceNatIp.getAddress().addr());
+            sourceNatDetail.put("nicUuid", nicVO == null ? null : nicVO.getUuid());
             sourceNatDetail.put("nicMacAddress", nicVO == null ? null : nicVO.getMacAddress());
             sourceNatDetail.put("isRevoke", staticNat.isForRevoke());
             sourceNatDetail.put("sourceNatVlanUuid", sourceNatVan.getUuid());
@@ -367,22 +483,21 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
             sourceNatDetail.put("sourceNatVlanNetmask", sourceNatVan.getVlanNetmask());
             sourceNatDetails.add(sourceNatDetail);
         }
-        try {
-            try {
-                HostVO nuageVspHost = getNuageVspHost(config.getPhysicalNetworkId());
-                ApplyStaticNatVspCommand cmd = new ApplyStaticNatVspCommand(networkDomain.getUuid(), vpcOrSubnetUuid, isL3Network, sourceNatDetails);
-                ApplyStaticNatVspAnswer answer = (ApplyStaticNatVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd);
-                if (answer == null || !answer.getResult()) {
-                    s_logger.error("ApplyStaticNatNuageVspCommand for network " + config.getUuid() + " failed");
-                    if ((null != answer) && (null != answer.getDetails())) {
-                        throw new ResourceUnavailableException(answer.getDetails(), Network.class, config.getId());
-                    }
-                }
-            } catch (Exception e) {
-                s_logger.warn("Failed to apply static Nat in Vsp " + e.getMessage());
+
+        HostVO nuageVspHost = getNuageVspHost(config.getPhysicalNetworkId());
+        ApplyStaticNatVspCommand.Builder cmdBuilder = new ApplyStaticNatVspCommand.Builder()
+                .networkDomainUuid(networkDomain.getUuid())
+                .networkUuid(config.getUuid())
+                .vpcOrSubnetUuid(vpcOrSubnetUuid)
+                .isL3Network(isL3Network)
+                .isVpc(vpcId != null)
+                .staticNatDetails(sourceNatDetails);
+        Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmdBuilder.build());
+        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());
             }
-        } catch (Exception e) {
-            throw new ResourceUnavailableException("Failed to apply Static NAT in VSP", Network.class, config.getId(), e);
         }
 
         return true;
@@ -395,65 +510,142 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
 
     @Override
     public boolean applyFWRules(Network network, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
-        s_logger.debug("Handling applyFWRules for network " + network.getName() + " with " + rules.size() + " FWRules");
-        if (rules != null && rules.size() == 1 && rules.iterator().next().getType().equals(FirewallRuleType.System)) {
-            s_logger.debug("Default ACL added by CS as system is ignored for network " + network.getName() + " with rule " + rules);
+        if (rules == null || rules.isEmpty()) {
+            return true;
+        }
+
+        if (rules.size() == 1 && rules.iterator().next().getType().equals(FirewallRuleType.System)) {
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug("Default ACL added by CS as system is ignored for network " + network.getName() + " with rule " + rules);
+            }
             return true;
         }
-        return applyACLRules(network, rules, false);
+
+        s_logger.info("Applying " + rules.size() + " Firewall Rules for network " + network.getName());
+        return applyACLRules(network, rules, false, rules.iterator().next().getTrafficType().equals(FirewallRule.TrafficType.Ingress), false);
+    }
+
+    protected boolean applyACLRules(Network network, List<? extends InternalIdentity> rules, boolean isNetworkAcl, Boolean isAcsIngressAcl, boolean networkReset)
+            throws ResourceUnavailableException {
+        Domain networksDomain = _domainDao.findById(network.getDomainId());
+        NetworkOfferingVO networkOfferingVO = _ntwkOfferingDao.findById(network.getNetworkOfferingId());
+        Long vpcId = network.getVpcId();
+        String vpcOrSubnetUuid = null;
+        if (vpcId != null) {
+            Vpc vpcObj = _vpcDao.findById(vpcId);
+            vpcOrSubnetUuid = vpcObj.getUuid();
+        } else {
+            vpcOrSubnetUuid = network.getUuid();
+        }
+        boolean egressDefaultPolicy = networkOfferingVO.getEgressDefaultPolicy();
+        List<Map<String, Object>> aclRules = new ArrayList<Map<String, Object>>();
+        for (InternalIdentity acl : rules) {
+            aclRules.add(getACLRuleDetails(acl, egressDefaultPolicy));
+        }
+
+        boolean isL3Network = isL3Network(network.getNetworkOfferingId());
+        HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId());
+        String preConfiguredDomainTemplateName = NuageVspUtil.getPreConfiguredDomainTemplateName(_configDao, network, networkOfferingVO);
+        ApplyAclRuleVspCommand.Builder cmdBuilder = new ApplyAclRuleVspCommand.Builder()
+                .networkAcl(isNetworkAcl)
+                .networkUuid(network.getUuid())
+                .networkDomainUuid(networksDomain.getUuid())
+                .vpcOrSubnetUuid(vpcOrSubnetUuid)
+                .networkName(network.getName())
+                .isL2Network(!isL3Network)
+                .aclRules(aclRules)
+                .networkId(network.getId())
+                .egressDefaultPolicy(networkOfferingVO.getEgressDefaultPolicy())
+                .acsIngressAcl(isAcsIngressAcl)
+                .networkReset(networkReset)
+                .domainTemplateName(preConfiguredDomainTemplateName);
+        Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmdBuilder.build());
+        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());
+            }
+        }
+        return true;
     }
 
     @Override
-    public boolean applyNetworkACLs(Network network, List<? extends NetworkACLItem> rules) throws ResourceUnavailableException {
+    public boolean applyNetworkACLs(Network config, List<? extends NetworkACLItem> rules) throws ResourceUnavailableException {
         if (rules == null || rules.isEmpty()) {
-            s_logger.debug("No rules to apply. So, delete all the existing ACL in VSP from Subnet with uuid " + network.getUuid());
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug("No rules to apply. So, delete all the existing ACL in VSP from Subnet with uuid " + config.getUuid());
+            }
         } else {
-            s_logger.debug("New rules has to applied. So, delete all the existing ACL in VSP from Subnet with uuid " + network.getUuid());
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug("New rules has to applied. So, delete all the existing ACL in VSP from Subnet with uuid " + config.getUuid());
+            }
         }
         if (rules != null) {
-            s_logger.debug("Handling applyNetworkACLs for network " + network.getName() + " with " + rules.size() + " Network ACLs");
-            applyACLRules(network, rules, true);
+            s_logger.info("Applying " + rules.size() + " Network ACLs for network " + config.getName());
+            applyACLRules(config, rules, true, null, rules.isEmpty());
         }
         return true;
     }
 
-    protected boolean applyACLRules(Network network, List<? extends InternalIdentity> rules, boolean isVpc) throws ResourceUnavailableException {
-        Domain networksDomain = _domainDao.findById(network.getDomainId());
-        NetworkOfferingVO networkOferringVO = _ntwkOfferingDao.findById(network.getNetworkOfferingId());
-        try {
-            Long vpcId = network.getVpcId();
-            String vpcOrSubnetUuid = null;
-            if (vpcId != null) {
-                Vpc vpcObj = _vpcDao.findById(vpcId);
-                vpcOrSubnetUuid = vpcObj.getUuid();
-            } else {
-                vpcOrSubnetUuid = network.getUuid();
-            }
-            boolean egressDefaultPolicy = networkOferringVO.getEgressDefaultPolicy();
-            List<Map<String, Object>> aclRules = new ArrayList<Map<String, Object>>();
-            for (InternalIdentity acl : rules) {
-                aclRules.add(getACLRuleDetails(acl, egressDefaultPolicy));
-            }
+    @Override
+    public boolean implementVpc(Vpc vpc, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
+        return true;
+    }
 
-            HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId());
-            ApplyAclRuleVspCommand cmd = new ApplyAclRuleVspCommand(network.getUuid(), networksDomain.getUuid(), vpcOrSubnetUuid, isL3Network(networkOferringVO.getId()), aclRules,
-                    isVpc, network.getId());
-            ApplyAclRuleVspAnswer answer = (ApplyAclRuleVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd);
+    @Override
+    public boolean shutdownVpc(Vpc vpc, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
+        if (vpc.getState().equals(Vpc.State.Inactive)) {
+            Domain vpcDomain = _domainDao.findById(vpc.getDomainId());
+            HostVO nuageVspHost = getNuageVspHost(getPhysicalNetworkId(vpc.getZoneId()));
+            String preConfiguredDomainTemplateName = _configDao.getValue(NuageVspManager.NuageVspVpcDomainTemplateName.key());
+            ShutDownVpcVspCommand.Builder cmdBuilder = new ShutDownVpcVspCommand.Builder()
+                    .domainUuid(vpcDomain.getUuid())
+                    .vpcUuid(vpc.getUuid())
+                    .domainTemplateName(preConfiguredDomainTemplateName);
+            Answer answer =  _agentMgr.easySend(nuageVspHost.getId(), cmdBuilder.build());
             if (answer == null || !answer.getResult()) {
-                s_logger.error("ApplyAclRuleNuageVspCommand for network " + network.getUuid() + " failed");
+                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(), Network.class, network.getId());
+                    throw new ResourceUnavailableException(answer.getDetails(), Vpc.class, vpc.getId());
                 }
             }
+        }
+        return true;
+    }
 
-        } catch (Exception e1) {
-            throw new ResourceUnavailableException(e1.getMessage(), Network.class, network.getId());
+    private Long getPhysicalNetworkId(Long zoneId) {
+        Long guestPhysicalNetworkId = 0L;
+        List<PhysicalNetworkVO> physicalNetworkList = _physicalNetworkDao.listByZone(zoneId);
+        for (PhysicalNetworkVO phyNtwk : physicalNetworkList) {
+            if (phyNtwk.getIsolationMethods().contains(PhysicalNetwork.IsolationMethod.VSP.name())) {
+                guestPhysicalNetworkId = phyNtwk.getId();
+                break;
+            }
         }
+        return guestPhysicalNetworkId;
+    }
 
+    @Override
+    public boolean createPrivateGateway(PrivateGateway gateway) throws ConcurrentOperationException, ResourceUnavailableException {
+        return false;
+    }
+
+    @Override
+    public boolean deletePrivateGateway(PrivateGateway privateGateway) throws ConcurrentOperationException, ResourceUnavailableException {
+        return false;
+    }
+
+    @Override
+    public boolean applyStaticRoutes(Vpc vpc, List<StaticRouteProfile> routes) throws ResourceUnavailableException {
         return true;
     }
 
     @Override
+    public boolean applyACLItemsToPrivateGw(PrivateGateway gateway, List<? extends NetworkACLItem> rules) throws ResourceUnavailableException {
+        return false;
+    }
+
+    @Override
     public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
         return null;
     }
@@ -475,7 +667,7 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
         return new DeleteHostAnswer(true);
     }
 
-    protected HostVO getNuageVspHost(Long physicalNetworkId) throws CloudException {
+    private HostVO getNuageVspHost(Long physicalNetworkId) {
         HostVO nuageVspHost;
         List<NuageVspDeviceVO> nuageVspDevices = _nuageVspDao.listByPhysicalNetwork(physicalNetworkId);
         if (nuageVspDevices != null && (!nuageVspDevices.isEmpty())) {
@@ -483,7 +675,7 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
             nuageVspHost = _hostDao.findById(config.getHostId());
             _hostDao.loadDetails(nuageVspHost);
         } else {
-            throw new CloudException("Nuage VSD is not configured on physical network " + physicalNetworkId);
+            throw new CloudRuntimeException("There is no Nuage VSP device configured on physical network " + physicalNetworkId);
         }
         return nuageVspHost;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/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 9bbaf40..e625121 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
@@ -19,42 +19,26 @@
 
 package com.cloud.network.guru;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
-
 import com.cloud.agent.AgentManager;
-import com.cloud.agent.api.guru.DeallocateVmVspAnswer;
+import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.guru.DeallocateVmVspCommand;
-import com.cloud.agent.api.guru.ImplementNetworkVspAnswer;
 import com.cloud.agent.api.guru.ImplementNetworkVspCommand;
-import com.cloud.agent.api.guru.ReleaseVmVspAnswer;
-import com.cloud.agent.api.guru.ReleaseVmVspCommand;
-import com.cloud.agent.api.guru.ReserveVmInterfaceVspAnswer;
 import com.cloud.agent.api.guru.ReserveVmInterfaceVspCommand;
-import com.cloud.agent.api.guru.TrashNetworkVspAnswer;
 import com.cloud.agent.api.guru.TrashNetworkVspCommand;
 import com.cloud.dc.DataCenter;
 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;
@@ -64,9 +48,11 @@ import com.cloud.network.Networks;
 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.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;
@@ -75,13 +61,29 @@ 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.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 org.apache.log4j.Logger;
+
+import javax.ejb.Local;
+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;
 
 @Local(value = NetworkGuru.class)
 public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
@@ -103,6 +105,8 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
     VpcDao _vpcDao;
     @Inject
     AgentManager _agentMgr;
+    @Inject
+    NuageVspManager _nuageVspManager;
 
     public NuageVspGuestNetworkGuru() {
         super();
@@ -114,7 +118,9 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
         PhysicalNetworkVO physnet = _physicalNetworkDao.findById(plan.getPhysicalNetworkId());
         DataCenter dc = _dcDao.findById(plan.getDataCenterId());
         if (!canHandle(offering, dc.getNetworkType(), physnet)) {
-            s_logger.debug("Refusing to design this network");
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug("Refusing to design network using network offering " +  offering.getId() + (physnet != null ? " on physical network " + physnet.getId() : ""));
+            }
             return null;
         }
 
@@ -129,66 +135,111 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
 
     @Override
     public Network implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapacityException {
+        long networkId = network.getId();
+        network = _networkDao.acquireInLockTable(network.getId(), 1200);
+        if (network == null) {
+            throw new ConcurrentOperationException("Unable to acquire lock on network " + networkId);
+        }
+
+        NetworkVO implemented = null;
+        try {
+            if (network.getState() != State.Implementing) {
+                throw new IllegalStateException("Network " + networkId + " is not in expected state Implementing, but is in state " + network.getState());
+            }
 
-        assert (network.getState() == State.Implementing) : "Why are we implementing " + network;
+            long dcId = dest.getDataCenter().getId();
+            //Get physical network id
+            Long physicalNetworkId = network.getPhysicalNetworkId();
+            //Physical network id can be null in Guest Network in Basic zone, so locate the physical network
+            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());
+            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();
+            String tenantId = context.getDomain().getName() + "-" + context.getAccount().getAccountId();
+            String broadcastUriStr = networkUuid + "/" + virtualRouterIp;
+            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));
 
-        long dcId = dest.getDataCenter().getId();
-        //Get physical network id
-        Long physicalNetworkId = network.getPhysicalNetworkId();
-        //Physical network id can be null in Guest Network in Basic zone, so locate the physical network
-        if (physicalNetworkId == null) {
-            physicalNetworkId = _networkModel.findPhysicalNetworkId(dcId, offering.getTags(), offering.getTrafficType());
-        }
-        NetworkVO implemented = new NetworkVO(network.getTrafficType(), network.getMode(), network.getBroadcastDomainType(), network.getNetworkOfferingId(), State.Allocated,
-                network.getDataCenterId(), physicalNetworkId, offering.getRedundantRouter());
-        if (network.getGateway() != null) {
-            implemented.setGateway(network.getGateway());
-        }
-        if (network.getCidr() != null) {
-            implemented.setCidr(network.getCidr());
-        }
-        Collection<String> ipAddressRange = new ArrayList<String>();
-        String virtualRouterIp = getVirtualRouterIP(network, ipAddressRange);
-        String networkUuid = implemented.getUuid();
-        String tenantId = context.getDomain().getName() + "-" + context.getAccount().getAccountId();
-        String broadcastUriStr = networkUuid + "/" + virtualRouterIp;
-        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 = "CS project support is not yet implemented in NuageVsp";
-            s_logger.debug(errorMessage);
-            throw new InsufficientVirtualNetworkCapacityException(errorMessage, Account.class, network.getAccountId());
-        }
-        boolean isL3Network = isL3Network(offering.getId());
-        String vpcName = null;
-        String vpcUuid = null;
-        if (isVpc) {
-            Vpc vpcObj = _vpcDao.findById(vpcId);
-            vpcName = vpcObj.getName();
-            vpcUuid = vpcObj.getUuid();
-        }
+            if (isVpc) {
+                Vpc vpcObj = _vpcDao.findById(vpcId);
+                vpcName = vpcObj.getName();
+                vpcUuid = vpcObj.getUuid();
+            }
 
-        HostVO nuageVspHost = getNuageVspHost(physicalNetworkId);
-        ImplementNetworkVspCommand cmd = new ImplementNetworkVspCommand(networksDomain.getName(), networksDomain.getPath(), networksDomain.getUuid(),
-                networksAccount.getAccountName(), networksAccount.getUuid(), network.getName(), network.getCidr(), network.getGateway(), network.getUuid(), isL3Network, vpcName,
-                vpcUuid, offering.getEgressDefaultPolicy(), ipAddressRange);
-        ImplementNetworkVspAnswer answer = (ImplementNetworkVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd);
+            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);
+                }
+            }
 
-        if (answer == null || !answer.getResult()) {
-            s_logger.error("ImplementNetworkNuageVspCommand failed");
-            if ((null != answer) && (null != answer.getDetails())) {
-                s_logger.error(answer.getDetails());
+            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());
+
+            if (answer == null || !answer.getResult()) {
+                s_logger.error("ImplementNetworkVspCommand for network " + network.getUuid() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname"));
+                if ((null != answer) && (null != answer.getDetails())) {
+                    s_logger.error(answer.getDetails());
+                }
+                return null;
             }
-            return null;
+            s_logger.info("Implemented OK, network " + networkUuid + " in tenant " + tenantId + " linked to " + implemented.getBroadcastUri());
+        } finally {
+            _networkDao.releaseFromLockTable(network.getId());
         }
-        s_logger.info("Implemented OK, network " + networkUuid + " in tenant " + tenantId + " linked to " + implemented.getBroadcastUri().toString());
         return implemented;
     }
 
@@ -201,97 +252,131 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
     @Override
     public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
             throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException {
-        nic.setBroadcastUri(network.getBroadcastUri());
-        nic.setIsolationUri(network.getBroadcastUri());
-
-        s_logger.debug("Handling reserve() call back to with Create a new VM or add an interface to existing VM in network " + network.getName());
-        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);
-        if (neworkAccountDetails.getType() == Account.ACCOUNT_TYPE_PROJECT) {
-            throw new InsufficientVirtualNetworkCapacityException("CS project support is " + "not yet implemented in NuageVsp", DataCenter.class, dc.getId());
+        boolean lockedNetwork = lockNetworkForUserVm(network, vm);
+        if (lockedNetwork && s_logger.isDebugEnabled()) {
+            s_logger.debug("Locked network " + network.getId() + " for creation of user VM " + vm.getInstanceName());
         }
 
-        //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());
-        long networkOfferingId = _ntwkOfferingDao.findById(network.getNetworkOfferingId()).getId();
-        boolean isL3Network = isL3Network(networkOfferingId);
-        Long vpcId = network.getVpcId();
-        String vpcUuid = null;
-        if (vpcId != null) {
-            Vpc vpcObj = _vpcDao.findById(vpcId);
-            vpcUuid = vpcObj.getUuid();
-        }
-        HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId());
-        ReserveVmInterfaceVspCommand cmd = new ReserveVmInterfaceVspCommand(nicFrmDB.getUuid(), nic.getMacAddress(), network.getUuid(), isL3Network, vpcUuid,
-                networksDomain.getUuid(), networksAccount.getUuid(), vm.getType().equals(VirtualMachine.Type.DomainRouter), network.getBroadcastUri().getPath().substring(1),
-                vm.getInstanceName(), vm.getUuid(), networksDomain.getUuid(), networksAccount.getUuid());
-        ReserveVmInterfaceVspAnswer answer = (ReserveVmInterfaceVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd);
-
-        if (answer == null || !answer.getResult()) {
-            s_logger.error("ReserveVmInterfaceNuageVspCommand failed");
-            if ((null != answer) && (null != answer.getDetails())) {
-                s_logger.error(answer.getDetails());
+        try {
+            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);
+            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("/")) {
+                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());
+            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());
+            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());
+            }
+
+            Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmdBuilder.build());
+            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());
+            }
+
+            if (isDomainRouter) {
+                nic.setIPv4Address(domainRouterIp);
+            }
+
+        } finally {
+            if (network != null && lockedNetwork) {
+                _networkDao.releaseFromLockTable(network.getId());
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Unlocked network " + network.getId() + " for creation of user VM " + vm.getInstanceName());
+                }
             }
-            throw new InsufficientVirtualNetworkCapacityException("Failed to reserve VM in Nuage VSP.", Network.class, network.getId());
         }
-        List<Map<String, String>> vmInterfacesDetails = answer.getInterfaceDetails();
-        setIPGatewayMaskInfo(network, nic, vmInterfacesDetails);
     }
 
     @Override
     protected boolean canHandle(NetworkOffering offering, final NetworkType networkType, final PhysicalNetwork physicalNetwork) {
-        if (networkType == NetworkType.Advanced && isMyTrafficType(offering.getTrafficType()) && offering.getGuestType() == Network.GuestType.Isolated
+        if (networkType == NetworkType.Advanced && isMyTrafficType(offering.getTrafficType()) && (offering.getGuestType() == Network.GuestType.Isolated || offering.getGuestType() == Network.GuestType.Shared)
                 && isMyIsolationMethod(physicalNetwork)) {
             return true;
         } else {
-            s_logger.trace("We only take care of Guest networks of type   " + GuestType.Isolated + " in zone of type " + NetworkType.Advanced);
-            return false;
-        }
-    }
-
-    @Override
-    public boolean release(NicProfile nic, VirtualMachineProfile vm, String reservationId) {
-        long networkId = nic.getNetworkId();
-        Network network = _networkDao.findById(networkId);
-        s_logger.debug("Handling release() call back, which is called when a VM is stopped or destroyed, to delete the VM with state " + vm.getVirtualMachine().getState()
-                + " from netork " + network.getName());
-        if (vm.getVirtualMachine().getState().equals(VirtualMachine.State.Stopping)) {
-            try {
-                HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId());
-                ReleaseVmVspCommand cmd = new ReleaseVmVspCommand(network.getUuid(), vm.getUuid(), vm.getInstanceName());
-                ReleaseVmVspAnswer answer = (ReleaseVmVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd);
-                if (answer == null || !answer.getResult()) {
-                    s_logger.error("ReleaseVmNuageVspCommand for VM " + vm.getUuid() + " failed");
-                    if ((null != answer) && (null != answer.getDetails())) {
-                        s_logger.error(answer.getDetails());
-                    }
-                }
-            } catch (InsufficientVirtualNetworkCapacityException e) {
-                s_logger.debug("Handling release() call back. Failed to delete CS VM " + vm.getInstanceName() + " in VSP. " + e.getMessage());
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("We only take care of Guest networks of type   " + GuestType.Isolated + " in zone of type " + NetworkType.Advanced);
             }
-        } else {
-            s_logger.debug("Handling release() call back. VM " + vm.getInstanceName() + " is in " + vm.getVirtualMachine().getState() + " state. So, the CS VM is not deleted."
-                    + " This could be a case where VM interface is deleted. deallocate() call back should be called later");
+            return false;
         }
-
-        return super.release(nic, vm, reservationId);
     }
 
     @Override
     @DB
     public void deallocate(Network network, NicProfile nic, VirtualMachineProfile vm) {
+        boolean lockedNetwork = lockNetworkForUserVm(network, vm);
+        if (lockedNetwork && s_logger.isDebugEnabled()) {
+            s_logger.debug("Locked network " + network.getId() + " for deallocation of user VM " + vm.getInstanceName());
+        }
 
         try {
-            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());
+            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());
+            }
             DomainVO networksDomain = _domainDao.findById(network.getDomainId());
             NicVO nicFrmDd = _nicDao.findById(nic.getId());
-            long networkOfferingId = _ntwkOfferingDao.findById(network.getNetworkOfferingId()).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) {
@@ -299,22 +384,49 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
                 vpcUuid = vpcObj.getUuid();
             }
             HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId());
-            DeallocateVmVspCommand cmd = new DeallocateVmVspCommand(network.getUuid(), nicFrmDd.getUuid(), nic.getMacAddress(), nic.getIPv4Address(),
-                    isL3Network(networkOfferingId), vpcUuid, networksDomain.getUuid(), vm.getInstanceName(), vm.getUuid());
-            DeallocateVmVspAnswer answer = (DeallocateVmVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd);
+            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());
             if (answer == null || !answer.getResult()) {
-                s_logger.error("DeallocateVmNuageVspCommand for VM " + vm.getUuid() + " failed");
+                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());
                 }
             }
-        } catch (InsufficientVirtualNetworkCapacityException e) {
-            s_logger.error("Handling deallocate(). VM " + vm.getInstanceName() + " with NIC IP " + nic.getIPv4Address()
-                    + " is getting destroyed. REST API failed to update the VM state in NuageVsp", e);
+        } finally {
+            if (network != null && lockedNetwork) {
+                _networkDao.releaseFromLockTable(network.getId());
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Unlocked network " + network.getId() + " for deallocation of user VM " + vm.getInstanceName());
+                }
+            }
         }
+
         super.deallocate(network, nic, vm);
     }
 
+    private boolean lockNetworkForUserVm(Network network, VirtualMachineProfile vm) {
+        if (!vm.getVirtualMachine().getType().isUsedBySystem()) {
+            long networkId = network.getId();
+            network = _networkDao.acquireInLockTable(network.getId(), 1200);
+            if (network == null) {
+                throw new ConcurrentOperationException("Unable to acquire lock on network " + networkId);
+            }
+            return true;
+        }
+        return false;
+    }
+
     @Override
     public void shutdown(NetworkProfile profile, NetworkOffering offering) {
         super.shutdown(profile, offering);
@@ -322,55 +434,82 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
 
     @Override
     public boolean trash(Network network, NetworkOffering offering) {
-
-        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);
-        Long vpcId = network.getVpcId();
-        String vpcUuid = null;
-        if (vpcId != null) {
-            Vpc vpcObj = _vpcDao.findById(vpcId);
-            vpcUuid = vpcObj.getUuid();
+        long networkId = network.getId();
+        network = _networkDao.acquireInLockTable(networkId, 1200);
+        if (network == null) {
+            throw new ConcurrentOperationException("Unable to acquire lock on network " + networkId);
         }
+
         try {
+            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);
             HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId());
-            TrashNetworkVspCommand cmd = new TrashNetworkVspCommand(domain.getUuid(), network.getUuid(), isL3Network(offering.getId()), vpcUuid);
-            TrashNetworkVspAnswer answer = (TrashNetworkVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd);
+            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());
             if (answer == null || !answer.getResult()) {
                 s_logger.error("TrashNetworkNuageVspCommand for network " + network.getUuid() + " failed");
                 if ((null != answer) && (null != answer.getDetails())) {
                     s_logger.error(answer.getDetails());
                 }
+                return false;
             }
-        } catch (Exception e) {
-            s_logger.warn("Failed to clean up network information in Vsp " + e.getMessage());
+        } finally {
+            _networkDao.releaseFromLockTable(network.getId());
         }
-
         return super.trash(network, offering);
     }
 
-    private String getVirtualRouterIP(Network network, Collection<String> addressRange) throws InsufficientVirtualNetworkCapacityException {
+    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) {
-                s_logger.debug("Gateway of the Network(" + network.getUuid() + ") has the first IP " + NetUtils.long2Ip(vip));
                 vip = ipIterator.next();
                 virtualRouterIp = NetUtils.long2Ip(vip);
-                s_logger.debug("So, reserving the 2nd IP " + virtualRouterIp + " for the Virtual Router IP in Network(" + network.getUuid() + ")");
+                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);
-                s_logger.debug("1nd IP is not used as the gateway IP. So, reserving" + virtualRouterIp + " for the Virtual Router IP for " + "Network(" + network.getUuid() + ")");
+                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() + ")");
+                }
             }
-            addressRange.add(NetUtils.long2Ip(ipIterator.next()));
-            addressRange.add(NetUtils.long2Ip((Long)allIPsInCidr.toArray()[allIPsInCidr.size() - 1]));
+            ipAddressRanges.add(new String[] {
+                NetUtils.long2Ip(ipIterator.next()),
+                NetUtils.getIpRangeEndIpFromCidr(subnet, cidrSize)
+            });
             return virtualRouterIp;
         }
 
@@ -378,30 +517,13 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
                 network.getId());
     }
 
-    private void setIPGatewayMaskInfo(Network network, NicProfile nic, List<Map<String, String>> vmInterfacesDetails) throws InsufficientVirtualNetworkCapacityException {
-        try {
-            for (Map<String, String> interfaces : vmInterfacesDetails) {
-                String macFromNuage = interfaces.get("mac");
-                if (StringUtils.equals(macFromNuage, nic.getMacAddress())) {
-                    nic.setIPv4Address(interfaces.get("ip4Address"));
-                    nic.setIPv4Gateway(interfaces.get("gateway"));
-                    nic.setIPv4Netmask(interfaces.get("netmask"));
-                    break;
-                }
-            }
-        } catch (Exception e) {
-            s_logger.error("Failed to parse the VM interface Json response from VSP REST API. VM interface json string is  " + vmInterfacesDetails, e);
-            throw new InsufficientVirtualNetworkCapacityException("Failed to parse the VM interface Json response from VSP REST API. VM interface Json " + "string is  "
-                    + vmInterfacesDetails + ". So. failed to get IP for the VM from VSP address for network " + network, Network.class, network.getId());
-        }
-    }
-
-    private boolean isL3Network(Long offeringId) {
-        return _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offeringId, Service.SourceNat)
-                || _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offeringId, Service.StaticNat);
+    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) throws InsufficientVirtualNetworkCapacityException {
+    private HostVO getNuageVspHost(long physicalNetworkId) {
         HostVO nuageVspHost;
         List<NuageVspDeviceVO> nuageVspDevices = _nuageVspDao.listByPhysicalNetwork(physicalNetworkId);
         if (nuageVspDevices != null && (!nuageVspDevices.isEmpty())) {
@@ -409,8 +531,8 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
             nuageVspHost = _hostDao.findById(config.getHostId());
             _hostDao.loadDetails(nuageVspHost);
         } else {
-            throw new InsufficientVirtualNetworkCapacityException("Nuage VSD is not configured on physical network ", PhysicalNetwork.class, physicalNetworkId);
+            throw new CloudRuntimeException("There is no Nuage VSP device configured on physical network " + physicalNetworkId);
         }
         return nuageVspHost;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/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 2b4d2b5..0aae22c 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
@@ -19,37 +19,66 @@
 
 package com.cloud.network.manager;
 
-import java.util.List;
-
-import org.apache.cloudstack.framework.config.ConfigKey;
-import org.apache.cloudstack.framework.config.ConfigKey.Scope;
-
 import com.cloud.api.commands.AddNuageVspDeviceCmd;
 import com.cloud.api.commands.DeleteNuageVspDeviceCmd;
 import com.cloud.api.commands.ListNuageVspDevicesCmd;
+import com.cloud.api.commands.UpdateNuageVspDeviceCmd;
 import com.cloud.api.response.NuageVspDeviceResponse;
+import com.cloud.network.Network;
 import com.cloud.network.NuageVspDeviceVO;
 import com.cloud.utils.component.PluggableService;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.ConfigKey.Scope;
+
+import java.util.List;
 
 public interface NuageVspManager extends PluggableService {
 
-    static final String NUAGE_VPC_OFFERING_NAME = "Default VPC offering with NuageVsp";
+    static final String nuageVspSharedNetworkOfferingWithSGServiceName = "DefaultNuageVspSharedNetworkOfferingWithSGService";
 
-    static final String NUAGE_VPC_OFFERING_DISPLAY_TEXT = "Default VPC offering with NuageVsp";
+    static final String nuageVPCOfferingName = "Nuage VSP VPC Offering";
 
-    static final ConfigKey<Integer> NuageVspSyncInterval = new ConfigKey<Integer>(Integer.class, "nuagevsp.sync.interval", "Advanced", "480",
-            "The interval (in minutes) to wait before running the next synchronization worker to synchronize the information between CloudStack and NuageVsp", false, Scope.Global,
-            1);
+    static final String nuageVPCOfferingDisplayText = "Nuage VSP VPC Offering";
 
-    static final ConfigKey<Integer> NuageVspSyncWorkers = new ConfigKey<Integer>(Integer.class, "nuagevsp.sync.workers", "Advanced", "1",
-            "Number of workers to synchronize the information between CloudStack and NuageVsp", false, Scope.Global, 1);
+    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);
+
+    static final ConfigKey<Boolean> NuageVspDnsExternal = new ConfigKey<Boolean>(
+            Boolean.class,
+            "nuagevsp.dns.external",
+            "Advanced",
+            "true",
+            "Defines if NuageVsp plugin needs to configure either internal or external DNS server configured during Zone provisioning. "
+                    + "Value true uses the external DNS and value false uses the internal DNS to configure in the VM. But, this flag depends on "
+                    + "nuagevsp.configure.dns. Only if nuagevsp.configure.dns is set to true, DNS server will be configured in the VM. "
+                    + "If nuagevsp.configure.dns is false, DNS server will not be configured in the VM. Default value for this flag is true",
+            true, Scope.Global, null);
+
+    static final ConfigKey<String> NuageVspConfigGateway = new ConfigKey<String>(String.class, "nuagevsp.configure.gateway.systemid", "Advanced", "",
+            "Defines the systemID of the gateway configured in VSP", true, Scope.Global, null);
+
+    static final ConfigKey<String> NuageVspSharedNetworkDomainTemplateName = new ConfigKey<String>(String.class, "nuagevsp.sharedntwk.domaintemplate.name",
+            "Advanced", "", "Defines if NuageVsp plugin needs to use pre created Domain Template configured in VSP for shared networks", true, Scope.Global, null);
+
+    static final ConfigKey<String> NuageVspVpcDomainTemplateName = new ConfigKey<String>(String.class, "nuagevsp.vpc.domaintemplate.name",
+            "Advanced", "", "Defines if NuageVsp plugin needs to use pre created Domain Template configured in VSP for VPCs", true, Scope.Global, null);
+
+    static final ConfigKey<String> NuageVspIsolatedNetworkDomainTemplateName = new ConfigKey<String>(String.class, "nuagevsp.isolatedntwk.domaintemplate.name",
+            "Advanced", "", "Defines if NuageVsp plugin needs to use pre created Domain Template configured in VSP for isolated networks", true, Scope.Global, null);
 
     NuageVspDeviceVO addNuageVspDevice(AddNuageVspDeviceCmd cmd);
 
+    NuageVspDeviceVO updateNuageVspDevice(UpdateNuageVspDeviceCmd cmd);
+
     NuageVspDeviceResponse createNuageVspDeviceResponse(NuageVspDeviceVO nuageVspDeviceVO);
 
     boolean deleteNuageVspDevice(DeleteNuageVspDeviceCmd cmd);
 
     List<NuageVspDeviceVO> listNuageVspDevices(ListNuageVspDevicesCmd cmd);
 
+    List<String> getDnsDetails(Network network);
+
+    List<String> getGatewaySystemIds();
+
 }


[3/7] git commit: updated refs/heads/master to 95ae796

Posted by re...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/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 fed970e..dc53310 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
@@ -19,45 +19,49 @@
 
 package com.cloud.network.manager;
 
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-
-import org.apache.cloudstack.framework.config.ConfigKey;
-import org.apache.cloudstack.framework.config.Configurable;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-import org.apache.cloudstack.network.ExternalNetworkDeviceManager;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
-
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.Listener;
+import com.cloud.agent.api.AgentControlAnswer;
+import com.cloud.agent.api.AgentControlCommand;
+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.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.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;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.domain.Domain;
+import com.cloud.domain.DomainVO;
+import com.cloud.domain.dao.DomainDao;
+import com.cloud.exception.ConnectionException;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.host.DetailVO;
 import com.cloud.host.Host;
 import com.cloud.host.HostVO;
+import com.cloud.host.Status;
 import com.cloud.host.dao.HostDao;
 import com.cloud.host.dao.HostDetailsDao;
 import com.cloud.network.Network;
+import com.cloud.network.NetworkModel;
 import com.cloud.network.Networks;
 import com.cloud.network.NuageVspDeviceVO;
 import com.cloud.network.PhysicalNetwork;
 import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
 import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.dao.NetworkVO;
 import com.cloud.network.dao.NuageVspDao;
@@ -67,25 +71,79 @@ 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;
+import com.cloud.network.vpc.VpcOfferingVO;
 import com.cloud.network.vpc.dao.VpcDao;
 import com.cloud.network.vpc.dao.VpcOfferingDao;
 import com.cloud.network.vpc.dao.VpcOfferingServiceMapDao;
+import com.cloud.network.vpc.dao.VpcServiceMapDao;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offerings.NetworkOfferingServiceMapVO;
+import com.cloud.offerings.NetworkOfferingVO;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
 import com.cloud.resource.ResourceManager;
 import com.cloud.resource.ResourceState;
-import com.cloud.resource.ServerResource;
+import com.cloud.user.AccountManager;
+import com.cloud.user.DomainManager;
 import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.fsm.StateListener;
+import com.cloud.utils.fsm.StateMachine2;
+import com.google.common.base.Joiner;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import net.nuage.vsp.acs.NuageVspPluginClientLoader;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.framework.config.impl.ConfigurationVO;
+import org.apache.cloudstack.framework.messagebus.MessageBus;
+import org.apache.cloudstack.framework.messagebus.MessageSubscriber;
+import org.apache.cloudstack.network.ExternalNetworkDeviceManager;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.log4j.Logger;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+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;
 
 @Local(value = {NuageVspManager.class})
-public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, Configurable {
+public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, Configurable, StateListener<Status, Status.Event, Host> {
 
     private static final Logger s_logger = Logger.getLogger(NuageVspManagerImpl.class);
 
     private static final int ONE_MINUTE_MULTIPLIER = 60 * 1000;
 
+    private static final Set<Network.Provider> NUAGE_VSP_PROVIDERS;
+    private 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 };
+
     @Inject
     ResourceManager _resourceMgr;
     @Inject
@@ -97,10 +155,6 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
     @Inject
     PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao;
     @Inject
-    ConfigurationDao _configDao;
-    @Inject
-    NuageVspDao _nuageVspDao;
-    @Inject
     NetworkDao _networkDao;
     @Inject
     VpcOfferingDao _vpcOffDao;
@@ -109,26 +163,59 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
     @Inject
     VpcDao _vpcDao;
     @Inject
-    NuageVspDao nuageVspDao;
+    VpcManager _vpcManager;
+    @Inject
+    NuageVspDao _nuageVspDao;
+    @Inject
+    NuageVspSync _nuageVspSync;
+    @Inject
+    DataCenterDao _dataCenterDao;
+    @Inject
+    ConfigurationDao _configDao;
+    @Inject
+    NetworkModel _ntwkModel;
+    @Inject
+    AccountManager _accountMgr;
+    @Inject
+    IPAddressDao _ipAddressDao;
+    @Inject
+    FirewallRulesDao _firewallDao;
+    @Inject
+    VpcServiceMapDao _vpcSrvcDao;
+    @Inject
+    AgentManager _agentMgr;
+    @Inject
+    private DomainDao _domainDao;
+    @Inject
+    NetworkOfferingDao _networkOfferingDao;
     @Inject
-    NuageVspSync nuageVspSync;
+    NetworkOfferingServiceMapDao _networkOfferingServiceMapDao;
 
     private ScheduledExecutorService scheduler;
 
+    @Inject
+    MessageBus _messageBus;
+
+    static {
+        NUAGE_VSP_PROVIDERS = ImmutableSet.of(Network.Provider.NuageVsp);
+        NUAGE_VSP_VPC_SERVICE_MAP = ImmutableMap.<Network.Service, Set<Network.Provider>>builder()
+                .put(Network.Service.Connectivity, NUAGE_VSP_PROVIDERS)
+                .put(Network.Service.Dhcp, NUAGE_VSP_PROVIDERS)
+                .put(Network.Service.StaticNat, NUAGE_VSP_PROVIDERS)
+                .put(Network.Service.SourceNat, NUAGE_VSP_PROVIDERS)
+                .put(Network.Service.NetworkACL, NUAGE_VSP_PROVIDERS)
+                .build();
+    }
+
     @Override
     public List<Class<?>> getCommands() {
-        List<Class<?>> cmdList = new ArrayList<Class<?>>();
-        cmdList.add(AddNuageVspDeviceCmd.class);
-        cmdList.add(DeleteNuageVspDeviceCmd.class);
-        cmdList.add(ListNuageVspDevicesCmd.class);
-        cmdList.add(IssueNuageVspResourceRequestCmd.class);
-
-        return cmdList;
+        return Lists.<Class<?>>newArrayList(AddNuageVspDeviceCmd.class, DeleteNuageVspDeviceCmd.class, ListNuageVspDevicesCmd.class,
+                IssueNuageVspResourceRequestCmd.class, UpdateNuageVspDeviceCmd.class);
     }
 
     @Override
     public NuageVspDeviceVO addNuageVspDevice(AddNuageVspDeviceCmd cmd) {
-        ServerResource resource = new NuageVspResource();
+        final NuageVspResource resource = new NuageVspResource();
         final String deviceName = Network.Provider.NuageVsp.getName();
         ExternalNetworkDeviceManager.NetworkDevice networkDevice = ExternalNetworkDeviceManager.NetworkDevice.getNetworkDevice(deviceName);
         final Long physicalNetworkId = cmd.getPhysicalNetworkId();
@@ -141,8 +228,8 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
         final PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(physicalNetwork.getId(),
                 networkDevice.getNetworkServiceProvder());
         if (ntwkSvcProvider == null) {
-            throw new CloudRuntimeException("Network Service Provider: " + networkDevice.getNetworkServiceProvder() + " is not added in the physical network: " + physicalNetworkId
-                    + "to add this device");
+            throw new CloudRuntimeException("Network Service Provider: " + networkDevice.getNetworkServiceProvder() + " is not enabled in the physical network: "
+                    + physicalNetworkId + "to add this device");
         } else if (ntwkSvcProvider.getState() == PhysicalNetworkServiceProvider.State.Shutdown) {
             throw new CloudRuntimeException("Network Service Provider: " + ntwkSvcProvider.getProviderName() + " is in shutdown state in the physical network: "
                     + physicalNetworkId + "to add this device");
@@ -152,53 +239,189 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
             throw new CloudRuntimeException("A NuageVsp device is already configured on this physical network");
         }
 
-        Map<String, String> params = new HashMap<String, String>();
-        params.put("guid", UUID.randomUUID().toString());
-        params.put("zoneId", String.valueOf(physicalNetwork.getDataCenterId()));
-        params.put("physicalNetworkId", String.valueOf(physicalNetwork.getId()));
-        params.put("name", "Nuage VSD - " + cmd.getHostName());
-        params.put("hostname", cmd.getHostName());
-        params.put("cmsuser", cmd.getUserName());
-        String cmsUserPasswordBase64 = org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64.encodeBase64(cmd.getPassword().getBytes(Charset.forName("UTF-8"))));
-        params.put("cmsuserpass", cmsUserPasswordBase64);
-        int port = cmd.getPort();
-        if (0 == port) {
-            port = 443;
-        }
-        params.put("port", String.valueOf(port));
-        params.put("apirelativepath", "/nuage/api/" + cmd.getApiVersion());
-        params.put("retrycount", String.valueOf(cmd.getApiRetryCount()));
-        params.put("retryinterval", String.valueOf(cmd.getApiRetryInterval()));
+        try {
+            NuageVspPluginClientLoader clientLoader = NuageVspPluginClientLoader.getClientLoader(null, null, 1, 1, null);
 
-        Map<String, Object> hostdetails = new HashMap<String, Object>();
-        hostdetails.putAll(params);
+            Map<String, Object> clientDefaults = clientLoader.getNuageVspManagerClient().getClientDefaults();
+            String apiVersion = MoreObjects.firstNonNull(cmd.getApiVersion(), (String) clientDefaults.get("CURRENT_API_VERSION"));
+            if (!clientLoader.getNuageVspManagerClient().isSupportedApiVersion(apiVersion)) {
+                throw new CloudRuntimeException("Unsupported API version : " + apiVersion);
+            }
 
-        try {
-            resource.configure(cmd.getHostName(), hostdetails);
+            int port = cmd.getPort();
+            if (0 == port) {
+                port = 8443;
+            }
+            String cmsUserPasswordBase64 = org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64.encodeBase64(cmd.getPassword().getBytes()));
+            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")));
+            NuageVspResource.Configuration resourceConfiguration = new NuageVspResource.Configuration()
+                    .name("Nuage VSD - " + cmd.getHostName())
+                    .guid(UUID.randomUUID().toString())
+                    .zoneId(String.valueOf(physicalNetwork.getDataCenterId()))
+                    .hostName(cmd.getHostName())
+                    .cmsUser(cmd.getUserName())
+                    .cmsUserPassword(cmsUserPasswordBase64)
+                    .port(String.valueOf(port))
+                    .apiVersion(apiVersion)
+                    .apiRelativePath("/nuage/api/" + apiVersion)
+                    .retryCount(retryCount)
+                    .retryInterval(retryInterval);
+
+            Map<String, String> hostDetails = resourceConfiguration.build();
+            resource.configure(cmd.getHostName(), Maps.<String, Object>newHashMap(hostDetails));
+            Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.L2Networking, hostDetails);
+            if (host == null) {
+                throw new CloudRuntimeException("Failed to add Nuage Vsp Device due to internal error.");
+            }
 
-            final Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.L2Networking, params);
-            if (host != null) {
-                return Transaction.execute(new TransactionCallback<NuageVspDeviceVO>() {
-                    @Override
-                    public NuageVspDeviceVO doInTransaction(TransactionStatus status) {
-                        NuageVspDeviceVO nuageVspDevice = new NuageVspDeviceVO(host.getId(), physicalNetworkId, ntwkSvcProvider.getProviderName(), deviceName);
-                        _nuageVspDao.persist(nuageVspDevice);
+            NuageVspDeviceVO nuageVspDevice = new NuageVspDeviceVO(host.getId(), physicalNetworkId, ntwkSvcProvider.getProviderName(), deviceName);
+            _nuageVspDao.persist(nuageVspDevice);
 
-                        DetailVO detail = new DetailVO(host.getId(), "nuagevspdeviceid", String.valueOf(nuageVspDevice.getId()));
-                        _hostDetailsDao.persist(detail);
+            DetailVO detail = new DetailVO(host.getId(), "nuagevspdeviceid", String.valueOf(nuageVspDevice.getId()));
+            _hostDetailsDao.persist(detail);
 
-                        return nuageVspDevice;
-                    }
-                });
+            ConfigurationVO cmsIdConfig = _configDao.findByName("nuagevsp.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());
+
+                detail = new DetailVO(host.getId(), "nuagevspcmsid", answer.getNuageVspCmsId());
+                _hostDetailsDao.persist(detail);
+
+                resourceConfiguration.nuageVspCmsId(answer.getNuageVspCmsId());
+                resource.configure(cmd.getHostName(), Maps.<String, Object>newHashMap(resourceConfiguration.build()));
+
+                auditDomainsOnVsp((HostVO) host, true, false);
             } else {
-                throw new CloudRuntimeException("Failed to add Nuage Vsp Device due to internal error.");
+                throw new CloudRuntimeException("Failed to register CMS ID");
             }
+            return nuageVspDevice;
         } catch (ConfigurationException e) {
-            throw new CloudRuntimeException(e.getMessage());
+            s_logger.error("Failed to configure Nuage VSD resource " + cmd.getHostName(), e);
+            throw new CloudRuntimeException("Failed to configure Nuage VSD resource " + cmd.getHostName(), e);
+        } catch (ExecutionException ee) {
+            s_logger.error("Failed to add Nuage VSP device " + cmd.getHostName(), ee);
+            throw new CloudRuntimeException("Failed to add Nuage VSP device " + cmd.getHostName(), ee);
         }
     }
 
     @Override
+    public NuageVspDeviceVO updateNuageVspDevice(UpdateNuageVspDeviceCmd command) {
+        NuageVspResource resource = new NuageVspResource();
+        final String deviceName = Network.Provider.NuageVsp.getName();
+        ExternalNetworkDeviceManager.NetworkDevice networkDevice = ExternalNetworkDeviceManager.NetworkDevice.getNetworkDevice(deviceName);
+        final Long physicalNetworkId = command.getPhysicalNetworkId();
+        PhysicalNetworkVO physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);
+        if (physicalNetwork == null) {
+            throw new InvalidParameterValueException("Could not find phyical network with ID: " + physicalNetworkId);
+        }
+
+        final PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(physicalNetwork.getId(),
+                networkDevice.getNetworkServiceProvder());
+        if (ntwkSvcProvider == null) {
+            throw new CloudRuntimeException("Network Service Provider: " + networkDevice.getNetworkServiceProvder() + " is not enabled in the physical network: "
+                    + physicalNetworkId + "to add this device");
+        }
+        if (ntwkSvcProvider.getState() == PhysicalNetworkServiceProvider.State.Shutdown) {
+            throw new CloudRuntimeException("Network Service Provider: " + ntwkSvcProvider.getProviderName() + " is in shutdown state in the physical network: "
+                    + physicalNetworkId + "to add this device");
+        }
+
+        HostVO nuageVspHost = null;
+        NuageVspDeviceVO nuageVspDevice = null;
+        List<NuageVspDeviceVO> nuageVspDevices = _nuageVspDao.listByPhysicalNetwork(physicalNetworkId);
+        if (nuageVspDevices == null || nuageVspDevices.isEmpty()) {
+            throw new CloudRuntimeException("Nuage VSD is not configured on physical network " + physicalNetworkId);
+        } else {
+            nuageVspDevice = nuageVspDevices.iterator().next();
+            nuageVspHost = _hostDao.findById(nuageVspDevice.getHostId());
+            _hostDao.loadDetails(nuageVspHost);
+        }
+
+        boolean updateRequired = false;
+        NuageVspResource.Configuration resourceConfiguration = NuageVspResource.Configuration.fromConfiguration(nuageVspHost.getDetails());
+        if (!Strings.isNullOrEmpty(command.getHostName()) &&
+                !command.getHostName().equals(resourceConfiguration.hostName())) {
+            resourceConfiguration.name("Nuage VSD - " + command.getHostName());
+            resourceConfiguration.hostName(command.getHostName());
+            updateRequired = true;
+        }
+
+        if (!Strings.isNullOrEmpty(command.getUserName()) &&
+                !command.getUserName().equals(resourceConfiguration.cmsUser())) {
+            resourceConfiguration.cmsUser(command.getUserName());
+            updateRequired = true;
+        }
+
+        if (!Strings.isNullOrEmpty(command.getPassword())) {
+            String encodedNewPassword = org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64.encodeBase64(command.getPassword().getBytes()));
+            if (!encodedNewPassword.equals(resourceConfiguration.cmsUserPassword())) {
+                resourceConfiguration.cmsUserPassword(encodedNewPassword);
+                updateRequired = true;
+            }
+        }
+
+        if (command.getPort() != null &&
+                command.getPort() != Integer.parseInt(resourceConfiguration.port())) {
+            resourceConfiguration.port(String.valueOf(command.getPort()));
+            updateRequired = true;
+        }
+
+        GetClientDefaultsCommand getClientDefaultsCmd = new GetClientDefaultsCommand();
+        GetClientDefaultsAnswer getClientDefaultsAnswer = (GetClientDefaultsAnswer) _agentMgr.easySend(nuageVspHost.getId(), getClientDefaultsCmd);
+        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());
+        }
+
+        String apiRelativePath = "/nuage/api/" + apiVersion;
+        if (!apiRelativePath.equals(resourceConfiguration.apiRelativePath())) {
+            resourceConfiguration.apiVersion(apiVersion);
+            resourceConfiguration.apiRelativePath(apiRelativePath);
+            updateRequired = true;
+        }
+
+        if (command.getApiRetryCount() != null && resourceConfiguration.retryCount() != null) {
+            final int retryCount = Integer.parseInt(resourceConfiguration.retryCount());
+            if (command.getApiRetryCount() != retryCount) {
+                resourceConfiguration.retryCount(String.valueOf(command.getApiRetryCount()));
+                updateRequired = true;
+            }
+        }
+
+        if (command.getApiRetryInterval() != null && resourceConfiguration.retryInterval() != null) {
+            final int apiRetryInterval = Integer.parseInt(resourceConfiguration.retryInterval());
+            if (command.getApiRetryInterval() != apiRetryInterval) {
+                resourceConfiguration.retryInterval(String.valueOf(command.getApiRetryInterval()));
+                updateRequired = true;
+            }
+        }
+
+        if (!updateRequired) {
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug("No change in the NuageVsp device parameters. None of the NuageVsp device parameters are modified");
+            }
+            return nuageVspDevice;
+        }
+
+        Map<String, String> config = resourceConfiguration.build();
+        String updateParameters = "{" + Joiner.on(", ").withKeyValueSeparator(": ").join(config) + "}";
+        Map<String, Object> hostDetails = Maps.<String, Object>newHashMap(config);
+        try {
+            resource.configure(resourceConfiguration.hostName(), hostDetails);
+            _hostDetailsDao.persist(nuageVspDevice.getHostId(), config);
+        } catch (ConfigurationException e) {
+            throw new CloudRuntimeException("Failed to update Nuage VSP device " + nuageVspDevice.getId() + " with parameters " + updateParameters, e);
+        }
+        return nuageVspDevice;
+    }
+
+    @Override
     public NuageVspDeviceResponse createNuageVspDeviceResponse(NuageVspDeviceVO nuageVspDeviceVO) {
         HostVO nuageVspHost = _hostDao.findById(nuageVspDeviceVO.getHostId());
         _hostDao.loadDetails(nuageVspHost);
@@ -234,7 +457,7 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
         PhysicalNetworkVO physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);
         if (physicalNetwork != null) {
             // Lets see if there are networks that use us
-            // Find the NuageVsp on this physical network
+            // Find the nuage networks on this physical network
             List<NetworkVO> networkList = _networkDao.listByPhysicalNetwork(physicalNetworkId);
 
             // Networks with broadcast type lswitch are ours
@@ -247,6 +470,26 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
             }
         }
 
+        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);
+            }
+            _configDao.update("nuagevsp.cms.id", newValue);
+        } else {
+            return false;
+        }
+
         HostVO nuageHost = _hostDao.findById(nuageVspDevice.getHostId());
         Long hostId = nuageHost.getId();
 
@@ -285,60 +528,331 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
         return responseList;
     }
 
-    @Override
-    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
-        try {
-            initNuageScheduledTasks();
-        } catch (Exception ce) {
-            s_logger.warn("Failed to load NuageVsp configuration properties. Check if the NuageVsp properties are configured correctly");
+    private void registerNewNuageVspDevice(ConfigurationVO currentConfig, String registeredNuageVspDevice) {
+        if (currentConfig == null) {
+            ConfigKey<String> configKey = new ConfigKey<String>("Advanced", String.class, "nuagevsp.cms.id", registeredNuageVspDevice,
+                    "<ACS Nuage VSP Device ID>:<Allocated VSD CMS ID> - Do not edit", false);
+            ConfigurationVO configuration = new ConfigurationVO("management-server", configKey);
+            _configDao.persist(configuration);
+        } else {
+            String newValue;
+            String currentValue = currentConfig.getValue();
+            if (!Strings.isNullOrEmpty(currentValue)) {
+                newValue = currentValue + ";" + registeredNuageVspDevice;
+            } else {
+                newValue = registeredNuageVspDevice;
+            }
+            _configDao.update("nuagevsp.cms.id", newValue);
         }
-        return true;
     }
 
-    private void initNuageScheduledTasks() {
-        Integer numOfSyncThreads = Integer.valueOf(_configDao.getValue(NuageVspManager.NuageVspSyncWorkers.key()));
-        Integer syncUpIntervalInMinutes = Integer.valueOf(_configDao.getValue(NuageVspManager.NuageVspSyncInterval.key()));
-
-        if (numOfSyncThreads != null && syncUpIntervalInMinutes != null) {
-            ThreadFactory threadFactory = new ThreadFactory() {
-                public Thread newThread(Runnable runnable) {
-                    Thread thread = new Thread(runnable, "Nuage Vsp sync task");
-                    if (thread.isDaemon())
-                        thread.setDaemon(false);
-                    if (thread.getPriority() != Thread.NORM_PRIORITY)
-                        thread.setPriority(Thread.NORM_PRIORITY);
-                    return thread;
+    private void auditHost(HostVO host) {
+        _hostDao.loadDetails(host);
+
+        boolean validateDomains = true;
+        List<NuageVspDeviceVO> nuageVspDevices = _nuageVspDao.listByHost(host.getId());
+        if (!CollectionUtils.isEmpty(nuageVspDevices)) {
+            for (NuageVspDeviceVO nuageVspDevice : nuageVspDevices) {
+                ConfigurationVO cmsIdConfig = _configDao.findByName("nuagevsp.cms.id");
+                String nuageVspCmsId = findNuageVspCmsIdForDevice(nuageVspDevice.getId(), cmsIdConfig);
+                SyncNuageVspCmsIdCommand syncCmd = new SyncNuageVspCmsIdCommand(SyncType.AUDIT, nuageVspCmsId);
+                SyncNuageVspCmsIdAnswer answer = (SyncNuageVspCmsIdAnswer) _agentMgr.easySend(nuageVspDevice.getHostId(), syncCmd);
+
+                if (answer != null && !answer.getSuccess()) {
+                    s_logger.error("Nuage VSP Device with ID " + nuageVspDevice.getId() + " is configured with an unknown CMS ID!");
+                    validateDomains = false;
+                } else if (answer != null && answer.getSyncType() == SyncType.REGISTER) {
+                    registerNewNuageVspDevice(cmsIdConfig, nuageVspDevice.getId() + ":" + answer.getNuageVspCmsId());
                 }
-            };
-            scheduler = Executors.newScheduledThreadPool(numOfSyncThreads, threadFactory);
-            scheduler.scheduleWithFixedDelay(new NuageVspSyncTask("FLOATING_IP"), ONE_MINUTE_MULTIPLIER * 15, ONE_MINUTE_MULTIPLIER * syncUpIntervalInMinutes,
-                    TimeUnit.MILLISECONDS);
-            scheduler.scheduleWithFixedDelay(new NuageVspSyncTask("ENTERPRISE_NTWK_MACRO"), ONE_MINUTE_MULTIPLIER * 15, ONE_MINUTE_MULTIPLIER * syncUpIntervalInMinutes,
-                    TimeUnit.MILLISECONDS);
-            scheduler
-                    .scheduleWithFixedDelay(new NuageVspSyncTask("ENTERPRISE"), ONE_MINUTE_MULTIPLIER * 15, ONE_MINUTE_MULTIPLIER * syncUpIntervalInMinutes, TimeUnit.MILLISECONDS);
-        } else {
-            s_logger.warn("NuageVsp configuration for syncWorkers=" + numOfSyncThreads + " syncInterval=" + syncUpIntervalInMinutes
-                    + " could not be read properly. So, check if the properties are configured properly in global properties");
+            }
+        }
+
+        if (validateDomains) {
+            auditDomainsOnVsp(host, true, false);
         }
     }
 
-    public class NuageVspSyncTask implements Runnable {
+    private boolean auditDomainsOnVsp(HostVO host, boolean add, boolean remove) {
+        List<NuageVspDeviceVO> nuageVspDevices = _nuageVspDao.listByHost(host.getId());
+        if (CollectionUtils.isEmpty(nuageVspDevices)) {
+            return true;
+        }
 
-        private String nuageVspEntity;
+        _hostDao.loadDetails(host);
+        List<DomainVO> allDomains = _domainDao.listAll();
+        for (DomainVO domain : allDomains) {
+            SyncDomainCommand cmd = new SyncDomainCommand(domain.getUuid(), domain.getName(), domain.getPath(), add, remove);
+            SyncDomainAnswer answer = (SyncDomainAnswer) _agentMgr.easySend(host.getId(), cmd);
+            return answer.getSuccess();
+        }
+        return true;
+    }
+
+    private String findNuageVspCmsIdForDevice(long deviceId, ConfigurationVO cmsIdConfig) {
+        String configValue = cmsIdConfig.getValue();
+        if (!Strings.isNullOrEmpty(configValue)) {
+            String[] configuredNuageVspDevices = configValue.split(";");
+            for (String configuredNuageVspDevice : configuredNuageVspDevices) {
+                if (configuredNuageVspDevice.startsWith(deviceId + ":")) {
+                    String[] split = configuredNuageVspDevice.split(":");
+                    if (split.length != 2 || (split.length > 1 && Strings.isNullOrEmpty(split[1]))) {
+                        throw new IllegalArgumentException("The configured CMS ID for Nuage VSP device " + deviceId + " is in an incorrect format");
+                    }
+                    return split[1];
+                }
+            }
+        }
+        return null;
+    }
+
+    public List<String> getDnsDetails(Network network) {
+        Boolean configureDns = Boolean.valueOf(_configDao.getValue(NuageVspManager.NuageVspConfigDns.key()));
+        if (!configureDns) {
+            return Lists.newArrayList();
+        }
 
-        public NuageVspSyncTask(String nuageVspEntity) {
-            this.nuageVspEntity = nuageVspEntity;
+        Boolean configureExternalDns = Boolean.valueOf(_configDao.getValue(NuageVspManager.NuageVspDnsExternal.key()));
+        DataCenterVO dc = _dataCenterDao.findById(network.getDataCenterId());
+        List<String> dnsServers = new ArrayList<String>();
+        if (configureExternalDns) {
+            if (!Strings.isNullOrEmpty(dc.getDns1())) {
+                dnsServers.add(dc.getDns1());
+            }
+            if (!Strings.isNullOrEmpty(dc.getDns2())) {
+                dnsServers.add(dc.getDns2());
+            }
+        } else {
+            if (!Strings.isNullOrEmpty(dc.getInternalDns1())) {
+                dnsServers.add(dc.getInternalDns1());
+            }
+            if (!Strings.isNullOrEmpty(dc.getInternalDns2())) {
+                dnsServers.add(dc.getInternalDns2());
+            }
         }
+        return dnsServers;
+    }
 
-        public String getNuageVspEntity() {
-            return nuageVspEntity;
+    public List<String> getGatewaySystemIds() {
+        String gatewaySystemIds = String.valueOf(_configDao.getValue(NuageVspManager.NuageVspConfigGateway.key()));
+        if (!Strings.isNullOrEmpty(gatewaySystemIds)) {
+            return Lists.newArrayList(gatewaySystemIds.split(","));
         }
+        return Lists.newArrayList();
+    }
 
-        @Override
-        public void run() {
-            nuageVspSync.syncWithNuageVsp(nuageVspEntity);
+    @Override
+    public boolean preStateTransitionEvent(Status oldState, Status.Event event, Status newState, Host host, boolean status, Object opaque) {
+        return true;
+    }
+
+    @Override
+    public boolean postStateTransitionEvent(StateMachine2.Transition<Status, Status.Event> transition, Host vo, boolean status, Object opaque) {
+        // Whenever a Nuage VSP Host comes up, check if all CS domains are present and check if the CMS ID is valid
+        if (transition.getToState() == Status.Up && vo instanceof HostVO) {
+            auditHost((HostVO) vo);
         }
+        return true;
+    }
+
+    @Override
+    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+        initMessageBusListeners();
+        initNuageVspResourceListeners();
+        initNuageNetworkOffering();
+        initNuageVspVpcOffering();
+        Status.getStateMachine().registerListener(this);
+        return true;
+    }
+
+    @DB
+    private void initMessageBusListeners() {
+        // Create corresponding enterprise and profile in VSP when creating a CS Domain
+        _messageBus.subscribe(DomainManager.MESSAGE_ADD_DOMAIN_EVENT, new MessageSubscriber() {
+            @Override
+            public void onPublishMessage(String senderAddress, String subject, Object args) {
+                Long domainId = (Long) args;
+                Domain domain = _domainDao.findById(domainId);
+
+                try {
+                    _domainDao.acquireInLockTable(domain.getId());
+
+                    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);
+                        _agentMgr.easySend(host.getId(), cmd);
+                    }
+                } finally {
+                    _domainDao.releaseFromLockTable(domain.getId());
+                }
+            }
+        });
+
+        // Delete corresponding enterprise and profile in VSP when deleting a CS Domain
+        _messageBus.subscribe(DomainManager.MESSAGE_REMOVE_DOMAIN_EVENT, new MessageSubscriber() {
+            @Override
+            public void onPublishMessage(String senderAddress, String subject, Object args) {
+                DomainVO domain = (DomainVO) args;
+                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);
+                    _agentMgr.easySend(host.getId(), cmd);
+                }
+            }
+        });
+    }
+
+    @DB
+    private void initNuageVspResourceListeners() {
+        _agentMgr.registerForHostEvents(new Listener() {
+            @Override
+            public boolean processAnswers(long agentId, long seq, Answer[] answers) {
+                return true;
+            }
+
+            @Override
+            public boolean processCommands(long agentId, long seq, Command[] commands) {
+                if (commands != null && commands.length == 1) {
+                    Command command = commands[0];
+                    if (command instanceof PingNuageVspCommand) {
+                        PingNuageVspCommand pingNuageVspCommand = (PingNuageVspCommand) command;
+                        if (pingNuageVspCommand.shouldAudit()) {
+                            Host host = _hostDao.findById(pingNuageVspCommand.getHostId());
+                            auditHost((HostVO) host);
+                        }
+                    }
+                }
+                return true;
+            }
+
+            @Override
+            public AgentControlAnswer processControlCommand(long agentId, AgentControlCommand cmd) {
+                return null;
+            }
+
+            @Override
+            public void processConnect(Host host, StartupCommand cmd, boolean forRebalance) throws ConnectionException {
+
+            }
+
+            @Override
+            public boolean processDisconnect(long agentId, Status state) {
+                return true;
+            }
+
+            @Override
+            public boolean isRecurring() {
+                return false;
+            }
+
+            @Override
+            public int getTimeout() {
+                return 0;
+            }
+
+            @Override
+            public boolean processTimeout(long agentId, long seq) {
+                return true;
+            }
+        }, false, true, false);
+    }
+
+    @DB
+    private void initNuageNetworkOffering() {
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                NetworkOffering sharedNetworkOfferingWithSG = _networkOfferingDao.findByUniqueName(nuageVspSharedNetworkOfferingWithSGServiceName);
+                if (sharedNetworkOfferingWithSG == null) {
+                    NetworkOfferingVO defaultNuageVspSharedSGNetworkOffering =
+                            new NetworkOfferingVO(nuageVspSharedNetworkOfferingWithSGServiceName, "Offering for NuageVsp Shared Security group enabled networks",
+                                    Networks.TrafficType.Guest, false, false, null, null, true, NetworkOffering.Availability.Optional, null, Network.GuestType.Shared, true, true, false, false, false);
+
+                    defaultNuageVspSharedSGNetworkOffering.setState(NetworkOffering.State.Enabled);
+                    defaultNuageVspSharedSGNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultNuageVspSharedSGNetworkOffering);
+
+                    Map<Network.Service, Network.Provider> defaultNuageVspSharedSGNetworkOfferingProviders = new HashMap<>();
+                    defaultNuageVspSharedSGNetworkOfferingProviders.put(Network.Service.Dhcp, Network.Provider.NuageVsp);
+                    defaultNuageVspSharedSGNetworkOfferingProviders.put(Network.Service.SecurityGroup, Network.Provider.NuageVsp);
+                    defaultNuageVspSharedSGNetworkOfferingProviders.put(Network.Service.Connectivity, Network.Provider.NuageVsp);
+
+                    for (Network.Service service : defaultNuageVspSharedSGNetworkOfferingProviders.keySet()) {
+                        NetworkOfferingServiceMapVO offService =
+                                new NetworkOfferingServiceMapVO(defaultNuageVspSharedSGNetworkOffering.getId(), service, defaultNuageVspSharedSGNetworkOfferingProviders.get(service));
+                        _networkOfferingServiceMapDao.persist(offService);
+                        if (s_logger.isTraceEnabled()) {
+                            s_logger.trace("Added service for the NuageVsp network offering: " + offService);
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+    @DB
+    private void initNuageVspVpcOffering() {
+        //configure default Nuage VSP vpc offering
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                if (_vpcOffDao.findByUniqueName(nuageVPCOfferingName) == null) {
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("Creating default Nuage VPC offering " + nuageVPCOfferingName);
+                    }
+
+                    Map<Network.Service, Set<Network.Provider>> svcProviderMap = Maps.newHashMap(NUAGE_VSP_VPC_SERVICE_MAP);
+                    Set<Network.Provider> userDataProviders = Collections.singleton(Network.Provider.VPCVirtualRouter);
+                    svcProviderMap.put(Network.Service.UserData, userDataProviders);
+
+                    createVpcOffering(nuageVPCOfferingName, nuageVPCOfferingDisplayText, svcProviderMap, true, VpcOffering.State.Enabled, null);
+                }
+            }
+        });
+    }
+
+    @DB
+    protected VpcOffering createVpcOffering(final String name, final String displayText, final Map<Network.Service, Set<Network.Provider>> svcProviderMap, final boolean isDefault,
+                                            final VpcOffering.State state, final Long serviceOfferingId) {
+        return Transaction.execute(new TransactionCallback<VpcOffering>() {
+            @Override
+            public VpcOffering doInTransaction(TransactionStatus status) {
+                // create vpc offering object
+                VpcOfferingVO offering = new VpcOfferingVO(name, displayText, isDefault, serviceOfferingId, false, false);
+
+                if (state != null) {
+                    offering.setState(state);
+                }
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Adding vpc offering " + offering);
+                }
+                offering = _vpcOffDao.persist(offering);
+                // populate services and providers
+                if (svcProviderMap != null) {
+                    for (Network.Service service : svcProviderMap.keySet()) {
+                        Set<Network.Provider> providers = svcProviderMap.get(service);
+                        if (providers != null && !providers.isEmpty()) {
+                            for (Network.Provider provider : providers) {
+                                VpcOfferingServiceMapVO offService = new VpcOfferingServiceMapVO(offering.getId(), service, provider);
+                                _vpcOffSvcMapDao.persist(offService);
+                                if (s_logger.isTraceEnabled()) {
+                                    s_logger.trace("Added service for the vpc offering: " + offService + " with provider " + provider.getName());
+                                }
+                            }
+                        } else {
+                            throw new InvalidParameterValueException("Provider is missing for the VPC offering service " + service.getName());
+                        }
+                    }
+                }
+                return offering;
+            }
+        });
+    }
+
+    private HostVO findNuageVspHost(long hostId) {
+        HostVO host = _hostDao.findById(hostId);
+        _hostDao.loadDetails(host);
+        return host;
     }
 
     @Override
@@ -348,6 +862,6 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
 
     @Override
     public ConfigKey<?>[] getConfigKeys() {
-        return new ConfigKey<?>[] {NuageVspSyncWorkers, NuageVspSyncInterval};
+        return Arrays.copyOf(NUAGE_VSP_CONFIG_KEYS, NUAGE_VSP_CONFIG_KEYS.length);
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/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 65c8ae9..c89ea15 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
@@ -19,131 +19,148 @@
 
 package com.cloud.network.resource;
 
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-import javax.naming.ConfigurationException;
-
-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.NuageVspSyncClient;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
-
 import com.cloud.agent.IAgentControl;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
 import com.cloud.agent.api.MaintainAnswer;
 import com.cloud.agent.api.MaintainCommand;
 import com.cloud.agent.api.PingCommand;
+import com.cloud.agent.api.PingNuageVspCommand;
 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.ApplyAclRuleVspAnswer;
 import com.cloud.agent.api.element.ApplyAclRuleVspCommand;
-import com.cloud.agent.api.element.ApplyStaticNatVspAnswer;
 import com.cloud.agent.api.element.ApplyStaticNatVspCommand;
-import com.cloud.agent.api.element.ShutDownVpcVspAnswer;
+import com.cloud.agent.api.element.ImplementVspCommand;
 import com.cloud.agent.api.element.ShutDownVpcVspCommand;
-import com.cloud.agent.api.guru.DeallocateVmVspAnswer;
 import com.cloud.agent.api.guru.DeallocateVmVspCommand;
-import com.cloud.agent.api.guru.ImplementNetworkVspAnswer;
 import com.cloud.agent.api.guru.ImplementNetworkVspCommand;
-import com.cloud.agent.api.guru.ReleaseVmVspAnswer;
-import com.cloud.agent.api.guru.ReleaseVmVspCommand;
-import com.cloud.agent.api.guru.ReserveVmInterfaceVspAnswer;
 import com.cloud.agent.api.guru.ReserveVmInterfaceVspCommand;
-import com.cloud.agent.api.guru.TrashNetworkVspAnswer;
 import com.cloud.agent.api.guru.TrashNetworkVspCommand;
-import com.cloud.agent.api.sync.SyncVspAnswer;
+import com.cloud.agent.api.manager.GetClientDefaultsAnswer;
+import com.cloud.agent.api.manager.GetClientDefaultsCommand;
+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.utils.StringUtils;
 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.codec.binary.Base64;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.log4j.Logger;
+
+import javax.naming.ConfigurationException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.regex.Pattern;
+
+import static com.cloud.agent.api.sync.SyncNuageVspCmsIdCommand.SyncType;
 
 public class NuageVspResource extends ManagerBase implements ServerResource {
     private static final Logger s_logger = Logger.getLogger(NuageVspResource.class);
 
+    private static final String NAME = "name";
+    private static final String GUID = "guid";
+    private static final String ZONE_ID = "zoneid";
+    private static final String HOST_NAME = "hostname";
+    private static final String CMS_USER = "cmsuser";
+    private static final String CMS_USER_PASSWORD = "cmsuserpass";
+    private static final String PORT = "port";
+    private static final String API_VERSION = "apiversion";
+    private static final String API_RELATIVE_PATH = "apirelativepath";
+    private static final String RETRY_COUNT = "retrycount";
+    private static final String RETRY_INTERVAL = "retryinterval";
+    private static final String NUAGE_VSP_CMS_ID = "nuagevspcmsid";
+
     private String _name;
     private String _guid;
     private String _zoneId;
     private String[] _cmsUserInfo;
+    private String _hostName;
     private String _relativePath;
     private int _numRetries;
     private int _retryInterval;
+    private String _nuageVspCmsId;
+    private boolean _shouldAudit = true;
 
     protected NuageVspApiClient _nuageVspApiClient;
     protected NuageVspGuruClient _nuageVspGuruClient;
     protected NuageVspElementClient _nuageVspElementClient;
     protected NuageVspSyncClient _nuageVspSyncClient;
+    protected NuageVspManagerClient _nuageVspManagerClient;
     protected boolean _isNuageVspClientLoaded;
 
     private static final String CMS_USER_ENTEPRISE_NAME = "CSP";
     private static final String NUAGE_VSP_PLUGIN_ERROR_MESSAGE = "Nuage Vsp plugin client is not installed";
-    private static final String NUAGE_PLUGIN_CLIENT_JAR_FILE = "/usr/share/nuagevsp/lib/nuage-vsp-acs-client.jar";
-    private static final String NUAGE_VSP_API_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspApiClientImpl";
-    private static final String NUAGE_VSP_SYNC_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspSyncClientImpl";
-    private static final String NUAGE_VSP_ELEMENT_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspElementClientImpl";
-    private static final String NUAGE_VSP_GURU_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspGuruClientImpl";
 
     @Override
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
 
-        _name = (String)params.get("name");
+        _name = (String)params.get(NAME);
         if (_name == null) {
             throw new ConfigurationException("Unable to find name");
         }
 
-        _guid = (String)params.get("guid");
+        _guid = (String)params.get(GUID);
         if (_guid == null) {
             throw new ConfigurationException("Unable to find the guid");
         }
 
-        _zoneId = (String)params.get("zoneId");
+        _zoneId = (String)params.get(ZONE_ID);
         if (_zoneId == null) {
             throw new ConfigurationException("Unable to find zone");
         }
 
-        String hostname = (String)params.get("hostname");
-        if (hostname == null) {
+        _hostName = (String)params.get(HOST_NAME);
+        if (Strings.isNullOrEmpty(_hostName)) {
             throw new ConfigurationException("Unable to find hostname");
         }
 
-        String cmsUser = (String)params.get("cmsuser");
-        if (cmsUser == null) {
+        String cmsUser = (String)params.get(CMS_USER);
+        if (Strings.isNullOrEmpty(cmsUser)) {
             throw new ConfigurationException("Unable to find CMS username");
         }
 
-        String cmsUserPassBase64 = (String)params.get("cmsuserpass");
-        if (cmsUserPassBase64 == null) {
+        String cmsUserPassBase64 = (String)params.get(CMS_USER_PASSWORD);
+        if (Strings.isNullOrEmpty(cmsUserPassBase64)) {
             throw new ConfigurationException("Unable to find CMS password");
         }
 
-        String port = (String)params.get("port");
-        if (port == null) {
+        String port = (String)params.get(PORT);
+        if (Strings.isNullOrEmpty(port)) {
             throw new ConfigurationException("Unable to find port");
         }
 
-        String apiRelativePath = (String)params.get("apirelativepath");
-        if ((apiRelativePath != null) && (!apiRelativePath.isEmpty())) {
-            String apiVersion = apiRelativePath.substring(apiRelativePath.lastIndexOf('/') + 1);
-            if (!Pattern.matches("v\\d+_\\d+", apiVersion)) {
-                throw new ConfigurationException("Incorrect API version");
-            }
-        } else {
+        String apiVersion = (String)params.get(API_VERSION);
+        if (Strings.isNullOrEmpty(apiVersion)) {
             throw new ConfigurationException("Unable to find API version");
+        } else if (!Pattern.matches("v\\d+_\\d+", apiVersion)) {
+            throw new ConfigurationException("Incorrect API version");
+        }
+
+        String apiRelativePath = (String)params.get(API_RELATIVE_PATH);
+        if (Strings.isNullOrEmpty(apiRelativePath) || !apiRelativePath.contains(apiVersion)) {
+            throw new ConfigurationException("Unable to find API version in relative path");
         }
 
-        String retryCount = (String)params.get("retrycount");
-        if ((retryCount != null) && (!retryCount.isEmpty())) {
+        String retryCount = (String)params.get(RETRY_COUNT);
+        if (!Strings.isNullOrEmpty(retryCount)) {
             try {
                 _numRetries = Integer.parseInt(retryCount);
             } catch (NumberFormatException ex) {
@@ -156,8 +173,8 @@ public class NuageVspResource extends ManagerBase implements ServerResource {
             throw new ConfigurationException("Unable to find number of retries");
         }
 
-        String retryInterval = (String)params.get("retryinterval");
-        if ((retryInterval != null) && (!retryInterval.isEmpty())) {
+        String retryInterval = (String)params.get(RETRY_INTERVAL);
+        if (!Strings.isNullOrEmpty(retryInterval)) {
             try {
                 _retryInterval = Integer.parseInt(retryInterval);
             } catch (NumberFormatException ex) {
@@ -170,57 +187,45 @@ public class NuageVspResource extends ManagerBase implements ServerResource {
             throw new ConfigurationException("Unable to find retry interval");
         }
 
-        _relativePath = new StringBuffer().append("https://").append(hostname).append(":").append(port).append(apiRelativePath).toString();
+        _relativePath = new StringBuffer().append("https://").append(_hostName).append(":").append(port).append(apiRelativePath).toString();
 
         String cmsUserPass = org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64.decodeBase64(cmsUserPassBase64));
         _cmsUserInfo = new String[] {CMS_USER_ENTEPRISE_NAME, cmsUser, cmsUserPass};
 
-        try {
-            loadNuageClient();
-        } catch (Exception e) {
-            throw new CloudRuntimeException("Failed to login to Nuage VSD on " + name + " as user " + cmsUser, e);
-        }
+        _nuageVspCmsId = (String)params.get(NUAGE_VSP_CMS_ID);
+
+        loadNuageClient();
 
         try {
             login();
-        } catch (Exception e) {
-            s_logger.error("Failed to login to Nuage VSD on " + name + " as user " + cmsUser + " Exception " + e.getMessage());
+        } 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);
         }
 
         return true;
     }
 
-    protected void login() throws Exception {
+    protected void login() throws ConfigurationException, ExecutionException {
         isNuageVspApiLoaded();
         _nuageVspApiClient.login();
     }
 
-    protected <A extends NuageVspApiClient, B extends NuageVspElementClient, C extends NuageVspSyncClient, D extends NuageVspGuruClient> void loadNuageClient() throws Exception {
+    protected <A extends NuageVspApiClient, B extends NuageVspElementClient, C extends NuageVspSyncClient, D extends NuageVspGuruClient> void loadNuageClient() {
 
         try {
-            ClassLoader loader = NuageVspPluginClientLoader.getClassLoader(NUAGE_PLUGIN_CLIENT_JAR_FILE);
-
-            Class<?> nuageVspApiClientClass = Class.forName(NUAGE_VSP_API_CLIENT_IMPL, true, loader);
-            Class<?> nuageVspSyncClientClass = Class.forName(NUAGE_VSP_SYNC_CLIENT_IMPL, true, loader);
-            Class<?> nuageVspGuruClientClass = Class.forName(NUAGE_VSP_GURU_CLIENT_IMPL, true, loader);
-            Class<?> nuageVspElementClientClass = Class.forName(NUAGE_VSP_ELEMENT_CLIENT_IMPL, true, loader);
-
-            //Instantiate the instances
-            _nuageVspApiClient = (NuageVspApiClient)nuageVspApiClientClass.newInstance();
-            _nuageVspApiClient.setNuageVspHost(_relativePath, _cmsUserInfo, _numRetries, _retryInterval);
-            _nuageVspSyncClient = (NuageVspSyncClient)nuageVspSyncClientClass.newInstance();
-            _nuageVspSyncClient.setNuageVspApiClient(_nuageVspApiClient);
-            _nuageVspGuruClient = (NuageVspGuruClient)nuageVspGuruClientClass.newInstance();
-            _nuageVspGuruClient.setNuageVspApiClient(_nuageVspApiClient);
-            _nuageVspElementClient = (NuageVspElementClient)nuageVspElementClientClass.newInstance();
-            _nuageVspElementClient.setNuageVspApiClient(_nuageVspApiClient);
+            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 (Exception e) {
+        } 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.warn(errorMessage + e.getMessage());
-            throw new Exception(errorMessage);
+            s_logger.error(errorMessage, e);
+            throw new CloudRuntimeException(errorMessage, e);
         }
 
     }
@@ -260,17 +265,26 @@ public class NuageVspResource extends ManagerBase implements ServerResource {
 
     @Override
     public PingCommand getCurrentStatus(long id) {
-        if ((_relativePath == null) || (_relativePath.isEmpty()) || (_cmsUserInfo == null) || (_cmsUserInfo.length == 0)) {
-            s_logger.error("Failed to ping to Nuage VSD");
+        if (_relativePath == null || _relativePath.isEmpty()) {
+            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) {
+            s_logger.error("Refusing to ping Nuage VSD because the resource configuration is missing the CMS user information");
+            _shouldAudit = true;
             return null;
         }
         try {
             login();
-        } catch (Exception e) {
-            s_logger.error("Failed to ping to Nuage VSD on " + _name + " as user " + _cmsUserInfo[1] + " Exception " + e.getMessage());
+        } catch (ExecutionException | ConfigurationException e) {
+            s_logger.error("Failed to ping to Nuage VSD on " + _name + " as user " + _cmsUserInfo[1], e);
+            _shouldAudit = true;
             return null;
         }
-        return new PingCommand(Host.Type.L2Networking, id);
+        PingNuageVspCommand pingNuageVspCommand = new PingNuageVspCommand(Host.Type.L2Networking, id, _shouldAudit);
+        _shouldAudit = false;
+        return pingNuageVspCommand;
     }
 
     @Override
@@ -287,15 +301,15 @@ public class NuageVspResource extends ManagerBase implements ServerResource {
             return executeRequest((ImplementNetworkVspCommand)cmd);
         } else if (cmd instanceof ReserveVmInterfaceVspCommand) {
             return executeRequest((ReserveVmInterfaceVspCommand)cmd);
-        } else if (cmd instanceof ReleaseVmVspCommand) {
-            return executeRequest((ReleaseVmVspCommand)cmd);
         } else if (cmd instanceof DeallocateVmVspCommand) {
             return executeRequest((DeallocateVmVspCommand)cmd);
         } else if (cmd instanceof TrashNetworkVspCommand) {
             return executeRequest((TrashNetworkVspCommand)cmd);
         }
         //Element commands
-        else if (cmd instanceof ApplyAclRuleVspCommand) {
+        else if (cmd instanceof ImplementVspCommand) {
+            return executeRequest((ImplementVspCommand)cmd);
+        } else if (cmd instanceof ApplyAclRuleVspCommand) {
             return executeRequest((ApplyAclRuleVspCommand)cmd);
         } else if (cmd instanceof ApplyStaticNatVspCommand) {
             return executeRequest((ApplyStaticNatVspCommand)cmd);
@@ -305,8 +319,20 @@ public class NuageVspResource extends ManagerBase implements ServerResource {
         //Sync Commands
         else if (cmd instanceof SyncVspCommand) {
             return executeRequest((SyncVspCommand)cmd);
+        } 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 SupportedApiVersionCommand) {
+            return executeRequest((SupportedApiVersionCommand)cmd);
+        }
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("Received unsupported command " + cmd.toString());
         }
-        s_logger.debug("Received unsupported command " + cmd.toString());
         return Answer.createUnsupportedCommandAnswer(cmd);
     }
 
@@ -340,7 +366,8 @@ public class NuageVspResource extends ManagerBase implements ServerResource {
                 return new VspResourceAnswer(cmd, resourceInfo, "Executed Issue Resource command");
             }
             return new VspResourceAnswer(cmd, false, cmd.getRequestType() + " is not yet supported");
-        } catch (Exception e) {
+        } catch (ExecutionException | ConfigurationException e) {
+            s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e);
             return new VspResourceAnswer(cmd, e);
         }
     }
@@ -349,85 +376,98 @@ public class NuageVspResource extends ManagerBase implements ServerResource {
         try {
             isNuageVspGuruLoaded();
             _nuageVspGuruClient.implement(cmd.getNetworkDomainName(), cmd.getNetworkDomainPath(), cmd.getNetworkDomainUuid(), cmd.getNetworkAccountName(),
-                    cmd.getNetworkAccountUuid(), cmd.getNetworkName(), cmd.getNetworkCidr(), cmd.getNetworkGateway(), cmd.getNetworkUuid(), cmd.isL3Network(), cmd.getVpcName(),
-                    cmd.getVpcUuid(), cmd.isDefaultEgressPolicy(), cmd.getIpAddressRange());
-            return new ImplementNetworkVspAnswer(cmd, true, "Created Nuage VSP network mapping to " + cmd.getNetworkName());
-        } catch (Exception e) {
-            return new ImplementNetworkVspAnswer(cmd, e);
+                    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);
+        } catch (ExecutionException | ConfigurationException e) {
+            s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e);
+            return new Answer(cmd, e);
         }
     }
 
     private Answer executeRequest(ReserveVmInterfaceVspCommand cmd) {
         try {
             isNuageVspGuruLoaded();
-            List<Map<String, String>> vmInterfaceInfo = _nuageVspGuruClient.reserve(cmd.getNicUuid(), cmd.getNicMacAddress(), cmd.getNetworkUuid(), cmd.isL3Network(),
-                    cmd.getVpcUuid(), cmd.getNetworkDomainUuid(), cmd.getNetworksAccountUuid(), cmd.isDomainRouter(), cmd._getDomainRouterIp(), cmd._getVmInstanceName(),
-                    cmd._getVmUuid());
-            return new ReserveVmInterfaceVspAnswer(cmd, vmInterfaceInfo, "Created NIC in VSP that maps to nicUuid" + cmd.getNicUuid());
-        } catch (Exception e) {
-            return new ReserveVmInterfaceVspAnswer(cmd, e);
+            _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);
+        } catch (ExecutionException | ConfigurationException e) {
+            s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e);
+            return new Answer(cmd, e);
         }
     }
 
-    private Answer executeRequest(ReleaseVmVspCommand cmd) {
+    private Answer executeRequest(DeallocateVmVspCommand cmd) {
         try {
             isNuageVspGuruLoaded();
-            _nuageVspGuruClient.release(cmd.getNetworkUuid(), cmd.getVmUuid(), cmd.getVmInstanceName());
-            return new ReleaseVmVspAnswer(cmd, true, "VM has been deleted from VSP.");
-        } catch (Exception e) {
-            return new ReleaseVmVspAnswer(cmd, e);
+            _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);
+        } catch (ExecutionException | ConfigurationException e) {
+            s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e);
+            return new Answer(cmd, e);
         }
     }
 
-    private Answer executeRequest(DeallocateVmVspCommand cmd) {
+    private Answer executeRequest(TrashNetworkVspCommand cmd) {
         try {
             isNuageVspGuruLoaded();
-            _nuageVspGuruClient.deallocate(cmd.getNetworkUuid(), cmd.getNicFrmDdUuid(), cmd.getNicMacAddress(), cmd.getNicIp4Address(), cmd.isL3Network(), cmd.getVpcUuid(),
-                    cmd.getNetworksDomainUuid(), cmd.getVmInstanceName(), cmd.getVmUuid());
-            return new DeallocateVmVspAnswer(cmd, true, "Deallocated VM from Nuage VSP.");
-        } catch (Exception e) {
-            return new DeallocateVmVspAnswer(cmd, e);
+            _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);
+        } catch (ExecutionException | ConfigurationException e) {
+            s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e);
+            return new Answer(cmd, e);
         }
     }
 
-    private Answer executeRequest(TrashNetworkVspCommand cmd) {
+    private Answer executeRequest(ApplyStaticNatVspCommand cmd) {
         try {
-            isNuageVspGuruLoaded();
-            _nuageVspGuruClient.trash(cmd.getDomainUuid(), cmd.getNetworkUuid(), cmd.isL3Network(), cmd.getVpcUuid());
-            return new TrashNetworkVspAnswer(cmd, true, "Deleted Nuage VSP network mapping to " + cmd.getNetworkUuid());
-        } catch (Exception e) {
-            return new TrashNetworkVspAnswer(cmd, e);
+            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);
+        } catch (ExecutionException | ConfigurationException e) {
+            s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e);
+            return new Answer(cmd, e);
         }
     }
 
-    private Answer executeRequest(ApplyStaticNatVspCommand cmd) {
+    private Answer executeRequest(ImplementVspCommand cmd) {
         try {
             isNuageVspElementLoaded();
-            _nuageVspElementClient.applyStaticNats(cmd.getNetworkDomainUuid(), cmd.getVpcOrSubnetUuid(), cmd.isL3Network(), cmd.getStaticNatDetails());
-            return new ApplyStaticNatVspAnswer(cmd, true, "Applied Static NAT to VSP network mapping to " + cmd.getVpcOrSubnetUuid());
-        } catch (Exception e) {
-            return new ApplyStaticNatVspAnswer(cmd, e);
+            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);
+        } catch (ExecutionException | ConfigurationException e) {
+            s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e);
+            return new Answer(cmd, e);
         }
     }
 
     private Answer executeRequest(ApplyAclRuleVspCommand cmd) {
         try {
             isNuageVspElementLoaded();
-            _nuageVspElementClient.applyAclRules(cmd.getNetworkUuid(), cmd.getNetworkDomainUuid(), cmd.getVpcOrSubnetUuid(), cmd.isL3Network(), cmd.getAclRules(), cmd.isVpc(),
-                    cmd.getNetworkId());
-            return new ApplyAclRuleVspAnswer(cmd, true, "Applied ACL Rule to VSP network mapping to " + cmd.getVpcOrSubnetUuid());
-        } catch (Exception e) {
-            return new ApplyAclRuleVspAnswer(cmd, e);
+            _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);
+        } catch (ExecutionException | ConfigurationException e) {
+            s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e);
+            return new Answer(cmd, e);
         }
     }
 
     private Answer executeRequest(ShutDownVpcVspCommand cmd) {
         try {
             isNuageVspElementLoaded();
-            _nuageVspElementClient.shutDownVpc(cmd.getDomainUuid(), cmd.getVpcUuid());
-            return new ShutDownVpcVspAnswer(cmd, true, "Shutdown VPC " + cmd.getVpcUuid());
-        } catch (Exception e) {
-            return new ShutDownVpcVspAnswer(cmd, e);
+            _nuageVspElementClient.shutdownVpc(cmd.getDomainUuid(), cmd.getVpcUuid(), cmd.getDomainTemplateName());
+            return new Answer(cmd, true, "Shutdown VPC " + cmd.getVpcUuid() + " on Nuage VSD " + _hostName);
+        } catch (ExecutionException | ConfigurationException e) {
+            s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e);
+            return new Answer(cmd, e);
         }
     }
 
@@ -435,33 +475,248 @@ public class NuageVspResource extends ManagerBase implements ServerResource {
         try {
             isNuageVspSyncLoaded();
             _nuageVspSyncClient.syncWithNuageVsp(cmd.getNuageVspEntity());
-            return new SyncVspAnswer(cmd, true, "Synced " + cmd.getNuageVspEntity() + " in VSP");
-        } catch (Exception e) {
-            return new SyncVspAnswer(cmd, e);
+            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();
+            if (cmd.getSyncType() == SyncType.AUDIT || cmd.getSyncType() == SyncType.AUDIT_ONLY) {
+                Pair<Boolean, String> answer = _nuageVspManagerClient.auditNuageVspCmsId(cmd.getNuageVspCmsId(), cmd.getSyncType() == SyncType.AUDIT_ONLY);
+                return new SyncNuageVspCmsIdAnswer(answer.getLeft(), answer.getRight(), cmd.getSyncType());
+            } else if (cmd.getSyncType() == SyncType.REGISTER) {
+                String registeredNuageVspCmsId = _nuageVspManagerClient.registerNuageVspCmsId();
+                return new SyncNuageVspCmsIdAnswer(StringUtils.isNotBlank(registeredNuageVspCmsId), registeredNuageVspCmsId, cmd.getSyncType());
+            } else {
+                boolean success = _nuageVspManagerClient.unregisterNuageVspCmsId(cmd.getNuageVspCmsId());
+                return new SyncNuageVspCmsIdAnswer(success, cmd.getNuageVspCmsId(), cmd.getSyncType());
+            }
+        } catch (ExecutionException | ConfigurationException e) {
+            s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e);
+            return new SyncNuageVspCmsIdAnswer(false, null, cmd.getSyncType());
         }
     }
 
-    protected void isNuageVspApiLoaded() throws Exception {
+    private Answer executeRequest(SyncDomainCommand cmd) {
+        try {
+            isNuageVspManagerLoaded();
+            boolean success = _nuageVspManagerClient.syncDomainWithNuageVsp(cmd.getDomainUuid(), cmd.getDomainName(), cmd.getDomainPath(), cmd.isToAdd(), cmd.isToRemove());
+            return new SyncDomainAnswer(success);
+        } catch (ExecutionException | ConfigurationException e) {
+            s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e);
+            return new SyncDomainAnswer(false);
+        }
+    }
+
+    private Answer executeRequest(GetClientDefaultsCommand cmd) {
+        try {
+            isNuageVspManagerLoaded();
+            Map<String, Object> clientDefaults = _nuageVspManagerClient.getClientDefaults();
+            return new GetClientDefaultsAnswer(cmd, clientDefaults);
+        } catch (ExecutionException | ConfigurationException e) {
+            s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e);
+            return new GetClientDefaultsAnswer(cmd, e);
+        }
+    }
+
+    private Answer executeRequest(SupportedApiVersionCommand cmd) {
+        try {
+            isNuageVspManagerLoaded();
+            boolean supported = _nuageVspManagerClient.isSupportedApiVersion(cmd.getApiVersion());
+            return new Answer(cmd, supported, "Check if API version " + cmd.getApiVersion() + " is supported");
+        } catch (ConfigurationException e) {
+            s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e);
+            return new Answer(cmd, e);
+        }
+    }
+
+    protected void isNuageVspApiLoaded() throws ConfigurationException {
         if (!_isNuageVspClientLoaded || _nuageVspApiClient == null) {
-            throw new Exception(NUAGE_VSP_PLUGIN_ERROR_MESSAGE);
+            throw new ConfigurationException(NUAGE_VSP_PLUGIN_ERROR_MESSAGE);
         }
     }
 
-    protected void isNuageVspGuruLoaded() throws Exception {
+    protected void isNuageVspGuruLoaded() throws ConfigurationException {
         if (!_isNuageVspClientLoaded || _nuageVspGuruClient == null) {
-            throw new Exception(NUAGE_VSP_PLUGIN_ERROR_MESSAGE);
+            throw new ConfigurationException(NUAGE_VSP_PLUGIN_ERROR_MESSAGE);
         }
     }
 
-    protected void isNuageVspElementLoaded() throws Exception {
+    protected void isNuageVspElementLoaded() throws ConfigurationException {
         if (!_isNuageVspClientLoaded || _nuageVspElementClient == null) {
-            throw new Exception(NUAGE_VSP_PLUGIN_ERROR_MESSAGE);
+            throw new ConfigurationException(NUAGE_VSP_PLUGIN_ERROR_MESSAGE);
         }
     }
 
-    protected void isNuageVspSyncLoaded() throws Exception {
+    protected void isNuageVspSyncLoaded() throws ConfigurationException {
         if (!_isNuageVspClientLoaded || _nuageVspSyncClient == null) {
-            throw new Exception(NUAGE_VSP_PLUGIN_ERROR_MESSAGE);
+            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);
+        }
+    }
+
+    public static class Configuration {
+        private String _name;
+        private String _guid;
+        private String _zoneId;
+        private String _hostName;
+        private String _cmsUser;
+        private String _cmsUserPassword;
+        private String _port;
+        private String _apiVersion;
+        private String _apiRelativePath;
+        private String _retryCount;
+        private String _retryInterval;
+        private String _nuageVspCmsId;
+
+        public String name() {
+            return this._name;
+        }
+
+        public Configuration name(String name) {
+            this._name = name;
+            return this;
+        }
+
+        public String guid() {
+            return this._guid;
+        }
+
+        public Configuration guid(String guid) {
+            this._guid = guid;
+            return this;
+        }
+
+        public String zoneId() {
+            return this._zoneId;
+        }
+
+        public Configuration zoneId(String zoneId) {
+            this._zoneId = zoneId;
+            return this;
+        }
+
+        public String hostName() {
+            return this._hostName;
+        }
+
+        public Configuration hostName(String hostName) {
+            this._hostName = hostName;
+            return this;
+        }
+
+        public String cmsUser() {
+            return this._cmsUser;
+        }
+
+        public Configuration cmsUser(String cmsUser) {
+            this._cmsUser = cmsUser;
+            return this;
+        }
+
+        public String cmsUserPassword() {
+            return this._cmsUserPassword;
+        }
+
+        public Configuration cmsUserPassword(String cmsUserPassword) {
+            this._cmsUserPassword = cmsUserPassword;
+            return this;
+        }
+
+        public String port() {
+            return this._port;
+        }
+
+        public Configuration port(String port) {
+            this._port = port;
+            return this;
+        }
+
+        public String apiVersion() {
+            return this._apiVersion;
+        }
+
+        public Configuration apiVersion(String apiVersion) {
+            this._apiVersion = apiVersion;
+            return this;
+        }
+
+        public String apiRelativePath() {
+            return this._apiRelativePath;
+        }
+
+        public Configuration apiRelativePath(String apiRelativePath) {
+            this._apiRelativePath = apiRelativePath;
+            return this;
+        }
+
+        public String retryCount() {
+            return this._retryCount;
+        }
+
+        public Configuration retryCount(String retryCount) {
+            this._retryCount = retryCount;
+            return this;
+        }
+
+        public String retryInterval() {
+            return this._retryInterval;
+        }
+
+        public Configuration retryInterval(String retryInterval) {
+            this._retryInterval = retryInterval;
+            return this;
+        }
+
+        public String nuageVspCmsId() {
+            return this._nuageVspCmsId;
+        }
+
+        public Configuration nuageVspCmsId(String nuageVspCmsId) {
+            this._nuageVspCmsId = nuageVspCmsId;
+            return this;
+        }
+
+        public Map<String, String> build() {
+            return new HashMap<String, String>() {{
+                if (_name != null) put(NAME, _name);
+                if (_guid != null) put(GUID, _guid);
+                if (_zoneId != null) put(ZONE_ID, _zoneId);
+                if (_hostName != null) put(HOST_NAME, _hostName);
+                if (_cmsUser != null) put(CMS_USER, _cmsUser);
+                if (_cmsUserPassword != null) put(CMS_USER_PASSWORD, _cmsUserPassword);
+                if (_port != null) put(PORT, _port);
+                if (_apiVersion != null) put(API_VERSION, _apiVersion);
+                if (_apiRelativePath != null) put(API_RELATIVE_PATH, _apiRelativePath);
+                if (_retryCount != null) put(RETRY_COUNT, _retryCount);
+                if (_retryInterval != null) put(RETRY_INTERVAL, _retryInterval);
+                if (_nuageVspCmsId != null) put(NUAGE_VSP_CMS_ID, _nuageVspCmsId);
+            }};
+        }
+
+        public static Configuration fromConfiguration(Map<String, String> configuration) {
+            return new Configuration()
+                    .name(configuration.get(NAME))
+                    .guid(configuration.get(GUID))
+                    .zoneId(configuration.get(ZONE_ID))
+                    .hostName(configuration.get(HOST_NAME))
+                    .cmsUser(configuration.get(CMS_USER))
+                    .cmsUserPassword(configuration.get(CMS_USER_PASSWORD))
+                    .port(configuration.get(PORT))
+                    .apiVersion(configuration.get(API_VERSION))
+                    .apiRelativePath(configuration.get(API_RELATIVE_PATH))
+                    .retryCount(configuration.get(RETRY_COUNT))
+                    .retryInterval(configuration.get(RETRY_INTERVAL))
+                    .nuageVspCmsId(configuration.get(NUAGE_VSP_CMS_ID));
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/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
index f3d19c1..9180c17 100644
--- 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
@@ -19,20 +19,18 @@
 
 package com.cloud.network.sync;
 
-import java.util.List;
-
-import javax.inject.Inject;
-
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
 import com.cloud.agent.AgentManager;
-import com.cloud.agent.api.sync.SyncVspAnswer;
+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 {
@@ -52,20 +50,15 @@ public class NuageVspSyncImpl implements NuageVspSync {
         //entities
         List<NuageVspDeviceVO> nuageVspDevices = _nuageVspDao.listAll();
         for (NuageVspDeviceVO nuageVspDevice : nuageVspDevices) {
-
-            try {
-                HostVO nuageVspHost = _hostDao.findById(nuageVspDevice.getHostId());
-                _hostDao.loadDetails(nuageVspHost);
-                SyncVspCommand cmd = new SyncVspCommand(nuageVspEntity);
-                SyncVspAnswer answer = (SyncVspAnswer)_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());
-                    }
+            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());
                 }
-            } catch (Exception e) {
-                s_logger.warn("Failed to clean up " + nuageVspEntity + " in Vsp " + e.getMessage());
             }
         }
     }


[2/7] git commit: updated refs/heads/master to 95ae796

Posted by re...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/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
new file mode 100644
index 0000000..143a741
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspUtil.java
@@ -0,0 +1,40 @@
+//
+// 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.network.Network;
+import com.cloud.network.manager.NuageVspManager;
+import com.cloud.offering.NetworkOffering;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+
+public class NuageVspUtil {
+
+    public static String getPreConfiguredDomainTemplateName(ConfigurationDao configDao, Network network, NetworkOffering networkOffering) {
+        String configKey;
+        if (network.getVpcId() != null) {
+            configKey = NuageVspManager.NuageVspVpcDomainTemplateName.key();
+        } else if (networkOffering.getGuestType() == Network.GuestType.Shared) {
+            configKey = NuageVspManager.NuageVspSharedNetworkDomainTemplateName.key();
+        } else {
+            configKey = NuageVspManager.NuageVspIsolatedNetworkDomainTemplateName.key();
+        }
+        return configDao.getValue(configKey);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/NuageVspPluginClientLoader.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/NuageVspPluginClientLoader.java b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/NuageVspPluginClientLoader.java
index 76b9823..57935b9 100644
--- a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/NuageVspPluginClientLoader.java
+++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/NuageVspPluginClientLoader.java
@@ -19,28 +19,101 @@
 
 package net.nuage.vsp.acs;
 
+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.log4j.Logger;
+
+import javax.naming.ConfigurationException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 
 public class NuageVspPluginClientLoader {
 
-    private static NuageVspPluginClientLoader nuageVspPluginClientClassloader;
-    private ClassLoader loader = null;
+    private ClassLoader _loader = null;
+    private static final Logger s_logger = Logger.getLogger(NuageVspPluginClientLoader.class);
+
+    private NuageVspApiClient _nuageVspApiClient;
+    private NuageVspElementClient _nuageVspElementClient;
+    private NuageVspGuruClient _nuageVspGuruClient;
+    private NuageVspManagerClient _nuageVspManagerClient;
+    private NuageVspSyncClient _nuageVspSyncClient;
+
+    private static final String NUAGE_PLUGIN_CLIENT_JAR_FILE = "/usr/share/nuagevsp/lib/nuage-vsp-acs-client.jar";
+    private static final String NUAGE_VSP_API_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspApiClientImpl";
+    private static final String NUAGE_VSP_SYNC_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspSyncClientImpl";
+    private static final String NUAGE_VSP_ELEMENT_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspElementClientImpl";
+    private static final String NUAGE_VSP_GURU_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspGuruClientImpl";
+    private static final String NUAGE_VSP_MANAGER_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspManagerClientImpl";
 
     private NuageVspPluginClientLoader(String nuagePluginClientJarLocation) {
         try {
-            loader = URLClassLoader.newInstance(new URL[] {new URL("jar:file:" + nuagePluginClientJarLocation + "!/")},
+            _loader = URLClassLoader.newInstance(new URL[] {new URL("jar:file:" + nuagePluginClientJarLocation + "!/")},
                     getClass().getClassLoader());
         } catch (MalformedURLException e) {
-            e.printStackTrace();
+            throw new IllegalArgumentException(e);
         }
     }
 
-    public static ClassLoader getClassLoader(String nuagePluginClientJarLocation) {
-        if (nuageVspPluginClientClassloader == null) {
-            nuageVspPluginClientClassloader = new NuageVspPluginClientLoader(nuagePluginClientJarLocation);
+    public static NuageVspPluginClientLoader getClientLoader(String relativePath, String[] cmsUserInfo, int numRetries, int retryInterval,
+            String nuageVspCmsId) throws ConfigurationException {
+        NuageVspPluginClientLoader nuageVspPluginClientClassloader = new NuageVspPluginClientLoader(NUAGE_PLUGIN_CLIENT_JAR_FILE);
+        nuageVspPluginClientClassloader.loadClasses(relativePath, cmsUserInfo, numRetries, retryInterval, nuageVspCmsId);
+        return nuageVspPluginClientClassloader;
+    }
+
+    private void loadClasses(String relativePath, String[] cmsUserInfo, int numRetries, int retryInterval, String nuageVspCmsId) throws ConfigurationException {
+        try {
+            Class<?> nuageVspApiClientClass = Class.forName(NUAGE_VSP_API_CLIENT_IMPL, true, _loader);
+            Class<?> nuageVspSyncClientClass = Class.forName(NUAGE_VSP_SYNC_CLIENT_IMPL, true, _loader);
+            Class<?> nuageVspGuruClientClass = Class.forName(NUAGE_VSP_GURU_CLIENT_IMPL, true, _loader);
+            Class<?> nuageVspElementClientClass = Class.forName(NUAGE_VSP_ELEMENT_CLIENT_IMPL, true, _loader);
+            Class<?> nuageVspManagerClientClass = Class.forName(NUAGE_VSP_MANAGER_CLIENT_IMPL, true, _loader);
+
+            //Instantiate the instances
+            _nuageVspApiClient = (NuageVspApiClient)nuageVspApiClientClass.newInstance();
+            _nuageVspApiClient.setNuageVspHost(relativePath, cmsUserInfo, numRetries, retryInterval, nuageVspCmsId);
+            _nuageVspSyncClient = (NuageVspSyncClient)nuageVspSyncClientClass.newInstance();
+            _nuageVspSyncClient.setNuageVspApiClient(_nuageVspApiClient);
+            _nuageVspGuruClient = (NuageVspGuruClient)nuageVspGuruClientClass.newInstance();
+            _nuageVspGuruClient.setNuageVspApiClient(_nuageVspApiClient);
+            _nuageVspElementClient = (NuageVspElementClient)nuageVspElementClientClass.newInstance();
+            _nuageVspElementClient.setNuageVspApiClient(_nuageVspApiClient);
+            _nuageVspManagerClient = (NuageVspManagerClient)nuageVspManagerClientClass.newInstance();
+            _nuageVspManagerClient.setNuageVspApiClient(_nuageVspApiClient);
+        } catch (ClassNotFoundException cnfe) {
+            s_logger.error("Error while loading classes of Nuage VSP client", cnfe);
+            throw new ConfigurationException("Error while loading classes of Nuage VSP client");
+        } catch (InstantiationException ie) {
+            s_logger.error("Error while initializing classes of Nuage VSP client", ie);
+            throw new ConfigurationException("Error while initializing classes of Nuage VSP client");
+        } catch (IllegalAccessException iae) {
+            s_logger.error("Error while accessing classes of Nuage VSP client", iae);
+            throw new ConfigurationException("Error while accessing classes of Nuage VSP client");
         }
-        return nuageVspPluginClientClassloader.loader;
+
+    }
+
+    public NuageVspApiClient getNuageVspApiClient() {
+        return _nuageVspApiClient;
+    }
+
+    public NuageVspElementClient getNuageVspElementClient() {
+        return _nuageVspElementClient;
+    }
+
+    public NuageVspGuruClient getNuageVspGuruClient() {
+        return _nuageVspGuruClient;
+    }
+
+    public NuageVspManagerClient getNuageVspManagerClient() {
+        return _nuageVspManagerClient;
+    }
+
+    public NuageVspSyncClient getNuageVspSyncClient() {
+        return _nuageVspSyncClient;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspApiClient.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspApiClient.java b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspApiClient.java
index d584c6f..d80daf9 100644
--- a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspApiClient.java
+++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspApiClient.java
@@ -19,12 +19,14 @@
 
 package net.nuage.vsp.acs.client;
 
+import java.util.concurrent.ExecutionException;
+
 public interface NuageVspApiClient {
 
-    public void login() throws Exception;
+    void login() throws ExecutionException;
 
-    public void setNuageVspHost(String restRelativePath, String[] cmsUserInfo, int noofRetry, int retryInterval);
+    void setNuageVspHost(String restRelativePath, String[] cmsUserInfo, int noofRetry, int retryInterval, String nuageVspCmsId);
 
-    public String executeRestApi(String method, String resource, String resourceId, String childResource, Object entityDetails, String resourceFilter, String proxyUserUuid,
-            String proxyUserDomainuuid) throws Exception;
+    String executeRestApi(String method, String resource, String resourceId, String childResource, Object entityDetails, String resourceFilter, String proxyUserUuid,
+                                 String proxyUserDomainuuid) throws ExecutionException;
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspElementClient.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspElementClient.java b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspElementClient.java
index 27c613b..acd4256 100644
--- a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspElementClient.java
+++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspElementClient.java
@@ -21,16 +21,22 @@ package net.nuage.vsp.acs.client;
 
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutionException;
 
 public interface NuageVspElementClient {
 
-    public void applyStaticNats(String networkDomainUuid, String vpcOrSubnetUuid, boolean isL3Network, List<Map<String, Object>> staticNatDetails) throws Exception;
+    boolean implement(long networkId, String networkDomainUuid, String networkUuid, String networkName, String vpcOrSubnetUuid, boolean isL2Network, boolean isL3Network,
+                             boolean isVpc, boolean isShared, String domainTemplateName, boolean isFirewallServiceSupported, List<String> dnsServers, List<Map<String, Object>> ingressFirewallRules,
+                             List<Map<String, Object>> egressFirewallRules, List<String> acsFipUuid, boolean egressDefaultPolicy) throws ExecutionException;
 
-    public void applyAclRules(String networkUuid, String networkDomainUuid, String vpcOrSubnetUuid, boolean isL3Network, List<Map<String, Object>> aclRules, boolean isVpc, long networkId)
-            throws Exception;
+    void applyStaticNats(String networkDomainUuid, String networkUuid, String vpcOrSubnetUuid, boolean isL3Network, boolean isVpc,
+                                List<Map<String, Object>> staticNatDetails) throws ExecutionException;
 
-    public void shutDownVpc(String domainUuid, String vpcUuid) throws Exception;
+    void applyAclRules(boolean isNetworkAcl, String networkUuid, String networkDomainUuid, String vpcOrSubnetUuid, String networkName, boolean isL2Network,
+                              List<Map<String, Object>> rules, long networkId, boolean egressDefaultPolicy, Boolean isAcsIngressAcl, boolean networkReset, String domainTemplateName) throws ExecutionException;
 
-    public <C extends NuageVspApiClient> void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient);
+    void shutdownVpc(String domainUuid, String vpcUuid, String domainTemplateName) throws ExecutionException;
+
+    <C extends NuageVspApiClient> void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient);
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspGuruClient.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspGuruClient.java b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspGuruClient.java
index 3c7f33d..2b3a63a 100644
--- a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspGuruClient.java
+++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspGuruClient.java
@@ -21,24 +21,23 @@ package net.nuage.vsp.acs.client;
 
 import java.util.Collection;
 import java.util.List;
-import java.util.Map;
+import java.util.concurrent.ExecutionException;
 
 public interface NuageVspGuruClient {
 
-    public void implement(String networkDomainName, String networkDomainPath, String networkDomainUuid, String networkAccountName, String networkAccountUuid, String networkName,
-            String networkCidr, String networkGateway, String networkUuid, boolean isL3Network, String vpcName, String vpcUuid, boolean defaultEgressPolicy,
-            Collection<String> ipAddressRange) throws Exception;
+    void implement(String networkDomainName, String networkDomainPath, String networkDomainUuid, String networkAccountName, String networkAccountUuid, String networkName,
+                          String networkCidr, String networkGateway, Long networkAclId, List<String> dnsServers, List<String> gatewaySystemIds, boolean isL3Network, boolean isVpc, boolean isSharedNetwork,
+                          String networkUuid, String vpcName, String vpcUuid, boolean defaultEgressPolicy, Collection<String[]> ipAddressRange, String domainTemplateName) throws ExecutionException;
 
-    public List<Map<String, String>> reserve(String nicUuid, String nicMacAddress, String networkUuid, boolean isL3Network, String vpcUuid, String networkDomainUuid,
-            String networksAccountUuid, boolean isDomainRouter, String domainRouterIp, String vmInstanceName, String vmUuid) throws Exception;
+    void reserve(String nicUuid, String nicMacAddress, String networkUuid, boolean isL3Network, boolean isSharedNetwork, String vpcUuid, String networkDomainUuid,
+                                             String networksAccountUuid, boolean isDomainRouter, String domainRouterIp, String vmInstanceName, String vmUuid, boolean useStaticIp, String staticIp, String staticNatIpUuid,
+                                             String staticNatIpAddress, boolean isStaticNatIpAllocated, boolean isOneToOneNat, String staticNatVlanUuid, String staticNatVlanGateway, String staticNatVlanNetmask) throws ExecutionException;
 
-    public void release(String networkUuid, String vmUuid, String vmInstanceName) throws Exception;
+    void deallocate(String networkUuid, String nicFrmDdUuid, String nicMacAddress, String nicIp4Address, boolean isL3Network, boolean isSharedNetwork,
+                           String vpcUuid, String networksDomainUuid, String vmInstanceName, String vmUuid, boolean isExpungingState) throws ExecutionException;
 
-    public void deallocate(String networkUuid, String nicFrmDdUuid, String nicMacAddress, String nicIp4Address, boolean isL3Network, String vpcUuid, String networksDomainUuid,
-            String vmInstanceName, String vmUuid) throws Exception;
+    void trash(String domainUuid, String networkUuid, boolean isL3Network, boolean isSharedNetwork, String vpcUuid, String domainTemplateName) throws ExecutionException;
 
-    public void trash(String domainUuid, String networkUuid, boolean isL3Network, String vpcUuid) throws Exception;
-
-    public void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient);
+    void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient);
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspManagerClient.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspManagerClient.java b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspManagerClient.java
new file mode 100644
index 0000000..f134111
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspManagerClient.java
@@ -0,0 +1,42 @@
+//
+// 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 net.nuage.vsp.acs.client;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+
+public interface NuageVspManagerClient {
+
+    Pair<Boolean, String> auditNuageVspCmsId(String nuageVspCmsId, boolean auditOnly) throws ExecutionException;
+
+    String registerNuageVspCmsId() throws ExecutionException;
+
+    boolean unregisterNuageVspCmsId(String nuageVspCmsId) throws ExecutionException;
+
+    boolean isSupportedApiVersion(String version);
+
+    Map<String, Object> getClientDefaults() throws ExecutionException;
+
+    boolean syncDomainWithNuageVsp(String domainUuid, String domainName, String domainPath, boolean add, boolean remove) throws ExecutionException;
+
+    <C extends NuageVspApiClient> void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspSyncClient.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspSyncClient.java b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspSyncClient.java
index b9400f1..951ee5a 100644
--- a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspSyncClient.java
+++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspSyncClient.java
@@ -19,9 +19,11 @@
 
 package net.nuage.vsp.acs.client;
 
+import java.util.concurrent.ExecutionException;
+
 public interface NuageVspSyncClient {
 
-    public void syncWithNuageVsp(String nuageVspEntity) throws Exception;
+    void syncWithNuageVsp(String nuageVspEntity) throws ExecutionException;
 
-    public void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient);
+    void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient);
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/test/com/cloud/agent/api/CommandsTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/agent/api/CommandsTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/agent/api/CommandsTest.java
new file mode 100644
index 0000000..817ab7a
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/test/com/cloud/agent/api/CommandsTest.java
@@ -0,0 +1,151 @@
+//
+// 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.agent.api;
+
+import com.cloud.agent.api.element.ApplyAclRuleVspCommand;
+import com.cloud.agent.api.element.ApplyStaticNatVspCommand;
+import com.cloud.agent.api.element.ImplementVspCommand;
+import com.cloud.agent.api.element.ShutDownVpcVspCommand;
+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.SupportedApiVersionCommand;
+import com.cloud.agent.api.sync.SyncDomainCommand;
+import com.cloud.agent.api.sync.SyncNuageVspCmsIdCommand;
+import com.cloud.agent.api.sync.SyncVspCommand;
+import com.google.common.collect.Maps;
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+public class CommandsTest {
+
+    @Test
+    public void testCommandEquals() throws IllegalAccessException, InvocationTargetException, InstantiationException {
+        ApplyAclRuleVspCommand applyAclRuleVspCommand = fillBuilderObject(new ApplyAclRuleVspCommand.Builder()).build();
+        ApplyAclRuleVspCommand otherApplyAclRuleVspCommand = fillBuilderObject(new ApplyAclRuleVspCommand.Builder()).build();
+
+        ApplyStaticNatVspCommand applyStaticNatVspCommand = fillBuilderObject(new ApplyStaticNatVspCommand.Builder()).build();
+        ApplyStaticNatVspCommand otherApplyStaticNatVspCommand = fillBuilderObject(new ApplyStaticNatVspCommand.Builder()).build();
+
+        ImplementVspCommand implementVspCommand = fillBuilderObject(new ImplementVspCommand.Builder()).build();
+        ImplementVspCommand otherImplementVspCommand = fillBuilderObject(new ImplementVspCommand.Builder()).build();
+
+        ShutDownVpcVspCommand shutDownVpcVspCommand = fillBuilderObject(new ShutDownVpcVspCommand.Builder()).build();
+        ShutDownVpcVspCommand otherShutDownVpcVspCommand = fillBuilderObject(new ShutDownVpcVspCommand.Builder()).build();
+
+        DeallocateVmVspCommand deallocateVmVspCommand = fillBuilderObject(new DeallocateVmVspCommand.Builder()).build();
+        DeallocateVmVspCommand otherDeallocateVmVspCommand = fillBuilderObject(new DeallocateVmVspCommand.Builder()).build();
+
+        ImplementNetworkVspCommand implementNetworkVspCommand = fillBuilderObject(new ImplementNetworkVspCommand.Builder()).build();
+        ImplementNetworkVspCommand otherImplementNetworkVspCommand = fillBuilderObject(new ImplementNetworkVspCommand.Builder()).build();
+
+        ReserveVmInterfaceVspCommand reserveVmInterfaceVspCommand = fillBuilderObject(new ReserveVmInterfaceVspCommand.Builder()).build();
+        ReserveVmInterfaceVspCommand otherReserveVmInterfaceVspCommand = fillBuilderObject(new ReserveVmInterfaceVspCommand.Builder()).build();
+
+        TrashNetworkVspCommand trashNetworkVspCommand = fillBuilderObject(new TrashNetworkVspCommand.Builder()).build();
+        TrashNetworkVspCommand otherTrashNetworkVspCommand  = fillBuilderObject(new TrashNetworkVspCommand.Builder()).build();
+
+        SupportedApiVersionCommand supportedApiVersionCommand = new SupportedApiVersionCommand("3.2");
+        SupportedApiVersionCommand otherSupportedApiVersionCommand = new SupportedApiVersionCommand("3.2");
+
+        SyncDomainCommand syncDomainCommand = fillObject(SyncDomainCommand.class);
+        SyncDomainCommand otherSyncDomainCommand = fillObject(SyncDomainCommand.class);
+
+        SyncNuageVspCmsIdCommand syncNuageVspCmsIdCommand = fillObject(SyncNuageVspCmsIdCommand.class);
+        SyncNuageVspCmsIdCommand otherSyncNuageVspCmsIdCommand = fillObject(SyncNuageVspCmsIdCommand.class);
+
+        SyncVspCommand syncVspCommand = fillObject(SyncVspCommand.class);
+        SyncVspCommand otherSyncVspCommand = fillObject(SyncVspCommand.class);
+
+        PingNuageVspCommand pingNuageVspCommand = fillObject(PingNuageVspCommand.class);
+        PingNuageVspCommand otherPingNuageVspCommand = fillObject(PingNuageVspCommand.class);
+
+        VspResourceCommand vspResourceCommand = fillObject(VspResourceCommand.class);
+        VspResourceCommand otherVspResourceCommand = fillObject(VspResourceCommand.class);
+
+        new EqualsTester()
+                .addEqualityGroup(applyAclRuleVspCommand, otherApplyAclRuleVspCommand)
+                .addEqualityGroup(applyStaticNatVspCommand, otherApplyStaticNatVspCommand)
+                .addEqualityGroup(implementVspCommand, otherImplementVspCommand)
+                .addEqualityGroup(shutDownVpcVspCommand, otherShutDownVpcVspCommand)
+                .addEqualityGroup(deallocateVmVspCommand, otherDeallocateVmVspCommand)
+                .addEqualityGroup(implementNetworkVspCommand, otherImplementNetworkVspCommand)
+                .addEqualityGroup(reserveVmInterfaceVspCommand, otherReserveVmInterfaceVspCommand)
+                .addEqualityGroup(trashNetworkVspCommand, otherTrashNetworkVspCommand)
+                .addEqualityGroup(supportedApiVersionCommand, otherSupportedApiVersionCommand)
+                .addEqualityGroup(syncDomainCommand, otherSyncDomainCommand)
+                .addEqualityGroup(syncNuageVspCmsIdCommand, otherSyncNuageVspCmsIdCommand)
+                .addEqualityGroup(syncVspCommand, otherSyncVspCommand)
+                .addEqualityGroup(pingNuageVspCommand, otherPingNuageVspCommand)
+                .addEqualityGroup(vspResourceCommand, otherVspResourceCommand)
+                .testEquals();
+    }
+
+    private <T extends CmdBuilder> T fillBuilderObject(T obj) throws IllegalAccessException, InvocationTargetException {
+        Class clazz = obj.getClass();
+        for (Method method : clazz.getDeclaredMethods()) {
+            if (method.getParameterTypes().length == 1) {
+                Class paramType = method.getParameterTypes()[0];
+                if (isNumericType(paramType)) {
+                    if (Long.class.isAssignableFrom(paramType)) {
+                        method.invoke(obj, Long.valueOf(method.getName().length()));
+                    } else {
+                        method.invoke(obj, method.getName().length());
+                    }
+                } else if (String.class.isAssignableFrom(paramType)) {
+                    method.invoke(obj, method.getName());
+                } else if (Boolean.class.isAssignableFrom(paramType) || boolean.class.isAssignableFrom(paramType)) {
+                    method.invoke(obj, method.getName().length() % 2 == 0);
+                }
+            }
+        }
+        return obj;
+    }
+
+    private <T> T fillObject(Class<T> clazz) throws IllegalAccessException, InvocationTargetException, InstantiationException {
+        Constructor constructor = clazz.getDeclaredConstructors()[0];
+        Object[] constructorArgs = new Object[constructor.getParameterTypes().length];
+        for (int i = 0; i < constructor.getParameterTypes().length; i++) {
+            Class constructorArgType = constructor.getParameterTypes()[i];
+            if (isNumericType(constructorArgType)) {
+                constructorArgs[i] = constructorArgType.getName().length();
+            } else if (String.class.isAssignableFrom(constructorArgType)) {
+                constructorArgs[i] = constructorArgType.getName();
+            } else if (Boolean.class.isAssignableFrom(constructorArgType) || boolean.class.isAssignableFrom(constructorArgType)) {
+                constructorArgs[i] = constructorArgType.getName().length() % 2 == 0;
+            } else if (Map.class.isAssignableFrom(constructorArgType)) {
+                constructorArgs[i] = Maps.newHashMap();
+            } else {
+                constructorArgs[i] = null;
+            }
+        }
+        return (T) constructor.newInstance(constructorArgs);
+    }
+
+    private boolean isNumericType(Class type) {
+        return Number.class.isAssignableFrom(type) || int.class.isAssignableFrom(type) || long.class.isAssignableFrom(type);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/test/com/cloud/network/element/NuageVspElementTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/network/element/NuageVspElementTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/network/element/NuageVspElementTest.java
index 08d685f..bbdf764 100644
--- a/plugins/network-elements/nuage-vsp/test/com/cloud/network/element/NuageVspElementTest.java
+++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/element/NuageVspElementTest.java
@@ -19,35 +19,10 @@
 
 package com.cloud.network.element;
 
-import static org.junit.Assert.assertFalse;
-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;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.naming.ConfigurationException;
-
-import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
 import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
-import com.cloud.agent.api.element.ApplyAclRuleVspAnswer;
-import com.cloud.agent.api.element.ApplyStaticNatVspAnswer;
 import com.cloud.deploy.DeployDestination;
-import com.cloud.domain.Domain;
 import com.cloud.domain.DomainVO;
 import com.cloud.domain.dao.DomainDao;
 import com.cloud.exception.CloudException;
@@ -64,11 +39,20 @@ import com.cloud.network.NetworkModel;
 import com.cloud.network.Networks.BroadcastDomainType;
 import com.cloud.network.Networks.TrafficType;
 import com.cloud.network.NuageVspDeviceVO;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.IPAddressVO;
 import com.cloud.network.dao.NetworkServiceMapDao;
 import com.cloud.network.dao.NuageVspDao;
+import com.cloud.network.dao.PhysicalNetworkDao;
+import com.cloud.network.dao.PhysicalNetworkVO;
+import com.cloud.network.manager.NuageVspManager;
 import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.FirewallRuleVO;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.network.vpc.NetworkACLItem;
+import com.cloud.network.vpc.Vpc;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.offerings.dao.NetworkOfferingDao;
@@ -76,6 +60,31 @@ import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
 import com.cloud.resource.ResourceManager;
 import com.cloud.user.Account;
 import com.cloud.vm.ReservationContext;
+import com.google.common.collect.Lists;
+import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+
+import javax.naming.ConfigurationException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import static com.cloud.network.manager.NuageVspManager.NuageVspIsolatedNetworkDomainTemplateName;
+import static com.cloud.network.manager.NuageVspManager.NuageVspSharedNetworkDomainTemplateName;
+import static com.cloud.network.manager.NuageVspManager.NuageVspVpcDomainTemplateName;
+import static org.junit.Assert.assertFalse;
+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 NuageVspElementTest {
 
@@ -90,8 +99,13 @@ public class NuageVspElementTest {
     DomainDao domainDao = mock(DomainDao.class);
     NetworkOfferingDao ntwkOfferingDao = mock(NetworkOfferingDao.class);
     NetworkOfferingServiceMapDao ntwkOfferingSrvcDao = mock(NetworkOfferingServiceMapDao.class);
+    ConfigurationDao configDao = mock(ConfigurationDao.class);
+    NuageVspManager nuageVspManager = mock(NuageVspManager.class);
+    FirewallRulesDao firewallRulesDao = mock(FirewallRulesDao.class);
+    IPAddressDao ipAddressDao = mock(IPAddressDao.class);
+    PhysicalNetworkDao physNetDao = mock(PhysicalNetworkDao.class);
 
-    Answer<Object> genericAnswer = new Answer<Object>() {
+    org.mockito.stubbing.Answer<Object> genericAnswer = new org.mockito.stubbing.Answer<Object>() {
         public Object answer(InvocationOnMock invocation) {
             return null;
         }
@@ -108,15 +122,23 @@ public class NuageVspElementTest {
         element._ntwkOfferingSrvcDao = ntwkOfferingSrvcDao;
         element._domainDao = domainDao;
         element._ntwkOfferingDao = ntwkOfferingDao;
+        element._configDao = configDao;
+        element._nuageVspManager = nuageVspManager;
+        element._firewallRulesDao = firewallRulesDao;
+        element._ipAddressDao = ipAddressDao;
+        element._physicalNetworkDao = physNetDao;
 
         // Standard responses
         when(networkModel.isProviderForNetwork(Provider.NuageVsp, NETWORK_ID)).thenReturn(true);
+        when(configDao.getValue(NuageVspIsolatedNetworkDomainTemplateName.key())).thenReturn("IsolatedDomainTemplate");
+        when(configDao.getValue(NuageVspVpcDomainTemplateName.key())).thenReturn("VpcDomainTemplate");
+        when(configDao.getValue(NuageVspSharedNetworkDomainTemplateName.key())).thenReturn("SharedDomainTemplate");
 
         element.configure("NuageVspTestElement", Collections.<String, Object> emptyMap());
     }
 
     @Test
-    public void testCcanHandle() {
+    public void testCanHandle() {
         final Network net = mock(Network.class);
         when(net.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Vsp);
         when(net.getId()).thenReturn(NETWORK_ID);
@@ -150,7 +172,10 @@ public class NuageVspElementTest {
         final Network network = mock(Network.class);
         when(network.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Vsp);
         when(network.getId()).thenReturn(NETWORK_ID);
+        when(network.getVpcId()).thenReturn(null);
         when(network.getBroadcastUri()).thenReturn(new URI(""));
+        when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
+        when(network.getDomainId()).thenReturn(NETWORK_ID);
         when(networkModel.isProviderForNetwork(Provider.NuageVsp, NETWORK_ID)).thenReturn(true);
         when(ntwkSrvcDao.canProviderSupportServiceInNetwork(NETWORK_ID, Service.Connectivity, Provider.NuageVsp)).thenReturn(true);
 
@@ -161,14 +186,27 @@ public class NuageVspElementTest {
 
         DeployDestination deployDest = mock(DeployDestination.class);
 
-        final Domain dom = mock(Domain.class);
+        final DomainVO dom = mock(DomainVO.class);
         when(dom.getName()).thenReturn("domain");
+        when(domainDao.findById(NETWORK_ID)).thenReturn(dom);
         final Account acc = mock(Account.class);
         when(acc.getAccountName()).thenReturn("accountname");
         final ReservationContext context = mock(ReservationContext.class);
         when(context.getDomain()).thenReturn(dom);
         when(context.getAccount()).thenReturn(acc);
 
+        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(firewallRulesDao.listByNetworkPurposeTrafficType(NETWORK_ID, FirewallRule.Purpose.Firewall, FirewallRule.TrafficType.Ingress)).thenReturn(new ArrayList<FirewallRuleVO>());
+        when(firewallRulesDao.listByNetworkPurposeTrafficType(NETWORK_ID, FirewallRule.Purpose.Firewall, FirewallRule.TrafficType.Egress)).thenReturn(new ArrayList<FirewallRuleVO>());
+        when(ipAddressDao.listStaticNatPublicIps(NETWORK_ID)).thenReturn(new ArrayList<IPAddressVO>());
+        when(nuageVspManager.getDnsDetails(network)).thenReturn(new ArrayList<String>());
+
         assertTrue(element.implement(network, offering, deployDest, context));
     }
 
@@ -215,7 +253,7 @@ public class NuageVspElementTest {
         when(hostDao.findById(NETWORK_ID)).thenReturn(host);
 
         when(domainDao.findById(NETWORK_ID)).thenReturn(mock(DomainVO.class));
-        final ApplyStaticNatVspAnswer answer = mock(ApplyStaticNatVspAnswer.class);
+        final Answer answer = mock(Answer.class);
         when(answer.getResult()).thenReturn(true);
         when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
         assertTrue(element.applyStaticNats(network, new ArrayList<StaticNat>()));
@@ -244,7 +282,7 @@ public class NuageVspElementTest {
 
         when(domainDao.findById(NETWORK_ID)).thenReturn(mock(DomainVO.class));
 
-        final ApplyAclRuleVspAnswer answer = mock(ApplyAclRuleVspAnswer.class);
+        final Answer answer = mock(Answer.class);
         when(answer.getResult()).thenReturn(true);
         when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
         assertTrue(element.applyFWRules(network, new ArrayList<FirewallRule>()));
@@ -272,9 +310,44 @@ public class NuageVspElementTest {
         when(hostDao.findById(NETWORK_ID)).thenReturn(host);
 
         when(domainDao.findById(NETWORK_ID)).thenReturn(mock(DomainVO.class));
-        final ApplyAclRuleVspAnswer answer = mock(ApplyAclRuleVspAnswer.class);
+        final Answer answer = mock(Answer.class);
         when(answer.getResult()).thenReturn(true);
         when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
         assertTrue(element.applyNetworkACLs(network, new ArrayList<NetworkACLItem>()));
     }
+
+    @Test
+    public void testShutdownVpc() throws Exception {
+        final Vpc vpc = mock(Vpc.class);
+        when(vpc.getUuid()).thenReturn("aaaaaa");
+        when(vpc.getState()).thenReturn(Vpc.State.Inactive);
+        when(vpc.getDomainId()).thenReturn(NETWORK_ID);
+        when(vpc.getZoneId()).thenReturn(NETWORK_ID);
+
+        final DomainVO dom = mock(DomainVO.class);
+        when(dom.getName()).thenReturn("domain");
+        when(domainDao.findById(NETWORK_ID)).thenReturn(dom);
+        final Account acc = mock(Account.class);
+        when(acc.getAccountName()).thenReturn("accountname");
+        final ReservationContext context = mock(ReservationContext.class);
+        when(context.getDomain()).thenReturn(dom);
+        when(context.getAccount()).thenReturn(acc);
+
+        PhysicalNetworkVO physNet = mock(PhysicalNetworkVO.class);
+        when(physNet.getIsolationMethods()).thenReturn(Lists.newArrayList(PhysicalNetwork.IsolationMethod.VSP.name()));
+        when(physNet.getId()).thenReturn(NETWORK_ID);
+        when(physNetDao.listByZone(NETWORK_ID)).thenReturn(Lists.newArrayList(physNet));
+
+        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);
+
+        final Answer answer = mock(Answer.class);
+        when(answer.getResult()).thenReturn(true);
+        when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
+        assertTrue(element.shutdownVpc(vpc, context));
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/test/com/cloud/network/guru/NuageVspGuestNetworkGuruTest.java
----------------------------------------------------------------------
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 f879f09..18c088f 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,29 +19,9 @@
 
 package com.cloud.network.guru;
 
-import static org.junit.Assert.assertFalse;
-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;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Map;
-
-import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
-import org.junit.Before;
-import org.junit.Test;
-
 import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
-import com.cloud.agent.api.guru.ImplementNetworkVspAnswer;
-import com.cloud.agent.api.guru.ReleaseVmVspAnswer;
-import com.cloud.agent.api.guru.ReserveVmInterfaceVspAnswer;
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.DataCenter.NetworkType;
 import com.cloud.dc.DataCenterVO;
@@ -63,11 +43,13 @@ import com.cloud.network.Networks.BroadcastDomainType;
 import com.cloud.network.Networks.Mode;
 import com.cloud.network.Networks.TrafficType;
 import com.cloud.network.NuageVspDeviceVO;
+import com.cloud.network.dao.IPAddressDao;
 import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.dao.NetworkVO;
 import com.cloud.network.dao.NuageVspDao;
 import com.cloud.network.dao.PhysicalNetworkDao;
 import com.cloud.network.dao.PhysicalNetworkVO;
+import com.cloud.network.manager.NuageVspManager;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.offerings.dao.NetworkOfferingDao;
@@ -79,9 +61,28 @@ import com.cloud.vm.NicProfile;
 import com.cloud.vm.NicVO;
 import com.cloud.vm.ReservationContext;
 import com.cloud.vm.VirtualMachine;
-import com.cloud.vm.VirtualMachine.State;
 import com.cloud.vm.VirtualMachineProfile;
 import com.cloud.vm.dao.NicDao;
+import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+
+import static com.cloud.network.manager.NuageVspManager.NuageVspIsolatedNetworkDomainTemplateName;
+import static com.cloud.network.manager.NuageVspManager.NuageVspSharedNetworkDomainTemplateName;
+import static com.cloud.network.manager.NuageVspManager.NuageVspVpcDomainTemplateName;
+import static org.junit.Assert.assertFalse;
+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 {
     private static final long NETWORK_ID = 42L;
@@ -98,6 +99,9 @@ public class NuageVspGuestNetworkGuruTest {
     NuageVspDao nuageVspDao = mock(NuageVspDao.class);
     HostDao hostDao = mock(HostDao.class);
     NetworkDao networkDao = mock(NetworkDao.class);
+    ConfigurationDao configDao = mock(ConfigurationDao.class);
+    IPAddressDao ipAddressDao = mock(IPAddressDao.class);
+    NuageVspManager nuageVspManager = mock(NuageVspManager.class);
 
     NetworkDao netdao = mock(NetworkDao.class);
     NuageVspGuestNetworkGuru guru;
@@ -105,7 +109,7 @@ public class NuageVspGuestNetworkGuruTest {
     @Before
     public void setUp() {
         guru = new NuageVspGuestNetworkGuru();
-        ((GuestNetworkGuru)guru)._physicalNetworkDao = physnetdao;
+        guru._physicalNetworkDao = physnetdao;
         guru._physicalNetworkDao = physnetdao;
         guru._nuageVspDao = nuageVspDao;
         guru._dcDao = dcdao;
@@ -119,12 +123,19 @@ public class NuageVspGuestNetworkGuruTest {
         guru._domainDao = domainDao;
         guru._nicDao = nicDao;
         guru._ntwkOfferingDao = ntwkOfferDao;
+        guru._configDao = configDao;
+        guru._ipAddressDao = ipAddressDao;
+        guru._nuageVspManager = nuageVspManager;
 
         final DataCenterVO dc = mock(DataCenterVO.class);
         when(dc.getNetworkType()).thenReturn(NetworkType.Advanced);
         when(dc.getGuestNetworkCidr()).thenReturn("10.1.1.1/24");
 
         when(dcdao.findById((Long)any())).thenReturn(dc);
+
+        when(configDao.getValue(NuageVspIsolatedNetworkDomainTemplateName.key())).thenReturn("IsolatedDomainTemplate");
+        when(configDao.getValue(NuageVspVpcDomainTemplateName.key())).thenReturn("VpcDomainTemplate");
+        when(configDao.getValue(NuageVspSharedNetworkDomainTemplateName.key())).thenReturn("SharedDomainTemplate");
     }
 
     @Test
@@ -146,10 +157,10 @@ public class NuageVspGuestNetworkGuruTest {
         when(offering.getTrafficType()).thenReturn(TrafficType.Management);
         assertFalse(guru.canHandle(offering, NetworkType.Advanced, physnet) == true);
 
-        // Not supported: GuestType Shared
+        // Supported: GuestType Shared
         when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
         when(offering.getGuestType()).thenReturn(GuestType.Shared);
-        assertFalse(guru.canHandle(offering, NetworkType.Advanced, physnet) == true);
+        assertTrue(guru.canHandle(offering, NetworkType.Advanced, physnet) == true);
 
         // Not supported: Basic networking
         when(offering.getGuestType()).thenReturn(GuestType.Isolated);
@@ -236,7 +247,8 @@ public class NuageVspGuestNetworkGuruTest {
 
     @Test
     public void testReserve() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException, URISyntaxException {
-        final Network network = mock(Network.class);
+        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);
@@ -262,10 +274,15 @@ public class NuageVspGuestNetworkGuruTest {
         when(nicvo.getUuid()).thenReturn("aaaa-fffff");
         when(nicDao.findById(NETWORK_ID)).thenReturn(nicvo);
 
-        final VirtualMachineProfile vm = mock(VirtualMachineProfile.class);
+        final VirtualMachine vm = mock(VirtualMachine.class);
+        when(vm.getId()).thenReturn(NETWORK_ID);
         when(vm.getType()).thenReturn(VirtualMachine.Type.User);
-        when(vm.getInstanceName()).thenReturn("");
-        when(vm.getUuid()).thenReturn("aaaa-bbbbb");
+
+        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);
 
         NicProfile nicProfile = mock(NicProfile.class);
         when(nicProfile.getUuid()).thenReturn("aaa-bbbb");
@@ -283,51 +300,20 @@ public class NuageVspGuestNetworkGuruTest {
         when(nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(new NuageVspDeviceVO[] {nuageVspDevice}));
         when(hostDao.findById(NETWORK_ID)).thenReturn(host);
 
+        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 ReserveVmInterfaceVspAnswer answer = mock(ReserveVmInterfaceVspAnswer.class);
-        when(answer.getResult()).thenReturn(true);
-        when(answer.getInterfaceDetails()).thenReturn(new ArrayList<Map<String, String>>());
-        when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
-
-        guru.reserve(nicProfile, network, vm, mock(DeployDestination.class), mock(ReservationContext.class));
-    }
-
-    @Test
-    public void testRelease() {
-        final NicProfile nicProfile = mock(NicProfile.class);
-        when(nicProfile.getNetworkId()).thenReturn(NETWORK_ID);
-        final NetworkVO network = mock(NetworkVO.class);
-        when(network.getUuid()).thenReturn("aaaaaa-ffffff");
-        when(network.getName()).thenReturn("aaaaaa");
-        when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
-        when(networkDao.findById(NETWORK_ID)).thenReturn(network);
-
-        final VirtualMachineProfile vm = mock(VirtualMachineProfile.class);
-        when(vm.getType()).thenReturn(VirtualMachine.Type.User);
-        when(vm.getInstanceName()).thenReturn("");
-        when(vm.getUuid()).thenReturn("aaaa-bbbbb");
-
-        final VirtualMachine virtualMachine = mock(VirtualMachine.class);
-        when(vm.getVirtualMachine()).thenReturn(virtualMachine);
-        when(virtualMachine.getState()).thenReturn(State.Stopping);
-
-        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);
 
-        final ReleaseVmVspAnswer answer = mock(ReleaseVmVspAnswer.class);
+        final Answer answer = mock(Answer.class);
         when(answer.getResult()).thenReturn(true);
         when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
 
-        guru.release(nicProfile, vm, "aaaaa-fffff");
+        guru.reserve(nicProfile, network, vmProfile, mock(DeployDestination.class), mock(ReservationContext.class));
     }
 
     @Test
     public void testImplementNetwork() throws URISyntaxException, InsufficientVirtualNetworkCapacityException {
-        final Network network = mock(Network.class);
+        final NetworkVO network = mock(NetworkVO.class);
         when(network.getId()).thenReturn(NETWORK_ID);
         when(network.getUuid()).thenReturn("aaaaaa");
         when(network.getDataCenterId()).thenReturn(NETWORK_ID);
@@ -371,8 +357,11 @@ public class NuageVspGuestNetworkGuruTest {
         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(networkDao.acquireInLockTable(NETWORK_ID, 1200)).thenReturn(network);
+        when(nuageVspManager.getDnsDetails(network)).thenReturn(new ArrayList<String>());
+        when(nuageVspManager.getGatewaySystemIds()).thenReturn(new ArrayList<String>());
 
-        final ImplementNetworkVspAnswer answer = mock(ImplementNetworkVspAnswer.class);
+        final Answer answer = mock(Answer.class);
         when(answer.getResult()).thenReturn(true);
         when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
 
@@ -383,4 +372,95 @@ public class NuageVspGuestNetworkGuruTest {
         guru.implement(network, offering, deployDest, reserveContext);
     }
 
+    @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);
+
+        final NetworkOfferingVO offering = mock(NetworkOfferingVO.class);
+        when(offering.getId()).thenReturn(NETWORK_ID);
+        when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
+        when(ntwkOfferDao.findById(NETWORK_ID)).thenReturn(offering);
+
+        final DomainVO domain = mock(DomainVO.class);
+        when(domain.getUuid()).thenReturn("aaaaaa");
+        when(domainDao.findById(NETWORK_ID)).thenReturn(domain);
+
+        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);
+
+        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");
+
+        final VirtualMachine vm = mock(VirtualMachine.class);
+        when(vm.getType()).thenReturn(VirtualMachine.Type.User);
+        when(vm.getState()).thenReturn(VirtualMachine.State.Expunging);
+
+        final VirtualMachineProfile vmProfile = mock(VirtualMachineProfile.class);
+        when(vmProfile.getUuid()).thenReturn("aaaaaa");
+        when(vmProfile.getInstanceName()).thenReturn("Test-VM");
+        when(vmProfile.getVirtualMachine()).thenReturn(vm);
+
+        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);
+
+        final Answer answer = mock(Answer.class);
+        when(answer.getResult()).thenReturn(true);
+        when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
+
+        guru.deallocate(network, nicProfile, 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.getVpcId()).thenReturn(null);
+        when(networkDao.acquireInLockTable(NETWORK_ID, 1200)).thenReturn(network);
+
+        final NetworkOfferingVO offering = mock(NetworkOfferingVO.class);
+        when(offering.getId()).thenReturn(NETWORK_ID);
+        when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
+        when(ntwkOfferDao.findById(NETWORK_ID)).thenReturn(offering);
+
+        final DomainVO domain = mock(DomainVO.class);
+        when(domain.getUuid()).thenReturn("aaaaaa");
+        when(domainDao.findById(NETWORK_ID)).thenReturn(domain);
+
+        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)).thenReturn(new ArrayList<String>());
+        when(nuageVspManager.getGatewaySystemIds()).thenReturn(new ArrayList<String>());
+
+        final Answer answer = mock(Answer.class);
+        when(answer.getResult()).thenReturn(true);
+        when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
+
+        assertTrue(guru.trash(network, offering));
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/test/com/cloud/network/manager/NuageVspManagerTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/network/manager/NuageVspManagerTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/network/manager/NuageVspManagerTest.java
index a8bed6d..a29e3d7 100644
--- a/plugins/network-elements/nuage-vsp/test/com/cloud/network/manager/NuageVspManagerTest.java
+++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/manager/NuageVspManagerTest.java
@@ -19,16 +19,9 @@
 
 package com.cloud.network.manager;
 
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.ArrayList;
-
-import javax.naming.ConfigurationException;
-
-import org.junit.Before;
-import org.junit.Test;
-
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.sync.SyncNuageVspCmsIdAnswer;
 import com.cloud.api.commands.DeleteNuageVspDeviceCmd;
 import com.cloud.api.commands.ListNuageVspDevicesCmd;
 import com.cloud.host.HostVO;
@@ -42,6 +35,18 @@ import com.cloud.network.dao.PhysicalNetworkDao;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 import com.cloud.network.dao.PhysicalNetworkVO;
 import com.cloud.resource.ResourceManager;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.framework.config.impl.ConfigurationVO;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.naming.ConfigurationException;
+import java.util.ArrayList;
+
+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 NuageVspManagerTest {
     private static final long NETWORK_ID = 42L;
@@ -53,6 +58,8 @@ public class NuageVspManagerTest {
     NuageVspDao nuageVspDao = mock(NuageVspDao.class);
     NetworkDao networkDao = mock(NetworkDao.class);
     HostDao hostDao = mock(HostDao.class);
+    AgentManager agentManager = mock(AgentManager.class);
+    ConfigurationDao configDao = mock(ConfigurationDao.class);
 
     NuageVspManagerImpl manager;
 
@@ -67,6 +74,8 @@ public class NuageVspManagerTest {
         manager._nuageVspDao = nuageVspDao;
         manager._networkDao = networkDao;
         manager._hostDao = hostDao;
+        manager._agentMgr = agentManager;
+        manager._configDao = configDao;
     }
 
     @Test
@@ -91,6 +100,14 @@ public class NuageVspManagerTest {
         final DeleteNuageVspDeviceCmd cmd = mock(DeleteNuageVspDeviceCmd.class);
         when(cmd.getNuageVspDeviceId()).thenReturn(NETWORK_ID);
 
+        ConfigurationVO cmsIdConfig = mock(ConfigurationVO.class);
+        when(cmsIdConfig.getValue()).thenReturn("1:1");
+        when(configDao.findByName("nuagevsp.cms.id")).thenReturn(cmsIdConfig);
+
+        final SyncNuageVspCmsIdAnswer answer = mock(SyncNuageVspCmsIdAnswer.class);
+        when(answer.getResult()).thenReturn(true);
+        when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
+
         manager.deleteNuageVspDevice(cmd);
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/test/com/cloud/network/resource/NuageVspResourceTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/network/resource/NuageVspResourceTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/network/resource/NuageVspResourceTest.java
index db359b6..770e13f 100644
--- a/plugins/network-elements/nuage-vsp/test/com/cloud/network/resource/NuageVspResourceTest.java
+++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/resource/NuageVspResourceTest.java
@@ -19,46 +19,35 @@
 
 package com.cloud.network.resource;
 
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-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.NuageVspSyncClient;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
+import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.PingCommand;
 import com.cloud.agent.api.StartupCommand;
-import com.cloud.agent.api.element.ApplyAclRuleVspAnswer;
 import com.cloud.agent.api.element.ApplyAclRuleVspCommand;
-import com.cloud.agent.api.element.ApplyStaticNatVspAnswer;
 import com.cloud.agent.api.element.ApplyStaticNatVspCommand;
-import com.cloud.agent.api.element.ShutDownVpcVspAnswer;
 import com.cloud.agent.api.element.ShutDownVpcVspCommand;
-import com.cloud.agent.api.guru.DeallocateVmVspAnswer;
 import com.cloud.agent.api.guru.DeallocateVmVspCommand;
-import com.cloud.agent.api.guru.ImplementNetworkVspAnswer;
 import com.cloud.agent.api.guru.ImplementNetworkVspCommand;
-import com.cloud.agent.api.guru.ReleaseVmVspAnswer;
-import com.cloud.agent.api.guru.ReleaseVmVspCommand;
-import com.cloud.agent.api.guru.ReserveVmInterfaceVspAnswer;
 import com.cloud.agent.api.guru.ReserveVmInterfaceVspCommand;
-import com.cloud.agent.api.guru.TrashNetworkVspAnswer;
 import com.cloud.agent.api.guru.TrashNetworkVspCommand;
-import com.cloud.agent.api.sync.SyncVspAnswer;
 import com.cloud.agent.api.sync.SyncVspCommand;
 import com.cloud.host.Host;
+import com.google.common.collect.Maps;
+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.NuageVspSyncClient;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+
+import javax.naming.ConfigurationException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Map;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
 
 public class NuageVspResourceTest {
     NuageVspResource _resource;
@@ -66,9 +55,10 @@ public class NuageVspResourceTest {
     NuageVspElementClient _mockNuageVspElementClient = mock(NuageVspElementClient.class);
     NuageVspGuruClient _mockNuageVspGuruClient = mock(NuageVspGuruClient.class);
     NuageVspSyncClient _mockNuageVspSyncClient = mock(NuageVspSyncClient.class);
-    Map<String, Object> _parameters;
+    NuageVspResource.Configuration _resourceConfiguration;
+    Map<String, Object> _hostDetails;
 
-    Answer<Object> genericAnswer = new Answer<Object>() {
+    org.mockito.stubbing.Answer<Object> genericAnswer = new org.mockito.stubbing.Answer<Object>() {
         public Object answer(InvocationOnMock invocation) {
             return null;
         }
@@ -88,34 +78,36 @@ public class NuageVspResourceTest {
 
             }
 
-            protected void isNuageVspApiLoaded() throws Exception {
+            protected void isNuageVspApiLoaded() throws ConfigurationException {
             }
 
-            protected void isNuageVspGuruLoaded() throws Exception {
+            protected void isNuageVspGuruLoaded() throws ConfigurationException {
             }
 
-            protected void isNuageVspElementLoaded() throws Exception {
+            protected void isNuageVspElementLoaded() throws ConfigurationException {
             }
 
-            protected void isNuageVspSyncLoaded() throws Exception {
+            protected void isNuageVspSyncLoaded() throws ConfigurationException {
             }
 
-            protected void login() throws Exception {
+            protected void login() throws ConfigurationException {
             }
 
         };
 
-        _parameters = new HashMap<String, Object>();
-        _parameters.put("name", "nuagevsptestdevice");
-        _parameters.put("guid", "aaaaa-bbbbb-ccccc");
-        _parameters.put("zoneId", "blublub");
-        _parameters.put("hostname", "nuagevsd");
-        _parameters.put("cmsuser", "cmsuser");
-        _parameters.put("cmsuserpass", "cmsuserpass");
-        _parameters.put("port", "8443");
-        _parameters.put("apirelativepath", "nuage/api/v1_0");
-        _parameters.put("retrycount", "3");
-        _parameters.put("retryinterval", "3");
+        _resourceConfiguration = new NuageVspResource.Configuration()
+                .name("nuagevsptestdevice")
+                .guid("aaaaa-bbbbb-ccccc")
+                .zoneId("blublub")
+                .hostName("nuagevsd")
+                .cmsUser("cmsuser")
+                .cmsUserPassword("cmsuserpass")
+                .port("8443")
+                .apiVersion("v3_2")
+                .apiRelativePath("nuage/api/v3_2")
+                .retryCount("3")
+                .retryInterval("3");
+        _hostDetails = Maps.<String, Object>newHashMap(_resourceConfiguration.build());
     }
 
     @Test(expected = Exception.class)
@@ -125,7 +117,7 @@ public class NuageVspResourceTest {
 
     @Test
     public void resourceConfigure() throws Exception {
-        _resource.configure("NuageVspResource", _parameters);
+        _resource.configure("NuageVspResource", _hostDetails);
 
         assertTrue("nuagevsptestdevice".equals(_resource.getName()));
         assertTrue(_resource.getType() == Host.Type.L2Networking);
@@ -133,7 +125,7 @@ public class NuageVspResourceTest {
 
     @Test
     public void testInitialization() throws Exception {
-        _resource.configure("NuageVspResource", _parameters);
+        _resource.configure("NuageVspResource", _hostDetails);
 
         StartupCommand[] sc = _resource.initialize();
         assertTrue(sc.length == 1);
@@ -144,7 +136,7 @@ public class NuageVspResourceTest {
 
     @Test
     public void testPingCommandStatus() throws Exception {
-        _resource.configure("NuageVspResource", _parameters);
+        _resource.configure("NuageVspResource", _hostDetails);
 
         PingCommand ping = _resource.getCurrentStatus(42);
         assertTrue(ping != null);
@@ -154,99 +146,102 @@ public class NuageVspResourceTest {
 
     @Test
     public void testImplementNetworkVspCommand() throws Exception {
-        _resource.configure("NuageVspResource", _parameters);
-
-        ImplementNetworkVspCommand impNtwkCmd = new ImplementNetworkVspCommand("networkDomainName", "networkDomainPath", "networkDomainUuid", "networkAccountName",
-                "networkAccountUuid", "networkName", "networkCidr", "networkGateway", "networkUuid", true, "vpcName", "vpcUuid", true, new ArrayList<String>());
-        doAnswer(genericAnswer).when(_mockNuageVspGuruClient).implement("networkDomainName", "networkDomainPath", "networkDomainUuid", "networkAccountName", "networkAccountUuid",
-                "networkName", "networkCidr", "networkGateway", "networkUuid", true, "vpcName", "vpcUuid", true, new ArrayList<String>());
-        ImplementNetworkVspAnswer implNtwkAns = (ImplementNetworkVspAnswer)_resource.executeRequest(impNtwkCmd);
+        _resource.configure("NuageVspResource", _hostDetails);
+
+        ImplementNetworkVspCommand.Builder cmdBuilder = new ImplementNetworkVspCommand.Builder().networkDomainName("networkDomainName").networkDomainPath("networkDomainPath")
+                .networkDomainUuid("networkDomainUuid").networkAccountName("networkAccountName").networkAccountUuid("networkAccountUuid").networkName("networkName")
+                .networkCidr("networkCidr").networkGateway("networkGateway").networkAclId(0L).dnsServers(new ArrayList<String>()).gatewaySystemIds(new ArrayList<String>())
+                .networkUuid("networkUuid").isL3Network(true).isVpc(true).isSharedNetwork(true).vpcName("vpcName").vpcUuid("vpcUuid").defaultEgressPolicy(true)
+                .ipAddressRange(new ArrayList<String[]>()).domainTemplateName("domainTemplateName");
+        doAnswer(genericAnswer).when(_mockNuageVspGuruClient).implement("networkDomainName", "networkDomainPath", "networkDomainUuid", "networkAccountName",
+                "networkAccountUuid", "networkName", "networkCidr", "networkGateway", 0L, new ArrayList<String>(), new ArrayList<String>(), true, true, true, "networkUuid",
+                "vpcName", "vpcUuid", true, new ArrayList<String[]>(), "domainTemplateName");
+        com.cloud.agent.api.Answer implNtwkAns = _resource.executeRequest(cmdBuilder.build());
         assertTrue(implNtwkAns.getResult());
     }
 
     @Test
     public void testReserveVmInterfaceVspCommand() throws Exception {
-        _resource.configure("NuageVspResource", _parameters);
-
-        ReserveVmInterfaceVspCommand rsrvVmInfCmd = new ReserveVmInterfaceVspCommand("nicUuid", "nicMacAddress", "networkUuid", true, "vpcUuid", "networkDomainUuid",
-                "networksAccountUuid", false, "domainRouterIp", "vmInstanceName", "vmUuid", "vmUserName", "vmUserDomainName");
-        doAnswer(genericAnswer).when(_mockNuageVspGuruClient).reserve("nicUuid", "nicMacAddress", "networkUuid", true, "vpcUuid", "networkDomainUuid", "networksAccountUuid",
-                false, "domainRouterIp", "vmInstanceName", "vmUuid");
-        ReserveVmInterfaceVspAnswer rsrvVmInfAns = (ReserveVmInterfaceVspAnswer)_resource.executeRequest(rsrvVmInfCmd);
+        _resource.configure("NuageVspResource", _hostDetails);
+
+        ReserveVmInterfaceVspCommand.Builder cmdBuilder = new ReserveVmInterfaceVspCommand.Builder().nicUuid("nicUuid").nicMacAddress("nicMacAddress")
+                .networkUuid("networkUuid").isL3Network(true).isSharedNetwork(true).vpcUuid("vpcUuid").networkDomainUuid("networkDomainUuid")
+                .networksAccountUuid("networksAccountUuid").isDomainRouter(false).domainRouterIp("domainRouterIp").vmInstanceName("vmInstanceName").vmUuid("vmUuid")
+                .vmUserName("vmUserName").vmUserDomainName("vmUserDomainName").useStaticIp(true).staticIp("staticIp").staticNatIpUuid("staticNatIpUuid")
+                .staticNatIpAddress("staticNatIpAddress").isStaticNatIpAllocated(true).isOneToOneNat(true).staticNatVlanUuid("staticNatVlanUuid")
+                .staticNatVlanGateway("staticNatVlanGateway").staticNatVlanNetmask("staticNatVlanNetmask");
+        doAnswer(genericAnswer).when(_mockNuageVspGuruClient).reserve("nicUuid", "nicMacAddress", "networkUuid", true, true, "vpcUuid", "networkDomainUuid",
+                "networksAccountUuid", false, "domainRouterIp", "vmInstanceName", "vmUuid", true, "staticIp", "staticNatIpUuid", "staticNatIpAddress",
+                true, true, "staticNatVlanUuid", "staticNatVlanGateway", "staticNatVlanNetmask");
+        Answer rsrvVmInfAns = _resource.executeRequest(cmdBuilder.build());
         assertTrue(rsrvVmInfAns.getResult());
     }
 
     @Test
-    public void testReleaseVmVspCommand() throws Exception {
-        _resource.configure("NuageVspResource", _parameters);
-
-        ReleaseVmVspCommand releaseVmCmd = new ReleaseVmVspCommand("networkUuid", "vmUuid", "vmInstanceName");
-        doAnswer(genericAnswer).when(_mockNuageVspGuruClient).release("networkUuid", "vmUuid", "vmInstanceName");
-        ReleaseVmVspAnswer releaseVmAns = (ReleaseVmVspAnswer)_resource.executeRequest(releaseVmCmd);
-        assertTrue(releaseVmAns.getResult());
-    }
-
-    @Test
     public void testDeallocateVmVspCommand() throws Exception {
-        _resource.configure("NuageVspResource", _parameters);
-
-        DeallocateVmVspCommand dellocateVmCmd = new DeallocateVmVspCommand("networkUuid", "nicFrmDdUuid", "nicMacAddress", "nicIp4Address", true, "vpcUuid", "networksDomainUuid",
-                "vmInstanceName", "vmUuid");
-        doAnswer(genericAnswer).when(_mockNuageVspGuruClient).deallocate("networkUuid", "nicFrmDdUuid", "nicMacAddress", "nicIp4Address", true, "vpcUuid", "networksDomainUuid",
-                "vmInstanceName", "vmUuid");
-        DeallocateVmVspAnswer dellocateVmAns = (DeallocateVmVspAnswer)_resource.executeRequest(dellocateVmCmd);
+        _resource.configure("NuageVspResource", _hostDetails);
+
+        DeallocateVmVspCommand.Builder cmdBuilder = new DeallocateVmVspCommand.Builder().networkUuid("networkUuid").nicFromDbUuid("nicFromDbUuid")
+                .nicMacAddress("nicMacAddress").nicIp4Address("nicIp4Address").isL3Network(true).isSharedNetwork(true).vpcUuid("vpcUuid")
+                .networksDomainUuid("networksDomainUuid").vmInstanceName("vmInstanceName").vmUuid("vmUuid").isExpungingState(true);
+        doAnswer(genericAnswer).when(_mockNuageVspGuruClient).deallocate("networkUuid", "nicFrmDdUuid", "nicMacAddress", "nicIp4Address", true, true, "vpcUuid", "networksDomainUuid",
+                "vmInstanceName", "vmUuid", true);
+        Answer dellocateVmAns = _resource.executeRequest(cmdBuilder.build());
         assertTrue(dellocateVmAns.getResult());
     }
 
     @Test
     public void testTrashNetworkVspCommand() throws Exception {
-        _resource.configure("NuageVspResource", _parameters);
+        _resource.configure("NuageVspResource", _hostDetails);
 
-        TrashNetworkVspCommand trashNtwkCmd = new TrashNetworkVspCommand("domainUuid", "networkUuid", true, "vpcUuid");
-        doAnswer(genericAnswer).when(_mockNuageVspGuruClient).trash("domainUuid", "networkUuid", true, "vpcUuid");
-        TrashNetworkVspAnswer trashNtwkAns = (TrashNetworkVspAnswer)_resource.executeRequest(trashNtwkCmd);
+        TrashNetworkVspCommand.Builder cmdBuilder = new TrashNetworkVspCommand.Builder().domainUuid("domainUuid").networkUuid("networkUuid")
+                .isL3Network(true).isSharedNetwork(true).vpcUuid("vpcUuid").domainTemplateName("domainTemplateName");
+        doAnswer(genericAnswer).when(_mockNuageVspGuruClient).trash("domainUuid", "networkUuid", true, true, "vpcUuid", "domainTemplateName");
+        Answer trashNtwkAns = _resource.executeRequest(cmdBuilder.build());
         assertTrue(trashNtwkAns.getResult());
     }
 
     @Test
     public void testApplyStaticNatVspCommand() throws Exception {
-        _resource.configure("NuageVspResource", _parameters);
+        _resource.configure("NuageVspResource", _hostDetails);
 
-        ApplyStaticNatVspCommand applyNatCmd = new ApplyStaticNatVspCommand("networkDomainUuid", "vpcOrSubnetUuid", true, new ArrayList<Map<String, Object>>());
-        doAnswer(genericAnswer).when(_mockNuageVspElementClient).applyStaticNats("networkDomainUuid", "vpcOrSubnetUuid", true, new ArrayList<Map<String, Object>>());
-        ApplyStaticNatVspAnswer applyNatAns = (ApplyStaticNatVspAnswer)_resource.executeRequest(applyNatCmd);
+        ApplyStaticNatVspCommand.Builder cmdBuilder = new ApplyStaticNatVspCommand.Builder().networkDomainUuid("networkDomainUuid").networkUuid("networkUuid")
+                .vpcOrSubnetUuid("vpcOrSubnetUuid").isL3Network(true).isVpc(true).staticNatDetails(new ArrayList<Map<String, Object>>());
+        doAnswer(genericAnswer).when(_mockNuageVspElementClient).applyStaticNats("networkDomainUuid", "networkUuid", "vpcOrSubnetUuid", true, true, new ArrayList<Map<String, Object>>());
+        Answer applyNatAns = _resource.executeRequest(cmdBuilder.build());
         assertTrue(applyNatAns.getResult());
     }
 
     @Test
     public void testApplyAclRuleVspCommand() throws Exception {
-        _resource.configure("NuageVspResource", _parameters);
-
-        ApplyAclRuleVspCommand applyAclCmd = new ApplyAclRuleVspCommand("networkUuid", "networkDomainUuid", "vpcOrSubnetUuid", true, new ArrayList<Map<String, Object>>(), false,
-                100);
-        doAnswer(genericAnswer).when(_mockNuageVspElementClient).applyAclRules("networkUuid", "networkDomainUuid", "vpcOrSubnetUuid", true, new ArrayList<Map<String, Object>>(),
-                false, 100);
-        ApplyAclRuleVspAnswer applyAclAns = (ApplyAclRuleVspAnswer)_resource.executeRequest(applyAclCmd);
+        _resource.configure("NuageVspResource", _hostDetails);
+
+        ApplyAclRuleVspCommand.Builder cmdBuilder = new ApplyAclRuleVspCommand.Builder().networkAcl(true).networkUuid("networkUuid").networkDomainUuid("networkDomainUuid")
+                .vpcOrSubnetUuid("vpcOrSubnetUuid").networkName("networkName").isL2Network(true).aclRules(new ArrayList<Map<String, Object>>()).networkId(100)
+                .egressDefaultPolicy(false).acsIngressAcl(true).networkReset(true).domainTemplateName("domainTemplateName");
+        doAnswer(genericAnswer).when(_mockNuageVspElementClient).applyAclRules(true, "networkUuid", "networkDomainUuid", "vpcOrSubnetUuid", "networkName", true,
+        new ArrayList<Map<String, Object>>(), 100, false, true, true, "domainTemplateName");
+        Answer applyAclAns = _resource.executeRequest(cmdBuilder.build());
         assertTrue(applyAclAns.getResult());
     }
 
     @Test
     public void testShutDownVpcVspCommand() throws Exception {
-        _resource.configure("NuageVspResource", _parameters);
+        _resource.configure("NuageVspResource", _hostDetails);
 
-        ShutDownVpcVspCommand shutVpcCmd = new ShutDownVpcVspCommand("domainUuid", "vpcUuid");
-        doAnswer(genericAnswer).when(_mockNuageVspElementClient).shutDownVpc("domainUuid", "vpcUuid");
-        ShutDownVpcVspAnswer shutVpcAns = (ShutDownVpcVspAnswer)_resource.executeRequest(shutVpcCmd);
+        ShutDownVpcVspCommand.Builder cmdBuilder = new ShutDownVpcVspCommand.Builder().domainUuid("domainUuid").vpcUuid("vpcUuid").domainTemplateName("domainTemplateName");
+        doAnswer(genericAnswer).when(_mockNuageVspElementClient).shutdownVpc("domainUuid", "vpcUuid", "domainTemplateName");
+        Answer shutVpcAns = _resource.executeRequest(cmdBuilder.build());
         assertTrue(shutVpcAns.getResult());
     }
 
     @Test
     public void testSyncVspCommand() throws Exception {
-        _resource.configure("NuageVspResource", _parameters);
+        _resource.configure("NuageVspResource", _hostDetails);
 
         SyncVspCommand shutVpcCmd = new SyncVspCommand("nuageVspEntity");
         doAnswer(genericAnswer).when(_mockNuageVspSyncClient).syncWithNuageVsp("nuageVspEntity");
-        SyncVspAnswer shutVpcAns = (SyncVspAnswer)_resource.executeRequest(shutVpcCmd);
+        Answer shutVpcAns = _resource.executeRequest(shutVpcCmd);
         assertTrue(shutVpcAns.getResult());
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/test/com/cloud/network/sync/NuageVspSyncTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/network/sync/NuageVspSyncTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/network/sync/NuageVspSyncTest.java
index f9e503d..23430d4 100644
--- a/plugins/network-elements/nuage-vsp/test/com/cloud/network/sync/NuageVspSyncTest.java
+++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/sync/NuageVspSyncTest.java
@@ -19,23 +19,22 @@
 
 package com.cloud.network.sync;
 
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.Arrays;
-
-import org.junit.Before;
-import org.junit.Test;
-
 import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
-import com.cloud.agent.api.sync.SyncVspAnswer;
 import com.cloud.host.HostVO;
 import com.cloud.host.dao.HostDao;
 import com.cloud.network.NuageVspDeviceVO;
 import com.cloud.network.dao.NuageVspDao;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+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 NuageVspSyncTest {
     private static final long NETWORK_ID = 42L;
@@ -64,7 +63,7 @@ public class NuageVspSyncTest {
         when(host.getId()).thenReturn(NETWORK_ID);
         when(hostDao.findById(NETWORK_ID)).thenReturn(host);
 
-        final SyncVspAnswer answer = mock(SyncVspAnswer.class);
+        final Answer answer = mock(Answer.class);
         when(answer.getResult()).thenReturn(true);
         when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 69e70e6..ccbc0b0 100644
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -4602,10 +4602,11 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
     @Override
     public boolean isOfferingForVpc(final NetworkOffering offering) {
         final boolean vpcProvider = _ntwkOffServiceMapDao.isProviderForNetworkOffering(offering.getId(), Provider.VPCVirtualRouter) ||
-                _ntwkOffServiceMapDao.isProviderForNetworkOffering(offering.getId(), Provider.JuniperContrailVpcRouter) ||
-                _ntwkOffServiceMapDao.getDistinctProviders(offering.getId()).contains(Provider.NuageVsp.getName());
+                _ntwkOffServiceMapDao.isProviderForNetworkOffering(offering.getId(), Provider.JuniperContrailVpcRouter);
+        final boolean nuageVpcProvider = _ntwkOffServiceMapDao.getDistinctProviders(offering.getId()).contains(Provider.NuageVsp.getName())
+                && offering.getIsPersistent();
 
-        return vpcProvider;
+        return vpcProvider || nuageVpcProvider;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/server/src/com/cloud/network/guru/DirectNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
index 9686f80..018ab90 100644
--- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
@@ -21,6 +21,7 @@ import java.util.List;
 import javax.ejb.Local;
 import javax.inject.Inject;
 
+import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 import org.apache.log4j.Logger;
 
@@ -98,6 +99,8 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
     NicDao _nicDao;
     @Inject
     IpAddressManager _ipAddrMgr;
+    @Inject
+    NetworkOfferingServiceMapDao _ntwkOfferingSrvcDao;
 
     private static final TrafficType[] TrafficTypes = {TrafficType.Guest};
 
@@ -118,7 +121,8 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
 
     protected boolean canHandle(NetworkOffering offering, DataCenter dc) {
         // this guru handles only Guest networks in Advance zone with source nat service disabled
-        if (dc.getNetworkType() == NetworkType.Advanced && isMyTrafficType(offering.getTrafficType()) && offering.getGuestType() == GuestType.Shared) {
+        if (dc.getNetworkType() == NetworkType.Advanced && isMyTrafficType(offering.getTrafficType()) && offering.getGuestType() == GuestType.Shared
+                && !_ntwkOfferingSrvcDao.isProviderForNetworkOffering(offering.getId(), Network.Provider.NuageVsp)) {
             return true;
         } else {
             s_logger.trace("We only take care of Guest networks of type " + GuestType.Shared);


[5/7] git commit: updated refs/heads/master to 95ae796

Posted by re...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspCommand.java
index 0ffbda4..575e57d 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspCommand.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspCommand.java
@@ -19,30 +19,39 @@
 
 package com.cloud.agent.api.guru;
 
-import java.util.Collection;
-
+import com.cloud.agent.api.CmdBuilder;
 import com.cloud.agent.api.Command;
 
+import java.util.Collection;
+import java.util.List;
+
 public class ImplementNetworkVspCommand extends Command {
 
-    String _networkDomainName;
-    String _networkDomainPath;
-    String _networkDomainUuid;
-    String _networkAccountName;
-    String _networkAccountUuid;
-    String _networkName;
-    String _networkCidr;
-    String _networkGateway;
-    String _networkUuid;
-    boolean _isL3Network;
-    String _vpcName;
-    String _vpcUuid;
-    boolean _defaultEgressPolicy;
-    Collection<String> _ipAddressRange;
-
-    public ImplementNetworkVspCommand(String networkDomainName, String networkDomainPath, String networkDomainUuid, String networkAccountName, String networkAccountUuid,
-            String networkName, String networkCidr, String networkGateway, String networkUuid, boolean isL3Network, String vpcName, String vpcUuid, boolean defaultEgressPolicy,
-            Collection<String> ipAddressRange) {
+    private final String _networkDomainName;
+    private final String _networkDomainPath;
+    private final String _networkDomainUuid;
+    private final String _networkAccountName;
+    private final String _networkAccountUuid;
+    private final String _networkName;
+    private final String _networkCidr;
+    private final String _networkGateway;
+    private final Long _networkAclId;
+    private final List<String> _dnsServers;
+    private final List<String> _gatewaySystemIds;
+    private final String _networkUuid;
+    private final boolean _isL3Network;
+    private final boolean _isVpc;
+    private final boolean _isSharedNetwork;
+    private final String _vpcName;
+    private final String _vpcUuid;
+    private final boolean _defaultEgressPolicy;
+    private final List<String[]> _ipAddressRange;
+    private final String _domainTemplateName;
+
+    private ImplementNetworkVspCommand(String networkDomainName, String networkDomainPath, String networkDomainUuid, String networkAccountName, String networkAccountUuid,
+            String networkName, String networkCidr, String networkGateway, Long networkAclId, List<String> dnsServers, List<String> gatewaySystemIds, String networkUuid,
+            boolean isL3Network, boolean isVpc, boolean isSharedNetwork, String vpcName, String vpcUuid, boolean defaultEgressPolicy, List<String[]> ipAddressRange,
+            String domainTemplateName) {
         super();
         this._networkDomainName = networkDomainName;
         this._networkDomainPath = networkDomainPath;
@@ -52,12 +61,18 @@ public class ImplementNetworkVspCommand extends Command {
         this._networkName = networkName;
         this._networkCidr = networkCidr;
         this._networkGateway = networkGateway;
+        this._networkAclId = networkAclId;
+        this._dnsServers = dnsServers;
+        this._gatewaySystemIds = gatewaySystemIds;
         this._networkUuid = networkUuid;
         this._isL3Network = isL3Network;
+        this._isVpc = isVpc;
+        this._isSharedNetwork = isSharedNetwork;
         this._vpcName = vpcName;
         this._vpcUuid = vpcUuid;
         this._defaultEgressPolicy = defaultEgressPolicy;
         this._ipAddressRange = ipAddressRange;
+        this._domainTemplateName = domainTemplateName;
     }
 
     public String getNetworkDomainName() {
@@ -92,6 +107,18 @@ public class ImplementNetworkVspCommand extends Command {
         return _networkGateway;
     }
 
+    public Long getNetworkAclId() {
+        return _networkAclId;
+    }
+
+    public List<String> getDnsServers() {
+        return _dnsServers;
+    }
+
+    public List<String> getGatewaySystemIds() {
+        return _gatewaySystemIds;
+    }
+
     public String getNetworkUuid() {
         return _networkUuid;
     }
@@ -100,6 +127,14 @@ public class ImplementNetworkVspCommand extends Command {
         return _isL3Network;
     }
 
+    public boolean isVpc() {
+        return _isVpc;
+    }
+
+    public boolean isSharedNetwork() {
+        return _isSharedNetwork;
+    }
+
     public String getVpcName() {
         return _vpcName;
     }
@@ -112,13 +147,214 @@ public class ImplementNetworkVspCommand extends Command {
         return _defaultEgressPolicy;
     }
 
-    public Collection<String> getIpAddressRange() {
+    public Collection<String[]> getIpAddressRange() {
         return _ipAddressRange;
     }
 
+    public String getDomainTemplateName() {
+        return _domainTemplateName;
+    }
+
+    public static class Builder implements CmdBuilder<ImplementNetworkVspCommand> {
+        private String _networkDomainName;
+        private String _networkDomainPath;
+        private String _networkDomainUuid;
+        private String _networkAccountName;
+        private String _networkAccountUuid;
+        private String _networkName;
+        private String _networkCidr;
+        private String _networkGateway;
+        private Long _networkAclId;
+        private List<String> _dnsServers;
+        private List<String> _gatewaySystemIds;
+        private String _networkUuid;
+        private boolean _isL3Network;
+        private boolean _isVpc;
+        private boolean _isSharedNetwork;
+        private String _vpcName;
+        private String _vpcUuid;
+        private boolean _defaultEgressPolicy;
+        private List<String[]> _ipAddressRange;
+        private String _domainTemplateName;
+
+        public Builder networkDomainName(String networkDomainName) {
+            this._networkDomainName = networkDomainName;
+            return this;
+        }
+
+        public Builder networkDomainPath(String networkDomainPath) {
+            this._networkDomainPath = networkDomainPath;
+            return this;
+        }
+
+        public Builder networkDomainUuid(String networkDomainUuid) {
+            this._networkDomainUuid = networkDomainUuid;
+            return this;
+        }
+
+        public Builder networkAccountName(String networkAccountName) {
+            this._networkAccountName = networkAccountName;
+            return this;
+        }
+
+        public Builder networkAccountUuid(String networkAccountUuid) {
+            this._networkAccountUuid = networkAccountUuid;
+            return this;
+        }
+
+        public Builder networkName(String networkName) {
+            this._networkName = networkName;
+            return this;
+        }
+
+        public Builder networkCidr(String networkCidr) {
+            this._networkCidr = networkCidr;
+            return this;
+        }
+
+        public Builder networkGateway(String networkGateway) {
+            this._networkGateway = networkGateway;
+            return this;
+        }
+
+        public Builder networkAclId(Long networkAclId) {
+            this._networkAclId = networkAclId;
+            return this;
+        }
+
+        public Builder dnsServers(List<String> dnsServers) {
+            this._dnsServers = dnsServers;
+            return this;
+        }
+
+        public Builder gatewaySystemIds(List<String> gatewaySystemIds) {
+            this._gatewaySystemIds = gatewaySystemIds;
+            return this;
+        }
+
+        public Builder networkUuid(String networkUuid) {
+            this._networkUuid = networkUuid;
+            return this;
+        }
+
+        public Builder isL3Network(boolean isL3Network) {
+            this._isL3Network = isL3Network;
+            return this;
+        }
+
+        public Builder isVpc(boolean isVpc) {
+            this._isVpc = isVpc;
+            return this;
+        }
+
+        public Builder isSharedNetwork(boolean isSharedNetwork) {
+            this._isSharedNetwork = isSharedNetwork;
+            return this;
+        }
+
+        public Builder vpcName(String vpcName) {
+            this._vpcName = vpcName;
+            return this;
+        }
+
+        public Builder vpcUuid(String vpcUuid) {
+            this._vpcUuid = vpcUuid;
+            return this;
+        }
+
+        public Builder defaultEgressPolicy(boolean defaultEgressPolicy) {
+            this._defaultEgressPolicy = defaultEgressPolicy;
+            return this;
+        }
+
+        public Builder ipAddressRange(List<String[]> ipAddressRange) {
+            this._ipAddressRange = ipAddressRange;
+            return this;
+        }
+
+        public Builder domainTemplateName(String domainTemplateName) {
+            this._domainTemplateName = domainTemplateName;
+            return this;
+        }
+
+        @Override
+        public ImplementNetworkVspCommand build() {
+            return new ImplementNetworkVspCommand(_networkDomainName, _networkDomainPath, _networkDomainUuid, _networkAccountName, _networkAccountUuid, _networkName,
+                    _networkCidr, _networkGateway, _networkAclId, _dnsServers, _gatewaySystemIds, _networkUuid, _isL3Network, _isVpc, _isSharedNetwork, _vpcName, _vpcUuid,
+                    _defaultEgressPolicy, _ipAddressRange, _domainTemplateName);
+        }
+    }
+
     @Override
     public boolean executeInSequence() {
         return false;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ImplementNetworkVspCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        ImplementNetworkVspCommand that = (ImplementNetworkVspCommand) o;
+
+        if (_defaultEgressPolicy != that._defaultEgressPolicy) return false;
+        if (_isL3Network != that._isL3Network) return false;
+        if (_isSharedNetwork != that._isSharedNetwork) return false;
+        if (_isVpc != that._isVpc) return false;
+        if (_dnsServers != null ? !_dnsServers.equals(that._dnsServers) : that._dnsServers != null) return false;
+        if (_domainTemplateName != null ? !_domainTemplateName.equals(that._domainTemplateName) : that._domainTemplateName != null)
+            return false;
+        if (_gatewaySystemIds != null ? !_gatewaySystemIds.equals(that._gatewaySystemIds) : that._gatewaySystemIds != null)
+            return false;
+        if (_ipAddressRange != null ? !_ipAddressRange.equals(that._ipAddressRange) : that._ipAddressRange != null)
+            return false;
+        if (_networkAccountName != null ? !_networkAccountName.equals(that._networkAccountName) : that._networkAccountName != null)
+            return false;
+        if (_networkAccountUuid != null ? !_networkAccountUuid.equals(that._networkAccountUuid) : that._networkAccountUuid != null)
+            return false;
+        if (_networkAclId != null ? !_networkAclId.equals(that._networkAclId) : that._networkAclId != null)
+            return false;
+        if (_networkCidr != null ? !_networkCidr.equals(that._networkCidr) : that._networkCidr != null) return false;
+        if (_networkDomainName != null ? !_networkDomainName.equals(that._networkDomainName) : that._networkDomainName != null)
+            return false;
+        if (_networkDomainPath != null ? !_networkDomainPath.equals(that._networkDomainPath) : that._networkDomainPath != null)
+            return false;
+        if (_networkDomainUuid != null ? !_networkDomainUuid.equals(that._networkDomainUuid) : that._networkDomainUuid != null)
+            return false;
+        if (_networkGateway != null ? !_networkGateway.equals(that._networkGateway) : that._networkGateway != null)
+            return false;
+        if (_networkName != null ? !_networkName.equals(that._networkName) : that._networkName != null) return false;
+        if (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false;
+        if (_vpcName != null ? !_vpcName.equals(that._vpcName) : that._vpcName != null) return false;
+        if (_vpcUuid != null ? !_vpcUuid.equals(that._vpcUuid) : that._vpcUuid != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_networkDomainName != null ? _networkDomainName.hashCode() : 0);
+        result = 31 * result + (_networkDomainPath != null ? _networkDomainPath.hashCode() : 0);
+        result = 31 * result + (_networkDomainUuid != null ? _networkDomainUuid.hashCode() : 0);
+        result = 31 * result + (_networkAccountName != null ? _networkAccountName.hashCode() : 0);
+        result = 31 * result + (_networkAccountUuid != null ? _networkAccountUuid.hashCode() : 0);
+        result = 31 * result + (_networkName != null ? _networkName.hashCode() : 0);
+        result = 31 * result + (_networkCidr != null ? _networkCidr.hashCode() : 0);
+        result = 31 * result + (_networkGateway != null ? _networkGateway.hashCode() : 0);
+        result = 31 * result + (_networkAclId != null ? _networkAclId.hashCode() : 0);
+        result = 31 * result + (_dnsServers != null ? _dnsServers.hashCode() : 0);
+        result = 31 * result + (_gatewaySystemIds != null ? _gatewaySystemIds.hashCode() : 0);
+        result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0);
+        result = 31 * result + (_isL3Network ? 1 : 0);
+        result = 31 * result + (_isVpc ? 1 : 0);
+        result = 31 * result + (_isSharedNetwork ? 1 : 0);
+        result = 31 * result + (_vpcName != null ? _vpcName.hashCode() : 0);
+        result = 31 * result + (_vpcUuid != null ? _vpcUuid.hashCode() : 0);
+        result = 31 * result + (_defaultEgressPolicy ? 1 : 0);
+        result = 31 * result + (_ipAddressRange != null ? _ipAddressRange.hashCode() : 0);
+        result = 31 * result + (_domainTemplateName != null ? _domainTemplateName.hashCode() : 0);
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspAnswer.java
deleted file mode 100644
index 8bc8e4c..0000000
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspAnswer.java
+++ /dev/null
@@ -1,34 +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.agent.api.guru;
-
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
-
-public class ReleaseVmVspAnswer extends Answer {
-
-    public ReleaseVmVspAnswer(Command command, Exception e) {
-        super(command, e);
-    }
-
-    public ReleaseVmVspAnswer(ReleaseVmVspCommand cmd, boolean success, String details) {
-        super(cmd, success, details);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspCommand.java
deleted file mode 100644
index 9a6a4d7..0000000
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspCommand.java
+++ /dev/null
@@ -1,54 +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.agent.api.guru;
-
-import com.cloud.agent.api.Command;
-
-public class ReleaseVmVspCommand extends Command {
-
-    String _networkUuid;
-    String _vmUuid;
-    String _vmInstanceName;
-
-    public ReleaseVmVspCommand(String networkUuid, String vmUuid, String vmInstanceName) {
-        super();
-        this._networkUuid = networkUuid;
-        this._vmUuid = vmUuid;
-        this._vmInstanceName = vmInstanceName;
-    }
-
-    public String getNetworkUuid() {
-        return _networkUuid;
-    }
-
-    public String getVmUuid() {
-        return _vmUuid;
-    }
-
-    public String getVmInstanceName() {
-        return _vmInstanceName;
-    }
-
-    @Override
-    public boolean executeInSequence() {
-        return false;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspAnswer.java
deleted file mode 100644
index 8fabbef..0000000
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspAnswer.java
+++ /dev/null
@@ -1,44 +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.agent.api.guru;
-
-import java.util.List;
-import java.util.Map;
-
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
-
-public class ReserveVmInterfaceVspAnswer extends Answer {
-
-    public List<Map<String, String>> _interfaceDetails;
-
-    public ReserveVmInterfaceVspAnswer(Command cmd, List<Map<String, String>> interfaceDetails, String details) {
-        super(cmd, true, details);
-        this._interfaceDetails = interfaceDetails;
-    }
-
-    public ReserveVmInterfaceVspAnswer(Command cmd, Exception e) {
-        super(cmd, e);
-    }
-
-    public List<Map<String, String>> getInterfaceDetails() {
-        return this._interfaceDetails;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspCommand.java
index 6844bf9..abcd0f2 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspCommand.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspCommand.java
@@ -19,31 +19,45 @@
 
 package com.cloud.agent.api.guru;
 
+import com.cloud.agent.api.CmdBuilder;
 import com.cloud.agent.api.Command;
 
 public class ReserveVmInterfaceVspCommand extends Command {
 
-    String _nicUuid;
-    String _nicMacAddress;
-    String _networkUuid;
-    boolean _isL3Network;
-    String _vpcUuid;
-    String _networkDomainUuid;
-    String _networksAccountUuid;
-    boolean _isDomainRouter;
-    String _domainRouterIp;
-    String _vmInstanceName;
-    String _vmUuid;
-    String _vmUserName;
-    String _vmUserDomainName;
-
-    public ReserveVmInterfaceVspCommand(String nicUuid, String nicMacAddress, String networkUuid, boolean isL3Network, String vpcUuid, String networkDomainUuid,
-            String networksAccountUuid, boolean isDomainRouter, String domainRouterIp, String vmInstanceName, String vmUuid, String vmUserName, String vmUserDomainName) {
+    private final String _nicUuid;
+    private final String _nicMacAddress;
+    private final String _networkUuid;
+    private final boolean _isL3Network;
+    private final boolean _isSharedNetwork;
+    private final String _vpcUuid;
+    private final String _networkDomainUuid;
+    private final String _networksAccountUuid;
+    private final boolean _isDomainRouter;
+    private final String _domainRouterIp;
+    private final String _vmInstanceName;
+    private final String _vmUuid;
+    private final String _vmUserName;
+    private final String _vmUserDomainName;
+    private final boolean _useStaticIp;
+    private final String _staticIp;
+    private final String _staticNatIpUuid;
+    private final String _staticNatIpAddress;
+    private final boolean _isStaticNatIpAllocated;
+    private final boolean _isOneToOneNat;
+    private final String _staticNatVlanUuid;
+    private final String _staticNatVlanGateway;
+    private final String _staticNatVlanNetmask;
+
+    private ReserveVmInterfaceVspCommand(String nicUuid, String nicMacAddress, String networkUuid, boolean isL3Network, boolean isSharedNetwork, String vpcUuid, String networkDomainUuid,
+            String networksAccountUuid, boolean isDomainRouter, String domainRouterIp, String vmInstanceName, String vmUuid, String vmUserName, String vmUserDomainName,
+            boolean useStaticIp, String staticIp, String staticNatIpUuid, String staticNatIpAddress, boolean isStaticNatIpAllocated, boolean isOneToOneNat, String staticNatVlanUuid,
+            String staticNatVlanGateway, String staticNatVlanNetmask) {
         super();
         this._nicUuid = nicUuid;
         this._nicMacAddress = nicMacAddress;
         this._networkUuid = networkUuid;
         this._isL3Network = isL3Network;
+        this._isSharedNetwork = isSharedNetwork;
         this._vpcUuid = vpcUuid;
         this._networkDomainUuid = networkDomainUuid;
         this._networksAccountUuid = networksAccountUuid;
@@ -53,6 +67,15 @@ public class ReserveVmInterfaceVspCommand extends Command {
         this._vmUuid = vmUuid;
         this._vmUserName = vmUserName;
         this._vmUserDomainName = vmUserDomainName;
+        this._useStaticIp = useStaticIp;
+        this._staticIp = staticIp;
+        this._staticNatIpUuid = staticNatIpUuid;
+        this._staticNatIpAddress = staticNatIpAddress;
+        this._isStaticNatIpAllocated = isStaticNatIpAllocated;
+        this._isOneToOneNat = isOneToOneNat;
+        this._staticNatVlanUuid = staticNatVlanUuid;
+        this._staticNatVlanGateway = staticNatVlanGateway;
+        this._staticNatVlanNetmask = staticNatVlanNetmask;
     }
 
     public String getNicUuid() {
@@ -71,6 +94,10 @@ public class ReserveVmInterfaceVspCommand extends Command {
         return _isL3Network;
     }
 
+    public boolean isSharedNetwork() {
+        return _isSharedNetwork;
+    }
+
     public String getVpcUuid() {
         return _vpcUuid;
     }
@@ -87,29 +114,287 @@ public class ReserveVmInterfaceVspCommand extends Command {
         return _isDomainRouter;
     }
 
-    public String _getDomainRouterIp() {
+    public String getDomainRouterIp() {
         return _domainRouterIp;
     }
 
-    public String _getVmInstanceName() {
+    public String getVmInstanceName() {
         return _vmInstanceName;
     }
 
-    public String _getVmUuid() {
+    public String getVmUuid() {
         return _vmUuid;
     }
 
-    public String _getVmUserName() {
+    public String getVmUserName() {
         return _vmUserName;
     }
 
-    public String _getVmUserDomainName() {
+    public String getVmUserDomainName() {
         return _vmUserDomainName;
     }
 
+    public boolean useStaticIp() {
+        return _useStaticIp;
+    }
+
+    public String getStaticIp() {
+        return _staticIp;
+    }
+
+    public String getStaticNatIpUuid() {
+        return _staticNatIpUuid;
+    }
+
+    public String getStaticNatIpAddress() {
+        return _staticNatIpAddress;
+    }
+
+    public boolean isStaticNatIpAllocated() {
+        return _isStaticNatIpAllocated;
+    }
+
+    public boolean isOneToOneNat() {
+        return _isOneToOneNat;
+    }
+
+    public String getStaticNatVlanUuid() {
+        return _staticNatVlanUuid;
+    }
+
+    public String getStaticNatVlanGateway() {
+        return _staticNatVlanGateway;
+    }
+
+    public String getStaticNatVlanNetmask() {
+        return _staticNatVlanNetmask;
+    }
+
+    public static class Builder implements CmdBuilder<ReserveVmInterfaceVspCommand> {
+        private String _nicUuid;
+        private String _nicMacAddress;
+        private String _networkUuid;
+        private boolean _isL3Network;
+        private boolean _isSharedNetwork;
+        private String _vpcUuid;
+        private String _networkDomainUuid;
+        private String _networksAccountUuid;
+        private boolean _isDomainRouter;
+        private String _domainRouterIp;
+        private String _vmInstanceName;
+        private String _vmUuid;
+        private String _vmUserName;
+        private String _vmUserDomainName;
+        private boolean _useStaticIp;
+        private String _staticIp;
+        private String _staticNatIpUuid;
+        private String _staticNatIpAddress;
+        private boolean _isStaticNatIpAllocated;
+        private boolean _isOneToOneNat;
+        private String _staticNatVlanUuid;
+        private String _staticNatVlanGateway;
+        private String _staticNatVlanNetmask;
+
+        public Builder nicUuid(String nicUuid) {
+            this._nicUuid = nicUuid;
+            return this;
+        }
+
+        public Builder nicMacAddress(String nicMacAddress) {
+            this._nicMacAddress = nicMacAddress;
+            return this;
+        }
+
+        public Builder networkUuid(String networkUuid) {
+            this._networkUuid = networkUuid;
+            return this;
+        }
+
+        public Builder isL3Network(boolean isL3Network) {
+            this._isL3Network = isL3Network;
+            return this;
+        }
+
+        public Builder isSharedNetwork(boolean isSharedNetwork) {
+            this._isSharedNetwork = isSharedNetwork;
+            return this;
+        }
+
+        public Builder vpcUuid(String vpcUuid) {
+            this._vpcUuid = vpcUuid;
+            return this;
+        }
+
+        public Builder networkDomainUuid(String networkDomainUuid) {
+            this._networkDomainUuid = networkDomainUuid;
+            return this;
+        }
+
+        public Builder networksAccountUuid(String networksAccountUuid) {
+            this._networksAccountUuid = networksAccountUuid;
+            return this;
+        }
+
+        public Builder isDomainRouter(boolean isDomainRouter) {
+            this._isDomainRouter = isDomainRouter;
+            return this;
+        }
+
+        public Builder domainRouterIp(String domainRouterIp) {
+            this._domainRouterIp = domainRouterIp;
+            return this;
+        }
+
+        public Builder vmInstanceName(String vmInstanceName) {
+            this._vmInstanceName = vmInstanceName;
+            return this;
+        }
+
+        public Builder vmUuid(String vmUuid) {
+            this._vmUuid = vmUuid;
+            return this;
+        }
+
+        public Builder vmUserName(String vmUserName) {
+            this._vmUserName = vmUserName;
+            return this;
+        }
+
+        public Builder vmUserDomainName(String vmUserDomainName) {
+            this._vmUserDomainName = vmUserDomainName;
+            return this;
+        }
+
+        public Builder useStaticIp(boolean useStaticIp) {
+            this._useStaticIp = useStaticIp;
+            return this;
+        }
+
+        public Builder staticIp(String staticIp) {
+            this._staticIp = staticIp;
+            return this;
+        }
+
+        public Builder staticNatIpUuid(String staticNatIpUuid) {
+            this._staticNatIpUuid = staticNatIpUuid;
+            return this;
+        }
+
+        public Builder staticNatIpAddress(String staticNatIpAddress) {
+            this._staticNatIpAddress = staticNatIpAddress;
+            return this;
+        }
+
+        public Builder isStaticNatIpAllocated(boolean isStaticNatIpAllocated) {
+            this._isStaticNatIpAllocated = isStaticNatIpAllocated;
+            return this;
+        }
+
+        public Builder isOneToOneNat(boolean isOneToOneNat) {
+            this._isOneToOneNat = isOneToOneNat;
+            return this;
+        }
+
+        public Builder staticNatVlanUuid(String staticNatVlanUuid) {
+            this._staticNatVlanUuid = staticNatVlanUuid;
+            return this;
+        }
+
+        public Builder staticNatVlanGateway(String staticNatVlanGateway) {
+            this._staticNatVlanGateway = staticNatVlanGateway;
+            return this;
+        }
+
+        public Builder staticNatVlanNetmask(String staticNatVlanNetmask) {
+            this._staticNatVlanNetmask = staticNatVlanNetmask;
+            return this;
+        }
+
+        @Override
+        public ReserveVmInterfaceVspCommand build() {
+            return new ReserveVmInterfaceVspCommand(_nicUuid, _nicMacAddress, _networkUuid, _isL3Network, _isSharedNetwork, _vpcUuid, _networkDomainUuid, _networksAccountUuid,
+                    _isDomainRouter, _domainRouterIp, _vmInstanceName, _vmUuid, _vmUserName, _vmUserDomainName, _useStaticIp, _staticIp, _staticNatIpUuid, _staticNatIpAddress,
+                    _isStaticNatIpAllocated, _isOneToOneNat, _staticNatVlanUuid, _staticNatVlanGateway, _staticNatVlanNetmask);
+        }
+    }
+
     @Override
     public boolean executeInSequence() {
         return false;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ReserveVmInterfaceVspCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        ReserveVmInterfaceVspCommand that = (ReserveVmInterfaceVspCommand) o;
+
+        if (_isDomainRouter != that._isDomainRouter) return false;
+        if (_isL3Network != that._isL3Network) return false;
+        if (_isOneToOneNat != that._isOneToOneNat) return false;
+        if (_isSharedNetwork != that._isSharedNetwork) return false;
+        if (_isStaticNatIpAllocated != that._isStaticNatIpAllocated) return false;
+        if (_useStaticIp != that._useStaticIp) return false;
+        if (_domainRouterIp != null ? !_domainRouterIp.equals(that._domainRouterIp) : that._domainRouterIp != null)
+            return false;
+        if (_networkDomainUuid != null ? !_networkDomainUuid.equals(that._networkDomainUuid) : that._networkDomainUuid != null)
+            return false;
+        if (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false;
+        if (_networksAccountUuid != null ? !_networksAccountUuid.equals(that._networksAccountUuid) : that._networksAccountUuid != null)
+            return false;
+        if (_nicMacAddress != null ? !_nicMacAddress.equals(that._nicMacAddress) : that._nicMacAddress != null)
+            return false;
+        if (_nicUuid != null ? !_nicUuid.equals(that._nicUuid) : that._nicUuid != null) return false;
+        if (_staticIp != null ? !_staticIp.equals(that._staticIp) : that._staticIp != null) return false;
+        if (_staticNatIpAddress != null ? !_staticNatIpAddress.equals(that._staticNatIpAddress) : that._staticNatIpAddress != null)
+            return false;
+        if (_staticNatIpUuid != null ? !_staticNatIpUuid.equals(that._staticNatIpUuid) : that._staticNatIpUuid != null)
+            return false;
+        if (_staticNatVlanGateway != null ? !_staticNatVlanGateway.equals(that._staticNatVlanGateway) : that._staticNatVlanGateway != null)
+            return false;
+        if (_staticNatVlanNetmask != null ? !_staticNatVlanNetmask.equals(that._staticNatVlanNetmask) : that._staticNatVlanNetmask != null)
+            return false;
+        if (_staticNatVlanUuid != null ? !_staticNatVlanUuid.equals(that._staticNatVlanUuid) : that._staticNatVlanUuid != null)
+            return false;
+        if (_vmInstanceName != null ? !_vmInstanceName.equals(that._vmInstanceName) : that._vmInstanceName != null)
+            return false;
+        if (_vmUserDomainName != null ? !_vmUserDomainName.equals(that._vmUserDomainName) : that._vmUserDomainName != null)
+            return false;
+        if (_vmUserName != null ? !_vmUserName.equals(that._vmUserName) : that._vmUserName != null) return false;
+        if (_vmUuid != null ? !_vmUuid.equals(that._vmUuid) : that._vmUuid != null) return false;
+        if (_vpcUuid != null ? !_vpcUuid.equals(that._vpcUuid) : that._vpcUuid != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_nicUuid != null ? _nicUuid.hashCode() : 0);
+        result = 31 * result + (_nicMacAddress != null ? _nicMacAddress.hashCode() : 0);
+        result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0);
+        result = 31 * result + (_isL3Network ? 1 : 0);
+        result = 31 * result + (_isSharedNetwork ? 1 : 0);
+        result = 31 * result + (_vpcUuid != null ? _vpcUuid.hashCode() : 0);
+        result = 31 * result + (_networkDomainUuid != null ? _networkDomainUuid.hashCode() : 0);
+        result = 31 * result + (_networksAccountUuid != null ? _networksAccountUuid.hashCode() : 0);
+        result = 31 * result + (_isDomainRouter ? 1 : 0);
+        result = 31 * result + (_domainRouterIp != null ? _domainRouterIp.hashCode() : 0);
+        result = 31 * result + (_vmInstanceName != null ? _vmInstanceName.hashCode() : 0);
+        result = 31 * result + (_vmUuid != null ? _vmUuid.hashCode() : 0);
+        result = 31 * result + (_vmUserName != null ? _vmUserName.hashCode() : 0);
+        result = 31 * result + (_vmUserDomainName != null ? _vmUserDomainName.hashCode() : 0);
+        result = 31 * result + (_useStaticIp ? 1 : 0);
+        result = 31 * result + (_staticIp != null ? _staticIp.hashCode() : 0);
+        result = 31 * result + (_staticNatIpUuid != null ? _staticNatIpUuid.hashCode() : 0);
+        result = 31 * result + (_staticNatIpAddress != null ? _staticNatIpAddress.hashCode() : 0);
+        result = 31 * result + (_isStaticNatIpAllocated ? 1 : 0);
+        result = 31 * result + (_isOneToOneNat ? 1 : 0);
+        result = 31 * result + (_staticNatVlanUuid != null ? _staticNatVlanUuid.hashCode() : 0);
+        result = 31 * result + (_staticNatVlanGateway != null ? _staticNatVlanGateway.hashCode() : 0);
+        result = 31 * result + (_staticNatVlanNetmask != null ? _staticNatVlanNetmask.hashCode() : 0);
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspAnswer.java
deleted file mode 100644
index 0c0c0d2..0000000
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspAnswer.java
+++ /dev/null
@@ -1,34 +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.agent.api.guru;
-
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
-
-public class TrashNetworkVspAnswer extends Answer {
-
-    public TrashNetworkVspAnswer(Command command, Exception e) {
-        super(command, e);
-    }
-
-    public TrashNetworkVspAnswer(TrashNetworkVspCommand cmd, boolean success, String details) {
-        super(cmd, success, details);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspCommand.java
index e10e9be..4a01fdc 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspCommand.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspCommand.java
@@ -19,21 +19,26 @@
 
 package com.cloud.agent.api.guru;
 
+import com.cloud.agent.api.CmdBuilder;
 import com.cloud.agent.api.Command;
 
 public class TrashNetworkVspCommand extends Command {
 
-    String _domainUuid;
-    String _networkUuid;
-    boolean _isL3Network;
-    String _vpcUuid;
+    private final String _domainUuid;
+    private final String _networkUuid;
+    private final boolean _isL3Network;
+    private final boolean _isSharedNetwork;
+    private final String _vpcUuid;
+    private final String _domainTemplateName;
 
-    public TrashNetworkVspCommand(String domainUuid, String networkUuid, boolean isL3Network, String vpcUuid) {
+    private TrashNetworkVspCommand(String domainUuid, String networkUuid, boolean isL3Network, boolean isSharedNetwork, String vpcUuid, String domainTemplateName) {
         super();
         this._domainUuid = domainUuid;
         this._networkUuid = networkUuid;
         this._isL3Network = isL3Network;
+        this._isSharedNetwork = isSharedNetwork;
         this._vpcUuid = vpcUuid;
+        this._domainTemplateName = domainTemplateName;
     }
 
     public String getDomainUuid() {
@@ -48,13 +53,95 @@ public class TrashNetworkVspCommand extends Command {
         return _isL3Network;
     }
 
+    public boolean isSharedNetwork() {
+        return _isSharedNetwork;
+    }
+
     public String getVpcUuid() {
         return _vpcUuid;
     }
 
+    public String getDomainTemplateName() {
+        return _domainTemplateName;
+    }
+
+    public static class Builder implements CmdBuilder<TrashNetworkVspCommand> {
+        private String _domainUuid;
+        private String _networkUuid;
+        private boolean _isL3Network;
+        private boolean _isSharedNetwork;
+        private String _vpcUuid;
+        private String _domainTemplateName;
+
+        public Builder domainUuid(String domainUuid) {
+            this._domainUuid = domainUuid;
+            return this;
+        }
+
+        public Builder networkUuid(String networkUuid) {
+            this._networkUuid = networkUuid;
+            return this;
+        }
+
+        public Builder isL3Network(boolean isL3Network) {
+            this._isL3Network = isL3Network;
+            return this;
+        }
+
+        public Builder isSharedNetwork(boolean isSharedNetwork) {
+            this._isSharedNetwork = isSharedNetwork;
+            return this;
+        }
+
+        public Builder vpcUuid(String vpcUuid) {
+            this._vpcUuid = vpcUuid;
+            return this;
+        }
+
+        public Builder domainTemplateName(String domainTemplateName) {
+            this._domainTemplateName = domainTemplateName;
+            return this;
+        }
+
+        @Override
+        public TrashNetworkVspCommand build() {
+            return new TrashNetworkVspCommand(_domainUuid, _networkUuid, _isL3Network, _isSharedNetwork, _vpcUuid, _domainTemplateName);
+        }
+    }
+
     @Override
     public boolean executeInSequence() {
         return false;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof TrashNetworkVspCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        TrashNetworkVspCommand that = (TrashNetworkVspCommand) o;
+
+        if (_isL3Network != that._isL3Network) return false;
+        if (_isSharedNetwork != that._isSharedNetwork) return false;
+        if (_domainTemplateName != null ? !_domainTemplateName.equals(that._domainTemplateName) : that._domainTemplateName != null)
+            return false;
+        if (_domainUuid != null ? !_domainUuid.equals(that._domainUuid) : that._domainUuid != null) return false;
+        if (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false;
+        if (_vpcUuid != null ? !_vpcUuid.equals(that._vpcUuid) : that._vpcUuid != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_domainUuid != null ? _domainUuid.hashCode() : 0);
+        result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0);
+        result = 31 * result + (_isL3Network ? 1 : 0);
+        result = 31 * result + (_isSharedNetwork ? 1 : 0);
+        result = 31 * result + (_vpcUuid != null ? _vpcUuid.hashCode() : 0);
+        result = 31 * result + (_domainTemplateName != null ? _domainTemplateName.hashCode() : 0);
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsAnswer.java
new file mode 100644
index 0000000..f748e1c
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsAnswer.java
@@ -0,0 +1,81 @@
+//
+// 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.agent.api.manager;
+
+import com.cloud.agent.api.Answer;
+
+import java.util.Map;
+
+public class GetClientDefaultsAnswer extends Answer {
+
+    private String _currentApiVersion;
+    private Integer _apiRetryCount;
+    private Long _apiRetryInterval;
+
+    public GetClientDefaultsAnswer(GetClientDefaultsCommand cmd, Map<String, Object> defaults) {
+        super(cmd);
+        this._currentApiVersion = (String) defaults.get("CURRENT_API_VERSION");
+        this._apiRetryCount = (Integer) defaults.get("DEFAULT_API_RETRY_COUNT");
+        this._apiRetryInterval = (Long) defaults.get("DEFAULT_API_RETRY_INTERVAL");
+    }
+
+    public GetClientDefaultsAnswer(GetClientDefaultsCommand cmd, Exception e) {
+        super(cmd, e);
+    }
+
+    public String getCurrentApiVersion() {
+        return _currentApiVersion;
+    }
+
+    public Integer getApiRetryCount() {
+        return _apiRetryCount;
+    }
+
+    public Long getApiRetryInterval() {
+        return _apiRetryInterval;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof GetClientDefaultsAnswer)) return false;
+        if (!super.equals(o)) return false;
+
+        GetClientDefaultsAnswer that = (GetClientDefaultsAnswer) o;
+
+        if (_apiRetryCount != null ? !_apiRetryCount.equals(that._apiRetryCount) : that._apiRetryCount != null)
+            return false;
+        if (_apiRetryInterval != null ? !_apiRetryInterval.equals(that._apiRetryInterval) : that._apiRetryInterval != null)
+            return false;
+        if (_currentApiVersion != null ? !_currentApiVersion.equals(that._currentApiVersion) : that._currentApiVersion != null)
+            return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_currentApiVersion != null ? _currentApiVersion.hashCode() : 0);
+        result = 31 * result + (_apiRetryCount != null ? _apiRetryCount.hashCode() : 0);
+        result = 31 * result + (_apiRetryInterval != null ? _apiRetryInterval.hashCode() : 0);
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsCommand.java
new file mode 100644
index 0000000..2ffbe04
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsCommand.java
@@ -0,0 +1,38 @@
+//
+// 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.agent.api.manager;
+
+import com.cloud.agent.api.Command;
+
+/**
+ * The super class implementations for equals and hashCode are acceptable because this class does not track any state
+ * in addition to the super class.
+ */
+public class GetClientDefaultsCommand extends Command {
+
+    public GetClientDefaultsCommand() {
+        super();
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/SupportedApiVersionCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/SupportedApiVersionCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/SupportedApiVersionCommand.java
new file mode 100644
index 0000000..7a331d6
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/SupportedApiVersionCommand.java
@@ -0,0 +1,61 @@
+//
+// 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.agent.api.manager;
+
+import com.cloud.agent.api.Command;
+
+public class SupportedApiVersionCommand extends Command {
+
+    private final String _apiVersion;
+
+    public SupportedApiVersionCommand(String apiVersion) {
+        super();
+        this._apiVersion = apiVersion;
+    }
+
+    public String getApiVersion() {
+        return _apiVersion;
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof SupportedApiVersionCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        SupportedApiVersionCommand that = (SupportedApiVersionCommand) o;
+
+        if (_apiVersion != null ? !_apiVersion.equals(that._apiVersion) : that._apiVersion != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_apiVersion != null ? _apiVersion.hashCode() : 0);
+        return result;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainAnswer.java
new file mode 100644
index 0000000..fd4822c
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainAnswer.java
@@ -0,0 +1,57 @@
+//
+// 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.agent.api.sync;
+
+import com.cloud.agent.api.Answer;
+
+public class SyncDomainAnswer extends Answer {
+
+    private final boolean _success;
+
+    public SyncDomainAnswer(boolean success) {
+        super();
+        this._success = success;
+    }
+
+    public boolean getSuccess() {
+        return _success;
+    }
+
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof SyncDomainAnswer)) return false;
+        if (!super.equals(o)) return false;
+
+        SyncDomainAnswer that = (SyncDomainAnswer) o;
+
+        if (_success != that._success) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_success ? 1 : 0);
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainCommand.java
new file mode 100644
index 0000000..7ae474f
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainCommand.java
@@ -0,0 +1,93 @@
+//
+// 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.agent.api.sync;
+
+import com.cloud.agent.api.Command;
+
+public class SyncDomainCommand extends Command {
+
+    private final String _domainUuid;
+    private final String _domainName;
+    private final String _domainPath;
+    private final boolean _toAdd;
+    private final boolean _toRemove;
+
+    public SyncDomainCommand(String domainUuid, String domainName, String domainPath, boolean toAdd, boolean toRemove) {
+        super();
+        this._domainUuid = domainUuid;
+        this._domainName = domainName;
+        this._domainPath = domainPath;
+        this._toAdd = toAdd;
+        this._toRemove = toRemove;
+    }
+
+    public String getDomainUuid() {
+        return _domainUuid;
+    }
+
+    public String getDomainName() {
+        return _domainName;
+    }
+
+    public String getDomainPath() {
+        return _domainPath;
+    }
+
+    public boolean isToAdd() {
+        return _toAdd;
+    }
+
+    public boolean isToRemove() {
+        return _toRemove;
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof SyncDomainCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        SyncDomainCommand that = (SyncDomainCommand) o;
+
+        if (_toAdd != that._toAdd) return false;
+        if (_toRemove != that._toRemove) return false;
+        if (_domainName != null ? !_domainName.equals(that._domainName) : that._domainName != null) return false;
+        if (_domainPath != null ? !_domainPath.equals(that._domainPath) : that._domainPath != null) return false;
+        if (_domainUuid != null ? !_domainUuid.equals(that._domainUuid) : that._domainUuid != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_domainUuid != null ? _domainUuid.hashCode() : 0);
+        result = 31 * result + (_domainName != null ? _domainName.hashCode() : 0);
+        result = 31 * result + (_domainPath != null ? _domainPath.hashCode() : 0);
+        result = 31 * result + (_toAdd ? 1 : 0);
+        result = 31 * result + (_toRemove ? 1 : 0);
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdAnswer.java
new file mode 100644
index 0000000..b0430e6
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdAnswer.java
@@ -0,0 +1,73 @@
+//
+// 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.agent.api.sync;
+
+import com.cloud.agent.api.Answer;
+
+public class SyncNuageVspCmsIdAnswer extends Answer {
+
+    private final boolean _success;
+    private final String _nuageVspCmsId;
+    private final SyncNuageVspCmsIdCommand.SyncType _syncType;
+
+    public SyncNuageVspCmsIdAnswer(boolean success, String nuageVspCmsId, SyncNuageVspCmsIdCommand.SyncType syncType) {
+        super();
+        this._success = success;
+        this._nuageVspCmsId = nuageVspCmsId;
+        this._syncType = syncType;
+    }
+
+    public boolean getSuccess() {
+        return _success;
+    }
+
+    public String getNuageVspCmsId() {
+        return _nuageVspCmsId;
+    }
+
+    public SyncNuageVspCmsIdCommand.SyncType getSyncType() {
+        return _syncType;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof SyncNuageVspCmsIdAnswer)) return false;
+        if (!super.equals(o)) return false;
+
+        SyncNuageVspCmsIdAnswer that = (SyncNuageVspCmsIdAnswer) o;
+
+        if (_success != that._success) return false;
+        if (_nuageVspCmsId != null ? !_nuageVspCmsId.equals(that._nuageVspCmsId) : that._nuageVspCmsId != null)
+            return false;
+        if (_syncType != that._syncType) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_success ? 1 : 0);
+        result = 31 * result + (_nuageVspCmsId != null ? _nuageVspCmsId.hashCode() : 0);
+        result = 31 * result + (_syncType != null ? _syncType.hashCode() : 0);
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdCommand.java
new file mode 100644
index 0000000..48651ff
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdCommand.java
@@ -0,0 +1,72 @@
+//
+// 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.agent.api.sync;
+
+import com.cloud.agent.api.Command;
+
+public class SyncNuageVspCmsIdCommand extends Command {
+
+    public static enum SyncType { AUDIT, AUDIT_ONLY, REGISTER, UNREGISTER }
+
+    private final SyncType _syncType;
+    private final String _nuageVspCmsId;
+
+    public SyncNuageVspCmsIdCommand(SyncType syncType, String nuageVspCmsId) {
+        super();
+        this._syncType = syncType;
+        this._nuageVspCmsId = nuageVspCmsId;
+    }
+
+    public SyncType getSyncType() {
+        return _syncType;
+    }
+
+    public String getNuageVspCmsId() {
+        return _nuageVspCmsId;
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof SyncNuageVspCmsIdCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        SyncNuageVspCmsIdCommand that = (SyncNuageVspCmsIdCommand) o;
+
+        if (_nuageVspCmsId != null ? !_nuageVspCmsId.equals(that._nuageVspCmsId) : that._nuageVspCmsId != null)
+            return false;
+        if (_syncType != that._syncType) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_syncType != null ? _syncType.hashCode() : 0);
+        result = 31 * result + (_nuageVspCmsId != null ? _nuageVspCmsId.hashCode() : 0);
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspAnswer.java
deleted file mode 100644
index 52848e5..0000000
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspAnswer.java
+++ /dev/null
@@ -1,34 +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.agent.api.sync;
-
-import com.cloud.agent.api.Answer;
-
-public class SyncVspAnswer extends Answer {
-
-    public SyncVspAnswer(SyncVspCommand cmd, boolean success, String details) {
-        super(cmd, success, details);
-    }
-
-    public SyncVspAnswer(SyncVspCommand cmd, Exception e) {
-        super(cmd, e);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspCommand.java
index 8ccd84d..cfcfb87 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspCommand.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspCommand.java
@@ -23,7 +23,7 @@ import com.cloud.agent.api.Command;
 
 public class SyncVspCommand extends Command {
 
-    String _nuageVspEntity;
+    private final String _nuageVspEntity;
 
     public SyncVspCommand(String nuageVspEntity) {
         super();
@@ -39,4 +39,24 @@ public class SyncVspCommand extends Command {
         return _nuageVspEntity;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof SyncVspCommand)) return false;
+        if (!super.equals(o)) return false;
+
+        SyncVspCommand that = (SyncVspCommand) o;
+
+        if (_nuageVspEntity != null ? !_nuageVspEntity.equals(that._nuageVspEntity) : that._nuageVspEntity != null)
+            return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (_nuageVspEntity != null ? _nuageVspEntity.hashCode() : 0);
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/AddNuageVspDeviceCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/AddNuageVspDeviceCmd.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/AddNuageVspDeviceCmd.java
index 19f2d09..7590901 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/AddNuageVspDeviceCmd.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/AddNuageVspDeviceCmd.java
@@ -19,18 +19,6 @@
 
 package com.cloud.api.commands;
 
-import javax.inject.Inject;
-
-import org.apache.cloudstack.api.APICommand;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.ApiErrorCode;
-import org.apache.cloudstack.api.BaseAsyncCmd;
-import org.apache.cloudstack.api.BaseCmd;
-import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
-import org.apache.cloudstack.context.CallContext;
-
 import com.cloud.api.response.NuageVspDeviceResponse;
 import com.cloud.event.EventTypes;
 import com.cloud.exception.ConcurrentOperationException;
@@ -41,8 +29,19 @@ import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.NuageVspDeviceVO;
 import com.cloud.network.manager.NuageVspManager;
 import com.cloud.utils.exception.CloudRuntimeException;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
+import org.apache.cloudstack.context.CallContext;
+
+import javax.inject.Inject;
 
-@APICommand(name = "addNuageVspDevice", responseObject = NuageVspDeviceResponse.class, description = "Adds a Nuage VSP device")
+@APICommand(name = "addNuageVspDevice", responseObject = NuageVspDeviceResponse.class, description = "Adds a Nuage VSP device", since = "4.5")
 public class AddNuageVspDeviceCmd extends BaseAsyncCmd {
     private static final String s_name = "addnuagevspdeviceresponse";
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/DeleteNuageVspDeviceCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/DeleteNuageVspDeviceCmd.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/DeleteNuageVspDeviceCmd.java
index ae81c84..971f9c9 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/DeleteNuageVspDeviceCmd.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/DeleteNuageVspDeviceCmd.java
@@ -19,16 +19,6 @@
 
 package com.cloud.api.commands;
 
-import javax.inject.Inject;
-
-import org.apache.cloudstack.api.APICommand;
-import org.apache.cloudstack.api.ApiErrorCode;
-import org.apache.cloudstack.api.BaseAsyncCmd;
-import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.response.SuccessResponse;
-import org.apache.cloudstack.context.CallContext;
-
 import com.cloud.api.response.NuageVspDeviceResponse;
 import com.cloud.event.EventTypes;
 import com.cloud.exception.ConcurrentOperationException;
@@ -38,8 +28,17 @@ import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.manager.NuageVspManager;
 import com.cloud.utils.exception.CloudRuntimeException;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.context.CallContext;
+
+import javax.inject.Inject;
 
-@APICommand(name = "deleteNuageVspDevice", responseObject = SuccessResponse.class, description = "delete a nuage vsp device")
+@APICommand(name = "deleteNuageVspDevice", responseObject = SuccessResponse.class, description = "delete a nuage vsp device", since = "4.5")
 public class DeleteNuageVspDeviceCmd extends BaseAsyncCmd {
     private static final String s_name = "deletenuagevspdeviceresponse";
     @Inject

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/IssueNuageVspResourceRequestCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/IssueNuageVspResourceRequestCmd.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/IssueNuageVspResourceRequestCmd.java
index f0e3ff8..559b30d 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/IssueNuageVspResourceRequestCmd.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/IssueNuageVspResourceRequestCmd.java
@@ -19,23 +19,6 @@
 
 package com.cloud.api.commands;
 
-import java.util.List;
-
-import javax.inject.Inject;
-
-import org.apache.cloudstack.api.APICommand;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.ApiErrorCode;
-import org.apache.cloudstack.api.BaseCmd;
-import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.response.NetworkOfferingResponse;
-import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
-import org.apache.cloudstack.api.response.ZoneResponse;
-import org.apache.cloudstack.context.CallContext;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
-
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.VspResourceAnswer;
 import com.cloud.agent.api.VspResourceCommand;
@@ -53,8 +36,23 @@ import com.cloud.network.dao.NuageVspDao;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.NetworkOfferingResponse;
+import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+
+import javax.inject.Inject;
+import java.util.List;
 
-@APICommand(name = "issueNuageVspResourceRequest", responseObject = NuageVspResourceResponse.class, description = "Issues a Nuage VSP REST API resource request")
+@APICommand(name = "issueNuageVspResourceRequest", responseObject = NuageVspResourceResponse.class, description = "Issues a Nuage VSP REST API resource request", since = "4.5")
 public class IssueNuageVspResourceRequestCmd extends BaseCmd {
     private static final Logger s_logger = Logger.getLogger(IssueNuageVspResourceRequestCmd.class.getName());
     private static final String s_name = "nuagevspresourceresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/ListNuageVspDevicesCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/ListNuageVspDevicesCmd.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/ListNuageVspDevicesCmd.java
index 46797e0..2d08e12 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/ListNuageVspDevicesCmd.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/ListNuageVspDevicesCmd.java
@@ -19,20 +19,6 @@
 
 package com.cloud.api.commands;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.inject.Inject;
-
-import org.apache.cloudstack.api.APICommand;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.ApiErrorCode;
-import org.apache.cloudstack.api.BaseListCmd;
-import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.response.ListResponse;
-import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
-
 import com.cloud.api.response.NuageVspDeviceResponse;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
@@ -42,8 +28,20 @@ import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.NuageVspDeviceVO;
 import com.cloud.network.manager.NuageVspManager;
 import com.cloud.utils.exception.CloudRuntimeException;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseListCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
+
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
 
-@APICommand(name = "listNuageVspDevices", responseObject = NuageVspDeviceResponse.class, description = "Lists Nuage VSP devices")
+@APICommand(name = "listNuageVspDevices", responseObject = NuageVspDeviceResponse.class, description = "Lists Nuage VSP devices", since = "4.5")
 public class ListNuageVspDevicesCmd extends BaseListCmd {
     private static final String s_name = "listnuagevspdeviceresponse";
     @Inject

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/UpdateNuageVspDeviceCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/UpdateNuageVspDeviceCmd.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/UpdateNuageVspDeviceCmd.java
new file mode 100755
index 0000000..d235b2b
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/UpdateNuageVspDeviceCmd.java
@@ -0,0 +1,180 @@
+//
+// 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.api.commands;
+
+import com.cloud.api.response.NuageVspDeviceResponse;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.NuageVspDeviceVO;
+import com.cloud.network.manager.NuageVspManager;
+import com.cloud.utils.exception.CloudRuntimeException;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
+
+import javax.inject.Inject;
+
+@APICommand(name = "updateNuageVspDevice", responseObject = NuageVspDeviceResponse.class, description = "Update a Nuage VSP device", since = "4.6")
+public class UpdateNuageVspDeviceCmd extends BaseAsyncCmd {
+    private static final Logger s_logger = Logger.getLogger(UpdateNuageVspDeviceCmd.class);
+    private static final String s_name = "updatenuagevspdeviceresponse";
+
+    @Inject
+    NuageVspManager _nuageVspManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.PHYSICAL_NETWORK_ID, type = BaseCmd.CommandType.UUID, entityType = PhysicalNetworkResponse.class,
+            required = true, description = "the ID of the physical network in to which Nuage VSP is added")
+    private Long physicalNetworkId;
+
+    @Parameter(name = VspConstants.NUAGE_VSP_API_PORT, type = CommandType.INTEGER, description = "the port to communicate to Nuage VSD")
+    private Integer port;
+
+    @Parameter(name = ApiConstants.HOST_NAME, type = CommandType.STRING, description = "the hostname of the Nuage VSD")
+    private String hostName;
+
+    @Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, description = "the user name of the CMS user in Nuage VSD")
+    private String userName;
+
+    @Parameter(name = ApiConstants.PASSWORD, type = CommandType.STRING, description = "the password of CMS user in Nuage VSD")
+    private String password;
+
+    @Parameter(name = VspConstants.NUAGE_VSP_API_VERSION, type = CommandType.STRING, description = "the version of the API to use to communicate to Nuage VSD")
+    private String apiVersion;
+
+    @Parameter(name = VspConstants.NUAGE_VSP_API_RETRY_COUNT, type = CommandType.INTEGER, description = "the number of retries on failure to communicate to Nuage VSD")
+    private Integer apiRetryCount;
+
+    @Parameter(name = VspConstants.NUAGE_VSP_API_RETRY_INTERVAL, type = CommandType.LONG, description = "the time to wait after failure before retrying to communicate to Nuage VSD")
+    private Long apiRetryInterval;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getPhysicalNetworkId() {
+        return physicalNetworkId;
+    }
+
+    public Integer getPort() {
+        return port;
+    }
+
+    public void setPort(Integer port) {
+        this.port = port;
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String getApiVersion() {
+        return apiVersion;
+    }
+
+    public void setApiVersion(String apiVersion) {
+        this.apiVersion = apiVersion;
+    }
+
+    public Integer getApiRetryCount() {
+        return apiRetryCount;
+    }
+
+    public void setApiRetryCount(Integer apiRetryCount) {
+        this.apiRetryCount = apiRetryCount;
+    }
+
+    public Long getApiRetryInterval() {
+        return apiRetryInterval;
+    }
+
+    public void setApiRetryInterval(Long apiRetryInterval) {
+        this.apiRetryInterval = apiRetryInterval;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException {
+        try {
+            NuageVspDeviceVO nuageVspDeviceVO = _nuageVspManager.updateNuageVspDevice(this);
+            if (nuageVspDeviceVO != null) {
+                NuageVspDeviceResponse response = _nuageVspManager.createNuageVspDeviceResponse(nuageVspDeviceVO);
+                response.setObjectName("nuagevspdevice");
+                response.setResponseName(getCommandName());
+                this.setResponseObject(response);
+            } else {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add Nuage VSP device due to internal error.");
+            }
+        } catch (InvalidParameterValueException invalidParamExcp) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, invalidParamExcp.getMessage());
+        } catch (CloudRuntimeException runtimeExcp) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, runtimeExcp.getMessage());
+        }
+    }
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccount().getId();
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_EXTERNAL_VSP_VSD_UPDATE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "Updating a Nuage VSD";
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspDeviceResponse.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspDeviceResponse.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspDeviceResponse.java
index b0bbcc8..136a465 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspDeviceResponse.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspDeviceResponse.java
@@ -21,13 +21,12 @@ package com.cloud.api.response;
 
 import com.cloud.api.commands.VspConstants;
 import com.cloud.network.NuageVspDeviceVO;
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseResponse;
 import org.apache.cloudstack.api.EntityReference;
 
-import com.cloud.serializer.Param;
-import com.google.gson.annotations.SerializedName;
-
 @EntityReference(value = NuageVspDeviceVO.class)
 public class NuageVspDeviceResponse extends BaseResponse {
     @SerializedName(VspConstants.NUAGE_VSP_DEVICE_ID)

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspResourceResponse.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspResourceResponse.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspResourceResponse.java
index 8e620ed..7002413 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspResourceResponse.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspResourceResponse.java
@@ -20,10 +20,9 @@
 package com.cloud.api.response;
 
 import com.cloud.api.commands.VspConstants;
-import org.apache.cloudstack.api.BaseResponse;
-
 import com.cloud.serializer.Param;
 import com.google.gson.annotations.SerializedName;
+import org.apache.cloudstack.api.BaseResponse;
 
 public class NuageVspResourceResponse extends BaseResponse {
     @SerializedName(VspConstants.NUAGE_VSP_API_RESOURCE_INFO)

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/network/NuageVspDeviceVO.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/NuageVspDeviceVO.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/NuageVspDeviceVO.java
index 00cb1e4..ad5a7eb 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/NuageVspDeviceVO.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/NuageVspDeviceVO.java
@@ -19,7 +19,7 @@
 
 package com.cloud.network;
 
-import java.util.UUID;
+import org.apache.cloudstack.api.InternalIdentity;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -27,8 +27,7 @@ import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Table;
-
-import org.apache.cloudstack.api.InternalIdentity;
+import java.util.UUID;
 
 @Entity
 @Table(name = "external_nuage_vsp_devices")

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/645f8758/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDao.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDao.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDao.java
index 6cf7e1a..aa795eb 100644
--- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDao.java
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDao.java
@@ -33,4 +33,12 @@ public interface NuageVspDao extends GenericDao<NuageVspDeviceVO, Long> {
      */
     List<NuageVspDeviceVO> listByPhysicalNetwork(long physicalNetworkId);
 
+    /**
+     * List all the Nuage Vsp devices by a specific host
+     *
+     * @param hostId host Id
+     * @return list of NuageVspDeviceVO for this host.
+     */
+    List<NuageVspDeviceVO> listByHost(long hostId);
+
 }