diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java index bf88bfe65f3..3495a3e5c23 100644 --- a/api/src/com/cloud/network/Network.java +++ b/api/src/com/cloud/network/Network.java @@ -91,6 +91,7 @@ public interface Network extends ControlledEntity { public static final Provider DhcpServer = new Provider("DhcpServer"); public static final Provider JuniperSRX = new Provider("JuniperSRX"); public static final Provider F5BigIp = new Provider("F5BigIp"); + public static final Provider NetscalerMPX = new Provider("NetscalerMPX"); public static final Provider ExternalDhcpServer = new Provider("ExternalDhcpServer"); public static final Provider ExternalGateWay = new Provider("ExternalGateWay"); public static final Provider ElasticLoadBalancerVm = new Provider("ElasticLoadBalancerVm"); diff --git a/client/tomcatconf/components-premium.xml.in b/client/tomcatconf/components-premium.xml.in index 82a903864c4..3d73ed27c10 100755 --- a/client/tomcatconf/components-premium.xml.in +++ b/client/tomcatconf/components-premium.xml.in @@ -31,7 +31,8 @@ - + + diff --git a/server/src/com/cloud/network/ExternalNetworkManager.java b/server/src/com/cloud/network/ExternalNetworkManager.java index 6e62bba7f5a..83eab3939f8 100644 --- a/server/src/com/cloud/network/ExternalNetworkManager.java +++ b/server/src/com/cloud/network/ExternalNetworkManager.java @@ -44,6 +44,7 @@ public interface ExternalNetworkManager extends Manager { public static final ExternalNetworkDeviceType F5BigIP = new ExternalNetworkDeviceType("F5BigIP"); public static final ExternalNetworkDeviceType JuniperSRX = new ExternalNetworkDeviceType("JuniperSRX"); + public static final ExternalNetworkDeviceType NetscalerMPX = new ExternalNetworkDeviceType("NetscalerMPX"); public ExternalNetworkDeviceType(String name) { _name = name; diff --git a/server/src/com/cloud/network/ExternalNetworkManagerImpl.java b/server/src/com/cloud/network/ExternalNetworkManagerImpl.java index 14ed6f9b28d..c44ebe6a969 100644 --- a/server/src/com/cloud/network/ExternalNetworkManagerImpl.java +++ b/server/src/com/cloud/network/ExternalNetworkManagerImpl.java @@ -81,6 +81,7 @@ import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.network.resource.F5BigIpResource; import com.cloud.network.resource.JuniperSrxResource; +import com.cloud.network.resource.NetscalerMPXResource; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRule.Purpose; import com.cloud.network.rules.FirewallRuleVO; @@ -123,7 +124,8 @@ import com.cloud.vm.dao.NicDao; public class ExternalNetworkManagerImpl implements ExternalNetworkManager { public enum ExternalNetworkResourceName { JuniperSrx, - F5BigIp; + F5BigIp, + NetscalerMPX; } @Inject AgentManager _agentMgr; @@ -251,12 +253,15 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager { deviceType = cmd.getType(); if (deviceType ==null) { - deviceType = ExternalNetworkDeviceType.F5BigIP.getName(); //default it to F5 for now + deviceType = ExternalNetworkDeviceType.NetscalerMPX.getName(); //TODO: default it to NetscalerMPX for now, till UI support Netscaler & F5 } if (deviceType.equalsIgnoreCase(ExternalNetworkDeviceType.F5BigIP.getName())) { resource = new F5BigIpResource(); - guid = getExternalNetworkResourceGuid(zoneId, ExternalNetworkResourceName.F5BigIp, ipAddress); + guid = getExternalNetworkResourceGuid(zoneId, ExternalNetworkResourceName.F5BigIp, ipAddress); + } else if (deviceType.equalsIgnoreCase(ExternalNetworkDeviceType.NetscalerMPX.getName())) { + resource = new NetscalerMPXResource(); + guid = getExternalNetworkResourceGuid(zoneId, ExternalNetworkResourceName.NetscalerMPX, ipAddress); } else { throw new CloudRuntimeException("An unsupported networt device type is added as external load balancer."); } @@ -284,6 +289,8 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager { if (host != null) { if (deviceType.equalsIgnoreCase(ExternalNetworkDeviceType.F5BigIP.getName())) { zone.setLoadBalancerProvider(Network.Provider.F5BigIp.getName()); + } else if (deviceType.equalsIgnoreCase(ExternalNetworkDeviceType.NetscalerMPX.getName())) { + zone.setLoadBalancerProvider(Network.Provider.NetscalerMPX.getName()); } _dcDao.update(zone.getId(), zone); return host; @@ -504,7 +511,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager { Answer answer = _agentMgr.easySend(externalLoadBalancer.getId(), cmd); if (answer == null || !answer.getResult()) { String details = (answer != null) ? answer.getDetails() : "details unavailable"; - String msg = "Unable to apply load balancer rules to the F5 BigIp appliance in zone " + zone.getName() + " due to: " + details + "."; + String msg = "Unable to apply load balancer rules to the external load balancer appliance in zone " + zone.getName() + " due to: " + details + "."; s_logger.error(msg); throw new ResourceUnavailableException(msg, DataCenter.class, network.getDataCenterId()); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 5f4090ce7ae..a67aa80a1a3 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -2809,8 +2809,15 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag DataCenterVO zone = _dcDao.findById(zoneId); if (zone.getNetworkType() == NetworkType.Advanced) { - return (zone.getGatewayProvider() != null && zone.getGatewayProvider().equals(Network.Provider.JuniperSRX.getName()) && - zone.getFirewallProvider() != null && zone.getFirewallProvider().equals(Network.Provider.JuniperSRX.getName())); + + if (zone.getGatewayProvider() != null && zone.getGatewayProvider().equals(Network.Provider.JuniperSRX.getName()) && + zone.getFirewallProvider() != null && zone.getFirewallProvider().equals(Network.Provider.JuniperSRX.getName())) { + return true; + } else if (zone.getGatewayProvider() != null && zone.getLoadBalancerProvider() != null && zone.getLoadBalancerProvider().equals(Network.Provider.NetscalerMPX.getName())) { + return true; + } else { + return false; + } } else { return (zone.getFirewallProvider() != null && zone.getFirewallProvider().equals(Network.Provider.JuniperSRX.getName())); } diff --git a/server/src/com/cloud/network/element/ExternalLoadBalancerElement.java b/server/src/com/cloud/network/element/ExternalLoadBalancerElement.java deleted file mode 100644 index 2e1bd0ae683..00000000000 --- a/server/src/com/cloud/network/element/ExternalLoadBalancerElement.java +++ /dev/null @@ -1,162 +0,0 @@ -/** - * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved -* - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.network.element; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.ejb.Local; - -import org.apache.log4j.Logger; - -import com.cloud.configuration.ConfigurationManager; -import com.cloud.dc.DataCenter; -import com.cloud.deploy.DeployDestination; -import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientNetworkCapacityException; -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.network.ExternalNetworkManager; -import com.cloud.network.Network; -import com.cloud.network.Network.Capability; -import com.cloud.network.Network.Provider; -import com.cloud.network.Network.Service; -import com.cloud.network.NetworkManager; -import com.cloud.network.Networks.TrafficType; -import com.cloud.network.PublicIpAddress; -import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.StaticNat; -import com.cloud.offering.NetworkOffering; -import com.cloud.utils.component.AdapterBase; -import com.cloud.utils.component.Inject; -import com.cloud.vm.NicProfile; -import com.cloud.vm.ReservationContext; -import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachineProfile; - -@Local(value=NetworkElement.class) -public class ExternalLoadBalancerElement extends AdapterBase implements NetworkElement { - - private static final Logger s_logger = Logger.getLogger(ExternalLoadBalancerElement.class); - - @Inject NetworkManager _networkManager; - @Inject ExternalNetworkManager _externalNetworkManager; - @Inject ConfigurationManager _configMgr; - - private boolean canHandle(Network config) { - DataCenter zone = _configMgr.getZone(config.getDataCenterId()); - if (config.getGuestType() != Network.GuestIpType.Virtual || config.getTrafficType() != TrafficType.Guest) { - s_logger.trace("Not handling network with guest Type " + config.getGuestType() + " and traffic type " + config.getTrafficType()); - return false; - } - - return (_networkManager.zoneIsConfiguredForExternalNetworking(zone.getId()) && - zone.getLoadBalancerProvider() != null && zone.getLoadBalancerProvider().equals(Network.Provider.F5BigIp.getName())); - } - - @Override - public boolean implement(Network guestConfig, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException, InsufficientNetworkCapacityException { - - if (!canHandle(guestConfig)) { - return false; - } - - return _externalNetworkManager.manageGuestNetworkWithExternalLoadBalancer(true, guestConfig); - } - - @Override - public boolean prepare(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientNetworkCapacityException, ResourceUnavailableException { - return true; - } - - @Override - public boolean release(Network config, NicProfile nic, VirtualMachineProfile vm, ReservationContext context) { - return true; - } - - @Override - public boolean shutdown(Network guestConfig, ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException { - if (!canHandle(guestConfig)) { - return false; - } - - return _externalNetworkManager.manageGuestNetworkWithExternalLoadBalancer(false, guestConfig); - } - - @Override - public boolean destroy(Network config) { - return true; - } - - @Override - public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { - return true; - } - - @Override - public boolean applyRules(Network config, List rules) throws ResourceUnavailableException { - if (!canHandle(config)) { - return false; - } - - return _externalNetworkManager.applyLoadBalancerRules(config, rules); - } - - @Override - public Map> getCapabilities() { - Map> capabilities = new HashMap>(); - - // Set capabilities for LB service - Map lbCapabilities = new HashMap(); - - // Specifies that the RoundRobin and Leastconn algorithms are supported for load balancing rules - lbCapabilities.put(Capability.SupportedLBAlgorithms, "roundrobin,leastconn"); - - // Specifies that load balancing rules can be made for either TCP or UDP traffic - lbCapabilities.put(Capability.SupportedProtocols, "tcp,udp"); - - // Specifies that this element can measure network usage on a per public IP basis - lbCapabilities.put(Capability.TrafficStatistics, "per public ip"); - - // Specifies that load balancing rules can only be made with public IPs that aren't source NAT IPs - lbCapabilities.put(Capability.LoadBalancingSupportedIps, "additional"); - - capabilities.put(Service.Lb, lbCapabilities); - - return capabilities; - } - - @Override - public Provider getProvider() { - return Provider.F5BigIp; - } - - @Override - public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ - return true; - } - - @Override - public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { - return false; - } - -}