Migrate to 171221 revision of MEF NRP API
[unimgr.git] / ovs-driver / src / test / java / org / opendaylight / unimgr / mef / nrp / ovs / tapi / TopologyDataHandlerTestUtils.java
1 /*
2  * Copyright (c) 2017 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 package org.opendaylight.unimgr.mef.nrp.ovs.tapi;
9
10 import static org.junit.Assert.fail;
11
12 import java.util.ArrayList;
13 import java.util.LinkedList;
14 import java.util.List;
15
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;
39
40 import com.google.common.base.Optional;
41
42 /**
43  * @author marek.ryznar@amartus.com
44  */
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;
54
55     private static final String prestoNrpTopoId = "mef:presto-nrp-topology-system";
56     private static final String ovsNodeId = "ovs-node";
57
58     private final DataBroker dataBroker;
59
60     protected TopologyDataHandlerTestUtils(DataBroker dataBroker) {
61         this.dataBroker = dataBroker;
62     }
63
64     /**
65      * Creates ovsdb bridge "br1" with 3 ports:
66      *  1. tp1 - nep
67      *  2. tp2 - nep
68      *  3. tp3 - not nep, becouse it is connected to other switch
69      */
70     public void createTestBridge() {
71         List<TerminationPoint> tps = new LinkedList<>();
72
73         tps.add(OvsdbTopologyTestUtils.createTerminationPoint(tp1Name,tp1OFport));
74         tps.add(OvsdbTopologyTestUtils.createTerminationPoint(tp2Name,tp2OFport));
75         tps.add(OvsdbTopologyTestUtils.createTerminationPoint(tp3Name,tp3OFport));
76
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);
80     }
81
82     protected void deleteTestBridge() {
83         InstanceIdentifier instanceIdentifier = OvsdbTopologyTestUtils.getNodeInstanceIdentifier(new NodeId(bridgeName));
84         DataStoreTestUtils.delete(instanceIdentifier,dataBroker);
85     }
86
87     protected void deletePort(String port) {
88         InstanceIdentifier<TerminationPoint> tpIid = OvsdbTopologyTestUtils.getPortInstanceIdentifier(bridgeName,port);
89         DataStoreTestUtils.delete(tpIid,dataBroker);
90     }
91
92     protected void addPort(String bridgeName, String portName, Long ofNumber) {
93         String bridgeId = bridgeName;
94         //openflow init
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);
99         //ovsdb init
100         TerminationPoint terminationPoint = OvsdbTopologyTestUtils.createTerminationPoint(portName,ofNumber);
101         InstanceIdentifier<TerminationPoint> tpIid = OvsdbTopologyTestUtils.getPortInstanceIdentifier(bridgeId,portName);
102         DataStoreTestUtils.write(terminationPoint,tpIid,dataBroker);
103     }
104
105     /**
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"
110      */
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();
118
119         ReadWriteTransaction transaction = dataBroker.newReadWriteTransaction();
120         transaction.put(LogicalDatastoreType.OPERATIONAL,nodesIId,nodes);
121         transaction.submit();
122     }
123
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();
137     }
138
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();
147     }
148
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();
154     }
155
156     protected void createPrestoSystemTopology() {
157         NrpInitializer nrpInitializer = new NrpInitializer(dataBroker);
158         try {
159             nrpInitializer.init();
160         } catch (Exception e) {
161             fail("Could not initialize NRP topology.");
162         }
163     }
164
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);
167     }
168
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();
171         try {
172             Optional<Context> opt = readWriteTransaction.read(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Context.class)).checkedGet();
173             if (opt.isPresent()) {
174                 return opt.get().getServiceInterfacePoint();
175             } else {
176                 fail("There are no sips.");
177             }
178         } catch (ReadFailedException e) {
179             fail(e.getMessage());
180         }
181         return null;
182     }
183
184     private static InstanceIdentifier getNodeIid() {
185         return getTopoIid()
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)));
188     }
189
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)));
195     }
196 }