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