blob: f6a95458a0e4f6ae1bb1bb7c276282b860deff73 [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 Li70c32de2021-02-26 18:15:20 +090021
22import java.util.HashMap;
23import java.util.HashSet;
24import java.util.Map;
25import java.util.Objects;
26import java.util.Set;
27
28import static com.google.common.base.Preconditions.checkArgument;
29
30/**
31 * Default implementation class of kubevirt router.
32 */
33public final class DefaultKubevirtRouter implements KubevirtRouter {
34
35 private static final String NOT_NULL_MSG = "Router % cannot be null";
36
37 private final String name;
38 private final String description;
39 private final boolean enableSnat;
40 private final Set<String> internal;
Jian Li7eb20782021-02-27 01:10:50 +090041 private final Map<String, String> external;
Jian Li70c32de2021-02-26 18:15:20 +090042 private final KubevirtPeerRouter peerRouter;
Daniel Parkb9a22022021-03-04 18:58:47 +090043 private final String gateway;
Jian Li70c32de2021-02-26 18:15:20 +090044
45 /**
46 * A default constructor.
47 *
48 * @param name router name
49 * @param description router description
50 * @param enableSnat snat use indicator
51 * @param internal internal networks
52 * @param external external network
53 * @param peerRouter external peer router
Daniel Parkb9a22022021-03-04 18:58:47 +090054 * @param gateway elected gateway node id
Jian Li70c32de2021-02-26 18:15:20 +090055 */
56 public DefaultKubevirtRouter(String name, String description, boolean enableSnat,
57 Set<String> internal,
Jian Li7eb20782021-02-27 01:10:50 +090058 Map<String, String> external,
Daniel Parkb9a22022021-03-04 18:58:47 +090059 KubevirtPeerRouter peerRouter,
60 String gateway) {
Jian Li70c32de2021-02-26 18:15:20 +090061 this.name = name;
62 this.description = description;
63 this.enableSnat = enableSnat;
64 this.internal = internal;
65 this.external = external;
66 this.peerRouter = peerRouter;
Daniel Parkb9a22022021-03-04 18:58:47 +090067 this.gateway = gateway;
Jian Li70c32de2021-02-26 18:15:20 +090068 }
69
70 @Override
71 public String name() {
72 return name;
73 }
74
75 @Override
76 public String description() {
77 return description;
78 }
79
80 @Override
81 public boolean enableSnat() {
82 return enableSnat;
83 }
84
85 @Override
86 public Set<String> internal() {
Jian Li4acd4542021-03-03 14:46:50 +090087 if (internal == null) {
88 return ImmutableSet.of();
89 } else {
90 return ImmutableSet.copyOf(internal);
91 }
Jian Li70c32de2021-02-26 18:15:20 +090092 }
93
94 @Override
Jian Li7eb20782021-02-27 01:10:50 +090095 public Map<String, String> external() {
Jian Li4acd4542021-03-03 14:46:50 +090096 if (external == null) {
97 return ImmutableMap.of();
98 } else {
99 return ImmutableMap.copyOf(external);
100 }
Jian Li70c32de2021-02-26 18:15:20 +0900101 }
102
103 @Override
104 public KubevirtPeerRouter peerRouter() {
105 return peerRouter;
106 }
107
108 @Override
Daniel Parkb9a22022021-03-04 18:58:47 +0900109 public String electedGateway() {
110 return gateway;
111 }
112
113 @Override
Jian Li7eb20782021-02-27 01:10:50 +0900114 public KubevirtRouter updatePeerRouter(KubevirtPeerRouter updated) {
115 return DefaultKubevirtRouter.builder()
116 .name(name)
117 .enableSnat(enableSnat)
118 .description(description)
119 .internal(internal)
120 .external(external)
121 .peerRouter(updated)
Daniel Parkb9a22022021-03-04 18:58:47 +0900122 .electedGateway(gateway)
123 .build();
124 }
125
126 @Override
127 public KubevirtRouter updatedElectedGateway(String updated) {
128 return DefaultKubevirtRouter.builder()
129 .name(name)
130 .enableSnat(enableSnat)
131 .description(description)
132 .internal(internal)
133 .external(external)
134 .peerRouter(peerRouter)
135 .electedGateway(updated)
Jian Li7eb20782021-02-27 01:10:50 +0900136 .build();
137 }
138
139 @Override
Jian Li70c32de2021-02-26 18:15:20 +0900140 public boolean equals(Object o) {
141 if (this == o) {
142 return true;
143 }
144 if (o == null || getClass() != o.getClass()) {
145 return false;
146 }
147 DefaultKubevirtRouter that = (DefaultKubevirtRouter) o;
148 return enableSnat == that.enableSnat && name.equals(that.name) &&
149 description.equals(that.description) && internal.equals(that.internal) &&
Daniel Parkb9a22022021-03-04 18:58:47 +0900150 external.equals(that.external) && peerRouter.equals(that.peerRouter) &&
151 gateway.equals(that.electedGateway());
Jian Li70c32de2021-02-26 18:15:20 +0900152 }
153
154 @Override
155 public int hashCode() {
Daniel Parkb9a22022021-03-04 18:58:47 +0900156 return Objects.hash(name, description, enableSnat,
157 internal, external, peerRouter, gateway);
Jian Li70c32de2021-02-26 18:15:20 +0900158 }
159
160 @Override
161 public String toString() {
162 return MoreObjects.toStringHelper(this)
163 .add("name", name)
164 .add("description", description)
165 .add("enableSnat", enableSnat)
166 .add("internal", internal)
167 .add("external", external)
168 .add("peerRouter", peerRouter)
Daniel Parkb9a22022021-03-04 18:58:47 +0900169 .add("electedGateway", gateway)
Jian Li70c32de2021-02-26 18:15:20 +0900170 .toString();
171 }
172
173 /**
174 * Returns new builder instance.
175 *
176 * @return kubevirt router builder
177 */
178 public static Builder builder() {
179 return new Builder();
180 }
181
182 public static final class Builder implements KubevirtRouter.Builder {
183
184 private String name;
185 private String description;
186 private boolean enableSnat;
187 private Set<String> internal;
Jian Li7eb20782021-02-27 01:10:50 +0900188 private Map<String, String> external;
Jian Li70c32de2021-02-26 18:15:20 +0900189 private KubevirtPeerRouter peerRouter;
Daniel Parkb9a22022021-03-04 18:58:47 +0900190 private String gateway;
Jian Li70c32de2021-02-26 18:15:20 +0900191
192 @Override
193 public KubevirtRouter build() {
194 checkArgument(name != null, NOT_NULL_MSG, "name");
195
196 return new DefaultKubevirtRouter(name, description, enableSnat,
Daniel Parkb9a22022021-03-04 18:58:47 +0900197 internal, external, peerRouter, gateway);
Jian Li70c32de2021-02-26 18:15:20 +0900198 }
199
200 @Override
201 public Builder name(String name) {
202 this.name = name;
203 return this;
204 }
205
206 @Override
207 public Builder description(String description) {
208 this.description = description;
209 return this;
210 }
211
212 @Override
213 public Builder enableSnat(boolean flag) {
214 this.enableSnat = flag;
215 return this;
216 }
217
218 @Override
219 public Builder internal(Set<String> internal) {
220 this.internal = Objects.requireNonNullElseGet(internal, HashSet::new);
221 return this;
222 }
223
224 @Override
Jian Li7eb20782021-02-27 01:10:50 +0900225 public Builder external(Map<String, String> external) {
Jian Li70c32de2021-02-26 18:15:20 +0900226 this.external = Objects.requireNonNullElseGet(external, HashMap::new);
227 return this;
228 }
229
230 @Override
231 public Builder peerRouter(KubevirtPeerRouter router) {
232 this.peerRouter = router;
233 return this;
234 }
Daniel Parkb9a22022021-03-04 18:58:47 +0900235
236 @Override
237 public Builder electedGateway(String gateway) {
238 this.gateway = gateway;
239 return this;
240 }
Jian Li70c32de2021-02-26 18:15:20 +0900241 }
242}