blob: 56039b52c2ac08f867482cab9f8734ebc8cc569a [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
399 public PortNumber extBridgePortNum() {
Jian Li0c632722019-05-08 15:58:04 +0900400 if (this.extIntf == null) {
Jian Lieb488ea2019-04-16 01:50:02 +0900401 return null;
402 }
Jian Lie2a04ce2020-07-01 19:07:02 +0900403 return portNumber(extBridge, extBridgePortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900404 }
405
406 @Override
Jian Li2778ffa2019-05-07 13:21:52 +0900407 public MacAddress intgBridgeMac() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900408 return macAddress(intgBridge, intgBridgeName());
Jian Li2778ffa2019-05-07 13:21:52 +0900409 }
410
411 @Override
412 public IpAddress extBridgeIp() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900413 return extNetwork.extBridgeIp();
Jian Li2778ffa2019-05-07 13:21:52 +0900414 }
415
416 @Override
417 public MacAddress extBridgeMac() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900418 return macAddress(extBridge, extBridgeName());
Jian Li2778ffa2019-05-07 13:21:52 +0900419 }
420
421 @Override
422 public IpAddress extGatewayIp() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900423 return extNetwork.extGatewayIp();
Jian Li2778ffa2019-05-07 13:21:52 +0900424 }
425
426 @Override
427 public MacAddress extGatewayMac() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900428 return extNetwork.extGatewayMac();
429 }
430
431 @Override
432 public String grePortName() {
433 if (mode == PASSTHROUGH) {
434 return GRE_TUNNEL + "-" + segmentId;
435 } else {
436 return GRE_TUNNEL;
437 }
438 }
439
440 @Override
441 public String vxlanPortName() {
442 if (mode == PASSTHROUGH) {
443 return VXLAN_TUNNEL + "-" + segmentId;
444 } else {
445 return VXLAN_TUNNEL;
446 }
447 }
448
449 @Override
450 public String genevePortName() {
451 if (mode == PASSTHROUGH) {
452 return GENEVE_TUNNEL + "-" + segmentId;
453 } else {
454 return GENEVE_TUNNEL;
455 }
456 }
457
458 @Override
459 public String intgBridgeName() {
460 if (mode == PASSTHROUGH) {
461 return INTEGRATION_BRIDGE + "-" + uniqueString(5);
462 } else {
463 return INTEGRATION_BRIDGE;
464 }
465 }
466
467 @Override
468 public String extBridgeName() {
469 if (mode == PASSTHROUGH) {
470 return EXTERNAL_BRIDGE + "-" + uniqueString(5);
471 } else {
472 return EXTERNAL_BRIDGE;
473 }
474 }
475
476 @Override
477 public String localBridgeName() {
478 if (mode == PASSTHROUGH) {
479 return LOCAL_BRIDGE + "-" + uniqueString(5);
480 } else {
481 return LOCAL_BRIDGE;
482 }
483 }
484
485 @Override
486 public String tunBridgeName() {
487 if (mode == PASSTHROUGH) {
488 return TUNNEL_BRIDGE + "-" + segmentId;
489 } else {
490 return TUNNEL_BRIDGE;
491 }
492 }
493
494 @Override
495 public String intgBridgePortName() {
496 if (mode == PASSTHROUGH) {
497 return INTEGRATION_BRIDGE + "-" + uniqueString(5);
498 } else {
499 return INTEGRATION_BRIDGE;
500 }
501 }
502
503 @Override
504 public String extBridgePortName() {
505 if (mode == PASSTHROUGH) {
506 return EXTERNAL_BRIDGE + "-" + uniqueString(5);
507 } else {
508 return EXTERNAL_BRIDGE;
509 }
510 }
511
512 @Override
513 public String localBridgePortName() {
514 if (mode == PASSTHROUGH) {
515 return LOCAL_BRIDGE + "-" + uniqueString(5);
516 } else {
517 return LOCAL_BRIDGE;
518 }
519 }
520
521 @Override
522 public String intgToExtPatchPortName() {
523 if (mode == PASSTHROUGH) {
524 return INTEGRATION_TO_EXTERNAL_BRIDGE + "-" + uniqueString(5);
525 } else {
526 return INTEGRATION_TO_EXTERNAL_BRIDGE;
527 }
528 }
529
530 @Override
531 public String intgToTunPatchPortName() {
532 if (mode == PASSTHROUGH) {
533 return INTEGRATION_TO_TUN_BRIDGE + "-" + uniqueString(5);
534 } else {
535 return INTEGRATION_TO_TUN_BRIDGE;
536 }
537 }
538
539 @Override
540 public String intgToLocalPatchPortName() {
541 if (mode == PASSTHROUGH) {
542 return INTEGRATION_TO_LOCAL_BRIDGE + "-" + uniqueString(5);
543 } else {
544 return INTEGRATION_TO_LOCAL_BRIDGE;
545 }
546 }
547
548 @Override
549 public String localToIntgPatchPortName() {
550 if (mode == PASSTHROUGH) {
551 return LOCAL_TO_INTEGRATION_BRIDGE + "-" + uniqueString(5);
552 } else {
553 return LOCAL_TO_INTEGRATION_BRIDGE;
554 }
555 }
556
557 @Override
558 public String extToIntgPatchPortName() {
559 if (mode == PASSTHROUGH) {
560 return PHYSICAL_EXTERNAL_BRIDGE + "-" + uniqueString(5);
561 } else {
562 return PHYSICAL_EXTERNAL_BRIDGE;
563 }
564 }
565
566 @Override
567 public String tunToIntgPatchPortName() {
568 if (mode == PASSTHROUGH) {
569 return TUN_TO_INTEGRATION_BRIDGE + "-" + uniqueString(5);
570 } else {
571 return TUN_TO_INTEGRATION_BRIDGE;
572 }
Jian Li2778ffa2019-05-07 13:21:52 +0900573 }
574
575 @Override
Jian Li49109b52019-01-22 00:17:28 +0900576 public boolean equals(Object obj) {
577 if (this == obj) {
578 return true;
579 }
580
581 if (obj instanceof DefaultK8sNode) {
582 DefaultK8sNode that = (DefaultK8sNode) obj;
583
Jian Lie2a04ce2020-07-01 19:07:02 +0900584 return clusterName.equals(that.clusterName) &&
585 hostname.equals(that.hostname) &&
Jian Li49109b52019-01-22 00:17:28 +0900586 type == that.type &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900587 segmentId == that.segmentId &&
588 mode == that.mode &&
Jian Li49109b52019-01-22 00:17:28 +0900589 intgBridge.equals(that.intgBridge) &&
Jian Libf562c22019-04-15 18:07:14 +0900590 extBridge.equals(that.extBridge) &&
Jian Li1a2eb5d2019-08-27 02:07:05 +0900591 localBridge.equals(that.localBridge) &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900592 tunBridge.equals(that.tunBridge) &&
Jian Li0c632722019-05-08 15:58:04 +0900593 extIntf.equals(that.extIntf) &&
Jian Li49109b52019-01-22 00:17:28 +0900594 managementIp.equals(that.managementIp) &&
595 dataIp.equals(that.dataIp) &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900596 extNetwork.equals(that.extNetwork) &&
Jian Li0c632722019-05-08 15:58:04 +0900597 podCidr.equals(that.podCidr) &&
Jian Li49109b52019-01-22 00:17:28 +0900598 state == that.state;
599 }
600
601 return false;
602 }
603
604 @Override
605 public int hashCode() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900606 return Objects.hash(clusterName, hostname, type, segmentId, mode, intgBridge, extBridge,
607 localBridge, tunBridge, extIntf, managementIp, dataIp, state, extNetwork, podCidr);
Jian Li49109b52019-01-22 00:17:28 +0900608 }
609
610 @Override
611 public String toString() {
612 return MoreObjects.toStringHelper(this)
Jian Lie2a04ce2020-07-01 19:07:02 +0900613 .add("clusterName", clusterName)
Jian Li49109b52019-01-22 00:17:28 +0900614 .add("hostname", hostname)
615 .add("type", type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900616 .add("segmentId", segmentId)
617 .add("mode", mode)
Jian Li49109b52019-01-22 00:17:28 +0900618 .add("intgBridge", intgBridge)
Jian Libf562c22019-04-15 18:07:14 +0900619 .add("extBridge", extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900620 .add("localBridge", localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900621 .add("tunBridge", tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900622 .add("extIntf", extIntf)
Jian Li49109b52019-01-22 00:17:28 +0900623 .add("managementIp", managementIp)
624 .add("dataIp", dataIp)
625 .add("state", state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900626 .add("extBridgeIp", extNetwork.extBridgeIp())
627 .add("extGatewayIp", extNetwork.extGatewayIp())
628 .add("extGatewayMac", extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900629 .add("podCidr", podCidr)
Jian Li49109b52019-01-22 00:17:28 +0900630 .toString();
631 }
632
633 private PortNumber tunnelPortNum(String tunnelType) {
634 if (dataIp == null) {
635 return null;
636 }
Jian Lieb488ea2019-04-16 01:50:02 +0900637
Jian Lie2a04ce2020-07-01 19:07:02 +0900638 return portNumber(tunBridge, tunnelType);
Jian Lieb488ea2019-04-16 01:50:02 +0900639 }
640
Jian Li2778ffa2019-05-07 13:21:52 +0900641 private MacAddress macAddress(DeviceId deviceId, String portName) {
642 Port port = port(deviceId, portName);
643 Annotations annots = port.annotations();
644 return annots != null ? MacAddress.valueOf(annots.value(PORT_MAC)) : null;
645 }
646
Jian Lieb488ea2019-04-16 01:50:02 +0900647 private PortNumber portNumber(DeviceId deviceId, String portName) {
Jian Li2778ffa2019-05-07 13:21:52 +0900648 Port port = port(deviceId, portName);
649 return port != null ? port.number() : null;
650 }
651
652 private Port port(DeviceId deviceId, String portName) {
Jian Li49109b52019-01-22 00:17:28 +0900653 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
Jian Li2778ffa2019-05-07 13:21:52 +0900654 return deviceService.getPorts(deviceId).stream()
Jian Li49109b52019-01-22 00:17:28 +0900655 .filter(p -> p.isEnabled() &&
Jian Lieb488ea2019-04-16 01:50:02 +0900656 Objects.equals(p.annotations().value(PORT_NAME), portName))
Jian Li49109b52019-01-22 00:17:28 +0900657 .findAny().orElse(null);
Jian Li49109b52019-01-22 00:17:28 +0900658 }
659
660 /**
661 * Returns new builder instance.
662 *
663 * @return kubernetes node builder
664 */
665 public static Builder builder() {
666 return new Builder();
667 }
668
669 /**
670 * Returns new builder instance with the given node as a default value.
671 *
672 * @param node kubernetes node
673 * @return kubernetes node builder
674 */
675 public static Builder from(K8sNode node) {
676 return new Builder()
677 .hostname(node.hostname())
Jian Lie2a04ce2020-07-01 19:07:02 +0900678 .clusterName(node.clusterName())
Jian Li49109b52019-01-22 00:17:28 +0900679 .type(node.type())
Jian Lie2a04ce2020-07-01 19:07:02 +0900680 .segmentId(node.segmentId())
Jian Li49109b52019-01-22 00:17:28 +0900681 .intgBridge(node.intgBridge())
Jian Libf562c22019-04-15 18:07:14 +0900682 .extBridge(node.extBridge())
Jian Li1a2eb5d2019-08-27 02:07:05 +0900683 .localBridge(node.localBridge())
Jian Lie2a04ce2020-07-01 19:07:02 +0900684 .tunBridge(node.tunBridge())
Jian Li0c632722019-05-08 15:58:04 +0900685 .extIntf(node.extIntf())
Jian Li49109b52019-01-22 00:17:28 +0900686 .managementIp(node.managementIp())
687 .dataIp(node.dataIp())
Jian Li1b08d652019-05-02 17:28:09 +0900688 .state(node.state())
Jian Li0c632722019-05-08 15:58:04 +0900689 .extBridgeIp(node.extBridgeIp())
690 .extGatewayIp(node.extGatewayIp())
691 .extGatewayMac(node.extGatewayMac())
692 .podCidr(node.podCidr());
Jian Li49109b52019-01-22 00:17:28 +0900693 }
694
695 public static final class Builder implements K8sNode.Builder {
696
Jian Lie2a04ce2020-07-01 19:07:02 +0900697 private String clusterName;
Jian Li49109b52019-01-22 00:17:28 +0900698 private String hostname;
699 private Type type;
Jian Lie2a04ce2020-07-01 19:07:02 +0900700 private int segmentId;
701 private Mode mode;
Jian Li49109b52019-01-22 00:17:28 +0900702 private DeviceId intgBridge;
Jian Libf562c22019-04-15 18:07:14 +0900703 private DeviceId extBridge;
Jian Li1a2eb5d2019-08-27 02:07:05 +0900704 private DeviceId localBridge;
Jian Lie2a04ce2020-07-01 19:07:02 +0900705 private DeviceId tunBridge;
Jian Li49109b52019-01-22 00:17:28 +0900706 private IpAddress managementIp;
707 private IpAddress dataIp;
708 private K8sNodeState state;
Jian Li3defa842019-02-12 00:31:35 +0900709 private K8sApiConfig apiConfig;
Jian Li0c632722019-05-08 15:58:04 +0900710 private String extIntf;
711 private IpAddress extBridgeIp;
712 private IpAddress extGatewayIp;
Jian Li1b08d652019-05-02 17:28:09 +0900713 private MacAddress extGatewayMac;
Jian Li0c632722019-05-08 15:58:04 +0900714 private String podCidr;
Jian Li49109b52019-01-22 00:17:28 +0900715
716 // private constructor not intended to use from external
717 private Builder() {
718 }
719
720 @Override
721 public K8sNode build() {
722 checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
723 checkArgument(type != null, NOT_NULL_MSG, "type");
724 checkArgument(state != null, NOT_NULL_MSG, "state");
725 checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
726
Jian Lie2a04ce2020-07-01 19:07:02 +0900727 if (StringUtils.isEmpty(clusterName)) {
728 clusterName = DEFAULT_CLUSTER_NAME;
729 }
730
731 if (mode == null) {
732 mode = NORMAL;
733 }
734
735 K8sExternalNetwork extNetwork = DefaultK8sExternalNetwork.builder()
736 .extBridgeIp(extBridgeIp)
737 .extGatewayIp(extGatewayIp)
738 .extGatewayMac(extGatewayMac)
739 .build();
740
741 return new DefaultK8sNode(clusterName,
742 hostname,
Jian Li49109b52019-01-22 00:17:28 +0900743 type,
Jian Lie2a04ce2020-07-01 19:07:02 +0900744 segmentId,
745 mode,
Jian Li49109b52019-01-22 00:17:28 +0900746 intgBridge,
Jian Libf562c22019-04-15 18:07:14 +0900747 extBridge,
Jian Li1a2eb5d2019-08-27 02:07:05 +0900748 localBridge,
Jian Lie2a04ce2020-07-01 19:07:02 +0900749 tunBridge,
Jian Li0c632722019-05-08 15:58:04 +0900750 extIntf,
Jian Li49109b52019-01-22 00:17:28 +0900751 managementIp,
752 dataIp,
Jian Li1b08d652019-05-02 17:28:09 +0900753 state,
Jian Lie2a04ce2020-07-01 19:07:02 +0900754 extNetwork,
Jian Li0c632722019-05-08 15:58:04 +0900755 podCidr);
Jian Li49109b52019-01-22 00:17:28 +0900756 }
757
758 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900759 public Builder clusterName(String clusterName) {
760 this.clusterName = clusterName;
761 return this;
762 }
763
764 @Override
Jian Li49109b52019-01-22 00:17:28 +0900765 public Builder hostname(String hostname) {
766 this.hostname = hostname;
767 return this;
768 }
769
770 @Override
771 public Builder type(Type type) {
772 this.type = type;
773 return this;
774 }
775
776 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900777 public Builder segmentId(int segmentId) {
778 this.segmentId = segmentId;
779 return this;
780 }
781
782 @Override
783 public Builder mode(Mode mode) {
784 this.mode = mode;
785 return this;
786 }
787
788 @Override
Jian Li49109b52019-01-22 00:17:28 +0900789 public Builder intgBridge(DeviceId deviceId) {
790 this.intgBridge = deviceId;
791 return this;
792 }
793
794 @Override
Jian Libf562c22019-04-15 18:07:14 +0900795 public Builder extBridge(DeviceId deviceId) {
796 this.extBridge = deviceId;
797 return this;
798 }
799
800 @Override
Jian Li1a2eb5d2019-08-27 02:07:05 +0900801 public Builder localBridge(DeviceId deviceId) {
802 this.localBridge = deviceId;
803 return this;
804 }
805
806 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900807 public Builder tunBridge(DeviceId deviceId) {
808 this.tunBridge = deviceId;
809 return this;
810 }
811
812 @Override
Jian Li0c632722019-05-08 15:58:04 +0900813 public Builder extIntf(String intf) {
814 this.extIntf = intf;
815 return this;
816 }
817
818 @Override
Jian Li49109b52019-01-22 00:17:28 +0900819 public Builder managementIp(IpAddress managementIp) {
820 this.managementIp = managementIp;
821 return this;
822 }
823
824 @Override
825 public Builder dataIp(IpAddress dataIp) {
826 this.dataIp = dataIp;
827 return this;
828 }
829
830 @Override
831 public Builder state(K8sNodeState state) {
832 this.state = state;
833 return this;
834 }
Jian Li1b08d652019-05-02 17:28:09 +0900835
836 @Override
Jian Li0c632722019-05-08 15:58:04 +0900837 public Builder extBridgeIp(IpAddress extBridgeIp) {
838 this.extBridgeIp = extBridgeIp;
839 return this;
840 }
841
842 @Override
843 public Builder extGatewayIp(IpAddress extGatewayIp) {
844 this.extGatewayIp = extGatewayIp;
845 return this;
846 }
847
848 @Override
Jian Li1b08d652019-05-02 17:28:09 +0900849 public Builder extGatewayMac(MacAddress extGatewayMac) {
850 this.extGatewayMac = extGatewayMac;
851 return this;
852 }
Jian Li0c632722019-05-08 15:58:04 +0900853
854 @Override
855 public Builder podCidr(String podCidr) {
856 this.podCidr = podCidr;
857 return this;
858 }
Jian Li49109b52019-01-22 00:17:28 +0900859 }
860}