blob: 19a831cf68d286bb9133af197242bd49cf1f6441 [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;
45import static org.slf4j.LoggerFactory.getLogger;
46
47/**
48 * Provides implementation of administering and interfacing OpenStack router and
49 * floating IP address.
50 */
Jian Li5ecfd1a2018-12-10 11:41:03 +090051@Component(
52 immediate = true,
53 service = { OpenstackRouterAdminService.class, OpenstackRouterService.class }
54)
Hyunsun Moon44aac662017-02-18 02:07:01 +090055public class OpenstackRouterManager
56 extends ListenerRegistry<OpenstackRouterEvent, OpenstackRouterListener>
57 implements OpenstackRouterAdminService, OpenstackRouterService {
58
59 protected final Logger log = getLogger(getClass());
60
61 private static final String MSG_ROUTER = "OpenStack router %s %s";
62 private static final String MSG_ROUTER_IFACE = "OpenStack router interface %s %s";
63 private static final String MSG_FLOATING_IP = "OpenStack floating IP %s %s";
64 private static final String MSG_CREATED = "created";
65 private static final String MSG_UPDATED = "updated";
66 private static final String MSG_REMOVED = "removed";
67
Jian Li5ecfd1a2018-12-10 11:41:03 +090068 private static final String ERR_NULL_ROUTER =
69 "OpenStack router cannot be null";
70 private static final String ERR_NULL_ROUTER_ID =
71 "OpenStack router ID cannot be null";
72 private static final String ERR_NULL_ROUTER_NAME =
73 "OpenStack router name cannot be null";
74 private static final String ERR_NULL_IFACE =
75 "OpenStack router interface cannot be null";
76 private static final String ERR_NULL_IFACE_ROUTER_ID =
77 "OpenStack router interface router ID cannot be null";
78 private static final String ERR_NULL_IFACE_PORT_ID =
79 "OpenStack router interface port ID cannot be null";
80 private static final String ERR_NULL_FLOATING =
81 "OpenStack floating IP cannot be null";
82 private static final String ERR_NULL_FLOATING_ID =
83 "OpenStack floating IP cannot be null";
Hyunsun Moon44aac662017-02-18 02:07:01 +090084
85 private static final String ERR_IN_USE = " still in use";
86
Ray Milkeyd84f89b2018-08-17 14:54:17 -070087 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Hyunsun Moon44aac662017-02-18 02:07:01 +090088 protected CoreService coreService;
89
Ray Milkeyd84f89b2018-08-17 14:54:17 -070090 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Hyunsun Moon44aac662017-02-18 02:07:01 +090091 protected OpenstackRouterStore osRouterStore;
92
Jian Li5ecfd1a2018-12-10 11:41:03 +090093 private final OpenstackRouterStoreDelegate
94 delegate = new InternalRouterStoreDelegate();
Hyunsun Moon44aac662017-02-18 02:07:01 +090095
96 @Activate
97 protected void activate() {
98 coreService.registerApplication(Constants.OPENSTACK_NETWORKING_APP_ID);
99 osRouterStore.setDelegate(delegate);
100 log.info("Started");
101 }
102
103 @Deactivate
104 protected void deactivate() {
105 osRouterStore.unsetDelegate(delegate);
106 log.info("Stopped");
107 }
108
109 @Override
110 public void createRouter(Router osRouter) {
111 checkNotNull(osRouter, ERR_NULL_ROUTER);
112 checkArgument(!Strings.isNullOrEmpty(osRouter.getId()), ERR_NULL_ROUTER_ID);
113 checkArgument(!Strings.isNullOrEmpty(osRouter.getName()), ERR_NULL_ROUTER_NAME);
114
115 osRouterStore.createRouter(osRouter);
116 log.info(String.format(MSG_ROUTER, osRouter.getName(), MSG_CREATED));
117 }
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);
123 checkArgument(!Strings.isNullOrEmpty(osRouter.getName()), ERR_NULL_ROUTER_NAME);
124
125 osRouterStore.updateRouter(osRouter);
126 log.info(String.format(MSG_ROUTER, osRouter.getId(), MSG_UPDATED));
127 }
128
129 @Override
130 public void removeRouter(String routerId) {
131 checkArgument(!Strings.isNullOrEmpty(routerId), ERR_NULL_ROUTER_ID);
132 synchronized (this) {
133 if (isRouterInUse(routerId)) {
134 final String error = String.format(MSG_ROUTER, routerId, ERR_IN_USE);
135 throw new IllegalStateException(error);
136 }
137 Router osRouter = osRouterStore.removeRouter(routerId);
138 if (osRouter != null) {
139 log.info(String.format(MSG_ROUTER, osRouter.getName(), MSG_REMOVED));
140 }
141 }
142 }
143
144 @Override
145 public void addRouterInterface(RouterInterface osIface) {
146 checkNotNull(osIface, ERR_NULL_IFACE);
147 checkArgument(!Strings.isNullOrEmpty(osIface.getId()), ERR_NULL_IFACE_ROUTER_ID);
148 checkArgument(!Strings.isNullOrEmpty(osIface.getPortId()), ERR_NULL_IFACE_PORT_ID);
149
150 osRouterStore.addRouterInterface(osIface);
151 log.info(String.format(MSG_ROUTER_IFACE, osIface.getPortId(), MSG_CREATED));
152 }
153
154 @Override
155 public void updateRouterInterface(RouterInterface osIface) {
156 checkNotNull(osIface, ERR_NULL_IFACE);
157 checkArgument(!Strings.isNullOrEmpty(osIface.getId()), ERR_NULL_IFACE_ROUTER_ID);
158 checkArgument(!Strings.isNullOrEmpty(osIface.getPortId()), ERR_NULL_IFACE_PORT_ID);
159
160 osRouterStore.updateRouterInterface(osIface);
161 log.info(String.format(MSG_ROUTER_IFACE, osIface.getPortId(), MSG_UPDATED));
162 }
163
164 @Override
165 public void removeRouterInterface(String osIfaceId) {
166 checkArgument(!Strings.isNullOrEmpty(osIfaceId), ERR_NULL_IFACE_PORT_ID);
167 synchronized (this) {
168 if (isRouterIfaceInUse(osIfaceId)) {
169 final String error = String.format(MSG_ROUTER, osIfaceId, ERR_IN_USE);
170 throw new IllegalStateException(error);
171 }
172 RouterInterface osIface = osRouterStore.removeRouterInterface(osIfaceId);
173 if (osIface != null) {
174 log.info(String.format(MSG_ROUTER_IFACE, osIface.getPortId(), MSG_REMOVED));
175 }
176 }
177 }
178
179 @Override
180 public void createFloatingIp(NetFloatingIP osFloatingIp) {
181 checkNotNull(osFloatingIp, ERR_NULL_FLOATING);
182 checkArgument(!Strings.isNullOrEmpty(osFloatingIp.getId()), ERR_NULL_FLOATING_ID);
183
184 osRouterStore.createFloatingIp(osFloatingIp);
185 log.info(String.format(MSG_FLOATING_IP, osFloatingIp.getId(), MSG_CREATED));
186 }
187
188 @Override
189 public void updateFloatingIp(NetFloatingIP osFloatingIp) {
190 checkNotNull(osFloatingIp, ERR_NULL_FLOATING);
191 checkArgument(!Strings.isNullOrEmpty(osFloatingIp.getId()), ERR_NULL_FLOATING_ID);
192
193 osRouterStore.updateFloatingIp(osFloatingIp);
194 log.info(String.format(MSG_FLOATING_IP, osFloatingIp.getId(), MSG_UPDATED));
195 }
196
197 @Override
198 public void removeFloatingIp(String floatingIpId) {
199 checkArgument(!Strings.isNullOrEmpty(floatingIpId), ERR_NULL_FLOATING_ID);
200 synchronized (this) {
201 if (isFloatingIpInUse(floatingIpId)) {
202 final String error = String.format(MSG_FLOATING_IP, floatingIpId, ERR_IN_USE);
203 throw new IllegalStateException(error);
204 }
205 NetFloatingIP osFloatingIp = osRouterStore.removeFloatingIp(floatingIpId);
206 if (osFloatingIp != null) {
207 log.info(String.format(MSG_FLOATING_IP, osFloatingIp.getId(), MSG_REMOVED));
208 }
209 }
210 }
211
212 @Override
Hyunsun Moonc7219222017-03-27 11:05:59 +0900213 public void clear() {
214 osRouterStore.clear();
215 }
216
217 @Override
Hyunsun Moon44aac662017-02-18 02:07:01 +0900218 public Router router(String routerId) {
219 checkArgument(!Strings.isNullOrEmpty(routerId), ERR_NULL_ROUTER_ID);
220 return osRouterStore.router(routerId);
221 }
222
223 @Override
224 public Set<Router> routers() {
225 return osRouterStore.routers();
226 }
227
228 @Override
229 public RouterInterface routerInterface(String osIfaceId) {
230 checkArgument(!Strings.isNullOrEmpty(osIfaceId), ERR_NULL_IFACE_PORT_ID);
231 return osRouterStore.routerInterface(osIfaceId);
232 }
233
234 @Override
235 public Set<RouterInterface> routerInterfaces() {
236 return osRouterStore.routerInterfaces();
237 }
238
239 @Override
240 public Set<RouterInterface> routerInterfaces(String routerId) {
241 Set<RouterInterface> osIfaces = osRouterStore.routerInterfaces().stream()
242 .filter(iface -> Objects.equals(iface.getId(), routerId))
243 .collect(Collectors.toSet());
244 return ImmutableSet.copyOf(osIfaces);
245 }
246
247 @Override
248 public NetFloatingIP floatingIp(String floatingIpId) {
249 checkArgument(!Strings.isNullOrEmpty(floatingIpId), ERR_NULL_FLOATING_ID);
250 return osRouterStore.floatingIp(floatingIpId);
251 }
252
253 @Override
254 public Set<NetFloatingIP> floatingIps() {
255 return osRouterStore.floatingIps();
256 }
257
258 @Override
259 public Set<NetFloatingIP> floatingIps(String routerId) {
260 Set<NetFloatingIP> osFloatingIps = osRouterStore.floatingIps().stream()
261 .filter(fip -> Objects.equals(fip.getRouterId(), routerId))
262 .collect(Collectors.toSet());
263 return ImmutableSet.copyOf(osFloatingIps);
264 }
265
266 private boolean isRouterInUse(String routerId) {
267 // TODO add checking
268 return false;
269 }
270
271 private boolean isRouterIfaceInUse(String osIfaceId) {
272 // TODO add checking
273 return false;
274 }
275
276 private boolean isFloatingIpInUse(String floatingIpId) {
277 // TODO add checking
278 return false;
279 }
280
281 private class InternalRouterStoreDelegate implements OpenstackRouterStoreDelegate {
282
283 @Override
284 public void notify(OpenstackRouterEvent event) {
285 if (event != null) {
Jian Li78885a22018-03-02 11:33:02 +0900286 log.trace("send openstack routing event {}", event);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900287 process(event);
288 }
289 }
290 }
291}