From ddcb3d7b30f881be982213c784addcabe0135b9a Mon Sep 17 00:00:00 2001 From: Likitha Shetty Date: Thu, 26 Jul 2012 20:51:26 +0530 Subject: [PATCH 1/3] CS-14770. ec2-run-instances and ec2-describe-instances don't return keypair information. Changing CS deployVirtualMachine and listVirtualMachine api response to include ssh keypair information. Component: AWSAPI. --- .../cloud/api/response/UserVmResponse.java | 7 +++++++ .../bridge/service/EC2SoapServiceImpl.java | 6 +++--- .../bridge/service/core/ec2/EC2Engine.java | 5 ++++- .../bridge/service/core/ec2/EC2Instance.java | 10 ++++++++++ .../cloud/stack/models/CloudStackUserVm.java | 9 +++++++++ server/src/com/cloud/api/ApiDBUtils.java | 20 ++++++++++++++++++- .../src/com/cloud/api/ApiResponseHelper.java | 9 ++++++++- .../src/com/cloud/user/dao/SSHKeyPairDao.java | 2 ++ .../com/cloud/user/dao/SSHKeyPairDaoImpl.java | 9 ++++++++- server/src/com/cloud/vm/dao/UserVmData.java | 9 +++++++++ .../cloud/vm/dao/UserVmDetailsDaoImpl.java | 2 +- 11 files changed, 80 insertions(+), 8 deletions(-) diff --git a/api/src/com/cloud/api/response/UserVmResponse.java b/api/src/com/cloud/api/response/UserVmResponse.java index 0b8a3a0bbb1..da110c881f0 100755 --- a/api/src/com/cloud/api/response/UserVmResponse.java +++ b/api/src/com/cloud/api/response/UserVmResponse.java @@ -154,6 +154,9 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp @SerializedName(ApiConstants.TAGS) @Param(description="the list of resource tags associated with vm", responseObject = ResourceTagResponse.class) private List tags; + @SerializedName(ApiConstants.SSH_KEYPAIR) @Param(description="ssh key-pair") + private String keyPairName; + public void setHypervisor(String hypervisor) { this.hypervisor = hypervisor; } @@ -344,4 +347,8 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp public void setTags(List tags) { this.tags = tags; } + + public void setKeyPairName(String keyPairName) { + this.keyPairName = keyPairName; + } } diff --git a/awsapi/src/com/cloud/bridge/service/EC2SoapServiceImpl.java b/awsapi/src/com/cloud/bridge/service/EC2SoapServiceImpl.java index 8ad1b7447cb..e239175f131 100644 --- a/awsapi/src/com/cloud/bridge/service/EC2SoapServiceImpl.java +++ b/awsapi/src/com/cloud/bridge/service/EC2SoapServiceImpl.java @@ -1347,7 +1347,7 @@ public class EC2SoapServiceImpl implements AmazonEC2SkeletonInterface { param7.setPrivateDnsName( "" ); param7.setDnsName( "" ); param7.setReason( "" ); - param7.setKeyName( "" ); + param7.setKeyName( inst.getKeyPairName()); param7.setAmiLaunchIndex( "" ); param7.setInstanceType( inst.getServiceOffering()); @@ -1669,7 +1669,7 @@ public class EC2SoapServiceImpl implements AmazonEC2SkeletonInterface { param7.setPrivateDnsName( "" ); param7.setDnsName( "" ); param7.setReason( "" ); - param7.setKeyName( "" ); + param7.setKeyName( inst.getKeyPairName()); param7.setAmiLaunchIndex( "" ); ProductCodesSetType param9 = new ProductCodesSetType(); @@ -1722,7 +1722,7 @@ public class EC2SoapServiceImpl implements AmazonEC2SkeletonInterface { param19.setKey(""); param19.setValue(""); param18.addItem( param19 ); - param7.setTagSet( param18 ); + param7.setTagSet( param18 ); String hypervisor = inst.getHypervisor(); param7.setHypervisor((null != hypervisor ? hypervisor : "")); diff --git a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java index f66fcf75484..fd54eb4d61f 100644 --- a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java +++ b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java @@ -1514,6 +1514,8 @@ public class EC2Engine { vm.setDomainId(resp.getDomainId()); vm.setHypervisor(resp.getHypervisor()); vm.setServiceOffering( svcOffering.getName()); + vm.setKeyPairName(resp.getKeyPairName()); + instances.addInstance(vm); countCreated++; } @@ -1894,7 +1896,8 @@ public class EC2Engine { ec2Vm.setRootDeviceType(cloudVm.getRootDeviceType()); ec2Vm.setRootDeviceId(cloudVm.getRootDeviceId()); ec2Vm.setServiceOffering(serviceOfferingIdToInstanceType(cloudVm.getServiceOfferingId().toString())); - + ec2Vm.setKeyPairName(cloudVm.getKeyPairName()); + List nics = cloudVm.getNics(); for(CloudStackNic nic : nics) { if(nic.getIsDefault()) { diff --git a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Instance.java b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Instance.java index 1a0efe89d7a..ca0c1d6489f 100644 --- a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Instance.java +++ b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Instance.java @@ -39,6 +39,7 @@ public class EC2Instance { private String hypervisor; private String rootDeviceType; private String rootDeviceId; + private String keyPairName; private List groupSet; private List tagsSet; @@ -59,6 +60,7 @@ public class EC2Instance { hypervisor = null; rootDeviceType = null; rootDeviceId = null; + keyPairName = null; groupSet = new ArrayList(); tagsSet = new ArrayList(); } @@ -191,6 +193,14 @@ public class EC2Instance { rootDeviceId = param; } + public String getKeyPairName() { + return keyPairName; + } + + public void setKeyPairName(String param) { + keyPairName = param; + } + public void addGroupName( String param ) { groupSet.add( param ); } diff --git a/awsapi/src/com/cloud/stack/models/CloudStackUserVm.java b/awsapi/src/com/cloud/stack/models/CloudStackUserVm.java index 6142f3e1489..e978cfdeb15 100644 --- a/awsapi/src/com/cloud/stack/models/CloudStackUserVm.java +++ b/awsapi/src/com/cloud/stack/models/CloudStackUserVm.java @@ -66,6 +66,8 @@ public class CloudStackUserVm { private String jobId; @SerializedName(ApiConstants.JOB_STATUS) private Integer jobStatus; + @SerializedName(ApiConstants.SSH_KEYPAIR) + private String keyPairName; @SerializedName(ApiConstants.MEMORY) private Integer memory; @SerializedName(ApiConstants.NAME) @@ -339,6 +341,13 @@ public class CloudStackUserVm { return serviceOfferingName; } + /** + * @return the sshKeyPairName + */ + public String getKeyPairName() { + return keyPairName; + } + /** * @return the state */ diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 56d5218c8ef..d97810dfcd1 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -132,10 +132,12 @@ import com.cloud.user.Account; import com.cloud.user.AccountDetailsDao; import com.cloud.user.AccountVO; import com.cloud.user.ResourceLimitService; +import com.cloud.user.SSHKeyPairVO; import com.cloud.user.User; import com.cloud.user.UserStatisticsVO; import com.cloud.user.UserVO; import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.SSHKeyPairDao; import com.cloud.user.dao.UserDao; import com.cloud.user.dao.UserStatisticsDao; import com.cloud.uservm.UserVm; @@ -146,6 +148,7 @@ import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.InstanceGroupVO; import com.cloud.vm.NicProfile; +import com.cloud.vm.UserVmDetailVO; import com.cloud.vm.UserVmManager; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; @@ -155,6 +158,7 @@ import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.UserVmData; +import com.cloud.vm.dao.UserVmDetailsDao; import com.cloud.vm.dao.VMInstanceDao; public class ApiDBUtils { @@ -218,6 +222,8 @@ public class ApiDBUtils { private static AutoScaleVmGroupPolicyMapDao _asVmGroupPolicyMapDao; private static AutoScalePolicyDao _asPolicyDao; private static CounterDao _counterDao; + private static UserVmDetailsDao _userVmDetailsDao; + private static SSHKeyPairDao _sshKeyPairDao; static { _ms = (ManagementServer) ComponentLocator.getComponent(ManagementServer.Name); @@ -282,6 +288,9 @@ public class ApiDBUtils { _asVmGroupPolicyMapDao = locator.getDao(AutoScaleVmGroupPolicyMapDao.class); _asVmGroupPolicyMapDao = locator.getDao(AutoScaleVmGroupPolicyMapDao.class); _counterDao = locator.getDao(CounterDao.class); + _sshKeyPairDao = locator.getDao(SSHKeyPairDao.class); + _userVmDetailsDao = locator.getDao(UserVmDetailsDao.class); + // Note: stats collector should already have been initialized by this time, otherwise a null instance is // returned @@ -861,4 +870,13 @@ public class ApiDBUtils { public static CounterVO getCounter(long counterId) { return _counterDao.findById(counterId); } -} + + public static String getKeyPairName(String sshPublicKey) { + SSHKeyPairVO sshKeyPair = _sshKeyPairDao.findByPublicKey(sshPublicKey); + return sshKeyPair.getName(); + } + + public static UserVmDetailVO findPublicKeyByVmId(long vmId) { + return _userVmDetailsDao.findDetail(vmId, "SSH.PublicKey"); + } +} diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index c74d75bfb93..77d45c5971d 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -218,6 +218,7 @@ import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.InstanceGroup; import com.cloud.vm.InstanceGroupVO; import com.cloud.vm.NicProfile; +import com.cloud.vm.UserVmDetailVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.State; @@ -3297,6 +3298,12 @@ public class ApiResponseHelper implements ResponseGenerator { } userVmResponse.setTags(tagResponses); + UserVmDetailVO userVmDetail = ApiDBUtils.findPublicKeyByVmId(userVmData.getId()); + if (userVmDetail != null && userVmDetail.getValue() != null) { + String keyPairName = ApiDBUtils.getKeyPairName(userVmDetail.getValue()); + userVmResponse.setKeyPairName(keyPairName); + } + return userVmResponse; } @@ -3976,4 +3983,4 @@ public class ApiResponseHelper implements ResponseGenerator { populateOwner(response, condition); return response; } -} +} diff --git a/server/src/com/cloud/user/dao/SSHKeyPairDao.java b/server/src/com/cloud/user/dao/SSHKeyPairDao.java index c0d21b1925e..d4030e130c1 100644 --- a/server/src/com/cloud/user/dao/SSHKeyPairDao.java +++ b/server/src/com/cloud/user/dao/SSHKeyPairDao.java @@ -27,6 +27,8 @@ public interface SSHKeyPairDao extends GenericDao { public SSHKeyPairVO findByName(long accountId, long domainId, String name); + public SSHKeyPairVO findByPublicKey(String publicKey); + public boolean deleteByName(long accountId, long domainId, String name); } diff --git a/server/src/com/cloud/user/dao/SSHKeyPairDaoImpl.java b/server/src/com/cloud/user/dao/SSHKeyPairDaoImpl.java index d0b741df351..e32e14a3dab 100644 --- a/server/src/com/cloud/user/dao/SSHKeyPairDaoImpl.java +++ b/server/src/com/cloud/user/dao/SSHKeyPairDaoImpl.java @@ -57,7 +57,14 @@ public class SSHKeyPairDaoImpl extends GenericDaoBase implem sc.addAnd("name", SearchCriteria.Op.EQ, name); return findOneBy(sc); } - + + @Override + public SSHKeyPairVO findByPublicKey(String publicKey) { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("publicKey", SearchCriteria.Op.EQ, publicKey); + return findOneBy(sc); + } + @Override public boolean deleteByName(long accountId, long domainId, String name) { SSHKeyPairVO pair = findByName(accountId, domainId, name); diff --git a/server/src/com/cloud/vm/dao/UserVmData.java b/server/src/com/cloud/vm/dao/UserVmData.java index aa3c4401553..65bbb07f7e1 100644 --- a/server/src/com/cloud/vm/dao/UserVmData.java +++ b/server/src/com/cloud/vm/dao/UserVmData.java @@ -66,6 +66,7 @@ public class UserVmData { private Long publicIpId; private String publicIp; private String instanceName; + private String sshPublicKey; private boolean initialized; @@ -706,5 +707,13 @@ public class UserVmData { public void setInstanceName(String instanceName) { this.instanceName = instanceName; } + + public String getSshPublicKey() { + return sshPublicKey; + } + + public void setSshPublicKey(String sshPublicKey) { + this.sshPublicKey = sshPublicKey; + } } diff --git a/server/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java b/server/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java index 3781a603b6a..c1c7cddf9b0 100644 --- a/server/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java +++ b/server/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java @@ -35,7 +35,7 @@ public class UserVmDetailsDaoImpl extends GenericDaoBase i VmSearch.done(); DetailSearch = createSearchBuilder(); - DetailSearch.and("hostId", DetailSearch.entity().getVmId(), SearchCriteria.Op.EQ); + DetailSearch.and("vmId", DetailSearch.entity().getVmId(), SearchCriteria.Op.EQ); DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ); DetailSearch.done(); } From bb17d09e017acd74887fa104a9fbcfc894b18a3a Mon Sep 17 00:00:00 2001 From: Koushik Das Date: Mon, 30 Jul 2012 13:59:14 +0530 Subject: [PATCH 2/3] Support for local data disk (part 2) - Zone level config to enable/disable local storage usage for service and disk offerings. - Local storage gets discovered when a host is added/reconnected if zone level config is enabled. When disabled existing local storages are not removed but any new local storage is not added. - Deploy VM command validates service and disk offerings based on local storage config. - Upgrade uses the global config 'use.local.storage' to set the zone level config for local storage. Reviewed-by: Abhi, Nitin --- api/src/com/cloud/api/ApiConstants.java | 1 + .../com/cloud/api/commands/CreateZoneCmd.java | 13 ++++++++++-- .../com/cloud/api/commands/DeployVMCmd.java | 12 ++++++++++- .../com/cloud/api/commands/UpdateZoneCmd.java | 14 ++++++++++++- .../com/cloud/api/response/ZoneResponse.java | 7 +++++++ api/src/com/cloud/dc/DataCenter.java | 1 + .../classes/resources/messages.properties | 1 + .../src/com/cloud/api/ApiResponseHelper.java | 1 + .../configuration/ConfigurationManager.java | 2 +- .../ConfigurationManagerImpl.java | 11 +++++++--- server/src/com/cloud/dc/DataCenterVO.java | 20 +++++++++++++++---- .../storage/LocalStoragePoolListener.java | 8 ++++++++ .../com/cloud/storage/StorageManagerImpl.java | 5 +---- setup/db/create-schema.sql | 1 + setup/db/db/schema-304to305.sql | 3 ++- ui/index.jsp | 1 + ui/scripts/system.js | 11 ++++++++++ 17 files changed, 95 insertions(+), 17 deletions(-) diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 0a666f32986..7f25c2d2f22 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -288,6 +288,7 @@ public class ApiConstants { public static final String DHCP_RANGE = "dhcprange"; public static final String UUID = "uuid"; public static final String SECURITY_GROUP_EANBLED = "securitygroupenabled"; + public static final String LOCAL_STORAGE_EANBLED = "localstorageenabled"; public static final String GUEST_IP_TYPE = "guestiptype"; public static final String XEN_NETWORK_LABEL = "xennetworklabel"; public static final String KVM_NETWORK_LABEL = "kvmnetworklabel"; diff --git a/api/src/com/cloud/api/commands/CreateZoneCmd.java b/api/src/com/cloud/api/commands/CreateZoneCmd.java index e06b342c72b..631abc6c831 100755 --- a/api/src/com/cloud/api/commands/CreateZoneCmd.java +++ b/api/src/com/cloud/api/commands/CreateZoneCmd.java @@ -69,6 +69,9 @@ public class CreateZoneCmd extends BaseCmd { @Parameter(name=ApiConstants.SECURITY_GROUP_EANBLED, type=CommandType.BOOLEAN, description="true if network is security group enabled, false otherwise") private Boolean securitygroupenabled; + @Parameter(name=ApiConstants.LOCAL_STORAGE_EANBLED, type=CommandType.BOOLEAN, description="true if local storage offering enabled, false otherwise") + private Boolean localStorageEnabled; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -119,8 +122,14 @@ public class CreateZoneCmd extends BaseCmd { } return securitygroupenabled; } - - + + public Boolean getLocalStorageEnabled() { + if (localStorageEnabled == null) { + return false; + } + return localStorageEnabled; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// @Override diff --git a/api/src/com/cloud/api/commands/DeployVMCmd.java b/api/src/com/cloud/api/commands/DeployVMCmd.java index 29eb9063b89..fe43dcd99f5 100644 --- a/api/src/com/cloud/api/commands/DeployVMCmd.java +++ b/api/src/com/cloud/api/commands/DeployVMCmd.java @@ -372,13 +372,23 @@ public class DeployVMCmd extends BaseAsyncCreateCmd { throw new InvalidParameterValueException("Unable to use template " + templateId, null); } + DiskOffering diskOffering = null; if (diskOfferingId != null) { - DiskOffering diskOffering = _configService.getDiskOffering(diskOfferingId); + diskOffering = _configService.getDiskOffering(diskOfferingId); if (diskOffering == null) { throw new InvalidParameterValueException("Unable to find disk offering by id", null); } } + if (!zone.isLocalStorageEnabled()) { + if (serviceOffering.getUseLocalStorage()) { + throw new InvalidParameterValueException("Zone is not configured to use local storage but service offering " + serviceOffering.getName() + " uses it", null); + } + if (diskOffering != null && diskOffering.getUseLocalStorage()) { + throw new InvalidParameterValueException("Zone is not configured to use local storage but disk offering " + diskOffering.getName() + " uses it", null); + } + } + UserVm vm = null; if (getHypervisor() == HypervisorType.BareMetal) { vm = _bareMetalVmService.createVirtualMachine(this); diff --git a/api/src/com/cloud/api/commands/UpdateZoneCmd.java b/api/src/com/cloud/api/commands/UpdateZoneCmd.java index fae7f5a7238..0f4b6936ed2 100755 --- a/api/src/com/cloud/api/commands/UpdateZoneCmd.java +++ b/api/src/com/cloud/api/commands/UpdateZoneCmd.java @@ -23,6 +23,7 @@ import com.cloud.api.IdentityMapper; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; +import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.response.ZoneResponse; import com.cloud.dc.DataCenter; import com.cloud.user.Account; @@ -77,7 +78,10 @@ public class UpdateZoneCmd extends BaseCmd { @Parameter(name=ApiConstants.DNS_SEARCH_ORDER, type=CommandType.LIST, collectionType = CommandType.STRING, description="the dns search order list") private List dnsSearchOrder; - + + @Parameter(name=ApiConstants.LOCAL_STORAGE_EANBLED, type=CommandType.BOOLEAN, description="true if local storage offering enabled, false otherwise") + private Boolean localStorageEnabled; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -133,6 +137,14 @@ public class UpdateZoneCmd extends BaseCmd { public List getDnsSearchOrder() { return dnsSearchOrder; } + + public Boolean getLocalStorageEnabled() { + if (localStorageEnabled == null) { + return false; + } + return localStorageEnabled; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/com/cloud/api/response/ZoneResponse.java b/api/src/com/cloud/api/response/ZoneResponse.java index 7a2aef7b79e..9db788ff368 100755 --- a/api/src/com/cloud/api/response/ZoneResponse.java +++ b/api/src/com/cloud/api/response/ZoneResponse.java @@ -82,6 +82,9 @@ public class ZoneResponse extends BaseResponse { @SerializedName("capacity") @Param(description="the capacity of the Zone", responseObject = CapacityResponse.class) private List capacitites; + @SerializedName(ApiConstants.LOCAL_STORAGE_EANBLED) @Param(description="true if local storage offering enabled, false otherwise") + private boolean localStorageEnabled; + public void setId(Long id) { this.id.setValue(id); } @@ -161,4 +164,8 @@ public class ZoneResponse extends BaseResponse { public void setDomainName(String domainName) { this.domainName = domainName; } + + public void setLocalStorageEnabled(boolean localStorageEnabled) { + this.localStorageEnabled = localStorageEnabled; + } } diff --git a/api/src/com/cloud/dc/DataCenter.java b/api/src/com/cloud/dc/DataCenter.java index 0f3548cbe04..417b1b50460 100644 --- a/api/src/com/cloud/dc/DataCenter.java +++ b/api/src/com/cloud/dc/DataCenter.java @@ -71,4 +71,5 @@ public interface DataCenter extends Grouping { String getZoneToken(); + boolean isLocalStorageEnabled(); } diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties index 84d11364eb9..beef22f4f8d 100644 --- a/client/WEB-INF/classes/resources/messages.properties +++ b/client/WEB-INF/classes/resources/messages.properties @@ -1017,6 +1017,7 @@ label.linklocal.ip=Link Local IP Adddress label.load.balancer=Load Balancer label.loading=Loading label.local=Local +label.local.storage.enabled=Local Storage Enabled label.login=Login label.logout=Logout label.lun=LUN diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 77d45c5971d..175baa6dfeb 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -946,6 +946,7 @@ public class ApiResponseHelper implements ResponseGenerator { zoneResponse.setId(dataCenter.getId()); zoneResponse.setName(dataCenter.getName()); zoneResponse.setSecurityGroupsEnabled(ApiDBUtils.isSecurityGroupEnabledInZone(dataCenter.getId())); + zoneResponse.setLocalStorageEnabled(dataCenter.isLocalStorageEnabled()); if ((dataCenter.getDescription() != null) && !dataCenter.getDescription().equalsIgnoreCase("null")) { zoneResponse.setDescription(dataCenter.getDescription()); diff --git a/server/src/com/cloud/configuration/ConfigurationManager.java b/server/src/com/cloud/configuration/ConfigurationManager.java index 6e43895ad2d..9db92fe91ee 100644 --- a/server/src/com/cloud/configuration/ConfigurationManager.java +++ b/server/src/com/cloud/configuration/ConfigurationManager.java @@ -129,7 +129,7 @@ public interface ConfigurationManager extends ConfigurationService, Manager { * @throws */ DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String guestCidr, String domain, Long domainId, NetworkType zoneType, String allocationState, - String networkDomain, boolean isSecurityGroupEnabled); + String networkDomain, boolean isSecurityGroupEnabled, boolean isLocalStorageEnabled); /** * Deletes a VLAN from the database, along with all of its IP addresses. Will not delete VLANs that have allocated diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 191ebde33b8..f123a639e2c 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -1360,6 +1360,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura String dhcpProvider = cmd.getDhcpProvider(); Map detailsMap = cmd.getDetails(); String networkDomain = cmd.getDomain(); + Boolean localStorageEnabled = cmd.getLocalStorageEnabled(); Map newDetails = new HashMap(); if (detailsMap != null) { @@ -1466,6 +1467,9 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura zone.setInternalDns1(internalDns1); zone.setInternalDns2(internalDns2); zone.setGuestNetworkCidr(guestCidr); + if (localStorageEnabled != null) { + zone.setLocalStorageEnabled(localStorageEnabled.booleanValue()); + } if (networkDomain != null) { if (networkDomain.isEmpty()) { @@ -1539,7 +1543,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura @Override @DB public DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String guestCidr, String domain, Long domainId, - NetworkType zoneType, String allocationStateStr, String networkDomain, boolean isSecurityGroupEnabled) { + NetworkType zoneType, String allocationStateStr, String networkDomain, boolean isSecurityGroupEnabled, boolean isLocalStorageEnabled) { // checking the following params outside checkzoneparams method as we do // not use these params for updatezone @@ -1565,7 +1569,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura try { txn.start(); // Create the new zone in the database - DataCenterVO zone = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, guestCidr, domain, domainId, zoneType, zoneToken, networkDomain, isSecurityGroupEnabled); + DataCenterVO zone = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, guestCidr, domain, domainId, zoneType, zoneToken, networkDomain, isSecurityGroupEnabled, isLocalStorageEnabled); if (allocationStateStr != null && !allocationStateStr.isEmpty()) { Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr); zone.setAllocationState(allocationState); @@ -1645,6 +1649,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura String allocationState = cmd.getAllocationState(); String networkDomain = cmd.getDomain(); boolean isSecurityGroupEnabled = cmd.getSecuritygroupenabled(); + boolean isLocalStorageEnabled = cmd.getLocalStorageEnabled(); if (allocationState == null) { allocationState = Grouping.AllocationState.Disabled.toString(); @@ -1678,7 +1683,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } return createZone(userId, zoneName, dns1, dns2, internalDns1, internalDns2, guestCidr, domainVO != null ? domainVO.getName() : null, domainId, zoneType, allocationState, networkDomain, - isSecurityGroupEnabled); + isSecurityGroupEnabled, isLocalStorageEnabled); } @Override diff --git a/server/src/com/cloud/dc/DataCenterVO.java b/server/src/com/cloud/dc/DataCenterVO.java index 14cb40fe2fe..731fe7b37cc 100644 --- a/server/src/com/cloud/dc/DataCenterVO.java +++ b/server/src/com/cloud/dc/DataCenterVO.java @@ -123,6 +123,9 @@ public class DataCenterVO implements DataCenter, Identity { @Column(name="is_security_group_enabled") boolean securityGroupEnabled; + @Column(name="is_local_storage_enabled") + boolean localStorageEnabled; + @Override public String getDnsProvider() { return dnsProvider; @@ -168,14 +171,14 @@ public class DataCenterVO implements DataCenter, Identity { this.firewallProvider = firewallProvider; } - public DataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4,String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { - this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false); + public DataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { + this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false); this.id = id; this.allocationState = Grouping.AllocationState.Enabled; this.uuid = UUID.randomUUID().toString(); } - public DataCenterVO(String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled) { + public DataCenterVO(String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled) { this.name = name; this.description = description; this.dns1 = dns1; @@ -188,7 +191,7 @@ public class DataCenterVO implements DataCenter, Identity { this.networkType = zoneType; this.allocationState = Grouping.AllocationState.Enabled; this.securityGroupEnabled = securityGroupEnabled; - + this.localStorageEnabled = localStorageEnabled; if (zoneType == NetworkType.Advanced) { loadBalancerProvider = Provider.VirtualRouter.getName(); @@ -341,6 +344,15 @@ public class DataCenterVO implements DataCenter, Identity { this.securityGroupEnabled = enabled; } + @Override + public boolean isLocalStorageEnabled() { + return localStorageEnabled; + } + + public void setLocalStorageEnabled(boolean enabled) { + this.localStorageEnabled = enabled; + } + @Override public Map getDetails() { return details; diff --git a/server/src/com/cloud/storage/LocalStoragePoolListener.java b/server/src/com/cloud/storage/LocalStoragePoolListener.java index 73e9ca87a7f..11f45b5fd2f 100755 --- a/server/src/com/cloud/storage/LocalStoragePoolListener.java +++ b/server/src/com/cloud/storage/LocalStoragePoolListener.java @@ -27,6 +27,8 @@ import com.cloud.agent.api.StoragePoolInfo; import com.cloud.capacity.Capacity; import com.cloud.capacity.CapacityVO; import com.cloud.capacity.dao.CapacityDao; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.dao.DataCenterDao; import com.cloud.exception.ConnectionException; import com.cloud.host.HostVO; import com.cloud.host.Status; @@ -43,6 +45,7 @@ public class LocalStoragePoolListener implements Listener { @Inject StoragePoolDao _storagePoolDao; @Inject StoragePoolHostDao _storagePoolHostDao; @Inject CapacityDao _capacityDao; + @Inject DataCenterDao _dcDao; @Inject StorageManager _storageMgr; @Override @@ -83,6 +86,11 @@ public class LocalStoragePoolListener implements Listener { return; } + DataCenterVO dc = _dcDao.findById(host.getDataCenterId()); + if (dc == null || !dc.isLocalStorageEnabled()) { + return; + } + try { StoragePoolVO pool = _storagePoolDao.findPoolByHostPath(host.getDataCenterId(), host.getPodId(), pInfo.getHost(), pInfo.getHostPath(), pInfo.getUuid()); if(pool == null && host.getHypervisorType() == HypervisorType.VMware) { diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index f45e0ced711..545817e8da6 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -959,10 +959,7 @@ public class StorageManagerImpl implements StorageManager, Manager, ClusterManag int wrks = NumbersUtil.parseInt(workers, 10); _executor = Executors.newScheduledThreadPool(wrks, new NamedThreadFactory("StorageManager-Scavenger")); - boolean localStorage = Boolean.parseBoolean(configs.get(Config.UseLocalStorage.key())); - if (localStorage) { - _agentMgr.registerForHostEvents(ComponentLocator.inject(LocalStoragePoolListener.class), true, false, false); - } + _agentMgr.registerForHostEvents(ComponentLocator.inject(LocalStoragePoolListener.class), true, false, false); String maxVolumeSizeInGbString = configDao.getValue("storage.max.volume.size"); _maxVolumeSizeInGb = NumbersUtil.parseLong(maxVolumeSizeInGbString, 2000); diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 9c6cea96387..a081749af9c 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -549,6 +549,7 @@ CREATE TABLE `cloud`.`data_center` ( `allocation_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this data center enabled for allocation for new resources', `zone_token` varchar(255), `is_security_group_enabled` tinyint NOT NULL DEFAULT 0 COMMENT '1: enabled, 0: not', + `is_local_storage_enabled` tinyint NOT NULL DEFAULT 0 COMMENT 'Is local storage offering enabled for this data center; 1: enabled, 0: not', `removed` datetime COMMENT 'date removed if not null', PRIMARY KEY (`id`), CONSTRAINT `fk_data_center__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`), diff --git a/setup/db/db/schema-304to305.sql b/setup/db/db/schema-304to305.sql index b1cc3c85bf8..29d79675fec 100755 --- a/setup/db/db/schema-304to305.sql +++ b/setup/db/db/schema-304to305.sql @@ -340,4 +340,5 @@ CREATE TABLE `cloud`.`s2s_vpn_connection` ( CONSTRAINT `uc_s2s_vpn_connection__uuid` UNIQUE (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; - +ALTER TABLE `cloud`.`data_center` ADD COLUMN `is_local_storage_enabled` tinyint NOT NULL DEFAULT 0 COMMENT 'Is local storage offering enabled for this data center; 1: enabled, 0: not'; +UPDATE `cloud`.`data_center` SET `is_local_storage_enabled` = IF ((SELECT `value` FROM `cloud`.`configuration` WHERE `name`='use.local.storage')='true', 1, 0) WHERE `removed` IS NULL; diff --git a/ui/index.jsp b/ui/index.jsp index cb9b4c6fd09..3cb2b6c5bcb 100644 --- a/ui/index.jsp +++ b/ui/index.jsp @@ -2430,6 +2430,7 @@ dictionary = { 'label.load.balancer': '', 'label.loading': '', 'label.local': '', +'label.local.storage.enabled': '', 'label.login': '', 'label.logout': '', 'label.lun': '', diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 2f6fd844b55..c02ce1fa890 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -3832,6 +3832,7 @@ array1.push("&internaldns1=" + todb(args.data.internaldns1)); array1.push("&internaldns2=" + todb(args.data.internaldns2)); //internaldns2 can be empty ("") when passed to API array1.push("&domain=" + todb(args.data.domain)); + array1.push("&localstorageenabled=" + todb(args.data.localstorageenabled)); $.ajax({ url: createURL("updateZone&id=" + args.context.physicalResources[0].id + array1.join("")), dataType: "json", @@ -3875,6 +3876,16 @@ domain: { label: 'label.network.domain', isEditable: true + }, + localstorageenabled: { + label: 'label.local.storage.enabled', + converter: function(args) { + if(args) + return "true"; + else + return "false"; + }, + isEditable: true } } ], From e1639e8e8a5c434c593465b423a3157728849e15 Mon Sep 17 00:00:00 2001 From: Vijay Date: Mon, 30 Jul 2012 15:18:41 +0530 Subject: [PATCH 3/3] AutoScale. Added clean-up of AutoScale config in NetScaler if an operation is errored half way through. Also re-organized NetScalerResource to keep AutoScale things together. --- .../network/resource/NetscalerResource.java | 1311 +++++++++-------- 1 file changed, 676 insertions(+), 635 deletions(-) diff --git a/core/src/com/cloud/network/resource/NetscalerResource.java b/core/src/com/cloud/network/resource/NetscalerResource.java index ab2c958ad6a..4b1921720d0 100644 --- a/core/src/com/cloud/network/resource/NetscalerResource.java +++ b/core/src/com/cloud/network/resource/NetscalerResource.java @@ -12,7 +12,6 @@ // Automatically generated by addcopyright.py at 04/03/2012 package com.cloud.network.resource; -import java.util.ArrayList; import java.util.Formatter; import java.util.HashMap; import java.util.List; @@ -26,8 +25,15 @@ import org.apache.log4j.Logger; import com.citrix.netscaler.nitro.exception.nitro_exception; import com.citrix.netscaler.nitro.resource.base.base_response; import com.citrix.netscaler.nitro.resource.config.basic.server_service_binding; +import com.citrix.netscaler.nitro.resource.config.basic.servicegroup; +import com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable; +import com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable_metric_binding; +import com.citrix.netscaler.nitro.resource.config.lb.lbmonitor; +import com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_lbmetrictable_binding; +import com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_servicegroup_binding; import com.citrix.netscaler.nitro.resource.config.lb.lbvserver; import com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding; +import com.citrix.netscaler.nitro.resource.config.lb.lbvserver_servicegroup_binding; import com.citrix.netscaler.nitro.resource.config.network.Interface; import com.citrix.netscaler.nitro.resource.config.network.inat; import com.citrix.netscaler.nitro.resource.config.network.vlan; @@ -36,6 +42,8 @@ import com.citrix.netscaler.nitro.resource.config.network.vlan_nsip_binding; import com.citrix.netscaler.nitro.resource.config.ns.nsconfig; import com.citrix.netscaler.nitro.resource.config.ns.nshardware; import com.citrix.netscaler.nitro.resource.config.ns.nsip; +import com.citrix.netscaler.nitro.resource.config.timer.timerpolicy; +import com.citrix.netscaler.nitro.resource.config.timer.timertrigger_timerpolicy_binding; import com.citrix.netscaler.nitro.resource.config.autoscale.*; import com.citrix.netscaler.nitro.resource.stat.lb.lbvserver_stats; import com.citrix.netscaler.nitro.service.nitro_service; @@ -95,6 +103,7 @@ class NitroError { public class NetscalerResource implements ServerResource { + // deployment configuration private String _name; private String _zoneId; @@ -222,11 +231,7 @@ public class NetscalerResource implements ServerResource { } catch (Exception e) { throw new ConfigurationException(e.getMessage()); } - finally { - doServiceCleanUp(); - } } - private ArrayList netscalerServices = new ArrayList(); private void login() throws ExecutionException { try { @@ -349,20 +354,9 @@ public class NetscalerResource implements ServerResource { @Override public Answer executeRequest(Command cmd) { Answer ans = executeRequest(cmd, _numRetries); - doServiceCleanUp(); return ans; } - private void doServiceCleanUp() { - for (com.citrix.netscaler.nitro.service.nitro_service netScalerService : netscalerServices) { - try{ - netScalerService.logout(); - } catch(Exception ex) { - } - } - netscalerServices.removeAll(netscalerServices); - } - private Answer executeRequest(Command cmd, int numRetries) { if (cmd instanceof ReadyCommand) { return execute((ReadyCommand) cmd); @@ -434,617 +428,6 @@ public class NetscalerResource implements ServerResource { return new IpAssocAnswer(cmd, results); } - private boolean isScaleUpPolicy(AutoScalePolicyTO autoScalePolicyTO) { - return autoScalePolicyTO.getAction().equals("scaleup"); - } - - private boolean isScaleDownPolicy(AutoScalePolicyTO autoScalePolicyTO) { - return autoScalePolicyTO.getAction().equals("scaledown"); - } - - private void removeAutoScalePolicy(String timerName, String policyName) throws Exception { - // unbind timer policy - // unbbind timer trigger lb_astimer -policyName lb_policy_scaleUp - com.citrix.netscaler.nitro.resource.config.timer.timertrigger_timerpolicy_binding timer_policy_binding = new com.citrix.netscaler.nitro.resource.config.timer.timertrigger_timerpolicy_binding(); - try { - timer_policy_binding.set_name(timerName); - timer_policy_binding.set_policyname(policyName); - timer_policy_binding.set_global("DEFAULT"); - timer_policy_binding.delete(_netscalerService, timer_policy_binding); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // Removing Timer policy - // rm timer policy lb_policy_scaleUp_cpu_mem - com.citrix.netscaler.nitro.resource.config.timer.timerpolicy timerPolicy = new com.citrix.netscaler.nitro.resource.config.timer.timerpolicy(); - try { - timerPolicy.set_name(policyName); - timerPolicy.delete(_netscalerService, timerPolicy); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - } - - @SuppressWarnings("static-access") - private synchronized boolean removeAutoScaleConfig(LoadBalancerTO loadBalancerTO) throws Exception, ExecutionException { - String srcIp = loadBalancerTO.getSrcIp(); - int srcPort = loadBalancerTO.getSrcPort(); - - String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); - String serviceGroupName = generateAutoScaleServiceGroupName(srcIp, srcPort); - - disableAutoScaleConfig(loadBalancerTO); - - // UnBind autoscale service group - // unbind lb vserver lb lb_autoscaleGroup - com.citrix.netscaler.nitro.resource.config.lb.lbvserver_servicegroup_binding vserver_servicegroup_binding = new com.citrix.netscaler.nitro.resource.config.lb.lbvserver_servicegroup_binding(); - try { - vserver_servicegroup_binding.set_name(nsVirtualServerName); - vserver_servicegroup_binding.set_servicegroupname(serviceGroupName); - vserver_servicegroup_binding.delete(_netscalerService, vserver_servicegroup_binding); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // Remove autoscale service group - com.citrix.netscaler.nitro.resource.config.basic.servicegroup serviceGroup = new com.citrix.netscaler.nitro.resource.config.basic.servicegroup(); - try { - serviceGroup.set_servicegroupname(serviceGroupName); - serviceGroup.delete(_netscalerService, serviceGroup); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // // Set min and max autoscale members to zero - // com.citrix.netscaler.nitro.resource.config.lb.lbvserver lbvserver = new - // com.citrix.netscaler.nitro.resource.config.lb.lbvserver(); - // try { - // lbvserver.set_name(nsVirtualServerName); - // lbvserver.set_minautoscalemembers(0); - // lbvserver.set_maxautoscalemembers(0); - // lbvserver.update(_netscalerService, lbvserver); - // } catch (Exception e) { - // // Ignore Exception - // throw e; - // } - - removeLBVirtualServer(nsVirtualServerName); - - return true; - } - - @SuppressWarnings("static-access") - private synchronized boolean disableAutoScaleConfig(LoadBalancerTO loadBalancerTO) throws Exception { - String srcIp = loadBalancerTO.getSrcIp(); - int srcPort = loadBalancerTO.getSrcPort(); - - String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); - String profileName = generateAutoScaleProfileName(srcIp, srcPort); - String timerName = generateAutoScaleTimerName(srcIp, srcPort); - String scaleDownActionName = generateAutoScaleScaleDownActionName(srcIp, srcPort); - String scaleUpActionName = generateAutoScaleScaleUpActionName(srcIp, srcPort); - String mtName = generateSnmpMetricTableName(srcIp, srcPort); - String monitorName = generateSnmpMonitorName(srcIp, srcPort); - String serviceGroupName = generateAutoScaleServiceGroupName(srcIp, srcPort); - AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); - List policies = vmGroupTO.getPolicies(); - - /* Delete min/max member policies */ - String minMemberPolicyName = generateAutoScaleMinPolicyName(srcIp, srcPort); - - removeAutoScalePolicy(timerName, minMemberPolicyName); - - String maxMemberPolicyName = generateAutoScaleMaxPolicyName(srcIp, srcPort); - removeAutoScalePolicy(timerName, maxMemberPolicyName); - - boolean isSnmp = false; - /* Create Counters */ - for (AutoScalePolicyTO autoScalePolicyTO : policies) { - List conditions = autoScalePolicyTO.getConditions(); - for (ConditionTO conditionTO : conditions) { - CounterTO counterTO = conditionTO.getCounter(); - if(counterTO.getSource().equals("snmp")) { - isSnmp = true; - break; - } - } - String policyId = Long.toString(autoScalePolicyTO.getId()); - String policyName = generateAutoScalePolicyName(srcIp, srcPort,policyId); - - // Removing Timer policy - removeAutoScalePolicy(timerName, policyName); - } - - /* Delete AutoScale Config */ - // Delete AutoScale ScaleDown action - com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleDownAction = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); - try { - scaleDownAction.set_name(scaleDownActionName); - scaleDownAction.delete(_netscalerService, scaleDownAction); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // Delete AutoScale ScaleUp action - com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleUpAction = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); - try { - scaleUpAction.set_name(scaleUpActionName); - scaleUpAction.delete(_netscalerService, scaleUpAction); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // Delete Timer - com.citrix.netscaler.nitro.resource.config.timer.timertrigger timer = new com.citrix.netscaler.nitro.resource.config.timer.timertrigger(); - try { - timer.set_name(timerName); - timer.delete(_netscalerService, timer); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // Delete AutoScale Profile - com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile autoscaleProfile = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile(); - try { - autoscaleProfile.set_name(profileName); - autoscaleProfile.delete(_netscalerService, autoscaleProfile); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - if(isSnmp) { - com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_servicegroup_binding monitor_servicegroup_binding = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_servicegroup_binding(); - try { - monitor_servicegroup_binding.set_monitorname(monitorName); - monitor_servicegroup_binding.set_servicegroupname(serviceGroupName); - monitor_servicegroup_binding.delete(_netscalerService, monitor_servicegroup_binding); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // Delete Monitor - // rm lb monitor lb_metric_table_mon - com.citrix.netscaler.nitro.resource.config.lb.lbmonitor monitor = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor(); - try { - monitor.set_monitorname(monitorName); - monitor.set_type("LOAD"); - monitor.delete(_netscalerService, monitor); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // Delete Metric Table - com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable metricTable = new com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable(); - try { - metricTable.set_metrictable(mtName); - metricTable.delete(_netscalerService, metricTable); - } catch (Exception e) { - // Ignore Exception - throw e; - } - } - - - return true; - } - - @SuppressWarnings("static-access") - private synchronized boolean createAutoScaleConfig(LoadBalancerTO loadBalancerTO) throws ExecutionException, Exception { - - String srcIp = loadBalancerTO.getSrcIp(); - int srcPort = loadBalancerTO.getSrcPort(); - String lbProtocol = getNetScalerProtocol(loadBalancerTO); - String lbAlgorithm = loadBalancerTO.getAlgorithm(); - String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); - AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); - addLBVirtualServer(nsVirtualServerName, srcIp, srcPort, lbAlgorithm, lbProtocol, loadBalancerTO.getStickinessPolicies(), vmGroupTO); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Created load balancing virtual server " + nsVirtualServerName + " on the Netscaler device"); - } - - String serviceGroupName = generateAutoScaleServiceGroupName(srcIp, srcPort); - // add servicegroup lb_autoscaleGroup -autoscale POLICY -memberPort 80 - com.citrix.netscaler.nitro.resource.config.basic.servicegroup serviceGroup = new com.citrix.netscaler.nitro.resource.config.basic.servicegroup(); - int memberPort = vmGroupTO.getMemberPort(); - try { - serviceGroup.set_servicegroupname(serviceGroupName); - serviceGroup.set_servicetype(lbProtocol); - serviceGroup.set_autoscale("POLICY"); // TODO: Values not displayed in API - serviceGroup.set_memberport(memberPort); - serviceGroup.add(_netscalerService, serviceGroup); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // Bind autoscale service group - // bind lb vserver lb lb_autoscaleGroup - com.citrix.netscaler.nitro.resource.config.lb.lbvserver_servicegroup_binding vserver_servicegroup_binding = new com.citrix.netscaler.nitro.resource.config.lb.lbvserver_servicegroup_binding(); - - try { - vserver_servicegroup_binding.set_name(nsVirtualServerName); - vserver_servicegroup_binding.set_servicegroupname(serviceGroupName); - vserver_servicegroup_binding.add(_netscalerService, vserver_servicegroup_binding); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // Create the autoscale config - enableAutoScaleConfig(loadBalancerTO); - return true; - } - - @SuppressWarnings("static-access") - private synchronized boolean enableAutoScaleConfig(LoadBalancerTO loadBalancerTO) throws Exception { - String srcIp = loadBalancerTO.getSrcIp(); - int srcPort = loadBalancerTO.getSrcPort(); - - String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); - String serviceGroupName = generateAutoScaleServiceGroupName(srcIp, srcPort); - String profileName = generateAutoScaleProfileName(srcIp, srcPort); - String timerName = generateAutoScaleTimerName(srcIp, srcPort); - String scaleDownActionName = generateAutoScaleScaleDownActionName(srcIp, srcPort); - String scaleUpActionName = generateAutoScaleScaleUpActionName(srcIp, srcPort); - String mtName = generateSnmpMetricTableName(srcIp, srcPort); - String monitorName = generateSnmpMonitorName(srcIp, srcPort); - AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); - AutoScaleVmProfileTO profileTO = vmGroupTO.getProfile(); - List policies = vmGroupTO.getPolicies(); - int interval = vmGroupTO.getInterval(); - int snmpPort = profileTO.getSnmpPort(); - String snmpCommunity = profileTO.getSnmpCommunity(); - long cur_prirotiy = 1; - - - // Set min and max autoscale members; - // add lb vserver lb http 10.102.31.100 80 -minAutoscaleMinMembers 3 -maxAutoscaleMembers 10 - int minAutoScaleMembers = vmGroupTO.getMinMembers(); - int maxAutoScaleMembers = vmGroupTO.getMaxMembers(); - com.citrix.netscaler.nitro.resource.config.lb.lbvserver lbvserver = new com.citrix.netscaler.nitro.resource.config.lb.lbvserver(); - try { - lbvserver.set_name(nsVirtualServerName); - lbvserver.set_minautoscalemembers(minAutoScaleMembers); - lbvserver.set_maxautoscalemembers(maxAutoScaleMembers); - lbvserver.update(_netscalerService, lbvserver); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - /* AutoScale Config */ - // Add AutoScale Profile - // add autoscale profile lb_asprofile CLOUDSTACK -url -http:// 10.102.31.34:8080/client/api- -apiKey abcdef - // -sharedSecret xyzabc - String apiKey = profileTO.getAutoScaleUserApiKey(); - String secretKey = profileTO.getAutoScaleUserSecretKey(); - String url = profileTO.getCloudStackApiUrl(); - - com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile autoscaleProfile = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile(); - try { - autoscaleProfile.set_name(profileName); - autoscaleProfile.set_type("CLOUDSTACK"); - autoscaleProfile.set_apikey(apiKey); - autoscaleProfile.set_sharedsecret(secretKey); - autoscaleProfile.set_url(url); - autoscaleProfile.add(_netscalerService, autoscaleProfile); - } catch (Exception e) { - // Ignore Exception - - throw e; - } - - // Add Timer - com.citrix.netscaler.nitro.resource.config.timer.timertrigger timer = new com.citrix.netscaler.nitro.resource.config.timer.timertrigger(); - try { - timer.set_name(timerName); - timer.set_interval(interval); - timer.add(_netscalerService, timer); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // AutoScale Actions - Integer scaleUpQuietTime = null; - Integer scaleDownQuietTime = null; - for (AutoScalePolicyTO autoScalePolicyTO : policies) { - if(scaleUpQuietTime == null) { - if(isScaleUpPolicy(autoScalePolicyTO)) { - scaleUpQuietTime = autoScalePolicyTO.getQuietTime(); - if(scaleDownQuietTime != null) { - break; - } - } - } - if(scaleDownQuietTime == null) { - if(isScaleDownPolicy(autoScalePolicyTO)) { - scaleDownQuietTime = autoScalePolicyTO.getQuietTime(); - if(scaleUpQuietTime != null) { - break; - } - } - } - } - - // Add AutoScale ScaleUp action - // add autoscale action lb_scaleUpAction provision -vserver lb -profilename lb_asprofile -params - // -lbruleid=1234&command=deployvm&zoneid=10&templateid=5&serviceofferingid=3- -quiettime 300 - com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleUpAction = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); - try { - scaleUpAction.set_name(scaleUpActionName); - scaleUpAction.set_type("SCALE_UP"); // TODO: will this be called provision? - scaleUpAction.set_vserver(nsVirtualServerName); // Actions Vserver, the one that is autoscaled, with CS - // now both are same. Not exposed in API. - scaleUpAction.set_profilename(profileName); - scaleUpAction.set_quiettime(scaleUpQuietTime); - String scaleUpParameters = "command=deployVirtualMachine" + "&" + - ApiConstants.ZONE_ID + "=" + profileTO.getZoneId()+ "&" + - ApiConstants.SERVICE_OFFERING_ID + "=" + profileTO.getServiceOfferingId()+ "&" + - ApiConstants.TEMPLATE_ID + "=" + profileTO.getTemplateId()+ "&" + - ((profileTO.getOtherDeployParams() == null)? "" : (profileTO.getOtherDeployParams() + "&")) + - "lbruleid=" + loadBalancerTO.getId(); - scaleUpAction.set_parameters(scaleUpParameters); - scaleUpAction.add(_netscalerService, scaleUpAction); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleDownAction = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); - Integer destroyVmGracePeriod = profileTO.getDestroyVmGraceperiod(); - try { - scaleDownAction.set_name(scaleDownActionName); - scaleDownAction.set_type("SCALE_DOWN"); // TODO: will this be called de-provision? - scaleDownAction.set_vserver(nsVirtualServerName); // TODO: no global option as of now through Nitro. - // Testing cannot be done. - scaleDownAction.set_profilename(profileName); - scaleDownAction.set_quiettime(scaleDownQuietTime); - String scaleDownParameters = "command=destroyVirtualMachine" + "&" + - "lbruleid=" + loadBalancerTO.getId(); - scaleDownAction.set_parameters(scaleDownParameters); - scaleDownAction.set_vmdestroygraceperiod(destroyVmGracePeriod); - scaleDownAction.add(_netscalerService, scaleDownAction); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - /* Create min member policy */ - String minMemberPolicyName = generateAutoScaleMinPolicyName(srcIp, srcPort); - String minMemberPolicyExp = "SYS.VSERVER(\"" + nsVirtualServerName + "\").ACTIVESERVICES.LT(SYS.VSERVER(\"" + nsVirtualServerName + "\").MINAUTOSCALEMEMBERS)"; - addAutoScalePolicy(timerName, minMemberPolicyName, cur_prirotiy++, minMemberPolicyExp, scaleUpActionName, - interval, interval); - - /* Create max member policy */ - String maxMemberPolicyName = generateAutoScaleMaxPolicyName(srcIp, srcPort); - String maxMemberPolicyExp = "SYS.VSERVER(\"" + nsVirtualServerName + "\").ACTIVESERVICES.GT(SYS.VSERVER(\"" + nsVirtualServerName + "\").MAXAUTOSCALEMEMBERS)"; - addAutoScalePolicy(timerName, maxMemberPolicyName, cur_prirotiy++, maxMemberPolicyExp, scaleDownActionName, - interval, interval); - - /* Create Counters */ - HashMap snmpMetrics = new HashMap(); - for (AutoScalePolicyTO autoScalePolicyTO : policies) { - List conditions = autoScalePolicyTO.getConditions(); - String policyExpression = ""; - int snmpCounterNumber = 0; - for (ConditionTO conditionTO : conditions) { - CounterTO counterTO = conditionTO.getCounter(); - String counterName = counterTO.getName(); - String operator = conditionTO.getRelationalOperator(); - long threshold = conditionTO.getThreshold(); - - StringBuilder conditionExpression = new StringBuilder(); - Formatter formatter = new Formatter(conditionExpression, Locale.US); - - if(counterTO.getSource().equals("snmp")) - { - counterName = generateSnmpMetricName(counterName); - if(snmpMetrics.size() == 0) { - // Create Metric Table - //add lb metricTable lb_metric_table - com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable metricTable = new com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable(); - try { - metricTable.set_metrictable(mtName); - metricTable.add(_netscalerService, metricTable); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // Create Monitor - // add lb monitor lb_metric_table_mon LOAD -destPort 161 -snmpCommunity public -metricTable - // lb_metric_table -interval - com.citrix.netscaler.nitro.resource.config.lb.lbmonitor monitor = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor(); - try { - monitor.set_monitorname(monitorName); - monitor.set_type("LOAD"); - monitor.set_destport(snmpPort); - monitor.set_snmpcommunity(snmpCommunity); - monitor.set_metrictable(mtName); - monitor.set_interval((int)(interval * 0.8)); - monitor.add(_netscalerService, monitor); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // Bind servicegroup to monitor. TODO: This will change later to bind Monitor to ServiceGroup. - // bind lb monitor lb_metric_table_mon lb_autoscaleGroup -passive - com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_servicegroup_binding monitor_servicegroup_binding = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_servicegroup_binding(); - try { - monitor_servicegroup_binding.set_monitorname(monitorName); - monitor_servicegroup_binding.set_servicegroupname(serviceGroupName); - monitor_servicegroup_binding.set_passive(true); // Mark the monitor to do only collect - // metrics, basically use it for autoscaling purpose only. - monitor_servicegroup_binding.add(_netscalerService, monitor_servicegroup_binding); - } catch (Exception e) { - // Ignore Exception - throw e; - } - } - - boolean newMetric = !snmpMetrics.containsKey(counterName); - if(newMetric) { - snmpMetrics.put(counterName, snmpCounterNumber++); - } - - if(newMetric) - { - // bind lb metricTable lb_metric_table mem 1.3.6.1.4.1.2021.11.9.0 - String counterOid = counterTO.getValue(); - com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable_metric_binding metrictable_metric_binding = new com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable_metric_binding(); - try { - metrictable_metric_binding.set_metrictable(mtName); - metrictable_metric_binding.set_metric(counterName); - metrictable_metric_binding.set_Snmpoid(counterOid); - metrictable_metric_binding.add(_netscalerService, metrictable_metric_binding); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // bind lb monitor lb_metric_table_mon -metric cpu -metricThreshold 1 - com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_lbmetrictable_binding monitor_metrictable_binding = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_lbmetrictable_binding(); - try { - monitor_metrictable_binding.set_monitorname(monitorName); - monitor_metrictable_binding.set_metric(counterName); - monitor_metrictable_binding.set_metricthreshold(1); // 1 is a dummy threshold - monitor_metrictable_binding.add(_netscalerService, monitor_metrictable_binding); - } catch (Exception e) { - // Ignore Exception - throw e; - } - } - // SYS.VSERVER("abcd").SNMP_TABLE(0).AVERAGE_VALUE.GT(80) - int counterIndex = snmpMetrics.get(counterName); // TODO: temporary fix. later on counter name will be added as a param to SNMP_TABLE. - formatter.format("SYS.VSERVER(\"%s\").SNMP_TABLE(%d).AVERAGE_VALUE.%s(%d)",nsVirtualServerName, counterIndex, operator, threshold); - } - else if (counterTO.getSource().equals("netscaler")) - { - //SYS.VSERVER("abcd").RESPTIME.GT(10) - formatter.format("SYS.VSERVER(\"%s\").%s.%s(%d)",nsVirtualServerName, counterTO.getValue(), operator, threshold); - } - if(policyExpression.length() != 0) { - policyExpression += " && "; - } - policyExpression += conditionExpression; - } - policyExpression = "(" + policyExpression + ")"; - - String policyId = Long.toString(autoScalePolicyTO.getId()); - String policyName = generateAutoScalePolicyName(srcIp, srcPort, policyId); - String action = null; - if(isScaleUpPolicy(autoScalePolicyTO)) { - action = scaleUpActionName; - String scaleUpCondition = "SYS.VSERVER(\"" + nsVirtualServerName + "\").ACTIVESERVICES.LT(SYS.VSERVER(\"" + nsVirtualServerName + "\").MAXAUTOSCALEMEMBERS)"; - policyExpression = scaleUpCondition + " && " + policyExpression; - } else { - action = scaleDownActionName; - String scaleDownCondition = "SYS.VSERVER(\"" + nsVirtualServerName + "\").ACTIVESERVICES.GT(SYS.VSERVER(\"" + nsVirtualServerName + "\").MINAUTOSCALEMEMBERS)"; - policyExpression = scaleDownCondition + " && " + policyExpression; - } - - addAutoScalePolicy(timerName, policyName, cur_prirotiy++, policyExpression, action, - autoScalePolicyTO.getDuration(), interval); - - } - - return true; - } - - - private synchronized void addAutoScalePolicy(String timerName,String policyName, long priority, String policyExpression, String action, - int duration, int interval) throws Exception { - // Adding a autoscale policy - // add timer policy lb_policy_scaleUp_cpu_mem -rule - (SYS.CUR_VSERVER.METRIC_TABLE(cpu).AVG_VAL.GT(80)- - // -action lb_scaleUpAction - com.citrix.netscaler.nitro.resource.config.timer.timerpolicy timerPolicy = new com.citrix.netscaler.nitro.resource.config.timer.timerpolicy(); - try { - timerPolicy.set_name(policyName); - timerPolicy.set_action(action); - timerPolicy.set_rule(policyExpression); - timerPolicy.add(_netscalerService, timerPolicy); - } catch (Exception e) { - // Ignore Exception - throw e; - } - - // bind timer policy - // For now it is bound globally. - // bind timer trigger lb_astimer -policyName lb_policy_scaleUp -vserver lb -priority 1 -samplesize 5 - // TODO: later bind to lbvserver. bind timer trigger lb_astimer -policyName lb_policy_scaleUp -vserver lb -priority 1 -samplesize 5 - // -thresholdsize 5 - com.citrix.netscaler.nitro.resource.config.timer.timertrigger_timerpolicy_binding timer_policy_binding = new com.citrix.netscaler.nitro.resource.config.timer.timertrigger_timerpolicy_binding(); - int sampleSize = duration/interval; - try { - timer_policy_binding.set_name(timerName); - timer_policy_binding.set_policyname(policyName); - // timer_policy_binding.set_vserver(nsVirtualServerName); - timer_policy_binding.set_global("DEFAULT"); // vserver name is present at the expression - timer_policy_binding.set_samplesize(sampleSize); - timer_policy_binding.set_thresholdsize(sampleSize); // We are not exposing this parameter as of now. - // i.e. n(m) is not exposed to CS user. So thresholdSize == sampleSize - timer_policy_binding.set_priority(priority); - timer_policy_binding.add(_netscalerService, timer_policy_binding); - } catch (Exception e) { - // Ignore Exception - throw e; - } - } - public synchronized void applyAutoScaleConfig(LoadBalancerTO loadBalancer) throws Exception, ExecutionException { - - AutoScaleVmGroupTO vmGroupTO = loadBalancer.getAutoScaleVmGroupTO(); - if(!isAutoScaleSupportedInNetScaler()) { - throw new ExecutionException("AutoScale not supported in this version of NetScaler"); - } - if(vmGroupTO.getState().equals("new")) { - assert !loadBalancer.isRevoked(); - createAutoScaleConfig(loadBalancer); - } - else if(loadBalancer.isRevoked() || vmGroupTO.getState().equals("revoke")) { - removeAutoScaleConfig(loadBalancer); - } - else if(vmGroupTO.getState().equals("enabled")) { - assert !loadBalancer.isRevoked(); - enableAutoScaleConfig(loadBalancer); - } - else if(vmGroupTO.getState().equals("disabled")) { - assert !loadBalancer.isRevoked(); - disableAutoScaleConfig(loadBalancer); - } else { - ///// This should never happen - throw new ExecutionException("Unknown vmGroup State :" + vmGroupTO.getState()); - } - } - - private boolean isAutoScaleSupportedInNetScaler() throws ExecutionException { - autoscaleprofile autoscaleProfile = new autoscaleprofile(); - try { - autoscaleProfile.get(_netscalerService); - } catch (Exception ex) { - // Looks like autoscale is not supported in this netscaler. - // TODO: Config team has introduce a new command to check - // the list of entities supported in a NetScaler. Can use that - // once it is present in AutoScale branch. - s_logger.warn("AutoScale is not supported in NetScaler"); - return false; - } - return true; - } - private synchronized Answer execute(LoadBalancerConfigCommand cmd, int numRetries) { try { if (_isSdx) { @@ -1877,6 +1260,36 @@ public class NetscalerResource implements ServerResource { } } + private boolean isServiceGroupBoundToVirtualServer(String nsVirtualServerName, String serviceGroupName) throws ExecutionException { + + lbvserver_servicegroup_binding vserver_servicegroup_binding = new lbvserver_servicegroup_binding(); + + try { + lbvserver_servicegroup_binding[] result = vserver_servicegroup_binding.get_filtered(_netscalerService, nsVirtualServerName, "servicegroupname:" + serviceGroupName); + if(result != null && result.length > 0){ + return true; + } + } catch (Exception e) { + throw new ExecutionException("Failed to verify lb vserver " + nsVirtualServerName + "and servicegrop " + serviceGroupName + " binding exists due to " + e.getMessage()); + } + return false; + + } + + private servicegroup getServiceGroupIfExisits(String lbVServerName ) throws ExecutionException { + try { + return servicegroup.get(_netscalerService, lbVServerName); + } catch (nitro_exception e) { + if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { + return null; + } else { + throw new ExecutionException(e.getMessage()); + } + } catch (Exception e) { + throw new ExecutionException(e.getMessage()); + } + } + private void deleteServersInGuestVlan(long vlanTag, String vlanSelfIp, String vlanNetmask) throws ExecutionException { try { com.citrix.netscaler.nitro.resource.config.basic.server[] serverList = com.citrix.netscaler.nitro.resource.config.basic.server.get(_netscalerService); @@ -2060,6 +1473,634 @@ public class NetscalerResource implements ServerResource { } } + public synchronized void applyAutoScaleConfig(LoadBalancerTO loadBalancer) throws Exception, ExecutionException { + + AutoScaleVmGroupTO vmGroupTO = loadBalancer.getAutoScaleVmGroupTO(); + if(!isAutoScaleSupportedInNetScaler()) { + throw new ExecutionException("AutoScale not supported in this version of NetScaler"); + } + if(vmGroupTO.getState().equals("new")) { + assert !loadBalancer.isRevoked(); + createAutoScaleConfig(loadBalancer); + } + else if(loadBalancer.isRevoked() || vmGroupTO.getState().equals("revoke")) { + removeAutoScaleConfig(loadBalancer); + } + else if(vmGroupTO.getState().equals("enabled")) { + assert !loadBalancer.isRevoked(); + enableAutoScaleConfig(loadBalancer, false); + } + else if(vmGroupTO.getState().equals("disabled")) { + assert !loadBalancer.isRevoked(); + disableAutoScaleConfig(loadBalancer, false); + } else { + ///// This should never happen + throw new ExecutionException("Unknown vmGroup State :" + vmGroupTO.getState()); + } + } + + @SuppressWarnings("static-access") + private synchronized boolean createAutoScaleConfig(LoadBalancerTO loadBalancerTO) throws ExecutionException, Exception { + + String srcIp = loadBalancerTO.getSrcIp(); + int srcPort = loadBalancerTO.getSrcPort(); + String lbProtocol = getNetScalerProtocol(loadBalancerTO); + String lbAlgorithm = loadBalancerTO.getAlgorithm(); + String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); + AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Created load balancing virtual server " + nsVirtualServerName + " on the Netscaler device"); + } + addLBVirtualServer(nsVirtualServerName, srcIp, srcPort, lbAlgorithm, lbProtocol, loadBalancerTO.getStickinessPolicies(), vmGroupTO); + + String serviceGroupName = generateAutoScaleServiceGroupName(srcIp, srcPort); + servicegroup serviceGroup = getServiceGroupIfExisits(serviceGroupName); + if(serviceGroup == null) { + // add servicegroup lb_autoscaleGroup -autoscale POLICY -memberPort 80 + int memberPort = vmGroupTO.getMemberPort(); + try { + serviceGroup = new servicegroup(); + serviceGroup.set_servicegroupname(serviceGroupName); + serviceGroup.set_servicetype(lbProtocol); + serviceGroup.set_autoscale("POLICY"); + serviceGroup.set_memberport(memberPort); + serviceGroup.add(_netscalerService, serviceGroup); + } catch (Exception e) { + throw e; + } + } + + if(!isServiceGroupBoundToVirtualServer(nsVirtualServerName, serviceGroupName)) { + // Bind autoscale service group + // bind lb vserver lb lb_autoscaleGroup + lbvserver_servicegroup_binding vserver_servicegroup_binding = new lbvserver_servicegroup_binding(); + + try { + vserver_servicegroup_binding.set_name(nsVirtualServerName); + vserver_servicegroup_binding.set_servicegroupname(serviceGroupName); + vserver_servicegroup_binding.add(_netscalerService, vserver_servicegroup_binding); + } catch (Exception e) { + throw e; + } + } + + // Create the autoscale config + enableAutoScaleConfig(loadBalancerTO, false); + return true; + } + + @SuppressWarnings("static-access") + private synchronized boolean removeAutoScaleConfig(LoadBalancerTO loadBalancerTO) throws Exception, ExecutionException { + String srcIp = loadBalancerTO.getSrcIp(); + int srcPort = loadBalancerTO.getSrcPort(); + + String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); + String serviceGroupName = generateAutoScaleServiceGroupName(srcIp, srcPort); + + disableAutoScaleConfig(loadBalancerTO, false); + + if(isServiceGroupBoundToVirtualServer(nsVirtualServerName, serviceGroupName)) { + // UnBind autoscale service group + // unbind lb vserver lb lb_autoscaleGroup + lbvserver_servicegroup_binding vserver_servicegroup_binding = new lbvserver_servicegroup_binding(); + try { + vserver_servicegroup_binding.set_name(nsVirtualServerName); + vserver_servicegroup_binding.set_servicegroupname(serviceGroupName); + vserver_servicegroup_binding.delete(_netscalerService, vserver_servicegroup_binding); + } catch (Exception e) { + throw e; + } + } + + if(getServiceGroupIfExisits(serviceGroupName) != null) { + // Remove autoscale service group + com.citrix.netscaler.nitro.resource.config.basic.servicegroup serviceGroup = new com.citrix.netscaler.nitro.resource.config.basic.servicegroup(); + try { + serviceGroup.set_servicegroupname(serviceGroupName); + serviceGroup.delete(_netscalerService, serviceGroup); + } catch (Exception e) { + throw e; + } + } + + removeLBVirtualServer(nsVirtualServerName); + + return true; + } + + @SuppressWarnings("static-access") + private synchronized boolean enableAutoScaleConfig(LoadBalancerTO loadBalancerTO, boolean isCleanUp) throws Exception { + String srcIp = loadBalancerTO.getSrcIp(); + int srcPort = loadBalancerTO.getSrcPort(); + + String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); + String serviceGroupName = generateAutoScaleServiceGroupName(srcIp, srcPort); + String profileName = generateAutoScaleProfileName(srcIp, srcPort); + String timerName = generateAutoScaleTimerName(srcIp, srcPort); + String scaleDownActionName = generateAutoScaleScaleDownActionName(srcIp, srcPort); + String scaleUpActionName = generateAutoScaleScaleUpActionName(srcIp, srcPort); + String mtName = generateSnmpMetricTableName(srcIp, srcPort); + String monitorName = generateSnmpMonitorName(srcIp, srcPort); + AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); + AutoScaleVmProfileTO profileTO = vmGroupTO.getProfile(); + List policies = vmGroupTO.getPolicies(); + int interval = vmGroupTO.getInterval(); + int snmpPort = profileTO.getSnmpPort(); + String snmpCommunity = profileTO.getSnmpCommunity(); + long cur_prirotiy = 1; + + try + { + // Set min and max autoscale members; + // add lb vserver lb http 10.102.31.100 80 -minAutoscaleMinMembers 3 -maxAutoscaleMembers 10 + int minAutoScaleMembers = vmGroupTO.getMinMembers(); + int maxAutoScaleMembers = vmGroupTO.getMaxMembers(); + lbvserver vserver = new lbvserver(); + try { + vserver.set_name(nsVirtualServerName); + vserver.set_minautoscalemembers(minAutoScaleMembers); + vserver.set_maxautoscalemembers(maxAutoScaleMembers); + vserver.update(_netscalerService, vserver); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + /* AutoScale Config */ + // Add AutoScale Profile + // add autoscale profile lb_asprofile CLOUDSTACK -url -http:// 10.102.31.34:8080/client/api- -apiKey abcdef + // -sharedSecret xyzabc + String apiKey = profileTO.getAutoScaleUserApiKey(); + String secretKey = profileTO.getAutoScaleUserSecretKey(); + String url = profileTO.getCloudStackApiUrl(); + + com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile autoscaleProfile = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile(); + try { + autoscaleProfile.set_name(profileName); + autoscaleProfile.set_type("CLOUDSTACK"); + autoscaleProfile.set_apikey(apiKey); + autoscaleProfile.set_sharedsecret(secretKey); + autoscaleProfile.set_url(url); + autoscaleProfile.add(_netscalerService, autoscaleProfile); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + // Add Timer + com.citrix.netscaler.nitro.resource.config.timer.timertrigger timer = new com.citrix.netscaler.nitro.resource.config.timer.timertrigger(); + try { + timer.set_name(timerName); + timer.set_interval(interval); + timer.add(_netscalerService, timer); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + // AutoScale Actions + Integer scaleUpQuietTime = null; + Integer scaleDownQuietTime = null; + for (AutoScalePolicyTO autoScalePolicyTO : policies) { + if(scaleUpQuietTime == null) { + if(isScaleUpPolicy(autoScalePolicyTO)) { + scaleUpQuietTime = autoScalePolicyTO.getQuietTime(); + if(scaleDownQuietTime != null) { + break; + } + } + } + if(scaleDownQuietTime == null) { + if(isScaleDownPolicy(autoScalePolicyTO)) { + scaleDownQuietTime = autoScalePolicyTO.getQuietTime(); + if(scaleUpQuietTime != null) { + break; + } + } + } + } + + // Add AutoScale ScaleUp action + // add autoscale action lb_scaleUpAction provision -vserver lb -profilename lb_asprofile -params + // -lbruleid=1234&command=deployvm&zoneid=10&templateid=5&serviceofferingid=3- -quiettime 300 + com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleUpAction = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); + try { + scaleUpAction.set_name(scaleUpActionName); + scaleUpAction.set_type("SCALE_UP"); // TODO: will this be called provision? + scaleUpAction.set_vserver(nsVirtualServerName); // Actions Vserver, the one that is autoscaled, with CS + // now both are same. Not exposed in API. + scaleUpAction.set_profilename(profileName); + scaleUpAction.set_quiettime(scaleUpQuietTime); + String scaleUpParameters = "command=deployVirtualMachine" + "&" + + ApiConstants.ZONE_ID + "=" + profileTO.getZoneId()+ "&" + + ApiConstants.SERVICE_OFFERING_ID + "=" + profileTO.getServiceOfferingId()+ "&" + + ApiConstants.TEMPLATE_ID + "=" + profileTO.getTemplateId()+ "&" + + ((profileTO.getOtherDeployParams() == null)? "" : (profileTO.getOtherDeployParams() + "&")) + + "lbruleid=" + loadBalancerTO.getId(); + scaleUpAction.set_parameters(scaleUpParameters); + scaleUpAction.add(_netscalerService, scaleUpAction); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleDownAction = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); + Integer destroyVmGracePeriod = profileTO.getDestroyVmGraceperiod(); + try { + scaleDownAction.set_name(scaleDownActionName); + scaleDownAction.set_type("SCALE_DOWN"); // TODO: will this be called de-provision? + scaleDownAction.set_vserver(nsVirtualServerName); // TODO: no global option as of now through Nitro. + // Testing cannot be done. + scaleDownAction.set_profilename(profileName); + scaleDownAction.set_quiettime(scaleDownQuietTime); + String scaleDownParameters = "command=destroyVirtualMachine" + "&" + + "lbruleid=" + loadBalancerTO.getId(); + scaleDownAction.set_parameters(scaleDownParameters); + scaleDownAction.set_vmdestroygraceperiod(destroyVmGracePeriod); + scaleDownAction.add(_netscalerService, scaleDownAction); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + /* Create min member policy */ + String minMemberPolicyName = generateAutoScaleMinPolicyName(srcIp, srcPort); + String minMemberPolicyExp = "SYS.VSERVER(\"" + nsVirtualServerName + "\").ACTIVESERVICES.LT(SYS.VSERVER(\"" + nsVirtualServerName + "\").MINAUTOSCALEMEMBERS)"; + addAutoScalePolicy(timerName, minMemberPolicyName, cur_prirotiy++, minMemberPolicyExp, scaleUpActionName, + interval, interval, isCleanUp); + + /* Create max member policy */ + String maxMemberPolicyName = generateAutoScaleMaxPolicyName(srcIp, srcPort); + String maxMemberPolicyExp = "SYS.VSERVER(\"" + nsVirtualServerName + "\").ACTIVESERVICES.GT(SYS.VSERVER(\"" + nsVirtualServerName + "\").MAXAUTOSCALEMEMBERS)"; + addAutoScalePolicy(timerName, maxMemberPolicyName, cur_prirotiy++, maxMemberPolicyExp, scaleDownActionName, + interval, interval, isCleanUp); + + /* Create Counters */ + HashMap snmpMetrics = new HashMap(); + for (AutoScalePolicyTO autoScalePolicyTO : policies) { + List conditions = autoScalePolicyTO.getConditions(); + String policyExpression = ""; + int snmpCounterNumber = 0; + for (ConditionTO conditionTO : conditions) { + CounterTO counterTO = conditionTO.getCounter(); + String counterName = counterTO.getName(); + String operator = conditionTO.getRelationalOperator(); + long threshold = conditionTO.getThreshold(); + + StringBuilder conditionExpression = new StringBuilder(); + Formatter formatter = new Formatter(conditionExpression, Locale.US); + + if(counterTO.getSource().equals("snmp")) + { + counterName = generateSnmpMetricName(counterName); + if(snmpMetrics.size() == 0) { + // Create Metric Table + //add lb metricTable lb_metric_table + lbmetrictable metricTable = new lbmetrictable(); + try { + metricTable.set_metrictable(mtName); + metricTable.add(_netscalerService, metricTable); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + // Create Monitor + // add lb monitor lb_metric_table_mon LOAD -destPort 161 -snmpCommunity public -metricTable + // lb_metric_table -interval + lbmonitor monitor = new lbmonitor(); + try { + monitor.set_monitorname(monitorName); + monitor.set_type("LOAD"); + monitor.set_destport(snmpPort); + monitor.set_snmpcommunity(snmpCommunity); + monitor.set_metrictable(mtName); + monitor.set_interval((int)(interval * 0.8)); + monitor.add(_netscalerService, monitor); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + // Bind servicegroup to monitor. TODO: This will change later to bind Monitor to ServiceGroup. + // bind lb monitor lb_metric_table_mon lb_autoscaleGroup -passive + lbmonitor_servicegroup_binding monitor_servicegroup_binding = new lbmonitor_servicegroup_binding(); + try { + monitor_servicegroup_binding.set_monitorname(monitorName); + monitor_servicegroup_binding.set_servicegroupname(serviceGroupName); + monitor_servicegroup_binding.set_passive(true); // Mark the monitor to do only collect + // metrics, basically use it for autoscaling purpose only. + monitor_servicegroup_binding.add(_netscalerService, monitor_servicegroup_binding); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + } + + boolean newMetric = !snmpMetrics.containsKey(counterName); + if(newMetric) { + snmpMetrics.put(counterName, snmpCounterNumber++); + } + + if(newMetric) + { + // bind lb metricTable lb_metric_table mem 1.3.6.1.4.1.2021.11.9.0 + String counterOid = counterTO.getValue(); + lbmetrictable_metric_binding metrictable_metric_binding = new lbmetrictable_metric_binding(); + try { + metrictable_metric_binding.set_metrictable(mtName); + metrictable_metric_binding.set_metric(counterName); + metrictable_metric_binding.set_Snmpoid(counterOid); + metrictable_metric_binding.add(_netscalerService, metrictable_metric_binding); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + // bind lb monitor lb_metric_table_mon -metric cpu -metricThreshold 1 + lbmonitor_lbmetrictable_binding monitor_metrictable_binding = new lbmonitor_lbmetrictable_binding(); + try { + monitor_metrictable_binding.set_monitorname(monitorName); + monitor_metrictable_binding.set_metric(counterName); + monitor_metrictable_binding.set_metricthreshold(1); // 1 is a dummy threshold + monitor_metrictable_binding.add(_netscalerService, monitor_metrictable_binding); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + } + // SYS.VSERVER("abcd").SNMP_TABLE(0).AVERAGE_VALUE.GT(80) + int counterIndex = snmpMetrics.get(counterName); // TODO: temporary fix. later on counter name will be added as a param to SNMP_TABLE. + formatter.format("SYS.VSERVER(\"%s\").SNMP_TABLE(%d).AVERAGE_VALUE.%s(%d)",nsVirtualServerName, counterIndex, operator, threshold); + } + else if (counterTO.getSource().equals("netscaler")) + { + //SYS.VSERVER("abcd").RESPTIME.GT(10) + formatter.format("SYS.VSERVER(\"%s\").%s.%s(%d)",nsVirtualServerName, counterTO.getValue(), operator, threshold); + } + if(policyExpression.length() != 0) { + policyExpression += " && "; + } + policyExpression += conditionExpression; + } + policyExpression = "(" + policyExpression + ")"; + + String policyId = Long.toString(autoScalePolicyTO.getId()); + String policyName = generateAutoScalePolicyName(srcIp, srcPort, policyId); + String action = null; + if(isScaleUpPolicy(autoScalePolicyTO)) { + action = scaleUpActionName; + String scaleUpCondition = "SYS.VSERVER(\"" + nsVirtualServerName + "\").ACTIVESERVICES.LT(SYS.VSERVER(\"" + nsVirtualServerName + "\").MAXAUTOSCALEMEMBERS)"; + policyExpression = scaleUpCondition + " && " + policyExpression; + } else { + action = scaleDownActionName; + String scaleDownCondition = "SYS.VSERVER(\"" + nsVirtualServerName + "\").ACTIVESERVICES.GT(SYS.VSERVER(\"" + nsVirtualServerName + "\").MINAUTOSCALEMEMBERS)"; + policyExpression = scaleDownCondition + " && " + policyExpression; + } + + addAutoScalePolicy(timerName, policyName, cur_prirotiy++, policyExpression, action, + autoScalePolicyTO.getDuration(), interval, isCleanUp); + + } + } catch (Exception ex) { + if(!isCleanUp) { + // Normal course, exception has occurred + disableAutoScaleConfig(loadBalancerTO, true); + throw ex; + + } else { + // Programming error. Exception should never be thrown afterall. + throw ex; + } + } + + return true; + } + + + @SuppressWarnings("static-access") + private synchronized boolean disableAutoScaleConfig(LoadBalancerTO loadBalancerTO, boolean isCleanUp) throws Exception { + String srcIp = loadBalancerTO.getSrcIp(); + int srcPort = loadBalancerTO.getSrcPort(); + + String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); + String profileName = generateAutoScaleProfileName(srcIp, srcPort); + String timerName = generateAutoScaleTimerName(srcIp, srcPort); + String scaleDownActionName = generateAutoScaleScaleDownActionName(srcIp, srcPort); + String scaleUpActionName = generateAutoScaleScaleUpActionName(srcIp, srcPort); + String mtName = generateSnmpMetricTableName(srcIp, srcPort); + String monitorName = generateSnmpMonitorName(srcIp, srcPort); + String serviceGroupName = generateAutoScaleServiceGroupName(srcIp, srcPort); + AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); + List policies = vmGroupTO.getPolicies(); + String minMemberPolicyName = generateAutoScaleMinPolicyName(srcIp, srcPort); + String maxMemberPolicyName = generateAutoScaleMaxPolicyName(srcIp, srcPort); + + try { + + /* Delete min/max member policies */ + + removeAutoScalePolicy(timerName, minMemberPolicyName, isCleanUp); + + removeAutoScalePolicy(timerName, maxMemberPolicyName, isCleanUp); + + boolean isSnmp = false; + /* Create Counters */ + for (AutoScalePolicyTO autoScalePolicyTO : policies) { + List conditions = autoScalePolicyTO.getConditions(); + for (ConditionTO conditionTO : conditions) { + CounterTO counterTO = conditionTO.getCounter(); + if(counterTO.getSource().equals("snmp")) { + isSnmp = true; + break; + } + } + String policyId = Long.toString(autoScalePolicyTO.getId()); + String policyName = generateAutoScalePolicyName(srcIp, srcPort,policyId); + + // Removing Timer policy + removeAutoScalePolicy(timerName, policyName, isCleanUp); + } + + /* Delete AutoScale Config */ + // Delete AutoScale ScaleDown action + com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleDownAction = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); + try { + scaleDownAction.set_name(scaleDownActionName); + scaleDownAction.delete(_netscalerService, scaleDownAction); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + // Delete AutoScale ScaleUp action + com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleUpAction = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); + try { + scaleUpAction.set_name(scaleUpActionName); + scaleUpAction.delete(_netscalerService, scaleUpAction); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + // Delete Timer + com.citrix.netscaler.nitro.resource.config.timer.timertrigger timer = new com.citrix.netscaler.nitro.resource.config.timer.timertrigger(); + try { + timer.set_name(timerName); + timer.delete(_netscalerService, timer); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + // Delete AutoScale Profile + com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile autoscaleProfile = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile(); + try { + autoscaleProfile.set_name(profileName); + autoscaleProfile.delete(_netscalerService, autoscaleProfile); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + if(isSnmp) { + com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_servicegroup_binding monitor_servicegroup_binding = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_servicegroup_binding(); + try { + monitor_servicegroup_binding.set_monitorname(monitorName); + monitor_servicegroup_binding.set_servicegroupname(serviceGroupName); + monitor_servicegroup_binding.delete(_netscalerService, monitor_servicegroup_binding); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + // Delete Monitor + // rm lb monitor lb_metric_table_mon + com.citrix.netscaler.nitro.resource.config.lb.lbmonitor monitor = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor(); + try { + monitor.set_monitorname(monitorName); + monitor.set_type("LOAD"); + monitor.delete(_netscalerService, monitor); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + // Delete Metric Table + com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable metricTable = new com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable(); + try { + metricTable.set_metrictable(mtName); + metricTable.delete(_netscalerService, metricTable); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + } + } catch (Exception ex) { + if(!isCleanUp) { + // Normal course, exception has occurred + enableAutoScaleConfig(loadBalancerTO, true); + throw ex; + } else { + // Programming error + throw ex; + } + } + + return true; + } + + + private synchronized void addAutoScalePolicy(String timerName,String policyName, long priority, String policyExpression, String action, + int duration, int interval, boolean isCleanUp) throws Exception { + // Adding a autoscale policy + // add timer policy lb_policy_scaleUp_cpu_mem -rule - (SYS.CUR_VSERVER.METRIC_TABLE(cpu).AVG_VAL.GT(80)- + // -action lb_scaleUpAction + timerpolicy timerPolicy = new timerpolicy(); + try { + timerPolicy.set_name(policyName); + timerPolicy.set_action(action); + timerPolicy.set_rule(policyExpression); + timerPolicy.add(_netscalerService, timerPolicy); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + // bind timer policy + // For now it is bound globally. + // bind timer trigger lb_astimer -policyName lb_policy_scaleUp -vserver lb -priority 1 -samplesize 5 + // TODO: later bind to lbvserver. bind timer trigger lb_astimer -policyName lb_policy_scaleUp -vserver lb -priority 1 -samplesize 5 + // -thresholdsize 5 + timertrigger_timerpolicy_binding timer_policy_binding = new timertrigger_timerpolicy_binding(); + int sampleSize = duration/interval; + try { + timer_policy_binding.set_name(timerName); + timer_policy_binding.set_policyname(policyName); + // timer_policy_binding.set_vserver(nsVirtualServerName); + timer_policy_binding.set_global("DEFAULT"); // vserver name is present at the expression + timer_policy_binding.set_samplesize(sampleSize); + timer_policy_binding.set_thresholdsize(sampleSize); // We are not exposing this parameter as of now. + // i.e. n(m) is not exposed to CS user. So thresholdSize == sampleSize + timer_policy_binding.set_priority(priority); + timer_policy_binding.add(_netscalerService, timer_policy_binding); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + } + + private void removeAutoScalePolicy(String timerName, String policyName, boolean isCleanUp) throws Exception { + // unbind timer policy + // unbbind timer trigger lb_astimer -policyName lb_policy_scaleUp + com.citrix.netscaler.nitro.resource.config.timer.timertrigger_timerpolicy_binding timer_policy_binding = new com.citrix.netscaler.nitro.resource.config.timer.timertrigger_timerpolicy_binding(); + try { + timer_policy_binding.set_name(timerName); + timer_policy_binding.set_policyname(policyName); + timer_policy_binding.set_global("DEFAULT"); + timer_policy_binding.delete(_netscalerService, timer_policy_binding); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + // Removing Timer policy + // rm timer policy lb_policy_scaleUp_cpu_mem + com.citrix.netscaler.nitro.resource.config.timer.timerpolicy timerPolicy = new com.citrix.netscaler.nitro.resource.config.timer.timerpolicy(); + try { + timerPolicy.set_name(policyName); + timerPolicy.delete(_netscalerService, timerPolicy); + } catch (Exception e) { + // Ignore Exception on cleanup + if(!isCleanUp) throw e; + } + + } + + + private boolean isAutoScaleSupportedInNetScaler() throws ExecutionException { + autoscaleprofile autoscaleProfile = new autoscaleprofile(); + try { + autoscaleProfile.get(_netscalerService); + } catch (Exception ex) { + // Looks like autoscale is not supported in this netscaler. + // TODO: Config team has introduce a new command to check + // the list of entities supported in a NetScaler. Can use that + // once it is present in AutoScale branch. + s_logger.warn("AutoScale is not supported in NetScaler"); + return false; + } + return true; + } + + private boolean isScaleUpPolicy(AutoScalePolicyTO autoScalePolicyTO) { + return autoScalePolicyTO.getAction().equals("scaleup"); + } + + private boolean isScaleDownPolicy(AutoScalePolicyTO autoScalePolicyTO) { + return autoScalePolicyTO.getAction().equals("scaledown"); + } + private void saveConfiguration() throws ExecutionException { try { apiCallResult = nsconfig.save(_netscalerService); @@ -2135,6 +2176,14 @@ public class NetscalerResource implements ServerResource { return genObjectName("Cloud-VirtualServer", srcIp, srcPort); } + private String generateNSServerName(String serverIP) { + return genObjectName("Cloud-Server-", serverIP); + } + + private String generateNSServiceName(String ip, long port) { + return genObjectName("Cloud-Service", ip, port); + } + private String generateAutoScaleServiceGroupName(String srcIp, long srcPort) { return genObjectName("Cloud-AutoScaleServiceGroup", srcIp, srcPort); } @@ -2179,14 +2228,6 @@ public class NetscalerResource implements ServerResource { return counterName.replace(' ', '_'); } - private String generateNSServerName(String serverIP) { - return genObjectName("Cloud-Server-", serverIP); - } - - private String generateNSServiceName(String ip, long port) { - return genObjectName("Cloud-Service", ip, port); - } - private String genObjectName(Object... args) { String objectName = ""; for (int i = 0; i < args.length; i++) {