X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=neutron-ovsdb%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fgroupbasedpolicy%2Fneutron%2Fovsdb%2FTerminationPointDataChangeListener.java;h=2cf2b78dfd96d2367b493c7c89e1109dc4e4e867;hb=e9b93945fe12111eb58baa076e4257a16a685037;hp=343687a43077e914e35793cd41f5934374aef301;hpb=2aea34aaa016d7989707dc40a9d918ed59bf2a29;p=groupbasedpolicy.git diff --git a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListener.java b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListener.java index 343687a43..2cf2b78df 100755 --- a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListener.java +++ b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListener.java @@ -9,8 +9,6 @@ package org.opendaylight.groupbasedpolicy.neutron.ovsdb; import static com.google.common.base.Preconditions.checkNotNull; -import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.NodeDataChangeListener.getProviderMapping; -import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.NodeDataChangeListener.processNodeNotification; import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.EndpointHelper.lookupEndpoint; import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.EndpointHelper.updateEndpointRemoveLocation; import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.EndpointHelper.updateEndpointWithLocation; @@ -24,25 +22,24 @@ import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.c import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getManagerNode; import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbBridgeFromTerminationPoint; import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getTopologyNode; -import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; - import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; +import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; +import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener; +import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; +import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; -import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; -import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.ovsdb.southbound.SouthboundConstants; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Uuid; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.UniqueId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointKey; @@ -57,17 +54,15 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint; import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Optional; - -public class TerminationPointDataChangeListener implements DataChangeListener, AutoCloseable { +public class TerminationPointDataChangeListener implements DataTreeChangeListener, + AutoCloseable { private static final String NEUTRON_EXTERNAL_ID_KEY = "iface-id"; - private final ListenerRegistration registration; + private final ListenerRegistration registration; private final DataBroker dataBroker; private final EndpointService epService; private static final Logger LOG = LoggerFactory.getLogger(TerminationPointDataChangeListener.class); @@ -81,13 +76,13 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A .child(Node.class) .child(TerminationPoint.class) .augmentation(OvsdbTerminationPointAugmentation.class); - registration = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, iid, this, - DataChangeScope.ONE); + registration = dataBroker.registerDataTreeChangeListener(new DataTreeIdentifier<>( + LogicalDatastoreType.OPERATIONAL, iid), this); requiredTunnelTypes = createSupportedTunnelsList(); } private List createSupportedTunnelsList() { - List required = new ArrayList(); + List required = new ArrayList<>(); required.add(new VxlanTunnelType()); required.add(new VxlanGpeTunnelType()); return Collections.unmodifiableList(required); @@ -102,50 +97,32 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A * When vSwitch is deleted, we loose data in operational DS to determine Iid of * corresponding NodeId. */ - private static final Map, NodeId> nodeIdByTerminPoint = new HashMap<>(); + private static final Map, NodeId> NODE_ID_BY_TERMIN_POINT = + new HashMap<>(); @Override - public void onDataChanged(AsyncDataChangeEvent, DataObject> change) { - - /* - * TerminationPoint notifications with OVSDB augmentations - * vSwitch ports. Iterate through the list of new ports. - */ - for (Entry, DataObject> entry : change.getCreatedData().entrySet()) { - if (entry.getValue() instanceof OvsdbTerminationPointAugmentation) { - OvsdbTerminationPointAugmentation ovsdbTp = (OvsdbTerminationPointAugmentation) entry.getValue(); - @SuppressWarnings("unchecked") - InstanceIdentifier ovsdbTpIid = (InstanceIdentifier) entry.getKey(); - OvsdbBridgeAugmentation ovsdbBridge = getOvsdbBridgeFromTerminationPoint(ovsdbTpIid, dataBroker); - nodeIdByTerminPoint.put(ovsdbTpIid, - new NodeId(getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker))); - processOvsdbBridge(ovsdbBridge, ovsdbTp, ovsdbTpIid); - } - } - - /* - * Updates - */ - for (Entry, DataObject> entry : change.getUpdatedData().entrySet()) { - if (entry.getValue() instanceof OvsdbTerminationPointAugmentation) { - OvsdbTerminationPointAugmentation ovsdbTp = (OvsdbTerminationPointAugmentation) entry.getValue(); - @SuppressWarnings("unchecked") - InstanceIdentifier ovsdbTpIid = (InstanceIdentifier) entry.getKey(); - OvsdbBridgeAugmentation ovsdbBridge = getOvsdbBridgeFromTerminationPoint(ovsdbTpIid, dataBroker); - processOvsdbBridge(ovsdbBridge, ovsdbTp, ovsdbTpIid); - } - } - - /* - * Deletions - */ - for (InstanceIdentifier iid : change.getRemovedPaths()) { - DataObject old = change.getOriginalData().get(iid); - if (old instanceof OvsdbTerminationPointAugmentation) { - OvsdbTerminationPointAugmentation ovsdbTp = (OvsdbTerminationPointAugmentation) old; - @SuppressWarnings("unchecked") - InstanceIdentifier ovsdbTpIid = (InstanceIdentifier) iid; - processRemovedTp(nodeIdByTerminPoint.get(ovsdbTpIid) , ovsdbTp, ovsdbTpIid); + public void onDataTreeChanged(Collection> changes) { + for (DataTreeModification change: changes) { + DataObjectModification rootNode = change.getRootNode(); + InstanceIdentifier ovsdbTpIid = change.getRootPath().getRootIdentifier(); + OvsdbTerminationPointAugmentation origOvsdbTp = rootNode.getDataBefore(); + switch (rootNode.getModificationType()) { + case SUBTREE_MODIFIED: + case WRITE: + OvsdbTerminationPointAugmentation updatedOvsdbTp = rootNode.getDataAfter(); + OvsdbBridgeAugmentation ovsdbBridge = getOvsdbBridgeFromTerminationPoint(ovsdbTpIid, dataBroker); + if (origOvsdbTp == null) { + NODE_ID_BY_TERMIN_POINT.put(ovsdbTpIid, + new NodeId(getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker))); + } + + processOvsdbBridge(ovsdbBridge, updatedOvsdbTp, ovsdbTpIid); + break; + case DELETE: + processRemovedTp(NODE_ID_BY_TERMIN_POINT.get(ovsdbTpIid), origOvsdbTp, ovsdbTpIid); + break; + default: + break; } } } @@ -188,7 +165,7 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A */ if (externalId != null) { - EndpointKey epKey = getEpKeyFromNeutronMapper(new Uuid(externalId), dataBroker); + EndpointKey epKey = getEpKeyFromNeutronMapper(new UniqueId(externalId), dataBroker); if (epKey == null) { LOG.debug("TerminationPoint {} with external ID {} is not in Neutron Map", ovsdbTp, externalId); return; @@ -196,9 +173,8 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A ReadOnlyTransaction transaction = dataBroker.newReadOnlyTransaction(); ep = lookupEndpoint(epKey, transaction); if (ep == null) { - LOG.warn( - "TerminationPoint {} with external ID {} is in Neutron Map, but corresponding Endpoint {} isn't in Endpoint Repository", - ovsdbTp, externalId, epKey); + LOG.warn("TerminationPoint {} with external ID {} is in Neutron Map, " + + "but corresponding Endpoint {} isn't in Endpoint Repository", ovsdbTp, externalId, epKey); return; } /* @@ -208,35 +184,19 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A * OfOverlay augmentation. If it hasn't, go see if the * tunnel ports exist, and if not, go and create them. */ - if (checkOfOverlayConfig(nodeIdString, requiredTunnelTypes, dataBroker) != true) { + if (!checkOfOverlayConfig(nodeIdString, requiredTunnelTypes, dataBroker)) { checkNotNull(nodeIid); /* * Check to see if we need to create a * tunnel port on the parent node */ - createTunnelPorts(nodeIid, dataBroker); + createTunnelPorts(nodeIid); } } else { LOG.debug("TerminationPoint {} had no external ID, not processing for external ID.", ovsdbTp); } - /* - * Check if Neutron External port was announed in Node before TerminationPoint it refers to - * was actually instantiated. This may or may not have external information in the future, - * hence - * not process as IF/ELSE externalID. - */ - ReadOnlyTransaction transaction = dataBroker.newReadOnlyTransaction(); - Optional node = readFromDs(LogicalDatastoreType.OPERATIONAL, nodeIid, transaction); - if (node.isPresent() && node.get().getAugmentation(OvsdbNodeAugmentation.class) != null) { - OvsdbNodeAugmentation ovsdbNodeAug = node.get().getAugmentation(OvsdbNodeAugmentation.class); - if (getProviderMapping(ovsdbNodeAug) != null) { - processNodeNotification(ovsdbNodeAug); - - } - } else { - } /* * This may be a notification for a tunnel we just created. * In that case, we need to update the Inventory Node's OfOverlay @@ -254,10 +214,10 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A /** * If removed termination point was a tunnel port, - * removes attached tunnels (namely Vxlan-type) from OVSDB bridge; - * else removes location info from TP + * removes attached tunnels (namely Vxlan-type) from OVSDB bridge, + * else removes location info from TP. * - * @param ovsdbBridge {@link OvsdbBridgeAugmentation} + * @param nodeId {@link NodeId} * @param ovsdbTp {@link OvsdbTerminationPointAugmentation} * @param ovsdbTpIid termination point's IID {@link InstanceIdentifier} */ @@ -271,14 +231,14 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A } /** - * Delete location on EP for given TP + * Delete location on EP for given TP. * * @param ovsdbTp {@link OvsdbTerminationPointAugmentation} */ private void deleteLocationForTp(OvsdbTerminationPointAugmentation ovsdbTp) { String externalId = getNeutronPortUuid(ovsdbTp); if (externalId != null) { - EndpointKey epKey = getEpKeyFromNeutronMapper(new Uuid(externalId), dataBroker); + EndpointKey epKey = getEpKeyFromNeutronMapper(new UniqueId(externalId), dataBroker); if (epKey == null) { LOG.debug("TerminationPoint {} with external ID {} is not in Neutron Map.", ovsdbTp, externalId); return; @@ -287,9 +247,8 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A Endpoint ep = lookupEndpoint(epKey, readOnlyTransaction); readOnlyTransaction.close(); if (ep == null) { - LOG.warn( - "TerminationPoint {} with external ID {} is in Neutron Map, but corresponding Endpoint {} isn't in Endpoint Repository.", - ovsdbTp, externalId, epKey); + LOG.warn("TerminationPoint {} with external ID {} is in Neutron Map," + + " but corresponding Endpoint {} isn't in Endpoint Repository.", ovsdbTp, externalId, epKey); return; } updateEndpointRemoveLocation(ep, dataBroker.newReadWriteTransaction()); @@ -327,7 +286,8 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A * * @return true if it's a required tunnel port, false if it isn't */ - private boolean isTunnelPort(OvsdbTerminationPointAugmentation ovsdbTp, List requiredTunnelTypes) { + private static boolean isTunnelPort(OvsdbTerminationPointAugmentation ovsdbTp, + List requiredTunnelTypes) { if (ovsdbTp.getInterfaceType() != null) { for (AbstractTunnelType tunnelType : requiredTunnelTypes) { if (tunnelType.isValidTunnelPort(ovsdbTp)) { @@ -342,7 +302,7 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A * Get the Neutron Port UUID from an {@link OvsdbTerminationPointAugmentation}. * The Neutron Port UUID is stored as an "external-id" in the termination point. * - * @param ovsdbTp The OVSDB Termination Point augmentation + * @param ovsdbTp The {@link OvsdbTerminationPointAugmentation} * @return The String representation of the Neutron Port UUID, null if not present */ private String getNeutronPortUuid(OvsdbTerminationPointAugmentation ovsdbTp) { @@ -365,9 +325,8 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A * create them. * * @param nodeIid {@link InstanceIdentifier} - * @param dataBroker {@link DataBroker} */ - private void createTunnelPorts(InstanceIdentifier nodeIid, DataBroker dataBroker) { + private void createTunnelPorts(InstanceIdentifier nodeIid) { Node node = getTopologyNode(nodeIid, dataBroker); checkNotNull(node); @@ -412,8 +371,9 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A */ OvsdbNodeAugmentation managerNode = getManagerNode(ovsdbBridge, dataBroker); - if (managerNode == null) + if (managerNode == null) { return null; + } if (managerNode.getConnectionInfo() != null) { return managerNode.getConnectionInfo().getRemoteIp();