-Added LB serive provider (seperating it out from Firewall service provider)

-Bringing add/delete/list of all external network devices under one unified API's (addNetworkDevice, deleteNetworkDevice, listNetworkDevice)
-Refactoring External network manager to work from both sets of API's add/delete/list NetworkDevice and add/delete/list External Firewall/LoadBalancer
This commit is contained in:
Murali Reddy 2011-10-21 18:15:36 +05:30
parent 219978a9be
commit aa808f5685
22 changed files with 259 additions and 102 deletions

View File

@ -0,0 +1,18 @@
package com.cloud.network.element;
import java.util.List;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.rules.FirewallRule;
public interface LoadBalancingServiceProvider extends NetworkElement {
/**
* Apply rules
* @param network
* @param rules
* @return
* @throws ResourceUnavailableException
*/
boolean applyRules(Network network, List<? extends FirewallRule> rules) throws ResourceUnavailableException;
}

View File

@ -20,7 +20,7 @@
<adapter name="DirectPodBasedNetworkGuru" class="com.cloud.network.guru.DirectPodBasedNetworkGuru"/>
</adapters>
<adapters key="com.cloud.network.element.NetworkElement">
<adapter name="ExternalFirewall" class="com.cloud.network.element.ExternalFirewallElement"/>
<adapter name="JuniperSRXExternalFirewallElement" class="com.cloud.network.element.JuniperSRXExternalFirewallElement"/>
<adapter name="NetscalerExternalLoadBalancer" class="com.cloud.network.element.NetscalerExternalLoadBalancerElement"/>
<adapter name="F5ExternalLoadBalancer" class="com.cloud.network.element.F5ExternalLoadBalancerElement"/>
<adapter name="DomainRouter" class="com.cloud.network.element.VirtualRouterElement"/>

View File

@ -26,9 +26,10 @@ import com.cloud.api.BaseCmd;
import com.cloud.api.Implementation;
import com.cloud.api.Parameter;
import com.cloud.api.ServerApiException;
import com.cloud.api.BaseCmd.CommandType;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.host.Host;
import com.cloud.network.ExternalNetworkManager;
import com.cloud.network.ExternalNetworkDeviceManager;
import com.cloud.server.ManagementService;
import com.cloud.server.api.response.ExternalFirewallResponse;
import com.cloud.user.Account;
@ -46,7 +47,10 @@ public class AddExternalFirewallCmd extends BaseCmd {
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, required = true, description="Zone in which to add the external firewall appliance.")
private Long zoneId;
@Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.LONG, required = false, description="Pyshical network in the zone to which external firewall appliance will be added.")
private Long networkId;
@Parameter(name=ApiConstants.URL, type=CommandType.STRING, required = true, description="URL of the external firewall appliance.")
private String url;
@ -56,7 +60,7 @@ public class AddExternalFirewallCmd extends BaseCmd {
@Parameter(name=ApiConstants.PASSWORD, type=CommandType.STRING, required = true, description="Password of the external firewall appliance.")
private String password;
@Parameter(name=ApiConstants.EXTERNAL_FIREWALL_TYPE, type=CommandType.STRING, description="External firewall type. Now supports JuniperSRX.")
@Parameter(name=ApiConstants.NETWORK_DEVICE_TYPE, type=CommandType.STRING, required = false, description="External firewall type. Now supports JuniperSRXFirewall.")
private String type;
///////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
@ -65,7 +69,11 @@ public class AddExternalFirewallCmd extends BaseCmd {
public Long getZoneId() {
return zoneId;
}
public Long getNetworkId() {
return networkId;
}
public String getUrl() {
return url;
}
@ -78,7 +86,7 @@ public class AddExternalFirewallCmd extends BaseCmd {
return password;
}
public String getType() {
public String getDeviceType() {
return type;
}
@ -99,8 +107,8 @@ public class AddExternalFirewallCmd extends BaseCmd {
@Override
public void execute(){
try {
ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
ExternalNetworkManager externalNetworkMgr = locator.getManager(ExternalNetworkManager.class);
ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
ExternalNetworkDeviceManager externalNetworkMgr = locator.getManager(ExternalNetworkDeviceManager.class);
Host externalFirewall = externalNetworkMgr.addExternalFirewall(this);
ExternalFirewallResponse response = externalNetworkMgr.createExternalFirewallResponse(externalFirewall);
response.setObjectName("externalfirewall");

View File

@ -28,7 +28,7 @@ import com.cloud.api.Parameter;
import com.cloud.api.ServerApiException;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.host.Host;
import com.cloud.network.ExternalNetworkManager;
import com.cloud.network.ExternalNetworkDeviceManager;
import com.cloud.server.ManagementService;
import com.cloud.server.api.response.ExternalLoadBalancerResponse;
import com.cloud.user.Account;
@ -46,6 +46,9 @@ public class AddExternalLoadBalancerCmd extends BaseCmd {
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, required = true, description="Zone in which to add the external load balancer appliance.")
private Long zoneId;
@Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.LONG, required = false, description="Pyshical network in the zone to which external load balancer appliance will be added.")
private Long networkId;
@Parameter(name=ApiConstants.URL, type=CommandType.STRING, required = true, description="URL of the external load balancer appliance.")
private String url;
@ -56,7 +59,7 @@ public class AddExternalLoadBalancerCmd extends BaseCmd {
@Parameter(name=ApiConstants.PASSWORD, type=CommandType.STRING, required = true, description="Password of the external load balancer appliance.")
private String password;
@Parameter(name=ApiConstants.EXTERNAL_LB_TYPE, type=CommandType.STRING, description="External load balancer type. Now supports F5BigIP.")
@Parameter(name=ApiConstants.NETWORK_DEVICE_TYPE, type=CommandType.STRING, required = false, description="External load balancer type. Now supports NetscalerLoadBalancer, F5BigIpLoadBalancer.")
private String type;
///////////////////////////////////////////////////
@ -67,6 +70,10 @@ public class AddExternalLoadBalancerCmd extends BaseCmd {
return zoneId;
}
public Long getNetworkId() {
return networkId;
}
public String getUrl() {
return url;
}
@ -79,7 +86,7 @@ public class AddExternalLoadBalancerCmd extends BaseCmd {
return password;
}
public String getType() {
public String getDeviceType() {
return type;
}
@ -101,7 +108,7 @@ public class AddExternalLoadBalancerCmd extends BaseCmd {
public void execute(){
try {
ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
ExternalNetworkManager externalNetworkMgr = locator.getManager(ExternalNetworkManager.class);
ExternalNetworkDeviceManager externalNetworkMgr = locator.getManager(ExternalNetworkDeviceManager.class);
Host externalLoadBalancer = externalNetworkMgr.addExternalLoadBalancer(this);
ExternalLoadBalancerResponse response = externalNetworkMgr.createExternalLoadBalancerResponse(externalLoadBalancer);
response.setObjectName("externalloadbalancer");

View File

@ -30,7 +30,7 @@ public class AddNetworkDeviceCmd extends BaseCmd {
// ////////////// API parameters /////////////////////
// ///////////////////////////////////////////////////
@Parameter(name = ApiConstants.NETWORK_DEVICE_TYPE, type = CommandType.STRING, description = "Network device type, now supports ExternalDhcp, ExternalFirewall, ExternalLoadBalancer, PxeServer")
@Parameter(name = ApiConstants.NETWORK_DEVICE_TYPE, type = CommandType.STRING, description = "Network device type, now supports ExternalDhcp, PxeServer, NetscalerLoadBalancer, F5BigIpLoadBalancer, JuniperSRXFirewall")
private String type;
@Parameter(name = ApiConstants.NETWORK_DEVICE_PARAMETER_LIST, type = CommandType.MAP, description = "parameters for network device")

View File

@ -28,7 +28,7 @@ import com.cloud.api.Parameter;
import com.cloud.api.ServerApiException;
import com.cloud.api.response.SuccessResponse;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.network.ExternalNetworkManager;
import com.cloud.network.ExternalNetworkDeviceManager;
import com.cloud.server.ManagementService;
import com.cloud.user.Account;
import com.cloud.utils.component.ComponentLocator;
@ -71,7 +71,7 @@ public class DeleteExternalFirewallCmd extends BaseCmd {
public void execute(){
try {
ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
ExternalNetworkManager externalNetworkMgr = locator.getManager(ExternalNetworkManager.class);
ExternalNetworkDeviceManager externalNetworkMgr = locator.getManager(ExternalNetworkDeviceManager.class);
boolean result = externalNetworkMgr.deleteExternalFirewall(this);
if (result) {
SuccessResponse response = new SuccessResponse(getCommandName());

View File

@ -28,7 +28,7 @@ import com.cloud.api.Parameter;
import com.cloud.api.ServerApiException;
import com.cloud.api.response.SuccessResponse;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.network.ExternalNetworkManager;
import com.cloud.network.ExternalNetworkDeviceManager;
import com.cloud.server.ManagementService;
import com.cloud.user.Account;
import com.cloud.utils.component.ComponentLocator;
@ -71,7 +71,7 @@ public class DeleteExternalLoadBalancerCmd extends BaseCmd {
public void execute(){
try {
ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
ExternalNetworkManager externalNetworkMgr = locator.getManager(ExternalNetworkManager.class);
ExternalNetworkDeviceManager externalNetworkMgr = locator.getManager(ExternalNetworkDeviceManager.class);
boolean result = externalNetworkMgr.deleteExternalLoadBalancer(this);
if (result) {
SuccessResponse response = new SuccessResponse(getCommandName());

View File

@ -28,9 +28,10 @@ import com.cloud.api.ApiConstants;
import com.cloud.api.BaseListCmd;
import com.cloud.api.Implementation;
import com.cloud.api.Parameter;
import com.cloud.api.BaseCmd.CommandType;
import com.cloud.api.response.ListResponse;
import com.cloud.host.Host;
import com.cloud.network.ExternalNetworkManager;
import com.cloud.network.ExternalNetworkDeviceManager;
import com.cloud.server.ManagementService;
import com.cloud.server.api.response.ExternalFirewallResponse;
import com.cloud.utils.component.ComponentLocator;
@ -47,6 +48,11 @@ public class ListExternalFirewallsCmd extends BaseListCmd {
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, required = true, description="zone Id")
private long zoneId;
@Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.LONG, description="Pyshical network in the zone from which which external load balancer appliance will be listed.")
private Long networkId;
@Parameter(name=ApiConstants.NETWORK_DEVICE_TYPE, type=CommandType.STRING, description="External firewall type. Now supports only JuniperSRXFirewall.")
private String type;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
@ -56,6 +62,14 @@ public class ListExternalFirewallsCmd extends BaseListCmd {
return zoneId;
}
public Long getNetworkId() {
return networkId;
}
public String getDeviceType() {
return type;
}
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@ -68,7 +82,7 @@ public class ListExternalFirewallsCmd extends BaseListCmd {
@Override
public void execute(){
ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
ExternalNetworkManager externalNetworkMgr = locator.getManager(ExternalNetworkManager.class);
ExternalNetworkDeviceManager externalNetworkMgr = locator.getManager(ExternalNetworkDeviceManager.class);
List<? extends Host> externalFirewalls = externalNetworkMgr.listExternalFirewalls(this);
ListResponse<ExternalFirewallResponse> listResponse = new ListResponse<ExternalFirewallResponse>();

View File

@ -28,10 +28,11 @@ import com.cloud.api.ApiConstants;
import com.cloud.api.BaseListCmd;
import com.cloud.api.Implementation;
import com.cloud.api.Parameter;
import com.cloud.api.BaseCmd.CommandType;
import com.cloud.api.response.HostResponse;
import com.cloud.api.response.ListResponse;
import com.cloud.host.Host;
import com.cloud.network.ExternalNetworkManager;
import com.cloud.network.ExternalNetworkDeviceManager;
import com.cloud.server.ManagementService;
import com.cloud.server.api.response.ExternalLoadBalancerResponse;
import com.cloud.utils.component.ComponentLocator;
@ -48,6 +49,11 @@ public class ListExternalLoadBalancersCmd extends BaseListCmd {
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, description="zone Id")
private long zoneId;
@Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.LONG, description="Pyshical network in the zone from which which external load balancer appliance will be listed.")
private Long networkId;
@Parameter(name=ApiConstants.NETWORK_DEVICE_TYPE, type=CommandType.STRING, description="External load balancer type. Now supports NetscalerLoadBalancer, F5BigIpLoadBalancer.")
private String type;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
@ -57,6 +63,14 @@ public class ListExternalLoadBalancersCmd extends BaseListCmd {
return zoneId;
}
public Long getNetworkId() {
return networkId;
}
public String getDeviceType() {
return type;
}
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@ -69,7 +83,7 @@ public class ListExternalLoadBalancersCmd extends BaseListCmd {
@Override
public void execute(){
ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
ExternalNetworkManager externalNetworkMgr = locator.getManager(ExternalNetworkManager.class);
ExternalNetworkDeviceManager externalNetworkMgr = locator.getManager(ExternalNetworkDeviceManager.class);
List<? extends Host> externalLoadBalancers = externalNetworkMgr.listExternalLoadBalancers(this);
ListResponse<ExternalLoadBalancerResponse> listResponse = new ListResponse<ExternalLoadBalancerResponse>();

View File

@ -34,7 +34,7 @@ public class ListNetworkDeviceCmd extends BaseListCmd {
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
@Parameter(name = ApiConstants.NETWORK_DEVICE_TYPE, type = CommandType.STRING, description = "Network device type, now supports ExternalDhcp, ExternalFirewall, ExternalLoadBalancer, PxeServer")
@Parameter(name = ApiConstants.NETWORK_DEVICE_TYPE, type = CommandType.STRING, description = "Network device type, now supports ExternalDhcp, PxeServer, NetscalerLoadBalancer, F5BigIpLoadBalancer, JuniperSRXFirewall")
private String type;
@Parameter(name = ApiConstants.NETWORK_DEVICE_PARAMETER_LIST, type = CommandType.MAP, description = "parameters for network device")

View File

@ -34,7 +34,7 @@ import com.cloud.netapp.NetappManagerImpl;
import com.cloud.netapp.dao.LunDaoImpl;
import com.cloud.netapp.dao.PoolDaoImpl;
import com.cloud.netapp.dao.VolumeDaoImpl;
import com.cloud.network.ExternalNetworkManagerImpl;
import com.cloud.network.ExternalNetworkDeviceManagerImpl;
import com.cloud.network.NetworkDeviceManagerImpl;
import com.cloud.network.NetworkUsageManagerImpl;
import com.cloud.secstorage.CommandExecLogDaoImpl;
@ -66,7 +66,7 @@ public class PremiumComponentLibrary extends DefaultComponentLibrary {
addManager("HA Manager", HighAvailabilityManagerExtImpl.class);
addManager("VMWareManager", VmwareManagerImpl.class);
addManager("ExternalNetworkManager", ExternalNetworkManagerImpl.class);
addManager("ExternalNetworkManager", ExternalNetworkDeviceManagerImpl.class);
addManager("BareMetalVmManager", BareMetalVmManagerImpl.class);
addManager("ExternalDhcpManager", ExternalDhcpManagerImpl.class);
addManager("PxeServerManager", PxeServerManagerImpl.class);

View File

@ -20,6 +20,7 @@
package com.cloud.network;
import java.util.List;
import java.util.Map;
import com.cloud.api.commands.AddExternalFirewallCmd;
import com.cloud.api.commands.AddExternalLoadBalancerCmd;
@ -30,38 +31,29 @@ import com.cloud.api.commands.ListExternalLoadBalancersCmd;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.host.Host;
import com.cloud.host.HostVO;
import com.cloud.network.NetworkDeviceManager.NetworkDeviceType;
import com.cloud.network.rules.FirewallRule;
import com.cloud.offering.NetworkOffering;
import com.cloud.server.api.response.ExternalFirewallResponse;
import com.cloud.server.api.response.ExternalLoadBalancerResponse;
import com.cloud.utils.component.Manager;
public interface ExternalNetworkManager extends Manager {
public static class ExternalNetworkDeviceType {
private String _name;
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;
}
public String getName() {
return _name;
}
}
public interface ExternalNetworkDeviceManager extends Manager {
// External Firewall methods
public Host addExternalFirewall(AddExternalFirewallCmd cmd);
public Host addExternalFirewall(Long zoneId, Long physicalNetworkId, String deviceType, Map deviceParamList);
public boolean deleteExternalFirewall(DeleteExternalFirewallCmd cmd);
public List<HostVO> listExternalFirewalls(ListExternalFirewallsCmd cmd);
public boolean deleteExternalFirewall(Long hostId);
public List<Host> listExternalFirewalls(ListExternalFirewallsCmd cmd);
public List<Host> listExternalFirewalls(Long zoneId, Long networkId, String deviceType);
public ExternalFirewallResponse createExternalFirewallResponse(Host externalFirewall);
public boolean manageGuestNetworkWithExternalFirewall(boolean add, Network network, NetworkOffering offering) throws ResourceUnavailableException;
@ -78,9 +70,15 @@ public interface ExternalNetworkManager extends Manager {
public Host addExternalLoadBalancer(AddExternalLoadBalancerCmd cmd);
public Host addExternalLoadBalancer(Long zoneId, Long physicalNetworkId, String deviceType, Map deviceParamList);
public boolean deleteExternalLoadBalancer(DeleteExternalLoadBalancerCmd cmd);
public boolean deleteExternalLoadBalancer(Long hostId);
public List<HostVO> listExternalLoadBalancers(ListExternalLoadBalancersCmd cmd);
public List<Host> listExternalLoadBalancers(ListExternalLoadBalancersCmd cmd);
public List<Host> listExternalLoadBalancers(Long zoneId, Long networkId, String deviceType);
public ExternalLoadBalancerResponse createExternalLoadBalancerResponse(Host externalLoadBalancer);

View File

@ -48,6 +48,7 @@ import com.cloud.agent.api.to.IpAddressTO;
import com.cloud.agent.api.to.LoadBalancerTO;
import com.cloud.agent.api.to.PortForwardingRuleTO;
import com.cloud.agent.api.to.StaticNatRuleTO;
import com.cloud.api.ApiConstants;
import com.cloud.api.commands.AddExternalFirewallCmd;
import com.cloud.api.commands.AddExternalLoadBalancerCmd;
import com.cloud.api.commands.DeleteExternalFirewallCmd;
@ -71,6 +72,7 @@ import com.cloud.host.Host;
import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao;
import com.cloud.host.dao.HostDetailsDao;
import com.cloud.network.NetworkDeviceManager.NetworkDeviceType;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.InlineLoadBalancerNicMapDao;
@ -121,8 +123,8 @@ import com.cloud.vm.NicVO;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.NicDao;
@Local(value = {ExternalNetworkManager.class})
public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
@Local(value = {ExternalNetworkDeviceManager.class})
public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceManager {
public enum ExternalNetworkResourceName {
JuniperSrx,
F5BigIp,
@ -153,7 +155,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
ScheduledExecutorService _executor;
int _externalNetworkStatsInterval;
private static final org.apache.log4j.Logger s_logger = Logger.getLogger(ExternalNetworkManagerImpl.class);
private static final org.apache.log4j.Logger s_logger = Logger.getLogger(ExternalNetworkDeviceManagerImpl.class);
protected String _name;
@Override
@ -205,10 +207,24 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
@Override
public Host addExternalLoadBalancer(AddExternalLoadBalancerCmd cmd) {
long zoneId = cmd.getZoneId();
Long zoneId = cmd.getZoneId();
Long networkId = cmd.getNetworkId();
String deviceType = cmd.getDeviceType();
Map deviceParams = new HashMap<String, String>();
deviceParams.put(ApiConstants.USERNAME, cmd.getUsername());
deviceParams.put(ApiConstants.PASSWORD, cmd.getPassword());
deviceParams.put(ApiConstants.URL, cmd.getUrl());
return addExternalLoadBalancer(zoneId, networkId, deviceType, deviceParams);
}
@Override
public Host addExternalLoadBalancer(Long zoneId, Long networkId, String deviceType, Map deviceParamList) {
ServerResource resource =null;
String guid;
String deviceType;
String url = (String) deviceParamList.get(ApiConstants.URL);
String username = (String) deviceParamList.get(ApiConstants.USERNAME);
String password = (String) deviceParamList.get(ApiConstants.PASSWORD);
DataCenterVO zone = _dcDao.findById(zoneId);
String zoneName;
@ -225,15 +241,14 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
URI uri;
try {
uri = new URI(cmd.getUrl());
uri = new URI(url);
} catch (Exception e) {
s_logger.debug(e);
throw new InvalidParameterValueException(e.getMessage());
}
String ipAddress = uri.getHost();
String username = cmd.getUsername();
String password = cmd.getPassword();
Map<String, String> params = new HashMap<String, String>();
UrlUtil.parseQueryParameters(uri.getQuery(), true, params);
String publicInterface = params.get("publicinterface");
@ -253,15 +268,14 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
numRetries = "1";
}
deviceType = cmd.getType();
if (deviceType ==null) {
deviceType = ExternalNetworkDeviceType.NetscalerMPX.getName(); //TODO: default it to NetscalerMPX for now, till UI support Netscaler & F5
deviceType = NetworkDeviceType.NetscalerLoadBalancer.getName(); //TODO: default it to Netscaler LB for now, till UI support Netscaler & F5
}
if (deviceType.equalsIgnoreCase(ExternalNetworkDeviceType.F5BigIP.getName())) {
if (deviceType.equalsIgnoreCase(NetworkDeviceType.F5BigIpLoadBalancer.getName())) {
resource = new F5BigIpResource();
guid = getExternalNetworkResourceGuid(zoneId, ExternalNetworkResourceName.F5BigIp, ipAddress);
} else if (deviceType.equalsIgnoreCase(ExternalNetworkDeviceType.NetscalerMPX.getName())) {
} else if (deviceType.equalsIgnoreCase(NetworkDeviceType.NetscalerLoadBalancer.getName())) {
resource = new NetscalerMPXResource();
guid = getExternalNetworkResourceGuid(zoneId, ExternalNetworkResourceName.NetscalerMPX, ipAddress);
} else {
@ -289,9 +303,9 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
Host host = _agentMgr.addHost(zoneId, resource, Host.Type.ExternalLoadBalancer, hostDetails);
if (host != null) {
if (deviceType.equalsIgnoreCase(ExternalNetworkDeviceType.F5BigIP.getName())) {
if (deviceType.equalsIgnoreCase(NetworkDeviceType.F5BigIpLoadBalancer.getName())) {
zone.setLoadBalancerProvider(Network.Provider.F5BigIp.getName());
} else if (deviceType.equalsIgnoreCase(ExternalNetworkDeviceType.NetscalerMPX.getName())) {
} else if (deviceType.equalsIgnoreCase(NetworkDeviceType.NetscalerLoadBalancer.getName())) {
zone.setLoadBalancerProvider(Network.Provider.NetscalerMPX.getName());
}
_dcDao.update(zone.getId(), zone);
@ -303,7 +317,11 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
@Override
public boolean deleteExternalLoadBalancer(DeleteExternalLoadBalancerCmd cmd) {
long hostId = cmd.getId();
return deleteExternalLoadBalancer(cmd.getId());
}
@Override
public boolean deleteExternalLoadBalancer(Long hostId) {
User caller = _accountMgr.getActiveUser(UserContext.current().getCallerUserId());
HostVO externalLoadBalancer = _hostDao.findById(hostId);
if (externalLoadBalancer == null) {
@ -331,9 +349,21 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
}
@Override
public List<HostVO> listExternalLoadBalancers(ListExternalLoadBalancersCmd cmd) {
long zoneId = cmd.getZoneId();
return _hostDao.listByTypeDataCenter(Host.Type.ExternalLoadBalancer, zoneId);
public List<Host> listExternalLoadBalancers(ListExternalLoadBalancersCmd cmd) {
List<Host> lbHosts = new ArrayList<Host>();
if (NetworkDeviceType.NetscalerLoadBalancer.getName().equalsIgnoreCase(cmd.getDeviceType())) {
lbHosts.addAll(listExternalLoadBalancers(cmd.getZoneId(), cmd.getNetworkId(), NetworkDeviceType.NetscalerLoadBalancer.getName()));
} else if (NetworkDeviceType.F5BigIpLoadBalancer.getName().equalsIgnoreCase(cmd.getDeviceType())) {
lbHosts.addAll(listExternalLoadBalancers(cmd.getZoneId(), cmd.getNetworkId(), NetworkDeviceType.F5BigIpLoadBalancer.getName()));
}
return lbHosts;
}
@Override
public List<Host> listExternalLoadBalancers(Long zoneId, Long networkId, String type) {
List<Host> lbHosts = new ArrayList<Host>();
lbHosts.addAll(_hostDao.listByTypeDataCenter(Host.Type.ExternalLoadBalancer, zoneId));
return lbHosts;
}
@Override
@ -524,10 +554,24 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
@Override
public Host addExternalFirewall(AddExternalFirewallCmd cmd) {
long zoneId = cmd.getZoneId();
String deviceType;
Long zoneId = cmd.getZoneId();
Long networkId = cmd.getNetworkId();
String deviceType = cmd.getDeviceType();
Map deviceParams = new HashMap<String, String>();
deviceParams.put(ApiConstants.USERNAME, cmd.getUsername());
deviceParams.put(ApiConstants.URL, cmd.getUrl());
deviceParams.put(ApiConstants.PASSWORD, cmd.getPassword());
return addExternalFirewall(zoneId, networkId, deviceType, deviceParams);
}
@Override
public Host addExternalFirewall(Long zoneId, Long networkId, String deviceType, Map deviceParamList) {
DataCenterVO zone = _dcDao.findById(zoneId);
String url = (String) deviceParamList.get(ApiConstants.URL);
String username = (String) deviceParamList.get(ApiConstants.USERNAME);
String password = (String) deviceParamList.get(ApiConstants.PASSWORD);
String zoneName;
if (zone == null) {
throw new InvalidParameterValueException("Could not find zone with ID: " + zoneId);
@ -542,15 +586,13 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
URI uri;
try {
uri = new URI(cmd.getUrl());
uri = new URI(url);
} catch (Exception e) {
s_logger.debug(e);
throw new InvalidParameterValueException(e.getMessage());
}
String ipAddress = uri.getHost();
String username = cmd.getUsername();
String password = cmd.getPassword();
Map<String, String> params = new HashMap<String, String>();
UrlUtil.parseQueryParameters(uri.getQuery(), true, params);
String publicInterface = params.get("publicinterface");
@ -597,11 +639,10 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
timeout = "300";
}
deviceType = cmd.getType();
if (deviceType ==null) {
deviceType = ExternalNetworkDeviceType.JuniperSRX.getName(); //default it to Juniper for now
deviceType = NetworkDeviceType.JuniperSRXFirewall.getName(); //default it to Juniper for now
}
if (deviceType.equalsIgnoreCase(ExternalNetworkDeviceType.JuniperSRX.getName())) {
if (deviceType.equalsIgnoreCase(NetworkDeviceType.JuniperSRXFirewall.getName())) {
resource = new JuniperSrxResource();
guid = getExternalNetworkResourceGuid(zoneId, ExternalNetworkResourceName.JuniperSrx, ipAddress);
} else {
@ -663,7 +704,11 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
@Override
public boolean deleteExternalFirewall(DeleteExternalFirewallCmd cmd) {
long hostId = cmd.getId();
return deleteExternalFirewall(cmd.getId());
}
@Override
public boolean deleteExternalFirewall(Long hostId) {
User caller = _accountMgr.getActiveUser(UserContext.current().getCallerUserId());
HostVO externalFirewall = _hostDao.findById(hostId);
if (externalFirewall == null) {
@ -708,11 +753,22 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager {
}
@Override
public List<HostVO> listExternalFirewalls(ListExternalFirewallsCmd cmd) {
long zoneId = cmd.getZoneId();
return _hostDao.listByTypeDataCenter(Host.Type.ExternalFirewall, zoneId);
public List<Host> listExternalFirewalls(ListExternalFirewallsCmd cmd) {
List<Host> firewallHosts = new ArrayList<Host>();
if (NetworkDeviceType.JuniperSRXFirewall.getName().equalsIgnoreCase(cmd.getDeviceType())) {
firewallHosts.addAll(listExternalFirewalls(cmd.getZoneId(), cmd.getNetworkId(), NetworkDeviceType.JuniperSRXFirewall.getName()));
}
return firewallHosts;
}
@Override
public List<Host> listExternalFirewalls(Long zoneId, Long networkId, String type) {
List<Host> firewallHosts = new ArrayList<Host>();
firewallHosts.addAll(_hostDao.listByTypeDataCenter(Host.Type.ExternalFirewall, zoneId));
return firewallHosts;
}
@Override
public ExternalFirewallResponse createExternalFirewallResponse(Host externalFirewall) {
Map<String, String> fwDetails = _detailsDao.findDetails(externalFirewall.getId());

View File

@ -15,6 +15,9 @@ public interface NetworkDeviceManager extends Manager {
public static final NetworkDeviceType ExternalDhcp = new NetworkDeviceType("ExternalDhcp");
public static final NetworkDeviceType PxeServer = new NetworkDeviceType("PxeServer");
public static final NetworkDeviceType NetscalerLoadBalancer = new NetworkDeviceType("NetscalerLoadBalancer");
public static final NetworkDeviceType F5BigIpLoadBalancer = new NetworkDeviceType("F5BigIpLoadBalancer");
public static final NetworkDeviceType JuniperSRXFirewall = new NetworkDeviceType("JuniperSRXFirewall");
public NetworkDeviceType(String name) {
_name = name;
@ -24,12 +27,12 @@ public interface NetworkDeviceManager extends Manager {
return _name;
}
}
public Host addNetworkDevice(AddNetworkDeviceCmd cmd);
public NetworkDeviceResponse getApiResponse(Host device);
public List<Host> listNetworkDevice(ListNetworkDeviceCmd cmd);
public List<Host> listNetworkDevice(ListNetworkDeviceCmd cmd);
public boolean deleteNetworkDevice(DeleteNetworkDeviceCmd cmd);
}

View File

@ -24,6 +24,7 @@ import com.cloud.baremetal.PxeServerProfile;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.host.Host;
import com.cloud.host.HostVO;
import com.cloud.host.Host.Type;
import com.cloud.host.dao.HostDao;
import com.cloud.server.api.response.NetworkDeviceResponse;
import com.cloud.server.api.response.NwDeviceDhcpResponse;
@ -38,7 +39,7 @@ public class NetworkDeviceManagerImpl implements NetworkDeviceManager {
@Inject ExternalDhcpManager _dhcpMgr;
@Inject PxeServerManager _pxeMgr;
@Inject HostDao _hostDao;
@Inject ExternalNetworkDeviceManager _externalNetworkDeviceMgr;
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
_name = name;
@ -93,7 +94,16 @@ public class NetworkDeviceManagerImpl implements NetworkDeviceManager {
PxeServerProfile profile = new PxeServerProfile(zoneId, podId, url, username, password, type, pingStorageServerIp, pingDir, tftpDir,
pingCifsUsername, pingCifsPassword);
return _pxeMgr.addPxeServer(profile);
} else if (cmd.getType().equalsIgnoreCase(NetworkDeviceType.JuniperSRXFirewall.getName())) {
Long zoneId = Long.parseLong((String) params.get(ApiConstants.ZONE_ID));
Long networkId = (params.get(ApiConstants.NETWORK_ID)==null)?Long.parseLong((String)params.get(ApiConstants.NETWORK_ID)):null;
return _externalNetworkDeviceMgr.addExternalFirewall(zoneId, networkId, NetworkDeviceType.JuniperSRXFirewall.getName(), cmd.getParamList());
} else if (cmd.getType().equalsIgnoreCase(NetworkDeviceType.NetscalerLoadBalancer.getName())) {
Long zoneId = Long.parseLong((String) params.get(ApiConstants.ZONE_ID));
return _externalNetworkDeviceMgr.addExternalLoadBalancer(zoneId, null, NetworkDeviceType.NetscalerLoadBalancer.getName(), cmd.getParamList());
} else if (cmd.getType().equalsIgnoreCase(NetworkDeviceType.F5BigIpLoadBalancer.getName())) {
Long zoneId = Long.parseLong((String) params.get(ApiConstants.ZONE_ID));
return _externalNetworkDeviceMgr.addExternalLoadBalancer(zoneId, null, NetworkDeviceType.F5BigIpLoadBalancer.getName(), cmd.getParamList());
} else {
throw new CloudRuntimeException("Unsupported network device type:" + cmd.getType());
}
@ -169,15 +179,31 @@ public class NetworkDeviceManagerImpl implements NetworkDeviceManager {
Long zoneId = Long.parseLong((String) params.get(ApiConstants.ZONE_ID));
Long podId = Long.parseLong((String)params.get(ApiConstants.POD_ID));
res = listNetworkDevice(zoneId, podId, Host.Type.PxeServer);
} else if (NetworkDeviceType.F5BigIpLoadBalancer.getName().equalsIgnoreCase(cmd.getType())) {
Long zoneId = Long.parseLong((String) params.get(ApiConstants.ZONE_ID));
Long networkId = Long.parseLong((String) params.get(ApiConstants.NETWORK_ID));
return _externalNetworkDeviceMgr.listExternalLoadBalancers(zoneId, networkId, NetworkDeviceType.F5BigIpLoadBalancer.getName());
} else if (NetworkDeviceType.NetscalerLoadBalancer.getName().equalsIgnoreCase(cmd.getType())) {
Long zoneId = Long.parseLong((String) params.get(ApiConstants.ZONE_ID));
Long networkId = Long.parseLong((String) params.get(ApiConstants.NETWORK_ID));
return _externalNetworkDeviceMgr.listExternalLoadBalancers(zoneId, networkId, NetworkDeviceType.NetscalerLoadBalancer.getName());
} else if (NetworkDeviceType.JuniperSRXFirewall.getName().equalsIgnoreCase(cmd.getType())) {
Long zoneId = Long.parseLong((String) params.get(ApiConstants.ZONE_ID));
Long networkId = Long.parseLong((String) params.get(ApiConstants.NETWORK_ID));
return _externalNetworkDeviceMgr.listExternalFirewalls(zoneId, networkId, NetworkDeviceType.JuniperSRXFirewall.getName());
} else if (cmd.getType() == null){
Long zoneId = Long.parseLong((String) params.get(ApiConstants.ZONE_ID));
Long podId = Long.parseLong((String)params.get(ApiConstants.POD_ID));
List<Host> res1 = listNetworkDevice(zoneId, podId, Host.Type.PxeServer);
List<Host> res2 = listNetworkDevice(zoneId, podId, Host.Type.ExternalDhcp);
List<Host> res3 = new ArrayList<Host>();
res3.addAll(res1);
res3.addAll(res2);
res = res3;
List<Host> res3 = listNetworkDevice(zoneId, podId, Host.Type.ExternalLoadBalancer);
List<Host> res4 = listNetworkDevice(zoneId, podId, Host.Type.ExternalFirewall);
List<Host> deviceAll = new ArrayList<Host>();
deviceAll.addAll(res1);
deviceAll.addAll(res2);
deviceAll.addAll(res3);
deviceAll.addAll(res4);
res = deviceAll;
} else {
throw new CloudRuntimeException("Unknown network device type:" + cmd.getType());
}
@ -187,7 +213,12 @@ public class NetworkDeviceManagerImpl implements NetworkDeviceManager {
@Override
public boolean deleteNetworkDevice(DeleteNetworkDeviceCmd cmd) {
// TODO Auto-generated method stub
return true;
HostVO device = _hostDao.findById(cmd.getId());
if (device.getType() == Type.ExternalLoadBalancer) {
return _externalNetworkDeviceMgr.deleteExternalLoadBalancer(cmd.getId());
} else if (device.getType() == Type.ExternalLoadBalancer) {
return _externalNetworkDeviceMgr.deleteExternalFirewall(cmd.getId());
}
return true;
}
}
}

View File

@ -106,6 +106,7 @@ import com.cloud.network.dao.PhysicalNetworkDao;
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
import com.cloud.network.element.FirewallServiceProvider;
import com.cloud.network.element.LoadBalancingServiceProvider;
import com.cloud.network.element.NetworkElement;
import com.cloud.network.element.PasswordServiceProvider;
import com.cloud.network.element.RemoteAccessVPNServiceProvider;
@ -2369,12 +2370,19 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
int found = 0;
for (NetworkElement ne : _networkElements) {
try {
if (!(ne instanceof FirewallServiceProvider)) {
if (!(ne instanceof FirewallServiceProvider) && !(ne instanceof LoadBalancingServiceProvider)) {
continue;
}
FirewallServiceProvider e = (FirewallServiceProvider)ne;
found ++;
boolean handled = e.applyRules(network, rules);
boolean handled;
if (ne instanceof FirewallServiceProvider) {
FirewallServiceProvider e = (FirewallServiceProvider)ne;
handled = e.applyRules(network, rules);
} else {
LoadBalancingServiceProvider e = (LoadBalancingServiceProvider) ne;
handled = e.applyRules(network, rules);
}
s_logger.debug("Network Rules for network " + network.getId() + " were " + (handled ? "" : " not") + " handled by " + ne.getName());
} catch (ResourceUnavailableException e) {
if (!continueOnError) {

View File

@ -52,7 +52,7 @@ import com.cloud.vm.VirtualMachineProfile;
@Local(value=NetworkElement.class)
public class ElasticLoadBalancerElement extends AdapterBase implements FirewallServiceProvider {
public class ElasticLoadBalancerElement extends AdapterBase implements LoadBalancingServiceProvider {
private static final Logger s_logger = Logger.getLogger(ElasticLoadBalancerElement.class);
private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
@Inject NetworkManager _networkManager;

View File

@ -34,7 +34,7 @@ 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.ExternalNetworkDeviceManager;
import com.cloud.network.Network;
import com.cloud.network.Network.Capability;
import com.cloud.network.Network.Provider;
@ -53,12 +53,12 @@ import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
@Local(value=NetworkElement.class)
public class F5ExternalLoadBalancerElement extends AdapterBase implements FirewallServiceProvider {
public class F5ExternalLoadBalancerElement extends AdapterBase implements LoadBalancingServiceProvider {
private static final Logger s_logger = Logger.getLogger(F5ExternalLoadBalancerElement.class);
@Inject NetworkManager _networkManager;
@Inject ExternalNetworkManager _externalNetworkManager;
@Inject ExternalNetworkDeviceManager _externalNetworkManager;
@Inject ConfigurationManager _configMgr;
private boolean canHandle(Network config) {

View File

@ -36,7 +36,7 @@ import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InsufficientNetworkCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.host.dao.HostDao;
import com.cloud.network.ExternalNetworkManager;
import com.cloud.network.ExternalNetworkDeviceManager;
import com.cloud.network.Network;
import com.cloud.network.Network.Capability;
import com.cloud.network.Network.Provider;
@ -59,14 +59,14 @@ import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
@Local(value=NetworkElement.class)
public class ExternalFirewallElement extends AdapterBase implements SourceNATServiceProvider, FirewallServiceProvider, RemoteAccessVPNServiceProvider {
public class JuniperSRXExternalFirewallElement extends AdapterBase implements SourceNATServiceProvider, FirewallServiceProvider, RemoteAccessVPNServiceProvider {
private static final Logger s_logger = Logger.getLogger(ExternalFirewallElement.class);
private static final Logger s_logger = Logger.getLogger(JuniperSRXExternalFirewallElement.class);
private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
@Inject NetworkManager _networkManager;
@Inject ExternalNetworkManager _externalNetworkManager;
@Inject ExternalNetworkDeviceManager _externalNetworkManager;
@Inject HostDao _hostDao;
@Inject ConfigurationManager _configMgr;
@Inject NetworkOfferingDao _networkOfferingDao;

View File

@ -34,7 +34,7 @@ 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.ExternalNetworkDeviceManager;
import com.cloud.network.Network;
import com.cloud.network.Network.Capability;
import com.cloud.network.Network.Provider;
@ -53,12 +53,12 @@ import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
@Local(value=NetworkElement.class)
public class NetscalerExternalLoadBalancerElement extends AdapterBase implements FirewallServiceProvider {
public class NetscalerExternalLoadBalancerElement extends AdapterBase implements LoadBalancingServiceProvider {
private static final Logger s_logger = Logger.getLogger(NetscalerExternalLoadBalancerElement.class);
@Inject NetworkManager _networkManager;
@Inject ExternalNetworkManager _externalNetworkManager;
@Inject ExternalNetworkDeviceManager _externalNetworkManager;
@Inject ConfigurationManager _configMgr;
private boolean canHandle(Network config) {

View File

@ -73,7 +73,7 @@ import com.cloud.vm.dao.UserVmDao;
@Local(value=NetworkElement.class)
public class VirtualRouterElement extends DhcpElement implements VirtualRouterElementService, SourceNATServiceProvider, FirewallServiceProvider, StaticNATServiceProvider, RemoteAccessVPNServiceProvider {
public class VirtualRouterElement extends DhcpElement implements VirtualRouterElementService, SourceNATServiceProvider, FirewallServiceProvider, LoadBalancingServiceProvider, StaticNATServiceProvider, RemoteAccessVPNServiceProvider {
private static final Logger s_logger = Logger.getLogger(VirtualRouterElement.class);
private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();

View File

@ -33,7 +33,7 @@ import com.cloud.event.EventUtils;
import com.cloud.event.EventVO;
import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
import com.cloud.network.ExternalNetworkManager;
import com.cloud.network.ExternalNetworkDeviceManager;
import com.cloud.network.Network;
import com.cloud.network.Network.State;
import com.cloud.network.NetworkManager;
@ -64,7 +64,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru {
@Inject
NetworkManager _networkMgr;
@Inject
ExternalNetworkManager _externalNetworkMgr;
ExternalNetworkDeviceManager _externalNetworkMgr;
@Inject
NetworkDao _networkDao;
@Inject