blob: 84a59987a3b714cda967c5ebcf3d4cb338ed7b22 [file] [log] [blame]
Jian Li70c32de2021-02-26 18:15:20 +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;
19import com.google.common.collect.ImmutableMap;
20import com.google.common.collect.ImmutableSet;
Jian Lic49017d2021-03-16 16:06:33 +090021import org.onlab.packet.MacAddress;
Jian Li70c32de2021-02-26 18:15:20 +090022
23import java.util.HashMap;
24import java.util.HashSet;
25import java.util.Map;
26import java.util.Objects;
27import java.util.Set;
28
29import static com.google.common.base.Preconditions.checkArgument;
30
31/**
32 * Default implementation class of kubevirt router.
33 */
34public final class DefaultKubevirtRouter implements KubevirtRouter {
35
36 private static final String NOT_NULL_MSG = "Router % cannot be null";
37
38 private final String name;
39 private final String description;
40 private final boolean enableSnat;
Jian Lic49017d2021-03-16 16:06:33 +090041 private final MacAddress mac;
Jian Li70c32de2021-02-26 18:15:20 +090042 private final Set<String> internal;
Jian Li7eb20782021-02-27 01:10:50 +090043 private final Map<String, String> external;
Jian Li70c32de2021-02-26 18:15:20 +090044 private final KubevirtPeerRouter peerRouter;
Daniel Parkb9a22022021-03-04 18:58:47 +090045 private final String gateway;
Jian Li70c32de2021-02-26 18:15:20 +090046
47 /**
48 * A default constructor.
49 *
50 * @param name router name
51 * @param description router description
52 * @param enableSnat snat use indicator
Jian Lic49017d2021-03-16 16:06:33 +090053 * @param mac MAC address
Jian Li70c32de2021-02-26 18:15:20 +090054 * @param internal internal networks
55 * @param external external network
56 * @param peerRouter external peer router
Daniel Parkb9a22022021-03-04 18:58:47 +090057 * @param gateway elected gateway node id
Jian Li70c32de2021-02-26 18:15:20 +090058 */
Jian Lic49017d2021-03-16 16:06:33 +090059 public DefaultKubevirtRouter(String name, String description,
60 boolean enableSnat, MacAddress mac,
Jian Li70c32de2021-02-26 18:15:20 +090061 Set<String> internal,
Jian Li7eb20782021-02-27 01:10:50 +090062 Map<String, String> external,
Daniel Parkb9a22022021-03-04 18:58:47 +090063 KubevirtPeerRouter peerRouter,
64 String gateway) {
Jian Li70c32de2021-02-26 18:15:20 +090065 this.name = name;
66 this.description = description;
67 this.enableSnat = enableSnat;
Jian Lic49017d2021-03-16 16:06:33 +090068 this.mac = mac;
Jian Li70c32de2021-02-26 18:15:20 +090069 this.internal = internal;
70 this.external = external;
71 this.peerRouter = peerRouter;
Daniel Parkb9a22022021-03-04 18:58:47 +090072 this.gateway = gateway;
Jian Li70c32de2021-02-26 18:15:20 +090073 }
74
75 @Override
76 public String name() {
77 return name;
78 }
79
80 @Override
81 public String description() {
82 return description;
83 }
84
85 @Override
86 public boolean enableSnat() {
87 return enableSnat;
88 }
89
90 @Override
Jian Lic49017d2021-03-16 16:06:33 +090091 public MacAddress mac() {
92 return mac;
93 }
94
95 @Override
Jian Li70c32de2021-02-26 18:15:20 +090096 public Set<String> internal() {
Jian Li4acd4542021-03-03 14:46:50 +090097 if (internal == null) {
98 return ImmutableSet.of();
99 } else {
100 return ImmutableSet.copyOf(internal);
101 }
Jian Li70c32de2021-02-26 18:15:20 +0900102 }
103
104 @Override
Jian Li7eb20782021-02-27 01:10:50 +0900105 public Map<String, String> external() {
Jian Li4acd4542021-03-03 14:46:50 +0900106 if (external == null) {
107 return ImmutableMap.of();
108 } else {
109 return ImmutableMap.copyOf(external);
110 }
Jian Li70c32de2021-02-26 18:15:20 +0900111 }
112
113 @Override
114 public KubevirtPeerRouter peerRouter() {
115 return peerRouter;
116 }
117
118 @Override
Daniel Parkb9a22022021-03-04 18:58:47 +0900119 public String electedGateway() {
120 return gateway;
121 }
122
123 @Override
Jian Li7eb20782021-02-27 01:10:50 +0900124 public KubevirtRouter updatePeerRouter(KubevirtPeerRouter updated) {
125 return DefaultKubevirtRouter.builder()
126 .name(name)
127 .enableSnat(enableSnat)
128 .description(description)
Jian Lic49017d2021-03-16 16:06:33 +0900129 .mac(mac)
Jian Li7eb20782021-02-27 01:10:50 +0900130 .internal(internal)
131 .external(external)
132 .peerRouter(updated)
Daniel Parkb9a22022021-03-04 18:58:47 +0900133 .electedGateway(gateway)
134 .build();
135 }
136
137 @Override
138 public KubevirtRouter updatedElectedGateway(String updated) {
139 return DefaultKubevirtRouter.builder()
140 .name(name)
141 .enableSnat(enableSnat)
142 .description(description)
Jian Lic49017d2021-03-16 16:06:33 +0900143 .mac(mac)
Daniel Parkb9a22022021-03-04 18:58:47 +0900144 .internal(internal)
145 .external(external)
146 .peerRouter(peerRouter)
147 .electedGateway(updated)
Jian Li7eb20782021-02-27 01:10:50 +0900148 .build();
149 }
150
151 @Override
Jian Li70c32de2021-02-26 18:15:20 +0900152 public boolean equals(Object o) {
153 if (this == o) {
154 return true;
155 }
156 if (o == null || getClass() != o.getClass()) {
157 return false;
158 }
159 DefaultKubevirtRouter that = (DefaultKubevirtRouter) o;
160 return enableSnat == that.enableSnat && name.equals(that.name) &&
Jian Lic49017d2021-03-16 16:06:33 +0900161 description.equals(that.description) && mac.equals(that.mac) &&
162 internal.equals(that.internal) && external.equals(that.external) &&
163 peerRouter.equals(that.peerRouter) && gateway.equals(that.electedGateway());
Jian Li70c32de2021-02-26 18:15:20 +0900164 }
165
166 @Override
167 public int hashCode() {
Jian Lic49017d2021-03-16 16:06:33 +0900168 return Objects.hash(name, description, mac, enableSnat,
Daniel Parkb9a22022021-03-04 18:58:47 +0900169 internal, external, peerRouter, gateway);
Jian Li70c32de2021-02-26 18:15:20 +0900170 }
171
172 @Override
173 public String toString() {
174 return MoreObjects.toStringHelper(this)
175 .add("name", name)
176 .add("description", description)
177 .add("enableSnat", enableSnat)
Jian Lic49017d2021-03-16 16:06:33 +0900178 .add("mac", mac)
Jian Li70c32de2021-02-26 18:15:20 +0900179 .add("internal", internal)
180 .add("external", external)
181 .add("peerRouter", peerRouter)
Daniel Parkb9a22022021-03-04 18:58:47 +0900182 .add("electedGateway", gateway)
Jian Li70c32de2021-02-26 18:15:20 +0900183 .toString();
184 }
185
186 /**
187 * Returns new builder instance.
188 *
189 * @return kubevirt router builder
190 */
191 public static Builder builder() {
192 return new Builder();
193 }
194
195 public static final class Builder implements KubevirtRouter.Builder {
196
197 private String name;
198 private String description;
199 private boolean enableSnat;
Jian Lic49017d2021-03-16 16:06:33 +0900200 private MacAddress mac;
Jian Li70c32de2021-02-26 18:15:20 +0900201 private Set<String> internal;
Jian Li7eb20782021-02-27 01:10:50 +0900202 private Map<String, String> external;
Jian Li70c32de2021-02-26 18:15:20 +0900203 private KubevirtPeerRouter peerRouter;
Daniel Parkb9a22022021-03-04 18:58:47 +0900204 private String gateway;
Jian Li70c32de2021-02-26 18:15:20 +0900205
206 @Override
207 public KubevirtRouter build() {
208 checkArgument(name != null, NOT_NULL_MSG, "name");
209
Jian Lic49017d2021-03-16 16:06:33 +0900210 return new DefaultKubevirtRouter(name, description, enableSnat, mac,
Daniel Parkb9a22022021-03-04 18:58:47 +0900211 internal, external, peerRouter, gateway);
Jian Li70c32de2021-02-26 18:15:20 +0900212 }
213
214 @Override
215 public Builder name(String name) {
216 this.name = name;
217 return this;
218 }
219
220 @Override
221 public Builder description(String description) {
222 this.description = description;
223 return this;
224 }
225
226 @Override
227 public Builder enableSnat(boolean flag) {
228 this.enableSnat = flag;
229 return this;
230 }
231
232 @Override
Jian Lic49017d2021-03-16 16:06:33 +0900233 public Builder mac(MacAddress mac) {
234 this.mac = mac;
235 return this;
236 }
237
238 @Override
Jian Li70c32de2021-02-26 18:15:20 +0900239 public Builder internal(Set<String> internal) {
240 this.internal = Objects.requireNonNullElseGet(internal, HashSet::new);
241 return this;
242 }
243
244 @Override
Jian Li7eb20782021-02-27 01:10:50 +0900245 public Builder external(Map<String, String> external) {
Jian Li70c32de2021-02-26 18:15:20 +0900246 this.external = Objects.requireNonNullElseGet(external, HashMap::new);
247 return this;
248 }
249
250 @Override
251 public Builder peerRouter(KubevirtPeerRouter router) {
252 this.peerRouter = router;
253 return this;
254 }
Daniel Parkb9a22022021-03-04 18:58:47 +0900255
256 @Override
257 public Builder electedGateway(String gateway) {
258 this.gateway = gateway;
259 return this;
260 }
Jian Li70c32de2021-02-26 18:15:20 +0900261 }
262}