Cleanup and javadocs for SDN-IP code
plus refactor a unit test that started failing Change-Id: Ib9f0f8eefc2ba7a9798d8f01b537dae18dd2920c
Showing
4 changed files
with
186 additions
and
247 deletions
1 | package org.onlab.onos.sdnip; | 1 | package org.onlab.onos.sdnip; |
2 | 2 | ||
3 | +import java.util.List; | ||
4 | + | ||
3 | import org.onlab.onos.ApplicationId; | 5 | import org.onlab.onos.ApplicationId; |
4 | import org.onlab.onos.net.ConnectPoint; | 6 | import org.onlab.onos.net.ConnectPoint; |
5 | import org.onlab.onos.net.flow.DefaultTrafficSelector; | 7 | import org.onlab.onos.net.flow.DefaultTrafficSelector; |
... | @@ -8,6 +10,7 @@ import org.onlab.onos.net.flow.TrafficSelector; | ... | @@ -8,6 +10,7 @@ import org.onlab.onos.net.flow.TrafficSelector; |
8 | import org.onlab.onos.net.flow.TrafficTreatment; | 10 | import org.onlab.onos.net.flow.TrafficTreatment; |
9 | import org.onlab.onos.net.intent.IntentService; | 11 | import org.onlab.onos.net.intent.IntentService; |
10 | import org.onlab.onos.net.intent.PointToPointIntent; | 12 | import org.onlab.onos.net.intent.PointToPointIntent; |
13 | +import org.onlab.onos.sdnip.bgp.BgpConstants; | ||
11 | import org.onlab.onos.sdnip.config.BgpPeer; | 14 | import org.onlab.onos.sdnip.config.BgpPeer; |
12 | import org.onlab.onos.sdnip.config.BgpSpeaker; | 15 | import org.onlab.onos.sdnip.config.BgpSpeaker; |
13 | import org.onlab.onos.sdnip.config.Interface; | 16 | import org.onlab.onos.sdnip.config.Interface; |
... | @@ -20,8 +23,6 @@ import org.onlab.packet.IpPrefix; | ... | @@ -20,8 +23,6 @@ import org.onlab.packet.IpPrefix; |
20 | import org.slf4j.Logger; | 23 | import org.slf4j.Logger; |
21 | import org.slf4j.LoggerFactory; | 24 | import org.slf4j.LoggerFactory; |
22 | 25 | ||
23 | -import java.util.List; | ||
24 | - | ||
25 | /** | 26 | /** |
26 | * Manages the connectivity requirements between peers. | 27 | * Manages the connectivity requirements between peers. |
27 | */ | 28 | */ |
... | @@ -30,37 +31,44 @@ public class PeerConnectivityManager { | ... | @@ -30,37 +31,44 @@ public class PeerConnectivityManager { |
30 | private static final Logger log = LoggerFactory.getLogger( | 31 | private static final Logger log = LoggerFactory.getLogger( |
31 | PeerConnectivityManager.class); | 32 | PeerConnectivityManager.class); |
32 | 33 | ||
33 | - // TODO these shouldn't be defined here | 34 | + private final SdnIpConfigService configService; |
34 | - private static final short BGP_PORT = 179; | ||
35 | - private static final int IPV4_BIT_LENGTH = 32; | ||
36 | - | ||
37 | - private final SdnIpConfigService configInfoService; | ||
38 | private final InterfaceService interfaceService; | 35 | private final InterfaceService interfaceService; |
39 | private final IntentService intentService; | 36 | private final IntentService intentService; |
40 | 37 | ||
41 | private final ApplicationId appId; | 38 | private final ApplicationId appId; |
42 | 39 | ||
40 | + /** | ||
41 | + * Creates a new PeerConnectivityManager. | ||
42 | + * | ||
43 | + * @param appId the application ID | ||
44 | + * @param configService the SDN-IP config service | ||
45 | + * @param interfaceService the interface service | ||
46 | + * @param intentService the intent service | ||
47 | + */ | ||
43 | public PeerConnectivityManager(ApplicationId appId, | 48 | public PeerConnectivityManager(ApplicationId appId, |
44 | - SdnIpConfigService configInfoService, | 49 | + SdnIpConfigService configService, |
45 | InterfaceService interfaceService, | 50 | InterfaceService interfaceService, |
46 | IntentService intentService) { | 51 | IntentService intentService) { |
47 | this.appId = appId; | 52 | this.appId = appId; |
48 | - this.configInfoService = configInfoService; | 53 | + this.configService = configService; |
49 | this.interfaceService = interfaceService; | 54 | this.interfaceService = interfaceService; |
50 | this.intentService = intentService; | 55 | this.intentService = intentService; |
51 | } | 56 | } |
52 | 57 | ||
58 | + /** | ||
59 | + * Starts the peer connectivity manager. | ||
60 | + */ | ||
53 | public void start() { | 61 | public void start() { |
54 | // TODO are any of these errors? | 62 | // TODO are any of these errors? |
55 | if (interfaceService.getInterfaces().isEmpty()) { | 63 | if (interfaceService.getInterfaces().isEmpty()) { |
56 | 64 | ||
57 | log.warn("The interface in configuration file is empty. " | 65 | log.warn("The interface in configuration file is empty. " |
58 | + "Thus, the SDN-IP application can not be started."); | 66 | + "Thus, the SDN-IP application can not be started."); |
59 | - } else if (configInfoService.getBgpPeers().isEmpty()) { | 67 | + } else if (configService.getBgpPeers().isEmpty()) { |
60 | 68 | ||
61 | log.warn("The BGP peer in configuration file is empty." | 69 | log.warn("The BGP peer in configuration file is empty." |
62 | + "Thus, the SDN-IP application can not be started."); | 70 | + "Thus, the SDN-IP application can not be started."); |
63 | - } else if (configInfoService.getBgpSpeakers() == null) { | 71 | + } else if (configService.getBgpSpeakers() == null) { |
64 | 72 | ||
65 | log.error("The BGP speaker in configuration file is empty. " | 73 | log.error("The BGP speaker in configuration file is empty. " |
66 | + "Thus, the SDN-IP application can not be started."); | 74 | + "Thus, the SDN-IP application can not be started."); |
... | @@ -79,7 +87,7 @@ public class PeerConnectivityManager { | ... | @@ -79,7 +87,7 @@ public class PeerConnectivityManager { |
79 | * for paths from all peers to each BGP speaker. | 87 | * for paths from all peers to each BGP speaker. |
80 | */ | 88 | */ |
81 | private void setupBgpPaths() { | 89 | private void setupBgpPaths() { |
82 | - for (BgpSpeaker bgpSpeaker : configInfoService.getBgpSpeakers() | 90 | + for (BgpSpeaker bgpSpeaker : configService.getBgpSpeakers() |
83 | .values()) { | 91 | .values()) { |
84 | log.debug("Start to set up BGP paths for BGP speaker: {}", | 92 | log.debug("Start to set up BGP paths for BGP speaker: {}", |
85 | bgpSpeaker); | 93 | bgpSpeaker); |
... | @@ -88,7 +96,7 @@ public class PeerConnectivityManager { | ... | @@ -88,7 +96,7 @@ public class PeerConnectivityManager { |
88 | List<InterfaceAddress> interfaceAddresses = | 96 | List<InterfaceAddress> interfaceAddresses = |
89 | bgpSpeaker.interfaceAddresses(); | 97 | bgpSpeaker.interfaceAddresses(); |
90 | 98 | ||
91 | - for (BgpPeer bgpPeer : configInfoService.getBgpPeers().values()) { | 99 | + for (BgpPeer bgpPeer : configService.getBgpPeers().values()) { |
92 | 100 | ||
93 | log.debug("Start to set up BGP paths between BGP speaker: {} " | 101 | log.debug("Start to set up BGP paths between BGP speaker: {} " |
94 | + "to BGP peer: {}", bgpSpeaker, bgpPeer); | 102 | + "to BGP peer: {}", bgpSpeaker, bgpPeer); |
... | @@ -121,16 +129,14 @@ public class PeerConnectivityManager { | ... | @@ -121,16 +129,14 @@ public class PeerConnectivityManager { |
121 | 129 | ||
122 | // install intent for BGP path from BGPd to BGP peer matching | 130 | // install intent for BGP path from BGPd to BGP peer matching |
123 | // destination TCP port 179 | 131 | // destination TCP port 179 |
124 | - | ||
125 | - // TODO: The usage of PacketMatchBuilder will be improved, then we | ||
126 | - // only need to new the PacketMatchBuilder once. | ||
127 | - // By then, the code here will be improved accordingly. | ||
128 | TrafficSelector selector = DefaultTrafficSelector.builder() | 132 | TrafficSelector selector = DefaultTrafficSelector.builder() |
129 | .matchEthType(Ethernet.TYPE_IPV4) | 133 | .matchEthType(Ethernet.TYPE_IPV4) |
130 | .matchIPProtocol(IPv4.PROTOCOL_TCP) | 134 | .matchIPProtocol(IPv4.PROTOCOL_TCP) |
131 | - .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH)) | 135 | + .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), |
132 | - .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), IPV4_BIT_LENGTH)) | 136 | + IpAddress.MAX_INET_MASK)) |
133 | - .matchTcpDst(BGP_PORT) | 137 | + .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), |
138 | + IpAddress.MAX_INET_MASK)) | ||
139 | + .matchTcpDst((short) BgpConstants.BGP_PORT) | ||
134 | .build(); | 140 | .build(); |
135 | 141 | ||
136 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() | 142 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() |
... | @@ -149,9 +155,11 @@ public class PeerConnectivityManager { | ... | @@ -149,9 +155,11 @@ public class PeerConnectivityManager { |
149 | selector = DefaultTrafficSelector.builder() | 155 | selector = DefaultTrafficSelector.builder() |
150 | .matchEthType(Ethernet.TYPE_IPV4) | 156 | .matchEthType(Ethernet.TYPE_IPV4) |
151 | .matchIPProtocol(IPv4.PROTOCOL_TCP) | 157 | .matchIPProtocol(IPv4.PROTOCOL_TCP) |
152 | - .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH)) | 158 | + .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), |
153 | - .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), IPV4_BIT_LENGTH)) | 159 | + IpAddress.MAX_INET_MASK)) |
154 | - .matchTcpSrc(BGP_PORT) | 160 | + .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), |
161 | + IpAddress.MAX_INET_MASK)) | ||
162 | + .matchTcpSrc((short) BgpConstants.BGP_PORT) | ||
155 | .build(); | 163 | .build(); |
156 | 164 | ||
157 | PointToPointIntent intentMatchSrcTcpPort = | 165 | PointToPointIntent intentMatchSrcTcpPort = |
... | @@ -167,9 +175,11 @@ public class PeerConnectivityManager { | ... | @@ -167,9 +175,11 @@ public class PeerConnectivityManager { |
167 | selector = DefaultTrafficSelector.builder() | 175 | selector = DefaultTrafficSelector.builder() |
168 | .matchEthType(Ethernet.TYPE_IPV4) | 176 | .matchEthType(Ethernet.TYPE_IPV4) |
169 | .matchIPProtocol(IPv4.PROTOCOL_TCP) | 177 | .matchIPProtocol(IPv4.PROTOCOL_TCP) |
170 | - .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), IPV4_BIT_LENGTH)) | 178 | + .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), |
171 | - .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH)) | 179 | + IpAddress.MAX_INET_MASK)) |
172 | - .matchTcpDst(BGP_PORT) | 180 | + .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), |
181 | + IpAddress.MAX_INET_MASK)) | ||
182 | + .matchTcpDst((short) BgpConstants.BGP_PORT) | ||
173 | .build(); | 183 | .build(); |
174 | 184 | ||
175 | PointToPointIntent reversedIntentMatchDstTcpPort = | 185 | PointToPointIntent reversedIntentMatchDstTcpPort = |
... | @@ -185,9 +195,11 @@ public class PeerConnectivityManager { | ... | @@ -185,9 +195,11 @@ public class PeerConnectivityManager { |
185 | selector = DefaultTrafficSelector.builder() | 195 | selector = DefaultTrafficSelector.builder() |
186 | .matchEthType(Ethernet.TYPE_IPV4) | 196 | .matchEthType(Ethernet.TYPE_IPV4) |
187 | .matchIPProtocol(IPv4.PROTOCOL_TCP) | 197 | .matchIPProtocol(IPv4.PROTOCOL_TCP) |
188 | - .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), IPV4_BIT_LENGTH)) | 198 | + .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), |
189 | - .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH)) | 199 | + IpAddress.MAX_INET_MASK)) |
190 | - .matchTcpSrc(BGP_PORT) | 200 | + .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), |
201 | + IpAddress.MAX_INET_MASK)) | ||
202 | + .matchTcpSrc((short) BgpConstants.BGP_PORT) | ||
191 | .build(); | 203 | .build(); |
192 | 204 | ||
193 | PointToPointIntent reversedIntentMatchSrcTcpPort = | 205 | PointToPointIntent reversedIntentMatchSrcTcpPort = |
... | @@ -211,7 +223,7 @@ public class PeerConnectivityManager { | ... | @@ -211,7 +223,7 @@ public class PeerConnectivityManager { |
211 | * for paths from all peers to each BGP speaker. | 223 | * for paths from all peers to each BGP speaker. |
212 | */ | 224 | */ |
213 | private void setupIcmpPaths() { | 225 | private void setupIcmpPaths() { |
214 | - for (BgpSpeaker bgpSpeaker : configInfoService.getBgpSpeakers() | 226 | + for (BgpSpeaker bgpSpeaker : configService.getBgpSpeakers() |
215 | .values()) { | 227 | .values()) { |
216 | log.debug("Start to set up ICMP paths for BGP speaker: {}", | 228 | log.debug("Start to set up ICMP paths for BGP speaker: {}", |
217 | bgpSpeaker); | 229 | bgpSpeaker); |
... | @@ -219,7 +231,7 @@ public class PeerConnectivityManager { | ... | @@ -219,7 +231,7 @@ public class PeerConnectivityManager { |
219 | List<InterfaceAddress> interfaceAddresses = bgpSpeaker | 231 | List<InterfaceAddress> interfaceAddresses = bgpSpeaker |
220 | .interfaceAddresses(); | 232 | .interfaceAddresses(); |
221 | 233 | ||
222 | - for (BgpPeer bgpPeer : configInfoService.getBgpPeers().values()) { | 234 | + for (BgpPeer bgpPeer : configService.getBgpPeers().values()) { |
223 | 235 | ||
224 | Interface peerInterface = interfaceService.getInterface( | 236 | Interface peerInterface = interfaceService.getInterface( |
225 | bgpPeer.connectPoint()); | 237 | bgpPeer.connectPoint()); |
... | @@ -253,8 +265,10 @@ public class PeerConnectivityManager { | ... | @@ -253,8 +265,10 @@ public class PeerConnectivityManager { |
253 | TrafficSelector selector = DefaultTrafficSelector.builder() | 265 | TrafficSelector selector = DefaultTrafficSelector.builder() |
254 | .matchEthType(Ethernet.TYPE_IPV4) | 266 | .matchEthType(Ethernet.TYPE_IPV4) |
255 | .matchIPProtocol(IPv4.PROTOCOL_ICMP) | 267 | .matchIPProtocol(IPv4.PROTOCOL_ICMP) |
256 | - .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH)) | 268 | + .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), |
257 | - .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), IPV4_BIT_LENGTH)) | 269 | + IpAddress.MAX_INET_MASK)) |
270 | + .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), | ||
271 | + IpAddress.MAX_INET_MASK)) | ||
258 | .build(); | 272 | .build(); |
259 | 273 | ||
260 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() | 274 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() |
... | @@ -271,8 +285,10 @@ public class PeerConnectivityManager { | ... | @@ -271,8 +285,10 @@ public class PeerConnectivityManager { |
271 | selector = DefaultTrafficSelector.builder() | 285 | selector = DefaultTrafficSelector.builder() |
272 | .matchEthType(Ethernet.TYPE_IPV4) | 286 | .matchEthType(Ethernet.TYPE_IPV4) |
273 | .matchIPProtocol(IPv4.PROTOCOL_ICMP) | 287 | .matchIPProtocol(IPv4.PROTOCOL_ICMP) |
274 | - .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), IPV4_BIT_LENGTH)) | 288 | + .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), |
275 | - .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH)) | 289 | + IpAddress.MAX_INET_MASK)) |
290 | + .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), | ||
291 | + IpAddress.MAX_INET_MASK)) | ||
276 | .build(); | 292 | .build(); |
277 | 293 | ||
278 | PointToPointIntent reversedIntent = | 294 | PointToPointIntent reversedIntent = | ... | ... |
... | @@ -55,8 +55,6 @@ import com.googlecode.concurrenttrees.radixinverted.InvertedRadixTree; | ... | @@ -55,8 +55,6 @@ import com.googlecode.concurrenttrees.radixinverted.InvertedRadixTree; |
55 | /** | 55 | /** |
56 | * This class processes BGP route update, translates each update into a intent | 56 | * This class processes BGP route update, translates each update into a intent |
57 | * and submits the intent. | 57 | * and submits the intent. |
58 | - * <p/> | ||
59 | - * TODO: Make it thread-safe. | ||
60 | */ | 58 | */ |
61 | public class Router implements RouteListener { | 59 | public class Router implements RouteListener { |
62 | 60 | ||
... | @@ -69,14 +67,13 @@ public class Router implements RouteListener { | ... | @@ -69,14 +67,13 @@ public class Router implements RouteListener { |
69 | // Stores all incoming route updates in a queue. | 67 | // Stores all incoming route updates in a queue. |
70 | private BlockingQueue<RouteUpdate> routeUpdates; | 68 | private BlockingQueue<RouteUpdate> routeUpdates; |
71 | 69 | ||
72 | - // The Ip4Address is the next hop address of each route update. | 70 | + // The IpAddress is the next hop address of each route update. |
73 | private SetMultimap<IpAddress, RouteEntry> routesWaitingOnArp; | 71 | private SetMultimap<IpAddress, RouteEntry> routesWaitingOnArp; |
74 | private ConcurrentHashMap<IpPrefix, MultiPointToSinglePointIntent> pushedRouteIntents; | 72 | private ConcurrentHashMap<IpPrefix, MultiPointToSinglePointIntent> pushedRouteIntents; |
75 | 73 | ||
76 | private IntentService intentService; | 74 | private IntentService intentService; |
77 | - //private IProxyArpService proxyArp; | ||
78 | private HostService hostService; | 75 | private HostService hostService; |
79 | - private SdnIpConfigService configInfoService; | 76 | + private SdnIpConfigService configService; |
80 | private InterfaceService interfaceService; | 77 | private InterfaceService interfaceService; |
81 | 78 | ||
82 | private ExecutorService bgpUpdatesExecutor; | 79 | private ExecutorService bgpUpdatesExecutor; |
... | @@ -98,18 +95,19 @@ public class Router implements RouteListener { | ... | @@ -98,18 +95,19 @@ public class Router implements RouteListener { |
98 | /** | 95 | /** |
99 | * Class constructor. | 96 | * Class constructor. |
100 | * | 97 | * |
98 | + * @param appId the application ID | ||
101 | * @param intentService the intent service | 99 | * @param intentService the intent service |
102 | * @param hostService the host service | 100 | * @param hostService the host service |
103 | - * @param configInfoService the configuration service | 101 | + * @param configService the configuration service |
104 | * @param interfaceService the interface service | 102 | * @param interfaceService the interface service |
105 | */ | 103 | */ |
106 | public Router(ApplicationId appId, IntentService intentService, | 104 | public Router(ApplicationId appId, IntentService intentService, |
107 | - HostService hostService, SdnIpConfigService configInfoService, | 105 | + HostService hostService, SdnIpConfigService configService, |
108 | InterfaceService interfaceService) { | 106 | InterfaceService interfaceService) { |
109 | this.appId = appId; | 107 | this.appId = appId; |
110 | this.intentService = intentService; | 108 | this.intentService = intentService; |
111 | this.hostService = hostService; | 109 | this.hostService = hostService; |
112 | - this.configInfoService = configInfoService; | 110 | + this.configService = configService; |
113 | this.interfaceService = interfaceService; | 111 | this.interfaceService = interfaceService; |
114 | 112 | ||
115 | bgpRoutes = new ConcurrentInvertedRadixTree<>( | 113 | bgpRoutes = new ConcurrentInvertedRadixTree<>( |
... | @@ -172,7 +170,7 @@ public class Router implements RouteListener { | ... | @@ -172,7 +170,7 @@ public class Router implements RouteListener { |
172 | 170 | ||
173 | @Override | 171 | @Override |
174 | public void update(RouteUpdate routeUpdate) { | 172 | public void update(RouteUpdate routeUpdate) { |
175 | - log.debug("Received new route Update: {}", routeUpdate); | 173 | + log.debug("Received new route update: {}", routeUpdate); |
176 | 174 | ||
177 | try { | 175 | try { |
178 | routeUpdates.put(routeUpdate); | 176 | routeUpdates.put(routeUpdate); |
... | @@ -498,9 +496,11 @@ public class Router implements RouteListener { | ... | @@ -498,9 +496,11 @@ public class Router implements RouteListener { |
498 | private void executeRouteAdd(RouteEntry routeEntry) { | 496 | private void executeRouteAdd(RouteEntry routeEntry) { |
499 | log.debug("Executing route add: {}", routeEntry); | 497 | log.debug("Executing route add: {}", routeEntry); |
500 | 498 | ||
499 | + // Monitor the IP address so we'll get notified of updates to the MAC | ||
500 | + // address. | ||
501 | + hostService.startMonitoringIp(routeEntry.nextHop()); | ||
502 | + | ||
501 | // See if we know the MAC address of the next hop | 503 | // See if we know the MAC address of the next hop |
502 | - //MacAddress nextHopMacAddress = | ||
503 | - //proxyArp.getMacAddress(routeEntry.getNextHop()); | ||
504 | MacAddress nextHopMacAddress = null; | 504 | MacAddress nextHopMacAddress = null; |
505 | Set<Host> hosts = hostService.getHostsByIp( | 505 | Set<Host> hosts = hostService.getHostsByIp( |
506 | routeEntry.nextHop().toPrefix()); | 506 | routeEntry.nextHop().toPrefix()); |
... | @@ -511,9 +511,6 @@ public class Router implements RouteListener { | ... | @@ -511,9 +511,6 @@ public class Router implements RouteListener { |
511 | 511 | ||
512 | if (nextHopMacAddress == null) { | 512 | if (nextHopMacAddress == null) { |
513 | routesWaitingOnArp.put(routeEntry.nextHop(), routeEntry); | 513 | routesWaitingOnArp.put(routeEntry.nextHop(), routeEntry); |
514 | - //proxyArp.sendArpRequest(routeEntry.getNextHop(), this, true); | ||
515 | - // TODO maybe just do this for every prefix anyway | ||
516 | - hostService.startMonitoringIp(routeEntry.nextHop()); | ||
517 | return; | 514 | return; |
518 | } | 515 | } |
519 | 516 | ||
... | @@ -536,11 +533,11 @@ public class Router implements RouteListener { | ... | @@ -536,11 +533,11 @@ public class Router implements RouteListener { |
536 | 533 | ||
537 | // Find the attachment point (egress interface) of the next hop | 534 | // Find the attachment point (egress interface) of the next hop |
538 | Interface egressInterface; | 535 | Interface egressInterface; |
539 | - if (configInfoService.getBgpPeers().containsKey(nextHopIpAddress)) { | 536 | + if (configService.getBgpPeers().containsKey(nextHopIpAddress)) { |
540 | // Route to a peer | 537 | // Route to a peer |
541 | log.debug("Route to peer {}", nextHopIpAddress); | 538 | log.debug("Route to peer {}", nextHopIpAddress); |
542 | BgpPeer peer = | 539 | BgpPeer peer = |
543 | - configInfoService.getBgpPeers().get(nextHopIpAddress); | 540 | + configService.getBgpPeers().get(nextHopIpAddress); |
544 | egressInterface = | 541 | egressInterface = |
545 | interfaceService.getInterface(peer.connectPoint()); | 542 | interfaceService.getInterface(peer.connectPoint()); |
546 | } else { | 543 | } else { |
... | @@ -593,17 +590,12 @@ public class Router implements RouteListener { | ... | @@ -593,17 +590,12 @@ public class Router implements RouteListener { |
593 | } | 590 | } |
594 | 591 | ||
595 | // Match the destination IP prefix at the first hop | 592 | // Match the destination IP prefix at the first hop |
596 | - //PacketMatchBuilder builder = new PacketMatchBuilder(); | ||
597 | - //builder.setEtherType(Ethernet.TYPE_IPV4).setDstIpNet(prefix); | ||
598 | - //PacketMatch packetMatch = builder.build(); | ||
599 | TrafficSelector selector = DefaultTrafficSelector.builder() | 593 | TrafficSelector selector = DefaultTrafficSelector.builder() |
600 | .matchEthType(Ethernet.TYPE_IPV4) | 594 | .matchEthType(Ethernet.TYPE_IPV4) |
601 | .matchIPDst(prefix) | 595 | .matchIPDst(prefix) |
602 | .build(); | 596 | .build(); |
603 | 597 | ||
604 | // Rewrite the destination MAC address | 598 | // Rewrite the destination MAC address |
605 | - //ModifyDstMacAction modifyDstMacAction = | ||
606 | - //new ModifyDstMacAction(nextHopMacAddress); | ||
607 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() | 599 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() |
608 | .setEthDst(nextHopMacAddress) | 600 | .setEthDst(nextHopMacAddress) |
609 | .build(); | 601 | .build(); |
... | @@ -635,10 +627,6 @@ public class Router implements RouteListener { | ... | @@ -635,10 +627,6 @@ public class Router implements RouteListener { |
635 | log.debug("Processing route delete: {}", routeEntry); | 627 | log.debug("Processing route delete: {}", routeEntry); |
636 | IpPrefix prefix = routeEntry.prefix(); | 628 | IpPrefix prefix = routeEntry.prefix(); |
637 | 629 | ||
638 | - // TODO check the change of logic here - remove doesn't check that | ||
639 | - // the route entry was what we expected (and we can't do this | ||
640 | - // concurrently) | ||
641 | - | ||
642 | if (bgpRoutes.remove(RouteEntry.createBinaryString(prefix))) { | 630 | if (bgpRoutes.remove(RouteEntry.createBinaryString(prefix))) { |
643 | // | 631 | // |
644 | // Only delete flows if an entry was actually removed from the | 632 | // Only delete flows if an entry was actually removed from the |
... | @@ -680,17 +668,19 @@ public class Router implements RouteListener { | ... | @@ -680,17 +668,19 @@ public class Router implements RouteListener { |
680 | } | 668 | } |
681 | 669 | ||
682 | /** | 670 | /** |
683 | - * This method handles the prefixes which are waiting for ARP replies for | 671 | + * Signals the Router that the MAC to IP mapping has potentially been |
684 | - * MAC addresses of next hops. | 672 | + * updated. This has the effect of updating the MAC address for any |
673 | + * installed prefixes if it has changed, as well as installing any pending | ||
674 | + * prefixes that were waiting for MAC resolution. | ||
685 | * | 675 | * |
686 | - * @param ipAddress next hop router IP address, for which we sent ARP | 676 | + * @param ipAddress the IP address that an event was received for |
687 | - * request out | 677 | + * @param macAddress the most recently known MAC address for the IP address |
688 | - * @param macAddress MAC address which is relative to the ipAddress | ||
689 | */ | 678 | */ |
690 | - //@Override | 679 | + private void updateMac(IpAddress ipAddress, MacAddress macAddress) { |
691 | - // TODO change name | 680 | + log.debug("Received updated MAC info: {} => {}", ipAddress, macAddress); |
692 | - public void arpResponse(IpAddress ipAddress, MacAddress macAddress) { | 681 | + |
693 | - log.debug("Received ARP response: {} => {}", ipAddress, macAddress); | 682 | + // TODO here we should check whether the next hop for any of our |
683 | + // installed prefixes has changed, not just prefixes pending installation. | ||
694 | 684 | ||
695 | // We synchronize on this to prevent changes to the radix tree | 685 | // We synchronize on this to prevent changes to the radix tree |
696 | // while we're pushing intents. If the tree changes, the | 686 | // while we're pushing intents. If the tree changes, the |
... | @@ -708,8 +698,6 @@ public class Router implements RouteListener { | ... | @@ -708,8 +698,6 @@ public class Router implements RouteListener { |
708 | bgpRoutes.getValueForExactKey(binaryString); | 698 | bgpRoutes.getValueForExactKey(binaryString); |
709 | if (foundRouteEntry != null && | 699 | if (foundRouteEntry != null && |
710 | foundRouteEntry.nextHop().equals(routeEntry.nextHop())) { | 700 | foundRouteEntry.nextHop().equals(routeEntry.nextHop())) { |
711 | - log.debug("Pushing prefix {} next hop {}", | ||
712 | - routeEntry.prefix(), routeEntry.nextHop()); | ||
713 | // We only push prefix flows if the prefix is still in the | 701 | // We only push prefix flows if the prefix is still in the |
714 | // radix tree and the next hop is the same as our | 702 | // radix tree and the next hop is the same as our |
715 | // update. | 703 | // update. |
... | @@ -717,9 +705,8 @@ public class Router implements RouteListener { | ... | @@ -717,9 +705,8 @@ public class Router implements RouteListener { |
717 | // for the ARP, or the next hop could have changed. | 705 | // for the ARP, or the next hop could have changed. |
718 | addRouteIntentToNextHop(prefix, ipAddress, macAddress); | 706 | addRouteIntentToNextHop(prefix, ipAddress, macAddress); |
719 | } else { | 707 | } else { |
720 | - log.debug("Received ARP response, but {}/{} is no longer in" | 708 | + log.debug("{} has been revoked before the MAC was resolved", |
721 | - + " the radix tree", routeEntry.prefix(), | 709 | + routeEntry); |
722 | - routeEntry.nextHop()); | ||
723 | } | 710 | } |
724 | } | 711 | } |
725 | } | 712 | } |
... | @@ -769,7 +756,7 @@ public class Router implements RouteListener { | ... | @@ -769,7 +756,7 @@ public class Router implements RouteListener { |
769 | event.type() == HostEvent.Type.HOST_UPDATED) { | 756 | event.type() == HostEvent.Type.HOST_UPDATED) { |
770 | Host host = event.subject(); | 757 | Host host = event.subject(); |
771 | for (IpPrefix ip : host.ipAddresses()) { | 758 | for (IpPrefix ip : host.ipAddresses()) { |
772 | - arpResponse(ip.toIpAddress(), host.mac()); | 759 | + updateMac(ip.toIpAddress(), host.mac()); |
773 | } | 760 | } |
774 | } | 761 | } |
775 | } | 762 | } | ... | ... |
... | @@ -26,7 +26,7 @@ import org.slf4j.Logger; | ... | @@ -26,7 +26,7 @@ import org.slf4j.Logger; |
26 | @Service | 26 | @Service |
27 | public class SdnIp implements SdnIpService { | 27 | public class SdnIp implements SdnIpService { |
28 | 28 | ||
29 | - private static final String SDN_ID_APP = "org.onlab.onos.sdnip"; | 29 | + private static final String SDN_IP_APP = "org.onlab.onos.sdnip"; |
30 | 30 | ||
31 | private final Logger log = getLogger(getClass()); | 31 | private final Logger log = getLogger(getClass()); |
32 | 32 | ||
... | @@ -53,8 +53,10 @@ public class SdnIp implements SdnIpService { | ... | @@ -53,8 +53,10 @@ public class SdnIp implements SdnIpService { |
53 | 53 | ||
54 | InterfaceService interfaceService = new HostToInterfaceAdaptor(hostService); | 54 | InterfaceService interfaceService = new HostToInterfaceAdaptor(hostService); |
55 | 55 | ||
56 | - ApplicationId appId = coreService.registerApplication(SDN_ID_APP); | 56 | + ApplicationId appId = coreService.registerApplication(SDN_IP_APP); |
57 | - peerConnectivity = new PeerConnectivityManager(appId, config, interfaceService, intentService); | 57 | + |
58 | + peerConnectivity = new PeerConnectivityManager(appId, config, | ||
59 | + interfaceService, intentService); | ||
58 | peerConnectivity.start(); | 60 | peerConnectivity.start(); |
59 | 61 | ||
60 | router = new Router(appId, intentService, hostService, config, interfaceService); | 62 | router = new Router(appId, intentService, hostService, config, interfaceService); | ... | ... |
1 | package org.onlab.onos.sdnip; | 1 | package org.onlab.onos.sdnip; |
2 | 2 | ||
3 | +import static org.easymock.EasyMock.anyObject; | ||
3 | import static org.easymock.EasyMock.createMock; | 4 | import static org.easymock.EasyMock.createMock; |
4 | import static org.easymock.EasyMock.expect; | 5 | import static org.easymock.EasyMock.expect; |
6 | +import static org.easymock.EasyMock.expectLastCall; | ||
5 | import static org.easymock.EasyMock.replay; | 7 | import static org.easymock.EasyMock.replay; |
6 | import static org.easymock.EasyMock.reset; | 8 | import static org.easymock.EasyMock.reset; |
7 | import static org.easymock.EasyMock.verify; | 9 | import static org.easymock.EasyMock.verify; |
... | @@ -27,6 +29,7 @@ import org.onlab.onos.net.flow.DefaultTrafficSelector; | ... | @@ -27,6 +29,7 @@ import org.onlab.onos.net.flow.DefaultTrafficSelector; |
27 | import org.onlab.onos.net.flow.DefaultTrafficTreatment; | 29 | import org.onlab.onos.net.flow.DefaultTrafficTreatment; |
28 | import org.onlab.onos.net.flow.TrafficSelector; | 30 | import org.onlab.onos.net.flow.TrafficSelector; |
29 | import org.onlab.onos.net.flow.TrafficTreatment; | 31 | import org.onlab.onos.net.flow.TrafficTreatment; |
32 | +import org.onlab.onos.net.host.HostListener; | ||
30 | import org.onlab.onos.net.host.HostService; | 33 | import org.onlab.onos.net.host.HostService; |
31 | import org.onlab.onos.net.intent.IntentService; | 34 | import org.onlab.onos.net.intent.IntentService; |
32 | import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; | 35 | import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; |
... | @@ -55,10 +58,17 @@ public class RouterTest { | ... | @@ -55,10 +58,17 @@ public class RouterTest { |
55 | private IntentService intentService; | 58 | private IntentService intentService; |
56 | private HostService hostService; | 59 | private HostService hostService; |
57 | 60 | ||
58 | - private Map<IpAddress, BgpPeer> bgpPeers; | 61 | + private static final ConnectPoint SW1_ETH1 = new ConnectPoint( |
59 | - private Map<IpAddress, BgpPeer> configuredPeers; | 62 | + DeviceId.deviceId("of:0000000000000001"), |
60 | - private Set<Interface> interfaces; | 63 | + PortNumber.portNumber(1)); |
61 | - private Set<Interface> configuredInterfaces; | 64 | + |
65 | + private static final ConnectPoint SW2_ETH1 = new ConnectPoint( | ||
66 | + DeviceId.deviceId("of:0000000000000002"), | ||
67 | + PortNumber.portNumber(1)); | ||
68 | + | ||
69 | + private static final ConnectPoint SW3_ETH1 = new ConnectPoint( | ||
70 | + DeviceId.deviceId("of:0000000000000003"), | ||
71 | + PortNumber.portNumber(1)); | ||
62 | 72 | ||
63 | private static final ApplicationId APPID = new ApplicationId() { | 73 | private static final ApplicationId APPID = new ApplicationId() { |
64 | @Override | 74 | @Override |
... | @@ -76,55 +86,12 @@ public class RouterTest { | ... | @@ -76,55 +86,12 @@ public class RouterTest { |
76 | 86 | ||
77 | @Before | 87 | @Before |
78 | public void setUp() throws Exception { | 88 | public void setUp() throws Exception { |
79 | - bgpPeers = setUpBgpPeers(); | 89 | + setUpBgpPeers(); |
80 | - interfaces = setUpInterfaces(); | ||
81 | - initRouter(); | ||
82 | - } | ||
83 | 90 | ||
84 | - /** | 91 | + setUpInterfaceService(); |
85 | - * Initializes Router class. | 92 | + setUpHostService(); |
86 | - */ | ||
87 | - private void initRouter() { | ||
88 | 93 | ||
89 | intentService = createMock(IntentService.class); | 94 | intentService = createMock(IntentService.class); |
90 | - hostService = createMock(HostService.class); | ||
91 | - | ||
92 | - interfaceService = createMock(InterfaceService.class); | ||
93 | - expect(interfaceService.getInterfaces()).andReturn( | ||
94 | - interfaces).anyTimes(); | ||
95 | - | ||
96 | - Set<IpPrefix> ipAddressesOnSw1Eth1 = new HashSet<IpPrefix>(); | ||
97 | - ipAddressesOnSw1Eth1.add(IpPrefix.valueOf("192.168.10.0/24")); | ||
98 | - Interface expectedInterface = | ||
99 | - new Interface(new ConnectPoint( | ||
100 | - DeviceId.deviceId("of:0000000000000001"), | ||
101 | - PortNumber.portNumber("1")), | ||
102 | - ipAddressesOnSw1Eth1, | ||
103 | - MacAddress.valueOf("00:00:00:00:00:01")); | ||
104 | - ConnectPoint egressPoint = new ConnectPoint( | ||
105 | - DeviceId.deviceId("of:0000000000000001"), | ||
106 | - PortNumber.portNumber(1)); | ||
107 | - expect(interfaceService.getInterface(egressPoint)).andReturn( | ||
108 | - expectedInterface).anyTimes(); | ||
109 | - | ||
110 | - Set<IpPrefix> ipAddressesOnSw2Eth1 = new HashSet<IpPrefix>(); | ||
111 | - ipAddressesOnSw2Eth1.add(IpPrefix.valueOf("192.168.20.0/24")); | ||
112 | - Interface expectedInterfaceNew = | ||
113 | - new Interface(new ConnectPoint( | ||
114 | - DeviceId.deviceId("of:0000000000000002"), | ||
115 | - PortNumber.portNumber("1")), | ||
116 | - ipAddressesOnSw2Eth1, | ||
117 | - MacAddress.valueOf("00:00:00:00:00:02")); | ||
118 | - ConnectPoint egressPointNew = new ConnectPoint( | ||
119 | - DeviceId.deviceId("of:0000000000000002"), | ||
120 | - PortNumber.portNumber(1)); | ||
121 | - expect(interfaceService.getInterface(egressPointNew)).andReturn( | ||
122 | - expectedInterfaceNew).anyTimes(); | ||
123 | - replay(interfaceService); | ||
124 | - | ||
125 | - sdnIpConfigService = createMock(SdnIpConfigService.class); | ||
126 | - expect(sdnIpConfigService.getBgpPeers()).andReturn(bgpPeers).anyTimes(); | ||
127 | - replay(sdnIpConfigService); | ||
128 | 95 | ||
129 | router = new Router(APPID, intentService, | 96 | router = new Router(APPID, intentService, |
130 | hostService, sdnIpConfigService, interfaceService); | 97 | hostService, sdnIpConfigService, interfaceService); |
... | @@ -132,67 +99,99 @@ public class RouterTest { | ... | @@ -132,67 +99,99 @@ public class RouterTest { |
132 | 99 | ||
133 | /** | 100 | /** |
134 | * Sets up BGP peers in external networks. | 101 | * Sets up BGP peers in external networks. |
135 | - * | ||
136 | - * @return configured BGP peers as a Map from peer IP address to BgpPeer | ||
137 | */ | 102 | */ |
138 | - private Map<IpAddress, BgpPeer> setUpBgpPeers() { | 103 | + private void setUpBgpPeers() { |
139 | 104 | ||
140 | - configuredPeers = new HashMap<>(); | 105 | + Map<IpAddress, BgpPeer> peers = new HashMap<>(); |
141 | 106 | ||
142 | String peerSw1Eth1 = "192.168.10.1"; | 107 | String peerSw1Eth1 = "192.168.10.1"; |
143 | - configuredPeers.put(IpAddress.valueOf(peerSw1Eth1), | 108 | + peers.put(IpAddress.valueOf(peerSw1Eth1), |
144 | new BgpPeer("00:00:00:00:00:00:00:01", 1, peerSw1Eth1)); | 109 | new BgpPeer("00:00:00:00:00:00:00:01", 1, peerSw1Eth1)); |
145 | 110 | ||
146 | // Two BGP peers are connected to switch 2 port 1. | 111 | // Two BGP peers are connected to switch 2 port 1. |
147 | String peer1Sw2Eth1 = "192.168.20.1"; | 112 | String peer1Sw2Eth1 = "192.168.20.1"; |
148 | - configuredPeers.put(IpAddress.valueOf(peer1Sw2Eth1), | 113 | + peers.put(IpAddress.valueOf(peer1Sw2Eth1), |
149 | new BgpPeer("00:00:00:00:00:00:00:02", 1, peer1Sw2Eth1)); | 114 | new BgpPeer("00:00:00:00:00:00:00:02", 1, peer1Sw2Eth1)); |
150 | 115 | ||
151 | String peer2Sw2Eth1 = "192.168.20.2"; | 116 | String peer2Sw2Eth1 = "192.168.20.2"; |
152 | - configuredPeers.put(IpAddress.valueOf(peer2Sw2Eth1), | 117 | + peers.put(IpAddress.valueOf(peer2Sw2Eth1), |
153 | new BgpPeer("00:00:00:00:00:00:00:02", 1, peer2Sw2Eth1)); | 118 | new BgpPeer("00:00:00:00:00:00:00:02", 1, peer2Sw2Eth1)); |
154 | 119 | ||
155 | - return configuredPeers; | 120 | + sdnIpConfigService = createMock(SdnIpConfigService.class); |
121 | + expect(sdnIpConfigService.getBgpPeers()).andReturn(peers).anyTimes(); | ||
122 | + replay(sdnIpConfigService); | ||
123 | + | ||
156 | } | 124 | } |
157 | 125 | ||
158 | /** | 126 | /** |
159 | * Sets up logical interfaces, which emulate the configured interfaces | 127 | * Sets up logical interfaces, which emulate the configured interfaces |
160 | * in SDN-IP application. | 128 | * in SDN-IP application. |
161 | - * | ||
162 | - * @return configured interfaces as a Set | ||
163 | */ | 129 | */ |
164 | - private Set<Interface> setUpInterfaces() { | 130 | + private void setUpInterfaceService() { |
165 | - | 131 | + interfaceService = createMock(InterfaceService.class); |
166 | - configuredInterfaces = Sets.newHashSet(); | 132 | + |
167 | - | 133 | + Set<Interface> interfaces = Sets.newHashSet(); |
168 | - Set<IpPrefix> ipAddressesOnSw1Eth1 = new HashSet<IpPrefix>(); | 134 | + |
169 | - ipAddressesOnSw1Eth1.add(IpPrefix.valueOf("192.168.10.0/24")); | 135 | + Interface sw1Eth1 = new Interface(SW1_ETH1, |
170 | - configuredInterfaces.add( | 136 | + Sets.newHashSet(IpPrefix.valueOf("192.168.10.101/24")), |
171 | - new Interface(new ConnectPoint( | 137 | + MacAddress.valueOf("00:00:00:00:00:01")); |
172 | - DeviceId.deviceId("of:0000000000000001"), | 138 | + |
173 | - PortNumber.portNumber(1)), | 139 | + expect(interfaceService.getInterface(SW1_ETH1)).andReturn(sw1Eth1).anyTimes(); |
174 | - ipAddressesOnSw1Eth1, | 140 | + interfaces.add(sw1Eth1); |
175 | - MacAddress.valueOf("00:00:00:00:00:01"))); | 141 | + |
176 | - | 142 | + Interface sw2Eth1 = new Interface(SW2_ETH1, |
177 | - Set<IpPrefix> ipAddressesOnSw2Eth1 = new HashSet<IpPrefix>(); | 143 | + Sets.newHashSet(IpPrefix.valueOf("192.168.20.101/24")), |
178 | - ipAddressesOnSw2Eth1.add(IpPrefix.valueOf("192.168.20.0/24")); | 144 | + MacAddress.valueOf("00:00:00:00:00:02")); |
179 | - configuredInterfaces.add( | 145 | + |
180 | - new Interface(new ConnectPoint( | 146 | + expect(interfaceService.getInterface(SW2_ETH1)).andReturn(sw2Eth1).anyTimes(); |
181 | - DeviceId.deviceId("of:0000000000000002"), | 147 | + interfaces.add(sw2Eth1); |
182 | - PortNumber.portNumber(1)), | 148 | + |
183 | - ipAddressesOnSw2Eth1, | 149 | + Interface sw3Eth1 = new Interface(SW3_ETH1, |
184 | - MacAddress.valueOf("00:00:00:00:00:02"))); | 150 | + Sets.newHashSet(IpPrefix.valueOf("192.168.30.101/24")), |
185 | - | 151 | + MacAddress.valueOf("00:00:00:00:00:03")); |
186 | - Set<IpPrefix> ipAddressesOnSw3Eth1 = new HashSet<IpPrefix>(); | 152 | + |
187 | - ipAddressesOnSw3Eth1.add(IpPrefix.valueOf("192.168.30.0/24")); | 153 | + expect(interfaceService.getInterface(SW3_ETH1)).andReturn(sw3Eth1).anyTimes(); |
188 | - configuredInterfaces.add( | 154 | + interfaces.add(sw3Eth1); |
189 | - new Interface(new ConnectPoint( | 155 | + |
190 | - DeviceId.deviceId("of:0000000000000003"), | 156 | + expect(interfaceService.getInterfaces()).andReturn(interfaces).anyTimes(); |
191 | - PortNumber.portNumber(1)), | 157 | + |
192 | - ipAddressesOnSw3Eth1, | 158 | + replay(interfaceService); |
193 | - MacAddress.valueOf("00:00:00:00:00:03"))); | 159 | + } |
194 | - | 160 | + |
195 | - return configuredInterfaces; | 161 | + /** |
162 | + * Sets up the host service with details of some hosts. | ||
163 | + */ | ||
164 | + private void setUpHostService() { | ||
165 | + hostService = createMock(HostService.class); | ||
166 | + | ||
167 | + hostService.addListener(anyObject(HostListener.class)); | ||
168 | + expectLastCall().anyTimes(); | ||
169 | + | ||
170 | + IpPrefix host1Address = IpPrefix.valueOf("192.168.10.1/32"); | ||
171 | + Host host1 = new DefaultHost(ProviderId.NONE, HostId.NONE, | ||
172 | + MacAddress.valueOf("00:00:00:00:00:01"), VlanId.NONE, | ||
173 | + new HostLocation(SW1_ETH1, 1), | ||
174 | + Sets.newHashSet(host1Address)); | ||
175 | + | ||
176 | + expect(hostService.getHostsByIp(host1Address)) | ||
177 | + .andReturn(Sets.newHashSet(host1)).anyTimes(); | ||
178 | + hostService.startMonitoringIp(host1Address.toIpAddress()); | ||
179 | + expectLastCall().anyTimes(); | ||
180 | + | ||
181 | + | ||
182 | + IpPrefix host2Address = IpPrefix.valueOf("192.168.20.1/32"); | ||
183 | + Host host2 = new DefaultHost(ProviderId.NONE, HostId.NONE, | ||
184 | + MacAddress.valueOf("00:00:00:00:00:02"), VlanId.NONE, | ||
185 | + new HostLocation(SW2_ETH1, 1), | ||
186 | + Sets.newHashSet(host2Address)); | ||
187 | + | ||
188 | + expect(hostService.getHostsByIp(host2Address)) | ||
189 | + .andReturn(Sets.newHashSet(host2)).anyTimes(); | ||
190 | + hostService.startMonitoringIp(host2Address.toIpAddress()); | ||
191 | + expectLastCall().anyTimes(); | ||
192 | + | ||
193 | + | ||
194 | + replay(hostService); | ||
196 | } | 195 | } |
197 | 196 | ||
198 | /** | 197 | /** |
... | @@ -200,7 +199,6 @@ public class RouterTest { | ... | @@ -200,7 +199,6 @@ public class RouterTest { |
200 | */ | 199 | */ |
201 | @Test | 200 | @Test |
202 | public void testProcessRouteAdd() throws TestUtilsException { | 201 | public void testProcessRouteAdd() throws TestUtilsException { |
203 | - | ||
204 | // Construct a route entry | 202 | // Construct a route entry |
205 | RouteEntry routeEntry = new RouteEntry( | 203 | RouteEntry routeEntry = new RouteEntry( |
206 | IpPrefix.valueOf("1.1.1.0/24"), | 204 | IpPrefix.valueOf("1.1.1.0/24"), |
... | @@ -217,36 +215,13 @@ public class RouterTest { | ... | @@ -217,36 +215,13 @@ public class RouterTest { |
217 | treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:01")); | 215 | treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:01")); |
218 | 216 | ||
219 | Set<ConnectPoint> ingressPoints = new HashSet<ConnectPoint>(); | 217 | Set<ConnectPoint> ingressPoints = new HashSet<ConnectPoint>(); |
220 | - ingressPoints.add(new ConnectPoint( | 218 | + ingressPoints.add(SW2_ETH1); |
221 | - DeviceId.deviceId("of:0000000000000002"), | 219 | + ingressPoints.add(SW3_ETH1); |
222 | - PortNumber.portNumber("1"))); | ||
223 | - ingressPoints.add(new ConnectPoint( | ||
224 | - DeviceId.deviceId("of:0000000000000003"), | ||
225 | - PortNumber.portNumber("1"))); | ||
226 | - | ||
227 | - ConnectPoint egressPoint = new ConnectPoint( | ||
228 | - DeviceId.deviceId("of:0000000000000001"), | ||
229 | - PortNumber.portNumber("1")); | ||
230 | 220 | ||
231 | MultiPointToSinglePointIntent intent = | 221 | MultiPointToSinglePointIntent intent = |
232 | new MultiPointToSinglePointIntent(APPID, | 222 | new MultiPointToSinglePointIntent(APPID, |
233 | selectorBuilder.build(), treatmentBuilder.build(), | 223 | selectorBuilder.build(), treatmentBuilder.build(), |
234 | - ingressPoints, egressPoint); | 224 | + ingressPoints, SW1_ETH1); |
235 | - | ||
236 | - // Reset host service | ||
237 | - reset(hostService); | ||
238 | - Set<Host> hosts = new HashSet<Host>(1); | ||
239 | - Set<IpPrefix> ipPrefixes = new HashSet<IpPrefix>(); | ||
240 | - ipPrefixes.add(IpPrefix.valueOf("192.168.10.1/32")); | ||
241 | - hosts.add(new DefaultHost(ProviderId.NONE, HostId.NONE, | ||
242 | - MacAddress.valueOf("00:00:00:00:00:01"), VlanId.NONE, | ||
243 | - new HostLocation( | ||
244 | - DeviceId.deviceId("of:0000000000000001"), | ||
245 | - PortNumber.portNumber(1), 1), | ||
246 | - ipPrefixes)); | ||
247 | - expect(hostService.getHostsByIp( | ||
248 | - IpPrefix.valueOf("192.168.10.1/32"))).andReturn(hosts); | ||
249 | - replay(hostService); | ||
250 | 225 | ||
251 | // Set up test expectation | 226 | // Set up test expectation |
252 | reset(intentService); | 227 | reset(intentService); |
... | @@ -274,7 +249,6 @@ public class RouterTest { | ... | @@ -274,7 +249,6 @@ public class RouterTest { |
274 | */ | 249 | */ |
275 | @Test | 250 | @Test |
276 | public void testRouteUpdate() throws TestUtilsException { | 251 | public void testRouteUpdate() throws TestUtilsException { |
277 | - | ||
278 | // Firstly add a route | 252 | // Firstly add a route |
279 | testProcessRouteAdd(); | 253 | testProcessRouteAdd(); |
280 | 254 | ||
... | @@ -293,22 +267,14 @@ public class RouterTest { | ... | @@ -293,22 +267,14 @@ public class RouterTest { |
293 | DefaultTrafficTreatment.builder(); | 267 | DefaultTrafficTreatment.builder(); |
294 | treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:01")); | 268 | treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:01")); |
295 | 269 | ||
296 | - ConnectPoint egressPoint = new ConnectPoint( | ||
297 | - DeviceId.deviceId("of:0000000000000001"), | ||
298 | - PortNumber.portNumber("1")); | ||
299 | - | ||
300 | Set<ConnectPoint> ingressPoints = new HashSet<ConnectPoint>(); | 270 | Set<ConnectPoint> ingressPoints = new HashSet<ConnectPoint>(); |
301 | - ingressPoints.add(new ConnectPoint( | 271 | + ingressPoints.add(SW2_ETH1); |
302 | - DeviceId.deviceId("of:0000000000000002"), | 272 | + ingressPoints.add(SW3_ETH1); |
303 | - PortNumber.portNumber("1"))); | ||
304 | - ingressPoints.add(new ConnectPoint( | ||
305 | - DeviceId.deviceId("of:0000000000000003"), | ||
306 | - PortNumber.portNumber("1"))); | ||
307 | 273 | ||
308 | MultiPointToSinglePointIntent intent = | 274 | MultiPointToSinglePointIntent intent = |
309 | new MultiPointToSinglePointIntent(APPID, | 275 | new MultiPointToSinglePointIntent(APPID, |
310 | selectorBuilder.build(), treatmentBuilder.build(), | 276 | selectorBuilder.build(), treatmentBuilder.build(), |
311 | - ingressPoints, egressPoint); | 277 | + ingressPoints, SW1_ETH1); |
312 | 278 | ||
313 | // Start to construct a new route entry and new intent | 279 | // Start to construct a new route entry and new intent |
314 | RouteEntry routeEntryUpdate = new RouteEntry( | 280 | RouteEntry routeEntryUpdate = new RouteEntry( |
... | @@ -325,38 +291,16 @@ public class RouterTest { | ... | @@ -325,38 +291,16 @@ public class RouterTest { |
325 | DefaultTrafficTreatment.builder(); | 291 | DefaultTrafficTreatment.builder(); |
326 | treatmentBuilderNew.setEthDst(MacAddress.valueOf("00:00:00:00:00:02")); | 292 | treatmentBuilderNew.setEthDst(MacAddress.valueOf("00:00:00:00:00:02")); |
327 | 293 | ||
328 | - ConnectPoint egressPointNew = new ConnectPoint( | ||
329 | - DeviceId.deviceId("of:0000000000000002"), | ||
330 | - PortNumber.portNumber("1")); | ||
331 | 294 | ||
332 | Set<ConnectPoint> ingressPointsNew = new HashSet<ConnectPoint>(); | 295 | Set<ConnectPoint> ingressPointsNew = new HashSet<ConnectPoint>(); |
333 | - ingressPointsNew.add(new ConnectPoint( | 296 | + ingressPointsNew.add(SW1_ETH1); |
334 | - DeviceId.deviceId("of:0000000000000001"), | 297 | + ingressPointsNew.add(SW3_ETH1); |
335 | - PortNumber.portNumber("1"))); | ||
336 | - ingressPointsNew.add(new ConnectPoint( | ||
337 | - DeviceId.deviceId("of:0000000000000003"), | ||
338 | - PortNumber.portNumber("1"))); | ||
339 | 298 | ||
340 | MultiPointToSinglePointIntent intentNew = | 299 | MultiPointToSinglePointIntent intentNew = |
341 | new MultiPointToSinglePointIntent(APPID, | 300 | new MultiPointToSinglePointIntent(APPID, |
342 | selectorBuilderNew.build(), | 301 | selectorBuilderNew.build(), |
343 | treatmentBuilderNew.build(), | 302 | treatmentBuilderNew.build(), |
344 | - ingressPointsNew, egressPointNew); | 303 | + ingressPointsNew, SW2_ETH1); |
345 | - | ||
346 | - // Reset host service | ||
347 | - reset(hostService); | ||
348 | - Set<Host> hosts = new HashSet<Host>(1); | ||
349 | - Set<IpPrefix> ipPrefixes = new HashSet<IpPrefix>(); | ||
350 | - ipPrefixes.add(IpPrefix.valueOf("192.168.20.1/32")); | ||
351 | - hosts.add(new DefaultHost(ProviderId.NONE, HostId.NONE, | ||
352 | - MacAddress.valueOf("00:00:00:00:00:02"), VlanId.NONE, | ||
353 | - new HostLocation( | ||
354 | - DeviceId.deviceId("of:0000000000000002"), | ||
355 | - PortNumber.portNumber(1), 1), | ||
356 | - ipPrefixes)); | ||
357 | - expect(hostService.getHostsByIp( | ||
358 | - IpPrefix.valueOf("192.168.20.1/32"))).andReturn(hosts); | ||
359 | - replay(hostService); | ||
360 | 304 | ||
361 | // Set up test expectation | 305 | // Set up test expectation |
362 | reset(intentService); | 306 | reset(intentService); |
... | @@ -383,7 +327,6 @@ public class RouterTest { | ... | @@ -383,7 +327,6 @@ public class RouterTest { |
383 | */ | 327 | */ |
384 | @Test | 328 | @Test |
385 | public void testProcessRouteDelete() throws TestUtilsException { | 329 | public void testProcessRouteDelete() throws TestUtilsException { |
386 | - | ||
387 | // Firstly add a route | 330 | // Firstly add a route |
388 | testProcessRouteAdd(); | 331 | testProcessRouteAdd(); |
389 | 332 | ||
... | @@ -402,22 +345,14 @@ public class RouterTest { | ... | @@ -402,22 +345,14 @@ public class RouterTest { |
402 | DefaultTrafficTreatment.builder(); | 345 | DefaultTrafficTreatment.builder(); |
403 | treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:01")); | 346 | treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:01")); |
404 | 347 | ||
405 | - ConnectPoint egressPoint = new ConnectPoint( | ||
406 | - DeviceId.deviceId("of:0000000000000001"), | ||
407 | - PortNumber.portNumber("1")); | ||
408 | - | ||
409 | Set<ConnectPoint> ingressPoints = new HashSet<ConnectPoint>(); | 348 | Set<ConnectPoint> ingressPoints = new HashSet<ConnectPoint>(); |
410 | - ingressPoints.add(new ConnectPoint( | 349 | + ingressPoints.add(SW2_ETH1); |
411 | - DeviceId.deviceId("of:0000000000000002"), | 350 | + ingressPoints.add(SW3_ETH1); |
412 | - PortNumber.portNumber("1"))); | ||
413 | - ingressPoints.add(new ConnectPoint( | ||
414 | - DeviceId.deviceId("of:0000000000000003"), | ||
415 | - PortNumber.portNumber("1"))); | ||
416 | 351 | ||
417 | MultiPointToSinglePointIntent intent = | 352 | MultiPointToSinglePointIntent intent = |
418 | new MultiPointToSinglePointIntent(APPID, | 353 | new MultiPointToSinglePointIntent(APPID, |
419 | selectorBuilder.build(), treatmentBuilder.build(), | 354 | selectorBuilder.build(), treatmentBuilder.build(), |
420 | - ingressPoints, egressPoint); | 355 | + ingressPoints, SW1_ETH1); |
421 | 356 | ||
422 | // Set up expectation | 357 | // Set up expectation |
423 | reset(intentService); | 358 | reset(intentService); |
... | @@ -442,7 +377,6 @@ public class RouterTest { | ... | @@ -442,7 +377,6 @@ public class RouterTest { |
442 | */ | 377 | */ |
443 | @Test | 378 | @Test |
444 | public void testLocalRouteAdd() throws TestUtilsException { | 379 | public void testLocalRouteAdd() throws TestUtilsException { |
445 | - | ||
446 | // Construct a route entry, the next hop is the local BGP speaker | 380 | // Construct a route entry, the next hop is the local BGP speaker |
447 | RouteEntry routeEntry = new RouteEntry( | 381 | RouteEntry routeEntry = new RouteEntry( |
448 | IpPrefix.valueOf("1.1.1.0/24"), IpAddress.valueOf("0.0.0.0")); | 382 | IpPrefix.valueOf("1.1.1.0/24"), IpAddress.valueOf("0.0.0.0")); | ... | ... |
-
Please register or login to post a comment