/* * Copyright (c) 2016 Cisco 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.groupbasedpolicy.ip.sgt.distribution.service.impl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.CheckedFuture; import java.util.Collection; import java.util.Collections; import java.util.List; import org.junit.Before; import org.junit.Test; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; import org.opendaylight.groupbasedpolicy.test.CustomDataBrokerTest; 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.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.SxpConnectionAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.SxpConnectionAugmentationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.sxp.connection.fields.SxpConnection; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.sxp.connection.fields.SxpConnectionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentity; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentityBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.SxpDomains; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.SxpDomainsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomain; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomainBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomainKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connections.fields.Connections; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connections.fields.connections.Connection; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.protocol.rev141002.ConnectionMode; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; 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.TopologyId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; 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.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public class SxpCapableNodeListenerTest extends CustomDataBrokerTest { private final String SXP_NODE_ID = "sxp_node"; private final String NODE_ID = "node1"; private final IpAddress IP_ADDR = new IpAddress(new Ipv4Address("10.0.0.1")); private final String PASSWD = "cisco123"; private final String TOPOLOGY_ID = "topology"; private final String DOMAIN_ID = TOPOLOGY_ID + "/" + NODE_ID; private final PortNumber SXP_PORT = new PortNumber(64999); private static final String SXP_DOMAIN_NAME = "JUNIT_SXP_DOMAIN_NAME"; private DataBroker dataBroker; private SxpCapableNodeListener nodeListener; @Override public Collection<Class<?>> getClassesFromModules() { return ImmutableList.of(Topology.class, SxpDomain.class, SxpConnectionAugmentation.class); } @Before public void init() throws Exception { dataBroker = getDataBroker(); nodeListener = new SxpCapableNodeListener(dataBroker, SXP_NODE_ID); } @Test public void testInit() throws Exception { dataBroker = mock(DataBroker.class); nodeListener = new SxpCapableNodeListener(dataBroker, SXP_NODE_ID); DataTreeIdentifier<SxpConnection> iid = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(NetworkTopology.class) .child(Topology.class) .child(Node.class) .augmentation(SxpConnectionAugmentation.class) .child(SxpConnection.class) .build()); verify(dataBroker).registerDataTreeChangeListener(iid, nodeListener); } @Test public void testClose() { dataBroker = mock(DataBroker.class); ListenerRegistration<SxpCapableNodeListener> registration = mock(ListenerRegistration.class); when(dataBroker.registerDataTreeChangeListener(any(), isA(SxpCapableNodeListener.class))) .thenReturn(registration); nodeListener = new SxpCapableNodeListener(dataBroker, SXP_NODE_ID); nodeListener.close(); verify(registration).close(); } @Test public void testOnDataTreeChange_createAndDeleteNode() throws Exception { Node sxpNode = new NodeBuilder().setNodeId(new NodeId(SXP_NODE_ID)) .addAugmentation(SxpNodeIdentity.class, new SxpNodeIdentityBuilder().setSxpDomains(new SxpDomainsBuilder() .setSxpDomain(Collections.singletonList( new SxpDomainBuilder() .setDomainName(SXP_DOMAIN_NAME) .build())) .build()).build()) .build(); InstanceIdentifier<Node> sxpNodeIid = InstanceIdentifier.builder(NetworkTopology.class) .child(Topology.class, new TopologyKey(new TopologyId(IpSgtDistributionServiceImpl.SXP_TOPOLOGY_ID))) .child(Node.class, new NodeKey(new NodeId(SXP_NODE_ID))) .build(); WriteTransaction wtx = dataBroker.newWriteOnlyTransaction(); wtx.put(LogicalDatastoreType.CONFIGURATION, sxpNodeIid, sxpNode, true); Node node = new NodeBuilder().setNodeId(new NodeId(NODE_ID)) .addAugmentation(SxpConnectionAugmentation.class, new SxpConnectionAugmentationBuilder() .setSxpConnection(new SxpConnectionBuilder().setIpAddress(IP_ADDR).setPassword(PASSWD).build()).build()) .build(); InstanceIdentifier<Node> nodeIid = InstanceIdentifier.builder(NetworkTopology.class) .child(Topology.class, new TopologyKey(new TopologyId(TOPOLOGY_ID))) .child(Node.class, new NodeKey(new NodeId(NODE_ID))) .build(); wtx.put(LogicalDatastoreType.CONFIGURATION, nodeIid, node, true); wtx.submit().get(); assertEquals(DOMAIN_ID, nodeListener.getDomainIdForPeer(nodeIid)); InstanceIdentifier<SxpDomain> domainIid = InstanceIdentifier.builder(NetworkTopology.class) .child(Topology.class, new TopologyKey(new TopologyId(IpSgtDistributionServiceImpl.SXP_TOPOLOGY_ID))) .child(Node.class, new NodeKey(new NodeId(SXP_NODE_ID))) .augmentation(SxpNodeIdentity.class) .child(SxpDomains.class) .child(SxpDomain.class, new SxpDomainKey(DOMAIN_ID)) .build(); ReadOnlyTransaction rtx = dataBroker.newReadOnlyTransaction(); CheckedFuture<Optional<SxpDomain>, ReadFailedException> read = rtx.read(LogicalDatastoreType.CONFIGURATION, domainIid); Optional<SxpDomain> optionalDomain = read.get(); assertTrue(optionalDomain.isPresent()); SxpDomain sxpDomain = optionalDomain.get(); Connections connections = sxpDomain.getConnections(); assertNotNull(connections); List<Connection> connectionList = connections.getConnection(); assertNotNull(connectionList); assertEquals(1, connectionList.size()); Connection connection = connectionList.get(0); assertEquals(IP_ADDR, connection.getPeerAddress()); assertEquals(PASSWD, connection.getPassword()); assertEquals(SXP_PORT, connection.getTcpPort()); assertEquals(ConnectionMode.Speaker, connection.getMode()); wtx = dataBroker.newWriteOnlyTransaction(); wtx.delete(LogicalDatastoreType.CONFIGURATION, nodeIid); wtx.submit().get(); assertNull(nodeListener.getDomainIdForPeer(nodeIid)); rtx = dataBroker.newReadOnlyTransaction(); read = rtx.read(LogicalDatastoreType.CONFIGURATION, domainIid); assertFalse(read.get().isPresent()); } }