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/18 20:51:21 UTC

[cloudstack] branch nsx-integration updated (5b4e8859544 -> 913d0bc3f7d)

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


 discard 5b4e8859544 add delete nsx controller operation
     new 913d0bc3f7d add delete nsx controller operation

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (5b4e8859544)
            \
             N -- N -- N   refs/heads/nsx-integration (913d0bc3f7d)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 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:
 .../cloudstack/api/command/DeleteNsxControllerCmd.java   | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)


[cloudstack] 01/01: add delete nsx controller operation

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 913d0bc3f7d497f1e70df1971ab140a5b43b5c23
Author: Pearl Dsilva <pe...@gmail.com>
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        | 87 ++++++++++++++++++++++
 .../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, 155 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..ba5f3f5fcfe
--- /dev/null
+++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/api/command/DeleteNsxControllerCmd.java
@@ -0,0 +1,87 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package 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',