2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.groupbasedpolicy.ip.sgt.distribution.service.impl;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertNotNull;
14 import static org.junit.Assert.assertNull;
15 import static org.junit.Assert.assertTrue;
16 import static org.mockito.Matchers.any;
17 import static org.mockito.Matchers.isA;
18 import static org.mockito.Mockito.mock;
19 import static org.mockito.Mockito.verify;
20 import static org.mockito.Mockito.when;
22 import java.util.Collection;
23 import java.util.List;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
28 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
29 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
30 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
31 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
32 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
33 import org.opendaylight.groupbasedpolicy.test.CustomDataBrokerTest;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.SxpConnectionAugmentation;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.SxpConnectionAugmentationBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.sxp.connection.fields.SxpConnection;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.sxp.connection.fields.SxpConnectionBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentity;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentityBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.SxpDomains;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.SxpDomainsBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomain;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomainKey;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connections.fields.Connections;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connections.fields.connections.Connection;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.protocol.rev141002.ConnectionMode;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
52 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
53 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
54 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
56 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
57 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
58 import org.opendaylight.yangtools.concepts.ListenerRegistration;
59 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
61 import com.google.common.base.Optional;
62 import com.google.common.collect.ImmutableList;
63 import com.google.common.util.concurrent.CheckedFuture;
65 public class SxpCapableNodeListenerTest extends CustomDataBrokerTest {
67 private final String SXP_NODE_ID = "sxp_node";
68 private final String NODE_ID = "node1";
69 private final IpAddress IP_ADDR = new IpAddress(new Ipv4Address("10.0.0.1"));
70 private final String PASSWD = "cisco123";
71 private final String TOPOLOGY_ID = "topology";
72 private final String DOMAIN_ID = TOPOLOGY_ID + "/" + NODE_ID;
73 private final PortNumber SXP_PORT = new PortNumber(64999);
74 private DataBroker dataBroker;
75 private SxpCapableNodeListener nodeListener;
78 public Collection<Class<?>> getClassesFromModules() {
79 return ImmutableList.of(Topology.class, SxpDomain.class, SxpConnectionAugmentation.class);
83 public void init() throws Exception {
84 dataBroker = getDataBroker();
85 nodeListener = new SxpCapableNodeListener(dataBroker, SXP_NODE_ID);
89 public void testInit() throws Exception {
90 dataBroker = mock(DataBroker.class);
91 nodeListener = new SxpCapableNodeListener(dataBroker, SXP_NODE_ID);
92 DataTreeIdentifier<SxpConnection> iid = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,
93 InstanceIdentifier.builder(NetworkTopology.class)
94 .child(Topology.class)
96 .augmentation(SxpConnectionAugmentation.class)
97 .child(SxpConnection.class)
99 verify(dataBroker).registerDataTreeChangeListener(iid, nodeListener);
103 public void testClose() {
104 dataBroker = mock(DataBroker.class);
105 ListenerRegistration<SxpCapableNodeListener> registration = mock(ListenerRegistration.class);
106 when(dataBroker.registerDataTreeChangeListener(any(), isA(SxpCapableNodeListener.class)))
107 .thenReturn(registration);
108 nodeListener = new SxpCapableNodeListener(dataBroker, SXP_NODE_ID);
109 nodeListener.close();
110 verify(registration).close();
114 public void testOnDataTreeChange_createAndDeleteNode() throws Exception {
116 new NodeBuilder().setNodeId(new NodeId(SXP_NODE_ID))
117 .addAugmentation(SxpNodeIdentity.class,
118 new SxpNodeIdentityBuilder().setSxpDomains(new SxpDomainsBuilder().build()).build())
120 InstanceIdentifier<Node> sxpNodeIid =
121 InstanceIdentifier.builder(NetworkTopology.class)
122 .child(Topology.class,
123 new TopologyKey(new TopologyId(IpSgtDistributionServiceImpl.SXP_TOPOLOGY_ID)))
124 .child(Node.class, new NodeKey(new NodeId(SXP_NODE_ID)))
126 WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
127 wtx.put(LogicalDatastoreType.CONFIGURATION, sxpNodeIid, sxpNode, true);
128 Node node = new NodeBuilder().setNodeId(new NodeId(NODE_ID))
129 .addAugmentation(SxpConnectionAugmentation.class, new SxpConnectionAugmentationBuilder()
130 .setSxpConnection(new SxpConnectionBuilder().setIpAddress(IP_ADDR).setPassword(PASSWD).build()).build())
132 InstanceIdentifier<Node> nodeIid = InstanceIdentifier.builder(NetworkTopology.class)
133 .child(Topology.class, new TopologyKey(new TopologyId(TOPOLOGY_ID)))
134 .child(Node.class, new NodeKey(new NodeId(NODE_ID)))
136 wtx.put(LogicalDatastoreType.CONFIGURATION, nodeIid, node, true);
138 assertEquals(DOMAIN_ID, nodeListener.getDomainIdForPeer(nodeIid));
139 InstanceIdentifier<SxpDomain> domainIid =
140 InstanceIdentifier.builder(NetworkTopology.class)
141 .child(Topology.class,
142 new TopologyKey(new TopologyId(IpSgtDistributionServiceImpl.SXP_TOPOLOGY_ID)))
143 .child(Node.class, new NodeKey(new NodeId(SXP_NODE_ID)))
144 .augmentation(SxpNodeIdentity.class)
145 .child(SxpDomains.class)
146 .child(SxpDomain.class, new SxpDomainKey(DOMAIN_ID))
148 ReadOnlyTransaction rtx = dataBroker.newReadOnlyTransaction();
149 CheckedFuture<Optional<SxpDomain>, ReadFailedException> read =
150 rtx.read(LogicalDatastoreType.CONFIGURATION, domainIid);
151 Optional<SxpDomain> optionalDomain = read.get();
152 assertTrue(optionalDomain.isPresent());
153 SxpDomain sxpDomain = optionalDomain.get();
154 Connections connections = sxpDomain.getConnections();
155 assertNotNull(connections);
156 List<Connection> connectionList = connections.getConnection();
157 assertNotNull(connectionList);
158 assertEquals(1, connectionList.size());
159 Connection connection = connectionList.get(0);
160 assertEquals(IP_ADDR, connection.getPeerAddress());
161 assertEquals(PASSWD, connection.getPassword());
162 assertEquals(SXP_PORT, connection.getTcpPort());
163 assertEquals(ConnectionMode.Speaker, connection.getMode());
165 wtx = dataBroker.newWriteOnlyTransaction();
166 wtx.delete(LogicalDatastoreType.CONFIGURATION, nodeIid);
168 assertNull(nodeListener.getDomainIdForPeer(nodeIid));
169 rtx = dataBroker.newReadOnlyTransaction();
170 read = rtx.read(LogicalDatastoreType.CONFIGURATION, domainIid);
171 assertFalse(read.get().isPresent());