From b9fb24d7f63e51c840d309468e9c3f8cd4a6d819 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Wed, 7 Feb 2024 02:08:36 -0300 Subject: [PATCH] Fix zone creation issue for internal load balancer --- .../com/cloud/network/NetworkService.java | 6 +++ .../org/apache/cloudstack/api/BaseCmd.java | 3 -- ...nfigureInternalLoadBalancerElementCmd.java | 10 +--- .../CreateInternalLoadBalancerElementCmd.java | 13 ++--- .../ListInternalLoadBalancerElementsCmd.java | 23 ++++---- .../InternalLoadBalancerElementService.java | 4 +- .../spring-core-registry-core-context.xml | 8 +++ ...-lifecycle-network-context-inheritable.xml | 5 ++ .../element/InternalLoadBalancerElement.java | 16 +++--- .../apache/cloudstack/service/NsxElement.java | 5 ++ .../com/cloud/network/NetworkServiceImpl.java | 54 +++++++++++++++++-- .../spring-server-core-managers-context.xml | 1 + .../com/cloud/vpc/MockNetworkManagerImpl.java | 22 ++++++++ 13 files changed, 129 insertions(+), 41 deletions(-) diff --git a/api/src/main/java/com/cloud/network/NetworkService.java b/api/src/main/java/com/cloud/network/NetworkService.java index 3efbc315e1a..51799e25cda 100644 --- a/api/src/main/java/com/cloud/network/NetworkService.java +++ b/api/src/main/java/com/cloud/network/NetworkService.java @@ -56,6 +56,7 @@ import com.cloud.utils.Pair; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.Nic; import com.cloud.vm.NicSecondaryIp; +import org.apache.cloudstack.network.element.InternalLoadBalancerElementService; /** * The NetworkService interface is the "public" api to entities that make requests to the orchestration engine @@ -257,4 +258,9 @@ public interface NetworkService { PublicIpQuarantine updatePublicIpAddressInQuarantine(UpdateQuarantinedIpCmd cmd); void removePublicIpAddressFromQuarantine(RemoveQuarantinedIpCmd cmd); + + InternalLoadBalancerElementService getInternalLoadBalancerElementByType(VirtualRouterProvider.Type type); + InternalLoadBalancerElementService getInternalLoadBalancerElementByNetworkServiceProviderId(long networkProviderId); + InternalLoadBalancerElementService getInternalLoadBalancerElementById(long providerId); + List getInternalLoadBalancerElements(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java b/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java index f32922819b0..b2f4ed88cc6 100644 --- a/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java @@ -38,7 +38,6 @@ import org.apache.cloudstack.affinity.AffinityGroupService; import org.apache.cloudstack.alert.AlertService; import org.apache.cloudstack.annotation.AnnotationService; import org.apache.cloudstack.context.CallContext; -import org.apache.cloudstack.network.element.InternalLoadBalancerElementService; import org.apache.cloudstack.network.lb.ApplicationLoadBalancerService; import org.apache.cloudstack.network.lb.InternalLoadBalancerVMService; import org.apache.cloudstack.query.QueryService; @@ -200,8 +199,6 @@ public abstract class BaseCmd { @Inject public AffinityGroupService _affinityGroupService; @Inject - public InternalLoadBalancerElementService _internalLbElementSvc; - @Inject public InternalLoadBalancerVMService _internalLbSvc; @Inject public NetworkModel _ntwkModel; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java index 1c7e4a0ce21..9c5271e345f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java @@ -17,10 +17,6 @@ package org.apache.cloudstack.api.command.admin.internallb; -import java.util.List; - -import javax.inject.Inject; - import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -49,9 +45,6 @@ import com.cloud.user.Account; public class ConfigureInternalLoadBalancerElementCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(ConfigureInternalLoadBalancerElementCmd.class.getName()); - @Inject - private List _service; - ///////////////////////////////////////////////////// //////////////// API parameters ///////////////////// ///////////////////////////////////////////////////// @@ -100,7 +93,8 @@ public class ConfigureInternalLoadBalancerElementCmd extends BaseAsyncCmd { @Override public void execute() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { CallContext.current().setEventDetails("Internal load balancer element: " + id); - VirtualRouterProvider result = _service.get(0).configureInternalLoadBalancerElement(getId(), getEnabled()); + InternalLoadBalancerElementService service = _networkService.getInternalLoadBalancerElementById(id); + VirtualRouterProvider result = service.configureInternalLoadBalancerElement(getId(), getEnabled()); if (result != null) { InternalLoadBalancerElementResponse routerResponse = _responseGenerator.createInternalLbElementResponse(result); routerResponse.setResponseName(getCommandName()); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/CreateInternalLoadBalancerElementCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/CreateInternalLoadBalancerElementCmd.java index f11f081031a..db79347f1e0 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/CreateInternalLoadBalancerElementCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/CreateInternalLoadBalancerElementCmd.java @@ -16,10 +16,6 @@ // under the License. package org.apache.cloudstack.api.command.admin.internallb; -import java.util.List; - -import javax.inject.Inject; - import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -47,9 +43,6 @@ import com.cloud.user.Account; public class CreateInternalLoadBalancerElementCmd extends BaseAsyncCreateCmd { public static final Logger s_logger = Logger.getLogger(CreateInternalLoadBalancerElementCmd.class.getName()); - @Inject - private List _service; - ///////////////////////////////////////////////////// //////////////// API parameters ///////////////////// ///////////////////////////////////////////////////// @@ -85,7 +78,8 @@ public class CreateInternalLoadBalancerElementCmd extends BaseAsyncCreateCmd { @Override public void execute() { CallContext.current().setEventDetails("Virtual router element Id: " + getEntityId()); - VirtualRouterProvider result = _service.get(0).getInternalLoadBalancerElement(getEntityId()); + InternalLoadBalancerElementService service = _networkService.getInternalLoadBalancerElementByNetworkServiceProviderId(getNspId()); + VirtualRouterProvider result = service.getInternalLoadBalancerElement(getEntityId()); if (result != null) { InternalLoadBalancerElementResponse response = _responseGenerator.createInternalLbElementResponse(result); response.setResponseName(getCommandName()); @@ -97,7 +91,8 @@ public class CreateInternalLoadBalancerElementCmd extends BaseAsyncCreateCmd { @Override public void create() throws ResourceAllocationException { - VirtualRouterProvider result = _service.get(0).addInternalLoadBalancerElement(getNspId()); + InternalLoadBalancerElementService service = _networkService.getInternalLoadBalancerElementByNetworkServiceProviderId(getNspId()); + VirtualRouterProvider result = service.addInternalLoadBalancerElement(getNspId()); if (result != null) { setEntityId(result.getId()); setEntityUuid(result.getUuid()); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/ListInternalLoadBalancerElementsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/ListInternalLoadBalancerElementsCmd.java index 82d373e3119..d883d6f10f9 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/ListInternalLoadBalancerElementsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/ListInternalLoadBalancerElementsCmd.java @@ -17,10 +17,9 @@ package org.apache.cloudstack.api.command.admin.internallb; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import javax.inject.Inject; - import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -48,9 +47,6 @@ import com.cloud.network.VirtualRouterProvider; public class ListInternalLoadBalancerElementsCmd extends BaseListCmd { public static final Logger s_logger = Logger.getLogger(ListInternalLoadBalancerElementsCmd.class.getName()); - @Inject - private InternalLoadBalancerElementService _service; - ///////////////////////////////////////////////////// //////////////// API parameters ///////////////////// ///////////////////////////////////////////////////// @@ -88,12 +84,21 @@ public class ListInternalLoadBalancerElementsCmd extends BaseListCmd { @Override public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException { - List providers = _service.searchForInternalLoadBalancerElements(getId(), getNspId(), getEnabled()); + List services; + if (id == null && nspId == null) { + services = _networkService.getInternalLoadBalancerElements(); + } else { + InternalLoadBalancerElementService elementService = id != null ? _networkService.getInternalLoadBalancerElementById(id) : _networkService.getInternalLoadBalancerElementByNetworkServiceProviderId(nspId); + services = Collections.singletonList(elementService); + } ListResponse response = new ListResponse(); List providerResponses = new ArrayList(); - for (VirtualRouterProvider provider : providers) { - InternalLoadBalancerElementResponse providerResponse = _responseGenerator.createInternalLbElementResponse(provider); - providerResponses.add(providerResponse); + for (InternalLoadBalancerElementService service : services) { + List providers = service.searchForInternalLoadBalancerElements(getId(), getNspId(), getEnabled()); + for (VirtualRouterProvider provider : providers) { + InternalLoadBalancerElementResponse providerResponse = _responseGenerator.createInternalLbElementResponse(provider); + providerResponses.add(providerResponse); + } } response.setResponses(providerResponses); response.setResponseName(getCommandName()); diff --git a/api/src/main/java/org/apache/cloudstack/network/element/InternalLoadBalancerElementService.java b/api/src/main/java/org/apache/cloudstack/network/element/InternalLoadBalancerElementService.java index 76706a4cfc9..36340e8b9ef 100644 --- a/api/src/main/java/org/apache/cloudstack/network/element/InternalLoadBalancerElementService.java +++ b/api/src/main/java/org/apache/cloudstack/network/element/InternalLoadBalancerElementService.java @@ -23,7 +23,7 @@ import com.cloud.utils.component.PluggableService; public interface InternalLoadBalancerElementService extends PluggableService { /** - * Configures existing Internal Load Balancer Element (enables or disables it) + * Configures existing Internal Load Balancer Element (eInternalLoadBalancerElementServicenables or disables it) * @param id * @param enable * @return @@ -52,4 +52,6 @@ public interface InternalLoadBalancerElementService extends PluggableService { * @return */ List searchForInternalLoadBalancerElements(Long id, Long ntwkSvsProviderId, Boolean enabled); + + VirtualRouterProvider.Type getProviderType(); } diff --git a/core/src/main/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml b/core/src/main/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml index a36d1243155..49775fe41e1 100644 --- a/core/src/main/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml +++ b/core/src/main/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml @@ -350,4 +350,12 @@ + + + + + + + + diff --git a/core/src/main/resources/META-INF/cloudstack/network/spring-core-lifecycle-network-context-inheritable.xml b/core/src/main/resources/META-INF/cloudstack/network/spring-core-lifecycle-network-context-inheritable.xml index 8dbaf610581..2240d1f2606 100644 --- a/core/src/main/resources/META-INF/cloudstack/network/spring-core-lifecycle-network-context-inheritable.xml +++ b/core/src/main/resources/META-INF/cloudstack/network/spring-core-lifecycle-network-context-inheritable.xml @@ -103,4 +103,9 @@ + + + + + diff --git a/plugins/network-elements/internal-loadbalancer/src/main/java/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java b/plugins/network-elements/internal-loadbalancer/src/main/java/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java index 3e522f6be4f..a10af1c11be 100644 --- a/plugins/network-elements/internal-loadbalancer/src/main/java/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java +++ b/plugins/network-elements/internal-loadbalancer/src/main/java/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java @@ -84,7 +84,9 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.network.router.NetworkHelper; +import org.springframework.stereotype.Component; +@Component public class InternalLoadBalancerElement extends AdapterBase implements LoadBalancingServiceProvider, InternalLoadBalancerElementService, IpDeployer { private static final Logger s_logger = Logger.getLogger(InternalLoadBalancerElement.class); protected static final Map> capabilities = setCapabilities(); @@ -114,14 +116,7 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala @Qualifier("networkHelper") protected NetworkHelper _networkHelper; - protected InternalLoadBalancerElement() { - } - - public static InternalLoadBalancerElement getInstance() { - if (internalLbElement == null) { - internalLbElement = new InternalLoadBalancerElement(); - } - return internalLbElement; + public InternalLoadBalancerElement() { } private boolean canHandle(Network config, Scheme lbScheme) { @@ -519,6 +514,11 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala return sc.list(); } + @Override + public Type getProviderType() { + return Type.InternalLbVm; + } + @Override public boolean applyIps(Network network, List ipAddress, Set services) throws ResourceUnavailableException { //do nothing here; this element just has to extend the ip deployer 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 85f66cf4776..7aba83bb062 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 @@ -889,6 +889,11 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, Dns return sc.list(); } + @Override + public VirtualRouterProvider.Type getProviderType() { + return VirtualRouterProvider.Type.Nsx; + } + @Override public List> getCommands() { List> cmdList = new ArrayList>(); diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index 9bdb3305a9c..4d8b218e648 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -46,7 +46,9 @@ import com.cloud.dc.VlanDetailsVO; import com.cloud.dc.dao.VlanDetailsDao; import com.cloud.network.dao.NsxProviderDao; import com.cloud.network.dao.PublicIpQuarantineDao; +import com.cloud.network.dao.VirtualRouterProviderDao; import com.cloud.network.element.NsxProviderVO; +import com.cloud.network.element.VirtualRouterProviderVO; import com.cloud.offering.ServiceOffering; import com.cloud.service.dao.ServiceOfferingDao; import org.apache.cloudstack.acl.ControlledEntity.ACLType; @@ -84,6 +86,7 @@ import org.apache.cloudstack.network.NetworkPermissionVO; import org.apache.cloudstack.network.dao.NetworkPermissionDao; import org.apache.cloudstack.network.element.InternalLoadBalancerElementService; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -358,8 +361,6 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C @Inject HostDao _hostDao; @Inject - InternalLoadBalancerElementService _internalLbElementSvc; - @Inject DataCenterVnetDao _dcVnetDao; @Inject AccountGuestVlanMapDao _accountGuestVlanMapDao; @@ -415,6 +416,10 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C PublicIpQuarantineDao publicIpQuarantineDao; @Inject NsxProviderDao nsxProviderDao; + @Inject + private VirtualRouterProviderDao virtualRouterProviderDao; + List internalLoadBalancerElementServices = new ArrayList<>(); + Map internalLoadBalancerElementServiceMap = new HashMap<>(); @Autowired @Qualifier("networkHelper") @@ -822,9 +827,19 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C @Override public boolean start() { + initializeInternalLoadBalancerElementsMap(); return true; } + private void initializeInternalLoadBalancerElementsMap() { + if (MapUtils.isEmpty(internalLoadBalancerElementServiceMap) && CollectionUtils.isNotEmpty(internalLoadBalancerElementServices)) { + for (InternalLoadBalancerElementService service : internalLoadBalancerElementServices) { + internalLoadBalancerElementServiceMap.put(service.getProviderType().name(), service); + } + s_logger.debug(String.format("Discovered internal loadbalancer elements configured on NetworkServiceImpl")); + } + } + @Override public boolean stop() { return true; @@ -5422,7 +5437,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C throw new CloudRuntimeException("Unable to find the Network Element implementing the " + Network.Provider.InternalLbVm.getName() + " Provider"); } - _internalLbElementSvc.addInternalLoadBalancerElement(nsp.getId()); + InternalLoadBalancerElementService service = getInternalLoadBalancerElementByNetworkServiceProviderId(nsp.getId()); + service.addInternalLoadBalancerElement(nsp.getId()); return nsp; } @@ -5743,6 +5759,10 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C _networkGurus = networkGurus; } + public void setInternalLoadBalancerElementServices(List services) { + this.internalLoadBalancerElementServices = services; + } + @Override @ActionEvent(eventType = EventTypes.EVENT_NET_IP_UPDATE, eventDescription = "updating public ip address", async = true) public IpAddress updateIP(Long id, String customId, Boolean displayIp) { @@ -6084,6 +6104,34 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C _ipAddrMgr.removePublicIpAddressFromQuarantine(publicIpQuarantine.getId(), removalReason); } + @Override + public InternalLoadBalancerElementService getInternalLoadBalancerElementByType(Type type) { + return internalLoadBalancerElementServiceMap.getOrDefault(type.name(), null); + } + + @Override + public InternalLoadBalancerElementService getInternalLoadBalancerElementByNetworkServiceProviderId(long networkProviderId) { + PhysicalNetworkServiceProviderVO provider = _pNSPDao.findById(networkProviderId); + if (provider == null) { + String msg = String.format("Cannot find a network service provider with ID %s", networkProviderId); + s_logger.error(msg); + throw new CloudRuntimeException(msg); + } + Type type = provider.getProviderName().equalsIgnoreCase("nsx") ? Type.Nsx : Type.InternalLbVm; + return getInternalLoadBalancerElementByType(type); + } + + @Override + public InternalLoadBalancerElementService getInternalLoadBalancerElementById(long providerId) { + VirtualRouterProviderVO provider = virtualRouterProviderDao.findById(providerId); + return getInternalLoadBalancerElementByType(provider.getType()); + } + + @Override + public List getInternalLoadBalancerElements() { + return new ArrayList<>(this.internalLoadBalancerElementServiceMap.values()); + } + /** * Retrieves the active quarantine for the given public IP address. It can find by the ID of the quarantine or the address of the public IP. * @throws CloudRuntimeException if it does not find an active quarantine for the given public IP. diff --git a/server/src/main/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml b/server/src/main/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml index 9656d544fbb..c80c2947a99 100644 --- a/server/src/main/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml +++ b/server/src/main/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml @@ -165,6 +165,7 @@ + diff --git a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java index 6b4abd1d512..0d23d7c565b 100644 --- a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java +++ b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java @@ -26,6 +26,7 @@ import javax.naming.ConfigurationException; import com.cloud.dc.DataCenter; import com.cloud.network.PublicIpQuarantine; +import com.cloud.network.VirtualRouterProvider; import com.cloud.utils.fsm.NoTransitionException; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.api.command.admin.address.ReleasePodIpCmdByAdmin; @@ -46,6 +47,7 @@ import org.apache.cloudstack.api.command.user.network.UpdateNetworkCmd; import org.apache.cloudstack.api.command.user.vm.ListNicsCmd; import org.apache.cloudstack.api.response.AcquirePodIpCmdResponse; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; +import org.apache.cloudstack.network.element.InternalLoadBalancerElementService; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -1088,4 +1090,24 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkOrches public void removePublicIpAddressFromQuarantine(RemoveQuarantinedIpCmd cmd) { } + + @Override + public InternalLoadBalancerElementService getInternalLoadBalancerElementByType(VirtualRouterProvider.Type type) { + return null; + } + + @Override + public InternalLoadBalancerElementService getInternalLoadBalancerElementByNetworkServiceProviderId(long networkProviderId) { + return null; + } + + @Override + public InternalLoadBalancerElementService getInternalLoadBalancerElementById(long providerId) { + return null; + } + + @Override + public List getInternalLoadBalancerElements() { + return null; + } }