Few more changes pending on the Transaction side.
Once the Update/Notification callback processing from Ashwin is done,
we will have a good base to start integrating with the plugin code.
Signed-off-by: Madhu Venugopal <mavenugo@gmail.com>
eclipse.preferences.version=1\r
encoding//src/main/java=UTF-8\r
encoding//src/test/java=UTF-8\r
+encoding//src/test/resources=UTF-8\r
encoding/<project>=UTF-8\r
return "TableUpdate [map=" + map + "]";
}
- static class Row<T> {
+ public static class Row<T> {
@JsonIgnore
String id;
return lists;
}
+ public void addOperations (List<Operation> o) {
+ requests.addAll(o);
+ }
+
public void addOperation (Operation o) {
requests.add(o);
}
import java.util.Hashtable;
import org.apache.felix.dm.Component;
-
import org.opendaylight.controller.sal.networkconfig.bridgedomain.IPluginInBridgeDomainConfigService;
import org.opendaylight.controller.sal.connection.IPluginInConnectionService;
import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase;
import org.opendaylight.controller.sal.core.Node;
import org.opendaylight.controller.sal.core.NodeConnector;
import org.opendaylight.controller.sal.flowprogrammer.IPluginInFlowProgrammerService;
+import org.opendaylight.controller.sal.inventory.IPluginInInventoryService;
import org.opendaylight.controller.sal.utils.GlobalConstants;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
NodeConnector.NodeConnectorIDType.unRegisterIDType("OVS");
}
public Object[] getGlobalImplementations() {
- Object[] res = { ConnectionService.class, ConfigurationService.class, NodeFactory.class, NodeConnectorFactory.class };
+ Object[] res = { ConnectionService.class, ConfigurationService.class, NodeFactory.class, NodeConnectorFactory.class, InventoryService.class };
return res;
}
.setService(IConnectionServiceInternal.class)
.setCallbacks("setConnectionServiceInternal", "unsetConnectionServiceInternal")
.setRequired(true));
+ c.add(createServiceDependency()
+ .setService(InventoryServiceInternal.class)
+ .setCallbacks("setInventoryServiceInternal", "unsetInventoryServiceInternal")
+ .setRequired(true));
}
if (imp.equals(ConnectionService.class)) {
c.setInterface(
new String[] {IPluginInConnectionService.class.getName(),
IConnectionServiceInternal.class.getName()}, props);
+ c.add(createServiceDependency()
+ .setService(InventoryServiceInternal.class)
+ .setCallbacks("setInventoryServiceInternal", "unsetInventoryServiceInternal")
+ .setRequired(true));
+ }
+
+ if (imp.equals(InventoryService.class)) {
+ Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props.put(GlobalConstants.PROTOCOLPLUGINTYPE.toString(), "OVS");
+ c.setInterface(
+ new String[] {IPluginInInventoryService.class.getName(),
+ InventoryServiceInternal.class.getName()}, props);
}
if (imp.equals(NodeFactory.class)) {
.getLogger(ConfigurationService.class);
IConnectionServiceInternal connectionService;
+ InventoryServiceInternal inventoryServiceInternal;
boolean forceConnect = false;
void init() {
}
}
+ public void setInventoryServiceInternal(InventoryServiceInternal inventoryServiceInternal) {
+ this.inventoryServiceInternal = inventoryServiceInternal;
+ }
+
+ public void unsetInventoryServiceInternal(InventoryServiceInternal inventoryServiceInternal) {
+ if (this.inventoryServiceInternal == inventoryServiceInternal) {
+ this.inventoryServiceInternal = null;
+ }
+ }
+
private Connection getConnection (Node node) {
Connection connection = connectionService.getConnection(node);
if (connection == null || !connection.getChannel().isActive()) {
private static final Integer defaultOvsdbPort = 6632;
ConcurrentMap<String, Connection> ovsdbConnections;
List<ChannelHandler> handlers = null;
+ InventoryServiceInternal inventoryServiceInternal;
+
+ public void setInventoryServiceInternal(InventoryServiceInternal inventoryServiceInternal) {
+ this.inventoryServiceInternal = inventoryServiceInternal;
+ }
+
+ public void unsetInventoryServiceInternal(InventoryServiceInternal inventoryServiceInternal) {
+ if (this.inventoryServiceInternal == inventoryServiceInternal) {
+ this.inventoryServiceInternal = null;
+ }
+ }
public void init() {
ovsdbConnections = new ConcurrentHashMap<String, Connection>();
package org.opendaylight.ovsdb.plugin;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Dictionary;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
+import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
-import org.apache.felix.dm.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
-import org.opendaylight.controller.sal.core.Actions;
-import org.opendaylight.controller.sal.core.Bandwidth;
-import org.opendaylight.controller.sal.core.Buffers;
-import org.opendaylight.controller.sal.core.Capabilities;
-import org.opendaylight.controller.sal.core.Capabilities.CapabilitiesType;
-import org.opendaylight.controller.sal.core.ConstructionException;
import org.opendaylight.controller.sal.core.Node;
import org.opendaylight.controller.sal.core.NodeConnector;
import org.opendaylight.controller.sal.core.Property;
-import org.opendaylight.controller.sal.core.State;
-import org.opendaylight.controller.sal.core.Tables;
-import org.opendaylight.controller.sal.core.TimeStamp;
import org.opendaylight.controller.sal.inventory.IPluginInInventoryService;
-import org.opendaylight.controller.sal.utils.NodeCreator;
-import org.opendaylight.controller.sal.utils.NodeConnectorCreator;
+import org.opendaylight.ovsdb.lib.message.TableUpdate;
+import org.opendaylight.ovsdb.lib.message.TableUpdate.Row;
+import org.opendaylight.ovsdb.lib.message.TableUpdates;
+import org.opendaylight.ovsdb.lib.table.internal.Table;
+
+import com.google.common.collect.Maps;
/**
* Stub Implementation for IPluginInReadService used by SAL
private ConcurrentMap<Node, Map<String, Property>> nodeProps;
private ConcurrentMap<NodeConnector, Map<String, Property>> nodeConnectorProps;
+ private Map<Node, NodeDB<Table<?>>> dbCache = Maps.newHashMap();
/**
* Function called by the dependency manager when all the required
void init() {
nodeProps = new ConcurrentHashMap<Node, Map<String, Property>>();
nodeConnectorProps = new ConcurrentHashMap<NodeConnector, Map<String, Property>>();
+ dbCache = new ConcurrentHashMap<Node, NodeDB<Table<?>>>();
Node.NodeIDType.registerIDType("OVS", String.class);
NodeConnector.NodeConnectorIDType.registerIDType("OVS", String.class, "OVS");
}
-
/**
* Function called by the dependency manager when at least one dependency
* become unsatisfied or when the component is shutting down because for
return nodeConnectorProps;
}
+
+ @Override
+ public Map<String, Map<String, Table<?>>> getCache(Node n) {
+ NodeDB<Table<?>> db = dbCache.get(n);
+ if (db == null) return null;
+ return db.getTableCache();
+ }
+
+
+ @Override
+ public Map<String, Table<?>> getTableCache(Node n, String tableName) {
+ NodeDB<Table<?>> db = dbCache.get(n);
+ if (db == null) return null;
+ return db.getTableCache(tableName);
+ }
+
+
+ @Override
+ public Table<?> getRow(Node n, String tableName, String uuid) {
+ NodeDB<Table<?>> db = dbCache.get(n);
+ if (db == null) return null;
+ return db.getRow(tableName, uuid);
+ }
+
+
+ @Override
+ public void updateRow(Node n, String tableName, String uuid, Table<?> row) {
+ NodeDB<Table<?>> db = dbCache.get(n);
+ if (db == null) {
+ db = new NodeDB<Table<?>>();
+ dbCache.put(n, db);
+ }
+ db.updateRow(tableName, uuid, row);
+ }
+
+ @Override
+ public void removeRow(Node n, String tableName, String uuid) {
+ NodeDB<Table<?>> db = dbCache.get(n);
+ if (db != null) db.removeRow(tableName, uuid);
+ }
+
+ @Override
+ public void processTableUpdates(Node n, TableUpdates tableUpdates) {
+ NodeDB<Table<?>> db = dbCache.get(n);
+ if (db == null) {
+ db = new NodeDB<Table<?>>();
+ dbCache.put(n, db);
+ }
+
+ Set<Table.Name> available = tableUpdates.availableUpdates();
+ for (Table.Name name : available) {
+ System.out.println(name.getName() +":"+ tableUpdates.getUpdate(name).toString());
+ TableUpdate tableUpdate = tableUpdates.getUpdate(name);
+ Collection<TableUpdate.Row<?>> rows = tableUpdate.getRows();
+ for (Row<?> row : rows) {
+ String uuid = row.getId();
+ Table<?> newRow = (Table<?>)row.getNew();
+ Table<?> oldRow = (Table<?>)row.getOld();
+ if (newRow != null) {
+ db.updateRow(name.getName(), uuid, newRow);
+ } else if (oldRow != null) {
+ db.removeRow(name.getName(), uuid);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void printCache(Node n) {
+ NodeDB<Table<?>> db = dbCache.get(n);
+ if (db != null) db.printTableCache();
+ }
}
package org.opendaylight.ovsdb.plugin;
-public interface InventoryServiceInternal {
+import java.util.Map;
+
+import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.ovsdb.lib.message.TableUpdates;
+import org.opendaylight.ovsdb.lib.table.internal.Table;
+public interface InventoryServiceInternal {
+ public Map<String, Map<String, Table<?>>> getCache(Node n);
+ public Map<String, Table<?>> getTableCache(Node n, String tableName);
+ public Table<?> getRow (Node n, String tableName, String uuid);
+ public void updateRow(Node n, String tableName, String uuid, Table<?> row);
+ public void removeRow(Node n, String tableName, String uuid);
+ public void processTableUpdates(Node n, TableUpdates tableUpdates);
+ public void printCache(Node n);
}
--- /dev/null
+package org.opendaylight.ovsdb.plugin;
+
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+import org.opendaylight.ovsdb.lib.table.internal.Table;
+
+public class NodeDB <T extends Table<?>>{
+ Map<String, Map<String, T>> cache = Maps.newHashMap();
+
+ public Map<String, Map<String, T>> getTableCache() {
+ return cache;
+ }
+
+ public Map<String, T> getTableCache(String tableName) {
+ return cache.get(tableName);
+ }
+
+ private void setTableCache(String tableName, Map<String, T> tableCache) {
+ cache.put(tableName, tableCache);
+ }
+
+ public T getRow (String tableName, String uuid) {
+ Map<String, T> tableCache = getTableCache(tableName);
+ if (tableCache != null) {
+ return tableCache.get(uuid);
+ }
+ return null;
+ }
+
+ public void updateRow(String tableName, String uuid, T row) {
+ Map<String, T> tableCache = getTableCache(tableName);
+ if (tableCache == null) {
+ tableCache = Maps.newHashMap();
+ setTableCache(tableName, tableCache);
+ }
+ tableCache.put(uuid, row);
+ }
+
+ public void removeRow(String tableName, String uuid) {
+ Map<String, T> tableCache = getTableCache(tableName);
+ if (tableCache != null) {
+ tableCache.remove(uuid);
+ }
+ }
+
+ public void printTableCache() {
+ System.out.println(cache.toString());
+ }
+}
package org.opendaylight.ovsdb.lib.message;
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Lists;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.util.CharsetUtil;
-import junit.framework.TestCase;
import org.junit.Test;
import org.opendaylight.controller.sal.connection.ConnectionConstants;
import org.opendaylight.ovsdb.lib.jsonrpc.JsonRpcDecoder;
import org.opendaylight.ovsdb.lib.jsonrpc.JsonRpcEndpoint;
import org.opendaylight.ovsdb.lib.jsonrpc.JsonRpcServiceBinderHandler;
-import org.opendaylight.ovsdb.lib.message.EchoResponse;
import org.opendaylight.ovsdb.lib.message.MonitorRequestBuilder;
import org.opendaylight.ovsdb.lib.message.OVSDB;
import org.opendaylight.ovsdb.lib.message.TableUpdates;
import org.opendaylight.ovsdb.lib.message.operations.InsertOperation;
+import org.opendaylight.ovsdb.lib.message.operations.MutateOperation;
+import org.opendaylight.ovsdb.lib.message.operations.Operation;
+import org.opendaylight.ovsdb.lib.notation.Condition;
+import org.opendaylight.ovsdb.lib.notation.Function;
+import org.opendaylight.ovsdb.lib.notation.Mutation;
+import org.opendaylight.ovsdb.lib.notation.Mutator;
+import org.opendaylight.ovsdb.lib.table.Bridge;
+import org.opendaylight.ovsdb.lib.table.Interface;
import org.opendaylight.ovsdb.lib.table.Open_vSwitch;
+import org.opendaylight.ovsdb.lib.table.Port;
import org.opendaylight.ovsdb.lib.table.internal.Table;
import org.opendaylight.ovsdb.lib.table.internal.Tables;
import org.opendaylight.ovsdb.plugin.ConnectionService;
-import org.opendaylight.ovsdb.plugin.InsertRequest;
-import org.opendaylight.ovsdb.plugin.MessageHandler;
-import org.opendaylight.ovsdb.plugin.MutateRequest;
+import org.opendaylight.ovsdb.plugin.InventoryService;
+import org.opendaylight.ovsdb.plugin.InventoryServiceInternal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-
public class OVSDBNettyFactoryTest {
public void testSome() throws InterruptedException, ExecutionException {
ConnectionService service = new ConnectionService();
+ InventoryServiceInternal inventoryService = new InventoryService();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JsonRpcEndpoint factory = new JsonRpcEndpoint(objectMapper, service);
OVSDB ovsdb = factory.getClient(node, OVSDB.class);
//GET DB-SCHEMA
- List<String> dbNames = Arrays.asList("Open_vSwitch");
+ List<String> dbNames = Arrays.asList(Open_vSwitch.NAME.getName());
ListenableFuture<DatabaseSchema> dbSchemaF = ovsdb.get_schema(dbNames);
DatabaseSchema databaseSchema = dbSchemaF.get();
System.out.println(databaseSchema);
//TEST MONITOR
MonitorRequestBuilder monitorReq = new MonitorRequestBuilder();
- for (Table table : Tables.getTables()) {
+ for (Table<?> table : Tables.getTables()) {
monitorReq.monitor(table);
}
ListenableFuture<TableUpdates> monResponse = ovsdb.monitor(monitorReq);
System.out.println("Monitor Request sent :");
TableUpdates updates = monResponse.get();
-
- Set<Table.Name> available = updates.availableUpdates();
- for (Table.Name name : available) {
- System.out.println(name.getName() +":"+ updates.getUpdate(name).toString());
- }
-
+ inventoryService.processTableUpdates(node, updates);
+ inventoryService.printCache(node);
// TRANSACT INSERT TEST
- /*
- Map<String, Object> vswitchRow = new HashMap<String, Object>();
- Map<String, Object> bridgeRow = new HashMap<String, Object>();
- bridgeRow.put("name", "br2");
- TransactBuilder transaction = new TransactBuilder();
- InsertOperation addBridge = new InsertOperation("Bridge", "br2", bridgeRow);
+ Map<String, Table<?>> ovsTable = inventoryService.getTableCache(node, Open_vSwitch.NAME.getName());
+ String newBridge = "new_bridge";
+ String newInterface = "new_interface";
+ String newPort = "new_port";
+ String newSwitch = "new_switch";
- transaction.addOperation(addBridge);
+ String bridgeIdentifier = "br6";
+ Operation addSwitchRequest = null;
- ListenableFuture<List<Object>> transResponse = ovsdb.transact(transaction);
- System.out.println("Transcation sent :");
- Object tr = transResponse.get();
- System.out.println(tr.toString());
- */
+ if(ovsTable != null){
+ String ovsTableUUID = (String) ovsTable.keySet().toArray()[0];
+ List<String> bridgeUuidPair = new ArrayList<String>();
+ bridgeUuidPair.add("named-uuid");
+ bridgeUuidPair.add(newBridge);
- // TRANSACT MUTATE TEST
- /*
- List<String> bridgeUuidPair = new ArrayList<String>();
- bridgeUuidPair.add("named-uuid");
- bridgeUuidPair.add(newBridge);
+ Mutation bm = new Mutation("bridges", Mutator.INSERT, bridgeUuidPair);
+ List<Mutation> mutations = new ArrayList<Mutation>();
+ mutations.add(bm);
- List<Object> mutation = new ArrayList<Object>();
- mutation.add("bridges");
- mutation.add("insert");
- mutation.add(bridgeUuidPair);
+ List<String> uuid = new ArrayList<String>();
+ uuid.add("uuid");
+ uuid.add(ovsTableUUID);
- List<Object> mutations = new ArrayList<Object>();
- mutations.add(mutation);
+ //UUID uuid = new UUID(ovsTableUUID);
+ Condition condition = new Condition("_uuid", Function.EQUALS, uuid);
- List<String> ovsUuidPair = new ArrayList<String>();
- ovsUuidPair.add("uuid");
- ovsUuidPair.add(instance.getUuid());
+ List<Condition> where = new ArrayList<Condition>();
+ where.add(condition);
- List<Object> whereInner = new ArrayList<Object>();
- whereInner.add("_uuid");
- whereInner.add("==");
- whereInner.add(ovsUuidPair);
+ addSwitchRequest = new MutateOperation(Open_vSwitch.NAME.getName(), where, mutations);
+ }
+ else{
+ Map<String, Object> vswitchRow = new HashMap<String, Object>();
+ ArrayList<String> bridges = new ArrayList<String>();
+ bridges.add("named-uuid");
+ bridges.add(newBridge);
+ vswitchRow.put("bridges", bridges);
+ addSwitchRequest = new InsertOperation(Open_vSwitch.NAME.getName(), newSwitch, vswitchRow);
+ }
- List<Object> where = new ArrayList<Object>();
- where.add(whereInner);
+ Map<String, Object> bridgeRow = new HashMap<String, Object>();
+ bridgeRow.put("name", bridgeIdentifier);
+ ArrayList<String> ports = new ArrayList<String>();
+ ports.add("named-uuid");
+ ports.add(newPort);
+ bridgeRow.put("ports", ports);
+ InsertOperation addBridgeRequest = new InsertOperation(Bridge.NAME.getName(), newBridge, bridgeRow);
+
+ Map<String, Object> portRow = new HashMap<String, Object>();
+ portRow.put("name", bridgeIdentifier);
+ ArrayList<String> interfaces = new ArrayList<String>();
+ interfaces.add("named-uuid");
+ interfaces.add(newInterface);
+ portRow.put("interfaces", interfaces);
+ InsertOperation addPortRequest = new InsertOperation(Port.NAME.getName(), newPort, portRow);
+
+ Map<String, Object> interfaceRow = new HashMap<String, Object>();
+ interfaceRow.put("name", bridgeIdentifier);
+ interfaceRow.put("type", "internal");
+ InsertOperation addIntfRequest = new InsertOperation(Interface.NAME.getName(), newInterface, interfaceRow);
+
+ TransactBuilder transaction = new TransactBuilder();
+ transaction.addOperations(new ArrayList<Operation>(
+ Arrays.asList(addSwitchRequest, addIntfRequest, addPortRequest, addBridgeRequest)));
- addSwitchRequest = new MutateRequest("Open_vSwitch", where, mutations);
- */
+ ListenableFuture<List<Object>> transResponse = ovsdb.transact(transaction);
+ System.out.println("Transcation sent :");
+ Object tr = transResponse.get();
+ System.out.println(tr.toString());
// TEST ECHO
+
ListenableFuture<List<String>> some = ovsdb.echo();
Object s = some.get();
System.out.printf("Result of echo is %s \n", s);