blob: ccd35e982d6864bb5d1a12f7372173926d80e77d [file] [log] [blame]
Jian Lib9642832021-01-08 03:18:35 +09001/*
2 * Copyright 2021-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.kubevirtnetworking.api;
17
18import com.google.common.base.MoreObjects;
Jian Li8f944d42021-03-23 00:43:29 +090019import com.google.common.collect.ImmutableSet;
20import org.onlab.osgi.DefaultServiceDirectory;
Jian Lib9642832021-01-08 03:18:35 +090021import org.onlab.packet.IpAddress;
22import org.onlab.packet.MacAddress;
Jian Li8f944d42021-03-23 00:43:29 +090023import org.onosproject.kubevirtnode.api.KubevirtNode;
24import org.onosproject.kubevirtnode.api.KubevirtNodeService;
Jian Lib9642832021-01-08 03:18:35 +090025import org.onosproject.net.DeviceId;
26import org.onosproject.net.PortNumber;
27
28import java.util.Objects;
Jian Li8f944d42021-03-23 00:43:29 +090029import java.util.Set;
Jian Lib9642832021-01-08 03:18:35 +090030
31import static com.google.common.base.Preconditions.checkArgument;
32
33/**
34 * Default implementation of kubernetes port.
35 */
36public final class DefaultKubevirtPort implements KubevirtPort {
37
38 private static final String NOT_NULL_MSG = "Port % cannot be null";
39
Jian Li3ba5c582021-01-14 11:30:36 +090040 private final String networkId;
Jian Lib9642832021-01-08 03:18:35 +090041 private final MacAddress macAddress;
42 private final IpAddress ipAddress;
43 private final DeviceId deviceId;
44 private final PortNumber portNumber;
Jian Li8f944d42021-03-23 00:43:29 +090045 private final Set<String> securityGroups;
Jian Lib9642832021-01-08 03:18:35 +090046
47 /**
48 * Default constructor.
49 *
Jian Li3ba5c582021-01-14 11:30:36 +090050 * @param networkId network identifier
Jian Lib9642832021-01-08 03:18:35 +090051 * @param macAddress MAC address
52 * @param ipAddress IP address
53 * @param deviceId device identifier
54 * @param portNumber port number
Jian Li8f944d42021-03-23 00:43:29 +090055 * @param securityGroups security groups
Jian Lib9642832021-01-08 03:18:35 +090056 */
Jian Li3ba5c582021-01-14 11:30:36 +090057 public DefaultKubevirtPort(String networkId, MacAddress macAddress, IpAddress ipAddress,
Jian Li8f944d42021-03-23 00:43:29 +090058 DeviceId deviceId, PortNumber portNumber, Set<String> securityGroups) {
Jian Li3ba5c582021-01-14 11:30:36 +090059 this.networkId = networkId;
Jian Lib9642832021-01-08 03:18:35 +090060 this.macAddress = macAddress;
61 this.ipAddress = ipAddress;
62 this.deviceId = deviceId;
63 this.portNumber = portNumber;
Jian Li8f944d42021-03-23 00:43:29 +090064 this.securityGroups = securityGroups;
Jian Lib9642832021-01-08 03:18:35 +090065 }
66
67 @Override
Jian Li3ba5c582021-01-14 11:30:36 +090068 public String networkId() {
69 return networkId;
70 }
71
72 @Override
Jian Lib9642832021-01-08 03:18:35 +090073 public MacAddress macAddress() {
74 return macAddress;
75 }
76
77 @Override
78 public IpAddress ipAddress() {
79 return ipAddress;
80 }
81
82 @Override
83 public DeviceId deviceId() {
84 return deviceId;
85 }
86
87 @Override
Jian Li8f944d42021-03-23 00:43:29 +090088 public DeviceId tenantDeviceId() {
89 KubevirtNetworkService networkService =
90 DefaultServiceDirectory.getService(KubevirtNetworkService.class);
91 KubevirtNodeService nodeService =
92 DefaultServiceDirectory.getService(KubevirtNodeService.class);
93 KubevirtNetwork network = networkService.network(networkId);
94 KubevirtNode node = nodeService.node(deviceId);
Jian Li567b25c2021-05-27 15:17:59 +090095
96 if (network == null || node == null) {
97 return null;
98 } else {
99 return network.tenantDeviceId(node.hostname());
100 }
Jian Li8f944d42021-03-23 00:43:29 +0900101 }
102
103 @Override
104 public boolean isTenant() {
105 KubevirtNetworkService networkService =
106 DefaultServiceDirectory.getService(KubevirtNetworkService.class);
107 KubevirtNetwork network = networkService.network(networkId);
Jian Li567b25c2021-05-27 15:17:59 +0900108 if (network == null) {
109 return false;
110 } else {
111 return network.type() == KubevirtNetwork.Type.VXLAN ||
112 network.type() == KubevirtNetwork.Type.GRE ||
113 network.type() == KubevirtNetwork.Type.GENEVE;
114 }
Jian Li8f944d42021-03-23 00:43:29 +0900115 }
116
117 @Override
Jian Lib9642832021-01-08 03:18:35 +0900118 public PortNumber portNumber() {
119 return portNumber;
120 }
121
122 @Override
Jian Lica20b712021-01-18 00:19:31 +0900123 public KubevirtPort updateIpAddress(IpAddress updateIpAddress) {
Jian Li0b481122021-01-17 04:26:18 +0900124 return new Builder()
125 .networkId(networkId)
126 .macAddress(macAddress)
Jian Lica20b712021-01-18 00:19:31 +0900127 .ipAddress(updateIpAddress)
Jian Li0b481122021-01-17 04:26:18 +0900128 .deviceId(deviceId)
129 .portNumber(portNumber)
Jian Li8f944d42021-03-23 00:43:29 +0900130 .securityGroups(securityGroups)
Jian Li0b481122021-01-17 04:26:18 +0900131 .build();
Jian Lib9642832021-01-08 03:18:35 +0900132 }
133
134 @Override
Jian Lica20b712021-01-18 00:19:31 +0900135 public KubevirtPort updatePortNumber(PortNumber updatedPortNumber) {
Jian Li0b481122021-01-17 04:26:18 +0900136 return new Builder()
137 .networkId(networkId)
138 .macAddress(macAddress)
139 .ipAddress(ipAddress)
140 .deviceId(deviceId)
Jian Lica20b712021-01-18 00:19:31 +0900141 .portNumber(updatedPortNumber)
Jian Li8f944d42021-03-23 00:43:29 +0900142 .securityGroups(securityGroups)
Jian Lica20b712021-01-18 00:19:31 +0900143 .build();
144 }
145
146 @Override
147 public KubevirtPort updateDeviceId(DeviceId updatedDeviceId) {
148 return new Builder()
149 .networkId(networkId)
150 .macAddress(macAddress)
151 .ipAddress(ipAddress)
152 .deviceId(updatedDeviceId)
Jian Li0b481122021-01-17 04:26:18 +0900153 .portNumber(portNumber)
Jian Li8f944d42021-03-23 00:43:29 +0900154 .securityGroups(securityGroups)
155 .build();
156 }
157
158 @Override
159 public Set<String> securityGroups() {
160 if (securityGroups != null) {
161 return ImmutableSet.copyOf(securityGroups);
162 } else {
163 return ImmutableSet.of();
164 }
165 }
166
167 @Override
168 public KubevirtPort updateSecurityGroups(Set<String> sgs) {
169 return new Builder()
170 .networkId(networkId)
171 .macAddress(macAddress)
172 .ipAddress(ipAddress)
173 .deviceId(deviceId)
174 .portNumber(portNumber)
175 .securityGroups(sgs)
Jian Li0b481122021-01-17 04:26:18 +0900176 .build();
Jian Lib9642832021-01-08 03:18:35 +0900177 }
178
179 @Override
180 public boolean equals(Object o) {
181 if (this == o) {
182 return true;
183 }
184 if (o == null || getClass() != o.getClass()) {
185 return false;
186 }
187 DefaultKubevirtPort that = (DefaultKubevirtPort) o;
Jian Li3ba5c582021-01-14 11:30:36 +0900188 return networkId.equals(that.networkId) && macAddress.equals(that.macAddress) &&
189 ipAddress.equals(that.ipAddress) && deviceId.equals(that.deviceId) &&
Jian Li8f944d42021-03-23 00:43:29 +0900190 portNumber.equals(that.portNumber) && securityGroups.equals(that.securityGroups);
Jian Lib9642832021-01-08 03:18:35 +0900191 }
192
193 @Override
194 public int hashCode() {
Jian Li8f944d42021-03-23 00:43:29 +0900195 return Objects.hash(networkId, macAddress, ipAddress, deviceId, portNumber, securityGroups);
Jian Lib9642832021-01-08 03:18:35 +0900196 }
197
198 @Override
199 public String toString() {
200 return MoreObjects.toStringHelper(this)
Jian Li3ba5c582021-01-14 11:30:36 +0900201 .add("networkId", networkId)
Jian Lib9642832021-01-08 03:18:35 +0900202 .add("macAddress", macAddress)
203 .add("ipAddress", ipAddress)
204 .add("deviceId", deviceId)
205 .add("portNumber", portNumber)
Jian Li8f944d42021-03-23 00:43:29 +0900206 .add("securityGroups", securityGroups)
Jian Lib9642832021-01-08 03:18:35 +0900207 .toString();
208 }
209
210 /**
211 * Returns new builder instance.
212 *
213 * @return kubevirt port builder
214 */
215 public static Builder builder() {
216 return new Builder();
217 }
218
219 /**
220 * Default builder implementation.
221 */
222 public static final class Builder implements KubevirtPort.Builder {
223
Jian Li3ba5c582021-01-14 11:30:36 +0900224 private String networkId;
Jian Lib9642832021-01-08 03:18:35 +0900225 private MacAddress macAddress;
226 private IpAddress ipAddress;
227 private DeviceId deviceId;
228 private PortNumber portNumber;
Jian Li8f944d42021-03-23 00:43:29 +0900229 private Set<String> securityGroups;
Jian Lib9642832021-01-08 03:18:35 +0900230
231 // private constructor not intended to use from external
232 private Builder() {
233 }
234
235 @Override
236 public KubevirtPort build() {
Jian Li3ba5c582021-01-14 11:30:36 +0900237 checkArgument(networkId != null, NOT_NULL_MSG, "networkId");
Jian Lib9642832021-01-08 03:18:35 +0900238 checkArgument(macAddress != null, NOT_NULL_MSG, "macAddress");
Jian Lib9642832021-01-08 03:18:35 +0900239
Jian Li3ba5c582021-01-14 11:30:36 +0900240 return new DefaultKubevirtPort(networkId, macAddress, ipAddress,
Jian Li8f944d42021-03-23 00:43:29 +0900241 deviceId, portNumber, securityGroups);
Jian Li3ba5c582021-01-14 11:30:36 +0900242 }
243
244 @Override
245 public Builder networkId(String networkId) {
246 this.networkId = networkId;
247 return this;
Jian Lib9642832021-01-08 03:18:35 +0900248 }
249
250 @Override
251 public Builder macAddress(MacAddress macAddress) {
252 this.macAddress = macAddress;
253 return this;
254 }
255
256 @Override
257 public Builder ipAddress(IpAddress ipAddress) {
258 this.ipAddress = ipAddress;
259 return this;
260 }
261
262 @Override
263 public Builder deviceId(DeviceId deviceId) {
264 this.deviceId = deviceId;
265 return this;
266 }
267
268 @Override
269 public Builder portNumber(PortNumber portNumber) {
270 this.portNumber = portNumber;
271 return this;
272 }
Jian Li8f944d42021-03-23 00:43:29 +0900273
274 @Override
275 public Builder securityGroups(Set<String> securityGroups) {
276 this.securityGroups = securityGroups;
277 return this;
278 }
Jian Lib9642832021-01-08 03:18:35 +0900279 }
280}