2 * Copyright (C) 2015 Red Hat, Inc.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 * Authors : Flavio Fernandes
10 package org.opendaylight.ovsdb.openstack.netvirt.impl;
12 import com.google.common.collect.Lists;
13 import com.google.common.collect.Maps;
14 import org.opendaylight.ovsdb.openstack.netvirt.AbstractEvent;
15 import org.opendaylight.ovsdb.openstack.netvirt.AbstractHandler;
16 import org.opendaylight.ovsdb.openstack.netvirt.NodeCacheManagerEvent;
17 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
18 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheListener;
19 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
20 import org.opendaylight.ovsdb.utils.mdsal.node.NodeUtils;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
22 import org.osgi.framework.ServiceReference;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
26 import java.util.List;
29 public class NodeCacheManagerImpl extends AbstractHandler
30 implements NodeCacheManager {
32 private static final Logger logger = LoggerFactory.getLogger(NodeCacheManagerImpl.class);
33 private List<Node> nodeCache = Lists.newArrayList();
34 private Map<Long, NodeCacheListener> handlers = Maps.newHashMap();
37 public void nodeAdded(String nodeIdentifier) {
38 logger.debug(">>>>> enqueue: Node added : {}", nodeIdentifier);
39 enqueueEvent(new NodeCacheManagerEvent(nodeIdentifier, Action.ADD));
42 public void nodeRemoved(String nodeIdentifier) {
43 logger.debug(">>>>> enqueue: Node removed : {}", nodeIdentifier);
44 enqueueEvent(new NodeCacheManagerEvent(nodeIdentifier, Action.DELETE));
47 public List<Node> getNodes() {
51 private void _processNodeAdded(Node node) {
53 for (NodeCacheListener handler : handlers.values()) {
55 handler.notifyNode(node, Action.ADD);
56 } catch (Exception e) {
57 logger.error("Failed notifying node add event", e);
61 private void _processNodeRemoved(Node node) {
62 nodeCache.remove(node);
63 for (NodeCacheListener handler : handlers.values()) {
65 handler.notifyNode(node, Action.DELETE);
66 } catch (Exception e) {
67 logger.error("Failed notifying node remove event", e);
75 * @param abstractEvent the {@link org.opendaylight.ovsdb.openstack.netvirt.AbstractEvent} event to be handled.
76 * @see org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher
79 public void processEvent(AbstractEvent abstractEvent) {
80 if (!(abstractEvent instanceof NodeCacheManagerEvent)) {
81 logger.error("Unable to process abstract event " + abstractEvent);
84 NodeCacheManagerEvent ev = (NodeCacheManagerEvent) abstractEvent;
85 logger.debug(">>>>> dequeue: {}", ev);
86 switch (ev.getAction()) {
88 _processNodeAdded(NodeUtils.getOpenFlowNode(ev.getNodeIdentifier()));
91 _processNodeRemoved(NodeUtils.getOpenFlowNode(ev.getNodeIdentifier()));
96 logger.warn("Unable to process event action " + ev.getAction());
101 public void cacheListenerAdded(final ServiceReference ref, NodeCacheListener handler){
102 Long pid = (Long) ref.getProperty(org.osgi.framework.Constants.SERVICE_ID);
103 handlers.put(pid, handler);
104 logger.debug("Node cache listener registered, pid {}", pid);
107 public void cacheListenerRemoved(final ServiceReference ref){
108 Long pid = (Long) ref.getProperty(org.osgi.framework.Constants.SERVICE_ID);
109 handlers.remove(pid);
110 logger.debug("Node cache listener unregistered, pid {}", pid);