blob: 0d72a2b73b5226beb604a673b0b64bfed5645b4d [file] [log] [blame]
Hyunsun Moon0d457362017-06-27 17:19:41 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Hyunsun Moon0d457362017-06-27 17:19:41 +09003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Jian Li5a38ab62018-07-02 22:34:11 +090016package org.onosproject.openstacknode.api;
Hyunsun Moon0d457362017-06-27 17:19:41 +090017
18import com.google.common.base.MoreObjects;
19import com.google.common.base.Strings;
20import org.onlab.osgi.DefaultServiceDirectory;
21import org.onlab.packet.IpAddress;
22import org.onlab.packet.MacAddress;
Hyunsun Moon0d457362017-06-27 17:19:41 +090023import org.onosproject.net.DeviceId;
24import org.onosproject.net.Port;
25import org.onosproject.net.PortNumber;
Jian Li789fadb2018-07-10 13:59:47 +090026import org.onosproject.net.behaviour.ControllerInfo;
Hyunsun Moon0d457362017-06-27 17:19:41 +090027import org.onosproject.net.device.DeviceService;
Daniel Parkd02d7bd2018-08-23 23:04:31 +090028import org.onosproject.openstacknode.api.DpdkConfig.DatapathType;
Hyunsun Moon0d457362017-06-27 17:19:41 +090029
Jian Lie6312162018-03-21 21:41:00 +090030import java.util.ArrayList;
31import java.util.Collection;
Hyunsun Moon0d457362017-06-27 17:19:41 +090032import java.util.Objects;
33
34import static com.google.common.base.Preconditions.checkArgument;
35import static org.onosproject.net.AnnotationKeys.PORT_MAC;
36import static org.onosproject.net.AnnotationKeys.PORT_NAME;
Jian Li621f73c2018-12-15 01:49:22 +090037import static org.onosproject.openstacknode.api.Constants.GENEVE_TUNNEL;
Jian Li2d68c192018-12-13 15:52:59 +090038import static org.onosproject.openstacknode.api.Constants.GRE_TUNNEL;
Hyunsun Moon0d457362017-06-27 17:19:41 +090039import static org.onosproject.openstacknode.api.Constants.PATCH_INTG_BRIDGE;
Jian Lidaa91152019-09-08 00:35:11 +090040import static org.onosproject.openstacknode.api.Constants.VXLAN_TUNNEL;
Hyunsun Moon0d457362017-06-27 17:19:41 +090041
42/**
43 * Representation of a openstack node.
44 */
Hyunsun Moon090d77d2017-07-05 17:48:37 +090045public class DefaultOpenstackNode implements OpenstackNode {
Hyunsun Moon0d457362017-06-27 17:19:41 +090046
47 private final String hostname;
48 private final NodeType type;
49 private final DeviceId intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +090050 private final IpAddress managementIp;
51 private final IpAddress dataIp;
52 private final String vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +090053 private final String uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +090054 private final NodeState state;
Jian Lie6312162018-03-21 21:41:00 +090055 private final Collection<OpenstackPhyInterface> phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +090056 private final Collection<ControllerInfo> controllers;
Daniel Parkdeefa702018-07-17 17:55:51 +090057 private final OpenstackSshAuth sshAuth;
Daniel Parkd02d7bd2018-08-23 23:04:31 +090058 private final DpdkConfig dpdkConfig;
Jian Lic704b672018-09-04 18:52:53 +090059 private final KeystoneConfig keystoneConfig;
60 private final NeutronConfig neutronConfig;
Hyunsun Moon0d457362017-06-27 17:19:41 +090061
Jian Li340165f2018-02-27 10:38:17 +090062 private static final String NOT_NULL_MSG = "Node % cannot be null";
63
daniel parkb18424c2018-02-05 15:43:43 +090064 private static final String OVSDB = "ovsdb:";
65
Jian Li340165f2018-02-27 10:38:17 +090066 /**
67 * A default constructor of Openstack Node.
68 *
Jian Lic704b672018-09-04 18:52:53 +090069 * @param hostname hostname
70 * @param type node type
71 * @param intgBridge integration bridge
72 * @param managementIp management IP address
73 * @param dataIp data IP address
74 * @param vlanIntf VLAN interface
75 * @param uplinkPort uplink port name
76 * @param state node state
77 * @param phyIntfs physical interfaces
78 * @param controllers customized controllers
79 * @param sshAuth ssh authentication info
80 * @param dpdkConfig dpdk config
81 * @param keystoneConfig keystone config
82 * @param neutronConfig neutron config
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,
Daniel Park92abf312018-08-08 17:01:35 +090093 OpenstackSshAuth sshAuth,
Jian Lic704b672018-09-04 18:52:53 +090094 DpdkConfig dpdkConfig,
95 KeystoneConfig keystoneConfig,
96 NeutronConfig neutronConfig) {
Hyunsun Moon0d457362017-06-27 17:19:41 +090097 this.hostname = hostname;
98 this.type = type;
99 this.intgBridge = intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900100 this.managementIp = managementIp;
101 this.dataIp = dataIp;
102 this.vlanIntf = vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +0900103 this.uplinkPort = uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900104 this.state = state;
Jian Lie6312162018-03-21 21:41:00 +0900105 this.phyIntfs = phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +0900106 this.controllers = controllers;
Daniel Parkdeefa702018-07-17 17:55:51 +0900107 this.sshAuth = sshAuth;
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900108 this.dpdkConfig = dpdkConfig;
Jian Lic704b672018-09-04 18:52:53 +0900109 this.keystoneConfig = keystoneConfig;
110 this.neutronConfig = neutronConfig;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900111 }
112
113 @Override
114 public String hostname() {
115 return hostname;
116 }
117
118 @Override
119 public NodeType type() {
120 return type;
121 }
122
123 @Override
124 public DeviceId ovsdb() {
daniel parkb18424c2018-02-05 15:43:43 +0900125 return DeviceId.deviceId(OVSDB + managementIp().toString());
Hyunsun Moon0d457362017-06-27 17:19:41 +0900126 }
127
128 @Override
129 public DeviceId intgBridge() {
130 return intgBridge;
131 }
132
133 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900134 public IpAddress managementIp() {
135 return managementIp;
136 }
137
138 @Override
139 public IpAddress dataIp() {
140 return dataIp;
141 }
142
143 @Override
144 public String vlanIntf() {
145 return vlanIntf;
146 }
147
148 @Override
daniel parkb18424c2018-02-05 15:43:43 +0900149 public String uplinkPort() {
150 return uplinkPort;
151 }
152
153 @Override
Daniel Park92abf312018-08-08 17:01:35 +0900154 public DatapathType datapathType() {
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900155 if (dpdkConfig == null) {
156 return DatapathType.NORMAL;
157 }
158 return dpdkConfig.datapathType();
Daniel Park92abf312018-08-08 17:01:35 +0900159 }
160
161 @Override
Daniel Park7e8c4d82018-08-13 23:47:49 +0900162 public String socketDir() {
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900163 if (dpdkConfig == null) {
164 return null;
165 }
166 return dpdkConfig.socketDir();
Daniel Park7e8c4d82018-08-13 23:47:49 +0900167 }
168
169 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900170 public NodeState state() {
171 return state;
172 }
173
174 @Override
daniel parkb5817102018-02-15 00:18:51 +0900175 public PortNumber uplinkPortNum() {
176 if (uplinkPort == null) {
177 return null;
178 }
179
180 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
181 Port port = deviceService.getPorts(intgBridge).stream()
182 .filter(p -> p.isEnabled() &&
183 Objects.equals(p.annotations().value(PORT_NAME), uplinkPort))
184 .findAny().orElse(null);
185
186 return port != null ? port.number() : null;
187
188 }
Jian Li2d68c192018-12-13 15:52:59 +0900189
daniel parkb5817102018-02-15 00:18:51 +0900190 @Override
Jian Li2d68c192018-12-13 15:52:59 +0900191 public PortNumber vxlanTunnelPortNum() {
192 return tunnelPortNum(VXLAN_TUNNEL);
193 }
194
195 @Override
Jian Li621f73c2018-12-15 01:49:22 +0900196 public PortNumber geneveTunnelPortNum() {
197 return tunnelPortNum(GENEVE_TUNNEL);
198 }
199
200 @Override
Jian Li2d68c192018-12-13 15:52:59 +0900201 public PortNumber greTunnelPortNum() {
202 return tunnelPortNum(GRE_TUNNEL);
203
204 }
205
206 private PortNumber tunnelPortNum(String tunnelType) {
Hyunsun Moon0d457362017-06-27 17:19:41 +0900207 if (dataIp == null) {
208 return null;
209 }
210 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
211 Port port = deviceService.getPorts(intgBridge).stream()
212 .filter(p -> p.isEnabled() &&
Jian Li2d68c192018-12-13 15:52:59 +0900213 Objects.equals(p.annotations().value(PORT_NAME), tunnelType))
Hyunsun Moon0d457362017-06-27 17:19:41 +0900214 .findAny().orElse(null);
215 return port != null ? port.number() : null;
216 }
217
218 @Override
219 public PortNumber vlanPortNum() {
220 if (vlanIntf == null) {
221 return null;
222 }
223 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
224 Port port = deviceService.getPorts(intgBridge).stream()
225 .filter(p -> p.isEnabled() &&
226 Objects.equals(p.annotations().value(PORT_NAME), vlanIntf))
227 .findAny().orElse(null);
228 return port != null ? port.number() : null;
229 }
230
231 @Override
232 public PortNumber patchPortNum() {
233 if (type == NodeType.COMPUTE) {
234 return null;
235 }
236 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
237 Port port = deviceService.getPorts(intgBridge).stream()
238 .filter(p -> p.isEnabled() &&
239 Objects.equals(p.annotations().value(PORT_NAME), PATCH_INTG_BRIDGE))
240 .findAny().orElse(null);
241 return port != null ? port.number() : null;
242 }
243
244 @Override
245 public MacAddress vlanPortMac() {
246 if (vlanIntf == null) {
247 return null;
248 }
249 DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
250 Port port = deviceService.getPorts(intgBridge).stream()
251 .filter(p -> p.annotations().value(PORT_NAME).equals(vlanIntf))
252 .findAny().orElse(null);
253 return port != null ? MacAddress.valueOf(port.annotations().value(PORT_MAC)) : null;
254 }
255
256 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900257 public boolean equals(Object obj) {
258 if (this == obj) {
259 return true;
260 }
261
262 if (obj instanceof DefaultOpenstackNode) {
263 DefaultOpenstackNode that = (DefaultOpenstackNode) obj;
Jian Li5afbea42018-02-28 10:37:03 +0900264 return Objects.equals(hostname, that.hostname) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900265 Objects.equals(type, that.type) &&
266 Objects.equals(intgBridge, that.intgBridge) &&
Hyunsun Moon0d457362017-06-27 17:19:41 +0900267 Objects.equals(managementIp, that.managementIp) &&
268 Objects.equals(dataIp, that.dataIp) &&
daniel parkb18424c2018-02-05 15:43:43 +0900269 Objects.equals(uplinkPort, that.uplinkPort) &&
Jian Lie6312162018-03-21 21:41:00 +0900270 Objects.equals(vlanIntf, that.vlanIntf) &&
Jian Li27841662018-04-14 01:59:47 +0900271 Objects.equals(phyIntfs, that.phyIntfs) &&
Jian Li789fadb2018-07-10 13:59:47 +0900272 Objects.equals(controllers, that.controllers) &&
Daniel Park92abf312018-08-08 17:01:35 +0900273 Objects.equals(sshAuth, that.sshAuth) &&
Jian Lic704b672018-09-04 18:52:53 +0900274 Objects.equals(dpdkConfig, that.dpdkConfig) &&
275 Objects.equals(keystoneConfig, that.keystoneConfig) &&
276 Objects.equals(neutronConfig, that.neutronConfig);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900277 }
278 return false;
279 }
280
281 @Override
282 public int hashCode() {
283 return Objects.hash(hostname,
284 type,
285 intgBridge,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900286 managementIp,
287 dataIp,
daniel parkb18424c2018-02-05 15:43:43 +0900288 vlanIntf,
Jian Lie6312162018-03-21 21:41:00 +0900289 uplinkPort,
Jian Li27841662018-04-14 01:59:47 +0900290 phyIntfs,
Jian Li789fadb2018-07-10 13:59:47 +0900291 controllers,
Daniel Park92abf312018-08-08 17:01:35 +0900292 sshAuth,
Jian Lic704b672018-09-04 18:52:53 +0900293 dpdkConfig,
294 keystoneConfig,
295 neutronConfig);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900296 }
297
298 @Override
299 public String toString() {
300 return MoreObjects.toStringHelper(getClass())
301 .add("hostname", hostname)
302 .add("type", type)
303 .add("integrationBridge", intgBridge)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900304 .add("managementIp", managementIp)
305 .add("dataIp", dataIp)
306 .add("vlanIntf", vlanIntf)
daniel parkb18424c2018-02-05 15:43:43 +0900307 .add("uplinkPort", uplinkPort)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900308 .add("state", state)
Jian Lie6312162018-03-21 21:41:00 +0900309 .add("phyIntfs", phyIntfs)
Jian Li789fadb2018-07-10 13:59:47 +0900310 .add("controllers", controllers)
Daniel Parkdeefa702018-07-17 17:55:51 +0900311 .add("sshAuth", sshAuth)
Jian Lic704b672018-09-04 18:52:53 +0900312 .add("dpdkConfig", dpdkConfig)
313 .add("keystoneConfig", keystoneConfig)
314 .add("neutronConfig", neutronConfig)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900315 .toString();
316 }
317
318 @Override
319 public OpenstackNode updateState(NodeState newState) {
320 return new Builder()
321 .type(type)
322 .hostname(hostname)
323 .intgBridge(intgBridge)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900324 .managementIp(managementIp)
325 .dataIp(dataIp)
326 .vlanIntf(vlanIntf)
daniel parkb18424c2018-02-05 15:43:43 +0900327 .uplinkPort(uplinkPort)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900328 .state(newState)
Jian Lie6312162018-03-21 21:41:00 +0900329 .phyIntfs(phyIntfs)
Jian Li789fadb2018-07-10 13:59:47 +0900330 .controllers(controllers)
Daniel Parkdeefa702018-07-17 17:55:51 +0900331 .sshAuthInfo(sshAuth)
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900332 .dpdkConfig(dpdkConfig)
Jian Lic704b672018-09-04 18:52:53 +0900333 .keystoneConfig(keystoneConfig)
334 .neutronConfig(neutronConfig)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900335 .build();
336 }
337
Jian Lie6312162018-03-21 21:41:00 +0900338 @Override
Jian Lie3141542018-08-13 18:05:43 +0900339 public OpenstackNode updateIntbridge(DeviceId newIntgBridge) {
340 return new Builder()
341 .type(type)
342 .hostname(hostname)
343 .intgBridge(newIntgBridge)
344 .managementIp(managementIp)
345 .dataIp(dataIp)
346 .vlanIntf(vlanIntf)
347 .uplinkPort(uplinkPort)
348 .state(state)
349 .phyIntfs(phyIntfs)
Jian Lie3141542018-08-13 18:05:43 +0900350 .sshAuthInfo(sshAuth)
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900351 .dpdkConfig(dpdkConfig)
Jian Lic704b672018-09-04 18:52:53 +0900352 .keystoneConfig(keystoneConfig)
353 .neutronConfig(neutronConfig)
Jian Li55276912018-10-08 12:58:54 +0900354 .controllers(controllers)
Jian Lie3141542018-08-13 18:05:43 +0900355 .build();
356 }
357
358 @Override
Jian Lie6312162018-03-21 21:41:00 +0900359 public Collection<OpenstackPhyInterface> phyIntfs() {
Jian Lie6312162018-03-21 21:41:00 +0900360 if (phyIntfs == null) {
361 return new ArrayList<>();
362 }
363
364 return phyIntfs;
365 }
366
Jian Li789fadb2018-07-10 13:59:47 +0900367
368 @Override
369 public Collection<ControllerInfo> controllers() {
370 if (controllers == null) {
371 return new ArrayList<>();
372 }
373
374 return controllers;
375 }
376
daniel park796c2eb2018-03-22 17:01:51 +0900377 @Override
Daniel Parkdeefa702018-07-17 17:55:51 +0900378 public OpenstackSshAuth sshAuthInfo() {
379 return sshAuth;
380 }
381
382 @Override
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900383 public DpdkConfig dpdkConfig() {
384 return dpdkConfig;
385 }
386
387 @Override
Jian Lic704b672018-09-04 18:52:53 +0900388 public KeystoneConfig keystoneConfig() {
389 return keystoneConfig;
390 }
391
392 @Override
393 public NeutronConfig neutronConfig() {
394 return neutronConfig;
395 }
396
Hyunsun Moon0d457362017-06-27 17:19:41 +0900397 /**
398 * Returns new builder instance.
399 *
400 * @return openstack node builder
401 */
402 public static Builder builder() {
403 return new Builder();
404 }
405
406 /**
407 * Returns new builder instance with the given node as a default value.
408 *
409 * @param osNode openstack node
410 * @return openstack node builder
411 */
412 public static Builder from(OpenstackNode osNode) {
413 return new Builder()
414 .hostname(osNode.hostname())
Hyunsun Moon090d77d2017-07-05 17:48:37 +0900415 .type(osNode.type())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900416 .intgBridge(osNode.intgBridge())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900417 .managementIp(osNode.managementIp())
418 .dataIp(osNode.dataIp())
419 .vlanIntf(osNode.vlanIntf())
daniel parkb18424c2018-02-05 15:43:43 +0900420 .uplinkPort(osNode.uplinkPort())
Jian Lie6312162018-03-21 21:41:00 +0900421 .state(osNode.state())
Jian Li27841662018-04-14 01:59:47 +0900422 .phyIntfs(osNode.phyIntfs())
Jian Li789fadb2018-07-10 13:59:47 +0900423 .controllers(osNode.controllers())
Daniel Park92abf312018-08-08 17:01:35 +0900424 .sshAuthInfo(osNode.sshAuthInfo())
Jian Lic704b672018-09-04 18:52:53 +0900425 .dpdkConfig(osNode.dpdkConfig())
426 .keystoneConfig(osNode.keystoneConfig())
427 .neutronConfig(osNode.neutronConfig());
Hyunsun Moon0d457362017-06-27 17:19:41 +0900428 }
429
Jian Li340165f2018-02-27 10:38:17 +0900430 /**
431 * A builder class for openstack Node.
432 */
Hyunsun Moon0d457362017-06-27 17:19:41 +0900433 public static final class Builder implements OpenstackNode.Builder {
434
435 private String hostname;
436 private NodeType type;
437 private DeviceId intgBridge;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900438 private IpAddress managementIp;
439 private IpAddress dataIp;
440 private String vlanIntf;
daniel parkb18424c2018-02-05 15:43:43 +0900441 private String uplinkPort;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900442 private NodeState state;
Jian Lie6312162018-03-21 21:41:00 +0900443 private Collection<OpenstackPhyInterface> phyIntfs;
Jian Li789fadb2018-07-10 13:59:47 +0900444 private Collection<ControllerInfo> controllers;
Daniel Parkdeefa702018-07-17 17:55:51 +0900445 private OpenstackSshAuth sshAuth;
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900446 private DpdkConfig dpdkConfig;
Jian Lic704b672018-09-04 18:52:53 +0900447 private KeystoneConfig keystoneConfig;
448 private NeutronConfig neutronConfig;
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 Lic704b672018-09-04 18:52:53 +0900466 checkArgument(keystoneConfig != null, NOT_NULL_MSG, "keystone config");
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,
Daniel Park92abf312018-08-08 17:01:35 +0900483 sshAuth,
Jian Lic704b672018-09-04 18:52:53 +0900484 dpdkConfig,
485 keystoneConfig,
486 neutronConfig);
Hyunsun Moon0d457362017-06-27 17:19:41 +0900487 }
488
489 @Override
490 public Builder hostname(String hostname) {
491 if (!Strings.isNullOrEmpty(hostname)) {
492 this.hostname = hostname;
493 }
494 return this;
495 }
496
497 @Override
498 public Builder type(NodeType type) {
499 this.type = type;
500 return this;
501 }
502
503 @Override
504 public Builder intgBridge(DeviceId intgBridge) {
505 this.intgBridge = intgBridge;
506 return this;
507 }
508
509 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900510 public Builder managementIp(IpAddress managementIp) {
511 this.managementIp = managementIp;
512 return this;
513 }
514
515 @Override
516 public Builder dataIp(IpAddress dataIp) {
517 this.dataIp = dataIp;
518 return this;
519 }
520
521 @Override
522 public Builder vlanIntf(String vlanIntf) {
523 this.vlanIntf = vlanIntf;
524 return this;
525 }
526
527 @Override
daniel parkb18424c2018-02-05 15:43:43 +0900528 public Builder uplinkPort(String uplinkPort) {
529 this.uplinkPort = uplinkPort;
530 return this;
531 }
532
533 @Override
Hyunsun Moon0d457362017-06-27 17:19:41 +0900534 public Builder state(NodeState state) {
535 this.state = state;
536 return this;
537 }
Jian Lie6312162018-03-21 21:41:00 +0900538
539 @Override
540 public Builder phyIntfs(Collection<OpenstackPhyInterface> phyIntfs) {
541 this.phyIntfs = phyIntfs;
542 return this;
543 }
Jian Li27841662018-04-14 01:59:47 +0900544
545 @Override
Jian Li789fadb2018-07-10 13:59:47 +0900546 public Builder controllers(Collection<ControllerInfo> controllers) {
547 this.controllers = controllers;
548 return this;
549 }
550
551 @Override
Daniel Parkdeefa702018-07-17 17:55:51 +0900552 public Builder sshAuthInfo(OpenstackSshAuth sshAuth) {
553 this.sshAuth = sshAuth;
554 return this;
555 }
Daniel Park92abf312018-08-08 17:01:35 +0900556
557 @Override
Daniel Parkd02d7bd2018-08-23 23:04:31 +0900558 public Builder dpdkConfig(DpdkConfig dpdkConfig) {
559 this.dpdkConfig = dpdkConfig;
Daniel Park7e8c4d82018-08-13 23:47:49 +0900560 return this;
561 }
Jian Lic704b672018-09-04 18:52:53 +0900562
563 @Override
564 public Builder keystoneConfig(KeystoneConfig keystoneConfig) {
565 this.keystoneConfig = keystoneConfig;
566 return this;
567 }
568
569 @Override
570 public Builder neutronConfig(NeutronConfig neutronConfig) {
571 this.neutronConfig = neutronConfig;
572 return this;
573 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900574 }
575}
576