blob: 8cd0462be6bf841d9b2bda062d9873ce41321557 [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();
129 dhcpHandler.instancePortService = new TestInstancePortService();
130 dhcpHandler.osNetworkService = new TestOpenstackNetworkService();
131 dhcpHandler.osNodeService = new TestOpenstackNodeService();
132 dhcpHandler.osFlowRuleService = new TestOpenstackFlowRuleService();
133 dhcpHandler.clusterService = new TestClusterService();
134 dhcpHandler.leadershipService = new TestLeadershipService();
135 dhcpHandler.activate();
136 }
137
138 @After
139 public void tearDown() {
140 dhcpHandler.deactivate();
141 }
142
143 /**
144 * Tests the response to a DHCP Discover Packet.
145 */
146 @Test
147 public void testDiscover() {
148 Ethernet dhcpDiscover = constructDhcpPacket(DHCP.MsgType.DHCPDISCOVER);
149 testMsgType = DHCP.MsgType.DHCPDISCOVER;
150 sendPacket(dhcpDiscover);
151 }
152
153 /**
154 * Tests the response to a DHCP Request Packet.
155 */
156 @Test
157 public void testRequest() {
158 Ethernet dhcpRequest = constructDhcpPacket(DHCP.MsgType.DHCPREQUEST);
159 testMsgType = DHCP.MsgType.DHCPREQUEST;
160 sendPacket(dhcpRequest);
161 }
162
163 /**
164 * Sends an Ethernet packet to the process method of the Packet Processor.
165 *
166 * @param ethernet Ethernet packet
167 */
168 private void sendPacket(Ethernet ethernet) {
169 final ByteBuffer byteBuffer = ByteBuffer.wrap(ethernet.serialize());
170 InboundPacket inPacket = new DefaultInboundPacket(connectPoint("1", 1),
171 ethernet,
172 byteBuffer);
173
174 PacketContext context = new TestPacketContext(127L, inPacket, null, false);
175 packetProcessor.process(context);
176 }
177
178 /**
179 * Validates the contents of the packet sent by the OpenstackSwitchingDhcpHandler.
180 *
181 * @param packet Ethernet packet received
182 */
183 private void validatePacket(Ethernet packet) {
184 DHCP dhcpPacket = (DHCP) packet.getPayload().getPayload().getPayload();
185 assertEquals(MacAddress.valueOf(dhcpPacket.getClientHardwareAddress()), CLIENT_HOST.mac());
186 assertEquals(Ip4Address.valueOf(dhcpPacket.getYourIPAddress()), Ip4Address.valueOf(EXPECTED_IP));
187 assertEquals(dhcpPacket.getTransactionId(), TRANSACTION_ID);
188
189 if (testMsgType == DHCP.MsgType.DHCPDISCOVER) {
190 assertEquals(dhcpPacket.getPacketType(), DHCP.MsgType.DHCPOFFER);
191 }
192
193 if (testMsgType == DHCP.MsgType.DHCPREQUEST) {
194 assertEquals(dhcpPacket.getPacketType(), DHCP.MsgType.DHCPACK);
195 }
196 }
197
198 /**
199 * Constructs an Ethernet packet containing a DHCP payload.
200 *
201 * @param msgType DHCP message type
202 * @return Ethernet packet
203 */
204 private Ethernet constructDhcpPacket(DHCP.MsgType msgType) {
205
206 // Ethernet frame
207 Ethernet ethFrame = new Ethernet();
208 ethFrame.setSourceMACAddress(CLIENT_HOST.mac());
209 ethFrame.setDestinationMACAddress(MacAddress.BROADCAST);
210 ethFrame.setEtherType(Ethernet.TYPE_IPV4);
211 ethFrame.setVlanID((short) 2);
212
213 // IP packet
214 IPv4 ipv4Pkt = new IPv4();
215 ipv4Pkt.setSourceAddress(0);
216 ipv4Pkt.setDestinationAddress(BROADCAST.toInt());
217 ipv4Pkt.setTtl((byte) 127);
218
219 // UDP datagram
220 UDP udpDatagram = new UDP();
221 udpDatagram.setSourcePort((byte) UDP.DHCP_CLIENT_PORT);
222 udpDatagram.setDestinationPort((byte) UDP.DHCP_SERVER_PORT);
223
224 // DHCP payload
225 DHCP dhcp = new DHCP();
226
227 dhcp.setOpCode(DHCP.OPCODE_REQUEST);
228
229 dhcp.setYourIPAddress(0);
230 dhcp.setServerIPAddress(0);
231
232 dhcp.setTransactionId(TRANSACTION_ID);
233 dhcp.setClientHardwareAddress(CLIENT_HOST.mac().toBytes());
234 dhcp.setHardwareType(DHCP.HWTYPE_ETHERNET);
235 dhcp.setHardwareAddressLength((byte) 6);
236
237 // DHCP options start...
238 DhcpOption option = new DhcpOption();
239 List<DhcpOption> optionList = new ArrayList<>();
240
241 // DHCP message type
Daniel Parkf8e422d2018-07-30 14:14:37 +0900242 option.setCode(OptionCode_MessageType.getValue());
Jian Li3e70d8a2018-03-28 13:56:41 +0900243 option.setLength((byte) 1);
244 byte[] optionData = {(byte) msgType.getValue()};
245 option.setData(optionData);
246 optionList.add(option);
247
248 // DHCP requested IP address
249 option = new DhcpOption();
Daniel Parkf8e422d2018-07-30 14:14:37 +0900250 option.setCode(OptionCode_RequestedIP.getValue());
Jian Li3e70d8a2018-03-28 13:56:41 +0900251 option.setLength((byte) 4);
252 optionData = Ip4Address.valueOf(EXPECTED_IP).toOctets();
253 option.setData(optionData);
254 optionList.add(option);
255
Daniel Parkf8e422d2018-07-30 14:14:37 +0900256 // DHCP domain server
257 Subnet subnet = dhcpHandler.osNetworkService.subnet("subnet");
258
259 option = new DhcpOption();
260 option.setCode(OptionCode_DomainServer.getValue());
261 option.setLength((byte) 8);
262 ByteBuffer dnsByteBuf = ByteBuffer.allocate(8);
263 dnsByteBuf.put(DEFAULT_PRIMARY_DNS.toOctets());
264 dnsByteBuf.put(DEFAULT_SECONDARY_DNS.toOctets());
265 option.setData(dnsByteBuf.array());
266 optionList.add(option);
267
268 // MTU
269 option = new DhcpOption();
270 option.setCode(DHCP_OPTION_MTU);
271 option.setLength((byte) 2);
272 option.setData(ByteBuffer.allocate(2).putShort(MTU).array());
273 optionList.add(option);
274
275 // classless static route
276 option = new DhcpOption();
277 option.setCode(OptionCode_Classless_Static_Route.getValue());
278
279 option.setLength((byte) HOST_ROUTES_SIZE);
280 ByteBuffer hostRouteByteBuf = ByteBuffer.allocate(HOST_ROUTES_SIZE);
281
282 subnet.getHostRoutes().forEach(h -> {
283 IpPrefix ipPrefix = IpPrefix.valueOf(h.getDestination());
284 hostRouteByteBuf.put(bytesDestinationDescriptor(ipPrefix));
285 hostRouteByteBuf.put(Ip4Address.valueOf(h.getNexthop()).toOctets());
286 });
287
288 option.setData(hostRouteByteBuf.array());
289 optionList.add(option);
290
Daniel Park48f10332018-08-02 10:57:27 +0900291 // default router address setup
292 option = new DhcpOption();
293 option.setCode(OptionCode_RouterAddress.getValue());
294 option.setLength((byte) 4);
295 option.setData(Ip4Address.valueOf(subnet.getGateway()).toOctets());
296 optionList.add(option);
297
298
Jian Li3e70d8a2018-03-28 13:56:41 +0900299 // DHCP options end...
300 option = new DhcpOption();
Daniel Parkf8e422d2018-07-30 14:14:37 +0900301 option.setCode(OptionCode_END.getValue());
Jian Li3e70d8a2018-03-28 13:56:41 +0900302 option.setLength((byte) 1);
303 optionList.add(option);
304
305 dhcp.setOptions(optionList);
306
307 udpDatagram.setPayload(dhcp);
308 ipv4Pkt.setPayload(udpDatagram);
309 ethFrame.setPayload(ipv4Pkt);
310
311 return ethFrame;
312 }
313
Daniel Parkf8e422d2018-07-30 14:14:37 +0900314 private byte[] bytesDestinationDescriptor(IpPrefix ipPrefix) {
315 ByteBuffer byteBuffer;
316 int prefixLen = ipPrefix.prefixLength();
317
318 // retrieve ipPrefix to the destination descriptor format
319 // ex) 10.1.1.0/24 -> [10,1,1,0]
320 String[] ipPrefixString = ipPrefix.getIp4Prefix().toString()
321 .split("/")[0]
322 .split("\\.");
323
324 // retrieve destination descriptor and put this to bytebuffer according to RFC 3442
325 // ex) 0.0.0.0/0 -> 0
326 // ex) 10.0.0.0/8 -> 8.10
327 // ex) 10.17.0.0/16 -> 16.10.17
328 // ex) 10.27.129.0/24 -> 24.10.27.129
329 // ex) 10.229.0.128/25 -> 25.10.229.0.128
330 for (int i = 0; i <= 4; i++) {
331 if (prefixLen == Math.min(prefixLen, i * 8)) {
332 byteBuffer = ByteBuffer.allocate(i + 1);
333 byteBuffer.put((byte) prefixLen);
334
335 for (int j = 0; j < i; j++) {
336 byteBuffer.put((byte) Integer.parseInt(ipPrefixString[j]));
337 }
338 return byteBuffer.array();
339 }
340 }
341
342 return null;
343 }
344
Jian Li3e70d8a2018-03-28 13:56:41 +0900345 /**
346 * Mocks the CoreService.
347 */
348 private class TestCoreService extends CoreServiceAdapter {
349
350 @Override
351 public ApplicationId registerApplication(String name) {
352 return new DefaultApplicationId(100, "dhcpTestApp");
353 }
354 }
355
356 /**
357 * Mocks the ComponentConfigRegistry.
358 */
359 private class TestConfigService extends ComponentConfigAdapter {
360 }
361
362 /**
363 * Mocks the ClusterService.
364 */
365 private class TestClusterService extends ClusterServiceAdapter {
366 }
367
368 /**
369 * Mocks the LeadershipService.
370 */
371 private class TestLeadershipService extends LeadershipServiceAdapter {
372 }
373
374 /**
375 * Mocks the InstancePortService.
376 */
377 private class TestInstancePortService extends InstancePortServiceAdapter {
378
379 @Override
380 public InstancePort instancePort(MacAddress macAddress) {
381 return new TestInstancePort();
382 }
383 }
384
385 /**
386 * Mocks the OpenstackNetworkService.
387 */
388 private class TestOpenstackNetworkService extends OpenstackNetworkServiceAdapter {
389 @Override
390 public Port port(String portId) {
391 return new TestPort();
392 }
393
394 @Override
395 public Subnet subnet(String subnetId) {
396 return new TestSubnet();
397 }
398
Daniel Park468e7852018-07-28 00:38:45 +0900399 @Override
400 public Network network(String networkId) {
401 return new TestNetwork();
402 }
403
Jian Li3e70d8a2018-03-28 13:56:41 +0900404 /**
405 * Mocks the Neutron port.
406 */
407 private class TestPort implements Port {
408
409 @Override
410 public State getState() {
411 return null;
412 }
413
414 @Override
415 public boolean isAdminStateUp() {
416 return false;
417 }
418
419 @Override
420 public String getNetworkId() {
421 return null;
422 }
423
424 @Override
425 public String getDeviceId() {
426 return null;
427 }
428
429 @Override
430 public String getDeviceOwner() {
431 return null;
432 }
433
434 @Override
435 public Set<? extends IP> getFixedIps() {
436 return ImmutableSet.of(new NeutronIP(EXPECTED_IP, IP_SUBNET_ID));
437 }
438
439 @Override
440 public Set<? extends AllowedAddressPair> getAllowedAddressPairs() {
441 return null;
442 }
443
444 @Override
445 public String getMacAddress() {
446 return null;
447 }
448
449 @Override
450 public List<String> getSecurityGroups() {
451 return null;
452 }
453
454 @Override
455 public Boolean isPortSecurityEnabled() {
456 return null;
457 }
458
459 @Override
460 public String getHostId() {
461 return null;
462 }
463
464 @Override
465 public String getVifType() {
466 return null;
467 }
468
469 @Override
470 public Map<String, Object> getVifDetails() {
471 return null;
472 }
473
474 @Override
475 public String getvNicType() {
476 return null;
477 }
478
479 @Override
480 public Map<String, Object> getProfile() {
481 return null;
482 }
483
484 @Override
485 public PortBuilder toBuilder() {
486 return null;
487 }
488
489 @Override
490 public String getTenantId() {
491 return null;
492 }
493
494 @Override
495 public void setTenantId(String tenantId) {
496
497 }
498
499 @Override
500 public String getName() {
501 return null;
502 }
503
504 @Override
505 public void setName(String name) {
506
507 }
508
509 @Override
510 public String getId() {
511 return null;
512 }
513
514 @Override
515 public void setId(String id) {
516
517 }
518 }
519
520 /**
Daniel Park468e7852018-07-28 00:38:45 +0900521 * Mocks the Neutron network.
522 */
523 private class TestNetwork implements Network {
524
525 @Override
526 public State getStatus() {
527 return null;
528 }
529
530 @Override
531 public List<String> getSubnets() {
532 return null;
533 }
534
535 @Override
536 public String getProviderPhyNet() {
537 return null;
538 }
539
540 @Override
541 public boolean isAdminStateUp() {
542 return false;
543 }
544
545 @Override
546 public NetworkType getNetworkType() {
547 return null;
548 }
549
550 @Override
551 public boolean isRouterExternal() {
552 return false;
553 }
554
555 @Override
556 public boolean isShared() {
557 return false;
558 }
559
560 @Override
561 public String getProviderSegID() {
562 return null;
563 }
564
565 @Override
566 public List<? extends Subnet> getNeutronSubnets() {
567 return null;
568 }
569
570 @Override
571 public Integer getMTU() {
572 return Integer.valueOf(4000);
573 }
574
575 @Override
576 public List<String> getAvailabilityZoneHints() {
577 return null;
578 }
579
580 @Override
581 public List<String> getAvailabilityZones() {
582 return null;
583 }
584
585 @Override
586 public NetworkBuilder toBuilder() {
587 return null;
588 }
589
590 @Override
591 public String getTenantId() {
592 return null;
593 }
594
595 @Override
596 public void setTenantId(String s) {
597
598 }
599
600 @Override
601 public String getName() {
602 return null;
603 }
604
605 @Override
606 public void setName(String s) {
607
608 }
609
610 @Override
611 public String getId() {
612 return null;
613 }
614
615 @Override
616 public void setId(String s) {
617
618 }
619 }
Daniel Parkf8e422d2018-07-30 14:14:37 +0900620
Daniel Park468e7852018-07-28 00:38:45 +0900621 /**
Jian Li3e70d8a2018-03-28 13:56:41 +0900622 * Mocks the Neutron subnet.
623 */
624 private class TestSubnet implements Subnet {
625
626 @Override
627 public boolean isDHCPEnabled() {
628 return false;
629 }
630
631 @Override
632 public String getNetworkId() {
Daniel Park468e7852018-07-28 00:38:45 +0900633 return "1";
Jian Li3e70d8a2018-03-28 13:56:41 +0900634 }
635
636 @Override
637 public List<String> getDnsNames() {
Daniel Parkf8e422d2018-07-30 14:14:37 +0900638 List<String> dnsServers = Lists.newArrayList();
639 dnsServers.add(DEFAULT_PRIMARY_DNS.toString());
640 dnsServers.add(DEFAULT_SECONDARY_DNS.toString());
641
642 return dnsServers;
Jian Li3e70d8a2018-03-28 13:56:41 +0900643 }
644
645 @Override
646 public List<? extends Pool> getAllocationPools() {
647 return null;
648 }
649
650 @Override
651 public List<? extends HostRoute> getHostRoutes() {
Daniel Parkf8e422d2018-07-30 14:14:37 +0900652 List<HostRoute> hostRoutes = Lists.newArrayList();
653
654 hostRoutes.add(HOST_ROUTE_1);
655 hostRoutes.add(HOST_ROUTE_2);
656 hostRoutes.add(HOST_ROUTE_3);
657 hostRoutes.add(HOST_ROUTE_4);
658
659 return hostRoutes;
Jian Li3e70d8a2018-03-28 13:56:41 +0900660 }
661
662 @Override
663 public IPVersionType getIpVersion() {
664 return null;
665 }
666
667 @Override
668 public String getGateway() {
669 return EXPECTED_GATEWAY;
670 }
671
672 @Override
673 public String getCidr() {
674 return EXPECTED_CIDR;
675 }
676
677 @Override
678 public Ipv6AddressMode getIpv6AddressMode() {
679 return null;
680 }
681
682 @Override
683 public Ipv6RaMode getIpv6RaMode() {
684 return null;
685 }
686
687 @Override
688 public SubnetBuilder toBuilder() {
689 return null;
690 }
691
692 @Override
693 public String getTenantId() {
694 return null;
695 }
696
697 @Override
698 public void setTenantId(String tenantId) {
699
700 }
701
702 @Override
703 public String getName() {
704 return null;
705 }
706
707 @Override
708 public void setName(String name) {
709
710 }
711
712 @Override
713 public String getId() {
714 return null;
715 }
716
717 @Override
718 public void setId(String id) {
719
720 }
721 }
722 }
723
724 /**
725 * Mocks the OpenstackNodeService.
726 */
727 private class TestOpenstackNodeService extends OpenstackNodeServiceAdapter {
728
729 }
730
731 /**
732 * Mocks the OpenstackFlowRuleService.
733 */
734 private class TestOpenstackFlowRuleService extends OpenstackFlowRuleServiceAdapter {
735 }
736
737 /**
738 * Mocks the instance port.
739 */
740 private final class TestInstancePort implements InstancePort {
741
742 @Override
743 public String networkId() {
744 return null;
745 }
746
747 @Override
748 public String portId() {
749 return null;
750 }
751
752 @Override
753 public MacAddress macAddress() {
754 return null;
755 }
756
757 @Override
758 public IpAddress ipAddress() {
759 return IpAddress.valueOf(EXPECTED_IP);
760 }
761
762 @Override
763 public DeviceId deviceId() {
764 return null;
765 }
766
767 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900768 public DeviceId oldDeviceId() {
769 return null;
770 }
771
772 @Override
Jian Li3e70d8a2018-03-28 13:56:41 +0900773 public PortNumber portNumber() {
774 return null;
775 }
Jian Liecae4382018-06-28 17:41:12 +0900776
777 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900778 public PortNumber oldPortNumber() {
779 return null;
780 }
781
782 @Override
Jian Liecae4382018-06-28 17:41:12 +0900783 public State state() {
784 return null;
785 }
786
787 @Override
788 public InstancePort updateState(State newState) {
789 return null;
790 }
Jian Liec5c32b2018-07-13 14:28:58 +0900791
792 @Override
Jian Li46b74002018-07-15 18:39:08 +0900793 public InstancePort updatePrevLocation(DeviceId oldDeviceId, PortNumber oldPortNumber) {
Jian Liec5c32b2018-07-13 14:28:58 +0900794 return null;
795 }
Jian Li3e70d8a2018-03-28 13:56:41 +0900796 }
797
798 /**
799 * Mocks the DefaultPacket context.
800 */
801 private final class TestPacketContext extends DefaultPacketContext {
802 private TestPacketContext(long time, InboundPacket inPkt,
803 OutboundPacket outPkt, boolean block) {
804 super(time, inPkt, outPkt, block);
805 }
806
807 @Override
808 public void send() {
809 // We don't send anything out.
810 }
811 }
812
813 /**
814 * Keeps a reference to the PacketProcessor and verifies the OutboundPackets.
815 */
816 private class TestPacketService extends PacketServiceAdapter {
817
818 @Override
819 public void addProcessor(PacketProcessor processor, int priority) {
820 packetProcessor = processor;
821 }
822
823 @Override
824 public void emit(OutboundPacket packet) {
825 try {
826 Ethernet eth = Ethernet.deserializer().deserialize(packet.data().array(),
827 0, packet.data().array().length);
828 validatePacket(eth);
829 } catch (Exception e) {
830 fail(e.getMessage());
831 }
832 }
833 }
834}