2 * Copyright (c) 2016 Intel Corporation and others. All rights reserved.
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 package org.opendaylight.netvirt.neutronvpn;
10 import java.math.BigInteger;
11 import java.util.Collection;
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;
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;
45 public NeutronQosPolicyChangeListener(final DataBroker dataBroker,
46 final OdlInterfaceRpcService odlInterfaceRpcService) {
47 this.dataBroker = dataBroker;
48 this.odlInterfaceRpcService = odlInterfaceRpcService;
49 this.mdsalUtils = new MdsalUtils(dataBroker);
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);
63 // TODO Clean up the exception handling
64 @SuppressWarnings("checkstyle:IllegalCatch")
65 public void close() throws Exception {
66 if (listenerRegistration != null) {
68 listenerRegistration.close();
69 } catch (final Exception e) {
70 LOG.error("Error when cleaning up DataChangeListener.", e);
72 listenerRegistration.close();
74 LOG.info("N_Qos Policy listener Closed");
78 public void onDataTreeChanged(@Nonnull Collection<DataTreeModification<QosPolicy>> changes) {
79 handleQosPolicyChanges(changes);
80 handleBandwidthLimitRulesChanges(changes);
83 private void handleQosPolicyChanges(Collection<DataTreeModification<QosPolicy>> changes) {
84 Map<InstanceIdentifier<QosPolicy>, QosPolicy> qosPolicyOriginalMap =
85 ChangeUtils.extractOriginal(changes, QosPolicy.class);
87 for (Entry<InstanceIdentifier<QosPolicy>, QosPolicy> qosPolicyMapEntry :
88 ChangeUtils.extractCreated(changes, QosPolicy.class).entrySet()) {
89 add(qosPolicyMapEntry.getKey(), qosPolicyMapEntry.getValue());
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());
96 for (InstanceIdentifier<QosPolicy> qosPolicyIid : ChangeUtils.extractRemoved(changes, QosPolicy.class)) {
97 remove(qosPolicyIid, qosPolicyOriginalMap.get(qosPolicyIid));
101 private void handleBandwidthLimitRulesChanges(Collection<DataTreeModification<QosPolicy>> changes) {
102 Map<InstanceIdentifier<BandwidthLimitRules>, BandwidthLimitRules> bwLimitOriginalMap =
103 ChangeUtils.extractOriginal(changes, BandwidthLimitRules.class);
105 for (Entry<InstanceIdentifier<BandwidthLimitRules>, BandwidthLimitRules> bwLimitMapEntry :
106 ChangeUtils.extractCreated(changes, BandwidthLimitRules.class).entrySet()) {
107 add(bwLimitMapEntry.getKey(), bwLimitMapEntry.getValue());
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());
114 for (InstanceIdentifier<BandwidthLimitRules> bwLimitIid :
115 ChangeUtils.extractRemoved(changes, BandwidthLimitRules.class)) {
116 remove(bwLimitIid, bwLimitOriginalMap.get(bwLimitIid));
120 private void add(InstanceIdentifier<QosPolicy> identifier, QosPolicy input) {
121 LOG.trace("Adding QosPolicy : key: {}, value={}", identifier, input);
122 NeutronvpnUtils.addToQosPolicyCache(input);
125 private void add(InstanceIdentifier<BandwidthLimitRules> identifier, BandwidthLimitRules input) {
126 LOG.trace("Adding BandwidthlimitRules : key: {}, value={}", identifier, input);
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);
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);
144 private void remove(InstanceIdentifier<QosPolicy> identifier, QosPolicy input) {
145 LOG.trace("Removing QosPolicy : key: {}, value={}", identifier, input);
146 NeutronvpnUtils.removeFromQosPolicyCache(input);
149 private void remove(InstanceIdentifier<BandwidthLimitRules> identifier, BandwidthLimitRules input) {
150 LOG.trace("Removing BandwidthLimitRules : key: {}, value={}", identifier, input);
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();
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);
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);
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);
177 private void update(InstanceIdentifier<BandwidthLimitRules> identifier, BandwidthLimitRules original,
178 BandwidthLimitRules update) {
179 LOG.trace("Updating BandwidthLimitRules : key: {}, original value={}, update value={}", identifier, original,
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);
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);