Remove ad-sal from lbaas - part 2 16/16516/4
authorFlavio Fernandes <ffernand@redhat.com>
Sat, 14 Mar 2015 13:36:25 +0000 (09:36 -0400)
committerFlavio Fernandes <ffernand@redhat.com>
Mon, 16 Mar 2015 14:31:54 +0000 (14:31 +0000)
With this change, lbaas handler will be getting notifyNode() callbacks.

Patch 2 (code review):
  - add missing copyright header
  - make node callback more resilient

Change-Id: I58ca64b9fa987f994cdf68bf076fef820092a8ce
Signed-off-by: Flavio Fernandes <ffernand@redhat.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
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/NodeCacheListener.java [new file with mode: 0644]
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/NodeCacheManagerImpl.java

index d2056f08500e39c6416d4eff3b4a632352da69c4..3b85a200d2be5b667afe46a70d4117a80c660262 100644 (file)
@@ -44,6 +44,7 @@ import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerProvider;
 import org.opendaylight.ovsdb.openstack.netvirt.api.MultiTenantAwareRouter;
 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProvider;
 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
+import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheListener;
 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
 import org.opendaylight.ovsdb.openstack.netvirt.api.OutboundNatProvider;
 import org.opendaylight.ovsdb.openstack.netvirt.api.RoutingProvider;
@@ -186,7 +187,7 @@ public class Activator extends DependencyActivatorBase {
 
         manager.add(createComponent()
                 .setInterface(new String[]{INeutronLoadBalancerAware.class.getName(),
-                                AbstractHandler.class.getName()},
+                                NodeCacheListener.class.getName(), AbstractHandler.class.getName()},
                         lbaasHandlerProperties)
                 .setImplementation(LBaaSHandler.class)
                 .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
@@ -305,7 +306,9 @@ public class Activator extends DependencyActivatorBase {
                 .setInterface(new String[]{NodeCacheManager.class.getName(), AbstractHandler.class.getName()},
                         nodeCacheManagerProperties)
                 .setImplementation(NodeCacheManagerImpl.class)
-                .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true)));
+                .add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
+                .add(createServiceDependency().setService(NodeCacheListener.class)
+                        .setCallbacks("cacheListenerAdded", "cacheListenerRemoved")));
     }
 
     @Override
index 952226f6cacd75dcd1bc766e116bb9286655855f..04ea8f389962a583d08fa4cd1b4c5cc9e073fcaa 100644 (file)
@@ -23,6 +23,7 @@ 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.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
+import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,7 +41,7 @@ import java.util.Map;
 //TODO: Implement INeutronLoadBalancerHealthMonitorAware, INeutronLoadBalancerListenerAware, INeutronLoadBalancerPoolMemberAware,
 
 public class LBaaSHandler extends AbstractHandler
-        implements INeutronLoadBalancerAware {
+        implements INeutronLoadBalancerAware, NodeCacheListener {
 
     private static final Logger logger = LoggerFactory.getLogger(LBaaSHandler.class);
 
@@ -220,14 +221,12 @@ public class LBaaSHandler extends AbstractHandler
     }
 
     /**
-     FIXME!
-
      * 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) {
+    public void notifyNode(Node node, Action type) {
         logger.debug("notifyNode: Node {} update {} from Controller's inventory Service", node, type);
         Preconditions.checkNotNull(loadBalancerProvider);
 
@@ -236,14 +235,14 @@ public class LBaaSHandler extends AbstractHandler
             if (!lbConfig.isValid()) {
                 logger.debug("Neutron LB configuration invalid for {} ", lbConfig.getName());
             } else {
-               if (type.equals(UpdateType.ADDED)) {
+               if (type.equals(Action.ADD)) {
                    loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.ADD);
 
-               * When node disappears, we do nothing for now. Making a call to
+               /* When node disappears, we do nothing for now. Making a call to
                 * loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.DELETE)
                 * can lead to TransactionCommitFailedException. Similarly when node is changed,
                 * because of remove followed by add, we do nothing.
-                *
+                */
 
                  //(type.equals(UpdateType.REMOVED) || type.equals(UpdateType.CHANGED))
                } else {
@@ -252,6 +251,4 @@ public class LBaaSHandler extends AbstractHandler
             }
         }
     }
-    */
-
 }
diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/NodeCacheListener.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/NodeCacheListener.java
new file mode 100644 (file)
index 0000000..ae90ec3
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2015 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ *  Authors : Flavio Fernandes
+ */
+package org.opendaylight.ovsdb.openstack.netvirt.api;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+
+/**
+ * When this interface is used, instance owner will get callbacks on
+ * changes that occur in NodeCacheManager
+ */
+public interface NodeCacheListener {
+
+    public void notifyNode(Node node, Action action);
+}
index c5c4c2d2a63527c4416272a0d00f2079802e7b41..939466edc770a60eb93bc6d00a23164b3d52d683 100644 (file)
 package org.opendaylight.ovsdb.openstack.netvirt.impl;
 
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.opendaylight.ovsdb.openstack.netvirt.AbstractEvent;
 import org.opendaylight.ovsdb.openstack.netvirt.AbstractHandler;
 import org.opendaylight.ovsdb.openstack.netvirt.NodeCacheManagerEvent;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
+import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheListener;
 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
 import org.opendaylight.ovsdb.utils.mdsal.node.NodeUtils;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.osgi.framework.ServiceReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.List;
+import java.util.Map;
 
 public class NodeCacheManagerImpl extends AbstractHandler
         implements NodeCacheManager {
 
     private static final Logger logger = LoggerFactory.getLogger(NodeCacheManagerImpl.class);
     private List<Node> nodeCache = Lists.newArrayList();
-
+    private Map<Long, NodeCacheListener> handlers = Maps.newHashMap();
 
     @Override
     public void nodeAdded(String nodeIdentifier) {
@@ -46,9 +50,23 @@ public class NodeCacheManagerImpl extends AbstractHandler
 
     private void _processNodeAdded(Node node) {
         nodeCache.add(node);
+        for (NodeCacheListener handler : handlers.values()) {
+            try {
+                handler.notifyNode(node, Action.ADD);
+            } catch (Exception e) {
+                logger.error("Failed notifying node add event", e);
+            }
+        }
     }
     private void _processNodeRemoved(Node node) {
         nodeCache.remove(node);
+        for (NodeCacheListener handler : handlers.values()) {
+            try {
+                handler.notifyNode(node, Action.DELETE);
+            } catch (Exception e) {
+                logger.error("Failed notifying node remove event", e);
+            }
+        }
     }
 
     /**
@@ -79,4 +97,16 @@ public class NodeCacheManagerImpl extends AbstractHandler
                 break;
         }
     }
+
+    public void cacheListenerAdded(final ServiceReference ref, NodeCacheListener handler){
+        Long pid = (Long) ref.getProperty(org.osgi.framework.Constants.SERVICE_ID);
+        handlers.put(pid, handler);
+        logger.debug("Node cache listener registered, pid {}", pid);
+    }
+
+    public void cacheListenerRemoved(final ServiceReference ref){
+        Long pid = (Long) ref.getProperty(org.osgi.framework.Constants.SERVICE_ID);
+        handlers.remove(pid);
+        logger.debug("Node cache listener unregistered, pid {}", pid);
+    }
 }