blob: 551a339f69c45a61bbb076201e83c4072a248251 [file] [log] [blame]
Jian Li49109b52019-01-22 00:17:28 +09001/*
2 * Copyright 2019-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.k8snode.api;
17
18import com.google.common.base.MoreObjects;
Jian Lie2a04ce2020-07-01 19:07:02 +090019import org.apache.commons.lang.StringUtils;
Jian Li49109b52019-01-22 00:17:28 +090020import org.onlab.osgi.DefaultServiceDirectory;
21import org.onlab.packet.IpAddress;
Jian Li7d111d72019-04-12 13:58:44 +090022import org.onlab.packet.MacAddress;
Jian Lie2a04ce2020-07-01 19:07:02 +090023import org.onosproject.k8snode.api.K8sApiConfig.Mode;
Jian Li2778ffa2019-05-07 13:21:52 +090024import org.onosproject.net.Annotations;
Jian Li49109b52019-01-22 00:17:28 +090025import org.onosproject.net.DeviceId;
26import org.onosproject.net.Port;
27import org.onosproject.net.PortNumber;
28import org.onosproject.net.device.DeviceService;
29
30import java.util.Objects;
Jian Lie2a04ce2020-07-01 19:07:02 +090031import java.util.UUID;
Jian Li49109b52019-01-22 00:17:28 +090032
33import static com.google.common.base.Preconditions.checkArgument;
Jian Lie2a04ce2020-07-01 19:07:02 +090034import static org.onosproject.k8snode.api.Constants.DEFAULT_CLUSTER_NAME;
Jian Lic2242bd2020-09-03 13:12:14 +090035import static org.onosproject.k8snode.api.Constants.DEFAULT_EXTERNAL_BRIDGE_MAC;
36import static org.onosproject.k8snode.api.Constants.DEFAULT_EXTERNAL_GATEWAY_MAC;
Jian Lieb488ea2019-04-16 01:50:02 +090037import static org.onosproject.k8snode.api.Constants.EXTERNAL_BRIDGE;
Jian Li49109b52019-01-22 00:17:28 +090038import static org.onosproject.k8snode.api.Constants.GENEVE_TUNNEL;
39import static org.onosproject.k8snode.api.Constants.GRE_TUNNEL;
Jian Li4aa17642019-01-30 00:01:11 +090040import static org.onosproject.k8snode.api.Constants.INTEGRATION_BRIDGE;
Jian Lieb488ea2019-04-16 01:50:02 +090041import static org.onosproject.k8snode.api.Constants.INTEGRATION_TO_EXTERNAL_BRIDGE;
Jian Li1a2eb5d2019-08-27 02:07:05 +090042import static org.onosproject.k8snode.api.Constants.INTEGRATION_TO_LOCAL_BRIDGE;
Jian Lie2a04ce2020-07-01 19:07:02 +090043import static org.onosproject.k8snode.api.Constants.INTEGRATION_TO_TUN_BRIDGE;
44import static org.onosproject.k8snode.api.Constants.LOCAL_BRIDGE;
Jian Li1a2eb5d2019-08-27 02:07:05 +090045import static org.onosproject.k8snode.api.Constants.LOCAL_TO_INTEGRATION_BRIDGE;
Jian Lieb488ea2019-04-16 01:50:02 +090046import static org.onosproject.k8snode.api.Constants.PHYSICAL_EXTERNAL_BRIDGE;
Jian Lie2a04ce2020-07-01 19:07:02 +090047import static org.onosproject.k8snode.api.Constants.TUNNEL_BRIDGE;
48import static org.onosproject.k8snode.api.Constants.TUN_TO_INTEGRATION_BRIDGE;
Jian Li49109b52019-01-22 00:17:28 +090049import static org.onosproject.k8snode.api.Constants.VXLAN_TUNNEL;
Jian Lie2a04ce2020-07-01 19:07:02 +090050import static org.onosproject.k8snode.api.K8sApiConfig.Mode.NORMAL;
51import static org.onosproject.k8snode.api.K8sApiConfig.Mode.PASSTHROUGH;
Jian Li49109b52019-01-22 00:17:28 +090052import static org.onosproject.net.AnnotationKeys.PORT_NAME;
53
54/**
55 * Representation of a kubernetes node.
56 */
57public class DefaultK8sNode implements K8sNode {
58
Jian Li2778ffa2019-05-07 13:21:52 +090059 private static final String PORT_MAC = "portMac";
Jian Lie2a04ce2020-07-01 19:07:02 +090060 private static final String FLOW_KEY = "flow";
Jian Li7d111d72019-04-12 13:58:44 +090061
Jian Lie2a04ce2020-07-01 19:07:02 +090062 private static final int SHORT_NAME_LENGTH = 10;
63
64 private final String clusterName;
Jian Li49109b52019-01-22 00:17:28 +090065 private final String hostname;
66 private final Type type;
Jian Lie2a04ce2020-07-01 19:07:02 +090067 private final int segmentId;
68 private final Mode mode;
Jian Li49109b52019-01-22 00:17:28 +090069 private final DeviceId intgBridge;
Jian Libf562c22019-04-15 18:07:14 +090070 private final DeviceId extBridge;
Jian Li1a2eb5d2019-08-27 02:07:05 +090071 private final DeviceId localBridge;
Jian Lie2a04ce2020-07-01 19:07:02 +090072 private final DeviceId tunBridge;
Jian Li49109b52019-01-22 00:17:28 +090073 private final IpAddress managementIp;
74 private final IpAddress dataIp;
75 private final K8sNodeState state;
Jian Li0c632722019-05-08 15:58:04 +090076 private final String extIntf;
Jian Lie2a04ce2020-07-01 19:07:02 +090077 private final K8sExternalNetwork extNetwork;
Jian Li0c632722019-05-08 15:58:04 +090078 private final String podCidr;
Jian Li49109b52019-01-22 00:17:28 +090079
80 private static final String NOT_NULL_MSG = "Node % cannot be null";
81
82 private static final String OVSDB = "ovsdb:";
83
84 /**
85 * A default constructor of kubernetes Node.
86 *
Jian Lie2a04ce2020-07-01 19:07:02 +090087 * @param clusterName clusterName
Jian Li49109b52019-01-22 00:17:28 +090088 * @param hostname hostname
89 * @param type node type
Jian Lie2a04ce2020-07-01 19:07:02 +090090 * @param segmentId segment identifier
91 * @param mode CNI running mode
Jian Li49109b52019-01-22 00:17:28 +090092 * @param intgBridge integration bridge
Jian Libf562c22019-04-15 18:07:14 +090093 * @param extBridge external bridge
Jian Li1a2eb5d2019-08-27 02:07:05 +090094 * @param localBridge local bridge
Jian Lie2a04ce2020-07-01 19:07:02 +090095 * @param tunBridge tunnel bridge
Jian Li0c632722019-05-08 15:58:04 +090096 * @param extIntf external interface
Jian Li49109b52019-01-22 00:17:28 +090097 * @param managementIp management IP address
98 * @param dataIp data IP address
99 * @param state node state
Jian Lie2a04ce2020-07-01 19:07:02 +0900100 * @param extNetwork external network
Jian Li0c632722019-05-08 15:58:04 +0900101 * @param podCidr POD CIDR
Jian Li49109b52019-01-22 00:17:28 +0900102 */
Jian Lie2a04ce2020-07-01 19:07:02 +0900103 protected DefaultK8sNode(String clusterName, String hostname, Type type,
104 int segmentId, Mode mode, DeviceId intgBridge,
Jian Li1a2eb5d2019-08-27 02:07:05 +0900105 DeviceId extBridge, DeviceId localBridge,
Jian Lie2a04ce2020-07-01 19:07:02 +0900106 DeviceId tunBridge, String extIntf, IpAddress managementIp,
Jian Li1a2eb5d2019-08-27 02:07:05 +0900107 IpAddress dataIp, K8sNodeState state,
Jian Lie2a04ce2020-07-01 19:07:02 +0900108 K8sExternalNetwork extNetwork, String podCidr) {
109 this.clusterName = clusterName;
Jian Li49109b52019-01-22 00:17:28 +0900110 this.hostname = hostname;
111 this.type = type;
Jian Lie2a04ce2020-07-01 19:07:02 +0900112 this.mode = mode;
113 this.segmentId = segmentId;
Jian Li49109b52019-01-22 00:17:28 +0900114 this.intgBridge = intgBridge;
Jian Libf562c22019-04-15 18:07:14 +0900115 this.extBridge = extBridge;
Jian Li1a2eb5d2019-08-27 02:07:05 +0900116 this.localBridge = localBridge;
Jian Lie2a04ce2020-07-01 19:07:02 +0900117 this.tunBridge = tunBridge;
Jian Li0c632722019-05-08 15:58:04 +0900118 this.extIntf = extIntf;
Jian Li49109b52019-01-22 00:17:28 +0900119 this.managementIp = managementIp;
120 this.dataIp = dataIp;
121 this.state = state;
Jian Lie2a04ce2020-07-01 19:07:02 +0900122 this.extNetwork = extNetwork;
Jian Li0c632722019-05-08 15:58:04 +0900123 this.podCidr = podCidr;
Jian Li49109b52019-01-22 00:17:28 +0900124 }
125
126 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900127 public String clusterName() {
128 return clusterName;
129 }
130
131 @Override
132 public String hostShortName() {
133 return StringUtils.substring(hostname, 0, SHORT_NAME_LENGTH);
134 }
135
136 @Override
137 public String uniqueString(int length) {
138 String uuid = UUID.nameUUIDFromBytes(hostname.getBytes()).toString();
139 return StringUtils.substring(uuid, 0, length);
140 }
141
142 @Override
143 public int segmentId() {
144 return segmentId;
145 }
146
147 @Override
148 public String tunnelKey() {
149 if (mode == PASSTHROUGH) {
150 return String.valueOf(segmentId);
151 } else {
152 return FLOW_KEY;
153 }
154 }
155
156 @Override
157 public Mode mode() {
158 return mode;
159 }
160
161 @Override
Jian Li49109b52019-01-22 00:17:28 +0900162 public String hostname() {
163 return hostname;
164 }
165
166 @Override
167 public Type type() {
168 return type;
169 }
170
171 @Override
172 public DeviceId ovsdb() {
173 return DeviceId.deviceId(OVSDB + managementIp().toString());
174 }
175
176 @Override
177 public DeviceId intgBridge() {
178 return intgBridge;
179 }
180
181 @Override
Jian Libf562c22019-04-15 18:07:14 +0900182 public DeviceId extBridge() {
183 return extBridge;
184 }
185
186 @Override
Jian Li1a2eb5d2019-08-27 02:07:05 +0900187 public DeviceId localBridge() {
188 return localBridge;
189 }
190
191 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900192 public DeviceId tunBridge() {
193 return tunBridge;
194 }
195
196 @Override
Jian Li0c632722019-05-08 15:58:04 +0900197 public String extIntf() {
198 return extIntf;
199 }
200
201 @Override
Jian Li1cee9882019-02-13 11:25:25 +0900202 public K8sNode updateIntgBridge(DeviceId deviceId) {
203 return new Builder()
204 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900205 .clusterName(clusterName)
Jian Li1cee9882019-02-13 11:25:25 +0900206 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900207 .segmentId(segmentId)
208 .mode(mode)
Jian Li1cee9882019-02-13 11:25:25 +0900209 .intgBridge(deviceId)
Jian Libf562c22019-04-15 18:07:14 +0900210 .extBridge(extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900211 .localBridge(localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900212 .tunBridge(tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900213 .extIntf(extIntf)
Jian Libf562c22019-04-15 18:07:14 +0900214 .managementIp(managementIp)
215 .dataIp(dataIp)
216 .state(state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900217 .extBridgeIp(extNetwork.extBridgeIp())
218 .extGatewayIp(extNetwork.extGatewayIp())
219 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900220 .podCidr(podCidr)
Jian Libf562c22019-04-15 18:07:14 +0900221 .build();
222 }
223
224 @Override
225 public K8sNode updateExtBridge(DeviceId deviceId) {
226 return new Builder()
227 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900228 .clusterName(clusterName)
Jian Libf562c22019-04-15 18:07:14 +0900229 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900230 .segmentId(segmentId)
231 .mode(mode)
Jian Libf562c22019-04-15 18:07:14 +0900232 .intgBridge(intgBridge)
233 .extBridge(deviceId)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900234 .localBridge(localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900235 .tunBridge(tunBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900236 .extIntf(extIntf)
237 .managementIp(managementIp)
238 .dataIp(dataIp)
239 .state(state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900240 .extBridgeIp(extNetwork.extBridgeIp())
241 .extGatewayIp(extNetwork.extGatewayIp())
242 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li1a2eb5d2019-08-27 02:07:05 +0900243 .podCidr(podCidr)
244 .build();
245 }
246
247 @Override
248 public K8sNode updateLocalBridge(DeviceId deviceId) {
249 return new Builder()
250 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900251 .clusterName(clusterName)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900252 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900253 .segmentId(segmentId)
254 .mode(mode)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900255 .intgBridge(intgBridge)
256 .extBridge(extBridge)
257 .localBridge(deviceId)
Jian Lie2a04ce2020-07-01 19:07:02 +0900258 .tunBridge(tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900259 .extIntf(extIntf)
Jian Li1cee9882019-02-13 11:25:25 +0900260 .managementIp(managementIp)
261 .dataIp(dataIp)
262 .state(state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900263 .extBridgeIp(extNetwork.extBridgeIp())
264 .extGatewayIp(extNetwork.extGatewayIp())
265 .extGatewayMac(extNetwork.extGatewayMac())
266 .podCidr(podCidr)
267 .build();
268 }
269
270 @Override
271 public K8sNode updateTunBridge(DeviceId deviceId) {
272 return new Builder()
273 .hostname(hostname)
274 .clusterName(clusterName)
275 .type(type)
276 .segmentId(segmentId)
277 .mode(mode)
278 .intgBridge(intgBridge)
279 .extBridge(extBridge)
280 .localBridge(localBridge)
281 .tunBridge(deviceId)
282 .extIntf(extIntf)
283 .managementIp(managementIp)
284 .dataIp(dataIp)
285 .state(state)
286 .extBridgeIp(extNetwork.extBridgeIp())
287 .extGatewayIp(extNetwork.extGatewayIp())
288 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900289 .podCidr(podCidr)
Jian Li1cee9882019-02-13 11:25:25 +0900290 .build();
291 }
292
293 @Override
Jian Li49109b52019-01-22 00:17:28 +0900294 public IpAddress managementIp() {
295 return managementIp;
296 }
297
298 @Override
299 public IpAddress dataIp() {
300 return dataIp;
301 }
302
303 @Override
304 public K8sNodeState state() {
305 return state;
306 }
307
308 @Override
Jian Li0c632722019-05-08 15:58:04 +0900309 public String podCidr() {
310 return podCidr;
311 }
312
313 @Override
Jian Li49109b52019-01-22 00:17:28 +0900314 public K8sNode updateState(K8sNodeState newState) {
315 return new Builder()
316 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900317 .clusterName(clusterName)
Jian Li49109b52019-01-22 00:17:28 +0900318 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900319 .segmentId(segmentId)
320 .mode(mode)
Jian Li49109b52019-01-22 00:17:28 +0900321 .intgBridge(intgBridge)
Jian Li0c632722019-05-08 15:58:04 +0900322 .extBridge(extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900323 .localBridge(localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900324 .tunBridge(tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900325 .extIntf(extIntf)
Jian Li49109b52019-01-22 00:17:28 +0900326 .managementIp(managementIp)
327 .dataIp(dataIp)
328 .state(newState)
Jian Lie2a04ce2020-07-01 19:07:02 +0900329 .extBridgeIp(extNetwork.extBridgeIp())
330 .extGatewayIp(extNetwork.extGatewayIp())
331 .extGatewayMac(extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900332 .podCidr(podCidr)
Jian Li49109b52019-01-22 00:17:28 +0900333 .build();
334 }
335
336 @Override
Jian Li1b08d652019-05-02 17:28:09 +0900337 public K8sNode updateExtGatewayMac(MacAddress newMac) {
338 return new Builder()
339 .hostname(hostname)
Jian Lie2a04ce2020-07-01 19:07:02 +0900340 .clusterName(clusterName)
Jian Li1b08d652019-05-02 17:28:09 +0900341 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900342 .segmentId(segmentId)
343 .mode(mode)
Jian Li1b08d652019-05-02 17:28:09 +0900344 .intgBridge(intgBridge)
Jian Li0c632722019-05-08 15:58:04 +0900345 .extBridge(extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900346 .localBridge(localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900347 .tunBridge(tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900348 .extIntf(extIntf)
Jian Li1b08d652019-05-02 17:28:09 +0900349 .managementIp(managementIp)
350 .dataIp(dataIp)
351 .state(state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900352 .extBridgeIp(extNetwork.extBridgeIp())
353 .extGatewayIp(extNetwork.extGatewayIp())
Jian Li1b08d652019-05-02 17:28:09 +0900354 .extGatewayMac(newMac)
Jian Li0c632722019-05-08 15:58:04 +0900355 .podCidr(podCidr)
Jian Li1b08d652019-05-02 17:28:09 +0900356 .build();
Jian Li1b08d652019-05-02 17:28:09 +0900357 }
358
359 @Override
Jian Li49109b52019-01-22 00:17:28 +0900360 public PortNumber grePortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900361 return tunnelPortNum(grePortName());
Jian Li49109b52019-01-22 00:17:28 +0900362 }
363
364 @Override
365 public PortNumber vxlanPortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900366 return tunnelPortNum(vxlanPortName());
Jian Li49109b52019-01-22 00:17:28 +0900367 }
368
369 @Override
370 public PortNumber genevePortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900371 return tunnelPortNum(genevePortName());
Jian Li49109b52019-01-22 00:17:28 +0900372 }
373
374 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900375 public PortNumber intgBridgePortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900376 return portNumber(intgBridge, intgBridgePortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900377 }
378
379 @Override
380 public PortNumber intgToExtPatchPortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900381 return portNumber(intgBridge, intgToExtPatchPortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900382 }
383
384 @Override
Jian Li1a2eb5d2019-08-27 02:07:05 +0900385 public PortNumber intgToLocalPatchPortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900386 return portNumber(intgBridge, intgToLocalPatchPortName());
387
Jian Li1a2eb5d2019-08-27 02:07:05 +0900388 }
389
390 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900391 public PortNumber localToIntgPatchPortNum() {
392 return portNumber(localBridge, localToIntgPatchPortName());
Jian Li1a2eb5d2019-08-27 02:07:05 +0900393 }
394
395 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900396 public PortNumber extToIntgPatchPortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900397 return portNumber(extBridge, extToIntgPatchPortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900398 }
399
400 @Override
Jian Li619fa282020-09-02 14:45:35 +0900401 public PortNumber intgToTunPortNum() {
402 return portNumber(intgBridge, intgToTunPatchPortName());
403 }
404
405 @Override
406 public PortNumber tunToIntgPortNum() {
407 return portNumber(tunBridge, tunToIntgPatchPortName());
408 }
409
410 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900411 public PortNumber extBridgePortNum() {
Jian Li0c632722019-05-08 15:58:04 +0900412 if (this.extIntf == null) {
Jian Lieb488ea2019-04-16 01:50:02 +0900413 return null;
414 }
Jian Lie2a04ce2020-07-01 19:07:02 +0900415 return portNumber(extBridge, extBridgePortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900416 }
417
418 @Override
Jian Lic2242bd2020-09-03 13:12:14 +0900419 public PortNumber extIntfPortNum() {
420 if (this.extIntf == null) {
421 return null;
422 }
423 return portNumber(extBridge, extIntf());
424 }
425
426 @Override
Jian Li2778ffa2019-05-07 13:21:52 +0900427 public MacAddress intgBridgeMac() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900428 return macAddress(intgBridge, intgBridgeName());
Jian Li2778ffa2019-05-07 13:21:52 +0900429 }
430
431 @Override
432 public IpAddress extBridgeIp() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900433 return extNetwork.extBridgeIp();
Jian Li2778ffa2019-05-07 13:21:52 +0900434 }
435
436 @Override
437 public MacAddress extBridgeMac() {
Jian Lic2242bd2020-09-03 13:12:14 +0900438 if (MacAddress.valueOf(DEFAULT_EXTERNAL_GATEWAY_MAC).equals(extGatewayMac())) {
439 return MacAddress.valueOf(DEFAULT_EXTERNAL_BRIDGE_MAC);
440 } else {
441 return macAddress(extBridge, extBridgeName());
442 }
Jian Li2778ffa2019-05-07 13:21:52 +0900443 }
444
445 @Override
446 public IpAddress extGatewayIp() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900447 return extNetwork.extGatewayIp();
Jian Li2778ffa2019-05-07 13:21:52 +0900448 }
449
450 @Override
451 public MacAddress extGatewayMac() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900452 return extNetwork.extGatewayMac();
453 }
454
455 @Override
456 public String grePortName() {
457 if (mode == PASSTHROUGH) {
458 return GRE_TUNNEL + "-" + segmentId;
459 } else {
460 return GRE_TUNNEL;
461 }
462 }
463
464 @Override
465 public String vxlanPortName() {
466 if (mode == PASSTHROUGH) {
467 return VXLAN_TUNNEL + "-" + segmentId;
468 } else {
469 return VXLAN_TUNNEL;
470 }
471 }
472
473 @Override
474 public String genevePortName() {
475 if (mode == PASSTHROUGH) {
476 return GENEVE_TUNNEL + "-" + segmentId;
477 } else {
478 return GENEVE_TUNNEL;
479 }
480 }
481
482 @Override
483 public String intgBridgeName() {
484 if (mode == PASSTHROUGH) {
485 return INTEGRATION_BRIDGE + "-" + uniqueString(5);
486 } else {
487 return INTEGRATION_BRIDGE;
488 }
489 }
490
491 @Override
492 public String extBridgeName() {
493 if (mode == PASSTHROUGH) {
494 return EXTERNAL_BRIDGE + "-" + uniqueString(5);
495 } else {
496 return EXTERNAL_BRIDGE;
497 }
498 }
499
500 @Override
501 public String localBridgeName() {
502 if (mode == PASSTHROUGH) {
503 return LOCAL_BRIDGE + "-" + uniqueString(5);
504 } else {
505 return LOCAL_BRIDGE;
506 }
507 }
508
509 @Override
510 public String tunBridgeName() {
511 if (mode == PASSTHROUGH) {
512 return TUNNEL_BRIDGE + "-" + segmentId;
513 } else {
514 return TUNNEL_BRIDGE;
515 }
516 }
517
518 @Override
519 public String intgBridgePortName() {
520 if (mode == PASSTHROUGH) {
521 return INTEGRATION_BRIDGE + "-" + uniqueString(5);
522 } else {
523 return INTEGRATION_BRIDGE;
524 }
525 }
526
527 @Override
528 public String extBridgePortName() {
529 if (mode == PASSTHROUGH) {
530 return EXTERNAL_BRIDGE + "-" + uniqueString(5);
531 } else {
532 return EXTERNAL_BRIDGE;
533 }
534 }
535
536 @Override
537 public String localBridgePortName() {
538 if (mode == PASSTHROUGH) {
539 return LOCAL_BRIDGE + "-" + uniqueString(5);
540 } else {
541 return LOCAL_BRIDGE;
542 }
543 }
544
545 @Override
Jian Li619fa282020-09-02 14:45:35 +0900546 public String tunBridgePortName() {
547 if (mode == PASSTHROUGH) {
548 return TUNNEL_BRIDGE + "-" + uniqueString(5);
549 } else {
550 return TUNNEL_BRIDGE;
551 }
552 }
553
554 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900555 public String intgToExtPatchPortName() {
556 if (mode == PASSTHROUGH) {
557 return INTEGRATION_TO_EXTERNAL_BRIDGE + "-" + uniqueString(5);
558 } else {
559 return INTEGRATION_TO_EXTERNAL_BRIDGE;
560 }
561 }
562
563 @Override
564 public String intgToTunPatchPortName() {
565 if (mode == PASSTHROUGH) {
566 return INTEGRATION_TO_TUN_BRIDGE + "-" + uniqueString(5);
567 } else {
568 return INTEGRATION_TO_TUN_BRIDGE;
569 }
570 }
571
572 @Override
573 public String intgToLocalPatchPortName() {
574 if (mode == PASSTHROUGH) {
575 return INTEGRATION_TO_LOCAL_BRIDGE + "-" + uniqueString(5);
576 } else {
577 return INTEGRATION_TO_LOCAL_BRIDGE;
578 }
579 }
580
581 @Override
582 public String localToIntgPatchPortName() {
583 if (mode == PASSTHROUGH) {
584 return LOCAL_TO_INTEGRATION_BRIDGE + "-" + uniqueString(5);
585 } else {
586 return LOCAL_TO_INTEGRATION_BRIDGE;
587 }
588 }
589
590 @Override
591 public String extToIntgPatchPortName() {
592 if (mode == PASSTHROUGH) {
593 return PHYSICAL_EXTERNAL_BRIDGE + "-" + uniqueString(5);
594 } else {
595 return PHYSICAL_EXTERNAL_BRIDGE;
596 }
597 }
598
599 @Override
600 public String tunToIntgPatchPortName() {
601 if (mode == PASSTHROUGH) {
602 return TUN_TO_INTEGRATION_BRIDGE + "-" + uniqueString(5);
603 } else {
604 return TUN_TO_INTEGRATION_BRIDGE;
605 }
Jian Li2778ffa2019-05-07 13:21:52 +0900606 }
607
608 @Override
Jian Li49109b52019-01-22 00:17:28 +0900609 public boolean equals(Object obj) {
610 if (this == obj) {
611 return true;
612 }
613
614 if (obj instanceof DefaultK8sNode) {
615 DefaultK8sNode that = (DefaultK8sNode) obj;
616
Jian Lie2a04ce2020-07-01 19:07:02 +0900617 return clusterName.equals(that.clusterName) &&
618 hostname.equals(that.hostname) &&
Jian Li49109b52019-01-22 00:17:28 +0900619 type == that.type &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900620 segmentId == that.segmentId &&
621 mode == that.mode &&
Jian Li49109b52019-01-22 00:17:28 +0900622 intgBridge.equals(that.intgBridge) &&
Jian Libf562c22019-04-15 18:07:14 +0900623 extBridge.equals(that.extBridge) &&
Jian Li1a2eb5d2019-08-27 02:07:05 +0900624 localBridge.equals(that.localBridge) &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900625 tunBridge.equals(that.tunBridge) &&
Jian Li0c632722019-05-08 15:58:04 +0900626 extIntf.equals(that.extIntf) &&
Jian Li49109b52019-01-22 00:17:28 +0900627 managementIp.equals(that.managementIp) &&
628 dataIp.equals(that.dataIp) &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900629 extNetwork.equals(that.extNetwork) &&
Jian Li0c632722019-05-08 15:58:04 +0900630 podCidr.equals(that.podCidr) &&
Jian Li49109b52019-01-22 00:17:28 +0900631 state == that.state;
632 }
633
634 return false;
635 }
636
637 @Override
638 public int hashCode() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900639 return Objects.hash(clusterName, hostname, type, segmentId, mode, intgBridge, extBridge,
640 localBridge, tunBridge, extIntf, managementIp, dataIp, state, extNetwork, podCidr);
Jian Li49109b52019-01-22 00:17:28 +0900641 }
642
643 @Override
644 public String toString() {
645 return MoreObjects.toStringHelper(this)
Jian Lie2a04ce2020-07-01 19:07:02 +0900646 .add("clusterName", clusterName)
Jian Li49109b52019-01-22 00:17:28 +0900647 .add("hostname", hostname)
648 .add("type", type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900649 .add("segmentId", segmentId)
650 .add("mode", mode)
Jian Li49109b52019-01-22 00:17:28 +0900651 .add("intgBridge", intgBridge)
Jian Libf562c22019-04-15 18:07:14 +0900652 .add("extBridge", extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900653 .add("localBridge", localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900654 .add("tunBridge", tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900655 .add("extIntf", extIntf)
Jian Li49109b52019-01-22 00:17:28 +0900656 .add("managementIp", managementIp)
657 .add("dataIp", dataIp)
658 .add("state", state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900659 .add("extBridgeIp", extNetwork.extBridgeIp())
660 .add("extGatewayIp", extNetwork.extGatewayIp())
661 .add("extGatewayMac", extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900662 .add("podCidr", podCidr)
Jian Li49109b52019-01-22 00:17:28 +0900663 .toString();
664 }
665
666 private PortNumber tunnelPortNum(String tunnelType) {
667 if (dataIp == null) {
668 return null;
669 }
Jian Lieb488ea2019-04-16 01:50:02 +0900670
Jian Lie2a04ce2020-07-01 19:07:02 +0900671 return portNumber(tunBridge, tunnelType);
Jian Lieb488ea2019-04-16 01:50:02 +0900672 }
673
Jian Li2778ffa2019-05-07 13:21:52 +0900674 private MacAddress macAddress(DeviceId deviceId, String portName) {
675 Port port = port(deviceId, portName);
676 Annotations annots = port.annotations();
677 return annots != null ? MacAddress.valueOf(annots.value(PORT_MAC)) : null;
678 }
679
Jian Lieb488ea2019-04-16 01:50:02 +0900680 private PortNumber portNumber(DeviceId deviceId, String portName) {
Jian Li2778ffa2019-05-07 13:21:52 +0900681 Port port = port(deviceId, portName);
682 return port != null ? port.number() : null;
683 }
684
685 private Port port(DeviceId deviceId, String portName) {
Jian Li49109b52019-01-22 00:17:28 +0900686 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
Jian Li2778ffa2019-05-07 13:21:52 +0900687 return deviceService.getPorts(deviceId).stream()
Jian Li49109b52019-01-22 00:17:28 +0900688 .filter(p -> p.isEnabled() &&
Jian Lieb488ea2019-04-16 01:50:02 +0900689 Objects.equals(p.annotations().value(PORT_NAME), portName))
Jian Li49109b52019-01-22 00:17:28 +0900690 .findAny().orElse(null);
Jian Li49109b52019-01-22 00:17:28 +0900691 }
692
693 /**
694 * Returns new builder instance.
695 *
696 * @return kubernetes node builder
697 */
698 public static Builder builder() {
699 return new Builder();
700 }
701
702 /**
703 * Returns new builder instance with the given node as a default value.
704 *
705 * @param node kubernetes node
706 * @return kubernetes node builder
707 */
708 public static Builder from(K8sNode node) {
709 return new Builder()
710 .hostname(node.hostname())
Jian Lie2a04ce2020-07-01 19:07:02 +0900711 .clusterName(node.clusterName())
Jian Li49109b52019-01-22 00:17:28 +0900712 .type(node.type())
Jian Lie2a04ce2020-07-01 19:07:02 +0900713 .segmentId(node.segmentId())
Jian Li49109b52019-01-22 00:17:28 +0900714 .intgBridge(node.intgBridge())
Jian Libf562c22019-04-15 18:07:14 +0900715 .extBridge(node.extBridge())
Jian Li1a2eb5d2019-08-27 02:07:05 +0900716 .localBridge(node.localBridge())
Jian Lie2a04ce2020-07-01 19:07:02 +0900717 .tunBridge(node.tunBridge())
Jian Li0c632722019-05-08 15:58:04 +0900718 .extIntf(node.extIntf())
Jian Li49109b52019-01-22 00:17:28 +0900719 .managementIp(node.managementIp())
720 .dataIp(node.dataIp())
Jian Li1b08d652019-05-02 17:28:09 +0900721 .state(node.state())
Jian Li0c632722019-05-08 15:58:04 +0900722 .extBridgeIp(node.extBridgeIp())
723 .extGatewayIp(node.extGatewayIp())
724 .extGatewayMac(node.extGatewayMac())
725 .podCidr(node.podCidr());
Jian Li49109b52019-01-22 00:17:28 +0900726 }
727
728 public static final class Builder implements K8sNode.Builder {
729
Jian Lie2a04ce2020-07-01 19:07:02 +0900730 private String clusterName;
Jian Li49109b52019-01-22 00:17:28 +0900731 private String hostname;
732 private Type type;
Jian Lie2a04ce2020-07-01 19:07:02 +0900733 private int segmentId;
734 private Mode mode;
Jian Li49109b52019-01-22 00:17:28 +0900735 private DeviceId intgBridge;
Jian Libf562c22019-04-15 18:07:14 +0900736 private DeviceId extBridge;
Jian Li1a2eb5d2019-08-27 02:07:05 +0900737 private DeviceId localBridge;
Jian Lie2a04ce2020-07-01 19:07:02 +0900738 private DeviceId tunBridge;
Jian Li49109b52019-01-22 00:17:28 +0900739 private IpAddress managementIp;
740 private IpAddress dataIp;
741 private K8sNodeState state;
Jian Li3defa842019-02-12 00:31:35 +0900742 private K8sApiConfig apiConfig;
Jian Li0c632722019-05-08 15:58:04 +0900743 private String extIntf;
744 private IpAddress extBridgeIp;
745 private IpAddress extGatewayIp;
Jian Li1b08d652019-05-02 17:28:09 +0900746 private MacAddress extGatewayMac;
Jian Li0c632722019-05-08 15:58:04 +0900747 private String podCidr;
Jian Li49109b52019-01-22 00:17:28 +0900748
749 // private constructor not intended to use from external
750 private Builder() {
751 }
752
753 @Override
754 public K8sNode build() {
755 checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
756 checkArgument(type != null, NOT_NULL_MSG, "type");
757 checkArgument(state != null, NOT_NULL_MSG, "state");
758 checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
759
Jian Lie2a04ce2020-07-01 19:07:02 +0900760 if (StringUtils.isEmpty(clusterName)) {
761 clusterName = DEFAULT_CLUSTER_NAME;
762 }
763
764 if (mode == null) {
765 mode = NORMAL;
766 }
767
768 K8sExternalNetwork extNetwork = DefaultK8sExternalNetwork.builder()
769 .extBridgeIp(extBridgeIp)
770 .extGatewayIp(extGatewayIp)
771 .extGatewayMac(extGatewayMac)
772 .build();
773
774 return new DefaultK8sNode(clusterName,
775 hostname,
Jian Li49109b52019-01-22 00:17:28 +0900776 type,
Jian Lie2a04ce2020-07-01 19:07:02 +0900777 segmentId,
778 mode,
Jian Li49109b52019-01-22 00:17:28 +0900779 intgBridge,
Jian Libf562c22019-04-15 18:07:14 +0900780 extBridge,
Jian Li1a2eb5d2019-08-27 02:07:05 +0900781 localBridge,
Jian Lie2a04ce2020-07-01 19:07:02 +0900782 tunBridge,
Jian Li0c632722019-05-08 15:58:04 +0900783 extIntf,
Jian Li49109b52019-01-22 00:17:28 +0900784 managementIp,
785 dataIp,
Jian Li1b08d652019-05-02 17:28:09 +0900786 state,
Jian Lie2a04ce2020-07-01 19:07:02 +0900787 extNetwork,
Jian Li0c632722019-05-08 15:58:04 +0900788 podCidr);
Jian Li49109b52019-01-22 00:17:28 +0900789 }
790
791 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900792 public Builder clusterName(String clusterName) {
793 this.clusterName = clusterName;
794 return this;
795 }
796
797 @Override
Jian Li49109b52019-01-22 00:17:28 +0900798 public Builder hostname(String hostname) {
799 this.hostname = hostname;
800 return this;
801 }
802
803 @Override
804 public Builder type(Type type) {
805 this.type = type;
806 return this;
807 }
808
809 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900810 public Builder segmentId(int segmentId) {
811 this.segmentId = segmentId;
812 return this;
813 }
814
815 @Override
816 public Builder mode(Mode mode) {
817 this.mode = mode;
818 return this;
819 }
820
821 @Override
Jian Li49109b52019-01-22 00:17:28 +0900822 public Builder intgBridge(DeviceId deviceId) {
823 this.intgBridge = deviceId;
824 return this;
825 }
826
827 @Override
Jian Libf562c22019-04-15 18:07:14 +0900828 public Builder extBridge(DeviceId deviceId) {
829 this.extBridge = deviceId;
830 return this;
831 }
832
833 @Override
Jian Li1a2eb5d2019-08-27 02:07:05 +0900834 public Builder localBridge(DeviceId deviceId) {
835 this.localBridge = deviceId;
836 return this;
837 }
838
839 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900840 public Builder tunBridge(DeviceId deviceId) {
841 this.tunBridge = deviceId;
842 return this;
843 }
844
845 @Override
Jian Li0c632722019-05-08 15:58:04 +0900846 public Builder extIntf(String intf) {
847 this.extIntf = intf;
848 return this;
849 }
850
851 @Override
Jian Li49109b52019-01-22 00:17:28 +0900852 public Builder managementIp(IpAddress managementIp) {
853 this.managementIp = managementIp;
854 return this;
855 }
856
857 @Override
858 public Builder dataIp(IpAddress dataIp) {
859 this.dataIp = dataIp;
860 return this;
861 }
862
863 @Override
864 public Builder state(K8sNodeState state) {
865 this.state = state;
866 return this;
867 }
Jian Li1b08d652019-05-02 17:28:09 +0900868
869 @Override
Jian Li0c632722019-05-08 15:58:04 +0900870 public Builder extBridgeIp(IpAddress extBridgeIp) {
871 this.extBridgeIp = extBridgeIp;
872 return this;
873 }
874
875 @Override
876 public Builder extGatewayIp(IpAddress extGatewayIp) {
877 this.extGatewayIp = extGatewayIp;
878 return this;
879 }
880
881 @Override
Jian Li1b08d652019-05-02 17:28:09 +0900882 public Builder extGatewayMac(MacAddress extGatewayMac) {
883 this.extGatewayMac = extGatewayMac;
884 return this;
885 }
Jian Li0c632722019-05-08 15:58:04 +0900886
887 @Override
888 public Builder podCidr(String podCidr) {
889 this.podCidr = podCidr;
890 return this;
891 }
Jian Li49109b52019-01-22 00:17:28 +0900892 }
893}