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