X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=interfacemgr%2Finterfacemgr-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fvpnservice%2Finterfacemgr%2Fcommons%2FAlivenessMonitorUtils.java;h=a9fcf828dbfd7c5c99119f620d357135c907c23a;hb=HEAD;hp=abc3b2c837690ff1034739c7902b3cfb7844f692;hpb=f9d8e6e870058d86479e0195feaf6f6226139078;p=vpnservice.git 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 abc3b2c8..a9fcf828 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 @@ -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, @@ -9,38 +9,20 @@ package org.opendaylight.vpnservice.interfacemgr.commons; import com.google.common.base.Optional; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.vpnservice.interfacemgr.IfmConstants; import org.opendaylight.vpnservice.interfacemgr.IfmUtil; import org.opendaylight.vpnservice.mdsalutil.MDSALUtil; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddressBuilder; 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.vpnservice.alivenessmonitor.rev150629.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.endpoint.endpoint.type.IpAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.monitor.params.SourceBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.monitor.profile.create.input.Profile; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.monitor.profile.create.input.ProfileBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.monitor.start.input.ConfigBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterface; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterfaceBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterfaceKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info.InterfaceParentEntry; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info.InterfaceParentEntryKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info._interface.parent.entry.InterfaceChildEntry; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info._interface.parent.entry.InterfaceChildEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.monitor.id.map.InterfaceMonitorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.monitor.id.map.InterfaceMonitorIdBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.monitor.id.map.InterfaceMonitorIdKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntry; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntryKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntry; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntryBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntryKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntry; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.monitor.id._interface.map.MonitorIdInterface; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.monitor.id._interface.map.MonitorIdInterfaceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.monitor.id._interface.map.MonitorIdInterfaceKey; @@ -59,22 +41,22 @@ import java.util.concurrent.Future; public class AlivenessMonitorUtils { private static final Logger LOG = LoggerFactory.getLogger(AlivenessMonitorUtils.class); - private static final int FAILURE_THRESHOLD = 4; - private static final int MONITORING_INTERVAL = 10000; - private static final int MONITORING_WINDOW = 4; + private static final long FAILURE_THRESHOLD = 4; + private static final long MONITORING_INTERVAL = 10000; + private static final long MONITORING_WINDOW = 4; 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)) { - MonitorStartInput lldpMonitorInput = new MonitorStartInputBuilder().setConfig(new ConfigBuilder() - .setSource(new SourceBuilder().setEndpointType(getInterfaceForMonitoring(trunkInterfaceName, - ifTunnel.getTunnelSource())).build()) - .setMode(MonitoringMode.OneOne) - .setProfileId(allocateProfile(alivenessMonitorService, FAILURE_THRESHOLD, MONITORING_INTERVAL, MONITORING_WINDOW, - EtherTypes.Lldp)).build()).build(); + 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(); try { Future> result = alivenessMonitorService.monitorStart(lldpMonitorInput); RpcResult rpcResult = result.get(); @@ -96,9 +78,10 @@ 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)){ + 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); @@ -148,55 +131,34 @@ public class AlivenessMonitorUtils { } } - private static org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.endpoint.endpoint.type.Interface getInterfaceForMonitoring(String interfaceName, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress ipAddress) { + private static org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.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.vpnservice.alivenessmonitor.rev150629.endpoint. endpoint.type.InterfaceBuilder().setInterfaceIp(ipAddress).setInterfaceName(interfaceName).build(); } - protected void handleTunnelMonitorEnabledUpdates(AlivenessMonitorService alivenessMonitorService, DataBroker dataBroker, - List interfaceNames, boolean origMonitorEnabled, boolean updatedMonitorEnabled) { - for (String interfaceName : interfaceNames) { - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface tunnelInterface = - InterfaceManagerCommonUtils.getInterfaceFromConfigDS(new InterfaceKey(interfaceName), dataBroker); - IfTunnel ifTunnel = tunnelInterface.getAugmentation(IfTunnel.class); - InterfaceManagerCommonUtils.updateTunnelMonitorDetailsInConfigDS(dataBroker, interfaceName, updatedMonitorEnabled, 3); - // Check if monitoring is started already - if (getMonitorIdForInterface(dataBroker, interfaceName) != null) { - // Get updated Interface details from Config DS - if(ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)) { - if (updatedMonitorEnabled) { - startLLDPMonitoring(alivenessMonitorService, dataBroker, tunnelInterface); - } else { - stopLLDPMonitoring(alivenessMonitorService, dataBroker, tunnelInterface); - } - } - } + public static void handleTunnelMonitorUpdates(AlivenessMonitorService alivenessMonitorService, DataBroker dataBroker, + Interface interfaceOld, Interface interfaceNew) { + String interfaceName = interfaceNew.getName(); + IfTunnel ifTunnelNew = interfaceNew.getAugmentation(IfTunnel.class); + if(!(ifTunnelNew.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)&& + ifTunnelNew.isInternal())){ + return; } - } + LOG.debug("handling tunnel monitoring updates for interface {}", interfaceName); - protected void handleTunnelMonitorIntervalUpdates(AlivenessMonitorService alivenessMonitorService, DataBroker dataBroker, - List interfaceNames, long origMonitorInterval, long updatedMonitorInterval) { - for (String interfaceName : interfaceNames) { - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface tunnelInterface = - InterfaceManagerCommonUtils.getInterfaceFromConfigDS(new InterfaceKey(interfaceName), dataBroker); - IfTunnel ifTunnel = tunnelInterface.getAugmentation(IfTunnel.class); - InterfaceManagerCommonUtils.updateTunnelMonitorDetailsInConfigDS(dataBroker, interfaceName, ifTunnel.isMonitorEnabled(), updatedMonitorInterval); - // Restart LLDP monitoring only if it's started already - List monitorIds = getMonitorIdForInterface(dataBroker, interfaceName); - if (monitorIds != null && monitorIds.size() > 1) { - // Get updated Interface details from Config DS - if(ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)) { - stopLLDPMonitoring(alivenessMonitorService, dataBroker, tunnelInterface); - startLLDPMonitoring(alivenessMonitorService, dataBroker,tunnelInterface); - } + 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); } } - // Delete old profile from Aliveness Manager - if (origMonitorInterval > 0) { - long profileId = allocateProfile(alivenessMonitorService, 4, origMonitorInterval, 4, EtherTypes.Lldp); - MonitorProfileDeleteInput profileDeleteInput = new MonitorProfileDeleteInputBuilder().setProfileId(profileId).build(); - alivenessMonitorService.monitorProfileDelete(profileDeleteInput); - } } @@ -253,20 +215,64 @@ public class AlivenessMonitorUtils { return null; } - public static long allocateProfile(AlivenessMonitorService alivenessMonitor, long failureThreshold, long interval, long window, EtherTypes etherType ) { - MonitorProfileCreateInput input = new MonitorProfileCreateInputBuilder().setProfile(new ProfileBuilder().setFailureThreshold(failureThreshold) - .setMonitorInterval(interval).setMonitorWindow(window).setProtocolType(etherType).build()).build(); + public static long createMonitorProfile(AlivenessMonitorService alivenessMonitor, MonitorProfileCreateInput monitorProfileCreateInput) { try { - Future> result = alivenessMonitor.monitorProfileCreate(input); + Future> result = alivenessMonitor.monitorProfileCreate(monitorProfileCreateInput); RpcResult rpcResult = result.get(); if(rpcResult.isSuccessful()) { return rpcResult.getResult().getProfileId(); } else { - LOG.warn("RPC Call to Get Profile Id Id returned with Errors {}", rpcResult.getErrors()); + 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); + } } } catch (InterruptedException | ExecutionException e) { LOG.warn("Exception when allocating profile Id",e); } return 0; } -} \ No newline at end of file + + private static MonitorProfileGetInput buildMonitorGetProfile(long monitorInterval, long monitorWindow, long failureThreshold, EtherTypes protocolType){ + MonitorProfileGetInputBuilder buildGetProfile = new MonitorProfileGetInputBuilder(); + org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.monitor.profile.get.input.ProfileBuilder profileBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.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); + } + + public static long allocateDefaultProfile(AlivenessMonitorService alivenessMonitor, EtherTypes etherType ) { + MonitorProfileCreateInput input = new MonitorProfileCreateInputBuilder(). + setProfile(getDefaultMonitorProfile(etherType)).build(); + return createMonitorProfile(alivenessMonitor, 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(); + } +}