blob: af4f7601f27472659c95d1d0c6fcd483bbcc83f9 [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;
41import org.onosproject.incubator.net.virtual.VirtualPort;
42import org.onosproject.incubator.net.virtual.provider.VirtualPacketProvider;
43import org.onosproject.incubator.net.virtual.provider.VirtualPacketProviderService;
44import org.onosproject.net.ConnectPoint;
45import org.onosproject.net.DefaultAnnotations;
46import org.onosproject.net.DefaultDevice;
47import org.onosproject.net.DefaultLink;
48import org.onosproject.net.DefaultPort;
49import org.onosproject.net.Device;
50import org.onosproject.net.DeviceId;
51import org.onosproject.net.HostId;
52import org.onosproject.net.HostLocation;
53import org.onosproject.net.Link;
54import org.onosproject.net.Port;
55import org.onosproject.net.PortNumber;
56import org.onosproject.net.flow.DefaultTrafficTreatment;
57import org.onosproject.net.flow.TrafficTreatment;
58import org.onosproject.net.flow.instructions.Instruction;
59import org.onosproject.net.flow.instructions.Instructions;
60import org.onosproject.net.packet.DefaultInboundPacket;
61import org.onosproject.net.packet.DefaultOutboundPacket;
62import org.onosproject.net.packet.DefaultPacketContext;
63import org.onosproject.net.packet.InboundPacket;
64import org.onosproject.net.packet.OutboundPacket;
65import org.onosproject.net.packet.PacketContext;
66import org.onosproject.net.packet.PacketProcessor;
67import org.onosproject.net.packet.PacketServiceAdapter;
68import org.onosproject.net.provider.ProviderId;
69
70import java.nio.ByteBuffer;
71import java.util.LinkedList;
72import java.util.List;
73import java.util.Set;
74
75import static org.junit.Assert.assertEquals;
76
77public class DefaultVirtualPacketProviderTest {
78 private static final String SRC_MAC_ADDR = "00:00:00:00:00:00";
79 private static final String DST_MAC_ADDR = "00:00:00:00:00:01";
80 private static final ProviderId PID = new ProviderId("of", "foo");
81
82 private static final DeviceId DID1 = DeviceId.deviceId("of:001");
83 private static final DeviceId DID2 = DeviceId.deviceId("of:002");
84 private static final PortNumber PORT_NUM1 = PortNumber.portNumber(1);
85 private static final PortNumber PORT_NUM2 = PortNumber.portNumber(2);
86 private static final PortNumber PORT_NUM3 = PortNumber.portNumber(3);
87 private static final PortNumber PORT_NUM4 = PortNumber.portNumber(4);
88
89 private static final DefaultAnnotations ANNOTATIONS =
90 DefaultAnnotations.builder().set("foo", "bar").build();
91
92 private static final Device DEV1 =
93 new DefaultDevice(PID, DID1, Device.Type.SWITCH, "", "", "", "", null);
94 private static final Device DEV2 =
95 new DefaultDevice(PID, DID2, Device.Type.SWITCH, "", "", "", "", null);
96 private static final Port PORT11 =
97 new DefaultPort(DEV1, PORT_NUM1, true, ANNOTATIONS);
98 private static final Port PORT12 =
99 new DefaultPort(DEV1, PORT_NUM2, true, ANNOTATIONS);
100 private static final Port PORT21 =
101 new DefaultPort(DEV2, PORT_NUM3, true, ANNOTATIONS);
102 private static final Port PORT22 =
103 new DefaultPort(DEV2, PORT_NUM4, true, ANNOTATIONS);
104
105 private static final ConnectPoint CP11 = new ConnectPoint(DID1, PORT_NUM1);
106 private static final ConnectPoint CP12 = new ConnectPoint(DID1, PORT_NUM2);
107 private static final ConnectPoint CP21 = new ConnectPoint(DID2, PORT_NUM3);
108 private static final ConnectPoint CP22 = new ConnectPoint(DID2, PORT_NUM4);
109 private static final Link LINK1 = DefaultLink.builder()
110 .src(CP12).dst(CP21).providerId(PID).type(Link.Type.DIRECT).build();
111
112 private static final TenantId TENANT_ID = TenantId.tenantId("1");
113 private static final NetworkId VNET_ID = NetworkId.networkId(1);
114 private static final DeviceId VDID = DeviceId.deviceId("of:100");
115
116 private static final PortNumber VPORT_NUM1 = PortNumber.portNumber(10);
117 private static final PortNumber VPORT_NUM2 = PortNumber.portNumber(11);
118
119 private static final VirtualNetwork VNET = new DefaultVirtualNetwork(
120 VNET_ID, TenantId.tenantId("t1"));
121 private static final VirtualDevice VDEV =
122 new DefaultVirtualDevice(VNET_ID, VDID);
123 private static final VirtualPort VPORT1 =
124 new DefaultVirtualPort(VNET_ID, VDEV, VPORT_NUM1, CP11);
125 private static final VirtualPort VPORT2 =
126 new DefaultVirtualPort(VNET_ID, VDEV, VPORT_NUM2, CP22);
127 private static final ConnectPoint VCP11 = new ConnectPoint(VDID, VPORT_NUM1);
128 private static final ConnectPoint VCP12 = new ConnectPoint(VDID, VPORT_NUM2);
129
130 protected DefaultVirtualPacketProvider virtualProvider;
131 protected TestPacketService testPacketService;
132 protected TestVirtualPacketProivderService providerService;
133
134 private ApplicationId vAppId;
135
136 @Before
137 public void setUp() {
138 virtualProvider = new DefaultVirtualPacketProvider();
139
140 virtualProvider.coreService = new CoreServiceAdapter();
141 virtualProvider.virtualNetworkAdminService =
142 new TestVirtualNetworkAdminService();
143
144 providerService = new TestVirtualPacketProivderService();
145 virtualProvider.virtualPacketProviderService = providerService;
146
147 testPacketService = new TestPacketService();
148 virtualProvider.packetService = testPacketService;
149
150 virtualProvider.activate();
151 vAppId = new TestApplicationId(0, "Virtual App");
152 }
153
154 @After
155 public void tearDown() {
156 virtualProvider.deactivate();
157 virtualProvider.coreService = null;
158 virtualProvider.virtualNetworkAdminService = null;
159 virtualProvider.providerService = null;
160 }
161
162
163 /** Test the virtual outbound packet is delivered to a proper (physical)
164 * device.
165 */
166 @Test
167 public void devirtualizePacket() {
168 TrafficTreatment tr = DefaultTrafficTreatment.builder()
169 .setOutput(VPORT_NUM1).build();
170 ByteBuffer data = ByteBuffer.wrap("abc".getBytes());
171
172 OutboundPacket vOutPacket = new DefaultOutboundPacket(VDID, tr, data);
173
174 virtualProvider.emit(VNET_ID, vOutPacket);
175
176 assertEquals("The count should be 1", 1,
177 testPacketService.getRequestedPacketCount());
178
179 OutboundPacket pOutPacket = testPacketService.getRequestedPacket(0);
180
181 assertEquals("The packet should be requested on DEV1", DID1,
182 pOutPacket.sendThrough());
183
184 PortNumber outPort = pOutPacket.treatment()
185 .allInstructions()
186 .stream()
187 .filter(i -> i.type() == Instruction.Type.OUTPUT)
188 .map(i -> (Instructions.OutputInstruction) i)
189 .map(i -> i.port())
190 .findFirst().get();
191 assertEquals("The packet should be out at PORT1 of DEV1", PORT_NUM1,
192 outPort);
193 }
194
195 /** Test the physical packet context is delivered to a proper (physical)
196 * virtual network and device.
197 */
198 @Test
199 public void virtualizePacket() {
200 Ethernet eth = new Ethernet();
201 eth.setSourceMACAddress(SRC_MAC_ADDR);
202 eth.setDestinationMACAddress(DST_MAC_ADDR);
203 eth.setVlanID((short) 1);
204 eth.setPayload(null);
205
206 InboundPacket pInPacket =
207 new DefaultInboundPacket(CP22, eth,
208 ByteBuffer.wrap(eth.serialize()));
209
210 PacketContext pContext =
211 new TestPacketContext(System.nanoTime(), pInPacket, null, false);
212
213 testPacketService.sendTestPacketContext(pContext);
214
215 assertEquals("The virtual network Id should be 1", VNET_ID,
216 providerService.getRequestedNetworkId(0));
217
218 PacketContext vContext = providerService.getRequestedPacketContext(0);
219 InboundPacket vInPacket = vContext.inPacket();
220
221 assertEquals("the packet should be received from VCP12",
222 VCP12, vInPacket.receivedFrom());
223
224 assertEquals("VLAN tag should be excludede", VlanId.UNTAGGED,
225 vInPacket.parsed().getVlanID());
226 }
227
228 private class TestPacketContext extends DefaultPacketContext {
229
230 /**
231 * Creates a new packet context.
232 *
233 * @param time creation time
234 * @param inPkt inbound packet
235 * @param outPkt outbound packet
236 * @param block whether the context is blocked or not
237 */
238 protected TestPacketContext(long time, InboundPacket inPkt,
239 OutboundPacket outPkt, boolean block) {
240 super(time, inPkt, outPkt, block);
241 }
242
243 @Override
244 public void send() {
245
246 }
247 }
248
249 private static class TestApplicationId extends DefaultApplicationId {
250 public TestApplicationId(int id, String name) {
251 super(id, name);
252 }
253 }
254
255 private static class TestVirtualNetworkAdminService
256 implements VirtualNetworkAdminService {
257
258 @Override
259 public Set<VirtualNetwork> getVirtualNetworks(TenantId tenantId) {
260 return ImmutableSet.of(VNET);
261 }
262
263 @Override
264 public Set<VirtualDevice> getVirtualDevices(NetworkId networkId) {
265 return ImmutableSet.of(VDEV);
266 }
267
268 @Override
269 public Set<VirtualHost> getVirtualHosts(NetworkId networkId) {
270 return null;
271 }
272
273 @Override
274 public Set<VirtualLink> getVirtualLinks(NetworkId networkId) {
275 return null;
276 }
277
278 @Override
279 public Set<VirtualPort> getVirtualPorts(NetworkId networkId,
280 DeviceId deviceId) {
281 return ImmutableSet.of(VPORT1, VPORT2);
282 }
283
284 @Override
285 public <T> T get(NetworkId networkId, Class<T> serviceClass) {
286 return null;
287 }
288
289 @Override
290 public ServiceDirectory getServiceDirectory() {
291 return null;
292 }
293
294 @Override
295 public void registerTenantId(TenantId tenantId) {
296
297 }
298
299 @Override
300 public void unregisterTenantId(TenantId tenantId) {
301
302 }
303
304 @Override
305 public Set<TenantId> getTenantIds() {
306 return ImmutableSet.of(TENANT_ID);
307 }
308
309 @Override
310 public VirtualNetwork createVirtualNetwork(TenantId tenantId) {
311 return null;
312 }
313
314 @Override
315 public void removeVirtualNetwork(NetworkId networkId) {
316
317 }
318
319 @Override
320 public VirtualDevice createVirtualDevice(NetworkId networkId,
321 DeviceId deviceId) {
322 return null;
323 }
324
325 @Override
326 public void removeVirtualDevice(NetworkId networkId, DeviceId deviceId) {
327
328 }
329
330 @Override
331 public VirtualHost createVirtualHost(NetworkId networkId, HostId hostId,
332 MacAddress mac, VlanId vlan,
333 HostLocation location,
334 Set<IpAddress> ips) {
335 return null;
336 }
337
338 @Override
339 public void removeVirtualHost(NetworkId networkId, HostId hostId) {
340
341 }
342
343 @Override
344 public VirtualLink createVirtualLink(NetworkId networkId,
345 ConnectPoint src, ConnectPoint dst) {
346 return null;
347 }
348
349 @Override
350 public void removeVirtualLink(NetworkId networkId,
351 ConnectPoint src, ConnectPoint dst) {
352
353 }
354
355 @Override
356 public VirtualPort createVirtualPort(NetworkId networkId,
357 DeviceId deviceId,
358 PortNumber portNumber,
359 ConnectPoint realizedBy) {
360 return null;
361 }
362
363 @Override
364 public void bindVirtualPort(NetworkId networkId,
365 DeviceId deviceId,
366 PortNumber portNumber,
367 ConnectPoint realizedBy) {
368
369 }
370
371 @Override
372 public void removeVirtualPort(NetworkId networkId, DeviceId deviceId,
373 PortNumber portNumber) {
374
375 }
376 }
377
378 private static class TestVirtualPacketProivderService
379 implements VirtualPacketProviderService {
380 static List<PacketContext> requestedContext = new LinkedList();
381 static List<NetworkId> requestedNetworkId = new LinkedList();
382
383 @Override
384 public VirtualPacketProvider provider() {
385 return null;
386 }
387
388 @Override
389 public void processPacket(NetworkId networkId, PacketContext context) {
390 requestedNetworkId.add(networkId);
391 requestedContext.add(context);
392 }
393
394 public NetworkId getRequestedNetworkId(int index) {
395 return requestedNetworkId.get(0);
396 }
397
398 public PacketContext getRequestedPacketContext(int index) {
399 return requestedContext.get(0);
400 }
401 }
402
403 private static class TestPacketService extends PacketServiceAdapter {
404 static List<OutboundPacket> requestedPacket = new LinkedList();
405 static PacketProcessor processor = null;
406
407 @Override
408 public void addProcessor(PacketProcessor processor, int priority) {
409 this.processor = processor;
410 }
411
412 @Override
413 public void emit(OutboundPacket packet) {
414 requestedPacket.add(packet);
415 }
416
417 public OutboundPacket getRequestedPacket(int index) {
418 return requestedPacket.get(index);
419 }
420
421 public int getRequestedPacketCount() {
422 return requestedPacket.size();
423 }
424
425 public void sendTestPacketContext(PacketContext context) {
426 processor.process(context);
427 }
428 }
429}