blob: 8280b1f889e8686a824abcda7e5f27bc7ea2c634 [file] [log] [blame]
Hyunsun Moon44aac662017-02-18 02:07:01 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Hyunsun Moon44aac662017-02-18 02:07:01 +09003 *
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.openstacknetworking.impl;
17
18import com.google.common.base.Strings;
19import com.google.common.collect.ImmutableSet;
Hyunsun Moon44aac662017-02-18 02:07:01 +090020import org.onosproject.core.CoreService;
21import org.onosproject.event.ListenerRegistry;
22import org.onosproject.openstacknetworking.api.Constants;
23import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
24import org.onosproject.openstacknetworking.api.OpenstackRouterEvent;
25import org.onosproject.openstacknetworking.api.OpenstackRouterListener;
26import org.onosproject.openstacknetworking.api.OpenstackRouterService;
27import org.onosproject.openstacknetworking.api.OpenstackRouterStore;
28import org.onosproject.openstacknetworking.api.OpenstackRouterStoreDelegate;
29import org.openstack4j.model.network.NetFloatingIP;
30import org.openstack4j.model.network.Router;
31import org.openstack4j.model.network.RouterInterface;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070032import org.osgi.service.component.annotations.Activate;
33import org.osgi.service.component.annotations.Component;
34import org.osgi.service.component.annotations.Deactivate;
35import org.osgi.service.component.annotations.Reference;
36import org.osgi.service.component.annotations.ReferenceCardinality;
Hyunsun Moon44aac662017-02-18 02:07:01 +090037import org.slf4j.Logger;
38
39import java.util.Objects;
40import java.util.Set;
41import java.util.stream.Collectors;
42
43import static com.google.common.base.Preconditions.checkArgument;
44import static com.google.common.base.Preconditions.checkNotNull;
Jian Li5b22f112020-10-05 22:36:41 +090045import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.deriveResourceName;
Hyunsun Moon44aac662017-02-18 02:07:01 +090046import static org.slf4j.LoggerFactory.getLogger;
47
48/**
49 * Provides implementation of administering and interfacing OpenStack router and
50 * floating IP address.
51 */
Jian Li5ecfd1a2018-12-10 11:41:03 +090052@Component(
53 immediate = true,
54 service = { OpenstackRouterAdminService.class, OpenstackRouterService.class }
55)
Hyunsun Moon44aac662017-02-18 02:07:01 +090056public class OpenstackRouterManager
57 extends ListenerRegistry<OpenstackRouterEvent, OpenstackRouterListener>
58 implements OpenstackRouterAdminService, OpenstackRouterService {
59
60 protected final Logger log = getLogger(getClass());
61
62 private static final String MSG_ROUTER = "OpenStack router %s %s";
63 private static final String MSG_ROUTER_IFACE = "OpenStack router interface %s %s";
64 private static final String MSG_FLOATING_IP = "OpenStack floating IP %s %s";
65 private static final String MSG_CREATED = "created";
66 private static final String MSG_UPDATED = "updated";
67 private static final String MSG_REMOVED = "removed";
68
Jian Li5ecfd1a2018-12-10 11:41:03 +090069 private static final String ERR_NULL_ROUTER =
70 "OpenStack router cannot be null";
71 private static final String ERR_NULL_ROUTER_ID =
72 "OpenStack router ID cannot be null";
73 private static final String ERR_NULL_ROUTER_NAME =
74 "OpenStack router name cannot be null";
75 private static final String ERR_NULL_IFACE =
76 "OpenStack router interface cannot be null";
77 private static final String ERR_NULL_IFACE_ROUTER_ID =
78 "OpenStack router interface router ID cannot be null";
79 private static final String ERR_NULL_IFACE_PORT_ID =
80 "OpenStack router interface port ID cannot be null";
81 private static final String ERR_NULL_FLOATING =
82 "OpenStack floating IP cannot be null";
83 private static final String ERR_NULL_FLOATING_ID =
84 "OpenStack floating IP cannot be null";
Hyunsun Moon44aac662017-02-18 02:07:01 +090085
86 private static final String ERR_IN_USE = " still in use";
87
Ray Milkeyd84f89b2018-08-17 14:54:17 -070088 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Hyunsun Moon44aac662017-02-18 02:07:01 +090089 protected CoreService coreService;
90
Ray Milkeyd84f89b2018-08-17 14:54:17 -070091 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Hyunsun Moon44aac662017-02-18 02:07:01 +090092 protected OpenstackRouterStore osRouterStore;
93
Jian Li5ecfd1a2018-12-10 11:41:03 +090094 private final OpenstackRouterStoreDelegate
95 delegate = new InternalRouterStoreDelegate();
Hyunsun Moon44aac662017-02-18 02:07:01 +090096
97 @Activate
98 protected void activate() {
99 coreService.registerApplication(Constants.OPENSTACK_NETWORKING_APP_ID);
100 osRouterStore.setDelegate(delegate);
101 log.info("Started");
102 }
103
104 @Deactivate
105 protected void deactivate() {
106 osRouterStore.unsetDelegate(delegate);
107 log.info("Stopped");
108 }
109
110 @Override
111 public void createRouter(Router osRouter) {
112 checkNotNull(osRouter, ERR_NULL_ROUTER);
113 checkArgument(!Strings.isNullOrEmpty(osRouter.getId()), ERR_NULL_ROUTER_ID);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900114
115 osRouterStore.createRouter(osRouter);
Jian Li5b22f112020-10-05 22:36:41 +0900116 log.info(String.format(MSG_ROUTER, deriveResourceName(osRouter), MSG_CREATED));
Hyunsun Moon44aac662017-02-18 02:07:01 +0900117 }
118
119 @Override
120 public void updateRouter(Router osRouter) {
121 checkNotNull(osRouter, ERR_NULL_ROUTER);
122 checkArgument(!Strings.isNullOrEmpty(osRouter.getId()), ERR_NULL_ROUTER_ID);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900123
124 osRouterStore.updateRouter(osRouter);
125 log.info(String.format(MSG_ROUTER, osRouter.getId(), MSG_UPDATED));
126 }
127
128 @Override
129 public void removeRouter(String routerId) {
130 checkArgument(!Strings.isNullOrEmpty(routerId), ERR_NULL_ROUTER_ID);
131 synchronized (this) {
132 if (isRouterInUse(routerId)) {
133 final String error = String.format(MSG_ROUTER, routerId, ERR_IN_USE);
134 throw new IllegalStateException(error);
135 }
136 Router osRouter = osRouterStore.removeRouter(routerId);
137 if (osRouter != null) {
Jian Li5b22f112020-10-05 22:36:41 +0900138 log.info(String.format(MSG_ROUTER, deriveResourceName(osRouter), MSG_REMOVED));
Hyunsun Moon44aac662017-02-18 02:07:01 +0900139 }
140 }
141 }
142
143 @Override
144 public void addRouterInterface(RouterInterface osIface) {
145 checkNotNull(osIface, ERR_NULL_IFACE);
146 checkArgument(!Strings.isNullOrEmpty(osIface.getId()), ERR_NULL_IFACE_ROUTER_ID);
147 checkArgument(!Strings.isNullOrEmpty(osIface.getPortId()), ERR_NULL_IFACE_PORT_ID);
148
149 osRouterStore.addRouterInterface(osIface);
150 log.info(String.format(MSG_ROUTER_IFACE, osIface.getPortId(), MSG_CREATED));
151 }
152
153 @Override
154 public void updateRouterInterface(RouterInterface osIface) {
155 checkNotNull(osIface, ERR_NULL_IFACE);
156 checkArgument(!Strings.isNullOrEmpty(osIface.getId()), ERR_NULL_IFACE_ROUTER_ID);
157 checkArgument(!Strings.isNullOrEmpty(osIface.getPortId()), ERR_NULL_IFACE_PORT_ID);
158
159 osRouterStore.updateRouterInterface(osIface);
160 log.info(String.format(MSG_ROUTER_IFACE, osIface.getPortId(), MSG_UPDATED));
161 }
162
163 @Override
164 public void removeRouterInterface(String osIfaceId) {
165 checkArgument(!Strings.isNullOrEmpty(osIfaceId), ERR_NULL_IFACE_PORT_ID);
166 synchronized (this) {
167 if (isRouterIfaceInUse(osIfaceId)) {
168 final String error = String.format(MSG_ROUTER, osIfaceId, ERR_IN_USE);
169 throw new IllegalStateException(error);
170 }
171 RouterInterface osIface = osRouterStore.removeRouterInterface(osIfaceId);
172 if (osIface != null) {
173 log.info(String.format(MSG_ROUTER_IFACE, osIface.getPortId(), MSG_REMOVED));
174 }
175 }
176 }
177
178 @Override
179 public void createFloatingIp(NetFloatingIP osFloatingIp) {
180 checkNotNull(osFloatingIp, ERR_NULL_FLOATING);
181 checkArgument(!Strings.isNullOrEmpty(osFloatingIp.getId()), ERR_NULL_FLOATING_ID);
182
183 osRouterStore.createFloatingIp(osFloatingIp);
184 log.info(String.format(MSG_FLOATING_IP, osFloatingIp.getId(), MSG_CREATED));
185 }
186
187 @Override
188 public void updateFloatingIp(NetFloatingIP osFloatingIp) {
189 checkNotNull(osFloatingIp, ERR_NULL_FLOATING);
190 checkArgument(!Strings.isNullOrEmpty(osFloatingIp.getId()), ERR_NULL_FLOATING_ID);
191
192 osRouterStore.updateFloatingIp(osFloatingIp);
193 log.info(String.format(MSG_FLOATING_IP, osFloatingIp.getId(), MSG_UPDATED));
194 }
195
196 @Override
197 public void removeFloatingIp(String floatingIpId) {
198 checkArgument(!Strings.isNullOrEmpty(floatingIpId), ERR_NULL_FLOATING_ID);
199 synchronized (this) {
200 if (isFloatingIpInUse(floatingIpId)) {
201 final String error = String.format(MSG_FLOATING_IP, floatingIpId, ERR_IN_USE);
202 throw new IllegalStateException(error);
203 }
204 NetFloatingIP osFloatingIp = osRouterStore.removeFloatingIp(floatingIpId);
205 if (osFloatingIp != null) {
206 log.info(String.format(MSG_FLOATING_IP, osFloatingIp.getId(), MSG_REMOVED));
207 }
208 }
209 }
210
211 @Override
Hyunsun Moonc7219222017-03-27 11:05:59 +0900212 public void clear() {
213 osRouterStore.clear();
214 }
215
216 @Override
Hyunsun Moon44aac662017-02-18 02:07:01 +0900217 public Router router(String routerId) {
218 checkArgument(!Strings.isNullOrEmpty(routerId), ERR_NULL_ROUTER_ID);
219 return osRouterStore.router(routerId);
220 }
221
222 @Override
223 public Set<Router> routers() {
224 return osRouterStore.routers();
225 }
226
227 @Override
228 public RouterInterface routerInterface(String osIfaceId) {
229 checkArgument(!Strings.isNullOrEmpty(osIfaceId), ERR_NULL_IFACE_PORT_ID);
230 return osRouterStore.routerInterface(osIfaceId);
231 }
232
233 @Override
234 public Set<RouterInterface> routerInterfaces() {
235 return osRouterStore.routerInterfaces();
236 }
237
238 @Override
239 public Set<RouterInterface> routerInterfaces(String routerId) {
240 Set<RouterInterface> osIfaces = osRouterStore.routerInterfaces().stream()
241 .filter(iface -> Objects.equals(iface.getId(), routerId))
242 .collect(Collectors.toSet());
243 return ImmutableSet.copyOf(osIfaces);
244 }
245
246 @Override
247 public NetFloatingIP floatingIp(String floatingIpId) {
248 checkArgument(!Strings.isNullOrEmpty(floatingIpId), ERR_NULL_FLOATING_ID);
249 return osRouterStore.floatingIp(floatingIpId);
250 }
251
252 @Override
253 public Set<NetFloatingIP> floatingIps() {
254 return osRouterStore.floatingIps();
255 }
256
257 @Override
258 public Set<NetFloatingIP> floatingIps(String routerId) {
259 Set<NetFloatingIP> osFloatingIps = osRouterStore.floatingIps().stream()
260 .filter(fip -> Objects.equals(fip.getRouterId(), routerId))
261 .collect(Collectors.toSet());
262 return ImmutableSet.copyOf(osFloatingIps);
263 }
264
265 private boolean isRouterInUse(String routerId) {
266 // TODO add checking
267 return false;
268 }
269
270 private boolean isRouterIfaceInUse(String osIfaceId) {
271 // TODO add checking
272 return false;
273 }
274
275 private boolean isFloatingIpInUse(String floatingIpId) {
276 // TODO add checking
277 return false;
278 }
279
280 private class InternalRouterStoreDelegate implements OpenstackRouterStoreDelegate {
281
282 @Override
283 public void notify(OpenstackRouterEvent event) {
284 if (event != null) {
Jian Li78885a22018-03-02 11:33:02 +0900285 log.trace("send openstack routing event {}", event);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900286 process(event);
287 }
288 }
289 }
290}