Committed by
Gerrit Code Review
WIP: default driver ignition
Change-Id: Ia37de8dcaee2ff2be0908fa12c567acf99ef3a13
Showing
3 changed files
with
70 additions
and
20 deletions
| ... | @@ -31,6 +31,8 @@ import org.onosproject.mastership.MastershipService; | ... | @@ -31,6 +31,8 @@ import org.onosproject.mastership.MastershipService; |
| 31 | import org.onosproject.net.Device; | 31 | import org.onosproject.net.Device; |
| 32 | import org.onosproject.net.DeviceId; | 32 | import org.onosproject.net.DeviceId; |
| 33 | import org.onosproject.net.behaviour.Pipeliner; | 33 | import org.onosproject.net.behaviour.Pipeliner; |
| 34 | +import org.onosproject.net.device.DeviceEvent; | ||
| 35 | +import org.onosproject.net.device.DeviceListener; | ||
| 34 | import org.onosproject.net.device.DeviceService; | 36 | import org.onosproject.net.device.DeviceService; |
| 35 | import org.onosproject.net.driver.Driver; | 37 | import org.onosproject.net.driver.Driver; |
| 36 | import org.onosproject.net.driver.DriverHandler; | 38 | import org.onosproject.net.driver.DriverHandler; |
| ... | @@ -73,18 +75,23 @@ public class FlowObjectiveManager implements FlowObjectiveService { | ... | @@ -73,18 +75,23 @@ public class FlowObjectiveManager implements FlowObjectiveService { |
| 73 | 75 | ||
| 74 | private MastershipListener mastershipListener = new InnerMastershipListener(); | 76 | private MastershipListener mastershipListener = new InnerMastershipListener(); |
| 75 | 77 | ||
| 78 | + private DeviceListener deviceListener = new InnerDeviceListener(); | ||
| 79 | + | ||
| 76 | private Map<DeviceId, DriverHandler> driverHandlers = | 80 | private Map<DeviceId, DriverHandler> driverHandlers = |
| 77 | Maps.newConcurrentMap(); | 81 | Maps.newConcurrentMap(); |
| 78 | 82 | ||
| 79 | @Activate | 83 | @Activate |
| 80 | protected void activate() { | 84 | protected void activate() { |
| 81 | mastershipService.addListener(mastershipListener); | 85 | mastershipService.addListener(mastershipListener); |
| 86 | + deviceService.addListener(deviceListener); | ||
| 87 | + deviceService.getDevices().forEach(device -> setupDriver(device.id())); | ||
| 82 | log.info("Started"); | 88 | log.info("Started"); |
| 83 | } | 89 | } |
| 84 | 90 | ||
| 85 | @Deactivate | 91 | @Deactivate |
| 86 | protected void deactivate() { | 92 | protected void deactivate() { |
| 87 | mastershipService.removeListener(mastershipListener); | 93 | mastershipService.removeListener(mastershipListener); |
| 94 | + deviceService.removeListener(deviceListener); | ||
| 88 | log.info("Stopped"); | 95 | log.info("Stopped"); |
| 89 | } | 96 | } |
| 90 | 97 | ||
| ... | @@ -121,27 +128,15 @@ public class FlowObjectiveManager implements FlowObjectiveService { | ... | @@ -121,27 +128,15 @@ public class FlowObjectiveManager implements FlowObjectiveService { |
| 121 | return pipe.next(nextObjectives); | 128 | return pipe.next(nextObjectives); |
| 122 | } | 129 | } |
| 123 | 130 | ||
| 131 | + | ||
| 132 | + | ||
| 124 | private class InnerMastershipListener implements MastershipListener { | 133 | private class InnerMastershipListener implements MastershipListener { |
| 125 | @Override | 134 | @Override |
| 126 | public void event(MastershipEvent event) { | 135 | public void event(MastershipEvent event) { |
| 127 | switch (event.type()) { | 136 | switch (event.type()) { |
| 128 | 137 | ||
| 129 | case MASTER_CHANGED: | 138 | case MASTER_CHANGED: |
| 130 | - //TODO: refactor this into a method | 139 | + setupDriver(event.subject()); |
| 131 | - if (event.roleInfo().master().equals( | ||
| 132 | - clusterService.getLocalNode().id())) { | ||
| 133 | - DriverHandler handler = lookupDriver(event.subject()); | ||
| 134 | - if (handler != null) { | ||
| 135 | - Pipeliner pipe = handler.behaviour(Pipeliner.class); | ||
| 136 | - pipe.init(event.subject(), serviceDirectory); | ||
| 137 | - driverHandlers.put(event.subject(), handler); | ||
| 138 | - log.info("Driver {} bound to device {}", | ||
| 139 | - handler.data().type().name(), event.subject()); | ||
| 140 | - } else { | ||
| 141 | - log.error("No driver for device {}", event.subject()); | ||
| 142 | - } | ||
| 143 | - | ||
| 144 | - } | ||
| 145 | 140 | ||
| 146 | break; | 141 | break; |
| 147 | case BACKUPS_CHANGED: | 142 | case BACKUPS_CHANGED: |
| ... | @@ -151,13 +146,64 @@ public class FlowObjectiveManager implements FlowObjectiveService { | ... | @@ -151,13 +146,64 @@ public class FlowObjectiveManager implements FlowObjectiveService { |
| 151 | } | 146 | } |
| 152 | } | 147 | } |
| 153 | 148 | ||
| 154 | - private DriverHandler lookupDriver(DeviceId deviceId) { | ||
| 155 | - Device device = deviceService.getDevice(deviceId); | ||
| 156 | 149 | ||
| 157 | - Driver driver = driverService.getDriver(device.manufacturer(), | 150 | + } |
| 158 | - device.hwVersion(), device.swVersion()); | ||
| 159 | 151 | ||
| 160 | - return driverService.createHandler(driver.name(), deviceId); | 152 | + private class InnerDeviceListener implements DeviceListener { |
| 153 | + @Override | ||
| 154 | + public void event(DeviceEvent event) { | ||
| 155 | + switch (event.type()) { | ||
| 156 | + case DEVICE_ADDED: | ||
| 157 | + case DEVICE_AVAILABILITY_CHANGED: | ||
| 158 | + setupDriver(event.subject().id()); | ||
| 159 | + break; | ||
| 160 | + case DEVICE_UPDATED: | ||
| 161 | + break; | ||
| 162 | + case DEVICE_REMOVED: | ||
| 163 | + break; | ||
| 164 | + case DEVICE_SUSPENDED: | ||
| 165 | + break; | ||
| 166 | + case PORT_ADDED: | ||
| 167 | + break; | ||
| 168 | + case PORT_UPDATED: | ||
| 169 | + break; | ||
| 170 | + case PORT_REMOVED: | ||
| 171 | + break; | ||
| 172 | + default: | ||
| 173 | + log.warn("Unknown event type {}", event.type()); | ||
| 174 | + } | ||
| 175 | + } | ||
| 176 | + } | ||
| 177 | + | ||
| 178 | + private void setupDriver(DeviceId deviceId) { | ||
| 179 | + //TODO: Refactor this to make it nicer and use a cache. | ||
| 180 | + if (mastershipService.getMasterFor( | ||
| 181 | + deviceId).equals(clusterService.getLocalNode().id())) { | ||
| 182 | + | ||
| 183 | + DriverHandler handler = lookupDriver(deviceId); | ||
| 184 | + if (handler != null) { | ||
| 185 | + Pipeliner pipe = handler.behaviour(Pipeliner.class); | ||
| 186 | + pipe.init(deviceId, serviceDirectory); | ||
| 187 | + driverHandlers.put(deviceId, handler); | ||
| 188 | + log.info("Driver {} bound to device {}", | ||
| 189 | + handler.data().type().name(), deviceId); | ||
| 190 | + } else { | ||
| 191 | + log.error("No driver for device {}", deviceId); | ||
| 192 | + } | ||
| 161 | } | 193 | } |
| 162 | } | 194 | } |
| 195 | + | ||
| 196 | + | ||
| 197 | + private DriverHandler lookupDriver(DeviceId deviceId) { | ||
| 198 | + Device device = deviceService.getDevice(deviceId); | ||
| 199 | + if (device == null) { | ||
| 200 | + log.warn("Device is null!"); | ||
| 201 | + return null; | ||
| 202 | + } | ||
| 203 | + Driver driver = driverService.getDriver(device.manufacturer(), | ||
| 204 | + device.hwVersion(), device.swVersion()); | ||
| 205 | + | ||
| 206 | + return driverService.createHandler(driver.name(), deviceId); | ||
| 207 | + } | ||
| 208 | + | ||
| 163 | } | 209 | } | ... | ... |
This diff is collapsed. Click to expand it.
| ... | @@ -19,4 +19,8 @@ | ... | @@ -19,4 +19,8 @@ |
| 19 | <behaviour api="org.onosproject.net.behaviour.Pipeliner" | 19 | <behaviour api="org.onosproject.net.behaviour.Pipeliner" |
| 20 | impl="org.onosproject.driver.pipeline.DefaultSingleTablePipeline"/> | 20 | impl="org.onosproject.driver.pipeline.DefaultSingleTablePipeline"/> |
| 21 | </driver> | 21 | </driver> |
| 22 | + <driver name="ovs-corsa" manufacturer="Nicira, Inc." hwVersion="Open vSwitch" swVersion="2.3.0"> | ||
| 23 | + <behaviour api="org.onosproject.net.behaviour.Pipeliner" | ||
| 24 | + impl="org.onosproject.driver.pipeline.OVSCorsaPipeline"/> | ||
| 25 | + </driver> | ||
| 22 | </drivers> | 26 | </drivers> |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or login to post a comment