Merge "JUnit test case for ITM"
[genius.git] / interfacemanager / interfacemanager-impl / src / main / java / org / opendaylight / genius / interfacemanager / commons / InterfaceMetaUtils.java
1 /*
2  * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. 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.genius.interfacemanager.commons;
9
10 import com.google.common.base.Optional;
11 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
12 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
13 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
14 import org.opendaylight.genius.interfacemanager.IfmConstants;
15 import org.opendaylight.genius.interfacemanager.IfmUtil;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.BridgeEntryBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.Tunnels;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeRef;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.*;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._if.indexes._interface.map.IfIndexInterface;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._if.indexes._interface.map.IfIndexInterfaceBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._if.indexes._interface.map.IfIndexInterfaceKey;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info.InterfaceParentEntry;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info.InterfaceParentEntryKey;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info._interface.parent.entry.InterfaceChildEntry;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info._interface.parent.entry.InterfaceChildEntryKey;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.BridgeEntry;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.BridgeEntryKey;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.bridge.entry.BridgeInterfaceEntry;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.bridge.entry.BridgeInterfaceEntryBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.bridge.entry.BridgeInterfaceEntryKey;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntry;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntryBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntryKey;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.tunnel.instance._interface.map.TunnelInstanceInterface;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.tunnel.instance._interface.map.TunnelInstanceInterfaceBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.tunnel.instance._interface.map.TunnelInstanceInterfaceKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfTunnel;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
44 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48 import java.math.BigInteger;
49 import java.util.List;
50
51 public class InterfaceMetaUtils {
52     private static final Logger LOG = LoggerFactory.getLogger(InterfaceMetaUtils.class);
53     public static InstanceIdentifier<BridgeRefEntry> getBridgeRefEntryIdentifier(BridgeRefEntryKey bridgeRefEntryKey) {
54         InstanceIdentifier.InstanceIdentifierBuilder<BridgeRefEntry> bridgeRefEntryInstanceIdentifierBuilder =
55                 InstanceIdentifier.builder(BridgeRefInfo.class)
56                         .child(BridgeRefEntry.class, bridgeRefEntryKey);
57         return bridgeRefEntryInstanceIdentifierBuilder.build();
58     }
59
60     public static BridgeRefEntry getBridgeRefEntryFromOperDS(InstanceIdentifier<BridgeRefEntry> dpnBridgeEntryIid,
61                                                              DataBroker dataBroker) {
62         Optional<BridgeRefEntry> bridgeRefEntryOptional =
63                 IfmUtil.read(LogicalDatastoreType.OPERATIONAL, dpnBridgeEntryIid, dataBroker);
64         if (!bridgeRefEntryOptional.isPresent()) {
65             return null;
66         }
67         return bridgeRefEntryOptional.get();
68     }
69
70     public static OvsdbBridgeRef getBridgeRefEntryFromOperDS(BigInteger dpId,
71                                                              DataBroker dataBroker) {
72         BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(dpId);
73         InstanceIdentifier<BridgeRefEntry> bridgeRefEntryIid =
74                 InterfaceMetaUtils.getBridgeRefEntryIdentifier(bridgeRefEntryKey);
75         BridgeRefEntry bridgeRefEntry = getBridgeRefEntryFromOperDS(bridgeRefEntryIid, dataBroker);
76         if(bridgeRefEntry == null){
77             // bridge ref entry will be null if the bridge is disconnected from controller.
78             // In that case, fetch bridge reference from bridge interface entry config DS
79             BridgeEntry bridgeEntry = getBridgeEntryFromConfigDS(dpId, dataBroker);
80             if(bridgeEntry == null){
81                 return null;
82             }
83             return  bridgeEntry.getBridgeReference();
84         }
85         return bridgeRefEntry.getBridgeReference();
86     }
87
88     public static BridgeRefEntry getBridgeReferenceForInterface(Interface interfaceInfo,
89                                                                 DataBroker dataBroker) {
90         ParentRefs parentRefs = interfaceInfo.getAugmentation(ParentRefs.class);
91         BigInteger dpn = parentRefs.getDatapathNodeIdentifier();
92         BridgeRefEntryKey BridgeRefEntryKey = new BridgeRefEntryKey(dpn);
93         InstanceIdentifier<BridgeRefEntry> dpnBridgeEntryIid = getBridgeRefEntryIdentifier(BridgeRefEntryKey);
94         BridgeRefEntry bridgeRefEntry = getBridgeRefEntryFromOperDS(dpnBridgeEntryIid, dataBroker);
95         return bridgeRefEntry;
96     }
97
98     public static boolean bridgeExists(BridgeRefEntry bridgeRefEntry,
99                                        DataBroker dataBroker) {
100         if (bridgeRefEntry != null && bridgeRefEntry.getBridgeReference() != null) {
101             InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid =
102                     (InstanceIdentifier<OvsdbBridgeAugmentation>) bridgeRefEntry.getBridgeReference().getValue();
103             Optional<OvsdbBridgeAugmentation> bridgeNodeOptional =
104                     IfmUtil.read(LogicalDatastoreType.OPERATIONAL, bridgeIid, dataBroker);
105             if (bridgeNodeOptional.isPresent()) {
106                 return true;
107             }
108         }
109         return false;
110     }
111     public static InstanceIdentifier<BridgeEntry> getBridgeEntryIdentifier(BridgeEntryKey bridgeEntryKey) {
112         InstanceIdentifier.InstanceIdentifierBuilder<BridgeEntry> bridgeEntryIdBuilder =
113                 InstanceIdentifier.builder(BridgeInterfaceInfo.class).child(BridgeEntry.class, bridgeEntryKey);
114         return bridgeEntryIdBuilder.build();
115     }
116
117     public static BridgeEntry getBridgeEntryFromConfigDS(BigInteger dpnId,
118                                                          DataBroker dataBroker) {
119         BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpnId);
120         InstanceIdentifier<BridgeEntry> bridgeEntryInstanceIdentifier =
121                 InterfaceMetaUtils.getBridgeEntryIdentifier(bridgeEntryKey);
122         LOG.debug("Trying to retrieve bridge entry from config for Id: {}", bridgeEntryInstanceIdentifier);
123         return getBridgeEntryFromConfigDS(bridgeEntryInstanceIdentifier,
124                 dataBroker);
125     }
126
127     public static BridgeEntry getBridgeEntryFromConfigDS(InstanceIdentifier<BridgeEntry> bridgeEntryInstanceIdentifier,
128                                                          DataBroker dataBroker) {
129         Optional<BridgeEntry> bridgeEntryOptional =
130                 IfmUtil.read(LogicalDatastoreType.CONFIGURATION, bridgeEntryInstanceIdentifier, dataBroker);
131         if (!bridgeEntryOptional.isPresent()) {
132             return null;
133         }
134         return bridgeEntryOptional.get();
135     }
136
137     public static InstanceIdentifier<BridgeInterfaceEntry> getBridgeInterfaceEntryIdentifier(BridgeEntryKey bridgeEntryKey,
138                                                                                              BridgeInterfaceEntryKey bridgeInterfaceEntryKey) {
139         return InstanceIdentifier.builder(BridgeInterfaceInfo.class)
140                 .child(BridgeEntry.class, bridgeEntryKey)
141                 .child(BridgeInterfaceEntry.class, bridgeInterfaceEntryKey).build();
142
143     }
144
145     public static void createBridgeInterfaceEntryInConfigDS(BigInteger dpId,
146                                                             String childInterface,
147                                                             WriteTransaction t) {
148         BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpId);
149         BridgeInterfaceEntryKey bridgeInterfaceEntryKey = new BridgeInterfaceEntryKey(childInterface);
150         InstanceIdentifier<BridgeInterfaceEntry> bridgeInterfaceEntryIid =
151                 InterfaceMetaUtils.getBridgeInterfaceEntryIdentifier(bridgeEntryKey, bridgeInterfaceEntryKey);
152         BridgeInterfaceEntryBuilder entryBuilder = new BridgeInterfaceEntryBuilder().setKey(bridgeInterfaceEntryKey)
153                 .setInterfaceName(childInterface);
154         t.put(LogicalDatastoreType.CONFIGURATION, bridgeInterfaceEntryIid, entryBuilder.build(), true);
155     }
156
157     public static InstanceIdentifier<InterfaceParentEntry> getInterfaceParentEntryIdentifier(
158             InterfaceParentEntryKey interfaceParentEntryKey) {
159         InstanceIdentifier.InstanceIdentifierBuilder<InterfaceParentEntry> intfIdBuilder =
160                 InstanceIdentifier.builder(InterfaceChildInfo.class)
161                         .child(InterfaceParentEntry.class, interfaceParentEntryKey);
162         return intfIdBuilder.build();
163     }
164
165     public static InstanceIdentifier<InterfaceChildEntry> getInterfaceChildEntryIdentifier(
166             InterfaceParentEntryKey interfaceParentEntryKey, InterfaceChildEntryKey interfaceChildEntryKey) {
167         InstanceIdentifier.InstanceIdentifierBuilder<InterfaceChildEntry> intfIdBuilder =
168                 InstanceIdentifier.builder(InterfaceChildInfo.class)
169                         .child(InterfaceParentEntry.class, interfaceParentEntryKey)
170                         .child(InterfaceChildEntry.class, interfaceChildEntryKey);
171         return intfIdBuilder.build();
172     }
173
174     public static InterfaceParentEntry getInterfaceParentEntryFromConfigDS(
175             String interfaceName, DataBroker dataBroker) {
176         InterfaceParentEntryKey interfaceParentEntryKey = new InterfaceParentEntryKey(interfaceName);
177         InterfaceParentEntry interfaceParentEntry =
178                 InterfaceMetaUtils.getInterfaceParentEntryFromConfigDS(interfaceParentEntryKey, dataBroker);
179         return interfaceParentEntry;
180     }
181
182     public static InterfaceParentEntry getInterfaceParentEntryFromConfigDS(
183             InterfaceParentEntryKey interfaceParentEntryKey, DataBroker dataBroker) {
184         InstanceIdentifier<InterfaceParentEntry> intfParentIid =
185                 getInterfaceParentEntryIdentifier(interfaceParentEntryKey);
186
187         return getInterfaceParentEntryFromConfigDS(intfParentIid, dataBroker);
188     }
189
190     public static InterfaceParentEntry getInterfaceParentEntryFromConfigDS(
191             InstanceIdentifier<InterfaceParentEntry> intfId, DataBroker dataBroker) {
192         Optional<InterfaceParentEntry> interfaceParentEntryOptional =
193                 IfmUtil.read(LogicalDatastoreType.CONFIGURATION, intfId, dataBroker);
194         if (!interfaceParentEntryOptional.isPresent()) {
195             return null;
196         }
197         return interfaceParentEntryOptional.get();
198     }
199
200     public static InterfaceChildEntry getInterfaceChildEntryFromConfigDS(InterfaceParentEntryKey interfaceParentEntryKey,
201                                                                          InterfaceChildEntryKey interfaceChildEntryKey,
202                                                                          DataBroker dataBroker) {
203         InstanceIdentifier<InterfaceChildEntry> intfChildIid =
204                 getInterfaceChildEntryIdentifier(interfaceParentEntryKey, interfaceChildEntryKey);
205
206         return getInterfaceChildEntryFromConfigDS(intfChildIid, dataBroker);
207     }
208
209     public static InterfaceChildEntry getInterfaceChildEntryFromConfigDS(
210             InstanceIdentifier<InterfaceChildEntry> intfChildIid, DataBroker dataBroker) {
211         Optional<InterfaceChildEntry> interfaceChildEntryOptional =
212                 IfmUtil.read(LogicalDatastoreType.CONFIGURATION, intfChildIid, dataBroker);
213         if (!interfaceChildEntryOptional.isPresent()) {
214             return null;
215         }
216         return interfaceChildEntryOptional.get();
217     }
218
219     public static void createLportTagInterfaceMap(WriteTransaction t, String infName, Integer ifIndex) {
220         LOG.debug("creating lport tag to interface map for {}",infName);
221         InstanceIdentifier<IfIndexInterface> id = InstanceIdentifier.builder(IfIndexesInterfaceMap.class).child(IfIndexInterface.class, new IfIndexInterfaceKey(ifIndex)).build();
222         IfIndexInterface ifIndexInterface = new IfIndexInterfaceBuilder().setIfIndex(ifIndex).setKey(new IfIndexInterfaceKey(ifIndex)).setInterfaceName(infName).build();
223         t.put(LogicalDatastoreType.OPERATIONAL, id, ifIndexInterface, true);
224     }
225
226     public static void removeLportTagInterfaceMap(IdManagerService idManager, WriteTransaction t, String infName) {
227         // workaround to get the id to remove from lport tag interface map
228         Integer ifIndex = IfmUtil.allocateId(idManager, IfmConstants.IFM_IDPOOL_NAME, infName);
229         IfmUtil.releaseId(idManager, IfmConstants.IFM_IDPOOL_NAME, infName);
230         LOG.debug("removing lport tag to interface map for {}",infName);
231         InstanceIdentifier<IfIndexInterface> id = InstanceIdentifier.builder(IfIndexesInterfaceMap.class).child(IfIndexInterface.class, new IfIndexInterfaceKey(ifIndex)).build();
232         t.delete(LogicalDatastoreType.OPERATIONAL, id);
233     }
234
235     public static void addBridgeRefToBridgeInterfaceEntry(BigInteger dpId, OvsdbBridgeRef ovsdbBridgeRef, WriteTransaction t){
236         BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpId);
237         InstanceIdentifier<BridgeEntry> bridgeEntryInstanceIdentifier = getBridgeEntryIdentifier(bridgeEntryKey);
238
239         BridgeEntryBuilder bridgeEntryBuilder = new BridgeEntryBuilder().setKey(bridgeEntryKey).setBridgeReference(ovsdbBridgeRef);
240         t.merge(LogicalDatastoreType.CONFIGURATION, bridgeEntryInstanceIdentifier, bridgeEntryBuilder.build(), true);
241     }
242
243     public static void createBridgeRefEntry(BigInteger dpnId, InstanceIdentifier<?> bridgeIid,
244                                             WriteTransaction tx){
245         LOG.debug("Creating bridge ref entry for dpn: {} bridge: {}",
246                 dpnId, bridgeIid);
247         BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(dpnId);
248         InstanceIdentifier<BridgeRefEntry> bridgeEntryId =
249                 InterfaceMetaUtils.getBridgeRefEntryIdentifier(bridgeRefEntryKey);
250         BridgeRefEntryBuilder tunnelDpnBridgeEntryBuilder =
251                 new BridgeRefEntryBuilder().setKey(bridgeRefEntryKey).setDpid(dpnId)
252                         .setBridgeReference(new OvsdbBridgeRef(bridgeIid));
253         tx.put(LogicalDatastoreType.OPERATIONAL, bridgeEntryId, tunnelDpnBridgeEntryBuilder.build(), true);
254     }
255     public static void deleteBridgeRefEntry(BigInteger dpnId,
256                                             WriteTransaction tx) {
257         LOG.debug("Deleting bridge ref entry for dpn: {}",
258                 dpnId);
259         BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(dpnId);
260         InstanceIdentifier<BridgeRefEntry> bridgeEntryId =
261                 InterfaceMetaUtils.getBridgeRefEntryIdentifier(bridgeRefEntryKey);
262         tx.delete(LogicalDatastoreType.OPERATIONAL, bridgeEntryId);
263     }
264
265     public static void createTunnelToInterfaceMap(String tunnelInstanceId,
266                                                   String infName,
267                                                   WriteTransaction transaction) {
268         LOG.debug("creating tunnel instance identifier to interface map for {}",infName);
269         InstanceIdentifier<TunnelInstanceInterface> id = InstanceIdentifier.builder(TunnelInstanceInterfaceMap.class).
270                 child(TunnelInstanceInterface.class, new TunnelInstanceInterfaceKey(tunnelInstanceId)).build();
271         TunnelInstanceInterface tunnelInstanceInterface = new TunnelInstanceInterfaceBuilder().
272                 setTunnelInstanceIdentifier(tunnelInstanceId).setKey(new TunnelInstanceInterfaceKey(tunnelInstanceId)).setInterfaceName(infName).build();
273         transaction.put(LogicalDatastoreType.OPERATIONAL, id, tunnelInstanceInterface, true);
274
275     }
276
277     public static void createTunnelToInterfaceMap(String infName,InstanceIdentifier<Node> nodeId,
278                                                   WriteTransaction transaction,
279                                                   IfTunnel ifTunnel){
280         InstanceIdentifier<Tunnels> tunnelsInstanceIdentifier = org.opendaylight.genius.interfacemanager.renderer.hwvtep.utilities.SouthboundUtils.
281                 createTunnelsInstanceIdentifier(nodeId,
282                         ifTunnel.getTunnelSource(), ifTunnel.getTunnelDestination());
283         createTunnelToInterfaceMap(tunnelsInstanceIdentifier.toString(), infName, transaction);
284     }
285
286     public static void removeTunnelToInterfaceMap(InstanceIdentifier<Node> nodeId,
287                                                   WriteTransaction transaction,
288                                                   IfTunnel ifTunnel){
289         InstanceIdentifier<Tunnels> tunnelsInstanceIdentifier = org.opendaylight.genius.interfacemanager.renderer.hwvtep.utilities.SouthboundUtils.
290                 createTunnelsInstanceIdentifier(nodeId,
291                         ifTunnel.getTunnelSource(), ifTunnel.getTunnelDestination());
292         transaction.delete(LogicalDatastoreType.OPERATIONAL, tunnelsInstanceIdentifier);
293     }
294
295     public static String getInterfaceForTunnelInstanceIdentifier(String tunnelInstanceId,
296                                                                  DataBroker dataBroker) {
297         InstanceIdentifier<TunnelInstanceInterface> id = InstanceIdentifier.builder(TunnelInstanceInterfaceMap.class).
298                 child(TunnelInstanceInterface.class, new TunnelInstanceInterfaceKey(tunnelInstanceId)).build();
299         Optional<TunnelInstanceInterface> tunnelInstanceInterfaceOptional = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, id, dataBroker);
300         if(tunnelInstanceInterfaceOptional.isPresent()){
301             return tunnelInstanceInterfaceOptional.get().getInterfaceName();
302         }
303         return null;
304     }
305
306     public static void deleteBridgeInterfaceEntry(BridgeEntryKey bridgeEntryKey, List<BridgeInterfaceEntry> bridgeInterfaceEntries,
307                                                   InstanceIdentifier<BridgeEntry> bridgeEntryIid,
308                                                   WriteTransaction transaction, String interfaceName){
309         BridgeInterfaceEntryKey bridgeInterfaceEntryKey =
310                 new BridgeInterfaceEntryKey(interfaceName);
311         InstanceIdentifier<BridgeInterfaceEntry> bridgeInterfaceEntryIid =
312                 InterfaceMetaUtils.getBridgeInterfaceEntryIdentifier(bridgeEntryKey,
313                         bridgeInterfaceEntryKey);
314         transaction.delete(LogicalDatastoreType.CONFIGURATION, bridgeInterfaceEntryIid);
315
316         if (bridgeInterfaceEntries.size() <= 1) {
317             transaction.delete(LogicalDatastoreType.CONFIGURATION, bridgeEntryIid);
318         }
319     }
320 }