From: Abdelmuhaimen Seaudi Date: Sat, 30 May 2020 22:06:18 +0000 (-0700) Subject: Add NetConfTopologyListenerTest X-Git-Tag: 2.0.0~72 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=transportpce.git;a=commitdiff_plain;h=18db9c338f0e29c36dda1c59018bb082745d5f17 Add NetConfTopologyListenerTest JIRA: TRNSPRTPCE-270 Signed-off-by: Abdelmuhaimen Seaudi Change-Id: I142a58243b7f58f4f7d19fe664f841a11a9189ad --- diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListenerTest.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListenerTest.java new file mode 100644 index 000000000..33bdf3930 --- /dev/null +++ b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListenerTest.java @@ -0,0 +1,176 @@ +/* + * Copyright © 2020 Orange. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.transportpce.networkmodel; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_1_2_1; +import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_2_2_1; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import org.junit.Before; +import org.junit.Test; +import org.opendaylight.mdsal.binding.api.DataBroker; +import org.opendaylight.mdsal.binding.api.DataObjectModification; +import org.opendaylight.mdsal.binding.api.DataTreeModification; +import org.opendaylight.mdsal.binding.api.MountPoint; +import org.opendaylight.mdsal.binding.api.MountPointService; +import org.opendaylight.transportpce.common.DataStoreContextImpl; +import org.opendaylight.transportpce.common.device.DeviceTransactionManager; +import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl; +import org.opendaylight.transportpce.common.mapping.MappingUtils; +import org.opendaylight.transportpce.common.mapping.MappingUtilsImpl; +import org.opendaylight.transportpce.common.mapping.PortMapping; +import org.opendaylight.transportpce.common.mapping.PortMappingImpl; +import org.opendaylight.transportpce.common.mapping.PortMappingVersion121; +import org.opendaylight.transportpce.common.mapping.PortMappingVersion221; +import org.opendaylight.transportpce.common.network.NetworkTransactionImpl; +import org.opendaylight.transportpce.common.network.NetworkTransactionService; +import org.opendaylight.transportpce.common.network.RequestProcessor; +import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl; +import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121; +import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221; +import org.opendaylight.transportpce.networkmodel.service.NetworkModelService; +import org.opendaylight.transportpce.networkmodel.stub.MountPointServiceStub; +import org.opendaylight.transportpce.networkmodel.stub.MountPointStub; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilities; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilitiesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapabilityBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.LoginPasswordBuilder; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; +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.NodeBuilder; +import org.opendaylight.yangtools.yang.common.Uint16; +import org.opendaylight.yangtools.yang.common.Uint32; + + +public class NetConfTopologyListenerTest { + + @Before + public void setUp() { + + } + + @Test + public void testOnDataTreeChanged() { + + final DataObjectModification newNode = mock(DataObjectModification.class); + when(newNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE); + final Collection> changes = new HashSet<>(); + final DataTreeModification ch = mock(DataTreeModification.class); + changes.add(ch); + when(ch.getRootNode()).thenReturn(newNode); + + DataStoreContextImpl dataStoreContext = new DataStoreContextImpl(); + DataBroker dataBroker = dataStoreContext.getDataBroker(); + RequestProcessor requestProcessor = new RequestProcessor(dataBroker); + NetworkTransactionService networkTransactionService = new NetworkTransactionImpl(requestProcessor); + MountPoint mountPoint = new MountPointStub(dataBroker); + MountPointService mountPointService = new MountPointServiceStub(mountPoint); + DeviceTransactionManager deviceTransactionManager = + new DeviceTransactionManagerImpl(mountPointService, 3000); + R2RLinkDiscovery linkDiskovery = new R2RLinkDiscovery( + dataBroker, deviceTransactionManager, networkTransactionService); + OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121 = + new OpenRoadmInterfacesImpl121(deviceTransactionManager); + OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl221 = + new OpenRoadmInterfacesImpl221(deviceTransactionManager); + MappingUtils mappingUtils = new MappingUtilsImpl(dataBroker); + OpenRoadmInterfacesImpl openRoadmInterfaces = + new OpenRoadmInterfacesImpl(deviceTransactionManager, mappingUtils, + openRoadmInterfacesImpl121, openRoadmInterfacesImpl221); + PortMappingVersion121 p1 = new PortMappingVersion121(dataBroker, deviceTransactionManager, openRoadmInterfaces); + PortMappingVersion221 p2 = new PortMappingVersion221(dataBroker, deviceTransactionManager, openRoadmInterfaces); + PortMapping portMapping = new PortMappingImpl(dataBroker, p2, p1); + NetworkModelService networkModelService = mock(NetworkModelService.class); + + //Start Netconf Topology listener and start adding nodes to the Netconf Topology to verify behaviour + NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker, + deviceTransactionManager); + + //A new node appears in Netconf Topology, status is Connecting + final Node netconfNode = getNetconfNode("test1", + NetconfNodeConnectionStatus.ConnectionStatus.Connecting, OPENROADM_DEVICE_VERSION_2_2_1); + when(newNode.getDataAfter()).thenReturn(netconfNode); + listener.onDataTreeChanged(changes); + verify(ch).getRootNode(); + verify(newNode, times(3)).getDataAfter(); + verify(newNode, times(2)).getModificationType(); + + //A new node appears in Netconf Topology, status is Connected, version is 121 + final Node netconfNode2 = getNetconfNode("test2", NetconfNodeConnectionStatus.ConnectionStatus.Connected, + OPENROADM_DEVICE_VERSION_1_2_1); + when(newNode.getDataAfter()).thenReturn(netconfNode2); + listener.onDataTreeChanged(changes); + verify(ch, times(2)).getRootNode(); + verify(newNode, times(6)).getDataAfter(); + verify(newNode, times(4)).getModificationType(); + + //A new node appears in Netconf Topology, status is Connected, version is 221 + final Node netconfNode3 = getNetconfNode("test3", NetconfNodeConnectionStatus.ConnectionStatus.Connected, + OPENROADM_DEVICE_VERSION_2_2_1); + when(newNode.getDataAfter()).thenReturn(netconfNode3); + listener.onDataTreeChanged(changes); + verify(ch, times(3)).getRootNode(); + verify(newNode, times(9)).getDataAfter(); + verify(newNode, times(6)).getModificationType(); + + //A new node is deleted from Netconf Topology, Data Before was empty + when(newNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE); + when(newNode.getDataBefore()).thenReturn(netconfNode3); + listener.onDataTreeChanged(changes); + verify(ch, times(4)).getRootNode(); + verify(newNode, times(10)).getDataAfter(); + verify(newNode, times(7)).getModificationType(); + + } + + public Node getNetconfNode(final String nodeId, final NetconfNodeConnectionStatus.ConnectionStatus cs, + final String openRoadmVersion) { + final List avCapList = new ArrayList<>(); + avCapList.add(new AvailableCapabilityBuilder() + .setCapabilityOrigin(AvailableCapability.CapabilityOrigin.UserDefined) + .setCapability(openRoadmVersion) + .build()); + final AvailableCapabilities avCaps = + new AvailableCapabilitiesBuilder().setAvailableCapability(avCapList).build(); + final NetconfNode netconfNode = new NetconfNodeBuilder() + .setConnectionStatus(cs) + .setAvailableCapabilities(avCaps) + .setHost(new Host(new IpAddress(new Ipv4Address("127.0.0.1")))) + .setPort(new PortNumber(Uint16.valueOf(9999))) + .setReconnectOnChangedSchema(true) + .setDefaultRequestTimeoutMillis(Uint32.valueOf(1000)) + .setBetweenAttemptsTimeoutMillis(Uint16.valueOf(100)) + .setKeepaliveDelay(Uint32.valueOf(1000)) + .setTcpOnly(true) + .setCredentials(new LoginPasswordBuilder() + .setUsername("testuser") + .setPassword("testpassword") + .build()) + .build(); + final NodeBuilder nn = new NodeBuilder().setNodeId(new NodeId(nodeId)) + .addAugmentation(NetconfNode.class, netconfNode); + return nn.build(); + + } +} diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointServiceStub.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointServiceStub.java new file mode 100644 index 000000000..0f754eb90 --- /dev/null +++ b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointServiceStub.java @@ -0,0 +1,38 @@ +/* + * Copyright © 2018 Orange Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.transportpce.networkmodel.stub; + +import java.util.Optional; +import org.opendaylight.mdsal.binding.api.MountPoint; +import org.opendaylight.mdsal.binding.api.MountPointService; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class MountPointServiceStub implements MountPointService { + + MountPoint returnedMountPoint; + + public MountPointServiceStub(MountPoint usedMountPoint) { + this.returnedMountPoint = usedMountPoint; + } + + @Override + public Optional getMountPoint(InstanceIdentifier mountPoint) { + if (returnedMountPoint == null) { + return Optional.empty(); + } + return Optional.of(returnedMountPoint); + } + + @Override + public ListenerRegistration registerListener(InstanceIdentifier path, + T listener) { + return null; + } +} diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointStub.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointStub.java new file mode 100644 index 000000000..aeb263a7e --- /dev/null +++ b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointStub.java @@ -0,0 +1,68 @@ +/* + * Copyright © 2018 Orange Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.transportpce.networkmodel.stub; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.mdsal.binding.api.BindingService; +import org.opendaylight.mdsal.binding.api.DataBroker; +import org.opendaylight.mdsal.binding.api.MountPoint; +import org.opendaylight.mdsal.binding.api.NotificationService; +import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.NotificationListener; + + +public class MountPointStub implements MountPoint { + + private DataBroker dataBroker; + + private RpcConsumerRegistry rpcConsumerRegistry; + + + private NotificationService notificationService = new NotificationService() { + @Override + public @NonNull ListenerRegistration + registerNotificationListener(@NonNull T listener) { + return null; + } + }; + + public MountPointStub(DataBroker dataBroker) { + this.dataBroker = dataBroker; + } + + public void setRpcConsumerRegistry( + RpcConsumerRegistry rpcConsumerRegistry) { + this.rpcConsumerRegistry = rpcConsumerRegistry; + } + + @Override + @SuppressWarnings("unchecked") + public Optional getService(Class service) { + if (service.isInstance(dataBroker)) { + return Optional.ofNullable((T) dataBroker); + } + if (service.isInstance(rpcConsumerRegistry)) { + return Optional.ofNullable((T) rpcConsumerRegistry); + } + if (service.isInstance(notificationService)) { + return Optional.ofNullable((T) notificationService); + } + return Optional.empty(); + } + + @Nonnull + @Override + public InstanceIdentifier getIdentifier() { + throw new UnsupportedOperationException(); + } +}