You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by we...@apache.org on 2013/07/05 11:33:36 UTC

[2/2] git commit: updated refs/heads/4.1 to 7755986

CLOUDSTACK-3345: createLBStickinessPolicy replaces old stickiness policy if exists


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

Branch: refs/heads/4.1
Commit: 7755986652636c9571a0702b1f485bebd2e25c58
Parents: e92c5b0
Author: Wei Zhou <w....@leaseweb.com>
Authored: Fri Jul 5 11:33:25 2013 +0200
Committer: Wei Zhou <w....@leaseweb.com>
Committed: Fri Jul 5 11:33:25 2013 +0200

----------------------------------------------------------------------
 .../lb/LoadBalancingRulesManagerImpl.java       | 44 +++++++++++---
 ui/scripts/lbStickyPolicy.js                    | 63 +++++++++-----------
 2 files changed, 63 insertions(+), 44 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/77559866/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
index a016cbc..0e68e61 100755
--- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
+++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
@@ -451,9 +451,9 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         }
 
         /* Validation : check for the multiple policies to the rule id */
-        List<LBStickinessPolicyVO> stickinessPolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(cmd.getLbRuleId(), false);
-        if (stickinessPolicies.size() > 0) {
-            throw new InvalidParameterValueException("Failed to create Stickiness policy: Already policy attached " + cmd.getLbRuleId());
+        List<LBStickinessPolicyVO> stickinessPolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(cmd.getLbRuleId());
+        if (stickinessPolicies.size() > 1) {
+            throw new InvalidParameterValueException("Failed to create Stickiness policy: Already two policies attached " + cmd.getLbRuleId());
         }
         return true;
     }
@@ -518,14 +518,25 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
     @ActionEvent(eventType = EventTypes.EVENT_LB_STICKINESSPOLICY_CREATE, eventDescription = "Apply Stickinesspolicy to load balancer ", async = true)
     public boolean applyLBStickinessPolicy(CreateLBStickinessPolicyCmd cmd) {
         boolean success = true;
+        FirewallRule.State backupState = null;
+        long oldStickinessPolicyId = 0;
 
         LoadBalancerVO loadBalancer = _lbDao.findById(cmd.getLbRuleId());
         if (loadBalancer == null) {
             throw new InvalidParameterException("Invalid Load balancer Id:"  + cmd.getLbRuleId());
         }
-        FirewallRule.State backupState = loadBalancer.getState();
-        loadBalancer.setState(FirewallRule.State.Add);
-        _lbDao.persist(loadBalancer);
+        List<LBStickinessPolicyVO> stickinessPolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(cmd.getLbRuleId(), false);
+        for (LBStickinessPolicyVO stickinessPolicy: stickinessPolicies) {
+            if (stickinessPolicy.getId() == cmd.getEntityId()) {
+                backupState = loadBalancer.getState();
+                loadBalancer.setState(FirewallRule.State.Add);
+                _lbDao.persist(loadBalancer);
+            } else {
+                oldStickinessPolicyId = stickinessPolicy.getId();
+                stickinessPolicy.setRevoke(true);
+                _lb2stickinesspoliciesDao.persist(stickinessPolicy);
+            }
+        }
         try {
             applyLoadBalancerConfig(cmd.getLbRuleId());
         } catch (ResourceUnavailableException e) {
@@ -534,8 +545,23 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                 loadBalancer.setState(backupState);
                 _lbDao.persist(loadBalancer);
                 s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + " lb state rolback while creating sticky policy");
+                deleteLBStickinessPolicy(cmd.getEntityId(), false);
+            } else {
+                deleteLBStickinessPolicy(cmd.getEntityId(), false);
+                if (oldStickinessPolicyId != 0) {
+                    LBStickinessPolicyVO stickinessPolicy = _lb2stickinesspoliciesDao.findById(oldStickinessPolicyId);
+                    stickinessPolicy.setRevoke(false);
+                    _lb2stickinesspoliciesDao.persist(stickinessPolicy);
+                    try {
+                        if (backupState.equals(FirewallRule.State.Active))
+                            applyLoadBalancerConfig(cmd.getLbRuleId());
+                    } catch (ResourceUnavailableException e1) {
+                    } finally {
+                        loadBalancer.setState(backupState);
+                        _lbDao.persist(loadBalancer);
+                    }
+                }
             }
-            deleteLBStickinessPolicy(cmd.getEntityId(), false);
             success = false;
         }
 
@@ -590,7 +616,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                 success = false;
             }
         } else {
-            _lb2stickinesspoliciesDao.remove(stickinessPolicy.getLoadBalancerId());
+            _lb2stickinesspoliciesDao.expunge(stickinessPolicyId);
         }
 
         return success;
@@ -1322,7 +1348,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
     @Override
     public List<LbStickinessPolicy> getStickinessPolicies(long lbId) {
         List<LbStickinessPolicy> stickinessPolicies = new ArrayList<LbStickinessPolicy>();
-        List<LBStickinessPolicyVO> sDbpolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(lbId);
+        List<LBStickinessPolicyVO> sDbpolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(lbId, false);
 
         for (LBStickinessPolicyVO sDbPolicy : sDbpolicies) {
             LbStickinessPolicy sPolicy = new LbStickinessPolicy(sDbPolicy.getMethodName(), sDbPolicy.getParams(), sDbPolicy.isRevoke());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/77559866/ui/scripts/lbStickyPolicy.js
----------------------------------------------------------------------
diff --git a/ui/scripts/lbStickyPolicy.js b/ui/scripts/lbStickyPolicy.js
index 2d132da..02ebabe 100644
--- a/ui/scripts/lbStickyPolicy.js
+++ b/ui/scripts/lbStickyPolicy.js
@@ -259,6 +259,32 @@
           }
         });
       },
+      delete: function(stickyRuleID, complete, error) {
+        $.ajax({
+          url: createURL('deleteLBStickinessPolicy'),
+          data: {
+            id: stickyRuleID
+          },
+          success: function(json) {
+            cloudStack.ui.notifications.add(
+              {
+                desc: 'Remove previous LB sticky rule',
+                section: 'Network',
+                poll: pollAsyncJobResult,
+                _custom: {
+                  jobId: json.deleteLBstickinessrruleresponse.jobid
+                }
+              },
+              complete, {},
+              error, {}
+            );
+          },
+          error: function(json) {
+            complete();
+            cloudStack.dialog.notice({ message: parseXMLHttpResponse(json) });
+          }
+        });
+      },
       recreate: function(stickyRuleID, lbRuleID, data, complete, error) {
         var addStickyPolicy = function() {
           cloudStack.lbStickyPolicy.actions.add(
@@ -270,43 +296,10 @@
         };
         
         // Delete existing rule
-        if (stickyRuleID) {
-          $.ajax({
-            url: createURL('deleteLBStickinessPolicy'),
-            data: {
-              id: stickyRuleID
-            },
-            success: function(json) {
-              cloudStack.ui.notifications.add(
-                {
-                  desc: 'Remove previous LB sticky rule',
-                  section: 'Network',
-                  poll: pollAsyncJobResult,
-                  _custom: {
-                    jobId: json.deleteLBstickinessrruleresponse.jobid
-                  }
-                },
-                function() {
-                  if (data.methodname != 'None') {
-                    addStickyPolicy();
-                  } else {
-                    complete();
-                  }
-                }, {},
-                error, {}
-              );
-            },
-            error: function(json) {
-              cloudStack.dialog.notice({
-                message: parseXMLHttpResponse(json)
-              });
-              error();
-            }
-          });
-        } else if (data.methodname != 'None') {
+        if (data.methodname != 'None') {
           addStickyPolicy();
         } else {
-          complete();
+          cloudStack.lbStickyPolicy.actions.delete(stickyRuleID, complete, error);
         }
       }
     }