2 * Copyright (c) 2016 Inocybe Technologies 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.ovsdb.southbound.transactions.md;
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;
18 import com.google.common.base.Optional;
19 import com.google.common.collect.ImmutableMap;
20 import java.util.HashMap;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.junit.runner.RunWith;
25 import org.mockito.Mockito;
26 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
27 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
28 import org.opendaylight.ovsdb.lib.notation.Column;
29 import org.opendaylight.ovsdb.lib.notation.UUID;
30 import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
31 import org.opendaylight.ovsdb.schema.openvswitch.AutoAttach;
32 import org.opendaylight.ovsdb.southbound.OvsdbConnectionInstance;
33 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
34 import org.opendaylight.ovsdb.southbound.SouthboundUtil;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.Autoattach;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.AutoattachKey;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
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 import org.powermock.api.mockito.PowerMockito;
47 import org.powermock.api.support.membermodification.MemberModifier;
48 import org.powermock.core.classloader.annotations.PrepareForTest;
49 import org.powermock.modules.junit4.PowerMockRunner;
51 @PrepareForTest({OvsdbAutoAttachUpdateCommand.class, SouthboundUtil.class})
52 @RunWith(PowerMockRunner.class)
53 public class OvsdbAutoAttachUpdateCommandTest {
55 private static final String AUTOATTACH_SYSTEM_INFO = "AutoAttach Test";
56 private static final Map<Long, Long> AUTOATTACH_MAPPINGS = ImmutableMap.of(100L, 200L);
57 private static final UUID AUTOATTACH_UUID = new UUID("798f35d8-f40a-449a-94d3-c860f5547f9a");
58 private static final String CONNECTED_NODE_ID = "10.0.0.2";
59 // private static final Map<String, String> AUTOATTACH_EXTERNAL_IDS =
60 // ImmutableMap.of("opendaylight-autoattach-id", "autoattach://798f35d8-f40a-449a-94d3-c860f5547f9a");
61 private Map<UUID, AutoAttach> updatedAutoAttachRows = new HashMap<>();
62 private Map<UUID, AutoAttach> oldAutoAttachRows = new HashMap<>();
63 private OvsdbAutoAttachUpdateCommand ovsdbAutoAttachUpdateCommand;
64 private ReadWriteTransaction transaction;
65 private InstanceIdentifier<Autoattach> aaIid;
67 @SuppressWarnings("unchecked")
69 public void setUp() throws Exception {
70 ovsdbAutoAttachUpdateCommand = mock(OvsdbAutoAttachUpdateCommand.class, Mockito.CALLS_REAL_METHODS);
72 AutoAttach autoAttach = mock(AutoAttach.class);
73 updatedAutoAttachRows.put(AUTOATTACH_UUID, autoAttach);
74 oldAutoAttachRows.put(AUTOATTACH_UUID, autoAttach);
76 Column<GenericTableSchema, String> aaColumn = mock(Column.class);
77 when(autoAttach.getSystemNameColumn()).thenReturn(aaColumn);
78 when(autoAttach.getSystemDescriptionColumn()).thenReturn(aaColumn);
79 when(aaColumn.getData()).thenReturn(AUTOATTACH_SYSTEM_INFO);
80 Column<GenericTableSchema, Map<Long, Long>> aaMappingColumn = mock(Column.class);
81 when(autoAttach.getMappingsColumn()).thenReturn(aaMappingColumn);
82 when(aaMappingColumn.getData()).thenReturn(AUTOATTACH_MAPPINGS);
84 // FIXME: To be uncommented when Open vSwitch supports external_ids column
85 // Column<GenericTableSchema, Map<String, String>> aaExternalIdsColumn = mock(Column.class);
86 // when(autoAttach.getExternalIdsColumn()).thenReturn(aaExternalIdsColumn);
87 // when(aaExternalIdsColumn.getData()).thenReturn(AUTOATTACH_EXTERNAL_IDS);
88 when(autoAttach.getUuid()).thenReturn(AUTOATTACH_UUID);
90 OvsdbConnectionInstance ovsdbConnectionInstance = mock(OvsdbConnectionInstance.class);
91 when(ovsdbAutoAttachUpdateCommand.getOvsdbConnectionInstance()).thenReturn(ovsdbConnectionInstance);
92 aaIid = InstanceIdentifier.create(NetworkTopology.class)
93 .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID))
94 .child(Node.class, new NodeKey(new NodeId(CONNECTED_NODE_ID))).augmentation(OvsdbNodeAugmentation.class)
95 .child(Autoattach.class, new AutoattachKey(
96 new Uri(SouthboundConstants.AUTOATTACH_URI_PREFIX + "://" + AUTOATTACH_UUID.toString())));
97 InstanceIdentifier<Node> connectionIid = aaIid.firstIdentifierOf(Node.class);
98 when(ovsdbConnectionInstance.getInstanceIdentifier()).thenReturn(connectionIid);
99 transaction = mock(ReadWriteTransaction.class);
100 doNothing().when(transaction).merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
101 any(Autoattach.class));
102 doNothing().when(transaction).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
104 PowerMockito.mockStatic(SouthboundUtil.class);
105 Optional<Node> ovsdbNode = mock(Optional.class);
106 PowerMockito.when(SouthboundUtil.readNode(transaction, connectionIid)).thenReturn(ovsdbNode);
107 when(ovsdbNode.isPresent()).thenReturn(true);
108 Node node = mock(Node.class);
109 when(ovsdbNode.get()).thenReturn(node);
110 NodeId nodeId = mock(NodeId.class);
111 when(node.getNodeId()).thenReturn(nodeId);
113 MemberModifier.field(OvsdbAutoAttachUpdateCommand.class, "updatedAutoAttachRows")
114 .set(ovsdbAutoAttachUpdateCommand, updatedAutoAttachRows);
115 MemberModifier.field(OvsdbAutoAttachUpdateCommand.class, "oldAutoAttachRows").set(ovsdbAutoAttachUpdateCommand,
120 public void testExecute() {
121 ovsdbAutoAttachUpdateCommand.execute(transaction);
122 verify(transaction).put(eq(LogicalDatastoreType.OPERATIONAL), eq(aaIid), any(Autoattach.class));