L3 Neutron plumbing 63/10463/1
authorFlavio Fernandes <ffernand@redhat.com>
Thu, 28 Aug 2014 06:51:48 +0000 (02:51 -0400)
committerFlavio Fernandes <ffernand@redhat.com>
Thu, 28 Aug 2014 19:07:09 +0000 (15:07 -0400)
Converge neutron events needed to support l3 into an adapter class.
With this change all plumbing needed for northbound l3 support is completed.
Next is the 'brains' to turn the l3 related events into rules that can be used
by the multi-tenant router forwarding provider.

    Script for creating coke tenants in devstack:
    https://gist.github.com/1ba897e7cde8dbd87fe8

    Starting odl command:
    ./run.sh -virt ovsdb -Xms40m -Xmx1024m -XX:MaxPermSize=1024m

    LogLevel:
    setLogLevel org.opendaylight.ovsdb.openstack.netvirt.providers.OF13Provider trace
    setLogLevel org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher trace
    setLogLevel org.opendaylight.ovsdb.openstack.netvirt.SouthboundHandler debug
    setLogLevel org.opendaylight.ovsdb.openstack.netvirt.PortHandler debug
    setLogLevel org.opendaylight.ovsdb.openstack.netvirt.NeutronL3Adapter debug

    Log of test:
    createTenants: https://gist.github.com/7dadd30bde5d07bb0ba1
    osgi: https://gist.github.com/4ec66a6e76908eeffcbc

Change-Id: I1570d536728ea29c2615ddca422379ad8fe70d45
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/FloatingIPHandler.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/NetworkHandler.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/NorthboundEvent.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/PortHandler.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/RouterHandler.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/SouthboundHandler.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/SubnetHandler.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/NeutronL3Adapter.java [new file with mode: 0644]
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OpenstackRouter.java

index 1fb1ae05a65606548f792757534dee92db2e6082..2a4bc957e99d494fdd81989a3be36912daf0c695 100644 (file)
@@ -30,6 +30,7 @@ import org.opendaylight.controller.switchmanager.IInventoryListener;
 import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
+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.TenantNetworkManager;
@@ -37,6 +38,8 @@ import org.opendaylight.ovsdb.openstack.netvirt.api.VlanConfigurationCache;
 import org.opendaylight.ovsdb.openstack.netvirt.impl.BridgeConfigurationManagerImpl;
 import org.opendaylight.ovsdb.openstack.netvirt.impl.ConfigurationServiceImpl;
 import org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl;
+import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
+import org.opendaylight.ovsdb.openstack.netvirt.impl.OpenstackRouter;
 import org.opendaylight.ovsdb.openstack.netvirt.impl.ProviderNetworkManagerImpl;
 import org.opendaylight.ovsdb.openstack.netvirt.impl.TenantNetworkManagerImpl;
 import org.opendaylight.ovsdb.openstack.netvirt.impl.VlanConfigurationCacheImpl;
@@ -93,7 +96,9 @@ public class Activator extends ComponentActivatorAbstractBase {
                         ProviderNetworkManagerImpl.class,
                         EventDispatcherImpl.class,
                         FWaasHandler.class,
-                        LBaaSHandler.class};
+                        LBaaSHandler.class,
+                        NeutronL3Adapter.class,
+                        OpenstackRouter.class};
         return res;
     }
 
@@ -150,21 +155,19 @@ public class Activator extends ComponentActivatorAbstractBase {
             Properties floatingIPHandlerPorperties = new Properties();
             floatingIPHandlerPorperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
                                             AbstractEvent.HandlerType.NEUTRON_FLOATING_IP);
-            c.setInterface(new String[] {INeutronFloatingIPAware.class.getName(),
-                                         AbstractHandler.class.getName()},
+            c.setInterface(new String[]{INeutronFloatingIPAware.class.getName(),
+                                        AbstractHandler.class.getName()},
                            floatingIPHandlerPorperties);
-            c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
-            c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
-            c.add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true));
             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
+            c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
         }
 
         if (imp.equals(NetworkHandler.class)) {
             Properties networkHandlerProperties = new Properties();
             networkHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
                                          AbstractEvent.HandlerType.NEUTRON_NETWORK);
-            c.setInterface(new String[] {INeutronNetworkAware.class.getName(),
-                                         AbstractHandler.class.getName()},
+            c.setInterface(new String[]{INeutronNetworkAware.class.getName(),
+                                        AbstractHandler.class.getName()},
                            networkHandlerProperties);
             c.add(createServiceDependency().setService(TenantNetworkManager.class).setRequired(true));
             c.add(createServiceDependency().setService(BridgeConfigurationManager.class).setRequired(true));
@@ -175,47 +178,48 @@ public class Activator extends ComponentActivatorAbstractBase {
             c.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true));
             c.add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true));
             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
+            c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
         }
 
         if (imp.equals(SubnetHandler.class)) {
             Properties subnetHandlerProperties = new Properties();
             subnetHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_SUBNET);
-            c.setInterface(new String[] {INeutronSubnetAware.class.getName(),
-                                         AbstractHandler.class.getName()},
+            c.setInterface(new String[]{INeutronSubnetAware.class.getName(),
+                                        AbstractHandler.class.getName()},
                            subnetHandlerProperties);
             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
+            c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
         }
 
         if (imp.equals(PortHandler.class)) {
             Properties portHandlerProperties = new Properties();
             portHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_PORT);
-            c.setInterface(new String[] {INeutronPortAware.class.getName(),
-                                         AbstractHandler.class.getName()},
+            c.setInterface(new String[]{INeutronPortAware.class.getName(),
+                                        AbstractHandler.class.getName()},
                            portHandlerProperties);
             c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
             c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
             c.add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true));
             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
+            c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
         }
 
         if (imp.equals(RouterHandler.class)) {
             Properties routerHandlerProperties = new Properties();
             routerHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.NEUTRON_ROUTER);
-            c.setInterface(new String[] {INeutronRouterAware.class.getName(),
-                                         AbstractHandler.class.getName()},
+            c.setInterface(new String[]{INeutronRouterAware.class.getName(),
+                                        AbstractHandler.class.getName()},
                            routerHandlerProperties);
-            c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
-            c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
-            c.add(createServiceDependency().setService(OvsdbInventoryListener.class).setRequired(true));
             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
+            c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
         }
 
         if (imp.equals(SouthboundHandler.class)) {
             Properties southboundHandlerProperties = new Properties();
             southboundHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY, AbstractEvent.HandlerType.SOUTHBOUND);
-            c.setInterface(new String[] {OvsdbInventoryListener.class.getName(),
-                                         IInventoryListener.class.getName(),
-                                         AbstractHandler.class.getName()},
+            c.setInterface(new String[]{OvsdbInventoryListener.class.getName(),
+                                        IInventoryListener.class.getName(),
+                                        AbstractHandler.class.getName()},
                            southboundHandlerProperties);
             c.add(createServiceDependency().setService(
                     org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService.class).setRequired(true));
@@ -225,6 +229,7 @@ public class Activator extends ComponentActivatorAbstractBase {
             c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true));
             c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true));
             c.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true));
+            c.add(createServiceDependency().setService(NeutronL3Adapter.class).setRequired(true));
         }
 
         if (imp.equals(LBaaSHandler.class)) {
@@ -275,5 +280,17 @@ public class Activator extends ComponentActivatorAbstractBase {
                           .setService(AbstractHandler.class)
                           .setCallbacks("eventHandlerAdded", "eventHandlerRemoved"));
         }
+
+        if (imp.equals(NeutronL3Adapter.class)) {
+            c.setInterface(NeutronL3Adapter.class.getName(), null);
+
+            c.add(createServiceDependency().setService(MultiTenantAwareRouter.class).setRequired(true));
+            // TODO: it will require MultiTenantRouterForwardingProvider
+            // c.add(createServiceDependency().setService(MultiTenantRouterForwardingProvider.class).setRequired(true));
+        }
+
+        if (imp.equals(OpenstackRouter.class)) {
+            c.setInterface(MultiTenantAwareRouter.class.getName(), null);
+        }
     }
 }
index f04338e460679ca4ebecb8270468c3e1c747eaaa..581aba4d4c82ad5425a1f7524a3b35391b70e1cf 100644 (file)
@@ -11,9 +11,7 @@ package org.opendaylight.ovsdb.openstack.netvirt;
 
 import org.opendaylight.controller.networkconfig.neutron.INeutronFloatingIPAware;
 import org.opendaylight.controller.networkconfig.neutron.NeutronFloatingIP;
-import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
-import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService;
-import org.opendaylight.ovsdb.plugin.api.OvsdbInventoryListener;
+import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,9 +30,7 @@ public class FloatingIPHandler extends AbstractHandler
     static final Logger logger = LoggerFactory.getLogger(FloatingIPHandler.class);
 
     // The implementation for each of these services is resolved by the OSGi Service Manager
-    private volatile OvsdbConfigurationService ovsdbConfigurationService;
-    private volatile OvsdbConnectionService connectionService;
-    private volatile OvsdbInventoryListener ovsdbInventoryListener;
+    private volatile NeutronL3Adapter neutronL3Adapter;
 
     /**
      * Services provide this interface method to indicate if the specified floatingIP can be created
@@ -60,9 +56,7 @@ public class FloatingIPHandler extends AbstractHandler
      */
     @Override
     public void neutronFloatingIPCreated(NeutronFloatingIP floatingIP) {
-        logger.debug(" Floating IP created {}, uuid {}",
-                     floatingIP.getFixedIPAddress(),
-                     floatingIP.getFloatingIPUUID());
+        enqueueEvent(new NorthboundEvent(floatingIP, AbstractEvent.Action.ADD));
     }
 
     /**
@@ -91,9 +85,7 @@ public class FloatingIPHandler extends AbstractHandler
      */
     @Override
     public void neutronFloatingIPUpdated(NeutronFloatingIP floatingIP) {
-        logger.debug(" Floating IP updated {}, uuid {}",
-                     floatingIP.getFixedIPAddress(),
-                     floatingIP.getFloatingIPUUID());
+        enqueueEvent(new NorthboundEvent(floatingIP, AbstractEvent.Action.UPDATE));
     }
 
     /**
@@ -119,9 +111,7 @@ public class FloatingIPHandler extends AbstractHandler
      */
     @Override
     public void neutronFloatingIPDeleted(NeutronFloatingIP floatingIP) {
-        logger.debug(" Floating IP deleted {}, uuid {}",
-                     floatingIP.getFixedIPAddress(),
-                     floatingIP.getFloatingIPUUID());
+        enqueueEvent(new NorthboundEvent(floatingIP, AbstractEvent.Action.DELETE));
     }
 
     /**
@@ -138,8 +128,13 @@ public class FloatingIPHandler extends AbstractHandler
         }
         NorthboundEvent ev = (NorthboundEvent) abstractEvent;
         switch (ev.getAction()) {
-            // TODO: add handling of events here, once callbacks do something
-            //       other than logging.
+            case ADD:
+                // fall through
+            case DELETE:
+                // fall through
+            case UPDATE:
+                neutronL3Adapter.handleNeutronFloatingIPEvent(ev.getNeutronFloatingIP(), ev.getAction());
+                break;
             default:
                 logger.warn("Unable to process event action " + ev.getAction());
                 break;
index 32dbabc8f2bf112d9f73c452aa01dceb6ce4f99f..8fc2a231b13bb8417e0e4a51c3832aa59179c344 100644 (file)
@@ -17,6 +17,7 @@ import org.opendaylight.ovsdb.lib.notation.Row;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
+import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
 import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
 import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService;
 import org.opendaylight.ovsdb.plugin.api.OvsdbInventoryListener;
@@ -53,6 +54,7 @@ public class NetworkHandler extends AbstractHandler
     private volatile OvsdbConnectionService connectionService;
     private volatile INeutronNetworkCRUD neutronNetworkCache;
     private volatile OvsdbInventoryListener ovsdbInventoryListener;
+    private volatile NeutronL3Adapter neutronL3Adapter;
 
     /**
      * Invoked when a network creation is requested
@@ -86,6 +88,10 @@ public class NetworkHandler extends AbstractHandler
             return;
         }
 
+        enqueueEvent(new NorthboundEvent(network, AbstractEvent.Action.ADD));
+    }
+    private void doNeutronNetworkCreated(NeutronNetwork network) {
+        neutronL3Adapter.handleNeutronNetworkEvent(network, AbstractEvent.Action.ADD);
     }
 
     /**
@@ -112,8 +118,10 @@ public class NetworkHandler extends AbstractHandler
      */
     @Override
     public void neutronNetworkUpdated(NeutronNetwork network) {
-        logger.trace("neutronNetworkUpdated: network: {}", network);
-        return;
+        enqueueEvent(new NorthboundEvent(network, AbstractEvent.Action.UPDATE));
+    }
+    private void doNeutronNetworkUpdated(NeutronNetwork network) {
+        neutronL3Adapter.handleNeutronNetworkEvent(network, AbstractEvent.Action.UPDATE);
     }
 
     /**
@@ -135,6 +143,10 @@ public class NetworkHandler extends AbstractHandler
      */
     @Override
     public void neutronNetworkDeleted(NeutronNetwork network) {
+        enqueueEvent(new NorthboundEvent(network, AbstractEvent.Action.DELETE));
+    }
+    private void doNeutronNetworkDeleted(NeutronNetwork network) {
+        neutronL3Adapter.handleNeutronNetworkEvent(network, AbstractEvent.Action.DELETE);
 
         int result = canDeleteNetwork(network);
         logger.trace("canDeleteNetwork: network: {}", network);
@@ -209,8 +221,15 @@ public class NetworkHandler extends AbstractHandler
         }
         NorthboundEvent ev = (NorthboundEvent) abstractEvent;
         switch (ev.getAction()) {
-            // TODO: add handling of events here, once callbacks do something
-            //       other than logging.
+            case ADD:
+                doNeutronNetworkCreated(ev.getNeutronNetwork());
+                break;
+            case UPDATE:
+                doNeutronNetworkUpdated(ev.getNeutronNetwork());
+                break;
+            case DELETE:
+                doNeutronNetworkDeleted(ev.getNeutronNetwork());
+                break;
             default:
                 logger.warn("Unable to process event action " + ev.getAction());
                 break;
index d38b93aa7a57d7aa40969564ef1c85dd85783609..efa9739c690de3f2f63675d12dfc5cf783183ae3 100644 (file)
 
 package org.opendaylight.ovsdb.openstack.netvirt;
 
+import org.opendaylight.controller.networkconfig.neutron.NeutronFloatingIP;
+import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork;
 import org.opendaylight.controller.networkconfig.neutron.NeutronPort;
+import org.opendaylight.controller.networkconfig.neutron.NeutronRouter;
+import org.opendaylight.controller.networkconfig.neutron.NeutronRouter_Interface;
+import org.opendaylight.controller.networkconfig.neutron.NeutronSubnet;
 
 public class NorthboundEvent extends AbstractEvent {
 
     private NeutronPort port;
+    private NeutronSubnet subnet;
+    private NeutronRouter router;
+    private NeutronRouter_Interface routerInterface;
+    private NeutronFloatingIP neutronFloatingIP;
+    private NeutronNetwork neutronNetwork;
 
     NorthboundEvent(NeutronPort port, Action action) {
         super(HandlerType.NEUTRON_PORT, action);
         this.port = port;
     }
 
+    NorthboundEvent(NeutronSubnet subnet, Action action) {
+        super(HandlerType.NEUTRON_SUBNET, action);
+        this.subnet = subnet;
+    }
+
+    NorthboundEvent(NeutronRouter router, Action action) {
+        super(HandlerType.NEUTRON_ROUTER, action);
+        this.router = router;
+    }
+
+    NorthboundEvent(NeutronRouter router, NeutronRouter_Interface routerInterface, Action action) {
+        super(HandlerType.NEUTRON_ROUTER, action);
+        this.router = router;
+        this.routerInterface = routerInterface;
+    }
+
+    NorthboundEvent(NeutronFloatingIP neutronFloatingIP, Action action) {
+        super(HandlerType.NEUTRON_FLOATING_IP, action);
+        this.neutronFloatingIP = neutronFloatingIP;
+    }
+
+    NorthboundEvent(NeutronNetwork neutronNetwork, Action action) {
+        super(HandlerType.NEUTRON_NETWORK, action);
+        this.neutronNetwork = neutronNetwork;
+    }
+
     public NeutronPort getPort() {
         return port;
     }
+    public NeutronSubnet getSubnet() {
+        return subnet;
+    }
+    public NeutronRouter getRouter() {
+        return router;
+    }
+    public NeutronRouter_Interface getRouterInterface() {
+        return routerInterface;
+    }
+    public NeutronFloatingIP getNeutronFloatingIP() {
+        return neutronFloatingIP;
+    }
+    public NeutronNetwork getNeutronNetwork() {
+        return neutronNetwork;
+    }
 
     @Override
     public String toString() {
-        return "NorthboundEvent [action=" + super.getAction() + ", port=" + port + "]";
+        return "NorthboundEvent [action=" + super.getAction()
+               + ", port=" + port
+               + ", subnet=" + subnet
+               + ", router=" + router
+               + ", routerInterface=" + routerInterface
+               + ", floatingIP=" + neutronFloatingIP
+               + ", network=" + neutronNetwork
+               + "]";
     }
 
     @Override
@@ -35,6 +93,11 @@ public class NorthboundEvent extends AbstractEvent {
         final int prime = 31;
         int result = super.hashCode();
         result = prime * result + ((port == null) ? 0 : port.hashCode());
+        result = prime * result + ((subnet == null) ? 0 : subnet.hashCode());
+        result = prime * result + ((router == null) ? 0 : router.hashCode());
+        result = prime * result + ((routerInterface == null) ? 0 : routerInterface.hashCode());
+        result = prime * result + ((neutronFloatingIP == null) ? 0 : neutronFloatingIP.hashCode());
+        result = prime * result + ((neutronNetwork == null) ? 0 : neutronNetwork.hashCode());
         return result;
     }
 
@@ -54,6 +117,31 @@ public class NorthboundEvent extends AbstractEvent {
                 return false;
         } else if (!port.equals(other.port))
             return false;
+        if (subnet == null) {
+            if (other.subnet != null)
+                return false;
+        } else if (!subnet.equals(other.subnet))
+            return false;
+        if (router == null) {
+            if (other.router != null)
+                return false;
+        } else if (!router.equals(other.router))
+            return false;
+        if (routerInterface == null) {
+            if (other.routerInterface != null)
+                return false;
+        } else if (!routerInterface.equals(other.routerInterface))
+            return false;
+        if (neutronFloatingIP == null) {
+            if (other.neutronFloatingIP != null)
+                return false;
+        } else if (!neutronFloatingIP.equals(other.neutronFloatingIP))
+            return false;
+        if (neutronNetwork == null) {
+            if (other.neutronNetwork != null)
+                return false;
+        } else if (!neutronNetwork.equals(other.neutronNetwork))
+            return false;
         return true;
     }
 }
index 0675a34b01cf7d292b5f85bea3756b01704174fd..1a9fe8b7d74d8251c3ff940bfc52bd0fcb583999 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.controller.sal.core.Node;
 import org.opendaylight.ovsdb.lib.notation.Row;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
+import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
 import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
 import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService;
 import org.opendaylight.ovsdb.plugin.api.OvsdbInventoryListener;
@@ -44,6 +45,7 @@ public class PortHandler extends AbstractHandler
     private volatile OvsdbConfigurationService ovsdbConfigurationService;
     private volatile OvsdbConnectionService connectionService;
     private volatile OvsdbInventoryListener ovsdbInventoryListener;
+    private volatile NeutronL3Adapter neutronL3Adapter;
 
     /**
      * Invoked when a port creation is requested
@@ -63,20 +65,21 @@ public class PortHandler extends AbstractHandler
      * @param port An instance of new Neutron Port object.
      */
     @Override
-    public void neutronPortCreated(NeutronPort port) {
-        int result = canCreatePort(port);
+    public void neutronPortCreated(NeutronPort neutronPort) {
+        int result = canCreatePort(neutronPort);
         if (result != HttpURLConnection.HTTP_CREATED) {
             logger.error(" Port create validation failed result - {} ", result);
             return;
         }
 
-        enqueueEvent(new NorthboundEvent(port, NorthboundEvent.Action.ADD));
+        enqueueEvent(new NorthboundEvent(neutronPort, NorthboundEvent.Action.ADD));
     }
-    private void doNeutronPortCreated(NeutronPort port) {
+    private void doNeutronPortCreated(NeutronPort neutronPort) {
         logger.debug(" Port-ADD successful for tenant-id - {}," +
                      " network-id - {}, port-id - {}",
-                     port.getTenantID(), port.getNetworkUUID(),
-                     port.getID());
+                     neutronPort.getTenantID(), neutronPort.getNetworkUUID(),
+                     neutronPort.getID());
+        neutronL3Adapter.handleNeutronPortEvent(neutronPort, NorthboundEvent.Action.ADD);
     }
 
     /**
@@ -110,7 +113,12 @@ public class PortHandler extends AbstractHandler
      * @param port An instance of modified Neutron Port object.
      */
     @Override
-    public void neutronPortUpdated(NeutronPort port) {
+    public void neutronPortUpdated(NeutronPort neutronPort) {
+        enqueueEvent(new NorthboundEvent(neutronPort, NorthboundEvent.Action.UPDATE));
+    }
+    private void doNeutronPortUpdated(NeutronPort neutronPort) {
+        logger.debug("Handling neutron update port " + neutronPort);
+        neutronL3Adapter.handleNeutronPortEvent(neutronPort, NorthboundEvent.Action.UPDATE);
     }
 
     /**
@@ -143,6 +151,7 @@ public class PortHandler extends AbstractHandler
     }
     private void doNeutronPortDeleted(NeutronPort neutronPort) {
         logger.debug("Handling neutron delete port " + neutronPort);
+        neutronL3Adapter.handleNeutronPortEvent(neutronPort, NorthboundEvent.Action.DELETE);
 
         List<Node> nodes = connectionService.getNodes();
         for (Node node : nodes) {
@@ -213,6 +222,9 @@ public class PortHandler extends AbstractHandler
             case DELETE:
                 doNeutronPortDeleted(ev.getPort());
                 break;
+            case UPDATE:
+                doNeutronPortUpdated(ev.getPort());
+                break;
             default:
                 logger.warn("Unable to process event action " + ev.getAction());
                 break;
index cf00e17c48849bff02d28aeced73a188fb5da66f..e0d17201d463460cb0918b3a0f8205ac348d092e 100644 (file)
@@ -12,9 +12,7 @@ package org.opendaylight.ovsdb.openstack.netvirt;
 import org.opendaylight.controller.networkconfig.neutron.INeutronRouterAware;
 import org.opendaylight.controller.networkconfig.neutron.NeutronRouter;
 import org.opendaylight.controller.networkconfig.neutron.NeutronRouter_Interface;
-import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
-import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService;
-import org.opendaylight.ovsdb.plugin.api.OvsdbInventoryListener;
+import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,9 +31,7 @@ public class RouterHandler extends AbstractHandler
     static final Logger logger = LoggerFactory.getLogger(RouterHandler.class);
 
     // The implementation for each of these services is resolved by the OSGi Service Manager
-    private volatile OvsdbConfigurationService ovsdbConfigurationService;
-    private volatile OvsdbConnectionService connectionService;
-    private volatile OvsdbInventoryListener ovsdbInventoryListener;
+    private volatile NeutronL3Adapter neutronL3Adapter;
 
     /**
      * Services provide this interface method to indicate if the specified router can be created
@@ -60,7 +56,7 @@ public class RouterHandler extends AbstractHandler
      */
     @Override
     public void neutronRouterCreated(NeutronRouter router) {
-        logger.debug(" Router created {}, uuid {}", router.getName(), router.getRouterUUID());
+        enqueueEvent(new NorthboundEvent(router, AbstractEvent.Action.ADD));
     }
 
     /**
@@ -89,7 +85,7 @@ public class RouterHandler extends AbstractHandler
      */
     @Override
     public void neutronRouterUpdated(NeutronRouter router) {
-        logger.debug(" Router updated {}", router.getName());
+        enqueueEvent(new NorthboundEvent(router, AbstractEvent.Action.UPDATE));
     }
 
     /**
@@ -115,7 +111,7 @@ public class RouterHandler extends AbstractHandler
      */
     @Override
     public void neutronRouterDeleted(NeutronRouter router) {
-        logger.debug(" Router deleted {}, uuid {}", router.getName(), router.getRouterUUID());
+        enqueueEvent(new NorthboundEvent(router, AbstractEvent.Action.DELETE));
     }
 
     /**
@@ -150,8 +146,7 @@ public class RouterHandler extends AbstractHandler
      */
     @Override
     public void neutronRouterInterfaceAttached(NeutronRouter router, NeutronRouter_Interface routerInterface) {
-        logger.debug(" Router {} interface {} attached. Subnet {}", router.getName(), routerInterface.getPortUUID(),
-                     routerInterface.getSubnetUUID());
+        enqueueEvent(new NorthboundEvent(router, routerInterface, AbstractEvent.Action.ADD));
     }
 
     /**
@@ -187,8 +182,7 @@ public class RouterHandler extends AbstractHandler
      */
     @Override
     public void neutronRouterInterfaceDetached(NeutronRouter router, NeutronRouter_Interface routerInterface) {
-        logger.debug(" Router {} interface {} detached. Subnet {}", router.getName(), routerInterface.getPortUUID(),
-                     routerInterface.getSubnetUUID());
+        enqueueEvent(new NorthboundEvent(router, routerInterface, AbstractEvent.Action.DELETE));
     }
 
     /**
@@ -205,8 +199,19 @@ public class RouterHandler extends AbstractHandler
         }
         NorthboundEvent ev = (NorthboundEvent) abstractEvent;
         switch (ev.getAction()) {
-            // TODO: add handling of events here, once callbacks do something
-            //       other than logging.
+            case ADD:
+                // fall through
+            case DELETE:
+                // fall through
+            case UPDATE:
+                if (ev.getRouterInterface() == null) {
+                    neutronL3Adapter.handleNeutronRouterEvent(ev.getRouter(), ev.getAction());
+                } else {
+                    neutronL3Adapter.handleNeutronRouterInterfaceEvent(ev.getRouter(),
+                                                                      ev.getRouterInterface(),
+                                                                      ev.getAction());
+                }
+                break;
             default:
                 logger.warn("Unable to process event action " + ev.getAction());
                 break;
index 947d58a0712e8ade6cf05581bbd338d23558f67a..1e2bff422f5695bd143ce844c60bf9dca963a397 100644 (file)
@@ -20,6 +20,7 @@ import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
+import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
 import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
 import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService;
 import org.opendaylight.ovsdb.plugin.api.OvsdbInventoryListener;
@@ -50,6 +51,7 @@ public class SouthboundHandler extends AbstractHandler implements OvsdbInventory
     private volatile NetworkingProviderManager networkingProviderManager;
     private volatile OvsdbConfigurationService ovsdbConfigurationService;
     private volatile OvsdbConnectionService connectionService;
+    private volatile NeutronL3Adapter neutronL3Adapter;
 
     void init() {
         nodeCache = Lists.newArrayList();
@@ -235,6 +237,7 @@ public class SouthboundHandler extends AbstractHandler implements OvsdbInventory
         logger.trace("Interface update of node: {}, uuid: {}", node, uuid);
         NeutronNetwork network = tenantNetworkManager.getTenantNetwork(intf);
         if (network != null) {
+            neutronL3Adapter.handleInterfaceEvent(node, intf, network, AbstractEvent.Action.UPDATE);
             if (bridgeConfigurationManager.createLocalNetwork(node, network))
                 networkingProviderManager.getProvider(node).handleInterfaceUpdate(network, node, intf);
         } else {
@@ -247,6 +250,7 @@ public class SouthboundHandler extends AbstractHandler implements OvsdbInventory
         logger.debug("handleInterfaceDelete: node: {}, uuid: {}, isLastInstanceOnNode: {}, interface: {}",
                 node, uuid, isLastInstanceOnNode, intf);
 
+        neutronL3Adapter.handleInterfaceEvent(node, intf, network, AbstractEvent.Action.DELETE);
         List<String> phyIfName = bridgeConfigurationManager.getAllPhysicalInterfaceNames(node);
         if (intf.getTypeColumn().getData().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN) ||
             intf.getTypeColumn().getData().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE) ||
index 6fd50ad90290b7364a73b59ad0169fd6558ef551..26e791d1be03ad6fa72dbc287f6d061880d726ad 100644 (file)
@@ -12,7 +12,9 @@ package org.opendaylight.ovsdb.openstack.netvirt;
 
 import org.opendaylight.controller.networkconfig.neutron.INeutronSubnetAware;
 import org.opendaylight.controller.networkconfig.neutron.NeutronSubnet;
+import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
 
+import com.google.common.base.Preconditions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -22,6 +24,9 @@ public class SubnetHandler extends AbstractHandler implements INeutronSubnetAwar
 
     static final Logger logger = LoggerFactory.getLogger(SubnetHandler.class);
 
+    // The implementation for each of these services is resolved by the OSGi Service Manager
+    private volatile NeutronL3Adapter neutronL3Adapter;
+
     @Override
     public int canCreateSubnet(NeutronSubnet subnet) {
         return HttpURLConnection.HTTP_CREATED;
@@ -29,7 +34,7 @@ public class SubnetHandler extends AbstractHandler implements INeutronSubnetAwar
 
     @Override
     public void neutronSubnetCreated(NeutronSubnet subnet) {
-        logger.debug("Neutron Subnet Creation : {}", subnet.toString());
+        enqueueEvent(new NorthboundEvent(subnet, NorthboundEvent.Action.ADD));
     }
 
     @Override
@@ -39,8 +44,7 @@ public class SubnetHandler extends AbstractHandler implements INeutronSubnetAwar
 
     @Override
     public void neutronSubnetUpdated(NeutronSubnet subnet) {
-        // TODO Auto-generated method stub
-
+        enqueueEvent(new NorthboundEvent(subnet, NorthboundEvent.Action.UPDATE));
     }
 
     @Override
@@ -51,8 +55,7 @@ public class SubnetHandler extends AbstractHandler implements INeutronSubnetAwar
 
     @Override
     public void neutronSubnetDeleted(NeutronSubnet subnet) {
-        // TODO Auto-generated method stub
-
+        enqueueEvent(new NorthboundEvent(subnet, NorthboundEvent.Action.DELETE));
     }
 
     /**
@@ -69,8 +72,14 @@ public class SubnetHandler extends AbstractHandler implements INeutronSubnetAwar
         }
         NorthboundEvent ev = (NorthboundEvent) abstractEvent;
         switch (ev.getAction()) {
-            // TODO: add handling of events here, once callbacks do something
-            //       other than logging.
+            case ADD:
+                // fall through
+            case DELETE:
+                // fall through
+            case UPDATE:
+                Preconditions.checkNotNull(neutronL3Adapter);
+                neutronL3Adapter.handleNeutronSubnetEvent(ev.getSubnet(), ev.getAction());
+                break;
             default:
                 logger.warn("Unable to process event action " + ev.getAction());
                 break;
diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/NeutronL3Adapter.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/NeutronL3Adapter.java
new file mode 100644 (file)
index 0000000..289e413
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2014 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 : Dave Tucker, Flavio Fernandes
+ */
+
+package org.opendaylight.ovsdb.openstack.netvirt.impl;
+
+import org.opendaylight.controller.networkconfig.neutron.NeutronFloatingIP;
+import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork;
+import org.opendaylight.controller.networkconfig.neutron.NeutronPort;
+import org.opendaylight.controller.networkconfig.neutron.NeutronRouter;
+import org.opendaylight.controller.networkconfig.neutron.NeutronRouter_Interface;
+import org.opendaylight.controller.networkconfig.neutron.NeutronSubnet;
+import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.ovsdb.openstack.netvirt.AbstractEvent;
+import org.opendaylight.ovsdb.openstack.netvirt.NorthboundEvent;
+import org.opendaylight.ovsdb.openstack.netvirt.api.MultiTenantAwareRouter;
+import org.opendaylight.ovsdb.openstack.netvirt.api.MultiTenantRouterForwardingProvider;
+import org.opendaylight.ovsdb.schema.openvswitch.Interface;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Neutron L3 Adapter implements a hub-like adapter for the various Neutron events. Based on
+ * these events, the abstract router callbacks can be generated to the multi-tenant aware router,
+ * as well as the multi-tenant router forwarding provider.
+ */
+public class NeutronL3Adapter {
+
+    /**
+     * Logger instance.
+     */
+    static final Logger logger = LoggerFactory.getLogger(NeutronL3Adapter.class);
+
+    // The implementation for each of these services is resolved by the OSGi Service Manager
+    private volatile MultiTenantAwareRouter multiTenantAwareRouter;
+    private volatile MultiTenantRouterForwardingProvider multiTenantRouterForwardingProvider;
+
+    //
+    // Callbacks from OVSDB's northbound handlers
+    //
+
+    public void handleNeutronSubnetEvent(final NeutronSubnet subnet, NorthboundEvent.Action action) {
+        logger.debug("Neutron subnet {} event : {}", action, subnet.toString());
+
+        // TODO
+    }
+
+    public void handleNeutronPortEvent(final NeutronPort neutronPort, NorthboundEvent.Action action) {
+        logger.debug("Neutron port {} event : {}", action, neutronPort.toString());
+
+        // TODO
+
+    }
+
+    public void handleNeutronRouterEvent(final NeutronRouter neutronRouter, NorthboundEvent.Action action) {
+        logger.debug("Neutron router {} event : {}", action, neutronRouter.toString());
+
+        // TODO
+
+    }
+
+    public void handleNeutronRouterInterfaceEvent(final NeutronRouter neutronRouter,
+                                                  final NeutronRouter_Interface neutronRouterInterface,
+                                                  NorthboundEvent.Action action) {
+        logger.debug(" Router {} interface {} attached. Subnet {}", neutronRouter.getName(),
+                     neutronRouterInterface.getPortUUID(),
+                     neutronRouterInterface.getSubnetUUID());
+
+        // TODO
+
+    }
+
+    public void handleNeutronFloatingIPEvent(final NeutronFloatingIP neutronFloatingIP,
+                                             NorthboundEvent.Action action) {
+        logger.debug(" Floating IP {} {}, uuid {}", action,
+                     neutronFloatingIP.getFixedIPAddress(),
+                     neutronFloatingIP.getFloatingIPUUID());
+
+        // TODO
+    }
+
+    public void handleNeutronNetworkEvent(final NeutronNetwork neutronNetwork, NorthboundEvent.Action action) {
+        logger.debug("neutronNetwork {}: network: {}", action, neutronNetwork);
+
+        // TODO
+    }
+
+    //
+    // Callbacks from OVSDB's southbound handler
+    //
+
+    public void handleInterfaceEvent(final Node node, final Interface intf, NeutronNetwork neutronNetwork,
+                                     AbstractEvent.Action action) {
+        logger.debug("southbound interface {} node:{} interface:{}, neutronNetwork:{}",
+                     action, node, intf, neutronNetwork);
+
+        // TODO
+    }
+
+}
index eada33cf50a128dc91a8131d1e78f689f163bc18..ce8f464131bf636e10962768c82fcd44bf5b5357 100644 (file)
@@ -18,64 +18,64 @@ import java.util.Set;
 import java.util.UUID;
 
 /**
- * OpenStack router implements the MultiTenantAwareRouter interfaces
- * It provides routing functionality for multiple tenants in an OpenStack cloud
+ * OpenStack router implements the MultiTenantAwareRouter interfaces It provides routing functionality for multiple
+ * tenants in an OpenStack cloud
  */
 public class OpenstackRouter implements MultiTenantAwareRouter {
 
+    @Override
+    public void addInterface(UUID tenantId, String interfaceName, Set<InterfaceAddress> addresses) {
 
-  @Override
-  public void addInterface(UUID tenantId, String interfaceName, Set<InterfaceAddress> addresses) {
+    }
 
-  }
+    @Override
+    public void addInterface(UUID tenantId, String interfaceName, String macAddress, Set<InterfaceAddress> addresses) {
 
-  @Override
-  public void addInterface(UUID tenantId, String interfaceName, String macAddress, Set<InterfaceAddress> addresses) {
+    }
 
-  }
+    @Override
+    public void updateInterface(UUID tenantId, String interfaceName, Set<InterfaceAddress> addresses) {
 
-  @Override
-  public void updateInterface(UUID tenantId, String interfaceName, Set<InterfaceAddress> addresses) {
+    }
 
-  }
+    @Override
+    public void updateInterface(UUID tenantId, String interfaceName, String macAddress,
+                                Set<InterfaceAddress> addresses) {
 
-  @Override
-  public void updateInterface(UUID tenantId, String interfaceName, String macAddress, Set<InterfaceAddress> addresses) {
+    }
 
-  }
+    @Override
+    public void removeInterface(UUID tenantId, String interfaceName) {
 
-  @Override
-  public void removeInterface(UUID tenantId, String interfaceName) {
+    }
 
-  }
+    @Override
+    public void addRoute(UUID tenantId, InterfaceAddress destination, InetAddress nextHop) {
 
-  @Override
-  public void addRoute(UUID tenantId, InterfaceAddress destination, InetAddress nextHop) {
+    }
 
-  }
+    @Override
+    public void addRoute(UUID tenantId, InterfaceAddress destination, InetAddress nextHop, Integer priority) {
 
-  @Override
-  public void addRoute(UUID tenantId, InterfaceAddress destination, InetAddress nextHop, Integer priority) {
+    }
 
-  }
+    @Override
+    public void removeRoute(UUID tenantId, InterfaceAddress destination, InetAddress nextHop) {
 
-  @Override
-  public void removeRoute(UUID tenantId, InterfaceAddress destination, InetAddress nextHop) {
+    }
 
-  }
+    @Override
+    public void removeRoute(UUID tenantId, InterfaceAddress destination, InetAddress nextHop, Integer priority) {
 
-  @Override
-  public void removeRoute(UUID tenantId, InterfaceAddress destination, InetAddress nextHop, Integer priority) {
+    }
 
-  }
+    @Override
+    public void addDefaultRoute(UUID tenantId, InetAddress nextHop) {
 
-  @Override
-  public void addDefaultRoute(UUID tenantId, InetAddress nextHop) {
+    }
 
-  }
+    @Override
+    public void addDefaultRoute(UUID tenantId, InetAddress nextHop, Integer priority) {
 
-  @Override
-  public void addDefaultRoute(UUID tenantId, InetAddress nextHop, Integer priority) {
-
-  }
+    }
 }