Bug-5198 : He Plugin:Inventory manager is deleting 06/34206/1
authorAnil Vishnoi <vishnoianil@gmail.com>
Wed, 3 Feb 2016 05:05:54 +0000 (21:05 -0800)
committerAnil Vishnoi <vishnoianil@gmail.com>
Sat, 6 Feb 2016 03:57:34 +0000 (03:57 +0000)
the node from inventory data store, when switch disconnect from slave node.

Change-Id: I19155e84444b57eab94157c34eaa32952fecf3f2
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
(cherry picked from commit 69da70673ed8afe48eec65ed5ffab750e6cac444)

applications/inventory-manager/src/main/config/default-config.xml
applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/FlowCapableInventoryProvider.java
applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/InventoryActivator.java
applications/inventory-manager/src/main/java/org/opendaylight/openflowplugin/applications/inventory/manager/NodeChangeCommiter.java
applications/inventory-manager/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/inventory/manager/impl/rev150530/InventoryManagerImplModule.java
applications/inventory-manager/src/main/yang/inventory-manager-impl.yang

index 2d76f1d00c27bf61941cbfd6f73d4f6876e4cb1f..cfb992a206926e3471dffad31f20dac2066d56a2 100644 (file)
@@ -13,6 +13,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
     <capability>urn:opendaylight:inventory?module=opendaylight-inventory&amp;revision=2013-08-19</capability>
     <capability>urn:opendaylight:flow:inventory?module=flow-node-inventory&amp;revision=2013-08-19</capability>
     <capability>urn:opendaylight:flow:types?module=opendaylight-flow-types&amp;revision=2013-10-26</capability>
+    <capability>urn:opendaylight:params:xml:ns:yang:controller:config:distributed-entity-ownership-service?module=distributed-entity-ownership-service&amp;revision=2015-08-10</capability>
   </required-capabilities>
   <configuration>
 
@@ -25,6 +26,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
             <name>binding-osgi-broker</name>
           </broker>
+          <entity-ownership-service>
+            <type xmlns:entity-ownership="urn:opendaylight:params:xml:ns:yang:controller:md:sal:core:spi:entity-ownership-service">entity-ownership:entity-ownership-service</type>
+            <name>entity-ownership-service</name>
+          </entity-ownership-service>
         </module>
       </modules>
     </data>
index c6114972a6da1517cef1a83342b7201826878685..328599f0096f9957af18a70fdc6a6e70120ee6d8 100644 (file)
@@ -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<InventoryOperation> 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> entityOwnershipState =  eos.getOwnershipState(device);
+        if(entityOwnershipState.isPresent()){
+            EntityOwnershipState eState = entityOwnershipState.get();
+            if(eState.isOwner()) { return true; }
+
+            return !eState.hasOwner();
+        }
+        return true;
+    }
 }
index ebef4fe2546d6b5deda2d26ef9fc2b8bf3413478..3610157774a360893d7bca9c26fd4db3ab9711f6 100644 (file)
@@ -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();
     }
 
index fffb2e3c79ae76b4145e26254d1d492e71251458..35b6b3d717dc345e93926e33198820587f74607d 100644 (file)
@@ -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();
+    }
 }
index d5c88a4020ba0184bad3d26167eb799d36c34d1b..673aa2515861d55cebbe1aa02f6208822f10e287 100644 (file)
@@ -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;
     }
index a825ba320c2cd5a50af1eda2eb28ed6e44b11bc3..f3483ecd8c58c2670a10171fcb45328bcb81cba7 100644 (file)
@@ -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;
+                    }
+                }
+            }
         }
     }
 }