blob: 1ea59421b0c272a347f53c0d3c2898a6ccb508da [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 Li2d68c192018-12-13 15:52:59 +090038import static org.onosproject.openstacknode.api.Constants.GRE_TUNNEL;
39import static org.onosproject.openstacknode.api.Constants.VXLAN_TUNNEL;
Hyunsun Moon0d457362017-06-27 17:19:41 +090040import static org.onosproject.openstacknode.api.Constants.PATCH_INTG_BRIDGE;
41
42/**
43 * Representation of a openstack node.
44 */
Hyunsun Moon090d77d2017-07-05 17:48:37 +090045public class DefaultOpenstackNode implements OpenstackNode {
Hyunsun Moon0d457362017-06-27 17:19:41 +090046
47 private final String hostname;
48 private final NodeType type;
49 private final DeviceId intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +090050 private final IpAddress managementIp;
51 private final IpAddress dataIp;
52 private final String vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +090053 private final String uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +090054 private final NodeState state;
Jian Lie6312162018-03-21 21:41:00 +090055 private final Collection<OpenstackPhyInterface> phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +090056 private final Collection<ControllerInfo> controllers;
Daniel Parkdeefa702018-07-17 17:55:51 +090057 private final OpenstackSshAuth sshAuth;
Daniel Parkd02d7bd2018-08-23 23:04:31 +090058 private final DpdkConfig dpdkConfig;
Jian Lic704b672018-09-04 18:52:53 +090059 private final KeystoneConfig keystoneConfig;
60 private final NeutronConfig neutronConfig;
Hyunsun Moon0d457362017-06-27 17:19:41 +090061
Jian Li340165f2018-02-27 10:38:17 +090062 private static final String NOT_NULL_MSG = "Node % cannot be null";
63
daniel parkb18424c2018-02-05 15:43:43 +090064 private static final String OVSDB = "ovsdb:";
65
Jian Li340165f2018-02-27 10:38:17 +090066 /**
67 * A default constructor of Openstack Node.
68 *
Jian Lic704b672018-09-04 18:52:53 +090069 * @param hostname hostname
70 * @param type node type
71 * @param intgBridge integration bridge
72 * @param managementIp management IP address
73 * @param dataIp data IP address
74 * @param vlanIntf VLAN interface
75 * @param uplinkPort uplink port name
76 * @param state node state
77 * @param phyIntfs physical interfaces
78 * @param controllers customized controllers
79 * @param sshAuth ssh authentication info
80 * @param dpdkConfig dpdk config
81 * @param keystoneConfig keystone config
82 * @param neutronConfig neutron config
Jian Li340165f2018-02-27 10:38:17 +090083 */
daniel parkb18424c2018-02-05 15:43:43 +090084 protected DefaultOpenstackNode(String hostname, NodeType type,
85 DeviceId intgBridge,
86 IpAddress managementIp,
87 IpAddress dataIp,
88 String vlanIntf,
89 String uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +090090 NodeState state,
Jian Li27841662018-04-14 01:59:47 +090091 Collection<OpenstackPhyInterface> phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +090092 Collection<ControllerInfo> controllers,
Daniel Park92abf312018-08-08 17:01:35 +090093 OpenstackSshAuth sshAuth,
Jian Lic704b672018-09-04 18:52:53 +090094 DpdkConfig dpdkConfig,
95 KeystoneConfig keystoneConfig,
96 NeutronConfig neutronConfig) {
Hyunsun Moon0d457362017-06-27 17:19:41 +090097 this.hostname = hostname;
98 this.type = type;
99 this.intgBridge = intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900100 this.managementIp = managementIp;
101 this.dataIp = dataIp;
102 this.vlanIntf = vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +0900103 this.uplinkPort = uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900104 this.state = state;
Jian Lie6312162018-03-21 21:41:00 +0900105 this.phyIntfs = phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +0900106 this.controllers = controllers;
Daniel Parkdeefa702018-07-17 17:55:51 +0900107 this.sshAuth = sshAuth;
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900108 this.dpdkConfig = dpdkConfig;
Jian Lic704b672018-09-04 18:52:53 +0900109 this.keystoneConfig = keystoneConfig;
110 this.neutronConfig = neutronConfig;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900111 }
112
113 @Override
114 public String hostname() {
115 return hostname;
116 }
117
118 @Override
119 public NodeType type() {
120 return type;
121 }
122
123 @Override
124 public DeviceId ovsdb() {
daniel parkb18424c2018-02-05 15:43:43 +0900125 return DeviceId.deviceId(OVSDB + managementIp().toString());
Hyunsun Moon0d457362017-06-27 17:19:41 +0900126 }
127
128 @Override
129 public DeviceId intgBridge() {
130 return intgBridge;
131 }
132
133 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900134 public IpAddress managementIp() {
135 return managementIp;
136 }
137
138 @Override
139 public IpAddress dataIp() {
140 return dataIp;
141 }
142
143 @Override
144 public String vlanIntf() {
145 return vlanIntf;
146 }
147
148 @Override
daniel parkb18424c2018-02-05 15:43:43 +0900149 public String uplinkPort() {
150 return uplinkPort;
151 }
152
153 @Override
Daniel Park92abf312018-08-08 17:01:35 +0900154 public DatapathType datapathType() {
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900155 if (dpdkConfig == null) {
156 return DatapathType.NORMAL;
157 }
158 return dpdkConfig.datapathType();
Daniel Park92abf312018-08-08 17:01:35 +0900159 }
160
161 @Override
Daniel Park7e8c4d82018-08-13 23:47:49 +0900162 public String socketDir() {
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900163 if (dpdkConfig == null) {
164 return null;
165 }
166 return dpdkConfig.socketDir();
Daniel Park7e8c4d82018-08-13 23:47:49 +0900167 }
168
169 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900170 public NodeState state() {
171 return state;
172 }
173
174 @Override
daniel parkb5817102018-02-15 00:18:51 +0900175 public PortNumber uplinkPortNum() {
176 if (uplinkPort == null) {
177 return null;
178 }
179
180 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
181 Port port = deviceService.getPorts(intgBridge).stream()
182 .filter(p -> p.isEnabled() &&
183 Objects.equals(p.annotations().value(PORT_NAME), uplinkPort))
184 .findAny().orElse(null);
185
186 return port != null ? port.number() : null;
187
188 }
Jian Li2d68c192018-12-13 15:52:59 +0900189
daniel parkb5817102018-02-15 00:18:51 +0900190 @Override
Jian Li2d68c192018-12-13 15:52:59 +0900191 public PortNumber vxlanTunnelPortNum() {
192 return tunnelPortNum(VXLAN_TUNNEL);
193 }
194
195 @Override
196 public PortNumber greTunnelPortNum() {
197 return tunnelPortNum(GRE_TUNNEL);
198
199 }
200
201 private PortNumber tunnelPortNum(String tunnelType) {
Hyunsun Moon0d457362017-06-27 17:19:41 +0900202 if (dataIp == null) {
203 return null;
204 }
205 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
206 Port port = deviceService.getPorts(intgBridge).stream()
207 .filter(p -> p.isEnabled() &&
Jian Li2d68c192018-12-13 15:52:59 +0900208 Objects.equals(p.annotations().value(PORT_NAME), tunnelType))
Hyunsun Moon0d457362017-06-27 17:19:41 +0900209 .findAny().orElse(null);
210 return port != null ? port.number() : null;
211 }
212
213 @Override
214 public PortNumber vlanPortNum() {
215 if (vlanIntf == null) {
216 return null;
217 }
218 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
219 Port port = deviceService.getPorts(intgBridge).stream()
220 .filter(p -> p.isEnabled() &&
221 Objects.equals(p.annotations().value(PORT_NAME), vlanIntf))
222 .findAny().orElse(null);
223 return port != null ? port.number() : null;
224 }
225
226 @Override
227 public PortNumber patchPortNum() {
228 if (type == NodeType.COMPUTE) {
229 return null;
230 }
231 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
232 Port port = deviceService.getPorts(intgBridge).stream()
233 .filter(p -> p.isEnabled() &&
234 Objects.equals(p.annotations().value(PORT_NAME), PATCH_INTG_BRIDGE))
235 .findAny().orElse(null);
236 return port != null ? port.number() : null;
237 }
238
239 @Override
240 public MacAddress vlanPortMac() {
241 if (vlanIntf == null) {
242 return null;
243 }
244 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
245 Port port = deviceService.getPorts(intgBridge).stream()
246 .filter(p -> p.annotations().value(PORT_NAME).equals(vlanIntf))
247 .findAny().orElse(null);
248 return port != null ? MacAddress.valueOf(port.annotations().value(PORT_MAC)) : null;
249 }
250
251 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900252 public boolean equals(Object obj) {
253 if (this == obj) {
254 return true;
255 }
256
257 if (obj instanceof DefaultOpenstackNode) {
258 DefaultOpenstackNode that = (DefaultOpenstackNode) obj;
Jian Li5afbea42018-02-28 10:37:03 +0900259 return Objects.equals(hostname, that.hostname) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900260 Objects.equals(type, that.type) &&
261 Objects.equals(intgBridge, that.intgBridge) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900262 Objects.equals(managementIp, that.managementIp) &&
263 Objects.equals(dataIp, that.dataIp) &&
daniel parkb18424c2018-02-05 15:43:43 +0900264 Objects.equals(uplinkPort, that.uplinkPort) &&
Jian Lie6312162018-03-21 21:41:00 +0900265 Objects.equals(vlanIntf, that.vlanIntf) &&
Jian Li27841662018-04-14 01:59:47 +0900266 Objects.equals(phyIntfs, that.phyIntfs) &&
Jian Li789fadb2018-07-10 13:59:47 +0900267 Objects.equals(controllers, that.controllers) &&
Daniel Park92abf312018-08-08 17:01:35 +0900268 Objects.equals(sshAuth, that.sshAuth) &&
Jian Lic704b672018-09-04 18:52:53 +0900269 Objects.equals(dpdkConfig, that.dpdkConfig) &&
270 Objects.equals(keystoneConfig, that.keystoneConfig) &&
271 Objects.equals(neutronConfig, that.neutronConfig);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900272 }
273 return false;
274 }
275
276 @Override
277 public int hashCode() {
278 return Objects.hash(hostname,
279 type,
280 intgBridge,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900281 managementIp,
282 dataIp,
daniel parkb18424c2018-02-05 15:43:43 +0900283 vlanIntf,
Jian Lie6312162018-03-21 21:41:00 +0900284 uplinkPort,
Jian Li27841662018-04-14 01:59:47 +0900285 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900286 controllers,
Daniel Park92abf312018-08-08 17:01:35 +0900287 sshAuth,
Jian Lic704b672018-09-04 18:52:53 +0900288 dpdkConfig,
289 keystoneConfig,
290 neutronConfig);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900291 }
292
293 @Override
294 public String toString() {
295 return MoreObjects.toStringHelper(getClass())
296 .add("hostname", hostname)
297 .add("type", type)
298 .add("integrationBridge", intgBridge)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900299 .add("managementIp", managementIp)
300 .add("dataIp", dataIp)
301 .add("vlanIntf", vlanIntf)
daniel parkb18424c2018-02-05 15:43:43 +0900302 .add("uplinkPort", uplinkPort)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900303 .add("state", state)
Jian Lie6312162018-03-21 21:41:00 +0900304 .add("phyIntfs", phyIntfs)
Jian Li789fadb2018-07-10 13:59:47 +0900305 .add("controllers", controllers)
Daniel Parkdeefa702018-07-17 17:55:51 +0900306 .add("sshAuth", sshAuth)
Jian Lic704b672018-09-04 18:52:53 +0900307 .add("dpdkConfig", dpdkConfig)
308 .add("keystoneConfig", keystoneConfig)
309 .add("neutronConfig", neutronConfig)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900310 .toString();
311 }
312
313 @Override
314 public OpenstackNode updateState(NodeState newState) {
315 return new Builder()
316 .type(type)
317 .hostname(hostname)
318 .intgBridge(intgBridge)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900319 .managementIp(managementIp)
320 .dataIp(dataIp)
321 .vlanIntf(vlanIntf)
daniel parkb18424c2018-02-05 15:43:43 +0900322 .uplinkPort(uplinkPort)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900323 .state(newState)
Jian Lie6312162018-03-21 21:41:00 +0900324 .phyIntfs(phyIntfs)
Jian Li789fadb2018-07-10 13:59:47 +0900325 .controllers(controllers)
Daniel Parkdeefa702018-07-17 17:55:51 +0900326 .sshAuthInfo(sshAuth)
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900327 .dpdkConfig(dpdkConfig)
Jian Lic704b672018-09-04 18:52:53 +0900328 .keystoneConfig(keystoneConfig)
329 .neutronConfig(neutronConfig)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900330 .build();
331 }
332
Jian Lie6312162018-03-21 21:41:00 +0900333 @Override
Jian Lie3141542018-08-13 18:05:43 +0900334 public OpenstackNode updateIntbridge(DeviceId newIntgBridge) {
335 return new Builder()
336 .type(type)
337 .hostname(hostname)
338 .intgBridge(newIntgBridge)
339 .managementIp(managementIp)
340 .dataIp(dataIp)
341 .vlanIntf(vlanIntf)
342 .uplinkPort(uplinkPort)
343 .state(state)
344 .phyIntfs(phyIntfs)
Jian Lie3141542018-08-13 18:05:43 +0900345 .sshAuthInfo(sshAuth)
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900346 .dpdkConfig(dpdkConfig)
Jian Lic704b672018-09-04 18:52:53 +0900347 .keystoneConfig(keystoneConfig)
348 .neutronConfig(neutronConfig)
Jian Li55276912018-10-08 12:58:54 +0900349 .controllers(controllers)
Jian Lie3141542018-08-13 18:05:43 +0900350 .build();
351 }
352
353 @Override
Jian Lie6312162018-03-21 21:41:00 +0900354 public Collection<OpenstackPhyInterface> phyIntfs() {
Jian Lie6312162018-03-21 21:41:00 +0900355 if (phyIntfs == null) {
356 return new ArrayList<>();
357 }
358
359 return phyIntfs;
360 }
361
Jian Li789fadb2018-07-10 13:59:47 +0900362
363 @Override
364 public Collection<ControllerInfo> controllers() {
365 if (controllers == null) {
366 return new ArrayList<>();
367 }
368
369 return controllers;
370 }
371
daniel park796c2eb2018-03-22 17:01:51 +0900372 @Override
Daniel Parkdeefa702018-07-17 17:55:51 +0900373 public OpenstackSshAuth sshAuthInfo() {
374 return sshAuth;
375 }
376
377 @Override
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900378 public DpdkConfig dpdkConfig() {
379 return dpdkConfig;
380 }
381
382 @Override
Jian Lic704b672018-09-04 18:52:53 +0900383 public KeystoneConfig keystoneConfig() {
384 return keystoneConfig;
385 }
386
387 @Override
388 public NeutronConfig neutronConfig() {
389 return neutronConfig;
390 }
391
392 @Override
daniel park796c2eb2018-03-22 17:01:51 +0900393 public PortNumber phyIntfPortNum(String providerPhysnet) {
394 Optional<OpenstackPhyInterface> openstackPhyInterface =
395 phyIntfs.stream().filter(p -> p.network().equals(providerPhysnet)).findAny();
396
397 if (openstackPhyInterface.isPresent()) {
398 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
399 Port port = deviceService.getPorts(intgBridge).stream()
400 .filter(p -> p.isEnabled() &&
401 Objects.equals(p.annotations().value(PORT_NAME), openstackPhyInterface.get().intf()))
402 .findAny().orElse(null);
403
404 return port != null ? port.number() : null;
405 } else {
406 return null;
407 }
408
409 }
Jian Li27841662018-04-14 01:59:47 +0900410
Hyunsun Moon0d457362017-06-27 17:19:41 +0900411 /**
412 * Returns new builder instance.
413 *
414 * @return openstack node builder
415 */
416 public static Builder builder() {
417 return new Builder();
418 }
419
420 /**
421 * Returns new builder instance with the given node as a default value.
422 *
423 * @param osNode openstack node
424 * @return openstack node builder
425 */
426 public static Builder from(OpenstackNode osNode) {
427 return new Builder()
428 .hostname(osNode.hostname())
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900429 .type(osNode.type())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900430 .intgBridge(osNode.intgBridge())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900431 .managementIp(osNode.managementIp())
432 .dataIp(osNode.dataIp())
433 .vlanIntf(osNode.vlanIntf())
daniel parkb18424c2018-02-05 15:43:43 +0900434 .uplinkPort(osNode.uplinkPort())
Jian Lie6312162018-03-21 21:41:00 +0900435 .state(osNode.state())
Jian Li27841662018-04-14 01:59:47 +0900436 .phyIntfs(osNode.phyIntfs())
Jian Li789fadb2018-07-10 13:59:47 +0900437 .controllers(osNode.controllers())
Daniel Park92abf312018-08-08 17:01:35 +0900438 .sshAuthInfo(osNode.sshAuthInfo())
Jian Lic704b672018-09-04 18:52:53 +0900439 .dpdkConfig(osNode.dpdkConfig())
440 .keystoneConfig(osNode.keystoneConfig())
441 .neutronConfig(osNode.neutronConfig());
Hyunsun Moon0d457362017-06-27 17:19:41 +0900442 }
443
Jian Li340165f2018-02-27 10:38:17 +0900444 /**
445 * A builder class for openstack Node.
446 */
Hyunsun Moon0d457362017-06-27 17:19:41 +0900447 public static final class Builder implements OpenstackNode.Builder {
448
449 private String hostname;
450 private NodeType type;
451 private DeviceId intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900452 private IpAddress managementIp;
453 private IpAddress dataIp;
454 private String vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +0900455 private String uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900456 private NodeState state;
Jian Lie6312162018-03-21 21:41:00 +0900457 private Collection<OpenstackPhyInterface> phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +0900458 private Collection<ControllerInfo> controllers;
Daniel Parkdeefa702018-07-17 17:55:51 +0900459 private OpenstackSshAuth sshAuth;
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900460 private DpdkConfig dpdkConfig;
Jian Lic704b672018-09-04 18:52:53 +0900461 private KeystoneConfig keystoneConfig;
462 private NeutronConfig neutronConfig;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900463
Jian Li340165f2018-02-27 10:38:17 +0900464 // private constructor not intended to use from external
Hyunsun Moon0d457362017-06-27 17:19:41 +0900465 private Builder() {
466 }
467
468 @Override
469 public DefaultOpenstackNode build() {
Jian Li340165f2018-02-27 10:38:17 +0900470 checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
471 checkArgument(type != null, NOT_NULL_MSG, "type");
Jian Li340165f2018-02-27 10:38:17 +0900472 checkArgument(state != null, NOT_NULL_MSG, "state");
Jian Li92d42fc2018-05-25 16:23:49 +0900473 checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
Hyunsun Moon0d457362017-06-27 17:19:41 +0900474
Jian Li27841662018-04-14 01:59:47 +0900475 if (type != NodeType.CONTROLLER) {
Jian Li27841662018-04-14 01:59:47 +0900476 if (dataIp == null && Strings.isNullOrEmpty(vlanIntf)) {
477 throw new IllegalArgumentException("Either data IP or VLAN interface is required");
478 }
479 } else {
Jian Lic704b672018-09-04 18:52:53 +0900480 checkArgument(keystoneConfig != null, NOT_NULL_MSG, "keystone config");
Jian Li27841662018-04-14 01:59:47 +0900481 }
482
daniel parkb18424c2018-02-05 15:43:43 +0900483 if (type == NodeType.GATEWAY && uplinkPort == null) {
484 throw new IllegalArgumentException("Uplink port is required for gateway node");
Hyunsun Moon0d457362017-06-27 17:19:41 +0900485 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900486
487 return new DefaultOpenstackNode(hostname,
488 type,
489 intgBridge,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900490 managementIp,
491 dataIp,
492 vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900493 uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900494 state,
Jian Li27841662018-04-14 01:59:47 +0900495 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900496 controllers,
Daniel Park92abf312018-08-08 17:01:35 +0900497 sshAuth,
Jian Lic704b672018-09-04 18:52:53 +0900498 dpdkConfig,
499 keystoneConfig,
500 neutronConfig);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900501 }
502
503 @Override
504 public Builder hostname(String hostname) {
505 if (!Strings.isNullOrEmpty(hostname)) {
506 this.hostname = hostname;
507 }
508 return this;
509 }
510
511 @Override
512 public Builder type(NodeType type) {
513 this.type = type;
514 return this;
515 }
516
517 @Override
518 public Builder intgBridge(DeviceId intgBridge) {
519 this.intgBridge = intgBridge;
520 return this;
521 }
522
523 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900524 public Builder managementIp(IpAddress managementIp) {
525 this.managementIp = managementIp;
526 return this;
527 }
528
529 @Override
530 public Builder dataIp(IpAddress dataIp) {
531 this.dataIp = dataIp;
532 return this;
533 }
534
535 @Override
536 public Builder vlanIntf(String vlanIntf) {
537 this.vlanIntf = vlanIntf;
538 return this;
539 }
540
541 @Override
daniel parkb18424c2018-02-05 15:43:43 +0900542 public Builder uplinkPort(String uplinkPort) {
543 this.uplinkPort = uplinkPort;
544 return this;
545 }
546
547 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900548 public Builder state(NodeState state) {
549 this.state = state;
550 return this;
551 }
Jian Lie6312162018-03-21 21:41:00 +0900552
553 @Override
554 public Builder phyIntfs(Collection<OpenstackPhyInterface> phyIntfs) {
555 this.phyIntfs = phyIntfs;
556 return this;
557 }
Jian Li27841662018-04-14 01:59:47 +0900558
559 @Override
Jian Li789fadb2018-07-10 13:59:47 +0900560 public Builder controllers(Collection<ControllerInfo> controllers) {
561 this.controllers = controllers;
562 return this;
563 }
564
565 @Override
Daniel Parkdeefa702018-07-17 17:55:51 +0900566 public Builder sshAuthInfo(OpenstackSshAuth sshAuth) {
567 this.sshAuth = sshAuth;
568 return this;
569 }
Daniel Park92abf312018-08-08 17:01:35 +0900570
571 @Override
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900572 public Builder dpdkConfig(DpdkConfig dpdkConfig) {
573 this.dpdkConfig = dpdkConfig;
Daniel Park7e8c4d82018-08-13 23:47:49 +0900574 return this;
575 }
Jian Lic704b672018-09-04 18:52:53 +0900576
577 @Override
578 public Builder keystoneConfig(KeystoneConfig keystoneConfig) {
579 this.keystoneConfig = keystoneConfig;
580 return this;
581 }
582
583 @Override
584 public Builder neutronConfig(NeutronConfig neutronConfig) {
585 this.neutronConfig = neutronConfig;
586 return this;
587 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900588 }
589}
590