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 2c0f51e0719b7e071e90762e1fea8c955d600e07
Author: Pearl Dsilva <[email protected]>
AuthorDate: Wed Aug 16 14:34:53 2023 -0400

    add upgrade path and daos
    \n add nsx controller command
---
 api/src/main/java/com/cloud/network/Networks.java  |   4 +-
 .../main/java/com/cloud/network/NsxProvider.java   |  11 ++
 .../java/com/cloud/offering/NetworkOffering.java   |   2 +
 .../org/apache/cloudstack/api/ApiConstants.java    |   5 +
 .../api/response/NetworkOfferingResponse.java      |   8 ++
 .../java/com/cloud/network/dao/NsxProviderDao.java |  14 +++
 .../com/cloud/network/dao/NsxProviderDaoImpl.java  |  19 +++
 .../com/cloud/network/element/NsxProviderVO.java   | 137 +++++++++++++++++++++
 .../com/cloud/offerings/NetworkOfferingVO.java     |  12 ++
 .../resources/META-INF/db/schema-41810to41900.sql  |  12 ++
 plugins/network-elements/nsx/pom.xml               |  13 ++
 .../api/command/AddNsxControllerCmd.java           |  99 +++++++++++++++
 .../api/response/NsxControllerResponse.java        |  11 ++
 .../org/apache/cloudstack/service/NsxElement.java  |  30 -----
 .../cloudstack/service/NsxGuestNetworkGuru.java    |  55 +++++++++
 .../cloudstack/service/NsxProviderService.java     |  17 +++
 .../cloudstack/service/NsxProviderServiceImpl.java |  51 ++++++++
 .../META-INF/cloudstack/nsx/spring-nsx-context.xml |   5 +-
 .../main/java/com/cloud/api/ApiResponseHelper.java |   1 +
 .../cloud/api/query/vo/NetworkOfferingJoinVO.java  |  11 ++
 .../com/cloud/server/ConfigurationServerImpl.java  |  19 +++
 .../zone/ZoneWizardPhysicalNetworkSetupStep.vue    |   1 +
 22 files changed, 505 insertions(+), 32 deletions(-)

diff --git a/api/src/main/java/com/cloud/network/Networks.java 
b/api/src/main/java/com/cloud/network/Networks.java
index aeed5d4aec6..75a85ddb5a8 100644
--- a/api/src/main/java/com/cloud/network/Networks.java
+++ b/api/src/main/java/com/cloud/network/Networks.java
@@ -128,7 +128,8 @@ public class Networks {
         },
         UnDecided(null, null),
         OpenDaylight("opendaylight", String.class),
-        TUNGSTEN("tf", String.class);
+        TUNGSTEN("tf", String.class),
+        NSX("nsx", String.class);
 
         private final String scheme;
         private final Class<?> type;
@@ -342,6 +343,7 @@ public class Networks {
             }
         },
         Vswitch("vs", String.class), Undecided(null, null), Vnet("vnet", 
Long.class);
+//        NSX("nsx", String.class);
 
         private final String scheme;
         private final Class<?> type;
diff --git a/api/src/main/java/com/cloud/network/NsxProvider.java 
b/api/src/main/java/com/cloud/network/NsxProvider.java
new file mode 100644
index 00000000000..fb91cbd3a10
--- /dev/null
+++ b/api/src/main/java/com/cloud/network/NsxProvider.java
@@ -0,0 +1,11 @@
+package com.cloud.network;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+public interface NsxProvider extends InternalIdentity, Identity {
+    String getHostname();
+    String getProviderName();
+    String getUsername();
+    long getZoneId();
+}
diff --git a/api/src/main/java/com/cloud/offering/NetworkOffering.java 
b/api/src/main/java/com/cloud/offering/NetworkOffering.java
index 7f0dc85b05f..afe2a255f5b 100644
--- a/api/src/main/java/com/cloud/offering/NetworkOffering.java
+++ b/api/src/main/java/com/cloud/offering/NetworkOffering.java
@@ -91,6 +91,8 @@ public interface NetworkOffering extends 
InfrastructureEntity, InternalIdentity,
 
     boolean isForTungsten();
 
+    boolean isForNsx();
+
     TrafficType getTrafficType();
 
     boolean isSpecifyVlan();
diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java 
b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
index 3e0e65220e1..8b4167131e1 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
@@ -679,6 +679,10 @@ public class ApiConstants {
     public static final String VSWITCH_TYPE_PUBLIC_TRAFFIC = 
"publicvswitchtype";
     public static final String VSWITCH_NAME_GUEST_TRAFFIC = "guestvswitchname";
     public static final String VSWITCH_NAME_PUBLIC_TRAFFIC = 
"publicvswitchname";
+
+    // NSX
+    public static final String EDGE_CLUSTER = "edgecluster";
+    public static final String TIER0_GATEWAY = "tier0gateway";
     // Tungsten-Fabric
     public static final String TUNGSTEN_VIRTUAL_ROUTER_UUID = 
"tungstenvirtualrouteruuid";
     public static final String TUNGSTEN_PROVIDER_HOSTNAME = 
"tungstenproviderhostname";
@@ -796,6 +800,7 @@ public class ApiConstants {
     public static final String FORCE_ENCAP = "forceencap";
     public static final String SPLIT_CONNECTIONS = "splitconnections";
     public static final String FOR_VPC = "forvpc";
+    public static final String FOR_NSX = "fornsx";
     public static final String FOR_TUNGSTEN = "fortungsten";
     public static final String SHRINK_OK = "shrinkok";
     public static final String NICIRA_NVP_DEVICE_ID = "nvpdeviceid";
diff --git 
a/api/src/main/java/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
 
b/api/src/main/java/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
index b92725d883e..4685580e4b5 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
@@ -99,6 +99,10 @@ public class NetworkOfferingResponse extends 
BaseResponseWithAnnotations {
     @Param(description = "true if network offering can be used by VPC networks 
only")
     private Boolean forVpc;
 
+    @SerializedName(ApiConstants.FOR_NSX)
+    @Param(description = "true if network offering can be used by NSX networks 
only")
+    private Boolean forNsx;
+
     @SerializedName(ApiConstants.FOR_TUNGSTEN)
     @Param(description = "true if network offering can be used by 
Tungsten-Fabric networks only")
     private Boolean forTungsten;
@@ -215,6 +219,10 @@ public class NetworkOfferingResponse extends 
BaseResponseWithAnnotations {
         this.forVpc = forVpc;
     }
 
+    public void setForNsx(Boolean forNsx) {
+        this.forNsx = forNsx;
+    }
+
     public void setForTungsten(Boolean forTungsten) {
         this.forTungsten = forTungsten;
     }
diff --git 
a/engine/schema/src/main/java/com/cloud/network/dao/NsxProviderDao.java 
b/engine/schema/src/main/java/com/cloud/network/dao/NsxProviderDao.java
new file mode 100644
index 00000000000..a4f6e997f60
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/network/dao/NsxProviderDao.java
@@ -0,0 +1,14 @@
+package com.cloud.network.dao;
+
+import com.cloud.network.element.NsxProviderVO;
+import com.cloud.utils.db.GenericDao;
+
+import java.util.List;
+
+public interface NsxProviderDao extends GenericDao<NsxProviderVO, Long> {
+    NsxProviderVO findByZoneId(long zoneId);
+
+    NsxProviderVO findByUuid(String uuid);
+
+    List<NsxProviderVO> findAll();
+}
diff --git 
a/engine/schema/src/main/java/com/cloud/network/dao/NsxProviderDaoImpl.java 
b/engine/schema/src/main/java/com/cloud/network/dao/NsxProviderDaoImpl.java
new file mode 100644
index 00000000000..c765b6bfae5
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/network/dao/NsxProviderDaoImpl.java
@@ -0,0 +1,19 @@
+package com.cloud.network.dao;
+
+import com.cloud.network.element.NsxProviderVO;
+import com.cloud.utils.db.GenericDaoBase;
+
+import java.util.List;
+
+public class NsxProviderDaoImpl extends GenericDaoBase<NsxProviderVO, Long>
+        implements NsxProviderDao {
+    @Override
+    public NsxProviderVO findByZoneId(long zoneId) {
+        return null;
+    }
+
+    @Override
+    public List<NsxProviderVO> findAll() {
+        return null;
+    }
+}
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
new file mode 100644
index 00000000000..2f67407cf79
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/network/element/NsxProviderVO.java
@@ -0,0 +1,137 @@
+package com.cloud.network.element;
+
+import com.cloud.network.NsxProvider;
+import com.cloud.utils.db.Encrypt;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.util.UUID;
+
+@Entity
+@Table(name = "nsx_providers")
+public class NsxProviderVO implements NsxProvider {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    long id;
+
+    @Column(name = "zone_id")
+    private long zoneId;
+
+    @Column(name = "uuid")
+    private String uuid;
+
+    @Column(name = "provider_name")
+    private String providerName;
+
+    @Column(name = "hostname")
+    private String hostname;
+
+    @Column(name = "username")
+    private String username;
+
+    @Encrypt
+    @Column(name = "password")
+    private String password;
+
+    @Column(name = "tier0_gateway")
+    private String tier0Gateway;
+
+    @Column(name = "edge_cluster")
+    private String edgeCluster;
+
+
+    public NsxProviderVO( long zoneId,String providerName, String hostname, 
String username, String password, String tier0Gateway, String edgeCluster) {
+        this.zoneId = zoneId;
+        this.uuid = UUID.randomUUID().toString();
+        this.providerName = providerName;
+        this.hostname = hostname;
+        this.username = username;
+        this.password = password;
+        this.tier0Gateway = tier0Gateway;
+        this.edgeCluster = edgeCluster;
+    }
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    @Override
+    public long getZoneId() {
+        return zoneId;
+    }
+
+    public void setZoneId(long zoneId) {
+        this.zoneId = zoneId;
+    }
+
+    @Override
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
+    @Override
+    public String getProviderName() {
+        return providerName;
+    }
+
+    public void setProviderName(String providerName) {
+        this.providerName = providerName;
+    }
+
+    @Override
+    public String getHostname() {
+        return hostname;
+    }
+
+    public void setHostname(String hostname) {
+        this.hostname = hostname;
+    }
+
+    @Override
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getTier0Gateway() {
+        return tier0Gateway;
+    }
+
+    public void setTier0Gateway(String tier0Gateway) {
+        this.tier0Gateway = tier0Gateway;
+    }
+
+    public String getEdgeCluster() {
+        return edgeCluster;
+    }
+
+    public void setEdgeCluster(String edgeCluster) {
+        this.edgeCluster = edgeCluster;
+    }
+}
diff --git 
a/engine/schema/src/main/java/com/cloud/offerings/NetworkOfferingVO.java 
b/engine/schema/src/main/java/com/cloud/offerings/NetworkOfferingVO.java
index ae5e6fb95ea..edc89f3cb9a 100644
--- a/engine/schema/src/main/java/com/cloud/offerings/NetworkOfferingVO.java
+++ b/engine/schema/src/main/java/com/cloud/offerings/NetworkOfferingVO.java
@@ -136,6 +136,9 @@ public class NetworkOfferingVO implements NetworkOffering {
     @Column(name = "for_tungsten")
     boolean forTungsten = false;
 
+    @Column(name = "for_nsx")
+    boolean forNsx = false;
+
     @Column(name = "egress_default_policy")
     boolean egressdefaultpolicy;
 
@@ -195,6 +198,15 @@ public class NetworkOfferingVO implements NetworkOffering {
         this.forTungsten = forTungsten;
     }
 
+    @Override
+    public boolean isForNsx() {
+        return forNsx;
+    }
+
+    public void setForNsx(boolean forNsx) {
+        this.forNsx = forNsx;
+    }
+
     @Override
     public long getId() {
         return id;
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 52c58fef171..fdef959b47b 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
@@ -180,3 +180,15 @@ CREATE TABLE `cloud`.`vm_scheduled_job` (
 -- Add support for different cluster types for kubernetes
 ALTER TABLE `cloud`.`kubernetes_cluster` ADD COLUMN `cluster_type` varchar(64) 
DEFAULT 'CloudManaged' COMMENT 'type of cluster';
 ALTER TABLE `cloud`.`kubernetes_cluster` MODIFY COLUMN `kubernetes_version_id` 
bigint unsigned NULL COMMENT 'the ID of the Kubernetes version of this 
Kubernetes cluster';
+
+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',
+    `provider_name` varchar(40),
+    `hostname` varchar(255) NOT NULL ,
+    `username` varchar(255) NOT NULL ,
+    `password` varchar(255) NOT NULL,
+    `tier0_gateway` varchar(255),
+    `edge_cluster` varchar(255)
+)
\ No newline at end of file
diff --git a/plugins/network-elements/nsx/pom.xml 
b/plugins/network-elements/nsx/pom.xml
index 9350e2aedaf..5f4b563ce08 100644
--- a/plugins/network-elements/nsx/pom.xml
+++ b/plugins/network-elements/nsx/pom.xml
@@ -29,4 +29,17 @@
         <version>4.19.0.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.vmware</groupId>
+            <artifactId>nsx-java-sdk</artifactId>
+            <version>4.1.0.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vmware</groupId>
+            <artifactId>nsx-gpm-java-sdk</artifactId>
+            <version>4.1.0.2.0</version>
+        </dependency>
+    </dependencies>
 </project>
diff --git 
a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/api/command/AddNsxControllerCmd.java
 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/api/command/AddNsxControllerCmd.java
new file mode 100644
index 00000000000..e91a8b3f03a
--- /dev/null
+++ 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/api/command/AddNsxControllerCmd.java
@@ -0,0 +1,99 @@
+package org.apache.cloudstack.api.command;
+
+import com.cloud.network.NsxProvider;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.response.NsxControllerResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.cloudstack.service.NsxProviderService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.inject.Inject;
+
+
+@APICommand(name = AddNsxControllerCmd.APINAME, description = "Add NSX 
Controller to CloudStack",
+        responseObject = NsxControllerResponse.class, requestHasSensitiveInfo 
= false, responseHasSensitiveInfo = false)
+public class AddNsxControllerCmd extends BaseCmd {
+    public static final String APINAME = "addNsxController";
+    public static final Logger LOGGER = 
LoggerFactory.getLogger(AddNsxControllerCmd.class.getName());
+
+    @Inject
+    NsxProviderService nsxProviderService;
+
+    @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, 
entityType = ZoneResponse.class, required = true,
+            description = "the ID of zone")
+    private Long zoneId;
+
+    @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = 
true, description = "NSX controller / provider name")
+    private String name;
+
+    @Parameter(name = ApiConstants.TUNGSTEN_PROVIDER_HOSTNAME, type = 
CommandType.STRING, required = true, description = "NSX controller hostname / 
IP address")
+    private String hostname;
+
+    @Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, 
required = true, description = "Username to log into NSX controller")
+    private String username;
+    @Parameter(name = ApiConstants.PASSWORD, type = CommandType.STRING, 
required = true, description = "Password to login into NSX controller")
+    private String password;
+
+    @Parameter(name = ApiConstants.TIER0_GATEWAY, type = CommandType.STRING, 
required = true, description = "Tier-0 Gateway address")
+    private String tier0Gateway;
+
+    @Parameter(name = ApiConstants.EDGE_CLUSTER, type = CommandType.STRING, 
required = true, description = "Edge Cluster name")
+    private String edgeCluster;
+
+    public NsxProviderService getNsxProviderService() {
+        return nsxProviderService;
+    }
+
+    public Long getZoneId() {
+        return zoneId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getHostname() {
+        return hostname;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String getTier0Gateway() {
+        return tier0Gateway;
+    }
+
+    public String getEdgeCluster() {
+        return edgeCluster;
+    }
+
+    @Override
+    public void execute() throws ServerApiException {
+        NsxProvider nsxProvider = nsxProviderService.addProvider(this);
+        NsxControllerResponse nsxControllerResponse =
+                nsxProviderService.createNsxControllerResponse(
+                        nsxProvider);
+        if (nsxControllerResponse == null)
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed 
to add NSX controller");
+        else {
+            nsxControllerResponse.setResponseName(getCommandName());
+            setResponseObject(nsxControllerResponse);
+        }
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return 0;
+    }
+}
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
new file mode 100644
index 00000000000..f164dbee487
--- /dev/null
+++ 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/api/response/NsxControllerResponse.java
@@ -0,0 +1,11 @@
+package org.apache.cloudstack.api.response;
+
+import com.cloud.network.NsxProvider;
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.EntityReference;
+
+@EntityReference(value = {NsxProvider.class})
+public class NsxControllerResponse extends BaseResponse {
+
+
+}
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 a4c562c931a..4cfc17c1cdf 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
@@ -133,36 +133,6 @@ public class NsxElement extends AdapterBase implements 
DhcpServiceProvider, DnsS
         return false;
     }
 
-    @Override
-    public String getName() {
-        return null;
-    }
-
-    @Override
-    public void setName(String name) {
-
-    }
-
-    @Override
-    public void setConfigParams(Map<String, Object> params) {
-
-    }
-
-    @Override
-    public Map<String, Object> getConfigParams() {
-        return null;
-    }
-
-    @Override
-    public int getRunLevel() {
-        return 0;
-    }
-
-    @Override
-    public void setRunLevel(int level) {
-
-    }
-
     @Override
     public boolean configure(String name, Map<String, Object> params) throws 
ConfigurationException {
         return false;
diff --git 
a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxGuestNetworkGuru.java
 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxGuestNetworkGuru.java
new file mode 100644
index 00000000000..4241583e642
--- /dev/null
+++ 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxGuestNetworkGuru.java
@@ -0,0 +1,55 @@
+package org.apache.cloudstack.service;
+
+import com.cloud.dc.DataCenter;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.network.Network;
+import com.cloud.network.NetworkMigrationResponder;
+import com.cloud.network.Networks;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.guru.GuestNetworkGuru;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachineProfile;
+import org.apache.log4j.Logger;
+
+import javax.inject.Inject;
+
+public class NsxGuestNetworkGuru extends GuestNetworkGuru implements 
NetworkMigrationResponder  {
+    private static final Logger LOGGER = 
Logger.getLogger(NsxGuestNetworkGuru.class);
+
+    @Inject
+    NetworkOfferingServiceMapDao networkOfferingServiceMapDao;
+
+    private static final Networks.TrafficType[] TrafficTypes = 
{Networks.TrafficType.Guest};
+
+    public NsxGuestNetworkGuru() {
+        super();
+        _isolationMethods = new PhysicalNetwork.IsolationMethod[] {new 
PhysicalNetwork.IsolationMethod("NSX")};
+    }
+
+
+    @Override
+    public boolean prepareMigration(NicProfile nic, Network network, 
VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) {
+        return false;
+    }
+
+    @Override
+    public void rollbackMigration(NicProfile nic, Network network, 
VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
+
+    }
+
+    @Override
+    public void commitMigration(NicProfile nic, Network network, 
VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
+
+    }
+
+    @Override
+    public boolean canHandle(NetworkOffering offering, DataCenter.NetworkType 
networkType,
+                             PhysicalNetwork physicalNetwork) {
+        return networkType == DataCenter.NetworkType.Advanced && 
isMyTrafficType(offering.getTrafficType())
+                && isMyIsolationMethod(physicalNetwork) && 
networkOfferingServiceMapDao.isProviderForNetworkOffering(
+                offering.getId(), Network.Provider.Tungsten);
+    }
+}
diff --git 
a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxProviderService.java
 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxProviderService.java
new file mode 100644
index 00000000000..2aefbf6488a
--- /dev/null
+++ 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxProviderService.java
@@ -0,0 +1,17 @@
+package org.apache.cloudstack.service;
+
+import com.cloud.network.NsxProvider;
+import com.cloud.utils.component.PluggableService;
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.command.AddNsxControllerCmd;
+import org.apache.cloudstack.api.response.NsxControllerResponse;
+
+import java.util.List;
+
+public interface NsxProviderService extends PluggableService {
+    NsxProvider addProvider(AddNsxControllerCmd cmd);
+
+    NsxControllerResponse createNsxControllerResponse(NsxProvider 
tungstenProvider);
+
+    List<BaseResponse> listTungstenProvider(Long zoneId);
+}
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
new file mode 100644
index 00000000000..d98b1d94245
--- /dev/null
+++ 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxProviderServiceImpl.java
@@ -0,0 +1,51 @@
+package org.apache.cloudstack.service;
+
+import com.cloud.host.DetailVO;
+import com.cloud.network.NsxProvider;
+import com.cloud.network.dao.NsxProviderDao;
+import com.cloud.network.element.NsxProviderVO;
+import com.cloud.network.element.TungstenProviderVO;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.exception.CloudRuntimeException;
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.command.AddNsxControllerCmd;
+import org.apache.cloudstack.api.response.NsxControllerResponse;
+
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+import java.util.List;
+
+public class NsxProviderServiceImpl implements NsxProviderService {
+
+    @Inject
+    NsxProviderDao nsxProviderDao;
+
+    @Override
+    public NsxProvider addProvider(AddNsxControllerCmd cmd) {
+        NsxProviderVO nsxProvider = 
Transaction.execute((TransactionCallback<NsxProviderVO>) status -> {
+            NsxProviderVO nsxProviderVO = new NsxProviderVO(cmd.getZoneId(), 
cmd.getName(), cmd.getHostname(),
+                    cmd.getUsername(),  cmd.getPassword(),
+                    cmd.getTier0Gateway(), cmd.getEdgeCluster());
+            nsxProviderDao.persist(nsxProviderVO);
+
+            return nsxProviderVO;
+        });
+        return null;
+    }
+
+    @Override
+    public NsxControllerResponse createNsxControllerResponse(NsxProvider 
tungstenProvider) {
+        return null;
+    }
+
+    @Override
+    public List<BaseResponse> listTungstenProvider(Long zoneId) {
+        return null;
+    }
+
+    @Override
+    public List<Class<?>> getCommands() {
+        return null;
+    }
+}
diff --git 
a/plugins/network-elements/nsx/src/main/resources/META-INF/cloudstack/nsx/spring-nsx-context.xml
 
b/plugins/network-elements/nsx/src/main/resources/META-INF/cloudstack/nsx/spring-nsx-context.xml
index c7be491e247..898975067fb 100644
--- 
a/plugins/network-elements/nsx/src/main/resources/META-INF/cloudstack/nsx/spring-nsx-context.xml
+++ 
b/plugins/network-elements/nsx/src/main/resources/META-INF/cloudstack/nsx/spring-nsx-context.xml
@@ -26,7 +26,10 @@
                       http://www.springframework.org/schema/context
                       
http://www.springframework.org/schema/context/spring-context.xsd";>
     <bean id="Nsx" class="org.apache.cloudstack.service.NsxElement">
-        <property name="name" value="NsxElement"/>
+        <property name="name" value="Nsx"/>
+    </bean>
+    <bean id="NsxGuestNetworkGuru" 
class="org.apache.cloudstack.service.NsxGuestNetworkGuru">
+        <property name="name" value="NsxGuestNetworkGuru" />
     </bean>
 
 </beans>
diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java 
b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
index 568625c856b..fd86043ed51 100644
--- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
@@ -2310,6 +2310,7 @@ public class ApiResponseHelper implements 
ResponseGenerator {
         }
         response.setForVpc(_configMgr.isOfferingForVpc(offering));
         response.setForTungsten(offering.isForTungsten());
+        response.setForNsx(offering.isForNsx());
         response.setServices(serviceResponses);
         //set network offering details
         Map<Detail, String> details = 
_ntwkModel.getNtwkOffDetails(offering.getId());
diff --git 
a/server/src/main/java/com/cloud/api/query/vo/NetworkOfferingJoinVO.java 
b/server/src/main/java/com/cloud/api/query/vo/NetworkOfferingJoinVO.java
index 2f89b195868..f5d4e150cb3 100644
--- a/server/src/main/java/com/cloud/api/query/vo/NetworkOfferingJoinVO.java
+++ b/server/src/main/java/com/cloud/api/query/vo/NetworkOfferingJoinVO.java
@@ -157,6 +157,8 @@ public class NetworkOfferingJoinVO extends BaseViewVO 
implements NetworkOffering
     @Column(name = "for_tungsten")
     boolean forTungsten;
 
+    @Column(name = "for_nsx")
+    boolean forNsx;
     @Column(name = "service_package_id")
     private String servicePackageUuid = null;
 
@@ -349,6 +351,15 @@ public class NetworkOfferingJoinVO extends BaseViewVO 
implements NetworkOffering
 
     public void setForVpc(boolean forVpc) { this.forVpc = forVpc; }
 
+    @Override
+    public boolean isForNsx() {
+        return forNsx;
+    }
+
+    public void setForNsx(boolean forNsx) {
+        this.forNsx = forNsx;
+    }
+
     public String getServicePackage() {
         return servicePackageUuid;
     }
diff --git a/server/src/main/java/com/cloud/server/ConfigurationServerImpl.java 
b/server/src/main/java/com/cloud/server/ConfigurationServerImpl.java
index 3f9447812a7..1b318f6b5f0 100644
--- a/server/src/main/java/com/cloud/server/ConfigurationServerImpl.java
+++ b/server/src/main/java/com/cloud/server/ConfigurationServerImpl.java
@@ -999,6 +999,11 @@ public class ConfigurationServerImpl extends ManagerBase 
implements Configuratio
         defaultTungstenSharedSGNetworkOfferingProviders.put(Service.Dns, 
Provider.Tungsten);
         
defaultTungstenSharedSGNetworkOfferingProviders.put(Service.SecurityGroup, 
Provider.Tungsten);
 
+        final Map<Network.Service, Network.Provider> 
defaultNSXNetworkOfferingProviders = new HashMap<>();
+        defaultNSXNetworkOfferingProviders.put(Service.Connectivity, 
Provider.Nsx);
+        defaultNSXNetworkOfferingProviders.put(Service.Dhcp, Provider.Nsx);
+        defaultNSXNetworkOfferingProviders.put(Service.Dns, Provider.Nsx);
+
         final Map<Network.Service, Network.Provider> 
defaultIsolatedSourceNatEnabledNetworkOfferingProviders = new 
HashMap<Network.Service, Network.Provider>();
         
defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dhcp, 
Provider.VirtualRouter);
         
defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dns, 
Provider.VirtualRouter);
@@ -1200,6 +1205,20 @@ public class ConfigurationServerImpl extends ManagerBase 
implements Configuratio
                 }
 
                 _networkOfferingDao.persistDefaultL2NetworkOfferings();
+                // Offering #9 - network offering for nsx provider
+                NetworkOfferingVO defaultNSXNetworkOffering =
+                        new 
NetworkOfferingVO(NetworkOffering.DEFAULT_NSX_OFFERING, "Offering for NSX 
enabled networks",
+                                TrafficType.Guest, false, true, null, null, 
true, Availability.Optional, null, GuestType.Isolated, true, true, false, 
false, false, false);
+
+                
defaultNSXNetworkOffering.setState(NetworkOffering.State.Enabled);
+                defaultNSXNetworkOffering = 
_networkOfferingDao.persistDefaultNetworkOffering(defaultTungstenSharedSGNetworkOffering);
+
+                for (Map.Entry<Network.Service, Network.Provider> service : 
defaultNSXNetworkOfferingProviders.entrySet()) {
+                    NetworkOfferingServiceMapVO offService =
+                            new 
NetworkOfferingServiceMapVO(defaultNSXNetworkOffering.getId(), 
service.getKey(), service.getValue());
+                    _ntwkOfferingServiceMapDao.persist(offService);
+                    s_logger.trace("Added service for the network offering: " 
+ offService);
+                }
             }
         });
     }
diff --git a/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue 
b/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue
index e424ddccc16..5491612411f 100644
--- a/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue
+++ b/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue
@@ -66,6 +66,7 @@
             <a-select-option value="VSP"> VSP </a-select-option>
             <a-select-option value="VCS"> VCS </a-select-option>
             <a-select-option value="TF"> TF </a-select-option>
+            <a-select-option value="NSX"> NSX </a-select-option>
 
             <template #suffixIcon>
               <a-tooltip

Reply via email to