From 2c3d0f724de19afb472c4b91996d48a5b98169b0 Mon Sep 17 00:00:00 2001 From: Vijay Date: Thu, 19 Jul 2012 21:39:14 +0530 Subject: [PATCH] AutoScale. Tested and corrected AutoScale Vm Group creation command passing to NetScaler. Still delete and disable is pending will wait for clean NS build. --- .../cloud/agent/api/to/LoadBalancerTO.java | 20 ++- .../network/resource/NetscalerResource.java | 160 ++++++++++-------- 2 files changed, 105 insertions(+), 75 deletions(-) diff --git a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java index 9e7d3d632c3..7a52855d404 100644 --- a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java +++ b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java @@ -12,6 +12,7 @@ // Automatically generated by addcopyright.py at 04/03/2012 package com.cloud.agent.api.to; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -28,7 +29,7 @@ import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy; import com.cloud.utils.Pair; -public class LoadBalancerTO { +public class LoadBalancerTO implements Serializable { Long id; String srcIp; int srcPort; @@ -132,7 +133,7 @@ public class LoadBalancerTO { return this.autoScaleVmGroupTO != null; } - public static class StickinessPolicyTO { + public static class StickinessPolicyTO implements Serializable{ private final String _methodName; private final List> _paramsList; @@ -150,7 +151,7 @@ public class LoadBalancerTO { } } - public static class DestinationTO { + public static class DestinationTO implements Serializable{ String destIp; int destPort; boolean revoked; @@ -183,7 +184,7 @@ public class LoadBalancerTO { } } - public static class CounterTO { + public static class CounterTO implements Serializable{ private final String name; private final String source; private final String value; @@ -207,7 +208,7 @@ public class LoadBalancerTO { } } - public static class ConditionTO { + public static class ConditionTO implements Serializable{ private final long threshold; private final String relationalOperator; private final CounterTO counter; @@ -232,7 +233,7 @@ public class LoadBalancerTO { } } - public static class AutoScalePolicyTO { + public static class AutoScalePolicyTO implements Serializable{ private final long id; private final int duration; private final int quietTime; @@ -274,7 +275,7 @@ public class LoadBalancerTO { } } - public static class AutoScaleVmProfileTO { + public static class AutoScaleVmProfileTO implements Serializable{ private final Long zoneId; private final Long domainId; private final Long serviceOfferingId; @@ -347,7 +348,7 @@ public class LoadBalancerTO { } } - public static class AutoScaleVmGroupTO { + public static class AutoScaleVmGroupTO implements Serializable{ private final int minMembers; private final int maxMembers; private final int memberPort; @@ -417,8 +418,9 @@ public class LoadBalancerTO { } LbAutoScaleVmProfile lbAutoScaleVmProfile = lbAutoScaleVmGroup.getProfile(); AutoScaleVmProfile autoScaleVmProfile = lbAutoScaleVmProfile.getProfile(); + AutoScaleVmProfileTO autoScaleVmProfileTO = new AutoScaleVmProfileTO(autoScaleVmProfile.getZoneId(), autoScaleVmProfile.getDomainId(), - lbAutoScaleVmProfile.getAutoScaleUserApiKey(), lbAutoScaleVmProfile.getAutoScaleUserSecretKey(), lbAutoScaleVmProfile.getCsUrl(), + lbAutoScaleVmProfile.getCsUrl(), lbAutoScaleVmProfile.getAutoScaleUserApiKey(), lbAutoScaleVmProfile.getAutoScaleUserSecretKey(), autoScaleVmProfile.getServiceOfferingId(), autoScaleVmProfile.getTemplateId(), autoScaleVmProfile.getOtherDeployParams(), autoScaleVmProfile.getSnmpCommunity(), autoScaleVmProfile.getSnmpPort(), autoScaleVmProfile.getDestroyVmGraceperiod()); diff --git a/core/src/com/cloud/network/resource/NetscalerResource.java b/core/src/com/cloud/network/resource/NetscalerResource.java index 3714f8cbb37..652a567af0b 100644 --- a/core/src/com/cloud/network/resource/NetscalerResource.java +++ b/core/src/com/cloud/network/resource/NetscalerResource.java @@ -12,6 +12,8 @@ // Automatically generated by addcopyright.py at 04/03/2012 package com.cloud.network.resource; +import java.io.FileInputStream; +import java.io.ObjectInputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Formatter; @@ -100,9 +102,9 @@ public class NetscalerResource implements ServerResource { private String _name; private String _zoneId; private String _physicalNetworkId; - private String _ip; - private String _username; - private String _password; + public String _ip; + public String _username; + public String _password; private String _publicInterface; private String _privateInterface; private Integer _numRetries; @@ -473,7 +475,8 @@ public class NetscalerResource implements ServerResource { } cur_prirotiy++; } - return -1; + priorities.add(cur_prirotiy);; + return cur_prirotiy; } @SuppressWarnings("static-access") @@ -482,7 +485,7 @@ public class NetscalerResource implements ServerResource { int srcPort = loadBalancerTO.getSrcPort(); String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); - String serviceGroupName = generateAutoScaleServiceGroupName(nsVirtualServerName); + String serviceGroupName = generateAutoScaleServiceGroupName(srcIp, srcPort); disableAutoScaleConfig(loadBalancerTO); @@ -532,27 +535,28 @@ public class NetscalerResource implements ServerResource { int srcPort = loadBalancerTO.getSrcPort(); String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); - String profileName = generateAutoScaleProfileName(nsVirtualServerName); - String timerName = generateAutoScaleTimerName(nsVirtualServerName); - String scaleDownActionName = generateAutoScaleScaleDownActionName(nsVirtualServerName); - String scaleUpActionName = generateAutoScaleScaleUpActionName(nsVirtualServerName); - String mtName = generateSnmpMetricTableName(nsVirtualServerName); - String monitorName = generateSnmpMonitorName(nsVirtualServerName); + String profileName = generateAutoScaleProfileName(srcIp, srcPort); + String timerName = generateAutoScaleTimerName(srcIp, srcPort); + String scaleDownActionName = generateAutoScaleScaleDownActionName(srcIp, srcPort); + String scaleUpActionName = generateAutoScaleScaleUpActionName(srcIp, srcPort); + String mtName = generateSnmpMetricTableName(srcIp, srcPort); + String monitorName = generateSnmpMonitorName(srcIp, srcPort); AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); List policies = vmGroupTO.getPolicies(); + boolean isSnmp = false; /* Create Counters */ for (AutoScalePolicyTO autoScalePolicyTO : policies) { List conditions = autoScalePolicyTO.getConditions(); for (ConditionTO conditionTO : conditions) { CounterTO counterTO = conditionTO.getCounter(); - if(counterTO.getSource() == "snmp") - { + if(counterTO.getSource().equals("snmp")) { + isSnmp = true; break; } } String policyId = Long.toString(autoScalePolicyTO.getId()); - String policyName = generateAutoScalePolicyName(nsVirtualServerName,policyId); + String policyName = generateAutoScalePolicyName(srcIp, srcPort,policyId); // unbind timer policy // unbbind timer trigger lb_astimer -policyName lb_policy_scaleUp com.citrix.netscaler.nitro.resource.config.timer.timertrigger_timerpolicy_binding timer_policy_binding = new com.citrix.netscaler.nitro.resource.config.timer.timertrigger_timerpolicy_binding(); @@ -617,26 +621,29 @@ public class NetscalerResource implements ServerResource { throw e; } - // Delete Monitor - // rm lb monitor lb_metric_table_mon - com.citrix.netscaler.nitro.resource.config.lb.lbmonitor monitor = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor(); - try { - monitor.set_monitorname(monitorName); - monitor.delete(login_get_service(), monitor); - } catch (Exception e) { - // Ignore Exception - throw e; + if(isSnmp) { + // Delete Monitor + // rm lb monitor lb_metric_table_mon + com.citrix.netscaler.nitro.resource.config.lb.lbmonitor monitor = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor(); + try { + monitor.set_monitorname(monitorName); + monitor.delete(login_get_service(), monitor); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // Delete Metric Table + com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable metricTable = new com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable(); + try { + metricTable.set_metric(mtName); + metricTable.delete(login_get_service(), metricTable); + } catch (Exception e) { + // Ignore Exception + throw e; + } } - // Delete Metric Table - com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable metricTable = new com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable(); - try { - metricTable.set_metric(mtName); - metricTable.delete(login_get_service(), metricTable); - } catch (Exception e) { - // Ignore Exception - throw e; - } return true; } @@ -655,7 +662,7 @@ public class NetscalerResource implements ServerResource { s_logger.debug("Created load balancing virtual server " + nsVirtualServerName + " on the Netscaler device"); } - String serviceGroupName = generateAutoScaleServiceGroupName(nsVirtualServerName); + String serviceGroupName = generateAutoScaleServiceGroupName(srcIp, srcPort); // add servicegroup lb_autoscaleGroup -autoscale POLICY -memberPort 80 com.citrix.netscaler.nitro.resource.config.basic.servicegroup serviceGroup = new com.citrix.netscaler.nitro.resource.config.basic.servicegroup(); int memberPort = vmGroupTO.getMemberPort(); @@ -694,13 +701,13 @@ public class NetscalerResource implements ServerResource { int srcPort = loadBalancerTO.getSrcPort(); String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); - String serviceGroupName = generateAutoScaleServiceGroupName(nsVirtualServerName); - String profileName = generateAutoScaleProfileName(nsVirtualServerName); - String timerName = generateAutoScaleTimerName(nsVirtualServerName); - String scaleDownActionName = generateAutoScaleScaleDownActionName(nsVirtualServerName); - String scaleUpActionName = generateAutoScaleScaleUpActionName(nsVirtualServerName); - String mtName = generateSnmpMetricTableName(nsVirtualServerName); - String monitorName = generateSnmpMonitorName(nsVirtualServerName); + String serviceGroupName = generateAutoScaleServiceGroupName(srcIp, srcPort); + String profileName = generateAutoScaleProfileName(srcIp, srcPort); + String timerName = generateAutoScaleTimerName(srcIp, srcPort); + String scaleDownActionName = generateAutoScaleScaleDownActionName(srcIp, srcPort); + String scaleUpActionName = generateAutoScaleScaleUpActionName(srcIp, srcPort); + String mtName = generateSnmpMetricTableName(srcIp, srcPort); + String monitorName = generateSnmpMonitorName(srcIp, srcPort); AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); AutoScaleVmProfileTO profileTO = vmGroupTO.getProfile(); List policies = vmGroupTO.getPolicies(); @@ -737,12 +744,14 @@ public class NetscalerResource implements ServerResource { 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(login_get_service(), autoscaleProfile); } catch (Exception e) { // Ignore Exception + throw e; } @@ -764,7 +773,7 @@ public class NetscalerResource implements ServerResource { if(scaleUpQuietTime == null) { if(isScaleUpPolicy(autoScalePolicyTO)) { scaleUpQuietTime = autoScalePolicyTO.getQuietTime(); - if(scaleDownQuietTime == null) { + if(scaleDownQuietTime != null) { break; } } @@ -772,7 +781,7 @@ public class NetscalerResource implements ServerResource { if(scaleDownQuietTime == null) { if(isScaleDownPolicy(autoScalePolicyTO)) { scaleDownQuietTime = autoScalePolicyTO.getQuietTime(); - if(scaleUpQuietTime == null) { + if(scaleUpQuietTime != null) { break; } } @@ -823,10 +832,10 @@ public class NetscalerResource implements ServerResource { } /* Create Counters */ + HashMap snmpMetrics = new HashMap(); for (AutoScalePolicyTO autoScalePolicyTO : policies) { boolean isPolicyRevoked = autoScalePolicyTO.isRevoked(); List conditions = autoScalePolicyTO.getConditions(); - HashMap snmpMetrics = new HashMap(); String policyExpression = ""; int snmpCounterNumber = 0; for (ConditionTO conditionTO : conditions) { @@ -846,7 +855,7 @@ public class NetscalerResource implements ServerResource { //add lb metricTable lb_metric_table com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable metricTable = new com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable(); try { - metricTable.set_metric(mtName); + metricTable.set_metrictable(mtName); metricTable.add(login_get_service(), metricTable); } catch (Exception e) { // Ignore Exception @@ -859,6 +868,7 @@ public class NetscalerResource implements ServerResource { com.citrix.netscaler.nitro.resource.config.lb.lbmonitor monitor = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor(); try { monitor.set_monitorname(monitorName); + monitor.set_type("LOAD"); monitor.set_destport(snmpPort); monitor.set_snmpcommunity(snmpCommunity); monitor.set_metrictable(mtName); @@ -907,7 +917,7 @@ public class NetscalerResource implements ServerResource { // bind lb monitor lb_metric_table_mon -metric cpu -metricThreshold 1 com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_lbmetrictable_binding monitor_metrictable_binding = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_lbmetrictable_binding(); try { - monitor_metrictable_binding.set_metrictable(mtName); + monitor_metrictable_binding.set_monitorname(monitorName); monitor_metrictable_binding.set_metric(counterName); monitor_metrictable_binding.set_metricthreshold(1); // 1 is a dummy threshold monitor_metrictable_binding.add(login_get_service(), monitor_metrictable_binding); @@ -918,12 +928,12 @@ 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. - 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); + formatter.format("SYS.VSERVER(\"%s\").%s.%s(%d)",nsVirtualServerName, counterTO.getValue(), operator, threshold); } if(policyExpression.length() != 0) { policyExpression += " && "; @@ -933,7 +943,7 @@ public class NetscalerResource implements ServerResource { policyExpression = "(" + policyExpression + ")"; String policyId = Long.toString(autoScalePolicyTO.getId()); - String policyName = generateAutoScalePolicyName(nsVirtualServerName,policyId); + String policyName = generateAutoScalePolicyName(srcIp, srcPort,policyId); if(!isPolicyRevoked) { // Adding a autoscale policy // add timer policy lb_policy_scaleUp_cpu_mem -rule - (SYS.CUR_VSERVER.METRIC_TABLE(cpu).AVG_VAL.GT(80)- @@ -961,7 +971,7 @@ public class NetscalerResource implements ServerResource { timer_policy_binding.set_name(timerName); timer_policy_binding.set_policyname(policyName); // timer_policy_binding.set_vserver(nsVirtualServerName); - timer_policy_binding.set_global("GLOBAL_DEFAULT"); // vserver name is present at the expression + timer_policy_binding.set_global("DEFAULT"); // vserver name is present at the expression timer_policy_binding.set_samplesize(sampleSize); timer_policy_binding.set_thresholdsize(sampleSize); // We are not exposing this parameter as of now. // i.e. n(m) is not exposed to CS user. So thresholdSize == sampleSize @@ -977,7 +987,8 @@ public class NetscalerResource implements ServerResource { return true; } - private synchronized void applyAutoScaleConfig(LoadBalancerTO loadBalancer) throws Exception, ExecutionException { + public synchronized void applyAutoScaleConfig(LoadBalancerTO loadBalancer) throws Exception, ExecutionException { + AutoScaleVmGroupTO vmGroupTO = loadBalancer.getAutoScaleVmGroupTO(); if(!isAutoScaleSupportedInNetScaler()) { throw new ExecutionException("AutoScale not supported in this version of NetScaler"); @@ -1986,6 +1997,10 @@ public class NetscalerResource implements ServerResource { if(vmGroupTO != null) { vserver.set_minautoscalemembers(vmGroupTO.getMinMembers()); vserver.set_maxautoscalemembers(vmGroupTO.getMaxMembers()); + vserver.set_mysqlcharacterset(null); + vserver.set_mysqlprotocolversion(null); + vserver.set_mysqlservercapabilities(null); + vserver.set_mssqlserverversion(null); } if (vserverExisis) { @@ -2104,36 +2119,36 @@ public class NetscalerResource implements ServerResource { return genObjectName("Cloud-VirtualServer", srcIp, srcPort); } - private String generateAutoScaleServiceGroupName(String virtualServerName) { - return genObjectName("Cloud-AutoScaleServiceGroup", virtualServerName); + private String generateAutoScaleServiceGroupName(String srcIp, long srcPort) { + return genObjectName("Cloud-AutoScaleServiceGroup", srcIp, srcPort); } - private String generateAutoScaleTimerName(String virtualServerName) { - return genObjectName("Cloud-AutoScale-Timer", virtualServerName); + private String generateAutoScaleTimerName(String srcIp, long srcPort) { + return genObjectName("Cloud-AutoScale-Timer", srcIp, srcPort); } - private String generateAutoScaleProfileName(String virtualServerName) { - return genObjectName("Cloud-AutoScale-Profile", virtualServerName); + private String generateAutoScaleProfileName(String srcIp, long srcPort) { + return genObjectName("Cloud-AutoScale-Profile", srcIp, srcPort); } - private String generateAutoScaleScaleUpActionName(String virtualServerName) { - return genObjectName("Cloud-AutoScale-ScaleUpAction", virtualServerName); + private String generateAutoScaleScaleUpActionName(String srcIp, long srcPort) { + return genObjectName("Cloud-AutoScale-ScaleUpAction", srcIp, srcPort); } - private String generateAutoScaleScaleDownActionName(String virtualServerName) { - return genObjectName("Cloud-AutoScale-ScaleDownAction", virtualServerName); + private String generateAutoScaleScaleDownActionName(String srcIp, long srcPort) { + return genObjectName("Cloud-AutoScale-ScaleDownAction", srcIp, srcPort); } - private String generateAutoScalePolicyName(String virtualServerName, String poilcyId) { - return genObjectName("Cloud-AutoScale-Policy", virtualServerName, poilcyId); + private String generateAutoScalePolicyName(String srcIp, long srcPort, String poilcyId) { + return genObjectName("Cloud-AutoScale-Policy", srcIp, srcPort, poilcyId); } - private String generateSnmpMetricTableName(String virtualServerName) { - return genObjectName("Cloud-MetricTable", virtualServerName); + private String generateSnmpMetricTableName(String srcIp, long srcPort) { + return genObjectName("Cloud-MTbl", srcIp, srcPort); } - private String generateSnmpMonitorName(String virtualServerName) { - return genObjectName("Cloud-Monitor", virtualServerName); + private String generateSnmpMonitorName(String srcIp, long srcPort) { + return genObjectName("Cloud-Mon", srcIp, srcPort); } private String generateSnmpMetricName(String counterName) { @@ -2198,4 +2213,17 @@ public class NetscalerResource implements ServerResource { public void disconnected() { return; } + + public static void main(String args[]) throws Exception { + NetscalerResource res = new NetscalerResource(); + res._ip = "10.102.31.86"; + res._username = "nsroot"; + res._password = "nsroot"; + // Deserialize a string and date from a file. + FileInputStream in = new FileInputStream("c:\\temp\\lbto.obj"); + ObjectInputStream s1 = new ObjectInputStream(in); + LoadBalancerTO loadBalancer = (LoadBalancerTO)s1.readObject(); + res.applyAutoScaleConfig(loadBalancer); + + } }