blob: a7ee99955b60f9f2e04b7e22467879f85b16d556 [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 Li92d42fc2018-05-25 16:23:49 +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;
Hyunsun Moon0d457362017-06-27 17:19:41 +090062
Jian Li340165f2018-02-27 10:38:17 +090063 private static final String NOT_NULL_MSG = "Node % cannot be null";
64
daniel parkb18424c2018-02-05 15:43:43 +090065 private static final String OVSDB = "ovsdb:";
66
Jian Li340165f2018-02-27 10:38:17 +090067 /**
68 * A default constructor of Openstack Node.
69 *
70 * @param hostname hostname
71 * @param type node type
72 * @param intgBridge integration bridge
73 * @param managementIp management IP address
74 * @param dataIp data IP address
75 * @param vlanIntf VLAN interface
76 * @param uplinkPort uplink port name
77 * @param state node state
Jian Lie6312162018-03-21 21:41:00 +090078 * @param phyIntfs physical interfaces
Jian Li789fadb2018-07-10 13:59:47 +090079 * @param controllers customized controllers
Jian Li27841662018-04-14 01:59:47 +090080 * @param auth keystone authentication info
Jian Li92d42fc2018-05-25 16:23:49 +090081 * @param endPoint openstack endpoint URL
Daniel Parkdeefa702018-07-17 17:55:51 +090082 * @param sshAuth ssh authentication info
Daniel Park92abf312018-08-08 17:01:35 +090083 * @param datapathType data path type
Jian Li340165f2018-02-27 10:38:17 +090084 */
daniel parkb18424c2018-02-05 15:43:43 +090085 protected DefaultOpenstackNode(String hostname, NodeType type,
86 DeviceId intgBridge,
87 IpAddress managementIp,
88 IpAddress dataIp,
89 String vlanIntf,
90 String uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +090091 NodeState state,
Jian Li27841662018-04-14 01:59:47 +090092 Collection<OpenstackPhyInterface> phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +090093 Collection<ControllerInfo> controllers,
Jian Li92d42fc2018-05-25 16:23:49 +090094 OpenstackAuth auth,
Daniel Parkdeefa702018-07-17 17:55:51 +090095 String endPoint,
Daniel Park92abf312018-08-08 17:01:35 +090096 OpenstackSshAuth sshAuth,
97 DatapathType datapathType) {
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 Li92d42fc2018-05-25 16:23:49 +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;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900112 }
113
114 @Override
115 public String hostname() {
116 return hostname;
117 }
118
119 @Override
120 public NodeType type() {
121 return type;
122 }
123
124 @Override
125 public DeviceId ovsdb() {
daniel parkb18424c2018-02-05 15:43:43 +0900126 return DeviceId.deviceId(OVSDB + managementIp().toString());
Hyunsun Moon0d457362017-06-27 17:19:41 +0900127 }
128
129 @Override
130 public DeviceId intgBridge() {
131 return intgBridge;
132 }
133
134 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900135 public IpAddress managementIp() {
136 return managementIp;
137 }
138
139 @Override
140 public IpAddress dataIp() {
141 return dataIp;
142 }
143
144 @Override
145 public String vlanIntf() {
146 return vlanIntf;
147 }
148
149 @Override
daniel parkb18424c2018-02-05 15:43:43 +0900150 public String uplinkPort() {
151 return uplinkPort;
152 }
153
154 @Override
Daniel Park92abf312018-08-08 17:01:35 +0900155 public DatapathType datapathType() {
156 return datapathType;
157 }
158
159 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900160 public NodeState state() {
161 return state;
162 }
163
164 @Override
165 public GroupKey gatewayGroupKey(NetworkMode mode) {
166 return new DefaultGroupKey(intgBridge.toString().concat(mode.name()).getBytes());
167 }
168
169 @Override
daniel parkb5817102018-02-15 00:18:51 +0900170 public PortNumber uplinkPortNum() {
171 if (uplinkPort == null) {
172 return null;
173 }
174
175 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
176 Port port = deviceService.getPorts(intgBridge).stream()
177 .filter(p -> p.isEnabled() &&
178 Objects.equals(p.annotations().value(PORT_NAME), uplinkPort))
179 .findAny().orElse(null);
180
181 return port != null ? port.number() : null;
182
183 }
184 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900185 public PortNumber tunnelPortNum() {
186 if (dataIp == null) {
187 return null;
188 }
189 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
190 Port port = deviceService.getPorts(intgBridge).stream()
191 .filter(p -> p.isEnabled() &&
192 Objects.equals(p.annotations().value(PORT_NAME), DEFAULT_TUNNEL))
193 .findAny().orElse(null);
194 return port != null ? port.number() : null;
195 }
196
197 @Override
198 public PortNumber vlanPortNum() {
199 if (vlanIntf == null) {
200 return null;
201 }
202 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
203 Port port = deviceService.getPorts(intgBridge).stream()
204 .filter(p -> p.isEnabled() &&
205 Objects.equals(p.annotations().value(PORT_NAME), vlanIntf))
206 .findAny().orElse(null);
207 return port != null ? port.number() : null;
208 }
209
210 @Override
211 public PortNumber patchPortNum() {
212 if (type == NodeType.COMPUTE) {
213 return null;
214 }
215 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
216 Port port = deviceService.getPorts(intgBridge).stream()
217 .filter(p -> p.isEnabled() &&
218 Objects.equals(p.annotations().value(PORT_NAME), PATCH_INTG_BRIDGE))
219 .findAny().orElse(null);
220 return port != null ? port.number() : null;
221 }
222
223 @Override
224 public MacAddress vlanPortMac() {
225 if (vlanIntf == null) {
226 return null;
227 }
228 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
229 Port port = deviceService.getPorts(intgBridge).stream()
230 .filter(p -> p.annotations().value(PORT_NAME).equals(vlanIntf))
231 .findAny().orElse(null);
232 return port != null ? MacAddress.valueOf(port.annotations().value(PORT_MAC)) : null;
233 }
234
235 @Override
236 public GroupId gatewayGroupId(NetworkMode mode) {
237 return new GroupId(intgBridge.toString().concat(mode.name()).hashCode());
238 }
239
240 @Override
241 public boolean equals(Object obj) {
242 if (this == obj) {
243 return true;
244 }
245
246 if (obj instanceof DefaultOpenstackNode) {
247 DefaultOpenstackNode that = (DefaultOpenstackNode) obj;
Jian Li5afbea42018-02-28 10:37:03 +0900248 return Objects.equals(hostname, that.hostname) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900249 Objects.equals(type, that.type) &&
250 Objects.equals(intgBridge, that.intgBridge) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900251 Objects.equals(managementIp, that.managementIp) &&
252 Objects.equals(dataIp, that.dataIp) &&
daniel parkb18424c2018-02-05 15:43:43 +0900253 Objects.equals(uplinkPort, that.uplinkPort) &&
Jian Lie6312162018-03-21 21:41:00 +0900254 Objects.equals(vlanIntf, that.vlanIntf) &&
Jian Li27841662018-04-14 01:59:47 +0900255 Objects.equals(phyIntfs, that.phyIntfs) &&
Jian Li789fadb2018-07-10 13:59:47 +0900256 Objects.equals(controllers, that.controllers) &&
Jian Li92d42fc2018-05-25 16:23:49 +0900257 Objects.equals(auth, that.auth) &&
Daniel Parkdeefa702018-07-17 17:55:51 +0900258 Objects.equals(endPoint, that.endPoint) &&
Daniel Park92abf312018-08-08 17:01:35 +0900259 Objects.equals(sshAuth, that.sshAuth) &&
260 Objects.equals(datapathType, that.datapathType);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900261 }
262 return false;
263 }
264
265 @Override
266 public int hashCode() {
267 return Objects.hash(hostname,
268 type,
269 intgBridge,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900270 managementIp,
271 dataIp,
daniel parkb18424c2018-02-05 15:43:43 +0900272 vlanIntf,
Jian Lie6312162018-03-21 21:41:00 +0900273 uplinkPort,
Jian Li27841662018-04-14 01:59:47 +0900274 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900275 controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900276 auth,
Daniel Parkdeefa702018-07-17 17:55:51 +0900277 endPoint,
Daniel Park92abf312018-08-08 17:01:35 +0900278 sshAuth,
279 datapathType);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900280 }
281
282 @Override
283 public String toString() {
284 return MoreObjects.toStringHelper(getClass())
285 .add("hostname", hostname)
286 .add("type", type)
287 .add("integrationBridge", intgBridge)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900288 .add("managementIp", managementIp)
289 .add("dataIp", dataIp)
290 .add("vlanIntf", vlanIntf)
daniel parkb18424c2018-02-05 15:43:43 +0900291 .add("uplinkPort", uplinkPort)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900292 .add("state", state)
Jian Lie6312162018-03-21 21:41:00 +0900293 .add("phyIntfs", phyIntfs)
Jian Li789fadb2018-07-10 13:59:47 +0900294 .add("controllers", controllers)
Jian Li27841662018-04-14 01:59:47 +0900295 .add("auth", auth)
Jian Li92d42fc2018-05-25 16:23:49 +0900296 .add("endpoint", endPoint)
Daniel Parkdeefa702018-07-17 17:55:51 +0900297 .add("sshAuth", sshAuth)
Daniel Park92abf312018-08-08 17:01:35 +0900298 .add("datapathType", datapathType)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900299 .toString();
300 }
301
302 @Override
303 public OpenstackNode updateState(NodeState newState) {
304 return new Builder()
305 .type(type)
306 .hostname(hostname)
307 .intgBridge(intgBridge)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900308 .managementIp(managementIp)
309 .dataIp(dataIp)
310 .vlanIntf(vlanIntf)
daniel parkb18424c2018-02-05 15:43:43 +0900311 .uplinkPort(uplinkPort)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900312 .state(newState)
Jian Lie6312162018-03-21 21:41:00 +0900313 .phyIntfs(phyIntfs)
Jian Li789fadb2018-07-10 13:59:47 +0900314 .controllers(controllers)
Jian Li27841662018-04-14 01:59:47 +0900315 .authentication(auth)
Jian Li92d42fc2018-05-25 16:23:49 +0900316 .endPoint(endPoint)
Daniel Parkdeefa702018-07-17 17:55:51 +0900317 .sshAuthInfo(sshAuth)
Daniel Park92abf312018-08-08 17:01:35 +0900318 .datapathType(datapathType)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900319 .build();
320 }
321
Jian Lie6312162018-03-21 21:41:00 +0900322 @Override
Jian Lie3141542018-08-13 18:05:43 +0900323 public OpenstackNode updateIntbridge(DeviceId newIntgBridge) {
324 return new Builder()
325 .type(type)
326 .hostname(hostname)
327 .intgBridge(newIntgBridge)
328 .managementIp(managementIp)
329 .dataIp(dataIp)
330 .vlanIntf(vlanIntf)
331 .uplinkPort(uplinkPort)
332 .state(state)
333 .phyIntfs(phyIntfs)
334 .controllers(controllers)
335 .authentication(auth)
336 .endPoint(endPoint)
337 .sshAuthInfo(sshAuth)
338 .datapathType(datapathType)
339 .build();
340 }
341
342 @Override
Jian Lie6312162018-03-21 21:41:00 +0900343 public Collection<OpenstackPhyInterface> phyIntfs() {
344
345 if (phyIntfs == null) {
346 return new ArrayList<>();
347 }
348
349 return phyIntfs;
350 }
351
Jian Li789fadb2018-07-10 13:59:47 +0900352
353 @Override
354 public Collection<ControllerInfo> controllers() {
355 if (controllers == null) {
356 return new ArrayList<>();
357 }
358
359 return controllers;
360 }
361
daniel park796c2eb2018-03-22 17:01:51 +0900362 @Override
Daniel Parkdeefa702018-07-17 17:55:51 +0900363 public OpenstackSshAuth sshAuthInfo() {
364 return sshAuth;
365 }
366
367 @Override
daniel park796c2eb2018-03-22 17:01:51 +0900368 public PortNumber phyIntfPortNum(String providerPhysnet) {
369 Optional<OpenstackPhyInterface> openstackPhyInterface =
370 phyIntfs.stream().filter(p -> p.network().equals(providerPhysnet)).findAny();
371
372 if (openstackPhyInterface.isPresent()) {
373 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
374 Port port = deviceService.getPorts(intgBridge).stream()
375 .filter(p -> p.isEnabled() &&
376 Objects.equals(p.annotations().value(PORT_NAME), openstackPhyInterface.get().intf()))
377 .findAny().orElse(null);
378
379 return port != null ? port.number() : null;
380 } else {
381 return null;
382 }
383
384 }
Jian Li27841662018-04-14 01:59:47 +0900385
386 @Override
387 public OpenstackAuth authentication() {
388 return auth;
389 }
390
Jian Li92d42fc2018-05-25 16:23:49 +0900391 @Override
392 public String endPoint() {
393 return endPoint;
394 }
395
Hyunsun Moon0d457362017-06-27 17:19:41 +0900396 /**
397 * Returns new builder instance.
398 *
399 * @return openstack node builder
400 */
401 public static Builder builder() {
402 return new Builder();
403 }
404
405 /**
406 * Returns new builder instance with the given node as a default value.
407 *
408 * @param osNode openstack node
409 * @return openstack node builder
410 */
411 public static Builder from(OpenstackNode osNode) {
412 return new Builder()
413 .hostname(osNode.hostname())
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900414 .type(osNode.type())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900415 .intgBridge(osNode.intgBridge())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900416 .managementIp(osNode.managementIp())
417 .dataIp(osNode.dataIp())
418 .vlanIntf(osNode.vlanIntf())
daniel parkb18424c2018-02-05 15:43:43 +0900419 .uplinkPort(osNode.uplinkPort())
Jian Lie6312162018-03-21 21:41:00 +0900420 .state(osNode.state())
Jian Li27841662018-04-14 01:59:47 +0900421 .phyIntfs(osNode.phyIntfs())
Jian Li789fadb2018-07-10 13:59:47 +0900422 .controllers(osNode.controllers())
Jian Li92d42fc2018-05-25 16:23:49 +0900423 .authentication(osNode.authentication())
Daniel Parkdeefa702018-07-17 17:55:51 +0900424 .endPoint(osNode.endPoint())
Daniel Park92abf312018-08-08 17:01:35 +0900425 .sshAuthInfo(osNode.sshAuthInfo())
426 .datapathType(osNode.datapathType());
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 Li92d42fc2018-05-25 16:23:49 +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;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900448
Jian Li340165f2018-02-27 10:38:17 +0900449 // private constructor not intended to use from external
Hyunsun Moon0d457362017-06-27 17:19:41 +0900450 private Builder() {
451 }
452
453 @Override
454 public DefaultOpenstackNode build() {
Jian Li340165f2018-02-27 10:38:17 +0900455 checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
456 checkArgument(type != null, NOT_NULL_MSG, "type");
Jian Li340165f2018-02-27 10:38:17 +0900457 checkArgument(state != null, NOT_NULL_MSG, "state");
Jian Li92d42fc2018-05-25 16:23:49 +0900458 checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
Hyunsun Moon0d457362017-06-27 17:19:41 +0900459
Jian Li27841662018-04-14 01:59:47 +0900460 if (type != NodeType.CONTROLLER) {
Jian Li27841662018-04-14 01:59:47 +0900461 if (dataIp == null && Strings.isNullOrEmpty(vlanIntf)) {
462 throw new IllegalArgumentException("Either data IP or VLAN interface is required");
463 }
464 } else {
Jian Li92d42fc2018-05-25 16:23:49 +0900465 checkArgument(endPoint != null, NOT_NULL_MSG, "endpoint URL");
Jian Li27841662018-04-14 01:59:47 +0900466 }
467
daniel parkb18424c2018-02-05 15:43:43 +0900468 if (type == NodeType.GATEWAY && uplinkPort == null) {
469 throw new IllegalArgumentException("Uplink port is required for gateway node");
Hyunsun Moon0d457362017-06-27 17:19:41 +0900470 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900471
472 return new DefaultOpenstackNode(hostname,
473 type,
474 intgBridge,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900475 managementIp,
476 dataIp,
477 vlanIntf,
daniel parkb18424c2018-02-05 15:43:43 +0900478 uplinkPort,
Jian Lie6312162018-03-21 21:41:00 +0900479 state,
Jian Li27841662018-04-14 01:59:47 +0900480 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900481 controllers,
Jian Li92d42fc2018-05-25 16:23:49 +0900482 auth,
Daniel Parkdeefa702018-07-17 17:55:51 +0900483 endPoint,
Daniel Park92abf312018-08-08 17:01:35 +0900484 sshAuth,
485 datapathType);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900486 }
487
488 @Override
489 public Builder hostname(String hostname) {
490 if (!Strings.isNullOrEmpty(hostname)) {
491 this.hostname = hostname;
492 }
493 return this;
494 }
495
496 @Override
497 public Builder type(NodeType type) {
498 this.type = type;
499 return this;
500 }
501
502 @Override
503 public Builder intgBridge(DeviceId intgBridge) {
504 this.intgBridge = intgBridge;
505 return this;
506 }
507
508 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900509 public Builder managementIp(IpAddress managementIp) {
510 this.managementIp = managementIp;
511 return this;
512 }
513
514 @Override
515 public Builder dataIp(IpAddress dataIp) {
516 this.dataIp = dataIp;
517 return this;
518 }
519
520 @Override
521 public Builder vlanIntf(String vlanIntf) {
522 this.vlanIntf = vlanIntf;
523 return this;
524 }
525
526 @Override
daniel parkb18424c2018-02-05 15:43:43 +0900527 public Builder uplinkPort(String uplinkPort) {
528 this.uplinkPort = uplinkPort;
529 return this;
530 }
531
532 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900533 public Builder state(NodeState state) {
534 this.state = state;
535 return this;
536 }
Jian Lie6312162018-03-21 21:41:00 +0900537
538 @Override
539 public Builder phyIntfs(Collection<OpenstackPhyInterface> phyIntfs) {
540 this.phyIntfs = phyIntfs;
541 return this;
542 }
Jian Li27841662018-04-14 01:59:47 +0900543
544 @Override
Jian Li789fadb2018-07-10 13:59:47 +0900545 public Builder controllers(Collection<ControllerInfo> controllers) {
546 this.controllers = controllers;
547 return this;
548 }
549
550 @Override
Jian Li27841662018-04-14 01:59:47 +0900551 public Builder authentication(OpenstackAuth auth) {
552 this.auth = auth;
553 return this;
554 }
Jian Li92d42fc2018-05-25 16:23:49 +0900555
556 @Override
557 public Builder endPoint(String endPoint) {
558 this.endPoint = endPoint;
559 return this;
560 }
Daniel Parkdeefa702018-07-17 17:55:51 +0900561
562 @Override
563 public Builder sshAuthInfo(OpenstackSshAuth sshAuth) {
564 this.sshAuth = sshAuth;
565 return this;
566 }
Daniel Park92abf312018-08-08 17:01:35 +0900567
568 @Override
569 public Builder datapathType(DatapathType datapathType) {
570 this.datapathType = datapathType;
571 return this;
572 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900573 }
574}
575