2 * Copyright (c) 2017 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
8 package org.opendaylight.unimgr.mef.nrp.ovs.tapi;
10 import static org.junit.Assert.fail;
12 import java.util.ArrayList;
13 import java.util.LinkedList;
14 import java.util.List;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
20 import org.opendaylight.unimgr.mef.nrp.impl.NrpInitializer;
21 import org.opendaylight.unimgr.mef.nrp.ovs.DataStoreTestUtils;
22 import org.opendaylight.unimgr.mef.nrp.ovs.OpenFlowTopologyTestUtils;
23 import org.opendaylight.unimgr.mef.nrp.ovs.OvsdbTopologyTestUtils;
24 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.common.rev171113.Context;
25 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.common.rev171113.Uuid;
26 import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.Context1;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortNumberUni;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodesBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
38 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
40 import com.google.common.base.Optional;
43 * @author marek.ryznar@amartus.com
45 public class TopologyDataHandlerTestUtils {
46 private static String bridgeName = "br1";
47 private static String ofBridgeName = "openflow:1";
48 private static String tp1Name = "br1-eth1";
49 private static String tp2Name = "br1-eth2";
50 private static String tp3Name = "br1-eth3";
51 private static Long tp1OFport = 1L;
52 private static Long tp2OFport = 2L;
53 private static Long tp3OFport = 3L;
55 private static final String prestoNrpTopoId = "mef:presto-nrp-topology-system";
56 private static final String ovsNodeId = "ovs-node";
58 private final DataBroker dataBroker;
60 protected TopologyDataHandlerTestUtils(DataBroker dataBroker) {
61 this.dataBroker = dataBroker;
65 * Creates ovsdb bridge "br1" with 3 ports:
68 * 3. tp3 - not nep, becouse it is connected to other switch
70 public void createTestBridge() {
71 List<TerminationPoint> tps = new LinkedList<>();
73 tps.add(OvsdbTopologyTestUtils.createTerminationPoint(tp1Name,tp1OFport));
74 tps.add(OvsdbTopologyTestUtils.createTerminationPoint(tp2Name,tp2OFport));
75 tps.add(OvsdbTopologyTestUtils.createTerminationPoint(tp3Name,tp3OFport));
77 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node node = OvsdbTopologyTestUtils.createBridge(bridgeName,tps);
78 InstanceIdentifier instanceIdentifier = OvsdbTopologyTestUtils.getNodeInstanceIdentifier(node.getNodeId());
79 DataStoreTestUtils.write(node,instanceIdentifier,dataBroker);
82 protected void deleteTestBridge() {
83 InstanceIdentifier instanceIdentifier = OvsdbTopologyTestUtils.getNodeInstanceIdentifier(new NodeId(bridgeName));
84 DataStoreTestUtils.delete(instanceIdentifier,dataBroker);
87 protected void deletePort(String port) {
88 InstanceIdentifier<TerminationPoint> tpIid = OvsdbTopologyTestUtils.getPortInstanceIdentifier(bridgeName,port);
89 DataStoreTestUtils.delete(tpIid,dataBroker);
92 protected void addPort(String bridgeName, String portName, Long ofNumber) {
93 String bridgeId = bridgeName;
95 NodeConnector nodeConnector = OpenFlowTopologyTestUtils.createNodeConnector(ofBridgeName,ofNumber,portName);
96 InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifier =
97 OpenFlowTopologyTestUtils.getNodeConnectorInstanceIdentifier(ofBridgeName,ofBridgeName+":"+ofNumber.toString());
98 DataStoreTestUtils.write(nodeConnector,nodeConnectorInstanceIdentifier,dataBroker);
100 TerminationPoint terminationPoint = OvsdbTopologyTestUtils.createTerminationPoint(portName,ofNumber);
101 InstanceIdentifier<TerminationPoint> tpIid = OvsdbTopologyTestUtils.getPortInstanceIdentifier(bridgeId,portName);
102 DataStoreTestUtils.write(terminationPoint,tpIid,dataBroker);
106 * Creates OpenFlow Nodes with one Node ("openflow:1" openflow equivalent of ovsdb's "br1"), which consist of 3 NodeConnectors:
107 * 1. id:"openflow:1:1", name: "br1-eth1", portNumber: "1"
108 * 2. id:"openflow:1:2", name: "br1-eth2", portNumber: "2"
109 * 3. id:"openflow:1:3", name: "br1-eth3", portNumber: "3"
111 protected void createOpenFlowNodes() {
112 NodesBuilder nodesBuilder = new NodesBuilder();
113 List<org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node> nodeList = new ArrayList<>();
114 nodeList.add(createOpenFlowNode(ofBridgeName));
115 nodesBuilder.setNode(nodeList);
116 Nodes nodes = nodesBuilder.build();
117 InstanceIdentifier<Nodes> nodesIId = InstanceIdentifier.builder(Nodes.class).build();
119 ReadWriteTransaction transaction = dataBroker.newReadWriteTransaction();
120 transaction.put(LogicalDatastoreType.OPERATIONAL,nodesIId,nodes);
121 transaction.submit();
124 private org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node createOpenFlowNode(String oFName) {
125 org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder nodeBuilder =
126 new org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder();
127 org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId nodeId =
128 new org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId(oFName);
129 nodeBuilder.setId(nodeId);
130 nodeBuilder.setKey(new org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey(nodeId));
131 List<NodeConnector> nodeConnectorList = new ArrayList<>();
132 nodeConnectorList.add(createNodeConnector(oFName,tp1OFport,tp1Name));
133 nodeConnectorList.add(createNodeConnector(oFName,tp2OFport,tp2Name));
134 nodeConnectorList.add(createNodeConnector(oFName,tp3OFport,tp3Name));
135 nodeBuilder.setNodeConnector(nodeConnectorList);
136 return nodeBuilder.build();
139 private NodeConnector createNodeConnector(String ofBridgeName, Long portNumber, String ovsdbPortName) {
140 NodeConnectorBuilder nodeConnectorBuilder = new NodeConnectorBuilder();
141 String ofPortName = ofBridgeName + ":" + portNumber.toString();
142 NodeConnectorId nodeConnectorId = new NodeConnectorId(ofPortName);
143 nodeConnectorBuilder.setId(nodeConnectorId);
144 nodeConnectorBuilder.setKey(new NodeConnectorKey(nodeConnectorId));
145 nodeConnectorBuilder.addAugmentation(FlowCapableNodeConnector.class,createFlowCapableNodeConnector(ovsdbPortName,portNumber));
146 return nodeConnectorBuilder.build();
149 private FlowCapableNodeConnector createFlowCapableNodeConnector(String ovsdbName, Long portNumber) {
150 FlowCapableNodeConnectorBuilder flowCapableNodeConnectorBuilder = new FlowCapableNodeConnectorBuilder();
151 flowCapableNodeConnectorBuilder.setName(ovsdbName);
152 flowCapableNodeConnectorBuilder.setPortNumber(new PortNumberUni(portNumber));
153 return flowCapableNodeConnectorBuilder.build();
156 protected void createPrestoSystemTopology() {
157 NrpInitializer nrpInitializer = new NrpInitializer(dataBroker);
159 nrpInitializer.init();
160 } catch (Exception e) {
161 fail("Could not initialize NRP topology.");
165 protected org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.topology.Node readOvsNode() {
166 return DataStoreTestUtils.read(getNodeIid(),dataBroker);
169 protected List<org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.common.rev171113.context.attrs.ServiceInterfacePoint> readSips() {
170 ReadWriteTransaction readWriteTransaction = dataBroker.newReadWriteTransaction();
172 Optional<Context> opt = readWriteTransaction.read(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Context.class)).checkedGet();
173 if (opt.isPresent()) {
174 return opt.get().getServiceInterfacePoint();
176 fail("There are no sips.");
178 } catch (ReadFailedException e) {
179 fail(e.getMessage());
184 private static InstanceIdentifier getNodeIid() {
186 .child(org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.topology.Node.class,
187 new org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.topology.NodeKey(new Uuid(ovsNodeId)));
190 private static InstanceIdentifier getTopoIid() {
191 return InstanceIdentifier.create(Context.class)
192 .augmentation(Context1.class)
193 .child(org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.topology.context.Topology.class,
194 new org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.topology.context.TopologyKey(new Uuid(prestoNrpTopoId)));