blob: 99ccbd93912dd00e0fdce389954003227f681e87 [file] [log] [blame]
Jian Li4aa17642019-01-30 00:01:11 +09001/*
2 * Copyright 2019-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.k8snetworking.impl;
17
18import com.google.common.base.Strings;
19import org.onlab.packet.Ethernet;
Jian Li2cc2b632019-02-18 00:56:40 +090020import org.onlab.packet.IpPrefix;
Jian Li4aa17642019-01-30 00:01:11 +090021import org.onosproject.cfg.ComponentConfigService;
22import org.onosproject.cfg.ConfigProperty;
Jian Lieb488ea2019-04-16 01:50:02 +090023import org.onosproject.cluster.ClusterService;
Jian Li4aa17642019-01-30 00:01:11 +090024import org.onosproject.cluster.LeadershipService;
Jian Lieb488ea2019-04-16 01:50:02 +090025import org.onosproject.cluster.NodeId;
Jian Li4aa17642019-01-30 00:01:11 +090026import org.onosproject.core.ApplicationId;
27import org.onosproject.core.CoreService;
28import org.onosproject.k8snetworking.api.K8sFlowRuleService;
29import org.onosproject.k8snetworking.api.K8sNetwork;
30import org.onosproject.k8snetworking.api.K8sNetworkEvent;
31import org.onosproject.k8snetworking.api.K8sNetworkListener;
32import org.onosproject.k8snetworking.api.K8sNetworkService;
33import org.onosproject.k8snetworking.api.K8sPort;
34import org.onosproject.k8snode.api.K8sNode;
Jian Lieb488ea2019-04-16 01:50:02 +090035import org.onosproject.k8snode.api.K8sNodeEvent;
36import org.onosproject.k8snode.api.K8sNodeListener;
Jian Li4aa17642019-01-30 00:01:11 +090037import org.onosproject.k8snode.api.K8sNodeService;
38import org.onosproject.mastership.MastershipService;
Jian Li4b5048a2020-10-08 02:57:45 +090039import org.onosproject.net.DeviceId;
Jian Li4aa17642019-01-30 00:01:11 +090040import org.onosproject.net.PortNumber;
41import org.onosproject.net.device.DeviceService;
42import org.onosproject.net.driver.DriverService;
43import org.onosproject.net.flow.DefaultTrafficSelector;
44import org.onosproject.net.flow.DefaultTrafficTreatment;
45import org.onosproject.net.flow.TrafficSelector;
46import org.onosproject.net.flow.TrafficTreatment;
47import org.osgi.service.component.annotations.Activate;
48import org.osgi.service.component.annotations.Component;
49import org.osgi.service.component.annotations.Deactivate;
50import org.osgi.service.component.annotations.Reference;
51import org.osgi.service.component.annotations.ReferenceCardinality;
52import org.slf4j.Logger;
53
Jian Lieb488ea2019-04-16 01:50:02 +090054import java.util.Objects;
Jian Li4aa17642019-01-30 00:01:11 +090055import java.util.Set;
56import java.util.concurrent.ExecutorService;
57
58import static java.util.concurrent.Executors.newSingleThreadExecutor;
59import static org.onlab.util.Tools.groupedThreads;
Jian Li4aa17642019-01-30 00:01:11 +090060import static org.onosproject.k8snetworking.api.Constants.ARP_BROADCAST_MODE;
61import static org.onosproject.k8snetworking.api.Constants.ARP_TABLE;
62import static org.onosproject.k8snetworking.api.Constants.FORWARDING_TABLE;
Jian Lie1a5b8f2019-07-23 17:13:19 +090063import static org.onosproject.k8snetworking.api.Constants.JUMP_TABLE;
Jian Li4aa17642019-01-30 00:01:11 +090064import static org.onosproject.k8snetworking.api.Constants.K8S_NETWORKING_APP_ID;
Jian Li619fa282020-09-02 14:45:35 +090065import static org.onosproject.k8snetworking.api.Constants.PRIORITY_DEFAULT_RULE;
Jian Li4aa17642019-01-30 00:01:11 +090066import static org.onosproject.k8snetworking.api.Constants.PRIORITY_SWITCHING_RULE;
67import static org.onosproject.k8snetworking.api.Constants.PRIORITY_TUNNEL_TAG_RULE;
Jian Li619fa282020-09-02 14:45:35 +090068import static org.onosproject.k8snetworking.api.Constants.TUN_ENTRY_TABLE;
Jian Li4aa17642019-01-30 00:01:11 +090069import static org.onosproject.k8snetworking.api.Constants.VTAG_TABLE;
Jian Li732c3422020-09-07 17:01:11 +090070import static org.onosproject.k8snetworking.api.K8sNetwork.Type.GENEVE;
71import static org.onosproject.k8snetworking.api.K8sNetwork.Type.GRE;
72import static org.onosproject.k8snetworking.api.K8sNetwork.Type.VXLAN;
Jian Li4aa17642019-01-30 00:01:11 +090073import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.getPropertyValue;
74import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.tunnelPortNumByNetId;
Jian Li732c3422020-09-07 17:01:11 +090075import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.tunnelPortNumByNetType;
Jian Li4aa17642019-01-30 00:01:11 +090076import static org.onosproject.k8snetworking.util.RulePopulatorUtil.buildExtension;
77import static org.slf4j.LoggerFactory.getLogger;
78
79/**
80 * Populates switching flow rules on OVS for the basic connectivity among the
81 * container in the same network.
82 */
83@Component(immediate = true)
84public class K8sSwitchingHandler {
85
86 private final Logger log = getLogger(getClass());
87
88 private static final String ARP_MODE = "arpMode";
89 private static final String ERR_SET_FLOWS_VNI = "Failed to set flows for " +
90 "%s: Failed to get VNI for %s";
91 private static final String STR_NONE = "<none>";
92
93 @Reference(cardinality = ReferenceCardinality.MANDATORY)
94 protected CoreService coreService;
95
96 @Reference(cardinality = ReferenceCardinality.MANDATORY)
97 protected MastershipService mastershipService;
98
99 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Lieb488ea2019-04-16 01:50:02 +0900100 protected ClusterService clusterService;
101
102 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Li4aa17642019-01-30 00:01:11 +0900103 protected DeviceService deviceService;
104
105 @Reference(cardinality = ReferenceCardinality.MANDATORY)
106 protected DriverService driverService;
107
108 @Reference(cardinality = ReferenceCardinality.MANDATORY)
109 protected ComponentConfigService configService;
110
111 @Reference(cardinality = ReferenceCardinality.MANDATORY)
112 protected LeadershipService leadershipService;
113
114 @Reference(cardinality = ReferenceCardinality.MANDATORY)
115 protected K8sFlowRuleService k8sFlowRuleService;
116
117 @Reference(cardinality = ReferenceCardinality.MANDATORY)
118 protected K8sNetworkService k8sNetworkService;
119
120 @Reference(cardinality = ReferenceCardinality.MANDATORY)
121 protected K8sNodeService k8sNodeService;
122
123 private final ExecutorService eventExecutor = newSingleThreadExecutor(
124 groupedThreads(this.getClass().getSimpleName(), "event-handler"));
125 private final InternalK8sNetworkListener k8sNetworkListener =
126 new InternalK8sNetworkListener();
Jian Lieb488ea2019-04-16 01:50:02 +0900127 private final InternalK8sNodeListener k8sNodeListener =
128 new InternalK8sNodeListener();
Jian Li4aa17642019-01-30 00:01:11 +0900129
130 private ApplicationId appId;
Jian Lieb488ea2019-04-16 01:50:02 +0900131 private NodeId localNodeId;
Jian Li4aa17642019-01-30 00:01:11 +0900132
133 @Activate
134 protected void activate() {
135 appId = coreService.registerApplication(K8S_NETWORKING_APP_ID);
136 k8sNetworkService.addListener(k8sNetworkListener);
Jian Lieb488ea2019-04-16 01:50:02 +0900137 localNodeId = clusterService.getLocalNode().id();
138 k8sNodeService.addListener(k8sNodeListener);
139 leadershipService.runForLeadership(appId.name());
Jian Li4aa17642019-01-30 00:01:11 +0900140
Jian Li2cc2b632019-02-18 00:56:40 +0900141 setGatewayRulesForTunnel(true);
142
Jian Li4aa17642019-01-30 00:01:11 +0900143 log.info("Started");
144 }
145
146 @Deactivate
147 protected void deactivate() {
Jian Lieb488ea2019-04-16 01:50:02 +0900148 leadershipService.withdraw(appId.name());
149 k8sNodeService.removeListener(k8sNodeListener);
Jian Li4aa17642019-01-30 00:01:11 +0900150 k8sNetworkService.removeListener(k8sNetworkListener);
151 eventExecutor.shutdown();
152
Jian Li2cc2b632019-02-18 00:56:40 +0900153 setGatewayRulesForTunnel(false);
154
Jian Li4aa17642019-01-30 00:01:11 +0900155 log.info("Stopped");
156 }
157
158 /**
159 * Configures the flow rules which are used for L2 packet switching.
Jian Li619fa282020-09-02 14:45:35 +0900160 * Note that these rules will be inserted in switching table (table 80).
Jian Li4aa17642019-01-30 00:01:11 +0900161 *
162 * @param port kubernetes port object
163 * @param install install flag, add the rule if true, remove it otherwise
164 */
165 private void setForwardingRulesForTunnel(K8sPort port, boolean install) {
166 // switching rules for the instPorts in the same node
167 TrafficSelector selector = DefaultTrafficSelector.builder()
168 // TODO: need to handle IPv6 in near future
169 .matchEthType(Ethernet.TYPE_IPV4)
170 .matchIPDst(port.ipAddress().toIpPrefix())
Jian Li619fa282020-09-02 14:45:35 +0900171 // .matchTunnelId(getVni(port))
Jian Li4aa17642019-01-30 00:01:11 +0900172 .build();
173
174 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
175 .setEthDst(port.macAddress())
176 .setOutput(port.portNumber())
177 .build();
178
179 k8sFlowRuleService.setRule(
180 appId,
181 port.deviceId(),
182 selector,
183 treatment,
184 PRIORITY_SWITCHING_RULE,
185 FORWARDING_TABLE,
186 install);
187
188 // switching rules for the node in the remote node
189 K8sNode localNode = k8sNodeService.node(port.deviceId());
190 if (localNode == null) {
191 final String error = String.format("Cannot find kubernetes node for %s",
192 port.deviceId());
193 throw new IllegalStateException(error);
194 }
195 k8sNodeService.completeNodes().stream()
196 .filter(remoteNode -> !remoteNode.intgBridge().equals(localNode.intgBridge()))
197 .forEach(remoteNode -> {
Jian Li619fa282020-09-02 14:45:35 +0900198 TrafficTreatment treatmentToTunnel = DefaultTrafficTreatment.builder()
199 .setOutput(remoteNode.intgToTunPortNum())
Jian Li4aa17642019-01-30 00:01:11 +0900200 .build();
201
202 k8sFlowRuleService.setRule(
203 appId,
204 remoteNode.intgBridge(),
205 selector,
Jian Li619fa282020-09-02 14:45:35 +0900206 treatmentToTunnel,
Jian Li4aa17642019-01-30 00:01:11 +0900207 PRIORITY_SWITCHING_RULE,
208 FORWARDING_TABLE,
209 install);
Jian Li619fa282020-09-02 14:45:35 +0900210
211 PortNumber portNum = tunnelPortNumByNetId(port.networkId(),
212 k8sNetworkService, remoteNode);
213
214 TrafficTreatment treatmentToRemote = DefaultTrafficTreatment.builder()
215 .extension(buildExtension(
216 deviceService,
217 remoteNode.tunBridge(),
218 localNode.dataIp().getIp4Address()),
219 remoteNode.tunBridge())
220 .setTunnelId(getVni(port))
221 .setOutput(portNum)
222 .build();
223
224 k8sFlowRuleService.setRule(
225 appId,
226 remoteNode.tunBridge(),
227 selector,
228 treatmentToRemote,
229 PRIORITY_DEFAULT_RULE,
230 TUN_ENTRY_TABLE,
231 install);
Jian Li4aa17642019-01-30 00:01:11 +0900232 });
233 }
234
Jian Li619fa282020-09-02 14:45:35 +0900235 private void setRulesForTunnelBridge(K8sNode node, boolean install) {
Jian Li732c3422020-09-07 17:01:11 +0900236 setRulesForTunnelBridgeByType(node, VXLAN, install);
237 setRulesForTunnelBridgeByType(node, GRE, install);
238 setRulesForTunnelBridgeByType(node, GENEVE, install);
Jian Li619fa282020-09-02 14:45:35 +0900239 }
240
241 private void setRulesForTunnelBridgeByType(K8sNode node, K8sNetwork.Type type, boolean install) {
242
243 PortNumber portNum;
244
245 switch (type) {
246 case VXLAN:
Jian Li732c3422020-09-07 17:01:11 +0900247 portNum = tunnelPortNumByNetType(VXLAN, node);
Jian Li619fa282020-09-02 14:45:35 +0900248 break;
249 case GRE:
Jian Li732c3422020-09-07 17:01:11 +0900250 portNum = tunnelPortNumByNetType(GRE, node);
Jian Li619fa282020-09-02 14:45:35 +0900251 break;
252 case GENEVE:
Jian Li732c3422020-09-07 17:01:11 +0900253 portNum = tunnelPortNumByNetType(GENEVE, node);
Jian Li619fa282020-09-02 14:45:35 +0900254 break;
255 default:
256 return;
257 }
258
259 TrafficSelector inboundSelector = DefaultTrafficSelector.builder()
260 .matchInPort(portNum)
261 .build();
262
263 TrafficTreatment inboundTreatment = DefaultTrafficTreatment.builder()
264 .setOutput(node.tunToIntgPortNum())
265 .build();
266
267 k8sFlowRuleService.setRule(
268 appId,
269 node.tunBridge(),
270 inboundSelector,
271 inboundTreatment,
272 PRIORITY_DEFAULT_RULE,
273 TUN_ENTRY_TABLE,
274 install);
275 }
276
277
Jian Li4aa17642019-01-30 00:01:11 +0900278 private void setTunnelTagArpFlowRules(K8sPort port, boolean install) {
279 setTunnelTagFlowRules(port, Ethernet.TYPE_ARP, install);
280 }
281
282 private void setTunnelTagIpFlowRules(K8sPort port, boolean install) {
283 setTunnelTagFlowRules(port, Ethernet.TYPE_IPV4, install);
284 }
285
286 private void setNetworkRulesForTunnel(K8sPort port, boolean install) {
287 setTunnelTagIpFlowRules(port, install);
288 setForwardingRulesForTunnel(port, install);
289
290 if (ARP_BROADCAST_MODE.equals(getArpMode())) {
291 setTunnelTagArpFlowRules(port, install);
292 }
293 }
294
295 /**
296 * Configures the flow rule which is for using VXLAN/GRE/GENEVE to tag the packet
297 * based on the in_port number of a virtual instance.
298 * Note that this rule will be inserted in vTag table.
299 *
300 * @param port kubernetes port object
301 * @param install install flag, add the rule if true, remove it otherwise
302 */
303 private void setTunnelTagFlowRules(K8sPort port, short ethType, boolean install) {
304 TrafficSelector selector = DefaultTrafficSelector.builder()
305 .matchEthType(ethType)
306 .matchInPort(port.portNumber())
307 .build();
308
309 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
310 .setTunnelId(getVni(port));
311
Jian Li4aa17642019-01-30 00:01:11 +0900312 if (ethType == Ethernet.TYPE_ARP) {
313 tBuilder.transition(ARP_TABLE);
314 } else if (ethType == Ethernet.TYPE_IPV4) {
Jian Li73d3b6a2019-07-08 18:07:53 +0900315 tBuilder.transition(JUMP_TABLE);
Jian Li4aa17642019-01-30 00:01:11 +0900316 }
317
318 k8sFlowRuleService.setRule(
319 appId,
320 port.deviceId(),
321 selector,
322 tBuilder.build(),
323 PRIORITY_TUNNEL_TAG_RULE,
324 VTAG_TABLE,
325 install);
326 }
327
Jian Lieb488ea2019-04-16 01:50:02 +0900328 private void setExtToIntgTunnelTagFlowRules(K8sNode k8sNode, boolean install) {
329 TrafficSelector selector = DefaultTrafficSelector.builder()
330 .matchEthType(Ethernet.TYPE_IPV4)
Jian Lieb488ea2019-04-16 01:50:02 +0900331 .matchInPort(k8sNode.intgToExtPatchPortNum())
332 .build();
333
334 K8sNetwork net = k8sNetworkService.network(k8sNode.hostname());
335
336 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
337 .setTunnelId(Long.valueOf(net.segmentId()))
Jian Li73d3b6a2019-07-08 18:07:53 +0900338 .transition(JUMP_TABLE);
Jian Lieb488ea2019-04-16 01:50:02 +0900339
340 k8sFlowRuleService.setRule(
341 appId,
342 k8sNode.intgBridge(),
343 selector,
344 tBuilder.build(),
345 PRIORITY_TUNNEL_TAG_RULE,
346 VTAG_TABLE,
347 install);
348 }
349
350 private void setLocalTunnelTagFlowRules(K8sNode k8sNode, boolean install) {
351 TrafficSelector selector = DefaultTrafficSelector.builder()
352 .matchEthType(Ethernet.TYPE_IPV4)
Jian Li019ce6a2020-09-09 10:23:21 +0900353 .matchInPort(k8sNode.intgEntryPortNum())
Jian Lieb488ea2019-04-16 01:50:02 +0900354 .build();
355
356 K8sNetwork net = k8sNetworkService.network(k8sNode.hostname());
357
358 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
359 .setTunnelId(Long.valueOf(net.segmentId()))
Jian Li73d3b6a2019-07-08 18:07:53 +0900360 .transition(JUMP_TABLE);
Jian Lieb488ea2019-04-16 01:50:02 +0900361
362 k8sFlowRuleService.setRule(
363 appId,
364 k8sNode.intgBridge(),
365 selector,
366 tBuilder.build(),
367 PRIORITY_TUNNEL_TAG_RULE,
368 VTAG_TABLE,
369 install);
370 }
371
Jian Li2cc2b632019-02-18 00:56:40 +0900372 private void setGatewayRulesForTunnel(boolean install) {
373 k8sNetworkService.networks().forEach(n -> {
374 // switching rules for the instPorts in the same node
375 TrafficSelector selector = DefaultTrafficSelector.builder()
376 // TODO: need to handle IPv6 in near future
377 .matchEthType(Ethernet.TYPE_IPV4)
378 .matchIPDst(IpPrefix.valueOf(n.gatewayIp(), 32))
379 .matchTunnelId(Long.valueOf(n.segmentId()))
380 .build();
381
382 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
383 .setOutput(PortNumber.LOCAL)
384 .build();
385
386 // FIXME: need to find a way to install the gateway rules into
387 // right OVS
388 k8sNodeService.completeNodes().forEach(node -> {
389 k8sFlowRuleService.setRule(
390 appId,
391 node.intgBridge(),
392 selector,
393 treatment,
394 PRIORITY_SWITCHING_RULE,
395 FORWARDING_TABLE,
396 install);
397 });
398 });
399 }
400
Jian Li4aa17642019-01-30 00:01:11 +0900401 /**
402 * Obtains the VNI from the given kubernetes port.
403 *
404 * @param port kubernetes port object
405 * @return Virtual Network Identifier (VNI)
406 */
407 private Long getVni(K8sPort port) {
408 K8sNetwork k8sNet = k8sNetworkService.network(port.networkId());
409 if (k8sNet == null || Strings.isNullOrEmpty(k8sNet.segmentId())) {
410 final String error =
411 String.format(ERR_SET_FLOWS_VNI,
412 port, k8sNet == null ? STR_NONE : k8sNet.name());
413 throw new IllegalStateException(error);
414 }
415 return Long.valueOf(k8sNet.segmentId());
416 }
417
418 private void setNetworkRules(K8sPort port, boolean install) {
419 K8sNetwork k8sNet = k8sNetworkService.network(port.networkId());
420
421 if (k8sNet == null) {
Jian Li2cc2b632019-02-18 00:56:40 +0900422 log.warn("Network {} is not found from port {}.",
423 port.networkId(), port.portId());
Jian Li4aa17642019-01-30 00:01:11 +0900424 return;
425 }
426
427 switch (k8sNet.type()) {
428 case VXLAN:
429 case GRE:
430 case GENEVE:
431 setNetworkRulesForTunnel(port, install);
432 break;
433 default:
Jian Li2cc2b632019-02-18 00:56:40 +0900434 log.warn("The given network type {} is not supported.",
435 k8sNet.type().name());
Jian Li4aa17642019-01-30 00:01:11 +0900436 break;
437 }
438 }
439
440 private String getArpMode() {
441 Set<ConfigProperty> properties =
442 configService.getProperties(K8sSwitchingArpHandler.class.getName());
443 return getPropertyValue(properties, ARP_MODE);
444 }
445
446 private class InternalK8sNetworkListener implements K8sNetworkListener {
447
448 private boolean isRelevantHelper(K8sNetworkEvent event) {
Jian Li4b5048a2020-10-08 02:57:45 +0900449 DeviceId deviceId = event.port().deviceId();
450 if (deviceId == null) {
451 return false;
452 } else {
453 return mastershipService.isLocalMaster(deviceId);
454 }
Jian Li4aa17642019-01-30 00:01:11 +0900455 }
456
457 @Override
458 public void event(K8sNetworkEvent event) {
459 switch (event.type()) {
460 case K8S_PORT_ACTIVATED:
461 eventExecutor.execute(() -> processInstanceDetection(event));
462 break;
463 case K8S_PORT_REMOVED:
464 eventExecutor.execute(() -> processInstanceRemoval(event));
465 break;
466 default:
467 break;
468 }
469 }
470
471 private void processInstanceDetection(K8sNetworkEvent event) {
472 if (!isRelevantHelper(event)) {
473 return;
474 }
475
476 setNetworkRules(event.port(), true);
477 }
478
479 private void processInstanceRemoval(K8sNetworkEvent event) {
480 if (!isRelevantHelper(event)) {
481 return;
482 }
483
484 setNetworkRules(event.port(), false);
485 }
486 }
Jian Lieb488ea2019-04-16 01:50:02 +0900487
488 private class InternalK8sNodeListener implements K8sNodeListener {
489
490 private boolean isRelevantHelper() {
491 return Objects.equals(localNodeId, leadershipService.getLeader(appId.name()));
492 }
493
494 @Override
495 public void event(K8sNodeEvent event) {
496 switch (event.type()) {
497 case K8S_NODE_COMPLETE:
498 eventExecutor.execute(() -> processNodeCompletion(event.subject()));
499 break;
Jian Lidc1df642020-11-25 16:49:34 +0900500 case K8S_NODE_OFF_BOARDED:
501 eventExecutor.execute(() -> processNodeOffboard(event.subject()));
Jian Lieb488ea2019-04-16 01:50:02 +0900502 default:
503 break;
504 }
505 }
506
507 private void processNodeCompletion(K8sNode k8sNode) {
508 if (!isRelevantHelper()) {
509 return;
510 }
511
512 setExtToIntgTunnelTagFlowRules(k8sNode, true);
513 setLocalTunnelTagFlowRules(k8sNode, true);
Jian Li619fa282020-09-02 14:45:35 +0900514 setRulesForTunnelBridge(k8sNode, true);
Jian Lieb488ea2019-04-16 01:50:02 +0900515 }
Jian Lidc1df642020-11-25 16:49:34 +0900516
517 private void processNodeOffboard(K8sNode k8sNode) {
518 if (!isRelevantHelper()) {
519 return;
520 }
521
522 setRulesForTunnelBridge(k8sNode, false);
523 }
Jian Lieb488ea2019-04-16 01:50:02 +0900524 }
Jian Li4aa17642019-01-30 00:01:11 +0900525}