X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=applications%2Fforwardingrules-sync%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fapplications%2Ffrsync%2Fimpl%2FSimplifiedOperationalListener.java;h=424a98daebc3b7456b864abb5a89a013ea305ea7;hb=f43cdb15170c04272e95e8b280e2d7ceace613a2;hp=7717bb2930e4b05e8727bb050ba926d0e0b55106;hpb=a3af249420345f1c19178cadebbcd71b424eb3b1;p=openflowplugin.git diff --git a/applications/forwardingrules-sync/src/main/java/org/opendaylight/openflowplugin/applications/frsync/impl/SimplifiedOperationalListener.java b/applications/forwardingrules-sync/src/main/java/org/opendaylight/openflowplugin/applications/frsync/impl/SimplifiedOperationalListener.java index 7717bb2930..424a98daeb 100644 --- a/applications/forwardingrules-sync/src/main/java/org/opendaylight/openflowplugin/applications/frsync/impl/SimplifiedOperationalListener.java +++ b/applications/forwardingrules-sync/src/main/java/org/opendaylight/openflowplugin/applications/frsync/impl/SimplifiedOperationalListener.java @@ -26,6 +26,7 @@ import org.opendaylight.openflowplugin.applications.frsync.impl.clustering.Devic import org.opendaylight.openflowplugin.applications.frsync.util.ModificationUtil; import org.opendaylight.openflowplugin.applications.frsync.util.PathUtil; import org.opendaylight.openflowplugin.applications.frsync.util.ReconciliationRegistry; +import org.opendaylight.openflowplugin.applications.frsync.util.SyncupEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableStatisticsGatheringStatus; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.snapshot.gathering.status.grouping.SnapshotGatheringStatusEnd; @@ -39,12 +40,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Listens to operational new nodes and delegates add/remove/update/barrier to {@link SyncReactor}. + * Listens to operational changes and starts reconciliation through {@link SyncReactor} when necessary. */ public class SimplifiedOperationalListener extends AbstractFrmSyncListener { + private static final Logger LOG = LoggerFactory.getLogger(SimplifiedOperationalListener.class); public static final String DATE_AND_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; - private final SyncReactor reactor; private final FlowCapableNodeSnapshotDao operationalSnapshot; private final FlowCapableNodeDao configDao; @@ -64,23 +65,17 @@ public class SimplifiedOperationalListener extends AbstractFrmSyncListener } @Override - public void onDataTreeChanged(Collection> modifications) { - LOG.trace("Operational changes: {}", modifications.size()); + public void onDataTreeChanged(final Collection> modifications) { super.onDataTreeChanged(modifications); } /** - * This method behaves like this: - *
    - *
  • If node is added to operational store then reconciliation.
  • - *
  • Node is deleted from operational cache is removed.
  • - *
  • Skip this event otherwise.
  • - *
- * + * Update cache, register for device masterhip when device connected and start reconciliation if device + * is registered and actual modification is consistent.Skip the event otherwise. * @throws InterruptedException from syncup */ protected Optional> processNodeModification( - DataTreeModification modification) throws InterruptedException { + final DataTreeModification modification) throws InterruptedException { final NodeId nodeId = ModificationUtil.nodeId(modification); updateCache(modification); @@ -88,7 +83,7 @@ public class SimplifiedOperationalListener extends AbstractFrmSyncListener deviceMastershipManager.onDeviceConnected(nodeId); } - if (isRegisteredAndConsistentForReconcile(modification)) { + if (reconciliationRegistry.isRegistered(nodeId) && isConsistentForReconcile(modification)) { return reconciliation(modification); } else { return skipModification(modification); @@ -97,10 +92,10 @@ public class SimplifiedOperationalListener extends AbstractFrmSyncListener /** * Remove if delete. Update only if FlowCapableNode Augmentation modified. - * + * Unregister for device mastership. * @param modification Datastore modification */ - private void updateCache(DataTreeModification modification) { + private void updateCache(final DataTreeModification modification) { NodeId nodeId = ModificationUtil.nodeId(modification); if (isDelete(modification) || isDeleteLogical(modification)) { operationalSnapshot.updateCache(nodeId, Optional.absent()); @@ -110,88 +105,75 @@ public class SimplifiedOperationalListener extends AbstractFrmSyncListener operationalSnapshot.updateCache(nodeId, Optional.fromNullable(ModificationUtil.flowCapableNodeAfter(modification))); } - private Optional> skipModification(DataTreeModification modification) { - LOG.trace("Skipping operational modification: {}, before {}, after {}", - ModificationUtil.nodeIdValue(modification), - modification.getRootNode().getDataBefore() == null ? "null" : "nonnull", - modification.getRootNode().getDataAfter() == null ? "null" : "nonnull"); + private Optional> skipModification(final DataTreeModification modification) { + if (LOG.isTraceEnabled()) { + LOG.trace("Skipping operational modification: {}, before {}, after {}", + ModificationUtil.nodeIdValue(modification), + modification.getRootNode().getDataBefore() == null ? "null" : "nonnull", + modification.getRootNode().getDataAfter() == null ? "null" : "nonnull"); + } return Optional.absent(); } /** * ModificationType.DELETE. */ - private boolean isDelete(DataTreeModification modification) { - if (ModificationType.DELETE == modification.getRootNode().getModificationType()) { - LOG.trace("Delete {} (physical)", ModificationUtil.nodeIdValue(modification)); - return true; - } - - return false; + private boolean isDelete(final DataTreeModification modification) { + return ModificationType.DELETE == modification.getRootNode().getModificationType(); } /** * All connectors disappeared from operational store (logical delete). */ - private boolean isDeleteLogical(DataTreeModification modification) { + private boolean isDeleteLogical(final DataTreeModification modification) { final DataObjectModification rootNode = modification.getRootNode(); - if (!safeConnectorsEmpty(rootNode.getDataBefore()) && safeConnectorsEmpty(rootNode.getDataAfter())) { - LOG.trace("Delete {} (logical)", ModificationUtil.nodeIdValue(modification)); - return true; - } + return !safeConnectorsEmpty(rootNode.getDataBefore()) && safeConnectorsEmpty(rootNode.getDataAfter()); - return false; } - private boolean isAdd(DataTreeModification modification) { + private boolean isAdd(final DataTreeModification modification) { final DataObjectModification rootNode = modification.getRootNode(); - final Node dataAfter = rootNode.getDataAfter(); - final Node dataBefore = rootNode.getDataBefore(); - - final boolean nodeAppearedInOperational = dataBefore == null && dataAfter != null; - if (nodeAppearedInOperational) { - LOG.trace("Add {} (physical)", ModificationUtil.nodeIdValue(modification)); - } - return nodeAppearedInOperational; + return rootNode.getDataBefore() == null && rootNode.getDataAfter() != null; } /** * All connectors appeared in operational store (logical add). */ - private boolean isAddLogical(DataTreeModification modification) { + private boolean isAddLogical(final DataTreeModification modification) { final DataObjectModification rootNode = modification.getRootNode(); - if (safeConnectorsEmpty(rootNode.getDataBefore()) && !safeConnectorsEmpty(rootNode.getDataAfter())) { - LOG.trace("Add {} (logical)", ModificationUtil.nodeIdValue(modification)); - return true; - } - - return false; + return safeConnectorsEmpty(rootNode.getDataBefore()) && !safeConnectorsEmpty(rootNode.getDataAfter()); } - private Optional> reconciliation(DataTreeModification modification) throws InterruptedException { + /** + * If node is present in config DS diff between wanted configuration (in config DS) and actual device + * configuration (coming from operational) should be calculated and sent to device. + * @param modification from DS + * @return optional syncup future + * @throws InterruptedException from syncup + */ + private Optional> reconciliation(final DataTreeModification modification) + throws InterruptedException { final NodeId nodeId = ModificationUtil.nodeId(modification); final Optional nodeConfiguration = configDao.loadByNodeId(nodeId); if (nodeConfiguration.isPresent()) { - LOG.debug("Reconciliation: {}", nodeId.getValue()); + LOG.debug("Reconciliation {}: {}", dsType(), nodeId.getValue()); final InstanceIdentifier nodePath = InstanceIdentifier.create(Nodes.class) .child(Node.class, new NodeKey(ModificationUtil.nodeId(modification))) .augmentation(FlowCapableNode.class); - final FlowCapableNode fcNode = ModificationUtil.flowCapableNodeAfter(modification); - return Optional.of(reactor.syncup(nodePath, nodeConfiguration.get(), fcNode, dsType())); + final FlowCapableNode fcOperationalNode = ModificationUtil.flowCapableNodeAfter(modification); + final SyncupEntry syncupEntry = new SyncupEntry(nodeConfiguration.get(), LogicalDatastoreType.CONFIGURATION, + fcOperationalNode, dsType()); + return Optional.of(reactor.syncup(nodePath, syncupEntry)); } else { LOG.debug("Config not present for reconciliation: {}", nodeId.getValue()); + reconciliationRegistry.unregisterIfRegistered(nodeId); return skipModification(modification); } } - private boolean isRegisteredAndConsistentForReconcile(DataTreeModification modification) { + private boolean isConsistentForReconcile(final DataTreeModification modification) { final NodeId nodeId = PathUtil.digNodeId(modification.getRootPath().getRootIdentifier()); - - if (!reconciliationRegistry.isRegistered(nodeId)) { - return false; - } - final FlowCapableStatisticsGatheringStatus gatheringStatus = modification.getRootNode().getDataAfter() .getAugmentation(FlowCapableStatisticsGatheringStatus.class); @@ -221,19 +203,17 @@ public class SimplifiedOperationalListener extends AbstractFrmSyncListener return true; } } catch (ParseException e) { - LOG.error("Timestamp parsing error {}", e); + LOG.warn("Timestamp parsing error {}", e); } LOG.debug("Fresh operational not present: {}", nodeId.getValue()); return false; } - private static boolean safeConnectorsEmpty(Node node) { + private static boolean safeConnectorsEmpty(final Node node) { if (node == null) { return true; } - final List nodeConnectors = node.getNodeConnector(); - return nodeConnectors == null || nodeConnectors.isEmpty(); } @@ -241,5 +221,4 @@ public class SimplifiedOperationalListener extends AbstractFrmSyncListener public LogicalDatastoreType dsType() { return LogicalDatastoreType.OPERATIONAL; } - }