blob: 7e4b4bc3b37d4a37ef4def81b30befa30f45fb4d [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 Li5abc9f02020-09-04 19:38:37 +0900376 return PortNumber.LOCAL;
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());
Jian Li1a2eb5d2019-08-27 02:07:05 +0900387 }
388
389 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900390 public PortNumber localToIntgPatchPortNum() {
391 return portNumber(localBridge, localToIntgPatchPortName());
Jian Li1a2eb5d2019-08-27 02:07:05 +0900392 }
393
394 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900395 public PortNumber extToIntgPatchPortNum() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900396 return portNumber(extBridge, extToIntgPatchPortName());
Jian Lieb488ea2019-04-16 01:50:02 +0900397 }
398
399 @Override
Jian Li619fa282020-09-02 14:45:35 +0900400 public PortNumber intgToTunPortNum() {
401 return portNumber(intgBridge, intgToTunPatchPortName());
402 }
403
404 @Override
405 public PortNumber tunToIntgPortNum() {
406 return portNumber(tunBridge, tunToIntgPatchPortName());
407 }
408
409 @Override
Jian Lieb488ea2019-04-16 01:50:02 +0900410 public PortNumber extBridgePortNum() {
Jian Li5abc9f02020-09-04 19:38:37 +0900411 return PortNumber.LOCAL;
Jian Lieb488ea2019-04-16 01:50:02 +0900412 }
413
414 @Override
Jian Lic2242bd2020-09-03 13:12:14 +0900415 public PortNumber extIntfPortNum() {
416 if (this.extIntf == null) {
417 return null;
418 }
419 return portNumber(extBridge, extIntf());
420 }
421
422 @Override
Jian Li2778ffa2019-05-07 13:21:52 +0900423 public MacAddress intgBridgeMac() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900424 return macAddress(intgBridge, intgBridgeName());
Jian Li2778ffa2019-05-07 13:21:52 +0900425 }
426
427 @Override
428 public IpAddress extBridgeIp() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900429 return extNetwork.extBridgeIp();
Jian Li2778ffa2019-05-07 13:21:52 +0900430 }
431
432 @Override
433 public MacAddress extBridgeMac() {
Jian Lic2242bd2020-09-03 13:12:14 +0900434 if (MacAddress.valueOf(DEFAULT_EXTERNAL_GATEWAY_MAC).equals(extGatewayMac())) {
435 return MacAddress.valueOf(DEFAULT_EXTERNAL_BRIDGE_MAC);
436 } else {
437 return macAddress(extBridge, extBridgeName());
438 }
Jian Li2778ffa2019-05-07 13:21:52 +0900439 }
440
441 @Override
442 public IpAddress extGatewayIp() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900443 return extNetwork.extGatewayIp();
Jian Li2778ffa2019-05-07 13:21:52 +0900444 }
445
446 @Override
447 public MacAddress extGatewayMac() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900448 return extNetwork.extGatewayMac();
449 }
450
451 @Override
452 public String grePortName() {
453 if (mode == PASSTHROUGH) {
454 return GRE_TUNNEL + "-" + segmentId;
455 } else {
456 return GRE_TUNNEL;
457 }
458 }
459
460 @Override
461 public String vxlanPortName() {
462 if (mode == PASSTHROUGH) {
463 return VXLAN_TUNNEL + "-" + segmentId;
464 } else {
465 return VXLAN_TUNNEL;
466 }
467 }
468
469 @Override
470 public String genevePortName() {
471 if (mode == PASSTHROUGH) {
472 return GENEVE_TUNNEL + "-" + segmentId;
473 } else {
474 return GENEVE_TUNNEL;
475 }
476 }
477
478 @Override
479 public String intgBridgeName() {
480 if (mode == PASSTHROUGH) {
481 return INTEGRATION_BRIDGE + "-" + uniqueString(5);
482 } else {
483 return INTEGRATION_BRIDGE;
484 }
485 }
486
487 @Override
488 public String extBridgeName() {
489 if (mode == PASSTHROUGH) {
490 return EXTERNAL_BRIDGE + "-" + uniqueString(5);
491 } else {
492 return EXTERNAL_BRIDGE;
493 }
494 }
495
496 @Override
497 public String localBridgeName() {
498 if (mode == PASSTHROUGH) {
499 return LOCAL_BRIDGE + "-" + uniqueString(5);
500 } else {
501 return LOCAL_BRIDGE;
502 }
503 }
504
505 @Override
506 public String tunBridgeName() {
507 if (mode == PASSTHROUGH) {
508 return TUNNEL_BRIDGE + "-" + segmentId;
509 } else {
510 return TUNNEL_BRIDGE;
511 }
512 }
513
514 @Override
515 public String intgBridgePortName() {
516 if (mode == PASSTHROUGH) {
517 return INTEGRATION_BRIDGE + "-" + uniqueString(5);
518 } else {
519 return INTEGRATION_BRIDGE;
520 }
521 }
522
523 @Override
524 public String extBridgePortName() {
525 if (mode == PASSTHROUGH) {
526 return EXTERNAL_BRIDGE + "-" + uniqueString(5);
527 } else {
528 return EXTERNAL_BRIDGE;
529 }
530 }
531
532 @Override
533 public String localBridgePortName() {
534 if (mode == PASSTHROUGH) {
535 return LOCAL_BRIDGE + "-" + uniqueString(5);
536 } else {
537 return LOCAL_BRIDGE;
538 }
539 }
540
541 @Override
Jian Li619fa282020-09-02 14:45:35 +0900542 public String tunBridgePortName() {
543 if (mode == PASSTHROUGH) {
544 return TUNNEL_BRIDGE + "-" + uniqueString(5);
545 } else {
546 return TUNNEL_BRIDGE;
547 }
548 }
549
550 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900551 public String intgToExtPatchPortName() {
552 if (mode == PASSTHROUGH) {
553 return INTEGRATION_TO_EXTERNAL_BRIDGE + "-" + uniqueString(5);
554 } else {
555 return INTEGRATION_TO_EXTERNAL_BRIDGE;
556 }
557 }
558
559 @Override
560 public String intgToTunPatchPortName() {
561 if (mode == PASSTHROUGH) {
562 return INTEGRATION_TO_TUN_BRIDGE + "-" + uniqueString(5);
563 } else {
564 return INTEGRATION_TO_TUN_BRIDGE;
565 }
566 }
567
568 @Override
569 public String intgToLocalPatchPortName() {
570 if (mode == PASSTHROUGH) {
571 return INTEGRATION_TO_LOCAL_BRIDGE + "-" + uniqueString(5);
572 } else {
573 return INTEGRATION_TO_LOCAL_BRIDGE;
574 }
575 }
576
577 @Override
578 public String localToIntgPatchPortName() {
579 if (mode == PASSTHROUGH) {
580 return LOCAL_TO_INTEGRATION_BRIDGE + "-" + uniqueString(5);
581 } else {
582 return LOCAL_TO_INTEGRATION_BRIDGE;
583 }
584 }
585
586 @Override
587 public String extToIntgPatchPortName() {
588 if (mode == PASSTHROUGH) {
589 return PHYSICAL_EXTERNAL_BRIDGE + "-" + uniqueString(5);
590 } else {
591 return PHYSICAL_EXTERNAL_BRIDGE;
592 }
593 }
594
595 @Override
596 public String tunToIntgPatchPortName() {
597 if (mode == PASSTHROUGH) {
598 return TUN_TO_INTEGRATION_BRIDGE + "-" + uniqueString(5);
599 } else {
600 return TUN_TO_INTEGRATION_BRIDGE;
601 }
Jian Li2778ffa2019-05-07 13:21:52 +0900602 }
603
604 @Override
Jian Li49109b52019-01-22 00:17:28 +0900605 public boolean equals(Object obj) {
606 if (this == obj) {
607 return true;
608 }
609
610 if (obj instanceof DefaultK8sNode) {
611 DefaultK8sNode that = (DefaultK8sNode) obj;
612
Jian Lie2a04ce2020-07-01 19:07:02 +0900613 return clusterName.equals(that.clusterName) &&
614 hostname.equals(that.hostname) &&
Jian Li49109b52019-01-22 00:17:28 +0900615 type == that.type &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900616 segmentId == that.segmentId &&
617 mode == that.mode &&
Jian Li49109b52019-01-22 00:17:28 +0900618 intgBridge.equals(that.intgBridge) &&
Jian Libf562c22019-04-15 18:07:14 +0900619 extBridge.equals(that.extBridge) &&
Jian Li1a2eb5d2019-08-27 02:07:05 +0900620 localBridge.equals(that.localBridge) &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900621 tunBridge.equals(that.tunBridge) &&
Jian Li0c632722019-05-08 15:58:04 +0900622 extIntf.equals(that.extIntf) &&
Jian Li49109b52019-01-22 00:17:28 +0900623 managementIp.equals(that.managementIp) &&
624 dataIp.equals(that.dataIp) &&
Jian Lie2a04ce2020-07-01 19:07:02 +0900625 extNetwork.equals(that.extNetwork) &&
Jian Li0c632722019-05-08 15:58:04 +0900626 podCidr.equals(that.podCidr) &&
Jian Li49109b52019-01-22 00:17:28 +0900627 state == that.state;
628 }
629
630 return false;
631 }
632
633 @Override
634 public int hashCode() {
Jian Lie2a04ce2020-07-01 19:07:02 +0900635 return Objects.hash(clusterName, hostname, type, segmentId, mode, intgBridge, extBridge,
636 localBridge, tunBridge, extIntf, managementIp, dataIp, state, extNetwork, podCidr);
Jian Li49109b52019-01-22 00:17:28 +0900637 }
638
639 @Override
640 public String toString() {
641 return MoreObjects.toStringHelper(this)
Jian Lie2a04ce2020-07-01 19:07:02 +0900642 .add("clusterName", clusterName)
Jian Li49109b52019-01-22 00:17:28 +0900643 .add("hostname", hostname)
644 .add("type", type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900645 .add("segmentId", segmentId)
646 .add("mode", mode)
Jian Li49109b52019-01-22 00:17:28 +0900647 .add("intgBridge", intgBridge)
Jian Libf562c22019-04-15 18:07:14 +0900648 .add("extBridge", extBridge)
Jian Li1a2eb5d2019-08-27 02:07:05 +0900649 .add("localBridge", localBridge)
Jian Lie2a04ce2020-07-01 19:07:02 +0900650 .add("tunBridge", tunBridge)
Jian Li0c632722019-05-08 15:58:04 +0900651 .add("extIntf", extIntf)
Jian Li49109b52019-01-22 00:17:28 +0900652 .add("managementIp", managementIp)
653 .add("dataIp", dataIp)
654 .add("state", state)
Jian Lie2a04ce2020-07-01 19:07:02 +0900655 .add("extBridgeIp", extNetwork.extBridgeIp())
656 .add("extGatewayIp", extNetwork.extGatewayIp())
657 .add("extGatewayMac", extNetwork.extGatewayMac())
Jian Li0c632722019-05-08 15:58:04 +0900658 .add("podCidr", podCidr)
Jian Li49109b52019-01-22 00:17:28 +0900659 .toString();
660 }
661
662 private PortNumber tunnelPortNum(String tunnelType) {
663 if (dataIp == null) {
664 return null;
665 }
Jian Lieb488ea2019-04-16 01:50:02 +0900666
Jian Lie2a04ce2020-07-01 19:07:02 +0900667 return portNumber(tunBridge, tunnelType);
Jian Lieb488ea2019-04-16 01:50:02 +0900668 }
669
Jian Li2778ffa2019-05-07 13:21:52 +0900670 private MacAddress macAddress(DeviceId deviceId, String portName) {
671 Port port = port(deviceId, portName);
672 Annotations annots = port.annotations();
673 return annots != null ? MacAddress.valueOf(annots.value(PORT_MAC)) : null;
674 }
675
Jian Lieb488ea2019-04-16 01:50:02 +0900676 private PortNumber portNumber(DeviceId deviceId, String portName) {
Jian Li2778ffa2019-05-07 13:21:52 +0900677 Port port = port(deviceId, portName);
678 return port != null ? port.number() : null;
679 }
680
681 private Port port(DeviceId deviceId, String portName) {
Jian Li49109b52019-01-22 00:17:28 +0900682 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
Jian Li2778ffa2019-05-07 13:21:52 +0900683 return deviceService.getPorts(deviceId).stream()
Jian Li49109b52019-01-22 00:17:28 +0900684 .filter(p -> p.isEnabled() &&
Jian Lieb488ea2019-04-16 01:50:02 +0900685 Objects.equals(p.annotations().value(PORT_NAME), portName))
Jian Li49109b52019-01-22 00:17:28 +0900686 .findAny().orElse(null);
Jian Li49109b52019-01-22 00:17:28 +0900687 }
688
689 /**
690 * Returns new builder instance.
691 *
692 * @return kubernetes node builder
693 */
694 public static Builder builder() {
695 return new Builder();
696 }
697
698 /**
699 * Returns new builder instance with the given node as a default value.
700 *
701 * @param node kubernetes node
702 * @return kubernetes node builder
703 */
704 public static Builder from(K8sNode node) {
705 return new Builder()
706 .hostname(node.hostname())
Jian Lie2a04ce2020-07-01 19:07:02 +0900707 .clusterName(node.clusterName())
Jian Li49109b52019-01-22 00:17:28 +0900708 .type(node.type())
Jian Lie2a04ce2020-07-01 19:07:02 +0900709 .segmentId(node.segmentId())
Jian Li49109b52019-01-22 00:17:28 +0900710 .intgBridge(node.intgBridge())
Jian Libf562c22019-04-15 18:07:14 +0900711 .extBridge(node.extBridge())
Jian Li1a2eb5d2019-08-27 02:07:05 +0900712 .localBridge(node.localBridge())
Jian Lie2a04ce2020-07-01 19:07:02 +0900713 .tunBridge(node.tunBridge())
Jian Li0c632722019-05-08 15:58:04 +0900714 .extIntf(node.extIntf())
Jian Li49109b52019-01-22 00:17:28 +0900715 .managementIp(node.managementIp())
716 .dataIp(node.dataIp())
Jian Li1b08d652019-05-02 17:28:09 +0900717 .state(node.state())
Jian Li0c632722019-05-08 15:58:04 +0900718 .extBridgeIp(node.extBridgeIp())
719 .extGatewayIp(node.extGatewayIp())
720 .extGatewayMac(node.extGatewayMac())
721 .podCidr(node.podCidr());
Jian Li49109b52019-01-22 00:17:28 +0900722 }
723
724 public static final class Builder implements K8sNode.Builder {
725
Jian Lie2a04ce2020-07-01 19:07:02 +0900726 private String clusterName;
Jian Li49109b52019-01-22 00:17:28 +0900727 private String hostname;
728 private Type type;
Jian Lie2a04ce2020-07-01 19:07:02 +0900729 private int segmentId;
730 private Mode mode;
Jian Li49109b52019-01-22 00:17:28 +0900731 private DeviceId intgBridge;
Jian Libf562c22019-04-15 18:07:14 +0900732 private DeviceId extBridge;
Jian Li1a2eb5d2019-08-27 02:07:05 +0900733 private DeviceId localBridge;
Jian Lie2a04ce2020-07-01 19:07:02 +0900734 private DeviceId tunBridge;
Jian Li49109b52019-01-22 00:17:28 +0900735 private IpAddress managementIp;
736 private IpAddress dataIp;
737 private K8sNodeState state;
Jian Li3defa842019-02-12 00:31:35 +0900738 private K8sApiConfig apiConfig;
Jian Li0c632722019-05-08 15:58:04 +0900739 private String extIntf;
740 private IpAddress extBridgeIp;
741 private IpAddress extGatewayIp;
Jian Li1b08d652019-05-02 17:28:09 +0900742 private MacAddress extGatewayMac;
Jian Li0c632722019-05-08 15:58:04 +0900743 private String podCidr;
Jian Li49109b52019-01-22 00:17:28 +0900744
745 // private constructor not intended to use from external
746 private Builder() {
747 }
748
749 @Override
750 public K8sNode build() {
751 checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
752 checkArgument(type != null, NOT_NULL_MSG, "type");
753 checkArgument(state != null, NOT_NULL_MSG, "state");
754 checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
755
Jian Lie2a04ce2020-07-01 19:07:02 +0900756 if (StringUtils.isEmpty(clusterName)) {
757 clusterName = DEFAULT_CLUSTER_NAME;
758 }
759
760 if (mode == null) {
761 mode = NORMAL;
762 }
763
764 K8sExternalNetwork extNetwork = DefaultK8sExternalNetwork.builder()
765 .extBridgeIp(extBridgeIp)
766 .extGatewayIp(extGatewayIp)
767 .extGatewayMac(extGatewayMac)
768 .build();
769
770 return new DefaultK8sNode(clusterName,
771 hostname,
Jian Li49109b52019-01-22 00:17:28 +0900772 type,
Jian Lie2a04ce2020-07-01 19:07:02 +0900773 segmentId,
774 mode,
Jian Li49109b52019-01-22 00:17:28 +0900775 intgBridge,
Jian Libf562c22019-04-15 18:07:14 +0900776 extBridge,
Jian Li1a2eb5d2019-08-27 02:07:05 +0900777 localBridge,
Jian Lie2a04ce2020-07-01 19:07:02 +0900778 tunBridge,
Jian Li0c632722019-05-08 15:58:04 +0900779 extIntf,
Jian Li49109b52019-01-22 00:17:28 +0900780 managementIp,
781 dataIp,
Jian Li1b08d652019-05-02 17:28:09 +0900782 state,
Jian Lie2a04ce2020-07-01 19:07:02 +0900783 extNetwork,
Jian Li0c632722019-05-08 15:58:04 +0900784 podCidr);
Jian Li49109b52019-01-22 00:17:28 +0900785 }
786
787 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900788 public Builder clusterName(String clusterName) {
789 this.clusterName = clusterName;
790 return this;
791 }
792
793 @Override
Jian Li49109b52019-01-22 00:17:28 +0900794 public Builder hostname(String hostname) {
795 this.hostname = hostname;
796 return this;
797 }
798
799 @Override
800 public Builder type(Type type) {
801 this.type = type;
802 return this;
803 }
804
805 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900806 public Builder segmentId(int segmentId) {
807 this.segmentId = segmentId;
808 return this;
809 }
810
811 @Override
812 public Builder mode(Mode mode) {
813 this.mode = mode;
814 return this;
815 }
816
817 @Override
Jian Li49109b52019-01-22 00:17:28 +0900818 public Builder intgBridge(DeviceId deviceId) {
819 this.intgBridge = deviceId;
820 return this;
821 }
822
823 @Override
Jian Libf562c22019-04-15 18:07:14 +0900824 public Builder extBridge(DeviceId deviceId) {
825 this.extBridge = deviceId;
826 return this;
827 }
828
829 @Override
Jian Li1a2eb5d2019-08-27 02:07:05 +0900830 public Builder localBridge(DeviceId deviceId) {
831 this.localBridge = deviceId;
832 return this;
833 }
834
835 @Override
Jian Lie2a04ce2020-07-01 19:07:02 +0900836 public Builder tunBridge(DeviceId deviceId) {
837 this.tunBridge = deviceId;
838 return this;
839 }
840
841 @Override
Jian Li0c632722019-05-08 15:58:04 +0900842 public Builder extIntf(String intf) {
843 this.extIntf = intf;
844 return this;
845 }
846
847 @Override
Jian Li49109b52019-01-22 00:17:28 +0900848 public Builder managementIp(IpAddress managementIp) {
849 this.managementIp = managementIp;
850 return this;
851 }
852
853 @Override
854 public Builder dataIp(IpAddress dataIp) {
855 this.dataIp = dataIp;
856 return this;
857 }
858
859 @Override
860 public Builder state(K8sNodeState state) {
861 this.state = state;
862 return this;
863 }
Jian Li1b08d652019-05-02 17:28:09 +0900864
865 @Override
Jian Li0c632722019-05-08 15:58:04 +0900866 public Builder extBridgeIp(IpAddress extBridgeIp) {
867 this.extBridgeIp = extBridgeIp;
868 return this;
869 }
870
871 @Override
872 public Builder extGatewayIp(IpAddress extGatewayIp) {
873 this.extGatewayIp = extGatewayIp;
874 return this;
875 }
876
877 @Override
Jian Li1b08d652019-05-02 17:28:09 +0900878 public Builder extGatewayMac(MacAddress extGatewayMac) {
879 this.extGatewayMac = extGatewayMac;
880 return this;
881 }
Jian Li0c632722019-05-08 15:58:04 +0900882
883 @Override
884 public Builder podCidr(String podCidr) {
885 this.podCidr = podCidr;
886 return this;
887 }
Jian Li49109b52019-01-22 00:17:28 +0900888 }
889}