Adding support for programming newly added nodes. 72/10672/1
authorSrini Seetharaman <srini.seetharaman@gmail.com>
Wed, 3 Sep 2014 07:49:04 +0000 (00:49 -0700)
committerSrini Seetharaman <srini.seetharaman@gmail.com>
Wed, 3 Sep 2014 07:49:04 +0000 (00:49 -0700)
LBaaSHandler now implements IInventoryListener, and
programs all existing LB instances on the newly added node.

Change-Id: I0544f7d30f422464440582e98da138157fc8ffd6
Signed-off-by: Srini Seetharaman <srini.seetharaman@gmail.com>
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 0db7d2e82e5ed290b5347cdccff6a0795e3d4ea5..907aeaa32026f7752f36ef5b49a1aeb1a9110d4e 100644 (file)
@@ -250,6 +250,7 @@ public class Activator extends ComponentActivatorAbstractBase {
                                          lbaasHandlerProperties);
             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
             c.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true));
+            c.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true));
             c.add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true));
             c.add(createServiceDependency().setService(INeutronLoadBalancerPoolMemberCRUD.class).setRequired(true));
             c.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true));
index ee678792e47fde43c7351240fe6b71bcb69ab186..3cd8818fc95c79e0413dde59579657561dff5e7f 100755 (executable)
@@ -11,6 +11,7 @@
 package org.opendaylight.ovsdb.openstack.netvirt;
 
 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerAware;
+import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerCRUD;
 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolCRUD;
 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolMemberCRUD;
 import org.opendaylight.controller.networkconfig.neutron.INeutronPortCRUD;
@@ -18,6 +19,10 @@ import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancer;
 import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPool;
 import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPoolMember;
 import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.controller.sal.core.NodeConnector;
+import org.opendaylight.controller.sal.core.Property;
+import org.opendaylight.controller.sal.core.UpdateType;
+import org.opendaylight.controller.switchmanager.IInventoryListener;
 import org.opendaylight.controller.switchmanager.ISwitchManager;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
 import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerConfiguration;
@@ -29,6 +34,7 @@ import com.google.common.base.Preconditions;
 
 import java.net.HttpURLConnection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Handle requests for OpenStack Neutron v2.0 LBaaS API calls for /v2.0/loadbalancers.
@@ -37,11 +43,12 @@ import java.util.List;
 //TODO: Implement INeutronLoadBalancerHealthMonitorAware, INeutronLoadBalancerListenerAware, INeutronLoadBalancerPoolMemberAware,
 
 public class LBaaSHandler extends AbstractHandler
-        implements INeutronLoadBalancerAware {
+        implements INeutronLoadBalancerAware, IInventoryListener {
 
     private static final Logger logger = LoggerFactory.getLogger(LBaaSHandler.class);
 
     // The implementation for each of these services is resolved by the OSGi Service Manager
+    private volatile INeutronLoadBalancerCRUD neutronLBCache;
     private volatile INeutronLoadBalancerPoolCRUD neutronLBPoolCache;
     private volatile INeutronLoadBalancerPoolMemberCRUD neutronLBPoolMemberCache;
     private volatile INeutronPortCRUD neutronPortsCache;
@@ -189,4 +196,31 @@ public class LBaaSHandler extends AbstractHandler
         }
         return lbConfig;
     }
+
+    /**
+     * On the addition of a new node, we iterate through all existing loadbalancer
+     * instances and program the node for all of them. It is sufficient to do that only
+     * when a node is added, and only for the LB instances (and not individual members).
+     */
+    @Override
+    public void notifyNode(Node node, UpdateType type, Map<String, Property> propMap) {
+        logger.debug("notifyNode: Node {} update {} from Controller's inventory Service", node, type);
+        Preconditions.checkNotNull(loadBalancerProvider);
+
+        if (type.equals(UpdateType.ADDED)) {
+            for (NeutronLoadBalancer neutronLB: neutronLBCache.getAllNeutronLoadBalancers()) {
+                LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLB);
+                if (!lbConfig.isValid())
+                    logger.trace("Neutron LB configuration invalid for {} ", lbConfig.getName());
+                else
+                    loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.ADD);
+            }
+        }
+    }
+
+    @Override
+    public void notifyNodeConnector(NodeConnector arg0, UpdateType arg1,
+            Map<String, Property> arg2) {
+        //NOOP
+    }
 }