blob: ba55fe7f992332d07306bc6db311c40cb3ad37a3 [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;
Daniel Park48f10332018-08-02 10:57:27 +090080import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_RouterAddress;
Jian Li3e70d8a2018-03-28 13:56:41 +090081import static org.onosproject.net.NetTestTools.connectPoint;
82
83/**
84 * Unit tests for Openstack switching DHCP handler.
85 */
86public class OpenstackSwitchingDhcpHandlerTest {
87
88 private OpenstackSwitchingDhcpHandler dhcpHandler;
89
90 protected PacketProcessor packetProcessor;
91
Daniel Parkf8e422d2018-07-30 14:14:37 +090092 private static final byte DHCP_OPTION_MTU = (byte) 26;
93
94 private static final short MTU = 1450;
Jian Li3e70d8a2018-03-28 13:56:41 +090095 private static final HostId CLIENT_HOST =
96 HostId.hostId(MacAddress.valueOf("1a:1a:1a:1a:1a:1a"));
97 private static final String EXPECTED_IP = "10.2.0.2";
98 private static final String EXPECTED_CIDR = "10.2.0.0/24";
99 private static final String EXPECTED_GATEWAY = "10.2.0.1";
100 private static final Ip4Address BROADCAST =
101 Ip4Address.valueOf("255.255.255.255");
102 private static final int TRANSACTION_ID = 1986;
Daniel Parkf8e422d2018-07-30 14:14:37 +0900103 private static final Ip4Address DEFAULT_PRIMARY_DNS = Ip4Address.valueOf("8.8.8.8");
104 private static final Ip4Address DEFAULT_SECONDARY_DNS = Ip4Address.valueOf("8.8.4.4");
105 private static final String HOST_ROUTE_1_DESTINATION = "0.0.0.0/0";
106 private static final String HOST_ROUTE_1_NEXTHOP = "10.2.0.1";
107 private static final String HOST_ROUTE_2_DESTINATION = "10.0.0.0/8";
108 private static final String HOST_ROUTE_2_NEXTHOP = "10.2.0.1";
109 private static final String HOST_ROUTE_3_DESTINATION = "10.0.0.0/16";
110 private static final String HOST_ROUTE_3_NEXTHOP = "10.2.0.1";
111 private static final String HOST_ROUTE_4_DESTINATION = "10.0.0.0/24";
112 private static final String HOST_ROUTE_4_NEXTHOP = "10.2.0.1";
113 private static final HostRoute HOST_ROUTE_1 = new NeutronHostRoute(HOST_ROUTE_1_DESTINATION, HOST_ROUTE_1_NEXTHOP);
114 private static final HostRoute HOST_ROUTE_2 = new NeutronHostRoute(HOST_ROUTE_2_DESTINATION, HOST_ROUTE_2_NEXTHOP);
115 private static final HostRoute HOST_ROUTE_3 = new NeutronHostRoute(HOST_ROUTE_3_DESTINATION, HOST_ROUTE_3_NEXTHOP);
116 private static final HostRoute HOST_ROUTE_4 = new NeutronHostRoute(HOST_ROUTE_4_DESTINATION, HOST_ROUTE_4_NEXTHOP);
117 private static final int HOST_ROUTES_SIZE = 26;
Jian Li3e70d8a2018-03-28 13:56:41 +0900118
119 private static final String IP_SUBNET_ID = "1";
120
121 private DHCP.MsgType testMsgType;
122
123 @Before
124 public void setUp() {
125 dhcpHandler = new OpenstackSwitchingDhcpHandler();
126 dhcpHandler.coreService = new TestCoreService();
127 dhcpHandler.configService = new TestConfigService();
128 dhcpHandler.packetService = new TestPacketService();
Jian Li3e70d8a2018-03-28 13:56:41 +0900129 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
Daniel Park48f10332018-08-02 10:57:27 +0900290 // default router address setup
291 option = new DhcpOption();
292 option.setCode(OptionCode_RouterAddress.getValue());
293 option.setLength((byte) 4);
294 option.setData(Ip4Address.valueOf(subnet.getGateway()).toOctets());
295 optionList.add(option);
296
297
Jian Li3e70d8a2018-03-28 13:56:41 +0900298 // DHCP options end...
299 option = new DhcpOption();
Daniel Parkf8e422d2018-07-30 14:14:37 +0900300 option.setCode(OptionCode_END.getValue());
Jian Li3e70d8a2018-03-28 13:56:41 +0900301 option.setLength((byte) 1);
302 optionList.add(option);
303
304 dhcp.setOptions(optionList);
305
306 udpDatagram.setPayload(dhcp);
307 ipv4Pkt.setPayload(udpDatagram);
308 ethFrame.setPayload(ipv4Pkt);
309
310 return ethFrame;
311 }
312
Daniel Parkf8e422d2018-07-30 14:14:37 +0900313 private byte[] bytesDestinationDescriptor(IpPrefix ipPrefix) {
314 ByteBuffer byteBuffer;
315 int prefixLen = ipPrefix.prefixLength();
316
317 // retrieve ipPrefix to the destination descriptor format
318 // ex) 10.1.1.0/24 -> [10,1,1,0]
319 String[] ipPrefixString = ipPrefix.getIp4Prefix().toString()
320 .split("/")[0]
321 .split("\\.");
322
323 // retrieve destination descriptor and put this to bytebuffer according to RFC 3442
324 // ex) 0.0.0.0/0 -> 0
325 // ex) 10.0.0.0/8 -> 8.10
326 // ex) 10.17.0.0/16 -> 16.10.17
327 // ex) 10.27.129.0/24 -> 24.10.27.129
328 // ex) 10.229.0.128/25 -> 25.10.229.0.128
329 for (int i = 0; i <= 4; i++) {
330 if (prefixLen == Math.min(prefixLen, i * 8)) {
331 byteBuffer = ByteBuffer.allocate(i + 1);
332 byteBuffer.put((byte) prefixLen);
333
334 for (int j = 0; j < i; j++) {
335 byteBuffer.put((byte) Integer.parseInt(ipPrefixString[j]));
336 }
337 return byteBuffer.array();
338 }
339 }
340
341 return null;
342 }
343
Jian Li3e70d8a2018-03-28 13:56:41 +0900344 /**
345 * Mocks the CoreService.
346 */
347 private class TestCoreService extends CoreServiceAdapter {
348
349 @Override
350 public ApplicationId registerApplication(String name) {
351 return new DefaultApplicationId(100, "dhcpTestApp");
352 }
353 }
354
355 /**
356 * Mocks the ComponentConfigRegistry.
357 */
358 private class TestConfigService extends ComponentConfigAdapter {
359 }
360
361 /**
362 * Mocks the ClusterService.
363 */
364 private class TestClusterService extends ClusterServiceAdapter {
365 }
366
367 /**
368 * Mocks the LeadershipService.
369 */
370 private class TestLeadershipService extends LeadershipServiceAdapter {
371 }
372
373 /**
Jian Li3e70d8a2018-03-28 13:56:41 +0900374 * Mocks the OpenstackNetworkService.
375 */
376 private class TestOpenstackNetworkService extends OpenstackNetworkServiceAdapter {
377 @Override
378 public Port port(String portId) {
379 return new TestPort();
380 }
381
382 @Override
383 public Subnet subnet(String subnetId) {
384 return new TestSubnet();
385 }
386
Daniel Park468e7852018-07-28 00:38:45 +0900387 @Override
388 public Network network(String networkId) {
389 return new TestNetwork();
390 }
391
Jian Li3e70d8a2018-03-28 13:56:41 +0900392 /**
393 * Mocks the Neutron port.
394 */
395 private class TestPort implements Port {
396
397 @Override
398 public State getState() {
399 return null;
400 }
401
402 @Override
403 public boolean isAdminStateUp() {
404 return false;
405 }
406
407 @Override
408 public String getNetworkId() {
409 return null;
410 }
411
412 @Override
413 public String getDeviceId() {
414 return null;
415 }
416
417 @Override
418 public String getDeviceOwner() {
419 return null;
420 }
421
422 @Override
423 public Set<? extends IP> getFixedIps() {
424 return ImmutableSet.of(new NeutronIP(EXPECTED_IP, IP_SUBNET_ID));
425 }
426
427 @Override
428 public Set<? extends AllowedAddressPair> getAllowedAddressPairs() {
429 return null;
430 }
431
432 @Override
433 public String getMacAddress() {
434 return null;
435 }
436
437 @Override
438 public List<String> getSecurityGroups() {
439 return null;
440 }
441
442 @Override
443 public Boolean isPortSecurityEnabled() {
444 return null;
445 }
446
447 @Override
448 public String getHostId() {
449 return null;
450 }
451
452 @Override
453 public String getVifType() {
454 return null;
455 }
456
457 @Override
458 public Map<String, Object> getVifDetails() {
459 return null;
460 }
461
462 @Override
463 public String getvNicType() {
464 return null;
465 }
466
467 @Override
468 public Map<String, Object> getProfile() {
469 return null;
470 }
471
472 @Override
473 public PortBuilder toBuilder() {
474 return null;
475 }
476
477 @Override
478 public String getTenantId() {
479 return null;
480 }
481
482 @Override
483 public void setTenantId(String tenantId) {
484
485 }
486
487 @Override
488 public String getName() {
489 return null;
490 }
491
492 @Override
493 public void setName(String name) {
494
495 }
496
497 @Override
498 public String getId() {
499 return null;
500 }
501
502 @Override
503 public void setId(String id) {
504
505 }
506 }
507
508 /**
Daniel Park468e7852018-07-28 00:38:45 +0900509 * Mocks the Neutron network.
510 */
511 private class TestNetwork implements Network {
512
513 @Override
514 public State getStatus() {
515 return null;
516 }
517
518 @Override
519 public List<String> getSubnets() {
520 return null;
521 }
522
523 @Override
524 public String getProviderPhyNet() {
525 return null;
526 }
527
528 @Override
529 public boolean isAdminStateUp() {
530 return false;
531 }
532
533 @Override
534 public NetworkType getNetworkType() {
535 return null;
536 }
537
538 @Override
539 public boolean isRouterExternal() {
540 return false;
541 }
542
543 @Override
544 public boolean isShared() {
545 return false;
546 }
547
548 @Override
549 public String getProviderSegID() {
550 return null;
551 }
552
553 @Override
554 public List<? extends Subnet> getNeutronSubnets() {
555 return null;
556 }
557
558 @Override
559 public Integer getMTU() {
560 return Integer.valueOf(4000);
561 }
562
563 @Override
564 public List<String> getAvailabilityZoneHints() {
565 return null;
566 }
567
568 @Override
569 public List<String> getAvailabilityZones() {
570 return null;
571 }
572
573 @Override
574 public NetworkBuilder toBuilder() {
575 return null;
576 }
577
578 @Override
579 public String getTenantId() {
580 return null;
581 }
582
583 @Override
584 public void setTenantId(String s) {
585
586 }
587
588 @Override
589 public String getName() {
590 return null;
591 }
592
593 @Override
594 public void setName(String s) {
595
596 }
597
598 @Override
599 public String getId() {
600 return null;
601 }
602
603 @Override
604 public void setId(String s) {
605
606 }
607 }
Daniel Parkf8e422d2018-07-30 14:14:37 +0900608
Daniel Park468e7852018-07-28 00:38:45 +0900609 /**
Jian Li3e70d8a2018-03-28 13:56:41 +0900610 * Mocks the Neutron subnet.
611 */
612 private class TestSubnet implements Subnet {
613
614 @Override
615 public boolean isDHCPEnabled() {
616 return false;
617 }
618
619 @Override
620 public String getNetworkId() {
Daniel Park468e7852018-07-28 00:38:45 +0900621 return "1";
Jian Li3e70d8a2018-03-28 13:56:41 +0900622 }
623
624 @Override
625 public List<String> getDnsNames() {
Daniel Parkf8e422d2018-07-30 14:14:37 +0900626 List<String> dnsServers = Lists.newArrayList();
627 dnsServers.add(DEFAULT_PRIMARY_DNS.toString());
628 dnsServers.add(DEFAULT_SECONDARY_DNS.toString());
629
630 return dnsServers;
Jian Li3e70d8a2018-03-28 13:56:41 +0900631 }
632
633 @Override
634 public List<? extends Pool> getAllocationPools() {
635 return null;
636 }
637
638 @Override
639 public List<? extends HostRoute> getHostRoutes() {
Daniel Parkf8e422d2018-07-30 14:14:37 +0900640 List<HostRoute> hostRoutes = Lists.newArrayList();
641
642 hostRoutes.add(HOST_ROUTE_1);
643 hostRoutes.add(HOST_ROUTE_2);
644 hostRoutes.add(HOST_ROUTE_3);
645 hostRoutes.add(HOST_ROUTE_4);
646
647 return hostRoutes;
Jian Li3e70d8a2018-03-28 13:56:41 +0900648 }
649
650 @Override
651 public IPVersionType getIpVersion() {
652 return null;
653 }
654
655 @Override
656 public String getGateway() {
657 return EXPECTED_GATEWAY;
658 }
659
660 @Override
661 public String getCidr() {
662 return EXPECTED_CIDR;
663 }
664
665 @Override
666 public Ipv6AddressMode getIpv6AddressMode() {
667 return null;
668 }
669
670 @Override
671 public Ipv6RaMode getIpv6RaMode() {
672 return null;
673 }
674
675 @Override
676 public SubnetBuilder toBuilder() {
677 return null;
678 }
679
680 @Override
681 public String getTenantId() {
682 return null;
683 }
684
685 @Override
686 public void setTenantId(String tenantId) {
687
688 }
689
690 @Override
691 public String getName() {
692 return null;
693 }
694
695 @Override
696 public void setName(String name) {
697
698 }
699
700 @Override
701 public String getId() {
702 return null;
703 }
704
705 @Override
706 public void setId(String id) {
707
708 }
709 }
710 }
711
712 /**
713 * Mocks the OpenstackNodeService.
714 */
715 private class TestOpenstackNodeService extends OpenstackNodeServiceAdapter {
716
717 }
718
719 /**
720 * Mocks the OpenstackFlowRuleService.
721 */
722 private class TestOpenstackFlowRuleService extends OpenstackFlowRuleServiceAdapter {
723 }
724
725 /**
726 * Mocks the instance port.
727 */
728 private final class TestInstancePort implements InstancePort {
729
730 @Override
731 public String networkId() {
732 return null;
733 }
734
735 @Override
736 public String portId() {
737 return null;
738 }
739
740 @Override
741 public MacAddress macAddress() {
742 return null;
743 }
744
745 @Override
746 public IpAddress ipAddress() {
747 return IpAddress.valueOf(EXPECTED_IP);
748 }
749
750 @Override
751 public DeviceId deviceId() {
752 return null;
753 }
754
755 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900756 public DeviceId oldDeviceId() {
757 return null;
758 }
759
760 @Override
Jian Li3e70d8a2018-03-28 13:56:41 +0900761 public PortNumber portNumber() {
762 return null;
763 }
Jian Liecae4382018-06-28 17:41:12 +0900764
765 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900766 public PortNumber oldPortNumber() {
767 return null;
768 }
769
770 @Override
Jian Liecae4382018-06-28 17:41:12 +0900771 public State state() {
772 return null;
773 }
774
775 @Override
776 public InstancePort updateState(State newState) {
777 return null;
778 }
Jian Liec5c32b2018-07-13 14:28:58 +0900779
780 @Override
Jian Li46b74002018-07-15 18:39:08 +0900781 public InstancePort updatePrevLocation(DeviceId oldDeviceId, PortNumber oldPortNumber) {
Jian Liec5c32b2018-07-13 14:28:58 +0900782 return null;
783 }
Jian Li3e70d8a2018-03-28 13:56:41 +0900784 }
785
786 /**
787 * Mocks the DefaultPacket context.
788 */
789 private final class TestPacketContext extends DefaultPacketContext {
790 private TestPacketContext(long time, InboundPacket inPkt,
791 OutboundPacket outPkt, boolean block) {
792 super(time, inPkt, outPkt, block);
793 }
794
795 @Override
796 public void send() {
797 // We don't send anything out.
798 }
799 }
800
801 /**
802 * Keeps a reference to the PacketProcessor and verifies the OutboundPackets.
803 */
804 private class TestPacketService extends PacketServiceAdapter {
805
806 @Override
807 public void addProcessor(PacketProcessor processor, int priority) {
808 packetProcessor = processor;
809 }
810
811 @Override
812 public void emit(OutboundPacket packet) {
813 try {
814 Ethernet eth = Ethernet.deserializer().deserialize(packet.data().array(),
815 0, packet.data().array().length);
816 validatePacket(eth);
817 } catch (Exception e) {
818 fail(e.getMessage());
819 }
820 }
821 }
822}