From: Anil Vishnoi Date: Wed, 3 Feb 2016 05:05:54 +0000 (-0800) Subject: Bug-5198 : He Plugin:Inventory manager is deleting X-Git-Tag: release/boron~336 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=6883208e180f15b0412fff20144b3045821bc424;p=openflowplugin.git Bug-5198 : He Plugin:Inventory manager is deleting the node from inventory data store, when switch disconnect from slave node. Change-Id: I19155e84444b57eab94157c34eaa32952fecf3f2 Signed-off-by: Anil Vishnoi (cherry picked from commit 69da70673ed8afe48eec65ed5ffab750e6cac444) --- diff --git a/applications/inventory-manager/src/main/config/default-config.xml b/applications/inventory-manager/src/main/config/default-config.xml index 2d76f1d00c..cfb992a206 100644 --- a/applications/inventory-manager/src/main/config/default-config.xml +++ b/applications/inventory-manager/src/main/config/default-config.xml @@ -13,6 +13,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html urn:opendaylight:inventory?module=opendaylight-inventory&revision=2013-08-19 urn:opendaylight:flow:inventory?module=flow-node-inventory&revision=2013-08-19 urn:opendaylight:flow:types?module=opendaylight-flow-types&revision=2013-10-26 + urn:opendaylight:params:xml:ns:yang:controller:config:distributed-entity-ownership-service?module=distributed-entity-ownership-service&revision=2015-08-10 @@ -25,6 +26,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html binding:binding-broker-osgi-registry binding-osgi-broker + + entity-ownership:entity-ownership-service + entity-ownership-service + diff --git a/applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/FlowCapableInventoryProvider.java b/applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/FlowCapableInventoryProvider.java index c6114972a6..328599f009 100644 --- a/applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/FlowCapableInventoryProvider.java +++ b/applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/FlowCapableInventoryProvider.java @@ -11,13 +11,18 @@ import java.util.ArrayList; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingDeque; +import com.google.common.base.Optional; import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; +import org.opendaylight.controller.md.sal.common.api.clustering.Entity; +import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService; +import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipState; import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction; import org.opendaylight.controller.md.sal.common.api.data.TransactionChain; import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,6 +36,7 @@ class FlowCapableInventoryProvider implements AutoCloseable, Runnable, Transacti private final BlockingQueue queue = new LinkedBlockingDeque<>(QUEUE_DEPTH); private final NotificationProviderService notificationService; + private final EntityOwnershipService eos; private final DataBroker dataBroker; private BindingTransactionChain txChain; @@ -38,9 +44,10 @@ class FlowCapableInventoryProvider implements AutoCloseable, Runnable, Transacti private ListenerRegistration tableFeatureListenerRegistration; private Thread thread; - FlowCapableInventoryProvider(final DataBroker dataBroker, final NotificationProviderService notificationService) { + FlowCapableInventoryProvider(final DataBroker dataBroker, final NotificationProviderService notificationService, EntityOwnershipService eos) { this.dataBroker = Preconditions.checkNotNull(dataBroker); this.notificationService = Preconditions.checkNotNull(notificationService); + this.eos = eos; } void start() { @@ -233,4 +240,16 @@ class FlowCapableInventoryProvider implements AutoCloseable, Runnable, Transacti txChain = null; } } + + public boolean deviceDataDeleteAllowed(NodeId nodeId) { + Entity device = new Entity("openflow",nodeId.getValue()); + Optional entityOwnershipState = eos.getOwnershipState(device); + if(entityOwnershipState.isPresent()){ + EntityOwnershipState eState = entityOwnershipState.get(); + if(eState.isOwner()) { return true; } + + return !eState.hasOwner(); + } + return true; + } } diff --git a/applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/InventoryActivator.java b/applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/InventoryActivator.java index ebef4fe254..3610157774 100644 --- a/applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/InventoryActivator.java +++ b/applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/InventoryActivator.java @@ -8,6 +8,7 @@ package org.opendaylight.openflowplugin.applications.inventory.manager; import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; @@ -17,6 +18,12 @@ import org.slf4j.LoggerFactory; public class InventoryActivator implements BindingAwareProvider, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(InventoryActivator.class); private FlowCapableInventoryProvider provider; + final private EntityOwnershipService eos; + + public InventoryActivator(EntityOwnershipService eos) { + this.eos = eos; + } + @Override public void onSessionInitiated(final ProviderContext session) { @@ -24,7 +31,7 @@ public class InventoryActivator implements BindingAwareProvider, AutoCloseable { NotificationProviderService salNotifiService = session.getSALService(NotificationProviderService.class); - provider = new FlowCapableInventoryProvider(dataBroker, salNotifiService); + provider = new FlowCapableInventoryProvider(dataBroker, salNotifiService, eos); provider.start(); } diff --git a/applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/NodeChangeCommiter.java b/applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/NodeChangeCommiter.java index fffb2e3c79..35b6b3d717 100644 --- a/applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/NodeChangeCommiter.java +++ b/applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/NodeChangeCommiter.java @@ -24,13 +24,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.Fl import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRemoved; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemoved; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.OpendaylightInventoryListener; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.*; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; @@ -69,6 +63,8 @@ class NodeChangeCommiter implements OpendaylightInventoryListener { return; } + if(!manager.deviceDataDeleteAllowed(getNodeId(connector.getNodeConnectorRef().getValue()))) { return; } + LOG.debug("Node connector removed notification received, {}", connector.getNodeConnectorRef().getValue()); manager.enqueue(new InventoryOperation() { @Override @@ -121,6 +117,8 @@ class NodeChangeCommiter implements OpendaylightInventoryListener { return; } + if(!manager.deviceDataDeleteAllowed(getNodeId(node.getNodeRef().getValue()))) { return; } + LOG.debug("Node removed notification received, {}", node.getNodeRef().getValue()); manager.enqueue(new InventoryOperation() { @Override @@ -197,4 +195,8 @@ class NodeChangeCommiter implements OpendaylightInventoryListener { } }); } + + private NodeId getNodeId(InstanceIdentifier iid) { + return iid.firstKeyOf(Node.class).getId(); + } } diff --git a/applications/inventory-manager/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/inventory/manager/impl/rev150530/InventoryManagerImplModule.java b/applications/inventory-manager/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/inventory/manager/impl/rev150530/InventoryManagerImplModule.java index d5c88a4020..673aa25158 100644 --- a/applications/inventory-manager/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/inventory/manager/impl/rev150530/InventoryManagerImplModule.java +++ b/applications/inventory-manager/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/inventory/manager/impl/rev150530/InventoryManagerImplModule.java @@ -18,7 +18,7 @@ public class InventoryManagerImplModule extends org.opendaylight.yang.gen.v1.urn @Override public java.lang.AutoCloseable createInstance() { - InventoryActivator provider = new InventoryActivator(); + InventoryActivator provider = new InventoryActivator(getEntityOwnershipServiceDependency()); getBrokerDependency().registerProvider(provider); return provider; } diff --git a/applications/inventory-manager/src/main/yang/inventory-manager-impl.yang b/applications/inventory-manager/src/main/yang/inventory-manager-impl.yang index a825ba320c..f3483ecd8c 100644 --- a/applications/inventory-manager/src/main/yang/inventory-manager-impl.yang +++ b/applications/inventory-manager/src/main/yang/inventory-manager-impl.yang @@ -5,6 +5,7 @@ module inventory-manager-impl { import config { prefix config; revision-date 2013-04-05; } import opendaylight-md-sal-binding { prefix md-sal-binding; revision-date 2013-10-28;} + import opendaylight-entity-ownership-service { prefix eos; } description "Service definition for inventory manager"; @@ -30,6 +31,15 @@ module inventory-manager-impl { } } } + + container entity-ownership-service { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity eos:entity-ownership-service; + } + } + } } } }