From fdc9baff926317737dad80dff6b56442da25b246 Mon Sep 17 00:00:00 2001 From: Somashekhar Javalagi Date: Fri, 2 Mar 2018 16:44:00 +0530 Subject: [PATCH] OPNFLWPLUG-985: Service recovery for openfplowplugin Implementing service recovery mechanism for openflowplugin 1. Registering openflowplugin external facing listeners to ServiceRecovery Registry 2. Using srm-api of serviceutils project for the service recovery 3. When openfplugin service recovery is invoked, all the listeners which are registered to the srm registry, will be unregistered and registered Change-Id: I64736e9ed02dd7fc2125a235399743defe68530c Signed-off-by: Somashekhar Javalagi --- applications/forwardingrules-manager/pom.xml | 9 +++ .../frm/ForwardingRulesManager.java | 6 ++ .../frm/impl/AbstractListeningCommiter.java | 11 +++- .../applications/frm/impl/FlowForwarder.java | 21 +++---- .../frm/impl/ForwardingRulesManagerImpl.java | 25 +++++++- .../applications/frm/impl/GroupForwarder.java | 22 +++---- .../applications/frm/impl/MeterForwarder.java | 22 +++---- .../applications/frm/impl/TableForwarder.java | 21 ++++--- .../OpenflowServiceRecoveryHandler.java | 18 ++++++ .../OpenflowServiceRecoveryHandlerImpl.java | 57 +++++++++++++++++++ .../blueprint/forwardingrules-manager.xml | 15 ++++- .../test/java/test/mock/FlowListenerTest.java | 10 +++- .../java/test/mock/GroupListenerTest.java | 10 +++- .../java/test/mock/MeterListenerTest.java | 10 +++- .../test/java/test/mock/NodeListenerTest.java | 11 +++- .../test/mock/TableFeaturesListenerTest.java | 9 ++- .../odl-openflowplugin-southbound/pom.xml | 8 +++ parent/pom.xml | 1 + 18 files changed, 234 insertions(+), 52 deletions(-) create mode 100644 applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/recovery/OpenflowServiceRecoveryHandler.java create mode 100644 applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/recovery/impl/OpenflowServiceRecoveryHandlerImpl.java diff --git a/applications/forwardingrules-manager/pom.xml b/applications/forwardingrules-manager/pom.xml index 3129a5567b..5759cf53bd 100644 --- a/applications/forwardingrules-manager/pom.xml +++ b/applications/forwardingrules-manager/pom.xml @@ -12,10 +12,19 @@ bundle + + javax.inject + javax.inject + org.opendaylight.controller sal-binding-api + + org.opendaylight.serviceutils + srm-api + ${serviceutils.version} + org.opendaylight.openflowplugin.model model-flow-service diff --git a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/ForwardingRulesManager.java b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/ForwardingRulesManager.java index 53f7277073..0d57c8e2a9 100644 --- a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/ForwardingRulesManager.java +++ b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/ForwardingRulesManager.java @@ -12,6 +12,7 @@ import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.openflowplugin.api.openflow.configuration.ConfigurationListener; import org.opendaylight.openflowplugin.applications.frm.impl.DevicesGroupRegistry; import org.opendaylight.openflowplugin.applications.frm.impl.FlowNodeConnectorInventoryTranslatorImpl; +import org.opendaylight.serviceutils.srm.RecoverableListener; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; @@ -187,4 +188,9 @@ public interface ForwardingRulesManager extends ConfigurationListener, AutoClose */ NodeConfigurator getNodeConfigurator(); + /** + * Method for register RecoverableListener. + * + */ + void addRecoverableListener(RecoverableListener recoverableListener); } diff --git a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/AbstractListeningCommiter.java b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/AbstractListeningCommiter.java index 4000bf66fa..0f1ab4d0fd 100644 --- a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/AbstractListeningCommiter.java +++ b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/AbstractListeningCommiter.java @@ -9,11 +9,13 @@ package org.opendaylight.openflowplugin.applications.frm.impl; import com.google.common.base.Preconditions; import java.util.Collection; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesCommiter; import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager; import org.opendaylight.openflowplugin.applications.frm.NodeConfigurator; +import org.opendaylight.serviceutils.srm.RecoverableListener; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey; @@ -30,16 +32,21 @@ import org.slf4j.LoggerFactory; * AbstractChangeListner implemented basic {@link org.opendaylight.controller.md.sal.binding.api.DataTreeModification} * processing for flow node subDataObject (flows, groups and meters). */ -public abstract class AbstractListeningCommiter implements ForwardingRulesCommiter { +public abstract class AbstractListeningCommiter implements ForwardingRulesCommiter, + RecoverableListener { private static final Logger LOG = LoggerFactory.getLogger(AbstractListeningCommiter.class); + protected final DataBroker dataBroker; ForwardingRulesManager provider; NodeConfigurator nodeConfigurator; - public AbstractListeningCommiter(final ForwardingRulesManager provider) { + public AbstractListeningCommiter(final ForwardingRulesManager provider, final DataBroker dataBroker) { this.provider = Preconditions.checkNotNull(provider, "ForwardingRulesManager can not be null!"); this.nodeConfigurator = Preconditions.checkNotNull(provider.getNodeConfigurator(), "NodeConfigurator can not be null!"); + this.dataBroker = Preconditions.checkNotNull(dataBroker, "DataBroker can not be null!"); + registerListener(); + provider.addRecoverableListener(this); } @Override diff --git a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/FlowForwarder.java b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/FlowForwarder.java index 1d88478104..23cee7a522 100644 --- a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/FlowForwarder.java +++ b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/FlowForwarder.java @@ -25,7 +25,6 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.infrautils.utils.concurrent.JdkFutures; import org.opendaylight.openflowplugin.applications.frm.ActionType; import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager; -import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; @@ -81,26 +80,22 @@ import org.slf4j.LoggerFactory; public class FlowForwarder extends AbstractListeningCommiter { private static final Logger LOG = LoggerFactory.getLogger(FlowForwarder.class); + private static final String GROUP_EXISTS_IN_DEVICE_ERROR = "GROUPEXISTS"; - private final DataBroker dataBroker; private ListenerRegistration listenerRegistration; public FlowForwarder(final ForwardingRulesManager manager, final DataBroker db) { - super(manager); - dataBroker = Preconditions.checkNotNull(db, "DataBroker can not be null!"); - registrationListener(db); + super(manager, db); } @SuppressWarnings("IllegalCatch") - private void registrationListener(final DataBroker db) { + @Override + public void registerListener() { final DataTreeIdentifier treeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, getWildCardPath()); try { - SimpleTaskRetryLooper looper = new SimpleTaskRetryLooper(ForwardingRulesManagerImpl.STARTUP_LOOP_TICK, - ForwardingRulesManagerImpl.STARTUP_LOOP_MAX_RETRIES); - listenerRegistration = looper - .loopUntilNoException(() -> db.registerDataTreeChangeListener(treeId, FlowForwarder.this)); + listenerRegistration = dataBroker.registerDataTreeChangeListener(treeId, FlowForwarder.this); } catch (final Exception e) { LOG.warn("FRM Flow DataTreeChange listener registration fail!"); LOG.debug("FRM Flow DataTreeChange listener registration fail ..", e); @@ -108,6 +103,12 @@ public class FlowForwarder extends AbstractListeningCommiter { } } + + @Override + public void deregisterListener() { + close(); + } + @Override public void close() { if (listenerRegistration != null) { diff --git a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/ForwardingRulesManagerImpl.java b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/ForwardingRulesManagerImpl.java index 12c1d03117..e3d27dade4 100644 --- a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/ForwardingRulesManagerImpl.java +++ b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/ForwardingRulesManagerImpl.java @@ -29,8 +29,11 @@ import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager; import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesProperty; import org.opendaylight.openflowplugin.applications.frm.NodeConfigurator; import org.opendaylight.openflowplugin.applications.frm.nodeconfigurator.NodeConfiguratorImpl; +import org.opendaylight.openflowplugin.applications.frm.recovery.OpenflowServiceRecoveryHandler; import org.opendaylight.openflowplugin.applications.reconciliation.NotificationRegistration; import org.opendaylight.openflowplugin.applications.reconciliation.ReconciliationManager; +import org.opendaylight.serviceutils.srm.RecoverableListener; +import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; @@ -92,11 +95,17 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager { private boolean staleMarkingEnabled; private int reconciliationRetryCount; private boolean isBundleBasedReconciliationEnabled; + private final OpenflowServiceRecoveryHandler openflowServiceRecoveryHandler; + private final ServiceRecoveryRegistry serviceRecoveryRegistry; public ForwardingRulesManagerImpl(final DataBroker dataBroker, final RpcProviderRegistry rpcRegistry, - final ForwardingRulesManagerConfig config, final ClusterSingletonServiceProvider clusterSingletonService, - final NotificationProviderService notificationService, final ConfigurationService configurationService, - final ReconciliationManager reconciliationManager) { + final ForwardingRulesManagerConfig config, + final ClusterSingletonServiceProvider clusterSingletonService, + final NotificationProviderService notificationService, + final ConfigurationService configurationService, + final ReconciliationManager reconciliationManager, + final OpenflowServiceRecoveryHandler openflowServiceRecoveryHandler, + final ServiceRecoveryRegistry serviceRecoveryRegistry) { disableReconciliation = config.isDisableReconciliation(); staleMarkingEnabled = config.isStaleMarkingEnabled(); reconciliationRetryCount = config.getReconciliationRetryCount(); @@ -122,6 +131,10 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager { "RPC SalTableService not found."); this.salBundleService = Preconditions.checkNotNull(rpcRegistry.getRpcService(SalBundleService.class), "RPC SalBundlService not found."); + this.openflowServiceRecoveryHandler = Preconditions.checkNotNull(openflowServiceRecoveryHandler, + "Openflow service recovery handler cannot be null"); + this.serviceRecoveryRegistry = Preconditions.checkNotNull(serviceRecoveryRegistry, + "Service recovery registry cannot be null"); } @Override @@ -285,6 +298,12 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager { return reconciliationRetryCount; } + @Override + public void addRecoverableListener(RecoverableListener recoverableListener) { + serviceRecoveryRegistry.addRecoverableListener(openflowServiceRecoveryHandler.buildServiceRegistryKey(), + recoverableListener); + } + @Override public FlowNodeConnectorInventoryTranslatorImpl getFlowNodeConnectorInventoryTranslatorImpl() { return flowNodeConnectorInventoryTranslatorImpl; diff --git a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/GroupForwarder.java b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/GroupForwarder.java index 29c166e0cf..6e91ad42ee 100644 --- a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/GroupForwarder.java +++ b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/GroupForwarder.java @@ -7,7 +7,6 @@ */ package org.opendaylight.openflowplugin.applications.frm.impl; -import com.google.common.base.Preconditions; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -19,7 +18,6 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.infrautils.utils.concurrent.JdkFutures; import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager; -import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput; @@ -58,21 +56,20 @@ import org.slf4j.LoggerFactory; public class GroupForwarder extends AbstractListeningCommiter { private static final Logger LOG = LoggerFactory.getLogger(GroupForwarder.class); - private final DataBroker dataBroker; private ListenerRegistration listenerRegistration; - @SuppressWarnings("IllegalCatch") public GroupForwarder(final ForwardingRulesManager manager, final DataBroker db) { - super(manager); - dataBroker = Preconditions.checkNotNull(db, "DataBroker can not be null!"); + super(manager, db); + } + + @SuppressWarnings("IllegalCatch") + @Override + public void registerListener() { final DataTreeIdentifier treeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, getWildCardPath()); try { - SimpleTaskRetryLooper looper = new SimpleTaskRetryLooper(ForwardingRulesManagerImpl.STARTUP_LOOP_TICK, - ForwardingRulesManagerImpl.STARTUP_LOOP_MAX_RETRIES); - listenerRegistration = looper - .loopUntilNoException(() -> db.registerDataTreeChangeListener(treeId, GroupForwarder.this)); + listenerRegistration = dataBroker.registerDataTreeChangeListener(treeId, GroupForwarder.this); } catch (final Exception e) { LOG.warn("FRM Group DataTreeChange listener registration fail!"); LOG.debug("FRM Group DataTreeChange listener registration fail ..", e); @@ -80,6 +77,11 @@ public class GroupForwarder extends AbstractListeningCommiter { } } + @Override + public void deregisterListener() { + close(); + } + @Override public void close() { if (listenerRegistration != null) { diff --git a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/MeterForwarder.java b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/MeterForwarder.java index de17098800..880508ac08 100644 --- a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/MeterForwarder.java +++ b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/MeterForwarder.java @@ -7,7 +7,6 @@ */ package org.opendaylight.openflowplugin.applications.frm.impl; -import com.google.common.base.Preconditions; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -19,7 +18,6 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.infrautils.utils.concurrent.JdkFutures; import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager; -import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter; @@ -56,21 +54,20 @@ import org.slf4j.LoggerFactory; public class MeterForwarder extends AbstractListeningCommiter { private static final Logger LOG = LoggerFactory.getLogger(MeterForwarder.class); - private final DataBroker dataBroker; private ListenerRegistration listenerRegistration; - @SuppressWarnings("IllegalCatch") public MeterForwarder(final ForwardingRulesManager manager, final DataBroker db) { - super(manager); - dataBroker = Preconditions.checkNotNull(db, "DataBroker can not be null!"); + super(manager, db); + } + + @SuppressWarnings("IllegalCatch") + @Override + public void registerListener() { final DataTreeIdentifier treeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, getWildCardPath()); try { - SimpleTaskRetryLooper looper = new SimpleTaskRetryLooper(ForwardingRulesManagerImpl.STARTUP_LOOP_TICK, - ForwardingRulesManagerImpl.STARTUP_LOOP_MAX_RETRIES); - listenerRegistration = looper - .loopUntilNoException(() -> db.registerDataTreeChangeListener(treeId, MeterForwarder.this)); + listenerRegistration = dataBroker.registerDataTreeChangeListener(treeId, MeterForwarder.this); } catch (final Exception e) { LOG.warn("FRM Meter DataTreeChange listener registration fail!"); LOG.debug("FRM Meter DataTreeChange listener registration fail ..", e); @@ -78,6 +75,11 @@ public class MeterForwarder extends AbstractListeningCommiter { } } + @Override + public void deregisterListener() { + close(); + } + @Override public void close() { if (listenerRegistration != null) { diff --git a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/TableForwarder.java b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/TableForwarder.java index 640a253e6e..473d7f2d79 100644 --- a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/TableForwarder.java +++ b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/TableForwarder.java @@ -8,7 +8,6 @@ package org.opendaylight.openflowplugin.applications.frm.impl; -import com.google.common.base.Preconditions; import com.google.common.util.concurrent.Futures; import java.util.Collections; import java.util.concurrent.Future; @@ -17,7 +16,6 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.infrautils.utils.concurrent.JdkFutures; import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager; -import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef; @@ -40,18 +38,18 @@ public class TableForwarder extends AbstractListeningCommiter { private static final Logger LOG = LoggerFactory.getLogger(TableForwarder.class); private ListenerRegistration listenerRegistration; - @SuppressWarnings("IllegalCatch") public TableForwarder(final ForwardingRulesManager manager, final DataBroker db) { - super(manager); - Preconditions.checkNotNull(db, "DataBroker can not be null!"); + super(manager, db); + } + + @SuppressWarnings("IllegalCatch") + @Override + public void registerListener() { final DataTreeIdentifier treeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, getWildCardPath()); try { - SimpleTaskRetryLooper looper = new SimpleTaskRetryLooper(ForwardingRulesManagerImpl.STARTUP_LOOP_TICK, - ForwardingRulesManagerImpl.STARTUP_LOOP_MAX_RETRIES); - listenerRegistration = looper - .loopUntilNoException(() -> db.registerDataTreeChangeListener(treeId, TableForwarder.this)); + listenerRegistration = dataBroker.registerDataTreeChangeListener(treeId, TableForwarder.this); } catch (final Exception e) { LOG.warn("FRM Table DataTreeChangeListener registration fail!"); LOG.debug("FRM Table DataTreeChangeListener registration fail ..", e); @@ -59,6 +57,11 @@ public class TableForwarder extends AbstractListeningCommiter { } } + @Override + public void deregisterListener() { + close(); + } + @Override public void close() { if (listenerRegistration != null) { diff --git a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/recovery/OpenflowServiceRecoveryHandler.java b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/recovery/OpenflowServiceRecoveryHandler.java new file mode 100644 index 0000000000..fee8d33aaf --- /dev/null +++ b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/recovery/OpenflowServiceRecoveryHandler.java @@ -0,0 +1,18 @@ +/* + * 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.openflowplugin.applications.frm.recovery; + +/** + * OpenflowServiceRecoveryHandler is the generic interface which provides + * facility to generate key for service recovery for openflowplugin. + */ + +public interface OpenflowServiceRecoveryHandler { + String buildServiceRegistryKey(); +} diff --git a/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/recovery/impl/OpenflowServiceRecoveryHandlerImpl.java b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/recovery/impl/OpenflowServiceRecoveryHandlerImpl.java new file mode 100644 index 0000000000..b9bd0f3083 --- /dev/null +++ b/applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/recovery/impl/OpenflowServiceRecoveryHandlerImpl.java @@ -0,0 +1,57 @@ +/* + * 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.openflowplugin.applications.frm.recovery.impl; + +import javax.inject.Inject; +import javax.inject.Singleton; +import org.opendaylight.openflowplugin.applications.frm.recovery.OpenflowServiceRecoveryHandler; +import org.opendaylight.serviceutils.srm.RecoverableListener; +import org.opendaylight.serviceutils.srm.ServiceRecoveryInterface; +import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.serviceutils.srm.types.rev180626.Ofplugin; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Singleton +public class OpenflowServiceRecoveryHandlerImpl implements ServiceRecoveryInterface, + OpenflowServiceRecoveryHandler { + + private static final Logger LOG = LoggerFactory.getLogger(OpenflowServiceRecoveryHandlerImpl.class); + + private final ServiceRecoveryRegistry serviceRecoveryRegistry; + + @Inject + public OpenflowServiceRecoveryHandlerImpl(final ServiceRecoveryRegistry serviceRecoveryRegistry) { + LOG.info("Registering openflowplugin service recovery handlers"); + this.serviceRecoveryRegistry = serviceRecoveryRegistry; + serviceRecoveryRegistry.registerServiceRecoveryRegistry(buildServiceRegistryKey(), this); + } + + private void deregisterListeners() { + serviceRecoveryRegistry.getRecoverableListeners(buildServiceRegistryKey()) + .forEach(RecoverableListener::deregisterListener); + } + + private void registerListeners() { + serviceRecoveryRegistry.getRecoverableListeners(buildServiceRegistryKey()) + .forEach(RecoverableListener::registerListener); + } + + @Override + public void recoverService(final String entityId) { + LOG.info("Recover Openflowplugin service by deregistering and registering all relevant listeners"); + deregisterListeners(); + //FIXME: device group registry cache to be cleared before starting the listeners + registerListeners(); + } + + @Override + public String buildServiceRegistryKey() { + return Ofplugin.class.toString(); + } +} diff --git a/applications/forwardingrules-manager/src/main/resources/org/opendaylight/blueprint/forwardingrules-manager.xml b/applications/forwardingrules-manager/src/main/resources/org/opendaylight/blueprint/forwardingrules-manager.xml index dad4763ba2..6a2f1ea21a 100644 --- a/applications/forwardingrules-manager/src/main/resources/org/opendaylight/blueprint/forwardingrules-manager.xml +++ b/applications/forwardingrules-manager/src/main/resources/org/opendaylight/blueprint/forwardingrules-manager.xml @@ -4,19 +4,26 @@ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0" odl:use-default-for-reference-types="true"> + - + + binding-class="org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.forwardingrules.manager.config.rev160511.ForwardingRulesManagerConfig"/> + + + + init-method="start" destroy-method="close"> @@ -24,6 +31,8 @@ + + 1.8.0-SNAPSHOT 0.15.0-SNAPSHOT 1.4.0-SNAPSHOT + 0.2.0-SNAPSHOT @@ -106,6 +107,13 @@ javax.inject javax.inject + + org.opendaylight.serviceutils + odl-serviceutils-srm + ${serviceutils.version} + features + xml + diff --git a/parent/pom.xml b/parent/pom.xml index 5b77e44468..f7f0a95455 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -33,6 +33,7 @@ utf-8 0000.0002.0053.0 1.4.0-SNAPSHOT + 0.2.0-SNAPSHOT -- 2.36.6