Implemented getMatchingInterface and added unit tests for
HostToInterfaceAdaptor. Change-Id: Ibb56902e13f26dbd619d1ef87e283e8e4c5317db
Showing
3 changed files
with
191 additions
and
6 deletions
... | @@ -4,19 +4,17 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -4,19 +4,17 @@ import static com.google.common.base.Preconditions.checkNotNull; |
4 | 4 | ||
5 | import java.util.Set; | 5 | import java.util.Set; |
6 | 6 | ||
7 | -import org.apache.commons.lang.NotImplementedException; | ||
8 | import org.onlab.onos.net.ConnectPoint; | 7 | import org.onlab.onos.net.ConnectPoint; |
9 | import org.onlab.onos.net.host.HostService; | 8 | import org.onlab.onos.net.host.HostService; |
10 | import org.onlab.onos.net.host.PortAddresses; | 9 | import org.onlab.onos.net.host.PortAddresses; |
11 | import org.onlab.onos.sdnip.config.Interface; | 10 | import org.onlab.onos.sdnip.config.Interface; |
12 | import org.onlab.packet.IpAddress; | 11 | import org.onlab.packet.IpAddress; |
12 | +import org.onlab.packet.IpPrefix; | ||
13 | 13 | ||
14 | import com.google.common.collect.Sets; | 14 | import com.google.common.collect.Sets; |
15 | 15 | ||
16 | - | ||
17 | - | ||
18 | /** | 16 | /** |
19 | - * Provides IntefaceService using PortAddresses data from the HostService. | 17 | + * Provides InterfaceService using PortAddresses data from the HostService. |
20 | */ | 18 | */ |
21 | public class HostToInterfaceAdaptor implements InterfaceService { | 19 | public class HostToInterfaceAdaptor implements InterfaceService { |
22 | 20 | ||
... | @@ -52,8 +50,17 @@ public class HostToInterfaceAdaptor implements InterfaceService { | ... | @@ -52,8 +50,17 @@ public class HostToInterfaceAdaptor implements InterfaceService { |
52 | 50 | ||
53 | @Override | 51 | @Override |
54 | public Interface getMatchingInterface(IpAddress ipAddress) { | 52 | public Interface getMatchingInterface(IpAddress ipAddress) { |
55 | - // TODO implement | 53 | + checkNotNull(ipAddress); |
56 | - throw new NotImplementedException("getMatchingInteface is not yet implemented"); | 54 | + |
55 | + for (PortAddresses portAddresses : hostService.getAddressBindings()) { | ||
56 | + for (IpPrefix p : portAddresses.ips()) { | ||
57 | + if (p.contains(ipAddress)) { | ||
58 | + return new Interface(portAddresses); | ||
59 | + } | ||
60 | + } | ||
61 | + } | ||
62 | + | ||
63 | + return null; | ||
57 | } | 64 | } |
58 | 65 | ||
59 | } | 66 | } | ... | ... |
... | @@ -64,6 +64,7 @@ public class SdnIp implements SdnIpService { | ... | @@ -64,6 +64,7 @@ public class SdnIp implements SdnIpService { |
64 | bgpSessionManager.startUp(2000); // TODO | 64 | bgpSessionManager.startUp(2000); // TODO |
65 | 65 | ||
66 | // TODO need to disable link discovery on external ports | 66 | // TODO need to disable link discovery on external ports |
67 | + | ||
67 | } | 68 | } |
68 | 69 | ||
69 | @Deactivate | 70 | @Deactivate | ... | ... |
1 | +package org.onlab.onos.sdnip; | ||
2 | + | ||
3 | +import static org.easymock.EasyMock.createMock; | ||
4 | +import static org.easymock.EasyMock.expect; | ||
5 | +import static org.easymock.EasyMock.replay; | ||
6 | +import static org.easymock.EasyMock.reset; | ||
7 | +import static org.junit.Assert.assertEquals; | ||
8 | +import static org.junit.Assert.assertNull; | ||
9 | +import static org.junit.Assert.assertTrue; | ||
10 | + | ||
11 | +import java.util.Map; | ||
12 | +import java.util.Set; | ||
13 | + | ||
14 | +import org.junit.Before; | ||
15 | +import org.junit.Test; | ||
16 | +import org.onlab.onos.net.ConnectPoint; | ||
17 | +import org.onlab.onos.net.DeviceId; | ||
18 | +import org.onlab.onos.net.PortNumber; | ||
19 | +import org.onlab.onos.net.host.HostService; | ||
20 | +import org.onlab.onos.net.host.PortAddresses; | ||
21 | +import org.onlab.onos.sdnip.config.Interface; | ||
22 | +import org.onlab.packet.IpAddress; | ||
23 | +import org.onlab.packet.IpPrefix; | ||
24 | +import org.onlab.packet.MacAddress; | ||
25 | + | ||
26 | +import com.google.common.collect.Maps; | ||
27 | +import com.google.common.collect.Sets; | ||
28 | + | ||
29 | +/** | ||
30 | + * Unit tests for the HostToInterfaceAdaptor class. | ||
31 | + */ | ||
32 | +public class HostToInterfaceAdaptorTest { | ||
33 | + | ||
34 | + private HostService hostService; | ||
35 | + private HostToInterfaceAdaptor adaptor; | ||
36 | + | ||
37 | + private Set<PortAddresses> portAddresses; | ||
38 | + private Map<ConnectPoint, Interface> interfaces; | ||
39 | + | ||
40 | + private static final ConnectPoint CP1 = new ConnectPoint( | ||
41 | + DeviceId.deviceId("of:1"), PortNumber.portNumber(1)); | ||
42 | + private static final ConnectPoint CP2 = new ConnectPoint( | ||
43 | + DeviceId.deviceId("of:1"), PortNumber.portNumber(2)); | ||
44 | + private static final ConnectPoint CP3 = new ConnectPoint( | ||
45 | + DeviceId.deviceId("of:2"), PortNumber.portNumber(1)); | ||
46 | + | ||
47 | + private static final ConnectPoint NON_EXISTENT_CP = new ConnectPoint( | ||
48 | + DeviceId.deviceId("doesnotexist"), PortNumber.portNumber(1)); | ||
49 | + | ||
50 | + private static final PortAddresses DEFAULT_PA = new PortAddresses( | ||
51 | + NON_EXISTENT_CP, null, null); | ||
52 | + | ||
53 | + | ||
54 | + @Before | ||
55 | + public void setUp() throws Exception { | ||
56 | + hostService = createMock(HostService.class); | ||
57 | + | ||
58 | + portAddresses = Sets.newHashSet(); | ||
59 | + interfaces = Maps.newHashMap(); | ||
60 | + | ||
61 | + createPortAddressesAndInterface(CP1, | ||
62 | + Sets.newHashSet(IpPrefix.valueOf("192.168.1.1/24")), | ||
63 | + MacAddress.valueOf("00:00:00:00:00:01")); | ||
64 | + | ||
65 | + // Two addresses in the same subnet | ||
66 | + createPortAddressesAndInterface(CP2, | ||
67 | + Sets.newHashSet(IpPrefix.valueOf("192.168.2.1/24"), | ||
68 | + IpPrefix.valueOf("192.168.2.2/24")), | ||
69 | + MacAddress.valueOf("00:00:00:00:00:02")); | ||
70 | + | ||
71 | + // Two addresses in different subnets | ||
72 | + createPortAddressesAndInterface(CP3, | ||
73 | + Sets.newHashSet(IpPrefix.valueOf("192.168.3.1/24"), | ||
74 | + IpPrefix.valueOf("192.168.4.1/24")), | ||
75 | + MacAddress.valueOf("00:00:00:00:00:03")); | ||
76 | + | ||
77 | + expect(hostService.getAddressBindings()).andReturn(portAddresses).anyTimes(); | ||
78 | + | ||
79 | + replay(hostService); | ||
80 | + | ||
81 | + adaptor = new HostToInterfaceAdaptor(hostService); | ||
82 | + } | ||
83 | + | ||
84 | + /** | ||
85 | + * Creates both a PortAddresses and an Interface for the given inputs and | ||
86 | + * places them in the correct global data stores. | ||
87 | + * | ||
88 | + * @param cp the connect point | ||
89 | + * @param ips the set of IP addresses | ||
90 | + * @param mac the MAC address | ||
91 | + */ | ||
92 | + private void createPortAddressesAndInterface( | ||
93 | + ConnectPoint cp, Set<IpPrefix> ips, MacAddress mac) { | ||
94 | + PortAddresses pa = new PortAddresses(cp, ips, mac); | ||
95 | + portAddresses.add(pa); | ||
96 | + expect(hostService.getAddressBindingsForPort(cp)).andReturn(pa).anyTimes(); | ||
97 | + | ||
98 | + Interface intf = new Interface(cp, ips, mac); | ||
99 | + interfaces.put(cp, intf); | ||
100 | + } | ||
101 | + | ||
102 | + /** | ||
103 | + * Tests {@link HostToInterfaceAdaptor#getInterfaces()}. | ||
104 | + * Verifies that the set of interfaces returned matches what is expected | ||
105 | + * based on the input PortAddresses data. | ||
106 | + */ | ||
107 | + @Test | ||
108 | + public void testGetInterfaces() { | ||
109 | + Set<Interface> adaptorIntfs = adaptor.getInterfaces(); | ||
110 | + | ||
111 | + assertEquals(3, adaptorIntfs.size()); | ||
112 | + assertTrue(adaptorIntfs.contains(this.interfaces.get(CP1))); | ||
113 | + assertTrue(adaptorIntfs.contains(this.interfaces.get(CP2))); | ||
114 | + assertTrue(adaptorIntfs.contains(this.interfaces.get(CP3))); | ||
115 | + } | ||
116 | + | ||
117 | + /** | ||
118 | + * Tests {@link HostToInterfaceAdaptor#getInterface(ConnectPoint)}. | ||
119 | + * Verifies that the correct interface is returned for a given connect | ||
120 | + * point. | ||
121 | + */ | ||
122 | + @Test | ||
123 | + public void testGetInterface() { | ||
124 | + assertEquals(this.interfaces.get(CP1), adaptor.getInterface(CP1)); | ||
125 | + assertEquals(this.interfaces.get(CP2), adaptor.getInterface(CP2)); | ||
126 | + assertEquals(this.interfaces.get(CP3), adaptor.getInterface(CP3)); | ||
127 | + | ||
128 | + // Try and get an interface for a connect point with no addresses | ||
129 | + reset(hostService); | ||
130 | + expect(hostService.getAddressBindingsForPort(NON_EXISTENT_CP)) | ||
131 | + .andReturn(DEFAULT_PA).anyTimes(); | ||
132 | + replay(hostService); | ||
133 | + | ||
134 | + assertNull(adaptor.getInterface(NON_EXISTENT_CP)); | ||
135 | + } | ||
136 | + | ||
137 | + /** | ||
138 | + * Tests {@link HostToInterfaceAdaptor#getInterface(ConnectPoint)} in the | ||
139 | + * case that the input connect point is null. | ||
140 | + * Verifies that a NullPointerException is thrown. | ||
141 | + */ | ||
142 | + @Test(expected = NullPointerException.class) | ||
143 | + public void testGetInterfaceNull() { | ||
144 | + adaptor.getInterface(null); | ||
145 | + } | ||
146 | + | ||
147 | + /** | ||
148 | + * Tests {@link HostToInterfaceAdaptor#getMatchingInterface(IpAddress)}. | ||
149 | + * Verifies that the correct interface is returned based on the given IP | ||
150 | + * address. | ||
151 | + */ | ||
152 | + @Test | ||
153 | + public void testGetMatchingInterface() { | ||
154 | + assertEquals(this.interfaces.get(CP1), | ||
155 | + adaptor.getMatchingInterface(IpAddress.valueOf("192.168.1.100"))); | ||
156 | + assertEquals(this.interfaces.get(CP2), | ||
157 | + adaptor.getMatchingInterface(IpAddress.valueOf("192.168.2.100"))); | ||
158 | + assertEquals(this.interfaces.get(CP3), | ||
159 | + adaptor.getMatchingInterface(IpAddress.valueOf("192.168.3.100"))); | ||
160 | + assertEquals(this.interfaces.get(CP3), | ||
161 | + adaptor.getMatchingInterface(IpAddress.valueOf("192.168.4.100"))); | ||
162 | + | ||
163 | + // Try and match an address we don't have subnet configured for | ||
164 | + assertNull(adaptor.getMatchingInterface(IpAddress.valueOf("1.1.1.1"))); | ||
165 | + } | ||
166 | + | ||
167 | + /** | ||
168 | + * Tests {@link HostToInterfaceAdaptor#getMatchingInterface(IpAddress)} in the | ||
169 | + * case that the input IP address is null. | ||
170 | + * Verifies that a NullPointerException is thrown. | ||
171 | + */ | ||
172 | + @Test(expected = NullPointerException.class) | ||
173 | + public void testGetMatchingInterfaceNull() { | ||
174 | + adaptor.getMatchingInterface(null); | ||
175 | + } | ||
176 | + | ||
177 | +} |
-
Please register or login to post a comment