Merge "Using latest RPC from interface mgr"
[vpnservice.git] / neutronvpn / neutronvpn-impl / src / main / java / org / opendaylight / vpnservice / neutronvpn / NeutronPortChangeListener.java
1 /*
2  * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
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 package org.opendaylight.vpnservice.neutronvpn;
9
10
11 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
12 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
13 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
15 import org.opendaylight.vpnservice.mdsalutil.AbstractDataChangeListener;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
20 import org.opendaylight.yangtools.concepts.ListenerRegistration;
21 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 import java.util.ArrayList;
26 import java.util.Iterator;
27 import java.util.List;
28
29
30 public class NeutronPortChangeListener extends AbstractDataChangeListener<Port> implements AutoCloseable {
31     private static final Logger LOG = LoggerFactory.getLogger(NeutronPortChangeListener.class);
32
33     private ListenerRegistration<DataChangeListener> listenerRegistration;
34     private final DataBroker broker;
35     private NeutronvpnManager nvpnManager;
36
37
38     public NeutronPortChangeListener(final DataBroker db, NeutronvpnManager nVpnMgr) {
39         super(Port.class);
40         broker = db;
41         nvpnManager = nVpnMgr;
42         registerListener(db);
43     }
44
45     @Override
46     public void close() throws Exception {
47         if (listenerRegistration != null) {
48             try {
49                 listenerRegistration.close();
50             } catch (final Exception e) {
51                 LOG.error("Error when cleaning up DataChangeListener.", e);
52             }
53             listenerRegistration = null;
54         }
55         LOG.info("N_Port listener Closed");
56     }
57
58
59     private void registerListener(final DataBroker db) {
60         try {
61             listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
62                     InstanceIdentifier.create(Neutron.class).child(Ports.class).child(Port.class),
63                     NeutronPortChangeListener.this, DataChangeScope.SUBTREE);
64         } catch (final Exception e) {
65             LOG.error("Neutron Manager Port DataChange listener registration fail!", e);
66             throw new IllegalStateException("Neutron Manager Port DataChange listener registration failed.", e);
67         }
68     }
69
70     @Override
71     protected void add(InstanceIdentifier<Port> identifier, Port input) {
72         if (LOG.isTraceEnabled()) {
73             LOG.trace("Adding Port : key: " + identifier + ", value=" + input);
74         }
75         nvpnManager.handleNeutronPortCreated(input);
76
77     }
78
79     @Override
80     protected void remove(InstanceIdentifier<Port> identifier, Port input) {
81         if (LOG.isTraceEnabled()) {
82             LOG.trace("Removing Port : key: " + identifier + ", value=" + input);
83         }
84         nvpnManager.handleNeutronPortDeleted(input);
85
86     }
87
88     @Override
89     protected void update(InstanceIdentifier<Port> identifier, Port original, Port update) {
90         if (LOG.isTraceEnabled()) {
91             LOG.trace("Updating Port : key: " + identifier + ", original value=" + original + ", update value=" +
92                     update);
93         }
94         List<FixedIps> oldIPs = (original.getFixedIps() != null) ? original.getFixedIps() : new ArrayList<FixedIps>();
95         List<FixedIps> newIPs = (update.getFixedIps() != null) ? update.getFixedIps() : new ArrayList<FixedIps>();
96
97         if (!oldIPs.equals(newIPs)) {
98             Iterator<FixedIps> iterator = newIPs.iterator();
99             while (iterator.hasNext()) {
100                 FixedIps ip = iterator.next();
101                 if (oldIPs.remove(ip)) {
102                     iterator.remove();
103                 }
104             }
105             nvpnManager.handleNeutronPortUpdated(original, update);
106         }
107     }
108 }