blob: 205602d8f685955ad6dc4b16900bb452e045eb6c [file] [log] [blame]
Hyunsun Moon44aac662017-02-18 02:07:01 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Hyunsun Moon44aac662017-02-18 02:07:01 +09003 *
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.base.Strings;
19import com.google.common.collect.ImmutableSet;
20import org.apache.felix.scr.annotations.Activate;
21import org.apache.felix.scr.annotations.Component;
22import org.apache.felix.scr.annotations.Deactivate;
23import org.apache.felix.scr.annotations.Reference;
24import org.apache.felix.scr.annotations.ReferenceCardinality;
25import org.apache.felix.scr.annotations.Service;
daniel parkb5817102018-02-15 00:18:51 +090026import org.onlab.packet.ARP;
27import org.onlab.packet.Ethernet;
28import org.onlab.packet.IpAddress;
29import org.onlab.packet.MacAddress;
30import org.onlab.packet.VlanId;
31import org.onlab.util.KryoNamespace;
32import org.onosproject.core.ApplicationId;
Hyunsun Moon44aac662017-02-18 02:07:01 +090033import org.onosproject.core.CoreService;
34import org.onosproject.event.ListenerRegistry;
daniel parkb5817102018-02-15 00:18:51 +090035import org.onosproject.net.device.DeviceService;
36import org.onosproject.net.flow.DefaultTrafficTreatment;
37import org.onosproject.net.flow.TrafficTreatment;
38import org.onosproject.net.packet.DefaultOutboundPacket;
39import org.onosproject.net.packet.PacketService;
Hyunsun Moon44aac662017-02-18 02:07:01 +090040import org.onosproject.openstacknetworking.api.Constants;
daniel parkb5817102018-02-15 00:18:51 +090041import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
Hyunsun Moon44aac662017-02-18 02:07:01 +090042import org.onosproject.openstacknetworking.api.OpenstackNetworkAdminService;
43import org.onosproject.openstacknetworking.api.OpenstackNetworkEvent;
44import org.onosproject.openstacknetworking.api.OpenstackNetworkListener;
45import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
46import org.onosproject.openstacknetworking.api.OpenstackNetworkStore;
47import org.onosproject.openstacknetworking.api.OpenstackNetworkStoreDelegate;
daniel parkb5817102018-02-15 00:18:51 +090048import org.onosproject.openstacknode.api.OpenstackNode;
49import org.onosproject.openstacknode.api.OpenstackNodeService;
50import org.onosproject.store.serializers.KryoNamespaces;
51import org.onosproject.store.service.ConsistentMap;
52import org.onosproject.store.service.Serializer;
53import org.onosproject.store.service.StorageService;
daniel parkb5817102018-02-15 00:18:51 +090054import org.openstack4j.model.network.ExternalGateway;
55import org.openstack4j.model.network.IP;
Hyunsun Moon44aac662017-02-18 02:07:01 +090056import org.openstack4j.model.network.Network;
57import org.openstack4j.model.network.Port;
daniel parkb5817102018-02-15 00:18:51 +090058import org.openstack4j.model.network.Router;
Hyunsun Moon44aac662017-02-18 02:07:01 +090059import org.openstack4j.model.network.Subnet;
60import org.slf4j.Logger;
61
daniel parkb5817102018-02-15 00:18:51 +090062import java.nio.ByteBuffer;
63import java.util.NoSuchElementException;
Hyunsun Moon44aac662017-02-18 02:07:01 +090064import java.util.Objects;
65import java.util.Optional;
66import java.util.Set;
67import java.util.stream.Collectors;
68
69import static com.google.common.base.Preconditions.checkArgument;
70import static com.google.common.base.Preconditions.checkNotNull;
71import static org.onosproject.net.AnnotationKeys.PORT_NAME;
72import static org.slf4j.LoggerFactory.getLogger;
73
74/**
75 * Provides implementation of administering and interfacing OpenStack network,
76 * subnet, and port.
77 */
daniel parkb5817102018-02-15 00:18:51 +090078
Hyunsun Moon44aac662017-02-18 02:07:01 +090079@Service
80@Component(immediate = true)
81public class OpenstackNetworkManager
82 extends ListenerRegistry<OpenstackNetworkEvent, OpenstackNetworkListener>
83 implements OpenstackNetworkAdminService, OpenstackNetworkService {
84
85 protected final Logger log = getLogger(getClass());
86
87 private static final String MSG_NETWORK = "OpenStack network %s %s";
88 private static final String MSG_SUBNET = "OpenStack subnet %s %s";
89 private static final String MSG_PORT = "OpenStack port %s %s";
90 private static final String MSG_CREATED = "created";
91 private static final String MSG_UPDATED = "updated";
92 private static final String MSG_REMOVED = "removed";
93
94 private static final String ERR_NULL_NETWORK = "OpenStack network cannot be null";
95 private static final String ERR_NULL_NETWORK_ID = "OpenStack network ID cannot be null";
96 private static final String ERR_NULL_NETWORK_NAME = "OpenStack network name cannot be null";
97 private static final String ERR_NULL_SUBNET = "OpenStack subnet cannot be null";
98 private static final String ERR_NULL_SUBNET_ID = "OpenStack subnet ID cannot be null";
99 private static final String ERR_NULL_SUBNET_NET_ID = "OpenStack subnet network ID cannot be null";
100 private static final String ERR_NULL_SUBNET_CIDR = "OpenStack subnet CIDR cannot be null";
101 private static final String ERR_NULL_PORT = "OpenStack port cannot be null";
102 private static final String ERR_NULL_PORT_ID = "OpenStack port ID cannot be null";
103 private static final String ERR_NULL_PORT_NET_ID = "OpenStack port network ID cannot be null";
104
daniel parkb5817102018-02-15 00:18:51 +0900105 private static final String ERR_NOT_FOUND = " does not exist";
Hyunsun Moon44aac662017-02-18 02:07:01 +0900106 private static final String ERR_IN_USE = " still in use";
daniel parkb5817102018-02-15 00:18:51 +0900107 private static final String ERR_DUPLICATE = " already exists";
Hyunsun Moon44aac662017-02-18 02:07:01 +0900108
109 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
110 protected CoreService coreService;
111
112 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
daniel parkb5817102018-02-15 00:18:51 +0900113 protected PacketService packetService;
114
115 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
116 protected DeviceService deviceService;
117
118 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Hyunsun Moon44aac662017-02-18 02:07:01 +0900119 protected OpenstackNetworkStore osNetworkStore;
120
daniel parkb5817102018-02-15 00:18:51 +0900121 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
122 protected StorageService storageService;
123
124 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
125 protected OpenstackNodeService osNodeService;
126
Hyunsun Moon44aac662017-02-18 02:07:01 +0900127 private final OpenstackNetworkStoreDelegate delegate = new InternalNetworkStoreDelegate();
128
daniel parkb5817102018-02-15 00:18:51 +0900129 private ConsistentMap<String, ExternalPeerRouter> externalPeerRouterMap;
130
131 private static final KryoNamespace SERIALIZER_EXTERNAL_PEER_ROUTER_MAP = KryoNamespace.newBuilder()
132 .register(KryoNamespaces.API)
133 .register(ExternalPeerRouter.class)
134 .register(DefaultExternalPeerRouter.class)
135 .register(MacAddress.class)
136 .register(IpAddress.class)
137 .register(VlanId.class)
138 .build();
139
140 private ApplicationId appId;
141
142
Hyunsun Moon44aac662017-02-18 02:07:01 +0900143 @Activate
144 protected void activate() {
daniel parkb5817102018-02-15 00:18:51 +0900145 appId = coreService.registerApplication(Constants.OPENSTACK_NETWORKING_APP_ID);
146
Hyunsun Moon44aac662017-02-18 02:07:01 +0900147 osNetworkStore.setDelegate(delegate);
148 log.info("Started");
daniel parkb5817102018-02-15 00:18:51 +0900149
150 externalPeerRouterMap = storageService.<String, ExternalPeerRouter>consistentMapBuilder()
151 .withSerializer(Serializer.using(SERIALIZER_EXTERNAL_PEER_ROUTER_MAP))
152 .withName("external-routermap")
153 .withApplicationId(appId)
154 .build();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900155 }
156
157 @Deactivate
158 protected void deactivate() {
159 osNetworkStore.unsetDelegate(delegate);
160 log.info("Stopped");
161 }
162
163 @Override
164 public void createNetwork(Network osNet) {
165 checkNotNull(osNet, ERR_NULL_NETWORK);
166 checkArgument(!Strings.isNullOrEmpty(osNet.getId()), ERR_NULL_NETWORK_ID);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900167
168 osNetworkStore.createNetwork(osNet);
169 log.info(String.format(MSG_NETWORK, osNet.getName(), MSG_CREATED));
170 }
171
172 @Override
173 public void updateNetwork(Network osNet) {
174 checkNotNull(osNet, ERR_NULL_NETWORK);
175 checkArgument(!Strings.isNullOrEmpty(osNet.getId()), ERR_NULL_NETWORK_ID);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900176
177 osNetworkStore.updateNetwork(osNet);
178 log.info(String.format(MSG_NETWORK, osNet.getId(), MSG_UPDATED));
179 }
180
181 @Override
182 public void removeNetwork(String netId) {
183 checkArgument(!Strings.isNullOrEmpty(netId), ERR_NULL_NETWORK_ID);
184 synchronized (this) {
185 if (isNetworkInUse(netId)) {
186 final String error = String.format(MSG_NETWORK, netId, ERR_IN_USE);
187 throw new IllegalStateException(error);
188 }
189 Network osNet = osNetworkStore.removeNetwork(netId);
190 if (osNet != null) {
191 log.info(String.format(MSG_NETWORK, osNet.getName(), MSG_REMOVED));
192 }
193 }
194 }
195
196 @Override
197 public void createSubnet(Subnet osSubnet) {
198 checkNotNull(osSubnet, ERR_NULL_SUBNET);
199 checkArgument(!Strings.isNullOrEmpty(osSubnet.getId()), ERR_NULL_SUBNET_ID);
200 checkArgument(!Strings.isNullOrEmpty(osSubnet.getNetworkId()), ERR_NULL_SUBNET_NET_ID);
201 checkArgument(!Strings.isNullOrEmpty(osSubnet.getCidr()), ERR_NULL_SUBNET_CIDR);
202
203 osNetworkStore.createSubnet(osSubnet);
204 log.info(String.format(MSG_SUBNET, osSubnet.getCidr(), MSG_CREATED));
205 }
206
207 @Override
208 public void updateSubnet(Subnet osSubnet) {
209 checkNotNull(osSubnet, ERR_NULL_SUBNET);
210 checkArgument(!Strings.isNullOrEmpty(osSubnet.getId()), ERR_NULL_SUBNET_ID);
211 checkArgument(!Strings.isNullOrEmpty(osSubnet.getNetworkId()), ERR_NULL_SUBNET_NET_ID);
212 checkArgument(!Strings.isNullOrEmpty(osSubnet.getCidr()), ERR_NULL_SUBNET_CIDR);
213
214 osNetworkStore.updateSubnet(osSubnet);
215 log.info(String.format(MSG_SUBNET, osSubnet.getCidr(), MSG_UPDATED));
216 }
217
218 @Override
219 public void removeSubnet(String subnetId) {
220 checkArgument(!Strings.isNullOrEmpty(subnetId), ERR_NULL_SUBNET_ID);
221 synchronized (this) {
222 if (isSubnetInUse(subnetId)) {
223 final String error = String.format(MSG_SUBNET, subnetId, ERR_IN_USE);
224 throw new IllegalStateException(error);
225 }
226 Subnet osSubnet = osNetworkStore.removeSubnet(subnetId);
227 if (osSubnet != null) {
228 log.info(String.format(MSG_SUBNET, osSubnet.getCidr(), MSG_REMOVED));
229 }
230 }
231 }
232
233 @Override
234 public void createPort(Port osPort) {
235 checkNotNull(osPort, ERR_NULL_PORT);
236 checkArgument(!Strings.isNullOrEmpty(osPort.getId()), ERR_NULL_PORT_ID);
237 checkArgument(!Strings.isNullOrEmpty(osPort.getNetworkId()), ERR_NULL_PORT_NET_ID);
238
239 osNetworkStore.createPort(osPort);
240 log.info(String.format(MSG_PORT, osPort.getId(), MSG_CREATED));
241 }
242
243 @Override
244 public void updatePort(Port osPort) {
245 checkNotNull(osPort, ERR_NULL_PORT);
246 checkArgument(!Strings.isNullOrEmpty(osPort.getId()), ERR_NULL_PORT_ID);
247 checkArgument(!Strings.isNullOrEmpty(osPort.getNetworkId()), ERR_NULL_PORT_NET_ID);
248
249 osNetworkStore.updatePort(osPort);
Hyunsun Moonb7a9cd22017-02-24 11:12:53 +0900250 log.info(String.format(MSG_PORT, osPort.getId(), MSG_UPDATED));
Hyunsun Moon44aac662017-02-18 02:07:01 +0900251 }
252
253 @Override
254 public void removePort(String portId) {
255 checkArgument(!Strings.isNullOrEmpty(portId), ERR_NULL_PORT_ID);
256 synchronized (this) {
257 if (isPortInUse(portId)) {
258 final String error = String.format(MSG_PORT, portId, ERR_IN_USE);
259 throw new IllegalStateException(error);
260 }
261 Port osPort = osNetworkStore.removePort(portId);
262 if (osPort != null) {
Hyunsun Moonb7a9cd22017-02-24 11:12:53 +0900263 log.info(String.format(MSG_PORT, osPort.getId(), MSG_REMOVED));
Hyunsun Moon44aac662017-02-18 02:07:01 +0900264 }
265 }
266 }
267
268 @Override
Hyunsun Moonc7219222017-03-27 11:05:59 +0900269 public void clear() {
270 osNetworkStore.clear();
271 }
272
273 @Override
Hyunsun Moon44aac662017-02-18 02:07:01 +0900274 public Network network(String netId) {
275 checkArgument(!Strings.isNullOrEmpty(netId), ERR_NULL_NETWORK_ID);
276 return osNetworkStore.network(netId);
277 }
278
279 @Override
280 public Set<Network> networks() {
281 return osNetworkStore.networks();
282 }
283
284 @Override
285 public Subnet subnet(String subnetId) {
286 checkArgument(!Strings.isNullOrEmpty(subnetId), ERR_NULL_SUBNET_ID);
287 return osNetworkStore.subnet(subnetId);
288 }
289
290 @Override
291 public Set<Subnet> subnets() {
292 return osNetworkStore.subnets();
293 }
294
295 @Override
296 public Set<Subnet> subnets(String netId) {
297 Set<Subnet> osSubnets = osNetworkStore.subnets().stream()
298 .filter(subnet -> Objects.equals(subnet.getNetworkId(), netId))
299 .collect(Collectors.toSet());
300 return ImmutableSet.copyOf(osSubnets);
301 }
302
303 @Override
304 public Port port(String portId) {
305 checkArgument(!Strings.isNullOrEmpty(portId), ERR_NULL_PORT_ID);
306 return osNetworkStore.port(portId);
307 }
308
309 @Override
310 public Port port(org.onosproject.net.Port port) {
311 String portName = port.annotations().value(PORT_NAME);
312 if (Strings.isNullOrEmpty(portName)) {
313 return null;
314 }
315 Optional<Port> osPort = osNetworkStore.ports()
316 .stream()
317 .filter(p -> p.getId().contains(portName.substring(3)))
318 .findFirst();
daniel parkb5817102018-02-15 00:18:51 +0900319 return osPort.orElse(null);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900320 }
321
322 @Override
323 public Set<Port> ports() {
daniel parkb5817102018-02-15 00:18:51 +0900324 return ImmutableSet.copyOf(osNetworkStore.ports());
Hyunsun Moon44aac662017-02-18 02:07:01 +0900325 }
326
327 @Override
328 public Set<Port> ports(String netId) {
329 Set<Port> osPorts = osNetworkStore.ports().stream()
330 .filter(port -> Objects.equals(port.getNetworkId(), netId))
331 .collect(Collectors.toSet());
332 return ImmutableSet.copyOf(osPorts);
333 }
334
daniel parkb5817102018-02-15 00:18:51 +0900335 @Override
336 public ExternalPeerRouter externalPeerRouter(IpAddress ipAddress) {
337 if (externalPeerRouterMap.containsKey(ipAddress.toString())) {
338 return externalPeerRouterMap.get(ipAddress.toString()).value();
339 }
340 return null;
341 }
342
343 @Override
daniel park576969a2018-03-09 07:07:41 +0900344 public ExternalPeerRouter externalPeerRouter(ExternalGateway externalGateway) {
345 IpAddress ipAddress = getExternalPeerRouterIp(externalGateway);
346
347 if (ipAddress == null) {
348 return null;
349 }
350
351 if (externalPeerRouterMap.containsKey(ipAddress.toString())) {
352 return externalPeerRouterMap.get(ipAddress.toString()).value();
353 } else {
354 return null;
355 }
356 }
357
358 @Override
359 public void deriveExternalPeerRouterMac(ExternalGateway externalGateway, Router router, VlanId vlanId) {
daniel parkb5817102018-02-15 00:18:51 +0900360 log.info("deriveExternalPeerRouterMac called");
361
362 IpAddress sourceIp = getExternalGatewaySourceIp(externalGateway, router);
363 IpAddress targetIp = getExternalPeerRouterIp(externalGateway);
364
365 if (sourceIp == null || targetIp == null) {
366 log.warn("Failed to derive external router mac address because source IP {} or target IP {} is null",
367 sourceIp, targetIp);
368 return;
369 }
370
371 if (externalPeerRouterMap.containsKey(targetIp.toString()) &&
372 !externalPeerRouterMap.get(
373 targetIp.toString()).value().externalPeerRouterMac().equals(MacAddress.NONE)) {
374 return;
375 }
376
377 MacAddress sourceMac = Constants.DEFAULT_GATEWAY_MAC;
378 Ethernet ethRequest = ARP.buildArpRequest(sourceMac.toBytes(),
379 sourceIp.toOctets(),
380 targetIp.toOctets(),
daniel park576969a2018-03-09 07:07:41 +0900381 vlanId.id());
daniel parkb5817102018-02-15 00:18:51 +0900382
383 if (osNodeService.completeNodes(OpenstackNode.NodeType.GATEWAY).isEmpty()) {
384 log.warn("There's no complete gateway");
385 return;
386 }
387 OpenstackNode gatewayNode = osNodeService.completeNodes(OpenstackNode.NodeType.GATEWAY)
388 .stream()
389 .findFirst()
390 .orElse(null);
391
392 if (gatewayNode == null) {
393 return;
394 }
395
Daniel Park75e3d7f2018-05-29 14:43:53 +0900396 if (gatewayNode.uplinkPortNum() == null) {
daniel parkb5817102018-02-15 00:18:51 +0900397 log.warn("There's no uplink port for gateway node {}", gatewayNode.toString());
398 return;
399 }
400
401 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
Daniel Park75e3d7f2018-05-29 14:43:53 +0900402 .setOutput(gatewayNode.uplinkPortNum())
daniel parkb5817102018-02-15 00:18:51 +0900403 .build();
404
405 packetService.emit(new DefaultOutboundPacket(
406 gatewayNode.intgBridge(),
407 treatment,
408 ByteBuffer.wrap(ethRequest.serialize())));
409
410 externalPeerRouterMap.put(
daniel park576969a2018-03-09 07:07:41 +0900411 targetIp.toString(), new DefaultExternalPeerRouter(targetIp, MacAddress.NONE, vlanId));
daniel parkb5817102018-02-15 00:18:51 +0900412
413 log.info("Initializes external peer router map with peer router IP {}", targetIp.toString());
414 }
415
416 @Override
417 public void deleteExternalPeerRouter(ExternalGateway externalGateway) {
418 IpAddress targetIp = getExternalPeerRouterIp(externalGateway);
419 if (targetIp == null) {
420 return;
421 }
422
423 if (externalPeerRouterMap.containsKey(targetIp.toString())) {
424 externalPeerRouterMap.remove(targetIp.toString());
425 }
426 }
427
daniel parkeeb8e042018-02-21 14:06:58 +0900428 @Override
429 public void deleteExternalPeerRouter(String ipAddress) {
430 if (ipAddress == null) {
431 return;
432 }
433
434 if (externalPeerRouterMap.containsKey(ipAddress)) {
435 externalPeerRouterMap.remove(ipAddress);
436 }
437
438 }
daniel parkb5817102018-02-15 00:18:51 +0900439
440 @Override
441 public void updateExternalPeerRouterMac(IpAddress ipAddress, MacAddress macAddress) {
442 try {
443 externalPeerRouterMap.computeIfPresent(ipAddress.toString(), (id, existing) ->
444 new DefaultExternalPeerRouter(ipAddress, macAddress, existing.externalPeerRouterVlanId()));
445 } catch (Exception e) {
446 log.error("Exception occurred because of {}", e.toString());
447 }
448
449 log.info("Updated external peer router map {}",
450 externalPeerRouterMap.get(ipAddress.toString()).value().toString());
451 }
452
453
454 @Override
455 public void updateExternalPeerRouter(IpAddress ipAddress, MacAddress macAddress, VlanId vlanId) {
456 try {
457 externalPeerRouterMap.computeIfPresent(ipAddress.toString(), (id, existing) ->
458 new DefaultExternalPeerRouter(ipAddress, macAddress, vlanId));
459 } catch (Exception e) {
460 log.error("Exception occurred because of {}", e.toString());
461 }
462 }
463
464 @Override
465 public MacAddress externalPeerRouterMac(ExternalGateway externalGateway) {
466 IpAddress ipAddress = getExternalPeerRouterIp(externalGateway);
467
468 if (ipAddress == null) {
469 return null;
470 }
471 if (externalPeerRouterMap.containsKey(ipAddress.toString())) {
472 return externalPeerRouterMap.get(ipAddress.toString()).value().externalPeerRouterMac();
473 } else {
474 throw new NoSuchElementException();
475 }
476 }
477
478 @Override
479 public void updateExternalPeerRouterVlan(IpAddress ipAddress, VlanId vlanId) {
480
481 try {
daniel park576969a2018-03-09 07:07:41 +0900482 externalPeerRouterMap.computeIfPresent(ipAddress.toString(), (id, existing) ->
483 new DefaultExternalPeerRouter(ipAddress, existing.externalPeerRouterMac(), vlanId));
484
daniel parkb5817102018-02-15 00:18:51 +0900485 } catch (Exception e) {
486 log.error("Exception occurred because of {}", e.toString());
487 }
488 }
489
490 @Override
491 public Set<ExternalPeerRouter> externalPeerRouters() {
Jian Li78885a22018-03-02 11:33:02 +0900492 return ImmutableSet.copyOf(externalPeerRouterMap.asJavaMap().values());
daniel parkb5817102018-02-15 00:18:51 +0900493 }
Hyunsun Moon44aac662017-02-18 02:07:01 +0900494 private boolean isNetworkInUse(String netId) {
495 return !subnets(netId).isEmpty() && !ports(netId).isEmpty();
496 }
497
498 private boolean isSubnetInUse(String subnetId) {
499 // TODO add something if needed
500 return false;
501 }
502
503 private boolean isPortInUse(String portId) {
504 // TODO add something if needed
505 return false;
506 }
507
508 private class InternalNetworkStoreDelegate implements OpenstackNetworkStoreDelegate {
509
510 @Override
511 public void notify(OpenstackNetworkEvent event) {
512 if (event != null) {
Jian Li78885a22018-03-02 11:33:02 +0900513 log.trace("send openstack switching event {}", event);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900514 process(event);
515 }
516 }
517 }
daniel park576969a2018-03-09 07:07:41 +0900518
519 private IpAddress getExternalGatewaySourceIp(ExternalGateway externalGateway, Router router) {
520 Port exGatewayPort = ports(externalGateway.getNetworkId())
521 .stream()
522 .filter(port -> Objects.equals(port.getDeviceId(), router.getId()))
523 .findAny().orElse(null);
524 if (exGatewayPort == null) {
525 log.warn("no external gateway port for router({})", router.getName());
526 return null;
527 }
528
529 IP ipAddress = exGatewayPort.getFixedIps().stream().findFirst().orElse(null);
530
531 return ipAddress == null ? null : IpAddress.valueOf(ipAddress.getIpAddress());
532 }
533
534 private IpAddress getExternalPeerRouterIp(ExternalGateway externalGateway) {
535 Optional<Subnet> externalSubnet = subnets(externalGateway.getNetworkId())
536 .stream()
537 .findFirst();
538
539 return externalSubnet.map(subnet -> IpAddress.valueOf(subnet.getGateway())).orElse(null);
540 }
Hyunsun Moon44aac662017-02-18 02:07:01 +0900541}