<artifactId>mdsalutil-api</artifactId>
<version>${genius.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.genius</groupId>
+ <artifactId>srm-api</artifactId>
+ <version>${genius.version}</version>
+ </dependency>
<dependency>
<groupId>org.opendaylight.infrautils</groupId>
<artifactId>inject</artifactId>
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.genius.srm.RecoverableListener;
+import org.opendaylight.genius.srm.ServiceRecoveryRegistry;
import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
+import org.opendaylight.netvirt.qosservice.recovery.QosServiceRecoveryHandler;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
@Singleton
public class QosInterfaceStateChangeListener extends AsyncClusteredDataTreeChangeListenerBase<Interface,
- QosInterfaceStateChangeListener> {
+ QosInterfaceStateChangeListener> implements RecoverableListener {
private static final Logger LOG = LoggerFactory.getLogger(QosInterfaceStateChangeListener.class);
@Inject
public QosInterfaceStateChangeListener(final DataBroker dataBroker, final QosAlertManager qosAlertManager,
- final QosNeutronUtils qosNeutronUtils, final INeutronVpnManager neutronVpnManager) {
+ final QosNeutronUtils qosNeutronUtils,
+ final INeutronVpnManager neutronVpnManager,
+ final ServiceRecoveryRegistry serviceRecoveryRegistry,
+ final QosServiceRecoveryHandler qosServiceRecoveryHandler) {
super(Interface.class, QosInterfaceStateChangeListener.class);
this.dataBroker = dataBroker;
this.uuidUtil = new UuidUtil();
this.qosAlertManager = qosAlertManager;
this.qosNeutronUtils = qosNeutronUtils;
this.neutronVpnManager = neutronVpnManager;
+ serviceRecoveryRegistry.addRecoverableListener(qosServiceRecoveryHandler.buildServiceRegistryKey(),
+ this);
LOG.debug("{} created", getClass().getSimpleName());
}
@PostConstruct
public void init() {
- registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
+ registerListener();
LOG.debug("{} init and registerListener done", getClass().getSimpleName());
}
+ @Override
+ public void registerListener() {
+ registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
+ }
+
@Override
protected InstanceIdentifier<Interface> getWildCardPath() {
return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.genius.srm.RecoverableListener;
+import org.opendaylight.genius.srm.ServiceRecoveryRegistry;
+import org.opendaylight.netvirt.qosservice.recovery.QosServiceRecoveryHandler;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.ext.rev160613.QosNetworkExtension;
@Singleton
public class QosNeutronNetworkChangeListener extends AsyncClusteredDataTreeChangeListenerBase<Network,
- QosNeutronNetworkChangeListener> {
+ QosNeutronNetworkChangeListener> implements RecoverableListener {
private static final Logger LOG = LoggerFactory.getLogger(QosNeutronNetworkChangeListener.class);
private final DataBroker dataBroker;
private final QosAlertManager qosAlertManager;
@Inject
public QosNeutronNetworkChangeListener(final DataBroker dataBroker, final QosAlertManager qosAlertManager,
- final QosNeutronUtils qosNeutronUtils) {
+ final QosNeutronUtils qosNeutronUtils,
+ final ServiceRecoveryRegistry serviceRecoveryRegistry,
+ final QosServiceRecoveryHandler qosServiceRecoveryHandler) {
super(Network.class, QosNeutronNetworkChangeListener.class);
this.dataBroker = dataBroker;
this.qosAlertManager = qosAlertManager;
this.qosNeutronUtils = qosNeutronUtils;
+ serviceRecoveryRegistry.addRecoverableListener(qosServiceRecoveryHandler.buildServiceRegistryKey(),
+ this);
LOG.debug("{} created", getClass().getSimpleName());
}
@PostConstruct
public void init() {
- registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+ registerListener();
LOG.debug("{} init and registerListener done", getClass().getSimpleName());
}
+ @Override
+ public void registerListener() {
+ registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+ }
+
@Override
protected InstanceIdentifier<Network> getWildCardPath() {
return InstanceIdentifier.create(Neutron.class).child(Networks.class).child(Network.class);
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.genius.srm.RecoverableListener;
+import org.opendaylight.genius.srm.ServiceRecoveryRegistry;
+import org.opendaylight.netvirt.qosservice.recovery.QosServiceRecoveryHandler;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.ext.rev160613.QosPortExtension;
@Singleton
public class QosNeutronPortChangeListener extends AsyncClusteredDataTreeChangeListenerBase<Port,
- QosNeutronPortChangeListener> {
+ QosNeutronPortChangeListener> implements RecoverableListener {
private static final Logger LOG = LoggerFactory.getLogger(QosNeutronPortChangeListener.class);
private final DataBroker dataBroker;
private final QosAlertManager qosAlertManager;
@Inject
public QosNeutronPortChangeListener(final DataBroker dataBroker, final QosAlertManager qosAlertManager,
- final QosNeutronUtils qosNeutronUtils) {
+ final QosNeutronUtils qosNeutronUtils, final QosServiceRecoveryHandler qosServiceRecoveryHandler,
+ final ServiceRecoveryRegistry serviceRecoveryRegistry) {
super(Port.class, QosNeutronPortChangeListener.class);
this.dataBroker = dataBroker;
this.qosAlertManager = qosAlertManager;
this.qosNeutronUtils = qosNeutronUtils;
+ serviceRecoveryRegistry.addRecoverableListener(qosServiceRecoveryHandler.buildServiceRegistryKey(),
+ this);
LOG.debug("{} created", getClass().getSimpleName());
}
@PostConstruct
public void init() {
- registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+ registerListener();
LOG.debug("{} init and registerListener done", getClass().getSimpleName());
}
return InstanceIdentifier.create(Neutron.class).child(Ports.class).child(Port.class);
}
+ @Override
+ public void registerListener() {
+ registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+ }
+
@Override
protected QosNeutronPortChangeListener getDataTreeChangeListener() {
return QosNeutronPortChangeListener.this;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CopyOnWriteArraySet;
qosPolicyMap.remove(qosPolicy.getUuid());
}
+ public Map<Uuid, QosPolicy> getQosPolicyMap() {
+ return qosPolicyMap;
+ }
+
public Collection<Port> getQosPorts(Uuid qosUuid) {
final ConcurrentMap<Uuid, Port> portMap = qosPortsMap.get(qosUuid);
return portMap != null ? portMap.values() : Collections.emptyList();
return isQosPolicy;
}
+
+
public boolean hasBandwidthLimitRule(Port port) {
Uuid qosUuid = null;
boolean bwLimitRule = false;
import org.opendaylight.genius.mdsalutil.actions.ActionNxResubmit;
import org.opendaylight.genius.mdsalutil.instructions.InstructionApplyActions;
import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.genius.srm.RecoverableListener;
+import org.opendaylight.genius.srm.ServiceRecoveryRegistry;
+import org.opendaylight.netvirt.qosservice.recovery.QosServiceRecoveryHandler;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.slf4j.LoggerFactory;
@Singleton
-public class QosNodeListener extends AsyncDataTreeChangeListenerBase<FlowCapableNode, QosNodeListener> {
+public class QosNodeListener extends AsyncDataTreeChangeListenerBase<FlowCapableNode, QosNodeListener>
+ implements RecoverableListener {
private static final Logger LOG = LoggerFactory.getLogger(QosNodeListener.class);
private final DataBroker dataBroker;
private final IMdsalApiManager mdsalUtils;
@Inject
- public QosNodeListener(final DataBroker dataBroker, final IMdsalApiManager mdsalUtils) {
+ public QosNodeListener(final DataBroker dataBroker, final IMdsalApiManager mdsalUtils,
+ final ServiceRecoveryRegistry serviceRecoveryRegistry,
+ final QosServiceRecoveryHandler qosServiceRecoveryHandler) {
super(FlowCapableNode.class, QosNodeListener.class);
this.dataBroker = dataBroker;
this.mdsalUtils = mdsalUtils;
+ serviceRecoveryRegistry.addRecoverableListener(qosServiceRecoveryHandler.buildServiceRegistryKey(),
+ this);
LOG.debug("{} created", getClass().getSimpleName());
}
@Override
@PostConstruct
public void init() {
- registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+ registerListener();
LOG.debug("{} init and registerListener done", getClass().getSimpleName());
}
+ @Override
+ public void registerListener() {
+ registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+ }
+
@Override
protected InstanceIdentifier<FlowCapableNode> getWildCardPath() {
return InstanceIdentifier.create(Nodes.class).child(Node.class).augmentation(FlowCapableNode.class);
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.genius.srm.RecoverableListener;
+import org.opendaylight.genius.srm.ServiceRecoveryRegistry;
import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
import org.opendaylight.netvirt.neutronvpn.api.utils.ChangeUtils;
+import org.opendaylight.netvirt.qosservice.recovery.QosServiceRecoveryHandler;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
@Singleton
public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListenerBase<QosPolicy,
- QosPolicyChangeListener> {
+ QosPolicyChangeListener> implements RecoverableListener {
private static final Logger LOG = LoggerFactory.getLogger(QosPolicyChangeListener.class);
private final DataBroker dataBroker;
private final QosAlertManager qosAlertManager;
@Inject
public QosPolicyChangeListener(final DataBroker dataBroker, final QosAlertManager qosAlertManager,
- final QosNeutronUtils qosNeutronUtils, final JobCoordinator jobCoordinator) {
+ final QosNeutronUtils qosNeutronUtils, final JobCoordinator jobCoordinator,
+ final ServiceRecoveryRegistry serviceRecoveryRegistry,
+ final QosServiceRecoveryHandler qosServiceRecoveryHandler) {
super(QosPolicy.class, QosPolicyChangeListener.class);
this.dataBroker = dataBroker;
this.qosAlertManager = qosAlertManager;
this.qosNeutronUtils = qosNeutronUtils;
this.jobCoordinator = jobCoordinator;
+ serviceRecoveryRegistry.addRecoverableListener(qosServiceRecoveryHandler.buildServiceRegistryKey(),
+ this);
LOG.debug("{} created", getClass().getSimpleName());
}
@PostConstruct
public void init() {
- registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+ registerListener();
supportedQoSRuleTypes();
LOG.debug("{} init and registerListener done", getClass().getSimpleName());
}
+ @Override
+ public void registerListener() {
+ registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+ }
+
@Override
protected InstanceIdentifier<QosPolicy> getWildCardPath() {
return InstanceIdentifier.create(Neutron.class).child(QosPolicies.class).child(QosPolicy.class);
}
}
+ public void reapplyPolicy(String entityid) {
+ Uuid policyUuid = Uuid.getDefaultInstance(entityid);
+
+ if (!qosNeutronUtils.getQosPolicyMap().get(policyUuid).getBandwidthLimitRules().isEmpty()) {
+ BandwidthLimitRules bandwidthLimitRules =
+ qosNeutronUtils.getQosPolicyMap().get(policyUuid).getBandwidthLimitRules().get(0);
+ update(policyUuid, bandwidthLimitRules);
+ }
+
+ if (!qosNeutronUtils.getQosPolicyMap().get(policyUuid).getDscpmarkingRules().isEmpty()) {
+ DscpmarkingRules dscpmarkingRules =
+ qosNeutronUtils.getQosPolicyMap().get(policyUuid).getDscpmarkingRules().get(0);
+ update(policyUuid, dscpmarkingRules);
+ }
+ }
+
@Override
protected void update(InstanceIdentifier<QosPolicy> identifier, QosPolicy original, QosPolicy update) {
LOG.trace("Updating QosPolicy : key: {}, original value={}, update value={}", identifier, original, update);
LOG.trace("Updating BandwidthLimitRules : key: {}, original value={}, update value={}", identifier, original,
update);
Uuid qosUuid = identifier.firstKeyOf(QosPolicy.class).getUuid();
+ update(qosUuid, update);
+ }
+
+ private void update(Uuid qosUuid, BandwidthLimitRules update) {
for (Network network : qosNeutronUtils.getQosNetworks(qosUuid)) {
qosNeutronUtils.handleNeutronNetworkQosUpdate(network, qosUuid);
}
LOG.trace("Updating DscpMarkingRules : key: {}, original value={}, update value={}", identifier, original,
update);
Uuid qosUuid = identifier.firstKeyOf(QosPolicy.class).getUuid();
+ update(qosUuid, update);
+ }
+ private void update(Uuid qosUuid, DscpmarkingRules update) {
for (Network network : qosNeutronUtils.getQosNetworks(qosUuid)) {
qosNeutronUtils.handleNeutronNetworkQosUpdate(network, qosUuid);
}
writeTx.submit();
}
+
+
private RuleTypes getRuleTypes(String ruleType) {
RuleTypesBuilder rtBuilder = new RuleTypesBuilder();
rtBuilder.setRuleType(ruleType);
--- /dev/null
+/*
+ * Copyright (c) 2018 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.netvirt.qosservice.recovery;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.opendaylight.genius.srm.ServiceRecoveryInterface;
+import org.opendaylight.genius.srm.ServiceRecoveryRegistry;
+import org.opendaylight.netvirt.qosservice.QosPolicyChangeListener;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.NetvirtQosPolicyInstance;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@Singleton
+public class QosPolicyInstanceRecoveryHandler implements ServiceRecoveryInterface {
+
+ private static final Logger LOG = LoggerFactory.getLogger(QosPolicyInstanceRecoveryHandler.class);
+
+ private final QosPolicyChangeListener qosPolicyChangeListener;
+
+ @Inject
+ public QosPolicyInstanceRecoveryHandler(ServiceRecoveryRegistry serviceRecoveryRegistry,
+ QosPolicyChangeListener qosPolicyChangeListener) {
+
+ LOG.info("Registering for recovery of QosPolicy Instance");
+ this.qosPolicyChangeListener = qosPolicyChangeListener;
+ serviceRecoveryRegistry.registerServiceRecoveryRegistry(buildServiceRegistryKey(), this);
+ }
+
+ @Override
+ public void recoverService(String entityId) {
+ LOG.info("Recover Qos Policy instance {}", entityId);
+ qosPolicyChangeListener.reapplyPolicy(entityId);
+ }
+
+ private String buildServiceRegistryKey() {
+ return NetvirtQosPolicyInstance.class.toString();
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2018 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.netvirt.qosservice.recovery;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.opendaylight.genius.srm.ServiceRecoveryInterface;
+import org.opendaylight.genius.srm.ServiceRecoveryRegistry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.NetvirtQos;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@Singleton
+public class QosServiceRecoveryHandler implements ServiceRecoveryInterface {
+
+ private static final Logger LOG = LoggerFactory.getLogger(QosServiceRecoveryHandler.class);
+ private final ServiceRecoveryRegistry serviceRecoveryRegistry;
+
+ @Inject
+ public QosServiceRecoveryHandler(final ServiceRecoveryRegistry serviceRecoveryRegistry) {
+ LOG.info("Registering Qos for service recovery");
+ this.serviceRecoveryRegistry = serviceRecoveryRegistry;
+ serviceRecoveryRegistry.registerServiceRecoveryRegistry(buildServiceRegistryKey(), this);
+ }
+
+ @Override
+ public void recoverService(final String entityId) {
+ LOG.info("recover QOS service by de-registering and registering all relevant listeners");
+ deregisterListeners();
+ registerListeners();
+ }
+
+ private void deregisterListeners() {
+ LOG.trace("De-Registering QOS Listeners for recovery");
+ serviceRecoveryRegistry.getRecoverableListeners(buildServiceRegistryKey())
+ .forEach((recoverableListener -> recoverableListener.deregisterListener()));
+ }
+
+ private void registerListeners() {
+ LOG.trace("Re-Registering QOS Listeners for recovery");
+ serviceRecoveryRegistry.getRecoverableListeners(buildServiceRegistryKey())
+ .forEach((recoverableListener -> recoverableListener.registerListener()));
+ }
+
+ public String buildServiceRegistryKey() {
+ return NetvirtQos.class.toString();
+ }
+}
interface="org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService" />
<reference id="jobCoordinator"
interface="org.opendaylight.infrautils.jobcoordinator.JobCoordinator" />
+ <reference id="serviceRecoveryRegistry"
+ interface="org.opendaylight.genius.srm.ServiceRecoveryRegistry"/>
<odl:rpc-service id="odlInterfaceRpcService"
interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService" />