apply checkstyle check during build for neutron-ovsdb
[groupbasedpolicy.git] / neutron-ovsdb / src / test / java / org / opendaylight / groupbasedpolicy / neutron / ovsdb / OvsdbNodeListenerTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.groupbasedpolicy.neutron.ovsdb;
10
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Matchers.eq;
13 import static org.mockito.Mockito.mock;
14 import static org.mockito.Mockito.verify;
15 import static org.mockito.Mockito.when;
16 import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.OvsdbNodeListener.BRIDGE_SEPARATOR;
17
18 import com.google.common.collect.ImmutableList;
19 import com.google.common.collect.ImmutableSet;
20 import com.google.common.util.concurrent.CheckedFuture;
21
22 import java.util.Collection;
23 import java.util.HashSet;
24
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.DataObjectModification;
29 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
30 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
31 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
32 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
33 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
34 import org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.NeutronOvsdbIidFactory;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.ovsdb.params.rev160812.IntegrationBridgeSetting;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.ovsdb.params.rev160812.IntegrationBridgeSettingBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentationBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeName;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeRef;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentationBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentationBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfoBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntry;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntryBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagerEntry;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagerEntryBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigs;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigsBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigsKey;
57 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
58 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
59 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
60 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
61 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
62 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
63 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
64 import org.opendaylight.yangtools.yang.binding.DataObject;
65 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
66
67 public class OvsdbNodeListenerTest {
68
69     private static final String OVSDB_BRIDGE_NAME = "ovsdbBridgeName";
70     private static final String NODE_ID_STIRNG = "nodeId";
71     private static final NodeId NODE_ID = new NodeId(NODE_ID_STIRNG);
72     private static final TopologyId TOPOLOGY_ID = new TopologyId("topologyId");
73
74     private DataBroker dataBroker;
75     private IntegrationBridgeSetting integrationBridgeSetting;
76     private OvsdbNodeListener listener;
77
78     DataObjectModification<Node> rootNode;
79     InstanceIdentifier<Node> rootIdentifier;
80     private ImmutableSet<DataTreeModification<Node>> changes;
81     private Node nodeBefore;
82     private Node nodeAfter;
83     private WriteTransaction writeTx;
84     private InstanceIdentifier<Node> bridgeNodeIid;
85     private Node bridge;
86
87     @SuppressWarnings("unchecked")
88     @Before
89     public void init() {
90         dataBroker = mock(DataBroker.class);
91         integrationBridgeSetting = new IntegrationBridgeSettingBuilder()
92                 .setName("bridgeName")
93                 .setOpenflowProtocol("ooofff")
94                 .setOpenflowPort(1234)
95                 .build();
96
97         rootNode = mock(DataObjectModification.class);
98         rootIdentifier = NeutronOvsdbIidFactory.nodeIid(TOPOLOGY_ID, NODE_ID);
99
100         DataTreeIdentifier<Node> rootPath =
101             new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, rootIdentifier);
102         DataTreeModification<Node> change = mock(DataTreeModification.class);
103
104         when(change.getRootNode()).thenReturn(rootNode);
105         when(change.getRootPath()).thenReturn(rootPath);
106
107         changes = ImmutableSet.of(change);
108
109         bridgeNodeIid = NeutronOvsdbIidFactory.nodeIid(
110             rootIdentifier.firstKeyOf(Topology.class).getTopologyId(), NODE_ID);
111
112         ManagerEntry managerEntry = new ManagerEntryBuilder()
113             .setTarget(new Uri("something:192.168.50.9:1234"))
114             .setConnected(false)
115             .setNumberOfConnections(0L)
116             .build();
117
118         ManagedNodeEntry managedNodeEntry = new ManagedNodeEntryBuilder()
119             .setBridgeRef(new OvsdbBridgeRef(bridgeNodeIid))
120             .build();
121
122         ConnectionInfoBuilder ciBuilder = new ConnectionInfoBuilder();
123         ciBuilder.setRemoteIp(new IpAddress(new Ipv4Address("192.168.50.10")));
124
125         OvsdbNodeAugmentation ovsdbNode = new OvsdbNodeAugmentationBuilder()
126             .setConnectionInfo(ciBuilder.build())
127             .setManagerEntry(ImmutableList.of(managerEntry))
128             .setManagedNodeEntry(ImmutableList.of(managedNodeEntry))
129             .build();
130
131         OvsdbBridgeAugmentation ovsdbBridge = new OvsdbBridgeAugmentationBuilder()
132             .setBridgeName(new OvsdbBridgeName(OVSDB_BRIDGE_NAME))
133             .setDatapathId(new DatapathId("00:01:02:03:04:05:06:07"))
134             .build();
135
136         nodeBefore = new NodeBuilder().build();
137         nodeAfter = new NodeBuilder()
138             .setNodeId(new NodeId("node-bridgeId"))
139             .addAugmentation(OvsdbNodeAugmentation.class, ovsdbNode)
140             .addAugmentation(OvsdbBridgeAugmentation.class, ovsdbBridge).build();
141
142         writeTx = mock(WriteTransaction.class);
143         when(dataBroker.newWriteOnlyTransaction()).thenReturn(writeTx);
144
145         DataObjectModification<OvsdbNodeAugmentation> modifiedOvsdbNode = mock(DataObjectModification.class);
146         DataObjectModification<OpenvswitchOtherConfigs> ovsOtherConfigModification = mock(DataObjectModification.class);
147
148         OpenvswitchOtherConfigs newConfig = new OpenvswitchOtherConfigsBuilder()
149             .setOtherConfigKey(OvsdbNodeListener.NEUTRON_PROVIDER_MAPPINGS_KEY)
150             .setOtherConfigValue("otherConfigValue:" + NODE_ID_STIRNG)
151             .build();
152         when(ovsOtherConfigModification.getDataBefore()).thenReturn(null);
153         when(ovsOtherConfigModification.getDataAfter()).thenReturn(newConfig);
154
155         when(modifiedOvsdbNode.getModifiedChildListItem(eq(OpenvswitchOtherConfigs.class),
156             any(OpenvswitchOtherConfigsKey.class))).thenReturn(ovsOtherConfigModification);
157
158         NodeKey managerNodeKey = rootIdentifier.firstKeyOf(Node.class);
159         NodeId nodeId = new NodeId(managerNodeKey.getNodeId().getValue() + BRIDGE_SEPARATOR
160             + integrationBridgeSetting.getName());
161
162         bridge = new NodeBuilder()
163             .setNodeId(nodeId)
164             .build();
165         //doNothing().when(writeTx).merge(LogicalDatastoreType.CONFIGURATION, bridgeNodeIid, bridge, true);
166         CheckedFuture<Void, TransactionCommitFailedException> fut = mock(CheckedFuture.class);
167         when(writeTx.submit()).thenReturn(fut);
168
169         OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation =
170             new OvsdbTerminationPointAugmentationBuilder().build();
171
172         DataObjectModification<TerminationPoint> modifiedChild = mock(DataObjectModification.class);
173         DataObjectModification<OvsdbTerminationPointAugmentation> modifiedOvsdbTerminationPointAugmentation =
174             mock(DataObjectModification.class);
175
176         OvsdbTerminationPointAugmentation newOvsdbTp = new OvsdbTerminationPointAugmentationBuilder()
177             .setName(NODE_ID_STIRNG)
178             .setOfport(1234L)
179             .build();
180         when(modifiedOvsdbTerminationPointAugmentation.getDataAfter()).thenReturn(newOvsdbTp);
181
182         when(modifiedChild.getDataType()).thenReturn(TerminationPoint.class);
183         when(modifiedChild.getModifiedAugmentation(OvsdbTerminationPointAugmentation.class)).thenReturn(
184             modifiedOvsdbTerminationPointAugmentation);
185
186         Collection<DataObjectModification<? extends DataObject>> modifiedChildren = new HashSet<>();
187         modifiedChildren.add(modifiedChild);
188         when(rootNode.getModifiedChildren()).thenReturn(modifiedChildren);
189
190         when(rootNode.getDataBefore()).thenReturn(nodeBefore);
191         when(rootNode.getDataAfter()).thenReturn(nodeAfter);
192         when(rootNode.getModifiedAugmentation(OvsdbNodeAugmentation.class)).thenReturn(modifiedOvsdbNode);
193
194         listener = new OvsdbNodeListener(dataBroker, integrationBridgeSetting);
195     }
196
197     @Test
198     public void testOnWrite() {
199         when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
200
201         listener.onDataTreeChanged(changes);
202
203         verify(writeTx).merge(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class), any(Node.class),
204             eq(true));
205     }
206
207     @Test
208     public void testOnSubtreeModified() {
209         listener.onWrite(rootNode, rootIdentifier);
210
211         when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);
212
213         listener.onDataTreeChanged(changes);
214     }
215
216     @Test
217     public void testOnDelete() {
218         when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
219         listener.onDataTreeChanged(changes);
220         //no op
221     }
222
223 }