mirror of https://github.com/apache/cloudstack.git
Autoscale:Changes for addressing AutoScale bugs CS-15930, CS-15931, CS-15934, CS-15935
This commit is contained in:
parent
c1b4bc448c
commit
3e32a29048
|
|
@ -49,7 +49,7 @@ 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<LbDestination> destinations) {
|
||||
if(destinations == null) { // for autoscaleconfig destinations will be null;
|
||||
if (destinations == null) { // for autoscaleconfig destinations will be null;
|
||||
destinations = new ArrayList<LbDestination>();
|
||||
}
|
||||
this.id = id;
|
||||
|
|
@ -70,7 +70,7 @@ public class LoadBalancerTO {
|
|||
public LoadBalancerTO (Long id, String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, List<LbDestination> arg_destinations, List<LbStickinessPolicy> stickinessPolicies) {
|
||||
this(id, srcIp, srcPort, protocol, algorithm, revoked, alreadyAdded, arg_destinations);
|
||||
this.stickinessPolicies = null;
|
||||
if (stickinessPolicies != null && stickinessPolicies.size()>0) {
|
||||
if (stickinessPolicies != null && stickinessPolicies.size() > 0) {
|
||||
this.stickinessPolicies = new StickinessPolicyTO[MAX_STICKINESS_POLICIES];
|
||||
int index = 0;
|
||||
for (LbStickinessPolicy stickinesspolicy : stickinessPolicies) {
|
||||
|
|
@ -186,7 +186,7 @@ public class LoadBalancerTO {
|
|||
return alreadyAdded;
|
||||
}
|
||||
}
|
||||
public static class CounterTO implements Serializable{
|
||||
public static class CounterTO implements Serializable {
|
||||
private final String name;
|
||||
private final String source;
|
||||
private final String value;
|
||||
|
|
@ -210,7 +210,7 @@ public class LoadBalancerTO {
|
|||
}
|
||||
}
|
||||
|
||||
public static class ConditionTO implements Serializable{
|
||||
public static class ConditionTO implements Serializable {
|
||||
private final long threshold;
|
||||
private final String relationalOperator;
|
||||
private final CounterTO counter;
|
||||
|
|
@ -235,7 +235,7 @@ public class LoadBalancerTO {
|
|||
}
|
||||
}
|
||||
|
||||
public static class AutoScalePolicyTO implements Serializable{
|
||||
public static class AutoScalePolicyTO implements Serializable {
|
||||
private final long id;
|
||||
private final int duration;
|
||||
private final int quietTime;
|
||||
|
|
@ -277,7 +277,7 @@ public class LoadBalancerTO {
|
|||
}
|
||||
}
|
||||
|
||||
public static class AutoScaleVmProfileTO implements Serializable{
|
||||
public static class AutoScaleVmProfileTO implements Serializable {
|
||||
private final Long zoneId;
|
||||
private final Long domainId;
|
||||
private final Long serviceOfferingId;
|
||||
|
|
@ -350,7 +350,7 @@ public class LoadBalancerTO {
|
|||
}
|
||||
}
|
||||
|
||||
public static class AutoScaleVmGroupTO implements Serializable{
|
||||
public static class AutoScaleVmGroupTO implements Serializable {
|
||||
private final int minMembers;
|
||||
private final int maxMembers;
|
||||
private final int memberPort;
|
||||
|
|
@ -358,8 +358,9 @@ public class LoadBalancerTO {
|
|||
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;
|
||||
|
|
@ -368,6 +369,7 @@ public class LoadBalancerTO {
|
|||
this.policies = policies;
|
||||
this.profile = profile;
|
||||
this.state = state;
|
||||
this.currentState = currentState;
|
||||
}
|
||||
|
||||
public int getMinMembers() {
|
||||
|
|
@ -397,6 +399,10 @@ public class LoadBalancerTO {
|
|||
public String getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public String getCurrentState() {
|
||||
return currentState;
|
||||
}
|
||||
}
|
||||
|
||||
public void setAutoScaleVmGroup(LbAutoScaleVmGroup lbAutoScaleVmGroup)
|
||||
|
|
@ -428,7 +434,7 @@ public class LoadBalancerTO {
|
|||
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,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;
|
||||
|
|
@ -58,7 +59,7 @@ public interface AutoScaleService {
|
|||
|
||||
AutoScaleVmGroup createAutoScaleVmGroup(CreateAutoScaleVmGroupCmd cmd);
|
||||
|
||||
boolean configureAutoScaleVmGroup(CreateAutoScaleVmGroupCmd cmd);
|
||||
boolean configureAutoScaleVmGroup(CreateAutoScaleVmGroupCmd cmd) throws ResourceUnavailableException;
|
||||
|
||||
boolean deleteAutoScaleVmGroup(long vmGroupId);
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ import com.cloud.network.rules.FirewallRule;
|
|||
import com.cloud.network.rules.LoadBalancer;
|
||||
import com.cloud.utils.Pair;
|
||||
|
||||
public class LoadBalancingRule implements FirewallRule, LoadBalancer{
|
||||
public class LoadBalancingRule implements FirewallRule, LoadBalancer {
|
||||
private LoadBalancer lb;
|
||||
private List<LbDestination> destinations;
|
||||
private List<LbStickinessPolicy> stickinessPolicies;
|
||||
|
|
@ -319,17 +319,19 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer{
|
|||
public String getCsUrl() {
|
||||
return csUrl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class LbAutoScaleVmGroup {
|
||||
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() {
|
||||
|
|
@ -343,5 +345,9 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer{
|
|||
public LbAutoScaleVmProfile getProfile() {
|
||||
return profile;
|
||||
}
|
||||
|
||||
public String getCurrentState() {
|
||||
return currentState;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -237,8 +237,26 @@ 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) {
|
||||
// Ignore logout exceptions
|
||||
}
|
||||
}
|
||||
|
||||
private void login() throws ExecutionException {
|
||||
try {
|
||||
// If a previous session was open, log it out.
|
||||
logout();
|
||||
if (!_isSdx) {
|
||||
_netscalerService = new nitro_service(_ip, "https");
|
||||
_netscalerService.set_credential(_username, _password);
|
||||
|
|
@ -252,7 +270,7 @@ public class NetscalerResource implements ServerResource {
|
|||
_netscalerSdxService.set_credential(_username, _password);
|
||||
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) {
|
||||
|
|
@ -1416,9 +1434,9 @@ public class NetscalerResource implements ServerResource {
|
|||
// set session persistence timeout
|
||||
vserver.set_timeout(timeout);
|
||||
} else {
|
||||
// delete the LB stickyness policy
|
||||
vserver.set_persistencetype("NONE");
|
||||
}
|
||||
// delete the LB stickyness policy
|
||||
vserver.set_persistencetype("NONE");
|
||||
}
|
||||
|
||||
if (vserverExisis) {
|
||||
apiCallResult = lbvserver.update(_netscalerService,vserver);
|
||||
|
|
@ -1482,7 +1500,12 @@ 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());
|
||||
}
|
||||
// AutoScale APIs are successful executed, now save the configuration.
|
||||
saveConfiguration();
|
||||
if (s_logger.isInfoEnabled()) {
|
||||
s_logger.info("Successfully executed resource AutoScaleConfig");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1497,23 +1520,23 @@ public class NetscalerResource implements ServerResource {
|
|||
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);
|
||||
if(!nsServiceGroupExists(serviceGroupName)) {
|
||||
// add servicegroup lb_autoscaleGroup -autoscale POLICY -memberPort 80
|
||||
int memberPort = vmGroupTO.getMemberPort();
|
||||
try {
|
||||
try {
|
||||
servicegroup 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;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
if(!isServiceGroupBoundToVirtualServer(nsVirtualServerName, serviceGroupName)) {
|
||||
|
|
@ -1521,13 +1544,13 @@ public class NetscalerResource implements ServerResource {
|
|||
// bind lb vserver lb lb_autoscaleGroup
|
||||
lbvserver_servicegroup_binding vserver_servicegroup_binding = new lbvserver_servicegroup_binding();
|
||||
|
||||
try {
|
||||
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;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
// Create the autoscale config
|
||||
|
|
@ -1543,32 +1566,32 @@ public class NetscalerResource implements ServerResource {
|
|||
String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort);
|
||||
String serviceGroupName = generateAutoScaleServiceGroupName(srcIp, srcPort);
|
||||
|
||||
if (loadBalancerTO.getAutoScaleVmGroupTO().getState().equals("enabled")) {
|
||||
disableAutoScaleConfig(loadBalancerTO, false);
|
||||
if (loadBalancerTO.getAutoScaleVmGroupTO().getCurrentState().equals("enabled")) {
|
||||
disableAutoScaleConfig(loadBalancerTO, false);
|
||||
}
|
||||
|
||||
if(isServiceGroupBoundToVirtualServer(nsVirtualServerName, serviceGroupName)) {
|
||||
// UnBind autoscale service group
|
||||
// unbind lb vserver lb lb_autoscaleGroup
|
||||
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;
|
||||
}
|
||||
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(nsServiceGroupExists(serviceGroupName)) {
|
||||
// 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;
|
||||
}
|
||||
if (nsServiceGroupExists(serviceGroupName)) {
|
||||
// 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);
|
||||
|
|
@ -1599,181 +1622,181 @@ public class NetscalerResource implements ServerResource {
|
|||
|
||||
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();
|
||||
// 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 {
|
||||
try {
|
||||
vserver.set_name(nsVirtualServerName);
|
||||
vserver.set_minautoscalemembers(minAutoScaleMembers);
|
||||
vserver.set_maxautoscalemembers(maxAutoScaleMembers);
|
||||
vserver.update(_netscalerService, vserver);
|
||||
} catch (Exception e) {
|
||||
} 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();
|
||||
/* 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) {
|
||||
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
|
||||
// Add Timer
|
||||
nstimer timer = new nstimer();
|
||||
try {
|
||||
timer.set_name(timerName);
|
||||
timer.set_interval(interval);
|
||||
timer.add(_netscalerService, timer);
|
||||
} catch (Exception e) {
|
||||
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;
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
// 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() + "&")) +
|
||||
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();
|
||||
scaleUpAction.set_parameters(scaleUpParameters);
|
||||
scaleUpAction.add(_netscalerService, scaleUpAction);
|
||||
} catch (Exception e) {
|
||||
scaleDownAction.set_parameters(scaleDownParameters);
|
||||
scaleDownAction.set_vmdestroygraceperiod(destroyVmGracePeriod);
|
||||
scaleDownAction.add(_netscalerService, scaleDownAction);
|
||||
} 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 */
|
||||
/* 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,
|
||||
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 */
|
||||
/* 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,
|
||||
String maxMemberPolicyExp = "SYS.VSERVER(\"" + nsVirtualServerName + "\").ACTIVESERVICES.GT(SYS.VSERVER(\"" + nsVirtualServerName + "\").MAXAUTOSCALEMEMBERS)";
|
||||
addAutoScalePolicy(timerName, maxMemberPolicyName, cur_prirotiy++, maxMemberPolicyExp, scaleDownActionName,
|
||||
interval, interval, isCleanUp);
|
||||
|
||||
/* Create Counters */
|
||||
HashMap<String, Integer> snmpMetrics = new HashMap<String, Integer>();
|
||||
for (AutoScalePolicyTO autoScalePolicyTO : policies) {
|
||||
List<ConditionTO> 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();
|
||||
/* Create Counters */
|
||||
HashMap<String, Integer> snmpMetrics = new HashMap<String, Integer>();
|
||||
for (AutoScalePolicyTO autoScalePolicyTO : policies) {
|
||||
List<ConditionTO> 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);
|
||||
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
|
||||
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) {
|
||||
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 <policy_interval == 80% >
|
||||
// Create Monitor
|
||||
// add lb monitor lb_metric_table_mon LOAD -destPort 161 -snmpCommunity public -metricTable
|
||||
// lb_metric_table -interval <policy_interval == 80% >
|
||||
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) {
|
||||
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 monitor to servicegroup.
|
||||
// bind lb monitor lb_metric_table_mon lb_autoscaleGroup -passive
|
||||
// bind lb monitor lb_metric_table_mon lb_autoscaleGroup -passive
|
||||
servicegroup_lbmonitor_binding servicegroup_monitor_binding = new servicegroup_lbmonitor_binding();
|
||||
try {
|
||||
try {
|
||||
servicegroup_monitor_binding.set_servicegroupname(serviceGroupName);
|
||||
servicegroup_monitor_binding.set_monitor_name(monitorName);
|
||||
|
||||
|
|
@ -1782,35 +1805,35 @@ public class NetscalerResource implements ServerResource {
|
|||
servicegroup_monitor_binding.set_passive(true);
|
||||
|
||||
servicegroup_lbmonitor_binding.add(_netscalerService, servicegroup_monitor_binding);
|
||||
} catch (Exception e) {
|
||||
} catch (Exception e) {
|
||||
// Ignore Exception on cleanup
|
||||
if(!isCleanUp) throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
boolean newMetric = !snmpMetrics.containsKey(counterName);
|
||||
if(newMetric) {
|
||||
snmpMetrics.put(counterName, snmpCounterNumber++);
|
||||
}
|
||||
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();
|
||||
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) {
|
||||
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
|
||||
// bind lb monitor lb_metric_table_mon -metric cpu -metricThreshold 1
|
||||
lbmonitor_metric_binding monitor_metric_binding = new lbmonitor_metric_binding();;
|
||||
try {
|
||||
try {
|
||||
monitor_metric_binding.set_monitorname(monitorName);
|
||||
monitor_metric_binding.set_metric(counterName);
|
||||
/*
|
||||
|
|
@ -1820,41 +1843,41 @@ public class NetscalerResource implements ServerResource {
|
|||
*/
|
||||
monitor_metric_binding.set_metricthreshold(Integer.MAX_VALUE);
|
||||
monitor_metric_binding.add(_netscalerService, monitor_metric_binding);
|
||||
} catch (Exception e) {
|
||||
} catch (Exception e) {
|
||||
// Ignore Exception on cleanup
|
||||
if(!isCleanUp) throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
// SYS.VSERVER("abcd").SNMP_TABLE(0).AVERAGE_VALUE.GT(80)
|
||||
// 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);
|
||||
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;
|
||||
}
|
||||
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 + ")";
|
||||
policyExpression = "(" + policyExpression + ")";
|
||||
|
||||
String policyId = Long.toString(autoScalePolicyTO.getId());
|
||||
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;
|
||||
}
|
||||
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,
|
||||
addAutoScalePolicy(timerName, policyName, cur_prirotiy++, policyExpression, action,
|
||||
autoScalePolicyTO.getDuration(), interval, isCleanUp);
|
||||
|
||||
}
|
||||
|
|
@ -1968,7 +1991,7 @@ public class NetscalerResource implements ServerResource {
|
|||
} catch (Exception e) {
|
||||
// Ignore Exception on cleanup
|
||||
if(!isCleanUp) throw e;
|
||||
}
|
||||
}
|
||||
|
||||
// Delete Monitor
|
||||
// rm lb monitor lb_metric_table_mon
|
||||
|
|
@ -2068,7 +2091,7 @@ public class NetscalerResource implements ServerResource {
|
|||
if(!isCleanUp) throw e;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private boolean isAutoScaleSupportedInNetScaler() throws ExecutionException {
|
||||
|
|
|
|||
|
|
@ -56,6 +56,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;
|
||||
|
|
@ -708,20 +709,22 @@ public class AutoScaleManagerImpl<Type> implements AutoScaleManager, AutoScaleSe
|
|||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
|
||||
public boolean configureAutoScaleVmGroup(long vmGroupid) {
|
||||
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 (RuntimeException re) {
|
||||
s_logger.warn("Exception during configureLbAutoScaleVmGrouop in lb rules manager", re);
|
||||
}
|
||||
|
|
@ -747,12 +750,14 @@ public class AutoScaleManagerImpl<Type> implements AutoScaleManager, AutoScaleSe
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -942,12 +947,12 @@ public class AutoScaleManagerImpl<Type> implements AutoScaleManager, AutoScaleSe
|
|||
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;
|
||||
}
|
||||
|
|
@ -969,11 +974,12 @@ public class AutoScaleManagerImpl<Type> implements AutoScaleManager, AutoScaleSe
|
|||
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,5 +46,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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -243,7 +243,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) {
|
||||
|
|
@ -264,23 +264,28 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
|
|||
String secretKey = user.getSecretKey();
|
||||
String csUrl = _configDao.getValue(Config.EndpointeUrl.key());
|
||||
|
||||
if(apiKey == null) {
|
||||
if (apiKey == null) {
|
||||
throw new InvalidParameterValueException("apiKey for user: " + user.getUsername() + " is empty. Please generate it");
|
||||
}
|
||||
|
||||
if(secretKey == null) {
|
||||
if (secretKey == null) {
|
||||
throw new InvalidParameterValueException("secretKey for user: " + user.getUsername() + " is empty. Please generate it");
|
||||
}
|
||||
|
||||
if(csUrl == null || csUrl.contains("localhost")) {
|
||||
if (csUrl == null || csUrl.contains("localhost")) {
|
||||
throw new InvalidParameterValueException("Global setting endpointe.url has to be set to the Management Server's API end point");
|
||||
}
|
||||
|
||||
LbAutoScaleVmProfile lbAutoScaleVmProfile = new LbAutoScaleVmProfile(autoScaleVmProfile, apiKey, secretKey, csUrl);
|
||||
return new LbAutoScaleVmGroup(vmGroup, autoScalePolicies, lbAutoScaleVmProfile);
|
||||
return new LbAutoScaleVmGroup(vmGroup, autoScalePolicies, lbAutoScaleVmProfile, currentState);
|
||||
}
|
||||
|
||||
private boolean applyAutoScaleConfig(LoadBalancerVO lb, LoadBalancingRule rule) throws ResourceUnavailableException {
|
||||
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);
|
||||
|
||||
if (!isRollBackAllowedForProvider(lb)) {
|
||||
// this is for Netscalar type of devices. if their is failure the db entries will be rollbacked.
|
||||
return false;
|
||||
|
|
@ -298,7 +303,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;
|
||||
|
||||
|
|
@ -318,20 +323,18 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
|
|||
|
||||
// LBTODO
|
||||
try {
|
||||
LbAutoScaleVmGroup lbAutoScaleVmGroup = getLbAutoScaleVmGroup(vmGroup);
|
||||
LoadBalancingRule rule = new LoadBalancingRule(loadBalancer, null, null);
|
||||
rule.setAutoScaleVmGroup(lbAutoScaleVmGroup);
|
||||
success = applyAutoScaleConfig(loadBalancer, rule);
|
||||
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");
|
||||
}
|
||||
throw e;
|
||||
} 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -469,7 +472,7 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
|
|||
|
||||
LoadBalancerVO loadBalancer = _lbDao.findById(cmd.getLbRuleId());
|
||||
if (loadBalancer == null) {
|
||||
throw new InvalidParameterException("Invalid Load balancer Id:" + cmd.getLbRuleId());
|
||||
throw new InvalidParameterException("Invalid Load balancer Id:" + cmd.getLbRuleId());
|
||||
}
|
||||
FirewallRule.State backupState = loadBalancer.getState();
|
||||
loadBalancer.setState(FirewallRule.State.Add);
|
||||
|
|
@ -481,7 +484,7 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
|
|||
if (isRollBackAllowedForProvider(loadBalancer)) {
|
||||
loadBalancer.setState(backupState);
|
||||
_lbDao.persist(loadBalancer);
|
||||
s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + " lb state rolback while creating sticky policy" );
|
||||
s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + " lb state rolback while creating sticky policy");
|
||||
}
|
||||
deleteLBStickinessPolicy(cmd.getEntityId(), false);
|
||||
success = false;
|
||||
|
|
@ -537,7 +540,7 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
|
|||
s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e);
|
||||
success = false;
|
||||
}
|
||||
}else{
|
||||
} else {
|
||||
_lb2stickinesspoliciesDao.remove(stickinessPolicy.getLoadBalancerId());
|
||||
}
|
||||
|
||||
|
|
@ -647,7 +650,7 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
|
|||
s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e);
|
||||
}
|
||||
|
||||
if(!success){
|
||||
if (!success) {
|
||||
CloudRuntimeException ex = new CloudRuntimeException("Failed to add specified loadbalancerruleid for vms " + instanceIds);
|
||||
ex.addProxyObject(loadBalancer, loadBalancerId, "loadBalancerId");
|
||||
// TBD: Also pack in the instanceIds in the exception using the right VO object or table name.
|
||||
|
|
@ -715,7 +718,7 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
|
|||
}
|
||||
s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e);
|
||||
}
|
||||
if(!success){
|
||||
if (!success) {
|
||||
CloudRuntimeException ex = new CloudRuntimeException("Failed to remove specified load balancer rule id for vms " + instanceIds);
|
||||
ex.addProxyObject(loadBalancer, loadBalancerId, "loadBalancerId");
|
||||
throw ex;
|
||||
|
|
@ -1303,7 +1306,7 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
|
|||
if (lbBackup.getDescription() != null) {
|
||||
lb.setDescription(lbBackup.getDescription());
|
||||
}
|
||||
if (lbBackup.getAlgorithm() != null){
|
||||
if (lbBackup.getAlgorithm() != null) {
|
||||
lb.setAlgorithm(lbBackup.getAlgorithm());
|
||||
}
|
||||
lb.setState(lbBackup.getState());
|
||||
|
|
@ -1455,7 +1458,7 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
|
|||
|
||||
if (tags != null && !tags.isEmpty()) {
|
||||
SearchBuilder<ResourceTagVO> tagSearch = _resourceTagDao.createSearchBuilder();
|
||||
for (int count=0; count < tags.size(); count++) {
|
||||
for (int count = 0; count < tags.size(); count++) {
|
||||
tagSearch.or().op("key" + String.valueOf(count), tagSearch.entity().getKey(), SearchCriteria.Op.EQ);
|
||||
tagSearch.and("value" + String.valueOf(count), tagSearch.entity().getValue(), SearchCriteria.Op.EQ);
|
||||
tagSearch.cp();
|
||||
|
|
|
|||
Loading…
Reference in New Issue