From bc9a454112d4456fe65538bb887b3c0be0e3b5bc Mon Sep 17 00:00:00 2001 From: Kiran N Upadhyaya Date: Fri, 29 Apr 2016 16:20:56 +0530 Subject: [PATCH] Fixes in interface manager and aliveness monitor Removing HwVTEP tunnel entries from topology configuration and operational datastores cli command to display internal tunnels is fixed to show the interface name along with the datapath node identifier A check has been add to update interface operational state only of it exists in the datastore Tunnel to DC gateway should not have key "flow" set Tap interface not getting deleted from interface operational datastore is fixed Interface operational status has been handled to get updated based on port up/down events Repopulation of monitor configuration after re-enabling tunnel monitor has been fixed Optimizations in aliveness monitor error handling code Change-Id: I19f0ec5fb0133575e6e08a741f3f0f9c4b805ba7 Signed-off-by: Faseela K Signed-off-by: Kiran N Upadhyaya --- .../ElanInterfaceStateChangeListener.java | 2 +- .../interfacemgr/InterfacemgrProvider.java | 4 +- .../commons/AlivenessMonitorUtils.java | 28 ++- .../commons/InterfaceManagerCommonUtils.java | 28 ++- .../commons/InterfaceMetaUtils.java | 29 +-- .../listeners/AlivenessMonitorListener.java | 20 +- .../listeners/HwVTEPTunnelsStateListener.java | 34 +++- .../InterfaceInventoryStateListener.java | 6 +- .../TerminationPointStateListener.java | 7 +- .../HwVTEPInterfaceStateRemoveHelper.java | 34 ++++ .../hwvtep/utilities/SouthboundUtils.java | 22 --- .../OvsVlanMemberConfigAddHelper.java | 31 +-- .../OvsInterfaceStateRemoveHelper.java | 6 +- .../OvsInterfaceStateUpdateHelper.java | 183 ++++++++++-------- .../OvsInterfaceTopologyStateAddHelper.java | 3 - ...OvsInterfaceTopologyStateRemoveHelper.java | 7 - ...OvsInterfaceTopologyStateUpdateHelper.java | 8 +- .../ovs/utilities/SouthboundUtils.java | 44 +---- .../test/HwVTEPConfigurationTest.java | 11 ++ .../test/InterfaceManagerTestUtil.java | 25 ++- .../interfacemgr/test/StateInterfaceTest.java | 47 ++--- .../test/TopologyStateInterfaceTest.java | 11 +- .../interfacemgr/shell/IfmCLIUtil.java | 2 +- 23 files changed, 293 insertions(+), 299 deletions(-) create mode 100644 interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/hwvtep/statehelpers/HwVTEPInterfaceStateRemoveHelper.java diff --git a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceStateChangeListener.java b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceStateChangeListener.java index 470f6237..80da7236 100644 --- a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceStateChangeListener.java +++ b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceStateChangeListener.java @@ -107,7 +107,7 @@ public class ElanInterfaceStateChangeListener extends AbstractDataChangeListener protected void update(InstanceIdentifier identifier, Interface original, Interface update) { logger.trace("Operation Interface update event - Old: {}, New: {}", original, update); String interfaceName = update.getName(); - if(update.getType().equals(Tunnel.class)) { + if(update.getType() != null && update.getType().equals(Tunnel.class)) { if (update.getOperStatus().equals(Interface.OperStatus.Up)) { InternalTunnel internalTunnel = getTunnelState(interfaceName); if (internalTunnel != null) { diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java index 4cc72503..b34fe1ba 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java @@ -138,8 +138,8 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable hwVTEPTunnelsStateListener = new HwVTEPTunnelsStateListener(dataBroker); hwVTEPTunnelsStateListener.registerListener(LogicalDatastoreType.OPERATIONAL,dataBroker); - //terminationPointStateListener = new TerminationPointStateListener(dataBroker); - //terminationPointStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker); + terminationPointStateListener = new TerminationPointStateListener(dataBroker); + terminationPointStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker); flowBasedServicesConfigListener = new FlowBasedServicesConfigListener(dataBroker); flowBasedServicesConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker); diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/AlivenessMonitorUtils.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/AlivenessMonitorUtils.java index 36d26ff9..c0578da2 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/AlivenessMonitorUtils.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/AlivenessMonitorUtils.java @@ -81,6 +81,7 @@ public class AlivenessMonitorUtils { if(!(ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)&& ifTunnel.isInternal())){ return; } + LOG.debug("stop LLDP monitoring for {}", trunkInterface.getName()); List monitorIds = getMonitorIdForInterface(dataBroker, trunkInterface.getName()); if (monitorIds == null) { LOG.error("Monitor Id doesn't exist for Interface {}", trunkInterface); @@ -144,23 +145,20 @@ public class AlivenessMonitorUtils { return; } LOG.debug("handling tunnel monitoring updates for interface {}", interfaceName); - // Restart LLDP monitoring only if it's started already - List monitorIds = getMonitorIdForInterface(dataBroker, interfaceName); - if (monitorIds != null && !monitorIds.isEmpty()) { - stopLLDPMonitoring(alivenessMonitorService, dataBroker, interfaceOld); - if(ifTunnelNew.isMonitorEnabled()) { - startLLDPMonitoring(alivenessMonitorService, dataBroker, interfaceNew); - // Delete old profile from Aliveness Manager - IfTunnel ifTunnelOld = interfaceOld.getAugmentation(IfTunnel.class); - if(ifTunnelNew.getMonitorInterval() != ifTunnelOld.getMonitorInterval()) { - LOG.debug("deleting older monitor profile for interface {}", interfaceName); - long profileId = allocateProfile(alivenessMonitorService, FAILURE_THRESHOLD, ifTunnelOld.getMonitorInterval(), MONITORING_WINDOW, EtherTypes.Lldp); - MonitorProfileDeleteInput profileDeleteInput = new MonitorProfileDeleteInputBuilder().setProfileId(profileId).build(); - alivenessMonitorService.monitorProfileDelete(profileDeleteInput); - } - } + stopLLDPMonitoring(alivenessMonitorService, dataBroker, interfaceOld); + if(ifTunnelNew.isMonitorEnabled()) { + startLLDPMonitoring(alivenessMonitorService, dataBroker, interfaceNew); + + // Delete old profile from Aliveness Manager + IfTunnel ifTunnelOld = interfaceOld.getAugmentation(IfTunnel.class); + if(ifTunnelNew.getMonitorInterval() != ifTunnelOld.getMonitorInterval()) { + LOG.debug("deleting older monitor profile for interface {}", interfaceName); + long profileId = allocateProfile(alivenessMonitorService, FAILURE_THRESHOLD, ifTunnelOld.getMonitorInterval(), MONITORING_WINDOW, EtherTypes.Lldp); + MonitorProfileDeleteInput profileDeleteInput = new MonitorProfileDeleteInputBuilder().setProfileId(profileId).build(); + alivenessMonitorService.monitorProfileDelete(profileDeleteInput); } + } } diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceManagerCommonUtils.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceManagerCommonUtils.java index bb9d5d14..c1e38935 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceManagerCommonUtils.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceManagerCommonUtils.java @@ -99,6 +99,12 @@ public class InterfaceManagerCommonUtils { } return vxlanList; } + + public static Interface getInterfaceFromConfigDS(String interfaceName, DataBroker dataBroker) { + InterfaceKey interfaceKey = new InterfaceKey(interfaceName); + return getInterfaceFromConfigDS(interfaceKey, dataBroker); + } + public static Interface getInterfaceFromConfigDS(InterfaceKey interfaceKey, DataBroker dataBroker) { InstanceIdentifier interfaceId = getInterfaceIdentifier(interfaceKey); Optional interfaceOptional = IfmUtil.read(LogicalDatastoreType.CONFIGURATION, interfaceId, dataBroker); @@ -112,6 +118,11 @@ public class InterfaceManagerCommonUtils { public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface getInterfaceStateFromOperDS(String interfaceName, DataBroker dataBroker) { InstanceIdentifier ifStateId = IfmUtil.buildStateInterfaceId(interfaceName); + return getInterfaceStateFromOperDS(ifStateId, dataBroker); + } + + public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface getInterfaceStateFromOperDS + (InstanceIdentifier ifStateId, DataBroker dataBroker) { Optional ifStateOptional = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, ifStateId, dataBroker); if (!ifStateOptional.isPresent()) { @@ -158,19 +169,6 @@ public class InterfaceManagerCommonUtils { MDSALUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, interfaceId, interfaceData); } - public static void updateTunnelMonitorDetailsInConfigDS(DataBroker broker, String interfaceName, boolean monitorEnabled, long monitorInterval) { - InstanceIdentifier id = IfmUtil.buildId(interfaceName); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder(); - ifaceBuilder.setKey(new InterfaceKey(interfaceName)); - IfTunnelBuilder ifTunnelBuilder = new IfTunnelBuilder(); - ifTunnelBuilder.setMonitorEnabled(monitorEnabled); - ifTunnelBuilder.setMonitorInterval(monitorInterval); - ifaceBuilder.addAugmentation(IfTunnel.class, ifTunnelBuilder.build()); - - LOG.trace("Updating trunk interface {} in Config DS", interfaceName); - MDSALUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, id, ifaceBuilder.build()); - } - public static void createInterfaceChildEntry( WriteTransaction t, String parentInterface, String childInterface){ InterfaceParentEntryKey interfaceParentEntryKey = new InterfaceParentEntryKey(parentInterface); @@ -257,7 +255,7 @@ public class InterfaceManagerCommonUtils { // install ingress flow BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId)); long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId)); - if(interfaceInfo.isEnabled() && ifState.getOperStatus() == org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Up) { + if(interfaceInfo != null && interfaceInfo.isEnabled() && ifState.getOperStatus() == org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Up) { List matches = FlowBasedServicesUtils.getMatchInfoForVlanPortAtIngressTable(dpId, portNo, interfaceInfo); FlowBasedServicesUtils.installVlanFlow(dpId, portNo, interfaceInfo, transaction, matches, ifIndex); } @@ -360,9 +358,9 @@ public class InterfaceManagerCommonUtils { */ public static void updateOpState(WriteTransaction transaction, String interfaceName, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus operStatus){ - LOG.debug("updating tep interface state for {}", interfaceName); InstanceIdentifier ifStateId = IfmUtil.buildStateInterfaceId(interfaceName); + LOG.debug("updating tep interface state as {} for {}", operStatus.name(), interfaceName); InterfaceBuilder ifaceBuilder = new InterfaceBuilder().setOperStatus(operStatus); ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(interfaceName)); transaction.merge(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build()); diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceMetaUtils.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceMetaUtils.java index 09e9868f..82ff6cfb 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceMetaUtils.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceMetaUtils.java @@ -122,17 +122,6 @@ public class InterfaceMetaUtils { } - public static BridgeInterfaceEntry getBridgeInterfaceEntryFromConfigDS( - InstanceIdentifier bridgeInterfaceEntryInstanceIdentifier, DataBroker dataBroker) { - Optional bridgeInterfaceEntryOptional = - IfmUtil.read(LogicalDatastoreType.CONFIGURATION, bridgeInterfaceEntryInstanceIdentifier, dataBroker); - if (!bridgeInterfaceEntryOptional.isPresent()) { - return null; - } - return bridgeInterfaceEntryOptional.get(); - } - - public static void createBridgeInterfaceEntryInConfigDS(BridgeEntryKey bridgeEntryKey, BridgeInterfaceEntryKey bridgeInterfaceEntryKey, String childInterface, @@ -161,6 +150,14 @@ public class InterfaceMetaUtils { 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 = @@ -205,16 +202,6 @@ public class InterfaceMetaUtils { t.put(LogicalDatastoreType.OPERATIONAL, id, ifIndexInterface, true); } - public static void removeLportTagInterfaceMap(WriteTransaction t, IdManagerService idManager, DataBroker broker, String infName, Integer ifIndex) { - InstanceIdentifier id = InstanceIdentifier.builder(IfIndexesInterfaceMap.class).child(IfIndexInterface.class, new IfIndexInterfaceKey(ifIndex)).build(); - Optional ifIndexesInterface = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, id, broker); - if(ifIndexesInterface.isPresent()) { - LOG.debug("removing lport tag to interface map for {}",infName); - t.delete(LogicalDatastoreType.OPERATIONAL, id); - } - IfmUtil.releaseId(idManager, IfmConstants.IFM_IDPOOL_NAME, infName); - } - public static void createBridgeRefEntry(BigInteger dpnId, InstanceIdentifier bridgeIid, WriteTransaction tx){ LOG.debug("Creating bridge ref entry for dpn: {} bridge: {}", diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/AlivenessMonitorListener.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/AlivenessMonitorListener.java index 9f8b84cc..e7ddbab9 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/AlivenessMonitorListener.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/AlivenessMonitorListener.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, @@ -52,23 +52,17 @@ public class AlivenessMonitorListener implements org.opendaylight.yang.gen.v1.ur @Override public void onMonitorEvent(MonitorEvent notification) { Long monitorId = notification.getEventData().getMonitorId(); - String trunkInterfaceName = AlivenessMonitorUtils.getInterfaceFromMonitorId(dataBroker, monitorId); - if (trunkInterfaceName == null) { - LOG.debug("Either monitoring for interface - {} not started by Interfacemgr or it is not LLDP monitoring", trunkInterfaceName); + String tunnelInterface = AlivenessMonitorUtils.getInterfaceFromMonitorId(dataBroker, monitorId); + if (tunnelInterface == null) { + LOG.debug("Either monitoring for interface - {} not started by Interfacemgr or it is not LLDP monitoring", tunnelInterface); return; } LivenessState livenessState = notification.getEventData().getMonitorState(); - Interface interfaceInfo = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(new InterfaceKey(trunkInterfaceName), - dataBroker); - IfTunnel tunnelInfo = interfaceInfo.getAugmentation(IfTunnel.class); - // Not handling monitoring event if it is GRE Trunk Interface. - if (tunnelInfo.getTunnelInterfaceType().isAssignableFrom(TunnelTypeGre.class)) { - return; - } + LOG.debug("received monitor event for {} with livenessstate {}", tunnelInterface, livenessState); org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus opState = livenessState == LivenessState.Up ? org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Up : org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Down; - InterfaceManagerCommonUtils.setOpStateForInterface(dataBroker, trunkInterfaceName, opState); + InterfaceManagerCommonUtils.setOpStateForInterface(dataBroker, tunnelInterface, opState); } -} \ No newline at end of file +} diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/HwVTEPTunnelsStateListener.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/HwVTEPTunnelsStateListener.java index 99f6a802..4bec4051 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/HwVTEPTunnelsStateListener.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/HwVTEPTunnelsStateListener.java @@ -13,6 +13,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker; import org.opendaylight.vpnservice.datastoreutils.AsyncDataChangeListenerBase; import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator; +import org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.statehelpers.HwVTEPInterfaceStateRemoveHelper; import org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.statehelpers.HwVTEPInterfaceStateUpdateHelper; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.Tunnels; @@ -52,15 +53,18 @@ public class HwVTEPTunnelsStateListener extends AsyncDataChangeListenerBase identifier, Tunnels tunnelOld) { - LOG.info("Received Remove DataChange Notification for identifier: {}, physicalSwitchAugmentation: {}", - identifier, tunnelOld); + protected void remove(InstanceIdentifier identifier, Tunnels tunnel) { + LOG.debug("Received Remove DataChange Notification for identifier: {}, physicalSwitchAugmentation: {}", + identifier, tunnel); + DataStoreJobCoordinator jobCoordinator = DataStoreJobCoordinator.getInstance(); + RendererStateRemoveWorker rendererStateRemoveWorker = new RendererStateRemoveWorker(identifier, tunnel); + jobCoordinator.enqueueJob(tunnel.getTunnelUuid().getValue(), rendererStateRemoveWorker); } @Override protected void update(InstanceIdentifier identifier, Tunnels tunnelOld, Tunnels tunnelNew) { - LOG.info("Received Update Tunnel Update Notification for identifier: {}", identifier); + LOG.debug("Received Update Tunnel Update Notification for identifier: {}", identifier); DataStoreJobCoordinator jobCoordinator = DataStoreJobCoordinator.getInstance(); RendererStateUpdateWorker rendererStateUpdateWorker = new RendererStateUpdateWorker(identifier, tunnelNew, tunnelOld); jobCoordinator.enqueueJob(tunnelNew.getTunnelUuid().getValue(), rendererStateUpdateWorker); @@ -68,7 +72,7 @@ public class HwVTEPTunnelsStateListener extends AsyncDataChangeListenerBase identifier, Tunnels tunnelNew) { - LOG.info("Received Add DataChange Notification for identifier: {}, tunnels: {}", + LOG.debug("Received Add DataChange Notification for identifier: {}, tunnels: {}", identifier, tunnelNew); DataStoreJobCoordinator jobCoordinator = DataStoreJobCoordinator.getInstance(); RendererStateAddWorker rendererStateAddWorker = new RendererStateAddWorker(identifier, tunnelNew); @@ -113,4 +117,22 @@ public class HwVTEPTunnelsStateListener extends AsyncDataChangeListenerBase>> { + InstanceIdentifier instanceIdentifier; + Tunnels tunnel; + + public RendererStateRemoveWorker(InstanceIdentifier instanceIdentifier, + Tunnels tunnel) { + this.instanceIdentifier = instanceIdentifier; + this.tunnel = tunnel; + } + + @Override + public List> call() throws Exception { + // If another renderer(for eg : CSS) needs to be supported, check can be performed here + // to call the respective helpers. + return HwVTEPInterfaceStateRemoveHelper.removeExternalTunnel(dataBroker, instanceIdentifier); + } + } +} diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/InterfaceInventoryStateListener.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/InterfaceInventoryStateListener.java index d2e56baf..cfafe209 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/InterfaceInventoryStateListener.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/InterfaceInventoryStateListener.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, @@ -69,7 +69,7 @@ public class InterfaceInventoryStateListener extends AsyncDataChangeListenerBase @Override protected AsyncDataBroker.DataChangeScope getDataChangeScope() { - return AsyncDataBroker.DataChangeScope.BASE; + return AsyncDataBroker.DataChangeScope.ONE; } @Override @@ -210,4 +210,4 @@ public class InterfaceInventoryStateListener extends AsyncDataChangeListenerBase '}'; } } -} \ No newline at end of file +} diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/TerminationPointStateListener.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/TerminationPointStateListener.java index 9d9debcd..2b14757f 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/TerminationPointStateListener.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/TerminationPointStateListener.java @@ -48,7 +48,7 @@ public class TerminationPointStateListener extends AsyncDataChangeListenerBase identifier, OvsdbTerminationPointAugmentation tpOld, OvsdbTerminationPointAugmentation tpNew) { - LOG.debug("Received Update DataChange Notification for ovsdb termination point identifier: {}, old: {}, new: {}.", - identifier, tpOld, tpNew); + LOG.debug("Received Update DataChange Notification for ovsdb termination point {}", tpNew.getName()); if (tpNew.getInterfaceBfdStatus() != null && !tpNew.getInterfaceBfdStatus().equals(tpOld.getInterfaceBfdStatus())) { + LOG.trace("Bfd Status changed for ovsdb termination point identifier: {}, old: {}, new: {}.", + identifier, tpOld, tpNew); DataStoreJobCoordinator jobCoordinator = DataStoreJobCoordinator.getInstance(); RendererStateUpdateWorker rendererStateAddWorker = new RendererStateUpdateWorker(identifier, tpNew, tpOld); jobCoordinator.enqueueJob(tpNew.getName(), rendererStateAddWorker); diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/hwvtep/statehelpers/HwVTEPInterfaceStateRemoveHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/hwvtep/statehelpers/HwVTEPInterfaceStateRemoveHelper.java new file mode 100644 index 00000000..54407d7c --- /dev/null +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/hwvtep/statehelpers/HwVTEPInterfaceStateRemoveHelper.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 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.renderer.hwvtep.statehelpers; + +import com.google.common.util.concurrent.ListenableFuture; +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.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.Tunnels; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +public class HwVTEPInterfaceStateRemoveHelper { + private static final Logger LOG = LoggerFactory.getLogger(HwVTEPInterfaceStateRemoveHelper.class); + + public static List> removeExternalTunnel(DataBroker dataBroker, + InstanceIdentifier tunnelsInstanceIdentifier) { + List> futures = new ArrayList>(); + LOG.debug("Removing HwVTEP tunnel entries for tunnel: {}", tunnelsInstanceIdentifier); + WriteTransaction transaction = dataBroker.newWriteOnlyTransaction(); + transaction.delete(LogicalDatastoreType.CONFIGURATION, tunnelsInstanceIdentifier); + futures.add(transaction.submit()); + return futures; + } +} diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/hwvtep/utilities/SouthboundUtils.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/hwvtep/utilities/SouthboundUtils.java index b811dc85..94d774ce 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/hwvtep/utilities/SouthboundUtils.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/hwvtep/utilities/SouthboundUtils.java @@ -102,18 +102,6 @@ public class SouthboundUtils { return (InstanceIdentifier) physicalSwitchAugmentation.getManagedBy().getValue(); } - public static InstanceIdentifier createTerminationPointInstanceIdentifier(NodeKey nodekey, - String portName){ - InstanceIdentifier terminationPointPath = InstanceIdentifier - .create(NetworkTopology.class) - .child(Topology.class, new TopologyKey(HWVTEP_TOPOLOGY_ID)) - .child(Node.class,nodekey) - .child(TerminationPoint.class, new TerminationPointKey(new TpId(portName))); - - LOG.debug("Termination point InstanceIdentifier generated : {}",terminationPointPath); - return terminationPointPath; - } - public static InstanceIdentifier createTEPInstanceIdentifier (InstanceIdentifier nodeIid, IpAddress ipAddress) { TerminationPointKey localTEP = SouthboundUtils.getTerminationPointKey(ipAddress.getIpv4Address().getValue()); @@ -168,16 +156,6 @@ public class SouthboundUtils { return tpKey; } - public static TerminationPoint getTEPFromConfigDS(InstanceIdentifier tpPath, - DataBroker dataBroker) { - Optional terminationPointOptional = - IfmUtil.read(LogicalDatastoreType.CONFIGURATION, tpPath, dataBroker); - if (!terminationPointOptional.isPresent()) { - return null; - } - return terminationPointOptional.get(); - } - public static void setDstIp(HwvtepPhysicalLocatorAugmentationBuilder tpAugmentationBuilder, IpAddress ipAddress) { IpAddress ip = new IpAddress(ipAddress); tpAugmentationBuilder.setDstIp(ip); diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsVlanMemberConfigAddHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsVlanMemberConfigAddHelper.java index e0086804..fde4bb0c 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsVlanMemberConfigAddHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsVlanMemberConfigAddHelper.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, @@ -55,35 +55,6 @@ public class OvsVlanMemberConfigAddHelper { if (ifState != null) { LOG.debug("add interface state info for vlan member {}",interfaceNew.getName()); InterfaceManagerCommonUtils.addStateEntry(interfaceNew.getName(), t, dataBroker, idManager, ifState); - - - // FIXME: Maybe, add the new interface to the higher-layer if of the parent interface-state. - // That may not serve any purpose though for interface manager.... Unless some external parties are interested in it. - - /* FIXME -- Below code is needed to add vlan-trunks to the of-port. Is this really needed. - String lowerLayerIf = ifState.getLowerLayerIf().get(0); - - NodeConnectorId nodeConnectorId = new NodeConnectorId(lowerLayerIf); - BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId)); - - BridgeRefEntryKey BridgeRefEntryKey = new BridgeRefEntryKey(dpId); - InstanceIdentifier dpnBridgeEntryIid = - InterfaceMetaUtils.getBridgeRefEntryIdentifier(BridgeRefEntryKey); - BridgeRefEntry bridgeRefEntry = - InterfaceMetaUtils.getBridgeRefEntryFromOperDS(dpnBridgeEntryIid, dataBroker); - if (bridgeRefEntry != null) { - InstanceIdentifier bridgeIid = - (InstanceIdentifier)bridgeRefEntry.getBridgeReference().getValue(); - Optional bridgeNodeOptional = - IfmUtil.read(LogicalDatastoreType.OPERATIONAL, bridgeIid, dataBroker); - if (bridgeNodeOptional.isPresent()) { - OvsdbBridgeAugmentation ovsdbBridgeAugmentation = bridgeNodeOptional.get(); - String bridgeName = ovsdbBridgeAugmentation.getBridgeName().getValue(); - VlanTrunkSouthboundUtils.addVlanPortToBridge(bridgeIid, ifL2vlan, - ovsdbBridgeAugmentation, bridgeName, parentRefs.getParentInterface(), dataBroker, t); - } - } */ - // FIXME: Need to add the Group here with actions: Push-Vlan, output_port. May not be needed here... } futures.add(t.submit()); diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateRemoveHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateRemoveHelper.java index 9360c570..b005d405 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateRemoveHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateRemoveHelper.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, @@ -94,7 +94,7 @@ public class OvsInterfaceStateRemoveHelper { InstanceIdentifier higerLayerChildIfStateId = IfmUtil.buildStateInterfaceId(higherlayerChild.getChildInterface()); Interface higherLayerIfChildState = InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(higherlayerChild.getChildInterface(), dataBroker); - if (interfaceState != null) { + if (interfaceState != null && higherLayerIfChildState != null) { transaction.delete(LogicalDatastoreType.OPERATIONAL, higerLayerChildIfStateId); FlowBasedServicesUtils.removeIngressFlow(higherLayerIfChildState.getName(), dpId, transaction); } @@ -139,4 +139,4 @@ public class OvsInterfaceStateRemoveHelper { futures.add(transaction.submit()); return futures; } -} \ No newline at end of file +} diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateUpdateHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateUpdateHelper.java index d3acbc74..eb63773b 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateUpdateHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateUpdateHelper.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, @@ -15,21 +15,25 @@ 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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; +import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.utilities.FlowBasedServicesUtils; +import org.opendaylight.vpnservice.mdsalutil.MatchInfo; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface; 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.interfaces.rev140508.interfaces.state.InterfaceKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; 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.flow.inventory.rev130819.FlowCapableNodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.AlivenessMonitorService; 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.rev150331.IfTunnel; 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; @@ -43,112 +47,135 @@ public class OvsInterfaceStateUpdateHelper { FlowCapableNodeConnector flowCapableNodeConnectorOld) { LOG.debug("Update of Interface State for port: {}", portName); List> futures = new ArrayList<>(); - WriteTransaction t = dataBroker.newWriteOnlyTransaction(); + WriteTransaction transaction = dataBroker.newWriteOnlyTransaction(); - Interface.OperStatus operStatusNew = - flowCapableNodeConnectorNew.getState().isLinkDown() ? Interface.OperStatus.Down : Interface.OperStatus.Up; - Interface.AdminStatus adminStatusNew = - flowCapableNodeConnectorNew.getState().isBlocked() ? Interface.AdminStatus.Down : Interface.AdminStatus.Up; + Interface.OperStatus operStatusNew = getOpState(flowCapableNodeConnectorNew); MacAddress macAddressNew = flowCapableNodeConnectorNew.getHardwareAddress(); - Interface.OperStatus operStatusOld = - flowCapableNodeConnectorOld.getState().isLinkDown() ? Interface.OperStatus.Down : Interface.OperStatus.Up; - Interface.AdminStatus adminStatusOld = - flowCapableNodeConnectorOld.getState().isBlocked() ? Interface.AdminStatus.Down : Interface.AdminStatus.Up; + Interface.OperStatus operStatusOld = getOpState(flowCapableNodeConnectorOld); MacAddress macAddressOld = flowCapableNodeConnectorOld.getHardwareAddress(); boolean opstateModified = false; - boolean adminStateModified = false; boolean hardwareAddressModified = false; if (!operStatusNew.equals(operStatusOld)) { opstateModified = true; } - if (!adminStatusNew.equals(adminStatusOld)) { - adminStateModified = true; - } if (!macAddressNew.equals(macAddressOld)) { hardwareAddressModified = true; } - if (!opstateModified && !adminStateModified && !hardwareAddressModified) { + if (!opstateModified && !hardwareAddressModified) { LOG.debug("If State entry for port: {} Not Modified.", portName); return futures; } - InstanceIdentifier ifStateId = IfmUtil.buildStateInterfaceId(portName); InterfaceBuilder ifaceBuilder = new InterfaceBuilder(); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface iface = null; - boolean modified = false; - if (opstateModified) { - LOG.debug("Opstate Modified for Port: {}", portName); - InterfaceKey interfaceKey = new InterfaceKey(portName); - iface = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(interfaceKey, dataBroker); - - // If interface config admin state is disabled, set operstate of the Interface State entity to Down. - if (iface != null && !iface.isEnabled()) { - operStatusNew = Interface.OperStatus.Down; - } - - ifaceBuilder.setOperStatus(operStatusNew); - modified = true; - } - - if (adminStateModified) { - LOG.debug("Admin state Modified for Port: {}", portName); - ifaceBuilder.setAdminStatus(adminStatusNew); - modified = true; - } - if (hardwareAddressModified) { LOG.debug("Hw-Address Modified for Port: {}", portName); PhysAddress physAddress = new PhysAddress(macAddressNew.getValue()); ifaceBuilder.setPhysAddress(physAddress); - modified = true; } - /* FIXME: Is there chance that lower layer node-connector info is updated. - Not Considering for now. - */ - - if (modified) { - ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(portName)); - t.merge(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build()); - - InterfaceParentEntryKey interfaceParentEntryKey = new InterfaceParentEntryKey(portName); - InterfaceParentEntry interfaceParentEntry = - InterfaceMetaUtils.getInterfaceParentEntryFromConfigDS(interfaceParentEntryKey, dataBroker); - if (interfaceParentEntry == null || interfaceParentEntry.getInterfaceChildEntry() == null) { - futures.add(t.submit()); - // start/stop monitoring based on opState - IfTunnel ifTunnel = iface.getAugmentation(IfTunnel.class); - if(ifTunnel != null) { - if (operStatusNew == Interface.OperStatus.Down) - AlivenessMonitorUtils.stopLLDPMonitoring(alivenessMonitorService, dataBroker, iface); - else - AlivenessMonitorUtils.startLLDPMonitoring(alivenessMonitorService, dataBroker, iface); - } - return futures; - } - for(InterfaceChildEntry higherlayerChild : interfaceParentEntry.getInterfaceChildEntry()) { - InstanceIdentifier higherLayerIfChildStateId = - IfmUtil.buildStateInterfaceId(higherlayerChild.getChildInterface()); - t.merge(LogicalDatastoreType.OPERATIONAL, higherLayerIfChildStateId, ifaceBuilder.build()); - InterfaceParentEntryKey higherLayerParentEntryKey = new InterfaceParentEntryKey(higherlayerChild.getChildInterface()); + NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(key.firstIdentifierOf(NodeConnector.class)).getId(); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface iface = + handleInterfaceStateUpdates(portName, nodeConnectorId, + transaction, dataBroker, ifaceBuilder, opstateModified, operStatusNew); + + InterfaceParentEntry interfaceParentEntry = + InterfaceMetaUtils.getInterfaceParentEntryFromConfigDS(portName, dataBroker); + if (interfaceParentEntry != null && interfaceParentEntry.getInterfaceChildEntry() != null) { + for (InterfaceChildEntry higherlayerChild : interfaceParentEntry.getInterfaceChildEntry()) { + handleInterfaceStateUpdates(higherlayerChild.getChildInterface(), + nodeConnectorId, transaction, dataBroker, ifaceBuilder, opstateModified, operStatusNew); InterfaceParentEntry higherLayerParent = - InterfaceMetaUtils.getInterfaceParentEntryFromConfigDS(higherLayerParentEntryKey, dataBroker); - if(higherLayerParent != null && higherLayerParent.getInterfaceChildEntry() != null) { + InterfaceMetaUtils.getInterfaceParentEntryFromConfigDS(higherlayerChild.getChildInterface(), dataBroker); + if (higherLayerParent != null && higherLayerParent.getInterfaceChildEntry() != null) { for (InterfaceChildEntry interfaceChildEntry : higherLayerParent.getInterfaceChildEntry()) { - LOG.debug("Updating if-state entries for Vlan-Trunk Members for port: {}", portName); //FIXME: If the no. of child entries exceeds 100, perform txn updates in batches of 100. - InstanceIdentifier ifChildStateId = - IfmUtil.buildStateInterfaceId(interfaceChildEntry.getChildInterface()); - t.merge(LogicalDatastoreType.OPERATIONAL, ifChildStateId, ifaceBuilder.build()); + handleInterfaceStateUpdates(interfaceChildEntry.getChildInterface(), nodeConnectorId, + transaction, dataBroker, ifaceBuilder, opstateModified, operStatusNew); } } } + }else { + handleTunnelMonitoringUpdates(alivenessMonitorService, dataBroker, iface, operStatusNew, opstateModified); } - - futures.add(t.submit()); + futures.add(transaction.submit()); return futures; } -} \ No newline at end of file + + public static Interface.OperStatus getOpState(FlowCapableNodeConnector flowCapableNodeConnector){ + Interface.OperStatus operStatus = + (flowCapableNodeConnector.getState().isLive() && + !flowCapableNodeConnector.getConfiguration().isPORTDOWN()) + ? Interface.OperStatus.Up: Interface.OperStatus.Down; + return operStatus; + } + + public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface + handleInterfaceStateUpdates(String interfaceName, NodeConnectorId nodeConnectorId,WriteTransaction transaction, + DataBroker dataBroker, InterfaceBuilder ifaceBuilder, boolean opStateModified, + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus opState){ + LOG.debug("updating interface state entry for {}", interfaceName); + InstanceIdentifier ifStateId = IfmUtil.buildStateInterfaceId(interfaceName); + ifaceBuilder.setKey(new InterfaceKey(interfaceName)); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface iface = + InterfaceManagerCommonUtils.getInterfaceFromConfigDS(interfaceName, dataBroker); + if (modifyOpState(iface, opStateModified)) { + LOG.debug("updating interface oper status as {} for {}", opState.name(), interfaceName); + ifaceBuilder.setOperStatus(opState); + } + transaction.merge(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build()); + + // if opstate has changed, add or remove ingress flow for l2vlan interfaces accordingly + if(modifyIngressFlow(iface, opStateModified)) { + handleVlanIngressFlowUpdates(dataBroker, opState, transaction, iface, nodeConnectorId, ifStateId); + } + return iface; + } + + public static void handleTunnelMonitoringUpdates(AlivenessMonitorService alivenessMonitorService, DataBroker dataBroker, + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface iface, + Interface.OperStatus operStatus, boolean opStateModified){ + // start/stop monitoring based on opState + if(!modifyTunnel(iface, opStateModified)){ + return; + } + + LOG.debug("handling tunnel monitoring updates for {} due to opstate modification", iface.getName()); + if (operStatus == Interface.OperStatus.Down) + AlivenessMonitorUtils.stopLLDPMonitoring(alivenessMonitorService, dataBroker, iface); + else + AlivenessMonitorUtils.startLLDPMonitoring(alivenessMonitorService, dataBroker, iface); + } + + public static boolean modifyOpState(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface iface, + boolean opStateModified){ + return (opStateModified && (iface == null || iface != null && iface.isEnabled())); + } + + public static boolean modifyIngressFlow(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface iface, + boolean opStateModified){ + return modifyOpState(iface, opStateModified) && iface != null && iface.getAugmentation(IfTunnel.class) == null; + } + + public static boolean modifyTunnel(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface iface, + boolean opStateModified){ + return modifyOpState(iface, opStateModified) && iface != null && iface.getAugmentation(IfTunnel.class) != null; + } + + public static void handleVlanIngressFlowUpdates(DataBroker dataBroker, Interface.OperStatus opState, WriteTransaction transaction, + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface iface, + NodeConnectorId nodeConnectorId, InstanceIdentifier ifStateId){ + LOG.debug("handling vlan ingress flow updates for {}", iface.getName()); + Interface ifState = InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(ifStateId, dataBroker); + BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId)); + if (opState == org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Up) { + long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId)); + List matches = FlowBasedServicesUtils.getMatchInfoForVlanPortAtIngressTable(dpId, portNo, iface); + FlowBasedServicesUtils.installVlanFlow(dpId, portNo, iface, transaction, matches, ifState.getIfIndex()); + } else { + FlowBasedServicesUtils.removeIngressFlow(iface.getName(), dpId, transaction); + } + } +} diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateAddHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateAddHelper.java index 24df9375..6bfb64d0 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateAddHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateAddHelper.java @@ -52,9 +52,6 @@ public class OvsInterfaceTopologyStateAddHelper { // create bridge reference entry in interface meta operational DS InterfaceMetaUtils.createBridgeRefEntry(dpnId, bridgeIid, writeTransaction); - // FIX for OVSDB Bug - manually copying the bridge info from topology operational DS to config DS - SouthboundUtils.addBridge(bridgeIid, bridgeNew, dataBroker, futures); - // handle pre-provisioning of tunnels for the newly connected dpn BridgeEntry bridgeEntry = InterfaceMetaUtils.getBridgeEntryFromConfigDS(dpnId, dataBroker); if (bridgeEntry == null) { diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateRemoveHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateRemoveHelper.java index c607bff9..e64833f2 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateRemoveHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateRemoveHelper.java @@ -43,13 +43,6 @@ public class OvsInterfaceTopologyStateRemoveHelper { //delete bridge reference entry in interface meta operational DS InterfaceMetaUtils.deleteBridgeRefEntry(dpnId, transaction); - // Workaround for ovsdb bug for delete TEP.. - Optional bridgeNodeOptional = - IfmUtil.read(LogicalDatastoreType.OPERATIONAL, bridgeIid, dataBroker); - if (!bridgeNodeOptional.isPresent()) { - SouthboundUtils.deleteBridge(bridgeIid, dataBroker, futures); - } - futures.add(transaction.submit()); return futures; } diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateUpdateHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateUpdateHelper.java index 3ce9aece..ae2b02b7 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateUpdateHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateUpdateHelper.java @@ -14,15 +14,10 @@ import org.opendaylight.vpnservice.interfacemgr.IfmUtil; 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.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.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceBfdStatus; 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.rev150331.IfTunnel; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -70,6 +65,9 @@ public class OvsInterfaceTopologyStateUpdateHelper { OvsdbTerminationPointAugmentation terminationPointOld) { List> futures = new ArrayList>(); + if (InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(terminationPointNew.getName(), dataBroker) == null) { + return futures; + } // update opstate of interface if TEP has gone down/up as a result of BFD monitoring LOG.debug("updating tunnel state for interface {}", terminationPointNew.getName()); WriteTransaction transaction = dataBroker.newWriteOnlyTransaction(); diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/utilities/SouthboundUtils.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/utilities/SouthboundUtils.java index 582cd291..c10cc2e0 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/utilities/SouthboundUtils.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/utilities/SouthboundUtils.java @@ -88,27 +88,6 @@ public class SouthboundUtils { } } - public static void addBridge(InstanceIdentifier bridgeIid, - OvsdbBridgeAugmentation bridgeAugmentation, - DataBroker dataBroker, List> futures){ - LOG.debug("adding bridge: {}", bridgeAugmentation.getBridgeName()); - WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); - NodeId nodeId = InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)).getNodeId(); - NodeBuilder bridgeNodeBuilder = new NodeBuilder(); - bridgeNodeBuilder.setNodeId(nodeId); - bridgeNodeBuilder.addAugmentation(OvsdbBridgeAugmentation.class, bridgeAugmentation); - tx.put(LogicalDatastoreType.CONFIGURATION, createNodeInstanceIdentifier(nodeId), bridgeNodeBuilder.build(), true); - futures.add(tx.submit()); - } - - public static void deleteBridge(InstanceIdentifier bridgeIid, - DataBroker dataBroker, List> futures){ - WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); - NodeId nodeId = InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)).getNodeId(); - tx.delete(LogicalDatastoreType.CONFIGURATION, createNodeInstanceIdentifier(nodeId)); - futures.add(tx.submit()); - } - private static void addVlanPortToBridge(InstanceIdentifier bridgeIid, IfL2vlan ifL2vlan, IfTunnel ifTunnel, OvsdbBridgeAugmentation bridgeAugmentation, String bridgeName, String portName, DataBroker dataBroker, WriteTransaction t) { @@ -143,7 +122,9 @@ public class SouthboundUtils { } Map options = Maps.newHashMap(); - options.put("key", "flow"); + if(!ifTunnel.getTunnelInterfaceType().equals(TunnelTypeMplsOverGre.class) ) { + options.put("key", "flow"); + } IpAddress localIp = ifTunnel.getTunnelSource(); options.put("local_ip", localIp.getIpv4Address().getValue()); @@ -232,18 +213,6 @@ public class SouthboundUtils { return bfdBuilder.build(); } - private static InstanceIdentifier createTerminationPointInstanceIdentifier(Node node, - String portName){ - InstanceIdentifier terminationPointPath = InstanceIdentifier - .create(NetworkTopology.class) - .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID)) - .child(Node.class,node.getKey()) - .child(TerminationPoint.class, new TerminationPointKey(new TpId(portName))); - - LOG.debug("Termination point InstanceIdentifier generated : {}", terminationPointPath); - return terminationPointPath; - } - public static InstanceIdentifier createTerminationPointInstanceIdentifier(NodeKey nodekey, String portName){ InstanceIdentifier terminationPointPath = InstanceIdentifier @@ -255,11 +224,4 @@ public class SouthboundUtils { LOG.debug("Termination point InstanceIdentifier generated : {}",terminationPointPath); return terminationPointPath; } - - public static InstanceIdentifier createNodeInstanceIdentifier(NodeId nodeId) { - return InstanceIdentifier - .create(NetworkTopology.class) - .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID)) - .child(Node.class,new NodeKey(nodeId)); - } } diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/HwVTEPConfigurationTest.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/HwVTEPConfigurationTest.java index 048f6386..86848182 100644 --- a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/HwVTEPConfigurationTest.java +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/HwVTEPConfigurationTest.java @@ -25,6 +25,7 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.vpnservice.interfacemgr.IfmUtil; import org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.confighelpers.HwVTEPConfigRemoveHelper; import org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.confighelpers.HwVTEPInterfaceConfigAddHelper; +import org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.statehelpers.HwVTEPInterfaceStateRemoveHelper; import org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.statehelpers.HwVTEPInterfaceStateUpdateHelper; import org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.utilities.SouthboundUtils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; @@ -73,6 +74,7 @@ public class HwVTEPConfigurationTest { HwVTEPInterfaceConfigAddHelper addHelper; HwVTEPConfigRemoveHelper removeHelper; HwVTEPInterfaceStateUpdateHelper updateHelper; + HwVTEPInterfaceStateRemoveHelper stateRemoveHelper; BigInteger dpId = BigInteger.valueOf(1); Interface hwVTEPInterfaceEnabled; @@ -206,4 +208,13 @@ public class HwVTEPConfigurationTest { //Verify verify(mockWriteTx).put(LogicalDatastoreType.CONFIGURATION, tunnelsInstanceIdentifier, tBuilder.build(), true); } + + @Test + public void testRemoveExternalTunnels(){ + + stateRemoveHelper.removeExternalTunnel(dataBroker, tunnelsInstanceIdentifier); + + //Verify + verify(mockWriteTx).delete(LogicalDatastoreType.CONFIGURATION, tunnelsInstanceIdentifier); + } } diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTestUtil.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTestUtil.java index c3ca61c9..61713ed4 100644 --- a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTestUtil.java +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTestUtil.java @@ -31,6 +31,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder; 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.yang.types.rev100924.MacAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.PhysAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorBuilder; @@ -40,6 +41,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.ta import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.flow.capable.port.State; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.flow.capable.port.StateBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match; @@ -105,10 +109,21 @@ import java.util.*; public class InterfaceManagerTestUtil { public static final String interfaceName = "s1-eth1"; - public static final String interfaceName2 = "s1-eth2"; + public static final String childInterface = "s1-eth1-trunk"; public static final String tunnelInterfaceName = "s2-gre1"; public static final TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1")); + public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface buildStateInterface(String ifaceName, String physAddress, + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus opState){ + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); + if(physAddress != null) { + ifaceBuilder.setPhysAddress(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress.getDefaultInstance(physAddress)); + } + ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(ifaceName)); + ifaceBuilder.setOperStatus(opState); + return ifaceBuilder.build(); + } + public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface buildStateInterface( String ifName, NodeConnectorId ncId) { org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = @@ -239,6 +254,14 @@ public class InterfaceManagerTestUtil { return ncBuilder.build(); } + public static FlowCapableNodeConnector buildFlowCapableNodeConnector(boolean isPortDown, boolean isLive, String macAddress) { + PortConfig portConfig = new PortConfig(false, false, false, isPortDown); + State state = new StateBuilder().setBlocked(true).setLinkDown(false).setLive(isLive).build(); + FlowCapableNodeConnectorBuilder fcNodeConnector = new FlowCapableNodeConnectorBuilder(). + setHardwareAddress(MacAddress.getDefaultInstance(macAddress)).setConfiguration(portConfig).setState(state); + return fcNodeConnector.build(); + } + public static NodeConnectorId buildNodeConnectorId(BigInteger dpn, long portNo) { return new NodeConnectorId(buildNodeConnectorString(dpn, portNo)); } diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/StateInterfaceTest.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/StateInterfaceTest.java index 1092f7ed..1a64b414 100644 --- a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/StateInterfaceTest.java +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/StateInterfaceTest.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, @@ -36,6 +36,8 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.flow.capable.port.State; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.flow.capable.port.StateBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; @@ -49,9 +51,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.met 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.InterfaceChildEntryBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeGre; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeVxlan; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; @@ -123,16 +123,16 @@ public class StateInterfaceTest { IfindexInterface = InterfaceManagerTestUtil.buildIfIndexInterface(100, InterfaceManagerTestUtil.interfaceName); ifIndexId = InstanceIdentifier.builder(IfIndexesInterfaceMap.class).child(IfIndexInterface.class, new IfIndexInterfaceKey(100)).build(); interfaceInstanceIdentifier = InterfaceManagerCommonUtils.getInterfaceIdentifier(new InterfaceKey(InterfaceManagerTestUtil.interfaceName)); - childInterfaceInstanceIdentifier = InterfaceManagerCommonUtils.getInterfaceIdentifier(new InterfaceKey(InterfaceManagerTestUtil.interfaceName2)); + childInterfaceInstanceIdentifier = InterfaceManagerCommonUtils.getInterfaceIdentifier(new InterfaceKey(InterfaceManagerTestUtil.childInterface)); interfaceStateIdentifier = IfmUtil.buildStateInterfaceId(InterfaceManagerTestUtil.interfaceName); - childInterfaceStateIdentifier = IfmUtil.buildStateInterfaceId(InterfaceManagerTestUtil.interfaceName2); + childInterfaceStateIdentifier = IfmUtil.buildStateInterfaceId(InterfaceManagerTestUtil.childInterface); vlanInterfaceEnabled = InterfaceManagerTestUtil.buildInterface(InterfaceManagerTestUtil.interfaceName, "Test Vlan Interface1", true, L2vlan.class, BigInteger.valueOf(1)); vlanInterfaceDisabled = InterfaceManagerTestUtil.buildInterface(InterfaceManagerTestUtil.interfaceName, "Test Vlan Interface1", false, L2vlan.class, BigInteger.valueOf(1)); tunnelInterfaceEnabled = InterfaceManagerTestUtil.buildTunnelInterface(dpId, InterfaceManagerTestUtil.tunnelInterfaceName ,"Test Tunnel Interface", true, TunnelTypeGre.class, "192.168.56.101", "192.168.56.102"); - childVlanInterfaceEnabled = InterfaceManagerTestUtil.buildInterface(InterfaceManagerTestUtil.interfaceName2, "Test Vlan Interface2", true, L2vlan.class, BigInteger.valueOf(1)); + childVlanInterfaceEnabled = InterfaceManagerTestUtil.buildInterface(InterfaceManagerTestUtil.childInterface, "Test Vlan Interface2", true, L2vlan.class, BigInteger.valueOf(1)); interfaceParentEntryKey = new InterfaceParentEntryKey(InterfaceManagerTestUtil.interfaceName); interfaceParentEntryIdentifier = InterfaceMetaUtils.getInterfaceParentEntryIdentifier(interfaceParentEntryKey); - higherLayerInterfaceParentEntryKey = new InterfaceParentEntryKey(InterfaceManagerTestUtil.interfaceName2); + higherLayerInterfaceParentEntryKey = new InterfaceParentEntryKey(InterfaceManagerTestUtil.childInterface); higherLevelInterfaceParentEntryIdentifier= InterfaceMetaUtils.getInterfaceParentEntryIdentifier(higherLayerInterfaceParentEntryKey); org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); List lowerLayerIfList = new ArrayList<>(); @@ -147,7 +147,7 @@ public class StateInterfaceTest { InterfaceParentEntryBuilder ifaceParentEntryBuilder = new InterfaceParentEntryBuilder(); List ifaceChildEntryList= new ArrayList<>(); - ifaceChildEntryList.add(new InterfaceChildEntryBuilder().setChildInterface(InterfaceManagerTestUtil.interfaceName2).build()); + ifaceChildEntryList.add(new InterfaceChildEntryBuilder().setChildInterface(InterfaceManagerTestUtil.childInterface).build()); interfaceParentEntry = ifaceParentEntryBuilder.setInterfaceChildEntry(ifaceChildEntryList).build(); InterfaceParentEntryBuilder higherLayerIfParentEntryBuilder = new InterfaceParentEntryBuilder(); @@ -185,7 +185,7 @@ public class StateInterfaceTest { doReturn(idOutputOptional).when(idManager).allocateId(getIdInput); AllocateIdInput getIdInput2 = new AllocateIdInputBuilder() .setPoolName(IfmConstants.IFM_IDPOOL_NAME) - .setIdKey(InterfaceManagerTestUtil.interfaceName2).build(); + .setIdKey(InterfaceManagerTestUtil.childInterface).build(); doReturn(idOutputOptional2).when(idManager).allocateId(getIdInput2); addHelper.addState(dataBroker, idManager, mdsalManager, alivenessMonitorService, @@ -277,6 +277,8 @@ public class StateInterfaceTest { doReturn(Futures.immediateCheckedFuture(expectedStateInterface)).when(mockReadTx).read( LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); + doReturn(Futures.immediateCheckedFuture(expectedStateInterface)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, childInterfaceStateIdentifier); doReturn(Futures.immediateCheckedFuture(expectedParentEntry)).when(mockReadTx).read( LogicalDatastoreType.CONFIGURATION, interfaceParentEntryIdentifier); doReturn(Futures.immediateCheckedFuture(higherLayerParentOptional)).when(mockReadTx).read( @@ -286,26 +288,15 @@ public class StateInterfaceTest { doReturn(Futures.immediateCheckedFuture(expectedChildInterface)).when(mockReadTx).read( LogicalDatastoreType.CONFIGURATION, childInterfaceInstanceIdentifier); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); - ifaceBuilder.setAdminStatus(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus.Up) - .setPhysAddress(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress.getDefaultInstance("AA:AA:AA:AA:AA:AA")); - ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(InterfaceManagerTestUtil.interfaceName)); - ifaceBuilder.setOperStatus(OperStatus.Down); - - stateInterface = ifaceBuilder.build(); - - FlowCapableNodeConnectorBuilder fcNodeConnectorOldupdate = new FlowCapableNodeConnectorBuilder().setHardwareAddress(MacAddress.getDefaultInstance("AA:AA:AA:AA:AA:AB")); - FlowCapableNodeConnectorBuilder fcNodeConnectorNewupdate = new FlowCapableNodeConnectorBuilder().setHardwareAddress(MacAddress.getDefaultInstance("AA:AA:AA:AA:AA:AA")); - - StateBuilder b2 = new StateBuilder().setBlocked(true).setLinkDown(false); - StateBuilder b3 = new StateBuilder().setBlocked(false).setLinkDown(true); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface parentInterface = InterfaceManagerTestUtil.buildStateInterface(InterfaceManagerTestUtil.interfaceName, null, OperStatus.Down); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface childInterface = InterfaceManagerTestUtil.buildStateInterface(InterfaceManagerTestUtil.childInterface, null, OperStatus.Down); - fcNodeConnectorOldupdate.setState(b2.build()); - fcNodeConnectorNewupdate.setState(b3.build()); + FlowCapableNodeConnector fcNodeConnectorOld = InterfaceManagerTestUtil.buildFlowCapableNodeConnector(false, true, "AA:AA:AA:AA:AA:AA"); + FlowCapableNodeConnector fcNodeConnectorNew = InterfaceManagerTestUtil.buildFlowCapableNodeConnector(true, false, "AA:AA:AA:AA:AA:AA"); - updateHelper.updateState(fcNodeConnectorId, alivenessMonitorService, dataBroker, InterfaceManagerTestUtil.interfaceName, fcNodeConnectorNewupdate.build(), fcNodeConnectorOldupdate.build()); + updateHelper.updateState(fcNodeConnectorId, alivenessMonitorService, dataBroker, InterfaceManagerTestUtil.interfaceName, fcNodeConnectorNew, fcNodeConnectorOld); - verify(mockWriteTx).merge(LogicalDatastoreType.OPERATIONAL,interfaceStateIdentifier,stateInterface); - verify(mockWriteTx).merge(LogicalDatastoreType.OPERATIONAL,childInterfaceStateIdentifier,stateInterface); + verify(mockWriteTx).merge(LogicalDatastoreType.OPERATIONAL,interfaceStateIdentifier,parentInterface); + verify(mockWriteTx).merge(LogicalDatastoreType.OPERATIONAL,childInterfaceStateIdentifier,childInterface); } -} \ No newline at end of file +} diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TopologyStateInterfaceTest.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TopologyStateInterfaceTest.java index 6938837b..a2b6a9ec 100644 --- a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TopologyStateInterfaceTest.java +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TopologyStateInterfaceTest.java @@ -24,6 +24,7 @@ import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInt import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceTopologyStateUpdateHelper; 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.state.InterfaceBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.*; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceBfdStatus; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceBfdStatusBuilder; @@ -60,6 +61,7 @@ public class TopologyStateInterfaceTest { BridgeEntry bridgeEntry = null; ParentRefs parentRefs = null; InstanceIdentifier interfaceInstanceIdentifier = null; + InstanceIdentifier interfaceStateIdentifier = null; Interface tunnelInterfaceEnabled = null; BridgeInterfaceEntry bridgeInterfaceEntry; BridgeInterfaceEntryKey bridgeInterfaceEntryKey; @@ -95,6 +97,7 @@ public class TopologyStateInterfaceTest { bridgeOld = InterfaceManagerTestUtil.getOvsdbBridgeRef("s1"); bridgeEntryIid = InterfaceMetaUtils.getBridgeEntryIdentifier(new BridgeEntryKey(dpId)); interfaceInstanceIdentifier = IfmUtil.buildId(InterfaceManagerTestUtil.tunnelInterfaceName); + interfaceStateIdentifier = IfmUtil.buildStateInterfaceId(newTerminationPoint.getName()); bridgeInterfaceEntryKey = new BridgeInterfaceEntryKey(InterfaceManagerTestUtil.tunnelInterfaceName); bridgeInterfaceEntry = new BridgeInterfaceEntryBuilder().setKey(bridgeInterfaceEntryKey) @@ -184,8 +187,14 @@ public class TopologyStateInterfaceTest { interfaceBfdStatus.add(new InterfaceBfdStatusBuilder().setBfdStatusKey(SouthboundUtils.BFD_OP_STATE).setBfdStatusValue(SouthboundUtils.BFD_STATE_UP).build()); List bfdStatusSpy = spy(interfaceBfdStatus); when(newTerminationPoint.getInterfaceBfdStatus()).thenReturn(bfdStatusSpy); - updateHelper.updateTunnelState(dataBroker, newTerminationPoint, null); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = new InterfaceBuilder().setKey(new InterfaceKey(InterfaceManagerTestUtil.interfaceName)).build(); + Optional expectedInterface = Optional.of(ifState); + + doReturn(Futures.immediateCheckedFuture(expectedInterface)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); + updateHelper.updateTunnelState(dataBroker, newTerminationPoint, null); + //verify InstanceIdentifier ifStateId = IfmUtil.buildStateInterfaceId(null); diff --git a/interfacemgr/interfacemgr-shell/src/main/java/org/opendaylight/vpnservice/interfacemgr/shell/IfmCLIUtil.java b/interfacemgr/interfacemgr-shell/src/main/java/org/opendaylight/vpnservice/interfacemgr/shell/IfmCLIUtil.java index f2662e4e..38d9b09a 100644 --- a/interfacemgr/interfacemgr-shell/src/main/java/org/opendaylight/vpnservice/interfacemgr/shell/IfmCLIUtil.java +++ b/interfacemgr/interfacemgr-shell/src/main/java/org/opendaylight/vpnservice/interfacemgr/shell/IfmCLIUtil.java @@ -100,7 +100,7 @@ public class IfmCLIUtil { System.out.println(fmt.format(VXLAN_OUTPUT_FORMAT + "\n", (interfaceInfo == null) ? InterfaceOpState.DOWN : interfaceInfo.getOpState(), String.format("%s/%s", parentRefs.getDatapathNodeIdentifier(), - parentRefs.getParentInterface()), + iface.getName()), (interfaceInfo == null) ? UNSET : interfaceInfo.getInterfaceTag(), "")); fmt.close(); } -- 2.36.6