X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=interfacemgr%2Finterfacemgr-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fvpnservice%2Finterfacemgr%2Frenderer%2Fovs%2Fconfighelpers%2FOvsInterfaceConfigAddHelper.java;h=6e5d6bd0d36b38b43c4bb3c52ca0dc3b4c74ed58;hb=HEAD;hp=17d4cf6b090bd0130b2e8a4641bec0a112b7c2a5;hpb=9f4df02dabc7024ddf94562f7f3e997717fd80b4;p=vpnservice.git diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java index 17d4cf6b..6e5d6bd0 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others. All rights reserved. + * 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, @@ -7,31 +7,28 @@ */ package org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers; -import com.google.common.base.Optional; -import com.google.common.util.concurrent.ListenableFuture; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; + 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.idmanager.IdManager; -import org.opendaylight.vpnservice.interfacemgr.IfmConstants; import org.opendaylight.vpnservice.interfacemgr.IfmUtil; +import org.opendaylight.vpnservice.interfacemgr.commons.AlivenessMonitorUtils; import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceManagerCommonUtils; import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceMetaUtils; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.utilities.SouthboundUtils; +import org.opendaylight.vpnservice.mdsalutil.NwConstants; +import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.AlivenessMonitorService; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; 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.bridge._interface.info.BridgeEntry; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntryBuilder; 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.BridgeInterfaceEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntry; @@ -39,94 +36,80 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.met import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan; 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.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.List; +import com.google.common.base.Optional; +import com.google.common.util.concurrent.ListenableFuture; public class OvsInterfaceConfigAddHelper { private static final Logger LOG = LoggerFactory.getLogger(OvsInterfaceConfigAddHelper.class); public static List> addConfiguration(DataBroker dataBroker, ParentRefs parentRefs, - Interface interfaceNew, IdManagerService idManager) { + Interface interfaceNew, IdManagerService idManager, + AlivenessMonitorService alivenessMonitorService, + IMdsalApiManager mdsalApiManager) { List> futures = new ArrayList<>(); IfTunnel ifTunnel = interfaceNew.getAugmentation(IfTunnel.class); if (ifTunnel != null) { - addTunnelConfiguration(dataBroker, parentRefs, interfaceNew, idManager, futures); + addTunnelConfiguration(dataBroker, parentRefs, interfaceNew, idManager, alivenessMonitorService, + mdsalApiManager, futures); return futures; } - addVlanConfiguration(interfaceNew, dataBroker, idManager, futures); + addVlanConfiguration(interfaceNew, parentRefs, dataBroker, idManager, futures); return futures; } - private static void addVlanConfiguration(Interface interfaceNew, DataBroker dataBroker, IdManagerService idManager, + private static void addVlanConfiguration(Interface interfaceNew, ParentRefs parentRefs, DataBroker dataBroker, IdManagerService idManager, List> futures) { - WriteTransaction t = dataBroker.newWriteOnlyTransaction(); + IfL2vlan ifL2vlan = interfaceNew.getAugmentation(IfL2vlan.class); + if (ifL2vlan == null || (IfL2vlan.L2vlanMode.Trunk != ifL2vlan.getL2vlanMode() && IfL2vlan.L2vlanMode.Transparent != ifL2vlan.getL2vlanMode())) { + return; + } + WriteTransaction transaction = dataBroker.newWriteOnlyTransaction(); + if(!InterfaceManagerCommonUtils.createInterfaceChildEntryIfNotPresent(dataBroker, transaction, + parentRefs.getParentInterface(), interfaceNew.getName())){ + return; + } + LOG.debug("adding vlan configuration for {}",interfaceNew.getName()); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = - InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(interfaceNew.getName(), dataBroker); + InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(parentRefs.getParentInterface(), dataBroker); if (ifState == null) { + LOG.debug("could not retrieve interface state corresponding to {}",interfaceNew.getName()); + futures.add(transaction.submit()); return; } - updateStateEntry(interfaceNew, ifState.getIfIndex(), t, ifState); - IfL2vlan ifL2vlan = interfaceNew.getAugmentation(IfL2vlan.class); - if (ifL2vlan == null || ifL2vlan.getL2vlanMode() != IfL2vlan.L2vlanMode.Trunk) { - return; - } + InterfaceManagerCommonUtils.addStateEntry(interfaceNew.getName(), transaction, dataBroker, idManager, ifState); InterfaceParentEntryKey interfaceParentEntryKey = new InterfaceParentEntryKey(interfaceNew.getName()); InterfaceParentEntry interfaceParentEntry = InterfaceMetaUtils.getInterfaceParentEntryFromConfigDS(interfaceParentEntryKey, dataBroker); - if (interfaceParentEntry == null) { + if (interfaceParentEntry == null || interfaceParentEntry.getInterfaceChildEntry() == null) { + LOG.debug("could not retrieve interface parent info for {}",interfaceNew.getName()); + futures.add(transaction.submit()); return; } - List interfaceChildEntries = interfaceParentEntry.getInterfaceChildEntry(); - if (interfaceChildEntries == null) { - return; - } - - OperStatus operStatus = ifState.getOperStatus(); - PhysAddress physAddress = ifState.getPhysAddress(); - AdminStatus adminStatus = ifState.getAdminStatus(); - NodeConnectorId nodeConnectorId = new NodeConnectorId(ifState.getLowerLayerIf().get(0)); - //FIXME: If the no. of child entries exceeds 100, perform txn updates in batches of 100. - for (InterfaceChildEntry interfaceChildEntry : interfaceChildEntries) { - InterfaceKey childIfKey = new InterfaceKey(interfaceChildEntry.getChildInterface()); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface ifaceChild = - InterfaceManagerCommonUtils.getInterfaceFromConfigDS(childIfKey, dataBroker); - - if (!ifaceChild.isEnabled()) { - operStatus = OperStatus.Down; - } - - InstanceIdentifier ifChildStateId = - IfmUtil.buildStateInterfaceId(ifaceChild.getName()); - List childLowerLayerIfList = new ArrayList<>(); - childLowerLayerIfList.add(0, nodeConnectorId.getValue()); - childLowerLayerIfList.add(1, interfaceNew.getName()); - InterfaceBuilder childIfaceBuilder = new InterfaceBuilder().setAdminStatus(adminStatus) - .setOperStatus(operStatus).setPhysAddress(physAddress).setLowerLayerIf(childLowerLayerIfList); - childIfaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(ifaceChild.getName())); - t.put(LogicalDatastoreType.OPERATIONAL, ifChildStateId, childIfaceBuilder.build(), true); + for (InterfaceChildEntry interfaceChildEntry : interfaceParentEntry.getInterfaceChildEntry()) { + InterfaceManagerCommonUtils.addStateEntry(interfaceChildEntry.getChildInterface(), transaction, dataBroker, idManager,ifState); } - futures.add(t.submit()); + futures.add(transaction.submit()); } private static void addTunnelConfiguration(DataBroker dataBroker, ParentRefs parentRefs, - Interface interfaceNew, IdManagerService idManager, - List> futures) { + Interface interfaceNew, IdManagerService idManager, + AlivenessMonitorService alivenessMonitorService, + IMdsalApiManager mdsalApiManager, + List> futures) { LOG.debug("adding tunnel configuration for {}", interfaceNew.getName()); - WriteTransaction t = dataBroker.newWriteOnlyTransaction(); + WriteTransaction transaction = dataBroker.newWriteOnlyTransaction(); if (parentRefs == null) { LOG.warn("ParentRefs for interface: {} Not Found. " + "Creation of Tunnel OF-Port not supported when dpid not provided.", interfaceNew.getName()); @@ -140,15 +123,13 @@ public class OvsInterfaceConfigAddHelper { return; } - //createBridgeEntryIfNotPresent(dpId, dataBroker, t); - BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpId); BridgeInterfaceEntryKey bridgeInterfaceEntryKey = new BridgeInterfaceEntryKey(interfaceNew.getName()); LOG.debug("creating bridge interfaceEntry in ConfigDS {}", bridgeEntryKey); InterfaceMetaUtils.createBridgeInterfaceEntryInConfigDS(bridgeEntryKey, bridgeInterfaceEntryKey, - interfaceNew.getName(), t); - futures.add(t.submit()); + interfaceNew.getName(), transaction); + futures.add(transaction.submit()); // create bridge on switch, if switch is connected BridgeRefEntryKey BridgeRefEntryKey = new BridgeRefEntryKey(dpId); @@ -167,20 +148,21 @@ public class OvsInterfaceConfigAddHelper { String bridgeName = ovsdbBridgeAugmentation.getBridgeName().getValue(); SouthboundUtils.addPortToBridge(bridgeIid, interfaceNew, ovsdbBridgeAugmentation, bridgeName, interfaceNew.getName(), dataBroker, futures); - } - } - } - private static void updateStateEntry(Interface interfaceNew, Integer ifIndex, WriteTransaction t, - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState) { - InstanceIdentifier ifStateId = - IfmUtil.buildStateInterfaceId(interfaceNew.getName()); - InterfaceBuilder ifaceBuilder = new InterfaceBuilder(); - if (!interfaceNew.isEnabled() && ifState.getOperStatus() != OperStatus.Down) { - ifaceBuilder.setOperStatus(OperStatus.Down); + // if TEP is already configured on switch, start LLDP monitoring and program tunnel ingress flow + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = + InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(interfaceNew.getName(), dataBroker); + if(ifState != null){ + NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(ifState); + if(ncId != null) { + long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(ncId)); + InterfaceManagerCommonUtils.makeTunnelIngressFlow(futures, mdsalApiManager, interfaceNew.getAugmentation(IfTunnel.class), + dpId, portNo, interfaceNew, ifState.getIfIndex(), NwConstants.ADD_FLOW); + // start LLDP monitoring for the tunnel interface + AlivenessMonitorUtils.startLLDPMonitoring(alivenessMonitorService, dataBroker, interfaceNew); + } + } + } } - ifaceBuilder.setIfIndex(ifIndex); - ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(interfaceNew.getName())); - t.merge(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build()); } }