Carmelo Cascone
Committed by Gerrit Code Review

Added device listener to fallback flow rule provider to trigger flow

entries probe after device events

Helpful for devices that do not provide configuration persistency,
to quickly restore flow rules after a reboot or an update.

Change-Id: I35dee1ff56076ddda7d22c353a01d518f2f88eed
...@@ -24,6 +24,8 @@ import org.onosproject.core.ApplicationId; ...@@ -24,6 +24,8 @@ import org.onosproject.core.ApplicationId;
24 import org.onosproject.mastership.MastershipService; 24 import org.onosproject.mastership.MastershipService;
25 import org.onosproject.net.Device; 25 import org.onosproject.net.Device;
26 import org.onosproject.net.DeviceId; 26 import org.onosproject.net.DeviceId;
27 +import org.onosproject.net.device.DeviceEvent;
28 +import org.onosproject.net.device.DeviceListener;
27 import org.onosproject.net.device.DeviceService; 29 import org.onosproject.net.device.DeviceService;
28 import org.onosproject.net.flow.CompletedBatchOperation; 30 import org.onosproject.net.flow.CompletedBatchOperation;
29 import org.onosproject.net.flow.FlowRule; 31 import org.onosproject.net.flow.FlowRule;
...@@ -45,6 +47,7 @@ import java.util.concurrent.ScheduledFuture; ...@@ -45,6 +47,7 @@ import java.util.concurrent.ScheduledFuture;
45 import java.util.concurrent.TimeUnit; 47 import java.util.concurrent.TimeUnit;
46 48
47 import static com.google.common.collect.ImmutableSet.copyOf; 49 import static com.google.common.collect.ImmutableSet.copyOf;
50 +import static org.onosproject.net.device.DeviceEvent.Type.*;
48 import static org.onosproject.net.flow.FlowRuleBatchEntry.FlowRuleOperation.*; 51 import static org.onosproject.net.flow.FlowRuleBatchEntry.FlowRuleOperation.*;
49 52
50 /** 53 /**
...@@ -62,6 +65,7 @@ class FlowRuleDriverProvider extends AbstractProvider implements FlowRuleProvide ...@@ -62,6 +65,7 @@ class FlowRuleDriverProvider extends AbstractProvider implements FlowRuleProvide
62 private DeviceService deviceService; 65 private DeviceService deviceService;
63 private MastershipService mastershipService; 66 private MastershipService mastershipService;
64 67
68 + private InternalDeviceListener deviceListener = new InternalDeviceListener();
65 private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); 69 private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
66 private ScheduledFuture<?> poller = null; 70 private ScheduledFuture<?> poller = null;
67 71
...@@ -87,6 +91,8 @@ class FlowRuleDriverProvider extends AbstractProvider implements FlowRuleProvide ...@@ -87,6 +91,8 @@ class FlowRuleDriverProvider extends AbstractProvider implements FlowRuleProvide
87 this.deviceService = deviceService; 91 this.deviceService = deviceService;
88 this.mastershipService = mastershipService; 92 this.mastershipService = mastershipService;
89 93
94 + deviceService.addListener(deviceListener);
95 +
90 if (poller != null && !poller.isCancelled()) { 96 if (poller != null && !poller.isCancelled()) {
91 poller.cancel(false); 97 poller.cancel(false);
92 } 98 }
...@@ -164,14 +170,33 @@ class FlowRuleDriverProvider extends AbstractProvider implements FlowRuleProvide ...@@ -164,14 +170,33 @@ class FlowRuleDriverProvider extends AbstractProvider implements FlowRuleProvide
164 } 170 }
165 } 171 }
166 172
173 + private void pollDeviceFlowEntries(Device device) {
174 + providerService.pushFlowMetrics(device.id(), device.as(FlowRuleProgrammable.class).getFlowEntries());
175 + }
167 176
168 private void pollFlowEntries() { 177 private void pollFlowEntries() {
169 deviceService.getAvailableDevices().forEach(device -> { 178 deviceService.getAvailableDevices().forEach(device -> {
170 if (mastershipService.isLocalMaster(device.id()) && device.is(FlowRuleProgrammable.class)) { 179 if (mastershipService.isLocalMaster(device.id()) && device.is(FlowRuleProgrammable.class)) {
171 - providerService.pushFlowMetrics(device.id(), 180 + pollDeviceFlowEntries(device);
172 - device.as(FlowRuleProgrammable.class).getFlowEntries());
173 } 181 }
174 }); 182 });
175 } 183 }
176 184
185 + private class InternalDeviceListener implements DeviceListener {
186 +
187 + @Override
188 + public void event(DeviceEvent event) {
189 + executor.schedule(() -> pollDeviceFlowEntries(event.subject()), 0, TimeUnit.SECONDS);
190 + }
191 +
192 + @Override
193 + public boolean isRelevant(DeviceEvent event) {
194 + Device device = event.subject();
195 + return mastershipService.isLocalMaster(device.id()) && device.is(FlowRuleProgrammable.class) &&
196 + (event.type() == DEVICE_ADDED ||
197 + event.type() == DEVICE_UPDATED ||
198 + (event.type() == DEVICE_AVAILABILITY_CHANGED && deviceService.isAvailable(device.id())));
199 + }
200 + }
201 +
177 } 202 }
......