mirror of https://github.com/apache/cloudstack.git
CS-15931 Delete Vm group not removing configs from NS.
CS-15935 NetScaler sessions increase in case of errors in the NetScaler CS-15930 Save config not triggered to NS after create, update delete VM group CS-15934 Handling Resource Unavailable exception for AutoScale
This commit is contained in:
parent
b82fddd629
commit
0bd667418e
|
|
@ -356,8 +356,9 @@ public class LoadBalancerTO implements Serializable {
|
|||
private final List<AutoScalePolicyTO> policies;
|
||||
private final AutoScaleVmProfileTO profile;
|
||||
private final String state;
|
||||
private final String currentState;
|
||||
|
||||
AutoScaleVmGroupTO(int minMembers, int maxMembers, int memberPort, int interval, List<AutoScalePolicyTO> policies, AutoScaleVmProfileTO profile, String state)
|
||||
AutoScaleVmGroupTO(int minMembers, int maxMembers, int memberPort, int interval, List<AutoScalePolicyTO> 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());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -356,11 +356,13 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
|
|||
AutoScaleVmGroup vmGroup;
|
||||
private final List<LbAutoScalePolicy> policies;
|
||||
private final LbAutoScaleVmProfile profile;
|
||||
private final String currentState;
|
||||
|
||||
public LbAutoScaleVmGroup(AutoScaleVmGroup vmGroup, List<LbAutoScalePolicy> policies, LbAutoScaleVmProfile profile) {
|
||||
public LbAutoScaleVmGroup(AutoScaleVmGroup vmGroup, List<LbAutoScalePolicy> 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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<Type> 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<Type> 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<Type> 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<Type> 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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
|
|||
return null;
|
||||
}
|
||||
|
||||
private LbAutoScaleVmGroup getLbAutoScaleVmGroup(AutoScaleVmGroup vmGroup) {
|
||||
private LbAutoScaleVmGroup getLbAutoScaleVmGroup(AutoScaleVmGroup vmGroup, String currentState) {
|
||||
List<AutoScaleVmGroupPolicyMapVO> vmGroupPolicyMapList = _autoScaleVmGroupPolicyMapDao.listByVmGroupId(vmGroup.getId());
|
||||
List<LbAutoScalePolicy> autoScalePolicies = new ArrayList<LbAutoScalePolicy>();
|
||||
for (AutoScaleVmGroupPolicyMapVO vmGroupPolicyMap : vmGroupPolicyMapList) {
|
||||
|
|
@ -286,11 +286,11 @@ public class LoadBalancingRulesManagerImpl<Type> 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<Type> 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<Type> 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<Type> 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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue