blob: 5d79f7d5c44f1f6e222f7005184ff427f67b0b7a [file] [log] [blame]
Hyunsun Moon0d457362017-06-27 17:19:41 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Hyunsun Moon0d457362017-06-27 17:19:41 +09003 *
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 */
Jian Li5a38ab62018-07-02 22:34:11 +090016package org.onosproject.openstacknode.api;
Hyunsun Moon0d457362017-06-27 17:19:41 +090017
18import com.google.common.base.MoreObjects;
19import com.google.common.base.Strings;
20import org.onlab.osgi.DefaultServiceDirectory;
21import org.onlab.packet.IpAddress;
22import org.onlab.packet.MacAddress;
Hyunsun Moon0d457362017-06-27 17:19:41 +090023import org.onosproject.net.DeviceId;
24import org.onosproject.net.Port;
25import org.onosproject.net.PortNumber;
Jian Li789fadb2018-07-10 13:59:47 +090026import org.onosproject.net.behaviour.ControllerInfo;
Hyunsun Moon0d457362017-06-27 17:19:41 +090027import org.onosproject.net.device.DeviceService;
Daniel Parkd02d7bd2018-08-23 23:04:31 +090028import org.onosproject.openstacknode.api.DpdkConfig.DatapathType;
Hyunsun Moon0d457362017-06-27 17:19:41 +090029
Jian Lie6312162018-03-21 21:41:00 +090030import java.util.ArrayList;
31import java.util.Collection;
Hyunsun Moon0d457362017-06-27 17:19:41 +090032import java.util.Objects;
daniel park796c2eb2018-03-22 17:01:51 +090033import java.util.Optional;
Hyunsun Moon0d457362017-06-27 17:19:41 +090034
35import static com.google.common.base.Preconditions.checkArgument;
36import static org.onosproject.net.AnnotationKeys.PORT_MAC;
37import static org.onosproject.net.AnnotationKeys.PORT_NAME;
Jian Li621f73c2018-12-15 01:49:22 +090038import static org.onosproject.openstacknode.api.Constants.GENEVE_TUNNEL;
Jian Li2d68c192018-12-13 15:52:59 +090039import static org.onosproject.openstacknode.api.Constants.GRE_TUNNEL;
40import static org.onosproject.openstacknode.api.Constants.VXLAN_TUNNEL;
Hyunsun Moon0d457362017-06-27 17:19:41 +090041import static org.onosproject.openstacknode.api.Constants.PATCH_INTG_BRIDGE;
42
43/**
44 * Representation of a openstack node.
45 */
Hyunsun Moon090d77d2017-07-05 17:48:37 +090046public class DefaultOpenstackNode implements OpenstackNode {
Hyunsun Moon0d457362017-06-27 17:19:41 +090047
48 private final String hostname;
49 private final NodeType type;
50 private final DeviceId intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +090051 private final IpAddress managementIp;
52 private final IpAddress dataIp;
53 private final String vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +090054 private final String uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +090055 private final NodeState state;
Jian Lie6312162018-03-21 21:41:00 +090056 private final Collection<OpenstackPhyInterface> phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +090057 private final Collection<ControllerInfo> controllers;
Daniel Parkdeefa702018-07-17 17:55:51 +090058 private final OpenstackSshAuth sshAuth;
Daniel Parkd02d7bd2018-08-23 23:04:31 +090059 private final DpdkConfig dpdkConfig;
Jian Lic704b672018-09-04 18:52:53 +090060 private final KeystoneConfig keystoneConfig;
61 private final NeutronConfig neutronConfig;
Hyunsun Moon0d457362017-06-27 17:19:41 +090062
Jian Li340165f2018-02-27 10:38:17 +090063 private static final String NOT_NULL_MSG = "Node % cannot be null";
64
daniel parkb18424c2018-02-05 15:43:43 +090065 private static final String OVSDB = "ovsdb:";
66
Jian Li340165f2018-02-27 10:38:17 +090067 /**
68 * A default constructor of Openstack Node.
69 *
Jian Lic704b672018-09-04 18:52:53 +090070 * @param hostname hostname
71 * @param type node type
72 * @param intgBridge integration bridge
73 * @param managementIp management IP address
74 * @param dataIp data IP address
75 * @param vlanIntf VLAN interface
76 * @param uplinkPort uplink port name
77 * @param state node state
78 * @param phyIntfs physical interfaces
79 * @param controllers customized controllers
80 * @param sshAuth ssh authentication info
81 * @param dpdkConfig dpdk config
82 * @param keystoneConfig keystone config
83 * @param neutronConfig neutron config
Jian Li340165f2018-02-27 10:38:17 +090084 */
daniel parkb18424c2018-02-05 15:43:43 +090085 protected DefaultOpenstackNode(String hostname, NodeType type,
86 DeviceId intgBridge,
87 IpAddress managementIp,
88 IpAddress dataIp,
89 String vlanIntf,
90 String uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +090091 NodeState state,
Jian Li27841662018-04-14 01:59:47 +090092 Collection<OpenstackPhyInterface> phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +090093 Collection<ControllerInfo> controllers,
Daniel Park92abf312018-08-08 17:01:35 +090094 OpenstackSshAuth sshAuth,
Jian Lic704b672018-09-04 18:52:53 +090095 DpdkConfig dpdkConfig,
96 KeystoneConfig keystoneConfig,
97 NeutronConfig neutronConfig) {
Hyunsun Moon0d457362017-06-27 17:19:41 +090098 this.hostname = hostname;
99 this.type = type;
100 this.intgBridge = intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900101 this.managementIp = managementIp;
102 this.dataIp = dataIp;
103 this.vlanIntf = vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +0900104 this.uplinkPort = uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900105 this.state = state;
Jian Lie6312162018-03-21 21:41:00 +0900106 this.phyIntfs = phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +0900107 this.controllers = controllers;
Daniel Parkdeefa702018-07-17 17:55:51 +0900108 this.sshAuth = sshAuth;
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900109 this.dpdkConfig = dpdkConfig;
Jian Lic704b672018-09-04 18:52:53 +0900110 this.keystoneConfig = keystoneConfig;
111 this.neutronConfig = neutronConfig;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900112 }
113
114 @Override
115 public String hostname() {
116 return hostname;
117 }
118
119 @Override
120 public NodeType type() {
121 return type;
122 }
123
124 @Override
125 public DeviceId ovsdb() {
daniel parkb18424c2018-02-05 15:43:43 +0900126 return DeviceId.deviceId(OVSDB + managementIp().toString());
Hyunsun Moon0d457362017-06-27 17:19:41 +0900127 }
128
129 @Override
130 public DeviceId intgBridge() {
131 return intgBridge;
132 }
133
134 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900135 public IpAddress managementIp() {
136 return managementIp;
137 }
138
139 @Override
140 public IpAddress dataIp() {
141 return dataIp;
142 }
143
144 @Override
145 public String vlanIntf() {
146 return vlanIntf;
147 }
148
149 @Override
daniel parkb18424c2018-02-05 15:43:43 +0900150 public String uplinkPort() {
151 return uplinkPort;
152 }
153
154 @Override
Daniel Park92abf312018-08-08 17:01:35 +0900155 public DatapathType datapathType() {
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900156 if (dpdkConfig == null) {
157 return DatapathType.NORMAL;
158 }
159 return dpdkConfig.datapathType();
Daniel Park92abf312018-08-08 17:01:35 +0900160 }
161
162 @Override
Daniel Park7e8c4d82018-08-13 23:47:49 +0900163 public String socketDir() {
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900164 if (dpdkConfig == null) {
165 return null;
166 }
167 return dpdkConfig.socketDir();
Daniel Park7e8c4d82018-08-13 23:47:49 +0900168 }
169
170 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900171 public NodeState state() {
172 return state;
173 }
174
175 @Override
daniel parkb5817102018-02-15 00:18:51 +0900176 public PortNumber uplinkPortNum() {
177 if (uplinkPort == null) {
178 return null;
179 }
180
181 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
182 Port port = deviceService.getPorts(intgBridge).stream()
183 .filter(p -> p.isEnabled() &&
184 Objects.equals(p.annotations().value(PORT_NAME), uplinkPort))
185 .findAny().orElse(null);
186
187 return port != null ? port.number() : null;
188
189 }
Jian Li2d68c192018-12-13 15:52:59 +0900190
daniel parkb5817102018-02-15 00:18:51 +0900191 @Override
Jian Li2d68c192018-12-13 15:52:59 +0900192 public PortNumber vxlanTunnelPortNum() {
193 return tunnelPortNum(VXLAN_TUNNEL);
194 }
195
196 @Override
Jian Li621f73c2018-12-15 01:49:22 +0900197 public PortNumber geneveTunnelPortNum() {
198 return tunnelPortNum(GENEVE_TUNNEL);
199 }
200
201 @Override
Jian Li2d68c192018-12-13 15:52:59 +0900202 public PortNumber greTunnelPortNum() {
203 return tunnelPortNum(GRE_TUNNEL);
204
205 }
206
207 private PortNumber tunnelPortNum(String tunnelType) {
Hyunsun Moon0d457362017-06-27 17:19:41 +0900208 if (dataIp == null) {
209 return null;
210 }
211 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
212 Port port = deviceService.getPorts(intgBridge).stream()
213 .filter(p -> p.isEnabled() &&
Jian Li2d68c192018-12-13 15:52:59 +0900214 Objects.equals(p.annotations().value(PORT_NAME), tunnelType))
Hyunsun Moon0d457362017-06-27 17:19:41 +0900215 .findAny().orElse(null);
216 return port != null ? port.number() : null;
217 }
218
219 @Override
220 public PortNumber vlanPortNum() {
221 if (vlanIntf == null) {
222 return null;
223 }
224 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
225 Port port = deviceService.getPorts(intgBridge).stream()
226 .filter(p -> p.isEnabled() &&
227 Objects.equals(p.annotations().value(PORT_NAME), vlanIntf))
228 .findAny().orElse(null);
229 return port != null ? port.number() : null;
230 }
231
232 @Override
233 public PortNumber patchPortNum() {
234 if (type == NodeType.COMPUTE) {
235 return null;
236 }
237 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
238 Port port = deviceService.getPorts(intgBridge).stream()
239 .filter(p -> p.isEnabled() &&
240 Objects.equals(p.annotations().value(PORT_NAME), PATCH_INTG_BRIDGE))
241 .findAny().orElse(null);
242 return port != null ? port.number() : null;
243 }
244
245 @Override
246 public MacAddress vlanPortMac() {
247 if (vlanIntf == null) {
248 return null;
249 }
250 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
251 Port port = deviceService.getPorts(intgBridge).stream()
252 .filter(p -> p.annotations().value(PORT_NAME).equals(vlanIntf))
253 .findAny().orElse(null);
254 return port != null ? MacAddress.valueOf(port.annotations().value(PORT_MAC)) : null;
255 }
256
257 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900258 public boolean equals(Object obj) {
259 if (this == obj) {
260 return true;
261 }
262
263 if (obj instanceof DefaultOpenstackNode) {
264 DefaultOpenstackNode that = (DefaultOpenstackNode) obj;
Jian Li5afbea42018-02-28 10:37:03 +0900265 return Objects.equals(hostname, that.hostname) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900266 Objects.equals(type, that.type) &&
267 Objects.equals(intgBridge, that.intgBridge) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900268 Objects.equals(managementIp, that.managementIp) &&
269 Objects.equals(dataIp, that.dataIp) &&
daniel parkb18424c2018-02-05 15:43:43 +0900270 Objects.equals(uplinkPort, that.uplinkPort) &&
Jian Lie6312162018-03-21 21:41:00 +0900271 Objects.equals(vlanIntf, that.vlanIntf) &&
Jian Li27841662018-04-14 01:59:47 +0900272 Objects.equals(phyIntfs, that.phyIntfs) &&
Jian Li789fadb2018-07-10 13:59:47 +0900273 Objects.equals(controllers, that.controllers) &&
Daniel Park92abf312018-08-08 17:01:35 +0900274 Objects.equals(sshAuth, that.sshAuth) &&
Jian Lic704b672018-09-04 18:52:53 +0900275 Objects.equals(dpdkConfig, that.dpdkConfig) &&
276 Objects.equals(keystoneConfig, that.keystoneConfig) &&
277 Objects.equals(neutronConfig, that.neutronConfig);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900278 }
279 return false;
280 }
281
282 @Override
283 public int hashCode() {
284 return Objects.hash(hostname,
285 type,
286 intgBridge,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900287 managementIp,
288 dataIp,
daniel parkb18424c2018-02-05 15:43:43 +0900289 vlanIntf,
Jian Lie6312162018-03-21 21:41:00 +0900290 uplinkPort,
Jian Li27841662018-04-14 01:59:47 +0900291 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900292 controllers,
Daniel Park92abf312018-08-08 17:01:35 +0900293 sshAuth,
Jian Lic704b672018-09-04 18:52:53 +0900294 dpdkConfig,
295 keystoneConfig,
296 neutronConfig);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900297 }
298
299 @Override
300 public String toString() {
301 return MoreObjects.toStringHelper(getClass())
302 .add("hostname", hostname)
303 .add("type", type)
304 .add("integrationBridge", intgBridge)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900305 .add("managementIp", managementIp)
306 .add("dataIp", dataIp)
307 .add("vlanIntf", vlanIntf)
daniel parkb18424c2018-02-05 15:43:43 +0900308 .add("uplinkPort", uplinkPort)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900309 .add("state", state)
Jian Lie6312162018-03-21 21:41:00 +0900310 .add("phyIntfs", phyIntfs)
Jian Li789fadb2018-07-10 13:59:47 +0900311 .add("controllers", controllers)
Daniel Parkdeefa702018-07-17 17:55:51 +0900312 .add("sshAuth", sshAuth)
Jian Lic704b672018-09-04 18:52:53 +0900313 .add("dpdkConfig", dpdkConfig)
314 .add("keystoneConfig", keystoneConfig)
315 .add("neutronConfig", neutronConfig)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900316 .toString();
317 }
318
319 @Override
320 public OpenstackNode updateState(NodeState newState) {
321 return new Builder()
322 .type(type)
323 .hostname(hostname)
324 .intgBridge(intgBridge)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900325 .managementIp(managementIp)
326 .dataIp(dataIp)
327 .vlanIntf(vlanIntf)
daniel parkb18424c2018-02-05 15:43:43 +0900328 .uplinkPort(uplinkPort)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900329 .state(newState)
Jian Lie6312162018-03-21 21:41:00 +0900330 .phyIntfs(phyIntfs)
Jian Li789fadb2018-07-10 13:59:47 +0900331 .controllers(controllers)
Daniel Parkdeefa702018-07-17 17:55:51 +0900332 .sshAuthInfo(sshAuth)
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900333 .dpdkConfig(dpdkConfig)
Jian Lic704b672018-09-04 18:52:53 +0900334 .keystoneConfig(keystoneConfig)
335 .neutronConfig(neutronConfig)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900336 .build();
337 }
338
Jian Lie6312162018-03-21 21:41:00 +0900339 @Override
Jian Lie3141542018-08-13 18:05:43 +0900340 public OpenstackNode updateIntbridge(DeviceId newIntgBridge) {
341 return new Builder()
342 .type(type)
343 .hostname(hostname)
344 .intgBridge(newIntgBridge)
345 .managementIp(managementIp)
346 .dataIp(dataIp)
347 .vlanIntf(vlanIntf)
348 .uplinkPort(uplinkPort)
349 .state(state)
350 .phyIntfs(phyIntfs)
Jian Lie3141542018-08-13 18:05:43 +0900351 .sshAuthInfo(sshAuth)
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900352 .dpdkConfig(dpdkConfig)
Jian Lic704b672018-09-04 18:52:53 +0900353 .keystoneConfig(keystoneConfig)
354 .neutronConfig(neutronConfig)
Jian Li55276912018-10-08 12:58:54 +0900355 .controllers(controllers)
Jian Lie3141542018-08-13 18:05:43 +0900356 .build();
357 }
358
359 @Override
Jian Lie6312162018-03-21 21:41:00 +0900360 public Collection<OpenstackPhyInterface> phyIntfs() {
Jian Lie6312162018-03-21 21:41:00 +0900361 if (phyIntfs == null) {
362 return new ArrayList<>();
363 }
364
365 return phyIntfs;
366 }
367
Jian Li789fadb2018-07-10 13:59:47 +0900368
369 @Override
370 public Collection<ControllerInfo> controllers() {
371 if (controllers == null) {
372 return new ArrayList<>();
373 }
374
375 return controllers;
376 }
377
daniel park796c2eb2018-03-22 17:01:51 +0900378 @Override
Daniel Parkdeefa702018-07-17 17:55:51 +0900379 public OpenstackSshAuth sshAuthInfo() {
380 return sshAuth;
381 }
382
383 @Override
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900384 public DpdkConfig dpdkConfig() {
385 return dpdkConfig;
386 }
387
388 @Override
Jian Lic704b672018-09-04 18:52:53 +0900389 public KeystoneConfig keystoneConfig() {
390 return keystoneConfig;
391 }
392
393 @Override
394 public NeutronConfig neutronConfig() {
395 return neutronConfig;
396 }
397
398 @Override
daniel park796c2eb2018-03-22 17:01:51 +0900399 public PortNumber phyIntfPortNum(String providerPhysnet) {
400 Optional<OpenstackPhyInterface> openstackPhyInterface =
401 phyIntfs.stream().filter(p -> p.network().equals(providerPhysnet)).findAny();
402
403 if (openstackPhyInterface.isPresent()) {
404 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
405 Port port = deviceService.getPorts(intgBridge).stream()
406 .filter(p -> p.isEnabled() &&
407 Objects.equals(p.annotations().value(PORT_NAME), openstackPhyInterface.get().intf()))
408 .findAny().orElse(null);
409
410 return port != null ? port.number() : null;
411 } else {
412 return null;
413 }
414
415 }
Jian Li27841662018-04-14 01:59:47 +0900416
Hyunsun Moon0d457362017-06-27 17:19:41 +0900417 /**
418 * Returns new builder instance.
419 *
420 * @return openstack node builder
421 */
422 public static Builder builder() {
423 return new Builder();
424 }
425
426 /**
427 * Returns new builder instance with the given node as a default value.
428 *
429 * @param osNode openstack node
430 * @return openstack node builder
431 */
432 public static Builder from(OpenstackNode osNode) {
433 return new Builder()
434 .hostname(osNode.hostname())
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900435 .type(osNode.type())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900436 .intgBridge(osNode.intgBridge())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900437 .managementIp(osNode.managementIp())
438 .dataIp(osNode.dataIp())
439 .vlanIntf(osNode.vlanIntf())
daniel parkb18424c2018-02-05 15:43:43 +0900440 .uplinkPort(osNode.uplinkPort())
Jian Lie6312162018-03-21 21:41:00 +0900441 .state(osNode.state())
Jian Li27841662018-04-14 01:59:47 +0900442 .phyIntfs(osNode.phyIntfs())
Jian Li789fadb2018-07-10 13:59:47 +0900443 .controllers(osNode.controllers())
Daniel Park92abf312018-08-08 17:01:35 +0900444 .sshAuthInfo(osNode.sshAuthInfo())
Jian Lic704b672018-09-04 18:52:53 +0900445 .dpdkConfig(osNode.dpdkConfig())
446 .keystoneConfig(osNode.keystoneConfig())
447 .neutronConfig(osNode.neutronConfig());
Hyunsun Moon0d457362017-06-27 17:19:41 +0900448 }
449
Jian Li340165f2018-02-27 10:38:17 +0900450 /**
451 * A builder class for openstack Node.
452 */
Hyunsun Moon0d457362017-06-27 17:19:41 +0900453 public static final class Builder implements OpenstackNode.Builder {
454
455 private String hostname;
456 private NodeType type;
457 private DeviceId intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900458 private IpAddress managementIp;
459 private IpAddress dataIp;
460 private String vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +0900461 private String uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900462 private NodeState state;
Jian Lie6312162018-03-21 21:41:00 +0900463 private Collection<OpenstackPhyInterface> phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +0900464 private Collection<ControllerInfo> controllers;
Daniel Parkdeefa702018-07-17 17:55:51 +0900465 private OpenstackSshAuth sshAuth;
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900466 private DpdkConfig dpdkConfig;
Jian Lic704b672018-09-04 18:52:53 +0900467 private KeystoneConfig keystoneConfig;
468 private NeutronConfig neutronConfig;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900469
Jian Li340165f2018-02-27 10:38:17 +0900470 // private constructor not intended to use from external
Hyunsun Moon0d457362017-06-27 17:19:41 +0900471 private Builder() {
472 }
473
474 @Override
475 public DefaultOpenstackNode build() {
Jian Li340165f2018-02-27 10:38:17 +0900476 checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
477 checkArgument(type != null, NOT_NULL_MSG, "type");
Jian Li340165f2018-02-27 10:38:17 +0900478 checkArgument(state != null, NOT_NULL_MSG, "state");
Jian Li92d42fc2018-05-25 16:23:49 +0900479 checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
Hyunsun Moon0d457362017-06-27 17:19:41 +0900480
Jian Li27841662018-04-14 01:59:47 +0900481 if (type != NodeType.CONTROLLER) {
Jian Li27841662018-04-14 01:59:47 +0900482 if (dataIp == null && Strings.isNullOrEmpty(vlanIntf)) {
483 throw new IllegalArgumentException("Either data IP or VLAN interface is required");
484 }
485 } else {
Jian Lic704b672018-09-04 18:52:53 +0900486 checkArgument(keystoneConfig != null, NOT_NULL_MSG, "keystone config");
Jian Li27841662018-04-14 01:59:47 +0900487 }
488
daniel parkb18424c2018-02-05 15:43:43 +0900489 if (type == NodeType.GATEWAY && uplinkPort == null) {
490 throw new IllegalArgumentException("Uplink port is required for gateway node");
Hyunsun Moon0d457362017-06-27 17:19:41 +0900491 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900492
493 return new DefaultOpenstackNode(hostname,
494 type,
495 intgBridge,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900496 managementIp,
497 dataIp,
498 vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900499 uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900500 state,
Jian Li27841662018-04-14 01:59:47 +0900501 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900502 controllers,
Daniel Park92abf312018-08-08 17:01:35 +0900503 sshAuth,
Jian Lic704b672018-09-04 18:52:53 +0900504 dpdkConfig,
505 keystoneConfig,
506 neutronConfig);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900507 }
508
509 @Override
510 public Builder hostname(String hostname) {
511 if (!Strings.isNullOrEmpty(hostname)) {
512 this.hostname = hostname;
513 }
514 return this;
515 }
516
517 @Override
518 public Builder type(NodeType type) {
519 this.type = type;
520 return this;
521 }
522
523 @Override
524 public Builder intgBridge(DeviceId intgBridge) {
525 this.intgBridge = intgBridge;
526 return this;
527 }
528
529 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900530 public Builder managementIp(IpAddress managementIp) {
531 this.managementIp = managementIp;
532 return this;
533 }
534
535 @Override
536 public Builder dataIp(IpAddress dataIp) {
537 this.dataIp = dataIp;
538 return this;
539 }
540
541 @Override
542 public Builder vlanIntf(String vlanIntf) {
543 this.vlanIntf = vlanIntf;
544 return this;
545 }
546
547 @Override
daniel parkb18424c2018-02-05 15:43:43 +0900548 public Builder uplinkPort(String uplinkPort) {
549 this.uplinkPort = uplinkPort;
550 return this;
551 }
552
553 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900554 public Builder state(NodeState state) {
555 this.state = state;
556 return this;
557 }
Jian Lie6312162018-03-21 21:41:00 +0900558
559 @Override
560 public Builder phyIntfs(Collection<OpenstackPhyInterface> phyIntfs) {
561 this.phyIntfs = phyIntfs;
562 return this;
563 }
Jian Li27841662018-04-14 01:59:47 +0900564
565 @Override
Jian Li789fadb2018-07-10 13:59:47 +0900566 public Builder controllers(Collection<ControllerInfo> controllers) {
567 this.controllers = controllers;
568 return this;
569 }
570
571 @Override
Daniel Parkdeefa702018-07-17 17:55:51 +0900572 public Builder sshAuthInfo(OpenstackSshAuth sshAuth) {
573 this.sshAuth = sshAuth;
574 return this;
575 }
Daniel Park92abf312018-08-08 17:01:35 +0900576
577 @Override
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900578 public Builder dpdkConfig(DpdkConfig dpdkConfig) {
579 this.dpdkConfig = dpdkConfig;
Daniel Park7e8c4d82018-08-13 23:47:49 +0900580 return this;
581 }
Jian Lic704b672018-09-04 18:52:53 +0900582
583 @Override
584 public Builder keystoneConfig(KeystoneConfig keystoneConfig) {
585 this.keystoneConfig = keystoneConfig;
586 return this;
587 }
588
589 @Override
590 public Builder neutronConfig(NeutronConfig neutronConfig) {
591 this.neutronConfig = neutronConfig;
592 return this;
593 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900594 }
595}
596