Merge "Modified Match and Action utilities to support Nicira extension required for...
[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             return  bridgeEntry.getBridgeReference();
81         }
82         return bridgeRefEntry.getBridgeReference();
83     }
84
85     public static BridgeRefEntry getBridgeReferenceForInterface(Interface interfaceInfo,
86                                                                 DataBroker dataBroker) {
87         ParentRefs parentRefs = interfaceInfo.getAugmentation(ParentRefs.class);
88         BigInteger dpn = parentRefs.getDatapathNodeIdentifier();
89         BridgeRefEntryKey BridgeRefEntryKey = new BridgeRefEntryKey(dpn);
90         InstanceIdentifier<BridgeRefEntry> dpnBridgeEntryIid = getBridgeRefEntryIdentifier(BridgeRefEntryKey);
91         BridgeRefEntry bridgeRefEntry = getBridgeRefEntryFromOperDS(dpnBridgeEntryIid, dataBroker);
92         return bridgeRefEntry;
93     }
94
95     public static boolean bridgeExists(BridgeRefEntry bridgeRefEntry,
96                                        DataBroker dataBroker) {
97         if (bridgeRefEntry != null && bridgeRefEntry.getBridgeReference() != null) {
98             InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid =
99                     (InstanceIdentifier<OvsdbBridgeAugmentation>) bridgeRefEntry.getBridgeReference().getValue();
100             Optional<OvsdbBridgeAugmentation> bridgeNodeOptional =
101                     IfmUtil.read(LogicalDatastoreType.OPERATIONAL, bridgeIid, dataBroker);
102             if (bridgeNodeOptional.isPresent()) {
103                 return true;
104             }
105         }
106         return false;
107     }
108     public static InstanceIdentifier<BridgeEntry> getBridgeEntryIdentifier(BridgeEntryKey bridgeEntryKey) {
109         InstanceIdentifier.InstanceIdentifierBuilder<BridgeEntry> bridgeEntryIdBuilder =
110                 InstanceIdentifier.builder(BridgeInterfaceInfo.class).child(BridgeEntry.class, bridgeEntryKey);
111         return bridgeEntryIdBuilder.build();
112     }
113
114     public static BridgeEntry getBridgeEntryFromConfigDS(BigInteger dpnId,
115                                                          DataBroker dataBroker) {
116         BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpnId);
117         InstanceIdentifier<BridgeEntry> bridgeEntryInstanceIdentifier =
118                 InterfaceMetaUtils.getBridgeEntryIdentifier(bridgeEntryKey);
119         LOG.debug("Trying to retrieve bridge entry from config for Id: {}", bridgeEntryInstanceIdentifier);
120         return getBridgeEntryFromConfigDS(bridgeEntryInstanceIdentifier,
121                 dataBroker);
122     }
123
124     public static BridgeEntry getBridgeEntryFromConfigDS(InstanceIdentifier<BridgeEntry> bridgeEntryInstanceIdentifier,
125                                                          DataBroker dataBroker) {
126         Optional<BridgeEntry> bridgeEntryOptional =
127                 IfmUtil.read(LogicalDatastoreType.CONFIGURATION, bridgeEntryInstanceIdentifier, dataBroker);
128         if (!bridgeEntryOptional.isPresent()) {
129             return null;
130         }
131         return bridgeEntryOptional.get();
132     }
133
134     public static InstanceIdentifier<BridgeInterfaceEntry> getBridgeInterfaceEntryIdentifier(BridgeEntryKey bridgeEntryKey,
135                                                                                              BridgeInterfaceEntryKey bridgeInterfaceEntryKey) {
136         return InstanceIdentifier.builder(BridgeInterfaceInfo.class)
137                 .child(BridgeEntry.class, bridgeEntryKey)
138                 .child(BridgeInterfaceEntry.class, bridgeInterfaceEntryKey).build();
139
140     }
141
142     public static void createBridgeInterfaceEntryInConfigDS(BigInteger dpId,
143                                                             String childInterface,
144                                                             WriteTransaction t) {
145         BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpId);
146         BridgeInterfaceEntryKey bridgeInterfaceEntryKey = new BridgeInterfaceEntryKey(childInterface);
147         InstanceIdentifier<BridgeInterfaceEntry> bridgeInterfaceEntryIid =
148                 InterfaceMetaUtils.getBridgeInterfaceEntryIdentifier(bridgeEntryKey, bridgeInterfaceEntryKey);
149         BridgeInterfaceEntryBuilder entryBuilder = new BridgeInterfaceEntryBuilder().setKey(bridgeInterfaceEntryKey)
150                 .setInterfaceName(childInterface);
151         t.put(LogicalDatastoreType.CONFIGURATION, bridgeInterfaceEntryIid, entryBuilder.build(), true);
152     }
153
154     public static InstanceIdentifier<InterfaceParentEntry> getInterfaceParentEntryIdentifier(
155             InterfaceParentEntryKey interfaceParentEntryKey) {
156         InstanceIdentifier.InstanceIdentifierBuilder<InterfaceParentEntry> intfIdBuilder =
157                 InstanceIdentifier.builder(InterfaceChildInfo.class)
158                         .child(InterfaceParentEntry.class, interfaceParentEntryKey);
159         return intfIdBuilder.build();
160     }
161
162     public static InstanceIdentifier<InterfaceChildEntry> getInterfaceChildEntryIdentifier(
163             InterfaceParentEntryKey interfaceParentEntryKey, InterfaceChildEntryKey interfaceChildEntryKey) {
164         InstanceIdentifier.InstanceIdentifierBuilder<InterfaceChildEntry> intfIdBuilder =
165                 InstanceIdentifier.builder(InterfaceChildInfo.class)
166                         .child(InterfaceParentEntry.class, interfaceParentEntryKey)
167                         .child(InterfaceChildEntry.class, interfaceChildEntryKey);
168         return intfIdBuilder.build();
169     }
170
171     public static InterfaceParentEntry getInterfaceParentEntryFromConfigDS(
172             String interfaceName, DataBroker dataBroker) {
173         InterfaceParentEntryKey interfaceParentEntryKey = new InterfaceParentEntryKey(interfaceName);
174         InterfaceParentEntry interfaceParentEntry =
175                 InterfaceMetaUtils.getInterfaceParentEntryFromConfigDS(interfaceParentEntryKey, dataBroker);
176         return interfaceParentEntry;
177     }
178
179     public static InterfaceParentEntry getInterfaceParentEntryFromConfigDS(
180             InterfaceParentEntryKey interfaceParentEntryKey, DataBroker dataBroker) {
181         InstanceIdentifier<InterfaceParentEntry> intfParentIid =
182                 getInterfaceParentEntryIdentifier(interfaceParentEntryKey);
183
184         return getInterfaceParentEntryFromConfigDS(intfParentIid, dataBroker);
185     }
186
187     public static InterfaceParentEntry getInterfaceParentEntryFromConfigDS(
188             InstanceIdentifier<InterfaceParentEntry> intfId, DataBroker dataBroker) {
189         Optional<InterfaceParentEntry> interfaceParentEntryOptional =
190                 IfmUtil.read(LogicalDatastoreType.CONFIGURATION, intfId, dataBroker);
191         if (!interfaceParentEntryOptional.isPresent()) {
192             return null;
193         }
194         return interfaceParentEntryOptional.get();
195     }
196
197     public static InterfaceChildEntry getInterfaceChildEntryFromConfigDS(InterfaceParentEntryKey interfaceParentEntryKey,
198                                                                          InterfaceChildEntryKey interfaceChildEntryKey,
199                                                                          DataBroker dataBroker) {
200         InstanceIdentifier<InterfaceChildEntry> intfChildIid =
201                 getInterfaceChildEntryIdentifier(interfaceParentEntryKey, interfaceChildEntryKey);
202
203         return getInterfaceChildEntryFromConfigDS(intfChildIid, dataBroker);
204     }
205
206     public static InterfaceChildEntry getInterfaceChildEntryFromConfigDS(
207             InstanceIdentifier<InterfaceChildEntry> intfChildIid, DataBroker dataBroker) {
208         Optional<InterfaceChildEntry> interfaceChildEntryOptional =
209                 IfmUtil.read(LogicalDatastoreType.CONFIGURATION, intfChildIid, dataBroker);
210         if (!interfaceChildEntryOptional.isPresent()) {
211             return null;
212         }
213         return interfaceChildEntryOptional.get();
214     }
215
216     public static void createLportTagInterfaceMap(WriteTransaction t, String infName, Integer ifIndex) {
217         LOG.debug("creating lport tag to interface map for {}",infName);
218         InstanceIdentifier<IfIndexInterface> id = InstanceIdentifier.builder(IfIndexesInterfaceMap.class).child(IfIndexInterface.class, new IfIndexInterfaceKey(ifIndex)).build();
219         IfIndexInterface ifIndexInterface = new IfIndexInterfaceBuilder().setIfIndex(ifIndex).setKey(new IfIndexInterfaceKey(ifIndex)).setInterfaceName(infName).build();
220         t.put(LogicalDatastoreType.OPERATIONAL, id, ifIndexInterface, true);
221     }
222
223     public static void removeLportTagInterfaceMap(IdManagerService idManager, WriteTransaction t, String infName) {
224         // workaround to get the id to remove from lport tag interface map
225         Integer ifIndex = IfmUtil.allocateId(idManager, IfmConstants.IFM_IDPOOL_NAME, infName);
226         IfmUtil.releaseId(idManager, IfmConstants.IFM_IDPOOL_NAME, infName);
227         LOG.debug("removing lport tag to interface map for {}",infName);
228         InstanceIdentifier<IfIndexInterface> id = InstanceIdentifier.builder(IfIndexesInterfaceMap.class).child(IfIndexInterface.class, new IfIndexInterfaceKey(ifIndex)).build();
229         t.delete(LogicalDatastoreType.OPERATIONAL, id);
230     }
231
232     public static void addBridgeRefToBridgeInterfaceEntry(BigInteger dpId, OvsdbBridgeRef ovsdbBridgeRef, WriteTransaction t){
233         BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpId);
234         InstanceIdentifier<BridgeEntry> bridgeEntryInstanceIdentifier = getBridgeEntryIdentifier(bridgeEntryKey);
235
236         BridgeEntryBuilder bridgeEntryBuilder = new BridgeEntryBuilder().setKey(bridgeEntryKey).setBridgeReference(ovsdbBridgeRef);
237         t.merge(LogicalDatastoreType.CONFIGURATION, bridgeEntryInstanceIdentifier, bridgeEntryBuilder.build(), true);
238     }
239
240     public static void createBridgeRefEntry(BigInteger dpnId, InstanceIdentifier<?> bridgeIid,
241                                             WriteTransaction tx){
242         LOG.debug("Creating bridge ref entry for dpn: {} bridge: {}",
243                 dpnId, bridgeIid);
244         BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(dpnId);
245         InstanceIdentifier<BridgeRefEntry> bridgeEntryId =
246                 InterfaceMetaUtils.getBridgeRefEntryIdentifier(bridgeRefEntryKey);
247         BridgeRefEntryBuilder tunnelDpnBridgeEntryBuilder =
248                 new BridgeRefEntryBuilder().setKey(bridgeRefEntryKey).setDpid(dpnId)
249                         .setBridgeReference(new OvsdbBridgeRef(bridgeIid));
250         tx.put(LogicalDatastoreType.OPERATIONAL, bridgeEntryId, tunnelDpnBridgeEntryBuilder.build(), true);
251     }
252     public static void deleteBridgeRefEntry(BigInteger dpnId,
253                                             WriteTransaction tx) {
254         LOG.debug("Deleting bridge ref entry for dpn: {}",
255                 dpnId);
256         BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(dpnId);
257         InstanceIdentifier<BridgeRefEntry> bridgeEntryId =
258                 InterfaceMetaUtils.getBridgeRefEntryIdentifier(bridgeRefEntryKey);
259         tx.delete(LogicalDatastoreType.OPERATIONAL, bridgeEntryId);
260     }
261
262     public static void createTunnelToInterfaceMap(String tunnelInstanceId,
263                                                   String infName,
264                                                   WriteTransaction transaction) {
265         LOG.debug("creating tunnel instance identifier to interface map for {}",infName);
266         InstanceIdentifier<TunnelInstanceInterface> id = InstanceIdentifier.builder(TunnelInstanceInterfaceMap.class).
267                 child(TunnelInstanceInterface.class, new TunnelInstanceInterfaceKey(tunnelInstanceId)).build();
268         TunnelInstanceInterface tunnelInstanceInterface = new TunnelInstanceInterfaceBuilder().
269                 setTunnelInstanceIdentifier(tunnelInstanceId).setKey(new TunnelInstanceInterfaceKey(tunnelInstanceId)).setInterfaceName(infName).build();
270         transaction.put(LogicalDatastoreType.OPERATIONAL, id, tunnelInstanceInterface, true);
271
272     }
273
274     public static void createTunnelToInterfaceMap(String infName,InstanceIdentifier<Node> nodeId,
275                                                   WriteTransaction transaction,
276                                                   IfTunnel ifTunnel){
277         InstanceIdentifier<Tunnels> tunnelsInstanceIdentifier = org.opendaylight.genius.interfacemanager.renderer.hwvtep.utilities.SouthboundUtils.
278                 createTunnelsInstanceIdentifier(nodeId,
279                         ifTunnel.getTunnelSource(), ifTunnel.getTunnelDestination());
280         createTunnelToInterfaceMap(tunnelsInstanceIdentifier.toString(), infName, transaction);
281     }
282
283     public static void removeTunnelToInterfaceMap(InstanceIdentifier<Node> nodeId,
284                                                   WriteTransaction transaction,
285                                                   IfTunnel ifTunnel){
286         InstanceIdentifier<Tunnels> tunnelsInstanceIdentifier = org.opendaylight.genius.interfacemanager.renderer.hwvtep.utilities.SouthboundUtils.
287                 createTunnelsInstanceIdentifier(nodeId,
288                         ifTunnel.getTunnelSource(), ifTunnel.getTunnelDestination());
289         transaction.delete(LogicalDatastoreType.OPERATIONAL, tunnelsInstanceIdentifier);
290     }
291
292     public static String getInterfaceForTunnelInstanceIdentifier(String tunnelInstanceId,
293                                                                  DataBroker dataBroker) {
294         InstanceIdentifier<TunnelInstanceInterface> id = InstanceIdentifier.builder(TunnelInstanceInterfaceMap.class).
295                 child(TunnelInstanceInterface.class, new TunnelInstanceInterfaceKey(tunnelInstanceId)).build();
296         Optional<TunnelInstanceInterface> tunnelInstanceInterfaceOptional = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, id, dataBroker);
297         if(tunnelInstanceInterfaceOptional.isPresent()){
298             return tunnelInstanceInterfaceOptional.get().getInterfaceName();
299         }
300         return null;
301     }
302
303     public static void deleteBridgeInterfaceEntry(BridgeEntryKey bridgeEntryKey, List<BridgeInterfaceEntry> bridgeInterfaceEntries,
304                                                   InstanceIdentifier<BridgeEntry> bridgeEntryIid,
305                                                   WriteTransaction transaction, String interfaceName){
306         BridgeInterfaceEntryKey bridgeInterfaceEntryKey =
307                 new BridgeInterfaceEntryKey(interfaceName);
308         InstanceIdentifier<BridgeInterfaceEntry> bridgeInterfaceEntryIid =
309                 InterfaceMetaUtils.getBridgeInterfaceEntryIdentifier(bridgeEntryKey,
310                         bridgeInterfaceEntryKey);
311         transaction.delete(LogicalDatastoreType.CONFIGURATION, bridgeInterfaceEntryIid);
312
313         if (bridgeInterfaceEntries.size() <= 1) {
314             transaction.delete(LogicalDatastoreType.CONFIGURATION, bridgeEntryIid);
315         }
316     }
317 }