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.neutron.ovsdb;
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;
18 import java.util.Collection;
19 import java.util.HashSet;
21 import com.google.common.collect.ImmutableList;
22 import com.google.common.collect.ImmutableSet;
23 import com.google.common.util.concurrent.CheckedFuture;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
27 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
28 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
29 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
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.TransactionCommitFailedException;
33 import org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.NeutronOvsdbIidFactory;
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.Uri;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.ovsdb.params.rev160812.IntegrationBridgeSetting;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.ovsdb.params.rev160812.IntegrationBridgeSettingBuilder;
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;
66 public class OvsdbNodeListenerTest {
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");
73 private DataBroker dataBroker;
74 private IntegrationBridgeSetting integrationBridgeSetting;
75 private OvsdbNodeListener listener;
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;
86 @SuppressWarnings("unchecked")
89 dataBroker = mock(DataBroker.class);
90 integrationBridgeSetting = new IntegrationBridgeSettingBuilder()
91 .setName("bridgeName")
92 .setOpenflowProtocol("ooofff")
93 .setOpenflowPort(1234)
96 rootNode = mock(DataObjectModification.class);
97 rootIdentifier = NeutronOvsdbIidFactory.nodeIid(topologyId, nodeId);
99 DataTreeIdentifier<Node> rootPath =
100 new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, rootIdentifier);
101 DataTreeModification<Node> change = mock(DataTreeModification.class);
103 when(change.getRootNode()).thenReturn(rootNode);
104 when(change.getRootPath()).thenReturn(rootPath);
106 changes = ImmutableSet.of(change);
108 bridgeNodeIid = NeutronOvsdbIidFactory.nodeIid(
109 rootIdentifier.firstKeyOf(Topology.class).getTopologyId(), nodeId);
111 ManagerEntry managerEntry = new ManagerEntryBuilder()
112 .setTarget(new Uri("something:192.168.50.9:1234"))
114 .setNumberOfConnections(0L)
117 ManagedNodeEntry managedNodeEntry = new ManagedNodeEntryBuilder()
118 .setBridgeRef(new OvsdbBridgeRef(bridgeNodeIid))
121 ConnectionInfoBuilder ciBuilder = new ConnectionInfoBuilder();
122 ciBuilder.setRemoteIp(new IpAddress(new Ipv4Address("192.168.50.10")));
124 OvsdbNodeAugmentation ovsdbNode = new OvsdbNodeAugmentationBuilder()
125 .setConnectionInfo(ciBuilder.build())
126 .setManagerEntry(ImmutableList.of(managerEntry))
127 .setManagedNodeEntry(ImmutableList.of(managedNodeEntry))
130 OvsdbBridgeAugmentation ovsdbBridge = new OvsdbBridgeAugmentationBuilder()
131 .setBridgeName(new OvsdbBridgeName(OVSDB_BRIDGE_NAME))
132 .setDatapathId(new DatapathId("00:01:02:03:04:05:06:07"))
135 nodeBefore = new NodeBuilder().build();
136 nodeAfter = new NodeBuilder()
137 .setNodeId(new NodeId("node-bridgeId"))
138 .addAugmentation(OvsdbNodeAugmentation.class, ovsdbNode)
139 .addAugmentation(OvsdbBridgeAugmentation.class, ovsdbBridge).build();
141 wTx = mock(WriteTransaction.class);
142 when(dataBroker.newWriteOnlyTransaction()).thenReturn(wTx);
144 DataObjectModification<OvsdbNodeAugmentation> modifiedOvsdbNode = mock(DataObjectModification.class);
145 DataObjectModification<OpenvswitchOtherConfigs> ovsOtherConfigModification = mock(DataObjectModification.class);
147 OpenvswitchOtherConfigs newConfig = new OpenvswitchOtherConfigsBuilder()
148 .setOtherConfigKey(OvsdbNodeListener.NEUTRON_PROVIDER_MAPPINGS_KEY)
149 .setOtherConfigValue("otherConfigValue:" + NODE_ID)
151 when(ovsOtherConfigModification.getDataBefore()).thenReturn(null);
152 when(ovsOtherConfigModification.getDataAfter()).thenReturn(newConfig);
154 when(modifiedOvsdbNode.getModifiedChildListItem(eq(OpenvswitchOtherConfigs.class),
155 any(OpenvswitchOtherConfigsKey.class))).thenReturn(ovsOtherConfigModification);
157 NodeKey managerNodeKey = rootIdentifier.firstKeyOf(Node.class);
158 NodeId nodeId = new NodeId(managerNodeKey.getNodeId().getValue() + BRIDGE_SEPARATOR
159 + integrationBridgeSetting.getName());
161 bridge = new NodeBuilder()
164 //doNothing().when(wTx).merge(LogicalDatastoreType.CONFIGURATION, bridgeNodeIid, bridge, true);
165 CheckedFuture<Void, TransactionCommitFailedException> fut = mock(CheckedFuture.class);
166 when(wTx.submit()).thenReturn(fut);
168 OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation =
169 new OvsdbTerminationPointAugmentationBuilder().build();
171 DataObjectModification<TerminationPoint> modifiedChild = mock(DataObjectModification.class);
172 DataObjectModification<OvsdbTerminationPointAugmentation> modifiedOvsdbTerminationPointAugmentation =
173 mock(DataObjectModification.class);
175 OvsdbTerminationPointAugmentation newOvsdbTp = new OvsdbTerminationPointAugmentationBuilder()
179 when(modifiedOvsdbTerminationPointAugmentation.getDataAfter()).thenReturn(newOvsdbTp);
181 when(modifiedChild.getDataType()).thenReturn(TerminationPoint.class);
182 when(modifiedChild.getModifiedAugmentation(OvsdbTerminationPointAugmentation.class)).thenReturn(
183 modifiedOvsdbTerminationPointAugmentation);
185 Collection<DataObjectModification<? extends DataObject>> modifiedChildren = new HashSet<>();
186 modifiedChildren.add(modifiedChild);
187 when(rootNode.getModifiedChildren()).thenReturn(modifiedChildren);
189 when(rootNode.getDataBefore()).thenReturn(nodeBefore);
190 when(rootNode.getDataAfter()).thenReturn(nodeAfter);
191 when(rootNode.getModifiedAugmentation(OvsdbNodeAugmentation.class)).thenReturn(modifiedOvsdbNode);
193 listener = new OvsdbNodeListener(dataBroker, integrationBridgeSetting);
197 public void testOnWrite() {
198 when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
200 listener.onDataTreeChanged(changes);
202 verify(wTx).merge(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class), any(Node.class), eq(true));
206 public void testOnSubtreeModified() {
207 listener.onWrite(rootNode, rootIdentifier);
209 when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);
211 listener.onDataTreeChanged(changes);
215 public void testOnDelete() {
216 when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
217 listener.onDataTreeChanged(changes);