X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=interfacemanager%2Finterfacemanager-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fgenius%2Finterfacemanager%2Fcommons%2FAlivenessMonitorUtils.java;h=26b6572d7ff4dd3e55addde0eb443bc4c534ea74;hb=fee18760d10dd7ba263651f843a9df9c9bfafc47;hp=3c7d7e24e68a053acde82a7b30a790ea3827dc1c;hpb=d4a91cb64dd16c9d7fe5d047a54052da1073c026;p=genius.git diff --git a/interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/commons/AlivenessMonitorUtils.java b/interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/commons/AlivenessMonitorUtils.java index 3c7d7e24e..26b6572d7 100644 --- a/interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/commons/AlivenessMonitorUtils.java +++ b/interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/commons/AlivenessMonitorUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved. + * Copyright (c) 2016, 2017 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,18 +7,50 @@ */ package org.opendaylight.genius.interfacemanager.commons; -import com.google.common.base.Optional; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.genius.interfacemanager.IfmUtil; -import org.opendaylight.genius.mdsalutil.MDSALUtil; +import static org.opendaylight.mdsal.binding.util.Datastore.OPERATIONAL; + +import com.google.common.util.concurrent.ListenableFuture; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import javax.inject.Inject; +import javax.inject.Singleton; +import org.apache.aries.blueprint.annotation.service.Reference; +import org.opendaylight.infrautils.utils.concurrent.LoggingFutures; +import org.opendaylight.mdsal.binding.api.DataBroker; +import org.opendaylight.mdsal.binding.util.Datastore.Operational; +import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunner; +import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunnerImpl; +import org.opendaylight.mdsal.binding.util.TypedReadTransaction; +import org.opendaylight.mdsal.binding.util.TypedReadWriteTransaction; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; -import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.AlivenessMonitorService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorProfileCreateInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorProfileCreateInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorProfileCreateOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorProfileDeleteInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorProfileDeleteInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorProfileDeleteOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorProfileGetInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorProfileGetInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorProfileGetOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorProtocolType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorStartInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorStartInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorStartOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorStopInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorStopInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorStopOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitoringMode; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.monitor.params.SourceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.monitor.profile.create.input.Profile; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.monitor.profile.create.input.ProfileBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.monitor.start.input.ConfigBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.InterfaceMonitorIdMap; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.MonitorIdInterfaceMap; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.monitor.id.map.InterfaceMonitorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.monitor.id.map.InterfaceMonitorIdBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.monitor.id.map.InterfaceMonitorIdKey; @@ -26,45 +58,54 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.met import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.monitor.id._interface.map.MonitorIdInterfaceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.monitor.id._interface.map.MonitorIdInterfaceKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfTunnel; -import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelMonitoringTypeLldp; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.Uint32; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - -public class AlivenessMonitorUtils { +@Singleton +public final class AlivenessMonitorUtils { private static final Logger LOG = LoggerFactory.getLogger(AlivenessMonitorUtils.class); - private static final long FAILURE_THRESHOLD = 4; - private static final long MONITORING_INTERVAL = 10000; - private static final long MONITORING_WINDOW = 4; + private static final Uint32 FAILURE_THRESHOLD = Uint32.valueOf(4).intern(); + private static final Uint32 MONITORING_WINDOW = Uint32.valueOf(4).intern(); + + private final AlivenessMonitorService alivenessMonitorService; + private final ManagedNewTransactionRunner txRunner; - public static void startLLDPMonitoring(AlivenessMonitorService alivenessMonitorService, DataBroker dataBroker, - Interface trunkInterface) { - //LLDP monitoring for the trunk interface - String trunkInterfaceName = trunkInterface.getName(); - IfTunnel ifTunnel = trunkInterface.getAugmentation(IfTunnel.class); - if(ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class) && ifTunnel.isInternal()) { - MonitorStartInput lldpMonitorInput = new MonitorStartInputBuilder().setConfig(new ConfigBuilder() - .setSource(new SourceBuilder().setEndpointType(getInterfaceForMonitoring(trunkInterfaceName, - ifTunnel.getTunnelSource())).build()) - .setMode(MonitoringMode.OneOne) - .setProfileId(allocateProfile(alivenessMonitorService, FAILURE_THRESHOLD, ifTunnel.getMonitorInterval(), MONITORING_WINDOW, - EtherTypes.Lldp)).build()).build(); + @Inject + public AlivenessMonitorUtils(AlivenessMonitorService alivenessMonitor, @Reference DataBroker dataBroker) { + this.alivenessMonitorService = alivenessMonitor; + this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker); + } + + public void startLLDPMonitoring(IfTunnel ifTunnel, String trunkInterfaceName) { + // LLDP monitoring for the tunnel interface + if (lldpMonitoringEnabled(ifTunnel)) { + MonitorStartInput lldpMonitorInput = new MonitorStartInputBuilder() + .setConfig(new ConfigBuilder() + .setSource(new SourceBuilder() + .setEndpointType( + getInterfaceForMonitoring(trunkInterfaceName, ifTunnel.getTunnelSource())) + .build()) + .setMode(MonitoringMode.OneOne) + .setProfileId(allocateProfile(FAILURE_THRESHOLD, ifTunnel.getMonitorInterval(), + MONITORING_WINDOW, MonitorProtocolType.Lldp)) + .build()) + .build(); try { Future> result = alivenessMonitorService.monitorStart(lldpMonitorInput); RpcResult rpcResult = result.get(); - long monitorId; if (rpcResult.isSuccessful()) { - monitorId = rpcResult.getResult().getMonitorId(); - createOrUpdateInterfaceMonitorIdMap(dataBroker, trunkInterfaceName, monitorId); - createOrUpdateMonitorIdInterfaceMap(dataBroker, trunkInterfaceName, monitorId); - LOG.trace("Started LLDP monitoring with id {}", monitorId); + Uint32 monitorId = rpcResult.getResult().getMonitorId(); + LoggingFutures.addErrorLogging( + txRunner.callWithNewReadWriteTransactionAndSubmit(OPERATIONAL, tx -> { + createOrUpdateInterfaceMonitorIdMap(tx, trunkInterfaceName, monitorId); + createOrUpdateMonitorIdInterfaceMap(tx, trunkInterfaceName, monitorId); + LOG.trace("Started LLDP monitoring with id {}", monitorId); + }), LOG, "Error starting monitoring"); } else { LOG.warn("RPC Call to start monitoring returned with Errors {}", rpcResult.getErrors()); } @@ -74,99 +115,113 @@ public class AlivenessMonitorUtils { } } - public static void stopLLDPMonitoring(AlivenessMonitorService alivenessMonitorService, DataBroker dataBroker, - Interface trunkInterface) { - IfTunnel ifTunnel = trunkInterface.getAugmentation(IfTunnel.class); - if(!(ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)&& ifTunnel.isInternal())){ + public void stopLLDPMonitoring(IfTunnel ifTunnel, String trunkInterface) { + if (!lldpMonitoringEnabled(ifTunnel)) { 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); - return; - } - for (Long monitorId : monitorIds) { - String interfaceName = getInterfaceFromMonitorId(dataBroker, monitorId); - if (interfaceName != null) { - MonitorStopInput input = new MonitorStopInputBuilder().setMonitorId(monitorId).build(); - alivenessMonitorService.monitorStop(input); - removeMonitorIdInterfaceMap(dataBroker, monitorId); - removeMonitorIdFromInterfaceMonitorIdMap(dataBroker, interfaceName, monitorId); + LOG.debug("stop LLDP monitoring for {}", trunkInterface); + LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(OPERATIONAL, tx -> { + List monitorIds = getMonitorIdForInterface(tx, trunkInterface); + if (monitorIds == null) { + LOG.error("Monitor Id doesn't exist for Interface {}", trunkInterface); return; } - } + for (Uint32 monitorId : monitorIds) { + String interfaceName = getInterfaceFromMonitorId(tx, monitorId); + if (interfaceName != null) { + MonitorStopInput input = new MonitorStopInputBuilder().setMonitorId(monitorId).build(); + + ListenableFuture> future = alivenessMonitorService.monitorStop(input); + LoggingFutures.addErrorLogging(future, LOG, "Stop LLDP monitoring for {}", trunkInterface); + + removeMonitorIdInterfaceMap(tx, monitorId); + removeMonitorIdFromInterfaceMonitorIdMap(tx, interfaceName, monitorId); + return; + } + } + }), LOG, "Error stopping LLDP monitoring for {}", trunkInterface); } - public static String getInterfaceFromMonitorId(DataBroker broker, Long monitorId) { - InstanceIdentifier id = InstanceIdentifier.builder(MonitorIdInterfaceMap.class).child(MonitorIdInterface.class, new MonitorIdInterfaceKey(monitorId)).build(); - Optional interfaceMonitorIdMap = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, id, broker); - if(interfaceMonitorIdMap.isPresent()) { - return interfaceMonitorIdMap.get().getInterfaceName(); - } - return null; + public static String getInterfaceFromMonitorId(TypedReadTransaction tx, Uint32 monitorId) + throws ExecutionException, InterruptedException { + InstanceIdentifier id = InstanceIdentifier.builder(MonitorIdInterfaceMap.class) + .child(MonitorIdInterface.class, new MonitorIdInterfaceKey(monitorId)).build(); + return tx.read(id).get().map(MonitorIdInterface::getInterfaceName).orElse(null); } - private static void removeMonitorIdInterfaceMap(DataBroker broker, long monitorId) { - InstanceIdentifier id = InstanceIdentifier.builder(MonitorIdInterfaceMap.class).child(MonitorIdInterface.class, new MonitorIdInterfaceKey(monitorId)).build(); - Optional monitorIdInterfaceMap = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, id, broker); - if(monitorIdInterfaceMap.isPresent()) { - MDSALUtil.syncDelete(broker, LogicalDatastoreType.OPERATIONAL, id); + private void removeMonitorIdInterfaceMap(TypedReadWriteTransaction tx, Uint32 monitorId) + throws ExecutionException, InterruptedException { + InstanceIdentifier id = InstanceIdentifier.builder(MonitorIdInterfaceMap.class) + .child(MonitorIdInterface.class, new MonitorIdInterfaceKey(monitorId)).build(); + if (tx.read(id).get().isPresent()) { + tx.delete(id); } } - private static void removeMonitorIdFromInterfaceMonitorIdMap(DataBroker broker, String infName, long monitorId) { - InstanceIdentifier id = InstanceIdentifier.builder(InterfaceMonitorIdMap.class).child(InterfaceMonitorId.class, new InterfaceMonitorIdKey(infName)).build(); - Optional interfaceMonitorIdMap = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, id, broker); - if(interfaceMonitorIdMap.isPresent()) { + private void removeMonitorIdFromInterfaceMonitorIdMap(TypedReadWriteTransaction tx, String infName, + Uint32 monitorId) throws ExecutionException, InterruptedException { + InstanceIdentifier id = InstanceIdentifier.builder(InterfaceMonitorIdMap.class) + .child(InterfaceMonitorId.class, new InterfaceMonitorIdKey(infName)).build(); + Optional interfaceMonitorIdMap = tx.read(id).get(); + if (interfaceMonitorIdMap.isPresent()) { InterfaceMonitorId interfaceMonitorIdInstance = interfaceMonitorIdMap.get(); - List existingMonitorIds = interfaceMonitorIdInstance.getMonitorId(); + List existingMonitorIds = interfaceMonitorIdInstance.getMonitorId(); if (existingMonitorIds != null && existingMonitorIds.contains(monitorId)) { existingMonitorIds.remove(monitorId); InterfaceMonitorIdBuilder interfaceMonitorIdBuilder = new InterfaceMonitorIdBuilder(); - interfaceMonitorIdInstance = interfaceMonitorIdBuilder.setKey(new InterfaceMonitorIdKey(infName)).setMonitorId(existingMonitorIds).build(); - MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, id, interfaceMonitorIdInstance); + interfaceMonitorIdInstance = interfaceMonitorIdBuilder.withKey(new InterfaceMonitorIdKey(infName)) + .setMonitorId(existingMonitorIds).build(); + tx.mergeParentStructureMerge(id, interfaceMonitorIdInstance); } } } - private static org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.endpoint.endpoint.type.Interface getInterfaceForMonitoring(String interfaceName, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress ipAddress) { - return new org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.endpoint. - endpoint.type.InterfaceBuilder().setInterfaceIp(ipAddress).setInterfaceName(interfaceName).build(); + private static org.opendaylight.yang.gen.v1 + .urn.opendaylight.genius.alivenessmonitor + .rev160411.endpoint.endpoint.type.Interface getInterfaceForMonitoring( + String interfaceName, + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress ipAddress) { + return new org.opendaylight.yang.gen.v1.urn.opendaylight + .genius.alivenessmonitor.rev160411.endpoint.endpoint.type.InterfaceBuilder() + .setInterfaceIp(ipAddress).setInterfaceName(interfaceName).build(); } - public static void handleTunnelMonitorUpdates(AlivenessMonitorService alivenessMonitorService, DataBroker dataBroker, - Interface interfaceOld, Interface interfaceNew) { + public void handleTunnelMonitorUpdates(Interface interfaceOld, Interface interfaceNew) { String interfaceName = interfaceNew.getName(); - IfTunnel ifTunnelNew = interfaceNew.getAugmentation(IfTunnel.class); - if(!(ifTunnelNew.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)&& - ifTunnelNew.isInternal())){ + IfTunnel ifTunnelNew = interfaceNew.augmentation(IfTunnel.class); + if (!lldpMonitoringEnabled(ifTunnelNew)) { return; } LOG.debug("handling tunnel monitoring updates for interface {}", interfaceName); - stopLLDPMonitoring(alivenessMonitorService, dataBroker, interfaceOld); - if(ifTunnelNew.isMonitorEnabled()) { - startLLDPMonitoring(alivenessMonitorService, dataBroker, interfaceNew); + stopLLDPMonitoring(ifTunnelNew, interfaceOld.getName()); + if (ifTunnelNew.isMonitorEnabled()) { + startLLDPMonitoring(ifTunnelNew, interfaceName); // Delete old profile from Aliveness Manager - IfTunnel ifTunnelOld = interfaceOld.getAugmentation(IfTunnel.class); - if(ifTunnelNew.getMonitorInterval() != ifTunnelOld.getMonitorInterval()) { + IfTunnel ifTunnelOld = interfaceOld.augmentation(IfTunnel.class); + if (!Objects.equals(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); + Uint32 profileId = allocateProfile(FAILURE_THRESHOLD, ifTunnelOld.getMonitorInterval(), + MONITORING_WINDOW, MonitorProtocolType.Lldp); + MonitorProfileDeleteInput profileDeleteInput = new MonitorProfileDeleteInputBuilder() + .setProfileId(profileId).build(); + + ListenableFuture> future = + alivenessMonitorService.monitorProfileDelete(profileDeleteInput); + LoggingFutures.addErrorLogging(future, LOG, "Delete monitor profile {}", interfaceName); } } } - - public static void createOrUpdateInterfaceMonitorIdMap(DataBroker broker, String infName, long monitorId) { + private static void createOrUpdateInterfaceMonitorIdMap(TypedReadWriteTransaction tx, String infName, + Uint32 monitorId) throws ExecutionException, InterruptedException { InterfaceMonitorId interfaceMonitorIdInstance; - List existingMonitorIds; + List existingMonitorIds; InterfaceMonitorIdBuilder interfaceMonitorIdBuilder = new InterfaceMonitorIdBuilder(); - InstanceIdentifier id = InstanceIdentifier.builder(InterfaceMonitorIdMap.class).child(InterfaceMonitorId.class, new InterfaceMonitorIdKey(infName)).build(); - Optional interfaceMonitorIdMap = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, id, broker); + InstanceIdentifier id = InstanceIdentifier.builder(InterfaceMonitorIdMap.class) + .child(InterfaceMonitorId.class, new InterfaceMonitorIdKey(infName)).build(); + Optional interfaceMonitorIdMap = tx.read(id).get(); if (interfaceMonitorIdMap.isPresent()) { interfaceMonitorIdInstance = interfaceMonitorIdMap.get(); existingMonitorIds = interfaceMonitorIdInstance.getMonitorId(); @@ -175,104 +230,100 @@ public class AlivenessMonitorUtils { } if (!existingMonitorIds.contains(monitorId)) { existingMonitorIds.add(monitorId); - interfaceMonitorIdInstance = interfaceMonitorIdBuilder.setKey(new InterfaceMonitorIdKey(infName)).setMonitorId(existingMonitorIds).build(); - MDSALUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, id, interfaceMonitorIdInstance); + interfaceMonitorIdInstance = interfaceMonitorIdBuilder.withKey(new InterfaceMonitorIdKey(infName)) + .setMonitorId(existingMonitorIds).build(); + tx.mergeParentStructureMerge(id, interfaceMonitorIdInstance); } } else { existingMonitorIds = new ArrayList<>(); existingMonitorIds.add(monitorId); - interfaceMonitorIdInstance = interfaceMonitorIdBuilder.setMonitorId(existingMonitorIds).setKey(new InterfaceMonitorIdKey(infName)).setInterfaceName(infName).build(); - MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, id, interfaceMonitorIdInstance); + interfaceMonitorIdInstance = interfaceMonitorIdBuilder.setMonitorId(existingMonitorIds) + .withKey(new InterfaceMonitorIdKey(infName)).setInterfaceName(infName).build(); + tx.mergeParentStructureMerge(id, interfaceMonitorIdInstance); } } - public static void createOrUpdateMonitorIdInterfaceMap(DataBroker broker,String infName, long monitorId) { + private static void createOrUpdateMonitorIdInterfaceMap(TypedReadWriteTransaction tx, String infName, + Uint32 monitorId) throws ExecutionException, InterruptedException { MonitorIdInterface monitorIdInterfaceInstance; String existinginterfaceName; MonitorIdInterfaceBuilder monitorIdInterfaceBuilder = new MonitorIdInterfaceBuilder(); - InstanceIdentifier id = InstanceIdentifier.builder(MonitorIdInterfaceMap.class).child(MonitorIdInterface.class, new MonitorIdInterfaceKey(monitorId)).build(); - Optional monitorIdInterfaceMap = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, id, broker); - if(monitorIdInterfaceMap.isPresent()) { + InstanceIdentifier id = InstanceIdentifier.builder(MonitorIdInterfaceMap.class) + .child(MonitorIdInterface.class, new MonitorIdInterfaceKey(monitorId)).build(); + Optional monitorIdInterfaceMap = tx.read(id).get(); + if (monitorIdInterfaceMap.isPresent()) { monitorIdInterfaceInstance = monitorIdInterfaceMap.get(); existinginterfaceName = monitorIdInterfaceInstance.getInterfaceName(); - if(!existinginterfaceName.equals(infName)) { - monitorIdInterfaceInstance = monitorIdInterfaceBuilder.setKey(new MonitorIdInterfaceKey(monitorId)).setInterfaceName(infName).build(); - MDSALUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, id, monitorIdInterfaceInstance); + if (!Objects.equals(existinginterfaceName, infName)) { + monitorIdInterfaceInstance = monitorIdInterfaceBuilder.withKey(new MonitorIdInterfaceKey(monitorId)) + .setInterfaceName(infName).build(); + tx.mergeParentStructureMerge(id, monitorIdInterfaceInstance); } } else { - monitorIdInterfaceInstance = monitorIdInterfaceBuilder.setMonitorId(monitorId).setKey(new MonitorIdInterfaceKey(monitorId)).setInterfaceName(infName).build(); - MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, id, monitorIdInterfaceInstance); + monitorIdInterfaceInstance = monitorIdInterfaceBuilder.setMonitorId(monitorId) + .withKey(new MonitorIdInterfaceKey(monitorId)).setInterfaceName(infName).build(); + tx.mergeParentStructureMerge(id, monitorIdInterfaceInstance); } } - public static List getMonitorIdForInterface(DataBroker broker, String infName) { - InstanceIdentifier id = InstanceIdentifier.builder(InterfaceMonitorIdMap.class).child(InterfaceMonitorId.class, new InterfaceMonitorIdKey(infName)).build(); - Optional interfaceMonitorIdMap = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, id, broker); - if(interfaceMonitorIdMap.isPresent()) { - return interfaceMonitorIdMap.get().getMonitorId(); - } - return null; + private static List getMonitorIdForInterface(TypedReadTransaction tx, String infName) + throws ExecutionException, InterruptedException { + InstanceIdentifier id = InstanceIdentifier.builder(InterfaceMonitorIdMap.class) + .child(InterfaceMonitorId.class, new InterfaceMonitorIdKey(infName)).build(); + return tx.read(id).get().map(InterfaceMonitorId::getMonitorId).orElse(null); } - public static long createMonitorProfile(AlivenessMonitorService alivenessMonitor, MonitorProfileCreateInput monitorProfileCreateInput) { + public Uint32 createMonitorProfile(MonitorProfileCreateInput monitorProfileCreateInput) { try { - Future> result = alivenessMonitor.monitorProfileCreate(monitorProfileCreateInput); + Future> result = alivenessMonitorService + .monitorProfileCreate(monitorProfileCreateInput); RpcResult rpcResult = result.get(); - if(rpcResult.isSuccessful()) { + if (rpcResult.isSuccessful()) { return rpcResult.getResult().getProfileId(); } else { - LOG.warn("RPC Call to Get Profile Id Id returned with Errors {}.. Trying to fetch existing profile ID", rpcResult.getErrors()); - try{ - Profile createProfile = monitorProfileCreateInput.getProfile(); - Future> existingProfile = alivenessMonitor.monitorProfileGet(buildMonitorGetProfile(createProfile.getMonitorInterval(), createProfile.getMonitorWindow(), createProfile.getFailureThreshold(), createProfile.getProtocolType())); - RpcResult rpcGetResult = existingProfile.get(); - if(rpcGetResult.isSuccessful()){ - return rpcGetResult.getResult().getProfileId(); - }else{ - LOG.warn("RPC Call to Get Existing Profile Id returned with Errors {}", rpcGetResult.getErrors()); - } - }catch(Exception e){ - LOG.warn("Exception when getting existing profile",e); + LOG.warn("RPC Call to Get Profile Id Id returned with Errors {}.. Trying to fetch existing profile ID", + rpcResult.getErrors()); + Profile createProfile = monitorProfileCreateInput.getProfile(); + Future> existingProfile = alivenessMonitorService.monitorProfileGet( + buildMonitorGetProfile(createProfile.getMonitorInterval(), createProfile.getMonitorWindow(), + createProfile.getFailureThreshold(), createProfile.getProtocolType())); + RpcResult rpcGetResult = existingProfile.get(); + if (rpcGetResult.isSuccessful()) { + return rpcGetResult.getResult().getProfileId(); + } else { + LOG.warn("RPC Call to Get Existing Profile Id returned with Errors {}", rpcGetResult.getErrors()); } } } catch (InterruptedException | ExecutionException e) { - LOG.warn("Exception when allocating profile Id",e); + LOG.warn("Exception when allocating profile Id", e); } - return 0; + return Uint32.valueOf(0); } - private static MonitorProfileGetInput buildMonitorGetProfile(long monitorInterval, long monitorWindow, long failureThreshold, EtherTypes protocolType){ - MonitorProfileGetInputBuilder buildGetProfile = new MonitorProfileGetInputBuilder(); - org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.monitor.profile.get.input.ProfileBuilder profileBuilder = - new org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.monitor.profile.get.input.ProfileBuilder(); - profileBuilder.setFailureThreshold(failureThreshold); - profileBuilder.setMonitorInterval(monitorInterval); - profileBuilder.setMonitorWindow(monitorWindow); - profileBuilder.setProtocolType(protocolType); - buildGetProfile.setProfile(profileBuilder.build()); - return (buildGetProfile.build()); - }; - - public static long allocateProfile(AlivenessMonitorService alivenessMonitor, long FAILURE_THRESHOLD, long MONITORING_INTERVAL, - long MONITORING_WINDOW, EtherTypes etherTypes) { - MonitorProfileCreateInput input = new MonitorProfileCreateInputBuilder(). - setProfile(new ProfileBuilder().setFailureThreshold(FAILURE_THRESHOLD) - .setMonitorInterval(MONITORING_INTERVAL).setMonitorWindow(MONITORING_WINDOW). - setProtocolType(etherTypes).build()).build(); - return createMonitorProfile(alivenessMonitor, input); + private static MonitorProfileGetInput buildMonitorGetProfile(Uint32 monitorInterval, Uint32 monitorWindow, + Uint32 failureThreshold, MonitorProtocolType protocolType) { + return new MonitorProfileGetInputBuilder() + .setProfile(new org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.monitor + .profile.get.input.ProfileBuilder() + .setFailureThreshold(failureThreshold) + .setMonitorInterval(monitorInterval) + .setMonitorWindow(monitorWindow) + .setProtocolType(protocolType) + .build()) + .build(); } - public static long allocateDefaultProfile(AlivenessMonitorService alivenessMonitor, EtherTypes etherType ) { - MonitorProfileCreateInput input = new MonitorProfileCreateInputBuilder(). - setProfile(getDefaultMonitorProfile(etherType)).build(); - return createMonitorProfile(alivenessMonitor, input); + private Uint32 allocateProfile(Uint32 failureThreshold, Uint32 monitoringInterval, Uint32 monitoringWindow, + MonitorProtocolType protoType) { + MonitorProfileCreateInput input = new MonitorProfileCreateInputBuilder().setProfile( + new ProfileBuilder().setFailureThreshold(failureThreshold).setMonitorInterval(monitoringInterval) + .setMonitorWindow(monitoringWindow).setProtocolType(protoType).build()) + .build(); + return createMonitorProfile(input); } - public static Profile getDefaultMonitorProfile(EtherTypes etherType) { - ProfileBuilder profileBuilder = new ProfileBuilder(); - profileBuilder.setProtocolType(etherType); - profileBuilder.setFailureThreshold(FAILURE_THRESHOLD) - .setMonitorInterval(MONITORING_INTERVAL).setMonitorWindow(MONITORING_WINDOW).setProtocolType(etherType); - return profileBuilder.build(); + public static boolean lldpMonitoringEnabled(IfTunnel ifTunnel) { + return ifTunnel.isInternal() && ifTunnel.isMonitorEnabled() + && TunnelMonitoringTypeLldp.class.isAssignableFrom(ifTunnel.getMonitorProtocol()); } -} \ No newline at end of file +}