diff --git a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java index e1833c48f5f..2f3fcdce237 100644 --- a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java +++ b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java @@ -356,8 +356,9 @@ public class LoadBalancerTO implements Serializable { private final List policies; private final AutoScaleVmProfileTO profile; private final String state; + private final String currentState; - AutoScaleVmGroupTO(int minMembers, int maxMembers, int memberPort, int interval, List policies, AutoScaleVmProfileTO profile, String state) + AutoScaleVmGroupTO(int minMembers, int maxMembers, int memberPort, int interval, List policies, AutoScaleVmProfileTO profile, String state, String currentState) { this.minMembers = minMembers; this.maxMembers = maxMembers; @@ -366,6 +367,7 @@ public class LoadBalancerTO implements Serializable { this.policies = policies; this.profile = profile; this.state = state; + this.currentState = currentState; } public int getMinMembers() { @@ -395,6 +397,10 @@ public class LoadBalancerTO implements Serializable { public String getState() { return state; } + + public String getCurrentState() { + return currentState; + } } public void setAutoScaleVmGroup(LbAutoScaleVmGroup lbAutoScaleVmGroup) @@ -426,7 +432,7 @@ public class LoadBalancerTO implements Serializable { AutoScaleVmGroup autoScaleVmGroup = lbAutoScaleVmGroup.getVmGroup(); autoScaleVmGroupTO = new AutoScaleVmGroupTO(autoScaleVmGroup.getMinMembers(), autoScaleVmGroup.getMaxMembers(), autoScaleVmGroup.getMemberPort(), - autoScaleVmGroup.getInterval(), autoScalePolicyTOs, autoScaleVmProfileTO, autoScaleVmGroup.getState()); + autoScaleVmGroup.getInterval(), autoScalePolicyTOs, autoScaleVmProfileTO, autoScaleVmGroup.getState(), lbAutoScaleVmGroup.getCurrentState()); } } diff --git a/api/src/com/cloud/network/as/AutoScaleService.java b/api/src/com/cloud/network/as/AutoScaleService.java index f4b9ddd1dc6..7636ca884f2 100644 --- a/api/src/com/cloud/network/as/AutoScaleService.java +++ b/api/src/com/cloud/network/as/AutoScaleService.java @@ -28,6 +28,7 @@ import com.cloud.api.commands.UpdateAutoScalePolicyCmd; import com.cloud.api.commands.UpdateAutoScaleVmGroupCmd; import com.cloud.api.commands.UpdateAutoScaleVmProfileCmd; import com.cloud.exception.ResourceInUseException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.as.AutoScalePolicy; import com.cloud.network.as.AutoScaleVmGroup; import com.cloud.network.as.AutoScaleVmProfile; @@ -54,7 +55,7 @@ public interface AutoScaleService { AutoScaleVmGroup createAutoScaleVmGroup(CreateAutoScaleVmGroupCmd cmd); - boolean configureAutoScaleVmGroup(CreateAutoScaleVmGroupCmd cmd); + boolean configureAutoScaleVmGroup(CreateAutoScaleVmGroupCmd cmd) throws ResourceUnavailableException; boolean deleteAutoScaleVmGroup(long vmGroupId); diff --git a/api/src/com/cloud/network/lb/LoadBalancingRule.java b/api/src/com/cloud/network/lb/LoadBalancingRule.java index 61ebfc0c03b..a2471fe1dd5 100644 --- a/api/src/com/cloud/network/lb/LoadBalancingRule.java +++ b/api/src/com/cloud/network/lb/LoadBalancingRule.java @@ -356,11 +356,13 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer { AutoScaleVmGroup vmGroup; private final List policies; private final LbAutoScaleVmProfile profile; + private final String currentState; - public LbAutoScaleVmGroup(AutoScaleVmGroup vmGroup, List policies, LbAutoScaleVmProfile profile) { + public LbAutoScaleVmGroup(AutoScaleVmGroup vmGroup, List policies, LbAutoScaleVmProfile profile, String currentState) { this.vmGroup = vmGroup; this.policies = policies; this.profile = profile; + this.currentState = currentState; } public AutoScaleVmGroup getVmGroup() { @@ -374,6 +376,10 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer { public LbAutoScaleVmProfile getProfile() { return profile; } + + public String getCurrentState() { + return currentState; + } } } diff --git a/core/src/com/cloud/network/resource/NetscalerResource.java b/core/src/com/cloud/network/resource/NetscalerResource.java index 2bbcdb20eef..a42b7074537 100644 --- a/core/src/com/cloud/network/resource/NetscalerResource.java +++ b/core/src/com/cloud/network/resource/NetscalerResource.java @@ -233,8 +233,25 @@ public class NetscalerResource implements ServerResource { } } + private void logout() throws ExecutionException { + try { + if (!_isSdx) { + if(_netscalerService != null) { + _netscalerService.logout(); + } + } else { + if(_netscalerSdxService != null) { + _netscalerSdxService.logout(); + } + } + } catch (Exception e) { + } + } + private void login() throws ExecutionException { try { + // If a previous session was open, log it out. + logout(); if (!_isSdx) { _netscalerService = new com.citrix.netscaler.nitro.service.nitro_service(_ip, "https"); _netscalerService.set_credential(_username, _password); @@ -246,9 +263,9 @@ public class NetscalerResource implements ServerResource { } else { _netscalerSdxService = new com.citrix.sdx.nitro.service.nitro_service(_ip, "https"); _netscalerSdxService.set_credential(_username, _password); - com.citrix.sdx.nitro.resource.base.login login = _netscalerSdxService.login(); + com.citrix.sdx.nitro.resource.base.login login = _netscalerSdxService.login(); if (login == null) { - throw new ExecutionException ("Failed to log in to Netscaler device at " + _ip + " due to error " + apiCallResult.errorcode + " and message " + apiCallResult.message); + throw new ExecutionException ("Failed to log in to Netscaler SDX device at " + _ip + " due to error " + apiCallResult.errorcode + " and message " + apiCallResult.message); } } } catch (nitro_exception e) { @@ -1353,7 +1370,7 @@ public class NetscalerResource implements ServerResource { } private void addLBVirtualServer(String virtualServerName, String publicIp, int publicPort, String lbAlgorithm, String protocol, StickinessPolicyTO[] stickyPolicies, AutoScaleVmGroupTO vmGroupTO) - throws ExecutionException { + throws ExecutionException { try { String lbMethod; if ("roundrobin".equalsIgnoreCase(lbAlgorithm)) { @@ -1487,8 +1504,13 @@ public class NetscalerResource implements ServerResource { disableAutoScaleConfig(loadBalancer, false); } else { ///// This should never happen - throw new ExecutionException("Unknown vmGroup State :" + vmGroupTO.getState()); + throw new ExecutionException("Unknown AutoScale Vm Group State :" + vmGroupTO.getState()); } + saveConfiguration(); + if (s_logger.isInfoEnabled()) { + s_logger.info("Successfully executed resource AutoScaleConfig"); + } + } @SuppressWarnings("static-access") @@ -1551,7 +1573,7 @@ public class NetscalerResource implements ServerResource { String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); String serviceGroupName = generateAutoScaleServiceGroupName(vmGroupIdentifier); - if(loadBalancerTO.getAutoScaleVmGroupTO().getState().equals("enabled")) { + if(loadBalancerTO.getAutoScaleVmGroupTO().getCurrentState().equals("enabled")) { disableAutoScaleConfig(loadBalancerTO, false); } @@ -1696,7 +1718,7 @@ public class NetscalerResource implements ServerResource { ApiConstants.SERVICE_OFFERING_ID + "=" + profileTO.getServiceOfferingId()+ "&" + ApiConstants.TEMPLATE_ID + "=" + profileTO.getTemplateId()+ "&" + ((profileTO.getOtherDeployParams() == null)? "" : (profileTO.getOtherDeployParams() + "&")) + - "lbruleid=" + loadBalancerTO.getUuid(); + "lbruleid=" + loadBalancerTO.getUuid(); scaleUpAction.set_parameters(scaleUpParameters); scaleUpAction.add(_netscalerService, scaleUpAction); } catch (Exception e) { @@ -1715,7 +1737,7 @@ public class NetscalerResource implements ServerResource { scaleDownAction.set_profilename(profileName); scaleDownAction.set_quiettime(scaleDownQuietTime); String scaleDownParameters = "command=destroyVirtualMachine" + "&" + - "lbruleid=" + loadBalancerTO.getUuid(); + "lbruleid=" + loadBalancerTO.getUuid(); scaleDownAction.set_parameters(scaleDownParameters); scaleDownAction.set_vmdestroygraceperiod(destroyVmGracePeriod); scaleDownAction.add(_netscalerService, scaleDownAction); @@ -1825,7 +1847,7 @@ public class NetscalerResource implements ServerResource { // bind lb monitor lb_metric_table_mon -metric cpu -metricThreshold 1 // lbmonitor_lbmetrictable_binding monitor_metrictable_binding = new -// lbmonitor_lbmetrictable_binding(); + // lbmonitor_lbmetrictable_binding(); lbmonitor_metric_binding monitor_metric_binding = new lbmonitor_metric_binding(); ; try { @@ -1841,7 +1863,7 @@ public class NetscalerResource implements ServerResource { } // 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. + // 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")) @@ -2047,7 +2069,7 @@ public class NetscalerResource implements ServerResource { // 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 + // -priority 1 -samplesize 5 // -thresholdsize 5 nstimer_autoscalepolicy_binding timer_policy_binding = new nstimer_autoscalepolicy_binding(); int sampleSize = duration/interval; @@ -2055,7 +2077,7 @@ public class NetscalerResource implements ServerResource { timer_policy_binding.set_name(timerName); timer_policy_binding.set_policyname(policyName); // timer_policy_binding.set_global("DEFAULT"); // vserver name is present in the expression, this is default -// now + // now timer_policy_binding.set_samplesize(sampleSize); timer_policy_binding.set_threshold(sampleSize); // We are not exposing this parameter as of now. // i.e. n(m) is not exposed to CS user. So thresholdSize == sampleSize diff --git a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java index efff14e7d96..0eefca09a6d 100644 --- a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java @@ -52,6 +52,7 @@ import com.cloud.event.ActionEvent; import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ResourceInUseException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.LoadBalancerVO; import com.cloud.network.Network.Capability; import com.cloud.network.as.dao.AutoScalePolicyConditionMapDao; @@ -711,20 +712,22 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { } @Override - public boolean configureAutoScaleVmGroup(CreateAutoScaleVmGroupCmd cmd) { - return configureAutoScaleVmGroup(cmd.getEntityId()); + public boolean configureAutoScaleVmGroup(CreateAutoScaleVmGroupCmd cmd) throws ResourceUnavailableException { + return configureAutoScaleVmGroup(cmd.getEntityId(), AutoScaleVmGroup.State_New); } public boolean isLoadBalancerBasedAutoScaleVmGroup(AutoScaleVmGroup vmGroup) { return vmGroup.getLoadBalancerId() != null; } - private boolean configureAutoScaleVmGroup(long vmGroupid) throws InvalidParameterValueException { + private boolean configureAutoScaleVmGroup(long vmGroupid, String currentState) throws ResourceUnavailableException{ AutoScaleVmGroup vmGroup = _autoScaleVmGroupDao.findById(vmGroupid); if (isLoadBalancerBasedAutoScaleVmGroup(vmGroup)) { try { - return _lbRulesMgr.configureLbAutoScaleVmGroup(vmGroupid); + return _lbRulesMgr.configureLbAutoScaleVmGroup(vmGroupid, currentState); + } catch (ResourceUnavailableException re) { + throw re; } catch (Exception e) { s_logger.warn("Exception during configureLbAutoScaleVmGroup in lb rules manager", e); return false; @@ -751,12 +754,14 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { boolean success = false; try { - success = configureAutoScaleVmGroup(id); - } finally { + success = configureAutoScaleVmGroup(id, bakupState); + } catch (ResourceUnavailableException e) { + autoScaleVmGroupVO.setState(bakupState); + _autoScaleVmGroupDao.persist(autoScaleVmGroupVO); + } + finally { if (!success) { s_logger.warn("Could not delete AutoScale Vm Group id : " + id); - autoScaleVmGroupVO.setState(bakupState); - _autoScaleVmGroupDao.persist(autoScaleVmGroupVO); return false; } } @@ -945,12 +950,12 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { try { vmGroup.setState(AutoScaleVmGroup.State_Enabled); vmGroup = _autoScaleVmGroupDao.persist(vmGroup); - success = configureAutoScaleVmGroup(id); - + success = configureAutoScaleVmGroup(id, AutoScaleVmGroup.State_Disabled); + } catch (ResourceUnavailableException e) { + vmGroup.setState(AutoScaleVmGroup.State_Disabled); + _autoScaleVmGroupDao.persist(vmGroup); } finally { if (!success) { - vmGroup.setState(AutoScaleVmGroup.State_Disabled); - _autoScaleVmGroupDao.persist(vmGroup); s_logger.warn("Failed to enable AutoScale Vm Group id : " + id); return null; } @@ -972,11 +977,12 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { try { vmGroup.setState(AutoScaleVmGroup.State_Disabled); vmGroup = _autoScaleVmGroupDao.persist(vmGroup); - success = configureAutoScaleVmGroup(id); + success = configureAutoScaleVmGroup(id, AutoScaleVmGroup.State_Enabled); + } catch (ResourceUnavailableException e) { + vmGroup.setState(AutoScaleVmGroup.State_Enabled); + _autoScaleVmGroupDao.persist(vmGroup); } finally { if (!success) { - vmGroup.setState(AutoScaleVmGroup.State_Enabled); - _autoScaleVmGroupDao.persist(vmGroup); s_logger.warn("Failed to disable AutoScale Vm Group id : " + id); return null; } diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java index 57b2f868b74..104bf449297 100644 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java @@ -42,5 +42,5 @@ public interface LoadBalancingRulesManager extends LoadBalancingRulesService { boolean applyLoadBalancersForNetwork(long networkId) throws ResourceUnavailableException; String getLBCapability(long networkid, String capabilityName); - boolean configureLbAutoScaleVmGroup(long vmGroupid); + boolean configureLbAutoScaleVmGroup(long vmGroupid, String currentState) throws ResourceUnavailableException; } diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index 05b745f16a7..ee7fdd4d178 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -248,7 +248,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa return null; } - private LbAutoScaleVmGroup getLbAutoScaleVmGroup(AutoScaleVmGroup vmGroup) { + private LbAutoScaleVmGroup getLbAutoScaleVmGroup(AutoScaleVmGroup vmGroup, String currentState) { List vmGroupPolicyMapList = _autoScaleVmGroupPolicyMapDao.listByVmGroupId(vmGroup.getId()); List autoScalePolicies = new ArrayList(); for (AutoScaleVmGroupPolicyMapVO vmGroupPolicyMap : vmGroupPolicyMapList) { @@ -286,11 +286,11 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa } LbAutoScaleVmProfile lbAutoScaleVmProfile = new LbAutoScaleVmProfile(autoScaleVmProfile, apiKey, secretKey, csUrl, zoneId, domainId, serviceOfferingId, templateId); - return new LbAutoScaleVmGroup(vmGroup, autoScalePolicies, lbAutoScaleVmProfile); + return new LbAutoScaleVmGroup(vmGroup, autoScalePolicies, lbAutoScaleVmProfile, currentState); } - private boolean applyAutoScaleConfig(LoadBalancerVO lb, AutoScaleVmGroupVO vmGroup) throws ResourceUnavailableException { - LbAutoScaleVmGroup lbAutoScaleVmGroup = getLbAutoScaleVmGroup(vmGroup); + private boolean applyAutoScaleConfig(LoadBalancerVO lb, AutoScaleVmGroupVO vmGroup, String currentState) throws ResourceUnavailableException { + LbAutoScaleVmGroup lbAutoScaleVmGroup = getLbAutoScaleVmGroup(vmGroup, currentState); /* Regular config like destinations need not be packed for applying autoscale config as of today.*/ LoadBalancingRule rule = new LoadBalancingRule(lb, null, null); rule.setAutoScaleVmGroup(lbAutoScaleVmGroup); @@ -312,7 +312,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa @Override @DB - public boolean configureLbAutoScaleVmGroup(long vmGroupid) { + public boolean configureLbAutoScaleVmGroup(long vmGroupid, String currentState) throws ResourceUnavailableException { AutoScaleVmGroupVO vmGroup = _autoScaleVmGroupDao.findById(vmGroupid); boolean success = false; @@ -331,17 +331,17 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa } try { - success = applyAutoScaleConfig(loadBalancer, vmGroup); + success = applyAutoScaleConfig(loadBalancer, vmGroup, currentState); } catch (ResourceUnavailableException e) { s_logger.warn("Unable to configure AutoScaleVmGroup to the lb rule: " + loadBalancer.getId() + " because resource is unavaliable:", e); + if (isRollBackAllowedForProvider(loadBalancer)) { + loadBalancer.setState(backupState); + _lbDao.persist(loadBalancer); + s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + " lb state rolback while creating AutoscaleVmGroup"); + } } finally { if (!success) { s_logger.warn("Failed to configure LB Auto Scale Vm Group with Id:" + vmGroupid); - if (isRollBackAllowedForProvider(loadBalancer)) { - loadBalancer.setState(backupState); - _lbDao.persist(loadBalancer); - s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + " lb state rolback while creating AutoscaleVmGroup"); - } } } @@ -854,7 +854,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa if (_autoScaleVmGroupDao.isAutoScaleLoadBalancer(loadBalancerId)) { // Get the associated VmGroup AutoScaleVmGroupVO vmGroup = _autoScaleVmGroupDao.listByAll(loadBalancerId, null).get(0); - if (!applyAutoScaleConfig(lb, vmGroup)) { + if (!applyAutoScaleConfig(lb, vmGroup, vmGroup.getState())) { s_logger.warn("Unable to apply the autoscale config"); return false; }