blob: 2a7385fed9495895c0cc8a3e266298a79e785572 [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);
95 return network.tenantDeviceId(node.hostname());
96 }
97
98 @Override
99 public boolean isTenant() {
100 KubevirtNetworkService networkService =
101 DefaultServiceDirectory.getService(KubevirtNetworkService.class);
102 KubevirtNetwork network = networkService.network(networkId);
103 return network.type() == KubevirtNetwork.Type.VXLAN ||
104 network.type() == KubevirtNetwork.Type.GRE ||
105 network.type() == KubevirtNetwork.Type.GENEVE;
106 }
107
108 @Override
Jian Lib9642832021-01-08 03:18:35 +0900109 public PortNumber portNumber() {
110 return portNumber;
111 }
112
113 @Override
Jian Lica20b712021-01-18 00:19:31 +0900114 public KubevirtPort updateIpAddress(IpAddress updateIpAddress) {
Jian Li0b481122021-01-17 04:26:18 +0900115 return new Builder()
116 .networkId(networkId)
117 .macAddress(macAddress)
Jian Lica20b712021-01-18 00:19:31 +0900118 .ipAddress(updateIpAddress)
Jian Li0b481122021-01-17 04:26:18 +0900119 .deviceId(deviceId)
120 .portNumber(portNumber)
Jian Li8f944d42021-03-23 00:43:29 +0900121 .securityGroups(securityGroups)
Jian Li0b481122021-01-17 04:26:18 +0900122 .build();
Jian Lib9642832021-01-08 03:18:35 +0900123 }
124
125 @Override
Jian Lica20b712021-01-18 00:19:31 +0900126 public KubevirtPort updatePortNumber(PortNumber updatedPortNumber) {
Jian Li0b481122021-01-17 04:26:18 +0900127 return new Builder()
128 .networkId(networkId)
129 .macAddress(macAddress)
130 .ipAddress(ipAddress)
131 .deviceId(deviceId)
Jian Lica20b712021-01-18 00:19:31 +0900132 .portNumber(updatedPortNumber)
Jian Li8f944d42021-03-23 00:43:29 +0900133 .securityGroups(securityGroups)
Jian Lica20b712021-01-18 00:19:31 +0900134 .build();
135 }
136
137 @Override
138 public KubevirtPort updateDeviceId(DeviceId updatedDeviceId) {
139 return new Builder()
140 .networkId(networkId)
141 .macAddress(macAddress)
142 .ipAddress(ipAddress)
143 .deviceId(updatedDeviceId)
Jian Li0b481122021-01-17 04:26:18 +0900144 .portNumber(portNumber)
Jian Li8f944d42021-03-23 00:43:29 +0900145 .securityGroups(securityGroups)
146 .build();
147 }
148
149 @Override
150 public Set<String> securityGroups() {
151 if (securityGroups != null) {
152 return ImmutableSet.copyOf(securityGroups);
153 } else {
154 return ImmutableSet.of();
155 }
156 }
157
158 @Override
159 public KubevirtPort updateSecurityGroups(Set<String> sgs) {
160 return new Builder()
161 .networkId(networkId)
162 .macAddress(macAddress)
163 .ipAddress(ipAddress)
164 .deviceId(deviceId)
165 .portNumber(portNumber)
166 .securityGroups(sgs)
Jian Li0b481122021-01-17 04:26:18 +0900167 .build();
Jian Lib9642832021-01-08 03:18:35 +0900168 }
169
170 @Override
171 public boolean equals(Object o) {
172 if (this == o) {
173 return true;
174 }
175 if (o == null || getClass() != o.getClass()) {
176 return false;
177 }
178 DefaultKubevirtPort that = (DefaultKubevirtPort) o;
Jian Li3ba5c582021-01-14 11:30:36 +0900179 return networkId.equals(that.networkId) && macAddress.equals(that.macAddress) &&
180 ipAddress.equals(that.ipAddress) && deviceId.equals(that.deviceId) &&
Jian Li8f944d42021-03-23 00:43:29 +0900181 portNumber.equals(that.portNumber) && securityGroups.equals(that.securityGroups);
Jian Lib9642832021-01-08 03:18:35 +0900182 }
183
184 @Override
185 public int hashCode() {
Jian Li8f944d42021-03-23 00:43:29 +0900186 return Objects.hash(networkId, macAddress, ipAddress, deviceId, portNumber, securityGroups);
Jian Lib9642832021-01-08 03:18:35 +0900187 }
188
189 @Override
190 public String toString() {
191 return MoreObjects.toStringHelper(this)
Jian Li3ba5c582021-01-14 11:30:36 +0900192 .add("networkId", networkId)
Jian Lib9642832021-01-08 03:18:35 +0900193 .add("macAddress", macAddress)
194 .add("ipAddress", ipAddress)
195 .add("deviceId", deviceId)
196 .add("portNumber", portNumber)
Jian Li8f944d42021-03-23 00:43:29 +0900197 .add("securityGroups", securityGroups)
Jian Lib9642832021-01-08 03:18:35 +0900198 .toString();
199 }
200
201 /**
202 * Returns new builder instance.
203 *
204 * @return kubevirt port builder
205 */
206 public static Builder builder() {
207 return new Builder();
208 }
209
210 /**
211 * Default builder implementation.
212 */
213 public static final class Builder implements KubevirtPort.Builder {
214
Jian Li3ba5c582021-01-14 11:30:36 +0900215 private String networkId;
Jian Lib9642832021-01-08 03:18:35 +0900216 private MacAddress macAddress;
217 private IpAddress ipAddress;
218 private DeviceId deviceId;
219 private PortNumber portNumber;
Jian Li8f944d42021-03-23 00:43:29 +0900220 private Set<String> securityGroups;
Jian Lib9642832021-01-08 03:18:35 +0900221
222 // private constructor not intended to use from external
223 private Builder() {
224 }
225
226 @Override
227 public KubevirtPort build() {
Jian Li3ba5c582021-01-14 11:30:36 +0900228 checkArgument(networkId != null, NOT_NULL_MSG, "networkId");
Jian Lib9642832021-01-08 03:18:35 +0900229 checkArgument(macAddress != null, NOT_NULL_MSG, "macAddress");
Jian Lib9642832021-01-08 03:18:35 +0900230
Jian Li3ba5c582021-01-14 11:30:36 +0900231 return new DefaultKubevirtPort(networkId, macAddress, ipAddress,
Jian Li8f944d42021-03-23 00:43:29 +0900232 deviceId, portNumber, securityGroups);
Jian Li3ba5c582021-01-14 11:30:36 +0900233 }
234
235 @Override
236 public Builder networkId(String networkId) {
237 this.networkId = networkId;
238 return this;
Jian Lib9642832021-01-08 03:18:35 +0900239 }
240
241 @Override
242 public Builder macAddress(MacAddress macAddress) {
243 this.macAddress = macAddress;
244 return this;
245 }
246
247 @Override
248 public Builder ipAddress(IpAddress ipAddress) {
249 this.ipAddress = ipAddress;
250 return this;
251 }
252
253 @Override
254 public Builder deviceId(DeviceId deviceId) {
255 this.deviceId = deviceId;
256 return this;
257 }
258
259 @Override
260 public Builder portNumber(PortNumber portNumber) {
261 this.portNumber = portNumber;
262 return this;
263 }
Jian Li8f944d42021-03-23 00:43:29 +0900264
265 @Override
266 public Builder securityGroups(Set<String> securityGroups) {
267 this.securityGroups = securityGroups;
268 return this;
269 }
Jian Lib9642832021-01-08 03:18:35 +0900270 }
271}