blob: 4e430a3500d09b12b89ff53c0990a04b0afca504 [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 Lieb488ea2019-04-16 01:50:02 +090035import static org.onosproject.k8snode.api.Constants.EXTERNAL_BRIDGE;
Jian Li49109b52019-01-22 00:17:28 +090036import static org.onosproject.k8snode.api.Constants.GENEVE_TUNNEL;
37import static org.onosproject.k8snode.api.Constants.GRE_TUNNEL;
Jian Li4aa17642019-01-30 00:01:11 +090038import static org.onosproject.k8snode.api.Constants.INTEGRATION_BRIDGE;
Jian Lieb488ea2019-04-16 01:50:02 +090039import static org.onosproject.k8snode.api.Constants.INTEGRATION_TO_EXTERNAL_BRIDGE;
Jian Li1a2eb5d2019-08-27 02:07:05 +090040import static org.onosproject.k8snode.api.Constants.INTEGRATION_TO_LOCAL_BRIDGE;
Jian Lie2a04ce2020-07-01 19:07:02 +090041import static org.onosproject.k8snode.api.Constants.INTEGRATION_TO_TUN_BRIDGE;
42import static org.onosproject.k8snode.api.Constants.LOCAL_BRIDGE;
Jian Li1a2eb5d2019-08-27 02:07:05 +090043import static org.onosproject.k8snode.api.Constants.LOCAL_TO_INTEGRATION_BRIDGE;
Jian Lieb488ea2019-04-16 01:50:02 +090044import static org.onosproject.k8snode.api.Constants.PHYSICAL_EXTERNAL_BRIDGE;
Jian Lie2a04ce2020-07-01 19:07:02 +090045import static org.onosproject.k8snode.api.Constants.TUNNEL_BRIDGE;
46import static org.onosproject.k8snode.api.Constants.TUN_TO_INTEGRATION_BRIDGE;
Jian Li49109b52019-01-22 00:17:28 +090047import static org.onosproject.k8snode.api.Constants.VXLAN_TUNNEL;
Jian Lie2a04ce2020-07-01 19:07:02 +090048import static org.onosproject.k8snode.api.K8sApiConfig.Mode.NORMAL;
49import static org.onosproject.k8snode.api.K8sApiConfig.Mode.PASSTHROUGH;
Jian Li49109b52019-01-22 00:17:28 +090050import static org.onosproject.net.AnnotationKeys.PORT_NAME;
51
52/**
53 * Representation of a kubernetes node.
54 */
55public class DefaultK8sNode implements K8sNode {
56
Jian Li2778ffa2019-05-07 13:21:52 +090057 private static final String PORT_MAC = "portMac";
Jian Lie2a04ce2020-07-01 19:07:02 +090058 private static final String FLOW_KEY = "flow";
Jian Li7d111d72019-04-12 13:58:44 +090059
Jian Lie2a04ce2020-07-01 19:07:02 +090060 private static final int SHORT_NAME_LENGTH = 10;
61
62 private final String clusterName;
Jian Li49109b52019-01-22 00:17:28 +090063 private final String hostname;
64 private final Type type;
Jian Lie2a04ce2020-07-01 19:07:02 +090065 private final int segmentId;
66 private final Mode mode;
Jian Li49109b52019-01-22 00:17:28 +090067 private final DeviceId intgBridge;
Jian Libf562c22019-04-15 18:07:14 +090068 private final DeviceId extBridge;
Jian Li1a2eb5d2019-08-27 02:07:05 +090069 private final DeviceId localBridge;
Jian Lie2a04ce2020-07-01 19:07:02 +090070 private final DeviceId tunBridge;
Jian Li49109b52019-01-22 00:17:28 +090071 private final IpAddress managementIp;
72 private final IpAddress dataIp;
73 private final K8sNodeState state;
Jian Li0c632722019-05-08 15:58:04 +090074 private final String extIntf;
Jian Lie2a04ce2020-07-01 19:07:02 +090075 private final K8sExternalNetwork extNetwork;
Jian Li0c632722019-05-08 15:58:04 +090076 private final String podCidr;
Jian Li49109b52019-01-22 00:17:28 +090077
78 private static final String NOT_NULL_MSG = "Node % cannot be null";
79
80 private static final String OVSDB = "ovsdb:";
81
82 /**
83 * A default constructor of kubernetes Node.
84 *
Jian Lie2a04ce2020-07-01 19:07:02 +090085 * @param clusterName clusterName
Jian Li49109b52019-01-22 00:17:28 +090086 * @param hostname hostname
87 * @param type node type
Jian Lie2a04ce2020-07-01 19:07:02 +090088 * @param segmentId segment identifier
89 * @param mode CNI running mode
Jian Li49109b52019-01-22 00:17:28 +090090 * @param intgBridge integration bridge
Jian Libf562c22019-04-15 18:07:14 +090091 * @param extBridge external bridge
Jian Li1a2eb5d2019-08-27 02:07:05 +090092 * @param localBridge local bridge
Jian Lie2a04ce2020-07-01 19:07:02 +090093 * @param tunBridge tunnel bridge
Jian Li0c632722019-05-08 15:58:04 +090094 * @param extIntf external interface
Jian Li49109b52019-01-22 00:17:28 +090095 * @param managementIp management IP address
96 * @param dataIp data IP address
97 * @param state node state
Jian Lie2a04ce2020-07-01 19:07:02 +090098 * @param extNetwork external network
Jian Li0c632722019-05-08 15:58:04 +090099 * @param podCidr POD CIDR
Jian Li49109b52019-01-22 00:17:28 +0900100 */
Jian Lie2a04ce2020-07-01 19:07:02 +0900101 protected DefaultK8sNode(String clusterName, String hostname, Type type,
102 int segmentId, Mode mode, DeviceId intgBridge,
Jian Li1a2eb5d2019-08-27 02:07:05 +0900103 DeviceId extBridge, DeviceId localBridge,
Jian Lie2a04ce2020-07-01 19:07:02 +0900104 DeviceId tunBridge, String extIntf, IpAddress managementIp,
Jian Li1a2eb5d2019-08-27 02:07:05 +0900105 IpAddress dataIp, K8sNodeState state,
Jian Lie2a04ce2020-07-01 19:07:02 +0900106 K8sExternalNetwork extNetwork, String podCidr) {
107 this.clusterName = clusterName;
Jian Li49109b52019-01-22 00:17:28 +0900108 this.hostname = hostname;
109 this.type = type;
Jian Lie2a04ce2020-07-01 19:07:02 +0900110 this.mode = mode;
111 this.segmentId = segmentId;
Jian Li49109b52019-01-22 00:17:28 +0900112 this.intgBridge = intgBridge;
Jian Libf562c22019-04-15 18:07:14 +0900113 this.extBridge = extBridge;
Jian Li1a2eb5d2019-08-27 02:07:05 +0900114 this.localBridge = localBridge;
Jian Lie2a04ce2020-07-01 19:07:02 +0900115 this.tunBridge = tunBridge;
Jian Li0c632722019-05-08 15:58:04 +0900116 this.extIntf = extIntf;
Jian Li49109b52019-01-22 00:17:28 +0900117 this.managementIp = managementIp;
118 this.dataIp = dataIp;
119 this.state = state;
Jian Lie2a04ce2020-07-01 19:07:02 +0900120 this.extNetwork = extNetwork;
Jian Li0c632722019-05-08 15:58:04 +0900121 this.podCidr = podCidr;
Jian Li49109b52019-01-22 00:17:28 +0900122 }
123
124 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900125 public String clusterName() {
126 return clusterName;
127 }
128
129 @Override
130 public String hostShortName() {
131 return StringUtils.substring(hostname, 0, SHORT_NAME_LENGTH);
132 }
133
134 @Override
135 public String uniqueString(int length) {
136 String uuid = UUID.nameUUIDFromBytes(hostname.getBytes()).toString();
137 return StringUtils.substring(uuid, 0, length);
138 }
139
140 @Override
141 public int segmentId() {
142 return segmentId;
143 }
144
145 @Override
146 public String tunnelKey() {
147 if (mode == PASSTHROUGH) {
148 return String.valueOf(segmentId);
149 } else {
150 return FLOW_KEY;
151 }
152 }
153
154 @Override
155 public Mode mode() {
156 return mode;
157 }
158
159 @Override
Jian Li49109b52019-01-22 00:17:28 +0900160 public String hostname() {
161 return hostname;
162 }
163
164 @Override
165 public Type type() {
166 return type;
167 }
168
169 @Override
170 public DeviceId ovsdb() {
171 return DeviceId.deviceId(OVSDB + managementIp().toString());
172 }
173
174 @Override
175 public DeviceId intgBridge() {
176 return intgBridge;
177 }
178
179 @Override
Jian Libf562c22019-04-15 18:07:14 +0900180 public DeviceId extBridge() {
181 return extBridge;
182 }
183
184 @Override
Jian Li1a2eb5d2019-08-27 02:07:05 +0900185 public DeviceId localBridge() {
186 return localBridge;
187 }
188
189 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900190 public DeviceId tunBridge() {
191 return tunBridge;
192 }
193
194 @Override
Jian Li0c632722019-05-08 15:58:04 +0900195 public String extIntf() {
196 return extIntf;
197 }
198
199 @Override
Jian Li1cee9882019-02-13 11:25:25 +0900200 public K8sNode updateIntgBridge(DeviceId deviceId) {
201 return new Builder()
202 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900203 .clusterName(clusterName)
Jian Li1cee9882019-02-13 11:25:25 +0900204 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900205 .segmentId(segmentId)
206 .mode(mode)
Jian Li1cee9882019-02-13 11:25:25 +0900207 .intgBridge(deviceId)
Jian Libf562c22019-04-15 18:07:14 +0900208 .extBridge(extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900209 .localBridge(localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900210 .tunBridge(tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900211 .extIntf(extIntf)
Jian Libf562c22019-04-15 18:07:14 +0900212 .managementIp(managementIp)
213 .dataIp(dataIp)
214 .state(state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900215 .extBridgeIp(extNetwork.extBridgeIp())
216 .extGatewayIp(extNetwork.extGatewayIp())
217 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900218 .podCidr(podCidr)
Jian Libf562c22019-04-15 18:07:14 +0900219 .build();
220 }
221
222 @Override
223 public K8sNode updateExtBridge(DeviceId deviceId) {
224 return new Builder()
225 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900226 .clusterName(clusterName)
Jian Libf562c22019-04-15 18:07:14 +0900227 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900228 .segmentId(segmentId)
229 .mode(mode)
Jian Libf562c22019-04-15 18:07:14 +0900230 .intgBridge(intgBridge)
231 .extBridge(deviceId)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900232 .localBridge(localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900233 .tunBridge(tunBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900234 .extIntf(extIntf)
235 .managementIp(managementIp)
236 .dataIp(dataIp)
237 .state(state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900238 .extBridgeIp(extNetwork.extBridgeIp())
239 .extGatewayIp(extNetwork.extGatewayIp())
240 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li1a2eb5d2019-08-27 02:07:05 +0900241 .podCidr(podCidr)
242 .build();
243 }
244
245 @Override
246 public K8sNode updateLocalBridge(DeviceId deviceId) {
247 return new Builder()
248 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900249 .clusterName(clusterName)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900250 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900251 .segmentId(segmentId)
252 .mode(mode)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900253 .intgBridge(intgBridge)
254 .extBridge(extBridge)
255 .localBridge(deviceId)
Jian Lie2a04ce2020-07-01 19:07:02 +0900256 .tunBridge(tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900257 .extIntf(extIntf)
Jian Li1cee9882019-02-13 11:25:25 +0900258 .managementIp(managementIp)
259 .dataIp(dataIp)
260 .state(state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900261 .extBridgeIp(extNetwork.extBridgeIp())
262 .extGatewayIp(extNetwork.extGatewayIp())
263 .extGatewayMac(extNetwork.extGatewayMac())
264 .podCidr(podCidr)
265 .build();
266 }
267
268 @Override
269 public K8sNode updateTunBridge(DeviceId deviceId) {
270 return new Builder()
271 .hostname(hostname)
272 .clusterName(clusterName)
273 .type(type)
274 .segmentId(segmentId)
275 .mode(mode)
276 .intgBridge(intgBridge)
277 .extBridge(extBridge)
278 .localBridge(localBridge)
279 .tunBridge(deviceId)
280 .extIntf(extIntf)
281 .managementIp(managementIp)
282 .dataIp(dataIp)
283 .state(state)
284 .extBridgeIp(extNetwork.extBridgeIp())
285 .extGatewayIp(extNetwork.extGatewayIp())
286 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900287 .podCidr(podCidr)
Jian Li1cee9882019-02-13 11:25:25 +0900288 .build();
289 }
290
291 @Override
Jian Li49109b52019-01-22 00:17:28 +0900292 public IpAddress managementIp() {
293 return managementIp;
294 }
295
296 @Override
297 public IpAddress dataIp() {
298 return dataIp;
299 }
300
301 @Override
302 public K8sNodeState state() {
303 return state;
304 }
305
306 @Override
Jian Li0c632722019-05-08 15:58:04 +0900307 public String podCidr() {
308 return podCidr;
309 }
310
311 @Override
Jian Li49109b52019-01-22 00:17:28 +0900312 public K8sNode updateState(K8sNodeState newState) {
313 return new Builder()
314 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900315 .clusterName(clusterName)
Jian Li49109b52019-01-22 00:17:28 +0900316 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900317 .segmentId(segmentId)
318 .mode(mode)
Jian Li49109b52019-01-22 00:17:28 +0900319 .intgBridge(intgBridge)
Jian Li0c632722019-05-08 15:58:04 +0900320 .extBridge(extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900321 .localBridge(localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900322 .tunBridge(tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900323 .extIntf(extIntf)
Jian Li49109b52019-01-22 00:17:28 +0900324 .managementIp(managementIp)
325 .dataIp(dataIp)
326 .state(newState)
Jian Lie2a04ce2020-07-01 19:07:02 +0900327 .extBridgeIp(extNetwork.extBridgeIp())
328 .extGatewayIp(extNetwork.extGatewayIp())
329 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900330 .podCidr(podCidr)
Jian Li49109b52019-01-22 00:17:28 +0900331 .build();
332 }
333
334 @Override
Jian Li1b08d652019-05-02 17:28:09 +0900335 public K8sNode updateExtGatewayMac(MacAddress newMac) {
336 return new Builder()
337 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900338 .clusterName(clusterName)
Jian Li1b08d652019-05-02 17:28:09 +0900339 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900340 .segmentId(segmentId)
341 .mode(mode)
Jian Li1b08d652019-05-02 17:28:09 +0900342 .intgBridge(intgBridge)
Jian Li0c632722019-05-08 15:58:04 +0900343 .extBridge(extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900344 .localBridge(localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900345 .tunBridge(tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900346 .extIntf(extIntf)
Jian Li1b08d652019-05-02 17:28:09 +0900347 .managementIp(managementIp)
348 .dataIp(dataIp)
349 .state(state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900350 .extBridgeIp(extNetwork.extBridgeIp())
351 .extGatewayIp(extNetwork.extGatewayIp())
Jian Li1b08d652019-05-02 17:28:09 +0900352 .extGatewayMac(newMac)
Jian Li0c632722019-05-08 15:58:04 +0900353 .podCidr(podCidr)
Jian Li1b08d652019-05-02 17:28:09 +0900354 .build();
Jian Li1b08d652019-05-02 17:28:09 +0900355 }
356
357 @Override
Jian Li49109b52019-01-22 00:17:28 +0900358 public PortNumber grePortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900359 return tunnelPortNum(grePortName());
Jian Li49109b52019-01-22 00:17:28 +0900360 }
361
362 @Override
363 public PortNumber vxlanPortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900364 return tunnelPortNum(vxlanPortName());
Jian Li49109b52019-01-22 00:17:28 +0900365 }
366
367 @Override
368 public PortNumber genevePortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900369 return tunnelPortNum(genevePortName());
Jian Li49109b52019-01-22 00:17:28 +0900370 }
371
372 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900373 public PortNumber intgBridgePortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900374 return portNumber(intgBridge, intgBridgePortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900375 }
376
377 @Override
378 public PortNumber intgToExtPatchPortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900379 return portNumber(intgBridge, intgToExtPatchPortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900380 }
381
382 @Override
Jian Li1a2eb5d2019-08-27 02:07:05 +0900383 public PortNumber intgToLocalPatchPortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900384 return portNumber(intgBridge, intgToLocalPatchPortName());
385
Jian Li1a2eb5d2019-08-27 02:07:05 +0900386 }
387
388 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900389 public PortNumber localToIntgPatchPortNum() {
390 return portNumber(localBridge, localToIntgPatchPortName());
Jian Li1a2eb5d2019-08-27 02:07:05 +0900391 }
392
393 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900394 public PortNumber extToIntgPatchPortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900395 return portNumber(extBridge, extToIntgPatchPortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900396 }
397
398 @Override
Jian Li619fa282020-09-02 14:45:35 +0900399 public PortNumber intgToTunPortNum() {
400 return portNumber(intgBridge, intgToTunPatchPortName());
401 }
402
403 @Override
404 public PortNumber tunToIntgPortNum() {
405 return portNumber(tunBridge, tunToIntgPatchPortName());
406 }
407
408 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900409 public PortNumber extBridgePortNum() {
Jian Li0c632722019-05-08 15:58:04 +0900410 if (this.extIntf == null) {
Jian Lieb488ea2019-04-16 01:50:02 +0900411 return null;
412 }
Jian Lie2a04ce2020-07-01 19:07:02 +0900413 return portNumber(extBridge, extBridgePortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900414 }
415
416 @Override
Jian Li2778ffa2019-05-07 13:21:52 +0900417 public MacAddress intgBridgeMac() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900418 return macAddress(intgBridge, intgBridgeName());
Jian Li2778ffa2019-05-07 13:21:52 +0900419 }
420
421 @Override
422 public IpAddress extBridgeIp() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900423 return extNetwork.extBridgeIp();
Jian Li2778ffa2019-05-07 13:21:52 +0900424 }
425
426 @Override
427 public MacAddress extBridgeMac() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900428 return macAddress(extBridge, extBridgeName());
Jian Li2778ffa2019-05-07 13:21:52 +0900429 }
430
431 @Override
432 public IpAddress extGatewayIp() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900433 return extNetwork.extGatewayIp();
Jian Li2778ffa2019-05-07 13:21:52 +0900434 }
435
436 @Override
437 public MacAddress extGatewayMac() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900438 return extNetwork.extGatewayMac();
439 }
440
441 @Override
442 public String grePortName() {
443 if (mode == PASSTHROUGH) {
444 return GRE_TUNNEL + "-" + segmentId;
445 } else {
446 return GRE_TUNNEL;
447 }
448 }
449
450 @Override
451 public String vxlanPortName() {
452 if (mode == PASSTHROUGH) {
453 return VXLAN_TUNNEL + "-" + segmentId;
454 } else {
455 return VXLAN_TUNNEL;
456 }
457 }
458
459 @Override
460 public String genevePortName() {
461 if (mode == PASSTHROUGH) {
462 return GENEVE_TUNNEL + "-" + segmentId;
463 } else {
464 return GENEVE_TUNNEL;
465 }
466 }
467
468 @Override
469 public String intgBridgeName() {
470 if (mode == PASSTHROUGH) {
471 return INTEGRATION_BRIDGE + "-" + uniqueString(5);
472 } else {
473 return INTEGRATION_BRIDGE;
474 }
475 }
476
477 @Override
478 public String extBridgeName() {
479 if (mode == PASSTHROUGH) {
480 return EXTERNAL_BRIDGE + "-" + uniqueString(5);
481 } else {
482 return EXTERNAL_BRIDGE;
483 }
484 }
485
486 @Override
487 public String localBridgeName() {
488 if (mode == PASSTHROUGH) {
489 return LOCAL_BRIDGE + "-" + uniqueString(5);
490 } else {
491 return LOCAL_BRIDGE;
492 }
493 }
494
495 @Override
496 public String tunBridgeName() {
497 if (mode == PASSTHROUGH) {
498 return TUNNEL_BRIDGE + "-" + segmentId;
499 } else {
500 return TUNNEL_BRIDGE;
501 }
502 }
503
504 @Override
505 public String intgBridgePortName() {
506 if (mode == PASSTHROUGH) {
507 return INTEGRATION_BRIDGE + "-" + uniqueString(5);
508 } else {
509 return INTEGRATION_BRIDGE;
510 }
511 }
512
513 @Override
514 public String extBridgePortName() {
515 if (mode == PASSTHROUGH) {
516 return EXTERNAL_BRIDGE + "-" + uniqueString(5);
517 } else {
518 return EXTERNAL_BRIDGE;
519 }
520 }
521
522 @Override
523 public String localBridgePortName() {
524 if (mode == PASSTHROUGH) {
525 return LOCAL_BRIDGE + "-" + uniqueString(5);
526 } else {
527 return LOCAL_BRIDGE;
528 }
529 }
530
531 @Override
Jian Li619fa282020-09-02 14:45:35 +0900532 public String tunBridgePortName() {
533 if (mode == PASSTHROUGH) {
534 return TUNNEL_BRIDGE + "-" + uniqueString(5);
535 } else {
536 return TUNNEL_BRIDGE;
537 }
538 }
539
540 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900541 public String intgToExtPatchPortName() {
542 if (mode == PASSTHROUGH) {
543 return INTEGRATION_TO_EXTERNAL_BRIDGE + "-" + uniqueString(5);
544 } else {
545 return INTEGRATION_TO_EXTERNAL_BRIDGE;
546 }
547 }
548
549 @Override
550 public String intgToTunPatchPortName() {
551 if (mode == PASSTHROUGH) {
552 return INTEGRATION_TO_TUN_BRIDGE + "-" + uniqueString(5);
553 } else {
554 return INTEGRATION_TO_TUN_BRIDGE;
555 }
556 }
557
558 @Override
559 public String intgToLocalPatchPortName() {
560 if (mode == PASSTHROUGH) {
561 return INTEGRATION_TO_LOCAL_BRIDGE + "-" + uniqueString(5);
562 } else {
563 return INTEGRATION_TO_LOCAL_BRIDGE;
564 }
565 }
566
567 @Override
568 public String localToIntgPatchPortName() {
569 if (mode == PASSTHROUGH) {
570 return LOCAL_TO_INTEGRATION_BRIDGE + "-" + uniqueString(5);
571 } else {
572 return LOCAL_TO_INTEGRATION_BRIDGE;
573 }
574 }
575
576 @Override
577 public String extToIntgPatchPortName() {
578 if (mode == PASSTHROUGH) {
579 return PHYSICAL_EXTERNAL_BRIDGE + "-" + uniqueString(5);
580 } else {
581 return PHYSICAL_EXTERNAL_BRIDGE;
582 }
583 }
584
585 @Override
586 public String tunToIntgPatchPortName() {
587 if (mode == PASSTHROUGH) {
588 return TUN_TO_INTEGRATION_BRIDGE + "-" + uniqueString(5);
589 } else {
590 return TUN_TO_INTEGRATION_BRIDGE;
591 }
Jian Li2778ffa2019-05-07 13:21:52 +0900592 }
593
594 @Override
Jian Li49109b52019-01-22 00:17:28 +0900595 public boolean equals(Object obj) {
596 if (this == obj) {
597 return true;
598 }
599
600 if (obj instanceof DefaultK8sNode) {
601 DefaultK8sNode that = (DefaultK8sNode) obj;
602
Jian Lie2a04ce2020-07-01 19:07:02 +0900603 return clusterName.equals(that.clusterName) &&
604 hostname.equals(that.hostname) &&
Jian Li49109b52019-01-22 00:17:28 +0900605 type == that.type &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900606 segmentId == that.segmentId &&
607 mode == that.mode &&
Jian Li49109b52019-01-22 00:17:28 +0900608 intgBridge.equals(that.intgBridge) &&
Jian Libf562c22019-04-15 18:07:14 +0900609 extBridge.equals(that.extBridge) &&
Jian Li1a2eb5d2019-08-27 02:07:05 +0900610 localBridge.equals(that.localBridge) &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900611 tunBridge.equals(that.tunBridge) &&
Jian Li0c632722019-05-08 15:58:04 +0900612 extIntf.equals(that.extIntf) &&
Jian Li49109b52019-01-22 00:17:28 +0900613 managementIp.equals(that.managementIp) &&
614 dataIp.equals(that.dataIp) &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900615 extNetwork.equals(that.extNetwork) &&
Jian Li0c632722019-05-08 15:58:04 +0900616 podCidr.equals(that.podCidr) &&
Jian Li49109b52019-01-22 00:17:28 +0900617 state == that.state;
618 }
619
620 return false;
621 }
622
623 @Override
624 public int hashCode() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900625 return Objects.hash(clusterName, hostname, type, segmentId, mode, intgBridge, extBridge,
626 localBridge, tunBridge, extIntf, managementIp, dataIp, state, extNetwork, podCidr);
Jian Li49109b52019-01-22 00:17:28 +0900627 }
628
629 @Override
630 public String toString() {
631 return MoreObjects.toStringHelper(this)
Jian Lie2a04ce2020-07-01 19:07:02 +0900632 .add("clusterName", clusterName)
Jian Li49109b52019-01-22 00:17:28 +0900633 .add("hostname", hostname)
634 .add("type", type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900635 .add("segmentId", segmentId)
636 .add("mode", mode)
Jian Li49109b52019-01-22 00:17:28 +0900637 .add("intgBridge", intgBridge)
Jian Libf562c22019-04-15 18:07:14 +0900638 .add("extBridge", extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900639 .add("localBridge", localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900640 .add("tunBridge", tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900641 .add("extIntf", extIntf)
Jian Li49109b52019-01-22 00:17:28 +0900642 .add("managementIp", managementIp)
643 .add("dataIp", dataIp)
644 .add("state", state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900645 .add("extBridgeIp", extNetwork.extBridgeIp())
646 .add("extGatewayIp", extNetwork.extGatewayIp())
647 .add("extGatewayMac", extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900648 .add("podCidr", podCidr)
Jian Li49109b52019-01-22 00:17:28 +0900649 .toString();
650 }
651
652 private PortNumber tunnelPortNum(String tunnelType) {
653 if (dataIp == null) {
654 return null;
655 }
Jian Lieb488ea2019-04-16 01:50:02 +0900656
Jian Lie2a04ce2020-07-01 19:07:02 +0900657 return portNumber(tunBridge, tunnelType);
Jian Lieb488ea2019-04-16 01:50:02 +0900658 }
659
Jian Li2778ffa2019-05-07 13:21:52 +0900660 private MacAddress macAddress(DeviceId deviceId, String portName) {
661 Port port = port(deviceId, portName);
662 Annotations annots = port.annotations();
663 return annots != null ? MacAddress.valueOf(annots.value(PORT_MAC)) : null;
664 }
665
Jian Lieb488ea2019-04-16 01:50:02 +0900666 private PortNumber portNumber(DeviceId deviceId, String portName) {
Jian Li2778ffa2019-05-07 13:21:52 +0900667 Port port = port(deviceId, portName);
668 return port != null ? port.number() : null;
669 }
670
671 private Port port(DeviceId deviceId, String portName) {
Jian Li49109b52019-01-22 00:17:28 +0900672 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
Jian Li2778ffa2019-05-07 13:21:52 +0900673 return deviceService.getPorts(deviceId).stream()
Jian Li49109b52019-01-22 00:17:28 +0900674 .filter(p -> p.isEnabled() &&
Jian Lieb488ea2019-04-16 01:50:02 +0900675 Objects.equals(p.annotations().value(PORT_NAME), portName))
Jian Li49109b52019-01-22 00:17:28 +0900676 .findAny().orElse(null);
Jian Li49109b52019-01-22 00:17:28 +0900677 }
678
679 /**
680 * Returns new builder instance.
681 *
682 * @return kubernetes node builder
683 */
684 public static Builder builder() {
685 return new Builder();
686 }
687
688 /**
689 * Returns new builder instance with the given node as a default value.
690 *
691 * @param node kubernetes node
692 * @return kubernetes node builder
693 */
694 public static Builder from(K8sNode node) {
695 return new Builder()
696 .hostname(node.hostname())
Jian Lie2a04ce2020-07-01 19:07:02 +0900697 .clusterName(node.clusterName())
Jian Li49109b52019-01-22 00:17:28 +0900698 .type(node.type())
Jian Lie2a04ce2020-07-01 19:07:02 +0900699 .segmentId(node.segmentId())
Jian Li49109b52019-01-22 00:17:28 +0900700 .intgBridge(node.intgBridge())
Jian Libf562c22019-04-15 18:07:14 +0900701 .extBridge(node.extBridge())
Jian Li1a2eb5d2019-08-27 02:07:05 +0900702 .localBridge(node.localBridge())
Jian Lie2a04ce2020-07-01 19:07:02 +0900703 .tunBridge(node.tunBridge())
Jian Li0c632722019-05-08 15:58:04 +0900704 .extIntf(node.extIntf())
Jian Li49109b52019-01-22 00:17:28 +0900705 .managementIp(node.managementIp())
706 .dataIp(node.dataIp())
Jian Li1b08d652019-05-02 17:28:09 +0900707 .state(node.state())
Jian Li0c632722019-05-08 15:58:04 +0900708 .extBridgeIp(node.extBridgeIp())
709 .extGatewayIp(node.extGatewayIp())
710 .extGatewayMac(node.extGatewayMac())
711 .podCidr(node.podCidr());
Jian Li49109b52019-01-22 00:17:28 +0900712 }
713
714 public static final class Builder implements K8sNode.Builder {
715
Jian Lie2a04ce2020-07-01 19:07:02 +0900716 private String clusterName;
Jian Li49109b52019-01-22 00:17:28 +0900717 private String hostname;
718 private Type type;
Jian Lie2a04ce2020-07-01 19:07:02 +0900719 private int segmentId;
720 private Mode mode;
Jian Li49109b52019-01-22 00:17:28 +0900721 private DeviceId intgBridge;
Jian Libf562c22019-04-15 18:07:14 +0900722 private DeviceId extBridge;
Jian Li1a2eb5d2019-08-27 02:07:05 +0900723 private DeviceId localBridge;
Jian Lie2a04ce2020-07-01 19:07:02 +0900724 private DeviceId tunBridge;
Jian Li49109b52019-01-22 00:17:28 +0900725 private IpAddress managementIp;
726 private IpAddress dataIp;
727 private K8sNodeState state;
Jian Li3defa842019-02-12 00:31:35 +0900728 private K8sApiConfig apiConfig;
Jian Li0c632722019-05-08 15:58:04 +0900729 private String extIntf;
730 private IpAddress extBridgeIp;
731 private IpAddress extGatewayIp;
Jian Li1b08d652019-05-02 17:28:09 +0900732 private MacAddress extGatewayMac;
Jian Li0c632722019-05-08 15:58:04 +0900733 private String podCidr;
Jian Li49109b52019-01-22 00:17:28 +0900734
735 // private constructor not intended to use from external
736 private Builder() {
737 }
738
739 @Override
740 public K8sNode build() {
741 checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
742 checkArgument(type != null, NOT_NULL_MSG, "type");
743 checkArgument(state != null, NOT_NULL_MSG, "state");
744 checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
745
Jian Lie2a04ce2020-07-01 19:07:02 +0900746 if (StringUtils.isEmpty(clusterName)) {
747 clusterName = DEFAULT_CLUSTER_NAME;
748 }
749
750 if (mode == null) {
751 mode = NORMAL;
752 }
753
754 K8sExternalNetwork extNetwork = DefaultK8sExternalNetwork.builder()
755 .extBridgeIp(extBridgeIp)
756 .extGatewayIp(extGatewayIp)
757 .extGatewayMac(extGatewayMac)
758 .build();
759
760 return new DefaultK8sNode(clusterName,
761 hostname,
Jian Li49109b52019-01-22 00:17:28 +0900762 type,
Jian Lie2a04ce2020-07-01 19:07:02 +0900763 segmentId,
764 mode,
Jian Li49109b52019-01-22 00:17:28 +0900765 intgBridge,
Jian Libf562c22019-04-15 18:07:14 +0900766 extBridge,
Jian Li1a2eb5d2019-08-27 02:07:05 +0900767 localBridge,
Jian Lie2a04ce2020-07-01 19:07:02 +0900768 tunBridge,
Jian Li0c632722019-05-08 15:58:04 +0900769 extIntf,
Jian Li49109b52019-01-22 00:17:28 +0900770 managementIp,
771 dataIp,
Jian Li1b08d652019-05-02 17:28:09 +0900772 state,
Jian Lie2a04ce2020-07-01 19:07:02 +0900773 extNetwork,
Jian Li0c632722019-05-08 15:58:04 +0900774 podCidr);
Jian Li49109b52019-01-22 00:17:28 +0900775 }
776
777 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900778 public Builder clusterName(String clusterName) {
779 this.clusterName = clusterName;
780 return this;
781 }
782
783 @Override
Jian Li49109b52019-01-22 00:17:28 +0900784 public Builder hostname(String hostname) {
785 this.hostname = hostname;
786 return this;
787 }
788
789 @Override
790 public Builder type(Type type) {
791 this.type = type;
792 return this;
793 }
794
795 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900796 public Builder segmentId(int segmentId) {
797 this.segmentId = segmentId;
798 return this;
799 }
800
801 @Override
802 public Builder mode(Mode mode) {
803 this.mode = mode;
804 return this;
805 }
806
807 @Override
Jian Li49109b52019-01-22 00:17:28 +0900808 public Builder intgBridge(DeviceId deviceId) {
809 this.intgBridge = deviceId;
810 return this;
811 }
812
813 @Override
Jian Libf562c22019-04-15 18:07:14 +0900814 public Builder extBridge(DeviceId deviceId) {
815 this.extBridge = deviceId;
816 return this;
817 }
818
819 @Override
Jian Li1a2eb5d2019-08-27 02:07:05 +0900820 public Builder localBridge(DeviceId deviceId) {
821 this.localBridge = deviceId;
822 return this;
823 }
824
825 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900826 public Builder tunBridge(DeviceId deviceId) {
827 this.tunBridge = deviceId;
828 return this;
829 }
830
831 @Override
Jian Li0c632722019-05-08 15:58:04 +0900832 public Builder extIntf(String intf) {
833 this.extIntf = intf;
834 return this;
835 }
836
837 @Override
Jian Li49109b52019-01-22 00:17:28 +0900838 public Builder managementIp(IpAddress managementIp) {
839 this.managementIp = managementIp;
840 return this;
841 }
842
843 @Override
844 public Builder dataIp(IpAddress dataIp) {
845 this.dataIp = dataIp;
846 return this;
847 }
848
849 @Override
850 public Builder state(K8sNodeState state) {
851 this.state = state;
852 return this;
853 }
Jian Li1b08d652019-05-02 17:28:09 +0900854
855 @Override
Jian Li0c632722019-05-08 15:58:04 +0900856 public Builder extBridgeIp(IpAddress extBridgeIp) {
857 this.extBridgeIp = extBridgeIp;
858 return this;
859 }
860
861 @Override
862 public Builder extGatewayIp(IpAddress extGatewayIp) {
863 this.extGatewayIp = extGatewayIp;
864 return this;
865 }
866
867 @Override
Jian Li1b08d652019-05-02 17:28:09 +0900868 public Builder extGatewayMac(MacAddress extGatewayMac) {
869 this.extGatewayMac = extGatewayMac;
870 return this;
871 }
Jian Li0c632722019-05-08 15:58:04 +0900872
873 @Override
874 public Builder podCidr(String podCidr) {
875 this.podCidr = podCidr;
876 return this;
877 }
Jian Li49109b52019-01-22 00:17:28 +0900878 }
879}