From 3eef46f8a9986d58acb2c649fc7de6dfde207936 Mon Sep 17 00:00:00 2001 From: Salvatore Orlando Date: Wed, 14 Mar 2012 12:44:45 +0000 Subject: [PATCH] Open vSwitch tunnel manager Applying patch with new ovs-tunnel-manager on top of cloudstack oss-master --- .../network/ovs/OvsCreateTunnelCommand.java | 1 + .../xen/resource/CitrixResourceBase.java | 165 +----------------- scripts/vm/hypervisor/xenserver/ovstunnel | 0 3 files changed, 2 insertions(+), 164 deletions(-) mode change 100644 => 100755 scripts/vm/hypervisor/xenserver/ovstunnel diff --git a/api/src/com/cloud/network/ovs/OvsCreateTunnelCommand.java b/api/src/com/cloud/network/ovs/OvsCreateTunnelCommand.java index df16618f21e..c05cb9d5edd 100644 --- a/api/src/com/cloud/network/ovs/OvsCreateTunnelCommand.java +++ b/api/src/com/cloud/network/ovs/OvsCreateTunnelCommand.java @@ -30,6 +30,7 @@ public class OvsCreateTunnelCommand extends Command { } public OvsCreateTunnelCommand(String remoteIp, Integer key, Long from, Long to, long networkId, String fromIp) { + this.remoteIp = remoteIp; this.key = key; this.from = from; diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index e5af2c4a076..10bf81254c8 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -492,169 +492,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe return execute((OvsCreateTunnelCommand)cmd); } else if (clazz == OvsSetupBridgeCommand.class) { return execute((OvsSetupBridgeCommand)cmd); - } else if (clazz == OvsDestroyBridgeCommand.class) { - return execute((OvsDestroyBridgeCommand)cmd); - } else if (clazz == OvsDestroyTunnelCommand.class) { - return execute((OvsDestroyTunnelCommand)cmd); - } else if (clazz == UpdateHostPasswordCommand.class) { - return execute((UpdateHostPasswordCommand)cmd); - } else if (cmd instanceof CheckRouterCommand) { - return execute((CheckRouterCommand)cmd); - } else if (cmd instanceof SetFirewallRulesCommand) { - return execute((SetFirewallRulesCommand)cmd); - } else if (cmd instanceof BumpUpPriorityCommand) { - return execute((BumpUpPriorityCommand)cmd); - } else if (cmd instanceof ClusterSyncCommand) { - return execute((ClusterSyncCommand)cmd); - } else if (cmd instanceof GetDomRVersionCmd) { - return execute((GetDomRVersionCmd)cmd); - } else if (clazz == CheckNetworkCommand.class) { - return execute((CheckNetworkCommand) cmd); - } else { - return Answer.createUnsupportedCommandAnswer(cmd); - } - } - - - protected XsLocalNetwork getNativeNetworkForTraffic(Connection conn, TrafficType type, String name) throws XenAPIException, XmlRpcException { - if (name != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Looking for network named " + name); - } - return getNetworkByName(conn, name); - } - - if (type == TrafficType.Guest) { - return new XsLocalNetwork(Network.getByUuid(conn, _host.guestNetwork), null, PIF.getByUuid(conn, _host.guestPif), null); - } else if (type == TrafficType.Control) { - setupLinkLocalNetwork(conn); - return new XsLocalNetwork(Network.getByUuid(conn, _host.linkLocalNetwork)); - } else if (type == TrafficType.Management) { - return new XsLocalNetwork(Network.getByUuid(conn, _host.privateNetwork), null, PIF.getByUuid(conn, _host.privatePif), null); - } else if (type == TrafficType.Public) { - return new XsLocalNetwork(Network.getByUuid(conn, _host.publicNetwork), null, PIF.getByUuid(conn, _host.publicPif), null); - } else if (type == TrafficType.Storage) { - return new XsLocalNetwork(Network.getByUuid(conn, _host.storageNetwork1), null, PIF.getByUuid(conn, _host.storagePif1), null); - } - - throw new CloudRuntimeException("Unsupported network type: " + type); - } - - /** - * This is a tricky to create network in xenserver. - * if you create a network then create bridge by brctl or openvswitch yourself, - * then you will get an expection that is "REQUIRED_NETWROK" when you start a - * vm with this network. The soultion is, create a vif of dom0 and plug it in - * network, xenserver will create the bridge on behalf of you - * @throws XmlRpcException - * @throws XenAPIException - */ - private void enableXenServerNetwork(Connection conn, Network nw, - String vifNameLabel, String networkDesc) throws XenAPIException, XmlRpcException { - /* Make sure there is a physical bridge on this network */ - VIF dom0vif = null; - Pair vm = getControlDomain(conn); - VM dom0 = vm.first(); - // Create a VIF unless there's not already another VIF - Set dom0Vifs = dom0.getVIFs(conn); - for (VIF vif:dom0Vifs) { - vif.getRecord(conn); - if (vif.getNetwork(conn).getUuid(conn) == nw.getUuid(conn)) { - dom0vif = vif; - s_logger.debug("### A dom0 VIF has already been found - No need to create one"); - } - } - if (dom0vif == null) { - s_logger.debug("Create a vif on dom0 for " + networkDesc); - VIF.Record vifr = new VIF.Record(); - vifr.VM = dom0; - vifr.device = getLowestAvailableVIFDeviceNum(conn, dom0); - if (vifr.device == null) { - s_logger.debug("Failed to create " + networkDesc + ", no vif available"); - return; - } - Map config = new HashMap(); - config.put("nameLabel", vifNameLabel); - vifr.otherConfig = config; - vifr.MAC = "FE:FF:FF:FF:FF:FF"; - vifr.network = nw; - - dom0vif = VIF.create(conn, vifr); - } - // At this stage we surely have a VIF - dom0vif.plug(conn); - dom0vif.unplug(conn); - synchronized(_tmpDom0Vif) { - _tmpDom0Vif.add(dom0vif); - } - - } - - private synchronized Network setupvSwitchNetwork(Connection conn) { - try { - if (_host.vswitchNetwork == null) { - Network vswitchNw = null; - Network.Record rec = new Network.Record(); - String nwName = Networks.BroadcastScheme.VSwitch.toString(); - Set networks = Network.getByNameLabel(conn, nwName); - - if (networks.size() == 0) { - rec.nameDescription = "vswitch network for " + nwName; - rec.nameLabel = nwName; - vswitchNw = Network.create(conn, rec); - } else { - vswitchNw = networks.iterator().next(); - } - - enableXenServerNetwork(conn, vswitchNw, "vswitch", "vswicth network"); - _host.vswitchNetwork = vswitchNw; - } - return _host.vswitchNetwork; - } catch (Exception e) { - e.printStackTrace(); - } - - return null; - } - - /** - * This method just creates a XenServer network following the tunnel network naming convention - */ - private synchronized Network findOrCreateTunnelNetwork(Connection conn, long vnetId) { - try { - String nwName = "OVSTunnel" + vnetId; - Network nw = null; - Network.Record rec = new Network.Record(); - Set networks = Network.getByNameLabel(conn, nwName); - - if (networks.size() == 0) { - rec.nameDescription = "tunnel network id# " + vnetId; - rec.nameLabel = nwName; - //Initialize the ovs-host-setup to avoid error when doing get-param in plugin - Map otherConfig = new HashMap(); - otherConfig.put("ovs-host-setup", ""); - rec.otherConfig = otherConfig; - nw = Network.create(conn, rec); - s_logger.debug("### Xen Server network for tunnels created:" + nwName); - } else { - nw = networks.iterator().next(); - s_logger.debug("### Xen Server network for tunnels found:" + nwName); - } - return nw; - } catch (Exception e) { - s_logger.warn("createTunnelNetwork failed", e); - return null; - } - } - - /** - * This method creates a XenServer network and configures it for being used as a L2-in-L3 tunneled network - */ - private synchronized Network configureTunnelNetwork(Connection conn, long networkId, long hostId, int key) { - try { - // Note: the vnet (or gre key) is used to identify the XS network - Network nw = findOrCreateTunnelNetwork(conn, key); - String nwName = "OVSTunnel" + key; //Invoke plugin to setup the bridge which will be used by this network String bridge = nw.getBridge(conn); Map nwOtherConfig = nw.getOtherConfig(conn); @@ -4811,7 +4648,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe Connection conn = getConnection(); s_logger.debug("### About to destroy tunnel network"); try { - Network nw = findOrCreateTunnelNetwork(conn, cmd.getKey()); + Network nw = findTunnelNetwork(conn, cmd.getNetworkId()); if (nw == null) { s_logger.warn("### Unable to find tunnel network"); return new Answer(cmd, false, "No network found"); diff --git a/scripts/vm/hypervisor/xenserver/ovstunnel b/scripts/vm/hypervisor/xenserver/ovstunnel old mode 100644 new mode 100755