Implementing VBD API in Vpp renderer
[groupbasedpolicy.git] / renderers / vpp / src / test / java / org / opendaylight / groupbasedpolicy / renderer / vpp / manager / VppManagerDataStoreTest.java
1
2 package org.opendaylight.groupbasedpolicy.renderer.vpp.manager;
3
4 import java.util.ArrayList;
5 import java.util.List;
6
7 import org.junit.After;
8 import org.junit.Assert;
9 import org.junit.Before;
10 import org.junit.Test;
11 import org.junit.runner.RunWith;
12 import org.mockito.Matchers;
13 import org.mockito.Mock;
14 import org.mockito.Mockito;
15 import org.mockito.runners.MockitoJUnitRunner;
16 import org.opendaylight.controller.config.yang.config.vpp_provider.impl.VppRenderer;
17 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
18 import org.opendaylight.controller.md.sal.binding.api.MountPoint;
19 import org.opendaylight.controller.md.sal.binding.api.MountPointService;
20 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
21 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
22 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
23 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
24 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
25 import org.opendaylight.groupbasedpolicy.renderer.vpp.VppRendererDataBrokerTest;
26 import org.opendaylight.groupbasedpolicy.renderer.vpp.listener.VppNodeListener;
27 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Host;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.Renderer;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.RendererKey;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilitiesBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.UnavailableCapabilitiesBuilder;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
45 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
46
47 import com.google.common.base.Optional;
48 import com.google.common.eventbus.EventBus;
49 import com.google.common.util.concurrent.CheckedFuture;
50
51 /**
52  * Test for {@link VppNodeManager} and {@link VppNodeListener}.
53  */
54 @RunWith(MockitoJUnitRunner.class)
55 public class VppManagerDataStoreTest extends VppRendererDataBrokerTest {
56
57     private static final String V3PO_CAPABILITY = "(urn:opendaylight:params:xml:ns:yang:v3po?revision=2015-01-05)v3po";
58     private static final String INTERFACES_CAPABILITY =
59             "(urn:ietf:params:xml:ns:yang:ietf-interfaces?revision=2014-05-08)ietf-interfaces";
60     private static final String NODE_NAME = "testVpp";
61     private static final InstanceIdentifier<Node> NODE_IID = VppIidFactory
62         .getNodeIid(new TopologyKey(new TopologyId("topology-netconf")), new NodeKey(new NodeId(NODE_NAME)));
63
64     @Mock
65     BindingAwareBroker.ProviderContext providerContext;
66     @Mock
67     MountPointService mountPointService;
68     @Mock
69     MountPoint mountPoint;
70     @Mock
71     DataBroker dataBroker2;
72
73     private DataBroker dataBroker;
74     private VppNodeListener vppNodeListener;
75     private VppNodeManager vppNodeManager;
76
77     @Before
78     public void setUp() throws Exception {
79         Mockito.when(providerContext.getSALService(Matchers.<Class<MountPointService>>any()))
80             .thenReturn(mountPointService);
81         Mockito.when(mountPointService.getMountPoint(Matchers.<InstanceIdentifier<Node>>any()))
82             .thenReturn(Optional.of(mountPoint));
83         Mockito.when(mountPoint.getService(Matchers.<Class<DataBroker>>any())).thenReturn(Optional.of(dataBroker2));
84         dataBroker = getDataBroker();
85         vppNodeManager = new VppNodeManager(dataBroker, providerContext);
86         vppNodeListener = new VppNodeListener(dataBroker, vppNodeManager, new EventBus());
87     }
88
89     private Node createNode(final String name, NetconfNodeConnectionStatus.ConnectionStatus status) {
90         Host host = new Host(new IpAddress(new Ipv4Address("192.168.255.101")));
91         PortNumber portNumber = new PortNumber(2830);
92
93         List<String> avaibleCapabilitiesList = new ArrayList<>();
94         avaibleCapabilitiesList.add(V3PO_CAPABILITY);
95         avaibleCapabilitiesList.add(INTERFACES_CAPABILITY);
96
97         NetconfNode netconfNode = new NetconfNodeBuilder().setHost(host)
98             .setPort(portNumber)
99             .setUnavailableCapabilities(new UnavailableCapabilitiesBuilder().build())
100             .setAvailableCapabilities(
101                     new AvailableCapabilitiesBuilder().setAvailableCapability(avaibleCapabilitiesList).build())
102             .setConnectionStatus(status)
103             .build();
104
105         return new NodeBuilder().setNodeId(new NodeId(name)).addAugmentation(NetconfNode.class, netconfNode).build();
106     }
107
108     @Test
109     public void connectNode() throws ReadFailedException {
110         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
111         Node testVppNode = createNode(NODE_NAME, NetconfNodeConnectionStatus.ConnectionStatus.Connected);
112
113         writeTransaction.put(LogicalDatastoreType.OPERATIONAL, NODE_IID, testVppNode, true);
114
115         writeTransaction.submit();
116
117         ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction();
118         CheckedFuture<Optional<Renderer>, ReadFailedException> future =
119                 readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL,
120                         VppIidFactory.getRendererIID(new RendererKey(VppRenderer.NAME)));
121         Optional<Renderer> rendererOptional = future.checkedGet();
122
123         Assert.assertTrue(rendererOptional.isPresent());
124         Assert.assertEquals(1, rendererOptional.get().getRendererNodes().getRendererNode().size());
125         Assert.assertEquals(NODE_IID, rendererOptional.get().getRendererNodes().getRendererNode().get(0).getNodePath());
126     }
127
128     @Test
129     public void disconnectNode() throws ReadFailedException, InterruptedException {
130         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
131         Node testVppNode = createNode(NODE_NAME, NetconfNodeConnectionStatus.ConnectionStatus.Connected);
132
133         writeTransaction.put(LogicalDatastoreType.OPERATIONAL, NODE_IID, testVppNode, true);
134
135         writeTransaction.submit();
136
137         ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction();
138         CheckedFuture<Optional<Renderer>, ReadFailedException> future =
139                 readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL,
140                         VppIidFactory.getRendererIID(new RendererKey(VppRenderer.NAME)));
141         Optional<Renderer> rendererOptional = future.checkedGet();
142
143         Assert.assertTrue(rendererOptional.isPresent());
144         Assert.assertEquals(1, rendererOptional.get().getRendererNodes().getRendererNode().size());
145         Assert.assertEquals(NODE_IID, rendererOptional.get().getRendererNodes().getRendererNode().get(0).getNodePath());
146
147         WriteTransaction writeTransaction2 = dataBroker.newWriteOnlyTransaction();
148         Node testVppNode2 = createNode(NODE_NAME, NetconfNodeConnectionStatus.ConnectionStatus.Connecting);
149
150         writeTransaction2.put(LogicalDatastoreType.OPERATIONAL, NODE_IID, testVppNode2, true);
151
152         writeTransaction2.submit();
153
154         ReadOnlyTransaction readOnlyTransaction2 = dataBroker.newReadOnlyTransaction();
155         CheckedFuture<Optional<Renderer>, ReadFailedException> future2 =
156                 readOnlyTransaction2.read(LogicalDatastoreType.OPERATIONAL,
157                         VppIidFactory.getRendererIID(new RendererKey(VppRenderer.NAME)));
158         Optional<Renderer> rendererOptional2 = future2.checkedGet();
159
160         Assert.assertTrue(rendererOptional2.isPresent());
161         Assert.assertEquals(0, rendererOptional2.get().getRendererNodes().getRendererNode().size());
162     }
163
164     @After
165     public void cleanUp() throws Exception {
166         vppNodeListener.close();
167     }
168 }