blob: b73c11842c157b994a80ed71223418cd28519f4f [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 Li58b33982020-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 Li58b33982020-07-01 19:07:02 +090023import org.onosproject.k8snode.api.K8sApiConfig.Mode;
Jian Li5a9c2bb2019-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 Li58b33982020-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 Li58b33982020-07-01 19:07:02 +090034import static org.onosproject.k8snode.api.Constants.DEFAULT_CLUSTER_NAME;
Jian Lib1218442020-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 Li4860e372020-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 Li4860e372020-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 Li121ddfe2019-08-27 02:07:05 +090044import static org.onosproject.k8snode.api.Constants.INTEGRATION_TO_LOCAL_BRIDGE;
Jian Li58b33982020-07-01 19:07:02 +090045import static org.onosproject.k8snode.api.Constants.INTEGRATION_TO_TUN_BRIDGE;
Jian Li25210732020-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 Li58b33982020-07-01 19:07:02 +090048import static org.onosproject.k8snode.api.Constants.LOCAL_BRIDGE;
Jian Li121ddfe2019-08-27 02:07:05 +090049import static org.onosproject.k8snode.api.Constants.LOCAL_TO_INTEGRATION_BRIDGE;
Jian Li25210732020-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 Li4860e372020-09-09 10:23:21 +090053import static org.onosproject.k8snode.api.Constants.ROUTER;
54import static org.onosproject.k8snode.api.Constants.ROUTER_TO_EXTERNAL;
Jian Li58b33982020-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 Li58b33982020-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 Li5a9c2bb2019-05-07 13:21:52 +090067 private static final String PORT_MAC = "portMac";
Jian Li58b33982020-07-01 19:07:02 +090068 private static final String FLOW_KEY = "flow";
Jian Li7d111d72019-04-12 13:58:44 +090069
Jian Li58b33982020-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 Li58b33982020-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 Li121ddfe2019-08-27 02:07:05 +090079 private final DeviceId localBridge;
Jian Li58b33982020-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;
Jian Li9bc67772020-10-07 02:12:33 +090083 private final IpAddress nodeIp;
Jian Li49109b52019-01-22 00:17:28 +090084 private final K8sNodeState state;
Jian Li58b33982020-07-01 19:07:02 +090085 private final K8sExternalNetwork extNetwork;
Jian Li7709eb42019-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 Li58b33982020-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 Li58b33982020-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 Li121ddfe2019-08-27 02:07:05 +0900102 * @param localBridge local bridge
Jian Li58b33982020-07-01 19:07:02 +0900103 * @param tunBridge tunnel bridge
Jian Li49109b52019-01-22 00:17:28 +0900104 * @param managementIp management IP address
105 * @param dataIp data IP address
Jian Li9bc67772020-10-07 02:12:33 +0900106 * @param nodeIp node IP address
Jian Li49109b52019-01-22 00:17:28 +0900107 * @param state node state
Jian Li58b33982020-07-01 19:07:02 +0900108 * @param extNetwork external network
Jian Li7709eb42019-05-08 15:58:04 +0900109 * @param podCidr POD CIDR
Jian Li49109b52019-01-22 00:17:28 +0900110 */
Jian Li58b33982020-07-01 19:07:02 +0900111 protected DefaultK8sNode(String clusterName, String hostname, Type type,
112 int segmentId, Mode mode, DeviceId intgBridge,
Jian Li121ddfe2019-08-27 02:07:05 +0900113 DeviceId extBridge, DeviceId localBridge,
Jian Li9bc67772020-10-07 02:12:33 +0900114 DeviceId tunBridge, IpAddress managementIp,
115 IpAddress dataIp, IpAddress nodeIp, K8sNodeState state,
Jian Li58b33982020-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 Li58b33982020-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 Li121ddfe2019-08-27 02:07:05 +0900124 this.localBridge = localBridge;
Jian Li58b33982020-07-01 19:07:02 +0900125 this.tunBridge = tunBridge;
Jian Li49109b52019-01-22 00:17:28 +0900126 this.managementIp = managementIp;
127 this.dataIp = dataIp;
Jian Li9bc67772020-10-07 02:12:33 +0900128 this.nodeIp = nodeIp;
Jian Li49109b52019-01-22 00:17:28 +0900129 this.state = state;
Jian Li58b33982020-07-01 19:07:02 +0900130 this.extNetwork = extNetwork;
Jian Li7709eb42019-05-08 15:58:04 +0900131 this.podCidr = podCidr;
Jian Li49109b52019-01-22 00:17:28 +0900132 }
133
134 @Override
Jian Li58b33982020-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 Li121ddfe2019-08-27 02:07:05 +0900195 public DeviceId localBridge() {
196 return localBridge;
197 }
198
199 @Override
Jian Li58b33982020-07-01 19:07:02 +0900200 public DeviceId tunBridge() {
Jian Li3cb86e32020-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 Li58b33982020-07-01 19:07:02 +0900219 }
220
221 @Override
Jian Li7709eb42019-05-08 15:58:04 +0900222 public String extIntf() {
Jian Li9bc67772020-10-07 02:12:33 +0900223 return extNetwork.extIntf();
Jian Li7709eb42019-05-08 15:58:04 +0900224 }
225
226 @Override
Jian Li1cee9882019-02-13 11:25:25 +0900227 public K8sNode updateIntgBridge(DeviceId deviceId) {
228 return new Builder()
229 .hostname(hostname)
Jian Li58b33982020-07-01 19:07:02 +0900230 .clusterName(clusterName)
Jian Li1cee9882019-02-13 11:25:25 +0900231 .type(type)
Jian Li58b33982020-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 Li121ddfe2019-08-27 02:07:05 +0900236 .localBridge(localBridge)
Jian Li58b33982020-07-01 19:07:02 +0900237 .tunBridge(tunBridge)
Jian Libf562c22019-04-15 18:07:14 +0900238 .managementIp(managementIp)
239 .dataIp(dataIp)
Jian Li9bc67772020-10-07 02:12:33 +0900240 .nodeIp(nodeIp)
Jian Libf562c22019-04-15 18:07:14 +0900241 .state(state)
Jian Li58b33982020-07-01 19:07:02 +0900242 .extBridgeIp(extNetwork.extBridgeIp())
243 .extGatewayIp(extNetwork.extGatewayIp())
244 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li9bc67772020-10-07 02:12:33 +0900245 .extIntf(extNetwork.extIntf())
Jian Li7709eb42019-05-08 15:58:04 +0900246 .podCidr(podCidr)
Jian Libf562c22019-04-15 18:07:14 +0900247 .build();
248 }
249
250 @Override
251 public K8sNode updateExtBridge(DeviceId deviceId) {
252 return new Builder()
253 .hostname(hostname)
Jian Li58b33982020-07-01 19:07:02 +0900254 .clusterName(clusterName)
Jian Libf562c22019-04-15 18:07:14 +0900255 .type(type)
Jian Li58b33982020-07-01 19:07:02 +0900256 .segmentId(segmentId)
257 .mode(mode)
Jian Libf562c22019-04-15 18:07:14 +0900258 .intgBridge(intgBridge)
259 .extBridge(deviceId)
Jian Li121ddfe2019-08-27 02:07:05 +0900260 .localBridge(localBridge)
Jian Li58b33982020-07-01 19:07:02 +0900261 .tunBridge(tunBridge)
Jian Li121ddfe2019-08-27 02:07:05 +0900262 .managementIp(managementIp)
263 .dataIp(dataIp)
Jian Li9bc67772020-10-07 02:12:33 +0900264 .nodeIp(nodeIp)
Jian Li121ddfe2019-08-27 02:07:05 +0900265 .state(state)
Jian Li58b33982020-07-01 19:07:02 +0900266 .extBridgeIp(extNetwork.extBridgeIp())
267 .extGatewayIp(extNetwork.extGatewayIp())
268 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li9bc67772020-10-07 02:12:33 +0900269 .extIntf(extNetwork.extIntf())
Jian Li121ddfe2019-08-27 02:07:05 +0900270 .podCidr(podCidr)
271 .build();
272 }
273
274 @Override
275 public K8sNode updateLocalBridge(DeviceId deviceId) {
276 return new Builder()
277 .hostname(hostname)
Jian Li58b33982020-07-01 19:07:02 +0900278 .clusterName(clusterName)
Jian Li121ddfe2019-08-27 02:07:05 +0900279 .type(type)
Jian Li58b33982020-07-01 19:07:02 +0900280 .segmentId(segmentId)
281 .mode(mode)
Jian Li121ddfe2019-08-27 02:07:05 +0900282 .intgBridge(intgBridge)
283 .extBridge(extBridge)
284 .localBridge(deviceId)
Jian Li58b33982020-07-01 19:07:02 +0900285 .tunBridge(tunBridge)
Jian Li1cee9882019-02-13 11:25:25 +0900286 .managementIp(managementIp)
287 .dataIp(dataIp)
Jian Li9bc67772020-10-07 02:12:33 +0900288 .nodeIp(nodeIp)
Jian Li1cee9882019-02-13 11:25:25 +0900289 .state(state)
Jian Li58b33982020-07-01 19:07:02 +0900290 .extBridgeIp(extNetwork.extBridgeIp())
291 .extGatewayIp(extNetwork.extGatewayIp())
292 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li9bc67772020-10-07 02:12:33 +0900293 .extIntf(extNetwork.extIntf())
Jian Li58b33982020-07-01 19:07:02 +0900294 .podCidr(podCidr)
295 .build();
296 }
297
298 @Override
299 public K8sNode updateTunBridge(DeviceId deviceId) {
300 return new Builder()
301 .hostname(hostname)
302 .clusterName(clusterName)
303 .type(type)
304 .segmentId(segmentId)
305 .mode(mode)
306 .intgBridge(intgBridge)
307 .extBridge(extBridge)
308 .localBridge(localBridge)
309 .tunBridge(deviceId)
Jian Li58b33982020-07-01 19:07:02 +0900310 .managementIp(managementIp)
311 .dataIp(dataIp)
Jian Li9bc67772020-10-07 02:12:33 +0900312 .nodeIp(nodeIp)
Jian Li58b33982020-07-01 19:07:02 +0900313 .state(state)
314 .extBridgeIp(extNetwork.extBridgeIp())
315 .extGatewayIp(extNetwork.extGatewayIp())
316 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li9bc67772020-10-07 02:12:33 +0900317 .extIntf(extNetwork.extIntf())
Jian Li7709eb42019-05-08 15:58:04 +0900318 .podCidr(podCidr)
Jian Li1cee9882019-02-13 11:25:25 +0900319 .build();
320 }
321
322 @Override
Jian Li49109b52019-01-22 00:17:28 +0900323 public IpAddress managementIp() {
324 return managementIp;
325 }
326
327 @Override
328 public IpAddress dataIp() {
329 return dataIp;
330 }
331
332 @Override
Jian Li9bc67772020-10-07 02:12:33 +0900333 public IpAddress nodeIp() {
334 return nodeIp;
335 }
336
337 @Override
Jian Li49109b52019-01-22 00:17:28 +0900338 public K8sNodeState state() {
339 return state;
340 }
341
342 @Override
Jian Li7709eb42019-05-08 15:58:04 +0900343 public String podCidr() {
344 return podCidr;
345 }
346
347 @Override
Jian Li49109b52019-01-22 00:17:28 +0900348 public K8sNode updateState(K8sNodeState newState) {
349 return new Builder()
350 .hostname(hostname)
Jian Li58b33982020-07-01 19:07:02 +0900351 .clusterName(clusterName)
Jian Li49109b52019-01-22 00:17:28 +0900352 .type(type)
Jian Li58b33982020-07-01 19:07:02 +0900353 .segmentId(segmentId)
354 .mode(mode)
Jian Li49109b52019-01-22 00:17:28 +0900355 .intgBridge(intgBridge)
Jian Li7709eb42019-05-08 15:58:04 +0900356 .extBridge(extBridge)
Jian Li121ddfe2019-08-27 02:07:05 +0900357 .localBridge(localBridge)
Jian Li58b33982020-07-01 19:07:02 +0900358 .tunBridge(tunBridge)
Jian Li49109b52019-01-22 00:17:28 +0900359 .managementIp(managementIp)
360 .dataIp(dataIp)
Jian Li9bc67772020-10-07 02:12:33 +0900361 .nodeIp(nodeIp)
Jian Li49109b52019-01-22 00:17:28 +0900362 .state(newState)
Jian Li58b33982020-07-01 19:07:02 +0900363 .extBridgeIp(extNetwork.extBridgeIp())
364 .extGatewayIp(extNetwork.extGatewayIp())
365 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li9bc67772020-10-07 02:12:33 +0900366 .extIntf(extNetwork.extIntf())
Jian Li7709eb42019-05-08 15:58:04 +0900367 .podCidr(podCidr)
Jian Li49109b52019-01-22 00:17:28 +0900368 .build();
369 }
370
371 @Override
Jian Li1b08d652019-05-02 17:28:09 +0900372 public K8sNode updateExtGatewayMac(MacAddress newMac) {
373 return new Builder()
374 .hostname(hostname)
Jian Li58b33982020-07-01 19:07:02 +0900375 .clusterName(clusterName)
Jian Li1b08d652019-05-02 17:28:09 +0900376 .type(type)
Jian Li58b33982020-07-01 19:07:02 +0900377 .segmentId(segmentId)
378 .mode(mode)
Jian Li1b08d652019-05-02 17:28:09 +0900379 .intgBridge(intgBridge)
Jian Li7709eb42019-05-08 15:58:04 +0900380 .extBridge(extBridge)
Jian Li121ddfe2019-08-27 02:07:05 +0900381 .localBridge(localBridge)
Jian Li58b33982020-07-01 19:07:02 +0900382 .tunBridge(tunBridge)
Jian Li1b08d652019-05-02 17:28:09 +0900383 .managementIp(managementIp)
384 .dataIp(dataIp)
Jian Li9bc67772020-10-07 02:12:33 +0900385 .nodeIp(nodeIp)
Jian Li1b08d652019-05-02 17:28:09 +0900386 .state(state)
Jian Li58b33982020-07-01 19:07:02 +0900387 .extBridgeIp(extNetwork.extBridgeIp())
388 .extGatewayIp(extNetwork.extGatewayIp())
Jian Li1b08d652019-05-02 17:28:09 +0900389 .extGatewayMac(newMac)
Jian Li9bc67772020-10-07 02:12:33 +0900390 .extIntf(extNetwork.extIntf())
Jian Li7709eb42019-05-08 15:58:04 +0900391 .podCidr(podCidr)
Jian Li1b08d652019-05-02 17:28:09 +0900392 .build();
Jian Li1b08d652019-05-02 17:28:09 +0900393 }
394
395 @Override
Jian Li49109b52019-01-22 00:17:28 +0900396 public PortNumber grePortNum() {
Jian Li58b33982020-07-01 19:07:02 +0900397 return tunnelPortNum(grePortName());
Jian Li49109b52019-01-22 00:17:28 +0900398 }
399
400 @Override
401 public PortNumber vxlanPortNum() {
Jian Li58b33982020-07-01 19:07:02 +0900402 return tunnelPortNum(vxlanPortName());
Jian Li49109b52019-01-22 00:17:28 +0900403 }
404
405 @Override
406 public PortNumber genevePortNum() {
Jian Li58b33982020-07-01 19:07:02 +0900407 return tunnelPortNum(genevePortName());
Jian Li49109b52019-01-22 00:17:28 +0900408 }
409
410 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900411 public PortNumber intgBridgePortNum() {
Jian Li89164182020-09-04 19:38:37 +0900412 return PortNumber.LOCAL;
Jian Lieb488ea2019-04-16 01:50:02 +0900413 }
414
415 @Override
416 public PortNumber intgToExtPatchPortNum() {
Jian Li58b33982020-07-01 19:07:02 +0900417 return portNumber(intgBridge, intgToExtPatchPortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900418 }
419
420 @Override
Jian Li121ddfe2019-08-27 02:07:05 +0900421 public PortNumber intgToLocalPatchPortNum() {
Jian Li58b33982020-07-01 19:07:02 +0900422 return portNumber(intgBridge, intgToLocalPatchPortName());
Jian Li121ddfe2019-08-27 02:07:05 +0900423 }
424
425 @Override
Jian Li58b33982020-07-01 19:07:02 +0900426 public PortNumber localToIntgPatchPortNum() {
427 return portNumber(localBridge, localToIntgPatchPortName());
Jian Li121ddfe2019-08-27 02:07:05 +0900428 }
429
430 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900431 public PortNumber extToIntgPatchPortNum() {
Jian Li58b33982020-07-01 19:07:02 +0900432 return portNumber(extBridge, extToIntgPatchPortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900433 }
434
435 @Override
Jian Li1ecfbb72020-09-02 14:45:35 +0900436 public PortNumber intgToTunPortNum() {
437 return portNumber(intgBridge, intgToTunPatchPortName());
438 }
439
440 @Override
441 public PortNumber tunToIntgPortNum() {
Jian Li3cb86e32020-09-07 17:01:11 +0900442 if (mode() == PASSTHROUGH) {
443 K8sHostService hostService =
444 DefaultServiceDirectory.getService(K8sHostService.class);
445 Port port = null;
446 for (K8sHost host : hostService.hosts()) {
447 if (host.nodeNames().contains(hostname())) {
448 for (K8sTunnelBridge bridge : host.tunBridges()) {
449 if (bridge.tunnelId() == segmentId()) {
450 port = port(bridge.deviceId(), tunToIntgPatchPortName());
451 }
452 }
453 }
454 }
455
456 if (port == null) {
457 return null;
458 } else {
459 return port.number();
460 }
461 } else {
462 return portNumber(tunBridge, tunToIntgPatchPortName());
463 }
Jian Li1ecfbb72020-09-02 14:45:35 +0900464 }
465
466 @Override
Jian Li4860e372020-09-09 10:23:21 +0900467 public PortNumber routerToExtPortNum() {
468 if (mode() == PASSTHROUGH) {
469 K8sHostService hostService =
470 DefaultServiceDirectory.getService(K8sHostService.class);
471 Port port = null;
472 for (K8sHost host : hostService.hosts()) {
473 if (host.nodeNames().contains(hostname())) {
474 for (K8sRouterBridge bridge : host.routerBridges()) {
475 if (bridge.segmentId() == segmentId()) {
476 port = port(bridge.deviceId(), routerToExtPatchPortName());
477 }
478 }
479 }
480 }
481
482 if (port == null) {
483 return null;
484 } else {
485 return port.number();
486 }
487 }
488
489 return null;
490 }
491
492 @Override
493 public PortNumber extToRouterPortNum() {
494 return portNumber(extBridge, extToRouterPatchPortName());
495 }
496
497 @Override
498 public PortNumber routerPortNum() {
499 if (mode() == PASSTHROUGH) {
500 K8sHostService hostService =
501 DefaultServiceDirectory.getService(K8sHostService.class);
502 Port port = null;
503 for (K8sHost host : hostService.hosts()) {
504 if (host.nodeNames().contains(hostname())) {
505 for (K8sRouterBridge bridge : host.routerBridges()) {
506 if (bridge.segmentId() == segmentId()) {
507 port = port(bridge.deviceId(), routerPortName());
508 }
509 }
510 }
511 }
512
513 if (port == null) {
514 return null;
515 } else {
516 return port.number();
517 }
518 }
519
520 return null;
521 }
522
523 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900524 public PortNumber extBridgePortNum() {
Jian Li89164182020-09-04 19:38:37 +0900525 return PortNumber.LOCAL;
Jian Lieb488ea2019-04-16 01:50:02 +0900526 }
527
528 @Override
Jian Lib1218442020-09-03 13:12:14 +0900529 public PortNumber extIntfPortNum() {
Jian Li9bc67772020-10-07 02:12:33 +0900530 if (this.extIntf() == null) {
Jian Lib1218442020-09-03 13:12:14 +0900531 return null;
532 }
533 return portNumber(extBridge, extIntf());
534 }
535
536 @Override
Jian Li5a9c2bb2019-05-07 13:21:52 +0900537 public MacAddress intgBridgeMac() {
Jian Li4860e372020-09-09 10:23:21 +0900538 if (mode == PASSTHROUGH) {
539 return MacAddress.valueOf(DEFAULT_INTG_BRIDGE_MAC);
540 } else {
541 return macAddress(intgBridge, intgBridgeName());
542 }
Jian Li5a9c2bb2019-05-07 13:21:52 +0900543 }
544
545 @Override
546 public IpAddress extBridgeIp() {
Jian Li58b33982020-07-01 19:07:02 +0900547 return extNetwork.extBridgeIp();
Jian Li5a9c2bb2019-05-07 13:21:52 +0900548 }
549
550 @Override
551 public MacAddress extBridgeMac() {
Jian Lib1218442020-09-03 13:12:14 +0900552 if (MacAddress.valueOf(DEFAULT_EXTERNAL_GATEWAY_MAC).equals(extGatewayMac())) {
553 return MacAddress.valueOf(DEFAULT_EXTERNAL_BRIDGE_MAC);
554 } else {
555 return macAddress(extBridge, extBridgeName());
556 }
Jian Li5a9c2bb2019-05-07 13:21:52 +0900557 }
558
559 @Override
560 public IpAddress extGatewayIp() {
Jian Li58b33982020-07-01 19:07:02 +0900561 return extNetwork.extGatewayIp();
Jian Li5a9c2bb2019-05-07 13:21:52 +0900562 }
563
564 @Override
565 public MacAddress extGatewayMac() {
Jian Li58b33982020-07-01 19:07:02 +0900566 return extNetwork.extGatewayMac();
567 }
568
569 @Override
570 public String grePortName() {
571 if (mode == PASSTHROUGH) {
572 return GRE_TUNNEL + "-" + segmentId;
573 } else {
574 return GRE_TUNNEL;
575 }
576 }
577
578 @Override
579 public String vxlanPortName() {
580 if (mode == PASSTHROUGH) {
581 return VXLAN_TUNNEL + "-" + segmentId;
582 } else {
583 return VXLAN_TUNNEL;
584 }
585 }
586
587 @Override
588 public String genevePortName() {
589 if (mode == PASSTHROUGH) {
590 return GENEVE_TUNNEL + "-" + segmentId;
591 } else {
592 return GENEVE_TUNNEL;
593 }
594 }
595
596 @Override
597 public String intgBridgeName() {
598 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900599 return INTEGRATION_BRIDGE + "-" + uniqueString(4);
Jian Li58b33982020-07-01 19:07:02 +0900600 } else {
601 return INTEGRATION_BRIDGE;
602 }
603 }
604
605 @Override
Jian Li4860e372020-09-09 10:23:21 +0900606 public String intgEntryPortName() {
607 if (mode == PASSTHROUGH) {
Jian Li25210732020-09-10 23:16:50 +0900608 return k8sIntgToOsPatchPortName();
Jian Li4860e372020-09-09 10:23:21 +0900609 } else {
610 return intgBridgeName();
611 }
612 }
613
614 @Override
615 public PortNumber intgEntryPortNum() {
616 if (mode == PASSTHROUGH) {
Jian Li25210732020-09-10 23:16:50 +0900617 return portNumber(intgBridge, k8sIntgToOsPatchPortName());
Jian Li4860e372020-09-09 10:23:21 +0900618 } else {
619 return intgBridgePortNum();
620 }
621 }
622
623 @Override
Jian Li58b33982020-07-01 19:07:02 +0900624 public String extBridgeName() {
625 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900626 return EXTERNAL_BRIDGE + "-" + uniqueString(4);
Jian Li58b33982020-07-01 19:07:02 +0900627 } else {
628 return EXTERNAL_BRIDGE;
629 }
630 }
631
632 @Override
633 public String localBridgeName() {
634 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900635 return LOCAL_BRIDGE + "-" + uniqueString(4);
Jian Li58b33982020-07-01 19:07:02 +0900636 } else {
637 return LOCAL_BRIDGE;
638 }
639 }
640
641 @Override
642 public String tunBridgeName() {
643 if (mode == PASSTHROUGH) {
644 return TUNNEL_BRIDGE + "-" + segmentId;
645 } else {
646 return TUNNEL_BRIDGE;
647 }
648 }
649
650 @Override
651 public String intgBridgePortName() {
652 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900653 return INTEGRATION_BRIDGE + "-" + uniqueString(4);
Jian Li58b33982020-07-01 19:07:02 +0900654 } else {
655 return INTEGRATION_BRIDGE;
656 }
657 }
658
659 @Override
660 public String extBridgePortName() {
661 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900662 return EXTERNAL_BRIDGE + "-" + uniqueString(4);
Jian Li58b33982020-07-01 19:07:02 +0900663 } else {
664 return EXTERNAL_BRIDGE;
665 }
666 }
667
668 @Override
669 public String localBridgePortName() {
670 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900671 return LOCAL_BRIDGE + "-" + uniqueString(4);
Jian Li58b33982020-07-01 19:07:02 +0900672 } else {
673 return LOCAL_BRIDGE;
674 }
675 }
676
677 @Override
Jian Li1ecfbb72020-09-02 14:45:35 +0900678 public String tunBridgePortName() {
679 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900680 return TUNNEL_BRIDGE + "-" + uniqueString(4);
Jian Li1ecfbb72020-09-02 14:45:35 +0900681 } else {
682 return TUNNEL_BRIDGE;
683 }
684 }
685
686 @Override
Jian Li58b33982020-07-01 19:07:02 +0900687 public String intgToExtPatchPortName() {
688 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900689 return INTEGRATION_TO_EXTERNAL_BRIDGE + "-" + uniqueString(4);
Jian Li58b33982020-07-01 19:07:02 +0900690 } else {
691 return INTEGRATION_TO_EXTERNAL_BRIDGE;
692 }
693 }
694
695 @Override
696 public String intgToTunPatchPortName() {
697 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900698 return INTEGRATION_TO_TUN_BRIDGE + "-" + uniqueString(4);
Jian Li58b33982020-07-01 19:07:02 +0900699 } else {
700 return INTEGRATION_TO_TUN_BRIDGE;
701 }
702 }
703
704 @Override
705 public String intgToLocalPatchPortName() {
706 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900707 return INTEGRATION_TO_LOCAL_BRIDGE + "-" + uniqueString(4);
Jian Li58b33982020-07-01 19:07:02 +0900708 } else {
709 return INTEGRATION_TO_LOCAL_BRIDGE;
710 }
711 }
712
713 @Override
714 public String localToIntgPatchPortName() {
715 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900716 return LOCAL_TO_INTEGRATION_BRIDGE + "-" + uniqueString(4);
Jian Li58b33982020-07-01 19:07:02 +0900717 } else {
718 return LOCAL_TO_INTEGRATION_BRIDGE;
719 }
720 }
721
722 @Override
723 public String extToIntgPatchPortName() {
724 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900725 return PHYSICAL_EXTERNAL_BRIDGE + "-" + uniqueString(4);
Jian Li58b33982020-07-01 19:07:02 +0900726 } else {
727 return PHYSICAL_EXTERNAL_BRIDGE;
728 }
729 }
730
731 @Override
732 public String tunToIntgPatchPortName() {
733 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900734 return TUN_TO_INTEGRATION_BRIDGE + "-" + uniqueString(4);
Jian Li58b33982020-07-01 19:07:02 +0900735 } else {
736 return TUN_TO_INTEGRATION_BRIDGE;
737 }
Jian Li5a9c2bb2019-05-07 13:21:52 +0900738 }
739
740 @Override
Jian Li25210732020-09-10 23:16:50 +0900741 public String k8sIntgToOsPatchPortName() {
Jian Li4860e372020-09-09 10:23:21 +0900742 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900743 return K8S_INTEGRATION_TO_OS_BRIDGE + "-" + uniqueString(4);
Jian Li4860e372020-09-09 10:23:21 +0900744 } else {
Jian Li25210732020-09-10 23:16:50 +0900745 return K8S_INTEGRATION_TO_OS_BRIDGE;
746 }
747 }
748
749 @Override
750 public String k8sExtToOsPatchPortName() {
751 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900752 return K8S_EXTERNAL_TO_OS_BRIDGE + "-" + uniqueString(4);
Jian Li25210732020-09-10 23:16:50 +0900753 } else {
754 return K8S_EXTERNAL_TO_OS_BRIDGE;
Jian Li4860e372020-09-09 10:23:21 +0900755 }
756 }
757
758 @Override
759 public String osToK8sIntgPatchPortName() {
760 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900761 return OS_TO_K8S_INTEGRATION_BRIDGE + "-" + uniqueString(4);
Jian Li4860e372020-09-09 10:23:21 +0900762 } else {
Jian Li25210732020-09-10 23:16:50 +0900763 return OS_TO_K8S_INTEGRATION_BRIDGE;
764 }
765 }
766
767 @Override
768 public String osToK8sExtPatchPortName() {
769 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900770 return OS_TO_K8S_EXTERNAL_BRIDGE + "-" + uniqueString(4);
Jian Li25210732020-09-10 23:16:50 +0900771 } else {
772 return OS_TO_K8S_EXTERNAL_BRIDGE;
Jian Li4860e372020-09-09 10:23:21 +0900773 }
774 }
775
776 @Override
777 public String routerToExtPatchPortName() {
778 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900779 return ROUTER_TO_EXTERNAL + "-" + uniqueString(4);
Jian Li4860e372020-09-09 10:23:21 +0900780 } else {
781 return ROUTER_TO_EXTERNAL;
782 }
783 }
784
785 @Override
786 public String extToRouterPatchPortName() {
787 if (mode == PASSTHROUGH) {
Jian Liadbe5152020-09-22 11:23:29 +0900788 return EXTERNAL_TO_ROUTER + "-" + uniqueString(4);
Jian Li4860e372020-09-09 10:23:21 +0900789 } else {
790 return EXTERNAL_TO_ROUTER;
791 }
792 }
793
794 @Override
795 public String routerPortName() {
796 if (mode == PASSTHROUGH) {
797 return ROUTER + "-" + segmentId();
798 } else {
799 return ROUTER;
800 }
801 }
802
803 @Override
Jian Li49109b52019-01-22 00:17:28 +0900804 public boolean equals(Object obj) {
805 if (this == obj) {
806 return true;
807 }
808
809 if (obj instanceof DefaultK8sNode) {
810 DefaultK8sNode that = (DefaultK8sNode) obj;
811
Jian Li58b33982020-07-01 19:07:02 +0900812 return clusterName.equals(that.clusterName) &&
813 hostname.equals(that.hostname) &&
Jian Li49109b52019-01-22 00:17:28 +0900814 type == that.type &&
Jian Li58b33982020-07-01 19:07:02 +0900815 segmentId == that.segmentId &&
816 mode == that.mode &&
Jian Li49109b52019-01-22 00:17:28 +0900817 intgBridge.equals(that.intgBridge) &&
Jian Libf562c22019-04-15 18:07:14 +0900818 extBridge.equals(that.extBridge) &&
Jian Li121ddfe2019-08-27 02:07:05 +0900819 localBridge.equals(that.localBridge) &&
Jian Li58b33982020-07-01 19:07:02 +0900820 tunBridge.equals(that.tunBridge) &&
Jian Li49109b52019-01-22 00:17:28 +0900821 managementIp.equals(that.managementIp) &&
822 dataIp.equals(that.dataIp) &&
Jian Li9bc67772020-10-07 02:12:33 +0900823 nodeIp.equals(that.nodeIp) &&
Jian Li58b33982020-07-01 19:07:02 +0900824 extNetwork.equals(that.extNetwork) &&
Jian Li7709eb42019-05-08 15:58:04 +0900825 podCidr.equals(that.podCidr) &&
Jian Li49109b52019-01-22 00:17:28 +0900826 state == that.state;
827 }
828
829 return false;
830 }
831
832 @Override
833 public int hashCode() {
Jian Li58b33982020-07-01 19:07:02 +0900834 return Objects.hash(clusterName, hostname, type, segmentId, mode, intgBridge, extBridge,
Jian Li9bc67772020-10-07 02:12:33 +0900835 localBridge, tunBridge, managementIp, dataIp, nodeIp, state, extNetwork, podCidr);
Jian Li49109b52019-01-22 00:17:28 +0900836 }
837
838 @Override
839 public String toString() {
840 return MoreObjects.toStringHelper(this)
Jian Li58b33982020-07-01 19:07:02 +0900841 .add("clusterName", clusterName)
Jian Li49109b52019-01-22 00:17:28 +0900842 .add("hostname", hostname)
843 .add("type", type)
Jian Li58b33982020-07-01 19:07:02 +0900844 .add("segmentId", segmentId)
845 .add("mode", mode)
Jian Li49109b52019-01-22 00:17:28 +0900846 .add("intgBridge", intgBridge)
Jian Libf562c22019-04-15 18:07:14 +0900847 .add("extBridge", extBridge)
Jian Li121ddfe2019-08-27 02:07:05 +0900848 .add("localBridge", localBridge)
Jian Li58b33982020-07-01 19:07:02 +0900849 .add("tunBridge", tunBridge)
Jian Li49109b52019-01-22 00:17:28 +0900850 .add("managementIp", managementIp)
851 .add("dataIp", dataIp)
Jian Li9bc67772020-10-07 02:12:33 +0900852 .add("nodeIp", nodeIp)
Jian Li49109b52019-01-22 00:17:28 +0900853 .add("state", state)
Jian Li58b33982020-07-01 19:07:02 +0900854 .add("extBridgeIp", extNetwork.extBridgeIp())
855 .add("extGatewayIp", extNetwork.extGatewayIp())
856 .add("extGatewayMac", extNetwork.extGatewayMac())
Jian Li9bc67772020-10-07 02:12:33 +0900857 .add("extIntf", extNetwork.extIntf())
Jian Li7709eb42019-05-08 15:58:04 +0900858 .add("podCidr", podCidr)
Jian Li49109b52019-01-22 00:17:28 +0900859 .toString();
860 }
861
862 private PortNumber tunnelPortNum(String tunnelType) {
863 if (dataIp == null) {
864 return null;
865 }
Jian Lieb488ea2019-04-16 01:50:02 +0900866
Jian Li58b33982020-07-01 19:07:02 +0900867 return portNumber(tunBridge, tunnelType);
Jian Lieb488ea2019-04-16 01:50:02 +0900868 }
869
Jian Li5a9c2bb2019-05-07 13:21:52 +0900870 private MacAddress macAddress(DeviceId deviceId, String portName) {
871 Port port = port(deviceId, portName);
872 Annotations annots = port.annotations();
873 return annots != null ? MacAddress.valueOf(annots.value(PORT_MAC)) : null;
874 }
875
Jian Lieb488ea2019-04-16 01:50:02 +0900876 private PortNumber portNumber(DeviceId deviceId, String portName) {
Jian Li5a9c2bb2019-05-07 13:21:52 +0900877 Port port = port(deviceId, portName);
878 return port != null ? port.number() : null;
879 }
880
881 private Port port(DeviceId deviceId, String portName) {
Jian Li49109b52019-01-22 00:17:28 +0900882 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
Jian Li5a9c2bb2019-05-07 13:21:52 +0900883 return deviceService.getPorts(deviceId).stream()
Jian Li49109b52019-01-22 00:17:28 +0900884 .filter(p -> p.isEnabled() &&
Jian Lieb488ea2019-04-16 01:50:02 +0900885 Objects.equals(p.annotations().value(PORT_NAME), portName))
Jian Li49109b52019-01-22 00:17:28 +0900886 .findAny().orElse(null);
Jian Li49109b52019-01-22 00:17:28 +0900887 }
888
889 /**
890 * Returns new builder instance.
891 *
892 * @return kubernetes node builder
893 */
894 public static Builder builder() {
895 return new Builder();
896 }
897
898 /**
899 * Returns new builder instance with the given node as a default value.
900 *
901 * @param node kubernetes node
902 * @return kubernetes node builder
903 */
904 public static Builder from(K8sNode node) {
905 return new Builder()
906 .hostname(node.hostname())
Jian Li58b33982020-07-01 19:07:02 +0900907 .clusterName(node.clusterName())
Jian Li49109b52019-01-22 00:17:28 +0900908 .type(node.type())
Jian Li58b33982020-07-01 19:07:02 +0900909 .segmentId(node.segmentId())
Jian Li49109b52019-01-22 00:17:28 +0900910 .intgBridge(node.intgBridge())
Jian Libf562c22019-04-15 18:07:14 +0900911 .extBridge(node.extBridge())
Jian Li121ddfe2019-08-27 02:07:05 +0900912 .localBridge(node.localBridge())
Jian Li58b33982020-07-01 19:07:02 +0900913 .tunBridge(node.tunBridge())
Jian Li7709eb42019-05-08 15:58:04 +0900914 .extIntf(node.extIntf())
Jian Li49109b52019-01-22 00:17:28 +0900915 .managementIp(node.managementIp())
916 .dataIp(node.dataIp())
Jian Li9bc67772020-10-07 02:12:33 +0900917 .nodeIp(node.nodeIp())
Jian Li1b08d652019-05-02 17:28:09 +0900918 .state(node.state())
Jian Li7709eb42019-05-08 15:58:04 +0900919 .extBridgeIp(node.extBridgeIp())
920 .extGatewayIp(node.extGatewayIp())
921 .extGatewayMac(node.extGatewayMac())
Jian Li9bc67772020-10-07 02:12:33 +0900922 .extIntf(node.extIntf())
Jian Li7709eb42019-05-08 15:58:04 +0900923 .podCidr(node.podCidr());
Jian Li49109b52019-01-22 00:17:28 +0900924 }
925
926 public static final class Builder implements K8sNode.Builder {
927
Jian Li58b33982020-07-01 19:07:02 +0900928 private String clusterName;
Jian Li49109b52019-01-22 00:17:28 +0900929 private String hostname;
930 private Type type;
Jian Li58b33982020-07-01 19:07:02 +0900931 private int segmentId;
932 private Mode mode;
Jian Li49109b52019-01-22 00:17:28 +0900933 private DeviceId intgBridge;
Jian Libf562c22019-04-15 18:07:14 +0900934 private DeviceId extBridge;
Jian Li121ddfe2019-08-27 02:07:05 +0900935 private DeviceId localBridge;
Jian Li58b33982020-07-01 19:07:02 +0900936 private DeviceId tunBridge;
Jian Li49109b52019-01-22 00:17:28 +0900937 private IpAddress managementIp;
938 private IpAddress dataIp;
Jian Li9bc67772020-10-07 02:12:33 +0900939 private IpAddress nodeIp;
Jian Li49109b52019-01-22 00:17:28 +0900940 private K8sNodeState state;
Jian Li3defa842019-02-12 00:31:35 +0900941 private K8sApiConfig apiConfig;
Jian Li7709eb42019-05-08 15:58:04 +0900942 private String extIntf;
943 private IpAddress extBridgeIp;
944 private IpAddress extGatewayIp;
Jian Li1b08d652019-05-02 17:28:09 +0900945 private MacAddress extGatewayMac;
Jian Li7709eb42019-05-08 15:58:04 +0900946 private String podCidr;
Jian Li49109b52019-01-22 00:17:28 +0900947
948 // private constructor not intended to use from external
949 private Builder() {
950 }
951
952 @Override
953 public K8sNode build() {
954 checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
955 checkArgument(type != null, NOT_NULL_MSG, "type");
956 checkArgument(state != null, NOT_NULL_MSG, "state");
957 checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
Jian Li9bc67772020-10-07 02:12:33 +0900958 checkArgument(nodeIp != null, NOT_NULL_MSG, "node IP");
Jian Li49109b52019-01-22 00:17:28 +0900959
Jian Li58b33982020-07-01 19:07:02 +0900960 if (StringUtils.isEmpty(clusterName)) {
961 clusterName = DEFAULT_CLUSTER_NAME;
962 }
963
964 if (mode == null) {
965 mode = NORMAL;
966 }
967
968 K8sExternalNetwork extNetwork = DefaultK8sExternalNetwork.builder()
969 .extBridgeIp(extBridgeIp)
970 .extGatewayIp(extGatewayIp)
971 .extGatewayMac(extGatewayMac)
Jian Li9bc67772020-10-07 02:12:33 +0900972 .extIntf(extIntf)
Jian Li58b33982020-07-01 19:07:02 +0900973 .build();
974
975 return new DefaultK8sNode(clusterName,
976 hostname,
Jian Li49109b52019-01-22 00:17:28 +0900977 type,
Jian Li58b33982020-07-01 19:07:02 +0900978 segmentId,
979 mode,
Jian Li49109b52019-01-22 00:17:28 +0900980 intgBridge,
Jian Libf562c22019-04-15 18:07:14 +0900981 extBridge,
Jian Li121ddfe2019-08-27 02:07:05 +0900982 localBridge,
Jian Li58b33982020-07-01 19:07:02 +0900983 tunBridge,
Jian Li49109b52019-01-22 00:17:28 +0900984 managementIp,
985 dataIp,
Jian Li9bc67772020-10-07 02:12:33 +0900986 nodeIp,
Jian Li1b08d652019-05-02 17:28:09 +0900987 state,
Jian Li58b33982020-07-01 19:07:02 +0900988 extNetwork,
Jian Li7709eb42019-05-08 15:58:04 +0900989 podCidr);
Jian Li49109b52019-01-22 00:17:28 +0900990 }
991
992 @Override
Jian Li58b33982020-07-01 19:07:02 +0900993 public Builder clusterName(String clusterName) {
994 this.clusterName = clusterName;
995 return this;
996 }
997
998 @Override
Jian Li49109b52019-01-22 00:17:28 +0900999 public Builder hostname(String hostname) {
1000 this.hostname = hostname;
1001 return this;
1002 }
1003
1004 @Override
1005 public Builder type(Type type) {
1006 this.type = type;
1007 return this;
1008 }
1009
1010 @Override
Jian Li58b33982020-07-01 19:07:02 +09001011 public Builder segmentId(int segmentId) {
1012 this.segmentId = segmentId;
1013 return this;
1014 }
1015
1016 @Override
1017 public Builder mode(Mode mode) {
1018 this.mode = mode;
1019 return this;
1020 }
1021
1022 @Override
Jian Li49109b52019-01-22 00:17:28 +09001023 public Builder intgBridge(DeviceId deviceId) {
1024 this.intgBridge = deviceId;
1025 return this;
1026 }
1027
1028 @Override
Jian Libf562c22019-04-15 18:07:14 +09001029 public Builder extBridge(DeviceId deviceId) {
1030 this.extBridge = deviceId;
1031 return this;
1032 }
1033
1034 @Override
Jian Li121ddfe2019-08-27 02:07:05 +09001035 public Builder localBridge(DeviceId deviceId) {
1036 this.localBridge = deviceId;
1037 return this;
1038 }
1039
1040 @Override
Jian Li58b33982020-07-01 19:07:02 +09001041 public Builder tunBridge(DeviceId deviceId) {
1042 this.tunBridge = deviceId;
1043 return this;
1044 }
1045
1046 @Override
Jian Li49109b52019-01-22 00:17:28 +09001047 public Builder managementIp(IpAddress managementIp) {
1048 this.managementIp = managementIp;
1049 return this;
1050 }
1051
1052 @Override
1053 public Builder dataIp(IpAddress dataIp) {
1054 this.dataIp = dataIp;
1055 return this;
1056 }
1057
1058 @Override
Jian Li9bc67772020-10-07 02:12:33 +09001059 public Builder nodeIp(IpAddress nodeIp) {
1060 this.nodeIp = nodeIp;
1061 return this;
1062 }
1063
1064 @Override
Jian Li49109b52019-01-22 00:17:28 +09001065 public Builder state(K8sNodeState state) {
1066 this.state = state;
1067 return this;
1068 }
Jian Li1b08d652019-05-02 17:28:09 +09001069
1070 @Override
Jian Li7709eb42019-05-08 15:58:04 +09001071 public Builder extBridgeIp(IpAddress extBridgeIp) {
1072 this.extBridgeIp = extBridgeIp;
1073 return this;
1074 }
1075
1076 @Override
1077 public Builder extGatewayIp(IpAddress extGatewayIp) {
1078 this.extGatewayIp = extGatewayIp;
1079 return this;
1080 }
1081
1082 @Override
Jian Li1b08d652019-05-02 17:28:09 +09001083 public Builder extGatewayMac(MacAddress extGatewayMac) {
1084 this.extGatewayMac = extGatewayMac;
1085 return this;
1086 }
Jian Li7709eb42019-05-08 15:58:04 +09001087
1088 @Override
Jian Li9bc67772020-10-07 02:12:33 +09001089 public Builder extIntf(String intf) {
1090 this.extIntf = intf;
1091 return this;
1092 }
1093
1094 @Override
Jian Li7709eb42019-05-08 15:58:04 +09001095 public Builder podCidr(String podCidr) {
1096 this.podCidr = podCidr;
1097 return this;
1098 }
Jian Li49109b52019-01-22 00:17:28 +09001099 }
1100}