blob: f4569d5fb318e903767563dcc7749e6e3806af21 [file] [log] [blame]
Jian Liecae4382018-06-28 17:41:12 +09001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
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 */
16package org.onosproject.openstacknetworking.impl;
17
18import com.google.common.base.MoreObjects;
19import com.google.common.base.Strings;
20import org.onlab.packet.IpAddress;
21import org.onlab.packet.MacAddress;
22import org.onosproject.net.DeviceId;
23import org.onosproject.net.Host;
24import org.onosproject.net.PortNumber;
25import org.onosproject.openstacknetworking.api.InstancePort;
26
27import java.util.Objects;
28
29import static com.google.common.base.Preconditions.checkArgument;
30import static com.google.common.base.Preconditions.checkNotNull;
31
32/**
33 * Default implementation of instance port.
34 */
35public final class DefaultInstancePort implements InstancePort {
36
37 private static final String ANNOTATION_NETWORK_ID = "networkId";
38 private static final String ANNOTATION_PORT_ID = "portId";
39 private static final String ANNOTATION_CREATE_TIME = "createTime";
40
41 private static final String NOT_NULL_MSG = "Instance Port % cannot be null";
42
43 private final String networkId;
44 private final String portId;
45 private final MacAddress macAddress;
46 private final IpAddress ipAddress;
47 private final DeviceId deviceId;
Jian Liec5c32b2018-07-13 14:28:58 +090048 private final DeviceId oldDeviceId;
Jian Liecae4382018-06-28 17:41:12 +090049 private final PortNumber portNumber;
Jian Liec5c32b2018-07-13 14:28:58 +090050 private final PortNumber oldPortNumber;
Jian Liecae4382018-06-28 17:41:12 +090051 private final State state;
52
53 // private constructor not intended for invoked from external
54 private DefaultInstancePort(String networkId, String portId,
55 MacAddress macAddress, IpAddress ipAddress,
Jian Liec5c32b2018-07-13 14:28:58 +090056 DeviceId deviceId, DeviceId oldDeviceId,
57 PortNumber portNumber, PortNumber oldPortNumber,
Jian Liecae4382018-06-28 17:41:12 +090058 State state) {
59 this.networkId = networkId;
60 this.portId = portId;
61 this.macAddress = macAddress;
62 this.ipAddress = ipAddress;
63 this.deviceId = deviceId;
Jian Liec5c32b2018-07-13 14:28:58 +090064 this.oldDeviceId = oldDeviceId;
Jian Liecae4382018-06-28 17:41:12 +090065 this.portNumber = portNumber;
Jian Liec5c32b2018-07-13 14:28:58 +090066 this.oldPortNumber = oldPortNumber;
Jian Liecae4382018-06-28 17:41:12 +090067 this.state = state;
68 }
69
Jian Liec5c32b2018-07-13 14:28:58 +090070 private DefaultInstancePort(Host host, State state,
71 DeviceId oldDeviceId, PortNumber oldPortNumber) {
Jian Liecae4382018-06-28 17:41:12 +090072 this.networkId = host.annotations().value(ANNOTATION_NETWORK_ID);
73 this.portId = host.annotations().value(ANNOTATION_PORT_ID);
74 this.macAddress = host.mac();
75
76 this.ipAddress = host.ipAddresses().stream().findFirst().orElse(null);
77
78 this.deviceId = host.location().deviceId();
79 this.portNumber = host.location().port();
80 this.state = state;
Jian Liec5c32b2018-07-13 14:28:58 +090081 this.oldDeviceId = oldDeviceId;
82 this.oldPortNumber = oldPortNumber;
Jian Liecae4382018-06-28 17:41:12 +090083 }
84
Jian Li411bf2e2018-11-29 00:08:54 +090085 /**
86 * A constructor fed by host and state.
87 *
88 * @param host host object
89 * @param state instance port state
90 * @return instance port
91 */
Jian Liecae4382018-06-28 17:41:12 +090092 public static DefaultInstancePort from(Host host, State state) {
93 checkNotNull(host);
94 checkArgument(!Strings.isNullOrEmpty(
95 host.annotations().value(ANNOTATION_NETWORK_ID)));
96 checkArgument(!Strings.isNullOrEmpty(
97 host.annotations().value(ANNOTATION_PORT_ID)));
98 checkArgument(!Strings.isNullOrEmpty(
99 host.annotations().value(ANNOTATION_CREATE_TIME)));
100
Jian Liec5c32b2018-07-13 14:28:58 +0900101 return new DefaultInstancePort(host, state, null, null);
102 }
103
Jian Li411bf2e2018-11-29 00:08:54 +0900104 /**
105 * A constructor fed by host, state, device ID and port number.
106 *
107 * @param host host object
108 * @param state instance port state
109 * @param oldDeviceId device identifier
110 * @param oldPortNumber port number
111 * @return instance port
112 */
Jian Liec5c32b2018-07-13 14:28:58 +0900113 public static DefaultInstancePort from(Host host,
114 State state,
115 DeviceId oldDeviceId,
116 PortNumber oldPortNumber) {
117 checkNotNull(host);
118 checkArgument(!Strings.isNullOrEmpty(
119 host.annotations().value(ANNOTATION_NETWORK_ID)));
120 checkArgument(!Strings.isNullOrEmpty(
121 host.annotations().value(ANNOTATION_PORT_ID)));
122 checkArgument(!Strings.isNullOrEmpty(
123 host.annotations().value(ANNOTATION_CREATE_TIME)));
124
125 return new DefaultInstancePort(host, state, oldDeviceId, oldPortNumber);
Jian Liecae4382018-06-28 17:41:12 +0900126 }
127
128 @Override
129 public String networkId() {
130 return networkId;
131 }
132
133 @Override
134 public String portId() {
135 return portId;
136 }
137
138 @Override
139 public MacAddress macAddress() {
140 return macAddress;
141 }
142
143 @Override
144 public IpAddress ipAddress() {
145 return ipAddress;
146 }
147
148 @Override
149 public DeviceId deviceId() {
150 return deviceId;
151 }
152
153 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900154 public DeviceId oldDeviceId() {
155 return oldDeviceId;
156 }
157
158 @Override
Jian Liecae4382018-06-28 17:41:12 +0900159 public PortNumber portNumber() {
160 return portNumber;
161 }
162
163 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900164 public PortNumber oldPortNumber() {
165 return oldPortNumber;
166 }
167
168 @Override
Jian Liecae4382018-06-28 17:41:12 +0900169 public State state() {
170 return state;
171 }
172
Jian Liec5c32b2018-07-13 14:28:58 +0900173 /**
174 * Obtains an instance port builder.
175 *
176 * @return instance port builder
177 */
178 public static Builder builder() {
179 return new Builder();
180 }
181
Jian Liecae4382018-06-28 17:41:12 +0900182 @Override
183 public InstancePort updateState(State newState) {
184 return new Builder()
185 .networkId(networkId)
186 .portId(portId)
187 .macAddress(macAddress)
188 .ipAddress(ipAddress)
189 .deviceId(deviceId)
Jian Liec5c32b2018-07-13 14:28:58 +0900190 .oldDeviceId(oldDeviceId)
Jian Liecae4382018-06-28 17:41:12 +0900191 .portNumber(portNumber)
Jian Liec5c32b2018-07-13 14:28:58 +0900192 .oldPortNumber(oldPortNumber)
Jian Liecae4382018-06-28 17:41:12 +0900193 .state(newState)
194 .build();
195 }
196
197 @Override
Jian Li46b74002018-07-15 18:39:08 +0900198 public InstancePort updatePrevLocation(DeviceId oldDeviceId,
199 PortNumber oldPortNumber) {
Jian Liec5c32b2018-07-13 14:28:58 +0900200 return new Builder()
201 .networkId(networkId)
202 .portId(portId)
203 .macAddress(macAddress)
204 .ipAddress(ipAddress)
205 .deviceId(deviceId)
206 .oldDeviceId(oldDeviceId)
207 .portNumber(portNumber)
208 .oldPortNumber(oldPortNumber)
209 .state(state)
210 .build();
211 }
212
213 @Override
Jian Liecae4382018-06-28 17:41:12 +0900214 public String toString() {
215 return MoreObjects.toStringHelper(getClass())
216 .add("networkId", networkId)
217 .add("portId", portId)
218 .add("macAddress", macAddress)
219 .add("ipAddress", ipAddress)
220 .add("deviceId", deviceId)
Jian Liec5c32b2018-07-13 14:28:58 +0900221 .add("oldDeviceId", oldDeviceId)
Jian Liecae4382018-06-28 17:41:12 +0900222 .add("portNumber", portNumber)
Jian Liec5c32b2018-07-13 14:28:58 +0900223 .add("oldPortNumber", oldPortNumber)
Jian Liecae4382018-06-28 17:41:12 +0900224 .add("state", state)
225 .toString();
226 }
227
228 @Override
229 public boolean equals(Object obj) {
230 if (this == obj) {
231 return true;
232 }
233 if (obj instanceof DefaultInstancePort) {
234 DefaultInstancePort that = (DefaultInstancePort) obj;
235 return Objects.equals(networkId, that.networkId) &&
236 Objects.equals(portId, that.portId) &&
237 Objects.equals(macAddress, that.macAddress) &&
238 Objects.equals(ipAddress, that.ipAddress) &&
239 Objects.equals(deviceId, that.deviceId) &&
Jian Liec5c32b2018-07-13 14:28:58 +0900240 Objects.equals(oldDeviceId, that.oldDeviceId) &&
Jian Liecae4382018-06-28 17:41:12 +0900241 Objects.equals(portNumber, that.portNumber) &&
Jian Liec5c32b2018-07-13 14:28:58 +0900242 Objects.equals(oldPortNumber, that.oldPortNumber) &&
Jian Liecae4382018-06-28 17:41:12 +0900243 Objects.equals(state, that.state);
244 }
245 return false;
246 }
247
248 @Override
249 public int hashCode() {
250 return Objects.hash(networkId,
251 portId,
252 macAddress,
253 ipAddress,
254 deviceId,
Jian Liec5c32b2018-07-13 14:28:58 +0900255 oldDeviceId,
Jian Liecae4382018-06-28 17:41:12 +0900256 portNumber,
Jian Liec5c32b2018-07-13 14:28:58 +0900257 oldPortNumber,
Jian Liecae4382018-06-28 17:41:12 +0900258 state);
259 }
260
261 /**
262 * A builder class for instance port.
263 */
264 public static final class Builder implements InstancePort.Builder {
265
266 private String networkId;
267 private String portId;
268 private MacAddress macAddress;
269 private IpAddress ipAddress;
270 private DeviceId deviceId;
Jian Liec5c32b2018-07-13 14:28:58 +0900271 private DeviceId oldDeviceId;
Jian Liecae4382018-06-28 17:41:12 +0900272 private PortNumber portNumber;
Jian Liec5c32b2018-07-13 14:28:58 +0900273 private PortNumber oldPortNumber;
Jian Liecae4382018-06-28 17:41:12 +0900274 private State state;
275
276 // private constructor not intended to use from external
277 private Builder() {
278 }
279
280 @Override
281 public InstancePort build() {
282
283 checkArgument(networkId != null, NOT_NULL_MSG, "networkId");
284 checkArgument(portId != null, NOT_NULL_MSG, "portId");
285 checkArgument(macAddress != null, NOT_NULL_MSG, "macAddress");
286 checkArgument(ipAddress != null, NOT_NULL_MSG, "ipAddress");
287 checkArgument(deviceId != null, NOT_NULL_MSG, "deviceId");
288 checkArgument(portNumber != null, NOT_NULL_MSG, "portNumber");
289 checkArgument(state != null, NOT_NULL_MSG, "state");
290
291 return new DefaultInstancePort(networkId,
292 portId,
293 macAddress,
294 ipAddress,
295 deviceId,
Jian Liec5c32b2018-07-13 14:28:58 +0900296 oldDeviceId,
Jian Liecae4382018-06-28 17:41:12 +0900297 portNumber,
Jian Liec5c32b2018-07-13 14:28:58 +0900298 oldPortNumber,
Jian Liecae4382018-06-28 17:41:12 +0900299 state);
300 }
301
302 @Override
303 public InstancePort.Builder networkId(String networkId) {
304 this.networkId = networkId;
305 return this;
306 }
307
308 @Override
309 public InstancePort.Builder portId(String portId) {
310 this.portId = portId;
311 return this;
312 }
313
314 @Override
315 public InstancePort.Builder macAddress(MacAddress macAddress) {
316 this.macAddress = macAddress;
317 return this;
318 }
319
320 @Override
321 public InstancePort.Builder ipAddress(IpAddress ipAddress) {
322 this.ipAddress = ipAddress;
323 return this;
324 }
325
326 @Override
327 public InstancePort.Builder deviceId(DeviceId deviceId) {
328 this.deviceId = deviceId;
329 return this;
330 }
331
332 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900333 public InstancePort.Builder oldDeviceId(DeviceId oldDeviceId) {
334 this.oldDeviceId = oldDeviceId;
335 return this;
336 }
337
338 @Override
Jian Liecae4382018-06-28 17:41:12 +0900339 public InstancePort.Builder portNumber(PortNumber portNumber) {
340 this.portNumber = portNumber;
341 return this;
342 }
343
344 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900345 public InstancePort.Builder oldPortNumber(PortNumber oldPortNumber) {
346 this.oldPortNumber = oldPortNumber;
347 return this;
348 }
349
350 @Override
Jian Liecae4382018-06-28 17:41:12 +0900351 public InstancePort.Builder state(State state) {
352 this.state = state;
353 return this;
354 }
355 }
356}