Do not clear the P4Runtime device mirror when devices go offline

Implementations of P4Runtime like Stratum are expected to persist table
entries and other data plane state across reboots.

Change-Id: I4395e9e60b395bfca85c71c9d3bc604a2269a3ce
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/AbstractDistributedP4RuntimeMirror.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/AbstractDistributedP4RuntimeMirror.java
index 33bae9d..e869cbd 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/AbstractDistributedP4RuntimeMirror.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/AbstractDistributedP4RuntimeMirror.java
@@ -19,15 +19,11 @@
 import com.google.common.annotations.Beta;
 import com.google.common.collect.Maps;
 import org.onlab.util.KryoNamespace;
-import org.onlab.util.SharedExecutors;
 import org.onosproject.net.Annotations;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.pi.runtime.PiEntity;
 import org.onosproject.net.pi.runtime.PiEntityType;
 import org.onosproject.net.pi.runtime.PiHandle;
-import org.onosproject.net.pi.service.PiPipeconfWatchdogEvent;
-import org.onosproject.net.pi.service.PiPipeconfWatchdogListener;
-import org.onosproject.net.pi.service.PiPipeconfWatchdogService;
 import org.onosproject.p4runtime.api.P4RuntimeWriteClient.EntityUpdateRequest;
 import org.onosproject.p4runtime.api.P4RuntimeWriteClient.WriteRequest;
 import org.onosproject.p4runtime.api.P4RuntimeWriteClient.WriteResponse;
@@ -43,12 +39,10 @@
 
 import java.util.Collection;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.net.pi.service.PiPipeconfWatchdogService.PipelineStatus.READY;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -68,17 +62,11 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected PiPipeconfWatchdogService pipeconfWatchdogService;
-
     private EventuallyConsistentMap<PiHandle, TimedEntry<E>> mirrorMap;
     private EventuallyConsistentMap<PiHandle, Annotations> annotationsMap;
 
     private final PiEntityType entityType;
 
-    private final PiPipeconfWatchdogListener pipeconfListener =
-            new InternalPipeconfWatchdogListener();
-
     AbstractDistributedP4RuntimeMirror(PiEntityType entityType) {
         this.entityType = entityType;
     }
@@ -106,13 +94,11 @@
                 .withTimestampProvider((k, v) -> new WallClockTimestamp())
                 .build();
 
-        pipeconfWatchdogService.addListener(pipeconfListener);
         log.info("Started");
     }
 
     @Deactivate
     public void deactivate() {
-        pipeconfWatchdogService.removeListener(pipeconfListener);
         mirrorMap.destroy();
         mirrorMap = null;
         log.info("Stopped");
@@ -137,14 +123,6 @@
     public void put(H handle, E entry) {
         checkNotNull(handle);
         checkNotNull(entry);
-        final PiPipeconfWatchdogService.PipelineStatus status =
-                pipeconfWatchdogService.getStatus(handle.deviceId());
-        if (!status.equals(READY)) {
-            log.info("Ignoring device mirror update because pipeline " +
-                             "status of {} is {}: {}",
-                     handle.deviceId(), status, entry);
-            return;
-        }
         final long now = new WallClockTimestamp().unixTimestamp();
         final TimedEntry<E> timedEntry = new TimedEntry<>(now, entry);
         mirrorMap.put(handle, timedEntry);
@@ -212,12 +190,6 @@
         }
     }
 
-    private Set<PiHandle> getHandlesForDevice(DeviceId deviceId) {
-        return mirrorMap.keySet().stream()
-                .filter(h -> h.deviceId().equals(deviceId))
-                .collect(Collectors.toSet());
-    }
-
     private Map<PiHandle, E> deviceHandleMap(DeviceId deviceId) {
         final Map<PiHandle, E> deviceMap = Maps.newHashMap();
         mirrorMap.entrySet().stream()
@@ -226,14 +198,6 @@
         return deviceMap;
     }
 
-
-    private void removeAll(DeviceId deviceId) {
-        checkNotNull(deviceId);
-        @SuppressWarnings("unchecked")
-        Collection<H> handles = (Collection<H>) getHandlesForDevice(deviceId);
-        handles.forEach(this::remove);
-    }
-
     @Override
     public void applyWriteRequest(WriteRequest request) {
         // Optimistically assume all requests will be successful.
@@ -264,19 +228,4 @@
                     }
                 });
     }
-
-    public class InternalPipeconfWatchdogListener implements PiPipeconfWatchdogListener {
-        @Override
-        public void event(PiPipeconfWatchdogEvent event) {
-            log.debug("Flushing mirror for {}, pipeline status is {}",
-                      event.subject(), event.type());
-            SharedExecutors.getPoolThreadExecutor().execute(
-                    () -> removeAll(event.subject()));
-        }
-
-        @Override
-        public boolean isRelevant(PiPipeconfWatchdogEvent event) {
-            return event.type().equals(PiPipeconfWatchdogEvent.Type.PIPELINE_UNKNOWN);
-        }
-    }
 }