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>
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,
--- /dev/null
+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
--- /dev/null
+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;
+ }
+}
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;
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);
}
/**
--- /dev/null
+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;
+ }
+}
@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);
+ }
}
--- /dev/null
+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;
+ }
+}
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>