add the ability to add NetScaler device as GSLB provider in a zone

This commit is contained in:
Murali Reddy 2013-03-11 12:42:51 +05:30
parent 89c33a01e7
commit 11a7546f1e
13 changed files with 140 additions and 37 deletions

View File

@ -444,6 +444,8 @@ public class ApiConstants {
public static final String BAREMETAL_DISCOVER_NAME = "baremetaldiscovername";
public static final String UCS_DN = "ucsdn";
public static final String GSLB_PROVIDER = "gslbprovider";
public static final String GSLB_PROVIDER_PUBLIC_IP = "gslbproviderpublicip";
public static final String GSLB_PROVIDER_PRIVATE_IP = "gslbproviderprivateip";
public enum HostDetails {
all, capacity, events, stats, min;

View File

@ -264,7 +264,7 @@ public class F5ExternalLoadBalancerElement extends ExternalLoadBalancerDeviceMan
String deviceType = NetworkDevice.F5BigIpLoadBalancer.getName();
lbDeviceVO = addExternalLoadBalancer(pNetwork.getId(), cmd.getUrl(), cmd.getUsername(), cmd.getPassword(),
deviceType, new F5BigIpResource(), false);
deviceType, new F5BigIpResource(), false, null, null);
if (lbDeviceVO != null) {
lbHost = _hostDao.findById(lbDeviceVO.getHostId());
@ -318,7 +318,7 @@ public class F5ExternalLoadBalancerElement extends ExternalLoadBalancerDeviceMan
}
return addExternalLoadBalancer(cmd.getPhysicalNetworkId(), cmd.getUrl(), cmd.getUsername(), cmd.getPassword(),
deviceName, new F5BigIpResource(), false);
deviceName, new F5BigIpResource(), false, null, null);
}

View File

@ -56,9 +56,17 @@ public class AddNetscalerLoadBalancerCmd extends BaseAsyncCmd {
private String deviceType;
@Parameter(name = ApiConstants.GSLB_PROVIDER, type = CommandType.BOOLEAN, required = false,
description = "true if NetScaler device bieng added is for providing GSLB service")
description = "true if NetScaler device being added is for providing GSLB service")
private boolean isGslbProvider;
@Parameter(name = ApiConstants.GSLB_PROVIDER_PUBLIC_IP, type = CommandType.STRING, required = false,
description = "public IP of the site")
private String gslbSitePublicIp;
@Parameter(name = ApiConstants.GSLB_PROVIDER_PRIVATE_IP, type = CommandType.STRING, required = false,
description = "public IP of the site")
private String gslbSitePrivateIp;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
@ -87,6 +95,14 @@ public class AddNetscalerLoadBalancerCmd extends BaseAsyncCmd {
return isGslbProvider;
}
public String getSitePublicIp() {
return gslbSitePublicIp;
}
public String getSitePrivateIp() {
return gslbSitePrivateIp;
}
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////

View File

@ -80,7 +80,7 @@ import javax.inject.Inject;
import java.net.URI;
import java.util.*;
@Local(value = {NetworkElement.class, StaticNatServiceProvider.class, LoadBalancingServiceProvider.class})
@Local(value = {NetworkElement.class, StaticNatServiceProvider.class, LoadBalancingServiceProvider.class, GslbServiceProvider.class})
public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl implements LoadBalancingServiceProvider,
NetscalerLoadBalancerElementService, ExternalLoadBalancerDeviceManager, IpDeployer, StaticNatServiceProvider,
GslbServiceProvider {
@ -305,8 +305,26 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
throw new InvalidParameterValueException(msg);
}
if (cmd.isGslbProvider()) {
if (!deviceName.equals(NetworkDevice.NetscalerVPXLoadBalancer.getName()) &&
!deviceName.equals(NetworkDevice.NetscalerMPXLoadBalancer.getName())) {
String msg = "Only Netscaler VPX or MPX load balancers can be specified as GSLB service provider";
s_logger.debug(msg);
throw new InvalidParameterValueException(msg);
}
if (cmd.getSitePublicIp() == null || cmd.getSitePrivateIp() == null) {
String msg = "Public and Privae IP needs to provided for NetScaler that will be GSLB provider";
s_logger.debug(msg);
throw new InvalidParameterValueException(msg);
}
}
ExternalLoadBalancerDeviceVO lbDeviceVO = addExternalLoadBalancer(cmd.getPhysicalNetworkId(), cmd.getUrl(),
cmd.getUsername(), cmd.getPassword(), deviceName, new NetscalerResource(), cmd.isGslbProvider());
cmd.getUsername(), cmd.getPassword(), deviceName, new NetscalerResource(), cmd.isGslbProvider(),
cmd.getSitePublicIp(), cmd.getSitePrivateIp());
return lbDeviceVO;
}
@ -791,17 +809,17 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
@Override
public boolean isServiceEnabledInZone(long zoneId) {
return false; //To change body of implemented methods use File | Settings | File Templates.
return false;
}
@Override
public String getProviderPublicIp(long zoneId) {
return null; //To change body of implemented methods use File | Settings | File Templates.
public String getZoneGslbProviderPublicIp(long zoneId) {
return null;
}
@Override
public String getProviderPrivateIp(long zoneId) {
return null; //To change body of implemented methods use File | Settings | File Templates.
public String getZoneGslbProviderPrivateIp(long zoneId) {
return null;
}
@Override
@ -814,6 +832,6 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
if (answer == null) {
}
return false; //To change body of implemented methods use File | Settings | File Templates.
return false;
}
}

View File

@ -47,7 +47,8 @@ public interface ExternalLoadBalancerDeviceManager extends Manager{
* @return Host object for the device added
*/
public ExternalLoadBalancerDeviceVO addExternalLoadBalancer(long physicalNetworkId, String url, String username,
String password, String deviceName, ServerResource resource, boolean gslbProvider);
String password, String deviceName, ServerResource resource, boolean gslbProvider,
String gslbSitePublicIp, String gslbSitePrivateIp);
/**
* deletes load balancer device added in to a physical network

View File

@ -158,7 +158,8 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
@Override
@DB
public ExternalLoadBalancerDeviceVO addExternalLoadBalancer(long physicalNetworkId, String url,
String username, String password, String deviceName, ServerResource resource, boolean gslbProvider) {
String username, String password, String deviceName, ServerResource resource, boolean gslbProvider,
String gslbSitePublicIp, String gslbSitePrivateIp) {
PhysicalNetworkVO pNetwork = null;
NetworkDevice ntwkDevice = NetworkDevice.getNetworkDevice(deviceName);
@ -173,15 +174,25 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
if (pNetwork == null) {
throw new InvalidParameterValueException("Could not find phyical network with ID: " + physicalNetworkId);
}
zoneId = pNetwork.getDataCenterId();
zoneId = pNetwork.getDataCenterId();
PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(pNetwork.getId(), ntwkDevice.getNetworkServiceProvder());
if (ntwkSvcProvider == null) {
throw new CloudRuntimeException("Network Service Provider: " + ntwkDevice.getNetworkServiceProvder() +
" is not enabled in the physical network: " + physicalNetworkId + "to add this device");
} else if (ntwkSvcProvider.getState() == PhysicalNetworkServiceProvider.State.Shutdown) {
throw new CloudRuntimeException("Network Service Provider: " + ntwkSvcProvider.getProviderName() +
" is in shutdown state in the physical network: " + physicalNetworkId + "to add this device");
if (gslbProvider) {
ExternalLoadBalancerDeviceVO zoneGslbProvider = _externalLoadBalancerDeviceDao.findGslbServiceProvider(
physicalNetworkId, ntwkDevice.getNetworkServiceProvder());
if (zoneGslbProvider != null) {
throw new CloudRuntimeException("There is a GSLB service provider configured in the zone alredy.");
}
} else {
ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(pNetwork.getId(), ntwkDevice.getNetworkServiceProvder());
if (ntwkSvcProvider == null) {
throw new CloudRuntimeException("Network Service Provider: " + ntwkDevice.getNetworkServiceProvder() +
" is not enabled in the physical network: " + physicalNetworkId + "to add this device");
} else if (ntwkSvcProvider.getState() == PhysicalNetworkServiceProvider.State.Shutdown) {
throw new CloudRuntimeException("Network Service Provider: " + ntwkSvcProvider.getProviderName() +
" is in shutdown state in the physical network: " + physicalNetworkId + "to add this device");
}
}
URI uri;
@ -222,11 +233,15 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
capacity = _defaultLbCapacity;
}
ExternalLoadBalancerDeviceVO lbDeviceVO;
txn.start();
ExternalLoadBalancerDeviceVO lbDeviceVO = new ExternalLoadBalancerDeviceVO(host.getId(), pNetwork.getId(), ntwkSvcProvider.getProviderName(),
lbDeviceVO = new ExternalLoadBalancerDeviceVO(host.getId(), pNetwork.getId(), ntwkDevice.getNetworkServiceProvder(),
deviceName, capacity, dedicatedUse, gslbProvider);
_externalLoadBalancerDeviceDao.persist(lbDeviceVO);
if (!gslbProvider) {
lbDeviceVO.setGslbSitePrivateIP(gslbSitePublicIp);
lbDeviceVO.setGslbSitePrivateIP(gslbSitePrivateIp);
}
DetailVO hostDetail = new DetailVO(host.getId(), ApiConstants.LOAD_BALANCER_DEVICE_ID, String.valueOf(lbDeviceVO.getId()));
_hostDetailDao.persist(hostDetail);
@ -471,7 +486,8 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
ExternalLoadBalancerDeviceVO lbAppliance = null;
try {
lbAppliance = addExternalLoadBalancer(physicalNetworkId, url, username, password,
createLbAnswer.getDeviceName(), createLbAnswer.getServerResource(), false);
createLbAnswer.getDeviceName(), createLbAnswer.getServerResource(), false,
null, null);
} catch (Exception e) {
s_logger.error("Failed to add load balancer appliance in to cloudstack due to " + e.getMessage() + ". So provisioned load balancer appliance will be destroyed.");
}

View File

@ -16,12 +16,12 @@
// under the License.
package com.cloud.network.dao;
import java.util.List;
import com.cloud.network.dao.ExternalLoadBalancerDeviceVO.LBDeviceAllocationState;
import com.cloud.network.dao.ExternalLoadBalancerDeviceVO.LBDeviceState;
import com.cloud.utils.db.GenericDao;
import java.util.List;
public interface ExternalLoadBalancerDeviceDao extends GenericDao<ExternalLoadBalancerDeviceVO, Long> {
/**
@ -64,4 +64,11 @@ public interface ExternalLoadBalancerDeviceDao extends GenericDao<ExternalLoadBa
* @return list of ExternalLoadBalancerDeviceVO for the devices in to this physical network of a managed type
*/
List<ExternalLoadBalancerDeviceVO> listByProviderAndManagedType(long physicalNetworkId, String provider_name, boolean managed);
/**
* Find the external load balancer device that is provisioned as GSLB service provider in the pyshical network
* @param physicalNetworkId physical Network Id
* @return ExternalLoadBalancerDeviceVO for the device acting as GSLB provider in the physical network
*/
ExternalLoadBalancerDeviceVO findGslbServiceProvider(long physicalNetworkId, String providerName);
}

View File

@ -16,11 +16,6 @@
// under the License.
package com.cloud.network.dao;
import java.util.List;
import javax.ejb.Local;
import org.springframework.stereotype.Component;
import com.cloud.network.dao.ExternalLoadBalancerDeviceVO.LBDeviceAllocationState;
import com.cloud.network.dao.ExternalLoadBalancerDeviceVO.LBDeviceState;
import com.cloud.utils.db.DB;
@ -28,6 +23,10 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
import org.springframework.stereotype.Component;
import javax.ejb.Local;
import java.util.List;
@Component
@Local(value=ExternalLoadBalancerDeviceDao.class) @DB(txn=false)
@ -37,6 +36,7 @@ public class ExternalLoadBalancerDeviceDaoImpl extends GenericDaoBase<ExternalLo
final SearchBuilder<ExternalLoadBalancerDeviceVO> allocationStateSearch;
final SearchBuilder<ExternalLoadBalancerDeviceVO> deviceStatusSearch;
final SearchBuilder<ExternalLoadBalancerDeviceVO> deviceManagedTypeSearch;
final SearchBuilder<ExternalLoadBalancerDeviceVO> gslbProviderSearch;
public ExternalLoadBalancerDeviceDaoImpl() {
super();
@ -67,6 +67,12 @@ public class ExternalLoadBalancerDeviceDaoImpl extends GenericDaoBase<ExternalLo
deviceManagedTypeSearch.and("providerName", deviceManagedTypeSearch.entity().getProviderName(), Op.EQ);
deviceManagedTypeSearch.and("managedType", deviceManagedTypeSearch.entity().getIsManagedDevice(), Op.EQ);
deviceManagedTypeSearch.done();
gslbProviderSearch = createSearchBuilder();
gslbProviderSearch.and("physicalNetworkId", gslbProviderSearch.entity().getPhysicalNetworkId(), Op.EQ);
gslbProviderSearch.and("providerName", gslbProviderSearch.entity().getProviderName(), Op.EQ);
gslbProviderSearch.and("gslbProvider", gslbProviderSearch.entity().getGslbProvider(), Op.EQ);
}
public List<ExternalLoadBalancerDeviceVO> listByPhysicalNetwork(long physicalNetworkId) {
@ -109,4 +115,13 @@ public class ExternalLoadBalancerDeviceDaoImpl extends GenericDaoBase<ExternalLo
sc.setParameters("managedType", managed);
return search(sc, null);
}
@Override
public ExternalLoadBalancerDeviceVO findGslbServiceProvider(long physicalNetworkId, String providerName) {
SearchCriteria<ExternalLoadBalancerDeviceVO> sc = gslbProviderSearch.create();
sc.setParameters("physicalNetworkId", physicalNetworkId);
sc.setParameters("providerName", providerName);
sc.setParameters("gslbProvider", true);
return findOneBy(sc);
}
}

View File

@ -68,6 +68,12 @@ public class ExternalLoadBalancerDeviceVO implements InternalIdentity, Identity
@Column(name="is_gslb_provider")
private boolean gslbProvider;
@Column(name="gslb_site_publicip")
private String gslbSitePublicIP;
@Column(name="gslb_site_privateip")
private String gslbSitePrivateIP;
@Column(name = "parent_host_id")
private long parentHostId;
@ -101,6 +107,8 @@ public class ExternalLoadBalancerDeviceVO implements InternalIdentity, Identity
this.state = LBDeviceState.Enabled;
this.uuid = UUID.randomUUID().toString();
this.gslbProvider = gslbProvider;
this.gslbSitePublicIP = null;
this.gslbSitePrivateIP = null;
if (device_name.equalsIgnoreCase(ExternalNetworkDeviceManager.NetworkDevice.NetscalerSDXLoadBalancer.getName())) {
this.allocationState = LBDeviceAllocationState.Provider;
}
@ -193,6 +201,22 @@ public class ExternalLoadBalancerDeviceVO implements InternalIdentity, Identity
gslbProvider = gslbProvider;
}
public void setGslbSitePublicIP(String gslbSitePublicIP) {
this.gslbSitePublicIP = gslbSitePublicIP;
}
public String getGslbSitePublicIP() {
return gslbSitePublicIP;
}
public void setGslbSitePrivateIP(String gslbSitePrivateIP) {
this.gslbSitePrivateIP = gslbSitePrivateIP;
}
public String getGslbSitePrivateIP() {
return gslbSitePrivateIP;
}
public String getUuid() {
return uuid;
}

View File

@ -18,6 +18,8 @@
*/
package org.apache.cloudstack.region;
public interface RegionServiceProvider {
import com.cloud.utils.component.Adapter;
public interface RegionServiceProvider extends Adapter {
}

View File

@ -80,7 +80,7 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
@Inject
AgentManager _agentMgr;
@Inject
GslbServiceProvider _gslbProvider;
protected GslbServiceProvider _gslbProvider;
@Override
@DB
@ -521,8 +521,8 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
SiteLoadBalancerConfig siteLb = new SiteLoadBalancerConfig(gslbLbMapVo.isRevoke(), serviceType,
ip.getAddress().addr(), Integer.toString(loadBalancer.getDefaultPortStart()));
siteLb.setGslbProviderPublicIp(_gslbProvider.getProviderPublicIp(dataCenterId));
siteLb.setGslbProviderPrivateIp(_gslbProvider.getProviderPrivateIp(dataCenterId));
siteLb.setGslbProviderPublicIp(_gslbProvider.getZoneGslbProviderPublicIp(dataCenterId));
siteLb.setGslbProviderPrivateIp(_gslbProvider.getZoneGslbProviderPrivateIp(dataCenterId));
zoneSiteLoadbalancerMap.put(network.getDataCenterId(), siteLb);
}

View File

@ -26,9 +26,9 @@ public interface GslbServiceProvider extends RegionServiceProvider {
public boolean isServiceEnabledInZone(long zoneId);
public String getProviderPublicIp(long zoneId);
public String getZoneGslbProviderPublicIp(long zoneId);
public String getProviderPrivateIp(long zoneId);
public String getZoneGslbProviderPrivateIp(long zoneId);
public boolean applyGlobalLoadBalancerRule(long zoneId, GlobalLoadBalancerConfigCommand gslbConfigCmd)
throws ResourceUnavailableException;

View File

@ -2131,7 +2131,9 @@ CREATE TABLE `cloud`.`external_load_balancer_devices` (
`allocation_state` varchar(32) NOT NULL DEFAULT 'Free' COMMENT 'Allocation state (Free/Shared/Dedicated/Provider) of the device',
`is_dedicated` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if device/appliance is provisioned for dedicated use only',
`is_managed` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if load balancer appliance is provisioned and its life cycle is managed by by cloudstack',
`is_gslb_provider` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if load balancer appliance provides gslb service as well',
`is_gslb_provider` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if load balancer appliance is acting as gslb service provider in the zone',
`gslb_site_publicip` varchar(255) DEFAULT NULL COMMENT 'GSLB service Provider site public ip',
`gslb_site_privateip` varchar(255) DEFAULT NULL COMMENT 'GSLB service Provider site private ip',
`host_id` bigint unsigned NOT NULL COMMENT 'host id coresponding to the external load balancer device',
`parent_host_id` bigint unsigned COMMENT 'if the load balancer appliance is cloudstack managed, then host id on which this appliance is provisioned',
PRIMARY KEY (`id`),