blob: 2b0c8f8d5cabbf467bf4f204cf57dd5d55129e1e [file] [log] [blame]
Jian Li43dc9ca2020-12-19 04:01:49 +09001/*
2 * Copyright 2020-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.kubevirtnode.api;
17
18import com.google.common.base.MoreObjects;
19import org.apache.commons.lang.StringUtils;
Jian Li543fe852021-02-04 17:25:01 +090020import org.onlab.osgi.DefaultServiceDirectory;
Jian Li43dc9ca2020-12-19 04:01:49 +090021import org.onlab.packet.IpAddress;
22import org.onosproject.net.DeviceId;
Jian Li543fe852021-02-04 17:25:01 +090023import org.onosproject.net.Port;
24import org.onosproject.net.PortNumber;
25import org.onosproject.net.device.DeviceService;
Jian Li43dc9ca2020-12-19 04:01:49 +090026
27import java.util.ArrayList;
28import java.util.Collection;
29import java.util.Objects;
30
31import static com.google.common.base.Preconditions.checkArgument;
32import static org.onosproject.kubevirtnode.api.Constants.DEFAULT_CLUSTER_NAME;
Jian Li543fe852021-02-04 17:25:01 +090033import static org.onosproject.kubevirtnode.api.Constants.GENEVE;
34import static org.onosproject.kubevirtnode.api.Constants.GRE;
35import static org.onosproject.kubevirtnode.api.Constants.VXLAN;
36import static org.onosproject.net.AnnotationKeys.PORT_NAME;
Jian Li43dc9ca2020-12-19 04:01:49 +090037
38/**
39 * Representation of a KubeVirt node.
40 */
41public class DefaultKubevirtNode implements KubevirtNode {
42
43 private static final String NOT_NULL_MSG = "Node % cannot be null";
44 private static final String OVSDB = "ovsdb:";
45
46 private final String clusterName;
47 private final String hostname;
48 private final Type type;
49 private final DeviceId intgBridge;
Jian Li138f51f2021-01-06 03:29:58 +090050 private final DeviceId tunBridge;
Jian Li43dc9ca2020-12-19 04:01:49 +090051 private final IpAddress managementIp;
52 private final IpAddress dataIp;
53 private final KubevirtNodeState state;
54 private final Collection<KubevirtPhyInterface> phyIntfs;
Daniel Park54d8baf2021-02-22 17:12:20 +090055 private final String gatewayBridgeName;
Jian Li43dc9ca2020-12-19 04:01:49 +090056
57 /**
58 * A default constructor of kubevirt node.
59 *
60 * @param clusterName clusterName
61 * @param hostname hostname
62 * @param type node type
63 * @param intgBridge integration bridge
Jian Li138f51f2021-01-06 03:29:58 +090064 * @param tunBridge tunnel bridge
Jian Li43dc9ca2020-12-19 04:01:49 +090065 * @param managementIp management IP address
66 * @param dataIp data IP address
67 * @param state node state
68 * @param phyIntfs physical interfaces
Daniel Park54d8baf2021-02-22 17:12:20 +090069 * @param gatewayBridgeName gateway bridge name
Jian Li43dc9ca2020-12-19 04:01:49 +090070 */
71 protected DefaultKubevirtNode(String clusterName, String hostname, Type type,
Jian Li138f51f2021-01-06 03:29:58 +090072 DeviceId intgBridge, DeviceId tunBridge,
73 IpAddress managementIp, IpAddress dataIp,
74 KubevirtNodeState state,
Daniel Park54d8baf2021-02-22 17:12:20 +090075 Collection<KubevirtPhyInterface> phyIntfs,
76 String gatewayBridgeName) {
Jian Li43dc9ca2020-12-19 04:01:49 +090077 this.clusterName = clusterName;
78 this.hostname = hostname;
79 this.type = type;
80 this.intgBridge = intgBridge;
Jian Li138f51f2021-01-06 03:29:58 +090081 this.tunBridge = tunBridge;
Jian Li43dc9ca2020-12-19 04:01:49 +090082 this.managementIp = managementIp;
83 this.dataIp = dataIp;
84 this.state = state;
85 this.phyIntfs = phyIntfs;
Daniel Park54d8baf2021-02-22 17:12:20 +090086 this.gatewayBridgeName = gatewayBridgeName;
Jian Li43dc9ca2020-12-19 04:01:49 +090087 }
88
89 @Override
90 public String clusterName() {
91 return clusterName;
92 }
93
94 @Override
95 public String hostname() {
96 return hostname;
97 }
98
99 @Override
100 public Type type() {
101 return type;
102 }
103
104 @Override
105 public DeviceId ovsdb() {
106 return DeviceId.deviceId(OVSDB + managementIp().toString());
107 }
108
109 @Override
110 public DeviceId intgBridge() {
111 return intgBridge;
112 }
113
114 @Override
Jian Li138f51f2021-01-06 03:29:58 +0900115 public DeviceId tunBridge() {
116 return tunBridge;
117 }
118
119 @Override
Jian Li43dc9ca2020-12-19 04:01:49 +0900120 public IpAddress managementIp() {
121 return managementIp;
122 }
123
124 @Override
125 public IpAddress dataIp() {
126 return dataIp;
127 }
128
129 @Override
130 public KubevirtNodeState state() {
131 return state;
132 }
133
134 @Override
135 public KubevirtNode updateState(KubevirtNodeState newState) {
136 return new Builder()
137 .hostname(hostname)
138 .clusterName(clusterName)
139 .type(type)
140 .intgBridge(intgBridge)
Jian Li138f51f2021-01-06 03:29:58 +0900141 .tunBridge(tunBridge)
Jian Li43dc9ca2020-12-19 04:01:49 +0900142 .managementIp(managementIp)
143 .dataIp(dataIp)
144 .state(newState)
145 .phyIntfs(phyIntfs)
Daniel Park54d8baf2021-02-22 17:12:20 +0900146 .gatewayBridgeName(gatewayBridgeName)
Jian Li43dc9ca2020-12-19 04:01:49 +0900147 .build();
148 }
149
150 @Override
Jian Li7c4a8822020-12-21 11:25:12 +0900151 public KubevirtNode updateIntgBridge(DeviceId deviceId) {
152 return new Builder()
153 .hostname(hostname)
154 .clusterName(clusterName)
155 .type(type)
156 .intgBridge(deviceId)
Jian Li138f51f2021-01-06 03:29:58 +0900157 .tunBridge(tunBridge)
158 .managementIp(managementIp)
159 .dataIp(dataIp)
160 .state(state)
161 .phyIntfs(phyIntfs)
Daniel Park54d8baf2021-02-22 17:12:20 +0900162 .gatewayBridgeName(gatewayBridgeName)
Jian Li138f51f2021-01-06 03:29:58 +0900163 .build();
164 }
165
166 @Override
167 public KubevirtNode updateTunBridge(DeviceId deviceId) {
168 return new Builder()
169 .hostname(hostname)
170 .clusterName(clusterName)
171 .type(type)
172 .intgBridge(intgBridge)
173 .tunBridge(deviceId)
Jian Li7c4a8822020-12-21 11:25:12 +0900174 .managementIp(managementIp)
175 .dataIp(dataIp)
176 .state(state)
177 .phyIntfs(phyIntfs)
Daniel Park54d8baf2021-02-22 17:12:20 +0900178 .gatewayBridgeName(gatewayBridgeName)
Jian Li7c4a8822020-12-21 11:25:12 +0900179 .build();
180 }
181
182 @Override
Jian Li43dc9ca2020-12-19 04:01:49 +0900183 public Collection<KubevirtPhyInterface> phyIntfs() {
184 if (phyIntfs == null) {
185 return new ArrayList<>();
186 }
187
188 return phyIntfs;
189 }
190
Jian Li543fe852021-02-04 17:25:01 +0900191 @Override
192 public PortNumber vxlanPort() {
193 return tunnelPort(VXLAN);
194 }
195
196 @Override
197 public PortNumber grePort() {
198 return tunnelPort(GRE);
199 }
200
201 @Override
202 public PortNumber genevePort() {
203 return tunnelPort(GENEVE);
204 }
205
Daniel Park54d8baf2021-02-22 17:12:20 +0900206 @Override
207 public String gatewayBridgeName() {
208 return gatewayBridgeName;
209 }
210
Jian Li543fe852021-02-04 17:25:01 +0900211 private PortNumber tunnelPort(String tunnelType) {
212 if (dataIp == null) {
213 return null;
214 }
215 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
216 Port port = deviceService.getPorts(tunBridge).stream()
217 .filter(p -> p.isEnabled() &&
218 Objects.equals(p.annotations().value(PORT_NAME), tunnelType))
219 .findAny().orElse(null);
220 return port != null ? port.number() : null;
221 }
222
Jian Li43dc9ca2020-12-19 04:01:49 +0900223 /**
224 * Returns new builder instance.
225 *
226 * @return kubevirt node builder
227 */
228 public static Builder builder() {
229 return new Builder();
230 }
231
232 /**
233 * Returns new builder instance with the given node as a default value.
234 *
235 * @param node kubevirt node
236 * @return kubevirt node builder
237 */
238 public static Builder from(KubevirtNode node) {
239 return new Builder()
240 .hostname(node.hostname())
241 .clusterName(node.clusterName())
242 .type(node.type())
243 .intgBridge(node.intgBridge())
Jian Li138f51f2021-01-06 03:29:58 +0900244 .tunBridge(node.tunBridge())
Jian Li43dc9ca2020-12-19 04:01:49 +0900245 .managementIp(node.managementIp())
246 .dataIp(node.dataIp())
Jian Li138f51f2021-01-06 03:29:58 +0900247 .state(node.state())
Daniel Park54d8baf2021-02-22 17:12:20 +0900248 .phyIntfs(node.phyIntfs())
249 .gatewayBridgeName(node.gatewayBridgeName());
Jian Li43dc9ca2020-12-19 04:01:49 +0900250 }
251
252 @Override
253 public boolean equals(Object o) {
254 if (this == o) {
255 return true;
256 }
257 if (o == null || getClass() != o.getClass()) {
258 return false;
259 }
260 DefaultKubevirtNode that = (DefaultKubevirtNode) o;
261 return clusterName.equals(that.clusterName) &&
262 hostname.equals(that.hostname) &&
263 type == that.type &&
264 intgBridge.equals(that.intgBridge) &&
Jian Li138f51f2021-01-06 03:29:58 +0900265 tunBridge.equals(that.tunBridge) &&
Jian Li43dc9ca2020-12-19 04:01:49 +0900266 managementIp.equals(that.managementIp) &&
267 dataIp.equals(that.dataIp);
268 }
269
270 @Override
271 public int hashCode() {
Jian Li138f51f2021-01-06 03:29:58 +0900272 return Objects.hash(clusterName, hostname, type, intgBridge, tunBridge,
Jian Li43dc9ca2020-12-19 04:01:49 +0900273 managementIp, dataIp);
274 }
275
276 @Override
277 public String toString() {
278 return MoreObjects.toStringHelper(this)
279 .add("clusterName", clusterName)
280 .add("hostname", hostname)
281 .add("type", type)
282 .add("intgBridge", intgBridge)
Jian Li138f51f2021-01-06 03:29:58 +0900283 .add("tunBridge", tunBridge)
Jian Li43dc9ca2020-12-19 04:01:49 +0900284 .add("managementIp", managementIp)
285 .add("dataIp", dataIp)
286 .add("state", state)
Jian Li138f51f2021-01-06 03:29:58 +0900287 .add("phyIntfs", phyIntfs)
Daniel Park54d8baf2021-02-22 17:12:20 +0900288 .add("gatewayBridgeName", gatewayBridgeName)
Jian Li43dc9ca2020-12-19 04:01:49 +0900289 .toString();
290 }
291
292 public static final class Builder implements KubevirtNode.Builder {
293
294 private String clusterName;
295 private String hostname;
296 private Type type;
297 private DeviceId intgBridge;
Jian Li138f51f2021-01-06 03:29:58 +0900298 private DeviceId tunBridge;
Jian Li43dc9ca2020-12-19 04:01:49 +0900299 private IpAddress managementIp;
300 private IpAddress dataIp;
301 private KubevirtNodeState state;
302 private Collection<KubevirtPhyInterface> phyIntfs;
Daniel Park54d8baf2021-02-22 17:12:20 +0900303 private String gatewayBridgeName;
Jian Li43dc9ca2020-12-19 04:01:49 +0900304
305 // private constructor not intended to use from external
306 private Builder() {
307 }
308
309 @Override
310 public KubevirtNode build() {
311 checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
312 checkArgument(type != null, NOT_NULL_MSG, "type");
313 checkArgument(state != null, NOT_NULL_MSG, "state");
314 checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
315
316 if (StringUtils.isEmpty(clusterName)) {
317 clusterName = DEFAULT_CLUSTER_NAME;
318 }
319
320 return new DefaultKubevirtNode(
321 clusterName,
322 hostname,
323 type,
324 intgBridge,
Jian Li138f51f2021-01-06 03:29:58 +0900325 tunBridge,
Jian Li43dc9ca2020-12-19 04:01:49 +0900326 managementIp,
327 dataIp,
328 state,
Daniel Park54d8baf2021-02-22 17:12:20 +0900329 phyIntfs,
330 gatewayBridgeName
Jian Li43dc9ca2020-12-19 04:01:49 +0900331 );
332 }
333
334 @Override
335 public Builder clusterName(String clusterName) {
336 this.clusterName = clusterName;
337 return this;
338 }
339
340 @Override
341 public Builder hostname(String hostname) {
342 this.hostname = hostname;
343 return this;
344 }
345
346 @Override
347 public Builder type(Type type) {
348 this.type = type;
349 return this;
350 }
351
352 @Override
353 public Builder intgBridge(DeviceId deviceId) {
354 this.intgBridge = deviceId;
355 return this;
356 }
357
358 @Override
Jian Li138f51f2021-01-06 03:29:58 +0900359 public Builder tunBridge(DeviceId deviceId) {
360 this.tunBridge = deviceId;
361 return this;
362 }
363
364 @Override
Jian Li43dc9ca2020-12-19 04:01:49 +0900365 public Builder managementIp(IpAddress managementIp) {
366 this.managementIp = managementIp;
367 return this;
368 }
369
370 @Override
371 public Builder dataIp(IpAddress dataIp) {
372 this.dataIp = dataIp;
373 return this;
374 }
375
376 @Override
377 public Builder phyIntfs(Collection<KubevirtPhyInterface> phyIntfs) {
378 this.phyIntfs = phyIntfs;
379 return this;
380 }
381
382 @Override
383 public Builder state(KubevirtNodeState state) {
384 this.state = state;
385 return this;
386 }
Daniel Park54d8baf2021-02-22 17:12:20 +0900387
388 @Override
389 public Builder gatewayBridgeName(String gatewayBridgeName) {
390 this.gatewayBridgeName = gatewayBridgeName;
391 return this;
392 }
Jian Li43dc9ca2020-12-19 04:01:49 +0900393 }
394}