You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by pe...@apache.org on 2023/08/28 19:27:46 UTC

[cloudstack] branch nsx-integration updated (937b34b200d -> bedfe44482f)

This is an automated email from the ASF dual-hosted git repository.

pearl11594 pushed a change to branch nsx-integration
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


    from 937b34b200d update response and add license
     add 47b6f0fd056 Fix tungsten unit test (#7904)
     add c683de4a55b kvm: fix unit test LibvirtReplugNicCommandWrapperTest (#7908)
     add 2e1c2821a82 UI: Add central project store and watch functionality (#7900)
     add a0702279aae server Don't allow inadvertent deletion of hidden details via API (#7880)
     add 8ad1009ad2d ui: fix notification list reordering intermittently (#7609)
     add 3c38ed7a656 server: allow user to list available IPs on shared networks (#7898)
     add 3b05797344c Merge remote-tracking branch 'origin/4.18'
     add e964395bd45 vmware: improve solidfire storage plugin integration and fix cases (#3) (#7761)
     add f5a1f4130d5 server: fix global setting system.vm.public.ip.reservation.mode.strictness is not really dynamic (#7909)
     add 8dc5fdd067d server: fix cannot get systemvm ips in dedicated ranges (#7144)
     add b19db10ea68 server: try with all supported hypervisors (ordered, no duplications) when deploy a virtual router (#7877)
     add 6f7725ab353 ui: Fix refresh and re-route behaviour (#7846)
     add 93bd5b7a692 ui: speed up compute instance listing (#7911)
     add 24ae5aa5fad Merge branch '4.18'
     add 57d4d0d94a7 UI: Infer template settings in the deploy VM wizard (#7867)
     add f563c165cb3 Merge release branch 4.18 to main
     new b37a9f7ee82 Merge branch 'main' of https://github.com/apache/cloudstack into nsx-integration
     new bedfe44482f Add support to create and delete nsx tier-1 gateway

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../java/com/cloud/network/IpAddressManager.java   |   4 +
 .../engine/orchestration/VolumeOrchestrator.java   |   4 +-
 .../com/cloud/network/element/NsxProviderVO.java   |  14 +-
 .../resources/META-INF/db/schema-41810to41900.sql  |   1 +
 .../LibvirtReplugNicCommandWrapperTest.java        |   6 +
 .../vmware/manager/VmwareStorageManagerImpl.java   |  30 ++-
 .../hypervisor/vmware/resource/VmwareResource.java |   5 +
 .../storage/resource/VmwareStorageProcessor.java   |  12 +-
 .../manager/VmwareStorageManagerImplTest.java      |  11 +
 .../agent/api/DeleteNsxTier1GatewayCommand.java    |   8 +
 .../api/response/NsxControllerResponse.java        |   6 +-
 .../apache/cloudstack/resource/NsxResource.java    |  73 +++++-
 .../cloudstack/service/NsxControllerUtils.java     |   4 +-
 .../org/apache/cloudstack/service/NsxElement.java  | 105 +++++++-
 .../cloudstack/service/NsxProviderServiceImpl.java |  22 +-
 .../apache/cloudstack/service/NsxServiceImpl.java  |   8 +
 .../ListTungstenFabricAddressGroupCmdTest.java     |   1 +
 .../driver/SolidFirePrimaryDataStoreDriver.java    |  30 ++-
 .../main/java/com/cloud/api/ApiResponseHelper.java |   2 +-
 .../configuration/ConfigurationManagerImpl.java    |   8 +-
 .../com/cloud/network/IpAddressManagerImpl.java    | 272 +++++++++++----------
 .../cloud/network/router/NetworkHelperImpl.java    |  38 ++-
 .../com/cloud/server/ManagementServerImpl.java     |  16 +-
 .../main/java/com/cloud/vm/UserVmManagerImpl.java  |  25 +-
 .../java/com/cloud/vm/UserVmManagerImplTest.java   |  29 ++-
 test/integration/component/test_update_vm.py       | 124 ++++++++--
 test/integration/smoke/test_public_ip_range.py     |   3 +-
 ui/public/locales/en.json                          |   1 +
 ui/src/components/header/HeaderNotice.vue          |   2 +-
 ui/src/components/header/ProjectMenu.vue           |  14 +-
 ui/src/config/section/compute.js                   |   4 +-
 ui/src/store/getters.js                            |   1 +
 ui/src/store/modules/app.js                        |  13 +-
 ui/src/store/modules/user.js                       |   6 +-
 ui/src/store/mutation-types.js                     |   1 +
 ui/src/utils/plugins.js                            |   9 +-
 ui/src/utils/request.js                            |   8 +-
 ui/src/views/AutogenView.vue                       |  30 ++-
 ui/src/views/compute/DeployVM.vue                  |  16 +-
 ui/src/views/infra/network/IpRangesTabPublic.vue   |   6 +-
 ui/src/views/infra/network/ServiceProvidersTab.vue |  28 +++
 .../vmware/mo/HostDatastoreSystemMO.java           |  17 +-
 .../cloud/hypervisor/vmware/util/VmwareHelper.java |   1 +
 43 files changed, 763 insertions(+), 255 deletions(-)
 create mode 100644 plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/agent/api/DeleteNsxTier1GatewayCommand.java


[cloudstack] 01/02: Merge branch 'main' of https://github.com/apache/cloudstack into nsx-integration

Posted by pe...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

pearl11594 pushed a commit to branch nsx-integration
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit b37a9f7ee826beb3904e498efceb0638d28d434e
Merge: 937b34b200d f563c165cb3
Author: Pearl Dsilva <pe...@gmail.com>
AuthorDate: Fri Aug 25 15:01:37 2023 -0400

    Merge branch 'main' of https://github.com/apache/cloudstack into nsx-integration

 .../java/com/cloud/network/IpAddressManager.java   |   4 +
 .../engine/orchestration/VolumeOrchestrator.java   |   4 +-
 .../LibvirtReplugNicCommandWrapperTest.java        |   6 +
 .../vmware/manager/VmwareStorageManagerImpl.java   |  30 ++-
 .../hypervisor/vmware/resource/VmwareResource.java |   5 +
 .../storage/resource/VmwareStorageProcessor.java   |  12 +-
 .../manager/VmwareStorageManagerImplTest.java      |  11 +
 .../ListTungstenFabricAddressGroupCmdTest.java     |   1 +
 .../driver/SolidFirePrimaryDataStoreDriver.java    |  30 ++-
 .../main/java/com/cloud/api/ApiResponseHelper.java |   2 +-
 .../configuration/ConfigurationManagerImpl.java    |   8 +-
 .../com/cloud/network/IpAddressManagerImpl.java    | 272 +++++++++++----------
 .../cloud/network/router/NetworkHelperImpl.java    |  38 ++-
 .../com/cloud/server/ManagementServerImpl.java     |  16 +-
 .../main/java/com/cloud/vm/UserVmManagerImpl.java  |  25 +-
 .../java/com/cloud/vm/UserVmManagerImplTest.java   |  29 ++-
 test/integration/component/test_update_vm.py       | 124 ++++++++--
 test/integration/smoke/test_public_ip_range.py     |   3 +-
 ui/public/locales/en.json                          |   1 +
 ui/src/components/header/HeaderNotice.vue          |   2 +-
 ui/src/components/header/ProjectMenu.vue           |  14 +-
 ui/src/config/section/compute.js                   |   4 +-
 ui/src/store/getters.js                            |   1 +
 ui/src/store/modules/app.js                        |  13 +-
 ui/src/store/modules/user.js                       |   6 +-
 ui/src/store/mutation-types.js                     |   1 +
 ui/src/utils/plugins.js                            |   9 +-
 ui/src/utils/request.js                            |   8 +-
 ui/src/views/AutogenView.vue                       |  30 ++-
 ui/src/views/compute/DeployVM.vue                  |  16 +-
 ui/src/views/infra/network/IpRangesTabPublic.vue   |   6 +-
 .../vmware/mo/HostDatastoreSystemMO.java           |  17 +-
 .../cloud/hypervisor/vmware/util/VmwareHelper.java |   1 +
 33 files changed, 526 insertions(+), 223 deletions(-)



[cloudstack] 02/02: Add support to create and delete nsx tier-1 gateway

Posted by pe...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

pearl11594 pushed a commit to branch nsx-integration
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit bedfe44482f06e9a0a53df3e690ae9b019884ab6
Author: Pearl Dsilva <pe...@gmail.com>
AuthorDate: Mon Aug 28 15:27:32 2023 -0400

    Add support to create and delete nsx tier-1 gateway
---
 .../com/cloud/network/element/NsxProviderVO.java   |  14 ++-
 .../resources/META-INF/db/schema-41810to41900.sql  |   1 +
 .../agent/api/DeleteNsxTier1GatewayCommand.java    |   8 ++
 .../api/response/NsxControllerResponse.java        |   6 +-
 .../apache/cloudstack/resource/NsxResource.java    |  73 ++++++++++++--
 .../cloudstack/service/NsxControllerUtils.java     |   4 +-
 .../org/apache/cloudstack/service/NsxElement.java  | 105 +++++++++++++++++++--
 .../cloudstack/service/NsxProviderServiceImpl.java |  22 +++--
 .../apache/cloudstack/service/NsxServiceImpl.java  |   8 ++
 ui/src/views/infra/network/ServiceProvidersTab.vue |  28 ++++++
 10 files changed, 237 insertions(+), 32 deletions(-)

diff --git a/engine/schema/src/main/java/com/cloud/network/element/NsxProviderVO.java b/engine/schema/src/main/java/com/cloud/network/element/NsxProviderVO.java
index 96eaa0ad3f6..f86b3401cdd 100644
--- a/engine/schema/src/main/java/com/cloud/network/element/NsxProviderVO.java
+++ b/engine/schema/src/main/java/com/cloud/network/element/NsxProviderVO.java
@@ -39,6 +39,9 @@ public class NsxProviderVO implements NsxProvider {
     @Column(name = "zone_id")
     private long zoneId;
 
+    @Column(name = "host_id")
+    private long hostId;
+
     @Column(name = "uuid")
     private String uuid;
 
@@ -68,8 +71,9 @@ public class NsxProviderVO implements NsxProvider {
         this.uuid = UUID.randomUUID().toString();
     }
 
-    public NsxProviderVO( long zoneId,String providerName, String hostname, String username, String password, String tier0Gateway, String edgeCluster) {
+    public NsxProviderVO( long zoneId, long hostId, String providerName, String hostname, String username, String password, String tier0Gateway, String edgeCluster) {
         this.zoneId = zoneId;
+        this.hostId = hostId;
         this.uuid = UUID.randomUUID().toString();
         this.providerName = providerName;
         this.hostname = hostname;
@@ -97,6 +101,14 @@ public class NsxProviderVO implements NsxProvider {
         this.zoneId = zoneId;
     }
 
+    public long getHostId() {
+        return hostId;
+    }
+
+    public void setHostId(long hostId) {
+        this.hostId = hostId;
+    }
+
     @Override
     public String getUuid() {
         return uuid;
diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql b/engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql
index db744dca0d8..ce63fe81345 100644
--- a/engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql
@@ -185,6 +185,7 @@ CREATE TABLE `cloud`.`nsx_providers` (
     `id` bigint unsigned NOT NULL auto_increment COMMENT 'id',
     `uuid` varchar(40),
     `zone_id` bigint unsigned NOT NULL COMMENT 'Zone ID',
+    `host_id` bigint unsigned NOT NULL COMMENT 'Host ID',
     `provider_name` varchar(40),
     `hostname` varchar(255) NOT NULL,
     `port` varchar(255),
diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/agent/api/DeleteNsxTier1GatewayCommand.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/agent/api/DeleteNsxTier1GatewayCommand.java
new file mode 100644
index 00000000000..7660cd79a44
--- /dev/null
+++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/agent/api/DeleteNsxTier1GatewayCommand.java
@@ -0,0 +1,8 @@
+package org.apache.cloudstack.agent.api;
+
+public class DeleteNsxTier1GatewayCommand extends CreateNsxTier1GatewayCommand {
+
+    public DeleteNsxTier1GatewayCommand(String zoneName, Long zoneId, String accountName, Long accountId, String vpcName) {
+        super(zoneName, zoneId, accountName, accountId, vpcName);
+    }
+}
diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/api/response/NsxControllerResponse.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/api/response/NsxControllerResponse.java
index 8b574c3d970..811b7f1d250 100644
--- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/api/response/NsxControllerResponse.java
+++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/api/response/NsxControllerResponse.java
@@ -34,7 +34,7 @@ public class NsxControllerResponse extends BaseResponse {
 
     @SerializedName(ApiConstants.ZONE_ID)
     @Param(description = "Zone ID to which the NSX controller is associated with")
-    private long zoneId;
+    private String zoneId;
 
     @SerializedName(ApiConstants.ZONE_NAME)
     @Param(description = "Zone name to which the NSX controller is associated with")
@@ -76,11 +76,11 @@ public class NsxControllerResponse extends BaseResponse {
         this.name = name;
     }
 
-    public long getZoneId() {
+    public String getZoneId() {
         return zoneId;
     }
 
-    public void setZoneId(long zoneId) {
+    public void setZoneId(String zoneId) {
         this.zoneId = zoneId;
     }
 
diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java
index 02c1e86b8a8..44cdb211902 100644
--- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java
+++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java
@@ -27,25 +27,32 @@ import com.cloud.agent.api.ReadyCommand;
 import com.cloud.agent.api.ReadyAnswer;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.PingCommand;
+import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.host.Host;
 import com.cloud.resource.ServerResource;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.vmware.nsx_policy.infra.Tier1s;
+import com.vmware.nsx_policy.infra.tier_0s.LocaleServices;
 import com.vmware.nsx_policy.model.ApiError;
+import com.vmware.nsx_policy.model.ChildLocaleServices;
+import com.vmware.nsx_policy.model.LocaleServicesListResult;
 import com.vmware.nsx_policy.model.Tier1;
+import com.vmware.vapi.bindings.Service;
 import com.vmware.vapi.std.errors.Error;
 import org.apache.cloudstack.NsxAnswer;
 import org.apache.cloudstack.StartupNsxCommand;
 import org.apache.cloudstack.agent.api.CreateNsxTier1GatewayCommand;
+import org.apache.cloudstack.agent.api.DeleteNsxTier1GatewayCommand;
 import org.apache.cloudstack.service.NsxApi;
 import org.apache.log4j.Logger;
 
 
 import javax.naming.ConfigurationException;
+import java.util.List;
 import java.util.Map;
 
 public class NsxResource implements ServerResource {
-    private static final Logger s_logger = Logger.getLogger(NsxResource.class);
+    private static final Logger LOGGER = Logger.getLogger(NsxResource.class);
     private static final String TIER_0_GATEWAY_PATH_PREFIX = "/infra/tier-0s/";
     private static final String TIER_1_RESOURCE_TYPE = "Tier1";
 //    private static final String ROUTING = "ROUTING";
@@ -88,7 +95,9 @@ public class NsxResource implements ServerResource {
     public Answer executeRequest(Command cmd) {
         if (cmd instanceof ReadyCommand) {
             return executeRequest((ReadyCommand) cmd);
-        } if (cmd instanceof CreateNsxTier1GatewayCommand) {
+        } else if (cmd instanceof DeleteNsxTier1GatewayCommand) {
+            return executeRequest((DeleteNsxTier1GatewayCommand) cmd);
+        } else if (cmd instanceof CreateNsxTier1GatewayCommand) {
             return executeRequest((CreateNsxTier1GatewayCommand) cmd);
         } else {
             return Answer.createUnsupportedCommandAnswer(cmd);
@@ -176,6 +185,11 @@ public class NsxResource implements ServerResource {
             throw new ConfigurationException("Unable to find zone");
         }
 
+        tier0Gateway = (String) params.get("tier0Gateway");
+        if (tier0Gateway == null) {
+            throw new ConfigurationException("Missing NSX tier0 gateway");
+        }
+
         edgeCluster = (String) params.get("edgeCluster");
         if (edgeCluster == null) {
             throw new ConfigurationException("Missing NSX edgeCluster");
@@ -190,18 +204,35 @@ public class NsxResource implements ServerResource {
         return new ReadyAnswer(cmd);
     }
 
+    private Service getService(Class serviceClass) {
+        return nsxApi.getApiClient().createStub(serviceClass);
+    }
+
     private Answer executeRequest(CreateNsxTier1GatewayCommand cmd) {
-        String tier0GatewayPath = TIER_0_GATEWAY_PATH_PREFIX + tier0Gateway;
         String name = getVpcName(cmd);
-        Tier1s tier1service = nsxApi.getApiClient().createStub(Tier1s.class);
-        Tier1 tier1 = new Tier1.Builder()
+        Tier1 tier1 = getTier1Gateway(name);
+        if (tier1 != null) {
+            throw new InvalidParameterValueException(String.format("VPC network with name %s exists in NSX zone: %s and account %s", name, cmd.getZoneName(), cmd.getAccountName()));
+        }
+        List<com.vmware.nsx_policy.model.LocaleServices> localeServices = getTier0LocalServices(tier0Gateway);
+        String tier0GatewayPath = TIER_0_GATEWAY_PATH_PREFIX + tier0Gateway;
+
+        Tier1s tier1service = (Tier1s) getService(Tier1s.class);
+        tier1 = new Tier1.Builder()
                 .setTier0Path(tier0GatewayPath)
                 .setResourceType(TIER_1_RESOURCE_TYPE)
                 .setPoolAllocation(ROUTING.name())
                 .setHaMode(ACTIVE_STANDBY.name())
                 .setId(name)
                 .setDisplayName(name)
-                .build();
+                .setChildren(
+                        List.of(new ChildLocaleServices.Builder("ChildLocaleServices")
+                                        .setLocaleServices(
+                                                new com.vmware.nsx_policy.model.LocaleServices.Builder()
+                                                        .setEdgeClusterPath(localeServices.get(0).getEdgeClusterPath())
+                                                        .setResourceType("LocaleServices")
+                                                        .build()
+                                        ).build())).build();
         try {
             tier1service.patch(name, tier1);
         } catch (Error error) {
@@ -211,6 +242,36 @@ public class NsxResource implements ServerResource {
         return new NsxAnswer(cmd, true, "");
     }
 
+    private Answer executeRequest(DeleteNsxTier1GatewayCommand cmd) {
+        try {
+            Tier1s tier1service = (Tier1s) getService(Tier1s.class);
+            tier1service.delete(cmd.getVpcName());
+        } catch (Exception e) {
+            return new Answer(cmd, new CloudRuntimeException(e.getMessage()));
+        }
+        return new Answer(cmd, true, null);
+    }
+
+    private List<com.vmware.nsx_policy.model.LocaleServices> getTier0LocalServices(String tier0Gateway) {
+        try {
+            LocaleServices tier0LocaleServices = (LocaleServices) getService(LocaleServices.class);
+            LocaleServicesListResult result =tier0LocaleServices.list(tier0Gateway, null, false, null, null, null, null);
+            return result.getResults();
+        } catch (Exception e) {
+            throw new CloudRuntimeException(String.format("Failed to fetch locale services for tier gateway %s due to %s", tier0Gateway, e.getMessage()));
+        }
+    }
+
+    private Tier1 getTier1Gateway(String tier1GatewayId) {
+        try {
+            Tier1s tier1service = (Tier1s) getService(Tier1s.class);
+            return tier1service.get(tier1GatewayId);
+        } catch (Exception e) {
+            LOGGER.debug(String.format("NSX Tier-1 gateway with name: %s not found", tier1GatewayId));
+        }
+        return null;
+    }
+
     private String getVpcName(CreateNsxTier1GatewayCommand cmd) {
         return cmd.getZoneName() + "-" + cmd.getAccountName() + "-" + cmd.getVpcName();
     }
diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxControllerUtils.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxControllerUtils.java
index 24261d0f9e3..944d33e3c42 100644
--- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxControllerUtils.java
+++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxControllerUtils.java
@@ -19,7 +19,6 @@ package org.apache.cloudstack.service;
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
 import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.hypervisor.Hypervisor;
 import com.cloud.network.dao.NsxProviderDao;
 import com.cloud.network.element.NsxProviderVO;
 import org.apache.cloudstack.NsxAnswer;
@@ -46,7 +45,8 @@ public class NsxControllerUtils {
             throw new InvalidParameterValueException("Failed to find an NSX controller");
         }
 
-        Answer answer = agentMgr.sendTo(zoneId, Hypervisor.HypervisorType.VMware, cmd);
+        //Answer answer = agentMgr.sendTo(zoneId, Hypervisor.HypervisorType.VMware, cmd);
+        Answer answer = agentMgr.easySend(nsxProviderVO.getHostId(), cmd);
 
         if (answer == null || !answer.getResult()) {
             s_logger.error("NSX API Command failed");
diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java
index 13942ae7618..e462d40f1eb 100644
--- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java
+++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java
@@ -16,15 +16,24 @@
 // under the License.
 package org.apache.cloudstack.service;
 
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.Listener;
 import com.cloud.agent.api.StartupCommand;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.AgentControlAnswer;
+import com.cloud.agent.api.AgentControlCommand;
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.deploy.DeployDestination;
-import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
-import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ConnectionException;
+import com.cloud.host.Host;
 import com.cloud.host.HostVO;
+import com.cloud.host.Status;
 import com.cloud.network.Network;
 import com.cloud.network.PhysicalNetworkServiceProvider;
 import com.cloud.network.element.DhcpServiceProvider;
@@ -35,6 +44,7 @@ import com.cloud.network.vpc.PrivateGateway;
 import com.cloud.network.vpc.StaticRouteProfile;
 import com.cloud.network.vpc.Vpc;
 import com.cloud.offering.NetworkOffering;
+import com.cloud.resource.ResourceManager;
 import com.cloud.resource.ResourceStateAdapter;
 import com.cloud.resource.ServerResource;
 import com.cloud.resource.UnableDeleteHostException;
@@ -44,7 +54,7 @@ import com.cloud.utils.component.AdapterBase;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.ReservationContext;
 import com.cloud.vm.VirtualMachineProfile;
-import org.apache.cloudstack.network.router.deployment.RouterDeploymentDefinitionBuilder;
+import org.apache.cloudstack.StartupNsxCommand;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -58,16 +68,19 @@ import java.util.Objects;
 
 @Component
 public class NsxElement extends AdapterBase implements DhcpServiceProvider, DnsServiceProvider, VpcProvider,
-        ResourceStateAdapter {
+        ResourceStateAdapter, Listener {
 
-    @Inject
-    RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder;
     @Inject
     AccountManager accountMgr;
     @Inject
     NsxServiceImpl nsxService;
     @Inject
     DataCenterDao dataCenterDao;
+    @Inject
+    AgentManager agentManager;
+    @Inject
+    ResourceManager resourceManager;
+
     private static final Logger LOGGER = Logger.getLogger(NsxElement.class);
 
     private final Map<Network.Service, Map<Network.Capability, String>> capabilities = initCapabilities();
@@ -160,7 +173,7 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, DnsS
 
     @Override
     public boolean isReady(PhysicalNetworkServiceProvider provider) {
-        return false;
+        return true;
     }
 
     @Override
@@ -180,6 +193,8 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, DnsS
 
     @Override
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+        agentManager.registerForHostEvents(this, true, true, true);
+        resourceManager.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
         return false;
     }
 
@@ -200,7 +215,11 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, DnsS
 
     @Override
     public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details, List<String> hostTags) {
-        return null;
+        if (!(startup[0] instanceof StartupNsxCommand)) {
+            return null;
+        }
+        host.setType(Host.Type.L2Networking);
+        return host;
     }
 
     @Override
@@ -225,8 +244,19 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, DnsS
     }
 
     @Override
-    public boolean shutdownVpc(Vpc vpc, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
-        return false;
+    public boolean shutdownVpc(Vpc vpc, ReservationContext context) throws ConcurrentOperationException {
+        DataCenterVO zone = dataCenterDao.findById(vpc.getZoneId());
+        if (Network.Provider.Nsx.getName().equalsIgnoreCase(zone.getDhcpProvider())) {
+            if (Objects.isNull(zone)) {
+                throw new InvalidParameterValueException(String.format("Failed to find zone with id %s", vpc.getZoneId()));
+            }
+            Account account = accountMgr.getAccount(vpc.getAccountId());
+            if (Objects.isNull(account)) {
+                throw new InvalidParameterValueException(String.format("Failed to find account with id %s", vpc.getAccountId()));
+            }
+            return nsxService.deleteVpcNetwork(vpc.getZoneId(), zone.getName(), account.getAccountId(), account.getName(), vpc.getName());
+        }
+        return true;
     }
 
     @Override
@@ -248,4 +278,59 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, DnsS
     public boolean applyACLItemsToPrivateGw(PrivateGateway gateway, List<? extends NetworkACLItem> rules) throws ResourceUnavailableException {
         return false;
     }
+
+    @Override
+    public boolean processAnswers(long agentId, long seq, Answer[] answers) {
+        return false;
+    }
+
+    @Override
+    public boolean processCommands(long agentId, long seq, Command[] commands) {
+        return false;
+    }
+
+    @Override
+    public AgentControlAnswer processControlCommand(long agentId, AgentControlCommand cmd) {
+        return null;
+    }
+
+    @Override
+    public void processHostAdded(long hostId) {
+
+    }
+
+    @Override
+    public void processConnect(Host host, StartupCommand cmd, boolean forRebalance) throws ConnectionException {
+
+    }
+
+    @Override
+    public boolean processDisconnect(long agentId, Status state) {
+        return false;
+    }
+
+    @Override
+    public void processHostAboutToBeRemoved(long hostId) {
+
+    }
+
+    @Override
+    public void processHostRemoved(long hostId, long clusterId) {
+
+    }
+
+    @Override
+    public boolean isRecurring() {
+        return false;
+    }
+
+    @Override
+    public int getTimeout() {
+        return 0;
+    }
+
+    @Override
+    public boolean processTimeout(long agentId, long seq) {
+        return false;
+    }
 }
diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxProviderServiceImpl.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxProviderServiceImpl.java
index 9aac12fda8c..cfd1566f604 100644
--- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxProviderServiceImpl.java
+++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxProviderServiceImpl.java
@@ -20,6 +20,8 @@ import com.amazonaws.util.CollectionUtils;
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.host.DetailVO;
+import com.cloud.host.Host;
 import com.cloud.host.dao.HostDetailsDao;
 import com.cloud.network.Network;
 import com.cloud.network.Networks;
@@ -97,22 +99,22 @@ public class NsxProviderServiceImpl implements NsxProviderService {
         NsxResource nsxResource = new NsxResource();
         try {
             nsxResource.configure(hostname, hostdetails);
-            //final Host host = resourceManager.addHost(zoneId, nsxResource, nsxResource.getType(), params);
-            //if (host != null) {
+            final Host host = resourceManager.addHost(zoneId, nsxResource, nsxResource.getType(), params);
+            if (host != null) {
                  nsxProvider = Transaction.execute((TransactionCallback<NsxProviderVO>) status -> {
-                    NsxProviderVO nsxProviderVO = new NsxProviderVO(zoneId, name, hostname,
+                    NsxProviderVO nsxProviderVO = new NsxProviderVO(zoneId, host.getId(), name, hostname,
                             username, password, tier0Gateway, edgeCluster);
                     nsxProviderDao.persist(nsxProviderVO);
 
-//                    DetailVO detail = new DetailVO(host.getId(), "nsxcontrollerid",
-//                            String.valueOf(nsxProviderVO.getId()));
-//                    hostDetailsDao.persist(detail);
+                    DetailVO detail = new DetailVO(host.getId(), "nsxcontrollerid",
+                            String.valueOf(nsxProviderVO.getId()));
+                    hostDetailsDao.persist(detail);
 
                     return nsxProviderVO;
                 });
-//            } else {
-//                throw new CloudRuntimeException("Failed to add NSX controller due to internal error.");
-//            }
+            } else {
+                throw new CloudRuntimeException("Failed to add NSX controller due to internal error.");
+            }
         } catch (ConfigurationException e) {
             throw new CloudRuntimeException(e.getMessage());
         }
@@ -130,7 +132,7 @@ public class NsxProviderServiceImpl implements NsxProviderService {
         response.setUuid(nsxProvider.getUuid());
         response.setHostname(nsxProvider.getHostname());
         response.setPort(nsxProvider.getPort());
-        response.setZoneId(nsxProvider.getZoneId());
+        response.setZoneId(zone.getUuid());
         response.setZoneName(zone.getName());
         response.setTier0Gateway(nsxProvider.getTier0Gateway());
         response.setTier0Gateway(nsxProvider.getEdgeCluster());
diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxServiceImpl.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxServiceImpl.java
index 95e4dbbe917..bbad6ab5389 100644
--- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxServiceImpl.java
+++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxServiceImpl.java
@@ -18,6 +18,7 @@ package org.apache.cloudstack.service;
 
 import org.apache.cloudstack.NsxAnswer;
 import org.apache.cloudstack.agent.api.CreateNsxTier1GatewayCommand;
+import org.apache.cloudstack.agent.api.DeleteNsxTier1GatewayCommand;
 
 import javax.inject.Inject;
 
@@ -30,4 +31,11 @@ public class NsxServiceImpl implements NsxService {
         NsxAnswer result = nsxControllerUtils.sendNsxCommand(createNsxTier1GatewayCommand, zoneId);
         return result.getResult();
     }
+
+    public boolean deleteVpcNetwork(Long zoneId, String zoneName, Long accountId, String accountName, String vpcName) {
+        DeleteNsxTier1GatewayCommand deleteNsxTier1GatewayCommand =
+                new DeleteNsxTier1GatewayCommand(zoneName, zoneId, accountName, accountId, vpcName);
+        NsxAnswer result = nsxControllerUtils.sendNsxCommand(deleteNsxTier1GatewayCommand, zoneId);
+        return result.getResult();
+    }
 }
diff --git a/ui/src/views/infra/network/ServiceProvidersTab.vue b/ui/src/views/infra/network/ServiceProvidersTab.vue
index e61acf7b70a..c8e79dc9b56 100644
--- a/ui/src/views/infra/network/ServiceProvidersTab.vue
+++ b/ui/src/views/infra/network/ServiceProvidersTab.vue
@@ -1060,6 +1060,34 @@ export default {
         {
           title: 'Nsx',
           details: ['name', 'state', 'id', 'physicalnetworkid', 'servicelist'],
+          actions: [
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop-outlined',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              // show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle-outlined',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              // show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            }
+          ],
           lists: [
             {
               title: 'label.nsx.controller',