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
Showing
1 changed file
with
27 additions
and
2 deletions
... | @@ -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 | } | ... | ... |
-
Please register or login to post a comment