NETVIRT-1630 migrate to md-sal APIs
[netvirt.git] / vpnmanager / impl / src / main / java / org / opendaylight / netvirt / vpnmanager / iplearn / AlivenessMonitorUtils.java
index f99da2ccbfa64ca5539c13d23af4c51bdb00d4ad..e4b2985a2cc55395c1b4c406a023b6dc9c8b42dc 100644 (file)
@@ -7,17 +7,19 @@
  */
 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;
@@ -25,6 +27,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 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;
@@ -38,6 +41,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev
 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;
@@ -46,7 +51,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev
 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;
 
@@ -96,12 +103,12 @@ public final class AlivenessMonitorUtils {
 
         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());
@@ -116,7 +123,7 @@ public final class AlivenessMonitorUtils {
             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 {
@@ -127,12 +134,12 @@ public final class AlivenessMonitorUtils {
         }
     }
 
-    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;
     }
 
@@ -148,8 +155,8 @@ public final class AlivenessMonitorUtils {
             .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) {
@@ -158,18 +165,18 @@ public final class AlivenessMonitorUtils {
         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)
@@ -180,7 +187,7 @@ public final class AlivenessMonitorUtils {
 
     // 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);
@@ -193,8 +200,9 @@ public final class AlivenessMonitorUtils {
                 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()) {
@@ -210,7 +218,7 @@ public final class AlivenessMonitorUtils {
         } 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,
@@ -239,12 +247,27 @@ public final class AlivenessMonitorUtils {
             .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();
+    }
+
 }