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