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;
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;
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<OvsdbTerminationPointAugmentation>,
+ AutoCloseable {
private static final String NEUTRON_EXTERNAL_ID_KEY = "iface-id";
- private final ListenerRegistration<DataChangeListener> registration;
+ private final ListenerRegistration<?> registration;
private final DataBroker dataBroker;
private final EndpointService epService;
private static final Logger LOG = LoggerFactory.getLogger(TerminationPointDataChangeListener.class);
.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<AbstractTunnelType> createSupportedTunnelsList() {
- List<AbstractTunnelType> required = new ArrayList<AbstractTunnelType>();
+ List<AbstractTunnelType> required = new ArrayList<>();
required.add(new VxlanTunnelType());
required.add(new VxlanGpeTunnelType());
return Collections.unmodifiableList(required);
* When vSwitch is deleted, we loose data in operational DS to determine Iid of
* corresponding NodeId.
*/
- private static final Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, NodeId> nodeIdByTerminPoint = new HashMap<>();
+ private static final Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, NodeId> NODE_ID_BY_TERMIN_POINT =
+ new HashMap<>();
@Override
- public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-
- /*
- * TerminationPoint notifications with OVSDB augmentations
- * vSwitch ports. Iterate through the list of new ports.
- */
- for (Entry<InstanceIdentifier<?>, DataObject> entry : change.getCreatedData().entrySet()) {
- if (entry.getValue() instanceof OvsdbTerminationPointAugmentation) {
- OvsdbTerminationPointAugmentation ovsdbTp = (OvsdbTerminationPointAugmentation) entry.getValue();
- @SuppressWarnings("unchecked")
- InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid = (InstanceIdentifier<OvsdbTerminationPointAugmentation>) entry.getKey();
- OvsdbBridgeAugmentation ovsdbBridge = getOvsdbBridgeFromTerminationPoint(ovsdbTpIid, dataBroker);
- nodeIdByTerminPoint.put(ovsdbTpIid,
- new NodeId(getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker)));
- processOvsdbBridge(ovsdbBridge, ovsdbTp, ovsdbTpIid);
- }
- }
-
- /*
- * Updates
- */
- for (Entry<InstanceIdentifier<?>, DataObject> entry : change.getUpdatedData().entrySet()) {
- if (entry.getValue() instanceof OvsdbTerminationPointAugmentation) {
- OvsdbTerminationPointAugmentation ovsdbTp = (OvsdbTerminationPointAugmentation) entry.getValue();
- @SuppressWarnings("unchecked")
- InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid = (InstanceIdentifier<OvsdbTerminationPointAugmentation>) 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<OvsdbTerminationPointAugmentation> ovsdbTpIid = (InstanceIdentifier<OvsdbTerminationPointAugmentation>) iid;
- processRemovedTp(nodeIdByTerminPoint.get(ovsdbTpIid) , ovsdbTp, ovsdbTpIid);
+ public void onDataTreeChanged(Collection<DataTreeModification<OvsdbTerminationPointAugmentation>> changes) {
+ for (DataTreeModification<OvsdbTerminationPointAugmentation> change: changes) {
+ DataObjectModification<OvsdbTerminationPointAugmentation> rootNode = change.getRootNode();
+ InstanceIdentifier<OvsdbTerminationPointAugmentation> 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;
}
}
}
*/
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;
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;
}
/*
* 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
}
- /*
- * 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> 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
/**
* 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}
}
/**
- * 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;
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());
*
* @return true if it's a required tunnel port, false if it isn't
*/
- private boolean isTunnelPort(OvsdbTerminationPointAugmentation ovsdbTp, List<AbstractTunnelType> requiredTunnelTypes) {
+ private boolean isTunnelPort(OvsdbTerminationPointAugmentation ovsdbTp,
+ List<AbstractTunnelType> requiredTunnelTypes) {
if (ovsdbTp.getInterfaceType() != null) {
for (AbstractTunnelType tunnelType : requiredTunnelTypes) {
if (tunnelType.isValidTunnelPort(ovsdbTp)) {
*/
OvsdbNodeAugmentation managerNode = getManagerNode(ovsdbBridge, dataBroker);
- if (managerNode == null)
+ if (managerNode == null) {
return null;
+ }
if (managerNode.getConnectionInfo() != null) {
return managerNode.getConnectionInfo().getRemoteIp();