blob: 32c6a30c58a1761dd7176e7f15d0dfd1766687ba [file] [log] [blame]
yoonseon5a51ef72016-10-26 14:50:09 -07001/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.incubator.net.virtual.impl.provider;
18
19import com.google.common.collect.ImmutableSet;
20import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.osgi.ServiceDirectory;
24import org.onlab.packet.Ethernet;
25import org.onlab.packet.IpAddress;
26import org.onlab.packet.MacAddress;
27import org.onlab.packet.VlanId;
28import org.onosproject.core.ApplicationId;
29import org.onosproject.core.CoreServiceAdapter;
30import org.onosproject.core.DefaultApplicationId;
31import org.onosproject.incubator.net.virtual.DefaultVirtualDevice;
32import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork;
33import org.onosproject.incubator.net.virtual.DefaultVirtualPort;
34import org.onosproject.incubator.net.virtual.NetworkId;
35import org.onosproject.incubator.net.virtual.TenantId;
36import org.onosproject.incubator.net.virtual.VirtualDevice;
37import org.onosproject.incubator.net.virtual.VirtualHost;
38import org.onosproject.incubator.net.virtual.VirtualLink;
39import org.onosproject.incubator.net.virtual.VirtualNetwork;
40import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
Yoonseon Han33821fb2017-02-24 13:40:44 +090041import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
yoonseon5a51ef72016-10-26 14:50:09 -070042import org.onosproject.incubator.net.virtual.VirtualPort;
yoonseon736a73b2017-01-26 14:27:48 -080043import org.onosproject.incubator.net.virtual.provider.AbstractVirtualProviderService;
yoonseon5a51ef72016-10-26 14:50:09 -070044import org.onosproject.incubator.net.virtual.provider.VirtualPacketProvider;
45import org.onosproject.incubator.net.virtual.provider.VirtualPacketProviderService;
46import org.onosproject.net.ConnectPoint;
47import org.onosproject.net.DefaultAnnotations;
48import org.onosproject.net.DefaultDevice;
49import org.onosproject.net.DefaultLink;
50import org.onosproject.net.DefaultPort;
51import org.onosproject.net.Device;
52import org.onosproject.net.DeviceId;
53import org.onosproject.net.HostId;
54import org.onosproject.net.HostLocation;
55import org.onosproject.net.Link;
56import org.onosproject.net.Port;
57import org.onosproject.net.PortNumber;
Yoonseon Hanc8089db2017-03-22 20:22:12 +090058import org.onosproject.net.flow.DefaultTrafficSelector;
yoonseon5a51ef72016-10-26 14:50:09 -070059import org.onosproject.net.flow.DefaultTrafficTreatment;
Yoonseon Hanc8089db2017-03-22 20:22:12 +090060import org.onosproject.net.flow.TrafficSelector;
yoonseon5a51ef72016-10-26 14:50:09 -070061import org.onosproject.net.flow.TrafficTreatment;
62import org.onosproject.net.flow.instructions.Instruction;
63import org.onosproject.net.flow.instructions.Instructions;
64import org.onosproject.net.packet.DefaultInboundPacket;
65import org.onosproject.net.packet.DefaultOutboundPacket;
66import org.onosproject.net.packet.DefaultPacketContext;
67import org.onosproject.net.packet.InboundPacket;
68import org.onosproject.net.packet.OutboundPacket;
69import org.onosproject.net.packet.PacketContext;
70import org.onosproject.net.packet.PacketProcessor;
71import org.onosproject.net.packet.PacketServiceAdapter;
72import org.onosproject.net.provider.ProviderId;
73
74import java.nio.ByteBuffer;
75import java.util.LinkedList;
76import java.util.List;
77import java.util.Set;
78
79import static org.junit.Assert.assertEquals;
80
81public class DefaultVirtualPacketProviderTest {
82 private static final String SRC_MAC_ADDR = "00:00:00:00:00:00";
83 private static final String DST_MAC_ADDR = "00:00:00:00:00:01";
84 private static final ProviderId PID = new ProviderId("of", "foo");
85
86 private static final DeviceId DID1 = DeviceId.deviceId("of:001");
87 private static final DeviceId DID2 = DeviceId.deviceId("of:002");
88 private static final PortNumber PORT_NUM1 = PortNumber.portNumber(1);
89 private static final PortNumber PORT_NUM2 = PortNumber.portNumber(2);
90 private static final PortNumber PORT_NUM3 = PortNumber.portNumber(3);
91 private static final PortNumber PORT_NUM4 = PortNumber.portNumber(4);
92
93 private static final DefaultAnnotations ANNOTATIONS =
94 DefaultAnnotations.builder().set("foo", "bar").build();
95
96 private static final Device DEV1 =
97 new DefaultDevice(PID, DID1, Device.Type.SWITCH, "", "", "", "", null);
98 private static final Device DEV2 =
99 new DefaultDevice(PID, DID2, Device.Type.SWITCH, "", "", "", "", null);
100 private static final Port PORT11 =
101 new DefaultPort(DEV1, PORT_NUM1, true, ANNOTATIONS);
102 private static final Port PORT12 =
103 new DefaultPort(DEV1, PORT_NUM2, true, ANNOTATIONS);
104 private static final Port PORT21 =
105 new DefaultPort(DEV2, PORT_NUM3, true, ANNOTATIONS);
106 private static final Port PORT22 =
107 new DefaultPort(DEV2, PORT_NUM4, true, ANNOTATIONS);
108
109 private static final ConnectPoint CP11 = new ConnectPoint(DID1, PORT_NUM1);
110 private static final ConnectPoint CP12 = new ConnectPoint(DID1, PORT_NUM2);
111 private static final ConnectPoint CP21 = new ConnectPoint(DID2, PORT_NUM3);
112 private static final ConnectPoint CP22 = new ConnectPoint(DID2, PORT_NUM4);
113 private static final Link LINK1 = DefaultLink.builder()
114 .src(CP12).dst(CP21).providerId(PID).type(Link.Type.DIRECT).build();
115
116 private static final TenantId TENANT_ID = TenantId.tenantId("1");
117 private static final NetworkId VNET_ID = NetworkId.networkId(1);
118 private static final DeviceId VDID = DeviceId.deviceId("of:100");
119
120 private static final PortNumber VPORT_NUM1 = PortNumber.portNumber(10);
121 private static final PortNumber VPORT_NUM2 = PortNumber.portNumber(11);
122
123 private static final VirtualNetwork VNET = new DefaultVirtualNetwork(
124 VNET_ID, TenantId.tenantId("t1"));
125 private static final VirtualDevice VDEV =
126 new DefaultVirtualDevice(VNET_ID, VDID);
127 private static final VirtualPort VPORT1 =
128 new DefaultVirtualPort(VNET_ID, VDEV, VPORT_NUM1, CP11);
129 private static final VirtualPort VPORT2 =
130 new DefaultVirtualPort(VNET_ID, VDEV, VPORT_NUM2, CP22);
131 private static final ConnectPoint VCP11 = new ConnectPoint(VDID, VPORT_NUM1);
132 private static final ConnectPoint VCP12 = new ConnectPoint(VDID, VPORT_NUM2);
133
134 protected DefaultVirtualPacketProvider virtualProvider;
135 protected TestPacketService testPacketService;
yoonseon736a73b2017-01-26 14:27:48 -0800136 protected TestVirtualPacketProviderService providerService;
137
138 private VirtualProviderManager providerManager;
yoonseon5a51ef72016-10-26 14:50:09 -0700139
140 private ApplicationId vAppId;
141
142 @Before
143 public void setUp() {
144 virtualProvider = new DefaultVirtualPacketProvider();
145
146 virtualProvider.coreService = new CoreServiceAdapter();
Yoonseon Hanc8089db2017-03-22 20:22:12 +0900147 virtualProvider.vnaService =
yoonseon5a51ef72016-10-26 14:50:09 -0700148 new TestVirtualNetworkAdminService();
149
yoonseon736a73b2017-01-26 14:27:48 -0800150 providerService = new TestVirtualPacketProviderService();
yoonseon5a51ef72016-10-26 14:50:09 -0700151
152 testPacketService = new TestPacketService();
153 virtualProvider.packetService = testPacketService;
154
yoonseon736a73b2017-01-26 14:27:48 -0800155 providerManager = new VirtualProviderManager();
156 virtualProvider.providerRegistryService = providerManager;
157 providerManager.registerProviderService(VNET_ID, providerService);
158
yoonseon5a51ef72016-10-26 14:50:09 -0700159 virtualProvider.activate();
160 vAppId = new TestApplicationId(0, "Virtual App");
Yoonseon Hanc8089db2017-03-22 20:22:12 +0900161
162 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
163 selector.matchEthType(Ethernet.TYPE_IPV4);
164
165 virtualProvider.startPacketHandling(VNET_ID);
yoonseon5a51ef72016-10-26 14:50:09 -0700166 }
167
168 @After
169 public void tearDown() {
170 virtualProvider.deactivate();
171 virtualProvider.coreService = null;
Yoonseon Hanc8089db2017-03-22 20:22:12 +0900172 virtualProvider.vnaService = null;
yoonseon5a51ef72016-10-26 14:50:09 -0700173 }
174
175
176 /** Test the virtual outbound packet is delivered to a proper (physical)
177 * device.
178 */
179 @Test
180 public void devirtualizePacket() {
181 TrafficTreatment tr = DefaultTrafficTreatment.builder()
182 .setOutput(VPORT_NUM1).build();
183 ByteBuffer data = ByteBuffer.wrap("abc".getBytes());
184
185 OutboundPacket vOutPacket = new DefaultOutboundPacket(VDID, tr, data);
186
187 virtualProvider.emit(VNET_ID, vOutPacket);
188
189 assertEquals("The count should be 1", 1,
190 testPacketService.getRequestedPacketCount());
191
192 OutboundPacket pOutPacket = testPacketService.getRequestedPacket(0);
193
194 assertEquals("The packet should be requested on DEV1", DID1,
195 pOutPacket.sendThrough());
196
197 PortNumber outPort = pOutPacket.treatment()
198 .allInstructions()
199 .stream()
200 .filter(i -> i.type() == Instruction.Type.OUTPUT)
201 .map(i -> (Instructions.OutputInstruction) i)
202 .map(i -> i.port())
203 .findFirst().get();
204 assertEquals("The packet should be out at PORT1 of DEV1", PORT_NUM1,
205 outPort);
206 }
207
208 /** Test the physical packet context is delivered to a proper (physical)
209 * virtual network and device.
210 */
211 @Test
212 public void virtualizePacket() {
213 Ethernet eth = new Ethernet();
214 eth.setSourceMACAddress(SRC_MAC_ADDR);
215 eth.setDestinationMACAddress(DST_MAC_ADDR);
216 eth.setVlanID((short) 1);
217 eth.setPayload(null);
218
219 InboundPacket pInPacket =
220 new DefaultInboundPacket(CP22, eth,
221 ByteBuffer.wrap(eth.serialize()));
222
223 PacketContext pContext =
224 new TestPacketContext(System.nanoTime(), pInPacket, null, false);
225
226 testPacketService.sendTestPacketContext(pContext);
227
yoonseon5a51ef72016-10-26 14:50:09 -0700228 PacketContext vContext = providerService.getRequestedPacketContext(0);
229 InboundPacket vInPacket = vContext.inPacket();
230
231 assertEquals("the packet should be received from VCP12",
232 VCP12, vInPacket.receivedFrom());
233
234 assertEquals("VLAN tag should be excludede", VlanId.UNTAGGED,
235 vInPacket.parsed().getVlanID());
236 }
237
238 private class TestPacketContext extends DefaultPacketContext {
239
240 /**
241 * Creates a new packet context.
242 *
243 * @param time creation time
244 * @param inPkt inbound packet
245 * @param outPkt outbound packet
246 * @param block whether the context is blocked or not
247 */
248 protected TestPacketContext(long time, InboundPacket inPkt,
249 OutboundPacket outPkt, boolean block) {
250 super(time, inPkt, outPkt, block);
251 }
252
253 @Override
254 public void send() {
255
256 }
257 }
258
259 private static class TestApplicationId extends DefaultApplicationId {
260 public TestApplicationId(int id, String name) {
261 super(id, name);
262 }
263 }
264
265 private static class TestVirtualNetworkAdminService
266 implements VirtualNetworkAdminService {
267
268 @Override
269 public Set<VirtualNetwork> getVirtualNetworks(TenantId tenantId) {
270 return ImmutableSet.of(VNET);
271 }
272
273 @Override
274 public Set<VirtualDevice> getVirtualDevices(NetworkId networkId) {
275 return ImmutableSet.of(VDEV);
276 }
277
278 @Override
279 public Set<VirtualHost> getVirtualHosts(NetworkId networkId) {
280 return null;
281 }
282
283 @Override
284 public Set<VirtualLink> getVirtualLinks(NetworkId networkId) {
285 return null;
286 }
287
288 @Override
289 public Set<VirtualPort> getVirtualPorts(NetworkId networkId,
290 DeviceId deviceId) {
291 return ImmutableSet.of(VPORT1, VPORT2);
292 }
293
294 @Override
295 public <T> T get(NetworkId networkId, Class<T> serviceClass) {
296 return null;
297 }
298
299 @Override
300 public ServiceDirectory getServiceDirectory() {
301 return null;
302 }
303
304 @Override
yoonseon736a73b2017-01-26 14:27:48 -0800305 public ApplicationId getVirtualNetworkApplicationId(NetworkId networkId) {
306 return null;
307 }
308
309 @Override
yoonseon5a51ef72016-10-26 14:50:09 -0700310 public void registerTenantId(TenantId tenantId) {
311
312 }
313
314 @Override
315 public void unregisterTenantId(TenantId tenantId) {
316
317 }
318
319 @Override
320 public Set<TenantId> getTenantIds() {
321 return ImmutableSet.of(TENANT_ID);
322 }
323
324 @Override
325 public VirtualNetwork createVirtualNetwork(TenantId tenantId) {
326 return null;
327 }
328
329 @Override
330 public void removeVirtualNetwork(NetworkId networkId) {
331
332 }
333
334 @Override
335 public VirtualDevice createVirtualDevice(NetworkId networkId,
336 DeviceId deviceId) {
337 return null;
338 }
339
340 @Override
341 public void removeVirtualDevice(NetworkId networkId, DeviceId deviceId) {
342
343 }
344
345 @Override
346 public VirtualHost createVirtualHost(NetworkId networkId, HostId hostId,
347 MacAddress mac, VlanId vlan,
348 HostLocation location,
349 Set<IpAddress> ips) {
350 return null;
351 }
352
353 @Override
354 public void removeVirtualHost(NetworkId networkId, HostId hostId) {
355
356 }
357
358 @Override
359 public VirtualLink createVirtualLink(NetworkId networkId,
360 ConnectPoint src, ConnectPoint dst) {
361 return null;
362 }
363
364 @Override
365 public void removeVirtualLink(NetworkId networkId,
366 ConnectPoint src, ConnectPoint dst) {
367
368 }
369
370 @Override
371 public VirtualPort createVirtualPort(NetworkId networkId,
372 DeviceId deviceId,
373 PortNumber portNumber,
374 ConnectPoint realizedBy) {
375 return null;
376 }
377
378 @Override
379 public void bindVirtualPort(NetworkId networkId,
380 DeviceId deviceId,
381 PortNumber portNumber,
382 ConnectPoint realizedBy) {
383
384 }
385
386 @Override
387 public void removeVirtualPort(NetworkId networkId, DeviceId deviceId,
388 PortNumber portNumber) {
389
390 }
Yoonseon Han33821fb2017-02-24 13:40:44 +0900391
392 @Override
393 public void addListener(VirtualNetworkListener listener) {
394
395 }
396
397 @Override
398 public void removeListener(VirtualNetworkListener listener) {
399
400 }
yoonseon5a51ef72016-10-26 14:50:09 -0700401 }
402
yoonseon736a73b2017-01-26 14:27:48 -0800403 private static class TestVirtualPacketProviderService
404 extends AbstractVirtualProviderService<VirtualPacketProvider>
yoonseon5a51ef72016-10-26 14:50:09 -0700405 implements VirtualPacketProviderService {
406 static List<PacketContext> requestedContext = new LinkedList();
407 static List<NetworkId> requestedNetworkId = new LinkedList();
408
409 @Override
410 public VirtualPacketProvider provider() {
411 return null;
412 }
413
yoonseon5a51ef72016-10-26 14:50:09 -0700414 public NetworkId getRequestedNetworkId(int index) {
yoonseon736a73b2017-01-26 14:27:48 -0800415 return requestedNetworkId.get(index);
yoonseon5a51ef72016-10-26 14:50:09 -0700416 }
417
418 public PacketContext getRequestedPacketContext(int index) {
yoonseon736a73b2017-01-26 14:27:48 -0800419 return requestedContext.get(index);
420 }
421
422 @Override
423 public void processPacket(PacketContext context) {
424 requestedContext.add(context);
yoonseon5a51ef72016-10-26 14:50:09 -0700425 }
426 }
427
428 private static class TestPacketService extends PacketServiceAdapter {
429 static List<OutboundPacket> requestedPacket = new LinkedList();
430 static PacketProcessor processor = null;
431
432 @Override
433 public void addProcessor(PacketProcessor processor, int priority) {
434 this.processor = processor;
435 }
436
437 @Override
438 public void emit(OutboundPacket packet) {
439 requestedPacket.add(packet);
440 }
441
442 public OutboundPacket getRequestedPacket(int index) {
443 return requestedPacket.get(index);
444 }
445
446 public int getRequestedPacketCount() {
447 return requestedPacket.size();
448 }
449
450 public void sendTestPacketContext(PacketContext context) {
451 processor.process(context);
452 }
453 }
454}