blob: 9613bef1f73c819624ec9fce63b1d58877ba3739 [file] [log] [blame]
Jian Li49109b52019-01-22 00:17:28 +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.k8snode.api;
17
18import com.google.common.base.MoreObjects;
Jian Lie2a04ce2020-07-01 19:07:02 +090019import org.apache.commons.lang.StringUtils;
Jian Li49109b52019-01-22 00:17:28 +090020import org.onlab.osgi.DefaultServiceDirectory;
21import org.onlab.packet.IpAddress;
Jian Li7d111d72019-04-12 13:58:44 +090022import org.onlab.packet.MacAddress;
Jian Lie2a04ce2020-07-01 19:07:02 +090023import org.onosproject.k8snode.api.K8sApiConfig.Mode;
Jian Li2778ffa2019-05-07 13:21:52 +090024import org.onosproject.net.Annotations;
Jian Li49109b52019-01-22 00:17:28 +090025import org.onosproject.net.DeviceId;
26import org.onosproject.net.Port;
27import org.onosproject.net.PortNumber;
28import org.onosproject.net.device.DeviceService;
29
30import java.util.Objects;
Jian Lie2a04ce2020-07-01 19:07:02 +090031import java.util.UUID;
Jian Li49109b52019-01-22 00:17:28 +090032
33import static com.google.common.base.Preconditions.checkArgument;
Jian Lie2a04ce2020-07-01 19:07:02 +090034import static org.onosproject.k8snode.api.Constants.DEFAULT_CLUSTER_NAME;
Jian Lic2242bd2020-09-03 13:12:14 +090035import static org.onosproject.k8snode.api.Constants.DEFAULT_EXTERNAL_BRIDGE_MAC;
36import static org.onosproject.k8snode.api.Constants.DEFAULT_EXTERNAL_GATEWAY_MAC;
Jian Li019ce6a2020-09-09 10:23:21 +090037import static org.onosproject.k8snode.api.Constants.DEFAULT_INTG_BRIDGE_MAC;
Jian Lieb488ea2019-04-16 01:50:02 +090038import static org.onosproject.k8snode.api.Constants.EXTERNAL_BRIDGE;
Jian Li019ce6a2020-09-09 10:23:21 +090039import static org.onosproject.k8snode.api.Constants.EXTERNAL_TO_ROUTER;
Jian Li49109b52019-01-22 00:17:28 +090040import static org.onosproject.k8snode.api.Constants.GENEVE_TUNNEL;
41import static org.onosproject.k8snode.api.Constants.GRE_TUNNEL;
Jian Li4aa17642019-01-30 00:01:11 +090042import static org.onosproject.k8snode.api.Constants.INTEGRATION_BRIDGE;
Jian Lieb488ea2019-04-16 01:50:02 +090043import static org.onosproject.k8snode.api.Constants.INTEGRATION_TO_EXTERNAL_BRIDGE;
Jian Li1a2eb5d2019-08-27 02:07:05 +090044import static org.onosproject.k8snode.api.Constants.INTEGRATION_TO_LOCAL_BRIDGE;
Jian Lie2a04ce2020-07-01 19:07:02 +090045import static org.onosproject.k8snode.api.Constants.INTEGRATION_TO_TUN_BRIDGE;
Jian Lia4d8fba2020-09-10 23:16:50 +090046import static org.onosproject.k8snode.api.Constants.K8S_EXTERNAL_TO_OS_BRIDGE;
47import static org.onosproject.k8snode.api.Constants.K8S_INTEGRATION_TO_OS_BRIDGE;
Jian Lie2a04ce2020-07-01 19:07:02 +090048import static org.onosproject.k8snode.api.Constants.LOCAL_BRIDGE;
Jian Li1a2eb5d2019-08-27 02:07:05 +090049import static org.onosproject.k8snode.api.Constants.LOCAL_TO_INTEGRATION_BRIDGE;
Jian Lia4d8fba2020-09-10 23:16:50 +090050import static org.onosproject.k8snode.api.Constants.OS_TO_K8S_EXTERNAL_BRIDGE;
51import static org.onosproject.k8snode.api.Constants.OS_TO_K8S_INTEGRATION_BRIDGE;
Jian Lieb488ea2019-04-16 01:50:02 +090052import static org.onosproject.k8snode.api.Constants.PHYSICAL_EXTERNAL_BRIDGE;
Jian Li019ce6a2020-09-09 10:23:21 +090053import static org.onosproject.k8snode.api.Constants.ROUTER;
54import static org.onosproject.k8snode.api.Constants.ROUTER_TO_EXTERNAL;
Jian Lie2a04ce2020-07-01 19:07:02 +090055import static org.onosproject.k8snode.api.Constants.TUNNEL_BRIDGE;
56import static org.onosproject.k8snode.api.Constants.TUN_TO_INTEGRATION_BRIDGE;
Jian Li49109b52019-01-22 00:17:28 +090057import static org.onosproject.k8snode.api.Constants.VXLAN_TUNNEL;
Jian Lie2a04ce2020-07-01 19:07:02 +090058import static org.onosproject.k8snode.api.K8sApiConfig.Mode.NORMAL;
59import static org.onosproject.k8snode.api.K8sApiConfig.Mode.PASSTHROUGH;
Jian Li49109b52019-01-22 00:17:28 +090060import static org.onosproject.net.AnnotationKeys.PORT_NAME;
61
62/**
63 * Representation of a kubernetes node.
64 */
65public class DefaultK8sNode implements K8sNode {
66
Jian Li2778ffa2019-05-07 13:21:52 +090067 private static final String PORT_MAC = "portMac";
Jian Lie2a04ce2020-07-01 19:07:02 +090068 private static final String FLOW_KEY = "flow";
Jian Li7d111d72019-04-12 13:58:44 +090069
Jian Lie2a04ce2020-07-01 19:07:02 +090070 private static final int SHORT_NAME_LENGTH = 10;
71
72 private final String clusterName;
Jian Li49109b52019-01-22 00:17:28 +090073 private final String hostname;
74 private final Type type;
Jian Lie2a04ce2020-07-01 19:07:02 +090075 private final int segmentId;
76 private final Mode mode;
Jian Li49109b52019-01-22 00:17:28 +090077 private final DeviceId intgBridge;
Jian Libf562c22019-04-15 18:07:14 +090078 private final DeviceId extBridge;
Jian Li1a2eb5d2019-08-27 02:07:05 +090079 private final DeviceId localBridge;
Jian Lie2a04ce2020-07-01 19:07:02 +090080 private final DeviceId tunBridge;
Jian Li49109b52019-01-22 00:17:28 +090081 private final IpAddress managementIp;
82 private final IpAddress dataIp;
83 private final K8sNodeState state;
Jian Li0c632722019-05-08 15:58:04 +090084 private final String extIntf;
Jian Lie2a04ce2020-07-01 19:07:02 +090085 private final K8sExternalNetwork extNetwork;
Jian Li0c632722019-05-08 15:58:04 +090086 private final String podCidr;
Jian Li49109b52019-01-22 00:17:28 +090087
88 private static final String NOT_NULL_MSG = "Node % cannot be null";
89
90 private static final String OVSDB = "ovsdb:";
91
92 /**
93 * A default constructor of kubernetes Node.
94 *
Jian Lie2a04ce2020-07-01 19:07:02 +090095 * @param clusterName clusterName
Jian Li49109b52019-01-22 00:17:28 +090096 * @param hostname hostname
97 * @param type node type
Jian Lie2a04ce2020-07-01 19:07:02 +090098 * @param segmentId segment identifier
99 * @param mode CNI running mode
Jian Li49109b52019-01-22 00:17:28 +0900100 * @param intgBridge integration bridge
Jian Libf562c22019-04-15 18:07:14 +0900101 * @param extBridge external bridge
Jian Li1a2eb5d2019-08-27 02:07:05 +0900102 * @param localBridge local bridge
Jian Lie2a04ce2020-07-01 19:07:02 +0900103 * @param tunBridge tunnel bridge
Jian Li0c632722019-05-08 15:58:04 +0900104 * @param extIntf external interface
Jian Li49109b52019-01-22 00:17:28 +0900105 * @param managementIp management IP address
106 * @param dataIp data IP address
107 * @param state node state
Jian Lie2a04ce2020-07-01 19:07:02 +0900108 * @param extNetwork external network
Jian Li0c632722019-05-08 15:58:04 +0900109 * @param podCidr POD CIDR
Jian Li49109b52019-01-22 00:17:28 +0900110 */
Jian Lie2a04ce2020-07-01 19:07:02 +0900111 protected DefaultK8sNode(String clusterName, String hostname, Type type,
112 int segmentId, Mode mode, DeviceId intgBridge,
Jian Li1a2eb5d2019-08-27 02:07:05 +0900113 DeviceId extBridge, DeviceId localBridge,
Jian Lie2a04ce2020-07-01 19:07:02 +0900114 DeviceId tunBridge, String extIntf, IpAddress managementIp,
Jian Li1a2eb5d2019-08-27 02:07:05 +0900115 IpAddress dataIp, K8sNodeState state,
Jian Lie2a04ce2020-07-01 19:07:02 +0900116 K8sExternalNetwork extNetwork, String podCidr) {
117 this.clusterName = clusterName;
Jian Li49109b52019-01-22 00:17:28 +0900118 this.hostname = hostname;
119 this.type = type;
Jian Lie2a04ce2020-07-01 19:07:02 +0900120 this.mode = mode;
121 this.segmentId = segmentId;
Jian Li49109b52019-01-22 00:17:28 +0900122 this.intgBridge = intgBridge;
Jian Libf562c22019-04-15 18:07:14 +0900123 this.extBridge = extBridge;
Jian Li1a2eb5d2019-08-27 02:07:05 +0900124 this.localBridge = localBridge;
Jian Lie2a04ce2020-07-01 19:07:02 +0900125 this.tunBridge = tunBridge;
Jian Li0c632722019-05-08 15:58:04 +0900126 this.extIntf = extIntf;
Jian Li49109b52019-01-22 00:17:28 +0900127 this.managementIp = managementIp;
128 this.dataIp = dataIp;
129 this.state = state;
Jian Lie2a04ce2020-07-01 19:07:02 +0900130 this.extNetwork = extNetwork;
Jian Li0c632722019-05-08 15:58:04 +0900131 this.podCidr = podCidr;
Jian Li49109b52019-01-22 00:17:28 +0900132 }
133
134 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900135 public String clusterName() {
136 return clusterName;
137 }
138
139 @Override
140 public String hostShortName() {
141 return StringUtils.substring(hostname, 0, SHORT_NAME_LENGTH);
142 }
143
144 @Override
145 public String uniqueString(int length) {
146 String uuid = UUID.nameUUIDFromBytes(hostname.getBytes()).toString();
147 return StringUtils.substring(uuid, 0, length);
148 }
149
150 @Override
151 public int segmentId() {
152 return segmentId;
153 }
154
155 @Override
156 public String tunnelKey() {
157 if (mode == PASSTHROUGH) {
158 return String.valueOf(segmentId);
159 } else {
160 return FLOW_KEY;
161 }
162 }
163
164 @Override
165 public Mode mode() {
166 return mode;
167 }
168
169 @Override
Jian Li49109b52019-01-22 00:17:28 +0900170 public String hostname() {
171 return hostname;
172 }
173
174 @Override
175 public Type type() {
176 return type;
177 }
178
179 @Override
180 public DeviceId ovsdb() {
181 return DeviceId.deviceId(OVSDB + managementIp().toString());
182 }
183
184 @Override
185 public DeviceId intgBridge() {
186 return intgBridge;
187 }
188
189 @Override
Jian Libf562c22019-04-15 18:07:14 +0900190 public DeviceId extBridge() {
191 return extBridge;
192 }
193
194 @Override
Jian Li1a2eb5d2019-08-27 02:07:05 +0900195 public DeviceId localBridge() {
196 return localBridge;
197 }
198
199 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900200 public DeviceId tunBridge() {
Jian Li732c3422020-09-07 17:01:11 +0900201
202 if (mode == PASSTHROUGH) {
203 K8sHostService hostService =
204 DefaultServiceDirectory.getService(K8sHostService.class);
205 DeviceId deviceId = null;
206 for (K8sHost host : hostService.hosts()) {
207 if (host.nodeNames().contains(hostname())) {
208 for (K8sTunnelBridge bridge : host.tunBridges()) {
209 if (bridge.tunnelId() == segmentId()) {
210 deviceId = bridge.deviceId();
211 }
212 }
213 }
214 }
215 return deviceId;
216 } else {
217 return tunBridge;
218 }
Jian Lie2a04ce2020-07-01 19:07:02 +0900219 }
220
221 @Override
Jian Li0c632722019-05-08 15:58:04 +0900222 public String extIntf() {
223 return extIntf;
224 }
225
226 @Override
Jian Li1cee9882019-02-13 11:25:25 +0900227 public K8sNode updateIntgBridge(DeviceId deviceId) {
228 return new Builder()
229 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900230 .clusterName(clusterName)
Jian Li1cee9882019-02-13 11:25:25 +0900231 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900232 .segmentId(segmentId)
233 .mode(mode)
Jian Li1cee9882019-02-13 11:25:25 +0900234 .intgBridge(deviceId)
Jian Libf562c22019-04-15 18:07:14 +0900235 .extBridge(extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900236 .localBridge(localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900237 .tunBridge(tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900238 .extIntf(extIntf)
Jian Libf562c22019-04-15 18:07:14 +0900239 .managementIp(managementIp)
240 .dataIp(dataIp)
241 .state(state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900242 .extBridgeIp(extNetwork.extBridgeIp())
243 .extGatewayIp(extNetwork.extGatewayIp())
244 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900245 .podCidr(podCidr)
Jian Libf562c22019-04-15 18:07:14 +0900246 .build();
247 }
248
249 @Override
250 public K8sNode updateExtBridge(DeviceId deviceId) {
251 return new Builder()
252 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900253 .clusterName(clusterName)
Jian Libf562c22019-04-15 18:07:14 +0900254 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900255 .segmentId(segmentId)
256 .mode(mode)
Jian Libf562c22019-04-15 18:07:14 +0900257 .intgBridge(intgBridge)
258 .extBridge(deviceId)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900259 .localBridge(localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900260 .tunBridge(tunBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900261 .extIntf(extIntf)
262 .managementIp(managementIp)
263 .dataIp(dataIp)
264 .state(state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900265 .extBridgeIp(extNetwork.extBridgeIp())
266 .extGatewayIp(extNetwork.extGatewayIp())
267 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li1a2eb5d2019-08-27 02:07:05 +0900268 .podCidr(podCidr)
269 .build();
270 }
271
272 @Override
273 public K8sNode updateLocalBridge(DeviceId deviceId) {
274 return new Builder()
275 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900276 .clusterName(clusterName)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900277 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900278 .segmentId(segmentId)
279 .mode(mode)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900280 .intgBridge(intgBridge)
281 .extBridge(extBridge)
282 .localBridge(deviceId)
Jian Lie2a04ce2020-07-01 19:07:02 +0900283 .tunBridge(tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900284 .extIntf(extIntf)
Jian Li1cee9882019-02-13 11:25:25 +0900285 .managementIp(managementIp)
286 .dataIp(dataIp)
287 .state(state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900288 .extBridgeIp(extNetwork.extBridgeIp())
289 .extGatewayIp(extNetwork.extGatewayIp())
290 .extGatewayMac(extNetwork.extGatewayMac())
291 .podCidr(podCidr)
292 .build();
293 }
294
295 @Override
296 public K8sNode updateTunBridge(DeviceId deviceId) {
297 return new Builder()
298 .hostname(hostname)
299 .clusterName(clusterName)
300 .type(type)
301 .segmentId(segmentId)
302 .mode(mode)
303 .intgBridge(intgBridge)
304 .extBridge(extBridge)
305 .localBridge(localBridge)
306 .tunBridge(deviceId)
307 .extIntf(extIntf)
308 .managementIp(managementIp)
309 .dataIp(dataIp)
310 .state(state)
311 .extBridgeIp(extNetwork.extBridgeIp())
312 .extGatewayIp(extNetwork.extGatewayIp())
313 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900314 .podCidr(podCidr)
Jian Li1cee9882019-02-13 11:25:25 +0900315 .build();
316 }
317
318 @Override
Jian Li49109b52019-01-22 00:17:28 +0900319 public IpAddress managementIp() {
320 return managementIp;
321 }
322
323 @Override
324 public IpAddress dataIp() {
325 return dataIp;
326 }
327
328 @Override
329 public K8sNodeState state() {
330 return state;
331 }
332
333 @Override
Jian Li0c632722019-05-08 15:58:04 +0900334 public String podCidr() {
335 return podCidr;
336 }
337
338 @Override
Jian Li49109b52019-01-22 00:17:28 +0900339 public K8sNode updateState(K8sNodeState newState) {
340 return new Builder()
341 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900342 .clusterName(clusterName)
Jian Li49109b52019-01-22 00:17:28 +0900343 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900344 .segmentId(segmentId)
345 .mode(mode)
Jian Li49109b52019-01-22 00:17:28 +0900346 .intgBridge(intgBridge)
Jian Li0c632722019-05-08 15:58:04 +0900347 .extBridge(extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900348 .localBridge(localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900349 .tunBridge(tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900350 .extIntf(extIntf)
Jian Li49109b52019-01-22 00:17:28 +0900351 .managementIp(managementIp)
352 .dataIp(dataIp)
353 .state(newState)
Jian Lie2a04ce2020-07-01 19:07:02 +0900354 .extBridgeIp(extNetwork.extBridgeIp())
355 .extGatewayIp(extNetwork.extGatewayIp())
356 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900357 .podCidr(podCidr)
Jian Li49109b52019-01-22 00:17:28 +0900358 .build();
359 }
360
361 @Override
Jian Li1b08d652019-05-02 17:28:09 +0900362 public K8sNode updateExtGatewayMac(MacAddress newMac) {
363 return new Builder()
364 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900365 .clusterName(clusterName)
Jian Li1b08d652019-05-02 17:28:09 +0900366 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900367 .segmentId(segmentId)
368 .mode(mode)
Jian Li1b08d652019-05-02 17:28:09 +0900369 .intgBridge(intgBridge)
Jian Li0c632722019-05-08 15:58:04 +0900370 .extBridge(extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900371 .localBridge(localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900372 .tunBridge(tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900373 .extIntf(extIntf)
Jian Li1b08d652019-05-02 17:28:09 +0900374 .managementIp(managementIp)
375 .dataIp(dataIp)
376 .state(state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900377 .extBridgeIp(extNetwork.extBridgeIp())
378 .extGatewayIp(extNetwork.extGatewayIp())
Jian Li1b08d652019-05-02 17:28:09 +0900379 .extGatewayMac(newMac)
Jian Li0c632722019-05-08 15:58:04 +0900380 .podCidr(podCidr)
Jian Li1b08d652019-05-02 17:28:09 +0900381 .build();
Jian Li1b08d652019-05-02 17:28:09 +0900382 }
383
384 @Override
Jian Li49109b52019-01-22 00:17:28 +0900385 public PortNumber grePortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900386 return tunnelPortNum(grePortName());
Jian Li49109b52019-01-22 00:17:28 +0900387 }
388
389 @Override
390 public PortNumber vxlanPortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900391 return tunnelPortNum(vxlanPortName());
Jian Li49109b52019-01-22 00:17:28 +0900392 }
393
394 @Override
395 public PortNumber genevePortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900396 return tunnelPortNum(genevePortName());
Jian Li49109b52019-01-22 00:17:28 +0900397 }
398
399 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900400 public PortNumber intgBridgePortNum() {
Jian Li5abc9f02020-09-04 19:38:37 +0900401 return PortNumber.LOCAL;
Jian Lieb488ea2019-04-16 01:50:02 +0900402 }
403
404 @Override
405 public PortNumber intgToExtPatchPortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900406 return portNumber(intgBridge, intgToExtPatchPortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900407 }
408
409 @Override
Jian Li1a2eb5d2019-08-27 02:07:05 +0900410 public PortNumber intgToLocalPatchPortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900411 return portNumber(intgBridge, intgToLocalPatchPortName());
Jian Li1a2eb5d2019-08-27 02:07:05 +0900412 }
413
414 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900415 public PortNumber localToIntgPatchPortNum() {
416 return portNumber(localBridge, localToIntgPatchPortName());
Jian Li1a2eb5d2019-08-27 02:07:05 +0900417 }
418
419 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900420 public PortNumber extToIntgPatchPortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900421 return portNumber(extBridge, extToIntgPatchPortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900422 }
423
424 @Override
Jian Li619fa282020-09-02 14:45:35 +0900425 public PortNumber intgToTunPortNum() {
426 return portNumber(intgBridge, intgToTunPatchPortName());
427 }
428
429 @Override
430 public PortNumber tunToIntgPortNum() {
Jian Li732c3422020-09-07 17:01:11 +0900431 if (mode() == PASSTHROUGH) {
432 K8sHostService hostService =
433 DefaultServiceDirectory.getService(K8sHostService.class);
434 Port port = null;
435 for (K8sHost host : hostService.hosts()) {
436 if (host.nodeNames().contains(hostname())) {
437 for (K8sTunnelBridge bridge : host.tunBridges()) {
438 if (bridge.tunnelId() == segmentId()) {
439 port = port(bridge.deviceId(), tunToIntgPatchPortName());
440 }
441 }
442 }
443 }
444
445 if (port == null) {
446 return null;
447 } else {
448 return port.number();
449 }
450 } else {
451 return portNumber(tunBridge, tunToIntgPatchPortName());
452 }
Jian Li619fa282020-09-02 14:45:35 +0900453 }
454
455 @Override
Jian Li019ce6a2020-09-09 10:23:21 +0900456 public PortNumber routerToExtPortNum() {
457 if (mode() == PASSTHROUGH) {
458 K8sHostService hostService =
459 DefaultServiceDirectory.getService(K8sHostService.class);
460 Port port = null;
461 for (K8sHost host : hostService.hosts()) {
462 if (host.nodeNames().contains(hostname())) {
463 for (K8sRouterBridge bridge : host.routerBridges()) {
464 if (bridge.segmentId() == segmentId()) {
465 port = port(bridge.deviceId(), routerToExtPatchPortName());
466 }
467 }
468 }
469 }
470
471 if (port == null) {
472 return null;
473 } else {
474 return port.number();
475 }
476 }
477
478 return null;
479 }
480
481 @Override
482 public PortNumber extToRouterPortNum() {
483 return portNumber(extBridge, extToRouterPatchPortName());
484 }
485
486 @Override
487 public PortNumber routerPortNum() {
488 if (mode() == PASSTHROUGH) {
489 K8sHostService hostService =
490 DefaultServiceDirectory.getService(K8sHostService.class);
491 Port port = null;
492 for (K8sHost host : hostService.hosts()) {
493 if (host.nodeNames().contains(hostname())) {
494 for (K8sRouterBridge bridge : host.routerBridges()) {
495 if (bridge.segmentId() == segmentId()) {
496 port = port(bridge.deviceId(), routerPortName());
497 }
498 }
499 }
500 }
501
502 if (port == null) {
503 return null;
504 } else {
505 return port.number();
506 }
507 }
508
509 return null;
510 }
511
512 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900513 public PortNumber extBridgePortNum() {
Jian Li5abc9f02020-09-04 19:38:37 +0900514 return PortNumber.LOCAL;
Jian Lieb488ea2019-04-16 01:50:02 +0900515 }
516
517 @Override
Jian Lic2242bd2020-09-03 13:12:14 +0900518 public PortNumber extIntfPortNum() {
519 if (this.extIntf == null) {
520 return null;
521 }
522 return portNumber(extBridge, extIntf());
523 }
524
525 @Override
Jian Li2778ffa2019-05-07 13:21:52 +0900526 public MacAddress intgBridgeMac() {
Jian Li019ce6a2020-09-09 10:23:21 +0900527 if (mode == PASSTHROUGH) {
528 return MacAddress.valueOf(DEFAULT_INTG_BRIDGE_MAC);
529 } else {
530 return macAddress(intgBridge, intgBridgeName());
531 }
Jian Li2778ffa2019-05-07 13:21:52 +0900532 }
533
534 @Override
535 public IpAddress extBridgeIp() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900536 return extNetwork.extBridgeIp();
Jian Li2778ffa2019-05-07 13:21:52 +0900537 }
538
539 @Override
540 public MacAddress extBridgeMac() {
Jian Lic2242bd2020-09-03 13:12:14 +0900541 if (MacAddress.valueOf(DEFAULT_EXTERNAL_GATEWAY_MAC).equals(extGatewayMac())) {
542 return MacAddress.valueOf(DEFAULT_EXTERNAL_BRIDGE_MAC);
543 } else {
544 return macAddress(extBridge, extBridgeName());
545 }
Jian Li2778ffa2019-05-07 13:21:52 +0900546 }
547
548 @Override
549 public IpAddress extGatewayIp() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900550 return extNetwork.extGatewayIp();
Jian Li2778ffa2019-05-07 13:21:52 +0900551 }
552
553 @Override
554 public MacAddress extGatewayMac() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900555 return extNetwork.extGatewayMac();
556 }
557
558 @Override
559 public String grePortName() {
560 if (mode == PASSTHROUGH) {
561 return GRE_TUNNEL + "-" + segmentId;
562 } else {
563 return GRE_TUNNEL;
564 }
565 }
566
567 @Override
568 public String vxlanPortName() {
569 if (mode == PASSTHROUGH) {
570 return VXLAN_TUNNEL + "-" + segmentId;
571 } else {
572 return VXLAN_TUNNEL;
573 }
574 }
575
576 @Override
577 public String genevePortName() {
578 if (mode == PASSTHROUGH) {
579 return GENEVE_TUNNEL + "-" + segmentId;
580 } else {
581 return GENEVE_TUNNEL;
582 }
583 }
584
585 @Override
586 public String intgBridgeName() {
587 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900588 return INTEGRATION_BRIDGE + "-" + uniqueString(4);
Jian Lie2a04ce2020-07-01 19:07:02 +0900589 } else {
590 return INTEGRATION_BRIDGE;
591 }
592 }
593
594 @Override
Jian Li019ce6a2020-09-09 10:23:21 +0900595 public String intgEntryPortName() {
596 if (mode == PASSTHROUGH) {
Jian Lia4d8fba2020-09-10 23:16:50 +0900597 return k8sIntgToOsPatchPortName();
Jian Li019ce6a2020-09-09 10:23:21 +0900598 } else {
599 return intgBridgeName();
600 }
601 }
602
603 @Override
604 public PortNumber intgEntryPortNum() {
605 if (mode == PASSTHROUGH) {
Jian Lia4d8fba2020-09-10 23:16:50 +0900606 return portNumber(intgBridge, k8sIntgToOsPatchPortName());
Jian Li019ce6a2020-09-09 10:23:21 +0900607 } else {
608 return intgBridgePortNum();
609 }
610 }
611
612 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900613 public String extBridgeName() {
614 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900615 return EXTERNAL_BRIDGE + "-" + uniqueString(4);
Jian Lie2a04ce2020-07-01 19:07:02 +0900616 } else {
617 return EXTERNAL_BRIDGE;
618 }
619 }
620
621 @Override
622 public String localBridgeName() {
623 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900624 return LOCAL_BRIDGE + "-" + uniqueString(4);
Jian Lie2a04ce2020-07-01 19:07:02 +0900625 } else {
626 return LOCAL_BRIDGE;
627 }
628 }
629
630 @Override
631 public String tunBridgeName() {
632 if (mode == PASSTHROUGH) {
633 return TUNNEL_BRIDGE + "-" + segmentId;
634 } else {
635 return TUNNEL_BRIDGE;
636 }
637 }
638
639 @Override
640 public String intgBridgePortName() {
641 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900642 return INTEGRATION_BRIDGE + "-" + uniqueString(4);
Jian Lie2a04ce2020-07-01 19:07:02 +0900643 } else {
644 return INTEGRATION_BRIDGE;
645 }
646 }
647
648 @Override
649 public String extBridgePortName() {
650 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900651 return EXTERNAL_BRIDGE + "-" + uniqueString(4);
Jian Lie2a04ce2020-07-01 19:07:02 +0900652 } else {
653 return EXTERNAL_BRIDGE;
654 }
655 }
656
657 @Override
658 public String localBridgePortName() {
659 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900660 return LOCAL_BRIDGE + "-" + uniqueString(4);
Jian Lie2a04ce2020-07-01 19:07:02 +0900661 } else {
662 return LOCAL_BRIDGE;
663 }
664 }
665
666 @Override
Jian Li619fa282020-09-02 14:45:35 +0900667 public String tunBridgePortName() {
668 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900669 return TUNNEL_BRIDGE + "-" + uniqueString(4);
Jian Li619fa282020-09-02 14:45:35 +0900670 } else {
671 return TUNNEL_BRIDGE;
672 }
673 }
674
675 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900676 public String intgToExtPatchPortName() {
677 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900678 return INTEGRATION_TO_EXTERNAL_BRIDGE + "-" + uniqueString(4);
Jian Lie2a04ce2020-07-01 19:07:02 +0900679 } else {
680 return INTEGRATION_TO_EXTERNAL_BRIDGE;
681 }
682 }
683
684 @Override
685 public String intgToTunPatchPortName() {
686 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900687 return INTEGRATION_TO_TUN_BRIDGE + "-" + uniqueString(4);
Jian Lie2a04ce2020-07-01 19:07:02 +0900688 } else {
689 return INTEGRATION_TO_TUN_BRIDGE;
690 }
691 }
692
693 @Override
694 public String intgToLocalPatchPortName() {
695 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900696 return INTEGRATION_TO_LOCAL_BRIDGE + "-" + uniqueString(4);
Jian Lie2a04ce2020-07-01 19:07:02 +0900697 } else {
698 return INTEGRATION_TO_LOCAL_BRIDGE;
699 }
700 }
701
702 @Override
703 public String localToIntgPatchPortName() {
704 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900705 return LOCAL_TO_INTEGRATION_BRIDGE + "-" + uniqueString(4);
Jian Lie2a04ce2020-07-01 19:07:02 +0900706 } else {
707 return LOCAL_TO_INTEGRATION_BRIDGE;
708 }
709 }
710
711 @Override
712 public String extToIntgPatchPortName() {
713 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900714 return PHYSICAL_EXTERNAL_BRIDGE + "-" + uniqueString(4);
Jian Lie2a04ce2020-07-01 19:07:02 +0900715 } else {
716 return PHYSICAL_EXTERNAL_BRIDGE;
717 }
718 }
719
720 @Override
721 public String tunToIntgPatchPortName() {
722 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900723 return TUN_TO_INTEGRATION_BRIDGE + "-" + uniqueString(4);
Jian Lie2a04ce2020-07-01 19:07:02 +0900724 } else {
725 return TUN_TO_INTEGRATION_BRIDGE;
726 }
Jian Li2778ffa2019-05-07 13:21:52 +0900727 }
728
729 @Override
Jian Lia4d8fba2020-09-10 23:16:50 +0900730 public String k8sIntgToOsPatchPortName() {
Jian Li019ce6a2020-09-09 10:23:21 +0900731 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900732 return K8S_INTEGRATION_TO_OS_BRIDGE + "-" + uniqueString(4);
Jian Li019ce6a2020-09-09 10:23:21 +0900733 } else {
Jian Lia4d8fba2020-09-10 23:16:50 +0900734 return K8S_INTEGRATION_TO_OS_BRIDGE;
735 }
736 }
737
738 @Override
739 public String k8sExtToOsPatchPortName() {
740 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900741 return K8S_EXTERNAL_TO_OS_BRIDGE + "-" + uniqueString(4);
Jian Lia4d8fba2020-09-10 23:16:50 +0900742 } else {
743 return K8S_EXTERNAL_TO_OS_BRIDGE;
Jian Li019ce6a2020-09-09 10:23:21 +0900744 }
745 }
746
747 @Override
748 public String osToK8sIntgPatchPortName() {
749 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900750 return OS_TO_K8S_INTEGRATION_BRIDGE + "-" + uniqueString(4);
Jian Li019ce6a2020-09-09 10:23:21 +0900751 } else {
Jian Lia4d8fba2020-09-10 23:16:50 +0900752 return OS_TO_K8S_INTEGRATION_BRIDGE;
753 }
754 }
755
756 @Override
757 public String osToK8sExtPatchPortName() {
758 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900759 return OS_TO_K8S_EXTERNAL_BRIDGE + "-" + uniqueString(4);
Jian Lia4d8fba2020-09-10 23:16:50 +0900760 } else {
761 return OS_TO_K8S_EXTERNAL_BRIDGE;
Jian Li019ce6a2020-09-09 10:23:21 +0900762 }
763 }
764
765 @Override
766 public String routerToExtPatchPortName() {
767 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900768 return ROUTER_TO_EXTERNAL + "-" + uniqueString(4);
Jian Li019ce6a2020-09-09 10:23:21 +0900769 } else {
770 return ROUTER_TO_EXTERNAL;
771 }
772 }
773
774 @Override
775 public String extToRouterPatchPortName() {
776 if (mode == PASSTHROUGH) {
Jian Lif4efdf52020-09-22 11:23:29 +0900777 return EXTERNAL_TO_ROUTER + "-" + uniqueString(4);
Jian Li019ce6a2020-09-09 10:23:21 +0900778 } else {
779 return EXTERNAL_TO_ROUTER;
780 }
781 }
782
783 @Override
784 public String routerPortName() {
785 if (mode == PASSTHROUGH) {
786 return ROUTER + "-" + segmentId();
787 } else {
788 return ROUTER;
789 }
790 }
791
792 @Override
Jian Li49109b52019-01-22 00:17:28 +0900793 public boolean equals(Object obj) {
794 if (this == obj) {
795 return true;
796 }
797
798 if (obj instanceof DefaultK8sNode) {
799 DefaultK8sNode that = (DefaultK8sNode) obj;
800
Jian Lie2a04ce2020-07-01 19:07:02 +0900801 return clusterName.equals(that.clusterName) &&
802 hostname.equals(that.hostname) &&
Jian Li49109b52019-01-22 00:17:28 +0900803 type == that.type &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900804 segmentId == that.segmentId &&
805 mode == that.mode &&
Jian Li49109b52019-01-22 00:17:28 +0900806 intgBridge.equals(that.intgBridge) &&
Jian Libf562c22019-04-15 18:07:14 +0900807 extBridge.equals(that.extBridge) &&
Jian Li1a2eb5d2019-08-27 02:07:05 +0900808 localBridge.equals(that.localBridge) &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900809 tunBridge.equals(that.tunBridge) &&
Jian Li0c632722019-05-08 15:58:04 +0900810 extIntf.equals(that.extIntf) &&
Jian Li49109b52019-01-22 00:17:28 +0900811 managementIp.equals(that.managementIp) &&
812 dataIp.equals(that.dataIp) &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900813 extNetwork.equals(that.extNetwork) &&
Jian Li0c632722019-05-08 15:58:04 +0900814 podCidr.equals(that.podCidr) &&
Jian Li49109b52019-01-22 00:17:28 +0900815 state == that.state;
816 }
817
818 return false;
819 }
820
821 @Override
822 public int hashCode() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900823 return Objects.hash(clusterName, hostname, type, segmentId, mode, intgBridge, extBridge,
824 localBridge, tunBridge, extIntf, managementIp, dataIp, state, extNetwork, podCidr);
Jian Li49109b52019-01-22 00:17:28 +0900825 }
826
827 @Override
828 public String toString() {
829 return MoreObjects.toStringHelper(this)
Jian Lie2a04ce2020-07-01 19:07:02 +0900830 .add("clusterName", clusterName)
Jian Li49109b52019-01-22 00:17:28 +0900831 .add("hostname", hostname)
832 .add("type", type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900833 .add("segmentId", segmentId)
834 .add("mode", mode)
Jian Li49109b52019-01-22 00:17:28 +0900835 .add("intgBridge", intgBridge)
Jian Libf562c22019-04-15 18:07:14 +0900836 .add("extBridge", extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900837 .add("localBridge", localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900838 .add("tunBridge", tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900839 .add("extIntf", extIntf)
Jian Li49109b52019-01-22 00:17:28 +0900840 .add("managementIp", managementIp)
841 .add("dataIp", dataIp)
842 .add("state", state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900843 .add("extBridgeIp", extNetwork.extBridgeIp())
844 .add("extGatewayIp", extNetwork.extGatewayIp())
845 .add("extGatewayMac", extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900846 .add("podCidr", podCidr)
Jian Li49109b52019-01-22 00:17:28 +0900847 .toString();
848 }
849
850 private PortNumber tunnelPortNum(String tunnelType) {
851 if (dataIp == null) {
852 return null;
853 }
Jian Lieb488ea2019-04-16 01:50:02 +0900854
Jian Lie2a04ce2020-07-01 19:07:02 +0900855 return portNumber(tunBridge, tunnelType);
Jian Lieb488ea2019-04-16 01:50:02 +0900856 }
857
Jian Li2778ffa2019-05-07 13:21:52 +0900858 private MacAddress macAddress(DeviceId deviceId, String portName) {
859 Port port = port(deviceId, portName);
860 Annotations annots = port.annotations();
861 return annots != null ? MacAddress.valueOf(annots.value(PORT_MAC)) : null;
862 }
863
Jian Lieb488ea2019-04-16 01:50:02 +0900864 private PortNumber portNumber(DeviceId deviceId, String portName) {
Jian Li2778ffa2019-05-07 13:21:52 +0900865 Port port = port(deviceId, portName);
866 return port != null ? port.number() : null;
867 }
868
869 private Port port(DeviceId deviceId, String portName) {
Jian Li49109b52019-01-22 00:17:28 +0900870 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
Jian Li2778ffa2019-05-07 13:21:52 +0900871 return deviceService.getPorts(deviceId).stream()
Jian Li49109b52019-01-22 00:17:28 +0900872 .filter(p -> p.isEnabled() &&
Jian Lieb488ea2019-04-16 01:50:02 +0900873 Objects.equals(p.annotations().value(PORT_NAME), portName))
Jian Li49109b52019-01-22 00:17:28 +0900874 .findAny().orElse(null);
Jian Li49109b52019-01-22 00:17:28 +0900875 }
876
877 /**
878 * Returns new builder instance.
879 *
880 * @return kubernetes node builder
881 */
882 public static Builder builder() {
883 return new Builder();
884 }
885
886 /**
887 * Returns new builder instance with the given node as a default value.
888 *
889 * @param node kubernetes node
890 * @return kubernetes node builder
891 */
892 public static Builder from(K8sNode node) {
893 return new Builder()
894 .hostname(node.hostname())
Jian Lie2a04ce2020-07-01 19:07:02 +0900895 .clusterName(node.clusterName())
Jian Li49109b52019-01-22 00:17:28 +0900896 .type(node.type())
Jian Lie2a04ce2020-07-01 19:07:02 +0900897 .segmentId(node.segmentId())
Jian Li49109b52019-01-22 00:17:28 +0900898 .intgBridge(node.intgBridge())
Jian Libf562c22019-04-15 18:07:14 +0900899 .extBridge(node.extBridge())
Jian Li1a2eb5d2019-08-27 02:07:05 +0900900 .localBridge(node.localBridge())
Jian Lie2a04ce2020-07-01 19:07:02 +0900901 .tunBridge(node.tunBridge())
Jian Li0c632722019-05-08 15:58:04 +0900902 .extIntf(node.extIntf())
Jian Li49109b52019-01-22 00:17:28 +0900903 .managementIp(node.managementIp())
904 .dataIp(node.dataIp())
Jian Li1b08d652019-05-02 17:28:09 +0900905 .state(node.state())
Jian Li0c632722019-05-08 15:58:04 +0900906 .extBridgeIp(node.extBridgeIp())
907 .extGatewayIp(node.extGatewayIp())
908 .extGatewayMac(node.extGatewayMac())
909 .podCidr(node.podCidr());
Jian Li49109b52019-01-22 00:17:28 +0900910 }
911
912 public static final class Builder implements K8sNode.Builder {
913
Jian Lie2a04ce2020-07-01 19:07:02 +0900914 private String clusterName;
Jian Li49109b52019-01-22 00:17:28 +0900915 private String hostname;
916 private Type type;
Jian Lie2a04ce2020-07-01 19:07:02 +0900917 private int segmentId;
918 private Mode mode;
Jian Li49109b52019-01-22 00:17:28 +0900919 private DeviceId intgBridge;
Jian Libf562c22019-04-15 18:07:14 +0900920 private DeviceId extBridge;
Jian Li1a2eb5d2019-08-27 02:07:05 +0900921 private DeviceId localBridge;
Jian Lie2a04ce2020-07-01 19:07:02 +0900922 private DeviceId tunBridge;
Jian Li49109b52019-01-22 00:17:28 +0900923 private IpAddress managementIp;
924 private IpAddress dataIp;
925 private K8sNodeState state;
Jian Li3defa842019-02-12 00:31:35 +0900926 private K8sApiConfig apiConfig;
Jian Li0c632722019-05-08 15:58:04 +0900927 private String extIntf;
928 private IpAddress extBridgeIp;
929 private IpAddress extGatewayIp;
Jian Li1b08d652019-05-02 17:28:09 +0900930 private MacAddress extGatewayMac;
Jian Li0c632722019-05-08 15:58:04 +0900931 private String podCidr;
Jian Li49109b52019-01-22 00:17:28 +0900932
933 // private constructor not intended to use from external
934 private Builder() {
935 }
936
937 @Override
938 public K8sNode build() {
939 checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
940 checkArgument(type != null, NOT_NULL_MSG, "type");
941 checkArgument(state != null, NOT_NULL_MSG, "state");
942 checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
943
Jian Lie2a04ce2020-07-01 19:07:02 +0900944 if (StringUtils.isEmpty(clusterName)) {
945 clusterName = DEFAULT_CLUSTER_NAME;
946 }
947
948 if (mode == null) {
949 mode = NORMAL;
950 }
951
952 K8sExternalNetwork extNetwork = DefaultK8sExternalNetwork.builder()
953 .extBridgeIp(extBridgeIp)
954 .extGatewayIp(extGatewayIp)
955 .extGatewayMac(extGatewayMac)
956 .build();
957
958 return new DefaultK8sNode(clusterName,
959 hostname,
Jian Li49109b52019-01-22 00:17:28 +0900960 type,
Jian Lie2a04ce2020-07-01 19:07:02 +0900961 segmentId,
962 mode,
Jian Li49109b52019-01-22 00:17:28 +0900963 intgBridge,
Jian Libf562c22019-04-15 18:07:14 +0900964 extBridge,
Jian Li1a2eb5d2019-08-27 02:07:05 +0900965 localBridge,
Jian Lie2a04ce2020-07-01 19:07:02 +0900966 tunBridge,
Jian Li0c632722019-05-08 15:58:04 +0900967 extIntf,
Jian Li49109b52019-01-22 00:17:28 +0900968 managementIp,
969 dataIp,
Jian Li1b08d652019-05-02 17:28:09 +0900970 state,
Jian Lie2a04ce2020-07-01 19:07:02 +0900971 extNetwork,
Jian Li0c632722019-05-08 15:58:04 +0900972 podCidr);
Jian Li49109b52019-01-22 00:17:28 +0900973 }
974
975 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900976 public Builder clusterName(String clusterName) {
977 this.clusterName = clusterName;
978 return this;
979 }
980
981 @Override
Jian Li49109b52019-01-22 00:17:28 +0900982 public Builder hostname(String hostname) {
983 this.hostname = hostname;
984 return this;
985 }
986
987 @Override
988 public Builder type(Type type) {
989 this.type = type;
990 return this;
991 }
992
993 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900994 public Builder segmentId(int segmentId) {
995 this.segmentId = segmentId;
996 return this;
997 }
998
999 @Override
1000 public Builder mode(Mode mode) {
1001 this.mode = mode;
1002 return this;
1003 }
1004
1005 @Override
Jian Li49109b52019-01-22 00:17:28 +09001006 public Builder intgBridge(DeviceId deviceId) {
1007 this.intgBridge = deviceId;
1008 return this;
1009 }
1010
1011 @Override
Jian Libf562c22019-04-15 18:07:14 +09001012 public Builder extBridge(DeviceId deviceId) {
1013 this.extBridge = deviceId;
1014 return this;
1015 }
1016
1017 @Override
Jian Li1a2eb5d2019-08-27 02:07:05 +09001018 public Builder localBridge(DeviceId deviceId) {
1019 this.localBridge = deviceId;
1020 return this;
1021 }
1022
1023 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +09001024 public Builder tunBridge(DeviceId deviceId) {
1025 this.tunBridge = deviceId;
1026 return this;
1027 }
1028
1029 @Override
Jian Li0c632722019-05-08 15:58:04 +09001030 public Builder extIntf(String intf) {
1031 this.extIntf = intf;
1032 return this;
1033 }
1034
1035 @Override
Jian Li49109b52019-01-22 00:17:28 +09001036 public Builder managementIp(IpAddress managementIp) {
1037 this.managementIp = managementIp;
1038 return this;
1039 }
1040
1041 @Override
1042 public Builder dataIp(IpAddress dataIp) {
1043 this.dataIp = dataIp;
1044 return this;
1045 }
1046
1047 @Override
1048 public Builder state(K8sNodeState state) {
1049 this.state = state;
1050 return this;
1051 }
Jian Li1b08d652019-05-02 17:28:09 +09001052
1053 @Override
Jian Li0c632722019-05-08 15:58:04 +09001054 public Builder extBridgeIp(IpAddress extBridgeIp) {
1055 this.extBridgeIp = extBridgeIp;
1056 return this;
1057 }
1058
1059 @Override
1060 public Builder extGatewayIp(IpAddress extGatewayIp) {
1061 this.extGatewayIp = extGatewayIp;
1062 return this;
1063 }
1064
1065 @Override
Jian Li1b08d652019-05-02 17:28:09 +09001066 public Builder extGatewayMac(MacAddress extGatewayMac) {
1067 this.extGatewayMac = extGatewayMac;
1068 return this;
1069 }
Jian Li0c632722019-05-08 15:58:04 +09001070
1071 @Override
1072 public Builder podCidr(String podCidr) {
1073 this.podCidr = podCidr;
1074 return this;
1075 }
Jian Li49109b52019-01-22 00:17:28 +09001076 }
1077}