cloudstack-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From t..@apache.org
Subject [45/50] [abbrv] git commit: refs/heads/marvin-refactor - CLOUDSTACK-664:AWS-Health Check feature: Patch applied cleanly , RAT build is successful
Date Mon, 18 Mar 2013 12:27:10 GMT
CLOUDSTACK-664:AWS-Health Check feature: Patch applied cleanly , RAT build is successful


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/183b989d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/183b989d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/183b989d

Branch: refs/heads/marvin-refactor
Commit: 183b989d30d10943615f7498f42ed7213cadcbd8
Parents: 99ed891
Author: Rajesh Battala <rajesh.battala@citrix.com>
Authored: Mon Mar 18 14:01:15 2013 +0530
Committer: Pranav Saxena <pranav.saxena@citrix.com>
Committed: Mon Mar 18 14:01:15 2013 +0530

----------------------------------------------------------------------
 .../api/routing/HealthCheckLBConfigAnswer.java     |   42 +
 .../api/routing/HealthCheckLBConfigCommand.java    |   39 +
 api/src/com/cloud/agent/api/to/LoadBalancerTO.java |  114 +++-
 api/src/com/cloud/event/EventTypes.java            |    2 +
 api/src/com/cloud/network/Network.java             |    1 +
 .../element/LoadBalancingServiceProvider.java      |    8 +-
 .../com/cloud/network/lb/LoadBalancingRule.java    |   84 ++-
 .../network/lb/LoadBalancingRulesService.java      |   32 +-
 .../com/cloud/network/rules/HealthCheckPolicy.java |   45 +
 .../org/apache/cloudstack/api/ApiConstants.java    |    5 +
 .../apache/cloudstack/api/ResponseGenerator.java   |    7 +
 .../loadbalancer/CreateLBHealthCheckPolicyCmd.java |  168 ++++
 .../loadbalancer/DeleteLBHealthCheckPolicyCmd.java |  116 +++
 .../loadbalancer/ListLBHealthCheckPoliciesCmd.java |   85 ++
 .../api/response/LBHealthCheckPolicyResponse.java  |   98 +++
 .../api/response/LBHealthCheckResponse.java        |  102 +++
 client/tomcatconf/commands.properties.in           |    3 +
 .../dns-notifier/resources/components-example.xml  |    2 +
 .../element/ElasticLoadBalancerElement.java        |    7 +
 .../network/lb/ElasticLoadBalancerManagerImpl.java |    9 +-
 .../element/F5ExternalLoadBalancerElement.java     |    8 +
 .../cloud/network/element/NetscalerElement.java    |   25 +-
 .../cloud/network/resource/NetscalerResource.java  |  291 ++++++-
 server/src/com/cloud/api/ApiResponseHelper.java    |   61 ++
 server/src/com/cloud/configuration/Config.java     |    6 +-
 .../network/ExternalLoadBalancerDeviceManager.java |    7 +-
 .../ExternalLoadBalancerDeviceManagerImpl.java     |   95 ++-
 .../com/cloud/network/LBHealthCheckPolicyVO.java   |  157 ++++
 .../src/com/cloud/network/NetworkManagerImpl.java  |   73 +-
 .../cloud/network/dao/LBHealthCheckPolicyDao.java  |   35 +
 .../network/dao/LBHealthCheckPolicyDaoImpl.java    |   71 ++
 .../com/cloud/network/dao/LoadBalancerVMMapVO.java |   16 +-
 .../network/element/VirtualRouterElement.java      |   10 +-
 .../com/cloud/network/lb/LBHealthCheckManager.java |   24 +
 .../cloud/network/lb/LBHealthCheckManagerImpl.java |  110 +++
 .../network/lb/LoadBalancingRulesManager.java      |    2 +
 .../network/lb/LoadBalancingRulesManagerImpl.java  |  678 +++++++++++---
 .../router/VirtualNetworkApplianceManagerImpl.java |    9 +-
 .../src/com/cloud/server/ManagementServerImpl.java |    3 +
 setup/db/db/schema-410to420.sql                    |   16 +
 40 files changed, 2449 insertions(+), 217 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/com/cloud/agent/api/routing/HealthCheckLBConfigAnswer.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/routing/HealthCheckLBConfigAnswer.java b/api/src/com/cloud/agent/api/routing/HealthCheckLBConfigAnswer.java
new file mode 100644
index 0000000..dfca4ab
--- /dev/null
+++ b/api/src/com/cloud/agent/api/routing/HealthCheckLBConfigAnswer.java
@@ -0,0 +1,42 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.agent.api.routing;
+
+import java.util.List;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.to.LoadBalancerTO;
+import com.cloud.agent.api.to.NicTO;
+
+/**
+ * LoadBalancerConfigCommand sends the load balancer configuration
+ */
+public class HealthCheckLBConfigAnswer extends Answer {
+    List<LoadBalancerTO> loadBalancers;
+
+    protected HealthCheckLBConfigAnswer() {
+    }
+
+    public HealthCheckLBConfigAnswer(List<LoadBalancerTO> loadBalancers) {
+        this.loadBalancers = loadBalancers;
+    }
+
+    public List<LoadBalancerTO> getLoadBalancers() {
+        return loadBalancers;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/com/cloud/agent/api/routing/HealthCheckLBConfigCommand.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/routing/HealthCheckLBConfigCommand.java b/api/src/com/cloud/agent/api/routing/HealthCheckLBConfigCommand.java
new file mode 100644
index 0000000..f705f6c
--- /dev/null
+++ b/api/src/com/cloud/agent/api/routing/HealthCheckLBConfigCommand.java
@@ -0,0 +1,39 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.agent.api.routing;
+
+import com.cloud.agent.api.to.LoadBalancerTO;
+import com.cloud.agent.api.to.NicTO;
+
+/**
+ * LoadBalancerConfigCommand sends the load balancer configuration
+ */
+public class HealthCheckLBConfigCommand extends NetworkElementCommand {
+    LoadBalancerTO[] loadBalancers;
+
+    protected HealthCheckLBConfigCommand() {
+    }
+
+    public HealthCheckLBConfigCommand(LoadBalancerTO[] loadBalancers) {
+        this.loadBalancers = loadBalancers;
+    }
+
+    public LoadBalancerTO[] getLoadBalancers() {
+        return loadBalancers;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/com/cloud/agent/api/to/LoadBalancerTO.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java
index 2d166ea..df2f8a8 100644
--- a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java
+++ b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java
@@ -31,6 +31,7 @@ import com.cloud.network.lb.LoadBalancingRule.LbAutoScaleVmGroup;
 import com.cloud.network.lb.LoadBalancingRule.LbAutoScaleVmProfile;
 import com.cloud.network.lb.LoadBalancingRule.LbCondition;
 import com.cloud.network.lb.LoadBalancingRule.LbDestination;
+import com.cloud.network.lb.LoadBalancingRule.LbHealthCheckPolicy;
 import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
 import com.cloud.utils.Pair;
 
@@ -46,8 +47,10 @@ public class LoadBalancerTO {
     boolean inline;
     DestinationTO[] destinations;
     private StickinessPolicyTO[] stickinessPolicies;
+    private HealthCheckPolicyTO[] healthCheckPolicies;
     private AutoScaleVmGroupTO autoScaleVmGroupTO;
     final static int MAX_STICKINESS_POLICIES = 1;
+    final static int MAX_HEALTHCHECK_POLICIES = 1;
 
     public LoadBalancerTO(String uuid, String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, boolean inline, List<LbDestination> destinations) {
         if (destinations == null) { // for autoscaleconfig destinations will be null;
@@ -69,23 +72,52 @@ public class LoadBalancerTO {
         }
     }
 
-    public LoadBalancerTO(String id, String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, boolean inline, List<LbDestination> arg_destinations, List<LbStickinessPolicy> stickinessPolicies) {
+    public LoadBalancerTO(String id, String srcIp, int srcPort, String protocol, String algorithm, boolean revoked,
+            boolean alreadyAdded, boolean inline, List<LbDestination> arg_destinations,
+            List<LbStickinessPolicy> stickinessPolicies) {
+
+        this(id, srcIp, srcPort, protocol, algorithm, revoked, alreadyAdded, inline, arg_destinations,
+                stickinessPolicies, null);
+    }
+
+    public LoadBalancerTO(String id, String srcIp, int srcPort, String protocol, String algorithm, boolean revoked,
+            boolean alreadyAdded, boolean inline, List<LbDestination> arg_destinations,
+            List<LbStickinessPolicy> stickinessPolicies, List<LbHealthCheckPolicy> healthCheckPolicies) {
         this(id, srcIp, srcPort, protocol, algorithm, revoked, alreadyAdded, inline, arg_destinations);
         this.stickinessPolicies = null;
+        this.healthCheckPolicies = null;
         if (stickinessPolicies != null && stickinessPolicies.size() > 0) {
             this.stickinessPolicies = new StickinessPolicyTO[MAX_STICKINESS_POLICIES];
             int index = 0;
             for (LbStickinessPolicy stickinesspolicy : stickinessPolicies) {
                 if (!stickinesspolicy.isRevoked()) {
-                    this.stickinessPolicies[index] = new StickinessPolicyTO(stickinesspolicy.getMethodName(), stickinesspolicy.getParams());
+                    this.stickinessPolicies[index] = new StickinessPolicyTO(stickinesspolicy.getMethodName(),
+                            stickinesspolicy.getParams());
                     index++;
-                    if (index == MAX_STICKINESS_POLICIES) break;
-                    }
+                    if (index == MAX_STICKINESS_POLICIES)
+                        break;
                 }
-            if (index == 0) this.stickinessPolicies = null;
             }
+            if (index == 0)
+                this.stickinessPolicies = null;
+        }
+
+        if (healthCheckPolicies != null && healthCheckPolicies.size() > 0) {
+            this.healthCheckPolicies = new HealthCheckPolicyTO[MAX_HEALTHCHECK_POLICIES];
+            int index = 0;
+            for (LbHealthCheckPolicy hcp : healthCheckPolicies) {
+                    this.healthCheckPolicies[0] = new HealthCheckPolicyTO(hcp.getpingpath(), hcp.getDescription(),
+                            hcp.getResponseTime(), hcp.getHealthcheckInterval(), hcp.getHealthcheckThresshold(),
+                            hcp.getUnhealthThresshold(), hcp.isRevoked());
+                    index++;
+                    if (index == MAX_HEALTHCHECK_POLICIES)
+                        break;
             }
 
+            if (index == 0)
+                this.healthCheckPolicies = null;
+        }
+    }
 
     protected LoadBalancerTO() {
     }
@@ -126,6 +158,10 @@ public class LoadBalancerTO {
         return stickinessPolicies;
     }
 
+    public HealthCheckPolicyTO[] getHealthCheckPolicies() {
+        return healthCheckPolicies;
+    }
+
     public DestinationTO[] getDestinations() {
         return destinations;
     }
@@ -158,6 +194,65 @@ public class LoadBalancerTO {
             this._methodName = methodName;
             this._paramsList = paramsList;
         }
+     }
+
+    public static class HealthCheckPolicyTO {
+        private String pingPath;
+        private String description;
+        private int responseTime;
+        private int healthcheckInterval;
+        private int healthcheckThresshold;
+        private int unhealthThresshold;
+        private boolean revoke = false;
+
+        public HealthCheckPolicyTO(String pingPath, String description, int responseTime, int healthcheckInterval,
+                int healthcheckThresshold, int unhealthThresshold, boolean revoke) {
+
+            this.description = description;
+            this.pingPath = pingPath;
+            this.responseTime = responseTime;
+            this.healthcheckInterval = healthcheckInterval;
+            this.healthcheckThresshold = healthcheckThresshold;
+            this.unhealthThresshold = unhealthThresshold;
+            this.revoke = revoke;
+        }
+
+        public HealthCheckPolicyTO() {
+
+        }
+
+        public String getpingPath() {
+            return pingPath;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public int getResponseTime() {
+            return responseTime;
+        }
+
+        public int getHealthcheckInterval() {
+            return healthcheckInterval;
+        }
+
+        public int getHealthcheckThresshold() {
+            return healthcheckThresshold;
+        }
+
+        public int getUnhealthThresshold() {
+            return unhealthThresshold;
+        }
+
+        public void setRevoke(boolean revoke) {
+            this.revoke = revoke;
+        }
+
+        public boolean isRevoked() {
+            return revoke;
+        }
+
     }
 
     public static class DestinationTO {
@@ -165,6 +260,7 @@ public class LoadBalancerTO {
         int destPort;
         boolean revoked;
         boolean alreadyAdded;
+        String monitorState;
         public DestinationTO(String destIp, int destPort, boolean revoked, boolean alreadyAdded) {
             this.destIp = destIp;
             this.destPort = destPort;
@@ -190,6 +286,14 @@ public class LoadBalancerTO {
         public boolean isAlreadyAdded() {
             return alreadyAdded;
         }
+
+        public void setMonitorState(String state) {
+            this.monitorState = state;
+        }
+
+        public String getMonitorState() {
+            return monitorState;
+        }
     }
     public static class CounterTO implements Serializable {
         private final String name;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/com/cloud/event/EventTypes.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java
index 0087edc..f38865c 100755
--- a/api/src/com/cloud/event/EventTypes.java
+++ b/api/src/com/cloud/event/EventTypes.java
@@ -110,6 +110,8 @@ public class EventTypes {
     public static final String EVENT_LOAD_BALANCER_DELETE = "LB.DELETE";
     public static final String EVENT_LB_STICKINESSPOLICY_CREATE = "LB.STICKINESSPOLICY.CREATE";
     public static final String EVENT_LB_STICKINESSPOLICY_DELETE = "LB.STICKINESSPOLICY.DELETE";
+    public static final String EVENT_LB_HEALTHCHECKPOLICY_CREATE = "LB.HEALTHCHECKPOLICY.CREATE";
+    public static final String EVENT_LB_HEALTHCHECKPOLICY_DELETE = "LB.HEALTHCHECKPOLICY.DELETE";
     public static final String EVENT_LOAD_BALANCER_UPDATE = "LB.UPDATE";
 
     // Account events

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/com/cloud/network/Network.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java
index efed5cd..89dac68 100644
--- a/api/src/com/cloud/network/Network.java
+++ b/api/src/com/cloud/network/Network.java
@@ -188,6 +188,7 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
         public static final Capability InlineMode = new Capability("InlineMode");
         public static final Capability SupportedTrafficDirection = new Capability("SupportedTrafficDirection");
         public static final Capability SupportedEgressProtocols = new Capability("SupportedEgressProtocols");
+        public static final Capability HealthCheckPolicy = new Capability("HealthCheckPolicy");
 
         private String name;
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/com/cloud/network/element/LoadBalancingServiceProvider.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/element/LoadBalancingServiceProvider.java b/api/src/com/cloud/network/element/LoadBalancingServiceProvider.java
index 879ea0e..cb3155f 100644
--- a/api/src/com/cloud/network/element/LoadBalancingServiceProvider.java
+++ b/api/src/com/cloud/network/element/LoadBalancingServiceProvider.java
@@ -18,6 +18,7 @@ package com.cloud.network.element;
 
 import java.util.List;
 
+import com.cloud.agent.api.to.LoadBalancerTO;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.Network;
 import com.cloud.network.lb.LoadBalancingRule;
@@ -25,6 +26,7 @@ import com.cloud.network.lb.LoadBalancingRule;
 public interface LoadBalancingServiceProvider extends NetworkElement, IpDeployingRequester {
     /**
      * Apply rules
+     *
      * @param network
      * @param rules
      * @return
@@ -34,10 +36,14 @@ public interface LoadBalancingServiceProvider extends NetworkElement, IpDeployin
 
     /**
      * Validate rules
+     *
      * @param network
      * @param rule
-     * @return true/false. true should be return if there are no validations. false should be return if any oneof the validation fails.
+     * @return true/false. true should be return if there are no validations.
+     *false should be return if any oneof the validation fails.
      * @throws
      */
     boolean validateLBRule(Network network, LoadBalancingRule rule);
+
+    List<LoadBalancerTO> updateHealthChecks(Network network, List<LoadBalancingRule> lbrules);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/com/cloud/network/lb/LoadBalancingRule.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/lb/LoadBalancingRule.java b/api/src/com/cloud/network/lb/LoadBalancingRule.java
index fb1d988..84526c5 100644
--- a/api/src/com/cloud/network/lb/LoadBalancingRule.java
+++ b/api/src/com/cloud/network/lb/LoadBalancingRule.java
@@ -32,11 +32,14 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
     private List<LbDestination> destinations;
     private List<LbStickinessPolicy> stickinessPolicies;
     private LbAutoScaleVmGroup autoScaleVmGroup;
+    private List<LbHealthCheckPolicy> healthCheckPolicies;
 
-    public LoadBalancingRule(LoadBalancer lb, List<LbDestination> destinations, List<LbStickinessPolicy> stickinessPolicies) {
+    public LoadBalancingRule(LoadBalancer lb, List<LbDestination> destinations,
+            List<LbStickinessPolicy> stickinessPolicies, List<LbHealthCheckPolicy> healthCheckPolicies) {
         this.lb = lb;
         this.destinations = destinations;
         this.stickinessPolicies = stickinessPolicies;
+        this.healthCheckPolicies = healthCheckPolicies;
     }
 
     @Override
@@ -136,11 +139,17 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
         return stickinessPolicies;
     }
 
+    public List<LbHealthCheckPolicy> getHealthCheckPolicies() {
+        return healthCheckPolicies;
+    }
 
     public interface Destination {
         String getIpAddress();
+
         int getDestinationPortStart();
+
         int getDestinationPortEnd();
+
         boolean isRevoked();
     }
 
@@ -174,6 +183,64 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
         }
     }
 
+    public static class LbHealthCheckPolicy {
+        private String pingpath;
+        private String description;
+        private int responseTime;
+        private int healthcheckInterval;
+        private int healthcheckThresshold;
+        private int unhealthThresshold;
+        private boolean _revoke;
+
+        public LbHealthCheckPolicy(String pingpath, String description, int responseTime, int healthcheckInterval,
+                int healthcheckThresshold, int unhealthThresshold) {
+            this(pingpath, description, responseTime, healthcheckInterval, healthcheckThresshold, unhealthThresshold, false);
+        }
+
+        public LbHealthCheckPolicy(String pingpath, String description, int responseTime, int healthcheckInterval,
+                int healthcheckThresshold, int unhealthThresshold, boolean revoke) {
+            this.pingpath = pingpath;
+            this.description = description;
+            this.responseTime = responseTime;
+            this.healthcheckInterval = healthcheckInterval;
+            this.healthcheckThresshold = healthcheckThresshold;
+            this.unhealthThresshold = unhealthThresshold;
+            this._revoke = revoke;
+        }
+
+        public LbHealthCheckPolicy() {
+        }
+
+        public String getpingpath() {
+            return pingpath;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public int getResponseTime() {
+            return responseTime;
+        }
+
+        public int getHealthcheckInterval() {
+            return healthcheckInterval;
+        }
+
+        public int getHealthcheckThresshold() {
+            return healthcheckThresshold;
+        }
+
+        public int getUnhealthThresshold() {
+            return unhealthThresshold;
+        }
+
+        public boolean isRevoked() {
+            return _revoke;
+        }
+
+    }
+
     public static class LbDestination implements Destination {
         private int portStart;
         private int portEnd;
@@ -191,10 +258,12 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
         public String getIpAddress() {
             return ip;
         }
+
         @Override
         public int getDestinationPortStart() {
             return portStart;
         }
+
         @Override
         public int getDestinationPortEnd() {
             return portEnd;
@@ -230,15 +299,16 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
         return null;
     }
 
-
     @Override
     public TrafficType getTrafficType() {
         return null;
     }
+
     @Override
     public FirewallRuleType getType() {
         return FirewallRuleType.User;
     }
+
     public LbAutoScaleVmGroup getAutoScaleVmGroup() {
         return autoScaleVmGroup;
     }
@@ -274,8 +344,7 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
         private final AutoScalePolicy policy;
         private boolean revoked;
 
-        public LbAutoScalePolicy(AutoScalePolicy policy, List<LbCondition> conditions)
-        {
+        public LbAutoScalePolicy(AutoScalePolicy policy, List<LbCondition> conditions) {
             this.policy = policy;
             this.conditions = conditions;
         }
@@ -309,7 +378,9 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
         private final String networkId;
         private final String vmName;
 
-        public LbAutoScaleVmProfile(AutoScaleVmProfile profile, String autoScaleUserApiKey, String autoScaleUserSecretKey, String csUrl, String zoneId, String domainId, String serviceOfferingId, String templateId, String vmName, String networkId) {
+        public LbAutoScaleVmProfile(AutoScaleVmProfile profile, String autoScaleUserApiKey,
+                String autoScaleUserSecretKey, String csUrl, String zoneId, String domainId, String serviceOfferingId,
+                String templateId, String vmName, String networkId) {
             this.profile = profile;
             this.autoScaleUserApiKey = autoScaleUserApiKey;
             this.autoScaleUserSecretKey = autoScaleUserSecretKey;
@@ -369,7 +440,8 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
         private final LbAutoScaleVmProfile profile;
         private final String currentState;
 
-        public LbAutoScaleVmGroup(AutoScaleVmGroup vmGroup, List<LbAutoScalePolicy> policies, LbAutoScaleVmProfile profile, String currentState) {
+        public LbAutoScaleVmGroup(AutoScaleVmGroup vmGroup, List<LbAutoScalePolicy> policies,
+                LbAutoScaleVmProfile profile, String currentState) {
             this.vmGroup = vmGroup;
             this.policies = policies;
             this.profile = profile;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/com/cloud/network/lb/LoadBalancingRulesService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java
index 3743aae..ed39bed 100644
--- a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java
+++ b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java
@@ -18,8 +18,10 @@ package com.cloud.network.lb;
 
 import java.util.List;
 
+import org.apache.cloudstack.api.command.user.loadbalancer.CreateLBHealthCheckPolicyCmd;
 import org.apache.cloudstack.api.command.user.loadbalancer.CreateLBStickinessPolicyCmd;
 import org.apache.cloudstack.api.command.user.loadbalancer.CreateLoadBalancerRuleCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.ListLBHealthCheckPoliciesCmd;
 import org.apache.cloudstack.api.command.user.loadbalancer.ListLBStickinessPoliciesCmd;
 import org.apache.cloudstack.api.command.user.loadbalancer.ListLoadBalancerRuleInstancesCmd;
 import org.apache.cloudstack.api.command.user.loadbalancer.ListLoadBalancerRulesCmd;
@@ -28,6 +30,8 @@ import org.apache.cloudstack.api.command.user.loadbalancer.UpdateLoadBalancerRul
 import com.cloud.exception.InsufficientAddressCapacityException;
 import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
+import com.cloud.network.rules.HealthCheckPolicy;
 import com.cloud.network.rules.LoadBalancer;
 import com.cloud.network.rules.StickinessPolicy;
 import com.cloud.uservm.UserVm;
@@ -66,6 +70,22 @@ public interface LoadBalancingRulesService {
     public boolean applyLBStickinessPolicy(CreateLBStickinessPolicyCmd cmd) throws ResourceUnavailableException;
 
     boolean deleteLBStickinessPolicy(long stickinessPolicyId, boolean apply);
+
+    /**
+     * Create a healthcheck policy to a load balancer from the given healthcheck
+     * parameters in (name,value) pairs.
+     *
+     * @param cmd
+     *            the command specifying the stickiness method name, params
+     *            (name,value pairs), policy name and description.
+     * @return the newly created stickiness policy if successfull, null
+     *         otherwise
+     * @thows NetworkRuleConflictException
+     */
+    public HealthCheckPolicy createLBHealthCheckPolicy(CreateLBHealthCheckPolicyCmd cmd);
+    public boolean applyLBHealthCheckPolicy(CreateLBHealthCheckPolicyCmd cmd) throws ResourceUnavailableException;
+    boolean deleteLBHealthCheckPolicy(long healthCheckPolicyId, boolean apply);
+
     /**
      * Assign a virtual machine, or list of virtual machines, to a load balancer.
      */
@@ -104,8 +124,18 @@ public interface LoadBalancingRulesService {
      */
     List<? extends StickinessPolicy> searchForLBStickinessPolicies(ListLBStickinessPoliciesCmd cmd);
 
+    /**
+     * List healthcheck policies based on the given criteria
+     *
+     * @param cmd
+     *            the command specifies the load balancing rule id.
+     * @return list of healthcheck policies that match the criteria.
+     */
+
+    List<? extends HealthCheckPolicy> searchForLBHealthCheckPolicies(ListLBHealthCheckPoliciesCmd cmd);
+
     List<LoadBalancingRule> listByNetworkId(long networkId);
 
     LoadBalancer findById(long LoadBalancer);
-
+   public void updateLBHealthChecks() throws ResourceUnavailableException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/com/cloud/network/rules/HealthCheckPolicy.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/rules/HealthCheckPolicy.java b/api/src/com/cloud/network/rules/HealthCheckPolicy.java
new file mode 100644
index 0000000..96bb282
--- /dev/null
+++ b/api/src/com/cloud/network/rules/HealthCheckPolicy.java
@@ -0,0 +1,45 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.network.rules;
+
+import java.util.List;
+
+import com.cloud.utils.Pair;
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+/**
+ */
+public interface HealthCheckPolicy extends InternalIdentity, Identity {
+
+    public long getLoadBalancerId();
+
+    public String getpingpath();
+
+    public String getDescription();
+
+    public int getResponseTime();
+
+    public int getHealthcheckInterval();
+
+    public int getHealthcheckThresshold();
+
+    public int getUnhealthThresshold();
+
+    public boolean isRevoke();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/org/apache/cloudstack/api/ApiConstants.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java
index b40b26c..f4c6c52 100755
--- a/api/src/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/org/apache/cloudstack/api/ApiConstants.java
@@ -460,6 +460,11 @@ public class ApiConstants {
     public static final String UCS_BLADE_ID = "bladeid";
     public static final String VM_GUEST_IP = "vmguestip";
     public static final String OLDER_THAN = "olderthan";
+    public static final String HEALTHCHECK_RESPONSE_TIMEOUT = "responsetimeout";
+    public static final String HEALTHCHECK_INTERVAL_TIME = "intervaltime";
+    public static final String HEALTHCHECK_HEALTHY_THRESHOLD = "healthythreshold";
+    public static final String HEALTHCHECK_UNHEALTHY_THRESHOLD = "unhealthythreshold";
+    public static final String HEALTHCHECK_PINGPATH = "pingpath";
 
     public enum HostDetails {
         all, capacity, events, stats, min;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/org/apache/cloudstack/api/ResponseGenerator.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
index a602514..628a185 100644
--- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
+++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
@@ -47,6 +47,7 @@ import org.apache.cloudstack.api.response.HypervisorCapabilitiesResponse;
 import org.apache.cloudstack.api.response.IPAddressResponse;
 import org.apache.cloudstack.api.response.InstanceGroupResponse;
 import org.apache.cloudstack.api.response.IpForwardingRuleResponse;
+import org.apache.cloudstack.api.response.LBHealthCheckResponse;
 import org.apache.cloudstack.api.response.LBStickinessResponse;
 import org.apache.cloudstack.api.response.LDAPConfigResponse;
 import org.apache.cloudstack.api.response.LoadBalancerResponse;
@@ -133,6 +134,7 @@ import com.cloud.network.as.Condition;
 import com.cloud.network.as.Counter;
 import com.cloud.network.router.VirtualRouter;
 import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.HealthCheckPolicy;
 import com.cloud.network.rules.LoadBalancer;
 import com.cloud.network.rules.PortForwardingRule;
 import com.cloud.network.rules.StaticNatRule;
@@ -213,6 +215,11 @@ public interface ResponseGenerator {
 
     LBStickinessResponse createLBStickinessPolicyResponse(StickinessPolicy stickinessPolicy, LoadBalancer lb);
 
+    LBHealthCheckResponse createLBHealthCheckPolicyResponse(List<? extends HealthCheckPolicy> healthcheckPolicies,
+            LoadBalancer lb);
+
+    LBHealthCheckResponse createLBHealthCheckPolicyResponse(HealthCheckPolicy healthcheckPolicy, LoadBalancer lb);
+
     PodResponse createPodResponse(Pod pod, Boolean showCapacities);
 
     ZoneResponse createZoneResponse(DataCenter dataCenter, Boolean showCapacities);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLBHealthCheckPolicyCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLBHealthCheckPolicyCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLBHealthCheckPolicyCmd.java
new file mode 100644
index 0000000..ac0ec3a
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLBHealthCheckPolicyCmd.java
@@ -0,0 +1,168 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api.command.user.loadbalancer;
+
+
+import org.apache.cloudstack.api.response.FirewallRuleResponse;
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCreateCmd;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.rules.HealthCheckPolicy;
+import org.apache.cloudstack.api.response.LBHealthCheckResponse;
+import com.cloud.network.rules.LoadBalancer;
+import com.cloud.user.Account;
+import com.cloud.user.UserContext;
+
+
+@APICommand(name = "createLBHealthCheckPolicy", description = "Creates a Load Balancer healthcheck policy ", responseObject = LBHealthCheckResponse.class, since="4.2.0")
+@SuppressWarnings("rawtypes")
+public class CreateLBHealthCheckPolicyCmd extends BaseAsyncCreateCmd {
+    public static final Logger s_logger = Logger
+            .getLogger(CreateLBHealthCheckPolicyCmd.class.getName());
+
+    private static final String s_name = "createlbhealthcheckpolicyresponse";
+
+    // ///////////////////////////////////////////////////
+    // ////////////// API parameters /////////////////////
+    // ///////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = FirewallRuleResponse.class, required = true, description = "the ID of the load balancer rule")
+    private Long lbRuleId;
+
+    @Parameter(name = ApiConstants.DESCRIPTION, type = CommandType.STRING, description = "the description of the load balancer HealthCheck policy")
+    private String description;
+
+    @Parameter(name = ApiConstants.HEALTHCHECK_PINGPATH, type = CommandType.STRING, required = false, description = "HTTP Ping Path")
+    private String pingPath;
+
+    @Parameter(name = ApiConstants.HEALTHCHECK_RESPONSE_TIMEOUT, type = CommandType.INTEGER, required = false, description = "Time to wait when receiving a response from the health check (2sec - 60 sec)")
+    private int responsTimeOut;
+
+    @Parameter(name = ApiConstants.HEALTHCHECK_INTERVAL_TIME, type = CommandType.INTEGER, required = false, description = "Amount of time between health checks (1 sec - 20940 sec)")
+    private int healthCheckInterval;
+
+    @Parameter(name = ApiConstants.HEALTHCHECK_HEALTHY_THRESHOLD, type = CommandType.INTEGER, required = false, description = "Number of consecutive health check success before declaring an instance healthy")
+    private int healthyThreshold;
+
+    @Parameter(name = ApiConstants.HEALTHCHECK_UNHEALTHY_THRESHOLD, type = CommandType.INTEGER, required = false, description = "Number of consecutive health check failures before declaring an instance unhealthy")
+    private int unhealthyThreshold;
+
+    // ///////////////////////////////////////////////////
+    // ///////////////// Accessors ///////////////////////
+    // ///////////////////////////////////////////////////
+
+    public Long getLbRuleId() {
+        return lbRuleId;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public String getPingPath() {
+        return pingPath;
+    }
+
+    // ///////////////////////////////////////////////////
+    // ///////////// API Implementation///////////////////
+    // ///////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        Account account = UserContext.current().getCaller();
+        if (account != null) {
+            return account.getId();
+        }
+
+        return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked
+    }
+
+    public int getResponsTimeOut() {
+        return responsTimeOut;
+    }
+
+    public int getHealthCheckInterval() {
+        return healthCheckInterval;
+    }
+
+    public int getHealthyThreshold() {
+        return healthyThreshold;
+    }
+
+    public int getUnhealthyThreshold() {
+        return unhealthyThreshold;
+    }
+
+	@Override
+    public void execute() throws ResourceAllocationException, ResourceUnavailableException {
+        HealthCheckPolicy policy = null;
+        boolean success = false;
+
+        try {
+            UserContext.current().setEventDetails("Load balancer healthcheck policy Id : " + getEntityId());
+            success = _lbService.applyLBHealthCheckPolicy(this);
+            if (success) {
+                // State might be different after the rule is applied, so get new object here
+                policy = _entityMgr.findById(HealthCheckPolicy.class, getEntityId());
+                LoadBalancer lb = _lbService.findById(policy.getLoadBalancerId());
+                LBHealthCheckResponse hcResponse = _responseGenerator.createLBHealthCheckPolicyResponse(policy, lb);
+                setResponseObject(hcResponse);
+                hcResponse.setResponseName(getCommandName());
+            }
+        } finally {
+            if (!success || (policy == null)) {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create healthcheck policy ");
+            }
+        }
+    }
+
+    @Override
+    public void create() {
+        try {
+            HealthCheckPolicy result = _lbService.createLBHealthCheckPolicy(this);
+            this.setEntityId(result.getId());
+            this.setEntityUuid(result.getUuid());
+        } catch (InvalidParameterValueException e) {
+            s_logger.warn("Exception: ", e);
+            throw new ServerApiException(ApiErrorCode.MALFORMED_PARAMETER_ERROR , e.getMessage());
+        }
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_LB_HEALTHCHECKPOLICY_CREATE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "Create Load Balancer HealthCheck policy";
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteLBHealthCheckPolicyCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteLBHealthCheckPolicyCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteLBHealthCheckPolicyCmd.java
new file mode 100644
index 0000000..bf91da5
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteLBHealthCheckPolicyCmd.java
@@ -0,0 +1,116 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api.command.user.loadbalancer;
+
+import org.apache.cloudstack.api.response.LBHealthCheckResponse;
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.network.rules.HealthCheckPolicy;
+import com.cloud.network.rules.LoadBalancer;
+import com.cloud.user.Account;
+import com.cloud.user.UserContext;
+
+@APICommand(name = "deleteLBHealthCheckPolicy", description = "Deletes a load balancer HealthCheck policy.", responseObject = SuccessResponse.class, since="4.2.0")
+public class DeleteLBHealthCheckPolicyCmd extends BaseAsyncCmd {
+    public static final Logger s_logger = Logger.getLogger(DeleteLBHealthCheckPolicyCmd.class.getName());
+    private static final String s_name = "deletelbhealthcheckpolicyresponse";
+    // ///////////////////////////////////////////////////
+    // ////////////// API parameters /////////////////////
+    // ///////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = LBHealthCheckResponse.class,
+            required = true, description = "the ID of the load balancer HealthCheck policy")
+    private Long id;
+
+    // ///////////////////////////////////////////////////
+    // ///////////////// Accessors ///////////////////////
+    // ///////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    // ///////////////////////////////////////////////////
+    // ///////////// API Implementation///////////////////
+    // ///////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        Account account = UserContext.current().getCaller();
+        if (account != null) {
+            return account.getId();
+        }
+
+        return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_LB_HEALTHCHECKPOLICY_DELETE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "deleting load balancer HealthCheck policy: " + getId();
+    }
+
+    @Override
+    public void execute() {
+        UserContext.current().setEventDetails("Load balancer healthcheck policy Id: " + getId());
+        boolean result = _lbService.deleteLBHealthCheckPolicy(getId() , true);
+
+        if (result) {
+            SuccessResponse response = new SuccessResponse(getCommandName());
+            this.setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete load balancer healthcheck policy");
+        }
+    }
+
+    @Override
+    public String getSyncObjType() {
+        return BaseAsyncCmd.networkSyncObject;
+    }
+
+    @Override
+    public Long getSyncObjId() {
+        HealthCheckPolicy policy = _entityMgr.findById(HealthCheckPolicy.class,
+                getId());
+        if (policy == null) {
+            throw new InvalidParameterValueException("Unable to find load balancer healthcheck rule: " + id);
+        }
+        LoadBalancer lb = _lbService.findById(policy.getLoadBalancerId());
+        if (lb == null) {
+            throw new InvalidParameterValueException("Unable to find load balancer rule for healthcheck rule: " + id);
+        }
+        return lb.getNetworkId();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLBHealthCheckPoliciesCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLBHealthCheckPoliciesCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLBHealthCheckPoliciesCmd.java
new file mode 100644
index 0000000..cf5ea32
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLBHealthCheckPoliciesCmd.java
@@ -0,0 +1,85 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api.command.user.loadbalancer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.response.FirewallRuleResponse;
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseListCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.response.LBHealthCheckResponse;
+import org.apache.cloudstack.api.response.LBStickinessResponse;
+import org.apache.cloudstack.api.response.ListResponse;
+
+import com.cloud.network.rules.HealthCheckPolicy;
+import com.cloud.network.rules.LoadBalancer;
+import com.cloud.user.Account;
+import com.cloud.user.UserContext;
+
+@APICommand(name = "listLBHealthCheckPolicies", description = "Lists load balancer HealthCheck policies.", responseObject = LBHealthCheckResponse.class, since="4.2.0")
+public class ListLBHealthCheckPoliciesCmd extends BaseListCmd {
+    public static final Logger s_logger = Logger
+            .getLogger(ListLBHealthCheckPoliciesCmd.class.getName());
+
+    private static final String s_name = "listlbhealthcheckpoliciesresponse";
+
+    // ///////////////////////////////////////////////////
+    // ////////////// API parameters /////////////////////
+    // ///////////////////////////////////////////////////
+    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = FirewallRuleResponse.class,
+            required = true, description = "the ID of the load balancer rule")
+    private Long lbRuleId;
+
+    // ///////////////////////////////////////////////////
+    // ///////////////// Accessors ///////////////////////
+    // ///////////////////////////////////////////////////
+    public Long getLbRuleId() {
+        return lbRuleId;
+    }
+
+    // ///////////////////////////////////////////////////
+    // ///////////// API Implementation///////////////////
+    // ///////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public void execute() {
+        List<LBHealthCheckResponse> hcpResponses = new ArrayList<LBHealthCheckResponse>();
+        LoadBalancer lb = _lbService.findById(getLbRuleId());
+        ListResponse<LBHealthCheckResponse> response = new ListResponse<LBHealthCheckResponse>();
+
+        if (lb != null) {
+            List<? extends HealthCheckPolicy> healthCheckPolicies = _lbService.searchForLBHealthCheckPolicies(this);
+            LBHealthCheckResponse spResponse = _responseGenerator.createLBHealthCheckPolicyResponse(healthCheckPolicies, lb);
+            hcpResponses.add(spResponse);
+            response.setResponses(hcpResponses);
+        }
+
+        response.setResponseName(getCommandName());
+        this.setResponseObject(response);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/org/apache/cloudstack/api/response/LBHealthCheckPolicyResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/LBHealthCheckPolicyResponse.java b/api/src/org/apache/cloudstack/api/response/LBHealthCheckPolicyResponse.java
new file mode 100644
index 0000000..5dd123c
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/LBHealthCheckPolicyResponse.java
@@ -0,0 +1,98 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api.response;
+
+import com.cloud.network.rules.HealthCheckPolicy;
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+import org.apache.cloudstack.api.BaseResponse;
+
+public class LBHealthCheckPolicyResponse extends BaseResponse {
+    @SerializedName("id")
+    @Param(description = "the LB HealthCheck policy ID")
+    private String id;
+
+    @SerializedName("pingpath")
+    @Param(description = "the pingpath  of the healthcheck policy")
+    private String pingpath;
+
+    @SerializedName("description")
+    @Param(description = "the description of the healthcheck policy")
+    private String description;
+
+    @SerializedName("state")
+    @Param(description = "the state of the policy")
+    private String state;
+
+    @SerializedName("responsetime")
+    @Param(description = "Time to wait when receiving a response from the health check")
+    private int responseTime;
+
+    @SerializedName("healthcheckinterval")
+    @Param(description = "Amount of time between health checks")
+    private int healthcheckInterval;
+
+    @SerializedName("healthcheckthresshold")
+    @Param(description = "Number of consecutive health check success before declaring an instance healthy")
+    private int healthcheckthresshold;
+
+    @SerializedName("unhealthcheckthresshold")
+    @Param(description = "Number of consecutive health check failures before declaring an instance unhealthy.")
+    private int unhealthcheckthresshold;
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getpingpath() {
+        return pingpath;
+    }
+
+    public void setpingpath(String pingpath) {
+        this.pingpath = pingpath;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public LBHealthCheckPolicyResponse(HealthCheckPolicy healthcheckpolicy) {
+        if (healthcheckpolicy.isRevoke()) {
+            this.setState("Revoked");
+        }
+        if (healthcheckpolicy.getUuid() != null)
+            setId(healthcheckpolicy.getUuid());
+        this.pingpath = healthcheckpolicy.getpingpath();
+        this.healthcheckInterval = healthcheckpolicy.getHealthcheckInterval();
+        this.responseTime = healthcheckpolicy.getResponseTime();
+        this.healthcheckthresshold = healthcheckpolicy.getHealthcheckThresshold();
+        this.unhealthcheckthresshold = healthcheckpolicy.getUnhealthThresshold();
+        setObjectName("healthcheckpolicy");
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/api/src/org/apache/cloudstack/api/response/LBHealthCheckResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/LBHealthCheckResponse.java b/api/src/org/apache/cloudstack/api/response/LBHealthCheckResponse.java
new file mode 100644
index 0000000..182013f
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/LBHealthCheckResponse.java
@@ -0,0 +1,102 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api.response;
+
+import com.cloud.network.rules.HealthCheckPolicy;
+import org.apache.cloudstack.api.ApiConstants;
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.EntityReference;
+
+import java.util.List;
+import java.util.UUID;
+
+@EntityReference(value=HealthCheckPolicy.class)
+public class LBHealthCheckResponse extends BaseResponse {
+@SerializedName("lbruleid")
+    @Param(description = "the LB rule ID")
+    private String lbRuleId;
+
+
+    @SerializedName("account")
+    @Param(description = "the account of the HealthCheck policy")
+    private String accountName;
+
+    @SerializedName(ApiConstants.DOMAIN_ID)
+    @Param(description = "the domain ID of the HealthCheck policy")
+    private String domainId;
+
+    @SerializedName("domain")
+    @Param(description = "the domain of the HealthCheck policy")
+    private String domainName;
+
+    @SerializedName(ApiConstants.ZONE_ID)
+    @Param(description = "the id of the zone the HealthCheck policy belongs to")
+    private String zoneId;
+
+    @SerializedName("healthcheckpolicy")
+    @Param(description = "the list of healthcheckpolicies", responseObject = LBHealthCheckPolicyResponse.class)
+    private List<LBHealthCheckPolicyResponse> healthCheckPolicies;
+
+    public void setlbRuleId(String lbRuleId) {
+        this.lbRuleId = lbRuleId;
+    }
+
+    public void setRules(List<LBHealthCheckPolicyResponse> policies) {
+        this.healthCheckPolicies = policies;
+    }
+
+    public List<LBHealthCheckPolicyResponse> getHealthCheckPolicies() {
+        return healthCheckPolicies;
+    }
+
+    public void setHealthCheckPolicies(List<LBHealthCheckPolicyResponse> healthCheckPolicies) {
+        this.healthCheckPolicies = healthCheckPolicies;
+    }
+
+    public String getAccountName() {
+        return accountName;
+    }
+
+    public void setAccountName(String accountName) {
+        this.accountName = accountName;
+    }
+
+    public void setDomainId(String domainId) {
+        this.domainId = domainId;
+    }
+
+    public void setZoneId(String zoneId) {
+        this.zoneId = zoneId;
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+
+    public void setDomainName(String domainName) {
+        this.domainName = domainName;
+    }
+
+    public LBHealthCheckResponse() {
+    }
+
+    public LBHealthCheckResponse(HealthCheckPolicy healthcheckpolicy) {
+        setObjectName("healthcheckpolicy");
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in
index 5018236..382573b 100644
--- a/client/tomcatconf/commands.properties.in
+++ b/client/tomcatconf/commands.properties.in
@@ -151,6 +151,9 @@ createLBStickinessPolicy=15
 deleteLBStickinessPolicy=15
 listLoadBalancerRules=15
 listLBStickinessPolicies=15
+listLBHealthCheckPolicies=15
+createLBHealthCheckPolicy=15
+deleteLBHealthCheckPolicy=15
 listLoadBalancerRuleInstances=15
 updateLoadBalancerRule=15
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/plugins/network-elements/dns-notifier/resources/components-example.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/dns-notifier/resources/components-example.xml b/plugins/network-elements/dns-notifier/resources/components-example.xml
index 36441bd..3a92a25 100755
--- a/plugins/network-elements/dns-notifier/resources/components-example.xml
+++ b/plugins/network-elements/dns-notifier/resources/components-example.xml
@@ -155,6 +155,8 @@ under the License.
         </adapters>
         <manager name="OvsTunnelManager" key="com.cloud.network.ovs.OvsTunnelManager" class="com.cloud.network.ovs.OvsTunnelManagerImpl"/>
         <manager name="ElasticLoadBalancerManager" key="com.cloud.network.lb.ElasticLoadBalancerManager" class="com.cloud.network.lb.ElasticLoadBalancerManagerImpl"/>
+        <manager name="LBHealthCheckManager" key="com.cloud.network.lb.LBHealthCheckManager" class="com.cloud.network.lb.LBHealthCheckManagerImpl"/>
+        <pluggableservice name="ApiDiscoveryService" key="org.apache.cloudstack.discovery.ApiDiscoveryService" class="org.apache.cloudstack.discovery.ApiDiscoveryServiceImpl"/>
         <pluggableservice name="VirtualRouterElementService" key="com.cloud.network.element.VirtualRouterElementService" class="com.cloud.network.element.VirtualRouterElement"/>
         <pluggableservice name="NiciraNvpElementService" key="com.cloud.network.element.NiciraNvpElementService" class="com.cloud.network.element.NiciraNvpElement"/>
         <dao name="OvsTunnelInterfaceDao" class="com.cloud.network.ovs.dao.OvsTunnelInterfaceDaoImpl" singleton="false"/>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/element/ElasticLoadBalancerElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/element/ElasticLoadBalancerElement.java b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/element/ElasticLoadBalancerElement.java
index abb36c3..bebba3c 100644
--- a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/element/ElasticLoadBalancerElement.java
+++ b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/element/ElasticLoadBalancerElement.java
@@ -28,6 +28,7 @@ import javax.naming.ConfigurationException;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
+import com.cloud.agent.api.to.LoadBalancerTO;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.dao.ConfigurationDao;
 import com.cloud.deploy.DeployDestination;
@@ -197,4 +198,10 @@ public class ElasticLoadBalancerElement extends AdapterBase implements LoadBalan
     public IpDeployer getIpDeployer(Network network) {
         return this;
     }
+
+    @Override
+    public List<LoadBalancerTO> updateHealthChecks(Network network, List<LoadBalancingRule> lbrules) {
+        return null;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
index 81039d1..283b517 100644
--- a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
+++ b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
@@ -94,6 +94,7 @@ import com.cloud.network.dao.NetworkVO;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 import com.cloud.network.dao.VirtualRouterProviderDao;
 import com.cloud.network.lb.LoadBalancingRule.LbDestination;
+import com.cloud.network.lb.LoadBalancingRule.LbHealthCheckPolicy;
 import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
 import com.cloud.network.lb.dao.ElasticLbVmMapDao;
 import com.cloud.network.router.VirtualRouter;
@@ -367,9 +368,10 @@ ElasticLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
             for (LoadBalancerVO lb : lbs) {
                 List<LbDestination> dstList = _lbMgr.getExistingDestinations(lb.getId());
                 List<LbStickinessPolicy> policyList = _lbMgr.getStickinessPolicies(lb.getId());
+                List<LbHealthCheckPolicy> hcPolicyList = _lbMgr.getHealthCheckPolicies(lb.getId());
                 LoadBalancingRule loadBalancing = new LoadBalancingRule(
-                        lb, dstList, policyList);
-                lbRules.add(loadBalancing); 
+                        lb, dstList, policyList, hcPolicyList);
+                lbRules.add(loadBalancing);
             }
             return applyLBRules(elbVm, lbRules, network.getId());
         } else if (elbVm.getState() == State.Stopped
@@ -940,7 +942,8 @@ ElasticLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
         for (LoadBalancerVO lb : lbs) {
             List<LbDestination> dstList = _lbMgr.getExistingDestinations(lb.getId());
             List<LbStickinessPolicy> policyList = _lbMgr.getStickinessPolicies(lb.getId());
-            LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList);
+            List<LbHealthCheckPolicy> hcPolicyList = _lbMgr.getHealthCheckPolicies(lb.getId());
+            LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList);
             lbRules.add(loadBalancing);
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/plugins/network-elements/f5/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/f5/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java b/plugins/network-elements/f5/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java
index 94c098e..3e75c3f 100644
--- a/plugins/network-elements/f5/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java
+++ b/plugins/network-elements/f5/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java
@@ -29,6 +29,7 @@ import org.apache.cloudstack.api.response.ExternalLoadBalancerResponse;
 import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
 import org.apache.log4j.Logger;
 
+import com.cloud.agent.api.to.LoadBalancerTO;
 import com.cloud.api.ApiDBUtils;
 import com.cloud.api.commands.AddExternalLoadBalancerCmd;
 import com.cloud.api.commands.AddF5LoadBalancerCmd;
@@ -496,4 +497,11 @@ public class F5ExternalLoadBalancerElement extends ExternalLoadBalancerDeviceMan
         }
         return this;
     }
+
+	@Override
+	public List<LoadBalancerTO> updateHealthChecks(Network network,
+			List<LoadBalancingRule> lbrules) {
+		// TODO Auto-generated method stub
+		return null;
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/183b989d/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
index c1c735a..a90440c 100644
--- a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
+++ b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
@@ -292,7 +292,8 @@ StaticNatServiceProvider {
         lbCapabilities.put(Capability.SupportedStickinessMethods, stickyMethodList);
 
         lbCapabilities.put(Capability.ElasticLb, "true");
-
+        //Setting HealthCheck Capability to True for Netscaler element
+        lbCapabilities.put(Capability.HealthCheckPolicy, "true");
         capabilities.put(Service.Lb, lbCapabilities);
 
         Map<Capability, String> staticNatCapabilities = new HashMap<Capability, String>();
@@ -814,4 +815,26 @@ StaticNatServiceProvider {
         }
         return null;
     }
+
+    @Override
+    public List<LoadBalancerTO> updateHealthChecks(Network network, List<LoadBalancingRule> lbrules) {
+
+        if (canHandle(network, Service.Lb)) {
+            try {
+                return getLBHealthChecks(network, lbrules);
+            } catch (ResourceUnavailableException e) {
+                s_logger.error("Error in getting the LB Rules from NetScaler " + e);
+            }
+        } else {
+            s_logger.error("Network cannot handle to LB service ");
+        }
+        return null;
+    }
+
+    @Override
+    public List<LoadBalancerTO> getLBHealthChecks(Network network, List<? extends FirewallRule> rules)
+            throws ResourceUnavailableException {
+        return super.getLBHealthChecks(network, rules);
+
+    }
 }


Mime
View raw message