Fix issue that was causing integration test failure. 20/28320/3
authorAnil Vishnoi <vishnoianil@gmail.com>
Tue, 13 Oct 2015 08:04:24 +0000 (13:34 +0530)
committerFlavio Fernandes <ffernand@redhat.com>
Tue, 13 Oct 2015 11:24:19 +0000 (07:24 -0400)
In case of controller initiated connection, iid stamping
was not happening. Before clustering code merge, iid stamping
was done in updateData(), but after clustering code merge,
it does not allow to make any changes to the device till
owner of the device is selected by EntityOnwershipService,
so updateData() was not stamping the iid to swtich. With this
fix, once owner of the device is selected, it explictly stamp
iid to the switch.

NOTE: we should revert following patch before merging this patch
https://git.opendaylight.org/gerrit/#/c/28309/1

I ran the integration suit locally and it passes all the tests

[main] INFO org.ops4j.pax.exam.spi.reactors.ReactorManager - suite finished
Tests run: 22, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 288.094 sec - in org.opendaylight.ovsdb.southbound.it.SouthboundIT

Results :

Tests run: 22, Failures: 0, Errors: 0, Skipped: 0

Change-Id: I35d6e0a4fa94eef019420e9b9603873d5088a934
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbConnectionInstance.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbConnectionManager.java

index 3ea56b258399dc8c1847eb9e10e5a71e0e52b0fe..c477cb0ee6f0fc6a6c35c7b6a045a4ce0376ac6d 100644 (file)
@@ -7,12 +7,17 @@
  */
 package org.opendaylight.ovsdb.southbound;
 
+import static org.opendaylight.ovsdb.lib.operations.Operations.op;
+
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 
+import javax.annotation.Nonnull;
+
 import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipCandidateRegistration;
 import org.opendaylight.ovsdb.lib.EchoServiceCallbackFilters;
@@ -26,7 +31,9 @@ import org.opendaylight.ovsdb.lib.message.MonitorRequest;
 import org.opendaylight.ovsdb.lib.message.MonitorRequestBuilder;
 import org.opendaylight.ovsdb.lib.message.MonitorSelect;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
+import org.opendaylight.ovsdb.lib.notation.Mutator;
 import org.opendaylight.ovsdb.lib.notation.Row;
+import org.opendaylight.ovsdb.lib.operations.Mutate;
 import org.opendaylight.ovsdb.lib.operations.Operation;
 import org.opendaylight.ovsdb.lib.operations.OperationResult;
 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
@@ -34,11 +41,17 @@ import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
 import org.opendaylight.ovsdb.lib.schema.TableSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TypedBaseTable;
+import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
+import org.opendaylight.ovsdb.schema.openvswitch.OpenVSwitch;
 import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactCommand;
 import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactInvoker;
 import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactInvokerImpl;
+import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactUtils;
 import org.opendaylight.ovsdb.southbound.transactions.md.TransactionInvoker;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchExternalIds;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigs;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
@@ -46,11 +59,10 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.ListenableFuture;
 
-import javax.annotation.Nonnull;
-
 public class OvsdbConnectionInstance implements OvsdbClient {
     private static final Logger LOG = LoggerFactory.getLogger(OvsdbConnectionInstance.class);
     private OvsdbClient client;
@@ -63,6 +75,7 @@ public class OvsdbConnectionInstance implements OvsdbClient {
     private volatile boolean hasDeviceOwnership = false;
     private Entity connectedEntity;
     private EntityOwnershipCandidateRegistration deviceOwnershipCandidateRegistration;
+    private OvsdbNodeAugmentation initialCreateData = null;
 
     OvsdbConnectionInstance(ConnectionInfo key,OvsdbClient client,TransactionInvoker txInvoker,
             InstanceIdentifier<Node> iid) {
@@ -81,6 +94,10 @@ public class OvsdbConnectionInstance implements OvsdbClient {
 
     public void registerCallbacks() {
         if ( this.callback == null) {
+            if (this.initialCreateData != null ) {
+                this.updateConnectionAttributes();
+            }
+
             try {
                 List<String> databases = getDatabases().get();
                 this.callback = new OvsdbMonitorCallback(this,txInvoker);
@@ -115,8 +132,6 @@ public class OvsdbConnectionInstance implements OvsdbClient {
         }
     }
 
-
-
     private void monitorAllTables(String database, DatabaseSchema dbSchema) {
         Set<String> tables = dbSchema.getTables();
         if (tables != null) {
@@ -136,6 +151,85 @@ public class OvsdbConnectionInstance implements OvsdbClient {
         }
     }
 
+    private void updateConnectionAttributes() {
+        LOG.debug("Update attributes of ovsdb node ip: {} port: {}",
+                    this.initialCreateData.getConnectionInfo().getRemoteIp(),
+                    this.initialCreateData.getConnectionInfo().getRemotePort());
+        for ( Map.Entry<DatabaseSchema,TransactInvoker> entry: transactInvokers.entrySet()) {
+
+            TransactionBuilder transaction = new TransactionBuilder(this, entry.getKey());
+
+            // OpenVSwitchPart
+            OpenVSwitch ovs = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), OpenVSwitch.class);
+            Map<String, String> externalIdsMap = new HashMap<String, String>();
+
+            List<OpenvswitchExternalIds> externalIds = this.initialCreateData.getOpenvswitchExternalIds();
+
+            if (externalIds != null) {
+                for (OpenvswitchExternalIds externalId : externalIds) {
+                    externalIdsMap.put(externalId.getExternalIdKey(), externalId.getExternalIdValue());
+                }
+            }
+
+            stampInstanceIdentifier(transaction,this.instanceIdentifier.firstIdentifierOf(Node.class));
+
+            try {
+                ovs.setExternalIds(ImmutableMap.copyOf(externalIdsMap));
+                Mutate<GenericTableSchema> mutate = op.mutate(ovs)
+                            .addMutation(ovs.getExternalIdsColumn().getSchema(),
+                                Mutator.INSERT,
+                                ovs.getExternalIdsColumn().getData());
+                transaction.add(mutate);
+            } catch (NullPointerException e) {
+                LOG.warn("Incomplete OVSDB Node external IDs");
+            }
+
+
+
+            List<OpenvswitchOtherConfigs> otherConfigs = this.initialCreateData.getOpenvswitchOtherConfigs();
+            if (otherConfigs != null) {
+                Map<String, String> otherConfigsMap = new HashMap<String, String>();
+                for (OpenvswitchOtherConfigs otherConfig : otherConfigs) {
+                    otherConfigsMap.put(otherConfig.getOtherConfigKey(), otherConfig.getOtherConfigValue());
+                }
+                try {
+                    ovs.setOtherConfig(ImmutableMap.copyOf(otherConfigsMap));
+                    transaction.add(op.mutate(ovs).addMutation(ovs.getOtherConfigColumn().getSchema(),
+                        Mutator.INSERT,
+                        ovs.getOtherConfigColumn().getData()));
+                } catch (NullPointerException e) {
+                    LOG.warn("Incomplete OVSDB Node other_config", e);
+                }
+            }
+
+            invoke(transaction);
+        }
+    }
+
+    private void stampInstanceIdentifier(TransactionBuilder transaction,InstanceIdentifier<Node> iid) {
+        OpenVSwitch ovs = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), OpenVSwitch.class);
+        ovs.setExternalIds(Collections.<String,String>emptyMap());
+        TransactUtils.stampInstanceIdentifier(transaction,
+                iid,
+                ovs.getSchema(),
+                ovs.getExternalIdsColumn().getSchema());
+    }
+
+    private void invoke(TransactionBuilder txBuilder) {
+        ListenableFuture<List<OperationResult>> result = txBuilder.execute();
+        LOG.debug("invoke: tb: {}", txBuilder);
+        if (txBuilder.getOperations().size() > 0) {
+            try {
+                List<OperationResult> got = result.get();
+                LOG.debug("OVSDB transaction result: {}", got);
+            } catch (Exception e) {
+                LOG.warn("Transact execution exception: ", e);
+            }
+            LOG.trace("invoke exit tb: {}", txBuilder);
+        }
+    }
+
+
     public ListenableFuture<List<String>> getDatabases() {
         return client.getDatabases();
     }
@@ -277,4 +371,11 @@ public class OvsdbConnectionInstance implements OvsdbClient {
             setHasDeviceOwnership(Boolean.FALSE);
         }
     }
+
+    public OvsdbNodeAugmentation getOvsdbNodeAugmentation() {
+        return this.initialCreateData;
+    }
+    public void setOvsdbNodeAugmentation(OvsdbNodeAugmentation ovsdbNodeCreateData) {
+        this.initialCreateData = ovsdbNodeCreateData;
+    }
 }
index 6dd5e5f9d2bfaa06c7d5e211c0bad9c6516baa91..3599644c31b5b4ab7c8b7d50e01a974ec2434658 100644 (file)
@@ -151,6 +151,7 @@ public class OvsdbConnectionManager implements OvsdbConnectionListener, AutoClos
         if (client != null) {
             putInstanceIdentifier(ovsdbNode.getConnectionInfo(), iid.firstIdentifierOf(Node.class));
             OvsdbConnectionInstance ovsdbConnectionInstance = connectedButCallBacksNotRegistered(client);
+            ovsdbConnectionInstance.setOvsdbNodeAugmentation(ovsdbNode);
 
             // Register Cluster Ownership for ConnectionInfo
             registerEntityForOwnership(ovsdbConnectionInstance);