Service Recover for QoS Service as a whole & QoS Policy Instance. 05/69305/10
authorNaveen Kumar Verma <naveen.kumar.verma@ericsson.com>
Fri, 9 Mar 2018 10:05:18 +0000 (15:35 +0530)
committerSam Hague <shague@redhat.com>
Mon, 19 Mar 2018 22:15:46 +0000 (22:15 +0000)
For QoS service Recovery, listeners in the QoS service will be
re-regisered. Following command will do service recovery for QoS
service.
-----
srm:recover service qos
-----

For Qos Policy Instance Recovery, The policy id giving in the following
command will be reapplied on all the networks and port on which it was
applied earlier.
-----
srm:recover instance policy <policy-id>
-----

Change-Id: If02bc0a610d216f4387832ac21dac80aafb7d70e
Signed-off-by: Naveen Kumar Verma <naveen.kumar.verma@ericsson.com>
qosservice/impl/pom.xml
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosInterfaceStateChangeListener.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronNetworkChangeListener.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronPortChangeListener.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronUtils.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNodeListener.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosPolicyChangeListener.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/recovery/QosPolicyInstanceRecoveryHandler.java [new file with mode: 0644]
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/recovery/QosServiceRecoveryHandler.java [new file with mode: 0644]
qosservice/impl/src/main/resources/org/opendaylight/blueprint/qosservice.xml

index 355c04d304ff27c98efc51171c622789eed5960a..46c9479214a4e785c6c5e1a77c12f0e0ab57e268 100644 (file)
@@ -42,6 +42,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <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>
index 67aa3cd00aeb38d1a59577afb18e840bb94080fb..01759773447e8c0176edda2c14f9f6a22dc3bda3 100644 (file)
@@ -15,7 +15,10 @@ import javax.inject.Singleton;
 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;
@@ -31,7 +34,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class QosInterfaceStateChangeListener extends AsyncClusteredDataTreeChangeListenerBase<Interface,
-        QosInterfaceStateChangeListener> {
+        QosInterfaceStateChangeListener> implements RecoverableListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(QosInterfaceStateChangeListener.class);
 
@@ -43,22 +46,32 @@ public class QosInterfaceStateChangeListener extends AsyncClusteredDataTreeChang
 
     @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);
index 73ede429999141bcba1e5db00117f65bf5985865..c9a85ee40a0d1ef4a4eb6e54b196031eb6ec4e03 100644 (file)
@@ -13,6 +13,9 @@ import javax.inject.Singleton;
 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;
@@ -23,7 +26,7 @@ import org.slf4j.LoggerFactory;
 
 @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;
@@ -31,20 +34,29 @@ public class QosNeutronNetworkChangeListener extends AsyncClusteredDataTreeChang
 
     @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);
index 66f7dc9868a9d04b96d12e917c544e5ea7f333a8..ac2b963aed1d6893b82973e3e1eff11a9b3be31a 100644 (file)
@@ -13,6 +13,9 @@ import javax.inject.Singleton;
 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;
@@ -23,7 +26,7 @@ import org.slf4j.LoggerFactory;
 
 @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;
@@ -31,17 +34,20 @@ public class QosNeutronPortChangeListener extends AsyncClusteredDataTreeChangeLi
 
     @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());
     }
 
@@ -50,6 +56,11 @@ public class QosNeutronPortChangeListener extends AsyncClusteredDataTreeChangeLi
         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;
index 93d56f9c4a6119a50f7bc7185ccb750b75521630..4df5d6c32060bce68f6cbe0646e69218539b9d19 100644 (file)
@@ -14,6 +14,7 @@ import java.util.ArrayList;
 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;
@@ -138,6 +139,10 @@ public class QosNeutronUtils {
         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();
@@ -755,6 +760,8 @@ public class QosNeutronUtils {
         return isQosPolicy;
     }
 
+
+
     public boolean hasBandwidthLimitRule(Port port) {
         Uuid qosUuid = null;
         boolean bwLimitRule = false;
index f47f09f034dcebbb4a261e57824e459eb3789a83..4bc2dee725da387aafc5e0dd543a76ca8ae8c975 100644 (file)
@@ -25,6 +25,9 @@ import org.opendaylight.genius.mdsalutil.NwConstants;
 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;
@@ -34,27 +37,37 @@ import org.slf4j.Logger;
 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);
index 97ff2afc2e8dd5c02d7f759056e48d5680318c20..814e1b7db33e04a34bac68413821a412ff050f28 100644 (file)
@@ -22,8 +22,11 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 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;
@@ -43,7 +46,7 @@ import org.slf4j.LoggerFactory;
 
 @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;
@@ -52,22 +55,31 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
 
     @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);
@@ -239,6 +251,22 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
         }
     }
 
+    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);
@@ -250,6 +278,10 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
         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);
         }
@@ -270,7 +302,10 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
         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);
         }
@@ -302,6 +337,8 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
         writeTx.submit();
     }
 
+
+
     private RuleTypes getRuleTypes(String ruleType) {
         RuleTypesBuilder rtBuilder = new RuleTypesBuilder();
         rtBuilder.setRuleType(ruleType);
diff --git a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/recovery/QosPolicyInstanceRecoveryHandler.java b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/recovery/QosPolicyInstanceRecoveryHandler.java
new file mode 100644 (file)
index 0000000..5c7e2a8
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * 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();
+    }
+}
diff --git a/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/recovery/QosServiceRecoveryHandler.java b/qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/recovery/QosServiceRecoveryHandler.java
new file mode 100644 (file)
index 0000000..563e830
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * 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();
+    }
+}
index 1e19ea3ca2a16f573e047a68470e4768fca48e81..ebf702def1f625d32b9194aec1ef76b256d22bf3 100644 (file)
@@ -24,6 +24,8 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
                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" />