Skeleton code for the NetworkManagers : Provider, Internal and Tenant. 26/3026/2
authorMadhu Venugopal <mavenugo@gmail.com>
Fri, 22 Nov 2013 21:01:27 +0000 (13:01 -0800)
committerGerrit Code Review <gerrit@opendaylight.org>
Sun, 24 Nov 2013 19:20:07 +0000 (19:20 +0000)
Also added a ConfigManager for the Tunnel-End point configuration that is currently proposed to be configured as :
ovs-vsctl set Open_vSwitch <uuid> other_config={"local-ip"="192.168.56.101"}.

Change-Id: I7b14fed5fdc5a1c4f6714faf41679c2f1cb9d0f5
Signed-off-by: Madhu Venugopal <mavenugo@gmail.com>
neutron/pom.xml
neutron/src/main/java/org/opendaylight/ovsdb/neutron/AdminConfigManager.java [new file with mode: 0644]
neutron/src/main/java/org/opendaylight/ovsdb/neutron/InternalNetworkManager.java [new file with mode: 0644]
neutron/src/main/java/org/opendaylight/ovsdb/neutron/NetworkHandler.java
neutron/src/main/java/org/opendaylight/ovsdb/neutron/ProviderNetworkManager.java [new file with mode: 0644]
neutron/src/main/java/org/opendaylight/ovsdb/neutron/SouthboundHandler.java
neutron/src/main/java/org/opendaylight/ovsdb/neutron/TenantNetworkManager.java [new file with mode: 0644]
ovsdb/pom.xml

index 07120106f1c3252946f61f00183d389c5e202304..41ae17d300811804745e681238d1a5cb112078d2 100644 (file)
@@ -34,6 +34,8 @@
               org.opendaylight.controller.sal.core,
               org.opendaylight.controller.sal.utils,
               org.opendaylight.ovsdb.plugin,
+              org.opendaylight.ovsdb.lib.notation,
+              org.opendaylight.ovsdb.lib.table,
               org.opendaylight.ovsdb.lib.table.internal,
               org.apache.felix.dm,
               org.slf4j,
diff --git a/neutron/src/main/java/org/opendaylight/ovsdb/neutron/AdminConfigManager.java b/neutron/src/main/java/org/opendaylight/ovsdb/neutron/AdminConfigManager.java
new file mode 100644 (file)
index 0000000..078824d
--- /dev/null
@@ -0,0 +1,109 @@
+package org.opendaylight.ovsdb.neutron;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.ovsdb.lib.table.Open_vSwitch;
+import org.opendaylight.ovsdb.lib.table.internal.Table;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AdminConfigManager {
+    static final Logger logger = LoggerFactory.getLogger(AdminConfigManager.class);
+
+    private String integrationBridgeName;
+    private String tunnelBridgeName;
+    private String externalBridgeName;
+    private String tunnelEndpointConfigName;
+    private Map<Node, InetAddress> tunnelEndpoints;
+
+    // Refer to /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini
+    private static String DEFAULT_TUNNEL_ENDPOINT_CONFIG_STRING = "local_ip";
+    private static String DEFAULT_INTEGRATION_BRIDGENAME = "br-int";
+    private static String DEFAULT_TUNNEL_BRIDGENAME = "br-tun";
+    private static String DEFAULT_EXTERNAL_BRIDGENAME = "br-ex";
+    private static String CONFIG_TUNNEL_ENDPOINT_CONFIG = "tunnel_endpoint_config_string";
+    private static String CONFIG_INTEGRATION_BRIDGENAME = "integration_bridge";
+    private static String CONFIG_TUNNEL_BRIDGENAME = "tunnel_bridge";
+    private static String CONFIG_EXTERNAL_BRIDGENAME = "external_bridge";
+
+    private static AdminConfigManager adminConfiguration = new AdminConfigManager();
+
+    private AdminConfigManager() {
+        tunnelEndpoints = new HashMap<Node, InetAddress>();
+        tunnelEndpointConfigName = System.getProperty(CONFIG_TUNNEL_ENDPOINT_CONFIG);
+        integrationBridgeName = System.getProperty(CONFIG_INTEGRATION_BRIDGENAME);
+        tunnelBridgeName = System.getProperty(CONFIG_TUNNEL_BRIDGENAME);
+        externalBridgeName = System.getProperty(CONFIG_EXTERNAL_BRIDGENAME);
+
+        if (tunnelEndpointConfigName == null) tunnelEndpointConfigName = DEFAULT_TUNNEL_ENDPOINT_CONFIG_STRING;
+        if (integrationBridgeName == null) integrationBridgeName = DEFAULT_INTEGRATION_BRIDGENAME;
+        if (tunnelBridgeName == null) tunnelBridgeName = DEFAULT_TUNNEL_BRIDGENAME;
+        if (externalBridgeName == null) externalBridgeName = DEFAULT_EXTERNAL_BRIDGENAME;
+    }
+
+    public static AdminConfigManager getManager() {
+        return adminConfiguration;
+    }
+
+    public String getIntegrationBridgeName() {
+        return integrationBridgeName;
+    }
+
+    public void setIntegrationBridgeName(String integrationBridgeName) {
+        this.integrationBridgeName = integrationBridgeName;
+    }
+
+    public String getTunnelBridgeName() {
+        return tunnelBridgeName;
+    }
+
+    public void setTunnelBridgeName(String tunnelBridgeName) {
+        this.tunnelBridgeName = tunnelBridgeName;
+    }
+
+    public String getExternalBridgeName() {
+        return externalBridgeName;
+    }
+
+    public void setExternalBridgeName (String externalBridgeName) {
+        this.externalBridgeName = externalBridgeName;
+    }
+
+    public InetAddress getTunnelEndPoint(Node node) {
+        return tunnelEndpoints.get(node);
+    }
+
+    public void addTunnelEndpoint (Node node, InetAddress address) {
+        tunnelEndpoints.put(node, address);
+    }
+
+    public String getTunnelEndpointConfigTable() {
+        return "Open_vSwitch";
+    }
+
+    public void populateTunnelEndpoint (Node node, String tableName, Table<?> row) {
+        try {
+            if (tableName.equalsIgnoreCase(getTunnelEndpointConfigTable())) {
+                Map<String, String> configs = ((Open_vSwitch) row).getOther_config();
+                if (configs != null) {
+                    String tunnelEndpoint = configs.get(tunnelEndpointConfigName);
+                    if (tunnelEndpoint != null) {
+                        try {
+                            InetAddress address = InetAddress.getByName(tunnelEndpoint);
+                            addTunnelEndpoint(node, address);
+                            logger.debug("Tunnel Endpoint for Node {} {}", node, address.getHostAddress());
+                        } catch (UnknownHostException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            logger.error("Error populating Tunnel Endpoint for Node {} ", node, e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/neutron/src/main/java/org/opendaylight/ovsdb/neutron/InternalNetworkManager.java b/neutron/src/main/java/org/opendaylight/ovsdb/neutron/InternalNetworkManager.java
new file mode 100644 (file)
index 0000000..798600e
--- /dev/null
@@ -0,0 +1,16 @@
+package org.opendaylight.ovsdb.neutron;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class InternalNetworkManager {
+    static final Logger logger = LoggerFactory.getLogger(InternalNetworkManager.class);
+
+    private static InternalNetworkManager internalNetwork = new InternalNetworkManager();
+    private InternalNetworkManager() {
+    }
+
+    public static InternalNetworkManager getManager() {
+        return internalNetwork;
+    }
+}
index efd939775cb5bd2048386b9b6fa918b2282fb43b..1a9c656a3a464a3e549ca065ff80883f9cf6ff83 100644 (file)
@@ -6,7 +6,6 @@ import java.util.List;
 import org.opendaylight.controller.containermanager.ContainerConfig;
 import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkAware;
 import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork;
-import org.opendaylight.controller.sal.utils.Status;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -59,14 +58,9 @@ public class NetworkHandler extends BaseHandler
             logger.debug("Network creation failed {} ", result);
             return;
         }
-
-        logger.debug("Neutron Network Creation : {}", network.toString());
-        String networkID = convertNeutronIDToKey(network.getID());
-
-        ContainerConfig config = new ContainerConfig();
-        config.setContainer(networkID);
-        Status status = containerManager.addContainer(config);
-        logger.debug("Network Creation Status : {}", status.toString());
+        String networkId = convertNeutronIDToKey(network.getID());
+        result = TenantNetworkManager.getManager().networkCreated(networkId);
+        logger.debug("Neutron Network {} Created with Internal Vlan : {}", network.toString(), result);
     }
 
     /**
diff --git a/neutron/src/main/java/org/opendaylight/ovsdb/neutron/ProviderNetworkManager.java b/neutron/src/main/java/org/opendaylight/ovsdb/neutron/ProviderNetworkManager.java
new file mode 100644 (file)
index 0000000..760211d
--- /dev/null
@@ -0,0 +1,15 @@
+package org.opendaylight.ovsdb.neutron;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ProviderNetworkManager {
+    static final Logger logger = LoggerFactory.getLogger(ProviderNetworkManager.class);
+    private static ProviderNetworkManager provider = new ProviderNetworkManager();
+    private ProviderNetworkManager() {
+    }
+
+    public static ProviderNetworkManager getManager() {
+        return provider;
+    }
+}
index e7543f7646efe8f1e491a7da2447b68a4348ce85..a5574285f41a084a3a013c1e11b42d34877b8569 100644 (file)
@@ -21,6 +21,9 @@ public class SouthboundHandler extends BaseHandler implements OVSDBInventoryList
     @Override
     public void rowAdded(Node node, String tableName, Table<?> row) {
         logger.debug("ROW ADDED {} , {}", node, row);
+        if (AdminConfigManager.getManager().getTunnelEndpointConfigTable().equalsIgnoreCase(tableName)) {
+            AdminConfigManager.getManager().populateTunnelEndpoint(node, tableName, row);
+        }
 
     }
 
diff --git a/neutron/src/main/java/org/opendaylight/ovsdb/neutron/TenantNetworkManager.java b/neutron/src/main/java/org/opendaylight/ovsdb/neutron/TenantNetworkManager.java
new file mode 100644 (file)
index 0000000..92ac2b7
--- /dev/null
@@ -0,0 +1,71 @@
+package org.opendaylight.ovsdb.neutron;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+
+import org.opendaylight.controller.containermanager.ContainerConfig;
+import org.opendaylight.controller.containermanager.ContainerFlowConfig;
+import org.opendaylight.controller.containermanager.IContainerManager;
+import org.opendaylight.controller.sal.utils.ServiceHelper;
+import org.opendaylight.controller.sal.utils.Status;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TenantNetworkManager {
+    static final Logger logger = LoggerFactory.getLogger(TenantNetworkManager.class);
+
+    private static final int MAX_VLAN = 4096;
+    private static TenantNetworkManager tenantHelper = new TenantNetworkManager();
+    private Queue<Integer> internalVlans = new LinkedList<Integer>();
+    private Map<String, Integer> tenantVlanMap = new HashMap<String, Integer>();
+    private TenantNetworkManager() {
+        for (int i = 1; i < MAX_VLAN ; i++) {
+            internalVlans.add(i);
+        }
+    }
+
+    public static TenantNetworkManager getManager() {
+        return tenantHelper;
+    }
+
+    private int assignInternalVlan (String networkId) {
+        Integer mappedVlan = tenantVlanMap.get(networkId);
+        if (mappedVlan != null) return mappedVlan;
+        mappedVlan = internalVlans.poll();
+        if (mappedVlan != null) tenantVlanMap.put(networkId, mappedVlan);
+        return mappedVlan;
+    }
+
+    public void internalVlanInUse (int vlan) {
+        internalVlans.remove(vlan);
+    }
+
+    public int getInternalVlan (String networkId) {
+        return tenantVlanMap.get(networkId);
+    }
+
+    public int networkCreated (String networkId) {
+        int internalVlan = this.assignInternalVlan(networkId);
+        if (internalVlan != 0) {
+            ContainerConfig config = new ContainerConfig();
+            config.setContainer(networkId);
+            ContainerFlowConfig flowConfig = new ContainerFlowConfig("InternalVlan", internalVlan+"",
+                    null, null, null, null, null);
+            List<ContainerFlowConfig> containerFlowConfigs = new ArrayList<ContainerFlowConfig>();
+            containerFlowConfigs.add(flowConfig);
+            config.addContainerFlows(containerFlowConfigs);
+            IContainerManager containerManager = (IContainerManager)ServiceHelper.getGlobalInstance(IContainerManager.class, this);
+            if (containerManager != null) {
+                Status status = containerManager.addContainer(config);
+                logger.debug("Network Creation Status : {}", status.toString());
+            } else {
+                logger.error("ContainerManager is null. Failed to create Container for {}", networkId);
+            }
+        }
+        return internalVlan;
+    }
+}
index 0ce328da981de386c0791db2e2bfe312e66de016..02acec72c0316c07a4268b8500838b59c979121b 100755 (executable)
@@ -72,7 +72,7 @@
                             org.opendaylight.ovsdb.plugin.Activator
                         </Bundle-Activator>
                         <Export-Package>
-                            org.opendaylight.ovsdb.lib.table, org.opendaylight.ovsdb.lib.table.internal, org.opendaylight.ovsdb.plugin
+                            org.opendaylight.ovsdb.lib.table, org.opendaylight.ovsdb.lib.table.internal, org.opendaylight.ovsdb.plugin, org.opendaylight.ovsdb.lib.notation
                         </Export-Package>
                     </instructions>
                     <manifestLocation>${project.basedir}/META-INF</manifestLocation>