Migrate to simplified addAugmentation() method
[genius.git] / interfacemanager / interfacemanager-impl / src / test / java / org / opendaylight / genius / interfacemanager / test / OvsdbSouthboundTestUtil.java
1 /*
2  * Copyright (c) 2015, 2017 Red Hat, 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
9 package org.opendaylight.genius.interfacemanager.test;
10
11 import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.OPERATIONAL;
12
13 import com.google.common.collect.ImmutableBiMap;
14 import java.net.Inet4Address;
15 import java.net.Inet6Address;
16 import java.net.InetAddress;
17 import java.net.UnknownHostException;
18 import java.util.ArrayList;
19 import java.util.Arrays;
20 import java.util.List;
21 import java.util.concurrent.ExecutionException;
22 import org.opendaylight.mdsal.binding.api.DataBroker;
23 import org.opendaylight.mdsal.binding.api.WriteTransaction;
24 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeBase;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdk;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdkr;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdkvhost;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdkvhostuser;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeGeneve;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeGre;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeGre64;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeInternal;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeIpsecGre;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeIpsecGre64;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeLisp;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypePatch;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeSystem;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeTap;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeVxlan;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeVxlanGpe;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentationBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeName;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentationBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntry;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntryBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfoBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceBfdStatus;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceBfdStatusBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceExternalIds;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceExternalIdsBuilder;
61 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
62 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
63 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
64 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
65 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
66 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
67 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
68 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
69 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
70 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
71 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
72 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
73 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
74 import org.slf4j.Logger;
75 import org.slf4j.LoggerFactory;
76
77 public class OvsdbSouthboundTestUtil {
78     private static final Logger LOG = LoggerFactory.getLogger(OvsdbSouthboundTestUtil.class);
79     private static final int OVSDB_UPDATE_TIMEOUT = 1000;
80     public static final TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1"));
81     public static final String OVSDB_URI_PREFIX = "ovsdb";
82     public static final String BRIDGE_URI_PREFIX = "bridge";
83
84     public static final ImmutableBiMap<String, Class<? extends InterfaceTypeBase>>
85         OVSDB_INTERFACE_TYPE_MAP = new ImmutableBiMap.Builder<String, Class<? extends InterfaceTypeBase>>()
86             .put("internal", InterfaceTypeInternal.class).put("vxlan", InterfaceTypeVxlan.class)
87             .put("vxlan-gpe", InterfaceTypeVxlanGpe.class).put("patch", InterfaceTypePatch.class)
88             .put("system", InterfaceTypeSystem.class).put("tap", InterfaceTypeTap.class)
89             .put("geneve", InterfaceTypeGeneve.class).put("gre", InterfaceTypeGre.class)
90             .put("ipsec_gre", InterfaceTypeIpsecGre.class).put("gre64", InterfaceTypeGre64.class)
91             .put("ipsec_gre64", InterfaceTypeIpsecGre64.class).put("lisp", InterfaceTypeLisp.class)
92             .put("dpdk", InterfaceTypeDpdk.class).put("dpdkr", InterfaceTypeDpdkr.class)
93             .put("dpdkvhost", InterfaceTypeDpdkvhost.class).put("dpdkvhostuser", InterfaceTypeDpdkvhostuser.class)
94             .build();
95
96     public static NodeId createNodeId(String ip, Integer port) {
97         String uriString = OVSDB_URI_PREFIX + "://" + ip + ":" + port;
98         Uri uri = new Uri(uriString);
99         return new NodeId(uri);
100     }
101
102     public static void createBridge(DataBroker dataBroker) throws ExecutionException, InterruptedException {
103         final OvsdbBridgeName ovsdbBridgeName = new OvsdbBridgeName("s2");
104         final InstanceIdentifier<Node> bridgeIid = createInstanceIdentifier("192.168.56.101", 6640, ovsdbBridgeName);
105         final InstanceIdentifier<OvsdbBridgeAugmentation> ovsdbBridgeIid = bridgeIid.builder()
106                 .augmentation(OvsdbBridgeAugmentation.class).build();
107         final NodeId bridgeNodeId = createManagedNodeId(bridgeIid);
108         final NodeBuilder bridgeCreateNodeBuilder = new NodeBuilder();
109         bridgeCreateNodeBuilder.setNodeId(bridgeNodeId);
110         OvsdbBridgeAugmentationBuilder bridgeCreateAugmentationBuilder = new OvsdbBridgeAugmentationBuilder();
111         bridgeCreateAugmentationBuilder.setBridgeName(ovsdbBridgeName)
112                 .setDatapathId(new DatapathId("00:00:00:00:00:00:00:01"));
113         bridgeCreateNodeBuilder.addAugmentation(bridgeCreateAugmentationBuilder.build());
114         LOG.debug("Built with the intent to store bridge data {}", bridgeCreateAugmentationBuilder.toString());
115         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
116         tx.mergeParentStructurePut(LogicalDatastoreType.OPERATIONAL, ovsdbBridgeIid,
117                 bridgeCreateAugmentationBuilder.build());
118         tx.commit().get();
119     }
120
121     public static void updateBridge(DataBroker dataBroker, String datapathId)
122             throws ExecutionException, InterruptedException {
123         final OvsdbBridgeName ovsdbBridgeName = new OvsdbBridgeName("s2");
124         final InstanceIdentifier<Node> bridgeIid = createInstanceIdentifier("192.168.56.101", 6640, ovsdbBridgeName);
125         final InstanceIdentifier<OvsdbBridgeAugmentation> ovsdbBridgeIid = bridgeIid.builder()
126             .augmentation(OvsdbBridgeAugmentation.class).build();
127         final NodeId bridgeNodeId = createManagedNodeId(bridgeIid);
128         final NodeBuilder bridgeCreateNodeBuilder = new NodeBuilder();
129         bridgeCreateNodeBuilder.setNodeId(bridgeNodeId);
130         OvsdbBridgeAugmentationBuilder bridgeCreateAugmentationBuilder = new OvsdbBridgeAugmentationBuilder();
131         bridgeCreateAugmentationBuilder.setBridgeName(ovsdbBridgeName)
132             .setDatapathId(new DatapathId(datapathId));
133         bridgeCreateNodeBuilder.addAugmentation(bridgeCreateAugmentationBuilder.build());
134         LOG.debug("Built with the intent to store bridge data {}", bridgeCreateAugmentationBuilder.toString());
135         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
136         tx.mergeParentStructureMerge(LogicalDatastoreType.OPERATIONAL, ovsdbBridgeIid,
137                 bridgeCreateAugmentationBuilder.build());
138         tx.commit().get();
139     }
140
141     public static void deleteBridge(DataBroker dataBroker) throws ExecutionException, InterruptedException {
142         final OvsdbBridgeName ovsdbBridgeName = new OvsdbBridgeName("s2");
143         final InstanceIdentifier<Node> bridgeIid = createInstanceIdentifier("192.168.56.101", 6640, ovsdbBridgeName);
144         final InstanceIdentifier<OvsdbBridgeAugmentation> ovsdbBridgeIid = bridgeIid.builder()
145                 .augmentation(OvsdbBridgeAugmentation.class).build();
146         LOG.debug("Built with the intent to delete bridge data {}", bridgeIid.toString());
147         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
148         tx.delete(LogicalDatastoreType.OPERATIONAL, ovsdbBridgeIid);
149         tx.commit().get();
150     }
151
152     public static InstanceIdentifier<Node> createInstanceIdentifier(NodeId nodeId) {
153         return InstanceIdentifier.create(NetworkTopology.class)
154                 .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID)).child(Node.class, new NodeKey(nodeId));
155     }
156
157     public static InstanceIdentifier<Node> createInstanceIdentifier(String ip, Integer port) {
158         InstanceIdentifier<Node> path = InstanceIdentifier.create(NetworkTopology.class)
159                 .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID)).child(Node.class, createNodeKey(ip, port));
160         LOG.debug("Created ovsdb path: {}", path);
161         return path;
162     }
163
164     public static InstanceIdentifier<Node> createInstanceIdentifier(String remoteIp, Integer remotePort,
165             OvsdbBridgeName bridgeName) {
166         return createInstanceIdentifier(createManagedNodeId(remoteIp, remotePort, bridgeName));
167     }
168
169     public static InstanceIdentifier<Node> createInstanceIdentifier(NodeKey ovsdbNodeKey, String bridgeName) {
170         return createInstanceIdentifier(createManagedNodeId(ovsdbNodeKey.getNodeId(), bridgeName));
171     }
172
173     public static InstanceIdentifier<Node> createInstanceIdentifier(String ip, Integer port, String bridgeName) {
174         return createInstanceIdentifier(ip, port, new OvsdbBridgeName(bridgeName));
175     }
176
177     public static NodeId createManagedNodeId(String ip, Integer port, OvsdbBridgeName bridgeName) {
178         return new NodeId(createNodeId(ip, port).getValue() + "/" + BRIDGE_URI_PREFIX + "/" + bridgeName.getValue());
179     }
180
181     public static NodeId createManagedNodeId(InstanceIdentifier<Node> iid) {
182         NodeKey nodeKey = iid.firstKeyOf(Node.class);
183         return nodeKey.getNodeId();
184     }
185
186     public static NodeId createManagedNodeId(NodeId ovsdbNodeId, String bridgeName) {
187         return new NodeId(ovsdbNodeId.getValue() + "/" + BRIDGE_URI_PREFIX + "/" + bridgeName);
188     }
189
190     public static InstanceIdentifier<TerminationPoint> createTerminationPointInstanceIdentifier(NodeKey nodeKey, String
191         portName) {
192         InstanceIdentifier<TerminationPoint> terminationPointPath = InstanceIdentifier
193                 .create(NetworkTopology.class)
194                 .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID))
195                 .child(Node.class,nodeKey)
196                 .child(TerminationPoint.class, new TerminationPointKey(new TpId(portName)));
197
198         LOG.debug("Termination point InstanceIdentifier generated : {}", terminationPointPath);
199         return terminationPointPath;
200     }
201
202     public static void createTerminationPoint(DataBroker dataBroker, String interfaceName,
203                                               Class<? extends InterfaceTypeBase> type, String externalId) throws
204             ExecutionException, InterruptedException {
205         final OvsdbBridgeName ovsdbBridgeName = new OvsdbBridgeName("s2");
206         final InstanceIdentifier<Node> bridgeIid =
207             createInstanceIdentifier("192.168.56.101", 6640,  ovsdbBridgeName);
208         InstanceIdentifier<TerminationPoint> tpId = createTerminationPointInstanceIdentifier(
209                 InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)), interfaceName);
210         TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
211         tpBuilder.withKey(InstanceIdentifier.keyOf(tpId));
212         OvsdbTerminationPointAugmentationBuilder tpAugmentationBuilder = new OvsdbTerminationPointAugmentationBuilder();
213
214         tpAugmentationBuilder.setName(interfaceName);
215         if (type != null) {
216             tpAugmentationBuilder.setInterfaceType(type);
217         }
218         if (externalId != null) {
219             List<InterfaceExternalIds> interfaceExternalIds = new ArrayList<>();
220             InterfaceExternalIds interfaceExternalIds1 = new InterfaceExternalIdsBuilder().setExternalIdKey("iface-id")
221                 .setExternalIdValue(externalId).build();
222             interfaceExternalIds.add(interfaceExternalIds1);
223             tpAugmentationBuilder.setInterfaceExternalIds(interfaceExternalIds);
224         }
225         tpBuilder.addAugmentation(tpAugmentationBuilder.build());
226         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
227         tx.mergeParentStructurePut(OPERATIONAL, tpId, tpBuilder.build());
228         tx.commit().get();
229     }
230
231     public static void updateTerminationPoint(DataBroker dataBroker, String interfaceName,
232                                               Class<? extends InterfaceTypeBase> type) throws
233             ExecutionException, InterruptedException {
234         final OvsdbBridgeName ovsdbBridgeName = new OvsdbBridgeName("s2");
235         final InstanceIdentifier<Node> bridgeIid =
236             createInstanceIdentifier("192.168.56.101", 6640,  ovsdbBridgeName);
237         InstanceIdentifier<TerminationPoint> tpId = createTerminationPointInstanceIdentifier(
238             InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)), interfaceName);
239         TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
240         tpBuilder.withKey(InstanceIdentifier.keyOf(tpId));
241         OvsdbTerminationPointAugmentationBuilder tpAugmentationBuilder = new OvsdbTerminationPointAugmentationBuilder();
242
243         tpAugmentationBuilder.setName(interfaceName);
244         if (type != null) {
245             tpAugmentationBuilder.setInterfaceType(type);
246         }
247         List<InterfaceBfdStatus> interfaceBfdStatuses = Arrays.asList(new InterfaceBfdStatusBuilder()
248             .setBfdStatusKey("state").setBfdStatusValue("down").build());
249
250         tpAugmentationBuilder.setInterfaceBfdStatus(interfaceBfdStatuses);
251         tpBuilder.addAugmentation(tpAugmentationBuilder.build());
252         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
253         tx.mergeParentStructureMerge(OPERATIONAL, tpId, tpBuilder.build());
254         tx.commit().get();
255     }
256
257     public static NodeKey createNodeKey(String ip, Integer port) {
258         return new NodeKey(createNodeId(ip, port));
259     }
260
261     public static ConnectionInfo getConnectionInfo(final String addressStr, final String portStr) {
262         InetAddress inetAddress = null;
263         try {
264             inetAddress = InetAddress.getByName(addressStr);
265         } catch (UnknownHostException e) {
266             LOG.warn("Could not allocate InetAddress", e);
267         }
268
269         IpAddress address = createIpAddress(inetAddress);
270         PortNumber port = new PortNumber(Integer.parseInt(portStr));
271
272         LOG.info("connectionInfo: {}", new ConnectionInfoBuilder().setRemoteIp(address).setRemotePort(port).build());
273         return new ConnectionInfoBuilder().setRemoteIp(address).setRemotePort(port).build();
274     }
275
276     public ConnectionInfo getConnectionInfo(Node ovsdbNode) {
277         ConnectionInfo connectionInfo = null;
278         OvsdbNodeAugmentation ovsdbNodeAugmentation = extractOvsdbNode(ovsdbNode);
279         if (ovsdbNodeAugmentation != null) {
280             connectionInfo = ovsdbNodeAugmentation.getConnectionInfo();
281         }
282         return connectionInfo;
283     }
284
285     public OvsdbNodeAugmentation extractOvsdbNode(Node node) {
286         return node.augmentation(OvsdbNodeAugmentation.class);
287     }
288
289     public static IpAddress createIpAddress(InetAddress address) {
290         IpAddress ip = null;
291         if (address instanceof Inet4Address) {
292             ip = createIpAddress((Inet4Address) address);
293         } else if (address instanceof Inet6Address) {
294             ip = createIpAddress((Inet6Address) address);
295         }
296         return ip;
297     }
298
299     public static IpAddress createIpAddress(Inet4Address address) {
300         return IetfInetUtil.INSTANCE.ipAddressFor(address);
301     }
302
303     public static IpAddress createIpAddress(Inet6Address address) {
304         Ipv6Address ipv6 = new Ipv6Address(address.getHostAddress());
305         return new IpAddress(ipv6);
306     }
307
308     public static String connectionInfoToString(final ConnectionInfo connectionInfo) {
309         return connectionInfo.getRemoteIp().stringValue() + ":"
310                 + connectionInfo.getRemotePort().getValue();
311     }
312
313     public boolean addOvsdbNode(final ConnectionInfo connectionInfo) {
314         return addOvsdbNode(connectionInfo, OVSDB_UPDATE_TIMEOUT);
315     }
316
317     public boolean addOvsdbNode(final ConnectionInfo connectionInfo, long timeout) {
318         boolean result = true;
319         // mdsalUtils.put(LogicalDatastoreType.CONFIGURATION,
320         // createInstanceIdentifier(connectionInfo),
321         // createNode(connectionInfo));
322         if (timeout != 0) {
323             try {
324                 Thread.sleep(timeout);
325             } catch (InterruptedException e) {
326                 LOG.warn("Interrupted while waiting after adding OVSDB node {}", connectionInfoToString(connectionInfo),
327                         e);
328             }
329         }
330         return result;
331     }
332
333     public Node getOvsdbNode(final ConnectionInfo connectionInfo) {
334         // return mdsalUtils.read(LogicalDatastoreType.OPERATIONAL,
335         // createInstanceIdentifier(connectionInfo));
336         return null;
337     }
338
339     public boolean deleteOvsdbNode(final ConnectionInfo connectionInfo) {
340         return deleteOvsdbNode(connectionInfo, OVSDB_UPDATE_TIMEOUT);
341     }
342
343     public boolean deleteOvsdbNode(final ConnectionInfo connectionInfo, long timeout) {
344         boolean result = true;
345         // mdsalUtils.delete(LogicalDatastoreType.CONFIGURATION,
346         // createInstanceIdentifier(connectionInfo));
347         if (timeout != 0) {
348             try {
349                 Thread.sleep(timeout);
350             } catch (InterruptedException e) {
351                 LOG.warn("Interrupted while waiting after deleting OVSDB node {}",
352                         connectionInfoToString(connectionInfo), e);
353             }
354         }
355         return result;
356     }
357
358     public Node connectOvsdbNode(final ConnectionInfo connectionInfo) {
359         return connectOvsdbNode(connectionInfo, OVSDB_UPDATE_TIMEOUT);
360     }
361
362     public Node connectOvsdbNode(final ConnectionInfo connectionInfo, long timeout) {
363         addOvsdbNode(connectionInfo, timeout);
364         Node node = getOvsdbNode(connectionInfo);
365         LOG.info("Connected to {}", connectionInfoToString(connectionInfo));
366         return node;
367     }
368
369     public boolean disconnectOvsdbNode(final ConnectionInfo connectionInfo) {
370         return disconnectOvsdbNode(connectionInfo, OVSDB_UPDATE_TIMEOUT);
371     }
372
373     public boolean disconnectOvsdbNode(final ConnectionInfo connectionInfo, long timeout) {
374         deleteOvsdbNode(connectionInfo, timeout);
375         LOG.info("Disconnected from {}", connectionInfoToString(connectionInfo));
376         return true;
377     }
378
379     public List<ControllerEntry> createControllerEntry(String controllerTarget) {
380         List<ControllerEntry> controllerEntriesList = new ArrayList<>();
381         controllerEntriesList.add(new ControllerEntryBuilder().setTarget(new Uri(controllerTarget)).build());
382         return controllerEntriesList;
383     }
384
385     public OvsdbNodeAugmentation extractNodeAugmentation(Node node) {
386         return node.augmentation(OvsdbNodeAugmentation.class);
387     }
388
389     public OvsdbBridgeAugmentation extractBridgeAugmentation(Node node) {
390         if (node == null) {
391             return null;
392         }
393         return node.augmentation(OvsdbBridgeAugmentation.class);
394     }
395 }