X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=southbound%2Fsouthbound-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fovsdb%2Fsouthbound%2FOvsdbConnectionInstance.java;h=d2565bb41d0a37fb28797e89d9dfe0ffba69a9a5;hb=316d5824042bcb4b86937979d1b7f24149925455;hp=757ebd02479ff643a628e744b7bd9735a6ee7e77;hpb=23d2611b2436695524d6b270f2189e3db471d246;p=ovsdb.git diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbConnectionInstance.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbConnectionInstance.java index 757ebd024..d2565bb41 100644 --- a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbConnectionInstance.java +++ b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbConnectionInstance.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2015, 2016 Cisco Systems, Inc. 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, @@ -7,12 +7,19 @@ */ 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; import org.opendaylight.ovsdb.lib.LockAquisitionCallback; import org.opendaylight.ovsdb.lib.LockStolenCallback; @@ -24,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; @@ -32,12 +41,22 @@ 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.transactions.md.OvsdbNodeCreateCommand; +import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactUtils; import org.opendaylight.ovsdb.southbound.transactions.md.TransactionInvoker; +import org.opendaylight.ovsdb.utils.yang.YangUtils; +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; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,15 +68,21 @@ public class OvsdbConnectionInstance implements OvsdbClient { private OvsdbClient client; private ConnectionInfo connectionInfo; private TransactionInvoker txInvoker; - private Map transactInvokers = new HashMap(); + private Map transactInvokers; private MonitorCallBack callback; - private ConnectionInfo key; + private InstanceIdentifier instanceIdentifier; + private volatile boolean hasDeviceOwnership = false; + private Entity connectedEntity; + private EntityOwnershipCandidateRegistration deviceOwnershipCandidateRegistration; + private OvsdbNodeAugmentation initialCreateData = null; - OvsdbConnectionInstance(ConnectionInfo key,OvsdbClient client,TransactionInvoker txInvoker) { + OvsdbConnectionInstance(ConnectionInfo key,OvsdbClient client,TransactionInvoker txInvoker, + InstanceIdentifier iid) { this.connectionInfo = key; this.client = client; this.txInvoker = txInvoker; - this.key = key; + // this.key = key; + this.instanceIdentifier = iid; } public void transact(TransactCommand command) { @@ -66,27 +91,41 @@ public class OvsdbConnectionInstance implements OvsdbClient { } } - public void init() { + public void registerCallbacks() { if ( this.callback == null) { - txInvoker.invoke(new OvsdbNodeCreateCommand(key, null,null)); - this.callback = new OvsdbMonitorCallback(connectionInfo,txInvoker); + if (this.initialCreateData != null ) { + this.updateConnectionAttributes(); + } + try { + String database = SouthboundConstants.OPEN_V_SWITCH; + DatabaseSchema dbSchema = getSchema(database).get(); + if (dbSchema != null) { + LOG.info("Monitoring database: {}", database); + callback = new OvsdbMonitorCallback(this, txInvoker); + monitorAllTables(database, dbSchema); + } else { + LOG.info("No database {} found on {}", database, connectionInfo); + } + } catch (InterruptedException | ExecutionException e) { + LOG.warn("Exception attempting to registerCallbacks {}: ", connectionInfo, e); + } + } + } + + public void createTransactInvokers() { + if (transactInvokers == null) { + try { + transactInvokers = new HashMap<>(); List databases = getDatabases().get(); - if (databases != null) { - for (String database : databases) { - DatabaseSchema dbSchema = getSchema(database).get(); - if (dbSchema != null) { - transactInvokers.put(dbSchema, new TransactInvokerImpl(this,dbSchema)); - monitorAllTables(database, dbSchema); - } else { - LOG.warn("No schema reported for database {} for key {}",database,connectionInfo); - } + for (String database : databases) { + DatabaseSchema dbSchema = getSchema(database).get(); + if (dbSchema != null) { + transactInvokers.put(dbSchema, new TransactInvokerImpl(this,dbSchema)); } - } else { - LOG.warn("No databases reported from {}",connectionInfo); } } catch (InterruptedException | ExecutionException e) { - LOG.warn("Exception attempting to initialize {}: {}",connectionInfo,e); + LOG.warn("Exception attempting to createTransactionInvokers {}", connectionInfo, e); } } } @@ -94,8 +133,9 @@ public class OvsdbConnectionInstance implements OvsdbClient { private void monitorAllTables(String database, DatabaseSchema dbSchema) { Set tables = dbSchema.getTables(); if (tables != null) { - List> monitorRequests = Lists.newArrayList(); + List monitorRequests = Lists.newArrayList(); for (String tableName : tables) { + LOG.info("Southbound monitoring table {} in {}", tableName, dbSchema.getName()); GenericTableSchema tableSchema = dbSchema.table(tableName, GenericTableSchema.class); Set columns = tableSchema.getColumns(); MonitorRequestBuilder monitorBuilder = MonitorRequestBuilder.builder(tableSchema); @@ -110,6 +150,78 @@ 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 entry: transactInvokers.entrySet()) { + + TransactionBuilder transaction = new TransactionBuilder(this, entry.getKey()); + + // OpenVSwitchPart + OpenVSwitch ovs = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), OpenVSwitch.class); + + List externalIds = this.initialCreateData.getOpenvswitchExternalIds(); + + stampInstanceIdentifier(transaction,this.instanceIdentifier.firstIdentifierOf(Node.class)); + + try { + ovs.setExternalIds( + YangUtils.convertYangKeyValueListToMap(externalIds, OpenvswitchExternalIds::getExternalIdKey, + OpenvswitchExternalIds::getExternalIdValue)); + Mutate 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", e); + } + + + + List otherConfigs = this.initialCreateData.getOpenvswitchOtherConfigs(); + if (otherConfigs != null) { + try { + ovs.setOtherConfig(YangUtils.convertYangKeyValueListToMap(otherConfigs, + OpenvswitchOtherConfigs::getOtherConfigKey, + OpenvswitchOtherConfigs::getOtherConfigValue)); + 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 iid) { + OpenVSwitch ovs = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), OpenVSwitch.class); + ovs.setExternalIds(Collections.emptyMap()); + TransactUtils.stampInstanceIdentifier(transaction, + iid, + ovs.getSchema(), + ovs.getExternalIdsColumn().getSchema()); + } + + private void invoke(TransactionBuilder txBuilder) { + ListenableFuture> result = txBuilder.execute(); + LOG.debug("invoke: tb: {}", txBuilder); + if (txBuilder.getOperations().size() > 0) { + try { + List 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> getDatabases() { return client.getDatabases(); } @@ -128,7 +240,7 @@ public class OvsdbConnectionInstance implements OvsdbClient { } public > TableUpdates monitor( - DatabaseSchema schema, List> monitorRequests, + DatabaseSchema schema, List monitorRequests, MonitorCallBack callback) { return client.monitor(schema, monitorRequests, callback); } @@ -195,4 +307,67 @@ public class OvsdbConnectionInstance implements OvsdbClient { public void setMDConnectionInfo(ConnectionInfo key) { this.connectionInfo = key; } + + public InstanceIdentifier getInstanceIdentifier() { + return instanceIdentifier; + } + + public NodeKey getNodeKey() { + return getInstanceIdentifier().firstKeyOf(Node.class, NodeKey.class); + } + + public NodeId getNodeId() { + return getNodeKey().getNodeId(); + } + + public void setInstanceIdentifier(InstanceIdentifier iid) { + this.instanceIdentifier = iid; + } + + @Override + public > TableUpdates monitor( + DatabaseSchema schema, List monitorRequests, + MonitorHandle monitorHandle, MonitorCallBack callback) { + return null; + } + + public Entity getConnectedEntity() { + return this.connectedEntity; + } + + public void setConnectedEntity(Entity entity ) { + this.connectedEntity = entity; + } + + public Boolean hasOvsdbClient(OvsdbClient otherClient) { + return client.equals(otherClient); + } + + public Boolean getHasDeviceOwnership() { + return hasDeviceOwnership; + } + + public void setHasDeviceOwnership(Boolean hasDeviceOwnership) { + if (hasDeviceOwnership != null) { + this.hasDeviceOwnership = hasDeviceOwnership; + } + } + + public void setDeviceOwnershipCandidateRegistration(@Nonnull EntityOwnershipCandidateRegistration registration) { + this.deviceOwnershipCandidateRegistration = registration; + } + + public void closeDeviceOwnershipCandidateRegistration() { + if (deviceOwnershipCandidateRegistration != null) { + this.deviceOwnershipCandidateRegistration.close(); + setHasDeviceOwnership(Boolean.FALSE); + } + } + + public OvsdbNodeAugmentation getOvsdbNodeAugmentation() { + return this.initialCreateData; + } + public void setOvsdbNodeAugmentation(OvsdbNodeAugmentation ovsdbNodeCreateData) { + this.initialCreateData = ovsdbNodeCreateData; + } }