Remove ad-sal from lbaas - part 2
[netvirt.git] / openstack / net-virt / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / impl / NodeCacheManagerImpl.java
1 /*
2  * Copyright (C) 2015 Red Hat, Inc.
3  *
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
7  *
8  *  Authors : Flavio Fernandes
9  */
10 package org.opendaylight.ovsdb.openstack.netvirt.impl;
11
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;
25
26 import java.util.List;
27 import java.util.Map;
28
29 public class NodeCacheManagerImpl extends AbstractHandler
30         implements NodeCacheManager {
31
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();
35
36     @Override
37     public void nodeAdded(String nodeIdentifier) {
38         logger.debug(">>>>> enqueue: Node added : {}", nodeIdentifier);
39         enqueueEvent(new NodeCacheManagerEvent(nodeIdentifier, Action.ADD));
40     }
41     @Override
42     public void nodeRemoved(String nodeIdentifier) {
43         logger.debug(">>>>> enqueue: Node removed : {}", nodeIdentifier);
44         enqueueEvent(new NodeCacheManagerEvent(nodeIdentifier, Action.DELETE));
45     }
46     @Override
47     public List<Node> getNodes() {
48         return nodeCache;
49     }
50
51     private void _processNodeAdded(Node node) {
52         nodeCache.add(node);
53         for (NodeCacheListener handler : handlers.values()) {
54             try {
55                 handler.notifyNode(node, Action.ADD);
56             } catch (Exception e) {
57                 logger.error("Failed notifying node add event", e);
58             }
59         }
60     }
61     private void _processNodeRemoved(Node node) {
62         nodeCache.remove(node);
63         for (NodeCacheListener handler : handlers.values()) {
64             try {
65                 handler.notifyNode(node, Action.DELETE);
66             } catch (Exception e) {
67                 logger.error("Failed notifying node remove event", e);
68             }
69         }
70     }
71
72     /**
73      * Process the event.
74      *
75      * @param abstractEvent the {@link org.opendaylight.ovsdb.openstack.netvirt.AbstractEvent} event to be handled.
76      * @see org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher
77      */
78     @Override
79     public void processEvent(AbstractEvent abstractEvent) {
80         if (!(abstractEvent instanceof NodeCacheManagerEvent)) {
81             logger.error("Unable to process abstract event " + abstractEvent);
82             return;
83         }
84         NodeCacheManagerEvent ev = (NodeCacheManagerEvent) abstractEvent;
85         logger.debug(">>>>> dequeue: {}", ev);
86         switch (ev.getAction()) {
87             case ADD:
88                 _processNodeAdded(NodeUtils.getOpenFlowNode(ev.getNodeIdentifier()));
89                 break;
90             case DELETE:
91                 _processNodeRemoved(NodeUtils.getOpenFlowNode(ev.getNodeIdentifier()));
92                 break;
93             case UPDATE:
94                 break;
95             default:
96                 logger.warn("Unable to process event action " + ev.getAction());
97                 break;
98         }
99     }
100
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);
105     }
106
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);
111     }
112 }