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 5b4e8859544 add delete nsx controller operation
5b4e8859544 is described below

commit 5b4e8859544b864ee77c76c0c226a621f291c11c
Author: Pearl Dsilva <[email protected]>
AuthorDate: Fri Aug 18 16:47:04 2023 -0400

    add delete nsx controller operation
---
 .../org/apache/cloudstack/api/ApiConstants.java    |  1 +
 .../com/cloud/network/dao/NsxProviderDaoImpl.java  | 23 +++++++
 .../spring-engine-schema-core-daos-context.xml     |  1 +
 .../api/command/DeleteNsxControllerCmd.java        | 71 ++++++++++++++++++++++
 .../cloudstack/service/NsxProviderService.java     |  4 +-
 .../cloudstack/service/NsxProviderServiceImpl.java | 38 ++++++++++++
 .../META-INF/cloudstack/nsx/spring-nsx-context.xml |  1 +
 tools/apidoc/gen_toc.py                            |  1 +
 8 files changed, 139 insertions(+), 1 deletion(-)

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 8b4167131e1..d90f9b91f86 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
@@ -810,6 +810,7 @@ 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 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 0be2bd8db4e..8d4cb01bf42 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
@@ -18,11 +18,34 @@ package com.cloud.network.dao;
 
 import com.cloud.network.element.NsxProviderVO;
 import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
 
 import java.util.List;
 
 public class NsxProviderDaoImpl extends GenericDaoBase<NsxProviderVO, Long>
         implements NsxProviderDao {
+
+    final SearchBuilder<NsxProviderVO> allFieldsSearch;
+    public NsxProviderDaoImpl() {
+        super();
+        allFieldsSearch = createSearchBuilder();
+        allFieldsSearch.and("id", allFieldsSearch.entity().getId(),
+                SearchCriteria.Op.EQ);
+        allFieldsSearch.and("uuid", allFieldsSearch.entity().getUuid(),
+                SearchCriteria.Op.EQ);
+        allFieldsSearch.and("hostname", allFieldsSearch.entity().getHostname(),
+                SearchCriteria.Op.EQ);
+        allFieldsSearch.and("provider_name", 
allFieldsSearch.entity().getProviderName(),
+                SearchCriteria.Op.EQ);
+        allFieldsSearch.and("tier0_gateway", 
allFieldsSearch.entity().getTier0Gateway(),
+                SearchCriteria.Op.EQ);
+        allFieldsSearch.and("zone_id", allFieldsSearch.entity().getZoneId(),
+                SearchCriteria.Op.EQ);
+        allFieldsSearch.and("edge_cluster", 
allFieldsSearch.entity().getEdgeCluster(),
+                SearchCriteria.Op.EQ);
+        allFieldsSearch.done();
+    }
     @Override
     public NsxProviderVO findByZoneId(long zoneId) {
         return null;
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 04ec733594e..88f0616a1c1 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,6 +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="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/src/main/java/org/apache/cloudstack/api/command/DeleteNsxControllerCmd.java
 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/api/command/DeleteNsxControllerCmd.java
new file mode 100644
index 00000000000..643011599e6
--- /dev/null
+++ 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/api/command/DeleteNsxControllerCmd.java
@@ -0,0 +1,71 @@
+package org.apache.cloudstack.api.command;
+
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.utils.exception.CloudRuntimeException;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.ApiConstants;
+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.SuccessResponse;
+import org.apache.cloudstack.service.NsxProviderService;
+
+import javax.inject.Inject;
+
+import static org.apache.cloudstack.api.command.DeleteNsxControllerCmd.APINAME;
+
+@APICommand(name = APINAME, description = "Add NSX Controller to CloudStack",
+        responseObject = NsxControllerResponse.class, requestHasSensitiveInfo 
= false,
+        responseHasSensitiveInfo = false, since = "4.19.0.0")
+public class DeleteNsxControllerCmd extends BaseCmd {
+    public static final String APINAME = "deleteNsxController";
+
+    @Inject
+    protected NsxProviderService nsxProviderService;
+/////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.NSX_CONTROLLER_ID, type = CommandType.UUID, 
entityType = NsxControllerResponse.class,
+            required = true, description = "NSX Controller ID")
+    private Long nsxControllerId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getNsxControllerId() {
+        return nsxControllerId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+
+    @Override
+    public void execute() throws ServerApiException, 
ConcurrentOperationException {
+        try {
+            boolean deleted = 
nsxProviderService.deleteNsxController(getNsxControllerId());
+            if (deleted) {
+                SuccessResponse response = new 
SuccessResponse(getCommandName());
+                response.setResponseName(getCommandName());
+                setResponseObject(response);
+            } else {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, 
"Failed to remove NSX Controller from Zone");
+            }
+        } catch (InvalidParameterValueException e) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, 
e.getMessage());
+        } catch (CloudRuntimeException e) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, 
e.getMessage());
+        }
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return 0;
+    }
+}
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
index ae047fe9df3..d007cc5b6eb 100644
--- 
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
@@ -27,7 +27,9 @@ import java.util.List;
 public interface NsxProviderService extends PluggableService {
     NsxProvider addProvider(AddNsxControllerCmd cmd);
 
-    NsxControllerResponse createNsxControllerResponse(NsxProvider 
tungstenProvider);
+    NsxControllerResponse createNsxControllerResponse(NsxProvider nsxProvider);
 
     List<BaseResponse> listNsxProviders(Long zoneId);
+
+    boolean deleteNsxController(Long nsxControllerId);
 }
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 637d100ba1a..9c6ed426c34 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
@@ -16,10 +16,18 @@
 // under the License.
 package org.apache.cloudstack.service;
 
+import com.amazonaws.util.CollectionUtils;
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.network.Network;
+import com.cloud.network.Networks;
 import com.cloud.network.NsxProvider;
+import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.dao.NsxProviderDao;
+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.utils.db.Transaction;
 import com.cloud.utils.db.TransactionCallback;
@@ -40,6 +48,10 @@ public class NsxProviderServiceImpl implements 
NsxProviderService {
     NsxProviderDao nsxProviderDao;
     @Inject
     DataCenterDao dataCenterDao;
+    @Inject
+    PhysicalNetworkDao physicalNetworkDao;
+    @Inject
+    NetworkDao networkDao;
 
     @Override
     public NsxProvider addProvider(AddNsxControllerCmd cmd) {
@@ -85,6 +97,32 @@ public class NsxProviderServiceImpl implements 
NsxProviderService {
         return nsxControllersResponseList;
     }
 
+    @Override
+    public boolean deleteNsxController(Long nsxControllerId) {
+        NsxProviderVO nsxProvider = nsxProviderDao.findById(nsxControllerId);
+        if (Objects.isNull(nsxProvider)) {
+            throw new InvalidParameterValueException(String.format("Failed to 
find NSX controller with id: %s", nsxControllerId));
+        }
+        Long zoneId = nsxProvider.getZoneId();
+        // Find the physical network we work for
+        List<PhysicalNetworkVO> physicalNetworks = 
physicalNetworkDao.listByZone(zoneId);
+        for (PhysicalNetworkVO physicalNetwork : physicalNetworks) {
+            List<NetworkVO> networkList = 
networkDao.listByPhysicalNetwork(physicalNetwork.getId());
+            if (!CollectionUtils.isNullOrEmpty(networkList)) {
+                // Networks with broadcast type vcs are ours
+                for (NetworkVO network : networkList) {
+                    if (network.getBroadcastDomainType() == 
Networks.BroadcastDomainType.NSX) {
+                        if ((network.getState() != Network.State.Shutdown) && 
(network.getState() != Network.State.Destroy)) {
+                            throw new CloudRuntimeException("This NSX 
Controller cannot be deleted as there are one or more logical networks 
provisioned by CloudStack on it.");
+                        }
+                    }
+                }
+            }
+        }
+        nsxProviderDao.remove(nsxControllerId);
+        return true;
+    }
+
     @Override
     public List<Class<?>> getCommands() {
         List<Class<?>> cmdList = new ArrayList<Class<?>>();
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 898975067fb..8ebd1ce6d13 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
@@ -31,5 +31,6 @@
     <bean id="NsxGuestNetworkGuru" 
class="org.apache.cloudstack.service.NsxGuestNetworkGuru">
         <property name="name" value="NsxGuestNetworkGuru" />
     </bean>
+    <bean id="nsxProviderService" 
class="org.apache.cloudstack.service.NsxProviderServiceImpl"/>
 
 </beans>
diff --git a/tools/apidoc/gen_toc.py b/tools/apidoc/gen_toc.py
index bdb53d5bf21..556b1dca41e 100644
--- a/tools/apidoc/gen_toc.py
+++ b/tools/apidoc/gen_toc.py
@@ -135,6 +135,7 @@ known_categories = {
     'listTungstenFabricLBHealthMonitor': 'Tungsten',
     'listNsxControllers': 'NSX',
     'addNsxController': 'NSX',
+    'deleteNsxController': 'NSX',
     'Vpn': 'VPN',
     'Limit': 'Limit',
     'ResourceCount': 'Limit',

Reply via email to