blob: b1addf0274bc26a59310f432cf530463d74fb9f9 [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;
48 private final PortNumber portNumber;
49 private final State state;
50
51 // private constructor not intended for invoked from external
52 private DefaultInstancePort(String networkId, String portId,
53 MacAddress macAddress, IpAddress ipAddress,
54 DeviceId deviceId, PortNumber portNumber,
55 State state) {
56 this.networkId = networkId;
57 this.portId = portId;
58 this.macAddress = macAddress;
59 this.ipAddress = ipAddress;
60 this.deviceId = deviceId;
61 this.portNumber = portNumber;
62 this.state = state;
63 }
64
65 private DefaultInstancePort(Host host, State state) {
66 this.networkId = host.annotations().value(ANNOTATION_NETWORK_ID);
67 this.portId = host.annotations().value(ANNOTATION_PORT_ID);
68 this.macAddress = host.mac();
69
70 this.ipAddress = host.ipAddresses().stream().findFirst().orElse(null);
71
72 this.deviceId = host.location().deviceId();
73 this.portNumber = host.location().port();
74 this.state = state;
75 }
76
77 public static DefaultInstancePort from(Host host, State state) {
78 checkNotNull(host);
79 checkArgument(!Strings.isNullOrEmpty(
80 host.annotations().value(ANNOTATION_NETWORK_ID)));
81 checkArgument(!Strings.isNullOrEmpty(
82 host.annotations().value(ANNOTATION_PORT_ID)));
83 checkArgument(!Strings.isNullOrEmpty(
84 host.annotations().value(ANNOTATION_CREATE_TIME)));
85
86 return new DefaultInstancePort(host, state);
87 }
88
89 @Override
90 public String networkId() {
91 return networkId;
92 }
93
94 @Override
95 public String portId() {
96 return portId;
97 }
98
99 @Override
100 public MacAddress macAddress() {
101 return macAddress;
102 }
103
104 @Override
105 public IpAddress ipAddress() {
106 return ipAddress;
107 }
108
109 @Override
110 public DeviceId deviceId() {
111 return deviceId;
112 }
113
114 @Override
115 public PortNumber portNumber() {
116 return portNumber;
117 }
118
119 @Override
120 public State state() {
121 return state;
122 }
123
124 @Override
125 public InstancePort updateState(State newState) {
126 return new Builder()
127 .networkId(networkId)
128 .portId(portId)
129 .macAddress(macAddress)
130 .ipAddress(ipAddress)
131 .deviceId(deviceId)
132 .portNumber(portNumber)
133 .state(newState)
134 .build();
135 }
136
137 @Override
138 public String toString() {
139 return MoreObjects.toStringHelper(getClass())
140 .add("networkId", networkId)
141 .add("portId", portId)
142 .add("macAddress", macAddress)
143 .add("ipAddress", ipAddress)
144 .add("deviceId", deviceId)
145 .add("portNumber", portNumber)
146 .add("state", state)
147 .toString();
148 }
149
150 @Override
151 public boolean equals(Object obj) {
152 if (this == obj) {
153 return true;
154 }
155 if (obj instanceof DefaultInstancePort) {
156 DefaultInstancePort that = (DefaultInstancePort) obj;
157 return Objects.equals(networkId, that.networkId) &&
158 Objects.equals(portId, that.portId) &&
159 Objects.equals(macAddress, that.macAddress) &&
160 Objects.equals(ipAddress, that.ipAddress) &&
161 Objects.equals(deviceId, that.deviceId) &&
162 Objects.equals(portNumber, that.portNumber) &&
163 Objects.equals(state, that.state);
164 }
165 return false;
166 }
167
168 @Override
169 public int hashCode() {
170 return Objects.hash(networkId,
171 portId,
172 macAddress,
173 ipAddress,
174 deviceId,
175 portNumber,
176 state);
177 }
178
179 /**
180 * A builder class for instance port.
181 */
182 public static final class Builder implements InstancePort.Builder {
183
184 private String networkId;
185 private String portId;
186 private MacAddress macAddress;
187 private IpAddress ipAddress;
188 private DeviceId deviceId;
189 private PortNumber portNumber;
190 private State state;
191
192 // private constructor not intended to use from external
193 private Builder() {
194 }
195
196 @Override
197 public InstancePort build() {
198
199 checkArgument(networkId != null, NOT_NULL_MSG, "networkId");
200 checkArgument(portId != null, NOT_NULL_MSG, "portId");
201 checkArgument(macAddress != null, NOT_NULL_MSG, "macAddress");
202 checkArgument(ipAddress != null, NOT_NULL_MSG, "ipAddress");
203 checkArgument(deviceId != null, NOT_NULL_MSG, "deviceId");
204 checkArgument(portNumber != null, NOT_NULL_MSG, "portNumber");
205 checkArgument(state != null, NOT_NULL_MSG, "state");
206
207 return new DefaultInstancePort(networkId,
208 portId,
209 macAddress,
210 ipAddress,
211 deviceId,
212 portNumber,
213 state);
214 }
215
216 @Override
217 public InstancePort.Builder networkId(String networkId) {
218 this.networkId = networkId;
219 return this;
220 }
221
222 @Override
223 public InstancePort.Builder portId(String portId) {
224 this.portId = portId;
225 return this;
226 }
227
228 @Override
229 public InstancePort.Builder macAddress(MacAddress macAddress) {
230 this.macAddress = macAddress;
231 return this;
232 }
233
234 @Override
235 public InstancePort.Builder ipAddress(IpAddress ipAddress) {
236 this.ipAddress = ipAddress;
237 return this;
238 }
239
240 @Override
241 public InstancePort.Builder deviceId(DeviceId deviceId) {
242 this.deviceId = deviceId;
243 return this;
244 }
245
246 @Override
247 public InstancePort.Builder portNumber(PortNumber portNumber) {
248 this.portNumber = portNumber;
249 return this;
250 }
251
252 @Override
253 public InstancePort.Builder state(State state) {
254 this.state = state;
255 return this;
256 }
257 }
258}