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 <[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 | 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',
