Jonathan Hart
Committed by Gerrit Code Review

[Falcon] Componentize IntentSynchronizer and SdnIpFib.

Change-Id: Ic384ce00572ae1e4bbf94b4de814cea3499d3828
...@@ -47,9 +47,9 @@ import org.onosproject.net.packet.PacketContext; ...@@ -47,9 +47,9 @@ import org.onosproject.net.packet.PacketContext;
47 import org.onosproject.net.packet.PacketProcessor; 47 import org.onosproject.net.packet.PacketProcessor;
48 import org.onosproject.net.packet.PacketService; 48 import org.onosproject.net.packet.PacketService;
49 import org.onosproject.routing.IntentRequestListener; 49 import org.onosproject.routing.IntentRequestListener;
50 +import org.onosproject.routing.IntentSynchronizationService;
50 import org.onosproject.routing.RouteEntry; 51 import org.onosproject.routing.RouteEntry;
51 import org.onosproject.routing.RoutingService; 52 import org.onosproject.routing.RoutingService;
52 -import org.onosproject.routing.SdnIpService;
53 import org.onosproject.routing.config.RoutingConfigurationService; 53 import org.onosproject.routing.config.RoutingConfigurationService;
54 import org.slf4j.Logger; 54 import org.slf4j.Logger;
55 55
...@@ -86,7 +86,7 @@ public class SdnIpReactiveRouting { ...@@ -86,7 +86,7 @@ public class SdnIpReactiveRouting {
86 protected RoutingService routingService; 86 protected RoutingService routingService;
87 87
88 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 88 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
89 - protected SdnIpService sdnIpService; 89 + protected IntentSynchronizationService intentSynchronizer;
90 90
91 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 91 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
92 protected RoutingConfigurationService config; 92 protected RoutingConfigurationService config;
...@@ -109,8 +109,7 @@ public class SdnIpReactiveRouting { ...@@ -109,8 +109,7 @@ public class SdnIpReactiveRouting {
109 appId = coreService.registerApplication(APP_NAME); 109 appId = coreService.registerApplication(APP_NAME);
110 110
111 intentRequestListener = new ReactiveRoutingFib(appId, hostService, 111 intentRequestListener = new ReactiveRoutingFib(appId, hostService,
112 - config, interfaceService, 112 + config, interfaceService, intentSynchronizer);
113 - sdnIpService.getIntentSynchronizationService());
114 113
115 packetService.addProcessor(processor, PacketProcessor.director(2)); 114 packetService.addProcessor(processor, PacketProcessor.director(2));
116 requestIntercepts(); 115 requestIntercepts();
......
1 /* 1 /*
2 - * Copyright 2014-2015 Open Networking Laboratory 2 + * Copyright 2015 Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -13,12 +13,13 @@ ...@@ -13,12 +13,13 @@
13 * See the License for the specific language governing permissions and 13 * See the License for the specific language governing permissions and
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 +
16 package org.onosproject.routing; 17 package org.onosproject.routing;
17 18
18 /** 19 /**
19 - * Service interface exported by SDN-IP. 20 + * Administrative APIs for managing intent synchronization.
20 */ 21 */
21 -public interface SdnIpService { 22 +public interface IntentSynchronizationAdminService {
22 23
23 /** 24 /**
24 * Changes whether this SDN-IP instance is the primary or not based on the 25 * Changes whether this SDN-IP instance is the primary or not based on the
...@@ -29,11 +30,7 @@ public interface SdnIpService { ...@@ -29,11 +30,7 @@ public interface SdnIpService {
29 void modifyPrimary(boolean isPrimary); 30 void modifyPrimary(boolean isPrimary);
30 31
31 /** 32 /**
32 - * Gets the intent synchronization service. 33 + * Withdraws all intents.
33 - *
34 - * @return intent synchronization service
35 */ 34 */
36 - // TODO fix service resolution in SDN-IP 35 + void removeIntents();
37 - IntentSynchronizationService getIntentSynchronizationService();
38 -
39 } 36 }
......
1 +/*
2 + * Copyright 2015 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.routing;
18 +
19 +import org.onlab.packet.IpAddress;
20 +
21 +import java.util.Collection;
22 +
23 +/**
24 + * Routing service adapter.
25 + */
26 +public class RoutingServiceAdapter implements RoutingService {
27 +
28 + @Override
29 + public void start() {
30 +
31 + }
32 +
33 + @Override
34 + public void addFibListener(FibListener fibListener) {
35 +
36 + }
37 +
38 + @Override
39 + public void stop() {
40 +
41 + }
42 +
43 + @Override
44 + public Collection<RouteEntry> getRoutes4() {
45 + return null;
46 + }
47 +
48 + @Override
49 + public Collection<RouteEntry> getRoutes6() {
50 + return null;
51 + }
52 +
53 + @Override
54 + public RouteEntry getLongestMatchableRouteEntry(IpAddress ipAddress) {
55 + return null;
56 + }
57 +}
...@@ -35,7 +35,6 @@ import org.onlab.packet.IpAddress; ...@@ -35,7 +35,6 @@ import org.onlab.packet.IpAddress;
35 import org.onlab.packet.IpPrefix; 35 import org.onlab.packet.IpPrefix;
36 import org.onlab.packet.MacAddress; 36 import org.onlab.packet.MacAddress;
37 import org.onosproject.core.CoreService; 37 import org.onosproject.core.CoreService;
38 -import org.onosproject.incubator.net.intf.InterfaceService;
39 import org.onosproject.net.Host; 38 import org.onosproject.net.Host;
40 import org.onosproject.net.host.HostEvent; 39 import org.onosproject.net.host.HostEvent;
41 import org.onosproject.net.host.HostListener; 40 import org.onosproject.net.host.HostListener;
...@@ -107,9 +106,6 @@ public class Router implements RoutingService { ...@@ -107,9 +106,6 @@ public class Router implements RoutingService {
107 protected BgpService bgpService; 106 protected BgpService bgpService;
108 107
109 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 108 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
110 - protected InterfaceService interfaceService;
111 -
112 - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
113 protected RoutingConfigurationService routingConfigurationService; 109 protected RoutingConfigurationService routingConfigurationService;
114 110
115 private ExecutorService bgpUpdatesExecutor; 111 private ExecutorService bgpUpdatesExecutor;
...@@ -123,7 +119,7 @@ public class Router implements RoutingService { ...@@ -123,7 +119,7 @@ public class Router implements RoutingService {
123 new DefaultByteArrayNodeFactory()); 119 new DefaultByteArrayNodeFactory());
124 120
125 routesWaitingOnArp = Multimaps.synchronizedSetMultimap( 121 routesWaitingOnArp = Multimaps.synchronizedSetMultimap(
126 - HashMultimap.<IpAddress, RouteEntry>create()); 122 + HashMultimap.create());
127 123
128 coreService.registerApplication(ROUTER_APP_ID); 124 coreService.registerApplication(ROUTER_APP_ID);
129 125
......
...@@ -58,7 +58,15 @@ ...@@ -58,7 +58,15 @@
58 58
59 <dependency> 59 <dependency>
60 <groupId>org.onosproject</groupId> 60 <groupId>org.onosproject</groupId>
61 - <artifactId>onos-app-routing</artifactId> 61 + <artifactId>onos-app-routing-api</artifactId>
62 + <version>${project.version}</version>
63 + </dependency>
64 +
65 + <dependency>
66 + <groupId>org.onosproject</groupId>
67 + <artifactId>onos-app-routing-api</artifactId>
68 + <scope>test</scope>
69 + <classifier>tests</classifier>
62 <version>${project.version}</version> 70 <version>${project.version}</version>
63 </dependency> 71 </dependency>
64 72
......
...@@ -15,101 +15,117 @@ ...@@ -15,101 +15,117 @@
15 */ 15 */
16 package org.onosproject.sdnip; 16 package org.onosproject.sdnip;
17 17
18 -import static java.util.concurrent.Executors.newSingleThreadExecutor; 18 +import org.apache.felix.scr.annotations.Activate;
19 -import static org.onlab.util.Tools.groupedThreads; 19 +import org.apache.felix.scr.annotations.Component;
20 +import org.apache.felix.scr.annotations.Deactivate;
21 +import org.apache.felix.scr.annotations.Reference;
22 +import org.apache.felix.scr.annotations.ReferenceCardinality;
23 +import org.apache.felix.scr.annotations.Service;
24 +import org.onosproject.cluster.ClusterService;
25 +import org.onosproject.cluster.LeadershipEvent;
26 +import org.onosproject.cluster.LeadershipEventListener;
27 +import org.onosproject.cluster.LeadershipService;
28 +import org.onosproject.core.ApplicationId;
29 +import org.onosproject.core.CoreService;
30 +import org.onosproject.net.intent.Intent;
31 +import org.onosproject.net.intent.IntentService;
32 +import org.onosproject.net.intent.IntentState;
33 +import org.onosproject.net.intent.Key;
34 +import org.onosproject.routing.IntentSynchronizationAdminService;
35 +import org.onosproject.routing.IntentSynchronizationService;
36 +import org.slf4j.Logger;
37 +import org.slf4j.LoggerFactory;
20 38
21 import java.util.HashMap; 39 import java.util.HashMap;
22 import java.util.LinkedList; 40 import java.util.LinkedList;
23 import java.util.List; 41 import java.util.List;
24 import java.util.Map; 42 import java.util.Map;
25 import java.util.Map.Entry; 43 import java.util.Map.Entry;
44 +import java.util.Objects;
26 import java.util.concurrent.ConcurrentHashMap; 45 import java.util.concurrent.ConcurrentHashMap;
27 import java.util.concurrent.ExecutorService; 46 import java.util.concurrent.ExecutorService;
28 47
29 -import org.onosproject.core.ApplicationId;
30 -import org.onosproject.net.intent.Intent;
31 -import org.onosproject.net.intent.IntentService;
32 -import org.onosproject.net.intent.IntentState;
33 import org.onosproject.net.intent.IntentUtils; 48 import org.onosproject.net.intent.IntentUtils;
34 -import org.onosproject.net.intent.Key; 49 +
35 -import org.onosproject.routing.IntentSynchronizationService; 50 +import static java.util.concurrent.Executors.newSingleThreadExecutor;
36 -import org.slf4j.Logger; 51 +import static org.onlab.util.Tools.groupedThreads;
37 -import org.slf4j.LoggerFactory;
38 52
39 /** 53 /**
40 - * Synchronizes intents between the in-memory intent store and the 54 + * Synchronizes intents between an in-memory intent store and the IntentService.
41 - * IntentService.
42 */ 55 */
43 -public class IntentSynchronizer implements IntentSynchronizationService { 56 +@Service
57 +@Component(immediate = true)
58 +public class IntentSynchronizer implements IntentSynchronizationService,
59 + IntentSynchronizationAdminService {
60 +
61 + private static final Logger log = LoggerFactory.getLogger(IntentSynchronizer.class);
62 +
63 + private static final String APP_NAME = "org.onosproject.intentsynchronizer";
64 +
65 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
66 + protected CoreService coreService;
44 67
45 - private static final Logger log = 68 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
46 - LoggerFactory.getLogger(IntentSynchronizer.class); 69 + protected LeadershipService leadershipService;
47 70
48 - private final ApplicationId appId; 71 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
49 - private final IntentService intentService; 72 + protected ClusterService clusterService;
50 73
51 - private final Map<Key, Intent> intents; 74 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
75 + protected IntentService intentService;
76 +
77 + private ApplicationId appId;
78 +
79 + private final InternalLeadershipListener leadershipEventListener =
80 + new InternalLeadershipListener();
81 +
82 + private final Map<Key, Intent> intents = new ConcurrentHashMap<>();
83 +
84 + private ExecutorService intentsSynchronizerExecutor;
52 85
53 - //
54 - // State to deal with the Leader election and pushing Intents
55 - //
56 - private final ExecutorService intentsSynchronizerExecutor;
57 private volatile boolean isElectedLeader = false; 86 private volatile boolean isElectedLeader = false;
58 private volatile boolean isActivatedLeader = false; 87 private volatile boolean isActivatedLeader = false;
59 88
60 - /** 89 + @Activate
61 - * Class constructor. 90 + public void activate() {
62 - * 91 + intentsSynchronizerExecutor = createExecutor();
63 - * @param appId the Application ID
64 - * @param intentService the intent service
65 - */
66 - public IntentSynchronizer(ApplicationId appId, IntentService intentService) {
67 - this(appId, intentService,
68 - newSingleThreadExecutor(groupedThreads("onos/" + appId, "sync")));
69 - }
70 92
71 - /** 93 + this.appId = coreService.registerApplication(APP_NAME);
72 - * Class constructor.
73 - *
74 - * @param appId the Application ID
75 - * @param intentService the intent service
76 - * @param executorService executor service for synchronization thread
77 - */
78 - public IntentSynchronizer(ApplicationId appId, IntentService intentService,
79 - ExecutorService executorService) {
80 - this.appId = appId;
81 - this.intentService = intentService;
82 94
83 - intents = new ConcurrentHashMap<>(); 95 + leadershipService.addListener(leadershipEventListener);
96 + leadershipService.runForLeadership(appId.name());
84 97
85 - intentsSynchronizerExecutor = executorService; 98 + log.info("Started");
86 } 99 }
87 100
88 - /** 101 + @Deactivate
89 - * Starts the synchronizer. 102 + public void deactivate() {
90 - */ 103 + leadershipService.withdraw(appId.name());
91 - public void start() { 104 + leadershipService.removeListener(leadershipEventListener);
92 -
93 - }
94 105
95 - /**
96 - * Stops the synchronizer.
97 - */
98 - public void stop() {
99 synchronized (this) { 106 synchronized (this) {
100 - // Stop the thread(s)
101 intentsSynchronizerExecutor.shutdownNow(); 107 intentsSynchronizerExecutor.shutdownNow();
102 - log.info("Intents Synchronizer Executor shutdown completed");
103 -
104 } 108 }
109 +
110 + log.info("Stopped");
105 } 111 }
106 112
107 /** 113 /**
108 - * Withdraws all intents. 114 + * Creates an executor that will be used for synchronization tasks.
115 + * <p>
116 + * Can be overridden to change the type of executor used.
117 + * </p>
118 + *
119 + * @return executor service
109 */ 120 */
121 + protected ExecutorService createExecutor() {
122 + return newSingleThreadExecutor(groupedThreads("onos/" + appId, "sync"));
123 + }
124 +
125 + @Override
110 public void removeIntents() { 126 public void removeIntents() {
111 if (!isElectedLeader) { 127 if (!isElectedLeader) {
112 - // only leader will withdraw intents 128 + // Only leader will withdraw intents
113 return; 129 return;
114 } 130 }
115 131
...@@ -152,18 +168,19 @@ public class IntentSynchronizer implements IntentSynchronizationService { ...@@ -152,18 +168,19 @@ public class IntentSynchronizer implements IntentSynchronizationService {
152 * 168 *
153 * @param isLeader true if this instance is now the leader, otherwise false 169 * @param isLeader true if this instance is now the leader, otherwise false
154 */ 170 */
155 - public void leaderChanged(boolean isLeader) { 171 + private void leaderChanged(boolean isLeader) {
156 log.debug("Leader changed: {}", isLeader); 172 log.debug("Leader changed: {}", isLeader);
157 173
158 if (!isLeader) { 174 if (!isLeader) {
159 this.isElectedLeader = false; 175 this.isElectedLeader = false;
160 this.isActivatedLeader = false; 176 this.isActivatedLeader = false;
161 - return; // Nothing to do 177 + // Nothing to do
178 + return;
162 } 179 }
163 this.isActivatedLeader = false; 180 this.isActivatedLeader = false;
164 this.isElectedLeader = true; 181 this.isElectedLeader = true;
165 182
166 - // Run the synchronization method off-thread 183 + // Run the synchronization task
167 intentsSynchronizerExecutor.execute(this::synchronizeIntents); 184 intentsSynchronizerExecutor.execute(this::synchronizeIntents);
168 } 185 }
169 186
...@@ -232,10 +249,49 @@ public class IntentSynchronizer implements IntentSynchronizationService { ...@@ -232,10 +249,49 @@ public class IntentSynchronizer implements IntentSynchronizationService {
232 } 249 }
233 250
234 if (isElectedLeader) { 251 if (isElectedLeader) {
235 - isActivatedLeader = true; // Allow push of Intents 252 + // Allow push of Intents
253 + isActivatedLeader = true;
236 } else { 254 } else {
237 isActivatedLeader = false; 255 isActivatedLeader = false;
238 } 256 }
239 log.debug("Intent synchronization completed"); 257 log.debug("Intent synchronization completed");
240 } 258 }
259 +
260 + @Override
261 + public void modifyPrimary(boolean isPrimary) {
262 + leaderChanged(isPrimary);
263 + }
264 +
265 + /**
266 + * A listener for leadership events.
267 + */
268 + private class InternalLeadershipListener implements LeadershipEventListener {
269 +
270 + @Override
271 + public void event(LeadershipEvent event) {
272 + if (!event.subject().topic().equals(appId.name())) {
273 + // Not our topic: ignore
274 + return;
275 + }
276 + if (!Objects.equals(event.subject().leader(),
277 + clusterService.getLocalNode().id())) {
278 + // The event is not about this instance: ignore
279 + return;
280 + }
281 +
282 + switch (event.type()) {
283 + case LEADER_ELECTED:
284 + log.info("IntentSynchronizer gained leadership");
285 + leaderChanged(true);
286 + break;
287 + case LEADER_BOOTED:
288 + log.info("IntentSynchronizer lost leadership");
289 + leaderChanged(false);
290 + break;
291 + case LEADER_REELECTED:
292 + default:
293 + break;
294 + }
295 + }
296 + }
241 } 297 }
......
...@@ -15,136 +15,79 @@ ...@@ -15,136 +15,79 @@
15 */ 15 */
16 package org.onosproject.sdnip; 16 package org.onosproject.sdnip;
17 17
18 -import static org.slf4j.LoggerFactory.getLogger;
19 -
20 -import java.util.Objects;
21 -
22 import org.apache.felix.scr.annotations.Activate; 18 import org.apache.felix.scr.annotations.Activate;
23 import org.apache.felix.scr.annotations.Component; 19 import org.apache.felix.scr.annotations.Component;
24 import org.apache.felix.scr.annotations.Deactivate; 20 import org.apache.felix.scr.annotations.Deactivate;
25 import org.apache.felix.scr.annotations.Reference; 21 import org.apache.felix.scr.annotations.Reference;
26 import org.apache.felix.scr.annotations.ReferenceCardinality; 22 import org.apache.felix.scr.annotations.ReferenceCardinality;
27 -import org.apache.felix.scr.annotations.Service;
28 import org.onosproject.app.ApplicationService; 23 import org.onosproject.app.ApplicationService;
29 -import org.onosproject.cluster.ClusterService;
30 -import org.onosproject.cluster.ControllerNode;
31 -import org.onosproject.cluster.LeadershipEvent;
32 -import org.onosproject.cluster.LeadershipEventListener;
33 -import org.onosproject.cluster.LeadershipService;
34 import org.onosproject.core.ApplicationId; 24 import org.onosproject.core.ApplicationId;
35 import org.onosproject.core.CoreService; 25 import org.onosproject.core.CoreService;
36 import org.onosproject.incubator.net.intf.InterfaceService; 26 import org.onosproject.incubator.net.intf.InterfaceService;
37 import org.onosproject.net.config.NetworkConfigService; 27 import org.onosproject.net.config.NetworkConfigService;
38 -import org.onosproject.net.host.HostService; 28 +import org.onosproject.routing.IntentSynchronizationAdminService;
39 -import org.onosproject.net.intent.IntentService;
40 import org.onosproject.routing.IntentSynchronizationService; 29 import org.onosproject.routing.IntentSynchronizationService;
41 import org.onosproject.routing.RoutingService; 30 import org.onosproject.routing.RoutingService;
42 -import org.onosproject.routing.SdnIpService;
43 -import org.onosproject.routing.config.RoutingConfigurationService;
44 import org.slf4j.Logger; 31 import org.slf4j.Logger;
45 32
33 +import static org.slf4j.LoggerFactory.getLogger;
34 +
46 /** 35 /**
47 * Component for the SDN-IP peering application. 36 * Component for the SDN-IP peering application.
48 */ 37 */
49 @Component(immediate = true) 38 @Component(immediate = true)
50 -@Service 39 +public class SdnIp {
51 -public class SdnIp implements SdnIpService {
52 40
53 - private static final String SDN_IP_APP = "org.onosproject.sdnip"; 41 + public static final String SDN_IP_APP = "org.onosproject.sdnip";
54 private final Logger log = getLogger(getClass()); 42 private final Logger log = getLogger(getClass());
55 43
56 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 44 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
57 protected CoreService coreService; 45 protected CoreService coreService;
58 46
59 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 47 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
60 - protected IntentService intentService;
61 -
62 - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
63 protected ApplicationService applicationService; 48 protected ApplicationService applicationService;
64 49
65 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 50 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
66 - protected HostService hostService; 51 + protected NetworkConfigService networkConfigService;
67 -
68 - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
69 - protected ClusterService clusterService;
70 -
71 - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
72 - protected LeadershipService leadershipService;
73 -
74 - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
75 - protected RoutingService routingService;
76 52
77 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 53 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
78 - protected RoutingConfigurationService config; 54 + protected InterfaceService interfaceService;
79 55
80 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 56 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
81 - protected NetworkConfigService networkConfigService; 57 + protected IntentSynchronizationService intentSynchronizer;
82 58
83 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 59 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
84 - protected InterfaceService interfaceService; 60 + protected IntentSynchronizationAdminService intentSynchronizerAdmin;
85 61
86 - private IntentSynchronizer intentSynchronizer;
87 private PeerConnectivityManager peerConnectivity; 62 private PeerConnectivityManager peerConnectivity;
88 - private SdnIpFib fib;
89 63
90 - private LeadershipEventListener leadershipEventListener =
91 - new InnerLeadershipEventListener();
92 private ApplicationId appId; 64 private ApplicationId appId;
93 - private ControllerNode localControllerNode;
94 65
95 @Activate 66 @Activate
96 protected void activate() { 67 protected void activate() {
97 - log.info("SDN-IP started");
98 -
99 appId = coreService.registerApplication(SDN_IP_APP); 68 appId = coreService.registerApplication(SDN_IP_APP);
100 69
101 - localControllerNode = clusterService.getLocalNode();
102 -
103 - intentSynchronizer = new IntentSynchronizer(appId, intentService);
104 - intentSynchronizer.start();
105 -
106 peerConnectivity = new PeerConnectivityManager(appId, 70 peerConnectivity = new PeerConnectivityManager(appId,
107 intentSynchronizer, 71 intentSynchronizer,
108 networkConfigService, 72 networkConfigService,
109 - coreService.getAppId(RoutingService.ROUTER_APP_ID), 73 + coreService.registerApplication(RoutingService.ROUTER_APP_ID),
110 interfaceService); 74 interfaceService);
111 peerConnectivity.start(); 75 peerConnectivity.start();
112 76
113 - fib = new SdnIpFib(appId, interfaceService, intentSynchronizer); 77 + // TODO fix removing intents
114 -
115 - routingService.addFibListener(fib);
116 - routingService.start();
117 -
118 - leadershipService.addListener(leadershipEventListener);
119 - leadershipService.runForLeadership(appId.name());
120 -
121 applicationService.registerDeactivateHook(appId, 78 applicationService.registerDeactivateHook(appId,
122 - intentSynchronizer::removeIntents); 79 + intentSynchronizerAdmin::removeIntents);
123 80
81 + log.info("SDN-IP started");
124 } 82 }
125 83
126 @Deactivate 84 @Deactivate
127 protected void deactivate() { 85 protected void deactivate() {
128 - routingService.stop();
129 peerConnectivity.stop(); 86 peerConnectivity.stop();
130 - intentSynchronizer.stop();
131 -
132 - leadershipService.withdraw(appId.name());
133 - leadershipService.removeListener(leadershipEventListener);
134 87
135 log.info("SDN-IP Stopped"); 88 log.info("SDN-IP Stopped");
136 } 89 }
137 90
138 - @Override
139 - public void modifyPrimary(boolean isPrimary) {
140 - intentSynchronizer.leaderChanged(isPrimary);
141 - }
142 -
143 - @Override
144 - public IntentSynchronizationService getIntentSynchronizationService() {
145 - return intentSynchronizer;
146 - }
147 -
148 /** 91 /**
149 * Converts DPIDs of the form xx:xx:xx:xx:xx:xx:xx to OpenFlow provider 92 * Converts DPIDs of the form xx:xx:xx:xx:xx:xx:xx to OpenFlow provider
150 * device URIs. 93 * device URIs.
...@@ -156,38 +99,5 @@ public class SdnIp implements SdnIpService { ...@@ -156,38 +99,5 @@ public class SdnIp implements SdnIpService {
156 return "of:" + dpid.replace(":", ""); 99 return "of:" + dpid.replace(":", "");
157 } 100 }
158 101
159 - /** 102 +
160 - * A listener for Leadership Events.
161 - */
162 - private class InnerLeadershipEventListener
163 - implements LeadershipEventListener {
164 -
165 - @Override
166 - public void event(LeadershipEvent event) {
167 - log.debug("Leadership Event: time = {} type = {} event = {}",
168 - event.time(), event.type(), event);
169 -
170 - if (!event.subject().topic().equals(appId.name())) {
171 - return; // Not our topic: ignore
172 - }
173 - if (!Objects.equals(event.subject().leader(), localControllerNode.id())) {
174 - return; // The event is not about this instance: ignore
175 - }
176 -
177 - switch (event.type()) {
178 - case LEADER_ELECTED:
179 - log.info("SDN-IP Leader Elected");
180 - intentSynchronizer.leaderChanged(true);
181 - break;
182 - case LEADER_BOOTED:
183 - log.info("SDN-IP Leader Lost Election");
184 - intentSynchronizer.leaderChanged(false);
185 - break;
186 - case LEADER_REELECTED:
187 - break;
188 - default:
189 - break;
190 - }
191 - }
192 - }
193 } 103 }
......
...@@ -17,12 +17,18 @@ ...@@ -17,12 +17,18 @@
17 package org.onosproject.sdnip; 17 package org.onosproject.sdnip;
18 18
19 import com.google.common.collect.ImmutableList; 19 import com.google.common.collect.ImmutableList;
20 +import org.apache.felix.scr.annotations.Activate;
21 +import org.apache.felix.scr.annotations.Component;
22 +import org.apache.felix.scr.annotations.Deactivate;
23 +import org.apache.felix.scr.annotations.Reference;
24 +import org.apache.felix.scr.annotations.ReferenceCardinality;
20 import org.onlab.packet.Ethernet; 25 import org.onlab.packet.Ethernet;
21 import org.onlab.packet.IpAddress; 26 import org.onlab.packet.IpAddress;
22 import org.onlab.packet.IpPrefix; 27 import org.onlab.packet.IpPrefix;
23 import org.onlab.packet.MacAddress; 28 import org.onlab.packet.MacAddress;
24 import org.onlab.packet.VlanId; 29 import org.onlab.packet.VlanId;
25 import org.onosproject.core.ApplicationId; 30 import org.onosproject.core.ApplicationId;
31 +import org.onosproject.core.CoreService;
26 import org.onosproject.incubator.net.intf.Interface; 32 import org.onosproject.incubator.net.intf.Interface;
27 import org.onosproject.incubator.net.intf.InterfaceService; 33 import org.onosproject.incubator.net.intf.InterfaceService;
28 import org.onosproject.net.ConnectPoint; 34 import org.onosproject.net.ConnectPoint;
...@@ -37,6 +43,7 @@ import org.onosproject.net.intent.constraint.PartialFailureConstraint; ...@@ -37,6 +43,7 @@ import org.onosproject.net.intent.constraint.PartialFailureConstraint;
37 import org.onosproject.routing.FibListener; 43 import org.onosproject.routing.FibListener;
38 import org.onosproject.routing.FibUpdate; 44 import org.onosproject.routing.FibUpdate;
39 import org.onosproject.routing.IntentSynchronizationService; 45 import org.onosproject.routing.IntentSynchronizationService;
46 +import org.onosproject.routing.RoutingService;
40 import org.slf4j.Logger; 47 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory; 48 import org.slf4j.LoggerFactory;
42 49
...@@ -51,40 +58,49 @@ import static com.google.common.base.Preconditions.checkArgument; ...@@ -51,40 +58,49 @@ import static com.google.common.base.Preconditions.checkArgument;
51 /** 58 /**
52 * FIB component of SDN-IP. 59 * FIB component of SDN-IP.
53 */ 60 */
54 -public class SdnIpFib implements FibListener { 61 +@Component(immediate = true)
62 +public class SdnIpFib {
55 private Logger log = LoggerFactory.getLogger(getClass()); 63 private Logger log = LoggerFactory.getLogger(getClass());
56 64
65 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
66 + protected InterfaceService interfaceService;
67 +
68 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
69 + protected IntentSynchronizationService intentSynchronizer;
70 +
71 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
72 + protected CoreService coreService;
73 +
74 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
75 + protected RoutingService routingService;
76 +
77 + private final InternalFibListener fibListener = new InternalFibListener();
78 +
57 private static final int PRIORITY_OFFSET = 100; 79 private static final int PRIORITY_OFFSET = 100;
58 private static final int PRIORITY_MULTIPLIER = 5; 80 private static final int PRIORITY_MULTIPLIER = 5;
59 protected static final ImmutableList<Constraint> CONSTRAINTS 81 protected static final ImmutableList<Constraint> CONSTRAINTS
60 = ImmutableList.of(new PartialFailureConstraint()); 82 = ImmutableList.of(new PartialFailureConstraint());
61 83
62 - private final Map<IpPrefix, MultiPointToSinglePointIntent> routeIntents; 84 + private final Map<IpPrefix, MultiPointToSinglePointIntent> routeIntents
85 + = new ConcurrentHashMap<>();
63 86
64 - private final ApplicationId appId; 87 + private ApplicationId appId;
65 - private final InterfaceService interfaceService;
66 - private final IntentSynchronizationService intentSynchronizer;
67 88
68 - /** 89 + @Activate
69 - * Class constructor. 90 + public void activate() {
70 - * 91 + appId = coreService.getAppId(SdnIp.SDN_IP_APP);
71 - * @param appId application ID to use when generating intents
72 - * @param interfaceService interface service
73 - * @param intentSynchronizer intent synchronizer
74 - */
75 - public SdnIpFib(ApplicationId appId, InterfaceService interfaceService,
76 - IntentSynchronizationService intentSynchronizer) {
77 - routeIntents = new ConcurrentHashMap<>();
78 92
79 - this.appId = appId; 93 + routingService.addFibListener(fibListener);
80 - this.interfaceService = interfaceService; 94 + routingService.start();
81 - this.intentSynchronizer = intentSynchronizer;
82 } 95 }
83 96
97 + @Deactivate
98 + public void deactivate() {
99 + // TODO remove listener
100 + routingService.stop();
101 + }
84 102
85 - @Override 103 + private void update(Collection<FibUpdate> updates, Collection<FibUpdate> withdraws) {
86 - public void update(Collection<FibUpdate> updates,
87 - Collection<FibUpdate> withdraws) {
88 int submitCount = 0, withdrawCount = 0; 104 int submitCount = 0, withdrawCount = 0;
89 // 105 //
90 // NOTE: Semantically, we MUST withdraw existing intents before 106 // NOTE: Semantically, we MUST withdraw existing intents before
...@@ -224,4 +240,11 @@ public class SdnIpFib implements FibListener { ...@@ -224,4 +240,11 @@ public class SdnIpFib implements FibListener {
224 .build(); 240 .build();
225 } 241 }
226 242
243 + private class InternalFibListener implements FibListener {
244 + @Override
245 + public void update(Collection<FibUpdate> updates, Collection<FibUpdate> withdraws) {
246 + SdnIpFib.this.update(updates, withdraws);
247 + }
248 + }
249 +
227 } 250 }
......
...@@ -18,10 +18,10 @@ package org.onosproject.sdnip.cli; ...@@ -18,10 +18,10 @@ package org.onosproject.sdnip.cli;
18 import org.apache.karaf.shell.commands.Argument; 18 import org.apache.karaf.shell.commands.Argument;
19 import org.apache.karaf.shell.commands.Command; 19 import org.apache.karaf.shell.commands.Command;
20 import org.onosproject.cli.AbstractShellCommand; 20 import org.onosproject.cli.AbstractShellCommand;
21 -import org.onosproject.routing.SdnIpService; 21 +import org.onosproject.routing.IntentSynchronizationAdminService;
22 22
23 /** 23 /**
24 - * Command to change whether this SDNIP instance is primary or not. 24 + * Command to change whether this instance's intent synchronizer is primary.
25 */ 25 */
26 @Command(scope = "onos", name = "sdnip-set-primary", 26 @Command(scope = "onos", name = "sdnip-set-primary",
27 description = "Changes the primary status of this SDN-IP instance") 27 description = "Changes the primary status of this SDN-IP instance")
...@@ -34,7 +34,7 @@ public class PrimaryChangeCommand extends AbstractShellCommand { ...@@ -34,7 +34,7 @@ public class PrimaryChangeCommand extends AbstractShellCommand {
34 34
35 @Override 35 @Override
36 protected void execute() { 36 protected void execute() {
37 - get(SdnIpService.class).modifyPrimary(isPrimary); 37 + get(IntentSynchronizationAdminService.class).modifyPrimary(isPrimary);
38 } 38 }
39 39
40 } 40 }
......
...@@ -29,7 +29,9 @@ import org.onlab.packet.IpPrefix; ...@@ -29,7 +29,9 @@ import org.onlab.packet.IpPrefix;
29 import org.onlab.packet.MacAddress; 29 import org.onlab.packet.MacAddress;
30 import org.onlab.packet.VlanId; 30 import org.onlab.packet.VlanId;
31 import org.onosproject.TestApplicationId; 31 import org.onosproject.TestApplicationId;
32 +import org.onosproject.cluster.LeadershipServiceAdapter;
32 import org.onosproject.core.ApplicationId; 33 import org.onosproject.core.ApplicationId;
34 +import org.onosproject.core.CoreServiceAdapter;
33 import org.onosproject.incubator.net.intf.Interface; 35 import org.onosproject.incubator.net.intf.Interface;
34 import org.onosproject.net.ConnectPoint; 36 import org.onosproject.net.ConnectPoint;
35 import org.onosproject.net.DeviceId; 37 import org.onosproject.net.DeviceId;
...@@ -43,14 +45,15 @@ import org.onosproject.net.intent.AbstractIntentTest; ...@@ -43,14 +45,15 @@ import org.onosproject.net.intent.AbstractIntentTest;
43 import org.onosproject.net.intent.Intent; 45 import org.onosproject.net.intent.Intent;
44 import org.onosproject.net.intent.IntentService; 46 import org.onosproject.net.intent.IntentService;
45 import org.onosproject.net.intent.IntentState; 47 import org.onosproject.net.intent.IntentState;
48 +import org.onosproject.net.intent.IntentUtils;
46 import org.onosproject.net.intent.Key; 49 import org.onosproject.net.intent.Key;
47 import org.onosproject.net.intent.MultiPointToSinglePointIntent; 50 import org.onosproject.net.intent.MultiPointToSinglePointIntent;
48 -import org.onosproject.net.intent.IntentUtils;
49 import org.onosproject.routing.RouteEntry; 51 import org.onosproject.routing.RouteEntry;
50 52
51 import java.util.Collections; 53 import java.util.Collections;
52 import java.util.HashSet; 54 import java.util.HashSet;
53 import java.util.Set; 55 import java.util.Set;
56 +import java.util.concurrent.ExecutorService;
54 57
55 import static org.easymock.EasyMock.createMock; 58 import static org.easymock.EasyMock.createMock;
56 import static org.easymock.EasyMock.expect; 59 import static org.easymock.EasyMock.expect;
...@@ -88,7 +91,8 @@ public class IntentSyncTest extends AbstractIntentTest { ...@@ -88,7 +91,8 @@ public class IntentSyncTest extends AbstractIntentTest {
88 private IntentSynchronizer intentSynchronizer; 91 private IntentSynchronizer intentSynchronizer;
89 private final Set<Interface> interfaces = Sets.newHashSet(); 92 private final Set<Interface> interfaces = Sets.newHashSet();
90 93
91 - private static final ApplicationId APPID = TestApplicationId.create("SDNIP"); 94 + private static final ApplicationId APPID =
95 + TestApplicationId.create("intent-sync-test");
92 96
93 @Before 97 @Before
94 public void setUp() throws Exception { 98 public void setUp() throws Exception {
...@@ -98,8 +102,13 @@ public class IntentSyncTest extends AbstractIntentTest { ...@@ -98,8 +102,13 @@ public class IntentSyncTest extends AbstractIntentTest {
98 102
99 intentService = createMock(IntentService.class); 103 intentService = createMock(IntentService.class);
100 104
101 - intentSynchronizer = new IntentSynchronizer(APPID, intentService, 105 + intentSynchronizer = new TestIntentSynchronizer();
102 - MoreExecutors.newDirectExecutorService()); 106 +
107 + intentSynchronizer.coreService = new TestCoreService();
108 + intentSynchronizer.leadershipService = new TestLeadershipService();
109 + intentSynchronizer.intentService = intentService;
110 +
111 + intentSynchronizer.activate();
103 } 112 }
104 113
105 /** 114 /**
...@@ -268,7 +277,7 @@ public class IntentSyncTest extends AbstractIntentTest { ...@@ -268,7 +277,7 @@ public class IntentSyncTest extends AbstractIntentTest {
268 // Give the leadership to the intent synchronizer. It will now attempt 277 // Give the leadership to the intent synchronizer. It will now attempt
269 // to synchronize the intents in the store with the intents it has 278 // to synchronize the intents in the store with the intents it has
270 // recorded based on the earlier user input. 279 // recorded based on the earlier user input.
271 - intentSynchronizer.leaderChanged(true); 280 + intentSynchronizer.modifyPrimary(true);
272 281
273 verify(intentService); 282 verify(intentService);
274 } 283 }
...@@ -290,7 +299,7 @@ public class IntentSyncTest extends AbstractIntentTest { ...@@ -290,7 +299,7 @@ public class IntentSyncTest extends AbstractIntentTest {
290 299
291 // Give the intent synchronizer leadership so it will submit intents 300 // Give the intent synchronizer leadership so it will submit intents
292 // to the intent service 301 // to the intent service
293 - intentSynchronizer.leaderChanged(true); 302 + intentSynchronizer.modifyPrimary(true);
294 303
295 // Test the submit 304 // Test the submit
296 intentSynchronizer.submit(intent); 305 intentSynchronizer.submit(intent);
...@@ -303,7 +312,7 @@ public class IntentSyncTest extends AbstractIntentTest { ...@@ -303,7 +312,7 @@ public class IntentSyncTest extends AbstractIntentTest {
303 reset(intentService); 312 reset(intentService);
304 replay(intentService); 313 replay(intentService);
305 314
306 - intentSynchronizer.leaderChanged(false); 315 + intentSynchronizer.modifyPrimary(false);
307 316
308 intentSynchronizer.submit(intent); 317 intentSynchronizer.submit(intent);
309 318
...@@ -328,7 +337,7 @@ public class IntentSyncTest extends AbstractIntentTest { ...@@ -328,7 +337,7 @@ public class IntentSyncTest extends AbstractIntentTest {
328 337
329 // Give the intent synchronizer leadership so it will submit intents 338 // Give the intent synchronizer leadership so it will submit intents
330 // to the intent service 339 // to the intent service
331 - intentSynchronizer.leaderChanged(true); 340 + intentSynchronizer.modifyPrimary(true);
332 341
333 // Test the submit then withdraw 342 // Test the submit then withdraw
334 intentSynchronizer.submit(intent); 343 intentSynchronizer.submit(intent);
...@@ -342,7 +351,7 @@ public class IntentSyncTest extends AbstractIntentTest { ...@@ -342,7 +351,7 @@ public class IntentSyncTest extends AbstractIntentTest {
342 reset(intentService); 351 reset(intentService);
343 replay(intentService); 352 replay(intentService);
344 353
345 - intentSynchronizer.leaderChanged(false); 354 + intentSynchronizer.modifyPrimary(false);
346 355
347 intentSynchronizer.submit(intent); 356 intentSynchronizer.submit(intent);
348 intentSynchronizer.withdraw(intent); 357 intentSynchronizer.withdraw(intent);
...@@ -418,4 +427,22 @@ public class IntentSyncTest extends AbstractIntentTest { ...@@ -418,4 +427,22 @@ public class IntentSyncTest extends AbstractIntentTest {
418 "ingressPoints", intent.ingressPoints()); 427 "ingressPoints", intent.ingressPoints());
419 return intentNew; 428 return intentNew;
420 } 429 }
430 +
431 + private class TestIntentSynchronizer extends IntentSynchronizer {
432 + @Override
433 + protected ExecutorService createExecutor() {
434 + return MoreExecutors.newDirectExecutorService();
435 + }
436 + }
437 +
438 + private class TestCoreService extends CoreServiceAdapter {
439 + @Override
440 + public ApplicationId registerApplication(String name) {
441 + return APPID;
442 + }
443 + }
444 +
445 + private class TestLeadershipService extends LeadershipServiceAdapter {
446 +
447 + }
421 } 448 }
......
...@@ -28,6 +28,7 @@ import org.onlab.packet.MacAddress; ...@@ -28,6 +28,7 @@ import org.onlab.packet.MacAddress;
28 import org.onlab.packet.VlanId; 28 import org.onlab.packet.VlanId;
29 import org.onosproject.TestApplicationId; 29 import org.onosproject.TestApplicationId;
30 import org.onosproject.core.ApplicationId; 30 import org.onosproject.core.ApplicationId;
31 +import org.onosproject.core.CoreServiceAdapter;
31 import org.onosproject.incubator.net.intf.Interface; 32 import org.onosproject.incubator.net.intf.Interface;
32 import org.onosproject.incubator.net.intf.InterfaceService; 33 import org.onosproject.incubator.net.intf.InterfaceService;
33 import org.onosproject.net.ConnectPoint; 34 import org.onosproject.net.ConnectPoint;
...@@ -42,8 +43,10 @@ import org.onosproject.net.intent.AbstractIntentTest; ...@@ -42,8 +43,10 @@ import org.onosproject.net.intent.AbstractIntentTest;
42 import org.onosproject.net.intent.Key; 43 import org.onosproject.net.intent.Key;
43 import org.onosproject.net.intent.MultiPointToSinglePointIntent; 44 import org.onosproject.net.intent.MultiPointToSinglePointIntent;
44 import org.onosproject.routing.FibEntry; 45 import org.onosproject.routing.FibEntry;
46 +import org.onosproject.routing.FibListener;
45 import org.onosproject.routing.FibUpdate; 47 import org.onosproject.routing.FibUpdate;
46 import org.onosproject.routing.IntentSynchronizationService; 48 import org.onosproject.routing.IntentSynchronizationService;
49 +import org.onosproject.routing.RoutingServiceAdapter;
47 import org.onosproject.routing.config.BgpPeer; 50 import org.onosproject.routing.config.BgpPeer;
48 import org.onosproject.routing.config.RoutingConfigurationService; 51 import org.onosproject.routing.config.RoutingConfigurationService;
49 52
...@@ -90,6 +93,8 @@ public class SdnIpFibTest extends AbstractIntentTest { ...@@ -90,6 +93,8 @@ public class SdnIpFibTest extends AbstractIntentTest {
90 93
91 private static final ApplicationId APPID = TestApplicationId.create("SDNIP"); 94 private static final ApplicationId APPID = TestApplicationId.create("SDNIP");
92 95
96 + private FibListener fibListener;
97 +
93 @Before 98 @Before
94 public void setUp() throws Exception { 99 public void setUp() throws Exception {
95 super.setUp(); 100 super.setUp();
...@@ -106,7 +111,13 @@ public class SdnIpFibTest extends AbstractIntentTest { ...@@ -106,7 +111,13 @@ public class SdnIpFibTest extends AbstractIntentTest {
106 111
107 intentSynchronizer = createMock(IntentSynchronizationService.class); 112 intentSynchronizer = createMock(IntentSynchronizationService.class);
108 113
109 - sdnipFib = new SdnIpFib(APPID, interfaceService, intentSynchronizer); 114 + sdnipFib = new SdnIpFib();
115 + sdnipFib.routingService = new TestRoutingService();
116 + sdnipFib.coreService = new TestCoreService();
117 + sdnipFib.interfaceService = interfaceService;
118 + sdnipFib.intentSynchronizer = intentSynchronizer;
119 +
120 + sdnipFib.activate();
110 } 121 }
111 122
112 /** 123 /**
...@@ -242,7 +253,7 @@ public class SdnIpFibTest extends AbstractIntentTest { ...@@ -242,7 +253,7 @@ public class SdnIpFibTest extends AbstractIntentTest {
242 253
243 // Send in the UPDATE FibUpdate 254 // Send in the UPDATE FibUpdate
244 FibUpdate fibUpdate = new FibUpdate(FibUpdate.Type.UPDATE, fibEntry); 255 FibUpdate fibUpdate = new FibUpdate(FibUpdate.Type.UPDATE, fibEntry);
245 - sdnipFib.update(Collections.singleton(fibUpdate), Collections.emptyList()); 256 + fibListener.update(Collections.singleton(fibUpdate), Collections.emptyList());
246 257
247 verify(intentSynchronizer); 258 verify(intentSynchronizer);
248 } 259 }
...@@ -295,7 +306,7 @@ public class SdnIpFibTest extends AbstractIntentTest { ...@@ -295,7 +306,7 @@ public class SdnIpFibTest extends AbstractIntentTest {
295 306
296 // Send in the UPDATE FibUpdate 307 // Send in the UPDATE FibUpdate
297 FibUpdate fibUpdate = new FibUpdate(FibUpdate.Type.UPDATE, fibEntry); 308 FibUpdate fibUpdate = new FibUpdate(FibUpdate.Type.UPDATE, fibEntry);
298 - sdnipFib.update(Collections.singleton(fibUpdate), Collections.emptyList()); 309 + fibListener.update(Collections.singleton(fibUpdate), Collections.emptyList());
299 310
300 verify(intentSynchronizer); 311 verify(intentSynchronizer);
301 } 312 }
...@@ -354,7 +365,7 @@ public class SdnIpFibTest extends AbstractIntentTest { ...@@ -354,7 +365,7 @@ public class SdnIpFibTest extends AbstractIntentTest {
354 // Send in the UPDATE FibUpdate 365 // Send in the UPDATE FibUpdate
355 FibUpdate fibUpdate = new FibUpdate(FibUpdate.Type.UPDATE, 366 FibUpdate fibUpdate = new FibUpdate(FibUpdate.Type.UPDATE,
356 fibEntryUpdate); 367 fibEntryUpdate);
357 - sdnipFib.update(Collections.singletonList(fibUpdate), 368 + fibListener.update(Collections.singletonList(fibUpdate),
358 Collections.emptyList()); 369 Collections.emptyList());
359 370
360 verify(intentSynchronizer); 371 verify(intentSynchronizer);
...@@ -410,8 +421,23 @@ public class SdnIpFibTest extends AbstractIntentTest { ...@@ -410,8 +421,23 @@ public class SdnIpFibTest extends AbstractIntentTest {
410 421
411 // Send in the DELETE FibUpdate 422 // Send in the DELETE FibUpdate
412 FibUpdate fibUpdate = new FibUpdate(FibUpdate.Type.DELETE, fibEntry); 423 FibUpdate fibUpdate = new FibUpdate(FibUpdate.Type.DELETE, fibEntry);
413 - sdnipFib.update(Collections.emptyList(), Collections.singletonList(fibUpdate)); 424 + fibListener.update(Collections.emptyList(), Collections.singletonList(fibUpdate));
414 425
415 verify(intentSynchronizer); 426 verify(intentSynchronizer);
416 } 427 }
428 +
429 + private class TestCoreService extends CoreServiceAdapter {
430 + @Override
431 + public ApplicationId getAppId(String name) {
432 + return APPID;
433 + }
434 + }
435 +
436 + private class TestRoutingService extends RoutingServiceAdapter {
437 +
438 + @Override
439 + public void addFibListener(FibListener fibListener) {
440 + SdnIpFibTest.this.fibListener = fibListener;
441 + }
442 + }
417 } 443 }
......