blob: 94afc4e77605f9865f88f9ec4a174d7351f47ed1 [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;
38import static org.onosproject.openstacknode.api.Constants.DEFAULT_TUNNEL;
39import static org.onosproject.openstacknode.api.Constants.PATCH_INTG_BRIDGE;
40
41/**
42 * Representation of a openstack node.
43 */
Hyunsun Moon090d77d2017-07-05 17:48:37 +090044public class DefaultOpenstackNode implements OpenstackNode {
Hyunsun Moon0d457362017-06-27 17:19:41 +090045
46 private final String hostname;
47 private final NodeType type;
48 private final DeviceId intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +090049 private final IpAddress managementIp;
50 private final IpAddress dataIp;
51 private final String vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +090052 private final String uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +090053 private final NodeState state;
Jian Lie6312162018-03-21 21:41:00 +090054 private final Collection<OpenstackPhyInterface> phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +090055 private final Collection<ControllerInfo> controllers;
Jian Li27841662018-04-14 01:59:47 +090056 private final OpenstackAuth auth;
Jian Li6d410362018-08-17 09:41:08 +090057 private final String endpoint;
Daniel Parkdeefa702018-07-17 17:55:51 +090058 private final OpenstackSshAuth sshAuth;
Daniel Parkd02d7bd2018-08-23 23:04:31 +090059 private final DpdkConfig dpdkConfig;
Hyunsun Moon0d457362017-06-27 17:19:41 +090060
Jian Li340165f2018-02-27 10:38:17 +090061 private static final String NOT_NULL_MSG = "Node % cannot be null";
62
daniel parkb18424c2018-02-05 15:43:43 +090063 private static final String OVSDB = "ovsdb:";
64
Jian Li340165f2018-02-27 10:38:17 +090065 /**
66 * A default constructor of Openstack Node.
67 *
68 * @param hostname hostname
69 * @param type node type
70 * @param intgBridge integration bridge
71 * @param managementIp management IP address
72 * @param dataIp data IP address
73 * @param vlanIntf VLAN interface
74 * @param uplinkPort uplink port name
75 * @param state node state
Jian Lie6312162018-03-21 21:41:00 +090076 * @param phyIntfs physical interfaces
Jian Li789fadb2018-07-10 13:59:47 +090077 * @param controllers customized controllers
Jian Li27841662018-04-14 01:59:47 +090078 * @param auth keystone authentication info
Jian Li6d410362018-08-17 09:41:08 +090079 * @param endpoint openstack endpoint URL
Daniel Parkdeefa702018-07-17 17:55:51 +090080 * @param sshAuth ssh authentication info
Daniel Parkd02d7bd2018-08-23 23:04:31 +090081 * @param dpdkConfig dpdk config
Jian Li340165f2018-02-27 10:38:17 +090082 */
daniel parkb18424c2018-02-05 15:43:43 +090083 protected DefaultOpenstackNode(String hostname, NodeType type,
84 DeviceId intgBridge,
85 IpAddress managementIp,
86 IpAddress dataIp,
87 String vlanIntf,
88 String uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +090089 NodeState state,
Jian Li27841662018-04-14 01:59:47 +090090 Collection<OpenstackPhyInterface> phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +090091 Collection<ControllerInfo> controllers,
Jian Li92d42fc2018-05-25 16:23:49 +090092 OpenstackAuth auth,
Jian Li6d410362018-08-17 09:41:08 +090093 String endpoint,
Daniel Park92abf312018-08-08 17:01:35 +090094 OpenstackSshAuth sshAuth,
Daniel Parkd02d7bd2018-08-23 23:04:31 +090095 DpdkConfig dpdkConfig) {
Hyunsun Moon0d457362017-06-27 17:19:41 +090096 this.hostname = hostname;
97 this.type = type;
98 this.intgBridge = intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +090099 this.managementIp = managementIp;
100 this.dataIp = dataIp;
101 this.vlanIntf = vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +0900102 this.uplinkPort = uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900103 this.state = state;
Jian Lie6312162018-03-21 21:41:00 +0900104 this.phyIntfs = phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +0900105 this.controllers = controllers;
Jian Li27841662018-04-14 01:59:47 +0900106 this.auth = auth;
Jian Li6d410362018-08-17 09:41:08 +0900107 this.endpoint = endpoint;
Daniel Parkdeefa702018-07-17 17:55:51 +0900108 this.sshAuth = sshAuth;
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900109 this.dpdkConfig = dpdkConfig;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900110 }
111
112 @Override
113 public String hostname() {
114 return hostname;
115 }
116
117 @Override
118 public NodeType type() {
119 return type;
120 }
121
122 @Override
123 public DeviceId ovsdb() {
daniel parkb18424c2018-02-05 15:43:43 +0900124 return DeviceId.deviceId(OVSDB + managementIp().toString());
Hyunsun Moon0d457362017-06-27 17:19:41 +0900125 }
126
127 @Override
128 public DeviceId intgBridge() {
129 return intgBridge;
130 }
131
132 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900133 public IpAddress managementIp() {
134 return managementIp;
135 }
136
137 @Override
138 public IpAddress dataIp() {
139 return dataIp;
140 }
141
142 @Override
143 public String vlanIntf() {
144 return vlanIntf;
145 }
146
147 @Override
daniel parkb18424c2018-02-05 15:43:43 +0900148 public String uplinkPort() {
149 return uplinkPort;
150 }
151
152 @Override
Daniel Park92abf312018-08-08 17:01:35 +0900153 public DatapathType datapathType() {
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900154 if (dpdkConfig == null) {
155 return DatapathType.NORMAL;
156 }
157 return dpdkConfig.datapathType();
Daniel Park92abf312018-08-08 17:01:35 +0900158 }
159
160 @Override
Daniel Park7e8c4d82018-08-13 23:47:49 +0900161 public String socketDir() {
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900162 if (dpdkConfig == null) {
163 return null;
164 }
165 return dpdkConfig.socketDir();
Daniel Park7e8c4d82018-08-13 23:47:49 +0900166 }
167
168 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900169 public NodeState state() {
170 return state;
171 }
172
173 @Override
daniel parkb5817102018-02-15 00:18:51 +0900174 public PortNumber uplinkPortNum() {
175 if (uplinkPort == null) {
176 return null;
177 }
178
179 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
180 Port port = deviceService.getPorts(intgBridge).stream()
181 .filter(p -> p.isEnabled() &&
182 Objects.equals(p.annotations().value(PORT_NAME), uplinkPort))
183 .findAny().orElse(null);
184
185 return port != null ? port.number() : null;
186
187 }
188 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900189 public PortNumber tunnelPortNum() {
190 if (dataIp == null) {
191 return null;
192 }
193 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
194 Port port = deviceService.getPorts(intgBridge).stream()
195 .filter(p -> p.isEnabled() &&
196 Objects.equals(p.annotations().value(PORT_NAME), DEFAULT_TUNNEL))
197 .findAny().orElse(null);
198 return port != null ? port.number() : null;
199 }
200
201 @Override
202 public PortNumber vlanPortNum() {
203 if (vlanIntf == null) {
204 return null;
205 }
206 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
207 Port port = deviceService.getPorts(intgBridge).stream()
208 .filter(p -> p.isEnabled() &&
209 Objects.equals(p.annotations().value(PORT_NAME), vlanIntf))
210 .findAny().orElse(null);
211 return port != null ? port.number() : null;
212 }
213
214 @Override
215 public PortNumber patchPortNum() {
216 if (type == NodeType.COMPUTE) {
217 return null;
218 }
219 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
220 Port port = deviceService.getPorts(intgBridge).stream()
221 .filter(p -> p.isEnabled() &&
222 Objects.equals(p.annotations().value(PORT_NAME), PATCH_INTG_BRIDGE))
223 .findAny().orElse(null);
224 return port != null ? port.number() : null;
225 }
226
227 @Override
228 public MacAddress vlanPortMac() {
229 if (vlanIntf == null) {
230 return null;
231 }
232 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
233 Port port = deviceService.getPorts(intgBridge).stream()
234 .filter(p -> p.annotations().value(PORT_NAME).equals(vlanIntf))
235 .findAny().orElse(null);
236 return port != null ? MacAddress.valueOf(port.annotations().value(PORT_MAC)) : null;
237 }
238
239 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900240 public boolean equals(Object obj) {
241 if (this == obj) {
242 return true;
243 }
244
245 if (obj instanceof DefaultOpenstackNode) {
246 DefaultOpenstackNode that = (DefaultOpenstackNode) obj;
Jian Li5afbea42018-02-28 10:37:03 +0900247 return Objects.equals(hostname, that.hostname) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900248 Objects.equals(type, that.type) &&
249 Objects.equals(intgBridge, that.intgBridge) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900250 Objects.equals(managementIp, that.managementIp) &&
251 Objects.equals(dataIp, that.dataIp) &&
daniel parkb18424c2018-02-05 15:43:43 +0900252 Objects.equals(uplinkPort, that.uplinkPort) &&
Jian Lie6312162018-03-21 21:41:00 +0900253 Objects.equals(vlanIntf, that.vlanIntf) &&
Jian Li27841662018-04-14 01:59:47 +0900254 Objects.equals(phyIntfs, that.phyIntfs) &&
Jian Li789fadb2018-07-10 13:59:47 +0900255 Objects.equals(controllers, that.controllers) &&
Jian Li92d42fc2018-05-25 16:23:49 +0900256 Objects.equals(auth, that.auth) &&
Jian Li6d410362018-08-17 09:41:08 +0900257 Objects.equals(endpoint, that.endpoint) &&
Daniel Park92abf312018-08-08 17:01:35 +0900258 Objects.equals(sshAuth, that.sshAuth) &&
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900259 Objects.equals(dpdkConfig, that.dpdkConfig);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900260 }
261 return false;
262 }
263
264 @Override
265 public int hashCode() {
266 return Objects.hash(hostname,
267 type,
268 intgBridge,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900269 managementIp,
270 dataIp,
daniel parkb18424c2018-02-05 15:43:43 +0900271 vlanIntf,
Jian Lie6312162018-03-21 21:41:00 +0900272 uplinkPort,
Jian Li27841662018-04-14 01:59:47 +0900273 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900274 controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900275 auth,
Jian Li6d410362018-08-17 09:41:08 +0900276 endpoint,
Daniel Park92abf312018-08-08 17:01:35 +0900277 sshAuth,
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900278 dpdkConfig);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900279 }
280
281 @Override
282 public String toString() {
283 return MoreObjects.toStringHelper(getClass())
284 .add("hostname", hostname)
285 .add("type", type)
286 .add("integrationBridge", intgBridge)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900287 .add("managementIp", managementIp)
288 .add("dataIp", dataIp)
289 .add("vlanIntf", vlanIntf)
daniel parkb18424c2018-02-05 15:43:43 +0900290 .add("uplinkPort", uplinkPort)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900291 .add("state", state)
Jian Lie6312162018-03-21 21:41:00 +0900292 .add("phyIntfs", phyIntfs)
Jian Li789fadb2018-07-10 13:59:47 +0900293 .add("controllers", controllers)
Jian Li27841662018-04-14 01:59:47 +0900294 .add("auth", auth)
Jian Li6d410362018-08-17 09:41:08 +0900295 .add("endpoint", endpoint)
Daniel Parkdeefa702018-07-17 17:55:51 +0900296 .add("sshAuth", sshAuth)
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900297 .add("datapathType", dpdkConfig)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900298 .toString();
299 }
300
301 @Override
302 public OpenstackNode updateState(NodeState newState) {
303 return new Builder()
304 .type(type)
305 .hostname(hostname)
306 .intgBridge(intgBridge)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900307 .managementIp(managementIp)
308 .dataIp(dataIp)
309 .vlanIntf(vlanIntf)
daniel parkb18424c2018-02-05 15:43:43 +0900310 .uplinkPort(uplinkPort)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900311 .state(newState)
Jian Lie6312162018-03-21 21:41:00 +0900312 .phyIntfs(phyIntfs)
Jian Li789fadb2018-07-10 13:59:47 +0900313 .controllers(controllers)
Jian Li27841662018-04-14 01:59:47 +0900314 .authentication(auth)
Jian Li6d410362018-08-17 09:41:08 +0900315 .endpoint(endpoint)
Daniel Parkdeefa702018-07-17 17:55:51 +0900316 .sshAuthInfo(sshAuth)
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900317 .dpdkConfig(dpdkConfig)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900318 .build();
319 }
320
Jian Lie6312162018-03-21 21:41:00 +0900321 @Override
Jian Lie3141542018-08-13 18:05:43 +0900322 public OpenstackNode updateIntbridge(DeviceId newIntgBridge) {
323 return new Builder()
324 .type(type)
325 .hostname(hostname)
326 .intgBridge(newIntgBridge)
327 .managementIp(managementIp)
328 .dataIp(dataIp)
329 .vlanIntf(vlanIntf)
330 .uplinkPort(uplinkPort)
331 .state(state)
332 .phyIntfs(phyIntfs)
333 .controllers(controllers)
334 .authentication(auth)
Jian Li6d410362018-08-17 09:41:08 +0900335 .endpoint(endpoint)
Jian Lie3141542018-08-13 18:05:43 +0900336 .sshAuthInfo(sshAuth)
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900337 .dpdkConfig(dpdkConfig)
Jian Lie3141542018-08-13 18:05:43 +0900338 .build();
339 }
340
341 @Override
Jian Lie6312162018-03-21 21:41:00 +0900342 public Collection<OpenstackPhyInterface> phyIntfs() {
Jian Lie6312162018-03-21 21:41:00 +0900343 if (phyIntfs == null) {
344 return new ArrayList<>();
345 }
346
347 return phyIntfs;
348 }
349
Jian Li789fadb2018-07-10 13:59:47 +0900350
351 @Override
352 public Collection<ControllerInfo> controllers() {
353 if (controllers == null) {
354 return new ArrayList<>();
355 }
356
357 return controllers;
358 }
359
daniel park796c2eb2018-03-22 17:01:51 +0900360 @Override
Daniel Parkdeefa702018-07-17 17:55:51 +0900361 public OpenstackSshAuth sshAuthInfo() {
362 return sshAuth;
363 }
364
365 @Override
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900366 public DpdkConfig dpdkConfig() {
367 return dpdkConfig;
368 }
369
370 @Override
daniel park796c2eb2018-03-22 17:01:51 +0900371 public PortNumber phyIntfPortNum(String providerPhysnet) {
372 Optional<OpenstackPhyInterface> openstackPhyInterface =
373 phyIntfs.stream().filter(p -> p.network().equals(providerPhysnet)).findAny();
374
375 if (openstackPhyInterface.isPresent()) {
376 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
377 Port port = deviceService.getPorts(intgBridge).stream()
378 .filter(p -> p.isEnabled() &&
379 Objects.equals(p.annotations().value(PORT_NAME), openstackPhyInterface.get().intf()))
380 .findAny().orElse(null);
381
382 return port != null ? port.number() : null;
383 } else {
384 return null;
385 }
386
387 }
Jian Li27841662018-04-14 01:59:47 +0900388
389 @Override
390 public OpenstackAuth authentication() {
391 return auth;
392 }
393
Jian Li92d42fc2018-05-25 16:23:49 +0900394 @Override
Jian Li6d410362018-08-17 09:41:08 +0900395 public String endpoint() {
396 return endpoint;
Jian Li92d42fc2018-05-25 16:23:49 +0900397 }
398
Hyunsun Moon0d457362017-06-27 17:19:41 +0900399 /**
400 * Returns new builder instance.
401 *
402 * @return openstack node builder
403 */
404 public static Builder builder() {
405 return new Builder();
406 }
407
408 /**
409 * Returns new builder instance with the given node as a default value.
410 *
411 * @param osNode openstack node
412 * @return openstack node builder
413 */
414 public static Builder from(OpenstackNode osNode) {
415 return new Builder()
416 .hostname(osNode.hostname())
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900417 .type(osNode.type())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900418 .intgBridge(osNode.intgBridge())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900419 .managementIp(osNode.managementIp())
420 .dataIp(osNode.dataIp())
421 .vlanIntf(osNode.vlanIntf())
daniel parkb18424c2018-02-05 15:43:43 +0900422 .uplinkPort(osNode.uplinkPort())
Jian Lie6312162018-03-21 21:41:00 +0900423 .state(osNode.state())
Jian Li27841662018-04-14 01:59:47 +0900424 .phyIntfs(osNode.phyIntfs())
Jian Li789fadb2018-07-10 13:59:47 +0900425 .controllers(osNode.controllers())
Jian Li92d42fc2018-05-25 16:23:49 +0900426 .authentication(osNode.authentication())
Jian Li6d410362018-08-17 09:41:08 +0900427 .endpoint(osNode.endpoint())
Daniel Park92abf312018-08-08 17:01:35 +0900428 .sshAuthInfo(osNode.sshAuthInfo())
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900429 .dpdkConfig(osNode.dpdkConfig());
Hyunsun Moon0d457362017-06-27 17:19:41 +0900430 }
431
Jian Li340165f2018-02-27 10:38:17 +0900432 /**
433 * A builder class for openstack Node.
434 */
Hyunsun Moon0d457362017-06-27 17:19:41 +0900435 public static final class Builder implements OpenstackNode.Builder {
436
437 private String hostname;
438 private NodeType type;
439 private DeviceId intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900440 private IpAddress managementIp;
441 private IpAddress dataIp;
442 private String vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +0900443 private String uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900444 private NodeState state;
Jian Lie6312162018-03-21 21:41:00 +0900445 private Collection<OpenstackPhyInterface> phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +0900446 private Collection<ControllerInfo> controllers;
Jian Li27841662018-04-14 01:59:47 +0900447 private OpenstackAuth auth;
Jian Li6d410362018-08-17 09:41:08 +0900448 private String endpoint;
Daniel Parkdeefa702018-07-17 17:55:51 +0900449 private OpenstackSshAuth sshAuth;
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900450 private DpdkConfig dpdkConfig;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900451
Jian Li340165f2018-02-27 10:38:17 +0900452 // private constructor not intended to use from external
Hyunsun Moon0d457362017-06-27 17:19:41 +0900453 private Builder() {
454 }
455
456 @Override
457 public DefaultOpenstackNode build() {
Jian Li340165f2018-02-27 10:38:17 +0900458 checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
459 checkArgument(type != null, NOT_NULL_MSG, "type");
Jian Li340165f2018-02-27 10:38:17 +0900460 checkArgument(state != null, NOT_NULL_MSG, "state");
Jian Li92d42fc2018-05-25 16:23:49 +0900461 checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
Hyunsun Moon0d457362017-06-27 17:19:41 +0900462
Jian Li27841662018-04-14 01:59:47 +0900463 if (type != NodeType.CONTROLLER) {
Jian Li27841662018-04-14 01:59:47 +0900464 if (dataIp == null && Strings.isNullOrEmpty(vlanIntf)) {
465 throw new IllegalArgumentException("Either data IP or VLAN interface is required");
466 }
467 } else {
Jian Li6d410362018-08-17 09:41:08 +0900468 checkArgument(endpoint != null, NOT_NULL_MSG, "endpoint URL");
Jian Li27841662018-04-14 01:59:47 +0900469 }
470
daniel parkb18424c2018-02-05 15:43:43 +0900471 if (type == NodeType.GATEWAY && uplinkPort == null) {
472 throw new IllegalArgumentException("Uplink port is required for gateway node");
Hyunsun Moon0d457362017-06-27 17:19:41 +0900473 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900474
475 return new DefaultOpenstackNode(hostname,
476 type,
477 intgBridge,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900478 managementIp,
479 dataIp,
480 vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900481 uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900482 state,
Jian Li27841662018-04-14 01:59:47 +0900483 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900484 controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900485 auth,
Jian Li6d410362018-08-17 09:41:08 +0900486 endpoint,
Daniel Park92abf312018-08-08 17:01:35 +0900487 sshAuth,
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900488 dpdkConfig);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900489 }
490
491 @Override
492 public Builder hostname(String hostname) {
493 if (!Strings.isNullOrEmpty(hostname)) {
494 this.hostname = hostname;
495 }
496 return this;
497 }
498
499 @Override
500 public Builder type(NodeType type) {
501 this.type = type;
502 return this;
503 }
504
505 @Override
506 public Builder intgBridge(DeviceId intgBridge) {
507 this.intgBridge = intgBridge;
508 return this;
509 }
510
511 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900512 public Builder managementIp(IpAddress managementIp) {
513 this.managementIp = managementIp;
514 return this;
515 }
516
517 @Override
518 public Builder dataIp(IpAddress dataIp) {
519 this.dataIp = dataIp;
520 return this;
521 }
522
523 @Override
524 public Builder vlanIntf(String vlanIntf) {
525 this.vlanIntf = vlanIntf;
526 return this;
527 }
528
529 @Override
daniel parkb18424c2018-02-05 15:43:43 +0900530 public Builder uplinkPort(String uplinkPort) {
531 this.uplinkPort = uplinkPort;
532 return this;
533 }
534
535 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900536 public Builder state(NodeState state) {
537 this.state = state;
538 return this;
539 }
Jian Lie6312162018-03-21 21:41:00 +0900540
541 @Override
542 public Builder phyIntfs(Collection<OpenstackPhyInterface> phyIntfs) {
543 this.phyIntfs = phyIntfs;
544 return this;
545 }
Jian Li27841662018-04-14 01:59:47 +0900546
547 @Override
Jian Li789fadb2018-07-10 13:59:47 +0900548 public Builder controllers(Collection<ControllerInfo> controllers) {
549 this.controllers = controllers;
550 return this;
551 }
552
553 @Override
Jian Li27841662018-04-14 01:59:47 +0900554 public Builder authentication(OpenstackAuth auth) {
555 this.auth = auth;
556 return this;
557 }
Jian Li92d42fc2018-05-25 16:23:49 +0900558
559 @Override
Jian Li6d410362018-08-17 09:41:08 +0900560 public Builder endpoint(String endpoint) {
561 this.endpoint = endpoint;
Jian Li92d42fc2018-05-25 16:23:49 +0900562 return this;
563 }
Daniel Parkdeefa702018-07-17 17:55:51 +0900564
565 @Override
566 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 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900576 }
577}
578