Committed by
Gerrit Code Review
olt sends an event when registering a subscriber
Change-Id: I03ab17513fa15a1a4101e7f4f8622d004d49582a
Showing
1 changed file
with
57 additions
and
101 deletions
| ... | @@ -15,17 +15,13 @@ | ... | @@ -15,17 +15,13 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.olt; | 16 | package org.onosproject.olt; |
| 17 | 17 | ||
| 18 | -import com.google.common.base.Strings; | ||
| 19 | import org.apache.felix.scr.annotations.Activate; | 18 | import org.apache.felix.scr.annotations.Activate; |
| 20 | import org.apache.felix.scr.annotations.Component; | 19 | import org.apache.felix.scr.annotations.Component; |
| 21 | import org.apache.felix.scr.annotations.Deactivate; | 20 | import org.apache.felix.scr.annotations.Deactivate; |
| 22 | -import org.apache.felix.scr.annotations.Modified; | ||
| 23 | -import org.apache.felix.scr.annotations.Property; | ||
| 24 | import org.apache.felix.scr.annotations.Reference; | 21 | import org.apache.felix.scr.annotations.Reference; |
| 25 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 22 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
| 26 | import org.apache.felix.scr.annotations.Service; | 23 | import org.apache.felix.scr.annotations.Service; |
| 27 | import org.onlab.packet.VlanId; | 24 | import org.onlab.packet.VlanId; |
| 28 | -import org.onlab.util.Tools; | ||
| 29 | import org.onosproject.core.ApplicationId; | 25 | import org.onosproject.core.ApplicationId; |
| 30 | import org.onosproject.core.CoreService; | 26 | import org.onosproject.core.CoreService; |
| 31 | import org.onosproject.event.AbstractListenerManager; | 27 | import org.onosproject.event.AbstractListenerManager; |
| ... | @@ -47,16 +43,21 @@ import org.onosproject.net.flow.TrafficTreatment; | ... | @@ -47,16 +43,21 @@ import org.onosproject.net.flow.TrafficTreatment; |
| 47 | import org.onosproject.net.flowobjective.DefaultForwardingObjective; | 43 | import org.onosproject.net.flowobjective.DefaultForwardingObjective; |
| 48 | import org.onosproject.net.flowobjective.FlowObjectiveService; | 44 | import org.onosproject.net.flowobjective.FlowObjectiveService; |
| 49 | import org.onosproject.net.flowobjective.ForwardingObjective; | 45 | import org.onosproject.net.flowobjective.ForwardingObjective; |
| 46 | +import org.onosproject.net.flowobjective.Objective; | ||
| 47 | +import org.onosproject.net.flowobjective.ObjectiveContext; | ||
| 48 | +import org.onosproject.net.flowobjective.ObjectiveError; | ||
| 50 | import org.onosproject.olt.api.AccessDeviceEvent; | 49 | import org.onosproject.olt.api.AccessDeviceEvent; |
| 51 | import org.onosproject.olt.api.AccessDeviceListener; | 50 | import org.onosproject.olt.api.AccessDeviceListener; |
| 52 | -import org.osgi.service.component.ComponentContext; | ||
| 53 | import org.slf4j.Logger; | 51 | import org.slf4j.Logger; |
| 54 | 52 | ||
| 55 | -import java.util.Dictionary; | ||
| 56 | import java.util.Map; | 53 | import java.util.Map; |
| 57 | import java.util.Optional; | 54 | import java.util.Optional; |
| 55 | +import java.util.concurrent.CompletableFuture; | ||
| 58 | import java.util.concurrent.ConcurrentHashMap; | 56 | import java.util.concurrent.ConcurrentHashMap; |
| 57 | +import java.util.concurrent.ExecutorService; | ||
| 58 | +import java.util.concurrent.Executors; | ||
| 59 | 59 | ||
| 60 | +import static org.onlab.util.Tools.groupedThreads; | ||
| 60 | import static org.slf4j.LoggerFactory.getLogger; | 61 | import static org.slf4j.LoggerFactory.getLogger; |
| 61 | 62 | ||
| 62 | /** | 63 | /** |
| ... | @@ -86,30 +87,10 @@ public class Olt | ... | @@ -86,30 +87,10 @@ public class Olt |
| 86 | private ApplicationId appId; | 87 | private ApplicationId appId; |
| 87 | 88 | ||
| 88 | private static final VlanId DEFAULT_VLAN = VlanId.vlanId((short) 0); | 89 | private static final VlanId DEFAULT_VLAN = VlanId.vlanId((short) 0); |
| 89 | - public static final int OFFSET = 200; | ||
| 90 | 90 | ||
| 91 | - public static final int UPLINK_PORT = 129; | 91 | + private ExecutorService oltInstallers = Executors.newFixedThreadPool(4, |
| 92 | - public static final int GFAST_UPLINK_PORT = 100; | 92 | + groupedThreads("onos/olt-service", |
| 93 | - | 93 | + "olt-installer-%d")); |
| 94 | - public static final String OLT_DEVICE = "of:90e2ba82f97791e9"; | ||
| 95 | - public static final String GFAST_DEVICE = "of:0011223344551357"; | ||
| 96 | - | ||
| 97 | - @Property(name = "uplinkPort", intValue = UPLINK_PORT, | ||
| 98 | - label = "The OLT's uplink port number") | ||
| 99 | - private int uplinkPort = UPLINK_PORT; | ||
| 100 | - | ||
| 101 | - @Property(name = "gfastUplink", intValue = GFAST_UPLINK_PORT, | ||
| 102 | - label = "The OLT's uplink port number") | ||
| 103 | - private int gfastUplink = GFAST_UPLINK_PORT; | ||
| 104 | - | ||
| 105 | - //TODO: replace this information with info comming for net cfg service. | ||
| 106 | - @Property(name = "oltDevice", value = OLT_DEVICE, | ||
| 107 | - label = "The OLT device id") | ||
| 108 | - private String oltDevice = OLT_DEVICE; | ||
| 109 | - | ||
| 110 | - @Property(name = "gfastDevice", value = GFAST_DEVICE, | ||
| 111 | - label = "The gfast device id") | ||
| 112 | - private String gfastDevice = GFAST_DEVICE; | ||
| 113 | 94 | ||
| 114 | private Map<DeviceId, AccessDeviceData> oltData = new ConcurrentHashMap<>(); | 95 | private Map<DeviceId, AccessDeviceData> oltData = new ConcurrentHashMap<>(); |
| 115 | 96 | ||
| ... | @@ -156,70 +137,6 @@ public class Olt | ... | @@ -156,70 +137,6 @@ public class Olt |
| 156 | log.info("Stopped"); | 137 | log.info("Stopped"); |
| 157 | } | 138 | } |
| 158 | 139 | ||
| 159 | - @Modified | ||
| 160 | - public void modified(ComponentContext context) { | ||
| 161 | - Dictionary<?, ?> properties = context.getProperties(); | ||
| 162 | - | ||
| 163 | - String s = Tools.get(properties, "uplinkPort"); | ||
| 164 | - uplinkPort = Strings.isNullOrEmpty(s) ? UPLINK_PORT : Integer.parseInt(s); | ||
| 165 | - | ||
| 166 | - s = Tools.get(properties, "oltDevice"); | ||
| 167 | - oltDevice = Strings.isNullOrEmpty(s) ? OLT_DEVICE : s; | ||
| 168 | - } | ||
| 169 | - | ||
| 170 | - private short fetchVlanId(PortNumber port) { | ||
| 171 | - long p = port.toLong() + OFFSET; | ||
| 172 | - if (p > 4095) { | ||
| 173 | - log.warn("Port Number {} exceeds vlan max", port); | ||
| 174 | - return -1; | ||
| 175 | - } | ||
| 176 | - return (short) p; | ||
| 177 | - } | ||
| 178 | - | ||
| 179 | - private void provisionVlanOnPort(String deviceId, int uplinkPort, PortNumber p, short vlanId) { | ||
| 180 | - DeviceId did = DeviceId.deviceId(deviceId); | ||
| 181 | - | ||
| 182 | - TrafficSelector upstream = DefaultTrafficSelector.builder() | ||
| 183 | - .matchVlanId(VlanId.vlanId(vlanId)) | ||
| 184 | - .matchInPort(p) | ||
| 185 | - .build(); | ||
| 186 | - | ||
| 187 | - TrafficSelector downStream = DefaultTrafficSelector.builder() | ||
| 188 | - .matchVlanId(VlanId.vlanId(vlanId)) | ||
| 189 | - .matchInPort(PortNumber.portNumber(uplinkPort)) | ||
| 190 | - .build(); | ||
| 191 | - | ||
| 192 | - TrafficTreatment upstreamTreatment = DefaultTrafficTreatment.builder() | ||
| 193 | - .setOutput(PortNumber.portNumber(uplinkPort)) | ||
| 194 | - .build(); | ||
| 195 | - | ||
| 196 | - TrafficTreatment downStreamTreatment = DefaultTrafficTreatment.builder() | ||
| 197 | - .setOutput(p) | ||
| 198 | - .build(); | ||
| 199 | - | ||
| 200 | - | ||
| 201 | - ForwardingObjective upFwd = DefaultForwardingObjective.builder() | ||
| 202 | - .withFlag(ForwardingObjective.Flag.VERSATILE) | ||
| 203 | - .withPriority(1000) | ||
| 204 | - .makePermanent() | ||
| 205 | - .withSelector(upstream) | ||
| 206 | - .fromApp(appId) | ||
| 207 | - .withTreatment(upstreamTreatment) | ||
| 208 | - .add(); | ||
| 209 | - | ||
| 210 | - ForwardingObjective downFwd = DefaultForwardingObjective.builder() | ||
| 211 | - .withFlag(ForwardingObjective.Flag.VERSATILE) | ||
| 212 | - .withPriority(1000) | ||
| 213 | - .makePermanent() | ||
| 214 | - .withSelector(downStream) | ||
| 215 | - .fromApp(appId) | ||
| 216 | - .withTreatment(downStreamTreatment) | ||
| 217 | - .add(); | ||
| 218 | - | ||
| 219 | - flowObjectiveService.forward(did, upFwd); | ||
| 220 | - flowObjectiveService.forward(did, downFwd); | ||
| 221 | - } | ||
| 222 | - | ||
| 223 | @Override | 140 | @Override |
| 224 | public void provisionSubscriber(ConnectPoint port, VlanId vlan) { | 141 | public void provisionSubscriber(ConnectPoint port, VlanId vlan) { |
| 225 | AccessDeviceData olt = oltData.get(port.deviceId()); | 142 | AccessDeviceData olt = oltData.get(port.deviceId()); |
| ... | @@ -238,6 +155,9 @@ public class Olt | ... | @@ -238,6 +155,9 @@ public class Olt |
| 238 | VlanId subscriberVlan, VlanId deviceVlan, | 155 | VlanId subscriberVlan, VlanId deviceVlan, |
| 239 | Optional<VlanId> defaultVlan) { | 156 | Optional<VlanId> defaultVlan) { |
| 240 | 157 | ||
| 158 | + CompletableFuture<ObjectiveError> downFuture = new CompletableFuture(); | ||
| 159 | + CompletableFuture<ObjectiveError> upFuture = new CompletableFuture(); | ||
| 160 | + | ||
| 241 | TrafficSelector upstream = DefaultTrafficSelector.builder() | 161 | TrafficSelector upstream = DefaultTrafficSelector.builder() |
| 242 | .matchVlanId((defaultVlan.isPresent()) ? defaultVlan.get() : DEFAULT_VLAN) | 162 | .matchVlanId((defaultVlan.isPresent()) ? defaultVlan.get() : DEFAULT_VLAN) |
| 243 | .matchInPort(subscriberPort) | 163 | .matchInPort(subscriberPort) |
| ... | @@ -249,6 +169,7 @@ public class Olt | ... | @@ -249,6 +169,7 @@ public class Olt |
| 249 | .build(); | 169 | .build(); |
| 250 | 170 | ||
| 251 | TrafficTreatment upstreamTreatment = DefaultTrafficTreatment.builder() | 171 | TrafficTreatment upstreamTreatment = DefaultTrafficTreatment.builder() |
| 172 | + .pushVlan() | ||
| 252 | .setVlanId(subscriberVlan) | 173 | .setVlanId(subscriberVlan) |
| 253 | .pushVlan() | 174 | .pushVlan() |
| 254 | .setVlanId(deviceVlan) | 175 | .setVlanId(deviceVlan) |
| ... | @@ -269,7 +190,17 @@ public class Olt | ... | @@ -269,7 +190,17 @@ public class Olt |
| 269 | .withSelector(upstream) | 190 | .withSelector(upstream) |
| 270 | .fromApp(appId) | 191 | .fromApp(appId) |
| 271 | .withTreatment(upstreamTreatment) | 192 | .withTreatment(upstreamTreatment) |
| 272 | - .add(); | 193 | + .add(new ObjectiveContext() { |
| 194 | + @Override | ||
| 195 | + public void onSuccess(Objective objective) { | ||
| 196 | + upFuture.complete(null); | ||
| 197 | + } | ||
| 198 | + | ||
| 199 | + @Override | ||
| 200 | + public void onError(Objective objective, ObjectiveError error) { | ||
| 201 | + upFuture.complete(error); | ||
| 202 | + } | ||
| 203 | + }); | ||
| 273 | 204 | ||
| 274 | ForwardingObjective downFwd = DefaultForwardingObjective.builder() | 205 | ForwardingObjective downFwd = DefaultForwardingObjective.builder() |
| 275 | .withFlag(ForwardingObjective.Flag.VERSATILE) | 206 | .withFlag(ForwardingObjective.Flag.VERSATILE) |
| ... | @@ -278,10 +209,38 @@ public class Olt | ... | @@ -278,10 +209,38 @@ public class Olt |
| 278 | .withSelector(downstream) | 209 | .withSelector(downstream) |
| 279 | .fromApp(appId) | 210 | .fromApp(appId) |
| 280 | .withTreatment(downstreamTreatment) | 211 | .withTreatment(downstreamTreatment) |
| 281 | - .add(); | 212 | + .add(new ObjectiveContext() { |
| 213 | + @Override | ||
| 214 | + public void onSuccess(Objective objective) { | ||
| 215 | + downFuture.complete(null); | ||
| 216 | + } | ||
| 217 | + | ||
| 218 | + @Override | ||
| 219 | + public void onError(Objective objective, ObjectiveError error) { | ||
| 220 | + downFuture.complete(error); | ||
| 221 | + } | ||
| 222 | + }); | ||
| 282 | 223 | ||
| 283 | flowObjectiveService.forward(deviceId, upFwd); | 224 | flowObjectiveService.forward(deviceId, upFwd); |
| 284 | flowObjectiveService.forward(deviceId, downFwd); | 225 | flowObjectiveService.forward(deviceId, downFwd); |
| 226 | + | ||
| 227 | + upFuture.thenAcceptBothAsync(downFuture, (upStatus, downStatus) -> { | ||
| 228 | + if (upStatus == null && downStatus == null) { | ||
| 229 | + post(new AccessDeviceEvent(AccessDeviceEvent.Type.SUBSCRIBER_REGISTERED, | ||
| 230 | + deviceId, | ||
| 231 | + deviceVlan, | ||
| 232 | + subscriberVlan)); | ||
| 233 | + } else if (downStatus != null) { | ||
| 234 | + log.error("Subscriber with vlan {} on device {} " + | ||
| 235 | + "on port {} failed downstream installation: {}", | ||
| 236 | + subscriberVlan, deviceId, subscriberPort, downStatus); | ||
| 237 | + } else if (upStatus != null) { | ||
| 238 | + log.error("Subscriber with vlan {} on device {} " + | ||
| 239 | + "on port {} failed upstream installation: {}", | ||
| 240 | + subscriberVlan, deviceId, subscriberPort, upStatus); | ||
| 241 | + } | ||
| 242 | + }, oltInstallers); | ||
| 243 | + | ||
| 285 | } | 244 | } |
| 286 | 245 | ||
| 287 | @Override | 246 | @Override |
| ... | @@ -292,17 +251,14 @@ public class Olt | ... | @@ -292,17 +251,14 @@ public class Olt |
| 292 | private class InternalDeviceListener implements DeviceListener { | 251 | private class InternalDeviceListener implements DeviceListener { |
| 293 | @Override | 252 | @Override |
| 294 | public void event(DeviceEvent event) { | 253 | public void event(DeviceEvent event) { |
| 295 | - DeviceId devId = DeviceId.deviceId(oltDevice); | 254 | + DeviceId devId = event.subject().id(); |
| 296 | - if (!devId.equals(event.subject().id())) { | 255 | + if (!oltData.containsKey(devId)) { |
| 256 | + log.debug("Device {} is not an OLT", devId); | ||
| 297 | return; | 257 | return; |
| 298 | } | 258 | } |
| 299 | switch (event.type()) { | 259 | switch (event.type()) { |
| 300 | case PORT_ADDED: | 260 | case PORT_ADDED: |
| 301 | case PORT_UPDATED: | 261 | case PORT_UPDATED: |
| 302 | - if (event.port().isEnabled()) { | ||
| 303 | - short vlanId = fetchVlanId(event.port().number()); | ||
| 304 | - provisionVlanOnPort(gfastDevice, uplinkPort, event.port().number(), vlanId); | ||
| 305 | - } | ||
| 306 | break; | 262 | break; |
| 307 | case DEVICE_ADDED: | 263 | case DEVICE_ADDED: |
| 308 | post(new AccessDeviceEvent( | 264 | post(new AccessDeviceEvent( | ... | ... |
-
Please register or login to post a comment