You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by al...@apache.org on 2013/04/02 21:12:12 UTC

[1/3] Refactoring for the Load Balancing feature -

Updated Branches:
  refs/heads/internallb [created] b429b9606


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/setup/db/db/schema-410to420.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql
index ab9df05..a8a7549 100644
--- a/setup/db/db/schema-410to420.sql
+++ b/setup/db/db/schema-410to420.sql
@@ -405,3 +405,18 @@ INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type,
      VALUES (10, 'routing-10', 'SystemVM Template (LXC)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-02062012.qcow2.bz2', '2755de1f9ef2ce4d6f2bee2efbb4da92', 0, 'SystemVM Template (LXC)', 'QCOW2', 15, 0, 1, 'LXC');
 
 -- END: support for LXC
+
+ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `uuid` varchar(40);
+ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `ip_address_id` bigint unsigned COMMENT 'id of the corresponding ip address';
+ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `start_port` int(10) COMMENT 'starting port of a port range';
+ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `end_port` int(10) COMMENT 'end port of a port range';
+ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `state` char(32) NOT NULL COMMENT 'current state of this rule';
+ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `protocol` char(16) NOT NULL default 'TCP' COMMENT 'protocol to open these ports for';
+ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `account_id` bigint unsigned NOT NULL COMMENT 'owner id';
+ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `domain_id` bigint unsigned NOT NULL COMMENT 'domain id';
+ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `network_id` bigint unsigned NOT NULL COMMENT 'network id';
+ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `created` datetime COMMENT 'Date created';
+
+ALTER TABLE `cloud`.`load_balancing_rules` MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id';
+
+


[3/3] git commit: updated refs/heads/internallb to b429b96

Posted by al...@apache.org.
Refactoring for the Load Balancing feature -

1) moved out load balancing rules from the firewall_rules table
2) change LB related APIs to use load_balancing_rules table as a point of reference


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

Branch: refs/heads/internallb
Commit: b429b9606f142db816716fa3948929174cea29d3
Parents: f2ad38a
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Tue Apr 2 11:51:04 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Tue Apr 2 11:53:53 2013 -0700

----------------------------------------------------------------------
 .../com/cloud/network/lb/LoadBalancingRule.java    |   45 +--
 api/src/com/cloud/network/rules/FirewallRule.java  |    4 +-
 api/src/com/cloud/network/rules/LoadBalancer.java  |   25 +-
 .../user/autoscale/CreateAutoScaleVmGroupCmd.java  |    4 +-
 .../user/autoscale/ListAutoScaleVmGroupsCmd.java   |    4 +-
 .../loadbalancer/AssignToLoadBalancerRuleCmd.java  |    4 +-
 .../loadbalancer/CreateLBHealthCheckPolicyCmd.java |   12 +-
 .../loadbalancer/CreateLBStickinessPolicyCmd.java  |    4 +-
 .../loadbalancer/DeleteLoadBalancerRuleCmd.java    |    4 +-
 .../loadbalancer/ListLBHealthCheckPoliciesCmd.java |   10 +-
 .../loadbalancer/ListLBStickinessPoliciesCmd.java  |    4 +-
 .../ListLoadBalancerRuleInstancesCmd.java          |    4 +-
 .../loadbalancer/ListLoadBalancerRulesCmd.java     |    3 +-
 .../RemoveFromLoadBalancerRuleCmd.java             |    4 +-
 .../loadbalancer/UpdateLoadBalancerRuleCmd.java    |    3 +-
 .../ha/gslb/AssignToGlobalLoadBalancerRuleCmd.java |   25 +-
 .../gslb/RemoveFromGlobalLoadBalancerRuleCmd.java  |   25 +-
 .../api/response/LoadBalancerResponse.java         |    3 +
 .../network/lb/ElasticLoadBalancerManager.java     |    3 +-
 .../network/lb/ElasticLoadBalancerManagerImpl.java |   15 +-
 .../cloud/network/element/NetscalerElement.java    |   70 ++-
 server/src/com/cloud/api/ApiResponseHelper.java    |    2 +-
 .../network/ExternalLoadBalancerDeviceManager.java |    6 +-
 .../ExternalLoadBalancerDeviceManagerImpl.java     |   33 +--
 server/src/com/cloud/network/NetworkManager.java   |    3 +-
 .../src/com/cloud/network/NetworkManagerImpl.java  |   73 ++--
 server/src/com/cloud/network/NetworkModelImpl.java |   19 +-
 .../src/com/cloud/network/NetworkServiceImpl.java  |  197 +++------
 .../com/cloud/network/dao/FirewallRulesDao.java    |   60 ++-
 .../cloud/network/dao/FirewallRulesDaoImpl.java    |   39 +--
 .../src/com/cloud/network/dao/LoadBalancerDao.java |   16 +-
 .../com/cloud/network/dao/LoadBalancerDaoImpl.java |  132 ++++---
 .../src/com/cloud/network/dao/LoadBalancerVO.java  |  115 +++++-
 .../network/element/VirtualRouterElement.java      |    3 +-
 .../network/firewall/FirewallManagerImpl.java      |   32 +-
 .../network/lb/LoadBalancingRulesManager.java      |   10 +-
 .../network/lb/LoadBalancingRulesManagerImpl.java  |  337 +++++++++++----
 .../router/VirtualNetworkApplianceManager.java     |    3 +
 .../router/VirtualNetworkApplianceManagerImpl.java |   39 ++-
 .../com/cloud/network/rules/FirewallRuleVO.java    |    2 -
 .../src/com/cloud/network/rules/RulesManager.java  |    4 -
 .../com/cloud/network/rules/RulesManagerImpl.java  |   18 +-
 .../com/cloud/network/MockNetworkManagerImpl.java  |   19 +-
 .../com/cloud/network/MockRulesManagerImpl.java    |   17 +-
 .../test/com/cloud/vpc/MockNetworkManagerImpl.java |   37 +-
 .../vpc/MockVpcVirtualNetworkApplianceManager.java |    7 +
 .../GlobalLoadBalancingRulesServiceImplTest.java   |   86 ++--
 setup/db/db/schema-410to420-cleanup.sql            |    2 +-
 setup/db/db/schema-410to420.sql                    |   15 +
 49 files changed, 899 insertions(+), 702 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/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 3e11e8c..12b7216 100644
--- a/api/src/com/cloud/network/lb/LoadBalancingRule.java
+++ b/api/src/com/cloud/network/lb/LoadBalancingRule.java
@@ -23,11 +23,10 @@ import com.cloud.network.as.AutoScaleVmGroup;
 import com.cloud.network.as.AutoScaleVmProfile;
 import com.cloud.network.as.Condition;
 import com.cloud.network.as.Counter;
-import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.LoadBalancer;
 import com.cloud.utils.Pair;
 
-public class LoadBalancingRule implements FirewallRule, LoadBalancer {
+public class LoadBalancingRule implements LoadBalancer {
     private LoadBalancer lb;
     private List<LbDestination> destinations;
     private List<LbStickinessPolicy> stickinessPolicies;
@@ -88,11 +87,6 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
     }
 
     @Override
-    public String getXid() {
-        return lb.getXid();
-    }
-
-    @Override
     public Long getSourceIpAddressId() {
         return lb.getSourceIpAddressId();
     }
@@ -113,12 +107,7 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
     }
 
     @Override
-    public Purpose getPurpose() {
-        return Purpose.LoadBalancing;
-    }
-
-    @Override
-    public State getState() {
+    public LoadBalancer.State getState() {
         return lb.getState();
     }
 
@@ -287,36 +276,6 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
         }
     }
 
-    @Override
-    public Integer getIcmpCode() {
-        return null;
-    }
-
-    @Override
-    public Integer getIcmpType() {
-        return null;
-    }
-
-    @Override
-    public List<String> getSourceCidrList() {
-        return null;
-    }
-
-    @Override
-    public Long getRelated() {
-        return null;
-    }
-
-    @Override
-    public TrafficType getTrafficType() {
-        return null;
-    }
-
-    @Override
-    public FirewallRuleType getType() {
-        return FirewallRuleType.User;
-    }
-
     public LbAutoScaleVmGroup getAutoScaleVmGroup() {
         return autoScaleVmGroup;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/com/cloud/network/rules/FirewallRule.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/rules/FirewallRule.java b/api/src/com/cloud/network/rules/FirewallRule.java
index 042665c..3041bf4 100644
--- a/api/src/com/cloud/network/rules/FirewallRule.java
+++ b/api/src/com/cloud/network/rules/FirewallRule.java
@@ -75,8 +75,6 @@ public interface FirewallRule extends ControlledEntity, Identity, InternalIdenti
 
     long getNetworkId();
 
-    Long getSourceIpAddressId();
-
     Integer getIcmpCode();
 
     Integer getIcmpType();
@@ -91,5 +89,7 @@ public interface FirewallRule extends ControlledEntity, Identity, InternalIdenti
      * @return
      */
     TrafficType getTrafficType();
+    
+    Long getSourceIpAddressId();
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/com/cloud/network/rules/LoadBalancer.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/rules/LoadBalancer.java b/api/src/com/cloud/network/rules/LoadBalancer.java
index ab6085a..6c16ea7 100644
--- a/api/src/com/cloud/network/rules/LoadBalancer.java
+++ b/api/src/com/cloud/network/rules/LoadBalancer.java
@@ -16,10 +16,21 @@
 // under the License.
 package com.cloud.network.rules;
 
+import org.apache.cloudstack.acl.ControlledEntity;
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
 /**
  * Definition for a LoadBalancer
  */
-public interface LoadBalancer extends FirewallRule {
+public interface LoadBalancer extends ControlledEntity, Identity, InternalIdentity{
+    
+    enum State {
+        Staged, // Rule been created but has never got through network rule conflict detection.  Rules in this state can not be sent to network elements.
+        Add,    // Add means the rule has been created and has gone through network rule conflict detection.
+        Active, // Rule has been sent to the network elements and reported to be active.
+        Revoke  // Revoke means this rule has been revoked. If this rule has been sent to the network elements, the rule will be deleted from database.
+    }
 
     String getName();
 
@@ -30,5 +41,17 @@ public interface LoadBalancer extends FirewallRule {
     int getDefaultPortEnd();
 
     String getAlgorithm();
+    
+    Long getSourceIpAddressId();
+
+    String getProtocol();
+    
+    State getState();
+    
+    long getNetworkId();
+
+    Integer getSourcePortStart();
+
+    Integer getSourcePortEnd();
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmGroupCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmGroupCmd.java b/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmGroupCmd.java
index 135c877..aa8db2b 100644
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmGroupCmd.java
@@ -27,7 +27,7 @@ import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.response.AutoScalePolicyResponse;
 import org.apache.cloudstack.api.response.AutoScaleVmGroupResponse;
 import org.apache.cloudstack.api.response.AutoScaleVmProfileResponse;
-import org.apache.cloudstack.api.response.FirewallRuleResponse;
+import org.apache.cloudstack.api.response.LoadBalancerResponse;
 import org.apache.log4j.Logger;
 
 import com.cloud.async.AsyncJob;
@@ -47,7 +47,7 @@ public class CreateAutoScaleVmGroupCmd extends BaseAsyncCreateCmd {
     // ////////////// API parameters /////////////////////
     // ///////////////////////////////////////////////////
 
-    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = FirewallRuleResponse.class,
+    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = LoadBalancerResponse.class,
             required = true, description = "the ID of the load balancer rule")
     private long lbRuleId;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScaleVmGroupsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScaleVmGroupsCmd.java b/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScaleVmGroupsCmd.java
index 5b3ee42..629a6fa 100644
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScaleVmGroupsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScaleVmGroupsCmd.java
@@ -26,8 +26,8 @@ import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.response.AutoScalePolicyResponse;
 import org.apache.cloudstack.api.response.AutoScaleVmGroupResponse;
 import org.apache.cloudstack.api.response.AutoScaleVmProfileResponse;
-import org.apache.cloudstack.api.response.FirewallRuleResponse;
 import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.LoadBalancerResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.log4j.Logger;
 
@@ -48,7 +48,7 @@ public class ListAutoScaleVmGroupsCmd extends BaseListProjectAndAccountResources
             description = "the ID of the autoscale vm group")
     private Long id;
 
-    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = FirewallRuleResponse.class,
+    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = LoadBalancerResponse.class,
             description = "the ID of the loadbalancer")
     private Long loadBalancerId;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/org/apache/cloudstack/api/command/user/loadbalancer/AssignToLoadBalancerRuleCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/AssignToLoadBalancerRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/AssignToLoadBalancerRuleCmd.java
index e0f9bcd..36d5abc 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/AssignToLoadBalancerRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/AssignToLoadBalancerRuleCmd.java
@@ -24,7 +24,7 @@ import org.apache.cloudstack.api.ApiErrorCode;
 import org.apache.cloudstack.api.BaseAsyncCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.response.FirewallRuleResponse;
+import org.apache.cloudstack.api.response.LoadBalancerResponse;
 import org.apache.cloudstack.api.response.SuccessResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.log4j.Logger;
@@ -46,7 +46,7 @@ public class AssignToLoadBalancerRuleCmd extends BaseAsyncCmd {
     //////////////// API parameters /////////////////////
     /////////////////////////////////////////////////////
 
-    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = FirewallRuleResponse.class,
+    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = LoadBalancerResponse.class,
             required=true, description="the ID of the load balancer rule")
     private Long id;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/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
index ac0ec3a..274dc12 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLBHealthCheckPolicyCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLBHealthCheckPolicyCmd.java
@@ -17,21 +17,21 @@
 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.APICommand;
 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 org.apache.cloudstack.api.response.LBHealthCheckResponse;
+import org.apache.cloudstack.api.response.LoadBalancerResponse;
+import org.apache.log4j.Logger;
+
 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;
@@ -49,7 +49,7 @@ public class CreateLBHealthCheckPolicyCmd extends BaseAsyncCreateCmd {
     // ////////////// API parameters /////////////////////
     // ///////////////////////////////////////////////////
 
-    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = FirewallRuleResponse.class, required = true, description = "the ID of the load balancer rule")
+    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = LoadBalancerResponse.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")

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLBStickinessPolicyCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLBStickinessPolicyCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLBStickinessPolicyCmd.java
index 02b253a..09a91a3 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLBStickinessPolicyCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLBStickinessPolicyCmd.java
@@ -25,8 +25,8 @@ import org.apache.cloudstack.api.ApiErrorCode;
 import org.apache.cloudstack.api.BaseAsyncCreateCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.response.FirewallRuleResponse;
 import org.apache.cloudstack.api.response.LBStickinessResponse;
+import org.apache.cloudstack.api.response.LoadBalancerResponse;
 import org.apache.log4j.Logger;
 
 import com.cloud.event.EventTypes;
@@ -51,7 +51,7 @@ public class CreateLBStickinessPolicyCmd extends BaseAsyncCreateCmd {
     // ////////////// API parameters /////////////////////
     // ///////////////////////////////////////////////////
 
-    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = FirewallRuleResponse.class,
+    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = LoadBalancerResponse.class,
             required = true, description = "the ID of the load balancer rule")
     private Long lbRuleId;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteLoadBalancerRuleCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteLoadBalancerRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteLoadBalancerRuleCmd.java
index 88fa400..81a1056 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteLoadBalancerRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteLoadBalancerRuleCmd.java
@@ -22,7 +22,7 @@ import org.apache.cloudstack.api.ApiErrorCode;
 import org.apache.cloudstack.api.BaseAsyncCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.response.FirewallRuleResponse;
+import org.apache.cloudstack.api.response.LoadBalancerResponse;
 import org.apache.cloudstack.api.response.SuccessResponse;
 import org.apache.log4j.Logger;
 
@@ -41,7 +41,7 @@ public class DeleteLoadBalancerRuleCmd extends BaseAsyncCmd {
     //////////////// API parameters /////////////////////
     /////////////////////////////////////////////////////
 
-    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = FirewallRuleResponse.class,
+    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = LoadBalancerResponse.class,
             required=true, description="the ID of the load balancer rule")
     private Long id;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/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
index cf5ea32..7744a8a 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLBHealthCheckPoliciesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLBHealthCheckPoliciesCmd.java
@@ -20,20 +20,16 @@ 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 org.apache.cloudstack.api.response.LoadBalancerResponse;
+import org.apache.log4j.Logger;
 
 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 {
@@ -45,7 +41,7 @@ public class ListLBHealthCheckPoliciesCmd extends BaseListCmd {
     // ///////////////////////////////////////////////////
     // ////////////// API parameters /////////////////////
     // ///////////////////////////////////////////////////
-    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = FirewallRuleResponse.class,
+    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = LoadBalancerResponse.class,
             required = true, description = "the ID of the load balancer rule")
     private Long lbRuleId;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLBStickinessPoliciesCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLBStickinessPoliciesCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLBStickinessPoliciesCmd.java
index 9456a15..04411f9 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLBStickinessPoliciesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLBStickinessPoliciesCmd.java
@@ -23,9 +23,9 @@ import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseListCmd;
 import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.response.FirewallRuleResponse;
 import org.apache.cloudstack.api.response.LBStickinessResponse;
 import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.LoadBalancerResponse;
 import org.apache.log4j.Logger;
 
 import com.cloud.network.rules.LoadBalancer;
@@ -43,7 +43,7 @@ public class ListLBStickinessPoliciesCmd extends BaseListCmd {
     // ///////////////////////////////////////////////////
     // ////////////// API parameters /////////////////////
     // ///////////////////////////////////////////////////
-    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = FirewallRuleResponse.class,
+    @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = LoadBalancerResponse.class,
             required = true, description = "the ID of the load balancer rule")
     private Long lbRuleId;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java
index 49ab42c..48b0670 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java
@@ -23,8 +23,8 @@ import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseListCmd;
 import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.response.FirewallRuleResponse;
 import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.LoadBalancerResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.log4j.Logger;
 
@@ -43,7 +43,7 @@ public class ListLoadBalancerRuleInstancesCmd extends BaseListCmd {
     @Parameter(name=ApiConstants.APPLIED, type=CommandType.BOOLEAN, description="true if listing all virtual machines currently applied to the load balancer rule; default is true")
     private Boolean applied;
 
-    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = FirewallRuleResponse.class,
+    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = LoadBalancerResponse.class,
             required=true, description="the ID of the load balancer rule")
     private Long id;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRulesCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRulesCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRulesCmd.java
index e022cc7..0b86a19 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRulesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRulesCmd.java
@@ -23,7 +23,6 @@ import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
 import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.response.FirewallRuleResponse;
 import org.apache.cloudstack.api.response.IPAddressResponse;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.LoadBalancerResponse;
@@ -44,7 +43,7 @@ public class ListLoadBalancerRulesCmd extends BaseListTaggedResourcesCmd {
     // ////////////// API parameters /////////////////////
     // ///////////////////////////////////////////////////
 
-    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = FirewallRuleResponse.class,
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = LoadBalancerResponse.class,
             description = "the ID of the load balancer rule")
     private Long id;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/org/apache/cloudstack/api/command/user/loadbalancer/RemoveFromLoadBalancerRuleCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/RemoveFromLoadBalancerRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/RemoveFromLoadBalancerRuleCmd.java
index 92a05d6..c85daa3 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/RemoveFromLoadBalancerRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/RemoveFromLoadBalancerRuleCmd.java
@@ -24,7 +24,7 @@ import org.apache.cloudstack.api.ApiErrorCode;
 import org.apache.cloudstack.api.BaseAsyncCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.response.FirewallRuleResponse;
+import org.apache.cloudstack.api.response.LoadBalancerResponse;
 import org.apache.cloudstack.api.response.SuccessResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.log4j.Logger;
@@ -46,7 +46,7 @@ public class RemoveFromLoadBalancerRuleCmd extends BaseAsyncCmd {
     //////////////// API parameters /////////////////////
     /////////////////////////////////////////////////////
 
-    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = FirewallRuleResponse.class,
+    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = LoadBalancerResponse.class,
             required=true, description="The ID of the load balancer rule")
     private Long id;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java
index c296057..58670a8 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java
@@ -22,7 +22,6 @@ import org.apache.cloudstack.api.ApiErrorCode;
 import org.apache.cloudstack.api.BaseAsyncCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.response.FirewallRuleResponse;
 import org.apache.cloudstack.api.response.LoadBalancerResponse;
 import org.apache.log4j.Logger;
 
@@ -46,7 +45,7 @@ public class UpdateLoadBalancerRuleCmd extends BaseAsyncCmd {
     @Parameter(name=ApiConstants.DESCRIPTION, type=CommandType.STRING, description="the description of the load balancer rule", length=4096)
     private String description;
 
-    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = FirewallRuleResponse.class,
+    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = LoadBalancerResponse.class,
             required=true, description="the id of the load balancer rule to update")
     private Long id;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/AssignToGlobalLoadBalancerRuleCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/AssignToGlobalLoadBalancerRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/AssignToGlobalLoadBalancerRuleCmd.java
index 1c07a0a..abc48b6 100644
--- a/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/AssignToGlobalLoadBalancerRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/AssignToGlobalLoadBalancerRuleCmd.java
@@ -17,6 +17,21 @@
 
 package org.apache.cloudstack.api.command.user.region.ha.gslb;
 
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.GlobalLoadBalancerResponse;
+import org.apache.cloudstack.api.response.LoadBalancerResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.log4j.Logger;
+
 import com.cloud.event.EventTypes;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.region.ha.GlobalLoadBalancerRule;
@@ -24,14 +39,6 @@ import com.cloud.region.ha.GlobalLoadBalancingRulesService;
 import com.cloud.user.Account;
 import com.cloud.user.UserContext;
 import com.cloud.utils.StringUtils;
-import org.apache.cloudstack.api.*;
-import org.apache.cloudstack.api.response.FirewallRuleResponse;
-import org.apache.cloudstack.api.response.GlobalLoadBalancerResponse;
-import org.apache.cloudstack.api.response.SuccessResponse;
-import org.apache.log4j.Logger;
-
-import javax.inject.Inject;
-import java.util.List;
 
 @APICommand(name = "assignToGlobalLoadBalancerRule", description="Assign load balancer rule or list of load " +
         "balancer rules to a global load balancer rules.", responseObject=SuccessResponse.class)
@@ -50,7 +57,7 @@ public class AssignToGlobalLoadBalancerRuleCmd extends BaseAsyncCmd {
     private Long id;
 
     @Parameter(name=ApiConstants.LOAD_BALANCER_RULE_LIST, type=CommandType.LIST, collectionType=CommandType.UUID,
-            entityType = FirewallRuleResponse.class, required=true, description="the list load balancer rules that " +
+            entityType = LoadBalancerResponse.class, required=true, description="the list load balancer rules that " +
             "will be assigned to gloabal load balacner rule")
     private List<Long> loadBalancerRulesIds;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/RemoveFromGlobalLoadBalancerRuleCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/RemoveFromGlobalLoadBalancerRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/RemoveFromGlobalLoadBalancerRuleCmd.java
index fa051af..cea7df8 100644
--- a/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/RemoveFromGlobalLoadBalancerRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/RemoveFromGlobalLoadBalancerRuleCmd.java
@@ -17,6 +17,21 @@
 
 package org.apache.cloudstack.api.command.user.region.ha.gslb;
 
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.GlobalLoadBalancerResponse;
+import org.apache.cloudstack.api.response.LoadBalancerResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.log4j.Logger;
+
 import com.cloud.event.EventTypes;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.region.ha.GlobalLoadBalancerRule;
@@ -24,14 +39,6 @@ import com.cloud.region.ha.GlobalLoadBalancingRulesService;
 import com.cloud.user.Account;
 import com.cloud.user.UserContext;
 import com.cloud.utils.StringUtils;
-import org.apache.cloudstack.api.*;
-import org.apache.cloudstack.api.response.FirewallRuleResponse;
-import org.apache.cloudstack.api.response.GlobalLoadBalancerResponse;
-import org.apache.cloudstack.api.response.SuccessResponse;
-import org.apache.log4j.Logger;
-
-import javax.inject.Inject;
-import java.util.List;
 
 @APICommand(name = "removeFromGlobalLoadBalancerRule", description="Removes a load balancer rule association with" +
         " global load balancer rule", responseObject=SuccessResponse.class)
@@ -49,7 +56,7 @@ public class RemoveFromGlobalLoadBalancerRuleCmd extends BaseAsyncCmd {
     private Long id;
 
     @Parameter(name=ApiConstants.LOAD_BALANCER_RULE_LIST, type=CommandType.LIST, collectionType=CommandType.UUID,
-            entityType = FirewallRuleResponse.class, required=true, description="the list load balancer rules that "
+            entityType = LoadBalancerResponse.class, required=true, description="the list load balancer rules that "
             + "will be assigned to gloabal load balacner rule")
     private List<Long> loadBalancerRulesIds;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/api/src/org/apache/cloudstack/api/response/LoadBalancerResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/LoadBalancerResponse.java b/api/src/org/apache/cloudstack/api/response/LoadBalancerResponse.java
index 79b01b1..0bda3aa 100644
--- a/api/src/org/apache/cloudstack/api/response/LoadBalancerResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/LoadBalancerResponse.java
@@ -20,11 +20,14 @@ import java.util.List;
 
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.EntityReference;
 
+import com.cloud.network.rules.LoadBalancer;
 import com.cloud.serializer.Param;
 import com.google.gson.annotations.SerializedName;
 
 @SuppressWarnings("unused")
+@EntityReference(value=LoadBalancer.class)
 public class LoadBalancerResponse extends BaseResponse implements ControlledEntityResponse {
     @SerializedName(ApiConstants.ID)
     @Param(description = "the load balancer rule ID")

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManager.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManager.java b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManager.java
index aea795d..e3f6c83 100644
--- a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManager.java
+++ b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManager.java
@@ -23,7 +23,6 @@ import com.cloud.exception.InsufficientAddressCapacityException;
 import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.Network;
-import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.LoadBalancer;
 import com.cloud.user.Account;
 
@@ -32,7 +31,7 @@ public interface ElasticLoadBalancerManager {
     public static final int DEFAULT_ELB_VM_CPU_MHZ = 256;               // 500 MHz
 
     public boolean applyLoadBalancerRules(Network network, 
-            List<? extends FirewallRule> rules) 
+            List<? extends LoadBalancer> rules) 
             throws ResourceUnavailableException;
 
     public LoadBalancer handleCreateLoadBalancerRule(CreateLoadBalancerRuleCmd lb, Account caller, long networkId) throws InsufficientAddressCapacityException, NetworkRuleConflictException;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/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 283b517..21143eb 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
@@ -101,8 +101,6 @@ import com.cloud.network.router.VirtualRouter;
 import com.cloud.network.router.VirtualRouter.RedundantState;
 import com.cloud.network.router.VirtualRouter.Role;
 import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
-import com.cloud.network.rules.FirewallRule;
-import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.network.rules.LoadBalancer;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offering.ServiceOffering;
@@ -118,7 +116,6 @@ import com.cloud.user.UserContext;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
-import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
@@ -293,7 +290,7 @@ ElasticLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
         int i = 0;
         for (LoadBalancingRule rule : rules) {
             boolean revoked = (rule.getState()
-                    .equals(FirewallRule.State.Revoke));
+                    .equals(LoadBalancer.State.Revoke));
             String protocol = rule.getProtocol();
             String algorithm = rule.getAlgorithm();
 
@@ -331,7 +328,7 @@ ElasticLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
         return sendCommandsToRouter(elbVm, cmds);
     }
     
-    protected DomainRouterVO findElbVmForLb(FirewallRule lb) {//TODO: use a table to lookup
+    protected DomainRouterVO findElbVmForLb(LoadBalancer lb) {//TODO: use a table to lookup
         ElasticLbVmMapVO map = _elbVmMapDao.findOneByIp(lb.getSourceIpAddressId());
         if (map == null) {
             return null;
@@ -342,16 +339,12 @@ ElasticLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
 
     @Override
     public boolean applyLoadBalancerRules(Network network,
-            List<? extends FirewallRule> rules)
+            List<? extends LoadBalancer> rules)
             throws ResourceUnavailableException {
         if (rules == null || rules.isEmpty()) {
             return true;
         }
-        if (rules.get(0).getPurpose() != Purpose.LoadBalancing) {
-            s_logger.warn("ELB: Not handling non-LB firewall rules");
-            return false;
-        }
-        
+
         DomainRouterVO elbVm = findElbVmForLb(rules.get(0));
                                                                           
         if (elbVm == null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/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 17bb7cc..a9f869e 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
@@ -16,6 +16,22 @@
 // under the License.
 package com.cloud.network.element;
 
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
+import org.apache.cloudstack.region.gslb.GslbServiceProvider;
+import org.apache.log4j.Logger;
+
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.routing.GlobalLoadBalancerConfigCommand;
@@ -25,7 +41,11 @@ import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
 import com.cloud.agent.api.to.LoadBalancerTO;
 import com.cloud.agent.api.to.StaticNatRuleTO;
 import com.cloud.api.ApiDBUtils;
-import com.cloud.api.commands.*;
+import com.cloud.api.commands.AddNetscalerLoadBalancerCmd;
+import com.cloud.api.commands.ConfigureNetscalerLoadBalancerCmd;
+import com.cloud.api.commands.DeleteNetscalerLoadBalancerCmd;
+import com.cloud.api.commands.ListNetscalerLoadBalancerNetworksCmd;
+import com.cloud.api.commands.ListNetscalerLoadBalancersCmd;
 import com.cloud.api.response.NetscalerLoadBalancerResponse;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.ConfigurationManager;
@@ -37,25 +57,45 @@ import com.cloud.dc.HostPodVO;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.DataCenterIpAddressDao;
 import com.cloud.deploy.DeployDestination;
-import com.cloud.exception.*;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InsufficientNetworkCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.host.Host;
 import com.cloud.host.HostVO;
 import com.cloud.host.dao.HostDao;
 import com.cloud.host.dao.HostDetailsDao;
-import com.cloud.network.*;
+import com.cloud.network.ExternalLoadBalancerDeviceManager;
+import com.cloud.network.ExternalLoadBalancerDeviceManagerImpl;
+import com.cloud.network.IpAddress;
+import com.cloud.network.NetScalerPodVO;
+import com.cloud.network.Network;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkModel;
 import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.PublicIpAddress;
 import com.cloud.network.as.AutoScaleCounter;
 import com.cloud.network.as.AutoScaleCounter.AutoScaleCounterType;
-import com.cloud.network.dao.*;
+import com.cloud.network.dao.ExternalLoadBalancerDeviceDao;
+import com.cloud.network.dao.ExternalLoadBalancerDeviceVO;
 import com.cloud.network.dao.ExternalLoadBalancerDeviceVO.LBDeviceState;
+import com.cloud.network.dao.NetScalerPodDao;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkExternalLoadBalancerDao;
+import com.cloud.network.dao.NetworkExternalLoadBalancerVO;
+import com.cloud.network.dao.NetworkServiceMapDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.dao.PhysicalNetworkDao;
+import com.cloud.network.dao.PhysicalNetworkVO;
 import com.cloud.network.lb.LoadBalancingRule;
 import com.cloud.network.lb.LoadBalancingRule.LbDestination;
 import com.cloud.network.resource.NetscalerResource;
 import com.cloud.network.rules.FirewallRule;
-import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.network.rules.LbStickinessMethod;
 import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType;
 import com.cloud.network.rules.StaticNat;
@@ -70,15 +110,6 @@ import com.cloud.vm.ReservationContext;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile;
 import com.google.gson.Gson;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
-import org.apache.cloudstack.region.gslb.GslbServiceProvider;
-import org.apache.log4j.Logger;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import java.net.URI;
-import java.util.*;
 
 @Local(value = {NetworkElement.class, StaticNatServiceProvider.class, LoadBalancingServiceProvider.class, GslbServiceProvider.class})
 public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl implements LoadBalancingServiceProvider,
@@ -638,14 +669,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
         return this;
     }
 
-    public boolean applyElasticLoadBalancerRules(Network network, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
-
-        List<LoadBalancingRule> loadBalancingRules = new ArrayList<LoadBalancingRule>();
-        for (FirewallRule rule : rules) {
-            if (rule.getPurpose().equals(Purpose.LoadBalancing)) {
-                loadBalancingRules.add((LoadBalancingRule) rule);
-            }
-        }
+    protected boolean applyElasticLoadBalancerRules(Network network, List<? extends LoadBalancingRule> loadBalancingRules) throws ResourceUnavailableException {
 
         if (loadBalancingRules == null || loadBalancingRules.isEmpty()) {
             return true;
@@ -821,7 +845,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
         return null;
     }
 
-    public List<LoadBalancerTO> getLBHealthChecks(Network network, List<? extends FirewallRule> rules)
+    public List<LoadBalancerTO> getLBHealthChecks(Network network, List<? extends LoadBalancingRule> rules)
             throws ResourceUnavailableException {
         return super.getLBHealthChecks(network, rules);
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index 64be7f8..cb839a7 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -708,7 +708,7 @@ public class ApiResponseHelper implements ResponseGenerator {
         lbResponse.setPublicPort(Integer.toString(loadBalancer.getSourcePortStart()));
         lbResponse.setPrivatePort(Integer.toString(loadBalancer.getDefaultPortStart()));
         lbResponse.setAlgorithm(loadBalancer.getAlgorithm());
-        FirewallRule.State state = loadBalancer.getState();
+        LoadBalancer.State state = loadBalancer.getState();
         String stateToSet = state.toString();
         if (state.equals(FirewallRule.State.Revoke)) {
             stateToSet = "Deleting";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java
index 9f11b85..8220c20 100644
--- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java
+++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java
@@ -23,7 +23,7 @@ import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.host.Host;
 import com.cloud.network.dao.ExternalLoadBalancerDeviceVO;
-import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.lb.LoadBalancingRule;
 import com.cloud.resource.ServerResource;
 import com.cloud.utils.component.Manager;
 
@@ -89,7 +89,7 @@ public interface ExternalLoadBalancerDeviceManager extends Manager{
      * @return true if successfully applied rules
      * @throws ResourceUnavailableException
      */
-    public boolean applyLoadBalancerRules(Network network, List<? extends FirewallRule> rules) throws ResourceUnavailableException;
+    public boolean applyLoadBalancerRules(Network network, List<? extends LoadBalancingRule> rules) throws ResourceUnavailableException;
 
     /**
      * implements or shutdowns guest network on the load balancer device assigned to the guest network
@@ -102,6 +102,6 @@ public interface ExternalLoadBalancerDeviceManager extends Manager{
     public boolean manageGuestNetworkWithExternalLoadBalancer(boolean add, Network guestConfig) throws ResourceUnavailableException,
             InsufficientCapacityException;
 
-    public List<LoadBalancerTO> getLBHealthChecks(Network network, List<? extends FirewallRule> rules)
+    public List<LoadBalancerTO> getLBHealthChecks(Network network, List<? extends LoadBalancingRule> rules)
             throws ResourceUnavailableException;
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
index 4853256..9b271f9 100644
--- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
+++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
@@ -94,7 +94,7 @@ import com.cloud.network.lb.LoadBalancingRule.LbDestination;
 import com.cloud.network.resource.CreateLoadBalancerApplianceAnswer;
 import com.cloud.network.resource.DestroyLoadBalancerApplianceAnswer;
 import com.cloud.network.rules.FirewallRule;
-import com.cloud.network.rules.FirewallRule.Purpose;
+import com.cloud.network.rules.LoadBalancer;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.network.rules.StaticNatImpl;
 import com.cloud.network.rules.dao.PortForwardingRulesDao;
@@ -111,7 +111,6 @@ import com.cloud.user.dao.AccountDao;
 import com.cloud.user.dao.UserStatisticsDao;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.component.AdapterBase;
-import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.Transaction;
@@ -122,15 +121,6 @@ import com.cloud.vm.Nic;
 import com.cloud.vm.NicVO;
 import com.cloud.vm.dao.DomainRouterDao;
 import com.cloud.vm.dao.NicDao;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.response.ExternalLoadBalancerResponse;
-import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
-import org.apache.log4j.Logger;
-
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-import java.net.URI;
-import java.util.*;
 
 public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase implements ExternalLoadBalancerDeviceManager, ResourceStateAdapter {
 
@@ -811,7 +801,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
                 // Find the NIC that the mapping refers to
                 loadBalancingIpNic = _nicDao.findById(mapping.getNicId());
 
-                int count = _networkMgr.getRuleCountForIp(sourceIpId, Purpose.LoadBalancing, FirewallRule.State.Active);
+                int count = _networkMgr.getLbRuleCountForIp(sourceIpId, LoadBalancer.State.Active);
                 if (count == 0) {
                     // On the firewall provider for the network, delete the static NAT rule between the source IP
                     // address and the load balancing IP address
@@ -838,18 +828,11 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
     }
 
     @Override
-    public boolean applyLoadBalancerRules(Network network, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
+    public boolean applyLoadBalancerRules(Network network, List<? extends LoadBalancingRule> loadBalancingRules) throws ResourceUnavailableException {
         // Find the external load balancer in this zone
         long zoneId = network.getDataCenterId();
         DataCenterVO zone = _dcDao.findById(zoneId);
 
-        List<LoadBalancingRule> loadBalancingRules = new ArrayList<LoadBalancingRule>();
-
-        for (FirewallRule rule : rules) {
-            if (rule.getPurpose().equals(Purpose.LoadBalancing)) {
-                loadBalancingRules.add((LoadBalancingRule) rule);
-            }
-        }
 
         if (loadBalancingRules == null || loadBalancingRules.isEmpty()) {
             return true;
@@ -1122,7 +1105,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
     }
 
     @Override
-    public List<LoadBalancerTO> getLBHealthChecks(Network network, List<? extends FirewallRule> rules)
+    public List<LoadBalancerTO> getLBHealthChecks(Network network, List<? extends LoadBalancingRule> loadBalancingRules)
             throws ResourceUnavailableException {
 
         // Find the external load balancer in this zone
@@ -1130,14 +1113,6 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
         DataCenterVO zone = _dcDao.findById(zoneId);
         HealthCheckLBConfigAnswer answer = null;
 
-        List<LoadBalancingRule> loadBalancingRules = new ArrayList<LoadBalancingRule>();
-
-        for (FirewallRule rule : rules) {
-            if (rule.getPurpose().equals(Purpose.LoadBalancing)) {
-                loadBalancingRules.add((LoadBalancingRule) rule);
-            }
-        }
-
         if (loadBalancingRules == null || loadBalancingRules.isEmpty()) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/NetworkManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java
index 851f7f5..2c4a214 100755
--- a/server/src/com/cloud/network/NetworkManager.java
+++ b/server/src/com/cloud/network/NetworkManager.java
@@ -43,6 +43,7 @@ import com.cloud.network.element.StaticNatServiceProvider;
 import com.cloud.network.element.UserDataServiceProvider;
 import com.cloud.network.guru.NetworkGuru;
 import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.LoadBalancer;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.NetworkOfferingVO;
@@ -330,7 +331,7 @@ public interface NetworkManager  {
     StaticNatServiceProvider getStaticNatProviderForNetwork(Network network);
     boolean isNetworkInlineMode(Network network);
 
-    int getRuleCountForIp(Long addressId, FirewallRule.Purpose purpose, FirewallRule.State state);
+    int getLbRuleCountForIp(Long addressId, LoadBalancer.State state);
 
     LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java
index c0685ba..409f734 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -111,6 +111,7 @@ import com.cloud.network.dao.FirewallRulesDao;
 import com.cloud.network.dao.IPAddressDao;
 import com.cloud.network.dao.IPAddressVO;
 import com.cloud.network.dao.LoadBalancerDao;
+import com.cloud.network.dao.LoadBalancerVO;
 import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.dao.NetworkDomainDao;
 import com.cloud.network.dao.NetworkServiceMapDao;
@@ -135,6 +136,7 @@ import com.cloud.network.rules.FirewallManager;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.network.rules.FirewallRuleVO;
+import com.cloud.network.rules.LoadBalancer;
 import com.cloud.network.rules.PortForwardingRuleVO;
 import com.cloud.network.rules.RulesManager;
 import com.cloud.network.rules.StaticNat;
@@ -164,7 +166,6 @@ import com.cloud.utils.Journal;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.component.AdapterBase;
-import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
@@ -2800,7 +2801,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
             success = false;
         }
 
-        s_logger.debug("Revoking all " + Purpose.LoadBalancing + " rules as a part of public IP id=" + ipId + " release...");
+        s_logger.debug("Revoking all Load Balancing rules as a part of public IP id=" + ipId + " release...");
         if (!_lbMgr.removeAllLoadBalanacersForIp(ipId, caller, userId)) {
             s_logger.warn("Unable to revoke all the load balancer rules for ip id=" + ipId + " as a part of ip release");
             success = false;
@@ -3694,54 +3695,54 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
     }
 
     @Override
-    public int getRuleCountForIp(Long addressId, FirewallRule.Purpose purpose, FirewallRule.State state) {
-        List<FirewallRuleVO> rules = _firewallDao.listByIpAndPurposeWithState(addressId, purpose, state);
+    public int getLbRuleCountForIp(Long addressId, LoadBalancer.State state) {
+        List<LoadBalancerVO> rules = _lbDao.listByIpAndState(addressId, state);
         if (rules == null) {
             return 0;
         }
         return rules.size();
     }
 
-         @Override
+    @Override
     public boolean isSecondaryIpSetForNic(long nicId) {
         NicVO nic = _nicDao.findById(nicId);
         return nic.getSecondaryIp();
     }
 
-         @Override
-        public boolean removeVmSecondaryIpsOfNic(long nicId) {
-           Transaction txn = Transaction.currentTxn();
-           txn.start();
-           List <NicSecondaryIpVO> ipList = _nicSecondaryIpDao.listByNicId(nicId);
-           if (ipList != null) {
-               for (NicSecondaryIpVO ip: ipList) {
-                   _nicSecondaryIpDao.remove(ip.getId());
-               }
-               s_logger.debug("Revoving nic secondary ip entry ...");
+     @Override
+    public boolean removeVmSecondaryIpsOfNic(long nicId) {
+       Transaction txn = Transaction.currentTxn();
+       txn.start();
+       List <NicSecondaryIpVO> ipList = _nicSecondaryIpDao.listByNicId(nicId);
+       if (ipList != null) {
+           for (NicSecondaryIpVO ip: ipList) {
+               _nicSecondaryIpDao.remove(ip.getId());
            }
-           txn.commit();
-           return true;
-        }
+           s_logger.debug("Revoving nic secondary ip entry ...");
+       }
+       txn.commit();
+       return true;
+    }
 
-        @Override
-        public String allocatePublicIpForGuestNic(Long networkId, DataCenter dc, Pod pod,Account owner,
-                String requestedIp) throws InsufficientAddressCapacityException {
-            PublicIp ip = assignPublicIpAddress(dc.getId(), null, owner, VlanType.DirectAttached, networkId, requestedIp, false);
-            if (ip == null) {
-                s_logger.debug("There is no free public ip address");
-                return null;
-            }
-            Ip ipAddr = ip.getAddress();
-            return ipAddr.addr();
+    @Override
+    public String allocatePublicIpForGuestNic(Long networkId, DataCenter dc, Pod pod,Account owner,
+            String requestedIp) throws InsufficientAddressCapacityException {
+        PublicIp ip = assignPublicIpAddress(dc.getId(), null, owner, VlanType.DirectAttached, networkId, requestedIp, false);
+        if (ip == null) {
+            s_logger.debug("There is no free public ip address");
+            return null;
         }
+        Ip ipAddr = ip.getAddress();
+        return ipAddr.addr();
+    }
         
-        @Override
-        public NicVO savePlaceholderNic(Network network, String ip4Address) {
-            NicVO nic = new NicVO(null, null, network.getId(), null); 
-            nic.setIp4Address(ip4Address);
-            nic.setReservationStrategy(ReservationStrategy.PlaceHolder);
-            nic.setState(Nic.State.Reserved);
-            return _nicDao.persist(nic);
-        }
+    @Override
+    public NicVO savePlaceholderNic(Network network, String ip4Address) {
+        NicVO nic = new NicVO(null, null, network.getId(), null); 
+        nic.setIp4Address(ip4Address);
+        nic.setReservationStrategy(ReservationStrategy.PlaceHolder);
+        nic.setState(Nic.State.Reserved);
+        return _nicDao.persist(nic);
+    }
         
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/NetworkModelImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java
index d967f33..e90576b 100644
--- a/server/src/com/cloud/network/NetworkModelImpl.java
+++ b/server/src/com/cloud/network/NetworkModelImpl.java
@@ -62,6 +62,8 @@ import com.cloud.network.addr.PublicIp;
 import com.cloud.network.dao.FirewallRulesDao;
 import com.cloud.network.dao.IPAddressDao;
 import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.LoadBalancerDao;
+import com.cloud.network.dao.LoadBalancerVO;
 import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.dao.NetworkDomainDao;
 import com.cloud.network.dao.NetworkDomainVO;
@@ -92,7 +94,6 @@ import com.cloud.user.Account;
 import com.cloud.user.DomainManager;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.utils.component.AdapterBase;
-import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.JoinBuilder;
@@ -139,6 +140,8 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
     NetworkDao _networksDao = null;
     @Inject
     NicDao _nicDao = null;
+    @Inject
+    LoadBalancerDao _lbDao;
    
     @Inject
     PodVlanMapDao _podVlanMapDao;
@@ -233,10 +236,14 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
     Set<Purpose> getPublicIpPurposeInRules(PublicIpAddress ip, boolean includeRevoked, boolean includingFirewall) {
         Set<Purpose> result = new HashSet<Purpose>();
         List<FirewallRuleVO> rules = null;
+        List<LoadBalancerVO> lbRules = null;
+
         if (includeRevoked) {
             rules = _firewallDao.listByIp(ip.getId());
+            lbRules = _lbDao.listByIpAddress(ip.getId());
         } else {
             rules = _firewallDao.listByIpAndNotRevoked(ip.getId());
+            lbRules = _lbDao.listByIpAndNotRevoked(ip.getId());
         }
 
         if (rules == null || rules.isEmpty()) {
@@ -248,6 +255,10 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
                 result.add(rule.getPurpose());
             }
         }
+        
+        if (lbRules != null && lbRules.isEmpty()) {
+            result.add(Purpose.LoadBalancing);
+        }
 
         return result;
     }
@@ -293,7 +304,7 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
                     }
                     if (purposes == null || purposes.isEmpty()) {
                         // since no active rules are there check if any rules are applied on the public IP but are in
-    // revoking state
+                        // revoking state
                         
                         purposes = getPublicIpPurposeInRules(ip, true, includingFirewall);
                         if (ip.isOneToOneNat()) {
@@ -308,12 +319,12 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
                         } else {
                             if (rulesRevoked) {
                                 // no active rules/revoked rules are associated with this public IP, so remove the
-    // association with the provider
+                                // association with the provider
                                 ip.setState(State.Releasing);
                             } else {
                                 if (ip.getState() == State.Releasing) {
                                     // rules are not revoked yet, so don't let the network service provider revoke the IP
-    // association
+                                    // association
                                     // mark IP is allocated so that IP association will not be removed from the provider
                                     ip.setState(State.Allocated);
                                 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java
index 4eb620c..5db5c1b 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -16,8 +16,8 @@
 // under the License.
 package com.cloud.network;
 
-import java.net.InetAddress;
 import java.net.Inet6Address;
+import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.security.InvalidParameterException;
 import java.sql.PreparedStatement;
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.UUID;
 
 import javax.ejb.Local;
 import javax.inject.Inject;
@@ -42,18 +43,17 @@ import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementors
 import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
 import org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
 import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
+import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
-import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
-import org.bouncycastle.util.IPAddress;
 
 import com.cloud.configuration.Config;
 import com.cloud.configuration.ConfigurationManager;
 import com.cloud.configuration.dao.ConfigurationDao;
 import com.cloud.dc.DataCenter;
-import com.cloud.dc.Pod;
 import com.cloud.dc.DataCenter.NetworkType;
 import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.Pod;
 import com.cloud.dc.Vlan.VlanType;
 import com.cloud.dc.VlanVO;
 import com.cloud.dc.dao.AccountVlanMapDao;
@@ -69,11 +69,16 @@ import com.cloud.event.EventTypes;
 import com.cloud.event.UsageEventUtils;
 import com.cloud.event.dao.EventDao;
 import com.cloud.event.dao.UsageEventDao;
-import com.cloud.exception.*;
-import com.cloud.host.Host;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.UnsupportedServiceException;
 import com.cloud.host.dao.HostDao;
 import com.cloud.network.IpAddress.State;
-import com.cloud.vm.Nic;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.GuestType;
 import com.cloud.network.Network.Provider;
@@ -83,16 +88,29 @@ import com.cloud.network.Networks.TrafficType;
 import com.cloud.network.PhysicalNetwork.BroadcastDomainRange;
 import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType;
 import com.cloud.network.addr.PublicIp;
-import com.cloud.network.dao.*;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkDomainDao;
+import com.cloud.network.dao.NetworkDomainVO;
+import com.cloud.network.dao.NetworkServiceMapDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.dao.PhysicalNetworkDao;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
+import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao;
+import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
+import com.cloud.network.dao.PhysicalNetworkVO;
 import com.cloud.network.element.NetworkElement;
 import com.cloud.network.element.VirtualRouterElement;
 import com.cloud.network.element.VpcVirtualRouterElement;
 import com.cloud.network.guru.NetworkGuru;
 import com.cloud.network.rules.FirewallRule.Purpose;
-import com.cloud.network.rules.dao.PortForwardingRulesDao;
 import com.cloud.network.rules.FirewallRuleVO;
 import com.cloud.network.rules.PortForwardingRuleVO;
 import com.cloud.network.rules.RulesManager;
+import com.cloud.network.rules.dao.PortForwardingRulesDao;
 import com.cloud.network.vpc.PrivateIpVO;
 import com.cloud.network.vpc.Vpc;
 import com.cloud.network.vpc.VpcManager;
@@ -107,27 +125,43 @@ import com.cloud.projects.ProjectManager;
 import com.cloud.server.ResourceTag.TaggedResourceType;
 import com.cloud.tags.ResourceTagVO;
 import com.cloud.tags.dao.ResourceTagDao;
-import com.cloud.user.*;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.AccountVO;
+import com.cloud.user.DomainManager;
+import com.cloud.user.ResourceLimitService;
+import com.cloud.user.User;
+import com.cloud.user.UserContext;
+import com.cloud.user.UserVO;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.user.dao.UserDao;
 import com.cloud.utils.AnnotationHelper;
 import com.cloud.utils.Journal;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
-import com.cloud.utils.component.ComponentContext;
-import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
-import com.cloud.utils.db.*;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Filter;
+import com.cloud.utils.db.JoinBuilder;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
-import com.cloud.vm.*;
+import com.cloud.vm.Nic;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.ReservationContext;
+import com.cloud.vm.ReservationContextImpl;
+import com.cloud.vm.SecondaryStorageVmVO;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.dao.NicDao;
 import com.cloud.vm.dao.NicSecondaryIpDao;
 import com.cloud.vm.dao.NicSecondaryIpVO;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
-import java.util.*;
 
 /**
  * NetworkServiceImpl implements NetworkService.
@@ -231,103 +265,12 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
 
     private Map<String, String> _configs;
 
-    /* Get a list of IPs, classify them by service */
-    protected Map<PublicIp, Set<Service>> getIpToServices(List<PublicIp> publicIps, boolean rulesRevoked, boolean includingFirewall) {
-        Map<PublicIp, Set<Service>> ipToServices = new HashMap<PublicIp, Set<Service>>();
-
-        if (publicIps != null && !publicIps.isEmpty()) {
-            Set<Long> networkSNAT = new HashSet<Long>();
-            for (PublicIp ip : publicIps) {
-                Set<Service> services = ipToServices.get(ip);
-                if (services == null) {
-                    services = new HashSet<Service>();
-                }
-                if (ip.isSourceNat()) {
-                    if (!networkSNAT.contains(ip.getAssociatedWithNetworkId())) {
-                        services.add(Service.SourceNat);
-                        networkSNAT.add(ip.getAssociatedWithNetworkId());
-                    } else {
-                        CloudRuntimeException ex = new CloudRuntimeException("Multiple generic soure NAT IPs provided for network");
-                        // see the IPAddressVO.java class.
-                        ex.addProxyObject("user_ip_address", ip.getAssociatedWithNetworkId(), "networkId");
-                        throw ex;
-                    }
-                }
-                ipToServices.put(ip, services);
-
-                // if IP in allocating state then it will not have any rules attached so skip IPAssoc to network service
-                // provider
-                if (ip.getState() == State.Allocating) {
-                    continue;
-                }
-
-                // check if any active rules are applied on the public IP
-                Set<Purpose> purposes = getPublicIpPurposeInRules(ip, false, includingFirewall);
-                // Firewall rules didn't cover static NAT
-                if (ip.isOneToOneNat() && ip.getAssociatedWithVmId() != null) {
-                    if (purposes == null) {
-                        purposes = new HashSet<Purpose>();
-                    }
-                    purposes.add(Purpose.StaticNat);
-                }
-                if (purposes == null || purposes.isEmpty()) {
-                    // since no active rules are there check if any rules are applied on the public IP but are in
-// revoking state
-                    
-                    purposes = getPublicIpPurposeInRules(ip, true, includingFirewall);
-                    if (ip.isOneToOneNat()) {
-                        if (purposes == null) {
-                            purposes = new HashSet<Purpose>();
-                        }
-                        purposes.add(Purpose.StaticNat);
-                    }
-                    if (purposes == null || purposes.isEmpty()) {
-                        // IP is not being used for any purpose so skip IPAssoc to network service provider
-                        continue;
-                    } else {
-                        if (rulesRevoked) {
-                            // no active rules/revoked rules are associated with this public IP, so remove the
-// association with the provider
-                            ip.setState(State.Releasing);
-                        } else {
-                            if (ip.getState() == State.Releasing) {
-                                // rules are not revoked yet, so don't let the network service provider revoke the IP
-// association
-                                // mark IP is allocated so that IP association will not be removed from the provider
-                                ip.setState(State.Allocated);
-                            }
-                        }
-                    }
-                }
-                if (purposes.contains(Purpose.StaticNat)) {
-                    services.add(Service.StaticNat);
-                }
-                if (purposes.contains(Purpose.LoadBalancing)) {
-                    services.add(Service.Lb);
-                }
-                if (purposes.contains(Purpose.PortForwarding)) {
-                    services.add(Service.PortForwarding);
-                }
-                if (purposes.contains(Purpose.Vpn)) {
-                    services.add(Service.Vpn);
-                }
-                if (purposes.contains(Purpose.Firewall)) {
-                    services.add(Service.Firewall);
-                }
-                if (services.isEmpty()) {
-                    continue;
-                }
-                ipToServices.put(ip, services);
-            }
-        }
-        return ipToServices;
-    }
 
-    protected boolean canIpUsedForNonConserveService(PublicIp ip, Service service) {
+    protected boolean canIpUsedForNonConserveService(PublicIpAddress ip, Service service) {
         // If it's non-conserve mode, then the new ip should not be used by any other services
-        List<PublicIp> ipList = new ArrayList<PublicIp>();
+        List<PublicIpAddress> ipList = new ArrayList<PublicIpAddress>();
         ipList.add(ip);
-        Map<PublicIp, Set<Service>> ipToServices = getIpToServices(ipList, false, false);
+        Map<PublicIpAddress, Set<Service>> ipToServices = _networkModel.getIpToServices(ipList, false, false);
         Set<Service> services = ipToServices.get(ip);
         // Not used currently, safe
         if (services == null || services.isEmpty()) {
@@ -343,9 +286,9 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
         return true;
     }
 
-    protected boolean canIpsUsedForNonConserve(List<PublicIp> publicIps) {
+    protected boolean canIpsUsedForNonConserve(List<PublicIpAddress> publicIps) {
         boolean result = true;
-        for (PublicIp ip : publicIps) {
+        for (PublicIpAddress ip : publicIps) {
             result = canIpUsedForNonConserveService(ip, null);
             if (!result) {
                 break;
@@ -354,8 +297,8 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
         return result;
     }
 
-    private boolean canIpsUseOffering(List<PublicIp> publicIps, long offeringId) {
-        Map<PublicIp, Set<Service>> ipToServices = getIpToServices(publicIps, false, true);
+    private boolean canIpsUseOffering(List<PublicIpAddress> publicIps, long offeringId) {
+        Map<PublicIpAddress, Set<Service>> ipToServices = _networkModel.getIpToServices(publicIps, false, true);
         Map<Service, Set<Provider>> serviceToProviders = _networkModel.getNetworkOfferingServiceProvidersMap(offeringId);
         NetworkOfferingVO offering = _networkOfferingDao.findById(offeringId);
         //For inline mode checking, using firewall provider for LB instead, because public ip would apply on firewall provider
@@ -369,7 +312,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             serviceToProviders.remove(Service.Lb);
             serviceToProviders.put(Service.Lb, p);
         }
-        for (PublicIp ip : ipToServices.keySet()) {
+        for (PublicIpAddress ip : ipToServices.keySet()) {
             Set<Service> services = ipToServices.get(ip);
             Provider provider = null;
             for (Service service : services) {
@@ -392,30 +335,6 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
     }
     
 
-    
-
-    private Set<Purpose> getPublicIpPurposeInRules(PublicIp ip, boolean includeRevoked, boolean includingFirewall) {
-        Set<Purpose> result = new HashSet<Purpose>();
-        List<FirewallRuleVO> rules = null;
-        if (includeRevoked) {
-            rules = _firewallDao.listByIp(ip.getId());
-        } else {
-            rules = _firewallDao.listByIpAndNotRevoked(ip.getId());
-        }
-
-        if (rules == null || rules.isEmpty()) {
-            return null;
-        }
-
-        for (FirewallRuleVO rule : rules) {
-            if (rule.getPurpose() != Purpose.Firewall || includingFirewall) {
-                result.add(rule.getPurpose());
-            }
-        }
-
-        return result;
-    }
-
     @Override
     public List<? extends Network> getIsolatedNetworksOwnedByAccountInZone(long zoneId, Account owner) {
 
@@ -2118,7 +2037,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
 
         // Check all ips
         List<IPAddressVO> userIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), null);
-        List<PublicIp> publicIps = new ArrayList<PublicIp>();
+        List<PublicIpAddress> publicIps = new ArrayList<PublicIpAddress>();
         if (userIps != null && !userIps.isEmpty()) {
             for (IPAddressVO userIp : userIps) {
                 PublicIp publicIp = PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId()));

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/dao/FirewallRulesDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/dao/FirewallRulesDao.java b/server/src/com/cloud/network/dao/FirewallRulesDao.java
index 0bbaa93..2dfd2f2 100644
--- a/server/src/com/cloud/network/dao/FirewallRulesDao.java
+++ b/server/src/com/cloud/network/dao/FirewallRulesDao.java
@@ -18,7 +18,6 @@ package com.cloud.network.dao;
 
 import java.util.List;
 
-import com.cloud.host.HostVO;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRuleVO;
 import com.cloud.utils.db.GenericDao;
@@ -27,39 +26,54 @@ import com.cloud.utils.db.GenericDao;
  * Data Access Object for user_ip_address and ip_forwarding tables
  */
 public interface FirewallRulesDao extends GenericDao<FirewallRuleVO, Long> {
+    
+    //SEARCH BY IP ADDRESS
 
+    //FIXME - check detect rules conflict in rulesManagerimpl
     List<FirewallRuleVO> listByIpAndPurposeAndNotRevoked(long ipAddressId, FirewallRule.Purpose purpose);
-
-    List<FirewallRuleVO> listByNetworkAndPurposeAndNotRevoked(long networkId, FirewallRule.Purpose purpose);
-
-    boolean setStateToAdd(FirewallRuleVO rule);
-
-    boolean revoke(FirewallRuleVO rule);
-
-    boolean releasePorts(long ipAddressId, String protocol, FirewallRule.Purpose purpose, int[] ports);
-
+    
+    //safe
     List<FirewallRuleVO> listByIpAndPurpose(long ipAddressId, FirewallRule.Purpose purpose);
+    
+    //safe
+    List<FirewallRuleVO> listByIpPurposeAndProtocolAndNotRevoked(long ipAddressId, Integer startPort, Integer endPort,
+            String protocol, FirewallRule.Purpose purpose);
 
+    //FIXME - check usage in VPC ManagerImpl
+    List<FirewallRuleVO> listByIp(long ipAddressId);
+    
+    //safe
+    List<FirewallRuleVO> listByIpAndNotRevoked(long ipAddressId);
+    
+    //FIXME - fix Configuration manager impl
+    long countRulesByIpId(long sourceIpId);
+    
+    
+    //SEARCH BY NETWORK
+
+    List<FirewallRuleVO> listByNetworkAndPurposeAndNotRevoked(long networkId, FirewallRule.Purpose purpose);
+   
     List<FirewallRuleVO> listByNetworkAndPurpose(long networkId, FirewallRule.Purpose purpose);
+    
+    List<FirewallRuleVO> listByNetworkPurposeTrafficTypeAndNotRevoked(long networkId, FirewallRule.Purpose purpose, FirewallRule.TrafficType trafficType);
+    
+    List<FirewallRuleVO> listByNetworkPurposeTrafficType(long networkId, FirewallRule.Purpose purpose, FirewallRule.TrafficType trafficType);
+    
 
+    //SEARCH BY OTHER PARAMETERS
+    
+    //safe
     List<FirewallRuleVO> listStaticNatByVmId(long vmId);
 
-    List<FirewallRuleVO> listByIpPurposeAndProtocolAndNotRevoked(long ipAddressId, Integer startPort, Integer endPort, String protocol, FirewallRule.Purpose purpose);
-
+    //safe
     FirewallRuleVO findByRelatedId(long ruleId);
 
+    //safe
     List<FirewallRuleVO> listSystemRules();
 
-    List<FirewallRuleVO> listByIp(long ipAddressId);
-
-    List<FirewallRuleVO> listByIpAndNotRevoked(long ipAddressId);
-
-    long countRulesByIpId(long sourceIpId);
-    
-    List<FirewallRuleVO> listByNetworkPurposeTrafficTypeAndNotRevoked(long networkId, FirewallRule.Purpose purpose, FirewallRule.TrafficType trafficType);
-    List<FirewallRuleVO> listByNetworkPurposeTrafficType(long networkId, FirewallRule.Purpose purpose, FirewallRule.TrafficType trafficType);
-    
-    List<FirewallRuleVO> listByIpAndPurposeWithState(Long addressId, FirewallRule.Purpose purpose, FirewallRule.State state);
-        
+    //safe
     void loadSourceCidrs(FirewallRuleVO rule);
+    
+    //safe
+    boolean setStateToAdd(FirewallRuleVO rule);
 }


[2/3] Refactoring for the Load Balancing feature -

Posted by al...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java b/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java
index 45a8068..43cd537 100644
--- a/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java
+++ b/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java
@@ -31,7 +31,6 @@ import com.cloud.network.rules.FirewallRule.TrafficType;
 import com.cloud.network.rules.FirewallRuleVO;
 import com.cloud.server.ResourceTag.TaggedResourceType;
 import com.cloud.tags.dao.ResourceTagDao;
-import com.cloud.tags.dao.ResourceTagsDaoImpl;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.GenericSearchBuilder;
@@ -111,18 +110,6 @@ public class FirewallRulesDaoImpl extends GenericDaoBase<FirewallRuleVO, Long> i
     }
 
     @Override
-    public boolean releasePorts(long ipId, String protocol, FirewallRule.Purpose purpose, int[] ports) {
-        SearchCriteria<FirewallRuleVO> sc = ReleaseSearch.create();
-        sc.setParameters("protocol", protocol);
-        sc.setParameters("ipId", ipId);
-        sc.setParameters("purpose", purpose);
-        sc.setParameters("ports", ports);
-
-        int results = remove(sc);
-        return results == ports.length;
-    }
-
-    @Override
     public List<FirewallRuleVO> listByIpAndPurpose(long ipId, FirewallRule.Purpose purpose) {
         SearchCriteria<FirewallRuleVO> sc = AllFieldsSearch.create();
         sc.setParameters("ipId", ipId);
@@ -192,12 +179,6 @@ public class FirewallRulesDaoImpl extends GenericDaoBase<FirewallRuleVO, Long> i
     }
 
     @Override
-    public boolean revoke(FirewallRuleVO rule) {
-        rule.setState(State.Revoke);
-        return update(rule.getId(), rule);
-    }
-
-    @Override
     public List<FirewallRuleVO> listStaticNatByVmId(long vmId) {
         if (VmSearch == null) {
             SearchBuilder<IPAddressVO> IpSearch = _ipDao.createSearchBuilder();
@@ -313,9 +294,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase<FirewallRuleVO, Long> i
         txn.start();
         FirewallRuleVO entry = findById(id);
         if (entry != null) {
-            if (entry.getPurpose() == Purpose.LoadBalancing) {
-                _tagsDao.removeByIdAndType(id, TaggedResourceType.LoadBalancer);
-            } else if (entry.getPurpose() == Purpose.PortForwarding) {
+            if (entry.getPurpose() == Purpose.PortForwarding) {
                 _tagsDao.removeByIdAndType(id, TaggedResourceType.PortForwardingRule);
             } else if (entry.getPurpose() == Purpose.Firewall) {
                 _tagsDao.removeByIdAndType(id, TaggedResourceType.FirewallRule);
@@ -329,22 +308,6 @@ public class FirewallRulesDaoImpl extends GenericDaoBase<FirewallRuleVO, Long> i
     }
 
     @Override
-    public List<FirewallRuleVO> listByIpAndPurposeWithState(Long ipId, Purpose purpose, State state) {
-        SearchCriteria<FirewallRuleVO> sc = AllFieldsSearch.create();
-        sc.setParameters("ipId", ipId);
-
-        if (state != null) {
-            sc.setParameters("state", state);
-        }
-
-        if (purpose != null) {
-            sc.setParameters("purpose", purpose);
-        }
-
-        return listBy(sc);
-    }
-
-    @Override
     public void loadSourceCidrs(FirewallRuleVO rule) {
         List<String> sourceCidrs = _firewallRulesCidrsDao.getSourceCidrs(rule.getId());
         rule.setSourceCidrList(sourceCidrs);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/dao/LoadBalancerDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/dao/LoadBalancerDao.java b/server/src/com/cloud/network/dao/LoadBalancerDao.java
index 611282e..82ada2b 100644
--- a/server/src/com/cloud/network/dao/LoadBalancerDao.java
+++ b/server/src/com/cloud/network/dao/LoadBalancerDao.java
@@ -18,19 +18,23 @@ package com.cloud.network.dao;
 
 import java.util.List;
 
+import com.cloud.network.rules.LoadBalancer;
 import com.cloud.utils.db.GenericDao;
 
 public interface LoadBalancerDao extends GenericDao<LoadBalancerVO, Long> {
-    List<Long> listInstancesByLoadBalancer(long loadBalancerId);
-
+    
     List<LoadBalancerVO> listByIpAddress(long ipAddressId);
 
-    LoadBalancerVO findByIpAddressAndPublicPort(long ipAddressId, String publicPort);
-
-    LoadBalancerVO findByAccountAndName(Long accountId, String name);
-
     List<LoadBalancerVO> listByNetworkId(long networkId);
 
     List<LoadBalancerVO> listInTransitionStateByNetworkId(long networkId);
+    
+    boolean setStateToAdd(LoadBalancerVO rule);
+    
+    List<LoadBalancerVO> listByIpAndNotRevoked(long ipAddressId);
+    
+    List<LoadBalancerVO> listByNetworkNotRevoked(long networkId);
+    
+    List<LoadBalancerVO> listByIpAndState(Long addressId, LoadBalancer.State state);
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java b/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java
index f211a7f..49a2e63 100644
--- a/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java
+++ b/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java
@@ -16,18 +16,18 @@
 // under the License.
 package com.cloud.network.dao;
 
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.ArrayList;
 import java.util.List;
 
 import javax.ejb.Local;
 import javax.inject.Inject;
 
-import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
 import com.cloud.network.rules.FirewallRule.State;
+import com.cloud.network.rules.LoadBalancer;
+import com.cloud.server.ResourceTag.TaggedResourceType;
+import com.cloud.tags.dao.ResourceTagDao;
+import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
@@ -37,37 +37,33 @@ import com.cloud.utils.db.Transaction;
 @Component
 @Local(value = { LoadBalancerDao.class })
 public class LoadBalancerDaoImpl extends GenericDaoBase<LoadBalancerVO, Long> implements LoadBalancerDao {
-    private static final Logger s_logger = Logger.getLogger(LoadBalancerDaoImpl.class);
-    private static final String LIST_INSTANCES_BY_LOAD_BALANCER = "SELECT vm.id " +
-            "    FROM vm_instance vm, load_balancer lb, ip_forwarding fwd, user_ip_address ip " +
-            "    WHERE lb.id = ? AND " +
-            "          fwd.group_id = lb.id AND " +
-            "          fwd.forwarding = 0 AND " +
-            "          fwd.private_ip_address = vm.private_ip_address AND " +
-            "          lb.ip_address = ip.public_ip_address AND " +
-            "          ip.data_center_id = vm.data_center_id ";
     private final SearchBuilder<LoadBalancerVO> ListByIp;
-    private final SearchBuilder<LoadBalancerVO> IpAndPublicPortSearch;
-    private final SearchBuilder<LoadBalancerVO> AccountAndNameSearch;
     protected final SearchBuilder<LoadBalancerVO> TransitionStateSearch;
+    protected final SearchBuilder<LoadBalancerVO> AllFieldsSearch;
+    protected final SearchBuilder<LoadBalancerVO> NotRevokedSearch;
+    @Inject ResourceTagDao _tagsDao;
 
     @Inject protected FirewallRulesCidrsDao _portForwardingRulesCidrsDao;
 
     protected LoadBalancerDaoImpl() {
+        AllFieldsSearch = createSearchBuilder();
+        AllFieldsSearch.and("ipAddressId", AllFieldsSearch.entity().getSourceIpAddressId(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.and("networkId", AllFieldsSearch.entity().getNetworkId(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.and("state", AllFieldsSearch.entity().getState(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.done();
+        
+        NotRevokedSearch = createSearchBuilder();
+        NotRevokedSearch.and("ipId", NotRevokedSearch.entity().getSourceIpAddressId(), Op.EQ);
+        NotRevokedSearch.and("networkId", NotRevokedSearch.entity().getNetworkId(), Op.EQ);
+        NotRevokedSearch.and("state", NotRevokedSearch.entity().getState(), Op.NEQ);
+        NotRevokedSearch.done();
+        
+        
         ListByIp = createSearchBuilder();
         ListByIp.and("ipAddressId", ListByIp.entity().getSourceIpAddressId(), SearchCriteria.Op.EQ);
         ListByIp.and("networkId", ListByIp.entity().getNetworkId(), SearchCriteria.Op.EQ);
         ListByIp.done();
-
-        IpAndPublicPortSearch = createSearchBuilder();
-        IpAndPublicPortSearch.and("ipAddressId", IpAndPublicPortSearch.entity().getSourceIpAddressId(), SearchCriteria.Op.EQ);
-        IpAndPublicPortSearch.and("publicPort", IpAndPublicPortSearch.entity().getSourcePortStart(), SearchCriteria.Op.EQ);
-        IpAndPublicPortSearch.done();
-
-        AccountAndNameSearch = createSearchBuilder();
-        AccountAndNameSearch.and("accountId", AccountAndNameSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
-        AccountAndNameSearch.and("name", AccountAndNameSearch.entity().getName(), SearchCriteria.Op.EQ);
-        AccountAndNameSearch.done();
+        
 
         TransitionStateSearch = createSearchBuilder();
         TransitionStateSearch.and("networkId", TransitionStateSearch.entity().getNetworkId(), Op.EQ);
@@ -75,26 +71,6 @@ public class LoadBalancerDaoImpl extends GenericDaoBase<LoadBalancerVO, Long> im
         TransitionStateSearch.done();
     }
 
-    @Override
-    public List<Long> listInstancesByLoadBalancer(long loadBalancerId) {
-        Transaction txn = Transaction.currentTxn();
-        String sql = LIST_INSTANCES_BY_LOAD_BALANCER;
-        PreparedStatement pstmt = null;
-        List<Long> instanceList = new ArrayList<Long>();
-        try {
-            pstmt = txn.prepareAutoCloseStatement(sql);
-            pstmt.setLong(1, loadBalancerId);
-
-            ResultSet rs = pstmt.executeQuery();
-            while (rs.next()) {
-                Long vmId = rs.getLong(1);
-                instanceList.add(vmId);
-            }
-        } catch (Exception ex) {
-            s_logger.error("error getting recent usage network stats", ex);
-        }
-        return instanceList;
-    }
 
     @Override
     public List<LoadBalancerVO> listByIpAddress(long ipAddressId) {
@@ -109,28 +85,66 @@ public class LoadBalancerDaoImpl extends GenericDaoBase<LoadBalancerVO, Long> im
         sc.setParameters("networkId", networkId);
         return listBy(sc);
     }
+    
 
     @Override
-    public LoadBalancerVO findByIpAddressAndPublicPort(long ipAddressId, String publicPort) {
-        SearchCriteria<LoadBalancerVO> sc = IpAndPublicPortSearch.create();
-        sc.setParameters("ipAddressId", ipAddressId);
-        sc.setParameters("publicPort", publicPort);
-        return findOneBy(sc);
+    public List<LoadBalancerVO> listInTransitionStateByNetworkId(long networkId) {
+        SearchCriteria<LoadBalancerVO> sc = TransitionStateSearch.create();
+        sc.setParameters("networkId", networkId);
+        sc.setParameters("state", State.Add.toString(), State.Revoke.toString());
+        return listBy(sc);
     }
-
+    
     @Override
-    public LoadBalancerVO findByAccountAndName(Long accountId, String name) {
-        SearchCriteria<LoadBalancerVO> sc = AccountAndNameSearch.create();
-        sc.setParameters("accountId", accountId);
-        sc.setParameters("name", name);
-        return findOneBy(sc);
+    public boolean setStateToAdd(LoadBalancerVO rule) {
+        SearchCriteria<LoadBalancerVO> sc = AllFieldsSearch.create();
+        sc.setParameters("id", rule.getId());
+        sc.setParameters("state", LoadBalancer.State.Staged);
+
+        rule.setState(LoadBalancer.State.Add);
+
+        return update(rule, sc) > 0;
     }
+    
+    
+    @Override
+    public List<LoadBalancerVO> listByIpAndNotRevoked(long ipId) {
+        SearchCriteria<LoadBalancerVO> sc = NotRevokedSearch.create();
+        sc.setParameters("ipId", ipId);
+        sc.setParameters("state", State.Revoke);
 
+        return listBy(sc);
+    }
+    
     @Override
-    public List<LoadBalancerVO> listInTransitionStateByNetworkId(long networkId) {
-        SearchCriteria<LoadBalancerVO> sc = TransitionStateSearch.create();
+    @DB
+    public boolean remove(Long id) {
+        Transaction txn = Transaction.currentTxn();
+        txn.start();
+        _tagsDao.removeByIdAndType(id, TaggedResourceType.LoadBalancer);
+        boolean result = super.remove(id);
+        txn.commit();
+        return result;
+    }
+    
+    @Override
+    public List<LoadBalancerVO> listByNetworkNotRevoked(long networkId) {
+        SearchCriteria<LoadBalancerVO> sc = NotRevokedSearch.create();
         sc.setParameters("networkId", networkId);
-        sc.setParameters("state", State.Add.toString(), State.Revoke.toString());
+        sc.setParameters("state", State.Revoke);
+
+        return listBy(sc);
+    }
+
+    @Override
+    public List<LoadBalancerVO> listByIpAndState(Long addressId, LoadBalancer.State state) {
+        SearchCriteria<LoadBalancerVO> sc = AllFieldsSearch.create();
+        sc.setParameters("ipId", addressId);
+
+        if (state != null) {
+            sc.setParameters("state", state);
+        }
+
         return listBy(sc);
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/dao/LoadBalancerVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/dao/LoadBalancerVO.java b/server/src/com/cloud/network/dao/LoadBalancerVO.java
index 5422f41..65b3b64 100644
--- a/server/src/com/cloud/network/dao/LoadBalancerVO.java
+++ b/server/src/com/cloud/network/dao/LoadBalancerVO.java
@@ -16,21 +16,33 @@
 // under the License.
 package com.cloud.network.dao;
 
+import java.util.Date;
+import java.util.UUID;
+
 import javax.persistence.Column;
-import javax.persistence.DiscriminatorValue;
 import javax.persistence.Entity;
-import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
 import javax.persistence.Table;
 
-import com.cloud.network.rules.FirewallRuleVO;
 import com.cloud.network.rules.LoadBalancer;
+import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.net.NetUtils;
 
 @Entity
 @Table(name=("load_balancing_rules"))
-@DiscriminatorValue(value="LoadBalancing")
-@PrimaryKeyJoinColumn(name="id")
-public class LoadBalancerVO extends FirewallRuleVO implements LoadBalancer {
+public class LoadBalancerVO implements LoadBalancer {
+    
+    @Id
+    @GeneratedValue(strategy=GenerationType.IDENTITY)
+    @Column(name="id")
+    long id;
+    
+    @Column(name="uuid")
+    String uuid;
     
     @Column(name="name")
     private String name;
@@ -46,19 +58,81 @@ public class LoadBalancerVO extends FirewallRuleVO implements LoadBalancer {
     
     @Column(name="default_port_end")
     private int defaultPortEnd;
+    
+    @Column(name="start_port", updatable=false)
+    Integer sourcePortStart;
+
+    @Column(name="end_port", updatable=false)
+    Integer sourcePortEnd;
+    
+    @Column(name="network_id")
+    Long networkId;
+    
+    @Enumerated(value=EnumType.STRING)
+    @Column(name="state")
+    LoadBalancer.State state;
+    
+    @Column(name="ip_address_id", updatable=false)
+    Long sourceIpAddressId;
+    
+    @Column(name="domain_id", updatable=false)
+    long domainId;
+
+    @Column(name="account_id", updatable=false)
+    long accountId;
+    
+    @Column(name="protocol", updatable=false)
+    String protocol = NetUtils.TCP_PROTO;
+    
+    @Column(name=GenericDao.CREATED_COLUMN)
+    Date created;
+
+
+    public Integer getSourcePortStart() {
+        return sourcePortStart;
+    }
+
+    public Integer getSourcePortEnd() {
+        return sourcePortEnd;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public long getDomainId() {
+        return domainId;
+    }
+
+    public long getAccountId() {
+        return accountId;
+    }
 
     public LoadBalancerVO() { 
     }
 
-    public LoadBalancerVO(String xId, String name, String description, long srcIpId, int srcPort, int dstPort, String algorithm, long networkId, long accountId, long domainId) {
-        super(xId, srcIpId, srcPort, NetUtils.TCP_PROTO, networkId, accountId, domainId, Purpose.LoadBalancing, null, null, null, null);
+    public LoadBalancerVO(String name, String description, long srcIpId, int srcPort, int dstPort, String algorithm,
+            long networkId, long accountId, long domainId) {
         this.name = name;
         this.description = description;
         this.algorithm = algorithm;
         this.defaultPortStart = dstPort;
         this.defaultPortEnd = dstPort;
+        this.sourcePortStart = srcPort;
+        this.sourcePortEnd = srcPort;
+        this.state = State.Staged;
+        this.networkId = networkId;
+        this.accountId = accountId;
+        this.domainId = domainId;
+        this.uuid = UUID.randomUUID().toString();
+        this.sourceIpAddressId = srcIpId;
+
     }
     
+    public void setState(LoadBalancer.State state) {
+        this.state = state;
+    }
+
     @Override
     public String getName() {
         return name;
@@ -95,4 +169,29 @@ public class LoadBalancerVO extends FirewallRuleVO implements LoadBalancer {
     public void setDescription(String description) {
         this.description = description;
     }  
+    
+    @Override
+    public String getUuid() {
+        return this.uuid;
+    }
+    
+    @Override
+    public long getNetworkId() {
+        return networkId;
+    }
+    
+    @Override
+    public String getProtocol() {
+        return protocol;
+    }
+    
+    @Override
+    public Long getSourceIpAddressId() {
+        return sourceIpAddressId;
+    }
+    
+    @Override
+    public State getState() {
+        return state;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/element/VirtualRouterElement.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java
index 169db32..130fc77 100755
--- a/server/src/com/cloud/network/element/VirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VirtualRouterElement.java
@@ -25,7 +25,6 @@ import java.util.Set;
 import javax.ejb.Local;
 import javax.inject.Inject;
 
-import com.cloud.utils.PropertiesUtil;
 import org.apache.cloudstack.api.command.admin.router.ConfigureVirtualRouterElementCmd;
 import org.apache.cloudstack.api.command.admin.router.CreateVirtualRouterElementCmd;
 import org.apache.cloudstack.api.command.admin.router.ListVirtualRouterElementsCmd;
@@ -358,7 +357,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
                 return true;
             }
 
-            if (!_routerMgr.applyFirewallRules(network, rules, routers)) {
+            if (!_routerMgr.applyLbRules(network, rules, routers)) {
                 throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
             } else {
                 return true;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
index 080f7b0..bd525e1 100644
--- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
+++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
@@ -27,17 +27,11 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.api.command.user.firewall.ListEgressFirewallRulesCmd;
 import org.apache.cloudstack.api.command.user.firewall.ListFirewallRulesCmd;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
-import com.mysql.jdbc.ConnectionPropertiesImpl;
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.api.BaseListCmd;
-import org.apache.cloudstack.api.command.user.firewall.ListEgressFirewallRulesCmd;
-import org.apache.cloudstack.api.command.user.firewall.ListFirewallRulesCmd;
-import com.cloud.configuration.Config;
 import com.cloud.configuration.dao.ConfigurationDao;
 import com.cloud.domain.dao.DomainDao;
 import com.cloud.event.ActionEvent;
@@ -52,7 +46,6 @@ import com.cloud.network.IpAddress;
 import com.cloud.network.Network;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.Service;
-import com.cloud.network.Networks.TrafficType;
 import com.cloud.network.NetworkManager;
 import com.cloud.network.NetworkModel;
 import com.cloud.network.NetworkRuleApplier;
@@ -64,10 +57,15 @@ import com.cloud.network.element.FirewallServiceProvider;
 import com.cloud.network.element.NetworkACLServiceProvider;
 import com.cloud.network.element.PortForwardingServiceProvider;
 import com.cloud.network.element.StaticNatServiceProvider;
-import com.cloud.network.rules.*;
+import com.cloud.network.rules.FirewallManager;
+import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRule.FirewallRuleType;
 import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.network.rules.FirewallRule.State;
+import com.cloud.network.rules.FirewallRuleVO;
+import com.cloud.network.rules.PortForwardingRule;
+import com.cloud.network.rules.PortForwardingRuleVO;
+import com.cloud.network.rules.StaticNat;
 import com.cloud.network.rules.dao.PortForwardingRulesDao;
 import com.cloud.network.vpc.VpcManager;
 import com.cloud.projects.Project.ListProjectResourcesCriteria;
@@ -86,8 +84,8 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.*;
 import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.UserVmVO;
@@ -136,13 +134,9 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
 
     @Inject List<NetworkACLServiceProvider> _networkAclElements;
 
-    private boolean _elbEnabled = false;
-
     @Override
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
         _name = name;
-        String elbEnabledString = _configDao.getValue(Config.ElasticLoadBalancerEnabled.key());
-        _elbEnabled = Boolean.parseBoolean(elbEnabledString);
         s_logger.info("Firewall provider list is " + _firewallElements.iterator().next());
         return true;
     }
@@ -441,8 +435,8 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
             networkId = ipAddress.getAssociatedWithNetworkId();
         }
 
-            // Validate ip address
-            _accountMgr.checkAccess(caller, null, true, ipAddress);
+        // Validate ip address
+        _accountMgr.checkAccess(caller, null, true, ipAddress);
 
         Network network = _networkModel.getNetwork(networkId);
         assert network != null : "Can't create port forwarding rule as network associated with public ip address is null?";
@@ -454,11 +448,7 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
         // Verify that the network guru supports the protocol specified
         Map<Network.Capability, String> caps = null;
 
-        if (purpose == Purpose.LoadBalancing) {
-            if (!_elbEnabled) {
-                caps = _networkModel.getNetworkServiceCapabilities(network.getId(), Service.Lb);
-            }
-        } else if (purpose == Purpose.PortForwarding) {
+        if (purpose == Purpose.PortForwarding) {
             caps = _networkModel.getNetworkServiceCapabilities(network.getId(), Service.PortForwarding);
             }else if (purpose == Purpose.Firewall){
                 caps = _networkModel.getNetworkServiceCapabilities(network.getId(),Service.Firewall);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java
index d98872a..0d2b454 100644
--- a/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java
+++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java
@@ -16,19 +16,18 @@
 // under the License.
 package com.cloud.network.lb;
 
+import java.util.List;
+
+import org.apache.cloudstack.api.command.user.loadbalancer.CreateLoadBalancerRuleCmd;
+
 import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.network.Network;
 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.rules.FirewallRule;
 import com.cloud.network.rules.LbStickinessMethod;
 import com.cloud.network.rules.LoadBalancer;
 import com.cloud.user.Account;
-import org.apache.cloudstack.api.command.user.loadbalancer.CreateLoadBalancerRuleCmd;
-
-import java.util.List;
 
 public interface LoadBalancingRulesManager extends LoadBalancingRulesService {
 
@@ -47,7 +46,6 @@ public interface LoadBalancingRulesManager extends LoadBalancingRulesService {
      * @return true if removal is successful
      */
     boolean removeVmFromLoadBalancers(long vmId);
-    boolean applyRules(Network network, FirewallRule.Purpose purpose, List<? extends FirewallRule> rules) throws ResourceUnavailableException ;
     boolean applyLoadBalancersForNetwork(long networkId) throws ResourceUnavailableException;
     String getLBCapability(long networkid, String capabilityName);
     boolean configureLbAutoScaleVmGroup(long vmGroupid, String currentState) throws ResourceUnavailableException;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/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 7ad1070..cb85ce1 100755
--- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
+++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
@@ -16,6 +16,34 @@
 // under the License.
 package com.cloud.network.lb;
 
+import java.security.InvalidParameterException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.api.ApiConstants;
+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;
+import org.apache.cloudstack.api.command.user.loadbalancer.UpdateLoadBalancerRuleCmd;
+import org.apache.cloudstack.api.response.ServiceResponse;
+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.ConfigurationManager;
@@ -30,21 +58,65 @@ import com.cloud.event.EventTypes;
 import com.cloud.event.UsageEventUtils;
 import com.cloud.event.dao.EventDao;
 import com.cloud.event.dao.UsageEventDao;
-import com.cloud.exception.*;
-import com.cloud.network.*;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.NetworkRuleConflictException;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.ExternalLoadBalancerUsageManager;
+import com.cloud.network.IpAddress;
+import com.cloud.network.LBHealthCheckPolicyVO;
+import com.cloud.network.Network;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
-import com.cloud.network.as.*;
+import com.cloud.network.NetworkManager;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.addr.PublicIp;
+import com.cloud.network.as.AutoScalePolicy;
+import com.cloud.network.as.AutoScalePolicyConditionMapVO;
+import com.cloud.network.as.AutoScaleVmGroup;
+import com.cloud.network.as.AutoScaleVmGroupPolicyMapVO;
+import com.cloud.network.as.AutoScaleVmGroupVO;
+import com.cloud.network.as.AutoScaleVmProfile;
 import com.cloud.network.as.Condition;
-import com.cloud.network.as.dao.*;
-import com.cloud.network.dao.*;
+import com.cloud.network.as.Counter;
+import com.cloud.network.as.dao.AutoScalePolicyConditionMapDao;
+import com.cloud.network.as.dao.AutoScalePolicyDao;
+import com.cloud.network.as.dao.AutoScaleVmGroupDao;
+import com.cloud.network.as.dao.AutoScaleVmGroupPolicyMapDao;
+import com.cloud.network.as.dao.AutoScaleVmProfileDao;
+import com.cloud.network.as.dao.ConditionDao;
+import com.cloud.network.as.dao.CounterDao;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.LBHealthCheckPolicyDao;
+import com.cloud.network.dao.LBStickinessPolicyDao;
+import com.cloud.network.dao.LBStickinessPolicyVO;
+import com.cloud.network.dao.LoadBalancerDao;
+import com.cloud.network.dao.LoadBalancerVMMapDao;
+import com.cloud.network.dao.LoadBalancerVMMapVO;
+import com.cloud.network.dao.LoadBalancerVO;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkServiceMapDao;
+import com.cloud.network.dao.NetworkVO;
 import com.cloud.network.element.LoadBalancingServiceProvider;
-import com.cloud.network.lb.LoadBalancingRule.*;
-import com.cloud.network.rules.*;
-import com.cloud.network.rules.FirewallRule.FirewallRuleType;
-import com.cloud.network.rules.FirewallRule.Purpose;
+import com.cloud.network.lb.LoadBalancingRule.LbAutoScalePolicy;
+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.network.rules.FirewallManager;
+import com.cloud.network.rules.FirewallRuleVO;
+import com.cloud.network.rules.HealthCheckPolicy;
+import com.cloud.network.rules.LbStickinessMethod;
 import com.cloud.network.rules.LbStickinessMethod.LbStickinessMethodParam;
+import com.cloud.network.rules.LoadBalancer;
+import com.cloud.network.rules.RulesManager;
+import com.cloud.network.rules.StickinessPolicy;
 import com.cloud.network.vpc.VpcManager;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.projects.Project.ListProjectResourcesCriteria;
@@ -53,38 +125,38 @@ import com.cloud.service.dao.ServiceOfferingDao;
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.tags.ResourceTagVO;
 import com.cloud.tags.dao.ResourceTagDao;
-import com.cloud.user.*;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.DomainService;
+import com.cloud.user.User;
+import com.cloud.user.UserContext;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.user.dao.UserDao;
 import com.cloud.uservm.UserVm;
 import com.cloud.utils.Pair;
 import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ManagerBase;
-import com.cloud.utils.db.*;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Filter;
+import com.cloud.utils.db.JoinBuilder;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.Nic;
 import com.cloud.vm.UserVmVO;
+import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachine.State;
 import com.cloud.vm.dao.NicDao;
 import com.cloud.vm.dao.UserVmDao;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.command.user.loadbalancer.*;
-import org.apache.cloudstack.api.response.ServiceResponse;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import java.security.InvalidParameterException;
-import java.util.*;
 
 @Component
 @Local(value = { LoadBalancingRulesManager.class, LoadBalancingRulesService.class })
 public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements LoadBalancingRulesManager,
-        LoadBalancingRulesService, NetworkRuleApplier {
+        LoadBalancingRulesService {
     private static final Logger s_logger = Logger.getLogger(LoadBalancingRulesManagerImpl.class);
 
     @Inject
@@ -120,8 +192,6 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
     @Inject
     UsageEventDao _usageEventDao;
     @Inject
-    FirewallRulesCidrsDao _firewallCidrsDao;
-    @Inject
     FirewallManager _firewallMgr;
     @Inject
     NetworkDao _networkDao;
@@ -131,7 +201,6 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
     DomainService _domainMgr;
     @Inject
     ConfigurationManager _configMgr;
-
     @Inject
     ExternalLoadBalancerUsageManager _externalLBUsageMgr;
     @Inject
@@ -166,6 +235,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
     UserDao _userDao;
     @Inject
     List<LoadBalancingServiceProvider> _lbProviders;
+    private boolean _elbEnabled = false;
+
 
     // Will return a string. For LB Stickiness this will be a json, for
     // autoscale this will be "," separated values
@@ -273,7 +344,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
 
         List<LoadBalancingRule> rules = Arrays.asList(rule);
 
-        if (!_networkMgr.applyRules(rules, FirewallRule.Purpose.LoadBalancing, this, false)) {
+        if (!applyRules(rules, false)) {
             s_logger.debug("LB rules' autoscale config are not completely applied");
             return false;
         }
@@ -289,14 +360,14 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
 
         LoadBalancerVO loadBalancer = _lbDao.findById(vmGroup.getLoadBalancerId());
 
-        FirewallRule.State backupState = loadBalancer.getState();
+        LoadBalancer.State backupState = loadBalancer.getState();
 
         if (vmGroup.getState().equals(AutoScaleVmGroup.State_New)) {
-            loadBalancer.setState(FirewallRule.State.Add);
+            loadBalancer.setState(LoadBalancer.State.Add);
             _lbDao.persist(loadBalancer);
-        } else if (loadBalancer.getState() == FirewallRule.State.Active
+        } else if (loadBalancer.getState() == LoadBalancer.State.Active
                 && vmGroup.getState().equals(AutoScaleVmGroup.State_Revoke)) {
-            loadBalancer.setState(FirewallRule.State.Add);
+            loadBalancer.setState(LoadBalancer.State.Add);
             _lbDao.persist(loadBalancer);
         }
 
@@ -321,7 +392,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         if (success) {
             if (vmGroup.getState().equals(AutoScaleVmGroup.State_New)) {
                 Transaction.currentTxn().start();
-                loadBalancer.setState(FirewallRule.State.Active);
+                loadBalancer.setState(LoadBalancer.State.Active);
                 s_logger.debug("LB rule " + loadBalancer.getId() + " state is set to Active");
                 _lbDao.persist(loadBalancer);
                 vmGroup.setState(AutoScaleVmGroup.State_Enabled);
@@ -435,7 +506,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         }
 
         _accountMgr.checkAccess(caller.getCaller(), null, true, loadBalancer);
-        if (loadBalancer.getState() == FirewallRule.State.Revoke) {
+        if (loadBalancer.getState() == LoadBalancer.State.Revoke) {
             throw new InvalidParameterValueException("Failed:  LB rule id: " + cmd.getLbRuleId()
                     + " is in deleting state: ");
         }
@@ -495,7 +566,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
 
         _accountMgr.checkAccess(caller.getCaller(), null, true, loadBalancer);
 
-        if (loadBalancer.getState() == FirewallRule.State.Revoke) {
+        if (loadBalancer.getState() == LoadBalancer.State.Revoke) {
             throw new InvalidParameterValueException("Failed:  LB rule id: " + cmd.getLbRuleId()
                     + " is in deleting state: ");
         }
@@ -541,11 +612,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
 
     private boolean validateRule(LoadBalancingRule lbRule) {
         Network network = _networkDao.findById(lbRule.getNetworkId());
-        Purpose purpose = lbRule.getPurpose();
-        if (purpose != Purpose.LoadBalancing) {
-            s_logger.debug("Unable to validate network rules for purpose: " + purpose.toString());
-            return false;
-        }
+
         for (LoadBalancingServiceProvider ne : _lbProviders) {
             boolean validated = ne.validateLBRule(network, lbRule);
             if (!validated)
@@ -564,8 +631,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         if (loadBalancer == null) {
             throw new InvalidParameterException("Invalid Load balancer Id:" + cmd.getLbRuleId());
         }
-        FirewallRule.State backupState = loadBalancer.getState();
-        loadBalancer.setState(FirewallRule.State.Add);
+        LoadBalancer.State backupState = loadBalancer.getState();
+        loadBalancer.setState(LoadBalancer.State.Add);
         _lbDao.persist(loadBalancer);
         try {
             applyLoadBalancerConfig(cmd.getLbRuleId());
@@ -595,8 +662,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         if (loadBalancer == null) {
             throw new InvalidParameterException("Invalid Load balancer Id:" + cmd.getLbRuleId());
         }
-        FirewallRule.State backupState = loadBalancer.getState();
-        loadBalancer.setState(FirewallRule.State.Add);
+        LoadBalancer.State backupState = loadBalancer.getState();
+        loadBalancer.setState(LoadBalancer.State.Add);
         _lbDao.persist(loadBalancer);
         try {
             applyLoadBalancerConfig(cmd.getLbRuleId());
@@ -632,12 +699,12 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                     + " for Stickiness policy id: " + stickinessPolicyId);
         }
         long loadBalancerId = loadBalancer.getId();
-        FirewallRule.State backupState = loadBalancer.getState();
+        LoadBalancer.State backupState = loadBalancer.getState();
         _accountMgr.checkAccess(caller.getCaller(), null, true, loadBalancer);
 
         if (apply) {
-            if (loadBalancer.getState() == FirewallRule.State.Active) {
-                loadBalancer.setState(FirewallRule.State.Add);
+            if (loadBalancer.getState() == LoadBalancer.State.Active) {
+                loadBalancer.setState(LoadBalancer.State.Add);
                 _lbDao.persist(loadBalancer);
             }
 
@@ -690,12 +757,12 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                     + " for HealthCheck policy id: " + healthCheckPolicyId);
         }
         long loadBalancerId = loadBalancer.getId();
-        FirewallRule.State backupState = loadBalancer.getState();
+        LoadBalancer.State backupState = loadBalancer.getState();
         _accountMgr.checkAccess(caller.getCaller(), null, true, loadBalancer);
 
         if (apply) {
-            if (loadBalancer.getState() == FirewallRule.State.Active) {
-                loadBalancer.setState(FirewallRule.State.Add);
+            if (loadBalancer.getState() == LoadBalancer.State.Active) {
+                loadBalancer.setState(LoadBalancer.State.Add);
                 _lbDao.persist(loadBalancer);
             }
 
@@ -858,7 +925,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                 throw ex;
             }
 
-            _rulesMgr.checkRuleAndUserVm(loadBalancer, vm, caller);
+            checkLbRuleAndUserVm(loadBalancer, vm, caller);
 
             if (vm.getAccountId() != loadBalancer.getAccountId()) {
                 throw new PermissionDeniedException("Cannot add virtual machines that do not belong to the same owner.");
@@ -902,9 +969,9 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             return true;
         }
         boolean success = false;
-        FirewallRule.State backupState = loadBalancer.getState();
+        LoadBalancer.State backupState = loadBalancer.getState();
         try {
-            loadBalancer.setState(FirewallRule.State.Add);
+            loadBalancer.setState(LoadBalancer.State.Add);
             _lbDao.persist(loadBalancer);
             applyLoadBalancerConfig(loadBalancerId);
             success = true;
@@ -957,9 +1024,9 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         _accountMgr.checkAccess(caller.getCaller(), null, true, loadBalancer);
 
         boolean success = false;
-        FirewallRule.State backupState = loadBalancer.getState();
+        LoadBalancer.State backupState = loadBalancer.getState();
         try {
-            loadBalancer.setState(FirewallRule.State.Add);
+            loadBalancer.setState(LoadBalancer.State.Add);
             _lbDao.persist(loadBalancer);
 
             for (long instanceId : instanceIds) {
@@ -1075,16 +1142,16 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         Transaction txn = Transaction.currentTxn();
         boolean generateUsageEvent = false;
         boolean success = true;
-        FirewallRule.State backupState = lb.getState();
+        LoadBalancer.State backupState = lb.getState();
 
         txn.start();
-        if (lb.getState() == FirewallRule.State.Staged) {
+        if (lb.getState() == LoadBalancer.State.Staged) {
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("Found a rule that is still in stage state so just removing it: " + lb);
             }
             generateUsageEvent = true;
-        } else if (lb.getState() == FirewallRule.State.Add || lb.getState() == FirewallRule.State.Active) {
-            lb.setState(FirewallRule.State.Revoke);
+        } else if (lb.getState() == LoadBalancer.State.Add || lb.getState() == LoadBalancer.State.Active) {
+            lb.setState(LoadBalancer.State.Revoke);
             _lbDao.persist(lb);
             generateUsageEvent = true;
         }
@@ -1147,11 +1214,11 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
 
         FirewallRuleVO relatedRule = _firewallDao.findByRelatedId(lb.getId());
         if (relatedRule != null) {
-            s_logger.warn("Unable to remove firewall rule id=" + lb.getId() + " as it has related firewall rule id="
+            s_logger.warn("Unable to remove lb rule id=" + lb.getId() + " as it has related firewall rule id="
                     + relatedRule.getId() + "; leaving it in Revoke state");
             success = false;
         } else {
-            _firewallMgr.removeRule(lb);
+            _lbDao.remove(lb.getId());
         }
 
         // FIXME: breaking the dependency on ELB manager. This breaks
@@ -1302,8 +1369,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             throw ex;
         }
 
-        _firewallMgr.validateFirewallRule(caller.getCaller(), ipAddr, srcPortStart, srcPortEnd, lb.getProtocol(),
-                Purpose.LoadBalancing, FirewallRuleType.User, networkId, null);
+        validateLbRule(caller.getCaller(), ipAddr, srcPortStart, srcPortEnd, lb.getProtocol(), networkId);
         NetworkVO network = _networkDao.findById(networkId);
         _accountMgr.checkAccess(caller.getCaller(), null, true, ipAddr);
 
@@ -1318,9 +1384,9 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         Transaction txn = Transaction.currentTxn();
         txn.start();
 
-        LoadBalancerVO newRule = new LoadBalancerVO(lb.getXid(), lb.getName(), lb.getDescription(),
-                lb.getSourceIpAddressId(), lb.getSourcePortEnd(), lb.getDefaultPortStart(), lb.getAlgorithm(),
-                network.getId(), ipAddr.getAllocatedToAccountId(), ipAddr.getAllocatedInDomainId());
+        LoadBalancerVO newRule = new LoadBalancerVO(lb.getName(), lb.getDescription(), lb.getSourceIpAddressId(),
+                lb.getSourcePortEnd(), lb.getDefaultPortStart(), lb.getAlgorithm(), network.getId(),
+                ipAddr.getAllocatedToAccountId(), ipAddr.getAllocatedInDomainId());
 
         // verify rule is supported by Lb provider of the network
         LoadBalancingRule loadBalancing = new LoadBalancingRule(newRule, new ArrayList<LbDestination>(),
@@ -1339,8 +1405,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         boolean success = true;
 
         try {
-            _firewallMgr.detectRulesConflict(newRule);
-            if (!_firewallDao.setStateToAdd(newRule)) {
+            //_firewallMgr.detectRulesConflict(newRule);
+            if (!_lbDao.setStateToAdd(newRule)) {
                 throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
             }
             s_logger.debug("Load balancer " + newRule.getId() + " for Ip address id=" + sourceIpId + ", public port "
@@ -1390,7 +1456,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         List<LoadBalancerVO> lbs = _lbDao.listByNetworkId(networkId);
         if (lbs != null) {
             for(LoadBalancerVO lb : lbs) { // called during restart, not persisting state in db
-                lb.setState(FirewallRule.State.Revoke);
+                lb.setState(LoadBalancer.State.Revoke);
             }
             return applyLoadBalancerRules(lbs, false); // called during restart, not persisting state in db
         } else {
@@ -1410,10 +1476,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         }
     }
 
-    @Override
-    public boolean applyRules(Network network, Purpose purpose, List<? extends FirewallRule> rules)
+    protected boolean applyLbRules(Network network, List<? extends LoadBalancer> rules)
             throws ResourceUnavailableException {
-        assert (purpose == Purpose.LoadBalancing) : "LB Manager asked to handle non-LB rules";
         boolean handled = false;
         for (LoadBalancingServiceProvider lbElement : _lbProviders) {
             Provider provider = lbElement.getProvider();
@@ -1458,7 +1522,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             rules.add(getLoadBalancerRuleToApply(lb));
         }
 
-        if (!_networkMgr.applyRules(rules, FirewallRule.Purpose.LoadBalancing, this, false)) {
+        if (!applyRules(rules, false)) {
             s_logger.debug("LB rules are not completely applied");
             return false;
         }
@@ -1467,12 +1531,12 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             for (LoadBalancerVO lb : lbs) {
                 boolean checkForReleaseElasticIp = false;
                 txn.start();
-                if (lb.getState() == FirewallRule.State.Revoke) {
+                if (lb.getState() == LoadBalancer.State.Revoke) {
                     removeLBRule(lb);
                     s_logger.debug("LB " + lb.getId() + " is successfully removed");
                     checkForReleaseElasticIp = true;
-                } else if (lb.getState() == FirewallRule.State.Add) {
-                    lb.setState(FirewallRule.State.Active);
+                } else if (lb.getState() == LoadBalancer.State.Add) {
+                    lb.setState(LoadBalancer.State.Active);
                     s_logger.debug("LB rule " + lb.getId() + " state is set to Active");
                     _lbDao.persist(lb);
                 }
@@ -1491,7 +1555,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                 }
 
                 if (_lb2VmMapDao.listByLoadBalancerId(lb.getId()).isEmpty()) {
-                    lb.setState(FirewallRule.State.Add);
+                    lb.setState(LoadBalancer.State.Add);
                     _lbDao.persist(lb);
                     s_logger.debug("LB rule " + lb.getId()
                             + " state is set to Add as there are no more active LB-VM mappings");
@@ -1562,10 +1626,10 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
 
     @Override
     public boolean removeAllLoadBalanacersForIp(long ipId, Account caller, long callerUserId) {
-        List<FirewallRuleVO> rules = _firewallDao.listByIpAndPurposeAndNotRevoked(ipId, Purpose.LoadBalancing);
+        List<LoadBalancerVO> rules = _lbDao.listByIpAndNotRevoked(ipId);
         if (rules != null)
             s_logger.debug("Found " + rules.size() + " lb rules to cleanup");
-        for (FirewallRule rule : rules) {
+        for (LoadBalancerVO rule : rules) {
             boolean result = deleteLoadBalancerRule(rule.getId(), true, caller, callerUserId, false);
             if (result == false) {
                 s_logger.warn("Unable to remove load balancer rule " + rule.getId());
@@ -1577,11 +1641,10 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
 
     @Override
     public boolean removeAllLoadBalanacersForNetwork(long networkId, Account caller, long callerUserId) {
-        List<FirewallRuleVO> rules = _firewallDao
-                .listByNetworkAndPurposeAndNotRevoked(networkId, Purpose.LoadBalancing);
+        List<LoadBalancerVO> rules = _lbDao.listByNetworkNotRevoked(networkId);
         if (rules != null)
             s_logger.debug("Found " + rules.size() + " lb rules to cleanup");
-        for (FirewallRule rule : rules) {
+        for (LoadBalancerVO rule : rules) {
             boolean result = deleteLoadBalancerRule(rule.getId(), true, caller, callerUserId, false);
             if (result == false) {
                 s_logger.warn("Unable to remove load balancer rule " + rule.getId());
@@ -1672,7 +1735,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         // If algorithm is changed, have to reapply the lb config
         if (algorithm != null) {
             try {
-                lb.setState(FirewallRule.State.Add);
+                lb.setState(LoadBalancer.State.Add);
                 _lbDao.persist(lb);
                 applyLoadBalancerConfig(lbRuleId);
             } catch (ResourceUnavailableException e) {
@@ -1930,4 +1993,116 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         // remove the rule
         _lbDao.remove(rule.getId());
     }
+    
+    private void checkLbRuleAndUserVm(LoadBalancer rule, UserVm userVm, Account caller) {
+        if (userVm == null || rule == null) {
+            return;
+        }
+
+        _accountMgr.checkAccess(caller, null, true, rule, userVm);
+
+        if (userVm.getState() == VirtualMachine.State.Destroyed || userVm.getState() == VirtualMachine.State.Expunging) {
+            throw new InvalidParameterValueException("Invalid user vm: " + userVm.getId());
+        }
+
+        if (rule.getAccountId() != userVm.getAccountId()) {
+            throw new InvalidParameterValueException("New lb rule " + rule + " and vm id=" + userVm.getId() + " belong to different accounts");
+        }
+    }
+    
+    
+    protected boolean applyRules(List<? extends LoadBalancer> rules, boolean continueOnError) throws ResourceUnavailableException {
+        if (rules == null || rules.size() == 0) {
+            s_logger.debug("There are no lb rules to forward to the network elements");
+            return true;
+        }
+
+        boolean success = true;
+        Network network = _networkDao.findById(rules.get(0).getNetworkId());
+        List<PublicIp> publicIps = new ArrayList<PublicIp>();
+
+        // get the list of public ip's owned by the network
+        List<IPAddressVO> userIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), null);
+        if (userIps != null && !userIps.isEmpty()) {
+            for (IPAddressVO userIp : userIps) {
+                PublicIp publicIp = PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId()));
+                publicIps.add(publicIp);
+            }
+        }
+
+        // rules can not programmed unless IP is associated with network
+        // service provider, so run IP assoication for
+        // the network so as to ensure IP is associated before applying
+        // rules (in add state)
+        _networkMgr.applyIpAssociations(network, false, continueOnError, publicIps);
+
+        try {
+            applyLbRules(network, rules);
+        } catch (ResourceUnavailableException e) {
+            if (!continueOnError) {
+                throw e;
+            }
+            s_logger.warn("Problems with applying lb rules but pushing on", e);
+            success = false;
+        }
+
+        // if all the rules configured on public IP are revoked then
+        // dis-associate IP with network service provider
+        _networkMgr.applyIpAssociations(network, true, continueOnError, publicIps);
+        
+
+        return success;
+    }
+    
+    
+    protected void validateLbRule(Account caller, IPAddressVO ipAddress, Integer portStart, Integer portEnd, String proto, Long networkId) {
+        if (portStart != null && !NetUtils.isValidPort(portStart)) {
+            throw new InvalidParameterValueException("Public port is an invalid value: " + portStart);
+        }
+        if (portEnd != null && !NetUtils.isValidPort(portEnd)) {
+            throw new InvalidParameterValueException("Public port range is an invalid value: " + portEnd);
+        }
+
+        // start port can't be bigger than end port
+        if (portStart != null && portEnd != null && portStart > portEnd) {
+            throw new InvalidParameterValueException("Start port can't be bigger than end port");
+        }
+
+        if (ipAddress != null){
+            if (ipAddress.getAssociatedWithNetworkId() == null) {
+                    throw new InvalidParameterValueException("Unable to create lb rule ; ip with specified id is not associated with any network");
+            } else {
+                networkId = ipAddress.getAssociatedWithNetworkId();
+            }
+    
+            // Validate ip address
+            _accountMgr.checkAccess(caller, null, true, ipAddress);
+    
+            Network network = _networkModel.getNetwork(networkId);
+            assert network != null : "Can't create port forwarding rule as network associated with public ip address is null?";
+    
+                
+            // Verify that the network guru supports the protocol specified
+            Map<Network.Capability, String> caps = null;
+            if (!_elbEnabled) {
+                 caps = _networkModel.getNetworkServiceCapabilities(network.getId(), Service.Lb);
+            }
+
+            if (caps != null) {
+                String supportedProtocols = caps.get(Capability.SupportedProtocols).toLowerCase();
+                
+                if (!supportedProtocols.contains(proto.toLowerCase())) {
+                    throw new InvalidParameterValueException("Protocol " + proto + " is not supported in zone " + network.getDataCenterId());
+                }
+            }
+        }
+    }
+    
+    @Override
+    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+        _name = name;
+        String elbEnabledString = _configDao.getValue(Config.ElasticLoadBalancerEnabled.key());
+        _elbEnabled = Boolean.parseBoolean(elbEnabledString);
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
index f49ab79..4049e03 100644
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
@@ -29,6 +29,7 @@ import com.cloud.network.RemoteAccessVpn;
 import com.cloud.network.VirtualNetworkApplianceService;
 import com.cloud.network.VpnUser;
 import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.LoadBalancer;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.user.Account;
 import com.cloud.user.User;
@@ -103,4 +104,6 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
 	
 	boolean applyUserData(Network config, NicProfile nic, VirtualMachineProfile<UserVm> vm, DeployDestination dest, 
 	        List<DomainRouterVO> routers) throws ResourceUnavailableException;
+
+    boolean applyLbRules(Network network, List<? extends LoadBalancer> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index afdbbca..5227434 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -172,6 +172,7 @@ import com.cloud.network.router.VirtualRouter.RedundantState;
 import com.cloud.network.router.VirtualRouter.Role;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRule.Purpose;
+import com.cloud.network.rules.LoadBalancer;
 import com.cloud.network.rules.PortForwardingRule;
 import com.cloud.network.rules.RulesManager;
 import com.cloud.network.rules.StaticNat;
@@ -3299,19 +3300,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
         return applyRules(network, routers, "firewall rules", false, null, false, new RuleApplier() {
             @Override
             public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException {
-                if (rules.get(0).getPurpose() == Purpose.LoadBalancing) {
-                    // for load balancer we have to resend all lb rules for the network
-                    List<LoadBalancerVO> lbs = _loadBalancerDao.listByNetworkId(network.getId());
-                    List<LoadBalancingRule> lbRules = new ArrayList<LoadBalancingRule>();
-                    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, hcPolicyList);
-                        lbRules.add(loadBalancing);
-                    }
-                    return sendLBRules(router, lbRules, network.getId());
-                } else if (rules.get(0).getPurpose() == Purpose.PortForwarding) {
+                if (rules.get(0).getPurpose() == Purpose.PortForwarding) {
                     return sendPortForwardingRules(router, (List<PortForwardingRule>) rules, network.getId());
                 } else if (rules.get(0).getPurpose() == Purpose.StaticNat) {
                     return sendStaticNatRules(router, (List<StaticNatRule>) rules, network.getId());
@@ -3324,6 +3313,30 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
             }
         });
     }
+    
+    @Override
+    public boolean applyLbRules(Network network, final List<? extends LoadBalancer> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
+        if (rules == null || rules.isEmpty()) {
+            s_logger.debug("No lb rules to be applied for network " + network.getId());
+            return true;
+        }
+        return applyRules(network, routers, "lb rules", false, null, false, new RuleApplier() {
+            @Override
+            public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException {
+                // for load balancer we have to resend all lb rules for the network
+                List<LoadBalancerVO> lbs = _loadBalancerDao.listByNetworkId(network.getId());
+                List<LoadBalancingRule> lbRules = new ArrayList<LoadBalancingRule>();
+                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, hcPolicyList);
+                    lbRules.add(loadBalancing);
+                }
+                return sendLBRules(router, lbRules, network.getId());
+            }
+        });
+    }
 
     protected boolean sendLBRules(VirtualRouter router, List<LoadBalancingRule> rules, long guestNetworkId) throws ResourceUnavailableException {
         Commands cmds = new Commands(OnError.Continue);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/rules/FirewallRuleVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/rules/FirewallRuleVO.java b/server/src/com/cloud/network/rules/FirewallRuleVO.java
index a761520..9f73029 100644
--- a/server/src/com/cloud/network/rules/FirewallRuleVO.java
+++ b/server/src/com/cloud/network/rules/FirewallRuleVO.java
@@ -20,7 +20,6 @@ import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 
-import javax.inject.Inject;
 import javax.persistence.Column;
 import javax.persistence.DiscriminatorColumn;
 import javax.persistence.DiscriminatorType;
@@ -35,7 +34,6 @@ import javax.persistence.InheritanceType;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 
-import com.cloud.network.dao.FirewallRulesCidrsDao;
 import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.net.NetUtils;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/rules/RulesManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/rules/RulesManager.java b/server/src/com/cloud/network/rules/RulesManager.java
index 4b83e04..8587e4a 100644
--- a/server/src/com/cloud/network/rules/RulesManager.java
+++ b/server/src/com/cloud/network/rules/RulesManager.java
@@ -41,8 +41,6 @@ public interface RulesManager extends RulesService {
 
     void checkIpAndUserVm(IpAddress ipAddress, UserVm userVm, Account caller);
 
-    void checkRuleAndUserVm(FirewallRule rule, UserVm userVm, Account caller);
-
     boolean revokeAllPFAndStaticNatRulesForIp(long ipId, long userId, Account caller) throws ResourceUnavailableException;
 
     boolean revokeAllPFStaticNatRulesForNetwork(long networkId, long userId, Account caller) throws ResourceUnavailableException;
@@ -66,8 +64,6 @@ public interface RulesManager extends RulesService {
 
     FirewallRule[] reservePorts(IpAddress ip, String protocol, FirewallRule.Purpose purpose, boolean openFirewall, Account caller, int... ports) throws NetworkRuleConflictException;
 
-    boolean releasePorts(long ipId, String protocol, FirewallRule.Purpose purpose, int... ports);
-
     List<PortForwardingRuleVO> listByNetworkId(long networkId);
 
     boolean applyStaticNatForIp(long sourceIpId, boolean continueOnError, Account caller, boolean forRevoke);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/src/com/cloud/network/rules/RulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java
index 29ed5f3..8b8f0b6 100755
--- a/server/src/com/cloud/network/rules/RulesManagerImpl.java
+++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java
@@ -24,7 +24,6 @@ import java.util.Set;
 
 import javax.ejb.Local;
 import javax.inject.Inject;
-import javax.naming.ConfigurationException;
 
 import org.apache.cloudstack.api.command.user.firewall.ListPortForwardingRulesCmd;
 import org.apache.log4j.Logger;
@@ -50,6 +49,8 @@ import com.cloud.network.dao.FirewallRulesCidrsDao;
 import com.cloud.network.dao.FirewallRulesDao;
 import com.cloud.network.dao.IPAddressDao;
 import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.LoadBalancerDao;
+import com.cloud.network.dao.LoadBalancerVO;
 import com.cloud.network.rules.FirewallRule.FirewallRuleType;
 import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.network.rules.dao.PortForwardingRulesDao;
@@ -66,7 +67,6 @@ import com.cloud.user.UserContext;
 import com.cloud.uservm.UserVm;
 import com.cloud.utils.Pair;
 import com.cloud.utils.Ternary;
-import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Filter;
@@ -128,6 +128,8 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
     VpcManager _vpcMgr;
     @Inject
     NicSecondaryIpDao _nicSecondaryDao;
+    @Inject
+    LoadBalancerDao _lbDao;
 
     @Override
     public void checkIpAndUserVm(IpAddress ipAddress, UserVm userVm, Account caller) {
@@ -157,8 +159,7 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
 
     }
 
-    @Override
-    public void checkRuleAndUserVm(FirewallRule rule, UserVm userVm, Account caller) {
+    private void checkRuleAndUserVm(FirewallRule rule, UserVm userVm, Account caller) {
         if (userVm == null || rule == null) {
             return;
         }
@@ -558,7 +559,7 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
                 throw new NetworkRuleConflictException("Failed to enable static nat for the ip address " + ipAddress + " as it already has PortForwarding rules assigned");
             }
 
-            List<FirewallRuleVO> loadBalancingRules = _firewallDao.listByIpAndPurposeAndNotRevoked(ipAddress.getId(), Purpose.LoadBalancing);
+            List<LoadBalancerVO> loadBalancingRules = _lbDao.listByIpAndNotRevoked(ipAddress.getId());
             if (loadBalancingRules != null && !loadBalancingRules.isEmpty()) {
                 throw new NetworkRuleConflictException("Failed to enable static nat for the ip address " + ipAddress + " as it already has LoadBalancing rules assigned");
             }
@@ -571,7 +572,7 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
 
         if (oldIP != null) {
             // If elasticIP functionality is supported in the network, we always have to disable static nat on the old
-// ip in order to re-enable it on the new one
+            // ip in order to re-enable it on the new one
             Long networkId = oldIP.getAssociatedWithNetworkId();
             boolean reassignStaticNat = false;
             if (networkId != null) {
@@ -1120,11 +1121,6 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
     }
 
     @Override
-    public boolean releasePorts(long ipId, String protocol, FirewallRule.Purpose purpose, int... ports) {
-        return _firewallDao.releasePorts(ipId, protocol, purpose, ports);
-    }
-
-    @Override
     @DB
     public FirewallRuleVO[] reservePorts(IpAddress ip, String protocol, FirewallRule.Purpose purpose, 
             boolean openFirewall, Account caller, int... ports) throws NetworkRuleConflictException {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/test/com/cloud/network/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java
index 6da48ec..d903042 100755
--- a/server/test/com/cloud/network/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java
@@ -28,8 +28,8 @@ import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementors
 import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
 import org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
 import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
-import org.springframework.stereotype.Component;
 import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
+import org.springframework.stereotype.Component;
 
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.Pod;
@@ -55,24 +55,21 @@ import com.cloud.network.element.UserDataServiceProvider;
 import com.cloud.network.guru.NetworkGuru;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRule.Purpose;
-import com.cloud.network.rules.FirewallRule.State;
+import com.cloud.network.rules.LoadBalancer.State;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.user.Account;
 import com.cloud.user.User;
 import com.cloud.utils.Pair;
-import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.vm.Nic;
 import com.cloud.vm.NicProfile;
-import com.cloud.vm.NicSecondaryIp;
 import com.cloud.vm.NicVO;
 import com.cloud.vm.ReservationContext;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile;
-import com.cloud.vm.VirtualMachineProfileImpl;
 
 @Component
 @Local(value = { NetworkManager.class, NetworkService.class })
@@ -808,12 +805,6 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
     }
 
     @Override
-    public int getRuleCountForIp(Long addressId, Purpose purpose, State state) {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    @Override
     public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network) {
         // TODO Auto-generated method stub
         return null;
@@ -888,4 +879,10 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
         // TODO Auto-generated method stub
         return null;
     }
+
+    @Override
+    public int getLbRuleCountForIp(Long addressId, State state) {
+        // TODO Auto-generated method stub
+        return 0;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/test/com/cloud/network/MockRulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockRulesManagerImpl.java b/server/test/com/cloud/network/MockRulesManagerImpl.java
index e5a6894..d4961ce 100644
--- a/server/test/com/cloud/network/MockRulesManagerImpl.java
+++ b/server/test/com/cloud/network/MockRulesManagerImpl.java
@@ -28,16 +28,15 @@ import com.cloud.exception.InsufficientAddressCapacityException;
 import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.network.rules.PortForwardingRule;
 import com.cloud.network.rules.PortForwardingRuleVO;
 import com.cloud.network.rules.RulesManager;
 import com.cloud.network.rules.RulesService;
 import com.cloud.network.rules.StaticNatRule;
-import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.user.Account;
 import com.cloud.uservm.UserVm;
 import com.cloud.utils.Pair;
-import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.net.Ip;
 import com.cloud.vm.VirtualMachine;
@@ -170,13 +169,6 @@ public class MockRulesManagerImpl extends ManagerBase implements RulesManager, R
 	}
 
 	@Override
-	public void checkRuleAndUserVm(FirewallRule rule, UserVm userVm,
-			Account caller) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
 	public boolean revokeAllPFAndStaticNatRulesForIp(long ipId, long userId,
 			Account caller) throws ResourceUnavailableException {
 		// TODO Auto-generated method stub
@@ -231,13 +223,6 @@ public class MockRulesManagerImpl extends ManagerBase implements RulesManager, R
 	}
 
 	@Override
-	public boolean releasePorts(long ipId, String protocol, Purpose purpose,
-			int... ports) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
 	public List<PortForwardingRuleVO> listByNetworkId(long networkId) {
 		// TODO Auto-generated method stub
 		return null;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
index ead0051..4cb7444 100644
--- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
@@ -58,7 +58,6 @@ import com.cloud.network.PhysicalNetwork;
 import com.cloud.network.PhysicalNetworkServiceProvider;
 import com.cloud.network.PhysicalNetworkTrafficType;
 import com.cloud.network.PublicIpAddress;
-import com.cloud.network.UserIpv6Address;
 import com.cloud.network.addr.PublicIp;
 import com.cloud.network.dao.IPAddressVO;
 import com.cloud.network.dao.NetworkServiceMapDao;
@@ -70,7 +69,7 @@ import com.cloud.network.element.UserDataServiceProvider;
 import com.cloud.network.guru.NetworkGuru;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRule.Purpose;
-import com.cloud.network.rules.FirewallRule.State;
+import com.cloud.network.rules.LoadBalancer.State;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.NetworkOfferingVO;
@@ -78,17 +77,14 @@ import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
 import com.cloud.user.Account;
 import com.cloud.user.User;
 import com.cloud.utils.Pair;
-import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.vm.Nic;
 import com.cloud.vm.NicProfile;
-import com.cloud.vm.NicSecondaryIp;
 import com.cloud.vm.NicVO;
 import com.cloud.vm.ReservationContext;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile;
-import com.cloud.vm.VirtualMachineProfileImpl;
 
 @Component
 @Local(value = { NetworkManager.class, NetworkService.class })
@@ -1301,17 +1297,6 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
         return null;
     }
 
-    @Override
-    public int getRuleCountForIp(Long addressId, Purpose purpose, State state) {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    @Override
-    public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network) {
-        // TODO Auto-generated method stub
-        return null;
-    }
 
     /* (non-Javadoc)
      * @see com.cloud.network.NetworkService#getNetwork(java.lang.String)
@@ -1424,4 +1409,24 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
     }
 
 
+
+
+
+    @Override
+    public int getLbRuleCountForIp(Long addressId, State state) {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+
+
+
+
+    @Override
+    public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
index ef5478b..c6844b7 100644
--- a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
+++ b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
@@ -39,6 +39,7 @@ import com.cloud.network.VpnUser;
 import com.cloud.network.router.VirtualRouter;
 import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
 import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.LoadBalancer;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.network.vpc.PrivateGateway;
 import com.cloud.network.vpc.StaticRouteProfile;
@@ -402,4 +403,10 @@ VpcVirtualNetworkApplianceService {
         return null;
     }
 
+    @Override
+    public boolean applyLbRules(Network network, List<? extends LoadBalancer> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java
----------------------------------------------------------------------
diff --git a/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java b/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java
index 700fe8f..30c7886 100644
--- a/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java
+++ b/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java
@@ -15,21 +15,19 @@
 
 package org.apache.cloudstack.region.gslb;
 
-import com.cloud.agent.AgentManager;
-import com.cloud.configuration.dao.ConfigurationDao;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.network.dao.*;
-import com.cloud.network.rules.FirewallRule;
-import com.cloud.network.rules.RulesManager;
-import com.cloud.region.ha.GlobalLoadBalancerRule;
-import com.cloud.user.Account;
-import com.cloud.user.AccountManager;
-import com.cloud.user.AccountVO;
-import com.cloud.user.UserContext;
-import com.cloud.utils.db.Transaction;
-import com.cloud.utils.net.Ip;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Mockito.when;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
 import junit.framework.Assert;
 import junit.framework.TestCase;
+
 import org.apache.cloudstack.api.command.user.region.ha.gslb.AssignToGlobalLoadBalancerRuleCmd;
 import org.apache.cloudstack.api.command.user.region.ha.gslb.CreateGlobalLoadBalancerRuleCmd;
 import org.apache.cloudstack.api.command.user.region.ha.gslb.DeleteGlobalLoadBalancerRuleCmd;
@@ -40,13 +38,25 @@ import org.apache.log4j.Logger;
 import org.junit.Test;
 import org.mockito.Mockito;
 
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-import static org.mockito.Matchers.*;
-import static org.mockito.Mockito.when;
+import com.cloud.agent.AgentManager;
+import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.LoadBalancerDao;
+import com.cloud.network.dao.LoadBalancerVO;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.LoadBalancer;
+import com.cloud.network.rules.RulesManager;
+import com.cloud.region.ha.GlobalLoadBalancerRule;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.AccountVO;
+import com.cloud.user.UserContext;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.net.Ip;
 
 public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
@@ -510,11 +520,11 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
         when(gslbServiceImpl._gslbRuleDao.findById(new Long(1))).thenReturn(gslbRule);
 
         LoadBalancerVO lbRule = new LoadBalancerVO();
-        lbRule.setState(FirewallRule.State.Active);
-        Field networkIdField = LoadBalancerVO.class.getSuperclass().getDeclaredField("networkId");
+        lbRule.setState(LoadBalancer.State.Active);
+        Field networkIdField = LoadBalancerVO.class.getDeclaredField("networkId");
         networkIdField.setAccessible(true);
         networkIdField.set(lbRule, new Long(1));
-        Field sourceIpAddressId = LoadBalancerVO.class.getSuperclass().getDeclaredField("sourceIpAddressId");
+        Field sourceIpAddressId = LoadBalancerVO.class.getDeclaredField("sourceIpAddressId");
         sourceIpAddressId.setAccessible(true);
         sourceIpAddressId.set(lbRule, new Long(1));
 
@@ -575,20 +585,20 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
         when(gslbServiceImpl._gslbRuleDao.findById(new Long(1))).thenReturn(gslbRule);
 
         LoadBalancerVO lbRule1 = new LoadBalancerVO();
-        lbRule1.setState(FirewallRule.State.Active);
-        Field networkIdField1 = LoadBalancerVO.class.getSuperclass().getDeclaredField("networkId");
+        lbRule1.setState(LoadBalancer.State.Active);
+        Field networkIdField1 = LoadBalancerVO.class.getDeclaredField("networkId");
         networkIdField1.setAccessible(true);
         networkIdField1.set(lbRule1, new Long(1));
-        Field idField1 = LoadBalancerVO.class.getSuperclass().getDeclaredField("id");
+        Field idField1 = LoadBalancerVO.class.getDeclaredField("id");
         idField1.setAccessible(true);
         idField1.set(lbRule1, new Long(1));
 
         LoadBalancerVO lbRule2 = new LoadBalancerVO();
-        lbRule2.setState(FirewallRule.State.Active);
-        Field networkIdField2 = LoadBalancerVO.class.getSuperclass().getDeclaredField("networkId");
+        lbRule2.setState(LoadBalancer.State.Active);
+        Field networkIdField2 = LoadBalancerVO.class.getDeclaredField("networkId");
         networkIdField2.setAccessible(true);
         networkIdField2.set(lbRule2, new Long(1));
-        Field idField2 = LoadBalancerVO.class.getSuperclass().getDeclaredField("id");
+        Field idField2 = LoadBalancerVO.class.getDeclaredField("id");
         idField2.setAccessible(true);
         idField2.set(lbRule2, new Long(2));
 
@@ -649,8 +659,8 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
         when(gslbServiceImpl._gslbRuleDao.findById(new Long(1))).thenReturn(gslbRule);
 
         LoadBalancerVO lbRule = new LoadBalancerVO();
-        lbRule.setState(FirewallRule.State.Active);
-        Field networkIdField = LoadBalancerVO.class.getSuperclass().getDeclaredField("networkId");
+        lbRule.setState(LoadBalancer.State.Active);
+        Field networkIdField = LoadBalancerVO.class.getDeclaredField("networkId");
         networkIdField.setAccessible(true);
         networkIdField.set(lbRule, new Long(1));
 
@@ -708,14 +718,14 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
         when(gslbServiceImpl._gslbRuleDao.findById(new Long(1))).thenReturn(gslbRule);
 
         LoadBalancerVO lbRule = new LoadBalancerVO();
-        lbRule.setState(FirewallRule.State.Active);
-        Field networkIdField = LoadBalancerVO.class.getSuperclass().getDeclaredField("networkId");
+        lbRule.setState(LoadBalancer.State.Active);
+        Field networkIdField = LoadBalancerVO.class.getDeclaredField("networkId");
         networkIdField.setAccessible(true);
         networkIdField.set(lbRule, new Long(1));
-        Field idField = LoadBalancerVO.class.getSuperclass().getDeclaredField("id");
+        Field idField = LoadBalancerVO.class.getDeclaredField("id");
         idField.setAccessible(true);
         idField.set(lbRule, new Long(1));
-        Field sourceIpAddressId = LoadBalancerVO.class.getSuperclass().getDeclaredField("sourceIpAddressId");
+        Field sourceIpAddressId = LoadBalancerVO.class.getDeclaredField("sourceIpAddressId");
         sourceIpAddressId.setAccessible(true);
         sourceIpAddressId.set(lbRule, new Long(1));
 
@@ -778,11 +788,11 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
         when(gslbServiceImpl._gslbRuleDao.findById(new Long(1))).thenReturn(gslbRule);
 
         LoadBalancerVO lbRule = new LoadBalancerVO();
-        lbRule.setState(FirewallRule.State.Active);
-        Field networkIdField = LoadBalancerVO.class.getSuperclass().getDeclaredField("networkId");
+        lbRule.setState(LoadBalancer.State.Active);
+        Field networkIdField = LoadBalancerVO.class.getDeclaredField("networkId");
         networkIdField.setAccessible(true);
         networkIdField.set(lbRule, new Long(1));
-        Field idField = LoadBalancerVO.class.getSuperclass().getDeclaredField("id");
+        Field idField = LoadBalancerVO.class.getDeclaredField("id");
         idField.setAccessible(true);
         idField.set(lbRule, new Long(1));
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b429b960/setup/db/db/schema-410to420-cleanup.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-410to420-cleanup.sql b/setup/db/db/schema-410to420-cleanup.sql
index b65717f..c60c01b 100644
--- a/setup/db/db/schema-410to420-cleanup.sql
+++ b/setup/db/db/schema-410to420-cleanup.sql
@@ -25,4 +25,4 @@ ALTER TABLE `cloud`.`remote_access_vpn` DROP primary key;
 ALTER TABLE `cloud`.`remote_access_vpn` ADD primary key (`id`);
 ALTER TABLE `cloud`.`remote_access_vpn` ADD CONSTRAINT `fk_remote_access_vpn__vpn_server_addr_id` FOREIGN KEY (`vpn_server_addr_id`) REFERENCES `user_ip_address` (`id`);
 
-
+ALTER TABLE `cloud`.`load_balancing_rules` DROP foreign key `fk_load_balancing_rules__id`;