blob: 220f7fc209208dc60f2dba89ff2c8c94ecb872a6 [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;
Hyunsun Moon0d457362017-06-27 17:19:41 +090028
Jian Lie6312162018-03-21 21:41:00 +090029import java.util.ArrayList;
30import java.util.Collection;
Hyunsun Moon0d457362017-06-27 17:19:41 +090031import java.util.Objects;
daniel park796c2eb2018-03-22 17:01:51 +090032import java.util.Optional;
Hyunsun Moon0d457362017-06-27 17:19:41 +090033
34import static com.google.common.base.Preconditions.checkArgument;
35import static org.onosproject.net.AnnotationKeys.PORT_MAC;
36import static org.onosproject.net.AnnotationKeys.PORT_NAME;
37import static org.onosproject.openstacknode.api.Constants.DEFAULT_TUNNEL;
38import static org.onosproject.openstacknode.api.Constants.PATCH_INTG_BRIDGE;
39
40/**
41 * Representation of a openstack node.
42 */
Hyunsun Moon090d77d2017-07-05 17:48:37 +090043public class DefaultOpenstackNode implements OpenstackNode {
Hyunsun Moon0d457362017-06-27 17:19:41 +090044
45 private final String hostname;
46 private final NodeType type;
47 private final DeviceId intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +090048 private final IpAddress managementIp;
49 private final IpAddress dataIp;
50 private final String vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +090051 private final String uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +090052 private final NodeState state;
Jian Lie6312162018-03-21 21:41:00 +090053 private final Collection<OpenstackPhyInterface> phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +090054 private final Collection<ControllerInfo> controllers;
Jian Li27841662018-04-14 01:59:47 +090055 private final OpenstackAuth auth;
Jian Li6d410362018-08-17 09:41:08 +090056 private final String endpoint;
Daniel Parkdeefa702018-07-17 17:55:51 +090057 private final OpenstackSshAuth sshAuth;
Daniel Park92abf312018-08-08 17:01:35 +090058 private final DatapathType datapathType;
Daniel Park7e8c4d82018-08-13 23:47:49 +090059 private final String socketDir;
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 Park92abf312018-08-08 17:01:35 +090081 * @param datapathType data path type
Daniel Park7e8c4d82018-08-13 23:47:49 +090082 * @param socketDir socket directory
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,
Jian Li92d42fc2018-05-25 16:23:49 +090093 OpenstackAuth auth,
Jian Li6d410362018-08-17 09:41:08 +090094 String endpoint,
Daniel Park92abf312018-08-08 17:01:35 +090095 OpenstackSshAuth sshAuth,
Daniel Park7e8c4d82018-08-13 23:47:49 +090096 DatapathType datapathType,
97 String socketDir) {
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;
Jian Li27841662018-04-14 01:59:47 +0900108 this.auth = auth;
Jian Li6d410362018-08-17 09:41:08 +0900109 this.endpoint = endpoint;
Daniel Parkdeefa702018-07-17 17:55:51 +0900110 this.sshAuth = sshAuth;
Daniel Park92abf312018-08-08 17:01:35 +0900111 this.datapathType = datapathType;
Daniel Park7e8c4d82018-08-13 23:47:49 +0900112 this.socketDir = socketDir;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900113 }
114
115 @Override
116 public String hostname() {
117 return hostname;
118 }
119
120 @Override
121 public NodeType type() {
122 return type;
123 }
124
125 @Override
126 public DeviceId ovsdb() {
daniel parkb18424c2018-02-05 15:43:43 +0900127 return DeviceId.deviceId(OVSDB + managementIp().toString());
Hyunsun Moon0d457362017-06-27 17:19:41 +0900128 }
129
130 @Override
131 public DeviceId intgBridge() {
132 return intgBridge;
133 }
134
135 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900136 public IpAddress managementIp() {
137 return managementIp;
138 }
139
140 @Override
141 public IpAddress dataIp() {
142 return dataIp;
143 }
144
145 @Override
146 public String vlanIntf() {
147 return vlanIntf;
148 }
149
150 @Override
daniel parkb18424c2018-02-05 15:43:43 +0900151 public String uplinkPort() {
152 return uplinkPort;
153 }
154
155 @Override
Daniel Park92abf312018-08-08 17:01:35 +0900156 public DatapathType datapathType() {
157 return datapathType;
158 }
159
160 @Override
Daniel Park7e8c4d82018-08-13 23:47:49 +0900161 public String socketDir() {
162 return socketDir;
163 }
164
165 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900166 public NodeState state() {
167 return state;
168 }
169
170 @Override
daniel parkb5817102018-02-15 00:18:51 +0900171 public PortNumber uplinkPortNum() {
172 if (uplinkPort == null) {
173 return null;
174 }
175
176 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
177 Port port = deviceService.getPorts(intgBridge).stream()
178 .filter(p -> p.isEnabled() &&
179 Objects.equals(p.annotations().value(PORT_NAME), uplinkPort))
180 .findAny().orElse(null);
181
182 return port != null ? port.number() : null;
183
184 }
185 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900186 public PortNumber tunnelPortNum() {
187 if (dataIp == null) {
188 return null;
189 }
190 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
191 Port port = deviceService.getPorts(intgBridge).stream()
192 .filter(p -> p.isEnabled() &&
193 Objects.equals(p.annotations().value(PORT_NAME), DEFAULT_TUNNEL))
194 .findAny().orElse(null);
195 return port != null ? port.number() : null;
196 }
197
198 @Override
199 public PortNumber vlanPortNum() {
200 if (vlanIntf == null) {
201 return null;
202 }
203 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
204 Port port = deviceService.getPorts(intgBridge).stream()
205 .filter(p -> p.isEnabled() &&
206 Objects.equals(p.annotations().value(PORT_NAME), vlanIntf))
207 .findAny().orElse(null);
208 return port != null ? port.number() : null;
209 }
210
211 @Override
212 public PortNumber patchPortNum() {
213 if (type == NodeType.COMPUTE) {
214 return null;
215 }
216 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
217 Port port = deviceService.getPorts(intgBridge).stream()
218 .filter(p -> p.isEnabled() &&
219 Objects.equals(p.annotations().value(PORT_NAME), PATCH_INTG_BRIDGE))
220 .findAny().orElse(null);
221 return port != null ? port.number() : null;
222 }
223
224 @Override
225 public MacAddress vlanPortMac() {
226 if (vlanIntf == null) {
227 return null;
228 }
229 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
230 Port port = deviceService.getPorts(intgBridge).stream()
231 .filter(p -> p.annotations().value(PORT_NAME).equals(vlanIntf))
232 .findAny().orElse(null);
233 return port != null ? MacAddress.valueOf(port.annotations().value(PORT_MAC)) : null;
234 }
235
236 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900237 public boolean equals(Object obj) {
238 if (this == obj) {
239 return true;
240 }
241
242 if (obj instanceof DefaultOpenstackNode) {
243 DefaultOpenstackNode that = (DefaultOpenstackNode) obj;
Jian Li5afbea42018-02-28 10:37:03 +0900244 return Objects.equals(hostname, that.hostname) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900245 Objects.equals(type, that.type) &&
246 Objects.equals(intgBridge, that.intgBridge) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900247 Objects.equals(managementIp, that.managementIp) &&
248 Objects.equals(dataIp, that.dataIp) &&
daniel parkb18424c2018-02-05 15:43:43 +0900249 Objects.equals(uplinkPort, that.uplinkPort) &&
Jian Lie6312162018-03-21 21:41:00 +0900250 Objects.equals(vlanIntf, that.vlanIntf) &&
Jian Li27841662018-04-14 01:59:47 +0900251 Objects.equals(phyIntfs, that.phyIntfs) &&
Jian Li789fadb2018-07-10 13:59:47 +0900252 Objects.equals(controllers, that.controllers) &&
Jian Li92d42fc2018-05-25 16:23:49 +0900253 Objects.equals(auth, that.auth) &&
Jian Li6d410362018-08-17 09:41:08 +0900254 Objects.equals(endpoint, that.endpoint) &&
Daniel Park92abf312018-08-08 17:01:35 +0900255 Objects.equals(sshAuth, that.sshAuth) &&
Daniel Park7e8c4d82018-08-13 23:47:49 +0900256 Objects.equals(datapathType, that.datapathType) &&
257 Objects.equals(socketDir, that.socketDir);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900258 }
259 return false;
260 }
261
262 @Override
263 public int hashCode() {
264 return Objects.hash(hostname,
265 type,
266 intgBridge,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900267 managementIp,
268 dataIp,
daniel parkb18424c2018-02-05 15:43:43 +0900269 vlanIntf,
Jian Lie6312162018-03-21 21:41:00 +0900270 uplinkPort,
Jian Li27841662018-04-14 01:59:47 +0900271 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900272 controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900273 auth,
Jian Li6d410362018-08-17 09:41:08 +0900274 endpoint,
Daniel Park92abf312018-08-08 17:01:35 +0900275 sshAuth,
Daniel Park7e8c4d82018-08-13 23:47:49 +0900276 datapathType,
277 socketDir);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900278 }
279
280 @Override
281 public String toString() {
282 return MoreObjects.toStringHelper(getClass())
283 .add("hostname", hostname)
284 .add("type", type)
285 .add("integrationBridge", intgBridge)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900286 .add("managementIp", managementIp)
287 .add("dataIp", dataIp)
288 .add("vlanIntf", vlanIntf)
daniel parkb18424c2018-02-05 15:43:43 +0900289 .add("uplinkPort", uplinkPort)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900290 .add("state", state)
Jian Lie6312162018-03-21 21:41:00 +0900291 .add("phyIntfs", phyIntfs)
Jian Li789fadb2018-07-10 13:59:47 +0900292 .add("controllers", controllers)
Jian Li27841662018-04-14 01:59:47 +0900293 .add("auth", auth)
Jian Li6d410362018-08-17 09:41:08 +0900294 .add("endpoint", endpoint)
Daniel Parkdeefa702018-07-17 17:55:51 +0900295 .add("sshAuth", sshAuth)
Daniel Park92abf312018-08-08 17:01:35 +0900296 .add("datapathType", datapathType)
Daniel Park7e8c4d82018-08-13 23:47:49 +0900297 .add("socketDir", socketDir)
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 Park92abf312018-08-08 17:01:35 +0900317 .datapathType(datapathType)
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)
337 .datapathType(datapathType)
Daniel Park7e8c4d82018-08-13 23:47:49 +0900338 .socketDir(socketDir)
Jian Lie3141542018-08-13 18:05:43 +0900339 .build();
340 }
341
342 @Override
Jian Lie6312162018-03-21 21:41:00 +0900343 public Collection<OpenstackPhyInterface> phyIntfs() {
Jian Lie6312162018-03-21 21:41:00 +0900344 if (phyIntfs == null) {
345 return new ArrayList<>();
346 }
347
348 return phyIntfs;
349 }
350
Jian Li789fadb2018-07-10 13:59:47 +0900351
352 @Override
353 public Collection<ControllerInfo> controllers() {
354 if (controllers == null) {
355 return new ArrayList<>();
356 }
357
358 return controllers;
359 }
360
daniel park796c2eb2018-03-22 17:01:51 +0900361 @Override
Daniel Parkdeefa702018-07-17 17:55:51 +0900362 public OpenstackSshAuth sshAuthInfo() {
363 return sshAuth;
364 }
365
366 @Override
daniel park796c2eb2018-03-22 17:01:51 +0900367 public PortNumber phyIntfPortNum(String providerPhysnet) {
368 Optional<OpenstackPhyInterface> openstackPhyInterface =
369 phyIntfs.stream().filter(p -> p.network().equals(providerPhysnet)).findAny();
370
371 if (openstackPhyInterface.isPresent()) {
372 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
373 Port port = deviceService.getPorts(intgBridge).stream()
374 .filter(p -> p.isEnabled() &&
375 Objects.equals(p.annotations().value(PORT_NAME), openstackPhyInterface.get().intf()))
376 .findAny().orElse(null);
377
378 return port != null ? port.number() : null;
379 } else {
380 return null;
381 }
382
383 }
Jian Li27841662018-04-14 01:59:47 +0900384
385 @Override
386 public OpenstackAuth authentication() {
387 return auth;
388 }
389
Jian Li92d42fc2018-05-25 16:23:49 +0900390 @Override
Jian Li6d410362018-08-17 09:41:08 +0900391 public String endpoint() {
392 return endpoint;
Jian Li92d42fc2018-05-25 16:23:49 +0900393 }
394
Hyunsun Moon0d457362017-06-27 17:19:41 +0900395 /**
396 * Returns new builder instance.
397 *
398 * @return openstack node builder
399 */
400 public static Builder builder() {
401 return new Builder();
402 }
403
404 /**
405 * Returns new builder instance with the given node as a default value.
406 *
407 * @param osNode openstack node
408 * @return openstack node builder
409 */
410 public static Builder from(OpenstackNode osNode) {
411 return new Builder()
412 .hostname(osNode.hostname())
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900413 .type(osNode.type())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900414 .intgBridge(osNode.intgBridge())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900415 .managementIp(osNode.managementIp())
416 .dataIp(osNode.dataIp())
417 .vlanIntf(osNode.vlanIntf())
daniel parkb18424c2018-02-05 15:43:43 +0900418 .uplinkPort(osNode.uplinkPort())
Jian Lie6312162018-03-21 21:41:00 +0900419 .state(osNode.state())
Jian Li27841662018-04-14 01:59:47 +0900420 .phyIntfs(osNode.phyIntfs())
Jian Li789fadb2018-07-10 13:59:47 +0900421 .controllers(osNode.controllers())
Jian Li92d42fc2018-05-25 16:23:49 +0900422 .authentication(osNode.authentication())
Jian Li6d410362018-08-17 09:41:08 +0900423 .endpoint(osNode.endpoint())
Daniel Park92abf312018-08-08 17:01:35 +0900424 .sshAuthInfo(osNode.sshAuthInfo())
Daniel Park7e8c4d82018-08-13 23:47:49 +0900425 .datapathType(osNode.datapathType())
426 .socketDir(osNode.socketDir());
Hyunsun Moon0d457362017-06-27 17:19:41 +0900427 }
428
Jian Li340165f2018-02-27 10:38:17 +0900429 /**
430 * A builder class for openstack Node.
431 */
Hyunsun Moon0d457362017-06-27 17:19:41 +0900432 public static final class Builder implements OpenstackNode.Builder {
433
434 private String hostname;
435 private NodeType type;
436 private DeviceId intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900437 private IpAddress managementIp;
438 private IpAddress dataIp;
439 private String vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +0900440 private String uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900441 private NodeState state;
Jian Lie6312162018-03-21 21:41:00 +0900442 private Collection<OpenstackPhyInterface> phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +0900443 private Collection<ControllerInfo> controllers;
Jian Li27841662018-04-14 01:59:47 +0900444 private OpenstackAuth auth;
Jian Li6d410362018-08-17 09:41:08 +0900445 private String endpoint;
Daniel Parkdeefa702018-07-17 17:55:51 +0900446 private OpenstackSshAuth sshAuth;
Daniel Park92abf312018-08-08 17:01:35 +0900447 private DatapathType datapathType = DatapathType.NORMAL;
Daniel Park7e8c4d82018-08-13 23:47:49 +0900448 private String socketDir;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900449
Jian Li340165f2018-02-27 10:38:17 +0900450 // private constructor not intended to use from external
Hyunsun Moon0d457362017-06-27 17:19:41 +0900451 private Builder() {
452 }
453
454 @Override
455 public DefaultOpenstackNode build() {
Jian Li340165f2018-02-27 10:38:17 +0900456 checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
457 checkArgument(type != null, NOT_NULL_MSG, "type");
Jian Li340165f2018-02-27 10:38:17 +0900458 checkArgument(state != null, NOT_NULL_MSG, "state");
Jian Li92d42fc2018-05-25 16:23:49 +0900459 checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
Hyunsun Moon0d457362017-06-27 17:19:41 +0900460
Jian Li27841662018-04-14 01:59:47 +0900461 if (type != NodeType.CONTROLLER) {
Jian Li27841662018-04-14 01:59:47 +0900462 if (dataIp == null && Strings.isNullOrEmpty(vlanIntf)) {
463 throw new IllegalArgumentException("Either data IP or VLAN interface is required");
464 }
465 } else {
Jian Li6d410362018-08-17 09:41:08 +0900466 checkArgument(endpoint != null, NOT_NULL_MSG, "endpoint URL");
Jian Li27841662018-04-14 01:59:47 +0900467 }
468
daniel parkb18424c2018-02-05 15:43:43 +0900469 if (type == NodeType.GATEWAY && uplinkPort == null) {
470 throw new IllegalArgumentException("Uplink port is required for gateway node");
Hyunsun Moon0d457362017-06-27 17:19:41 +0900471 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900472
473 return new DefaultOpenstackNode(hostname,
474 type,
475 intgBridge,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900476 managementIp,
477 dataIp,
478 vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900479 uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900480 state,
Jian Li27841662018-04-14 01:59:47 +0900481 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900482 controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900483 auth,
Jian Li6d410362018-08-17 09:41:08 +0900484 endpoint,
Daniel Park92abf312018-08-08 17:01:35 +0900485 sshAuth,
Daniel Park7e8c4d82018-08-13 23:47:49 +0900486 datapathType,
487 socketDir);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900488 }
489
490 @Override
491 public Builder hostname(String hostname) {
492 if (!Strings.isNullOrEmpty(hostname)) {
493 this.hostname = hostname;
494 }
495 return this;
496 }
497
498 @Override
499 public Builder type(NodeType type) {
500 this.type = type;
501 return this;
502 }
503
504 @Override
505 public Builder intgBridge(DeviceId intgBridge) {
506 this.intgBridge = intgBridge;
507 return this;
508 }
509
510 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900511 public Builder managementIp(IpAddress managementIp) {
512 this.managementIp = managementIp;
513 return this;
514 }
515
516 @Override
517 public Builder dataIp(IpAddress dataIp) {
518 this.dataIp = dataIp;
519 return this;
520 }
521
522 @Override
523 public Builder vlanIntf(String vlanIntf) {
524 this.vlanIntf = vlanIntf;
525 return this;
526 }
527
528 @Override
daniel parkb18424c2018-02-05 15:43:43 +0900529 public Builder uplinkPort(String uplinkPort) {
530 this.uplinkPort = uplinkPort;
531 return this;
532 }
533
534 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900535 public Builder state(NodeState state) {
536 this.state = state;
537 return this;
538 }
Jian Lie6312162018-03-21 21:41:00 +0900539
540 @Override
541 public Builder phyIntfs(Collection<OpenstackPhyInterface> phyIntfs) {
542 this.phyIntfs = phyIntfs;
543 return this;
544 }
Jian Li27841662018-04-14 01:59:47 +0900545
546 @Override
Jian Li789fadb2018-07-10 13:59:47 +0900547 public Builder controllers(Collection<ControllerInfo> controllers) {
548 this.controllers = controllers;
549 return this;
550 }
551
552 @Override
Jian Li27841662018-04-14 01:59:47 +0900553 public Builder authentication(OpenstackAuth auth) {
554 this.auth = auth;
555 return this;
556 }
Jian Li92d42fc2018-05-25 16:23:49 +0900557
558 @Override
Jian Li6d410362018-08-17 09:41:08 +0900559 public Builder endpoint(String endpoint) {
560 this.endpoint = endpoint;
Jian Li92d42fc2018-05-25 16:23:49 +0900561 return this;
562 }
Daniel Parkdeefa702018-07-17 17:55:51 +0900563
564 @Override
565 public Builder sshAuthInfo(OpenstackSshAuth sshAuth) {
566 this.sshAuth = sshAuth;
567 return this;
568 }
Daniel Park92abf312018-08-08 17:01:35 +0900569
570 @Override
571 public Builder datapathType(DatapathType datapathType) {
572 this.datapathType = datapathType;
573 return this;
574 }
Daniel Park7e8c4d82018-08-13 23:47:49 +0900575
576 @Override
577 public Builder socketDir(String socketDir) {
578 this.socketDir = socketDir;
579 return this;
580 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900581 }
582}
583