blob: e45d61baf07c0e2c887d6d0d5ee6d32b54463ecf [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;
23import org.onosproject.core.GroupId;
24import org.onosproject.net.DeviceId;
25import org.onosproject.net.Port;
26import org.onosproject.net.PortNumber;
Jian Li789fadb2018-07-10 13:59:47 +090027import org.onosproject.net.behaviour.ControllerInfo;
Hyunsun Moon0d457362017-06-27 17:19:41 +090028import org.onosproject.net.device.DeviceService;
29import org.onosproject.net.group.DefaultGroupKey;
30import org.onosproject.net.group.GroupKey;
Hyunsun Moon0d457362017-06-27 17:19:41 +090031
Jian Lie6312162018-03-21 21:41:00 +090032import java.util.ArrayList;
33import java.util.Collection;
Hyunsun Moon0d457362017-06-27 17:19:41 +090034import java.util.Objects;
daniel park796c2eb2018-03-22 17:01:51 +090035import java.util.Optional;
Hyunsun Moon0d457362017-06-27 17:19:41 +090036
37import static com.google.common.base.Preconditions.checkArgument;
38import static org.onosproject.net.AnnotationKeys.PORT_MAC;
39import static org.onosproject.net.AnnotationKeys.PORT_NAME;
40import static org.onosproject.openstacknode.api.Constants.DEFAULT_TUNNEL;
41import 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;
Jian Li27841662018-04-14 01:59:47 +090058 private final OpenstackAuth auth;
Jian Li6d410362018-08-17 09:41:08 +090059 private final String endpoint;
Daniel Parkdeefa702018-07-17 17:55:51 +090060 private final OpenstackSshAuth sshAuth;
Daniel Park92abf312018-08-08 17:01:35 +090061 private final DatapathType datapathType;
Daniel Park7e8c4d82018-08-13 23:47:49 +090062 private final String socketDir;
Hyunsun Moon0d457362017-06-27 17:19:41 +090063
Jian Li340165f2018-02-27 10:38:17 +090064 private static final String NOT_NULL_MSG = "Node % cannot be null";
65
daniel parkb18424c2018-02-05 15:43:43 +090066 private static final String OVSDB = "ovsdb:";
67
Jian Li340165f2018-02-27 10:38:17 +090068 /**
69 * A default constructor of Openstack Node.
70 *
71 * @param hostname hostname
72 * @param type node type
73 * @param intgBridge integration bridge
74 * @param managementIp management IP address
75 * @param dataIp data IP address
76 * @param vlanIntf VLAN interface
77 * @param uplinkPort uplink port name
78 * @param state node state
Jian Lie6312162018-03-21 21:41:00 +090079 * @param phyIntfs physical interfaces
Jian Li789fadb2018-07-10 13:59:47 +090080 * @param controllers customized controllers
Jian Li27841662018-04-14 01:59:47 +090081 * @param auth keystone authentication info
Jian Li6d410362018-08-17 09:41:08 +090082 * @param endpoint openstack endpoint URL
Daniel Parkdeefa702018-07-17 17:55:51 +090083 * @param sshAuth ssh authentication info
Daniel Park92abf312018-08-08 17:01:35 +090084 * @param datapathType data path type
Daniel Park7e8c4d82018-08-13 23:47:49 +090085 * @param socketDir socket directory
Jian Li340165f2018-02-27 10:38:17 +090086 */
daniel parkb18424c2018-02-05 15:43:43 +090087 protected DefaultOpenstackNode(String hostname, NodeType type,
88 DeviceId intgBridge,
89 IpAddress managementIp,
90 IpAddress dataIp,
91 String vlanIntf,
92 String uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +090093 NodeState state,
Jian Li27841662018-04-14 01:59:47 +090094 Collection<OpenstackPhyInterface> phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +090095 Collection<ControllerInfo> controllers,
Jian Li92d42fc2018-05-25 16:23:49 +090096 OpenstackAuth auth,
Jian Li6d410362018-08-17 09:41:08 +090097 String endpoint,
Daniel Park92abf312018-08-08 17:01:35 +090098 OpenstackSshAuth sshAuth,
Daniel Park7e8c4d82018-08-13 23:47:49 +090099 DatapathType datapathType,
100 String socketDir) {
Hyunsun Moon0d457362017-06-27 17:19:41 +0900101 this.hostname = hostname;
102 this.type = type;
103 this.intgBridge = intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900104 this.managementIp = managementIp;
105 this.dataIp = dataIp;
106 this.vlanIntf = vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +0900107 this.uplinkPort = uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900108 this.state = state;
Jian Lie6312162018-03-21 21:41:00 +0900109 this.phyIntfs = phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +0900110 this.controllers = controllers;
Jian Li27841662018-04-14 01:59:47 +0900111 this.auth = auth;
Jian Li6d410362018-08-17 09:41:08 +0900112 this.endpoint = endpoint;
Daniel Parkdeefa702018-07-17 17:55:51 +0900113 this.sshAuth = sshAuth;
Daniel Park92abf312018-08-08 17:01:35 +0900114 this.datapathType = datapathType;
Daniel Park7e8c4d82018-08-13 23:47:49 +0900115 this.socketDir = socketDir;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900116 }
117
118 @Override
119 public String hostname() {
120 return hostname;
121 }
122
123 @Override
124 public NodeType type() {
125 return type;
126 }
127
128 @Override
129 public DeviceId ovsdb() {
daniel parkb18424c2018-02-05 15:43:43 +0900130 return DeviceId.deviceId(OVSDB + managementIp().toString());
Hyunsun Moon0d457362017-06-27 17:19:41 +0900131 }
132
133 @Override
134 public DeviceId intgBridge() {
135 return intgBridge;
136 }
137
138 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900139 public IpAddress managementIp() {
140 return managementIp;
141 }
142
143 @Override
144 public IpAddress dataIp() {
145 return dataIp;
146 }
147
148 @Override
149 public String vlanIntf() {
150 return vlanIntf;
151 }
152
153 @Override
daniel parkb18424c2018-02-05 15:43:43 +0900154 public String uplinkPort() {
155 return uplinkPort;
156 }
157
158 @Override
Daniel Park92abf312018-08-08 17:01:35 +0900159 public DatapathType datapathType() {
160 return datapathType;
161 }
162
163 @Override
Daniel Park7e8c4d82018-08-13 23:47:49 +0900164 public String socketDir() {
165 return socketDir;
166 }
167
168 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900169 public NodeState state() {
170 return state;
171 }
172
173 @Override
174 public GroupKey gatewayGroupKey(NetworkMode mode) {
175 return new DefaultGroupKey(intgBridge.toString().concat(mode.name()).getBytes());
176 }
177
178 @Override
daniel parkb5817102018-02-15 00:18:51 +0900179 public PortNumber uplinkPortNum() {
180 if (uplinkPort == null) {
181 return null;
182 }
183
184 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
185 Port port = deviceService.getPorts(intgBridge).stream()
186 .filter(p -> p.isEnabled() &&
187 Objects.equals(p.annotations().value(PORT_NAME), uplinkPort))
188 .findAny().orElse(null);
189
190 return port != null ? port.number() : null;
191
192 }
193 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900194 public PortNumber tunnelPortNum() {
195 if (dataIp == null) {
196 return null;
197 }
198 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
199 Port port = deviceService.getPorts(intgBridge).stream()
200 .filter(p -> p.isEnabled() &&
201 Objects.equals(p.annotations().value(PORT_NAME), DEFAULT_TUNNEL))
202 .findAny().orElse(null);
203 return port != null ? port.number() : null;
204 }
205
206 @Override
207 public PortNumber vlanPortNum() {
208 if (vlanIntf == null) {
209 return null;
210 }
211 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
212 Port port = deviceService.getPorts(intgBridge).stream()
213 .filter(p -> p.isEnabled() &&
214 Objects.equals(p.annotations().value(PORT_NAME), vlanIntf))
215 .findAny().orElse(null);
216 return port != null ? port.number() : null;
217 }
218
219 @Override
220 public PortNumber patchPortNum() {
221 if (type == NodeType.COMPUTE) {
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), PATCH_INTG_BRIDGE))
228 .findAny().orElse(null);
229 return port != null ? port.number() : null;
230 }
231
232 @Override
233 public MacAddress vlanPortMac() {
234 if (vlanIntf == null) {
235 return null;
236 }
237 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
238 Port port = deviceService.getPorts(intgBridge).stream()
239 .filter(p -> p.annotations().value(PORT_NAME).equals(vlanIntf))
240 .findAny().orElse(null);
241 return port != null ? MacAddress.valueOf(port.annotations().value(PORT_MAC)) : null;
242 }
243
244 @Override
245 public GroupId gatewayGroupId(NetworkMode mode) {
246 return new GroupId(intgBridge.toString().concat(mode.name()).hashCode());
247 }
248
249 @Override
250 public boolean equals(Object obj) {
251 if (this == obj) {
252 return true;
253 }
254
255 if (obj instanceof DefaultOpenstackNode) {
256 DefaultOpenstackNode that = (DefaultOpenstackNode) obj;
Jian Li5afbea42018-02-28 10:37:03 +0900257 return Objects.equals(hostname, that.hostname) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900258 Objects.equals(type, that.type) &&
259 Objects.equals(intgBridge, that.intgBridge) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900260 Objects.equals(managementIp, that.managementIp) &&
261 Objects.equals(dataIp, that.dataIp) &&
daniel parkb18424c2018-02-05 15:43:43 +0900262 Objects.equals(uplinkPort, that.uplinkPort) &&
Jian Lie6312162018-03-21 21:41:00 +0900263 Objects.equals(vlanIntf, that.vlanIntf) &&
Jian Li27841662018-04-14 01:59:47 +0900264 Objects.equals(phyIntfs, that.phyIntfs) &&
Jian Li789fadb2018-07-10 13:59:47 +0900265 Objects.equals(controllers, that.controllers) &&
Jian Li92d42fc2018-05-25 16:23:49 +0900266 Objects.equals(auth, that.auth) &&
Jian Li6d410362018-08-17 09:41:08 +0900267 Objects.equals(endpoint, that.endpoint) &&
Daniel Park92abf312018-08-08 17:01:35 +0900268 Objects.equals(sshAuth, that.sshAuth) &&
Daniel Park7e8c4d82018-08-13 23:47:49 +0900269 Objects.equals(datapathType, that.datapathType) &&
270 Objects.equals(socketDir, that.socketDir);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900271 }
272 return false;
273 }
274
275 @Override
276 public int hashCode() {
277 return Objects.hash(hostname,
278 type,
279 intgBridge,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900280 managementIp,
281 dataIp,
daniel parkb18424c2018-02-05 15:43:43 +0900282 vlanIntf,
Jian Lie6312162018-03-21 21:41:00 +0900283 uplinkPort,
Jian Li27841662018-04-14 01:59:47 +0900284 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900285 controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900286 auth,
Jian Li6d410362018-08-17 09:41:08 +0900287 endpoint,
Daniel Park92abf312018-08-08 17:01:35 +0900288 sshAuth,
Daniel Park7e8c4d82018-08-13 23:47:49 +0900289 datapathType,
290 socketDir);
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)
Jian Li27841662018-04-14 01:59:47 +0900306 .add("auth", auth)
Jian Li6d410362018-08-17 09:41:08 +0900307 .add("endpoint", endpoint)
Daniel Parkdeefa702018-07-17 17:55:51 +0900308 .add("sshAuth", sshAuth)
Daniel Park92abf312018-08-08 17:01:35 +0900309 .add("datapathType", datapathType)
Daniel Park7e8c4d82018-08-13 23:47:49 +0900310 .add("socketDir", socketDir)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900311 .toString();
312 }
313
314 @Override
315 public OpenstackNode updateState(NodeState newState) {
316 return new Builder()
317 .type(type)
318 .hostname(hostname)
319 .intgBridge(intgBridge)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900320 .managementIp(managementIp)
321 .dataIp(dataIp)
322 .vlanIntf(vlanIntf)
daniel parkb18424c2018-02-05 15:43:43 +0900323 .uplinkPort(uplinkPort)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900324 .state(newState)
Jian Lie6312162018-03-21 21:41:00 +0900325 .phyIntfs(phyIntfs)
Jian Li789fadb2018-07-10 13:59:47 +0900326 .controllers(controllers)
Jian Li27841662018-04-14 01:59:47 +0900327 .authentication(auth)
Jian Li6d410362018-08-17 09:41:08 +0900328 .endpoint(endpoint)
Daniel Parkdeefa702018-07-17 17:55:51 +0900329 .sshAuthInfo(sshAuth)
Daniel Park92abf312018-08-08 17:01:35 +0900330 .datapathType(datapathType)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900331 .build();
332 }
333
Jian Lie6312162018-03-21 21:41:00 +0900334 @Override
Jian Lie3141542018-08-13 18:05:43 +0900335 public OpenstackNode updateIntbridge(DeviceId newIntgBridge) {
336 return new Builder()
337 .type(type)
338 .hostname(hostname)
339 .intgBridge(newIntgBridge)
340 .managementIp(managementIp)
341 .dataIp(dataIp)
342 .vlanIntf(vlanIntf)
343 .uplinkPort(uplinkPort)
344 .state(state)
345 .phyIntfs(phyIntfs)
346 .controllers(controllers)
347 .authentication(auth)
Jian Li6d410362018-08-17 09:41:08 +0900348 .endpoint(endpoint)
Jian Lie3141542018-08-13 18:05:43 +0900349 .sshAuthInfo(sshAuth)
350 .datapathType(datapathType)
Daniel Park7e8c4d82018-08-13 23:47:49 +0900351 .socketDir(socketDir)
Jian Lie3141542018-08-13 18:05:43 +0900352 .build();
353 }
354
355 @Override
Jian Lie6312162018-03-21 21:41:00 +0900356 public Collection<OpenstackPhyInterface> phyIntfs() {
Jian Lie6312162018-03-21 21:41:00 +0900357 if (phyIntfs == null) {
358 return new ArrayList<>();
359 }
360
361 return phyIntfs;
362 }
363
Jian Li789fadb2018-07-10 13:59:47 +0900364
365 @Override
366 public Collection<ControllerInfo> controllers() {
367 if (controllers == null) {
368 return new ArrayList<>();
369 }
370
371 return controllers;
372 }
373
daniel park796c2eb2018-03-22 17:01:51 +0900374 @Override
Daniel Parkdeefa702018-07-17 17:55:51 +0900375 public OpenstackSshAuth sshAuthInfo() {
376 return sshAuth;
377 }
378
379 @Override
daniel park796c2eb2018-03-22 17:01:51 +0900380 public PortNumber phyIntfPortNum(String providerPhysnet) {
381 Optional<OpenstackPhyInterface> openstackPhyInterface =
382 phyIntfs.stream().filter(p -> p.network().equals(providerPhysnet)).findAny();
383
384 if (openstackPhyInterface.isPresent()) {
385 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
386 Port port = deviceService.getPorts(intgBridge).stream()
387 .filter(p -> p.isEnabled() &&
388 Objects.equals(p.annotations().value(PORT_NAME), openstackPhyInterface.get().intf()))
389 .findAny().orElse(null);
390
391 return port != null ? port.number() : null;
392 } else {
393 return null;
394 }
395
396 }
Jian Li27841662018-04-14 01:59:47 +0900397
398 @Override
399 public OpenstackAuth authentication() {
400 return auth;
401 }
402
Jian Li92d42fc2018-05-25 16:23:49 +0900403 @Override
Jian Li6d410362018-08-17 09:41:08 +0900404 public String endpoint() {
405 return endpoint;
Jian Li92d42fc2018-05-25 16:23:49 +0900406 }
407
Hyunsun Moon0d457362017-06-27 17:19:41 +0900408 /**
409 * Returns new builder instance.
410 *
411 * @return openstack node builder
412 */
413 public static Builder builder() {
414 return new Builder();
415 }
416
417 /**
418 * Returns new builder instance with the given node as a default value.
419 *
420 * @param osNode openstack node
421 * @return openstack node builder
422 */
423 public static Builder from(OpenstackNode osNode) {
424 return new Builder()
425 .hostname(osNode.hostname())
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900426 .type(osNode.type())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900427 .intgBridge(osNode.intgBridge())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900428 .managementIp(osNode.managementIp())
429 .dataIp(osNode.dataIp())
430 .vlanIntf(osNode.vlanIntf())
daniel parkb18424c2018-02-05 15:43:43 +0900431 .uplinkPort(osNode.uplinkPort())
Jian Lie6312162018-03-21 21:41:00 +0900432 .state(osNode.state())
Jian Li27841662018-04-14 01:59:47 +0900433 .phyIntfs(osNode.phyIntfs())
Jian Li789fadb2018-07-10 13:59:47 +0900434 .controllers(osNode.controllers())
Jian Li92d42fc2018-05-25 16:23:49 +0900435 .authentication(osNode.authentication())
Jian Li6d410362018-08-17 09:41:08 +0900436 .endpoint(osNode.endpoint())
Daniel Park92abf312018-08-08 17:01:35 +0900437 .sshAuthInfo(osNode.sshAuthInfo())
Daniel Park7e8c4d82018-08-13 23:47:49 +0900438 .datapathType(osNode.datapathType())
439 .socketDir(osNode.socketDir());
Hyunsun Moon0d457362017-06-27 17:19:41 +0900440 }
441
Jian Li340165f2018-02-27 10:38:17 +0900442 /**
443 * A builder class for openstack Node.
444 */
Hyunsun Moon0d457362017-06-27 17:19:41 +0900445 public static final class Builder implements OpenstackNode.Builder {
446
447 private String hostname;
448 private NodeType type;
449 private DeviceId intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900450 private IpAddress managementIp;
451 private IpAddress dataIp;
452 private String vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +0900453 private String uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900454 private NodeState state;
Jian Lie6312162018-03-21 21:41:00 +0900455 private Collection<OpenstackPhyInterface> phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +0900456 private Collection<ControllerInfo> controllers;
Jian Li27841662018-04-14 01:59:47 +0900457 private OpenstackAuth auth;
Jian Li6d410362018-08-17 09:41:08 +0900458 private String endpoint;
Daniel Parkdeefa702018-07-17 17:55:51 +0900459 private OpenstackSshAuth sshAuth;
Daniel Park92abf312018-08-08 17:01:35 +0900460 private DatapathType datapathType = DatapathType.NORMAL;
Daniel Park7e8c4d82018-08-13 23:47:49 +0900461 private String socketDir;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900462
Jian Li340165f2018-02-27 10:38:17 +0900463 // private constructor not intended to use from external
Hyunsun Moon0d457362017-06-27 17:19:41 +0900464 private Builder() {
465 }
466
467 @Override
468 public DefaultOpenstackNode build() {
Jian Li340165f2018-02-27 10:38:17 +0900469 checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
470 checkArgument(type != null, NOT_NULL_MSG, "type");
Jian Li340165f2018-02-27 10:38:17 +0900471 checkArgument(state != null, NOT_NULL_MSG, "state");
Jian Li92d42fc2018-05-25 16:23:49 +0900472 checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
Hyunsun Moon0d457362017-06-27 17:19:41 +0900473
Jian Li27841662018-04-14 01:59:47 +0900474 if (type != NodeType.CONTROLLER) {
Jian Li27841662018-04-14 01:59:47 +0900475 if (dataIp == null && Strings.isNullOrEmpty(vlanIntf)) {
476 throw new IllegalArgumentException("Either data IP or VLAN interface is required");
477 }
478 } else {
Jian Li6d410362018-08-17 09:41:08 +0900479 checkArgument(endpoint != null, NOT_NULL_MSG, "endpoint URL");
Jian Li27841662018-04-14 01:59:47 +0900480 }
481
daniel parkb18424c2018-02-05 15:43:43 +0900482 if (type == NodeType.GATEWAY && uplinkPort == null) {
483 throw new IllegalArgumentException("Uplink port is required for gateway node");
Hyunsun Moon0d457362017-06-27 17:19:41 +0900484 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900485
486 return new DefaultOpenstackNode(hostname,
487 type,
488 intgBridge,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900489 managementIp,
490 dataIp,
491 vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900492 uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900493 state,
Jian Li27841662018-04-14 01:59:47 +0900494 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900495 controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900496 auth,
Jian Li6d410362018-08-17 09:41:08 +0900497 endpoint,
Daniel Park92abf312018-08-08 17:01:35 +0900498 sshAuth,
Daniel Park7e8c4d82018-08-13 23:47:49 +0900499 datapathType,
500 socketDir);
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
Jian Li27841662018-04-14 01:59:47 +0900566 public Builder authentication(OpenstackAuth auth) {
567 this.auth = auth;
568 return this;
569 }
Jian Li92d42fc2018-05-25 16:23:49 +0900570
571 @Override
Jian Li6d410362018-08-17 09:41:08 +0900572 public Builder endpoint(String endpoint) {
573 this.endpoint = endpoint;
Jian Li92d42fc2018-05-25 16:23:49 +0900574 return this;
575 }
Daniel Parkdeefa702018-07-17 17:55:51 +0900576
577 @Override
578 public Builder sshAuthInfo(OpenstackSshAuth sshAuth) {
579 this.sshAuth = sshAuth;
580 return this;
581 }
Daniel Park92abf312018-08-08 17:01:35 +0900582
583 @Override
584 public Builder datapathType(DatapathType datapathType) {
585 this.datapathType = datapathType;
586 return this;
587 }
Daniel Park7e8c4d82018-08-13 23:47:49 +0900588
589 @Override
590 public Builder socketDir(String socketDir) {
591 this.socketDir = socketDir;
592 return this;
593 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900594 }
595}
596