Change SingleSwitchFibInstaller to use new router config.
Also it now supports the config being added after the application starts. Change-Id: I194a4482702c58d2e91be0436dc11ab42973df96
Showing
1 changed file
with
48 additions
and
42 deletions
... | @@ -35,6 +35,8 @@ import org.onosproject.core.CoreService; | ... | @@ -35,6 +35,8 @@ import org.onosproject.core.CoreService; |
35 | import org.onosproject.incubator.net.intf.Interface; | 35 | import org.onosproject.incubator.net.intf.Interface; |
36 | import org.onosproject.incubator.net.intf.InterfaceService; | 36 | import org.onosproject.incubator.net.intf.InterfaceService; |
37 | import org.onosproject.net.DeviceId; | 37 | import org.onosproject.net.DeviceId; |
38 | +import org.onosproject.net.config.NetworkConfigEvent; | ||
39 | +import org.onosproject.net.config.NetworkConfigListener; | ||
38 | import org.onosproject.net.config.NetworkConfigService; | 40 | import org.onosproject.net.config.NetworkConfigService; |
39 | import org.onosproject.net.device.DeviceEvent; | 41 | import org.onosproject.net.device.DeviceEvent; |
40 | import org.onosproject.net.device.DeviceListener; | 42 | import org.onosproject.net.device.DeviceListener; |
... | @@ -58,14 +60,13 @@ import org.onosproject.routing.FibEntry; | ... | @@ -58,14 +60,13 @@ import org.onosproject.routing.FibEntry; |
58 | import org.onosproject.routing.FibListener; | 60 | import org.onosproject.routing.FibListener; |
59 | import org.onosproject.routing.FibUpdate; | 61 | import org.onosproject.routing.FibUpdate; |
60 | import org.onosproject.routing.RoutingService; | 62 | import org.onosproject.routing.RoutingService; |
61 | -import org.onosproject.routing.config.BgpConfig; | 63 | +import org.onosproject.routing.config.RouterConfig; |
62 | import org.slf4j.Logger; | 64 | import org.slf4j.Logger; |
63 | import org.slf4j.LoggerFactory; | 65 | import org.slf4j.LoggerFactory; |
64 | 66 | ||
65 | import java.util.Collection; | 67 | import java.util.Collection; |
66 | import java.util.HashMap; | 68 | import java.util.HashMap; |
67 | import java.util.Map; | 69 | import java.util.Map; |
68 | -import java.util.Optional; | ||
69 | import java.util.Set; | 70 | import java.util.Set; |
70 | 71 | ||
71 | /** | 72 | /** |
... | @@ -97,12 +98,13 @@ public class SingleSwitchFibInstaller { | ... | @@ -97,12 +98,13 @@ public class SingleSwitchFibInstaller { |
97 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 98 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
98 | protected DeviceService deviceService; | 99 | protected DeviceService deviceService; |
99 | 100 | ||
100 | - private InnerDeviceListener deviceListener; | 101 | + private InternalDeviceListener deviceListener; |
101 | 102 | ||
102 | // Device id of data-plane switch - should be learned from config | 103 | // Device id of data-plane switch - should be learned from config |
103 | private DeviceId deviceId; | 104 | private DeviceId deviceId; |
104 | 105 | ||
105 | private ApplicationId appId; | 106 | private ApplicationId appId; |
107 | + private ApplicationId routerAppId; | ||
106 | 108 | ||
107 | // Reference count for how many times a next hop is used by a route | 109 | // Reference count for how many times a next hop is used by a route |
108 | private final Multiset<IpAddress> nextHopsCount = ConcurrentHashMultiset.create(); | 110 | private final Multiset<IpAddress> nextHopsCount = ConcurrentHashMultiset.create(); |
... | @@ -119,29 +121,18 @@ public class SingleSwitchFibInstaller { | ... | @@ -119,29 +121,18 @@ public class SingleSwitchFibInstaller { |
119 | 121 | ||
120 | @Activate | 122 | @Activate |
121 | protected void activate() { | 123 | protected void activate() { |
122 | - ApplicationId routerAppId = coreService.getAppId(RoutingService.ROUTER_APP_ID); | 124 | + // TODO why are there two of the same app ID? |
123 | - BgpConfig bgpConfig = | 125 | + routerAppId = coreService.registerApplication(RoutingService.ROUTER_APP_ID); |
124 | - networkConfigService.getConfig(routerAppId, RoutingService.CONFIG_CLASS); | ||
125 | - | ||
126 | - if (bgpConfig == null) { | ||
127 | - log.error("No BgpConfig found"); | ||
128 | - return; | ||
129 | - } | ||
130 | - | ||
131 | - getDeviceConfiguration(bgpConfig); | ||
132 | 126 | ||
133 | appId = coreService.getAppId(RoutingService.ROUTER_APP_ID); | 127 | appId = coreService.getAppId(RoutingService.ROUTER_APP_ID); |
134 | 128 | ||
135 | - deviceListener = new InnerDeviceListener(); | 129 | + deviceListener = new InternalDeviceListener(); |
136 | deviceService.addListener(deviceListener); | 130 | deviceService.addListener(deviceListener); |
137 | 131 | ||
138 | routingService.addFibListener(new InternalFibListener()); | 132 | routingService.addFibListener(new InternalFibListener()); |
139 | routingService.start(); | 133 | routingService.start(); |
140 | 134 | ||
141 | - // Initialize devices now if they are already connected | 135 | + updateConfig(); |
142 | - if (deviceService.isAvailable(deviceId)) { | ||
143 | - processIntfFilters(true, interfaceService.getInterfaces()); | ||
144 | - } | ||
145 | 136 | ||
146 | log.info("Started"); | 137 | log.info("Started"); |
147 | } | 138 | } |
... | @@ -157,35 +148,26 @@ public class SingleSwitchFibInstaller { | ... | @@ -157,35 +148,26 @@ public class SingleSwitchFibInstaller { |
157 | log.info("Stopped"); | 148 | log.info("Stopped"); |
158 | } | 149 | } |
159 | 150 | ||
160 | - private void getDeviceConfiguration(BgpConfig bgpConfig) { | 151 | + private void updateConfig() { |
161 | - Optional<BgpConfig.BgpSpeakerConfig> bgpSpeaker = | 152 | + RouterConfig routerConfig = |
162 | - bgpConfig.bgpSpeakers().stream().findAny(); | 153 | + networkConfigService.getConfig(routerAppId, RoutingService.ROUTER_CONFIG_CLASS); |
163 | 154 | ||
164 | - if (!bgpSpeaker.isPresent()) { | 155 | + if (routerConfig == null) { |
165 | - log.error("BGP speaker configuration not found"); | 156 | + log.info("Router config not available"); |
166 | return; | 157 | return; |
167 | } | 158 | } |
168 | 159 | ||
169 | - Optional<IpAddress> peerAddress = | 160 | + deviceId = routerConfig.getControlPlaneConnectPoint().deviceId(); |
170 | - bgpSpeaker.get().peers().stream().findAny(); | ||
171 | 161 | ||
172 | - if (!peerAddress.isPresent()) { | 162 | + log.info("Router device ID is {}", deviceId); |
173 | - log.error("BGP speaker must have peers configured"); | ||
174 | - return; | ||
175 | - } | ||
176 | - | ||
177 | - Interface intf = interfaceService.getMatchingInterface(peerAddress.get()); | ||
178 | 163 | ||
179 | - if (intf == null) { | 164 | + updateDevice(); |
180 | - log.error("No interface found for peer"); | ||
181 | - return; | ||
182 | } | 165 | } |
183 | 166 | ||
184 | - // Assume all peers are configured on the same device - this is required | 167 | + private void updateDevice() { |
185 | - // by the BGP router | 168 | + if (deviceId != null && deviceService.isAvailable(deviceId)) { |
186 | - deviceId = intf.connectPoint().deviceId(); | 169 | + processIntfFilters(true, interfaceService.getInterfaces()); |
187 | - | 170 | + } |
188 | - log.info("Router dpid: {}", deviceId); | ||
189 | } | 171 | } |
190 | 172 | ||
191 | private void updateFibEntry(Collection<FibUpdate> updates) { | 173 | private void updateFibEntry(Collection<FibUpdate> updates) { |
... | @@ -384,9 +366,11 @@ public class SingleSwitchFibInstaller { | ... | @@ -384,9 +366,11 @@ public class SingleSwitchFibInstaller { |
384 | } | 366 | } |
385 | } | 367 | } |
386 | 368 | ||
387 | - | 369 | + /** |
388 | - // Triggers driver setup when a device is (re)detected. | 370 | + * Listener for device events used to trigger driver setup when a device is |
389 | - private class InnerDeviceListener implements DeviceListener { | 371 | + * (re)detected. |
372 | + */ | ||
373 | + private class InternalDeviceListener implements DeviceListener { | ||
390 | @Override | 374 | @Override |
391 | public void event(DeviceEvent event) { | 375 | public void event(DeviceEvent event) { |
392 | switch (event.type()) { | 376 | switch (event.type()) { |
... | @@ -411,4 +395,26 @@ public class SingleSwitchFibInstaller { | ... | @@ -411,4 +395,26 @@ public class SingleSwitchFibInstaller { |
411 | } | 395 | } |
412 | } | 396 | } |
413 | } | 397 | } |
398 | + | ||
399 | + /** | ||
400 | + * Listener for network config events. | ||
401 | + */ | ||
402 | + private class InternalNetworkConfigListener implements NetworkConfigListener { | ||
403 | + @Override | ||
404 | + public void event(NetworkConfigEvent event) { | ||
405 | + if (event.subject().equals(RoutingService.ROUTER_CONFIG_CLASS)) { | ||
406 | + switch (event.type()) { | ||
407 | + case CONFIG_ADDED: | ||
408 | + case CONFIG_UPDATED: | ||
409 | + updateConfig(); | ||
410 | + break; | ||
411 | + case CONFIG_REGISTERED: | ||
412 | + case CONFIG_UNREGISTERED: | ||
413 | + case CONFIG_REMOVED: | ||
414 | + default: | ||
415 | + break; | ||
416 | + } | ||
417 | + } | ||
418 | + } | ||
419 | + } | ||
414 | } | 420 | } | ... | ... |
-
Please register or login to post a comment