2 * Copyright (c) 2017 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.qosservice;
11 import javax.annotation.PostConstruct;
12 import javax.inject.Inject;
13 import javax.inject.Singleton;
14 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
17 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
18 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.ext.rev160613.QosNetworkExtension;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
24 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
29 public class QosNeutronNetworkChangeListener extends AsyncDataTreeChangeListenerBase<Network,
30 QosNeutronNetworkChangeListener> implements AutoCloseable {
31 private static final Logger LOG = LoggerFactory.getLogger(QosNeutronNetworkChangeListener.class);
32 private final DataBroker dataBroker;
33 private final OdlInterfaceRpcService odlInterfaceRpcService;
34 private final INeutronVpnManager neutronVpnManager;
35 private final IMdsalApiManager mdsalUtils;
39 public QosNeutronNetworkChangeListener(final DataBroker dataBroker,
40 final INeutronVpnManager neutronVpnManager,
41 final OdlInterfaceRpcService odlInterfaceRpcService,
42 final IMdsalApiManager mdsalUtils) {
43 super(Network.class, QosNeutronNetworkChangeListener.class);
44 this.dataBroker = dataBroker;
45 this.neutronVpnManager = neutronVpnManager;
46 this.odlInterfaceRpcService = odlInterfaceRpcService;
47 this.mdsalUtils = mdsalUtils;
48 LOG.info("{} created", getClass().getSimpleName());
54 registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
55 LOG.info("{} init and registerListener done", getClass().getSimpleName());
59 protected InstanceIdentifier<Network> getWildCardPath() {
60 return InstanceIdentifier.create(Neutron.class).child(Networks.class).child(Network.class);
64 protected QosNeutronNetworkChangeListener getDataTreeChangeListener() {
65 return QosNeutronNetworkChangeListener.this;
69 protected void remove(InstanceIdentifier<Network> instanceIdentifier, Network network) {
70 if (QosNeutronUtils.hasBandwidthLimitRule(network)) {
71 QosAlertManager.removeFromQosAlertCache(network);
76 protected void update(InstanceIdentifier<Network> instanceIdentifier, Network original, Network update) {
77 QosNetworkExtension updateQos = update.getAugmentation(QosNetworkExtension.class);
78 QosNetworkExtension originalQos = original.getAugmentation(QosNetworkExtension.class);
79 if (originalQos == null && updateQos != null) {
80 // qosservice policy add
81 QosNeutronUtils.addToQosNetworksCache(updateQos.getQosPolicyId(), update);
82 QosNeutronUtils.handleNeutronNetworkQosUpdate(dataBroker, odlInterfaceRpcService,
83 neutronVpnManager, mdsalUtils, update, updateQos.getQosPolicyId());
84 if (QosNeutronUtils.hasBandwidthLimitRule(update)) {
85 QosAlertManager.addToQosAlertCache(update);
87 } else if (originalQos != null && updateQos != null
88 && !originalQos.getQosPolicyId().equals(updateQos.getQosPolicyId())) {
90 // qosservice policy update
92 QosNeutronUtils.removeFromQosNetworksCache(originalQos.getQosPolicyId(), original);
93 QosNeutronUtils.addToQosNetworksCache(updateQos.getQosPolicyId(), update);
94 QosNeutronUtils.handleNeutronNetworkQosUpdate(dataBroker, odlInterfaceRpcService,
95 neutronVpnManager, mdsalUtils, update, updateQos.getQosPolicyId());
97 if (QosNeutronUtils.hasBandwidthLimitRule(original)
98 && !QosNeutronUtils.hasBandwidthLimitRule(update)) {
99 QosAlertManager.removeFromQosAlertCache(original);
100 } else if (!QosNeutronUtils.hasBandwidthLimitRule(original)
101 && QosNeutronUtils.hasBandwidthLimitRule(update)) {
102 QosAlertManager.addToQosAlertCache(update);
105 } else if (originalQos != null && updateQos == null) {
106 // qosservice policy delete
107 if (QosNeutronUtils.hasBandwidthLimitRule(original)) {
108 QosAlertManager.removeFromQosAlertCache(original);
110 QosNeutronUtils.handleNeutronNetworkQosRemove(dataBroker, odlInterfaceRpcService,
111 neutronVpnManager, mdsalUtils, original, originalQos.getQosPolicyId());
112 QosNeutronUtils.removeFromQosNetworksCache(originalQos.getQosPolicyId(), original);
117 protected void add(InstanceIdentifier<Network> instanceIdentifier, Network network) {
118 QosNetworkExtension networkQos = network.getAugmentation(QosNetworkExtension.class);
119 if (networkQos != null) {
120 QosNeutronUtils.addToQosNetworksCache(networkQos.getQosPolicyId(), network);
121 QosNeutronUtils.handleNeutronNetworkQosUpdate(dataBroker, odlInterfaceRpcService,
122 neutronVpnManager, mdsalUtils, network, networkQos.getQosPolicyId());
123 if (QosNeutronUtils.hasBandwidthLimitRule(network)) {
124 QosAlertManager.addToQosAlertCache(network);