Jonathan Hart
Committed by Gerrit Code Review

Send PIM Join/Prune messages based on events from the McastService.

Also change Interface to return a list of addresses rather than a set
to allow applications to rely on the order of configuration

Change-Id: Ie7f62fee507639325ee0a77b8db4088dae34597e
...@@ -47,6 +47,13 @@ ...@@ -47,6 +47,13 @@
47 47
48 <dependency> 48 <dependency>
49 <groupId>org.onosproject</groupId> 49 <groupId>org.onosproject</groupId>
50 + <artifactId>onos-app-routing-api</artifactId>
51 + <version>${project.version}</version>
52 + </dependency>
53 +
54 +
55 + <dependency>
56 + <groupId>org.onosproject</groupId>
50 <artifactId>onos-cli</artifactId> 57 <artifactId>onos-cli</artifactId>
51 <version>${project.version}</version> 58 <version>${project.version}</version>
52 </dependency> 59 </dependency>
......
...@@ -31,6 +31,7 @@ import java.util.Set; ...@@ -31,6 +31,7 @@ import java.util.Set;
31 public class PimInterfacesListCommand extends AbstractShellCommand { 31 public class PimInterfacesListCommand extends AbstractShellCommand {
32 32
33 private static final String FORMAT = "interfaceName=%s, holdTime=%s, priority=%s, genId=%s"; 33 private static final String FORMAT = "interfaceName=%s, holdTime=%s, priority=%s, genId=%s";
34 + private static final String ROUTE_FORMAT = " %s";
34 35
35 @Override 36 @Override
36 protected void execute() { 37 protected void execute() {
...@@ -38,10 +39,13 @@ public class PimInterfacesListCommand extends AbstractShellCommand { ...@@ -38,10 +39,13 @@ public class PimInterfacesListCommand extends AbstractShellCommand {
38 39
39 Set<PIMInterface> interfaces = interfaceService.getPimInterfaces(); 40 Set<PIMInterface> interfaces = interfaceService.getPimInterfaces();
40 41
41 - interfaces.forEach( 42 + interfaces.forEach(pimIntf -> {
42 - pimIntf -> print(FORMAT, pimIntf.getInterface().name(), 43 + print(FORMAT, pimIntf.getInterface().name(),
43 pimIntf.getHoldtime(), pimIntf.getPriority(), 44 pimIntf.getHoldtime(), pimIntf.getPriority(),
44 - pimIntf.getGenerationId())); 45 + pimIntf.getGenerationId());
46 +
47 + pimIntf.getRoutes().forEach(route -> print(ROUTE_FORMAT, route));
48 + });
45 } 49 }
46 50
47 } 51 }
......
...@@ -22,6 +22,7 @@ import org.onlab.packet.IpAddress; ...@@ -22,6 +22,7 @@ import org.onlab.packet.IpAddress;
22 import org.onlab.packet.IpPrefix; 22 import org.onlab.packet.IpPrefix;
23 import org.onlab.packet.MacAddress; 23 import org.onlab.packet.MacAddress;
24 import org.onlab.packet.PIM; 24 import org.onlab.packet.PIM;
25 +import org.onlab.packet.pim.PIMAddrUnicast;
25 import org.onlab.packet.pim.PIMHello; 26 import org.onlab.packet.pim.PIMHello;
26 import org.onlab.packet.pim.PIMHelloOption; 27 import org.onlab.packet.pim.PIMHelloOption;
27 import org.onlab.packet.pim.PIMJoinPrune; 28 import org.onlab.packet.pim.PIMJoinPrune;
...@@ -30,6 +31,7 @@ import org.onosproject.incubator.net.intf.Interface; ...@@ -30,6 +31,7 @@ import org.onosproject.incubator.net.intf.Interface;
30 import org.onosproject.net.flow.DefaultTrafficTreatment; 31 import org.onosproject.net.flow.DefaultTrafficTreatment;
31 import org.onosproject.net.flow.TrafficTreatment; 32 import org.onosproject.net.flow.TrafficTreatment;
32 import org.onosproject.net.host.InterfaceIpAddress; 33 import org.onosproject.net.host.InterfaceIpAddress;
34 +import org.onosproject.net.mcast.McastRoute;
33 import org.onosproject.net.packet.DefaultOutboundPacket; 35 import org.onosproject.net.packet.DefaultOutboundPacket;
34 import org.onosproject.net.packet.PacketService; 36 import org.onosproject.net.packet.PacketService;
35 import org.slf4j.Logger; 37 import org.slf4j.Logger;
...@@ -37,9 +39,11 @@ import org.slf4j.Logger; ...@@ -37,9 +39,11 @@ import org.slf4j.Logger;
37 import java.nio.ByteBuffer; 39 import java.nio.ByteBuffer;
38 import java.util.Collection; 40 import java.util.Collection;
39 import java.util.HashMap; 41 import java.util.HashMap;
42 +import java.util.List;
40 import java.util.Map; 43 import java.util.Map;
41 import java.util.Random; 44 import java.util.Random;
42 import java.util.Set; 45 import java.util.Set;
46 +import java.util.concurrent.ConcurrentHashMap;
43 import java.util.concurrent.TimeUnit; 47 import java.util.concurrent.TimeUnit;
44 import java.util.stream.Collectors; 48 import java.util.stream.Collectors;
45 49
...@@ -55,6 +59,9 @@ public final class PIMInterface { ...@@ -55,6 +59,9 @@ public final class PIMInterface {
55 59
56 private final Logger log = getLogger(getClass()); 60 private final Logger log = getLogger(getClass());
57 61
62 + private static final int JOIN_PERIOD = 60;
63 + private static final double HOLD_TIME_MULTIPLIER = 3.5;
64 +
58 private final PacketService packetService; 65 private final PacketService packetService;
59 66
60 private Interface onosInterface; 67 private Interface onosInterface;
...@@ -82,6 +89,8 @@ public final class PIMInterface { ...@@ -82,6 +89,8 @@ public final class PIMInterface {
82 // A map of all our PIM neighbors keyed on our neighbors IP address 89 // A map of all our PIM neighbors keyed on our neighbors IP address
83 private Map<IpAddress, PIMNeighbor> pimNeighbors = new HashMap<>(); 90 private Map<IpAddress, PIMNeighbor> pimNeighbors = new HashMap<>();
84 91
92 + private Map<McastRoute, RouteData> routes = new ConcurrentHashMap<>();
93 +
85 /** 94 /**
86 * Create a PIMInterface from an ONOS Interface. 95 * Create a PIMInterface from an ONOS Interface.
87 * 96 *
...@@ -151,8 +160,8 @@ public final class PIMInterface { ...@@ -151,8 +160,8 @@ public final class PIMInterface {
151 * 160 *
152 * @return a set of Ip Addresses on this interface 161 * @return a set of Ip Addresses on this interface
153 */ 162 */
154 - public Set<InterfaceIpAddress> getIpAddresses() { 163 + public List<InterfaceIpAddress> getIpAddresses() {
155 - return onosInterface.ipAddresses(); 164 + return onosInterface.ipAddressesList();
156 } 165 }
157 166
158 /** 167 /**
...@@ -161,12 +170,12 @@ public final class PIMInterface { ...@@ -161,12 +170,12 @@ public final class PIMInterface {
161 * @return the choosen IP address or null if none 170 * @return the choosen IP address or null if none
162 */ 171 */
163 public IpAddress getIpAddress() { 172 public IpAddress getIpAddress() {
164 - if (onosInterface.ipAddresses().isEmpty()) { 173 + if (onosInterface.ipAddressesList().isEmpty()) {
165 return null; 174 return null;
166 } 175 }
167 176
168 IpAddress ipaddr = null; 177 IpAddress ipaddr = null;
169 - for (InterfaceIpAddress ifipaddr : onosInterface.ipAddresses()) { 178 + for (InterfaceIpAddress ifipaddr : onosInterface.ipAddressesList()) {
170 ipaddr = ifipaddr.ipAddress(); 179 ipaddr = ifipaddr.ipAddress();
171 break; 180 break;
172 } 181 }
...@@ -218,6 +227,10 @@ public final class PIMInterface { ...@@ -218,6 +227,10 @@ public final class PIMInterface {
218 return pimNeighbors.values(); 227 return pimNeighbors.values();
219 } 228 }
220 229
230 + public Collection<McastRoute> getRoutes() {
231 + return routes.keySet();
232 + }
233 +
221 /** 234 /**
222 * Checks whether any of our neighbors have expired, and cleans up their 235 * Checks whether any of our neighbors have expired, and cleans up their
223 * state if they have. 236 * state if they have.
...@@ -402,6 +415,100 @@ public final class PIMInterface { ...@@ -402,6 +415,100 @@ public final class PIMInterface {
402 415
403 } 416 }
404 417
418 + public void addRoute(McastRoute route, IpAddress nextHop, MacAddress nextHopMac) {
419 + RouteData data = new RouteData(nextHop, nextHopMac);
420 + routes.put(route, data);
421 +
422 + sendJoinPrune(route, data, true);
423 + }
424 +
425 + public void removeRoute(McastRoute route) {
426 + RouteData data = routes.remove(route);
427 +
428 + if (data != null) {
429 + sendJoinPrune(route, data, false);
430 + }
431 + }
432 +
433 + public void sendJoins() {
434 + routes.entrySet().forEach(entry -> {
435 + if (entry.getValue().timestamp + TimeUnit.SECONDS.toMillis(JOIN_PERIOD) >
436 + System.currentTimeMillis()) {
437 + return;
438 + }
439 +
440 + sendJoinPrune(entry.getKey(), entry.getValue(), true);
441 + });
442 + }
443 +
444 + private void sendJoinPrune(McastRoute route, RouteData data, boolean join) {
445 + PIMJoinPrune jp = new PIMJoinPrune();
446 +
447 + jp.addJoinPrune(route.source().toIpPrefix(), route.group().toIpPrefix(), join);
448 + jp.setHoldTime(join ? (short) Math.floor(JOIN_PERIOD * HOLD_TIME_MULTIPLIER) : 0);
449 + jp.setUpstreamAddr(new PIMAddrUnicast(data.ipAddress.toString()));
450 +
451 + PIM pim = new PIM();
452 + pim.setPIMType(PIM.TYPE_JOIN_PRUNE_REQUEST);
453 + pim.setPayload(jp);
454 +
455 + IPv4 ipv4 = new IPv4();
456 + ipv4.setDestinationAddress(PIM.PIM_ADDRESS.getIp4Address().toInt());
457 + ipv4.setSourceAddress(getIpAddress().getIp4Address().toInt());
458 + ipv4.setProtocol(IPv4.PROTOCOL_PIM);
459 + ipv4.setTtl((byte) 1);
460 + ipv4.setDiffServ((byte) 0xc0);
461 + ipv4.setPayload(pim);
462 +
463 + Ethernet eth = new Ethernet();
464 + eth.setSourceMACAddress(onosInterface.mac());
465 + eth.setDestinationMACAddress(MacAddress.valueOf("01:00:5E:00:00:0d"));
466 + eth.setEtherType(Ethernet.TYPE_IPV4);
467 + eth.setPayload(ipv4);
468 +
469 + TrafficTreatment treatment = DefaultTrafficTreatment.builder()
470 + .setOutput(onosInterface.connectPoint().port())
471 + .build();
472 +
473 + packetService.emit(new DefaultOutboundPacket(onosInterface.connectPoint().deviceId(),
474 + treatment, ByteBuffer.wrap(eth.serialize())));
475 +
476 + data.timestamp = System.currentTimeMillis();
477 + }
478 +
479 + /*private void sendPrune(McastRoute route, RouteData data) {
480 + PIMJoinPrune jp = new PIMJoinPrune();
481 +
482 + jp.addJoinPrune(route.source().toIpPrefix(), route.group().toIpPrefix(), false);
483 + jp.setHoldTime((short) 0);
484 + jp.setUpstreamAddr(new PIMAddrUnicast(data.ipAddress.toString()));
485 +
486 + PIM pim = new PIM();
487 + pim.setPIMType(PIM.TYPE_JOIN_PRUNE_REQUEST);
488 + pim.setPayload(jp);
489 +
490 + IPv4 ipv4 = new IPv4();
491 + ipv4.setDestinationAddress(PIM.PIM_ADDRESS.getIp4Address().toInt());
492 + ipv4.setSourceAddress(getIpAddress().getIp4Address().toInt());
493 + ipv4.setProtocol(IPv4.PROTOCOL_PIM);
494 + ipv4.setTtl((byte) 1);
495 + ipv4.setDiffServ((byte) 0xc0);
496 + ipv4.setPayload(pim);
497 +
498 + Ethernet eth = new Ethernet();
499 + eth.setSourceMACAddress(onosInterface.mac());
500 + eth.setDestinationMACAddress(MacAddress.valueOf("01:00:5E:00:00:0d"));
501 + eth.setEtherType(Ethernet.TYPE_IPV4);
502 + eth.setPayload(ipv4);
503 +
504 + TrafficTreatment treatment = DefaultTrafficTreatment.builder()
505 + .setOutput(onosInterface.connectPoint().port())
506 + .build();
507 +
508 + packetService.emit(new DefaultOutboundPacket(onosInterface.connectPoint().deviceId(),
509 + treatment, ByteBuffer.wrap(eth.serialize())));
510 + }*/
511 +
405 /** 512 /**
406 * Returns a builder for a PIM interface. 513 * Returns a builder for a PIM interface.
407 * 514 *
...@@ -514,4 +621,16 @@ public final class PIMInterface { ...@@ -514,4 +621,16 @@ public final class PIMInterface {
514 } 621 }
515 622
516 } 623 }
624 +
625 + private static class RouteData {
626 + public final IpAddress ipAddress;
627 + public final MacAddress macAddress;
628 + public long timestamp;
629 +
630 + public RouteData(IpAddress ip, MacAddress mac) {
631 + this.ipAddress = ip;
632 + this.macAddress = mac;
633 + timestamp = System.currentTimeMillis();
634 + }
635 + }
517 } 636 }
......
...@@ -29,12 +29,22 @@ import org.onosproject.incubator.net.intf.InterfaceEvent; ...@@ -29,12 +29,22 @@ import org.onosproject.incubator.net.intf.InterfaceEvent;
29 import org.onosproject.incubator.net.intf.InterfaceListener; 29 import org.onosproject.incubator.net.intf.InterfaceListener;
30 import org.onosproject.incubator.net.intf.InterfaceService; 30 import org.onosproject.incubator.net.intf.InterfaceService;
31 import org.onosproject.net.ConnectPoint; 31 import org.onosproject.net.ConnectPoint;
32 +
33 +import org.onosproject.net.Host;
34 +
32 import org.onosproject.net.config.ConfigFactory; 35 import org.onosproject.net.config.ConfigFactory;
33 import org.onosproject.net.config.NetworkConfigEvent; 36 import org.onosproject.net.config.NetworkConfigEvent;
34 import org.onosproject.net.config.NetworkConfigListener; 37 import org.onosproject.net.config.NetworkConfigListener;
35 import org.onosproject.net.config.NetworkConfigRegistry; 38 import org.onosproject.net.config.NetworkConfigRegistry;
36 import org.onosproject.net.config.basics.SubjectFactories; 39 import org.onosproject.net.config.basics.SubjectFactories;
40 +import org.onosproject.net.host.HostService;
41 +import org.onosproject.net.mcast.McastEvent;
42 +import org.onosproject.net.mcast.McastListener;
43 +import org.onosproject.net.mcast.McastRoute;
44 +import org.onosproject.net.mcast.MulticastRouteService;
37 import org.onosproject.net.packet.PacketService; 45 import org.onosproject.net.packet.PacketService;
46 +import org.onosproject.routing.RouteEntry;
47 +import org.onosproject.routing.RoutingService;
38 import org.slf4j.Logger; 48 import org.slf4j.Logger;
39 49
40 import java.util.Map; 50 import java.util.Map;
...@@ -73,6 +83,8 @@ public class PIMInterfaceManager implements PIMInterfaceService { ...@@ -73,6 +83,8 @@ public class PIMInterfaceManager implements PIMInterfaceService {
73 83
74 private final int timeoutTaskPeriod = DEFAULT_TASK_PERIOD_MS; 84 private final int timeoutTaskPeriod = DEFAULT_TASK_PERIOD_MS;
75 85
86 + private final int joinTaskPeriod = 10000;
87 +
76 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 88 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
77 protected PacketService packetService; 89 protected PacketService packetService;
78 90
...@@ -82,13 +94,26 @@ public class PIMInterfaceManager implements PIMInterfaceService { ...@@ -82,13 +94,26 @@ public class PIMInterfaceManager implements PIMInterfaceService {
82 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 94 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
83 protected InterfaceService interfaceService; 95 protected InterfaceService interfaceService;
84 96
97 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
98 + protected HostService hostService;
99 +
100 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
101 + protected MulticastRouteService multicastRouteService;
102 +
103 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
104 + protected RoutingService unicastRoutingService;
105 +
85 // Store PIM Interfaces in a map key'd by ConnectPoint 106 // Store PIM Interfaces in a map key'd by ConnectPoint
86 private final Map<ConnectPoint, PIMInterface> pimInterfaces = Maps.newConcurrentMap(); 107 private final Map<ConnectPoint, PIMInterface> pimInterfaces = Maps.newConcurrentMap();
87 108
109 + private final Map<McastRoute, PIMInterface> routes = Maps.newConcurrentMap();
110 +
88 private final InternalNetworkConfigListener configListener = 111 private final InternalNetworkConfigListener configListener =
89 new InternalNetworkConfigListener(); 112 new InternalNetworkConfigListener();
90 private final InternalInterfaceListener interfaceListener = 113 private final InternalInterfaceListener interfaceListener =
91 new InternalInterfaceListener(); 114 new InternalInterfaceListener();
115 + private final InternalMulticastListener multicastListener =
116 + new InternalMulticastListener();
92 117
93 private final ConfigFactory<ConnectPoint, PimInterfaceConfig> pimConfigFactory 118 private final ConfigFactory<ConnectPoint, PimInterfaceConfig> pimConfigFactory
94 = new ConfigFactory<ConnectPoint, PimInterfaceConfig>( 119 = new ConfigFactory<ConnectPoint, PimInterfaceConfig>(
...@@ -115,6 +140,9 @@ public class PIMInterfaceManager implements PIMInterfaceService { ...@@ -115,6 +140,9 @@ public class PIMInterfaceManager implements PIMInterfaceService {
115 140
116 networkConfig.addListener(configListener); 141 networkConfig.addListener(configListener);
117 interfaceService.addListener(interfaceListener); 142 interfaceService.addListener(interfaceListener);
143 + multicastRouteService.addListener(multicastListener);
144 +
145 + multicastRouteService.getRoutes().forEach(this::addRoute);
118 146
119 // Schedule the periodic hello sender. 147 // Schedule the periodic hello sender.
120 scheduledExecutorService.scheduleAtFixedRate( 148 scheduledExecutorService.scheduleAtFixedRate(
...@@ -128,6 +156,11 @@ public class PIMInterfaceManager implements PIMInterfaceService { ...@@ -128,6 +156,11 @@ public class PIMInterfaceManager implements PIMInterfaceService {
128 () -> pimInterfaces.values().forEach(PIMInterface::checkNeighborTimeouts)), 156 () -> pimInterfaces.values().forEach(PIMInterface::checkNeighborTimeouts)),
129 0, timeoutTaskPeriod, TimeUnit.MILLISECONDS); 157 0, timeoutTaskPeriod, TimeUnit.MILLISECONDS);
130 158
159 + scheduledExecutorService.scheduleAtFixedRate(
160 + SafeRecurringTask.wrap(
161 + () -> pimInterfaces.values().forEach(PIMInterface::sendJoins)),
162 + 0, joinTaskPeriod, TimeUnit.MILLISECONDS);
163 +
131 log.info("Started"); 164 log.info("Started");
132 } 165 }
133 166
...@@ -135,6 +168,7 @@ public class PIMInterfaceManager implements PIMInterfaceService { ...@@ -135,6 +168,7 @@ public class PIMInterfaceManager implements PIMInterfaceService {
135 public void deactivate() { 168 public void deactivate() {
136 interfaceService.removeListener(interfaceListener); 169 interfaceService.removeListener(interfaceListener);
137 networkConfig.removeListener(configListener); 170 networkConfig.removeListener(configListener);
171 + multicastRouteService.removeListener(multicastListener);
138 networkConfig.unregisterConfigFactory(pimConfigFactory); 172 networkConfig.unregisterConfigFactory(pimConfigFactory);
139 173
140 // Shutdown the periodic hello task. 174 // Shutdown the periodic hello task.
...@@ -202,6 +236,65 @@ public class PIMInterfaceManager implements PIMInterfaceService { ...@@ -202,6 +236,65 @@ public class PIMInterfaceManager implements PIMInterfaceService {
202 return builder.build(); 236 return builder.build();
203 } 237 }
204 238
239 + private void addRoute(McastRoute route) {
240 + PIMInterface pimInterface = getSourceInterface(route);
241 +
242 + if (pimInterface == null) {
243 + return;
244 + }
245 +
246 + routes.put(route, pimInterface);
247 + }
248 +
249 + private void removeRoute(McastRoute route) {
250 + PIMInterface pimInterface = routes.remove(route);
251 +
252 + if (pimInterface == null) {
253 + return;
254 + }
255 +
256 + pimInterface.removeRoute(route);
257 + }
258 +
259 + private PIMInterface getSourceInterface(McastRoute route) {
260 + RouteEntry routeEntry = unicastRoutingService.getLongestMatchableRouteEntry(route.source());
261 +
262 + if (routeEntry == null) {
263 + log.warn("No route to source {}", route.source());
264 + return null;
265 + }
266 +
267 + Interface intf = interfaceService.getMatchingInterface(routeEntry.nextHop());
268 +
269 + if (intf == null) {
270 + log.warn("No interface with route to next hop {}", routeEntry.nextHop());
271 + return null;
272 + }
273 +
274 + PIMInterface pimInterface = pimInterfaces.get(intf.connectPoint());
275 +
276 + if (pimInterface == null) {
277 + log.warn("PIM is not enabled on interface {}", intf);
278 + return null;
279 + }
280 +
281 + Set<Host> hosts = hostService.getHostsByIp(routeEntry.nextHop());
282 + Host host = null;
283 + for (Host h : hosts) {
284 + if (h.vlan().equals(intf.vlan())) {
285 + host = h;
286 + }
287 + }
288 + if (host == null) {
289 + log.warn("Next hop host entry not found: {}", routeEntry.nextHop());
290 + return null;
291 + }
292 +
293 + pimInterface.addRoute(route, routeEntry.nextHop(), host.mac());
294 +
295 + return pimInterface;
296 + }
297 +
205 /** 298 /**
206 * Listener for network config events. 299 * Listener for network config events.
207 */ 300 */
...@@ -261,4 +354,26 @@ public class PIMInterfaceManager implements PIMInterfaceService { ...@@ -261,4 +354,26 @@ public class PIMInterfaceManager implements PIMInterfaceService {
261 } 354 }
262 } 355 }
263 } 356 }
357 +
358 + /**
359 + * Listener for multicast route events.
360 + */
361 + private class InternalMulticastListener implements McastListener {
362 + @Override
363 + public void event(McastEvent event) {
364 + switch (event.type()) {
365 + case ROUTE_ADDED:
366 + addRoute(event.subject().route());
367 + break;
368 + case ROUTE_REMOVED:
369 + removeRoute(event.subject().route());
370 + break;
371 + case SOURCE_ADDED:
372 + case SINK_ADDED:
373 + case SINK_REMOVED:
374 + default:
375 + break;
376 + }
377 + }
378 + }
264 } 379 }
......
...@@ -15,9 +15,9 @@ ...@@ -15,9 +15,9 @@
15 */ 15 */
16 package org.onosproject.routing.impl; 16 package org.onosproject.routing.impl;
17 17
18 +import com.google.common.collect.Lists;
18 import com.google.common.collect.Sets; 19 import com.google.common.collect.Sets;
19 import com.google.common.util.concurrent.MoreExecutors; 20 import com.google.common.util.concurrent.MoreExecutors;
20 -
21 import org.junit.Before; 21 import org.junit.Before;
22 import org.junit.Test; 22 import org.junit.Test;
23 import org.onlab.junit.TestUtils; 23 import org.onlab.junit.TestUtils;
...@@ -57,6 +57,7 @@ import org.onosproject.routing.RouteEntry; ...@@ -57,6 +57,7 @@ import org.onosproject.routing.RouteEntry;
57 57
58 import java.util.Collections; 58 import java.util.Collections;
59 import java.util.HashSet; 59 import java.util.HashSet;
60 +import java.util.List;
60 import java.util.Set; 61 import java.util.Set;
61 import java.util.concurrent.ExecutorService; 62 import java.util.concurrent.ExecutorService;
62 63
...@@ -124,7 +125,7 @@ public class IntentSynchronizerTest extends AbstractIntentTest { ...@@ -124,7 +125,7 @@ public class IntentSynchronizerTest extends AbstractIntentTest {
124 * Sets up InterfaceService. 125 * Sets up InterfaceService.
125 */ 126 */
126 private void setUpInterfaceService() { 127 private void setUpInterfaceService() {
127 - Set<InterfaceIpAddress> interfaceIpAddresses1 = Sets.newHashSet(); 128 + List<InterfaceIpAddress> interfaceIpAddresses1 = Lists.newArrayList();
128 interfaceIpAddresses1.add(new InterfaceIpAddress( 129 interfaceIpAddresses1.add(new InterfaceIpAddress(
129 IpAddress.valueOf("192.168.10.101"), 130 IpAddress.valueOf("192.168.10.101"),
130 IpPrefix.valueOf("192.168.10.0/24"))); 131 IpPrefix.valueOf("192.168.10.0/24")));
...@@ -133,7 +134,7 @@ public class IntentSynchronizerTest extends AbstractIntentTest { ...@@ -133,7 +134,7 @@ public class IntentSynchronizerTest extends AbstractIntentTest {
133 VlanId.NONE); 134 VlanId.NONE);
134 interfaces.add(sw1Eth1); 135 interfaces.add(sw1Eth1);
135 136
136 - Set<InterfaceIpAddress> interfaceIpAddresses2 = Sets.newHashSet(); 137 + List<InterfaceIpAddress> interfaceIpAddresses2 = Lists.newArrayList();
137 interfaceIpAddresses2.add( 138 interfaceIpAddresses2.add(
138 new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"), 139 new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"),
139 IpPrefix.valueOf("192.168.20.0/24"))); 140 IpPrefix.valueOf("192.168.20.0/24")));
...@@ -142,7 +143,7 @@ public class IntentSynchronizerTest extends AbstractIntentTest { ...@@ -142,7 +143,7 @@ public class IntentSynchronizerTest extends AbstractIntentTest {
142 VlanId.NONE); 143 VlanId.NONE);
143 interfaces.add(sw2Eth1); 144 interfaces.add(sw2Eth1);
144 145
145 - Set<InterfaceIpAddress> interfaceIpAddresses3 = Sets.newHashSet(); 146 + List<InterfaceIpAddress> interfaceIpAddresses3 = Lists.newArrayList();
146 interfaceIpAddresses3.add( 147 interfaceIpAddresses3.add(
147 new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"), 148 new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"),
148 IpPrefix.valueOf("192.168.30.0/24"))); 149 IpPrefix.valueOf("192.168.30.0/24")));
...@@ -155,7 +156,7 @@ public class IntentSynchronizerTest extends AbstractIntentTest { ...@@ -155,7 +156,7 @@ public class IntentSynchronizerTest extends AbstractIntentTest {
155 new InterfaceIpAddress(IpAddress.valueOf("192.168.40.101"), 156 new InterfaceIpAddress(IpAddress.valueOf("192.168.40.101"),
156 IpPrefix.valueOf("192.168.40.0/24")); 157 IpPrefix.valueOf("192.168.40.0/24"));
157 Interface sw4Eth1 = new Interface(SW4_ETH1, 158 Interface sw4Eth1 = new Interface(SW4_ETH1,
158 - Sets.newHashSet(interfaceIpAddress4), 159 + Lists.newArrayList(interfaceIpAddress4),
159 MacAddress.valueOf("00:00:00:00:00:04"), 160 MacAddress.valueOf("00:00:00:00:00:04"),
160 VlanId.vlanId((short) 1)); 161 VlanId.vlanId((short) 1));
161 162
......
...@@ -173,7 +173,7 @@ public class PeerConnectivityManagerTest extends AbstractIntentTest { ...@@ -173,7 +173,7 @@ public class PeerConnectivityManagerTest extends AbstractIntentTest {
173 new InterfaceIpAddress(IpAddress.valueOf("192.168.10.101"), 173 new InterfaceIpAddress(IpAddress.valueOf("192.168.10.101"),
174 IpPrefix.valueOf("192.168.10.0/24")); 174 IpPrefix.valueOf("192.168.10.0/24"));
175 Interface intfsw1eth1 = new Interface(s1Eth1, 175 Interface intfsw1eth1 = new Interface(s1Eth1,
176 - Collections.singleton(ia1), 176 + Collections.singletonList(ia1),
177 MacAddress.valueOf("00:00:00:00:00:01"), 177 MacAddress.valueOf("00:00:00:00:00:01"),
178 VlanId.NONE); 178 VlanId.NONE);
179 179
...@@ -183,7 +183,7 @@ public class PeerConnectivityManagerTest extends AbstractIntentTest { ...@@ -183,7 +183,7 @@ public class PeerConnectivityManagerTest extends AbstractIntentTest {
183 new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"), 183 new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"),
184 IpPrefix.valueOf("192.168.20.0/24")); 184 IpPrefix.valueOf("192.168.20.0/24"));
185 Interface intfsw2eth1 = new Interface(s2Eth1, 185 Interface intfsw2eth1 = new Interface(s2Eth1,
186 - Collections.singleton(ia2), 186 + Collections.singletonList(ia2),
187 MacAddress.valueOf("00:00:00:00:00:02"), 187 MacAddress.valueOf("00:00:00:00:00:02"),
188 VlanId.NONE); 188 VlanId.NONE);
189 configuredInterfaces.put(interfaceSw2Eth1, intfsw2eth1); 189 configuredInterfaces.put(interfaceSw2Eth1, intfsw2eth1);
...@@ -193,7 +193,7 @@ public class PeerConnectivityManagerTest extends AbstractIntentTest { ...@@ -193,7 +193,7 @@ public class PeerConnectivityManagerTest extends AbstractIntentTest {
193 new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"), 193 new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"),
194 IpPrefix.valueOf("192.168.30.0/24")); 194 IpPrefix.valueOf("192.168.30.0/24"));
195 Interface intfsw2eth1intf2 = new Interface(s2Eth1, 195 Interface intfsw2eth1intf2 = new Interface(s2Eth1,
196 - Collections.singleton(ia3), 196 + Collections.singletonList(ia3),
197 MacAddress.valueOf("00:00:00:00:00:03"), 197 MacAddress.valueOf("00:00:00:00:00:03"),
198 VlanId.NONE); 198 VlanId.NONE);
199 configuredInterfaces.put(interfaceSw2Eth1intf2, intfsw2eth1intf2); 199 configuredInterfaces.put(interfaceSw2Eth1intf2, intfsw2eth1intf2);
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.sdnip; 17 package org.onosproject.sdnip;
18 18
19 +import com.google.common.collect.Lists;
19 import com.google.common.collect.Sets; 20 import com.google.common.collect.Sets;
20 import org.junit.Before; 21 import org.junit.Before;
21 import org.junit.Test; 22 import org.junit.Test;
...@@ -53,6 +54,7 @@ import org.onosproject.routing.config.RoutingConfigurationService; ...@@ -53,6 +54,7 @@ import org.onosproject.routing.config.RoutingConfigurationService;
53 import java.util.Collections; 54 import java.util.Collections;
54 import java.util.HashMap; 55 import java.util.HashMap;
55 import java.util.HashSet; 56 import java.util.HashSet;
57 +import java.util.List;
56 import java.util.Map; 58 import java.util.Map;
57 import java.util.Set; 59 import java.util.Set;
58 60
...@@ -151,7 +153,7 @@ public class SdnIpFibTest extends AbstractIntentTest { ...@@ -151,7 +153,7 @@ public class SdnIpFibTest extends AbstractIntentTest {
151 * Sets up InterfaceService. 153 * Sets up InterfaceService.
152 */ 154 */
153 private void setUpInterfaceService() { 155 private void setUpInterfaceService() {
154 - Set<InterfaceIpAddress> interfaceIpAddresses1 = Sets.newHashSet(); 156 + List<InterfaceIpAddress> interfaceIpAddresses1 = Lists.newArrayList();
155 interfaceIpAddresses1.add(new InterfaceIpAddress( 157 interfaceIpAddresses1.add(new InterfaceIpAddress(
156 IpAddress.valueOf("192.168.10.101"), 158 IpAddress.valueOf("192.168.10.101"),
157 IpPrefix.valueOf("192.168.10.0/24"))); 159 IpPrefix.valueOf("192.168.10.0/24")));
...@@ -160,7 +162,7 @@ public class SdnIpFibTest extends AbstractIntentTest { ...@@ -160,7 +162,7 @@ public class SdnIpFibTest extends AbstractIntentTest {
160 VlanId.NONE); 162 VlanId.NONE);
161 interfaces.add(sw1Eth1); 163 interfaces.add(sw1Eth1);
162 164
163 - Set<InterfaceIpAddress> interfaceIpAddresses2 = Sets.newHashSet(); 165 + List<InterfaceIpAddress> interfaceIpAddresses2 = Lists.newArrayList();
164 interfaceIpAddresses2.add( 166 interfaceIpAddresses2.add(
165 new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"), 167 new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"),
166 IpPrefix.valueOf("192.168.20.0/24"))); 168 IpPrefix.valueOf("192.168.20.0/24")));
...@@ -169,7 +171,7 @@ public class SdnIpFibTest extends AbstractIntentTest { ...@@ -169,7 +171,7 @@ public class SdnIpFibTest extends AbstractIntentTest {
169 VlanId.NONE); 171 VlanId.NONE);
170 interfaces.add(sw2Eth1); 172 interfaces.add(sw2Eth1);
171 173
172 - Set<InterfaceIpAddress> interfaceIpAddresses3 = Sets.newHashSet(); 174 + List<InterfaceIpAddress> interfaceIpAddresses3 = Lists.newArrayList();
173 interfaceIpAddresses3.add( 175 interfaceIpAddresses3.add(
174 new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"), 176 new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"),
175 IpPrefix.valueOf("192.168.30.0/24"))); 177 IpPrefix.valueOf("192.168.30.0/24")));
...@@ -182,7 +184,7 @@ public class SdnIpFibTest extends AbstractIntentTest { ...@@ -182,7 +184,7 @@ public class SdnIpFibTest extends AbstractIntentTest {
182 new InterfaceIpAddress(IpAddress.valueOf("192.168.40.101"), 184 new InterfaceIpAddress(IpAddress.valueOf("192.168.40.101"),
183 IpPrefix.valueOf("192.168.40.0/24")); 185 IpPrefix.valueOf("192.168.40.0/24"));
184 Interface sw4Eth1 = new Interface(SW4_ETH1, 186 Interface sw4Eth1 = new Interface(SW4_ETH1,
185 - Sets.newHashSet(interfaceIpAddress4), 187 + Lists.newArrayList(interfaceIpAddress4),
186 MacAddress.valueOf("00:00:00:00:00:04"), 188 MacAddress.valueOf("00:00:00:00:00:04"),
187 VlanId.vlanId((short) 1)); 189 VlanId.vlanId((short) 1));
188 190
......
...@@ -137,7 +137,7 @@ public class DeviceConfiguration implements DeviceProperties { ...@@ -137,7 +137,7 @@ public class DeviceConfiguration implements DeviceProperties {
137 // skip if there is no corresponding device for this ConenctPoint 137 // skip if there is no corresponding device for this ConenctPoint
138 if (info != null) { 138 if (info != null) {
139 // Extract subnet information 139 // Extract subnet information
140 - Set<InterfaceIpAddress> interfaceAddresses = networkInterface.ipAddresses(); 140 + List<InterfaceIpAddress> interfaceAddresses = networkInterface.ipAddressesList();
141 interfaceAddresses.forEach(interfaceAddress -> { 141 interfaceAddresses.forEach(interfaceAddress -> {
142 // Do not add /0 and /32 to gateway IP list 142 // Do not add /0 and /32 to gateway IP list
143 int prefixLength = interfaceAddress.subnetAddress().prefixLength(); 143 int prefixLength = interfaceAddress.subnetAddress().prefixLength();
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
16 16
17 package org.onosproject.cli.net; 17 package org.onosproject.cli.net;
18 18
19 -import com.google.common.collect.Sets; 19 +import com.google.common.collect.Lists;
20 import org.apache.karaf.shell.commands.Argument; 20 import org.apache.karaf.shell.commands.Argument;
21 import org.apache.karaf.shell.commands.Command; 21 import org.apache.karaf.shell.commands.Command;
22 import org.apache.karaf.shell.commands.Option; 22 import org.apache.karaf.shell.commands.Option;
...@@ -28,7 +28,7 @@ import org.onosproject.incubator.net.intf.InterfaceAdminService; ...@@ -28,7 +28,7 @@ import org.onosproject.incubator.net.intf.InterfaceAdminService;
28 import org.onosproject.net.ConnectPoint; 28 import org.onosproject.net.ConnectPoint;
29 import org.onosproject.net.host.InterfaceIpAddress; 29 import org.onosproject.net.host.InterfaceIpAddress;
30 30
31 -import java.util.Set; 31 +import java.util.List;
32 32
33 /** 33 /**
34 * Adds a new interface configuration. 34 * Adds a new interface configuration.
...@@ -66,7 +66,7 @@ public class InterfaceAddCommand extends AbstractShellCommand { ...@@ -66,7 +66,7 @@ public class InterfaceAddCommand extends AbstractShellCommand {
66 protected void execute() { 66 protected void execute() {
67 InterfaceAdminService interfaceService = get(InterfaceAdminService.class); 67 InterfaceAdminService interfaceService = get(InterfaceAdminService.class);
68 68
69 - Set<InterfaceIpAddress> ipAddresses = Sets.newHashSet(); 69 + List<InterfaceIpAddress> ipAddresses = Lists.newArrayList();
70 if (ips != null) { 70 if (ips != null) {
71 for (String strIp : ips) { 71 for (String strIp : ips) {
72 ipAddresses.add(InterfaceIpAddress.valueOf(strIp)); 72 ipAddresses.add(InterfaceIpAddress.valueOf(strIp));
......
...@@ -185,7 +185,7 @@ public class HostMonitorTest { ...@@ -185,7 +185,7 @@ public class HostMonitorTest {
185 185
186 InterfaceService interfaceService = createMock(InterfaceService.class); 186 InterfaceService interfaceService = createMock(InterfaceService.class);
187 expect(interfaceService.getMatchingInterface(TARGET_IPV4_ADDR)) 187 expect(interfaceService.getMatchingInterface(TARGET_IPV4_ADDR))
188 - .andReturn(new Interface(cp, Collections.singleton(IA1), sourceMac, VlanId.NONE)) 188 + .andReturn(new Interface(cp, Collections.singletonList(IA1), sourceMac, VlanId.NONE))
189 .anyTimes(); 189 .anyTimes();
190 replay(interfaceService); 190 replay(interfaceService);
191 191
...@@ -253,7 +253,7 @@ public class HostMonitorTest { ...@@ -253,7 +253,7 @@ public class HostMonitorTest {
253 253
254 InterfaceService interfaceService = createMock(InterfaceService.class); 254 InterfaceService interfaceService = createMock(InterfaceService.class);
255 expect(interfaceService.getMatchingInterface(TARGET_IPV6_ADDR)) 255 expect(interfaceService.getMatchingInterface(TARGET_IPV6_ADDR))
256 - .andReturn(new Interface(cp, Collections.singleton(IA2), sourceMac2, VlanId.NONE)) 256 + .andReturn(new Interface(cp, Collections.singletonList(IA2), sourceMac2, VlanId.NONE))
257 .anyTimes(); 257 .anyTimes();
258 replay(interfaceService); 258 replay(interfaceService);
259 259
...@@ -323,7 +323,7 @@ public class HostMonitorTest { ...@@ -323,7 +323,7 @@ public class HostMonitorTest {
323 323
324 InterfaceService interfaceService = createMock(InterfaceService.class); 324 InterfaceService interfaceService = createMock(InterfaceService.class);
325 expect(interfaceService.getMatchingInterface(TARGET_IPV4_ADDR)) 325 expect(interfaceService.getMatchingInterface(TARGET_IPV4_ADDR))
326 - .andReturn(new Interface(cp, Collections.singleton(IA1), sourceMac, VlanId.vlanId(vlan))) 326 + .andReturn(new Interface(cp, Collections.singletonList(IA1), sourceMac, VlanId.vlanId(vlan)))
327 .anyTimes(); 327 .anyTimes();
328 replay(interfaceService); 328 replay(interfaceService);
329 329
...@@ -392,7 +392,7 @@ public class HostMonitorTest { ...@@ -392,7 +392,7 @@ public class HostMonitorTest {
392 392
393 InterfaceService interfaceService = createMock(InterfaceService.class); 393 InterfaceService interfaceService = createMock(InterfaceService.class);
394 expect(interfaceService.getMatchingInterface(TARGET_IPV6_ADDR)) 394 expect(interfaceService.getMatchingInterface(TARGET_IPV6_ADDR))
395 - .andReturn(new Interface(cp, Collections.singleton(IA2), sourceMac2, VlanId.vlanId(vlan))) 395 + .andReturn(new Interface(cp, Collections.singletonList(IA2), sourceMac2, VlanId.vlanId(vlan)))
396 .anyTimes(); 396 .anyTimes();
397 replay(interfaceService); 397 replay(interfaceService);
398 398
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
15 */ 15 */
16 package org.onosproject.net.proxyarp.impl; 16 package org.onosproject.net.proxyarp.impl;
17 17
18 +import com.google.common.collect.Lists;
18 import com.google.common.collect.Sets; 19 import com.google.common.collect.Sets;
19 import org.junit.Before; 20 import org.junit.Before;
20 import org.junit.Test; 21 import org.junit.Test;
...@@ -295,10 +296,10 @@ public class ProxyArpManagerTest { ...@@ -295,10 +296,10 @@ public class ProxyArpManagerTest {
295 InterfaceIpAddress ia4 = new InterfaceIpAddress(addr4, prefix4); 296 InterfaceIpAddress ia4 = new InterfaceIpAddress(addr4, prefix4);
296 297
297 // Setting up interfaces 298 // Setting up interfaces
298 - Interface intf1 = new Interface(cp, Sets.newHashSet(ia1, ia3), 299 + Interface intf1 = new Interface(cp, Lists.newArrayList(ia1, ia3),
299 MacAddress.valueOf(2 * i - 1), 300 MacAddress.valueOf(2 * i - 1),
300 VlanId.vlanId((short) 1)); 301 VlanId.vlanId((short) 1));
301 - Interface intf2 = new Interface(cp, Sets.newHashSet(ia2, ia4), 302 + Interface intf2 = new Interface(cp, Lists.newArrayList(ia2, ia4),
302 MacAddress.valueOf(2 * i), 303 MacAddress.valueOf(2 * i),
303 VlanId.NONE); 304 VlanId.NONE);
304 305
...@@ -312,7 +313,7 @@ public class ProxyArpManagerTest { ...@@ -312,7 +313,7 @@ public class ProxyArpManagerTest {
312 } 313 }
313 for (int i = LAST_CONF_DEVICE_INTF_VLAN_IP + 1; i <= LAST_CONF_DEVICE_INTF_VLAN; i++) { 314 for (int i = LAST_CONF_DEVICE_INTF_VLAN_IP + 1; i <= LAST_CONF_DEVICE_INTF_VLAN; i++) {
314 ConnectPoint cp = new ConnectPoint(getDeviceId(i), P1); 315 ConnectPoint cp = new ConnectPoint(getDeviceId(i), P1);
315 - Interface intf1 = new Interface(cp, null, 316 + Interface intf1 = new Interface(cp, Collections.emptyList(),
316 MacAddress.NONE, 317 MacAddress.NONE,
317 VlanId.vlanId((short) 1)); 318 VlanId.vlanId((short) 1));
318 319
...@@ -850,7 +851,7 @@ public class ProxyArpManagerTest { ...@@ -850,7 +851,7 @@ public class ProxyArpManagerTest {
850 expect(hostService.getHostsByIp(theirIp)).andReturn(Collections.emptySet()); 851 expect(hostService.getHostsByIp(theirIp)).andReturn(Collections.emptySet());
851 expect(interfaceService.getInterfacesByIp(ourIp)) 852 expect(interfaceService.getInterfacesByIp(ourIp))
852 .andReturn(Collections.singleton(new Interface(getLocation(1), 853 .andReturn(Collections.singleton(new Interface(getLocation(1),
853 - Collections.singleton(new InterfaceIpAddress(ourIp, IpPrefix.valueOf("10.0.1.1/24"))), 854 + Collections.singletonList(new InterfaceIpAddress(ourIp, IpPrefix.valueOf("10.0.1.1/24"))),
854 ourMac, VLAN1))); 855 ourMac, VLAN1)));
855 expect(hostService.getHost(HostId.hostId(ourMac, VLAN1))).andReturn(null); 856 expect(hostService.getHost(HostId.hostId(ourMac, VLAN1))).andReturn(null);
856 replay(hostService); 857 replay(hostService);
...@@ -883,7 +884,7 @@ public class ProxyArpManagerTest { ...@@ -883,7 +884,7 @@ public class ProxyArpManagerTest {
883 expect(hostService.getHostsByIp(theirIp)).andReturn(Collections.emptySet()); 884 expect(hostService.getHostsByIp(theirIp)).andReturn(Collections.emptySet());
884 expect(interfaceService.getInterfacesByIp(ourIp)) 885 expect(interfaceService.getInterfacesByIp(ourIp))
885 .andReturn(Collections.singleton(new Interface(getLocation(1), 886 .andReturn(Collections.singleton(new Interface(getLocation(1),
886 - Collections.singleton(new InterfaceIpAddress( 887 + Collections.singletonList(new InterfaceIpAddress(
887 ourIp, 888 ourIp,
888 IpPrefix.valueOf("1000::1/64"))), 889 IpPrefix.valueOf("1000::1/64"))),
889 ourMac, 890 ourMac,
......
...@@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.JsonNode; ...@@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.JsonNode;
20 import com.fasterxml.jackson.databind.node.ArrayNode; 20 import com.fasterxml.jackson.databind.node.ArrayNode;
21 import com.fasterxml.jackson.databind.node.ObjectNode; 21 import com.fasterxml.jackson.databind.node.ObjectNode;
22 import com.google.common.annotations.Beta; 22 import com.google.common.annotations.Beta;
23 +import com.google.common.collect.Lists;
23 import com.google.common.collect.Sets; 24 import com.google.common.collect.Sets;
24 import org.onlab.packet.MacAddress; 25 import org.onlab.packet.MacAddress;
25 import org.onlab.packet.VlanId; 26 import org.onlab.packet.VlanId;
...@@ -29,6 +30,7 @@ import org.onosproject.net.config.Config; ...@@ -29,6 +30,7 @@ import org.onosproject.net.config.Config;
29 import org.onosproject.net.host.InterfaceIpAddress; 30 import org.onosproject.net.host.InterfaceIpAddress;
30 31
31 import java.util.Iterator; 32 import java.util.Iterator;
33 +import java.util.List;
32 import java.util.Set; 34 import java.util.Set;
33 35
34 import static com.google.common.base.Preconditions.checkArgument; 36 import static com.google.common.base.Preconditions.checkArgument;
...@@ -61,7 +63,7 @@ public class InterfaceConfig extends Config<ConnectPoint> { ...@@ -61,7 +63,7 @@ public class InterfaceConfig extends Config<ConnectPoint> {
61 for (JsonNode intfNode : array) { 63 for (JsonNode intfNode : array) {
62 String name = intfNode.path(NAME).asText(null); 64 String name = intfNode.path(NAME).asText(null);
63 65
64 - Set<InterfaceIpAddress> ips = getIps(intfNode); 66 + List<InterfaceIpAddress> ips = getIps(intfNode);
65 67
66 String mac = intfNode.path(MAC).asText(); 68 String mac = intfNode.path(MAC).asText();
67 MacAddress macAddr = mac.isEmpty() ? null : MacAddress.valueOf(mac); 69 MacAddress macAddr = mac.isEmpty() ? null : MacAddress.valueOf(mac);
...@@ -98,7 +100,7 @@ public class InterfaceConfig extends Config<ConnectPoint> { ...@@ -98,7 +100,7 @@ public class InterfaceConfig extends Config<ConnectPoint> {
98 } 100 }
99 101
100 if (!intf.ipAddresses().isEmpty()) { 102 if (!intf.ipAddresses().isEmpty()) {
101 - intfNode.set(IPS, putIps(intf.ipAddresses())); 103 + intfNode.set(IPS, putIps(intf.ipAddressesList()));
102 } 104 }
103 105
104 if (!intf.vlan().equals(VlanId.NONE)) { 106 if (!intf.vlan().equals(VlanId.NONE)) {
...@@ -133,8 +135,8 @@ public class InterfaceConfig extends Config<ConnectPoint> { ...@@ -133,8 +135,8 @@ public class InterfaceConfig extends Config<ConnectPoint> {
133 return vlan; 135 return vlan;
134 } 136 }
135 137
136 - private Set<InterfaceIpAddress> getIps(JsonNode node) { 138 + private List<InterfaceIpAddress> getIps(JsonNode node) {
137 - Set<InterfaceIpAddress> ips = Sets.newHashSet(); 139 + List<InterfaceIpAddress> ips = Lists.newArrayList();
138 140
139 JsonNode ipsNode = node.get(IPS); 141 JsonNode ipsNode = node.get(IPS);
140 if (ipsNode != null) { 142 if (ipsNode != null) {
...@@ -145,7 +147,7 @@ public class InterfaceConfig extends Config<ConnectPoint> { ...@@ -145,7 +147,7 @@ public class InterfaceConfig extends Config<ConnectPoint> {
145 return ips; 147 return ips;
146 } 148 }
147 149
148 - private ArrayNode putIps(Set<InterfaceIpAddress> intfIpAddresses) { 150 + private ArrayNode putIps(List<InterfaceIpAddress> intfIpAddresses) {
149 ArrayNode ipArray = mapper.createArrayNode(); 151 ArrayNode ipArray = mapper.createArrayNode();
150 152
151 intfIpAddresses.forEach(i -> ipArray.add(i.toString())); 153 intfIpAddresses.forEach(i -> ipArray.add(i.toString()));
......
...@@ -17,14 +17,16 @@ package org.onosproject.incubator.net.intf; ...@@ -17,14 +17,16 @@ package org.onosproject.incubator.net.intf;
17 17
18 import com.google.common.annotations.Beta; 18 import com.google.common.annotations.Beta;
19 import com.google.common.base.MoreObjects; 19 import com.google.common.base.MoreObjects;
20 -import com.google.common.collect.Sets; 20 +import com.google.common.collect.Lists;
21 import org.onlab.packet.MacAddress; 21 import org.onlab.packet.MacAddress;
22 import org.onlab.packet.VlanId; 22 import org.onlab.packet.VlanId;
23 import org.onosproject.net.ConnectPoint; 23 import org.onosproject.net.ConnectPoint;
24 import org.onosproject.net.host.InterfaceIpAddress; 24 import org.onosproject.net.host.InterfaceIpAddress;
25 25
26 +import java.util.List;
26 import java.util.Objects; 27 import java.util.Objects;
27 import java.util.Set; 28 import java.util.Set;
29 +import java.util.stream.Collectors;
28 30
29 import static com.google.common.base.Preconditions.checkNotNull; 31 import static com.google.common.base.Preconditions.checkNotNull;
30 32
...@@ -38,7 +40,7 @@ public class Interface { ...@@ -38,7 +40,7 @@ public class Interface {
38 40
39 private final String name; 41 private final String name;
40 private final ConnectPoint connectPoint; 42 private final ConnectPoint connectPoint;
41 - private final Set<InterfaceIpAddress> ipAddresses; 43 + private final List<InterfaceIpAddress> ipAddresses;
42 private final MacAddress macAddress; 44 private final MacAddress macAddress;
43 private final VlanId vlan; 45 private final VlanId vlan;
44 46
...@@ -47,16 +49,38 @@ public class Interface { ...@@ -47,16 +49,38 @@ public class Interface {
47 * 49 *
48 * @param name name of the interface 50 * @param name name of the interface
49 * @param connectPoint the connect point this interface maps to 51 * @param connectPoint the connect point this interface maps to
50 - * @param ipAddresses Set of IP addresses 52 + * @param ipAddresses list of IP addresses
53 + * @param macAddress MAC address
54 + * @param vlan VLAN ID
55 + */
56 + public Interface(String name, ConnectPoint connectPoint,
57 + List<InterfaceIpAddress> ipAddresses,
58 + MacAddress macAddress, VlanId vlan) {
59 + this.name = name == null ? NO_INTERFACE_NAME : name;
60 + this.connectPoint = checkNotNull(connectPoint);
61 + this.ipAddresses = ipAddresses == null ? Lists.newArrayList() : ipAddresses;
62 + this.macAddress = macAddress == null ? MacAddress.NONE : macAddress;
63 + this.vlan = vlan == null ? VlanId.NONE : vlan;
64 + }
65 +
66 + /**
67 + * Creates new Interface with the provided configuration.
68 + *
69 + * @param name name of the interface
70 + * @param connectPoint the connect point this interface maps to
71 + * @param ipAddresses set of IP addresses
51 * @param macAddress MAC address 72 * @param macAddress MAC address
52 * @param vlan VLAN ID 73 * @param vlan VLAN ID
74 + * @deprecated in Falcon release, in favour of ordered list
53 */ 75 */
76 + @Deprecated
54 public Interface(String name, ConnectPoint connectPoint, 77 public Interface(String name, ConnectPoint connectPoint,
55 Set<InterfaceIpAddress> ipAddresses, 78 Set<InterfaceIpAddress> ipAddresses,
56 MacAddress macAddress, VlanId vlan) { 79 MacAddress macAddress, VlanId vlan) {
57 this.name = name == null ? NO_INTERFACE_NAME : name; 80 this.name = name == null ? NO_INTERFACE_NAME : name;
58 this.connectPoint = checkNotNull(connectPoint); 81 this.connectPoint = checkNotNull(connectPoint);
59 - this.ipAddresses = ipAddresses == null ? Sets.newHashSet() : ipAddresses; 82 + this.ipAddresses = ipAddresses == null ? Lists.newArrayList() :
83 + ipAddresses.stream().collect(Collectors.toList());
60 this.macAddress = macAddress == null ? MacAddress.NONE : macAddress; 84 this.macAddress = macAddress == null ? MacAddress.NONE : macAddress;
61 this.vlan = vlan == null ? VlanId.NONE : vlan; 85 this.vlan = vlan == null ? VlanId.NONE : vlan;
62 } 86 }
...@@ -68,7 +92,9 @@ public class Interface { ...@@ -68,7 +92,9 @@ public class Interface {
68 * @param ipAddresses Set of IP addresses 92 * @param ipAddresses Set of IP addresses
69 * @param macAddress MAC address 93 * @param macAddress MAC address
70 * @param vlan VLAN ID 94 * @param vlan VLAN ID
95 + * @deprecated in Falcon release - use constructors with names instead
71 */ 96 */
97 + @Deprecated
72 public Interface(ConnectPoint connectPoint, 98 public Interface(ConnectPoint connectPoint,
73 Set<InterfaceIpAddress> ipAddresses, 99 Set<InterfaceIpAddress> ipAddresses,
74 MacAddress macAddress, VlanId vlan) { 100 MacAddress macAddress, VlanId vlan) {
...@@ -76,6 +102,22 @@ public class Interface { ...@@ -76,6 +102,22 @@ public class Interface {
76 } 102 }
77 103
78 /** 104 /**
105 + * Creates new Interface with the provided configuration.
106 + *
107 + * @param connectPoint the connect point this interface maps to
108 + * @param ipAddresses Set of IP addresses
109 + * @param macAddress MAC address
110 + * @param vlan VLAN ID
111 + * @deprecated in Falcon release - use constructors with names instead
112 + */
113 + @Deprecated
114 + public Interface(ConnectPoint connectPoint,
115 + List<InterfaceIpAddress> ipAddresses,
116 + MacAddress macAddress, VlanId vlan) {
117 + this(NO_INTERFACE_NAME, connectPoint, ipAddresses, macAddress, vlan);
118 + }
119 +
120 + /**
79 * Retrieves the name of the interface. 121 * Retrieves the name of the interface.
80 * 122 *
81 * @return name 123 * @return name
...@@ -97,8 +139,20 @@ public class Interface { ...@@ -97,8 +139,20 @@ public class Interface {
97 * Retrieves the set of IP addresses that are assigned to the interface. 139 * Retrieves the set of IP addresses that are assigned to the interface.
98 * 140 *
99 * @return the set of interface IP addresses 141 * @return the set of interface IP addresses
142 + * @deprecated in Falcon release in favour of an ordered list
100 */ 143 */
144 + @Deprecated
101 public Set<InterfaceIpAddress> ipAddresses() { 145 public Set<InterfaceIpAddress> ipAddresses() {
146 + return ipAddresses.stream().collect(Collectors.toSet());
147 + }
148 +
149 + /**
150 + * Retrieves a list of IP addresses that are assigned to the interface in
151 + * the order that they were configured.
152 + *
153 + * @return list of IP addresses
154 + */
155 + public List<InterfaceIpAddress> ipAddressesList() {
102 return ipAddresses; 156 return ipAddresses;
103 } 157 }
104 158
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.incubator.net.intf.impl; 17 package org.onosproject.incubator.net.intf.impl;
18 18
19 +import com.google.common.collect.Lists;
19 import com.google.common.collect.Maps; 20 import com.google.common.collect.Maps;
20 import com.google.common.collect.Sets; 21 import com.google.common.collect.Sets;
21 import org.junit.Before; 22 import org.junit.Before;
...@@ -35,6 +36,7 @@ import org.onosproject.net.config.NetworkConfigServiceAdapter; ...@@ -35,6 +36,7 @@ import org.onosproject.net.config.NetworkConfigServiceAdapter;
35 import org.onosproject.net.host.InterfaceIpAddress; 36 import org.onosproject.net.host.InterfaceIpAddress;
36 37
37 import java.util.Collections; 38 import java.util.Collections;
39 +import java.util.List;
38 import java.util.Map; 40 import java.util.Map;
39 import java.util.Set; 41 import java.util.Set;
40 42
...@@ -87,7 +89,7 @@ public class InterfaceManagerTest { ...@@ -87,7 +89,7 @@ public class InterfaceManagerTest {
87 InterfaceIpAddress ia = InterfaceIpAddress.valueOf("192.168." + i + ".1/24"); 89 InterfaceIpAddress ia = InterfaceIpAddress.valueOf("192.168." + i + ".1/24");
88 90
89 Interface intf = new Interface(cp, 91 Interface intf = new Interface(cp,
90 - Sets.newHashSet(ia), 92 + Collections.singletonList(ia),
91 MacAddress.valueOf(i), 93 MacAddress.valueOf(i),
92 VlanId.vlanId((short) i)); 94 VlanId.vlanId((short) i));
93 95
...@@ -150,7 +152,7 @@ public class InterfaceManagerTest { ...@@ -150,7 +152,7 @@ public class InterfaceManagerTest {
150 VlanId vlanId = VlanId.vlanId((short) 1); 152 VlanId vlanId = VlanId.vlanId((short) 1);
151 ConnectPoint cp = ConnectPoint.deviceConnectPoint("of:0000000000000001/2"); 153 ConnectPoint cp = ConnectPoint.deviceConnectPoint("of:0000000000000001/2");
152 Interface newIntf = new Interface(cp, 154 Interface newIntf = new Interface(cp,
153 - Collections.emptySet(), 155 + Collections.emptyList(),
154 MacAddress.valueOf(100), 156 MacAddress.valueOf(100),
155 vlanId); 157 vlanId);
156 158
...@@ -184,14 +186,14 @@ public class InterfaceManagerTest { ...@@ -184,14 +186,14 @@ public class InterfaceManagerTest {
184 // Create an interface that is the same as the existing one, but adds a 186 // Create an interface that is the same as the existing one, but adds a
185 // new IP address 187 // new IP address
186 Interface intf = createInterface(1); 188 Interface intf = createInterface(1);
187 - Set<InterfaceIpAddress> addresses = Sets.newHashSet(intf.ipAddresses()); 189 + List<InterfaceIpAddress> addresses = Lists.newArrayList(intf.ipAddresses());
188 addresses.add(InterfaceIpAddress.valueOf("192.168.100.1/24")); 190 addresses.add(InterfaceIpAddress.valueOf("192.168.100.1/24"));
189 intf = new Interface(intf.connectPoint(), addresses, intf.mac(), intf.vlan()); 191 intf = new Interface(intf.connectPoint(), addresses, intf.mac(), intf.vlan());
190 192
191 // Create a new interface on the same connect point as the existing one 193 // Create a new interface on the same connect point as the existing one
192 InterfaceIpAddress newAddr = InterfaceIpAddress.valueOf("192.168.101.1/24"); 194 InterfaceIpAddress newAddr = InterfaceIpAddress.valueOf("192.168.101.1/24");
193 Interface newIntf = new Interface(cp, 195 Interface newIntf = new Interface(cp,
194 - Collections.singleton(newAddr), 196 + Collections.singletonList(newAddr),
195 MacAddress.valueOf(101), 197 MacAddress.valueOf(101),
196 VlanId.vlanId((short) 101)); 198 VlanId.vlanId((short) 101));
197 199
......