/* * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.vpnservice.interfacemgr.commons; import com.google.common.base.Optional; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.vpnservice.interfacemgr.IfmConstants; import org.opendaylight.vpnservice.interfacemgr.IfmUtil; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.Tunnels; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.*; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterface; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterfaceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterfaceKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info.InterfaceParentEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info.InterfaceParentEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info._interface.parent.entry.InterfaceChildEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info._interface.parent.entry.InterfaceChildEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntryBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntryBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.tunnel.instance._interface.map.TunnelInstanceInterface; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.tunnel.instance._interface.map.TunnelInstanceInterfaceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.tunnel.instance._interface.map.TunnelInstanceInterfaceKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.ParentRefs; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.math.BigInteger; public class InterfaceMetaUtils { private static final Logger LOG = LoggerFactory.getLogger(InterfaceMetaUtils.class); public static InstanceIdentifier getBridgeRefEntryIdentifier(BridgeRefEntryKey bridgeRefEntryKey) { InstanceIdentifier.InstanceIdentifierBuilder bridgeRefEntryInstanceIdentifierBuilder = InstanceIdentifier.builder(BridgeRefInfo.class) .child(BridgeRefEntry.class, bridgeRefEntryKey); return bridgeRefEntryInstanceIdentifierBuilder.build(); } public static BridgeRefEntry getBridgeRefEntryFromOperDS(InstanceIdentifier dpnBridgeEntryIid, DataBroker dataBroker) { Optional bridgeRefEntryOptional = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, dpnBridgeEntryIid, dataBroker); if (!bridgeRefEntryOptional.isPresent()) { return null; } return bridgeRefEntryOptional.get(); } public static BridgeRefEntry getBridgeReferenceForInterface(Interface interfaceInfo, DataBroker dataBroker) { ParentRefs parentRefs = interfaceInfo.getAugmentation(ParentRefs.class); BigInteger dpn = parentRefs.getDatapathNodeIdentifier(); BridgeRefEntryKey BridgeRefEntryKey = new BridgeRefEntryKey(dpn); InstanceIdentifier dpnBridgeEntryIid = getBridgeRefEntryIdentifier(BridgeRefEntryKey); BridgeRefEntry bridgeRefEntry = getBridgeRefEntryFromOperDS(dpnBridgeEntryIid, dataBroker); return bridgeRefEntry; } public static boolean bridgeExists(BridgeRefEntry bridgeRefEntry, DataBroker dataBroker) { if (bridgeRefEntry != null && bridgeRefEntry.getBridgeReference() != null) { InstanceIdentifier bridgeIid = (InstanceIdentifier) bridgeRefEntry.getBridgeReference().getValue(); Optional bridgeNodeOptional = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, bridgeIid, dataBroker); if (bridgeNodeOptional.isPresent()) { return true; } } return false; } public static InstanceIdentifier getBridgeEntryIdentifier(BridgeEntryKey bridgeEntryKey) { InstanceIdentifier.InstanceIdentifierBuilder bridgeEntryIdBuilder = InstanceIdentifier.builder(BridgeInterfaceInfo.class).child(BridgeEntry.class, bridgeEntryKey); return bridgeEntryIdBuilder.build(); } public static BridgeEntry getBridgeEntryFromConfigDS(BigInteger dpnId, DataBroker dataBroker) { BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpnId); InstanceIdentifier bridgeEntryInstanceIdentifier = InterfaceMetaUtils.getBridgeEntryIdentifier(bridgeEntryKey); LOG.debug("Trying to retrieve bridge entry from config for Id: {}", bridgeEntryInstanceIdentifier); return getBridgeEntryFromConfigDS(bridgeEntryInstanceIdentifier, dataBroker); } public static BridgeEntry getBridgeEntryFromConfigDS(InstanceIdentifier bridgeEntryInstanceIdentifier, DataBroker dataBroker) { Optional bridgeEntryOptional = IfmUtil.read(LogicalDatastoreType.CONFIGURATION, bridgeEntryInstanceIdentifier, dataBroker); if (!bridgeEntryOptional.isPresent()) { return null; } return bridgeEntryOptional.get(); } public static InstanceIdentifier getBridgeInterfaceEntryIdentifier(BridgeEntryKey bridgeEntryKey, BridgeInterfaceEntryKey bridgeInterfaceEntryKey) { return InstanceIdentifier.builder(BridgeInterfaceInfo.class) .child(BridgeEntry.class, bridgeEntryKey) .child(BridgeInterfaceEntry.class, bridgeInterfaceEntryKey).build(); } public static void createBridgeInterfaceEntryInConfigDS(BridgeEntryKey bridgeEntryKey, BridgeInterfaceEntryKey bridgeInterfaceEntryKey, String childInterface, WriteTransaction t) { InstanceIdentifier bridgeInterfaceEntryIid = InterfaceMetaUtils.getBridgeInterfaceEntryIdentifier(bridgeEntryKey, bridgeInterfaceEntryKey); BridgeInterfaceEntryBuilder entryBuilder = new BridgeInterfaceEntryBuilder().setKey(bridgeInterfaceEntryKey) .setInterfaceName(childInterface); t.put(LogicalDatastoreType.CONFIGURATION, bridgeInterfaceEntryIid, entryBuilder.build(), true); } public static InstanceIdentifier getInterfaceParentEntryIdentifier( InterfaceParentEntryKey interfaceParentEntryKey) { InstanceIdentifier.InstanceIdentifierBuilder intfIdBuilder = InstanceIdentifier.builder(InterfaceChildInfo.class) .child(InterfaceParentEntry.class, interfaceParentEntryKey); return intfIdBuilder.build(); } public static InstanceIdentifier getInterfaceChildEntryIdentifier( InterfaceParentEntryKey interfaceParentEntryKey, InterfaceChildEntryKey interfaceChildEntryKey) { InstanceIdentifier.InstanceIdentifierBuilder intfIdBuilder = InstanceIdentifier.builder(InterfaceChildInfo.class) .child(InterfaceParentEntry.class, interfaceParentEntryKey) .child(InterfaceChildEntry.class, interfaceChildEntryKey); return intfIdBuilder.build(); } public static InterfaceParentEntry getInterfaceParentEntryFromConfigDS( String interfaceName, DataBroker dataBroker) { InterfaceParentEntryKey interfaceParentEntryKey = new InterfaceParentEntryKey(interfaceName); InterfaceParentEntry interfaceParentEntry = InterfaceMetaUtils.getInterfaceParentEntryFromConfigDS(interfaceParentEntryKey, dataBroker); return interfaceParentEntry; } public static InterfaceParentEntry getInterfaceParentEntryFromConfigDS( InterfaceParentEntryKey interfaceParentEntryKey, DataBroker dataBroker) { InstanceIdentifier intfParentIid = getInterfaceParentEntryIdentifier(interfaceParentEntryKey); return getInterfaceParentEntryFromConfigDS(intfParentIid, dataBroker); } public static InterfaceParentEntry getInterfaceParentEntryFromConfigDS( InstanceIdentifier intfId, DataBroker dataBroker) { Optional interfaceParentEntryOptional = IfmUtil.read(LogicalDatastoreType.CONFIGURATION, intfId, dataBroker); if (!interfaceParentEntryOptional.isPresent()) { return null; } return interfaceParentEntryOptional.get(); } public static InterfaceChildEntry getInterfaceChildEntryFromConfigDS(InterfaceParentEntryKey interfaceParentEntryKey, InterfaceChildEntryKey interfaceChildEntryKey, DataBroker dataBroker) { InstanceIdentifier intfChildIid = getInterfaceChildEntryIdentifier(interfaceParentEntryKey, interfaceChildEntryKey); return getInterfaceChildEntryFromConfigDS(intfChildIid, dataBroker); } public static InterfaceChildEntry getInterfaceChildEntryFromConfigDS( InstanceIdentifier intfChildIid, DataBroker dataBroker) { Optional interfaceChildEntryOptional = IfmUtil.read(LogicalDatastoreType.CONFIGURATION, intfChildIid, dataBroker); if (!interfaceChildEntryOptional.isPresent()) { return null; } return interfaceChildEntryOptional.get(); } public static void createLportTagInterfaceMap(WriteTransaction t, String infName, Integer ifIndex) { LOG.debug("creating lport tag to interface map for {}",infName); InstanceIdentifier id = InstanceIdentifier.builder(IfIndexesInterfaceMap.class).child(IfIndexInterface.class, new IfIndexInterfaceKey(ifIndex)).build(); IfIndexInterface ifIndexInterface = new IfIndexInterfaceBuilder().setIfIndex(ifIndex).setKey(new IfIndexInterfaceKey(ifIndex)).setInterfaceName(infName).build(); t.put(LogicalDatastoreType.OPERATIONAL, id, ifIndexInterface, true); } public static void createBridgeRefEntry(BigInteger dpnId, InstanceIdentifier bridgeIid, WriteTransaction tx){ LOG.debug("Creating bridge ref entry for dpn: {} bridge: {}", dpnId, bridgeIid); BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(dpnId); InstanceIdentifier bridgeEntryId = InterfaceMetaUtils.getBridgeRefEntryIdentifier(bridgeRefEntryKey); BridgeRefEntryBuilder tunnelDpnBridgeEntryBuilder = new BridgeRefEntryBuilder().setKey(bridgeRefEntryKey).setDpid(dpnId) .setBridgeReference(new OvsdbBridgeRef(bridgeIid)); tx.put(LogicalDatastoreType.OPERATIONAL, bridgeEntryId, tunnelDpnBridgeEntryBuilder.build(), true); } public static void deleteBridgeRefEntry(BigInteger dpnId, WriteTransaction tx) { LOG.debug("Deleting bridge ref entry for dpn: {}", dpnId); BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(dpnId); InstanceIdentifier bridgeEntryId = InterfaceMetaUtils.getBridgeRefEntryIdentifier(bridgeRefEntryKey); tx.delete(LogicalDatastoreType.OPERATIONAL, bridgeEntryId); } public static void createTunnelToInterfaceMap(String tunnelInstanceId, String infName, WriteTransaction transaction) { LOG.debug("creating tunnel instance identifier to interface map for {}",infName); InstanceIdentifier id = InstanceIdentifier.builder(TunnelInstanceInterfaceMap.class). child(TunnelInstanceInterface.class, new TunnelInstanceInterfaceKey(tunnelInstanceId)).build(); TunnelInstanceInterface tunnelInstanceInterface = new TunnelInstanceInterfaceBuilder(). setTunnelInstanceIdentifier(tunnelInstanceId).setKey(new TunnelInstanceInterfaceKey(tunnelInstanceId)).setInterfaceName(infName).build(); transaction.put(LogicalDatastoreType.OPERATIONAL, id, tunnelInstanceInterface, true); } public static void createTunnelToInterfaceMap(String infName,InstanceIdentifier nodeId, WriteTransaction transaction, IfTunnel ifTunnel){ InstanceIdentifier tunnelsInstanceIdentifier = org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.utilities.SouthboundUtils. createTunnelsInstanceIdentifier(nodeId, ifTunnel.getTunnelSource(), ifTunnel.getTunnelDestination()); createTunnelToInterfaceMap(tunnelsInstanceIdentifier.toString(), infName, transaction); } public static void removeTunnelToInterfaceMap(InstanceIdentifier nodeId, WriteTransaction transaction, IfTunnel ifTunnel){ InstanceIdentifier tunnelsInstanceIdentifier = org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.utilities.SouthboundUtils. createTunnelsInstanceIdentifier(nodeId, ifTunnel.getTunnelSource(), ifTunnel.getTunnelDestination()); transaction.delete(LogicalDatastoreType.OPERATIONAL, tunnelsInstanceIdentifier); } public static String getInterfaceForTunnelInstanceIdentifier(String tunnelInstanceId, DataBroker dataBroker) { InstanceIdentifier id = InstanceIdentifier.builder(TunnelInstanceInterfaceMap.class). child(TunnelInstanceInterface.class, new TunnelInstanceInterfaceKey(tunnelInstanceId)).build(); Optional tunnelInstanceInterfaceOptional = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, id, dataBroker); if(tunnelInstanceInterfaceOptional.isPresent()){ return tunnelInstanceInterfaceOptional.get().getInterfaceName(); } return null; } }