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=7fd0cc20b24cc3e10b6136da01f6b2a8e67710f9;hpb=a6fb9c4ffb936edf441121fc2590a5711d914868;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 7fd0cc20b..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 @@ -22,21 +22,20 @@ 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.rev130715.IpAddress; @@ -55,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); @@ -79,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); @@ -100,54 +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 = + 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; } } } @@ -198,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; } /* @@ -216,7 +190,7 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A * 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); @@ -240,8 +214,8 @@ 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 nodeId {@link NodeId} * @param ovsdbTp {@link OvsdbTerminationPointAugmentation} @@ -257,7 +231,7 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A } /** - * Delete location on EP for given TP + * Delete location on EP for given TP. * * @param ovsdbTp {@link OvsdbTerminationPointAugmentation} */ @@ -273,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()); @@ -313,7 +286,7 @@ 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, + private static boolean isTunnelPort(OvsdbTerminationPointAugmentation ovsdbTp, List requiredTunnelTypes) { if (ovsdbTp.getInterfaceType() != null) { for (AbstractTunnelType tunnelType : requiredTunnelTypes) { @@ -352,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); @@ -399,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();