Enable checkstyle for neutronvpn
[netvirt.git] / vpnservice / neutronvpn / neutronvpn-impl / src / main / java / org / opendaylight / netvirt / neutronvpn / NeutronQosPolicyChangeListener.java
1 /*
2  * Copyright (c) 2016 Intel Corporation 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.netvirt.neutronvpn;
9
10 import java.math.BigInteger;
11 import java.util.Collection;
12 import java.util.Map;
13 import java.util.Map.Entry;
14 import javax.annotation.Nonnull;
15 import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
18 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
19 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
20 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
21 import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.QosPolicies;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.QosPolicy;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.qos.policy.BandwidthLimitRules;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.qos.policy.BandwidthLimitRulesBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
31 import org.opendaylight.yangtools.concepts.ListenerRegistration;
32 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36
37 public class NeutronQosPolicyChangeListener implements ClusteredDataTreeChangeListener<QosPolicy>, AutoCloseable {
38     private static final Logger LOG = LoggerFactory.getLogger(NeutronQosPolicyChangeListener.class);
39     private ListenerRegistration<DataTreeChangeListener<QosPolicy>> listenerRegistration;
40     private final DataBroker dataBroker;
41     private final OdlInterfaceRpcService odlInterfaceRpcService;
42     private final MdsalUtils mdsalUtils;
43
44
45     public NeutronQosPolicyChangeListener(final DataBroker dataBroker,
46             final OdlInterfaceRpcService odlInterfaceRpcService) {
47         this.dataBroker = dataBroker;
48         this.odlInterfaceRpcService = odlInterfaceRpcService;
49         this.mdsalUtils = new MdsalUtils(dataBroker);
50     }
51
52     public void start() {
53         LOG.info("{} start", getClass().getSimpleName());
54         DataTreeIdentifier<QosPolicy> dataTreeIdentifier =
55                 new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,
56                         InstanceIdentifier.create(Neutron.class).child(QosPolicies.class).child(QosPolicy.class));
57         LOG.info("Neutron Manager Qos Policy DataChange listener registration {}", dataTreeIdentifier);
58         listenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIdentifier,
59                 NeutronQosPolicyChangeListener.this);
60     }
61
62     @Override
63     // TODO Clean up the exception handling
64     @SuppressWarnings("checkstyle:IllegalCatch")
65     public void close() throws Exception {
66         if (listenerRegistration != null) {
67             try {
68                 listenerRegistration.close();
69             } catch (final Exception e) {
70                 LOG.error("Error when cleaning up DataChangeListener.", e);
71             }
72             listenerRegistration.close();
73         }
74         LOG.info("N_Qos Policy listener Closed");
75     }
76
77     @Override
78     public void onDataTreeChanged(@Nonnull Collection<DataTreeModification<QosPolicy>> changes) {
79         handleQosPolicyChanges(changes);
80         handleBandwidthLimitRulesChanges(changes);
81     }
82
83     private void handleQosPolicyChanges(Collection<DataTreeModification<QosPolicy>> changes) {
84         Map<InstanceIdentifier<QosPolicy>, QosPolicy> qosPolicyOriginalMap =
85                 ChangeUtils.extractOriginal(changes, QosPolicy.class);
86
87         for (Entry<InstanceIdentifier<QosPolicy>, QosPolicy> qosPolicyMapEntry :
88             ChangeUtils.extractCreated(changes, QosPolicy.class).entrySet()) {
89             add(qosPolicyMapEntry.getKey(), qosPolicyMapEntry.getValue());
90         }
91         for (Entry<InstanceIdentifier<QosPolicy>, QosPolicy> qosPolicyMapEntry :
92             ChangeUtils.extractUpdated(changes, QosPolicy.class).entrySet()) {
93             update(qosPolicyMapEntry.getKey(), qosPolicyOriginalMap.get(qosPolicyMapEntry.getKey()),
94                     qosPolicyMapEntry.getValue());
95         }
96         for (InstanceIdentifier<QosPolicy> qosPolicyIid : ChangeUtils.extractRemoved(changes, QosPolicy.class)) {
97             remove(qosPolicyIid, qosPolicyOriginalMap.get(qosPolicyIid));
98         }
99     }
100
101     private void handleBandwidthLimitRulesChanges(Collection<DataTreeModification<QosPolicy>> changes) {
102         Map<InstanceIdentifier<BandwidthLimitRules>, BandwidthLimitRules> bwLimitOriginalMap =
103                 ChangeUtils.extractOriginal(changes, BandwidthLimitRules.class);
104
105         for (Entry<InstanceIdentifier<BandwidthLimitRules>, BandwidthLimitRules> bwLimitMapEntry :
106             ChangeUtils.extractCreated(changes, BandwidthLimitRules.class).entrySet()) {
107             add(bwLimitMapEntry.getKey(), bwLimitMapEntry.getValue());
108         }
109         for (Entry<InstanceIdentifier<BandwidthLimitRules>, BandwidthLimitRules> bwLimitMapEntry :
110             ChangeUtils.extractUpdated(changes, BandwidthLimitRules.class).entrySet()) {
111             update(bwLimitMapEntry.getKey(), bwLimitOriginalMap.get(bwLimitMapEntry.getKey()),
112                     bwLimitMapEntry.getValue());
113         }
114         for (InstanceIdentifier<BandwidthLimitRules> bwLimitIid :
115             ChangeUtils.extractRemoved(changes, BandwidthLimitRules.class)) {
116             remove(bwLimitIid, bwLimitOriginalMap.get(bwLimitIid));
117         }
118     }
119
120     private void add(InstanceIdentifier<QosPolicy> identifier, QosPolicy input) {
121         LOG.trace("Adding  QosPolicy : key: {}, value={}", identifier, input);
122         NeutronvpnUtils.addToQosPolicyCache(input);
123     }
124
125     private void add(InstanceIdentifier<BandwidthLimitRules> identifier, BandwidthLimitRules input) {
126         LOG.trace("Adding BandwidthlimitRules : key: {}, value={}", identifier, input);
127
128         Uuid qosUuid = identifier.firstKeyOf(QosPolicy.class).getUuid();
129         if (NeutronvpnUtils.qosNetworksMap.get(qosUuid) != null
130                 && !NeutronvpnUtils.qosNetworksMap.get(qosUuid).isEmpty()) {
131             for (Network network : NeutronvpnUtils.qosNetworksMap.get(qosUuid).values()) {
132                 NeutronQosUtils.handleNeutronNetworkQosUpdate(dataBroker, odlInterfaceRpcService, network, qosUuid);
133             }
134         }
135
136         if (NeutronvpnUtils.qosPortsMap.get(qosUuid) != null
137                 && !NeutronvpnUtils.qosPortsMap.get(qosUuid).isEmpty()) {
138             for (Port port : NeutronvpnUtils.qosPortsMap.get(qosUuid).values()) {
139                 NeutronQosUtils.setPortBandwidthLimits(dataBroker, odlInterfaceRpcService, port, input);
140             }
141         }
142     }
143
144     private void remove(InstanceIdentifier<QosPolicy> identifier, QosPolicy input) {
145         LOG.trace("Removing QosPolicy : key: {}, value={}", identifier, input);
146         NeutronvpnUtils.removeFromQosPolicyCache(input);
147     }
148
149     private void remove(InstanceIdentifier<BandwidthLimitRules> identifier, BandwidthLimitRules input) {
150         LOG.trace("Removing BandwidthLimitRules : key: {}, value={}", identifier, input);
151
152         Uuid qosUuid = identifier.firstKeyOf(QosPolicy.class).getUuid();
153         BandwidthLimitRulesBuilder bwLimitBuilder = new BandwidthLimitRulesBuilder();
154         BandwidthLimitRules zeroBwLimitRule =
155                 bwLimitBuilder.setMaxBurstKbps(BigInteger.ZERO).setMaxKbps(BigInteger.ZERO).build();
156
157         if (NeutronvpnUtils.qosNetworksMap.get(qosUuid) != null
158                 && !NeutronvpnUtils.qosNetworksMap.get(qosUuid).isEmpty()) {
159             for (Network network : NeutronvpnUtils.qosNetworksMap.get(qosUuid).values()) {
160                 NeutronQosUtils.handleNeutronNetworkQosRemove(dataBroker, odlInterfaceRpcService, network, qosUuid);
161             }
162         }
163
164         if (NeutronvpnUtils.qosPortsMap.get(qosUuid) != null
165                 && !NeutronvpnUtils.qosPortsMap.get(qosUuid).isEmpty()) {
166             for (Port port : NeutronvpnUtils.qosPortsMap.get(qosUuid).values()) {
167                 NeutronQosUtils.setPortBandwidthLimits(dataBroker, odlInterfaceRpcService, port, zeroBwLimitRule);
168             }
169         }
170     }
171
172     private void update(InstanceIdentifier<QosPolicy> identifier, QosPolicy original, QosPolicy update) {
173         LOG.trace("Updating QosPolicy : key: {}, original value={}, update value={}", identifier, original, update);
174         NeutronvpnUtils.addToQosPolicyCache(update);
175     }
176
177     private void update(InstanceIdentifier<BandwidthLimitRules> identifier, BandwidthLimitRules original,
178             BandwidthLimitRules update) {
179         LOG.trace("Updating BandwidthLimitRules : key: {}, original value={}, update value={}", identifier, original,
180                 update);
181         Uuid qosUuid = identifier.firstKeyOf(QosPolicy.class).getUuid();
182         if (NeutronvpnUtils.qosNetworksMap.get(qosUuid) != null
183                 && !NeutronvpnUtils.qosNetworksMap.get(qosUuid).isEmpty()) {
184             for (Network network : NeutronvpnUtils.qosNetworksMap.get(qosUuid).values()) {
185                 NeutronQosUtils.handleNeutronNetworkQosUpdate(dataBroker, odlInterfaceRpcService, network, qosUuid);
186             }
187         }
188
189         if (NeutronvpnUtils.qosPortsMap.get(qosUuid) != null
190                 && !NeutronvpnUtils.qosPortsMap.get(qosUuid).isEmpty()) {
191             for (Port port : NeutronvpnUtils.qosPortsMap.get(qosUuid).values()) {
192                 NeutronQosUtils.setPortBandwidthLimits(dataBroker, odlInterfaceRpcService, port, update);
193             }
194         }
195     }
196 }