blob: 65331fe0ea3331438753b2bdc69289479d65a8d5 [file] [log] [blame]
Jian Li3e70d8a2018-03-28 13:56:41 +09001/*
2 * Copyright 2018-present Open Networking Foundation
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 */
16package org.onosproject.openstacknetworking.impl;
17
18import com.google.common.collect.ImmutableSet;
Daniel Parkd9d4c292018-06-26 20:33:58 +090019import com.google.common.collect.Lists;
Jian Li3e70d8a2018-03-28 13:56:41 +090020import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.packet.DHCP;
24import org.onlab.packet.Ethernet;
25import org.onlab.packet.IPv4;
26import org.onlab.packet.Ip4Address;
27import org.onlab.packet.IpAddress;
Daniel Parkf8e422d2018-07-30 14:14:37 +090028import org.onlab.packet.IpPrefix;
Jian Li3e70d8a2018-03-28 13:56:41 +090029import org.onlab.packet.MacAddress;
30import org.onlab.packet.UDP;
31import org.onlab.packet.dhcp.DhcpOption;
32import org.onosproject.cfg.ComponentConfigAdapter;
33import org.onosproject.cluster.ClusterServiceAdapter;
34import org.onosproject.cluster.LeadershipServiceAdapter;
35import org.onosproject.core.ApplicationId;
36import org.onosproject.core.CoreServiceAdapter;
37import org.onosproject.core.DefaultApplicationId;
38import org.onosproject.net.DeviceId;
39import org.onosproject.net.HostId;
40import org.onosproject.net.PortNumber;
41import org.onosproject.net.packet.DefaultInboundPacket;
42import org.onosproject.net.packet.DefaultPacketContext;
43import org.onosproject.net.packet.InboundPacket;
44import org.onosproject.net.packet.OutboundPacket;
45import org.onosproject.net.packet.PacketContext;
46import org.onosproject.net.packet.PacketProcessor;
47import org.onosproject.net.packet.PacketServiceAdapter;
48import org.onosproject.openstacknetworking.api.InstancePort;
49import org.openstack4j.model.network.AllowedAddressPair;
50import org.openstack4j.model.network.HostRoute;
51import org.openstack4j.model.network.IP;
52import org.openstack4j.model.network.IPVersionType;
53import org.openstack4j.model.network.Ipv6AddressMode;
54import org.openstack4j.model.network.Ipv6RaMode;
Daniel Park468e7852018-07-28 00:38:45 +090055import org.openstack4j.model.network.Network;
56import org.openstack4j.model.network.NetworkType;
Jian Li3e70d8a2018-03-28 13:56:41 +090057import org.openstack4j.model.network.Pool;
58import org.openstack4j.model.network.Port;
59import org.openstack4j.model.network.State;
60import org.openstack4j.model.network.Subnet;
Daniel Park468e7852018-07-28 00:38:45 +090061import org.openstack4j.model.network.builder.NetworkBuilder;
Jian Li3e70d8a2018-03-28 13:56:41 +090062import org.openstack4j.model.network.builder.PortBuilder;
63import org.openstack4j.model.network.builder.SubnetBuilder;
Daniel Parkf8e422d2018-07-30 14:14:37 +090064import org.openstack4j.openstack.networking.domain.NeutronHostRoute;
Jian Li3e70d8a2018-03-28 13:56:41 +090065import org.openstack4j.openstack.networking.domain.NeutronIP;
66
67import java.nio.ByteBuffer;
68import java.util.ArrayList;
69import java.util.List;
70import java.util.Map;
71import java.util.Set;
72
73import static org.junit.Assert.assertEquals;
74import static org.junit.Assert.fail;
Daniel Parkf8e422d2018-07-30 14:14:37 +090075import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_Classless_Static_Route;
76import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_DomainServer;
77import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_END;
78import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_MessageType;
79import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_RequestedIP;
Jian Li3e70d8a2018-03-28 13:56:41 +090080import static org.onosproject.net.NetTestTools.connectPoint;
81
82/**
83 * Unit tests for Openstack switching DHCP handler.
84 */
85public class OpenstackSwitchingDhcpHandlerTest {
86
87 private OpenstackSwitchingDhcpHandler dhcpHandler;
88
89 protected PacketProcessor packetProcessor;
90
Daniel Parkf8e422d2018-07-30 14:14:37 +090091 private static final byte DHCP_OPTION_MTU = (byte) 26;
92
93 private static final short MTU = 1450;
Jian Li3e70d8a2018-03-28 13:56:41 +090094 private static final HostId CLIENT_HOST =
95 HostId.hostId(MacAddress.valueOf("1a:1a:1a:1a:1a:1a"));
96 private static final String EXPECTED_IP = "10.2.0.2";
97 private static final String EXPECTED_CIDR = "10.2.0.0/24";
98 private static final String EXPECTED_GATEWAY = "10.2.0.1";
99 private static final Ip4Address BROADCAST =
100 Ip4Address.valueOf("255.255.255.255");
101 private static final int TRANSACTION_ID = 1986;
Daniel Parkf8e422d2018-07-30 14:14:37 +0900102 private static final Ip4Address DEFAULT_PRIMARY_DNS = Ip4Address.valueOf("8.8.8.8");
103 private static final Ip4Address DEFAULT_SECONDARY_DNS = Ip4Address.valueOf("8.8.4.4");
104 private static final String HOST_ROUTE_1_DESTINATION = "0.0.0.0/0";
105 private static final String HOST_ROUTE_1_NEXTHOP = "10.2.0.1";
106 private static final String HOST_ROUTE_2_DESTINATION = "10.0.0.0/8";
107 private static final String HOST_ROUTE_2_NEXTHOP = "10.2.0.1";
108 private static final String HOST_ROUTE_3_DESTINATION = "10.0.0.0/16";
109 private static final String HOST_ROUTE_3_NEXTHOP = "10.2.0.1";
110 private static final String HOST_ROUTE_4_DESTINATION = "10.0.0.0/24";
111 private static final String HOST_ROUTE_4_NEXTHOP = "10.2.0.1";
112 private static final HostRoute HOST_ROUTE_1 = new NeutronHostRoute(HOST_ROUTE_1_DESTINATION, HOST_ROUTE_1_NEXTHOP);
113 private static final HostRoute HOST_ROUTE_2 = new NeutronHostRoute(HOST_ROUTE_2_DESTINATION, HOST_ROUTE_2_NEXTHOP);
114 private static final HostRoute HOST_ROUTE_3 = new NeutronHostRoute(HOST_ROUTE_3_DESTINATION, HOST_ROUTE_3_NEXTHOP);
115 private static final HostRoute HOST_ROUTE_4 = new NeutronHostRoute(HOST_ROUTE_4_DESTINATION, HOST_ROUTE_4_NEXTHOP);
116 private static final int HOST_ROUTES_SIZE = 26;
Jian Li3e70d8a2018-03-28 13:56:41 +0900117
118 private static final String IP_SUBNET_ID = "1";
119
120 private DHCP.MsgType testMsgType;
121
122 @Before
123 public void setUp() {
124 dhcpHandler = new OpenstackSwitchingDhcpHandler();
125 dhcpHandler.coreService = new TestCoreService();
126 dhcpHandler.configService = new TestConfigService();
127 dhcpHandler.packetService = new TestPacketService();
128 dhcpHandler.instancePortService = new TestInstancePortService();
129 dhcpHandler.osNetworkService = new TestOpenstackNetworkService();
130 dhcpHandler.osNodeService = new TestOpenstackNodeService();
131 dhcpHandler.osFlowRuleService = new TestOpenstackFlowRuleService();
132 dhcpHandler.clusterService = new TestClusterService();
133 dhcpHandler.leadershipService = new TestLeadershipService();
134 dhcpHandler.activate();
135 }
136
137 @After
138 public void tearDown() {
139 dhcpHandler.deactivate();
140 }
141
142 /**
143 * Tests the response to a DHCP Discover Packet.
144 */
145 @Test
146 public void testDiscover() {
147 Ethernet dhcpDiscover = constructDhcpPacket(DHCP.MsgType.DHCPDISCOVER);
148 testMsgType = DHCP.MsgType.DHCPDISCOVER;
149 sendPacket(dhcpDiscover);
150 }
151
152 /**
153 * Tests the response to a DHCP Request Packet.
154 */
155 @Test
156 public void testRequest() {
157 Ethernet dhcpRequest = constructDhcpPacket(DHCP.MsgType.DHCPREQUEST);
158 testMsgType = DHCP.MsgType.DHCPREQUEST;
159 sendPacket(dhcpRequest);
160 }
161
162 /**
163 * Sends an Ethernet packet to the process method of the Packet Processor.
164 *
165 * @param ethernet Ethernet packet
166 */
167 private void sendPacket(Ethernet ethernet) {
168 final ByteBuffer byteBuffer = ByteBuffer.wrap(ethernet.serialize());
169 InboundPacket inPacket = new DefaultInboundPacket(connectPoint("1", 1),
170 ethernet,
171 byteBuffer);
172
173 PacketContext context = new TestPacketContext(127L, inPacket, null, false);
174 packetProcessor.process(context);
175 }
176
177 /**
178 * Validates the contents of the packet sent by the OpenstackSwitchingDhcpHandler.
179 *
180 * @param packet Ethernet packet received
181 */
182 private void validatePacket(Ethernet packet) {
183 DHCP dhcpPacket = (DHCP) packet.getPayload().getPayload().getPayload();
184 assertEquals(MacAddress.valueOf(dhcpPacket.getClientHardwareAddress()), CLIENT_HOST.mac());
185 assertEquals(Ip4Address.valueOf(dhcpPacket.getYourIPAddress()), Ip4Address.valueOf(EXPECTED_IP));
186 assertEquals(dhcpPacket.getTransactionId(), TRANSACTION_ID);
187
188 if (testMsgType == DHCP.MsgType.DHCPDISCOVER) {
189 assertEquals(dhcpPacket.getPacketType(), DHCP.MsgType.DHCPOFFER);
190 }
191
192 if (testMsgType == DHCP.MsgType.DHCPREQUEST) {
193 assertEquals(dhcpPacket.getPacketType(), DHCP.MsgType.DHCPACK);
194 }
195 }
196
197 /**
198 * Constructs an Ethernet packet containing a DHCP payload.
199 *
200 * @param msgType DHCP message type
201 * @return Ethernet packet
202 */
203 private Ethernet constructDhcpPacket(DHCP.MsgType msgType) {
204
205 // Ethernet frame
206 Ethernet ethFrame = new Ethernet();
207 ethFrame.setSourceMACAddress(CLIENT_HOST.mac());
208 ethFrame.setDestinationMACAddress(MacAddress.BROADCAST);
209 ethFrame.setEtherType(Ethernet.TYPE_IPV4);
210 ethFrame.setVlanID((short) 2);
211
212 // IP packet
213 IPv4 ipv4Pkt = new IPv4();
214 ipv4Pkt.setSourceAddress(0);
215 ipv4Pkt.setDestinationAddress(BROADCAST.toInt());
216 ipv4Pkt.setTtl((byte) 127);
217
218 // UDP datagram
219 UDP udpDatagram = new UDP();
220 udpDatagram.setSourcePort((byte) UDP.DHCP_CLIENT_PORT);
221 udpDatagram.setDestinationPort((byte) UDP.DHCP_SERVER_PORT);
222
223 // DHCP payload
224 DHCP dhcp = new DHCP();
225
226 dhcp.setOpCode(DHCP.OPCODE_REQUEST);
227
228 dhcp.setYourIPAddress(0);
229 dhcp.setServerIPAddress(0);
230
231 dhcp.setTransactionId(TRANSACTION_ID);
232 dhcp.setClientHardwareAddress(CLIENT_HOST.mac().toBytes());
233 dhcp.setHardwareType(DHCP.HWTYPE_ETHERNET);
234 dhcp.setHardwareAddressLength((byte) 6);
235
236 // DHCP options start...
237 DhcpOption option = new DhcpOption();
238 List<DhcpOption> optionList = new ArrayList<>();
239
240 // DHCP message type
Daniel Parkf8e422d2018-07-30 14:14:37 +0900241 option.setCode(OptionCode_MessageType.getValue());
Jian Li3e70d8a2018-03-28 13:56:41 +0900242 option.setLength((byte) 1);
243 byte[] optionData = {(byte) msgType.getValue()};
244 option.setData(optionData);
245 optionList.add(option);
246
247 // DHCP requested IP address
248 option = new DhcpOption();
Daniel Parkf8e422d2018-07-30 14:14:37 +0900249 option.setCode(OptionCode_RequestedIP.getValue());
Jian Li3e70d8a2018-03-28 13:56:41 +0900250 option.setLength((byte) 4);
251 optionData = Ip4Address.valueOf(EXPECTED_IP).toOctets();
252 option.setData(optionData);
253 optionList.add(option);
254
Daniel Parkf8e422d2018-07-30 14:14:37 +0900255 // DHCP domain server
256 Subnet subnet = dhcpHandler.osNetworkService.subnet("subnet");
257
258 option = new DhcpOption();
259 option.setCode(OptionCode_DomainServer.getValue());
260 option.setLength((byte) 8);
261 ByteBuffer dnsByteBuf = ByteBuffer.allocate(8);
262 dnsByteBuf.put(DEFAULT_PRIMARY_DNS.toOctets());
263 dnsByteBuf.put(DEFAULT_SECONDARY_DNS.toOctets());
264 option.setData(dnsByteBuf.array());
265 optionList.add(option);
266
267 // MTU
268 option = new DhcpOption();
269 option.setCode(DHCP_OPTION_MTU);
270 option.setLength((byte) 2);
271 option.setData(ByteBuffer.allocate(2).putShort(MTU).array());
272 optionList.add(option);
273
274 // classless static route
275 option = new DhcpOption();
276 option.setCode(OptionCode_Classless_Static_Route.getValue());
277
278 option.setLength((byte) HOST_ROUTES_SIZE);
279 ByteBuffer hostRouteByteBuf = ByteBuffer.allocate(HOST_ROUTES_SIZE);
280
281 subnet.getHostRoutes().forEach(h -> {
282 IpPrefix ipPrefix = IpPrefix.valueOf(h.getDestination());
283 hostRouteByteBuf.put(bytesDestinationDescriptor(ipPrefix));
284 hostRouteByteBuf.put(Ip4Address.valueOf(h.getNexthop()).toOctets());
285 });
286
287 option.setData(hostRouteByteBuf.array());
288 optionList.add(option);
289
Jian Li3e70d8a2018-03-28 13:56:41 +0900290 // DHCP options end...
291 option = new DhcpOption();
Daniel Parkf8e422d2018-07-30 14:14:37 +0900292 option.setCode(OptionCode_END.getValue());
Jian Li3e70d8a2018-03-28 13:56:41 +0900293 option.setLength((byte) 1);
294 optionList.add(option);
295
296 dhcp.setOptions(optionList);
297
298 udpDatagram.setPayload(dhcp);
299 ipv4Pkt.setPayload(udpDatagram);
300 ethFrame.setPayload(ipv4Pkt);
301
302 return ethFrame;
303 }
304
Daniel Parkf8e422d2018-07-30 14:14:37 +0900305 private byte[] bytesDestinationDescriptor(IpPrefix ipPrefix) {
306 ByteBuffer byteBuffer;
307 int prefixLen = ipPrefix.prefixLength();
308
309 // retrieve ipPrefix to the destination descriptor format
310 // ex) 10.1.1.0/24 -> [10,1,1,0]
311 String[] ipPrefixString = ipPrefix.getIp4Prefix().toString()
312 .split("/")[0]
313 .split("\\.");
314
315 // retrieve destination descriptor and put this to bytebuffer according to RFC 3442
316 // ex) 0.0.0.0/0 -> 0
317 // ex) 10.0.0.0/8 -> 8.10
318 // ex) 10.17.0.0/16 -> 16.10.17
319 // ex) 10.27.129.0/24 -> 24.10.27.129
320 // ex) 10.229.0.128/25 -> 25.10.229.0.128
321 for (int i = 0; i <= 4; i++) {
322 if (prefixLen == Math.min(prefixLen, i * 8)) {
323 byteBuffer = ByteBuffer.allocate(i + 1);
324 byteBuffer.put((byte) prefixLen);
325
326 for (int j = 0; j < i; j++) {
327 byteBuffer.put((byte) Integer.parseInt(ipPrefixString[j]));
328 }
329 return byteBuffer.array();
330 }
331 }
332
333 return null;
334 }
335
Jian Li3e70d8a2018-03-28 13:56:41 +0900336 /**
337 * Mocks the CoreService.
338 */
339 private class TestCoreService extends CoreServiceAdapter {
340
341 @Override
342 public ApplicationId registerApplication(String name) {
343 return new DefaultApplicationId(100, "dhcpTestApp");
344 }
345 }
346
347 /**
348 * Mocks the ComponentConfigRegistry.
349 */
350 private class TestConfigService extends ComponentConfigAdapter {
351 }
352
353 /**
354 * Mocks the ClusterService.
355 */
356 private class TestClusterService extends ClusterServiceAdapter {
357 }
358
359 /**
360 * Mocks the LeadershipService.
361 */
362 private class TestLeadershipService extends LeadershipServiceAdapter {
363 }
364
365 /**
366 * Mocks the InstancePortService.
367 */
368 private class TestInstancePortService extends InstancePortServiceAdapter {
369
370 @Override
371 public InstancePort instancePort(MacAddress macAddress) {
372 return new TestInstancePort();
373 }
374 }
375
376 /**
377 * Mocks the OpenstackNetworkService.
378 */
379 private class TestOpenstackNetworkService extends OpenstackNetworkServiceAdapter {
380 @Override
381 public Port port(String portId) {
382 return new TestPort();
383 }
384
385 @Override
386 public Subnet subnet(String subnetId) {
387 return new TestSubnet();
388 }
389
Daniel Park468e7852018-07-28 00:38:45 +0900390 @Override
391 public Network network(String networkId) {
392 return new TestNetwork();
393 }
394
Jian Li3e70d8a2018-03-28 13:56:41 +0900395 /**
396 * Mocks the Neutron port.
397 */
398 private class TestPort implements Port {
399
400 @Override
401 public State getState() {
402 return null;
403 }
404
405 @Override
406 public boolean isAdminStateUp() {
407 return false;
408 }
409
410 @Override
411 public String getNetworkId() {
412 return null;
413 }
414
415 @Override
416 public String getDeviceId() {
417 return null;
418 }
419
420 @Override
421 public String getDeviceOwner() {
422 return null;
423 }
424
425 @Override
426 public Set<? extends IP> getFixedIps() {
427 return ImmutableSet.of(new NeutronIP(EXPECTED_IP, IP_SUBNET_ID));
428 }
429
430 @Override
431 public Set<? extends AllowedAddressPair> getAllowedAddressPairs() {
432 return null;
433 }
434
435 @Override
436 public String getMacAddress() {
437 return null;
438 }
439
440 @Override
441 public List<String> getSecurityGroups() {
442 return null;
443 }
444
445 @Override
446 public Boolean isPortSecurityEnabled() {
447 return null;
448 }
449
450 @Override
451 public String getHostId() {
452 return null;
453 }
454
455 @Override
456 public String getVifType() {
457 return null;
458 }
459
460 @Override
461 public Map<String, Object> getVifDetails() {
462 return null;
463 }
464
465 @Override
466 public String getvNicType() {
467 return null;
468 }
469
470 @Override
471 public Map<String, Object> getProfile() {
472 return null;
473 }
474
475 @Override
476 public PortBuilder toBuilder() {
477 return null;
478 }
479
480 @Override
481 public String getTenantId() {
482 return null;
483 }
484
485 @Override
486 public void setTenantId(String tenantId) {
487
488 }
489
490 @Override
491 public String getName() {
492 return null;
493 }
494
495 @Override
496 public void setName(String name) {
497
498 }
499
500 @Override
501 public String getId() {
502 return null;
503 }
504
505 @Override
506 public void setId(String id) {
507
508 }
509 }
510
511 /**
Daniel Park468e7852018-07-28 00:38:45 +0900512 * Mocks the Neutron network.
513 */
514 private class TestNetwork implements Network {
515
516 @Override
517 public State getStatus() {
518 return null;
519 }
520
521 @Override
522 public List<String> getSubnets() {
523 return null;
524 }
525
526 @Override
527 public String getProviderPhyNet() {
528 return null;
529 }
530
531 @Override
532 public boolean isAdminStateUp() {
533 return false;
534 }
535
536 @Override
537 public NetworkType getNetworkType() {
538 return null;
539 }
540
541 @Override
542 public boolean isRouterExternal() {
543 return false;
544 }
545
546 @Override
547 public boolean isShared() {
548 return false;
549 }
550
551 @Override
552 public String getProviderSegID() {
553 return null;
554 }
555
556 @Override
557 public List<? extends Subnet> getNeutronSubnets() {
558 return null;
559 }
560
561 @Override
562 public Integer getMTU() {
563 return Integer.valueOf(4000);
564 }
565
566 @Override
567 public List<String> getAvailabilityZoneHints() {
568 return null;
569 }
570
571 @Override
572 public List<String> getAvailabilityZones() {
573 return null;
574 }
575
576 @Override
577 public NetworkBuilder toBuilder() {
578 return null;
579 }
580
581 @Override
582 public String getTenantId() {
583 return null;
584 }
585
586 @Override
587 public void setTenantId(String s) {
588
589 }
590
591 @Override
592 public String getName() {
593 return null;
594 }
595
596 @Override
597 public void setName(String s) {
598
599 }
600
601 @Override
602 public String getId() {
603 return null;
604 }
605
606 @Override
607 public void setId(String s) {
608
609 }
610 }
Daniel Parkf8e422d2018-07-30 14:14:37 +0900611
Daniel Park468e7852018-07-28 00:38:45 +0900612 /**
Jian Li3e70d8a2018-03-28 13:56:41 +0900613 * Mocks the Neutron subnet.
614 */
615 private class TestSubnet implements Subnet {
616
617 @Override
618 public boolean isDHCPEnabled() {
619 return false;
620 }
621
622 @Override
623 public String getNetworkId() {
Daniel Park468e7852018-07-28 00:38:45 +0900624 return "1";
Jian Li3e70d8a2018-03-28 13:56:41 +0900625 }
626
627 @Override
628 public List<String> getDnsNames() {
Daniel Parkf8e422d2018-07-30 14:14:37 +0900629 List<String> dnsServers = Lists.newArrayList();
630 dnsServers.add(DEFAULT_PRIMARY_DNS.toString());
631 dnsServers.add(DEFAULT_SECONDARY_DNS.toString());
632
633 return dnsServers;
Jian Li3e70d8a2018-03-28 13:56:41 +0900634 }
635
636 @Override
637 public List<? extends Pool> getAllocationPools() {
638 return null;
639 }
640
641 @Override
642 public List<? extends HostRoute> getHostRoutes() {
Daniel Parkf8e422d2018-07-30 14:14:37 +0900643 List<HostRoute> hostRoutes = Lists.newArrayList();
644
645 hostRoutes.add(HOST_ROUTE_1);
646 hostRoutes.add(HOST_ROUTE_2);
647 hostRoutes.add(HOST_ROUTE_3);
648 hostRoutes.add(HOST_ROUTE_4);
649
650 return hostRoutes;
Jian Li3e70d8a2018-03-28 13:56:41 +0900651 }
652
653 @Override
654 public IPVersionType getIpVersion() {
655 return null;
656 }
657
658 @Override
659 public String getGateway() {
660 return EXPECTED_GATEWAY;
661 }
662
663 @Override
664 public String getCidr() {
665 return EXPECTED_CIDR;
666 }
667
668 @Override
669 public Ipv6AddressMode getIpv6AddressMode() {
670 return null;
671 }
672
673 @Override
674 public Ipv6RaMode getIpv6RaMode() {
675 return null;
676 }
677
678 @Override
679 public SubnetBuilder toBuilder() {
680 return null;
681 }
682
683 @Override
684 public String getTenantId() {
685 return null;
686 }
687
688 @Override
689 public void setTenantId(String tenantId) {
690
691 }
692
693 @Override
694 public String getName() {
695 return null;
696 }
697
698 @Override
699 public void setName(String name) {
700
701 }
702
703 @Override
704 public String getId() {
705 return null;
706 }
707
708 @Override
709 public void setId(String id) {
710
711 }
712 }
713 }
714
715 /**
716 * Mocks the OpenstackNodeService.
717 */
718 private class TestOpenstackNodeService extends OpenstackNodeServiceAdapter {
719
720 }
721
722 /**
723 * Mocks the OpenstackFlowRuleService.
724 */
725 private class TestOpenstackFlowRuleService extends OpenstackFlowRuleServiceAdapter {
726 }
727
728 /**
729 * Mocks the instance port.
730 */
731 private final class TestInstancePort implements InstancePort {
732
733 @Override
734 public String networkId() {
735 return null;
736 }
737
738 @Override
739 public String portId() {
740 return null;
741 }
742
743 @Override
744 public MacAddress macAddress() {
745 return null;
746 }
747
748 @Override
749 public IpAddress ipAddress() {
750 return IpAddress.valueOf(EXPECTED_IP);
751 }
752
753 @Override
754 public DeviceId deviceId() {
755 return null;
756 }
757
758 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900759 public DeviceId oldDeviceId() {
760 return null;
761 }
762
763 @Override
Jian Li3e70d8a2018-03-28 13:56:41 +0900764 public PortNumber portNumber() {
765 return null;
766 }
Jian Liecae4382018-06-28 17:41:12 +0900767
768 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900769 public PortNumber oldPortNumber() {
770 return null;
771 }
772
773 @Override
Jian Liecae4382018-06-28 17:41:12 +0900774 public State state() {
775 return null;
776 }
777
778 @Override
779 public InstancePort updateState(State newState) {
780 return null;
781 }
Jian Liec5c32b2018-07-13 14:28:58 +0900782
783 @Override
Jian Li46b74002018-07-15 18:39:08 +0900784 public InstancePort updatePrevLocation(DeviceId oldDeviceId, PortNumber oldPortNumber) {
Jian Liec5c32b2018-07-13 14:28:58 +0900785 return null;
786 }
Jian Li3e70d8a2018-03-28 13:56:41 +0900787 }
788
789 /**
790 * Mocks the DefaultPacket context.
791 */
792 private final class TestPacketContext extends DefaultPacketContext {
793 private TestPacketContext(long time, InboundPacket inPkt,
794 OutboundPacket outPkt, boolean block) {
795 super(time, inPkt, outPkt, block);
796 }
797
798 @Override
799 public void send() {
800 // We don't send anything out.
801 }
802 }
803
804 /**
805 * Keeps a reference to the PacketProcessor and verifies the OutboundPackets.
806 */
807 private class TestPacketService extends PacketServiceAdapter {
808
809 @Override
810 public void addProcessor(PacketProcessor processor, int priority) {
811 packetProcessor = processor;
812 }
813
814 @Override
815 public void emit(OutboundPacket packet) {
816 try {
817 Ethernet eth = Ethernet.deserializer().deserialize(packet.data().array(),
818 0, packet.data().array().length);
819 validatePacket(eth);
820 } catch (Exception e) {
821 fail(e.getMessage());
822 }
823 }
824 }
825}