Use netconf-3.0.5
[ovsdb.git] / southbound / southbound-impl / src / test / java / org / opendaylight / ovsdb / southbound / reconciliation / configuration / BridgeConfigReconciliationTaskTest.java
1 /*
2  * Copyright © 2016, 2017 NEC Corporation 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 package org.opendaylight.ovsdb.southbound.reconciliation.configuration;
9
10 import static org.junit.Assert.assertTrue;
11 import static org.mockito.ArgumentMatchers.any;
12 import static org.mockito.Mockito.doNothing;
13 import static org.mockito.Mockito.mock;
14 import static org.mockito.Mockito.spy;
15 import static org.mockito.Mockito.verify;
16 import static org.mockito.Mockito.when;
17
18 import com.google.common.util.concurrent.FluentFuture;
19 import java.util.Arrays;
20 import java.util.Collections;
21 import java.util.HashMap;
22 import java.util.Map;
23 import java.util.Optional;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.junit.runner.RunWith;
27 import org.mockito.Mock;
28 import org.mockito.Mockito;
29 import org.mockito.junit.MockitoJUnitRunner;
30 import org.opendaylight.mdsal.binding.api.DataBroker;
31 import org.opendaylight.mdsal.binding.api.ReadTransaction;
32 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
33 import org.opendaylight.ovsdb.southbound.InstanceIdentifierCodec;
34 import org.opendaylight.ovsdb.southbound.OvsdbConnectionInstance;
35 import org.opendaylight.ovsdb.southbound.OvsdbConnectionManager;
36 import org.opendaylight.ovsdb.southbound.SouthboundMapper;
37 import org.opendaylight.ovsdb.southbound.SouthboundProvider;
38 import org.opendaylight.ovsdb.southbound.reconciliation.ReconciliationManager;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
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.OvsdbBridgeProtocolOpenflow10;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeRef;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntry;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntryBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntryKey;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ProtocolEntry;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ProtocolEntryBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ProtocolEntryKey;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
52 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
53 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
54 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
55 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
56 import org.opendaylight.yangtools.yang.binding.DataObject;
57 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
58 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
59
60 @RunWith(MockitoJUnitRunner.class)
61 public class BridgeConfigReconciliationTaskTest {
62     private static final String BR_INT = "br-int";
63     private static final String NODE_ID = "ovsdb://uuid/6ff3d0cf-4102-429d-b41c-f8027a0fd7f4";
64     private BridgeConfigReconciliationTask configurationReconciliationTask;
65     @Mock private OvsdbConnectionManager ovsdbConnectionManager;
66     @Mock private OvsdbConnectionInstance ovsdbConnectionInstance;
67     @Mock private DataBroker db;
68     @Mock private ReconciliationManager reconciliationManager;
69     @Mock private Topology topology;
70     @Mock private InstanceIdentifier<Node> iid;
71     @Mock private SouthboundProvider provider;
72
73     @Before
74     public void setUp() throws Exception {
75         NodeKey nodeKey = new NodeKey(new NodeId(new Uri(NODE_ID)));
76
77         iid = SouthboundMapper.createInstanceIdentifier(nodeKey.getNodeId());
78         SouthboundProvider.setBridgesReconciliationInclusionList(Arrays.asList(BR_INT));
79         Node brIntNode = createBridgeNode(NODE_ID + "/bridge/" + BR_INT);
80         Optional<Node> nodeOptional = Optional.of(brIntNode);
81         FluentFuture<Optional<Node>> readNodeFuture =
82                 FluentFutures.immediateFluentFuture(nodeOptional);
83         when(reconciliationManager.getDb()).thenReturn(db);
84         ReadTransaction tx = mock(ReadTransaction.class);
85         Mockito.when(db.newReadOnlyTransaction()).thenReturn(tx);
86         Mockito.when(tx.read(any(LogicalDatastoreType.class),any(InstanceIdentifier.class)))
87                 .thenReturn(readNodeFuture);
88
89         when(topology.getNode()).thenReturn(Map.of(brIntNode.key(), brIntNode));
90
91         configurationReconciliationTask =
92                 new BridgeConfigReconciliationTask(reconciliationManager, ovsdbConnectionManager, iid,
93                         ovsdbConnectionInstance, mock(InstanceIdentifierCodec.class));
94     }
95
96     @Test
97     public void testReconcileConfiguration() throws Exception {
98         BridgeConfigReconciliationTask underTest = spy(configurationReconciliationTask);
99         doNothing().when(underTest).reconcileBridgeConfigurations(any(Map.class));
100         assertTrue(underTest.reconcileConfiguration(ovsdbConnectionManager));
101         Map<InstanceIdentifier<?>, DataObject> changes = new HashMap<>();
102         for (Node bridgeNode : topology.getNode().values()) {
103             changes.putAll(createExpectedConfigurationChanges(bridgeNode));
104         }
105         verify(underTest).reconcileBridgeConfigurations(changes);
106     }
107
108     private Node createBridgeNode(final String bridgeName) {
109         ProtocolEntry protocolEntry = new ProtocolEntryBuilder()
110                 .setProtocol(OvsdbBridgeProtocolOpenflow10.class)
111                 .build();
112         ControllerEntry controllerEntry = new ControllerEntryBuilder().setTarget(new Uri("mock")).build();
113
114         return new NodeBuilder()
115                 .setNodeId(new NodeId(new Uri(bridgeName)))
116                 .addAugmentation(new OvsdbBridgeAugmentationBuilder()
117                     .setManagedBy(new OvsdbNodeRef(iid))
118                     .setProtocolEntry(Collections.singletonMap(protocolEntry.key(), protocolEntry))
119                     .setControllerEntry(Collections.singletonMap(controllerEntry.key(), controllerEntry))
120                     .build())
121                 .build();
122     }
123
124     private static Map<InstanceIdentifier<?>, DataObject> createExpectedConfigurationChanges(final Node bridgeNode) {
125         OvsdbBridgeAugmentation ovsdbBridge = bridgeNode.augmentation(OvsdbBridgeAugmentation.class);
126
127         Map<InstanceIdentifier<?>, DataObject> changes = new HashMap<>();
128         final InstanceIdentifier<Node> bridgeNodeIid =
129                 SouthboundMapper.createInstanceIdentifier(bridgeNode.getNodeId());
130         final InstanceIdentifier<OvsdbBridgeAugmentation> ovsdbBridgeIid =
131                 bridgeNodeIid.builder().augmentation(OvsdbBridgeAugmentation.class).build();
132         changes.put(bridgeNodeIid, bridgeNode);
133         changes.put(ovsdbBridgeIid, ovsdbBridge);
134         for (ProtocolEntry protocolEntry : ovsdbBridge.getProtocolEntry().values()) {
135             KeyedInstanceIdentifier<ProtocolEntry, ProtocolEntryKey> protocolIid =
136                     ovsdbBridgeIid.child(ProtocolEntry.class, protocolEntry.key());
137             changes.put(protocolIid, protocolEntry);
138         }
139         for (ControllerEntry controller : ovsdbBridge.getControllerEntry().values()) {
140             KeyedInstanceIdentifier<ControllerEntry, ControllerEntryKey> controllerIid =
141                     ovsdbBridgeIid.child(ControllerEntry.class, controller.key());
142             changes.put(controllerIid, controller);
143         }
144         return changes;
145     }
146 }