blob: 2cebd2f75722613969eb55d10d367f8fb86ea722 [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
Hyunsun Moonae51e732017-04-25 17:46:21 +090018import com.google.common.collect.ImmutableList;
Hyunsun Moon44aac662017-02-18 02:07:01 +090019import com.google.common.collect.ImmutableSet;
Jian Lie6e609f2019-05-14 17:45:54 +090020import org.onlab.packet.IpAddress;
21import org.onlab.packet.MacAddress;
22import org.onlab.packet.VlanId;
Hyunsun Moon44aac662017-02-18 02:07:01 +090023import org.onlab.util.KryoNamespace;
24import org.onosproject.core.ApplicationId;
25import org.onosproject.core.CoreService;
Jian Lie6e609f2019-05-14 17:45:54 +090026import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
Hyunsun Moon44aac662017-02-18 02:07:01 +090027import org.onosproject.openstacknetworking.api.OpenstackNetworkEvent;
28import org.onosproject.openstacknetworking.api.OpenstackNetworkStore;
29import org.onosproject.openstacknetworking.api.OpenstackNetworkStoreDelegate;
30import org.onosproject.store.AbstractStore;
31import org.onosproject.store.serializers.KryoNamespaces;
32import org.onosproject.store.service.ConsistentMap;
33import org.onosproject.store.service.MapEvent;
34import org.onosproject.store.service.MapEventListener;
35import org.onosproject.store.service.Serializer;
36import org.onosproject.store.service.StorageService;
37import org.onosproject.store.service.Versioned;
38import org.openstack4j.model.network.IPVersionType;
Jian Li02a94982018-02-03 02:49:07 +090039import org.openstack4j.model.network.Ipv6AddressMode;
40import org.openstack4j.model.network.Ipv6RaMode;
Hyunsun Moon44aac662017-02-18 02:07:01 +090041import org.openstack4j.model.network.Network;
42import org.openstack4j.model.network.NetworkType;
43import org.openstack4j.model.network.Port;
44import org.openstack4j.model.network.State;
45import org.openstack4j.model.network.Subnet;
46import org.openstack4j.openstack.networking.domain.NeutronAllowedAddressPair;
47import org.openstack4j.openstack.networking.domain.NeutronExtraDhcpOptCreate;
48import org.openstack4j.openstack.networking.domain.NeutronHostRoute;
49import org.openstack4j.openstack.networking.domain.NeutronIP;
50import org.openstack4j.openstack.networking.domain.NeutronNetwork;
51import org.openstack4j.openstack.networking.domain.NeutronPool;
52import org.openstack4j.openstack.networking.domain.NeutronPort;
53import org.openstack4j.openstack.networking.domain.NeutronSubnet;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070054import org.osgi.service.component.annotations.Activate;
55import org.osgi.service.component.annotations.Component;
56import org.osgi.service.component.annotations.Deactivate;
57import org.osgi.service.component.annotations.Reference;
58import org.osgi.service.component.annotations.ReferenceCardinality;
Hyunsun Moon44aac662017-02-18 02:07:01 +090059import org.slf4j.Logger;
60
Jian Lie6e609f2019-05-14 17:45:54 +090061import java.util.HashSet;
Jian Licaedc8b2018-02-19 17:21:06 +090062import java.util.LinkedHashMap;
Hyunsun Moonae51e732017-04-25 17:46:21 +090063import java.util.List;
Jian Lib7873422018-08-18 22:34:39 +090064import java.util.Objects;
Hyunsun Moon44aac662017-02-18 02:07:01 +090065import java.util.Set;
66import java.util.concurrent.ExecutorService;
Hyunsun Moon44aac662017-02-18 02:07:01 +090067
68import static com.google.common.base.Preconditions.checkArgument;
69import static java.util.concurrent.Executors.newSingleThreadExecutor;
70import static org.onlab.util.Tools.groupedThreads;
71import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
Jian Lie6e609f2019-05-14 17:45:54 +090072import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.EXTERNAL_PEER_ROUTER_CREATED;
73import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.EXTERNAL_PEER_ROUTER_MAC_UPDATED;
74import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.EXTERNAL_PEER_ROUTER_REMOVED;
75import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.EXTERNAL_PEER_ROUTER_UPDATED;
Jian Li78885a22018-03-02 11:33:02 +090076import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_NETWORK_CREATED;
77import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_NETWORK_REMOVED;
78import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_NETWORK_UPDATED;
79import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_PORT_CREATED;
Jian Li8f64feb2018-07-24 13:20:16 +090080import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_PORT_PRE_REMOVE;
Jian Li78885a22018-03-02 11:33:02 +090081import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_PORT_REMOVED;
82import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_PORT_SECURITY_GROUP_ADDED;
83import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_PORT_SECURITY_GROUP_REMOVED;
84import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_PORT_UPDATED;
85import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_SUBNET_CREATED;
86import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_SUBNET_REMOVED;
87import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_SUBNET_UPDATED;
Hyunsun Moon44aac662017-02-18 02:07:01 +090088import static org.slf4j.LoggerFactory.getLogger;
89
90/**
91 * Manages the inventory of OpenStack network, subnet, and port using a {@code ConsistentMap}.
92 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070093@Component(immediate = true, service = OpenstackNetworkStore.class)
Hyunsun Moon44aac662017-02-18 02:07:01 +090094public class DistributedOpenstackNetworkStore
95 extends AbstractStore<OpenstackNetworkEvent, OpenstackNetworkStoreDelegate>
96 implements OpenstackNetworkStore {
97
98 protected final Logger log = getLogger(getClass());
99
100 private static final String ERR_NOT_FOUND = " does not exist";
101 private static final String ERR_DUPLICATE = " already exists";
102
103 private static final KryoNamespace SERIALIZER_NEUTRON_L2 = KryoNamespace.newBuilder()
104 .register(KryoNamespaces.API)
105 .register(Network.class)
106 .register(NeutronNetwork.class)
107 .register(State.class)
108 .register(NetworkType.class)
109 .register(Port.class)
110 .register(NeutronPort.class)
111 .register(NeutronIP.class)
112 .register(NeutronAllowedAddressPair.class)
113 .register(NeutronExtraDhcpOptCreate.class)
114 .register(Subnet.class)
115 .register(NeutronSubnet.class)
116 .register(NeutronPool.class)
117 .register(NeutronHostRoute.class)
118 .register(IPVersionType.class)
Jian Li02a94982018-02-03 02:49:07 +0900119 .register(Ipv6AddressMode.class)
120 .register(Ipv6RaMode.class)
Jian Licaedc8b2018-02-19 17:21:06 +0900121 .register(LinkedHashMap.class)
Hyunsun Moon44aac662017-02-18 02:07:01 +0900122 .build();
123
Jian Lie6e609f2019-05-14 17:45:54 +0900124 private static final KryoNamespace
125 SERIALIZER_EXTERNAL_PEER_ROUTER_MAP = KryoNamespace.newBuilder()
126 .register(KryoNamespaces.API)
127 .register(ExternalPeerRouter.class)
128 .register(DefaultExternalPeerRouter.class)
129 .register(MacAddress.class)
130 .register(IpAddress.class)
131 .register(VlanId.class)
132 .build();
133
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700134 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Hyunsun Moon44aac662017-02-18 02:07:01 +0900135 protected CoreService coreService;
136
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700137 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Hyunsun Moon44aac662017-02-18 02:07:01 +0900138 protected StorageService storageService;
139
140 private final ExecutorService eventExecutor = newSingleThreadExecutor(
141 groupedThreads(this.getClass().getSimpleName(), "event-handler", log));
142
Jian Li5ecfd1a2018-12-10 11:41:03 +0900143 private final MapEventListener<String, Network>
144 networkMapListener = new OpenstackNetworkMapListener();
145 private final MapEventListener<String, Subnet>
146 subnetMapListener = new OpenstackSubnetMapListener();
147 private final MapEventListener<String, Port>
148 portMapListener = new OpenstackPortMapListener();
Jian Lie6e609f2019-05-14 17:45:54 +0900149 private final MapEventListener<String, ExternalPeerRouter>
150 peerRouterListener = new ExternalPeerRouterMapListener();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900151
Jian Lie6e609f2019-05-14 17:45:54 +0900152 private ConsistentMap<String, ExternalPeerRouter> externalPeerRouterStore;
Hyunsun Moon44aac662017-02-18 02:07:01 +0900153 private ConsistentMap<String, Network> osNetworkStore;
154 private ConsistentMap<String, Subnet> osSubnetStore;
155 private ConsistentMap<String, Port> osPortStore;
156
157 @Activate
158 protected void activate() {
159 ApplicationId appId = coreService.registerApplication(OPENSTACK_NETWORKING_APP_ID);
160
161 osNetworkStore = storageService.<String, Network>consistentMapBuilder()
162 .withSerializer(Serializer.using(SERIALIZER_NEUTRON_L2))
163 .withName("openstack-networkstore")
164 .withApplicationId(appId)
165 .build();
166 osNetworkStore.addListener(networkMapListener);
167
168 osSubnetStore = storageService.<String, Subnet>consistentMapBuilder()
169 .withSerializer(Serializer.using(SERIALIZER_NEUTRON_L2))
170 .withName("openstack-subnetstore")
171 .withApplicationId(appId)
172 .build();
173 osSubnetStore.addListener(subnetMapListener);
174
175 osPortStore = storageService.<String, Port>consistentMapBuilder()
176 .withSerializer(Serializer.using(SERIALIZER_NEUTRON_L2))
177 .withName("openstack-portstore")
178 .withApplicationId(appId)
179 .build();
180 osPortStore.addListener(portMapListener);
181
Jian Lie6e609f2019-05-14 17:45:54 +0900182 externalPeerRouterStore = storageService.<String, ExternalPeerRouter>consistentMapBuilder()
183 .withSerializer(Serializer.using(SERIALIZER_EXTERNAL_PEER_ROUTER_MAP))
184 .withName("external-routermap")
185 .withApplicationId(appId)
186 .build();
187 externalPeerRouterStore.addListener(peerRouterListener);
188
Hyunsun Moon44aac662017-02-18 02:07:01 +0900189 log.info("Started");
190 }
191
192 @Deactivate
193 protected void deactivate() {
194 osNetworkStore.removeListener(networkMapListener);
195 osSubnetStore.removeListener(subnetMapListener);
196 osPortStore.removeListener(portMapListener);
Jian Lie6e609f2019-05-14 17:45:54 +0900197 externalPeerRouterStore.removeListener(peerRouterListener);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900198 eventExecutor.shutdown();
199
200 log.info("Stopped");
201 }
202
203 @Override
204 public void createNetwork(Network osNet) {
205 osNetworkStore.compute(osNet.getId(), (id, existing) -> {
206 final String error = osNet.getName() + ERR_DUPLICATE;
207 checkArgument(existing == null, error);
208 return osNet;
209 });
210 }
211
212 @Override
213 public void updateNetwork(Network osNet) {
214 osNetworkStore.compute(osNet.getId(), (id, existing) -> {
215 final String error = osNet.getName() + ERR_NOT_FOUND;
216 checkArgument(existing != null, error);
217 return osNet;
218 });
219 }
220
221 @Override
222 public Network removeNetwork(String netId) {
223 Versioned<Network> osNet = osNetworkStore.remove(netId);
224 return osNet == null ? null : osNet.value();
225 }
226
227 @Override
228 public Network network(String netId) {
Jian Li78885a22018-03-02 11:33:02 +0900229 return osNetworkStore.asJavaMap().get(netId);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900230 }
231
232 @Override
233 public Set<Network> networks() {
Jian Li78885a22018-03-02 11:33:02 +0900234 return ImmutableSet.copyOf(osNetworkStore.asJavaMap().values());
Hyunsun Moon44aac662017-02-18 02:07:01 +0900235 }
236
237 @Override
238 public void createSubnet(Subnet osSubnet) {
239 osSubnetStore.compute(osSubnet.getId(), (id, existing) -> {
240 final String error = osSubnet.getId() + ERR_DUPLICATE;
241 checkArgument(existing == null, error);
242 return osSubnet;
243 });
244 }
245
246 @Override
247 public void updateSubnet(Subnet osSubnet) {
248 osSubnetStore.compute(osSubnet.getId(), (id, existing) -> {
249 final String error = osSubnet.getId() + ERR_NOT_FOUND;
250 checkArgument(existing != null, error);
251 return osSubnet;
252 });
253 }
254
255 @Override
256 public Subnet removeSubnet(String subnetId) {
257 Versioned<Subnet> osSubnet = osSubnetStore.remove(subnetId);
258 return osSubnet == null ? null : osSubnet.value();
259 }
260
261 @Override
262 public Subnet subnet(String subnetId) {
Jian Li78885a22018-03-02 11:33:02 +0900263 return osSubnetStore.asJavaMap().get(subnetId);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900264 }
265
266 @Override
267 public Set<Subnet> subnets() {
Jian Li78885a22018-03-02 11:33:02 +0900268 return ImmutableSet.copyOf(osSubnetStore.asJavaMap().values());
Hyunsun Moon44aac662017-02-18 02:07:01 +0900269 }
270
271 @Override
272 public void createPort(Port osPort) {
273 osPortStore.compute(osPort.getId(), (id, existing) -> {
274 final String error = osPort.getId() + ERR_DUPLICATE;
275 checkArgument(existing == null, error);
276 return osPort;
277 });
278 }
279
280 @Override
281 public void updatePort(Port osPort) {
282 osPortStore.compute(osPort.getId(), (id, existing) -> {
283 final String error = osPort.getId() + ERR_NOT_FOUND;
284 checkArgument(existing != null, error);
285 return osPort;
286 });
287 }
288
289 @Override
290 public Port removePort(String portId) {
291 Versioned<Port> osPort = osPortStore.remove(portId);
292 return osPort == null ? null : osPort.value();
293 }
294
295 @Override
296 public Port port(String portId) {
Jian Li78885a22018-03-02 11:33:02 +0900297 return osPortStore.asJavaMap().get(portId);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900298 }
299
300 @Override
301 public Set<Port> ports() {
Jian Li78885a22018-03-02 11:33:02 +0900302 return ImmutableSet.copyOf(osPortStore.asJavaMap().values());
Hyunsun Moon44aac662017-02-18 02:07:01 +0900303 }
304
Hyunsun Moonc7219222017-03-27 11:05:59 +0900305 @Override
Jian Lie6e609f2019-05-14 17:45:54 +0900306 public ExternalPeerRouter externalPeerRouter(String ipAddress) {
307 return externalPeerRouterStore.asJavaMap().get(ipAddress);
308 }
309
310 @Override
311 public Set<ExternalPeerRouter> externalPeerRouters() {
312 return new HashSet<>(externalPeerRouterStore.asJavaMap().values());
313 }
314
315 @Override
316 public void createExternalPeerRouter(ExternalPeerRouter peerRouter) {
317 externalPeerRouterStore.compute(
318 peerRouter.ipAddress().toString(), (id, existing) -> {
319 final String error = peerRouter.ipAddress().toString() + ERR_DUPLICATE;
320 checkArgument(existing == null, error);
321 return peerRouter;
322 });
323 }
324
325 @Override
326 public void updateExternalPeerRouter(ExternalPeerRouter peerRouter) {
327 externalPeerRouterStore.compute(
328 peerRouter.ipAddress().toString(), (id, existing) -> {
329 final String error = peerRouter.ipAddress() + ERR_NOT_FOUND;
330 checkArgument(existing != null, error);
331 return peerRouter;
332 });
333 }
334
335 @Override
336 public ExternalPeerRouter removeExternalPeerRouter(String ipAddress) {
337 Versioned<ExternalPeerRouter> peerRouter =
338 externalPeerRouterStore.remove(ipAddress);
339 return peerRouter == null ? null : peerRouter.value();
340 }
341
342 @Override
Hyunsun Moonc7219222017-03-27 11:05:59 +0900343 public void clear() {
344 osPortStore.clear();
345 osSubnetStore.clear();
346 osNetworkStore.clear();
Jian Lie6e609f2019-05-14 17:45:54 +0900347 externalPeerRouterStore.clear();
Hyunsun Moonc7219222017-03-27 11:05:59 +0900348 }
349
Jian Li5ecfd1a2018-12-10 11:41:03 +0900350 private class OpenstackNetworkMapListener
351 implements MapEventListener<String, Network> {
Hyunsun Moon44aac662017-02-18 02:07:01 +0900352
353 @Override
354 public void event(MapEvent<String, Network> event) {
355 switch (event.type()) {
356 case UPDATE:
Jian Li411bf2e2018-11-29 00:08:54 +0900357 eventExecutor.execute(() -> processNetworkMapUpdate(event));
Hyunsun Moon44aac662017-02-18 02:07:01 +0900358 break;
359 case INSERT:
Jian Li411bf2e2018-11-29 00:08:54 +0900360 eventExecutor.execute(() -> processNetworkMapInsertion(event));
Hyunsun Moon44aac662017-02-18 02:07:01 +0900361 break;
362 case REMOVE:
Jian Li411bf2e2018-11-29 00:08:54 +0900363 eventExecutor.execute(() -> processNetworkMapRemoval(event));
Hyunsun Moon44aac662017-02-18 02:07:01 +0900364 break;
365 default:
Jian Li78885a22018-03-02 11:33:02 +0900366 log.error("Unsupported openstack network event type");
Hyunsun Moon44aac662017-02-18 02:07:01 +0900367 break;
368 }
369 }
Jian Li411bf2e2018-11-29 00:08:54 +0900370
371 private void processNetworkMapUpdate(MapEvent<String, Network> event) {
372 log.debug("OpenStack network updated");
373 notifyDelegate(new OpenstackNetworkEvent(
374 OPENSTACK_NETWORK_UPDATED,
375 event.newValue().value()));
376 }
377
378 private void processNetworkMapInsertion(MapEvent<String, Network> event) {
379 log.debug("OpenStack network created");
380 notifyDelegate(new OpenstackNetworkEvent(
381 OPENSTACK_NETWORK_CREATED,
382 event.newValue().value()));
383 }
384
385 private void processNetworkMapRemoval(MapEvent<String, Network> event) {
386 log.debug("OpenStack network removed");
387 notifyDelegate(new OpenstackNetworkEvent(
388 OPENSTACK_NETWORK_REMOVED,
389 event.oldValue().value()));
390 }
Hyunsun Moon44aac662017-02-18 02:07:01 +0900391 }
392
393 private class OpenstackSubnetMapListener implements MapEventListener<String, Subnet> {
394
395 @Override
396 public void event(MapEvent<String, Subnet> event) {
397 switch (event.type()) {
398 case UPDATE:
Jian Li411bf2e2018-11-29 00:08:54 +0900399 eventExecutor.execute(() -> processSubnetMapUpdate(event));
Hyunsun Moon44aac662017-02-18 02:07:01 +0900400 break;
401 case INSERT:
Jian Li411bf2e2018-11-29 00:08:54 +0900402 eventExecutor.execute(() -> processSubnetMapInsertion(event));
Hyunsun Moon44aac662017-02-18 02:07:01 +0900403 break;
404 case REMOVE:
Jian Li411bf2e2018-11-29 00:08:54 +0900405 eventExecutor.execute(() -> processSubnetMapRemoval(event));
Hyunsun Moon44aac662017-02-18 02:07:01 +0900406 break;
407 default:
Jian Li78885a22018-03-02 11:33:02 +0900408 log.error("Unsupported openstack subnet event type");
Hyunsun Moon44aac662017-02-18 02:07:01 +0900409 break;
410 }
411 }
Jian Li411bf2e2018-11-29 00:08:54 +0900412
413 private void processSubnetMapUpdate(MapEvent<String, Subnet> event) {
414 log.debug("OpenStack subnet updated");
415 notifyDelegate(new OpenstackNetworkEvent(
416 OPENSTACK_SUBNET_UPDATED,
417 network(event.newValue().value().getNetworkId()),
418 event.newValue().value()));
419 }
420
421 private void processSubnetMapInsertion(MapEvent<String, Subnet> event) {
422 log.debug("OpenStack subnet created");
423 notifyDelegate(new OpenstackNetworkEvent(
424 OPENSTACK_SUBNET_CREATED,
425 network(event.newValue().value().getNetworkId()),
426 event.newValue().value()));
427 }
428
429 private void processSubnetMapRemoval(MapEvent<String, Subnet> event) {
430 log.debug("OpenStack subnet removed");
431 notifyDelegate(new OpenstackNetworkEvent(
432 OPENSTACK_SUBNET_REMOVED,
433 network(event.oldValue().value().getNetworkId()),
434 event.oldValue().value()));
435 }
Hyunsun Moon44aac662017-02-18 02:07:01 +0900436 }
437
Jian Lie6e609f2019-05-14 17:45:54 +0900438 private class ExternalPeerRouterMapListener
439 implements MapEventListener<String, ExternalPeerRouter> {
440
441 @Override
442 public void event(MapEvent<String, ExternalPeerRouter> event) {
443 switch (event.type()) {
444 case UPDATE:
445 eventExecutor.execute(() -> processPeerRouterUpdate(event));
446 break;
447 case INSERT:
448 eventExecutor.execute(() -> processPeerRouterInsertion(event));
449 break;
450 case REMOVE:
451 eventExecutor.execute(() -> processPeerRouterRemoval(event));
452 break;
453 default:
454 log.error("Unsupported external peer router event type");
455 break;
456 }
457 }
458
459 private void processPeerRouterUpdate(
460 MapEvent<String, ExternalPeerRouter> event) {
461 log.debug("External peer router updated");
462 notifyDelegate(new OpenstackNetworkEvent(
463 EXTERNAL_PEER_ROUTER_UPDATED, event.newValue().value()));
464
465 processPeerRouterMacUpdated(event);
466 }
467
468 private void processPeerRouterInsertion(
469 MapEvent<String, ExternalPeerRouter> event) {
470 log.debug("External peer router inserted");
471 notifyDelegate(new OpenstackNetworkEvent(
472 EXTERNAL_PEER_ROUTER_CREATED, event.newValue().value()));
473 }
474
475 private void processPeerRouterRemoval(
476 MapEvent<String, ExternalPeerRouter> event) {
477 log.debug("External peer router removed");
478 notifyDelegate(new OpenstackNetworkEvent(
479 EXTERNAL_PEER_ROUTER_REMOVED, event.oldValue().value()));
480 }
481
482 private void processPeerRouterMacUpdated(
483 MapEvent<String, ExternalPeerRouter> event) {
484 ExternalPeerRouter oldPeerRouter = event.oldValue().value();
485 ExternalPeerRouter newPeerRouter = event.newValue().value();
486
487 if (!Objects.equals(oldPeerRouter.macAddress(), newPeerRouter.macAddress())) {
488 notifyDelegate(new OpenstackNetworkEvent(
489 EXTERNAL_PEER_ROUTER_MAC_UPDATED, newPeerRouter));
490 }
491 }
492 }
493
Hyunsun Moon44aac662017-02-18 02:07:01 +0900494 private class OpenstackPortMapListener implements MapEventListener<String, Port> {
495
496 @Override
497 public void event(MapEvent<String, Port> event) {
498 switch (event.type()) {
499 case UPDATE:
Jian Li411bf2e2018-11-29 00:08:54 +0900500 eventExecutor.execute(() -> processPortMapUpdate(event));
Hyunsun Moon44aac662017-02-18 02:07:01 +0900501 break;
502 case INSERT:
Jian Li411bf2e2018-11-29 00:08:54 +0900503 eventExecutor.execute(() -> processPortMapInsertion(event));
Hyunsun Moon44aac662017-02-18 02:07:01 +0900504 break;
505 case REMOVE:
Jian Li411bf2e2018-11-29 00:08:54 +0900506 eventExecutor.execute(() -> processPortMapRemoval(event));
Hyunsun Moon44aac662017-02-18 02:07:01 +0900507 break;
508 default:
Jian Li78885a22018-03-02 11:33:02 +0900509 log.error("Unsupported openstack port event type");
Hyunsun Moon44aac662017-02-18 02:07:01 +0900510 break;
511 }
512 }
Hyunsun Moonae51e732017-04-25 17:46:21 +0900513
Jian Li411bf2e2018-11-29 00:08:54 +0900514 private void processPortMapUpdate(MapEvent<String, Port> event) {
515 log.debug("OpenStack port updated");
516 Port oldPort = event.oldValue().value();
517 Port newPort = event.newValue().value();
518 notifyDelegate(new OpenstackNetworkEvent(
519 OPENSTACK_PORT_UPDATED,
520 network(event.newValue().value().getNetworkId()), newPort));
521 processSecurityGroupUpdate(oldPort, newPort);
522 }
523
524 private void processPortMapInsertion(MapEvent<String, Port> event) {
525 log.debug("OpenStack port created");
526 notifyDelegate(new OpenstackNetworkEvent(
527 OPENSTACK_PORT_CREATED,
528 network(event.newValue().value().getNetworkId()),
529 event.newValue().value()));
530 }
531
532 private void processPortMapRemoval(MapEvent<String, Port> event) {
533 log.debug("OpenStack port removed");
534 notifyDelegate(new OpenstackNetworkEvent(
535 OPENSTACK_PORT_PRE_REMOVE,
536 network(event.oldValue().value().getNetworkId()),
537 event.oldValue().value()));
538
539 notifyDelegate(new OpenstackNetworkEvent(
540 OPENSTACK_PORT_REMOVED,
541 network(event.oldValue().value().getNetworkId()),
542 event.oldValue().value()));
543 }
544
Hyunsun Moonae51e732017-04-25 17:46:21 +0900545 private void processSecurityGroupUpdate(Port oldPort, Port newPort) {
546 List<String> oldSecurityGroups = oldPort.getSecurityGroups() == null ?
547 ImmutableList.of() : oldPort.getSecurityGroups();
548 List<String> newSecurityGroups = newPort.getSecurityGroups() == null ?
549 ImmutableList.of() : newPort.getSecurityGroups();
550
551 oldSecurityGroups.stream()
Jian Li5ecfd1a2018-12-10 11:41:03 +0900552 .filter(sgId -> !Objects.requireNonNull(
553 newPort.getSecurityGroups()).contains(sgId))
Hyunsun Moonae51e732017-04-25 17:46:21 +0900554 .forEach(sgId -> notifyDelegate(new OpenstackNetworkEvent(
555 OPENSTACK_PORT_SECURITY_GROUP_REMOVED, newPort, sgId
556 )));
557
558 newSecurityGroups.stream()
559 .filter(sgId -> !oldPort.getSecurityGroups().contains(sgId))
560 .forEach(sgId -> notifyDelegate(new OpenstackNetworkEvent(
561 OPENSTACK_PORT_SECURITY_GROUP_ADDED, newPort, sgId
562 )));
563 }
Hyunsun Moon44aac662017-02-18 02:07:01 +0900564 }
565}