blob: d59a2600e0f867e9f83e3d74b14d713af4ac0f4c [file] [log] [blame]
Daniel Parkf3136042021-03-10 07:49:11 +09001/*
2 * Copyright 2021-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.kubevirtnetworking.impl;
17
18import org.onlab.packet.ARP;
19import org.onlab.packet.EthType;
20import org.onlab.packet.Ethernet;
21import org.onlab.packet.IpPrefix;
22import org.onlab.packet.MacAddress;
23import org.onosproject.cluster.ClusterService;
24import org.onosproject.cluster.LeadershipService;
25import org.onosproject.cluster.NodeId;
26import org.onosproject.core.ApplicationId;
27import org.onosproject.core.CoreService;
28import org.onosproject.kubevirtnetworking.api.KubevirtFloatingIp;
29import org.onosproject.kubevirtnetworking.api.KubevirtFlowRuleService;
30import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
31import org.onosproject.kubevirtnetworking.api.KubevirtNetworkService;
32import org.onosproject.kubevirtnetworking.api.KubevirtPort;
33import org.onosproject.kubevirtnetworking.api.KubevirtPortService;
34import org.onosproject.kubevirtnetworking.api.KubevirtRouter;
35import org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent;
36import org.onosproject.kubevirtnetworking.api.KubevirtRouterListener;
37import org.onosproject.kubevirtnetworking.api.KubevirtRouterService;
38import org.onosproject.kubevirtnetworking.util.RulePopulatorUtil;
39import org.onosproject.kubevirtnode.api.KubevirtNode;
Jian Li394bef52021-05-27 18:53:45 +090040import org.onosproject.kubevirtnode.api.KubevirtNodeEvent;
41import org.onosproject.kubevirtnode.api.KubevirtNodeListener;
Daniel Parkf3136042021-03-10 07:49:11 +090042import org.onosproject.kubevirtnode.api.KubevirtNodeService;
43import org.onosproject.net.Device;
44import org.onosproject.net.PortNumber;
45import org.onosproject.net.device.DeviceAdminService;
46import org.onosproject.net.driver.DriverService;
47import org.onosproject.net.flow.DefaultTrafficSelector;
48import org.onosproject.net.flow.DefaultTrafficTreatment;
49import org.onosproject.net.flow.TrafficSelector;
50import org.onosproject.net.flow.TrafficTreatment;
Daniel Park157947f2021-04-09 17:50:53 +090051import org.onosproject.net.packet.DefaultOutboundPacket;
52import org.onosproject.net.packet.PacketService;
Daniel Parkf3136042021-03-10 07:49:11 +090053import org.osgi.service.component.annotations.Activate;
54import org.osgi.service.component.annotations.Component;
55import org.osgi.service.component.annotations.Deactivate;
56import org.osgi.service.component.annotations.Reference;
57import org.osgi.service.component.annotations.ReferenceCardinality;
58import org.slf4j.Logger;
59
Daniel Park157947f2021-04-09 17:50:53 +090060import java.nio.ByteBuffer;
Daniel Parkf3136042021-03-10 07:49:11 +090061import java.util.Objects;
62import java.util.concurrent.ExecutorService;
63
64import static java.util.concurrent.Executors.newSingleThreadExecutor;
65import static org.onlab.util.Tools.groupedThreads;
66import static org.onosproject.kubevirtnetworking.api.Constants.FORWARDING_TABLE;
Jian Lif89d9602021-04-27 19:05:49 +090067import static org.onosproject.kubevirtnetworking.api.Constants.GW_ENTRY_TABLE;
Daniel Parkf3136042021-03-10 07:49:11 +090068import static org.onosproject.kubevirtnetworking.api.Constants.KUBEVIRT_NETWORKING_APP_ID;
Daniel Parkf3136042021-03-10 07:49:11 +090069import static org.onosproject.kubevirtnetworking.api.Constants.PRIORITY_ARP_GATEWAY_RULE;
70import static org.onosproject.kubevirtnetworking.api.Constants.PRIORITY_FLOATING_IP_RULE;
71import static org.onosproject.kubevirtnetworking.api.Constants.PRIORITY_FORWARDING_RULE;
72import static org.onosproject.kubevirtnetworking.api.Constants.TUNNEL_DEFAULT_TABLE;
73import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GENEVE;
74import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GRE;
75import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.VXLAN;
Daniel Park157947f2021-04-09 17:50:53 +090076import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.buildGarpPacket;
Daniel Parkf3136042021-03-10 07:49:11 +090077import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.externalPatchPortNum;
78import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.gatewayNodeForSpecifiedRouter;
79import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.getRouterMacAddress;
80import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.tunnelPort;
81import static org.onosproject.kubevirtnetworking.util.RulePopulatorUtil.buildExtension;
82import static org.slf4j.LoggerFactory.getLogger;
83
84/**
85 * Handles kubevirt floating ip.
86 */
87@Component(immediate = true)
88public class KubevirtFloatingIpHandler {
89 protected final Logger log = getLogger(getClass());
90
91 @Reference(cardinality = ReferenceCardinality.MANDATORY)
92 protected CoreService coreService;
93
94 @Reference(cardinality = ReferenceCardinality.MANDATORY)
95 protected ClusterService clusterService;
96
97 @Reference(cardinality = ReferenceCardinality.MANDATORY)
98 protected LeadershipService leadershipService;
99
100 @Reference(cardinality = ReferenceCardinality.MANDATORY)
101 protected DeviceAdminService deviceService;
102
103 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Daniel Park157947f2021-04-09 17:50:53 +0900104 protected PacketService packetService;
105
106 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Daniel Parkf3136042021-03-10 07:49:11 +0900107 protected KubevirtPortService kubevirtPortService;
108
109 @Reference(cardinality = ReferenceCardinality.MANDATORY)
110 protected KubevirtNodeService kubevirtNodeService;
111
112 @Reference(cardinality = ReferenceCardinality.MANDATORY)
113 protected KubevirtNetworkService kubevirtNetworkService;
114
115 @Reference(cardinality = ReferenceCardinality.MANDATORY)
116 protected KubevirtFlowRuleService flowService;
117
118 @Reference(cardinality = ReferenceCardinality.MANDATORY)
119 protected DriverService driverService;
120
121 @Reference(cardinality = ReferenceCardinality.MANDATORY)
122 protected KubevirtRouterService kubevirtRouterService;
123
124 private final ExecutorService eventExecutor = newSingleThreadExecutor(
125 groupedThreads(this.getClass().getSimpleName(), "event-handler"));
126
127 private ApplicationId appId;
128 private NodeId localNodeId;
129
Jian Li517597a2021-03-22 11:04:52 +0900130 private final InternalRouterEventListener kubevirtRouterListener =
Daniel Parkf3136042021-03-10 07:49:11 +0900131 new InternalRouterEventListener();
Jian Li394bef52021-05-27 18:53:45 +0900132 private final InternalNodeListener kubevirtNodeListener =
133 new InternalNodeListener();
Daniel Parkf3136042021-03-10 07:49:11 +0900134
135 @Activate
136 protected void activate() {
137 appId = coreService.registerApplication(KUBEVIRT_NETWORKING_APP_ID);
138 localNodeId = clusterService.getLocalNode().id();
139 leadershipService.runForLeadership(appId.name());
Jian Li517597a2021-03-22 11:04:52 +0900140 kubevirtRouterService.addListener(kubevirtRouterListener);
Jian Li394bef52021-05-27 18:53:45 +0900141 kubevirtNodeService.addListener(kubevirtNodeListener);
Daniel Parkf3136042021-03-10 07:49:11 +0900142
143 log.info("Started");
144 }
145
146 @Deactivate
147 protected void deactivate() {
148 leadershipService.withdraw(appId.name());
Jian Li517597a2021-03-22 11:04:52 +0900149 kubevirtRouterService.removeListener(kubevirtRouterListener);
Jian Li394bef52021-05-27 18:53:45 +0900150 kubevirtNodeService.removeListener(kubevirtNodeListener);
Daniel Parkf3136042021-03-10 07:49:11 +0900151
152 eventExecutor.shutdown();
153
154 log.info("Stopped");
155 }
156
Daniel Park157947f2021-04-09 17:50:53 +0900157 private void setFloatingIpRulesForFip(KubevirtRouter router,
158 KubevirtFloatingIp floatingIp,
159 KubevirtNode electedGw,
160 boolean install) {
Daniel Parkf3136042021-03-10 07:49:11 +0900161
162 KubevirtPort kubevirtPort = getKubevirtPort(floatingIp);
163 if (kubevirtPort == null) {
Daniel Parkf3136042021-03-10 07:49:11 +0900164 return;
165 }
166
167 KubevirtNetwork kubevirtNetwork = kubevirtNetworkService.network(kubevirtPort.networkId());
168 if (kubevirtNetwork.type() == VXLAN || kubevirtNetwork.type() == GENEVE || kubevirtNetwork.type() == GRE) {
169 setFloatingIpDownstreamRulesToGatewayTunBridge(router, floatingIp, kubevirtNetwork, kubevirtPort, install);
170 }
171
Daniel Park157947f2021-04-09 17:50:53 +0900172 setFloatingIpArpResponseRules(router, floatingIp, kubevirtPort, electedGw, install);
173 setFloatingIpUpstreamRules(router, floatingIp, kubevirtPort, electedGw, install);
174 setFloatingIpDownstreamRules(router, floatingIp, kubevirtPort, electedGw, install);
Daniel Parkf3136042021-03-10 07:49:11 +0900175 }
176
177 private void setFloatingIpArpResponseRules(KubevirtRouter router,
178 KubevirtFloatingIp floatingIp,
179 KubevirtPort port,
Daniel Park157947f2021-04-09 17:50:53 +0900180 KubevirtNode electedGw,
Daniel Parkf3136042021-03-10 07:49:11 +0900181 boolean install) {
Daniel Parkf3136042021-03-10 07:49:11 +0900182 TrafficSelector selector = DefaultTrafficSelector.builder()
183 .matchInPort(externalPatchPortNum(deviceService, electedGw))
184 .matchEthType(EthType.EtherType.ARP.ethType().toShort())
185 .matchArpOp(ARP.OP_REQUEST)
186 .matchArpTpa(floatingIp.floatingIp().getIp4Address())
187 .build();
188
189 Device device = deviceService.getDevice(electedGw.intgBridge());
190
191 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
192 .extension(RulePopulatorUtil.buildMoveEthSrcToDstExtension(device), device.id())
193 .extension(RulePopulatorUtil.buildMoveArpShaToThaExtension(device), device.id())
194 .extension(RulePopulatorUtil.buildMoveArpSpaToTpaExtension(device), device.id())
195 .setArpOp(ARP.OP_REPLY)
196 .setEthSrc(port.macAddress())
197 .setArpSha(port.macAddress())
198 .setArpSpa(floatingIp.floatingIp().getIp4Address())
199 .setOutput(PortNumber.IN_PORT)
200 .build();
201
202 flowService.setRule(
203 appId,
204 electedGw.intgBridge(),
205 selector,
206 treatment,
207 PRIORITY_ARP_GATEWAY_RULE,
Jian Lif89d9602021-04-27 19:05:49 +0900208 GW_ENTRY_TABLE,
Daniel Parkf3136042021-03-10 07:49:11 +0900209 install);
210 }
Jian Li517597a2021-03-22 11:04:52 +0900211
Daniel Parkf3136042021-03-10 07:49:11 +0900212 private KubevirtPort getKubevirtPort(KubevirtFloatingIp floatingIp) {
213
214 return kubevirtPortService.ports().stream()
215 .filter(port -> port.ipAddress().equals(floatingIp.fixedIp()))
216 .findAny().orElse(null);
217 }
218
219 private void setFloatingIpUpstreamRules(KubevirtRouter router,
220 KubevirtFloatingIp floatingIp,
221 KubevirtPort port,
Daniel Park157947f2021-04-09 17:50:53 +0900222 KubevirtNode electedGw,
Daniel Parkf3136042021-03-10 07:49:11 +0900223 boolean install) {
224
Daniel Parkf3136042021-03-10 07:49:11 +0900225 MacAddress peerMacAddress = router.peerRouter().macAddress();
226
227 if (peerMacAddress == null) {
228 log.warn("Failed to install floating Ip rules for floating ip {} and router {}" +
229 "because there's no peer router mac address", floatingIp.floatingIp(),
230 router.name());
231 return;
232 }
233
234 MacAddress routerMacAddress = getRouterMacAddress(router);
235
236 TrafficSelector selector = DefaultTrafficSelector.builder()
237 .matchEthType(Ethernet.TYPE_IPV4)
238 .matchEthSrc(port.macAddress())
239 .matchEthDst(routerMacAddress)
240 .matchIPSrc(IpPrefix.valueOf(floatingIp.fixedIp(), 32))
241 .build();
242
243
244 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
245 .setEthDst(peerMacAddress)
246 .setEthSrc(port.macAddress())
247 .setIpSrc(floatingIp.floatingIp())
248 .setOutput(externalPatchPortNum(deviceService, electedGw))
249 .build();
250
251 flowService.setRule(
252 appId,
253 electedGw.intgBridge(),
254 selector,
255 treatment,
256 PRIORITY_FLOATING_IP_RULE,
Jian Lif89d9602021-04-27 19:05:49 +0900257 GW_ENTRY_TABLE,
Daniel Parkf3136042021-03-10 07:49:11 +0900258 install);
259 }
260
261 private void setFloatingIpDownstreamRules(KubevirtRouter router,
262 KubevirtFloatingIp floatingIp,
263 KubevirtPort port,
Daniel Park157947f2021-04-09 17:50:53 +0900264 KubevirtNode electedGw,
Daniel Parkf3136042021-03-10 07:49:11 +0900265 boolean install) {
Daniel Parkf3136042021-03-10 07:49:11 +0900266 MacAddress routerMacAddress = getRouterMacAddress(router);
267
268 TrafficSelector selector = DefaultTrafficSelector.builder()
269 .matchEthType(Ethernet.TYPE_IPV4)
270 .matchEthDst(port.macAddress())
271 .matchIPDst(IpPrefix.valueOf(floatingIp.floatingIp(), 32))
272 .build();
273
274 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
275 .setEthSrc(routerMacAddress)
276 .setEthDst(port.macAddress())
277 .setIpDst(floatingIp.fixedIp())
278 .transition(FORWARDING_TABLE)
279 .build();
280
281 flowService.setRule(
282 appId,
283 electedGw.intgBridge(),
284 selector,
285 treatment,
286 PRIORITY_FLOATING_IP_RULE,
Jian Lif89d9602021-04-27 19:05:49 +0900287 GW_ENTRY_TABLE,
Daniel Parkf3136042021-03-10 07:49:11 +0900288 install);
289 }
290
Daniel Parkf3136042021-03-10 07:49:11 +0900291 private void setFloatingIpDownstreamRulesToGatewayTunBridge(KubevirtRouter router,
292 KubevirtFloatingIp floatingIp,
293 KubevirtNetwork network,
294 KubevirtPort port,
295 boolean install) {
296 KubevirtNode electedGw = gatewayNodeForSpecifiedRouter(kubevirtNodeService, router);
297
298 if (electedGw == null) {
299 log.warn("Failed to install floating Ip rules for floating ip {} " +
300 "because there's no gateway assigned to it", floatingIp.floatingIp());
301 return;
302 }
303
304 KubevirtNode workerNode = kubevirtNodeService.node(port.deviceId());
305 if (workerNode == null) {
306 log.warn("Failed to install floating Ip rules for floating ip {} " +
307 "because fail to fine the worker node that the associated port is running on",
308 floatingIp.floatingIp());
Jian Li9793ec42021-03-19 15:03:32 +0900309 return;
Daniel Parkf3136042021-03-10 07:49:11 +0900310 }
311
312 PortNumber tunnelPortNumber = tunnelPort(electedGw, network);
313 if (tunnelPortNumber == null) {
314 return;
315 }
316
Daniel Parkf3136042021-03-10 07:49:11 +0900317 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
318 .matchEthType(Ethernet.TYPE_IPV4)
319 .matchIPDst(IpPrefix.valueOf(port.ipAddress(), 32))
320 .matchEthDst(port.macAddress());
321
322 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
323 .setTunnelId(Long.parseLong(network.segmentId()))
324 .extension(buildExtension(
325 deviceService,
326 electedGw.tunBridge(),
327 workerNode.dataIp().getIp4Address()),
328 electedGw.tunBridge())
329 .setOutput(tunnelPortNumber);
330
331 flowService.setRule(
332 appId,
333 electedGw.tunBridge(),
334 sBuilder.build(),
335 tBuilder.build(),
336 PRIORITY_FORWARDING_RULE,
337 TUNNEL_DEFAULT_TABLE,
338 install);
339 }
340
Daniel Park157947f2021-04-09 17:50:53 +0900341 private void processGarpPacketForFloatingIp(KubevirtFloatingIp floatingIp, KubevirtNode electedGw) {
342
343 if (floatingIp == null) {
344 return;
345 }
346
347 KubevirtPort kubevirtPort = getKubevirtPort(floatingIp);
348 if (kubevirtPort == null) {
349 log.warn("Failed to install floating Ip rules for floating ip {} " +
350 "because there's no kubevirt port associated to it", floatingIp.floatingIp());
351 return;
352 }
353
354 Ethernet ethernet = buildGarpPacket(kubevirtPort.macAddress(), floatingIp.floatingIp());
355 if (ethernet == null) {
356 return;
357 }
358
359 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
360 .setOutput(externalPatchPortNum(deviceService, electedGw)).build();
361
362 packetService.emit(new DefaultOutboundPacket(electedGw.intgBridge(), treatment,
363 ByteBuffer.wrap(ethernet.serialize())));
364 }
365
Daniel Parkf3136042021-03-10 07:49:11 +0900366 private class InternalRouterEventListener implements KubevirtRouterListener {
367 private boolean isRelevantHelper() {
368 return Objects.equals(localNodeId, leadershipService.getLeader(appId.name()));
369 }
370
Daniel Parkf3136042021-03-10 07:49:11 +0900371 @Override
372 public void event(KubevirtRouterEvent event) {
373 switch (event.type()) {
Daniel Parkf3136042021-03-10 07:49:11 +0900374 case KUBEVIRT_FLOATING_IP_ASSOCIATED:
375 eventExecutor.execute(() -> processFloatingIpAssociation(event.subject(),
376 event.floatingIp()));
377 break;
378 case KUBEVIRT_FLOATING_IP_DISASSOCIATED:
379 eventExecutor.execute(() -> processFloatingIpDisassociation(event.subject(),
380 event.floatingIp()));
381 break;
Daniel Park157947f2021-04-09 17:50:53 +0900382 case KUBEVIRT_GATEWAY_NODE_CHANGED:
383 eventExecutor.execute(() -> processRouterGatewayNodeChanged(event.subject(),
384 event.gateway()));
385 break;
Jian Li8f944d42021-03-23 00:43:29 +0900386 case KUBEVIRT_GATEWAY_NODE_ATTACHED:
387 eventExecutor.execute(() -> processGatewayNodeAttachment(event.subject(),
388 event.gateway()));
389 break;
390 case KUBEVIRT_GATEWAY_NODE_DETACHED:
391 eventExecutor.execute(() -> processGatewayNodeDetachment(event.subject(),
392 event.gateway()));
393 break;
Daniel Parkf3136042021-03-10 07:49:11 +0900394 default:
395 //do nothing
396 break;
397 }
398 }
399
Daniel Park157947f2021-04-09 17:50:53 +0900400 private void processRouterGatewayNodeChanged(KubevirtRouter router, String disAssociatedGateway) {
401
402 kubevirtRouterService.floatingIps()
403 .stream()
404 .filter(fip -> fip.routerName().equals(router.name())).forEach(fip -> {
405 KubevirtNode oldGw = kubevirtNodeService.node(disAssociatedGateway);
406 if (oldGw == null) {
407 return;
408 }
409
410 KubevirtNode newGw = kubevirtNodeService.node(router.electedGateway());
411 if (newGw == null) {
412 return;
413 }
414
415 setFloatingIpRulesForFip(router, fip, oldGw, false);
416
417 setFloatingIpRulesForFip(router, fip, newGw, true);
418 processGarpPacketForFloatingIp(fip, newGw);
419
420 });
421 }
422
Jian Li8f944d42021-03-23 00:43:29 +0900423 private void processGatewayNodeAttachment(KubevirtRouter router, String gatewayName) {
424 kubevirtRouterService.floatingIps().forEach(fip -> {
425 if (fip.routerName().equals(router.name())) {
426 KubevirtNode gw = kubevirtNodeService.node(gatewayName);
427 if (gw != null) {
428 setFloatingIpRulesForFip(router, fip, gw, true);
429 }
430 }
431 });
432 }
433
434 private void processGatewayNodeDetachment(KubevirtRouter router, String gatewayName) {
435 kubevirtRouterService.floatingIps().forEach(fip -> {
436 if (fip.routerName().equals(router.name())) {
437 KubevirtNode gw = kubevirtNodeService.node(gatewayName);
438 if (gw != null) {
439 setFloatingIpRulesForFip(router, fip, gw, false);
440 }
441 }
442 });
443 }
444
Daniel Parkf3136042021-03-10 07:49:11 +0900445 private void processFloatingIpAssociation(KubevirtRouter router, KubevirtFloatingIp floatingIp) {
Daniel Park157947f2021-04-09 17:50:53 +0900446 if (!isRelevantHelper() || router.electedGateway() == null) {
Daniel Parkf3136042021-03-10 07:49:11 +0900447 return;
448 }
Daniel Park157947f2021-04-09 17:50:53 +0900449
450 KubevirtNode electedGw = kubevirtNodeService.node(router.electedGateway());
451
452 if (electedGw == null) {
453 return;
454 }
455
456 processGarpPacketForFloatingIp(floatingIp, electedGw);
457 setFloatingIpRulesForFip(router, floatingIp, electedGw, true);
Daniel Parkf3136042021-03-10 07:49:11 +0900458 }
459
460 private void processFloatingIpDisassociation(KubevirtRouter router, KubevirtFloatingIp floatingIp) {
Daniel Park157947f2021-04-09 17:50:53 +0900461 if (!isRelevantHelper() || router.electedGateway() == null) {
Daniel Parkf3136042021-03-10 07:49:11 +0900462 return;
463 }
Daniel Park157947f2021-04-09 17:50:53 +0900464
465 KubevirtNode electedGw = kubevirtNodeService.node(router.electedGateway());
466
467 if (electedGw == null) {
468 return;
469 }
470 setFloatingIpRulesForFip(router, floatingIp, electedGw, false);
Daniel Parkf3136042021-03-10 07:49:11 +0900471 }
472 }
Jian Li394bef52021-05-27 18:53:45 +0900473
474 private class InternalNodeListener implements KubevirtNodeListener {
475 private boolean isRelevantHelper() {
476 return Objects.equals(localNodeId, leadershipService.getLeader(appId.name()));
477 }
478
479 @Override
480 public void event(KubevirtNodeEvent event) {
481 switch (event.type()) {
482 case KUBEVIRT_NODE_COMPLETE:
483 eventExecutor.execute(() -> processNodeCompletion(event.subject()));
484 break;
485 default:
486 break;
487 }
488 }
489
490 private void processNodeCompletion(KubevirtNode node) {
491 if (!isRelevantHelper()) {
492 return;
493 }
494
495 for (KubevirtFloatingIp fip : kubevirtRouterService.floatingIps()) {
496 KubevirtRouter router = kubevirtRouterService.router(fip.routerName());
497 if (router == null) {
498 log.warn("The router {} is not found", fip.routerName());
499 continue;
500 }
501
502 if (node.hostname().equals(router.electedGateway())) {
503 setFloatingIpRulesForFip(router, fip, node, true);
504 log.info("Configure floating IP {} on gateway {}",
505 fip.floatingIp().toString(), node.hostname());
506 }
507 }
508 }
509 }
Daniel Parkf3136042021-03-10 07:49:11 +0900510}