blob: 7dbbed19817d4a2ec45957d120943b24ddd3e312 [file] [log] [blame]
Daniel Park4d486842018-07-24 17:06:43 +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;
19import com.google.common.collect.Maps;
20import com.google.common.util.concurrent.MoreExecutors;
Jian Li7b8c3682019-05-12 13:57:15 +090021import org.apache.commons.io.IOUtils;
Daniel Park4d486842018-07-24 17:06:43 +090022import org.junit.After;
23import org.junit.Before;
24import org.junit.Test;
25import org.onlab.junit.TestUtils;
26import org.onlab.packet.DeserializationException;
27import org.onlab.packet.Ethernet;
28import org.onlab.packet.ICMP;
Jian Li2fa3ded2018-08-10 02:22:47 +000029import org.onlab.packet.ICMPEcho;
Daniel Park4d486842018-07-24 17:06:43 +090030import org.onlab.packet.IPv4;
31import org.onlab.packet.IpAddress;
32import org.onlab.packet.MacAddress;
33import org.onlab.packet.VlanId;
Daniel Park6a2d95e2018-11-05 18:50:16 +090034import org.onosproject.cluster.ClusterServiceAdapter;
35import org.onosproject.cluster.LeadershipServiceAdapter;
Daniel Park4d486842018-07-24 17:06:43 +090036import org.onosproject.core.ApplicationId;
37import org.onosproject.core.CoreServiceAdapter;
38import org.onosproject.core.DefaultApplicationId;
39import org.onosproject.net.DeviceId;
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.Constants;
49import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
50import org.onosproject.openstacknetworking.api.InstancePort;
51import org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil;
52import org.onosproject.openstacknode.api.OpenstackNode;
53import org.onosproject.openstacknode.api.OpenstackNodeAdapter;
54import org.onosproject.store.service.TestStorageService;
55import org.openstack4j.model.network.ExternalGateway;
56import org.openstack4j.model.network.Port;
57import org.openstack4j.model.network.Router;
58import org.openstack4j.model.network.RouterInterface;
59import org.openstack4j.model.network.Subnet;
60import org.openstack4j.openstack.networking.domain.NeutronPort;
61import org.openstack4j.openstack.networking.domain.NeutronRouter;
62import org.openstack4j.openstack.networking.domain.NeutronSubnet;
63
Jian Li7b8c3682019-05-12 13:57:15 +090064import java.io.IOException;
Daniel Park4d486842018-07-24 17:06:43 +090065import java.io.InputStream;
66import java.nio.ByteBuffer;
67import java.util.Map;
68import java.util.Objects;
69import java.util.Set;
70import java.util.stream.Collectors;
71
72import static org.junit.Assert.assertEquals;
73import static org.junit.Assert.fail;
74import static org.onlab.packet.Ethernet.TYPE_IPV4;
75import static org.onlab.packet.ICMP.TYPE_ECHO_REPLY;
76import static org.onlab.packet.ICMP.TYPE_ECHO_REQUEST;
77import static org.onosproject.net.NetTestTools.connectPoint;
Jian Li7b8c3682019-05-12 13:57:15 +090078import static org.onosproject.openstacknetworking.api.Constants.REST_UTF8;
Daniel Park4d486842018-07-24 17:06:43 +090079
Jian Li25257212019-03-26 13:31:14 +090080public class OpenstackRoutingSnatIcmpHandlerTest {
81 private OpenstackRoutingSnatIcmpHandler icmpHandler;
Daniel Park4d486842018-07-24 17:06:43 +090082 private static final byte CODE_ECHO_REQUEST = 0x00;
83 private static final byte CODE_ECHO_REPLY = 0x00;
84
85 protected PacketProcessor packetProcessor;
86 private InstancePort instancePort1;
87 private InstancePort instancePort2;
88 private InstancePort instancePort3;
89 private RouterInterface routerInterface1;
90 private Router router1;
91
92 private MacAddress srcMacPort1 = MacAddress.valueOf("11:22:33:44:55:66");
93 private IpAddress srcIpPort1 = IpAddress.valueOf("10.0.0.3");
94 private DeviceId srcDeviceId1 = DeviceId.deviceId("of:000000000000000a");
95 private PortNumber srcPortNum1 = PortNumber.portNumber(1);
96 private IpAddress targetIpToGw = IpAddress.valueOf("10.0.0.1");
97 private IpAddress targetIpToExternal = IpAddress.valueOf("8.8.8.8");
98 private IpAddress sNatIp = IpAddress.valueOf("172.27.0.13");
99 private MacAddress targetMac = Constants.DEFAULT_GATEWAY_MAC;
100 private MacAddress peerRouterMac = Constants.DEFAULT_EXTERNAL_ROUTER_MAC;
101 private Port port1;
102 private Port externalPort;
103 private Subnet subnet1;
104
105 Map<String, Port> portMap = Maps.newHashMap();
106 Map<String, InstancePort> instancePortMap = Maps.newHashMap();
107 Map<String, Router> osRouterMap = Maps.newHashMap();
108 Map<String, RouterInterface> osRouterInterfaceMap = Maps.newHashMap();
109
110 /**
111 * Initial setup for this unit test.
112 */
113 @Before
Jian Li7b8c3682019-05-12 13:57:15 +0900114 public void setUp() throws IOException {
Daniel Park4d486842018-07-24 17:06:43 +0900115
Jian Li25257212019-03-26 13:31:14 +0900116 icmpHandler = new OpenstackRoutingSnatIcmpHandler();
Daniel Park4d486842018-07-24 17:06:43 +0900117
118 icmpHandler.coreService = new TestCoreService();
119 icmpHandler.packetService = new TestPacketService();
120 icmpHandler.storageService = new TestStorageService();
121 icmpHandler.osNodeService = new TestOpenstackNodeService();
122 icmpHandler.instancePortService = new TestInstancePortService();
123 icmpHandler.osNetworkService = new TestOpenstackNetworkService();
124 icmpHandler.osRouterService = new TestOpenstackRouterService();
Daniel Park6a2d95e2018-11-05 18:50:16 +0900125 icmpHandler.leadershipService = new TestLeadershipService();
126 icmpHandler.osFlowRuleService = new TestOpenstackFlowRuleService();
127 icmpHandler.clusterService = new TestClusterService();
128
Daniel Park4d486842018-07-24 17:06:43 +0900129 TestUtils.setField(icmpHandler, "eventExecutor", MoreExecutors.newDirectExecutorService());
130 icmpHandler.activate();
131
132 createPort();
133 createSubnet();
134 createInstancePortMap();
135 createRouterInterfaceMap();
136 createRouterMap();
137 }
138
139 /**
140 * Tears down all of this unit test.
141 */
142 @After
143 public void tearDown() {
144 icmpHandler.deactivate();
145
146 }
147
148 /**
149 * Tests the icmp request to gateway.
150 */
151 @Test
152 public void testRequestToGw() {
153 Ethernet icmpRequest = constructIcmpRequestPacket(srcIpPort1,
154 srcMacPort1,
155 targetIpToGw,
156 targetMac,
157 TYPE_ECHO_REQUEST);
158 sendPacket(icmpRequest);
159 }
160
161 /**
162 * Tests the icmp request to external.
163 */
164 @Test
165 public void testRequestToExternal() {
166 Ethernet icmpRequest = constructIcmpRequestPacket(srcIpPort1,
167 srcMacPort1,
168 targetIpToExternal,
169 targetMac,
170 TYPE_ECHO_REQUEST);
171
172 sendPacket(icmpRequest);
173
174 Ethernet icmpResponse = constructIcmpRequestPacket(targetIpToExternal,
175 peerRouterMac,
176 sNatIp,
177 targetMac,
178 TYPE_ECHO_REPLY);
179
180 sendPacket(icmpResponse);
181 }
182
183 private void sendPacket(Ethernet ethernet) {
184 final ByteBuffer byteBuffer = ByteBuffer.wrap(ethernet.serialize());
185 InboundPacket inPacket = new DefaultInboundPacket(connectPoint(srcDeviceId1.toString(),
186 Integer.parseInt(srcPortNum1.toString())),
187 ethernet,
188 byteBuffer);
189
190 PacketContext context = new TestPacketContext(127L, inPacket, null, false);
191 packetProcessor.process(context);
192 }
193
194 private void validatePacket(Ethernet ethernet) {
195 IPv4 ipPacket = (IPv4) ethernet.getPayload();
196
197 if (IPv4.fromIPv4Address(ipPacket.getSourceAddress()).equals(targetIpToGw.toString())) {
198 validateIcmpReqToGw(ipPacket);
199 } else if (IPv4.fromIPv4Address(ipPacket.getSourceAddress())
200 .equals(sNatIp.toString())) {
201 validateIcmpReqToExternal(ipPacket);
202 } else if (IPv4.fromIPv4Address(ipPacket.getSourceAddress())
203 .equals(targetIpToExternal.toString())) {
204 validateIcmpRespFromExternal(ipPacket);
205 }
206 }
207
208 private void validateIcmpRespFromExternal(IPv4 ipPacket) {
209 ICMP icmpResp = (ICMP) ipPacket.getPayload();
Jian Li2fa3ded2018-08-10 02:22:47 +0000210 ICMPEcho icmpEchoResp = (ICMPEcho) icmpResp.getPayload();
211 short icmpId = icmpEchoResp.getIdentifier();
212 short seqNum = icmpEchoResp.getSequenceNum();
Daniel Park4d486842018-07-24 17:06:43 +0900213
214 assertEquals(icmpResp.getIcmpType(), TYPE_ECHO_REPLY);
215 assertEquals(icmpResp.getIcmpCode(), CODE_ECHO_REPLY);
216 assertEquals(icmpId, 0);
217 assertEquals(seqNum, 0);
218 assertEquals(IPv4.fromIPv4Address(ipPacket.getSourceAddress()), targetIpToExternal.toString());
219 assertEquals(IPv4.fromIPv4Address(ipPacket.getDestinationAddress()), srcIpPort1.toString());
220 }
221
222 private void validateIcmpReqToExternal(IPv4 ipPacket) {
223 ICMP icmpReq = (ICMP) ipPacket.getPayload();
Jian Li2fa3ded2018-08-10 02:22:47 +0000224 ICMPEcho icmpEchoReq = (ICMPEcho) icmpReq.getPayload();
225 short icmpId = icmpEchoReq.getIdentifier();
226 short seqNum = icmpEchoReq.getSequenceNum();
Daniel Park4d486842018-07-24 17:06:43 +0900227
228 assertEquals(icmpReq.getIcmpType(), TYPE_ECHO_REQUEST);
229 assertEquals(icmpReq.getIcmpCode(), CODE_ECHO_REQUEST);
230 assertEquals(icmpId, 0);
231 assertEquals(seqNum, 0);
232 assertEquals(IPv4.fromIPv4Address(ipPacket.getSourceAddress()), sNatIp.toString());
233 assertEquals(IPv4.fromIPv4Address(ipPacket.getDestinationAddress()), targetIpToExternal.toString());
234
235 }
236 private void validateIcmpReqToGw(IPv4 ipPacket) {
237 ICMP icmpReq = (ICMP) ipPacket.getPayload();
Jian Li2fa3ded2018-08-10 02:22:47 +0000238 ICMPEcho icmpEchoReq = (ICMPEcho) icmpReq.getPayload();
239 short icmpId = icmpEchoReq.getIdentifier();
240 short seqNum = icmpEchoReq.getSequenceNum();
Daniel Park4d486842018-07-24 17:06:43 +0900241
242 assertEquals(icmpReq.getIcmpType(), TYPE_ECHO_REPLY);
243 assertEquals(icmpReq.getIcmpCode(), CODE_ECHO_REPLY);
244 assertEquals(icmpId, 0);
245 assertEquals(seqNum, 0);
246 assertEquals(IPv4.fromIPv4Address(ipPacket.getSourceAddress()), targetIpToGw.toString());
247 assertEquals(IPv4.fromIPv4Address(ipPacket.getDestinationAddress()), srcIpPort1.toString());
248 }
249
250 private Ethernet constructIcmpRequestPacket(IpAddress srcIp,
251 MacAddress srcMac,
252 IpAddress dstIp,
253 MacAddress dstMac, byte icmpType) {
254 try {
Jian Li2fa3ded2018-08-10 02:22:47 +0000255 ICMPEcho icmpEcho = new ICMPEcho();
256 icmpEcho.setIdentifier((short) 0)
Daniel Park4d486842018-07-24 17:06:43 +0900257 .setSequenceNum((short) 0);
Jian Li2fa3ded2018-08-10 02:22:47 +0000258 ByteBuffer byteBufferIcmpEcho = ByteBuffer.wrap(icmpEcho.serialize());
Daniel Park4d486842018-07-24 17:06:43 +0900259
Jian Li2fa3ded2018-08-10 02:22:47 +0000260 ICMP icmp = new ICMP();
261 icmp.setIcmpType(icmpType)
262 .setIcmpCode(icmpType == TYPE_ECHO_REQUEST ? CODE_ECHO_REQUEST : CODE_ECHO_REPLY)
263 .setChecksum((short) 0);
264
265 icmp.setPayload(ICMPEcho.deserializer().deserialize(byteBufferIcmpEcho.array(),
266 0, ICMPEcho.ICMP_ECHO_HEADER_LENGTH));
267
268 ByteBuffer byteBufferIcmp = ByteBuffer.wrap(icmp.serialize());
Daniel Park4d486842018-07-24 17:06:43 +0900269
270 IPv4 iPacket = new IPv4();
271 iPacket.setDestinationAddress(dstIp.toString());
272 iPacket.setSourceAddress(srcIp.toString());
273 iPacket.setTtl((byte) 64);
274 iPacket.setChecksum((short) 0);
275 iPacket.setDiffServ((byte) 0);
276 iPacket.setProtocol(IPv4.PROTOCOL_ICMP);
277
Jian Li2fa3ded2018-08-10 02:22:47 +0000278 iPacket.setPayload(ICMP.deserializer().deserialize(byteBufferIcmp.array(), 0, 8));
Daniel Park4d486842018-07-24 17:06:43 +0900279
280 Ethernet ethPacket = new Ethernet();
281
282 ethPacket.setEtherType(TYPE_IPV4);
283 ethPacket.setSourceMACAddress(srcMac);
284 ethPacket.setDestinationMACAddress(dstMac);
285 ethPacket.setPayload(iPacket);
286
287 return ethPacket;
288 } catch (DeserializationException e) {
289 return null;
290 }
291 }
292
293 private class TestCoreService extends CoreServiceAdapter {
294 @Override
295 public ApplicationId registerApplication(String name) {
296 return new DefaultApplicationId(200, "test");
297 }
298 }
299
300 /**
301 * Mocks the PacketService.
302 */
303 private class TestPacketService extends PacketServiceAdapter {
304 @Override
305 public void addProcessor(PacketProcessor processor, int priority) {
306 packetProcessor = processor;
307 }
308
309 @Override
310 public void emit(OutboundPacket packet) {
311 try {
312 Ethernet eth = Ethernet.deserializer().deserialize(packet.data().array(),
313 0, packet.data().array().length);
314 validatePacket(eth);
315 } catch (Exception e) {
316 fail(e.getMessage());
317 }
318 }
319 }
320
321 /**
322 * Mocks the OpenstackNodeService.
323 */
324 private class TestOpenstackNodeService extends OpenstackNodeServiceAdapter {
325
326 @Override
327 public OpenstackNode node(DeviceId deviceId) {
328 return new TestOpenstackNode();
329 }
330 }
331
332 /**
333 * Mocks the InstancePortService.
334 */
335 private class TestInstancePortService extends InstancePortServiceAdapter {
336 @Override
337 public InstancePort instancePort(MacAddress macAddress) {
338 return instancePortMap.values().stream()
339 .filter(port -> Objects.equals(port.macAddress(), macAddress))
340 .findAny().orElse(null);
341 }
342
343 @Override
344 public InstancePort instancePort(IpAddress ipAddress, String osNetId) {
345 return instancePortMap.values().stream()
346 .filter(port -> port.networkId().equals(osNetId))
347 .filter(port -> port.ipAddress().equals(ipAddress))
348 .findFirst().orElse(null);
349 }
350
351 @Override
352 public InstancePort instancePort(String osPortId) {
353 return instancePortMap.get(osPortId);
354 }
355
356 @Override
357 public Set<InstancePort> instancePorts() {
358 return ImmutableSet.copyOf(instancePortMap.values());
359 }
360
361 @Override
362 public Set<InstancePort> instancePorts(String osNetId) {
363 Set<InstancePort> ports = instancePortMap.values().stream()
364 .filter(port -> port.networkId().equals(osNetId))
365 .collect(Collectors.toSet());
366
367 return ImmutableSet.copyOf(ports);
368 }
369 }
370
371 /**
372 * Mocks the OpenstackNetworkService.
373 */
374 private class TestOpenstackNetworkService extends OpenstackNetworkServiceAdapter {
375 @Override
376 public Set<Port> ports(String netId) {
377 return ImmutableSet.copyOf(portMap.values());
378 }
379 @Override
380 public Port port(String portId) {
381
382 return port1;
383 }
384
385 @Override
386 public Subnet subnet(String subnetId) {
387
388 return subnet1;
389 }
390
391 @Override
392 public ExternalPeerRouter externalPeerRouter(ExternalGateway externalGateway) {
393 return DefaultExternalPeerRouter.builder()
394 .ipAddress(IpAddress.valueOf("172.27.0.1"))
395 .macAddress(peerRouterMac)
396 .vlanId(VlanId.NONE)
397 .build();
398 }
399 }
400
401 /**
402 * Mocks the OpenstackRouterService.
403 */
404 private class TestOpenstackRouterService extends OpenstackRouterServiceAdapter {
405 @Override
406 public Set<RouterInterface> routerInterfaces() {
407 return ImmutableSet.copyOf(osRouterInterfaceMap.values());
408 }
409
410 @Override
411 public Router router(String osRouterId) {
412 return osRouterMap.get(osRouterId);
413 }
414 public Set<RouterInterface> routerInterfaces(String osRouterId) {
415 return osRouterInterfaceMap.values().stream()
416 .filter(iface -> iface.getId().equals(osRouterId))
417 .collect(Collectors.toSet());
418 }
419
420 }
421
422 /**
423 * Mocks the DefaultPacket context.
424 */
425 private final class TestPacketContext extends DefaultPacketContext {
426 private TestPacketContext(long time, InboundPacket inPkt,
427 OutboundPacket outPkt, boolean block) {
428 super(time, inPkt, outPkt, block);
429 }
430
431 @Override
432 public void send() {
433 // We don't send anything out.
434 }
435 }
436
437
Jian Li7b8c3682019-05-12 13:57:15 +0900438 private void createPort() throws IOException {
Jian Li25257212019-03-26 13:31:14 +0900439 InputStream portJsonStream1 = OpenstackRoutingSnatIcmpHandlerTest.class
Daniel Park4d486842018-07-24 17:06:43 +0900440 .getResourceAsStream("openstack-port-1.json");
Jian Li7b8c3682019-05-12 13:57:15 +0900441 port1 = (Port) OpenstackNetworkingUtil.jsonToModelEntity(
442 IOUtils.toString(portJsonStream1, REST_UTF8), NeutronPort.class);
Daniel Park4d486842018-07-24 17:06:43 +0900443
Jian Li25257212019-03-26 13:31:14 +0900444 InputStream portJsonStream2 = OpenstackRoutingSnatIcmpHandlerTest.class
Daniel Park4d486842018-07-24 17:06:43 +0900445 .getResourceAsStream("openstack-port-external.json");
Jian Li7b8c3682019-05-12 13:57:15 +0900446 externalPort = (Port) OpenstackNetworkingUtil.jsonToModelEntity(
447 IOUtils.toString(portJsonStream2, REST_UTF8), NeutronPort.class);
Daniel Park4d486842018-07-24 17:06:43 +0900448
449 portMap.put(port1.getId(), port1);
450 portMap.put(externalPort.getId(), externalPort);
451
452 }
453
Jian Li7b8c3682019-05-12 13:57:15 +0900454 private void createSubnet() throws IOException {
Jian Li25257212019-03-26 13:31:14 +0900455 InputStream subnetJsonStream1 = OpenstackRoutingSnatIcmpHandlerTest.class
Daniel Park4d486842018-07-24 17:06:43 +0900456 .getResourceAsStream("openstack-subnet-1.json");
Jian Li7b8c3682019-05-12 13:57:15 +0900457 subnet1 = (Subnet) OpenstackNetworkingUtil.jsonToModelEntity(
458 IOUtils.toString(subnetJsonStream1, REST_UTF8), NeutronSubnet.class);
Daniel Park4d486842018-07-24 17:06:43 +0900459 }
460
461 private void createRouterInterfaceMap() {
462 routerInterface1 = new TestRouterInterface("router-id-1",
463 "subnet-id-1",
464 "router-interface-id-1",
465 "tenant-id-1");
466
467 osRouterInterfaceMap.put(routerInterface1.getPortId(), routerInterface1);
468 }
469
Jian Li7b8c3682019-05-12 13:57:15 +0900470 private void createRouterMap() throws IOException {
Jian Li25257212019-03-26 13:31:14 +0900471 InputStream routerStream1 = OpenstackRoutingSnatIcmpHandlerTest.class
Daniel Park4d486842018-07-24 17:06:43 +0900472 .getResourceAsStream("openstack-router-1.json");
473 router1 = (Router)
Jian Li7b8c3682019-05-12 13:57:15 +0900474 OpenstackNetworkingUtil.jsonToModelEntity(
475 IOUtils.toString(routerStream1, REST_UTF8), NeutronRouter.class);
Daniel Park4d486842018-07-24 17:06:43 +0900476 osRouterMap.put(router1.getId(), router1);
477
478 }
479 private void createInstancePortMap() {
480 instancePort1 = DefaultInstancePort.builder()
481 .networkId("net-id-1")
482 .portId("ce705c24-c1ef-408a-bda3-7bbd946164ab")
483 .deviceId(srcDeviceId1)
484 .portNumber(srcPortNum1)
485 .ipAddress(srcIpPort1)
486 .macAddress(srcMacPort1)
487 .state(InstancePort.State.valueOf("ACTIVE"))
488 .build();
489
490 instancePort2 = DefaultInstancePort.builder()
491 .networkId("net-id-2")
492 .portId("port-id-2")
493 .deviceId(DeviceId.deviceId("of:000000000000000b"))
494 .portNumber(PortNumber.portNumber(2))
495 .ipAddress(IpAddress.valueOf("10.10.10.2"))
496 .macAddress(MacAddress.valueOf("22:33:44:55:66:11"))
497 .state(InstancePort.State.valueOf("ACTIVE"))
498 .build();
499
500 instancePort3 = DefaultInstancePort.builder()
501 .networkId("net-id-3")
502 .portId("port-id-3")
503 .deviceId(DeviceId.deviceId("of:000000000000000c"))
504 .oldDeviceId(DeviceId.deviceId("of:000000000000000d"))
505 .oldPortNumber(PortNumber.portNumber(4, "tap-4"))
506 .portNumber(PortNumber.portNumber(3, "tap-3"))
507 .ipAddress(IpAddress.valueOf("10.10.10.3"))
508 .macAddress(MacAddress.valueOf("33:44:55:66:11:22"))
509 .state(InstancePort.State.valueOf("ACTIVE"))
510 .build();
511
512 instancePortMap.put(instancePort1.portId(), instancePort1);
513 instancePortMap.put(instancePort2.portId(), instancePort2);
514 instancePortMap.put(instancePort3.portId(), instancePort3);
515 }
516
517
518 private class TestOpenstackNode extends OpenstackNodeAdapter {
519 public TestOpenstackNode() {
520 super();
521 }
522 @Override
523 public PortNumber uplinkPortNum() {
524 return PortNumber.portNumber(1);
525 }
526 }
Daniel Park6a2d95e2018-11-05 18:50:16 +0900527
528 /**
529 * Mocks the LeadershipService.
530 */
531 private class TestLeadershipService extends LeadershipServiceAdapter {
532 }
533
534 /**
535 * Mocks the OpenstackFlowRuleService.
536 */
537 private class TestOpenstackFlowRuleService extends OpenstackFlowRuleServiceAdapter {
538 }
539
540 /**
541 * Mocks the ClusterService.
542 */
543 private class TestClusterService extends ClusterServiceAdapter {
544 }
Daniel Park4d486842018-07-24 17:06:43 +0900545}