blob: 43a4535e89b47bc7c481cd9cc327fd11ff7893ae [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;
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 Li6d410362018-08-17 09:41:08 +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,
Jian Li6d410362018-08-17 09:41:08 +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 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;
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) &&
Jian Li6d410362018-08-17 09:41:08 +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,
Jian Li6d410362018-08-17 09:41:08 +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 Li6d410362018-08-17 09:41:08 +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 Li6d410362018-08-17 09:41:08 +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)
Jian Li6d410362018-08-17 09:41:08 +0900336 .endpoint(endpoint)
Jian Lie3141542018-08-13 18:05:43 +0900337 .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
Jian Li6d410362018-08-17 09:41:08 +0900392 public String endpoint() {
393 return endpoint;
Jian Li92d42fc2018-05-25 16:23:49 +0900394 }
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())
Jian Li6d410362018-08-17 09:41:08 +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 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;
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 Li6d410362018-08-17 09:41:08 +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,
Jian Li6d410362018-08-17 09:41:08 +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
Jian Li6d410362018-08-17 09:41:08 +0900557 public Builder endpoint(String endpoint) {
558 this.endpoint = endpoint;
Jian Li92d42fc2018-05-25 16:23:49 +0900559 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