blob: 0a53885b6524f9c07983a31d7003c854daaf0e2d [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
85 public static DefaultInstancePort from(Host host, State state) {
86 checkNotNull(host);
87 checkArgument(!Strings.isNullOrEmpty(
88 host.annotations().value(ANNOTATION_NETWORK_ID)));
89 checkArgument(!Strings.isNullOrEmpty(
90 host.annotations().value(ANNOTATION_PORT_ID)));
91 checkArgument(!Strings.isNullOrEmpty(
92 host.annotations().value(ANNOTATION_CREATE_TIME)));
93
Jian Liec5c32b2018-07-13 14:28:58 +090094 return new DefaultInstancePort(host, state, null, null);
95 }
96
97 public static DefaultInstancePort from(Host host,
98 State state,
99 DeviceId oldDeviceId,
100 PortNumber oldPortNumber) {
101 checkNotNull(host);
102 checkArgument(!Strings.isNullOrEmpty(
103 host.annotations().value(ANNOTATION_NETWORK_ID)));
104 checkArgument(!Strings.isNullOrEmpty(
105 host.annotations().value(ANNOTATION_PORT_ID)));
106 checkArgument(!Strings.isNullOrEmpty(
107 host.annotations().value(ANNOTATION_CREATE_TIME)));
108
109 return new DefaultInstancePort(host, state, oldDeviceId, oldPortNumber);
Jian Liecae4382018-06-28 17:41:12 +0900110 }
111
112 @Override
113 public String networkId() {
114 return networkId;
115 }
116
117 @Override
118 public String portId() {
119 return portId;
120 }
121
122 @Override
123 public MacAddress macAddress() {
124 return macAddress;
125 }
126
127 @Override
128 public IpAddress ipAddress() {
129 return ipAddress;
130 }
131
132 @Override
133 public DeviceId deviceId() {
134 return deviceId;
135 }
136
137 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900138 public DeviceId oldDeviceId() {
139 return oldDeviceId;
140 }
141
142 @Override
Jian Liecae4382018-06-28 17:41:12 +0900143 public PortNumber portNumber() {
144 return portNumber;
145 }
146
147 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900148 public PortNumber oldPortNumber() {
149 return oldPortNumber;
150 }
151
152 @Override
Jian Liecae4382018-06-28 17:41:12 +0900153 public State state() {
154 return state;
155 }
156
Jian Liec5c32b2018-07-13 14:28:58 +0900157 /**
158 * Obtains an instance port builder.
159 *
160 * @return instance port builder
161 */
162 public static Builder builder() {
163 return new Builder();
164 }
165
Jian Liecae4382018-06-28 17:41:12 +0900166 @Override
167 public InstancePort updateState(State newState) {
168 return new Builder()
169 .networkId(networkId)
170 .portId(portId)
171 .macAddress(macAddress)
172 .ipAddress(ipAddress)
173 .deviceId(deviceId)
Jian Liec5c32b2018-07-13 14:28:58 +0900174 .oldDeviceId(oldDeviceId)
Jian Liecae4382018-06-28 17:41:12 +0900175 .portNumber(portNumber)
Jian Liec5c32b2018-07-13 14:28:58 +0900176 .oldPortNumber(oldPortNumber)
Jian Liecae4382018-06-28 17:41:12 +0900177 .state(newState)
178 .build();
179 }
180
181 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900182 public InstancePort updatePrevData(DeviceId oldDeviceId,
183 PortNumber oldPortNumber) {
184 return new Builder()
185 .networkId(networkId)
186 .portId(portId)
187 .macAddress(macAddress)
188 .ipAddress(ipAddress)
189 .deviceId(deviceId)
190 .oldDeviceId(oldDeviceId)
191 .portNumber(portNumber)
192 .oldPortNumber(oldPortNumber)
193 .state(state)
194 .build();
195 }
196
197 @Override
Jian Liecae4382018-06-28 17:41:12 +0900198 public String toString() {
199 return MoreObjects.toStringHelper(getClass())
200 .add("networkId", networkId)
201 .add("portId", portId)
202 .add("macAddress", macAddress)
203 .add("ipAddress", ipAddress)
204 .add("deviceId", deviceId)
Jian Liec5c32b2018-07-13 14:28:58 +0900205 .add("oldDeviceId", oldDeviceId)
Jian Liecae4382018-06-28 17:41:12 +0900206 .add("portNumber", portNumber)
Jian Liec5c32b2018-07-13 14:28:58 +0900207 .add("oldPortNumber", oldPortNumber)
Jian Liecae4382018-06-28 17:41:12 +0900208 .add("state", state)
209 .toString();
210 }
211
212 @Override
213 public boolean equals(Object obj) {
214 if (this == obj) {
215 return true;
216 }
217 if (obj instanceof DefaultInstancePort) {
218 DefaultInstancePort that = (DefaultInstancePort) obj;
219 return Objects.equals(networkId, that.networkId) &&
220 Objects.equals(portId, that.portId) &&
221 Objects.equals(macAddress, that.macAddress) &&
222 Objects.equals(ipAddress, that.ipAddress) &&
223 Objects.equals(deviceId, that.deviceId) &&
Jian Liec5c32b2018-07-13 14:28:58 +0900224 Objects.equals(oldDeviceId, that.oldDeviceId) &&
Jian Liecae4382018-06-28 17:41:12 +0900225 Objects.equals(portNumber, that.portNumber) &&
Jian Liec5c32b2018-07-13 14:28:58 +0900226 Objects.equals(oldPortNumber, that.oldPortNumber) &&
Jian Liecae4382018-06-28 17:41:12 +0900227 Objects.equals(state, that.state);
228 }
229 return false;
230 }
231
232 @Override
233 public int hashCode() {
234 return Objects.hash(networkId,
235 portId,
236 macAddress,
237 ipAddress,
238 deviceId,
Jian Liec5c32b2018-07-13 14:28:58 +0900239 oldDeviceId,
Jian Liecae4382018-06-28 17:41:12 +0900240 portNumber,
Jian Liec5c32b2018-07-13 14:28:58 +0900241 oldPortNumber,
Jian Liecae4382018-06-28 17:41:12 +0900242 state);
243 }
244
245 /**
246 * A builder class for instance port.
247 */
248 public static final class Builder implements InstancePort.Builder {
249
250 private String networkId;
251 private String portId;
252 private MacAddress macAddress;
253 private IpAddress ipAddress;
254 private DeviceId deviceId;
Jian Liec5c32b2018-07-13 14:28:58 +0900255 private DeviceId oldDeviceId;
Jian Liecae4382018-06-28 17:41:12 +0900256 private PortNumber portNumber;
Jian Liec5c32b2018-07-13 14:28:58 +0900257 private PortNumber oldPortNumber;
Jian Liecae4382018-06-28 17:41:12 +0900258 private State state;
259
260 // private constructor not intended to use from external
261 private Builder() {
262 }
263
264 @Override
265 public InstancePort build() {
266
267 checkArgument(networkId != null, NOT_NULL_MSG, "networkId");
268 checkArgument(portId != null, NOT_NULL_MSG, "portId");
269 checkArgument(macAddress != null, NOT_NULL_MSG, "macAddress");
270 checkArgument(ipAddress != null, NOT_NULL_MSG, "ipAddress");
271 checkArgument(deviceId != null, NOT_NULL_MSG, "deviceId");
272 checkArgument(portNumber != null, NOT_NULL_MSG, "portNumber");
273 checkArgument(state != null, NOT_NULL_MSG, "state");
274
275 return new DefaultInstancePort(networkId,
276 portId,
277 macAddress,
278 ipAddress,
279 deviceId,
Jian Liec5c32b2018-07-13 14:28:58 +0900280 oldDeviceId,
Jian Liecae4382018-06-28 17:41:12 +0900281 portNumber,
Jian Liec5c32b2018-07-13 14:28:58 +0900282 oldPortNumber,
Jian Liecae4382018-06-28 17:41:12 +0900283 state);
284 }
285
286 @Override
287 public InstancePort.Builder networkId(String networkId) {
288 this.networkId = networkId;
289 return this;
290 }
291
292 @Override
293 public InstancePort.Builder portId(String portId) {
294 this.portId = portId;
295 return this;
296 }
297
298 @Override
299 public InstancePort.Builder macAddress(MacAddress macAddress) {
300 this.macAddress = macAddress;
301 return this;
302 }
303
304 @Override
305 public InstancePort.Builder ipAddress(IpAddress ipAddress) {
306 this.ipAddress = ipAddress;
307 return this;
308 }
309
310 @Override
311 public InstancePort.Builder deviceId(DeviceId deviceId) {
312 this.deviceId = deviceId;
313 return this;
314 }
315
316 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900317 public InstancePort.Builder oldDeviceId(DeviceId oldDeviceId) {
318 this.oldDeviceId = oldDeviceId;
319 return this;
320 }
321
322 @Override
Jian Liecae4382018-06-28 17:41:12 +0900323 public InstancePort.Builder portNumber(PortNumber portNumber) {
324 this.portNumber = portNumber;
325 return this;
326 }
327
328 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900329 public InstancePort.Builder oldPortNumber(PortNumber oldPortNumber) {
330 this.oldPortNumber = oldPortNumber;
331 return this;
332 }
333
334 @Override
Jian Liecae4382018-06-28 17:41:12 +0900335 public InstancePort.Builder state(State state) {
336 this.state = state;
337 return this;
338 }
339 }
340}