*/
package org.opendaylight.netvirt.vpnmanager.iplearn;
-import com.google.common.base.Optional;
import java.util.Map;
+import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import javax.inject.Inject;
import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.genius.arputil.api.ArpConstants;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
import org.opendaylight.netvirt.vpnmanager.VpnUtil;
import org.opendaylight.netvirt.vpnmanager.iplearn.model.MacEntry;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
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.genius.alivenessmonitor.rev160411.AlivenessMonitorService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.InterfaceMonitorMap;
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.MonitorStopInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitorStopInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.MonitoringMode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411._interface.monitor.map.InterfaceMonitorEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411._interface.monitor.map.InterfaceMonitorEntryKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.endpoint.endpoint.type.Interface;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.endpoint.endpoint.type.InterfaceBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.monitor.params.DestinationBuilder;
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.netvirt.vpn.config.rev161130.VpnConfig;
+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;
final IpAddress targetIp = IetfInetUtil.INSTANCE.ipAddressFor(macEntry.getIpAddress());
if (ipMonitorProfileId == null || ipMonitorProfileId.equals(0L)) {
- Optional<Long> profileIdOptional = allocateIpMonitorProfile(targetIp);
+ Optional<Uint32> profileIdOptional = allocateIpMonitorProfile(targetIp);
if (!profileIdOptional.isPresent()) {
LOG.error("startIpMonitoring: Error while allocating Profile Id for IP={}", targetIp);
return;
}
- ipMonitorProfileId = profileIdOptional.get();
+ ipMonitorProfileId = profileIdOptional.get().toJava();
}
final PhysAddress gatewayMac = new PhysAddress(gatewayMacOptional.get());
RpcResult<MonitorStartOutput> rpcResult = result.get();
long monitorId;
if (rpcResult.isSuccessful()) {
- monitorId = rpcResult.getResult().getMonitorId();
+ monitorId = rpcResult.getResult().getMonitorId().toJava();
createOrUpdateInterfaceMonitorIdMap(monitorId, macEntry);
LOG.trace("Started IP monitoring with id {}", monitorId);
} else {
}
}
- void stopIpMonitoring(Long monitorId) {
+ void stopIpMonitoring(Uint32 monitorId) {
MonitorStopInput input = new MonitorStopInputBuilder().setMonitorId(monitorId).build();
JdkFutures.addErrorLogging(alivenessManager.monitorStop(input), LOG, "Stop monitoring");
- alivenessCache.remove(monitorId);
+ alivenessCache.remove(monitorId.toJava());
return;
}
.build();
}
- private Optional<Long> allocateIpMonitorProfile(IpAddress targetIp) {
- Optional<Long> profileIdOptional = Optional.absent();
+ private Optional<Uint32> allocateIpMonitorProfile(IpAddress targetIp) {
+ Optional<Uint32> profileIdOptional = Optional.empty();
if (targetIp.getIpv4Address() != null) {
profileIdOptional = allocateArpMonitorProfile();
} else if (targetIp.getIpv6Address() != null) {
return profileIdOptional;
}
- public Optional<Long> allocateArpMonitorProfile() {
+ public Optional<Uint32> allocateArpMonitorProfile() {
return allocateProfile(ArpConstants.FAILURE_THRESHOLD, ArpConstants.ARP_CACHE_TIMEOUT_MILLIS,
ArpConstants.MONITORING_WINDOW, MonitorProtocolType.Arp);
}
- public Optional<Long> allocateIpv6NaMonitorProfile() {
- Long monitorInterval = vpnConfig.getIpv6NdMonitorInterval() * 1000; // converting to milliseconds
- return allocateProfile(vpnConfig.getIpv6NdMonitorFailureThreshold(), monitorInterval,
- vpnConfig.getIpv6NdMonitorWindow(), MonitorProtocolType.Ipv6Nd);
+ public Optional<Uint32> allocateIpv6NaMonitorProfile() {
+ Long monitorInterval = vpnConfig.getIpv6NdMonitorInterval().toJava() * 1000; // converting to milliseconds
+ return allocateProfile(vpnConfig.getIpv6NdMonitorFailureThreshold().toJava(), monitorInterval,
+ vpnConfig.getIpv6NdMonitorWindow().toJava(), MonitorProtocolType.Ipv6Nd);
}
- public Optional<Long> allocateProfile(long failureThreshold, long monitoringInterval, long monitoringWindow,
+ public Optional<Uint32> allocateProfile(long failureThreshold, long monitoringInterval, long monitoringWindow,
MonitorProtocolType protocolType) {
MonitorProfileCreateInput input = new MonitorProfileCreateInputBuilder()
.setProfile(new ProfileBuilder().setFailureThreshold(failureThreshold)
// TODO Clean up the exception handling
@SuppressWarnings("checkstyle:IllegalCatch")
- public Optional<Long> createMonitorProfile(MonitorProfileCreateInput monitorProfileCreateInput) {
+ public Optional<Uint32> createMonitorProfile(MonitorProfileCreateInput monitorProfileCreateInput) {
try {
Future<RpcResult<MonitorProfileCreateOutput>> result =
alivenessManager.monitorProfileCreate(monitorProfileCreateInput);
try {
Profile createProfile = monitorProfileCreateInput.getProfile();
Future<RpcResult<MonitorProfileGetOutput>> existingProfile =
- alivenessManager.monitorProfileGet(buildMonitorGetProfile(createProfile.getMonitorInterval(),
- createProfile.getMonitorWindow(), createProfile.getFailureThreshold(),
+ alivenessManager.monitorProfileGet(buildMonitorGetProfile(
+ createProfile.getMonitorInterval().toJava(),
+ createProfile.getMonitorWindow().toJava(), createProfile.getFailureThreshold().toJava(),
createProfile.getProtocolType()));
RpcResult<MonitorProfileGetOutput> rpcGetResult = existingProfile.get();
if (rpcGetResult.isSuccessful()) {
} catch (InterruptedException | ExecutionException e) {
LOG.warn("Exception when allocating profile Id", e);
}
- return Optional.absent();
+ return Optional.empty();
}
private MonitorProfileGetInput buildMonitorGetProfile(long monitorInterval, long monitorWindow,
.endpoint.endpoint.type.IpAddressBuilder().setIpAddress(ip).build();
}
- public static java.util.Optional<Long> getMonitorIdFromInterface(MacEntry macEntry) {
- java.util.Optional<Long> monitorId = alivenessCache.entrySet().parallelStream()
- .filter(map -> macEntry.equals(map.getValue()))
- .map(Map.Entry::getKey)
- .findFirst();
+ public java.util.Optional<Uint32> getMonitorIdFromInterface(MacEntry macEntry) {
+ String interfaceName = macEntry.getInterfaceName();
+ java.util.Optional<Uint32> monitorId = java.util.Optional.empty();
+ Optional<InterfaceMonitorEntry> interfaceMonitorEntryOptional = Optional.empty();
+ try {
+ interfaceMonitorEntryOptional = SingleTransactionDataBroker
+ .syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
+ getInterfaceMonitorMapId(interfaceName));
+ } catch (ExecutionException | InterruptedException e) {
+ LOG.error("getMonitorIdFromInterface: Exception while reading Interface Monitor MapId for the "
+ + "interface {} ", interfaceName, e);
+ }
+ if (interfaceMonitorEntryOptional.isPresent()) {
+ return java.util.Optional.of(interfaceMonitorEntryOptional.get().getMonitorIds().get(0));
+ }
return monitorId;
}
+ private InstanceIdentifier<InterfaceMonitorEntry> getInterfaceMonitorMapId(String interfaceName) {
+ return InstanceIdentifier.builder(InterfaceMonitorMap.class)
+ .child(InterfaceMonitorEntry.class, new InterfaceMonitorEntryKey(interfaceName)).build();
+ }
+
}