blob: c636a1c084f07e3b977e847d65e7805c24c9c8b8 [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;
20import org.apache.felix.scr.annotations.Activate;
21import org.apache.felix.scr.annotations.Component;
22import org.apache.felix.scr.annotations.Deactivate;
23import org.apache.felix.scr.annotations.Reference;
24import org.apache.felix.scr.annotations.ReferenceCardinality;
25import org.apache.felix.scr.annotations.Service;
26import org.onosproject.core.CoreService;
27import org.onosproject.event.ListenerRegistry;
28import org.onosproject.openstacknetworking.api.Constants;
29import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
30import org.onosproject.openstacknetworking.api.OpenstackRouterEvent;
31import org.onosproject.openstacknetworking.api.OpenstackRouterListener;
32import org.onosproject.openstacknetworking.api.OpenstackRouterService;
33import org.onosproject.openstacknetworking.api.OpenstackRouterStore;
34import org.onosproject.openstacknetworking.api.OpenstackRouterStoreDelegate;
35import org.openstack4j.model.network.NetFloatingIP;
36import org.openstack4j.model.network.Router;
37import org.openstack4j.model.network.RouterInterface;
38import org.slf4j.Logger;
39
40import java.util.Objects;
41import java.util.Set;
42import java.util.stream.Collectors;
43
44import static com.google.common.base.Preconditions.checkArgument;
45import static com.google.common.base.Preconditions.checkNotNull;
46import static org.slf4j.LoggerFactory.getLogger;
47
48/**
49 * Provides implementation of administering and interfacing OpenStack router and
50 * floating IP address.
51 */
52@Service
53@Component(immediate = true)
54public class OpenstackRouterManager
55 extends ListenerRegistry<OpenstackRouterEvent, OpenstackRouterListener>
56 implements OpenstackRouterAdminService, OpenstackRouterService {
57
58 protected final Logger log = getLogger(getClass());
59
60 private static final String MSG_ROUTER = "OpenStack router %s %s";
61 private static final String MSG_ROUTER_IFACE = "OpenStack router interface %s %s";
62 private static final String MSG_FLOATING_IP = "OpenStack floating IP %s %s";
63 private static final String MSG_CREATED = "created";
64 private static final String MSG_UPDATED = "updated";
65 private static final String MSG_REMOVED = "removed";
66
67 private static final String ERR_NULL_ROUTER = "OpenStack router cannot be null";
68 private static final String ERR_NULL_ROUTER_ID = "OpenStack router ID cannot be null";
69 private static final String ERR_NULL_ROUTER_NAME = "OpenStack router name cannot be null";
70 private static final String ERR_NULL_IFACE = "OpenStack router interface cannot be null";
71 private static final String ERR_NULL_IFACE_ROUTER_ID = "OpenStack router interface router ID cannot be null";
72 private static final String ERR_NULL_IFACE_PORT_ID = "OpenStack router interface port ID cannot be null";
73 private static final String ERR_NULL_FLOATING = "OpenStack floating IP cannot be null";
74 private static final String ERR_NULL_FLOATING_ID = "OpenStack floating IP cannot be null";
75
76 private static final String ERR_IN_USE = " still in use";
77
78 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
79 protected CoreService coreService;
80
81 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
82 protected OpenstackRouterStore osRouterStore;
83
84 private final OpenstackRouterStoreDelegate delegate = new InternalRouterStoreDelegate();
85
86 @Activate
87 protected void activate() {
88 coreService.registerApplication(Constants.OPENSTACK_NETWORKING_APP_ID);
89 osRouterStore.setDelegate(delegate);
90 log.info("Started");
91 }
92
93 @Deactivate
94 protected void deactivate() {
95 osRouterStore.unsetDelegate(delegate);
96 log.info("Stopped");
97 }
98
99 @Override
100 public void createRouter(Router osRouter) {
101 checkNotNull(osRouter, ERR_NULL_ROUTER);
102 checkArgument(!Strings.isNullOrEmpty(osRouter.getId()), ERR_NULL_ROUTER_ID);
103 checkArgument(!Strings.isNullOrEmpty(osRouter.getName()), ERR_NULL_ROUTER_NAME);
104
105 osRouterStore.createRouter(osRouter);
106 log.info(String.format(MSG_ROUTER, osRouter.getName(), MSG_CREATED));
107 }
108
109 @Override
110 public void updateRouter(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.updateRouter(osRouter);
116 log.info(String.format(MSG_ROUTER, osRouter.getId(), MSG_UPDATED));
117 }
118
119 @Override
120 public void removeRouter(String routerId) {
121 checkArgument(!Strings.isNullOrEmpty(routerId), ERR_NULL_ROUTER_ID);
122 synchronized (this) {
123 if (isRouterInUse(routerId)) {
124 final String error = String.format(MSG_ROUTER, routerId, ERR_IN_USE);
125 throw new IllegalStateException(error);
126 }
127 Router osRouter = osRouterStore.removeRouter(routerId);
128 if (osRouter != null) {
129 log.info(String.format(MSG_ROUTER, osRouter.getName(), MSG_REMOVED));
130 }
131 }
132 }
133
134 @Override
135 public void addRouterInterface(RouterInterface osIface) {
136 checkNotNull(osIface, ERR_NULL_IFACE);
137 checkArgument(!Strings.isNullOrEmpty(osIface.getId()), ERR_NULL_IFACE_ROUTER_ID);
138 checkArgument(!Strings.isNullOrEmpty(osIface.getPortId()), ERR_NULL_IFACE_PORT_ID);
139
140 osRouterStore.addRouterInterface(osIface);
141 log.info(String.format(MSG_ROUTER_IFACE, osIface.getPortId(), MSG_CREATED));
142 }
143
144 @Override
145 public void updateRouterInterface(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.updateRouterInterface(osIface);
151 log.info(String.format(MSG_ROUTER_IFACE, osIface.getPortId(), MSG_UPDATED));
152 }
153
154 @Override
155 public void removeRouterInterface(String osIfaceId) {
156 checkArgument(!Strings.isNullOrEmpty(osIfaceId), ERR_NULL_IFACE_PORT_ID);
157 synchronized (this) {
158 if (isRouterIfaceInUse(osIfaceId)) {
159 final String error = String.format(MSG_ROUTER, osIfaceId, ERR_IN_USE);
160 throw new IllegalStateException(error);
161 }
162 RouterInterface osIface = osRouterStore.removeRouterInterface(osIfaceId);
163 if (osIface != null) {
164 log.info(String.format(MSG_ROUTER_IFACE, osIface.getPortId(), MSG_REMOVED));
165 }
166 }
167 }
168
169 @Override
170 public void createFloatingIp(NetFloatingIP osFloatingIp) {
171 checkNotNull(osFloatingIp, ERR_NULL_FLOATING);
172 checkArgument(!Strings.isNullOrEmpty(osFloatingIp.getId()), ERR_NULL_FLOATING_ID);
173
174 osRouterStore.createFloatingIp(osFloatingIp);
175 log.info(String.format(MSG_FLOATING_IP, osFloatingIp.getId(), MSG_CREATED));
176 }
177
178 @Override
179 public void updateFloatingIp(NetFloatingIP osFloatingIp) {
180 checkNotNull(osFloatingIp, ERR_NULL_FLOATING);
181 checkArgument(!Strings.isNullOrEmpty(osFloatingIp.getId()), ERR_NULL_FLOATING_ID);
182
183 osRouterStore.updateFloatingIp(osFloatingIp);
184 log.info(String.format(MSG_FLOATING_IP, osFloatingIp.getId(), MSG_UPDATED));
185 }
186
187 @Override
188 public void removeFloatingIp(String floatingIpId) {
189 checkArgument(!Strings.isNullOrEmpty(floatingIpId), ERR_NULL_FLOATING_ID);
190 synchronized (this) {
191 if (isFloatingIpInUse(floatingIpId)) {
192 final String error = String.format(MSG_FLOATING_IP, floatingIpId, ERR_IN_USE);
193 throw new IllegalStateException(error);
194 }
195 NetFloatingIP osFloatingIp = osRouterStore.removeFloatingIp(floatingIpId);
196 if (osFloatingIp != null) {
197 log.info(String.format(MSG_FLOATING_IP, osFloatingIp.getId(), MSG_REMOVED));
198 }
199 }
200 }
201
202 @Override
Hyunsun Moonc7219222017-03-27 11:05:59 +0900203 public void clear() {
204 osRouterStore.clear();
205 }
206
207 @Override
Hyunsun Moon44aac662017-02-18 02:07:01 +0900208 public Router router(String routerId) {
209 checkArgument(!Strings.isNullOrEmpty(routerId), ERR_NULL_ROUTER_ID);
210 return osRouterStore.router(routerId);
211 }
212
213 @Override
214 public Set<Router> routers() {
215 return osRouterStore.routers();
216 }
217
218 @Override
219 public RouterInterface routerInterface(String osIfaceId) {
220 checkArgument(!Strings.isNullOrEmpty(osIfaceId), ERR_NULL_IFACE_PORT_ID);
221 return osRouterStore.routerInterface(osIfaceId);
222 }
223
224 @Override
225 public Set<RouterInterface> routerInterfaces() {
226 return osRouterStore.routerInterfaces();
227 }
228
229 @Override
230 public Set<RouterInterface> routerInterfaces(String routerId) {
231 Set<RouterInterface> osIfaces = osRouterStore.routerInterfaces().stream()
232 .filter(iface -> Objects.equals(iface.getId(), routerId))
233 .collect(Collectors.toSet());
234 return ImmutableSet.copyOf(osIfaces);
235 }
236
237 @Override
238 public NetFloatingIP floatingIp(String floatingIpId) {
239 checkArgument(!Strings.isNullOrEmpty(floatingIpId), ERR_NULL_FLOATING_ID);
240 return osRouterStore.floatingIp(floatingIpId);
241 }
242
243 @Override
244 public Set<NetFloatingIP> floatingIps() {
245 return osRouterStore.floatingIps();
246 }
247
248 @Override
249 public Set<NetFloatingIP> floatingIps(String routerId) {
250 Set<NetFloatingIP> osFloatingIps = osRouterStore.floatingIps().stream()
251 .filter(fip -> Objects.equals(fip.getRouterId(), routerId))
252 .collect(Collectors.toSet());
253 return ImmutableSet.copyOf(osFloatingIps);
254 }
255
256 private boolean isRouterInUse(String routerId) {
257 // TODO add checking
258 return false;
259 }
260
261 private boolean isRouterIfaceInUse(String osIfaceId) {
262 // TODO add checking
263 return false;
264 }
265
266 private boolean isFloatingIpInUse(String floatingIpId) {
267 // TODO add checking
268 return false;
269 }
270
271 private class InternalRouterStoreDelegate implements OpenstackRouterStoreDelegate {
272
273 @Override
274 public void notify(OpenstackRouterEvent event) {
275 if (event != null) {
276 log.trace("send oepnstack routing event {}", event);
277 process(event);
278 }
279 }
280 }
281}