Merge "Restructing the LBaaSHandler code, and adding calls to the LoadBalancerProvide...
authorMadhu Venugopal <mavenugo@gmail.com>
Wed, 3 Sep 2014 10:44:02 +0000 (10:44 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Wed, 3 Sep 2014 10:44:02 +0000 (10:44 +0000)
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/Activator.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/LBaaSHandler.java

index d17ada765a17570aff55b9bb54ce05474e0a9bbb..9e050f2a6bc37c9c5d0ba2cb94e9326f8279ec65 100644 (file)
@@ -29,6 +29,7 @@ import org.opendaylight.controller.networkconfig.neutron.INeutronSubnetCRUD;
 import org.opendaylight.controller.networkconfig.neutron.INeutronSubnetAware;
 import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase;
 import org.opendaylight.controller.switchmanager.IInventoryListener;
+import org.opendaylight.controller.switchmanager.ISwitchManager;
 import org.opendaylight.ovsdb.openstack.netvirt.api.ArpProvider;
 import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
@@ -252,6 +253,7 @@ public class Activator extends ComponentActivatorAbstractBase {
             c.add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true));
             c.add(createServiceDependency().setService(INeutronLoadBalancerPoolMemberCRUD.class).setRequired(true));
             c.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true));
+            c.add(createServiceDependency().setService(ISwitchManager.class).setRequired(true));
         }
 
         if (imp.equals(PortSecurityHandler.class)) {
index cd26628603642c29b52fe524721e9545d2cbdb0f..1aa2096988240f634812781c3af4167f84f3ae92 100755 (executable)
@@ -19,17 +19,19 @@ import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPool
 import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPoolMember;
 import org.opendaylight.controller.networkconfig.neutron.NeutronPort;
 import org.opendaylight.controller.networkconfig.neutron.Neutron_IPs;
+import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.controller.switchmanager.ISwitchManager;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
 import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerConfiguration;
+import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.Maps;
+import com.google.common.base.Preconditions;
 
 import java.net.HttpURLConnection;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 
 /**
  * Handle requests for OpenStack Neutron v2.0 LBaaS API calls for /v2.0/loadbalancers.
@@ -46,13 +48,16 @@ public class LBaaSHandler extends AbstractHandler
     private volatile INeutronLoadBalancerPoolCRUD neutronLBPoolCache;
     private volatile INeutronLoadBalancerPoolMemberCRUD neutronLBPoolMemberCache;
     private volatile INeutronPortCRUD neutronPortsCache;
-    private Map<String, LoadBalancerConfiguration> loadbalancersCache = Maps.newHashMap();
+    private volatile LoadBalancerProvider loadBalancerProvider;
+    private volatile ISwitchManager switchManager;
 
     @Override
     public int canCreateNeutronLoadBalancer(NeutronLoadBalancer neutronLoadBalancer) {
-        if (loadbalancersCache.containsKey(neutronLoadBalancer.getLoadBalancerID()))
-            return HttpURLConnection.HTTP_CONFLICT;
-        return HttpURLConnection.HTTP_OK;
+        LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLoadBalancer);
+        if (!lbConfig.isValid())
+            return HttpURLConnection.HTTP_NOT_ACCEPTABLE;
+        else
+            return HttpURLConnection.HTTP_OK;
     }
 
     /**
@@ -72,45 +77,15 @@ public class LBaaSHandler extends AbstractHandler
             logger.debug("Neutron Load Balancer creation failed {} ", result);
             return;
         }
+        Preconditions.checkNotNull(loadBalancerProvider);
+        LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLoadBalancer);
 
-        String loadBalancerID = neutronLoadBalancer.getLoadBalancerID();
-        String loadBalancerName = neutronLoadBalancer.getLoadBalancerName();
-        String loadBalancerVip = neutronLoadBalancer.getLoadBalancerVipAddress();
-        String loadBalancerSubnetID = neutronLoadBalancer.getLoadBalancerVipSubnetID();
-        LoadBalancerConfiguration newLB = new LoadBalancerConfiguration(loadBalancerName, loadBalancerVip);
-
-        String memberID, memberIP, memberMAC, memberProtocol;
-        Integer memberPort;
-
-        for (NeutronLoadBalancerPool neutronLBPool: neutronLBPoolCache.getAllNeutronLoadBalancerPools()) {
-            List<? extends NeutronLoadBalancerPoolMember> members =
-                (List<? extends NeutronLoadBalancerPoolMember>)neutronLBPool.getLoadBalancerPoolMembers();
-            memberProtocol = neutronLBPool.getLoadBalancerPoolProtocol();
-            /*
-             * Only HTTP and HTTPS are supported as of this version
-             * TODO: Support all TCP load-balancers
-             */
-            if (!(memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_HTTP) ||
-                  memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_HTTPS)))
-                continue;
-            for (NeutronLoadBalancerPoolMember neutronLBPoolMember: members) {
-                if (neutronLBPoolMember.getPoolMemberSubnetID().equals(loadBalancerSubnetID)) {
-                    memberID = neutronLBPoolMember.getPoolMemberID();
-                    memberIP = neutronLBPoolMember.getPoolMemberAddress();
-                    memberPort = neutronLBPoolMember.getPoolMemberProtoPort();
-                    memberMAC = this.getMacAddress(memberIP);
-                    if (memberMAC == null)
-                        continue;
-                    newLB.addMember(memberID, memberIP, memberMAC, memberProtocol, memberPort);
-                }
-            }
-        }
-        if (newLB.isValid()) {
-            logger.trace("Neutron LB pool configuration invalid for {} ", loadBalancerName);
+        if (!lbConfig.isValid()) {
+            logger.trace("Neutron LB pool configuration invalid for {} ", lbConfig.getName());
             return;
         } else {
-            loadbalancersCache.put(loadBalancerID, newLB);
-            //TODO: Trigger flowmod addition
+            for (Node node: this.switchManager.getNodes())
+                loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.ADD);
         }
     }
 
@@ -127,9 +102,11 @@ public class LBaaSHandler extends AbstractHandler
 
     @Override
     public int canDeleteNeutronLoadBalancer(NeutronLoadBalancer neutronLoadBalancer) {
-        if (!loadbalancersCache.containsKey(neutronLoadBalancer.getLoadBalancerID()))
+        LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLoadBalancer);
+        if (!lbConfig.isValid())
             return HttpURLConnection.HTTP_NOT_ACCEPTABLE;
-        return HttpURLConnection.HTTP_OK;
+        else
+            return HttpURLConnection.HTTP_OK;
     }
 
     @Override
@@ -144,8 +121,16 @@ public class LBaaSHandler extends AbstractHandler
             logger.error(" delete Neutron NeutronLoadBalancer Pool validation failed for result - {} ", result);
             return;
         }
-        loadbalancersCache.remove(neutronLoadBalancer.getLoadBalancerID());
-        //TODO: Trigger flowmod removals
+        Preconditions.checkNotNull(loadBalancerProvider);
+        LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLoadBalancer);
+
+        if (!lbConfig.isValid()) {
+            logger.trace("Neutron LB pool configuration invalid for {} ", lbConfig.getName());
+            return;
+        } else {
+            for (Node node: this.switchManager.getNodes())
+                loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.DELETE);
+        }
     }
 
     /**
@@ -166,8 +151,11 @@ public class LBaaSHandler extends AbstractHandler
                 doNeutronLoadBalancerCreate(ev.getLoadBalancer());
             case DELETE:
                 doNeutronLoadBalancerDelete(ev.getLoadBalancer());
-                // fall through
             case UPDATE:
+                /**
+                 * Currently member update requires delete and re-adding
+                 * Also, weights and weight updates are not supported
+                 */
                 doNeutronLoadBalancerDelete(ev.getLoadBalancer());
                 doNeutronLoadBalancerCreate(ev.getLoadBalancer());
                 break;
@@ -177,12 +165,51 @@ public class LBaaSHandler extends AbstractHandler
         }
     }
 
+    /**
+     * Useful utility for extracting the loadbalancer instance
+     * configuration from the neutron LB cache
+     */
+    public LoadBalancerConfiguration extractLBConfiguration(NeutronLoadBalancer neutronLoadBalancer) {
+        String loadBalancerName = neutronLoadBalancer.getLoadBalancerName();
+        String loadBalancerVip = neutronLoadBalancer.getLoadBalancerVipAddress();
+        String loadBalancerSubnetID = neutronLoadBalancer.getLoadBalancerVipSubnetID();
+        LoadBalancerConfiguration lbConfig = new LoadBalancerConfiguration(loadBalancerName, loadBalancerVip);
+
+        String memberID, memberIP, memberMAC, memberProtocol;
+        Integer memberPort;
+
+        for (NeutronLoadBalancerPool neutronLBPool: neutronLBPoolCache.getAllNeutronLoadBalancerPools()) {
+            List<? extends NeutronLoadBalancerPoolMember> members =
+                (List<? extends NeutronLoadBalancerPoolMember>)neutronLBPool.getLoadBalancerPoolMembers();
+            memberProtocol = neutronLBPool.getLoadBalancerPoolProtocol();
+            /*
+             * Only HTTP and HTTPS are supported as of this version
+             * TODO: Support all TCP load-balancers
+             */
+            if (!(memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_HTTP) ||
+                  memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_HTTPS)))
+                continue;
+            for (NeutronLoadBalancerPoolMember neutronLBPoolMember: members) {
+                if (neutronLBPoolMember.getPoolMemberSubnetID().equals(loadBalancerSubnetID)) {
+                    memberID = neutronLBPoolMember.getPoolMemberID();
+                    memberIP = neutronLBPoolMember.getPoolMemberAddress();
+                    memberPort = neutronLBPoolMember.getPoolMemberProtoPort();
+                    memberMAC = this.getMacAddress(memberIP);
+                    if (memberMAC == null)
+                        continue;
+                    lbConfig.addMember(memberID, memberIP, memberMAC, memberProtocol, memberPort);
+                }
+            }
+        }
+        return lbConfig;
+    }
+
     /**
      * Look up in the NeutronPortsCRUD cache and return the MAC address for a corresponding IP address
      * @param ipAddr IP address of a member or VM
      * @return MAC address registered with that IP address
      */
-    private String getMacAddress(String ipAddr) {
+    public String getMacAddress(String ipAddr) {
             List<Neutron_IPs> fixedIPs;
             Iterator<Neutron_IPs> fixedIPIterator;
             Neutron_IPs ip;