blob: 98653d914a7672a3366d96693ef80c7a67b4bb68 [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;
43
44 /**
45 * A default constructor.
46 *
47 * @param name router name
48 * @param description router description
49 * @param enableSnat snat use indicator
50 * @param internal internal networks
51 * @param external external network
52 * @param peerRouter external peer router
53 */
54 public DefaultKubevirtRouter(String name, String description, boolean enableSnat,
55 Set<String> internal,
Jian Li7eb20782021-02-27 01:10:50 +090056 Map<String, String> external,
Jian Li70c32de2021-02-26 18:15:20 +090057 KubevirtPeerRouter peerRouter) {
58 this.name = name;
59 this.description = description;
60 this.enableSnat = enableSnat;
61 this.internal = internal;
62 this.external = external;
63 this.peerRouter = peerRouter;
64 }
65
66 @Override
67 public String name() {
68 return name;
69 }
70
71 @Override
72 public String description() {
73 return description;
74 }
75
76 @Override
77 public boolean enableSnat() {
78 return enableSnat;
79 }
80
81 @Override
82 public Set<String> internal() {
Jian Li4acd4542021-03-03 14:46:50 +090083 if (internal == null) {
84 return ImmutableSet.of();
85 } else {
86 return ImmutableSet.copyOf(internal);
87 }
Jian Li70c32de2021-02-26 18:15:20 +090088 }
89
90 @Override
Jian Li7eb20782021-02-27 01:10:50 +090091 public Map<String, String> external() {
Jian Li4acd4542021-03-03 14:46:50 +090092 if (external == null) {
93 return ImmutableMap.of();
94 } else {
95 return ImmutableMap.copyOf(external);
96 }
Jian Li70c32de2021-02-26 18:15:20 +090097 }
98
99 @Override
100 public KubevirtPeerRouter peerRouter() {
101 return peerRouter;
102 }
103
104 @Override
Jian Li7eb20782021-02-27 01:10:50 +0900105 public KubevirtRouter updatePeerRouter(KubevirtPeerRouter updated) {
106 return DefaultKubevirtRouter.builder()
107 .name(name)
108 .enableSnat(enableSnat)
109 .description(description)
110 .internal(internal)
111 .external(external)
112 .peerRouter(updated)
113 .build();
114 }
115
116 @Override
Jian Li70c32de2021-02-26 18:15:20 +0900117 public boolean equals(Object o) {
118 if (this == o) {
119 return true;
120 }
121 if (o == null || getClass() != o.getClass()) {
122 return false;
123 }
124 DefaultKubevirtRouter that = (DefaultKubevirtRouter) o;
125 return enableSnat == that.enableSnat && name.equals(that.name) &&
126 description.equals(that.description) && internal.equals(that.internal) &&
127 external.equals(that.external) && peerRouter.equals(that.peerRouter);
128 }
129
130 @Override
131 public int hashCode() {
132 return Objects.hash(name, description, enableSnat, internal, external, peerRouter);
133 }
134
135 @Override
136 public String toString() {
137 return MoreObjects.toStringHelper(this)
138 .add("name", name)
139 .add("description", description)
140 .add("enableSnat", enableSnat)
141 .add("internal", internal)
142 .add("external", external)
143 .add("peerRouter", peerRouter)
144 .toString();
145 }
146
147 /**
148 * Returns new builder instance.
149 *
150 * @return kubevirt router builder
151 */
152 public static Builder builder() {
153 return new Builder();
154 }
155
156 public static final class Builder implements KubevirtRouter.Builder {
157
158 private String name;
159 private String description;
160 private boolean enableSnat;
161 private Set<String> internal;
Jian Li7eb20782021-02-27 01:10:50 +0900162 private Map<String, String> external;
Jian Li70c32de2021-02-26 18:15:20 +0900163 private KubevirtPeerRouter peerRouter;
164
165 @Override
166 public KubevirtRouter build() {
167 checkArgument(name != null, NOT_NULL_MSG, "name");
168
169 return new DefaultKubevirtRouter(name, description, enableSnat,
170 internal, external, peerRouter);
171 }
172
173 @Override
174 public Builder name(String name) {
175 this.name = name;
176 return this;
177 }
178
179 @Override
180 public Builder description(String description) {
181 this.description = description;
182 return this;
183 }
184
185 @Override
186 public Builder enableSnat(boolean flag) {
187 this.enableSnat = flag;
188 return this;
189 }
190
191 @Override
192 public Builder internal(Set<String> internal) {
193 this.internal = Objects.requireNonNullElseGet(internal, HashSet::new);
194 return this;
195 }
196
197 @Override
Jian Li7eb20782021-02-27 01:10:50 +0900198 public Builder external(Map<String, String> external) {
Jian Li70c32de2021-02-26 18:15:20 +0900199 this.external = Objects.requireNonNullElseGet(external, HashMap::new);
200 return this;
201 }
202
203 @Override
204 public Builder peerRouter(KubevirtPeerRouter router) {
205 this.peerRouter = router;
206 return this;
207 }
208 }
209}