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


The following commit(s) were added to refs/heads/nsx-integration by this push:
     new 6711d4bc5b4 add nsxresource
6711d4bc5b4 is described below

commit 6711d4bc5b426c27653ffaa2efe2f32bd31f561a
Author: Pearl Dsilva <[email protected]>
AuthorDate: Mon Aug 21 16:39:35 2023 -0400

    add nsxresource
---
 .../org/apache/cloudstack/api/ApiConstants.java    |   4 +-
 .../com/cloud/network/dao/NsxProviderDaoImpl.java  |  11 ++-
 .../com/cloud/network/element/NsxProviderVO.java   |   3 +
 .../spring-engine-schema-core-daos-context.xml     |   2 +-
 plugins/network-elements/nsx/pom.xml               |  15 +++
 .../api/command/AddNsxControllerCmd.java           |   5 +-
 .../apache/cloudstack/resource/NsxResource.java    | 106 +++++++++++++++++++++
 .../cloudstack/service/NsxProviderServiceImpl.java |  66 ++++++++++---
 8 files changed, 196 insertions(+), 16 deletions(-)

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 d90f9b91f86..7b78e02be24 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
@@ -810,7 +810,9 @@ public class ApiConstants {
     public static final String NICIRA_NVP_L2_GATEWAYSERVICE_UUID = 
"l2gatewayserviceuuid";
     public static final String NSX_LOGICAL_SWITCH = "nsxlogicalswitch";
     public static final String NSX_LOGICAL_SWITCH_PORT = 
"nsxlogicalswitchport";
-    public static final String NSX_CONTROLLER_ID = "nsxcontrollerid";
+    public static final String NSX_PROVIDER_HOSTNAME = "nsxproviderhostname";
+    public static final String NSX_PROVIDER_PORT = "nsxproviderport";
+
     public static final String S3_ACCESS_KEY = "accesskey";
     public static final String S3_SECRET_KEY = "secretkey";
     public static final String S3_END_POINT = "endpoint";
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
index 8d4cb01bf42..cf7b5d405c0 100644
--- a/engine/schema/src/main/java/com/cloud/network/dao/NsxProviderDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/network/dao/NsxProviderDaoImpl.java
@@ -17,16 +17,21 @@
 package com.cloud.network.dao;
 
 import com.cloud.network.element.NsxProviderVO;
+import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import org.springframework.stereotype.Component;
 
 import java.util.List;
 
+@Component
+@DB()
 public class NsxProviderDaoImpl extends GenericDaoBase<NsxProviderVO, Long>
         implements NsxProviderDao {
 
     final SearchBuilder<NsxProviderVO> allFieldsSearch;
+
     public NsxProviderDaoImpl() {
         super();
         allFieldsSearch = createSearchBuilder();
@@ -48,11 +53,13 @@ public class NsxProviderDaoImpl extends 
GenericDaoBase<NsxProviderVO, Long>
     }
     @Override
     public NsxProviderVO findByZoneId(long zoneId) {
-        return null;
+        SearchCriteria<NsxProviderVO> sc = allFieldsSearch.create();
+        sc.setParameters("zone_id", zoneId);
+        return findOneBy(sc);
     }
 
     @Override
     public List<NsxProviderVO> findAll() {
-        return null;
+        return listAll();
     }
 }
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 88aa947fde8..3561ed4227f 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
@@ -61,6 +61,9 @@ public class NsxProviderVO implements NsxProvider {
     @Column(name = "edge_cluster")
     private String edgeCluster;
 
+    public NsxProviderVO() {
+        this.uuid = UUID.randomUUID().toString();
+    }
 
     public NsxProviderVO( long zoneId,String providerName, String hostname, 
String username, String password, String tier0Gateway, String edgeCluster) {
         this.zoneId = zoneId;
diff --git 
a/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
 
b/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
index 88f0616a1c1..db40cf3a156 100644
--- 
a/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
+++ 
b/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
@@ -136,7 +136,7 @@
   <bean id="nicIpAliasDaoImpl" class="com.cloud.vm.dao.NicIpAliasDaoImpl" />
   <bean id="objectInDataStoreDaoImpl" 
class="org.apache.cloudstack.storage.db.ObjectInDataStoreDaoImpl" />
   <bean id="ovsProviderDaoImpl" 
class="com.cloud.network.dao.OvsProviderDaoImpl" />
-  <bean id="nsxProviderDao" class="com.cloud.network.dao.NsxProviderDaoImpl" />
+  <bean id="nsxControllerDaoImpl" 
class="com.cloud.network.dao.NsxProviderDaoImpl" />
   <bean id="tungstenControllerDaoImpl" 
class="com.cloud.network.dao.TungstenProviderDaoImpl"/>
   <bean id="physicalNetworkDaoImpl" 
class="com.cloud.network.dao.PhysicalNetworkDaoImpl" />
   <bean id="physicalNetworkIsolationMethodDaoImpl" 
class="com.cloud.network.dao.PhysicalNetworkIsolationMethodDaoImpl" />
diff --git a/plugins/network-elements/nsx/pom.xml 
b/plugins/network-elements/nsx/pom.xml
index 5f4b563ce08..cf2934d253f 100644
--- a/plugins/network-elements/nsx/pom.xml
+++ b/plugins/network-elements/nsx/pom.xml
@@ -41,5 +41,20 @@
             <artifactId>nsx-gpm-java-sdk</artifactId>
             <version>4.1.0.2.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.vmware</groupId>
+            <artifactId>nsx-policy-java-sdk</artifactId>
+            <version>4.1.0.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vmware.vapi</groupId>
+            <artifactId>vapi-authentication</artifactId>
+            <version>2.40.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vmware.vapi</groupId>
+            <artifactId>vapi-authentication</artifactId>
+            <version>2.37.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
index 9e95861ad32..8ff58bbd4c9 100644
--- 
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
@@ -50,9 +50,12 @@ public class AddNsxControllerCmd extends BaseCmd {
     @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")
+    @Parameter(name = ApiConstants.NSX_PROVIDER_HOSTNAME, type = 
CommandType.STRING, required = true, description = "NSX controller hostname / 
IP address")
     private String hostname;
 
+    // TODO: May not be required
+    @Parameter(name = ApiConstants.NSX_PROVIDER_PORT, type = 
CommandType.STRING, description = "NSX controller port")
+    private String port;
     @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")
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
new file mode 100644
index 00000000000..c98f580d9b6
--- /dev/null
+++ 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java
@@ -0,0 +1,106 @@
+package org.apache.cloudstack.resource;
+
+import com.cloud.agent.IAgentControl;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.PingCommand;
+import com.cloud.agent.api.StartupCommand;
+import com.cloud.host.Host;
+import com.cloud.resource.ServerResource;
+import com.vmware.vapi.cis.authn.SecurityContextFactory;
+import org.apache.log4j.Logger;
+
+
+import javax.naming.ConfigurationException;
+import java.util.Map;
+
+public class NsxResource implements ServerResource {
+    private static final Logger s_logger = Logger.getLogger(NsxResource.class);
+    private String name;
+    protected String hostname;
+    protected String username;
+    protected String password;
+    protected String guid;
+    protected String tier0Gateway;
+    protected String edgeCluster;
+
+    @Override
+    public Host.Type getType() {
+        return Host.Type.Routing;
+    }
+
+    @Override
+    public StartupCommand[] initialize() {
+        return new StartupCommand[0];
+    }
+
+    @Override
+    public PingCommand getCurrentStatus(long id) {
+        return null;
+    }
+
+    @Override
+    public Answer executeRequest(Command cmd) {
+        return null;
+    }
+
+    @Override
+    public void disconnected() {
+
+    }
+
+    @Override
+    public IAgentControl getAgentControl() {
+        return null;
+    }
+
+    @Override
+    public void setAgentControl(IAgentControl agentControl) {
+
+    }
+
+    @Override
+    public String getName() {
+        return null;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = 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;
+    }
+
+    @Override
+    public boolean start() {
+        return true;
+    }
+
+    @Override
+    public boolean stop() {
+        return true;
+    }
+}
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 9c6ed426c34..c0c658548f2 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,9 @@ 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;
 import com.cloud.network.NsxProvider;
@@ -29,6 +32,7 @@ import com.cloud.network.dao.PhysicalNetworkDao;
 import com.cloud.network.dao.PhysicalNetworkVO;
 import com.cloud.network.dao.NetworkVO;
 import com.cloud.network.element.NsxProviderVO;
+import com.cloud.resource.ResourceManager;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.TransactionCallback;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -36,11 +40,11 @@ import 
org.apache.cloudstack.api.command.ListNsxControllersCmd;
 import org.apache.cloudstack.api.BaseResponse;
 import org.apache.cloudstack.api.command.AddNsxControllerCmd;
 import org.apache.cloudstack.api.response.NsxControllerResponse;
+import org.apache.cloudstack.resource.NsxResource;
 
 import javax.inject.Inject;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
+import javax.naming.ConfigurationException;
+import java.util.*;
 
 public class NsxProviderServiceImpl implements NsxProviderService {
 
@@ -52,17 +56,57 @@ public class NsxProviderServiceImpl implements 
NsxProviderService {
     PhysicalNetworkDao physicalNetworkDao;
     @Inject
     NetworkDao networkDao;
+    @Inject
+    ResourceManager resourceManager;
+    @Inject
+    HostDetailsDao hostDetailsDao;
 
     @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;
+        Long zoneId = cmd.getZoneId();
+        String name = cmd.getName();
+        String hostname = cmd.getHostname();
+        String username = cmd.getUsername();
+        String password = cmd.getPassword();
+        String tier0Gateway = cmd.getTier0Gateway();
+        String edgeCluster = cmd.getEdgeCluster();
+
+        Map<String, String> params = new HashMap<>();
+        params.put("guid", UUID.randomUUID().toString());
+        params.put("zoneId", zoneId.toString());
+        params.put("name", name);
+        params.put("hostname", hostname);
+        params.put("username", username);
+        params.put("password", password);
+        params.put("tier0Gateway", tier0Gateway);
+        params.put("edgeCluster", edgeCluster);
+
+        Map<String, Object> hostdetails = new HashMap<>(params);
+        NsxProvider nsxProvider;
+
+        NsxResource nsxResource = new NsxResource();
+        try {
+            nsxResource.configure(hostname, hostdetails);
+            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,
+                            username, password, tier0Gateway, edgeCluster);
+                    nsxProviderDao.persist(nsxProviderVO);
+
+                    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.");
+            }
+        } catch (ConfigurationException e) {
+            throw new CloudRuntimeException(e.getMessage());
+        }
+        return  nsxProvider;
     }
 
     @Override

Reply via email to