Bug 4160 - null pointer exception in getDHCPServerPort() (re-do)
[netvirt.git] / openstack / net-virt / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / PortHandler.java
index c62fe26678bed0362016b6254bd1ed31c06844d3..40f2643858d72f89f6df82220a9e8a1b7abac91e 100644 (file)
@@ -1,48 +1,42 @@
 /*
- * Copyright (C) 2013 Red Hat, Inc.
+ * Copyright (c) 2013, 2015 Red Hat, Inc. and others. All rights reserved.
  *
  * 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 : Madhu Venugopal, Brent Salisbury
  */
+
 package org.opendaylight.ovsdb.openstack.netvirt;
 
-import org.opendaylight.controller.networkconfig.neutron.INeutronPortAware;
-import org.opendaylight.controller.networkconfig.neutron.NeutronPort;
-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.plugin.IConnectionServiceInternal;
-import org.opendaylight.ovsdb.plugin.OvsdbConfigService;
-import org.opendaylight.ovsdb.plugin.OvsdbInventoryListener;
-import org.opendaylight.ovsdb.schema.openvswitch.Interface;
-import org.opendaylight.ovsdb.schema.openvswitch.Port;
+import java.net.HttpURLConnection;
+import java.util.List;
 
+import org.opendaylight.neutron.spi.INeutronPortAware;
+import org.opendaylight.neutron.spi.NeutronPort;
+import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
+import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
+import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
+import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
+import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
+import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
+import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.net.HttpURLConnection;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentMap;
-
 /**
  * Handle requests for Neutron Port.
  */
-public class PortHandler extends AbstractHandler
-                         implements INeutronPortAware {
-
-    /**
-     * Logger instance.
-     */
-    static final Logger logger = LoggerFactory.getLogger(PortHandler.class);
+public class PortHandler extends AbstractHandler implements INeutronPortAware, ConfigInterface {
+    private static final Logger LOG = LoggerFactory.getLogger(PortHandler.class);
 
-    private volatile OvsdbConfigService ovsdbConfigService;
-    private volatile IConnectionServiceInternal connectionService;
-    private volatile OvsdbInventoryListener ovsdbInventoryListener;
+    // The implementation for each of these services is resolved by the OSGi Service Manager
+    private volatile NodeCacheManager nodeCacheManager;
+    private volatile NeutronL3Adapter neutronL3Adapter;
+    private volatile Southbound southbound;
 
     /**
      * Invoked when a port creation is requested
@@ -53,26 +47,23 @@ public class PortHandler extends AbstractHandler
      */
     @Override
     public int canCreatePort(NeutronPort port) {
-        return HttpURLConnection.HTTP_CREATED;
+        return HttpURLConnection.HTTP_OK;
     }
 
     /**
      * Invoked to take action after a port has been created.
      *
-     * @param port An instance of new Neutron Port object.
+     * @param neutronPort An instance of new Neutron Port object.
      */
     @Override
-    public void neutronPortCreated(NeutronPort port) {
-        int result = canCreatePort(port);
-        if (result != HttpURLConnection.HTTP_CREATED) {
-            logger.error(" Port create validation failed result - {} ", result);
-            return;
-        }
-
-        logger.debug(" Port-ADD successful for tenant-id - {}," +
-                     " network-id - {}, port-id - {}, result - {} ",
-                     port.getTenantID(), port.getNetworkUUID(),
-                     port.getID(), result);
+    public void neutronPortCreated(NeutronPort neutronPort) {
+        enqueueEvent(new NorthboundEvent(neutronPort, Action.ADD));
+    }
+    private void doNeutronPortCreated(NeutronPort neutronPort) {
+        LOG.debug(" Port-ADD successful for tenant-id - {}, network-id - {}, port-id - {}",
+                     neutronPort.getTenantID(), neutronPort.getNetworkUUID(),
+                     neutronPort.getID());
+        neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.ADD);
     }
 
     /**
@@ -88,25 +79,21 @@ public class PortHandler extends AbstractHandler
     @Override
     public int canUpdatePort(NeutronPort delta,
                              NeutronPort original) {
-        int result = HttpURLConnection.HTTP_OK;
-        /**
-         * To basic validation of the request
-         */
-
-        if ((original == null) || (delta == null)) {
-            logger.error("port object not specified");
-            return HttpURLConnection.HTTP_BAD_REQUEST;
-        }
-        return result;
+        return HttpURLConnection.HTTP_OK;
     }
 
     /**
      * Invoked to take action after a port has been updated.
      *
-     * @param port An instance of modified Neutron Port object.
+     * @param neutronPort An instance of modified Neutron Port object.
      */
     @Override
-    public void neutronPortUpdated(NeutronPort port) {
+    public void neutronPortUpdated(NeutronPort neutronPort) {
+        enqueueEvent(new NorthboundEvent(neutronPort, Action.UPDATE));
+    }
+    private void doNeutronPortUpdated(NeutronPort neutronPort) {
+        LOG.debug("Handling neutron update port {}", neutronPort);
+        neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.UPDATE);
     }
 
     /**
@@ -128,59 +115,77 @@ public class PortHandler extends AbstractHandler
      */
     @Override
     public void neutronPortDeleted(NeutronPort neutronPort) {
-
-        int result = canDeletePort(neutronPort);
-        if  (result != HttpURLConnection.HTTP_OK) {
-            logger.error(" deletePort validation failed - result {} ", result);
-            return;
-        }
-
-        List<Node> nodes = connectionService.getNodes();
+        enqueueEvent(new NorthboundEvent(neutronPort, Action.DELETE));
+    }
+    private void doNeutronPortDeleted(NeutronPort neutronPort) {
+        LOG.debug("Handling neutron delete port {}", neutronPort);
+        neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.DELETE);
+        //TODO: Need to implement getNodes
+        List<Node> nodes = nodeCacheManager.getNodes();
         for (Node node : nodes) {
             try {
-                ConcurrentMap<String, Row> portRows =
-                        this.ovsdbConfigService.getRows(node,
-                                                        ovsdbConfigService.getTableName(node, Port.class));
-                if (portRows != null) {
-                    for (Row portRow : portRows.values()) {
-                        Port port = ovsdbConfigService.getTypedRow(node, Port.class, portRow);
-                        for (UUID interfaceUuid : port.getInterfacesColumn().getData()) {
-                            Interface interfaceRow = (Interface) ovsdbConfigService
-                                    .getRow(node,
-                                            ovsdbConfigService.getTableName(node, Interface.class),
-                                            interfaceUuid.toString());
-
-                            Map<String, String> externalIds = interfaceRow.getExternalIdsColumn().getData();
-
-                            if (externalIds == null) {
-                                logger.trace("No external_ids seen in {}", interfaceRow);
-                                continue;
-                            }
-
-                            /* Compare Neutron port uuid */
-                            String neutronPortId = externalIds.get(Constants.EXTERNAL_ID_INTERFACE_ID);
-                            if (neutronPortId == null) {
-                                continue;
-                            }
-
-                            if (neutronPortId.equalsIgnoreCase(neutronPort.getPortUUID())) {
-                                logger.trace("neutronPortDeleted: Delete interface {}", interfaceRow.getName());
-                                ovsdbConfigService.deleteRow(node,
-                                                             ovsdbConfigService.getTableName(node, Port.class),
-                                                             port.getUuid().toString());
-                                break;
-                            }
-                        }
+                List<OvsdbTerminationPointAugmentation> ports = southbound.getTerminationPointsOfBridge(node);
+                for (OvsdbTerminationPointAugmentation port : ports) {
+                    String neutronPortId =
+                            southbound.getInterfaceExternalIdsValue(port, Constants.EXTERNAL_ID_INTERFACE_ID);
+                    if (neutronPortId != null && neutronPortId.equalsIgnoreCase(neutronPort.getPortUUID())) {
+                        LOG.trace("neutronPortDeleted: Delete interface {}", port.getName());
+                        southbound.deleteTerminationPoint(node, port.getName());
+                        break;
                     }
                 }
             } catch (Exception e) {
-                logger.error("Exception during handlingNeutron network delete");
+                LOG.error("Exception during handlingNeutron port delete", e);
             }
         }
-        logger.debug(" PORT delete successful for tenant-id - {}, " +
-                     " network-id - {}, port-id - {}",
+        LOG.debug(" PORT delete successful for tenant-id - {}, network-id - {}, port-id - {}",
                      neutronPort.getTenantID(), neutronPort.getNetworkUUID(),
                      neutronPort.getID());
+    }
+
+    /**
+     * Process the event.
+     *
+     * @param abstractEvent the {@link org.opendaylight.ovsdb.openstack.netvirt.AbstractEvent} event to be handled.
+     * @see org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher
+     */
+    @Override
+    public void processEvent(AbstractEvent abstractEvent) {
+        if (!(abstractEvent instanceof NorthboundEvent)) {
+            LOG.error("Unable to process abstract event {}", abstractEvent);
+            return;
+        }
+        NorthboundEvent ev = (NorthboundEvent) abstractEvent;
+        switch (ev.getAction()) {
+            case ADD:
+                doNeutronPortCreated(ev.getPort());
+                break;
+            case DELETE:
+                doNeutronPortDeleted(ev.getPort());
+                break;
+            case UPDATE:
+                doNeutronPortUpdated(ev.getPort());
+                break;
+            default:
+                LOG.warn("Unable to process event action {}", ev.getAction());
+                break;
+        }
+    }
 
+    @Override
+    public void setDependencies(BundleContext bundleContext, ServiceReference serviceReference) {
+        nodeCacheManager =
+                (NodeCacheManager) ServiceHelper.getGlobalInstance(NodeCacheManager.class, this);
+        neutronL3Adapter =
+                (NeutronL3Adapter) ServiceHelper.getGlobalInstance(NeutronL3Adapter.class, this);
+        southbound =
+                (Southbound) ServiceHelper.getGlobalInstance(Southbound.class, this);
+        eventDispatcher =
+                (EventDispatcher) ServiceHelper.getGlobalInstance(EventDispatcher.class, this);
+        eventDispatcher.eventHandlerAdded(
+                bundleContext.getServiceReference(INeutronPortAware.class.getName()), this);
     }
+
+    @Override
+    public void setDependencies(Object impl) {}
 }