blob: 493d80a8bcb6e5252870a6a22b8d32e7b6896d15 [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 Li9557e902021-06-08 10:12:52 +090040 private final String vmName;
Jian Li3ba5c582021-01-14 11:30:36 +090041 private final String networkId;
Jian Lib9642832021-01-08 03:18:35 +090042 private final MacAddress macAddress;
43 private final IpAddress ipAddress;
44 private final DeviceId deviceId;
45 private final PortNumber portNumber;
Jian Li8f944d42021-03-23 00:43:29 +090046 private final Set<String> securityGroups;
Jian Lib9642832021-01-08 03:18:35 +090047
48 /**
49 * Default constructor.
50 *
Jian Li9557e902021-06-08 10:12:52 +090051 * @param vmName VM name
Jian Li3ba5c582021-01-14 11:30:36 +090052 * @param networkId network identifier
Jian Lib9642832021-01-08 03:18:35 +090053 * @param macAddress MAC address
54 * @param ipAddress IP address
55 * @param deviceId device identifier
56 * @param portNumber port number
Jian Li8f944d42021-03-23 00:43:29 +090057 * @param securityGroups security groups
Jian Lib9642832021-01-08 03:18:35 +090058 */
Jian Li9557e902021-06-08 10:12:52 +090059 public DefaultKubevirtPort(String vmName, String networkId, MacAddress macAddress, IpAddress ipAddress,
Jian Li8f944d42021-03-23 00:43:29 +090060 DeviceId deviceId, PortNumber portNumber, Set<String> securityGroups) {
Jian Li9557e902021-06-08 10:12:52 +090061 this.vmName = vmName;
Jian Li3ba5c582021-01-14 11:30:36 +090062 this.networkId = networkId;
Jian Lib9642832021-01-08 03:18:35 +090063 this.macAddress = macAddress;
64 this.ipAddress = ipAddress;
65 this.deviceId = deviceId;
66 this.portNumber = portNumber;
Jian Li8f944d42021-03-23 00:43:29 +090067 this.securityGroups = securityGroups;
Jian Lib9642832021-01-08 03:18:35 +090068 }
69
70 @Override
Jian Li9557e902021-06-08 10:12:52 +090071 public String vmName() {
72 return vmName;
73 }
74
75 @Override
Jian Li3ba5c582021-01-14 11:30:36 +090076 public String networkId() {
77 return networkId;
78 }
79
80 @Override
Jian Lib9642832021-01-08 03:18:35 +090081 public MacAddress macAddress() {
82 return macAddress;
83 }
84
85 @Override
86 public IpAddress ipAddress() {
87 return ipAddress;
88 }
89
90 @Override
91 public DeviceId deviceId() {
92 return deviceId;
93 }
94
95 @Override
Jian Li8f944d42021-03-23 00:43:29 +090096 public DeviceId tenantDeviceId() {
97 KubevirtNetworkService networkService =
98 DefaultServiceDirectory.getService(KubevirtNetworkService.class);
99 KubevirtNodeService nodeService =
100 DefaultServiceDirectory.getService(KubevirtNodeService.class);
101 KubevirtNetwork network = networkService.network(networkId);
102 KubevirtNode node = nodeService.node(deviceId);
Jian Li567b25c2021-05-27 15:17:59 +0900103
104 if (network == null || node == null) {
105 return null;
106 } else {
107 return network.tenantDeviceId(node.hostname());
108 }
Jian Li8f944d42021-03-23 00:43:29 +0900109 }
110
111 @Override
112 public boolean isTenant() {
113 KubevirtNetworkService networkService =
114 DefaultServiceDirectory.getService(KubevirtNetworkService.class);
115 KubevirtNetwork network = networkService.network(networkId);
Jian Li567b25c2021-05-27 15:17:59 +0900116 if (network == null) {
117 return false;
118 } else {
119 return network.type() == KubevirtNetwork.Type.VXLAN ||
120 network.type() == KubevirtNetwork.Type.GRE ||
121 network.type() == KubevirtNetwork.Type.GENEVE;
122 }
Jian Li8f944d42021-03-23 00:43:29 +0900123 }
124
125 @Override
Jian Lib9642832021-01-08 03:18:35 +0900126 public PortNumber portNumber() {
127 return portNumber;
128 }
129
130 @Override
Jian Lica20b712021-01-18 00:19:31 +0900131 public KubevirtPort updateIpAddress(IpAddress updateIpAddress) {
Jian Li0b481122021-01-17 04:26:18 +0900132 return new Builder()
Jian Li9557e902021-06-08 10:12:52 +0900133 .vmName(vmName)
Jian Li0b481122021-01-17 04:26:18 +0900134 .networkId(networkId)
135 .macAddress(macAddress)
Jian Lica20b712021-01-18 00:19:31 +0900136 .ipAddress(updateIpAddress)
Jian Li0b481122021-01-17 04:26:18 +0900137 .deviceId(deviceId)
138 .portNumber(portNumber)
Jian Li8f944d42021-03-23 00:43:29 +0900139 .securityGroups(securityGroups)
Jian Li0b481122021-01-17 04:26:18 +0900140 .build();
Jian Lib9642832021-01-08 03:18:35 +0900141 }
142
143 @Override
Jian Lica20b712021-01-18 00:19:31 +0900144 public KubevirtPort updatePortNumber(PortNumber updatedPortNumber) {
Jian Li0b481122021-01-17 04:26:18 +0900145 return new Builder()
Jian Li9557e902021-06-08 10:12:52 +0900146 .vmName(vmName)
Jian Li0b481122021-01-17 04:26:18 +0900147 .networkId(networkId)
148 .macAddress(macAddress)
149 .ipAddress(ipAddress)
150 .deviceId(deviceId)
Jian Lica20b712021-01-18 00:19:31 +0900151 .portNumber(updatedPortNumber)
Jian Li8f944d42021-03-23 00:43:29 +0900152 .securityGroups(securityGroups)
Jian Lica20b712021-01-18 00:19:31 +0900153 .build();
154 }
155
156 @Override
157 public KubevirtPort updateDeviceId(DeviceId updatedDeviceId) {
158 return new Builder()
Jian Li9557e902021-06-08 10:12:52 +0900159 .vmName(vmName)
Jian Lica20b712021-01-18 00:19:31 +0900160 .networkId(networkId)
161 .macAddress(macAddress)
162 .ipAddress(ipAddress)
163 .deviceId(updatedDeviceId)
Jian Li0b481122021-01-17 04:26:18 +0900164 .portNumber(portNumber)
Jian Li8f944d42021-03-23 00:43:29 +0900165 .securityGroups(securityGroups)
166 .build();
167 }
168
169 @Override
170 public Set<String> securityGroups() {
171 if (securityGroups != null) {
172 return ImmutableSet.copyOf(securityGroups);
173 } else {
174 return ImmutableSet.of();
175 }
176 }
177
178 @Override
179 public KubevirtPort updateSecurityGroups(Set<String> sgs) {
180 return new Builder()
Jian Li9557e902021-06-08 10:12:52 +0900181 .vmName(vmName)
Jian Li8f944d42021-03-23 00:43:29 +0900182 .networkId(networkId)
183 .macAddress(macAddress)
184 .ipAddress(ipAddress)
185 .deviceId(deviceId)
186 .portNumber(portNumber)
187 .securityGroups(sgs)
Jian Li0b481122021-01-17 04:26:18 +0900188 .build();
Jian Lib9642832021-01-08 03:18:35 +0900189 }
190
191 @Override
192 public boolean equals(Object o) {
193 if (this == o) {
194 return true;
195 }
196 if (o == null || getClass() != o.getClass()) {
197 return false;
198 }
199 DefaultKubevirtPort that = (DefaultKubevirtPort) o;
Jian Li9557e902021-06-08 10:12:52 +0900200 return vmName.equals(that.vmName) && networkId.equals(that.networkId) &&
201 macAddress.equals(that.macAddress) && ipAddress.equals(that.ipAddress) &&
202 deviceId.equals(that.deviceId) && portNumber.equals(that.portNumber) &&
203 securityGroups.equals(that.securityGroups);
Jian Lib9642832021-01-08 03:18:35 +0900204 }
205
206 @Override
207 public int hashCode() {
Jian Li9557e902021-06-08 10:12:52 +0900208 return Objects.hash(vmName, networkId, macAddress, ipAddress, deviceId, portNumber, securityGroups);
Jian Lib9642832021-01-08 03:18:35 +0900209 }
210
211 @Override
212 public String toString() {
213 return MoreObjects.toStringHelper(this)
Jian Li9557e902021-06-08 10:12:52 +0900214 .add("vmName", vmName)
Jian Li3ba5c582021-01-14 11:30:36 +0900215 .add("networkId", networkId)
Jian Lib9642832021-01-08 03:18:35 +0900216 .add("macAddress", macAddress)
217 .add("ipAddress", ipAddress)
218 .add("deviceId", deviceId)
219 .add("portNumber", portNumber)
Jian Li8f944d42021-03-23 00:43:29 +0900220 .add("securityGroups", securityGroups)
Jian Lib9642832021-01-08 03:18:35 +0900221 .toString();
222 }
223
224 /**
225 * Returns new builder instance.
226 *
227 * @return kubevirt port builder
228 */
229 public static Builder builder() {
230 return new Builder();
231 }
232
233 /**
234 * Default builder implementation.
235 */
236 public static final class Builder implements KubevirtPort.Builder {
237
Jian Li9557e902021-06-08 10:12:52 +0900238 private String vmName;
Jian Li3ba5c582021-01-14 11:30:36 +0900239 private String networkId;
Jian Lib9642832021-01-08 03:18:35 +0900240 private MacAddress macAddress;
241 private IpAddress ipAddress;
242 private DeviceId deviceId;
243 private PortNumber portNumber;
Jian Li8f944d42021-03-23 00:43:29 +0900244 private Set<String> securityGroups;
Jian Lib9642832021-01-08 03:18:35 +0900245
246 // private constructor not intended to use from external
247 private Builder() {
248 }
249
250 @Override
251 public KubevirtPort build() {
Jian Li9557e902021-06-08 10:12:52 +0900252 checkArgument(vmName != null, NOT_NULL_MSG, "vmName");
Jian Li3ba5c582021-01-14 11:30:36 +0900253 checkArgument(networkId != null, NOT_NULL_MSG, "networkId");
Jian Lib9642832021-01-08 03:18:35 +0900254 checkArgument(macAddress != null, NOT_NULL_MSG, "macAddress");
Jian Lib9642832021-01-08 03:18:35 +0900255
Jian Li9557e902021-06-08 10:12:52 +0900256 return new DefaultKubevirtPort(vmName, networkId, macAddress,
257 ipAddress, deviceId, portNumber, securityGroups);
258 }
259
260 @Override
261 public KubevirtPort.Builder vmName(String vmName) {
262 this.vmName = vmName;
263 return this;
Jian Li3ba5c582021-01-14 11:30:36 +0900264 }
265
266 @Override
267 public Builder networkId(String networkId) {
268 this.networkId = networkId;
269 return this;
Jian Lib9642832021-01-08 03:18:35 +0900270 }
271
272 @Override
273 public Builder macAddress(MacAddress macAddress) {
274 this.macAddress = macAddress;
275 return this;
276 }
277
278 @Override
279 public Builder ipAddress(IpAddress ipAddress) {
280 this.ipAddress = ipAddress;
281 return this;
282 }
283
284 @Override
285 public Builder deviceId(DeviceId deviceId) {
286 this.deviceId = deviceId;
287 return this;
288 }
289
290 @Override
291 public Builder portNumber(PortNumber portNumber) {
292 this.portNumber = portNumber;
293 return this;
294 }
Jian Li8f944d42021-03-23 00:43:29 +0900295
296 @Override
297 public Builder securityGroups(Set<String> securityGroups) {
298 this.securityGroups = securityGroups;
299 return this;
300 }
Jian Lib9642832021-01-08 03:18:35 +0900301 }
302}