From f9bcf3186cdbb7ed52f795fdf9203aaf60ed1572 Mon Sep 17 00:00:00 2001 From: Vijay Date: Wed, 18 Jul 2012 22:55:46 +0530 Subject: [PATCH] AutoScale. Enabling AutoScale to go to the Resource. Tested the reachability for Basic Network. Fixing compile error introduced due to a89919ce2ffd9a0a99f1810aeaa0488b0805f665 --- .../cloud/agent/api/to/LoadBalancerTO.java | 3 + .../network/resource/NetscalerResource.java | 33 +++++++-- .../network/as/AutoScaleManagerImpl.java | 74 +++++++++---------- .../network/element/NetscalerElement.java | 5 +- 4 files changed, 68 insertions(+), 47 deletions(-) diff --git a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java index 2244278aeb8..d2ac20c419e 100644 --- a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java +++ b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java @@ -42,6 +42,9 @@ public class LoadBalancerTO { final static int MAX_STICKINESS_POLICIES = 1; public LoadBalancerTO(Long id, String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, List destinations) { + if(destinations == null) { // for autoscaleconfig destinations will be null; + destinations = new ArrayList(); + } this.id = id; this.srcIp = srcIp; this.srcPort = srcPort; diff --git a/core/src/com/cloud/network/resource/NetscalerResource.java b/core/src/com/cloud/network/resource/NetscalerResource.java index d731cfd4894..7f595441d7f 100644 --- a/core/src/com/cloud/network/resource/NetscalerResource.java +++ b/core/src/com/cloud/network/resource/NetscalerResource.java @@ -37,6 +37,7 @@ 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.autoscale.*; import com.citrix.netscaler.nitro.resource.stat.lb.lbvserver_stats; import com.citrix.netscaler.nitro.service.nitro_service; import com.citrix.netscaler.nitro.util.filtervalue; @@ -850,13 +851,10 @@ public class NetscalerResource implements ServerResource { } } - // formatter.format("SYS.CUR_VSERVER.METRIC_TABLE(%s).AVG_VAL.%s(%ld)",counterName, operator, - // threshold); boolean newMetric = !snmpMetrics.containsKey(counterName); if(newMetric) { snmpMetrics.put(counterName, snmpCounterNumber++); } - formatter.format("SYS.VSERVER.SNMP_TABLE(%d).AVG_VAL.%s(%d)",snmpMetrics.get(counterName), operator, threshold); if(newMetric) { @@ -885,10 +883,14 @@ public class NetscalerResource implements ServerResource { 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")) { - formatter.format("SYS.VSERVER(%s).%s.AVG_VAL.%s(%d)",nsVirtualServerName, counterName, operator, threshold); + //SYS.VSERVER("abcd").RESPTIME.GT(10) + formatter.format("SYS.VSERVER(%s).%s.%s(%d)",nsVirtualServerName, counterTO.getValue(), operator, threshold); } if(policyExpression.length() != 0) { policyExpression += " && "; @@ -915,7 +917,9 @@ public class NetscalerResource implements ServerResource { } // 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 = autoScalePolicyTO.getDuration()/interval; @@ -923,7 +927,8 @@ public class NetscalerResource implements ServerResource { try { timer_policy_binding.set_name(timerName); timer_policy_binding.set_policyname(policyName); - timer_policy_binding.set_vserver(nsVirtualServerName); + // timer_policy_binding.set_vserver(nsVirtualServerName); + timer_policy_binding.set_global("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 @@ -941,6 +946,9 @@ public class NetscalerResource implements ServerResource { private synchronized void applyAutoScaleConfig(LoadBalancerTO loadBalancer) throws Exception, ExecutionException { AutoScaleVmGroupTO vmGroupTO = loadBalancer.getAutoScaleVmGroupTO(); + if(!isAutoScaleSupportedInNetScaler()) { + + } if(vmGroupTO.getState().equals("New")) { assert !loadBalancer.isRevoked(); createAutoScaleConfig(loadBalancer); @@ -958,6 +966,21 @@ public class NetscalerResource implements ServerResource { } } + 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. + throw new ExecutionException("AutoScale is not supported in NetScaler"); + } + // TODO Auto-generated method stub + return false; + } + private synchronized Answer execute(LoadBalancerConfigCommand cmd, int numRetries) { try { if (_isSdx) { diff --git a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java index 2d27ad1de1e..28855e356d7 100644 --- a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java @@ -89,7 +89,7 @@ import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.Transaction; import com.cloud.utils.net.NetUtils; -@Local(value = { AutoScaleService.class }) +@Local(value = { AutoScaleService.class }) public class AutoScaleManagerImpl implements AutoScaleService, Manager { private static final Logger s_logger = Logger.getLogger(AutoScaleManagerImpl.class); @@ -172,12 +172,12 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { for (Counter counter : counters) { if (!supportedCounters.contains(counter.getSource().name().toString())) { throw new InvalidParameterException("AutoScale counter with source='" + counter.getSource() + "' is not supported " + - "in the network where lb is configured"); + "in the network where lb is configured"); } } } - private VO getEntityInDatabase(Account caller, String paramName, Long id, GenericDao dao) + private VO getEntityInDatabase(Account caller,String paramName, Long id, GenericDao dao) { VO vo = dao.findById(id); @@ -247,7 +247,8 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { return policies; } - private AutoScaleVmProfileVO checkValidityAndPersist(AutoScaleVmProfileVO vmProfile) { + @DB + protected AutoScaleVmProfileVO checkValidityAndPersist(AutoScaleVmProfileVO vmProfile) { long templateId = vmProfile.getTemplateId(); long autoscaleUserId = vmProfile.getAutoScaleUserId(); int destroyVmGraceperiod = vmProfile.getDestroyVmGraceperiod(); @@ -273,7 +274,6 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { } @Override - @DB @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEVMPROFILE_CREATE, eventDescription = "creating autoscale vm profile") public AutoScaleVmProfile createAutoScaleVmProfile(CreateAutoScaleVmProfileCmd cmd) { @@ -314,7 +314,7 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { String mgmtIP = _configDao.getValue(Config.ManagementHostIPAdr.key()); csUrl = "http://" + mgmtIP + ":8080/client/api?"; } else { - if (!csUrl.endsWith("?")) + if(!csUrl.endsWith("?")) csUrl += "?"; } @@ -327,7 +327,6 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { } @Override - @DB @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEVMPROFILE_UPDATE, eventDescription = "updating autoscale vm profile") public AutoScaleVmProfile updateAutoScaleVmProfile(UpdateAutoScaleVmProfileCmd cmd) { Long profileId = cmd.getId(); @@ -382,7 +381,9 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { throw new InvalidParameterValueException("Cannot delete AutoScale Vm Profile when it is in use by one more vm groups"); } boolean success = _autoScaleVmProfileDao.remove(id); - s_logger.info("Successfully deleted AutoScale Vm Profile with Id: " + id); + if(success) { + s_logger.info("Successfully deleted AutoScale Vm Profile with Id: " + id); + } return success; } @@ -412,6 +413,7 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { return searchWrapper.search(); } + @DB private AutoScalePolicyVO checkValidityAndPersist(AutoScalePolicyVO autoScalePolicyVO, List conditionIds) { int duration = autoScalePolicyVO.getDuration(); int quietTime = autoScalePolicyVO.getQuietTime(); @@ -429,7 +431,7 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { autoScalePolicyVO = _autoScalePolicyDao.persist(autoScalePolicyVO); - if (conditionIds != null) { + if(conditionIds != null) { SearchBuilder conditionsSearch = _conditionDao.createSearchBuilder(); conditionsSearch.and("ids", conditionsSearch.entity().getId(), Op.IN); conditionsSearch.done(); @@ -469,7 +471,6 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { } @Override - @DB @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEPOLICY_CREATE, eventDescription = "creating autoscale policy") public AutoScalePolicy createAutoScalePolicy(CreateAutoScalePolicyCmd cmd) { @@ -488,7 +489,7 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { AutoScalePolicyVO policyVO = new AutoScalePolicyVO(cmd.getDomainId(), cmd.getAccountId(), duration, quietTime, action); - policyVO = checkValidityAndPersist(policyVO, cmd.getConditionIds()); + policyVO = checkValidityAndPersist(policyVO, cmd.getConditionIds()); s_logger.info("Successfully created AutoScale Policy with Id: " + policyVO.getId()); return policyVO; } @@ -520,7 +521,7 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { } txn.commit(); s_logger.info("Successfully deleted autoscale policy id : " + id); - return success; // successful + return true; // successful } public void checkCallerAccess(String accountName, Long domainId) @@ -556,7 +557,7 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { Account caller = UserContext.current().getCaller(); Ternary domainIdRecursiveListProject = new Ternary(domainId, isRecursive, null); + ListProjectResourcesCriteria>(domainId, isRecursive, null); _accountMgr.buildACLSearchParameters(caller, id, accountName, null, permittedAccounts, domainIdRecursiveListProject, listAll, false); domainId = domainIdRecursiveListProject.first(); @@ -610,7 +611,6 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { } @Override - @DB @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEPOLICY_UPDATE, eventDescription = "updating autoscale policy") public AutoScalePolicy updateAutoScalePolicy(UpdateAutoScalePolicyCmd cmd) { Long policyId = cmd.getId(); @@ -633,41 +633,35 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { if (!vmGroupVO.getState().equals(AutoScaleVmGroup.State_Disabled)) { throw new InvalidParameterValueException("The AutoScale Policy can be updated only if the Vm Group it is associated with is disabled in state"); } - if (vmGroupVO.getInterval() < policy.getDuration()) { + if(vmGroupVO.getInterval() < policy.getDuration()) { throw new InvalidParameterValueException("duration is less than the associated AutoScaleVmGroup's interval"); } - if (vmGroupVO.getInterval() < policy.getQuietTime()) { + if(vmGroupVO.getInterval() < policy.getQuietTime()) { throw new InvalidParameterValueException("quietTime is less than the associated AutoScaleVmGroup's interval"); } } policy = checkValidityAndPersist(policy, conditionIds); s_logger.info("Successfully updated Auto Scale Policy id:" + policyId); - return policy; } @Override - @DB @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEVMGROUP_CREATE, eventDescription = "creating autoscale vm group") public AutoScaleVmGroup createAutoScaleVmGroup(CreateAutoScaleVmGroupCmd cmd) { int minMembers = cmd.getMinMembers(); int maxMembers = cmd.getMaxMembers(); Integer interval = cmd.getInterval(); - if (interval == null) { + if(interval == null) { interval = NetUtils.DEFAULT_AUTOSCALE_POLICY_INTERVAL_TIME; } LoadBalancerVO loadBalancer = getEntityInDatabase(UserContext.current().getCaller(), ApiConstants.LBID, cmd.getLbRuleId(), _lbDao); - // Account owner = _accountDao.findById(loadBalancer.getAccountId()); - // Account caller = UserContext.current().getCaller(); - // _accountMgr.checkAccess(caller, null, true, owner); - Long zoneId = _ipAddressDao.findById(loadBalancer.getSourceIpAddressId()).getDataCenterId(); - if (_autoScaleVmGroupDao.isAutoScaleLoadBalancer(loadBalancer.getId())) { + if(_autoScaleVmGroupDao.isAutoScaleLoadBalancer(loadBalancer.getId())) { throw new InvalidParameterValueException("an AutoScaleVmGroup is already attached to the lb rule, the existing vm group has to be first deleted"); } @@ -696,12 +690,7 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { public boolean configureAutoScaleVmGroup(long vmGroupid) { AutoScaleVmGroup vmGroup = _autoScaleVmGroupDao.findById(vmGroupid); - /* TODO remove later */ - if (true) { - return true; - } - - if (isLoadBalancerBasedAutoScaleVmGroup(vmGroup)) { + if(isLoadBalancerBasedAutoScaleVmGroup(vmGroup)) { return _lbRulesMgr.configureLbAutoScaleVmGroup(vmGroupid); } @@ -715,7 +704,7 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { public boolean deleteAutoScaleVmGroup(long id) { AutoScaleVmGroupVO autoScaleVmGroupVO = getEntityInDatabase(UserContext.current().getCaller(), "AutoScale Vm Group", id, _autoScaleVmGroupDao); - if (autoScaleVmGroupVO.getState().equals(AutoScaleVmGroup.State_New)) { + if(autoScaleVmGroupVO.getState().equals(AutoScaleVmGroup.State_New)) { /* This condition is for handling failures during creation command */ return _autoScaleVmGroupDao.remove(id); } @@ -727,7 +716,7 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { try { success = configureAutoScaleVmGroup(id); } finally { - if (!success) { + if(!success) { s_logger.warn("Could not delete AutoScale Vm Group id : " + id); autoScaleVmGroupVO.setState(bakupState); _autoScaleVmGroupDao.persist(autoScaleVmGroupVO); @@ -796,7 +785,8 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { return searchWrapper.search(); } - private AutoScaleVmGroupVO checkValidityAndPersist(AutoScaleVmGroupVO vmGroup, List scaleUpPolicyIds, List scaleDownPolicyIds) { + @DB + protected AutoScaleVmGroupVO checkValidityAndPersist(AutoScaleVmGroupVO vmGroup, List scaleUpPolicyIds, List scaleDownPolicyIds) { int minMembers = vmGroup.getMinMembers(); int maxMembers = vmGroup.getMaxMembers(); int interval = vmGroup.getInterval(); @@ -820,11 +810,11 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { throw new InvalidParameterValueException("interval is an invalid value: " + interval); } - if (scaleUpPolicyIds != null) { + if(scaleUpPolicyIds != null) { policies.addAll(getAutoScalePolicies("scaleuppolicyid", scaleUpPolicyIds, counters, interval, true)); } - if (scaleDownPolicyIds != null) { + if(scaleDownPolicyIds != null) { policies.addAll(getAutoScalePolicies("scaledownpolicyid", scaleDownPolicyIds, counters, interval, false)); } @@ -842,16 +832,16 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { txn.start(); vmGroup = _autoScaleVmGroupDao.persist(vmGroup); - if (scaleUpPolicyIds != null || scaleDownPolicyIds != null) { + if(scaleUpPolicyIds != null || scaleDownPolicyIds != null) { List bakupScaleUpPolicyIds = new ArrayList(); List bakupScaleDownPolicyIds = new ArrayList(); ApiDBUtils.getAutoScaleVmGroupPolicyIds(vmGroup.getId(), bakupScaleUpPolicyIds, bakupScaleDownPolicyIds); - if (scaleUpPolicyIds == null) { + if(scaleUpPolicyIds == null) { policyIds.addAll(bakupScaleUpPolicyIds); } else { policyIds.addAll(scaleUpPolicyIds); } - if (scaleDownPolicyIds == null) { + if(scaleDownPolicyIds == null) { policyIds.addAll(bakupScaleDownPolicyIds); } else { policyIds.addAll(scaleDownPolicyIds); @@ -870,7 +860,6 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { @Override @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEVMGROUP_UPDATE, eventDescription = "updating autoscale vm group") - @DB public AutoScaleVmGroup updateAutoScaleVmGroup(UpdateAutoScaleVmGroupCmd cmd) { Long vmGroupId = cmd.getId(); Integer minMembers = cmd.getMinMembers(); @@ -1018,7 +1007,7 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { String name = cmd.getName(); Long id = cmd.getId(); String source = cmd.getSource(); - if (source != null) + if(source != null ) source = source.toLowerCase(); Filter searchFilter = new Filter(CounterVO.class, "created", false, cmd.getStartIndex(), cmd.getPageSizeVal()); @@ -1090,7 +1079,10 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { throw new ResourceInUseException("Cannot delete Condition when it is in use by one or more AutoScale Policies."); } boolean success = _conditionDao.remove(conditionId); - s_logger.info("Successfully deleted condition " + condition.getId()); + if(success) { + s_logger.info("Successfully deleted condition " + condition.getId()); + } + return success; } } diff --git a/server/src/com/cloud/network/element/NetscalerElement.java b/server/src/com/cloud/network/element/NetscalerElement.java index 89892da8100..ce51ef5514b 100644 --- a/server/src/com/cloud/network/element/NetscalerElement.java +++ b/server/src/com/cloud/network/element/NetscalerElement.java @@ -600,8 +600,11 @@ StaticNatServiceProvider { int srcPort = rule.getSourcePortStart(); List destinations = rule.getDestinations(); - if (destinations != null && !destinations.isEmpty()) { + if (destinations != null && !destinations.isEmpty() || rule.isAutoScaleConfig()) { LoadBalancerTO loadBalancer = new LoadBalancerTO(rule.getId(), srcIp, srcPort, protocol, algorithm, revoked, false, destinations, rule.getStickinessPolicies()); + if(rule.isAutoScaleConfig()) { + loadBalancer.setAutoScaleVmGroup(rule.getAutoScaleVmGroup()); + } loadBalancersToApply.add(loadBalancer); } }