package org.opendaylight.netconf.messagebus.eventsources.netconf;
import com.google.common.base.Preconditions;
+import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-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.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.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService;
import org.opendaylight.controller.md.sal.dom.api.DOMNotificationPublishService;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
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;
* NetconfEventSourceManager implements DataChangeListener. On topology changes, it manages creation,
* updating and removing registrations of event sources.
*/
-public final class NetconfEventSourceManager implements DataChangeListener, AutoCloseable {
+public final class NetconfEventSourceManager implements DataTreeChangeListener<Node>, AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(NetconfEventSourceManager.class);
private static final TopologyKey NETCONF_TOPOLOGY_KEY = new TopologyKey(
new ConcurrentHashMap<>();
private final DOMNotificationPublishService publishService;
private final DOMMountPointService domMounts;
- private ListenerRegistration<DataChangeListener> listenerRegistration;
+ private ListenerRegistration<NetconfEventSourceManager> listenerRegistration;
private final EventSourceRegistry eventSourceRegistry;
private final DataBroker dataBroker;
*/
public void initialize() {
Preconditions.checkNotNull(dataBroker);
- listenerRegistration = dataBroker
- .registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, NETCONF_DEVICE_PATH, this,
- DataChangeScope.SUBTREE);
+ listenerRegistration = dataBroker.registerDataTreeChangeListener(new DataTreeIdentifier<>(
+ LogicalDatastoreType.OPERATIONAL, NETCONF_DEVICE_PATH), this);
LOG.info("NetconfEventSourceManager initialized.");
}
@Override
- public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> event) {
-
- LOG.debug("[DataChangeEvent<InstanceIdentifier<?>, DataObject>: {}]", event);
- for (final Map.Entry<InstanceIdentifier<?>, DataObject> changeEntry : event.getCreatedData().entrySet()) {
- if (changeEntry.getValue() instanceof Node) {
- nodeCreated(changeEntry.getKey(), (Node) changeEntry.getValue());
+ public void onDataTreeChanged(Collection<DataTreeModification<Node>> changes) {
+ for (DataTreeModification<Node> change: changes) {
+ LOG.debug("DataTreeModification: {}", change);
+ final DataObjectModification<Node> rootNode = change.getRootNode();
+ final InstanceIdentifier<Node> identifier = change.getRootPath().getRootIdentifier();
+ switch (rootNode.getModificationType()) {
+ case WRITE:
+ case SUBTREE_MODIFIED:
+ nodeCreated(identifier, rootNode.getDataAfter());
+ break;
+ case DELETE:
+ nodeRemoved(identifier);
+ break;
+ default:
+ break;
}
}
-
- for (final Map.Entry<InstanceIdentifier<?>, DataObject> changeEntry : event.getUpdatedData().entrySet()) {
- if (changeEntry.getValue() instanceof Node) {
- nodeUpdated(changeEntry.getKey(), (Node) changeEntry.getValue());
- }
- }
-
- for (InstanceIdentifier<?> removePath : event.getRemovedPaths()) {
- DataObject removeObject = event.getOriginalData().get(removePath);
- if (removeObject instanceof Node) {
- nodeRemoved(removePath);
- }
- }
-
}
private void nodeCreated(final InstanceIdentifier<?> key, final Node node) {
}
registrationMap.clear();
}
-
-}
\ No newline at end of file
+}
package org.opendaylight.netconf.messagebus.eventsources.netconf;
import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.notNull;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import com.google.common.base.Optional;
import com.google.common.util.concurrent.CheckedFuture;
import com.google.common.util.concurrent.Futures;
+import java.util.Collections;
import java.util.HashMap;
-import java.util.Map;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+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.MountPointService;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
DOMMountPointService domMountPointServiceMock;
MountPointService mountPointServiceMock;
EventSourceRegistry eventSourceTopologyMock;
- AsyncDataChangeEvent asyncDataChangeEventMock;
+ DataTreeModification<Node> dataTreeModificationMock;
RpcProviderRegistry rpcProviderRegistryMock;
EventSourceRegistry eventSourceRegistry;
public static void initTestClass() throws IllegalAccessException, InstantiationException {
}
+ @SuppressWarnings("unchecked")
@Before
public void setUp() throws Exception {
final DataBroker dataBrokerMock = mock(DataBroker.class);
eventSourceRegistry = mock(EventSourceRegistry.class);
listenerRegistrationMock = mock(ListenerRegistration.class);
- doReturn(listenerRegistrationMock).when(dataBrokerMock).registerDataChangeListener(eq(LogicalDatastoreType
- .OPERATIONAL), any(InstanceIdentifier.class), any(NetconfEventSourceManager.class), eq(
- AsyncDataBroker.DataChangeScope.SUBTREE));
+ doReturn(listenerRegistrationMock).when(dataBrokerMock).registerDataTreeChangeListener(
+ any(DataTreeIdentifier.class), any(NetconfEventSourceManager.class));
DOMMountPoint domMountPointMock = mock(DOMMountPoint.class);
Optional<DOMMountPoint> optionalDomMountServiceMock = Optional.of(domMountPointMock);
@Test
public void onDataChangedCreateEventSourceTestByCreateEntry() throws Exception {
onDataChangedTestHelper(true, false, true, NetconfTestUtils.NOTIFICATION_CAPABILITY_PREFIX);
- netconfEventSourceManager.onDataChanged(asyncDataChangeEventMock);
+ netconfEventSourceManager.onDataTreeChanged(Collections.singletonList(dataTreeModificationMock));
verify(eventSourceRegistry, times(1)).registerEventSource(any(EventSource.class));
}
@Test
public void onDataChangedCreateEventSourceTestByUpdateEntry() throws Exception {
onDataChangedTestHelper(false, true, true, NetconfTestUtils.NOTIFICATION_CAPABILITY_PREFIX);
- netconfEventSourceManager.onDataChanged(asyncDataChangeEventMock);
+ netconfEventSourceManager.onDataTreeChanged(Collections.singletonList(dataTreeModificationMock));
verify(eventSourceRegistry, times(1)).registerEventSource(any(EventSource.class));
}
@Test
public void onDataChangedCreateEventSourceTestNotNeconf() throws Exception {
onDataChangedTestHelper(false, true, false, NetconfTestUtils.NOTIFICATION_CAPABILITY_PREFIX);
- netconfEventSourceManager.onDataChanged(asyncDataChangeEventMock);
+ netconfEventSourceManager.onDataTreeChanged(Collections.singletonList(dataTreeModificationMock));
verify(eventSourceRegistry, times(0)).registerEventSource(any(EventSource.class));
}
@Test
public void onDataChangedCreateEventSourceTestNotNotificationCapability() throws Exception {
onDataChangedTestHelper(true, false, true, "bad-prefix");
- netconfEventSourceManager.onDataChanged(asyncDataChangeEventMock);
+ netconfEventSourceManager.onDataTreeChanged(Collections.singletonList(dataTreeModificationMock));
verify(eventSourceRegistry, times(0)).registerEventSource(any(EventSource.class));
}
+ @SuppressWarnings("unchecked")
private void onDataChangedTestHelper(boolean create, boolean update, boolean isNetconf, String
notificationCapabilityPrefix) throws Exception {
- asyncDataChangeEventMock = mock(AsyncDataChangeEvent.class);
- Map<InstanceIdentifier, DataObject> mapCreate = new HashMap<>();
- Map<InstanceIdentifier, DataObject> mapUpdate = new HashMap<>();
+ dataTreeModificationMock = mock(DataTreeModification.class);
+ DataObjectModification<Node> mockModification = mock(DataObjectModification.class);
+ doReturn(create ? DataObjectModification.ModificationType.WRITE :
+ DataObjectModification.ModificationType.SUBTREE_MODIFIED).when(mockModification).getModificationType();
+ doReturn(mockModification).when(dataTreeModificationMock).getRootNode();
- Node node01;
+ final Node node01;
String nodeId = "Node01";
- doReturn(mapCreate).when(asyncDataChangeEventMock).getCreatedData();
- doReturn(mapUpdate).when(asyncDataChangeEventMock).getUpdatedData();
-
if (isNetconf) {
node01 = NetconfTestUtils
.getNetconfNode(nodeId, "node01.test.local", ConnectionStatus.Connected,
node01 = NetconfTestUtils.getNode(nodeId);
}
- if (create) {
- mapCreate.put(NetconfTestUtils.getInstanceIdentifier(node01), node01);
- }
- if (update) {
- mapUpdate.put(NetconfTestUtils.getInstanceIdentifier(node01), node01);
- }
+ doReturn(node01).when(mockModification).getDataAfter();
+ doReturn(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
+ NetconfTestUtils.getInstanceIdentifier(node01))).when(dataTreeModificationMock).getRootPath();
}
-}
\ No newline at end of file
+}