X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openstack%2Fnet-virt%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fovsdb%2Fopenstack%2Fnetvirt%2FPortHandler.java;h=a59927ea8e61cc1c281ec87c4dbb7e1b944e9900;hb=9e8ad5d3e11e9374026cb539304518ab8d215f89;hp=0675a34b01cf7d292b5f85bea3756b01704174fd;hpb=80aa3f278f3c5e8866089614919253f2f6763b5d;p=netvirt.git diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/PortHandler.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/PortHandler.java index 0675a34b01..a59927ea8e 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/PortHandler.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/PortHandler.java @@ -1,49 +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.api.OvsdbConfigurationService; -import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService; -import org.opendaylight.ovsdb.plugin.api.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.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); // 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 NodeCacheManager nodeCacheManager; + private volatile NeutronL3Adapter neutronL3Adapter; + private volatile Southbound southbound; /** * Invoked when a port creation is requested @@ -54,29 +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; - } - - enqueueEvent(new NorthboundEvent(port, NorthboundEvent.Action.ADD)); + public void neutronPortCreated(NeutronPort neutronPort) { + enqueueEvent(new NorthboundEvent(neutronPort, Action.ADD)); } - private void doNeutronPortCreated(NeutronPort port) { - logger.debug(" Port-ADD successful for tenant-id - {}," + - " network-id - {}, port-id - {}", - port.getTenantID(), port.getNetworkUUID(), - port.getID()); + 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); } /** @@ -92,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); } /** @@ -132,77 +115,44 @@ 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; - } - - enqueueEvent(new NorthboundEvent(neutronPort, NorthboundEvent.Action.DELETE)); + enqueueEvent(new NorthboundEvent(neutronPort, Action.DELETE)); } private void doNeutronPortDeleted(NeutronPort neutronPort) { - logger.debug("Handling neutron delete port " + neutronPort); - - List nodes = connectionService.getNodes(); + LOG.debug("Handling neutron delete port {}", neutronPort); + neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.DELETE); + //TODO: Need to implement getNodes + List nodes = nodeCacheManager.getNodes(); for (Node node : nodes) { try { - ConcurrentMap portRows = - this.ovsdbConfigurationService.getRows(node, - ovsdbConfigurationService.getTableName(node, Port.class)); - if (portRows != null) { - for (Row portRow : portRows.values()) { - Port port = ovsdbConfigurationService.getTypedRow(node, Port.class, portRow); - for (UUID interfaceUuid : port.getInterfacesColumn().getData()) { - Interface interfaceRow = (Interface) ovsdbConfigurationService - .getRow(node, - ovsdbConfigurationService.getTableName(node, Interface.class), - interfaceUuid.toString()); - - Map 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()); - ovsdbConfigurationService.deleteRow(node, - ovsdbConfigurationService.getTableName(node, Port.class), - port.getUuid().toString()); - break; - } - } + List 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 EventDispatcher + * @see org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher */ @Override public void processEvent(AbstractEvent abstractEvent) { if (!(abstractEvent instanceof NorthboundEvent)) { - logger.error("Unable to process abstract event " + abstractEvent); + LOG.error("Unable to process abstract event {}", abstractEvent); return; } NorthboundEvent ev = (NorthboundEvent) abstractEvent; @@ -213,9 +163,28 @@ 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()); + LOG.warn("Unable to process event action {}", ev.getAction()); break; } } + + @Override + public void setDependencies(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(serviceReference, this); + } + + @Override + public void setDependencies(Object impl) {} }