Trigger pipeconf deploy right after registration
Without waiting for the next pipeconf watchdog periodic probe.
To support this, this patch extends the PiPipeconfService to advertise
pipeconf registration events.
Change-Id: Ib44f1813bd37083c666a5e7980de320ce469c2d2
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/PiPipeconfWatchdogManager.java b/core/net/src/main/java/org/onosproject/net/pi/impl/PiPipeconfWatchdogManager.java
index e76d673..21df778 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/PiPipeconfWatchdogManager.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/PiPipeconfWatchdogManager.java
@@ -35,6 +35,8 @@
import org.onosproject.net.device.DeviceService;
import org.onosproject.net.pi.model.PiPipeconf;
import org.onosproject.net.pi.model.PiPipeconfId;
+import org.onosproject.net.pi.service.PiPipeconfEvent;
+import org.onosproject.net.pi.service.PiPipeconfListener;
import org.onosproject.net.pi.service.PiPipeconfMappingStore;
import org.onosproject.net.pi.service.PiPipeconfService;
import org.onosproject.net.pi.service.PiPipeconfWatchdogEvent;
@@ -57,6 +59,7 @@
import java.util.Dictionary;
import java.util.Map;
+import java.util.Objects;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
@@ -75,11 +78,11 @@
* pipeline.
*/
@Component(
- immediate = true,
- service = PiPipeconfWatchdogService.class,
- property = {
- PWM_PROBE_INTERVAL + ":Integer=" + PWM_PROBE_INTERVAL_DEFAULT
- }
+ immediate = true,
+ service = PiPipeconfWatchdogService.class,
+ property = {
+ PWM_PROBE_INTERVAL + ":Integer=" + PWM_PROBE_INTERVAL_DEFAULT
+ }
)
public class PiPipeconfWatchdogManager
extends AbstractListenerManager<PiPipeconfWatchdogEvent, PiPipeconfWatchdogListener>
@@ -107,13 +110,16 @@
@Reference(cardinality = ReferenceCardinality.MANDATORY)
private ComponentConfigService componentConfigService;
- /** Configure interval in seconds for device pipeconf probing. */
+ /**
+ * Configure interval in seconds for device pipeconf probing.
+ */
private int probeInterval = PWM_PROBE_INTERVAL_DEFAULT;
protected ExecutorService executor = Executors.newFixedThreadPool(
30, groupedThreads("onos/pipeconf-watchdog", "%d", log));
- private final InternalDeviceListener deviceListener = new InternalDeviceListener();
+ private final DeviceListener deviceListener = new InternalDeviceListener();
+ private final PiPipeconfListener pipeconfListener = new InternalPipeconfListener();
private Timer timer;
private TimerTask task;
@@ -141,8 +147,9 @@
// Start periodic watchdog task.
timer = new Timer();
startProbeTask();
- // Add device listener.
+ // Add listeners.
deviceService.addListener(deviceListener);
+ pipeconfService.addListener(pipeconfListener);
log.info("Started");
}
@@ -167,6 +174,7 @@
@Deactivate
public void deactivate() {
eventDispatcher.removeSink(PiPipeconfWatchdogEvent.class);
+ pipeconfService.removeListener(pipeconfListener);
deviceService.removeListener(deviceListener);
stopProbeTask();
timer = null;
@@ -205,7 +213,8 @@
}
if (!pipeconfService.getPipeconf(pipeconfId).isPresent()) {
- log.error("Pipeconf {} is not registered", pipeconfId);
+ log.warn("Pipeconf {} is not registered, skipping probe for {}",
+ pipeconfId, device.id());
return;
}
@@ -356,6 +365,19 @@
}
}
+ private class InternalPipeconfListener implements PiPipeconfListener {
+ @Override
+ public void event(PiPipeconfEvent event) {
+ pipeconfMappingStore.getDevices(event.subject())
+ .forEach(PiPipeconfWatchdogManager.this::triggerProbe);
+ }
+
+ @Override
+ public boolean isRelevant(PiPipeconfEvent event) {
+ return Objects.equals(event.type(), PiPipeconfEvent.Type.REGISTERED);
+ }
+ }
+
private class StatusMapListener
implements EventuallyConsistentMapListener<DeviceId, PipelineStatus> {