You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by tu...@apache.org on 2013/12/09 17:52:44 UTC
[18/21] git commit: updated refs/heads/master to 267ff79
move cloudstack_pluginlib
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c7dab82d
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c7dab82d
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c7dab82d
Branch: refs/heads/master
Commit: c7dab82dc48b1e33683122ae6663a7bda7fb7ac7
Parents: 32c55e6
Author: tuna <ng...@gmail.com>
Authored: Wed Oct 30 16:32:19 2013 +0700
Committer: tuna <ng...@gmail.com>
Committed: Mon Dec 9 23:33:15 2013 +0700
----------------------------------------------------------------------
.../kvm/resource/LibvirtComputingResource.java | 29 +--
.../vm/hypervisor/kvm/cloudstack_pluginlib.py | 219 -------------------
scripts/vm/network/vnet/cloudstack_pluginlib.py | 219 +++++++++++++++++++
scripts/vm/network/vnet/ovstunnel.py | 81 +++++--
4 files changed, 290 insertions(+), 258 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c7dab82d/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index 9a680ac..cbe4de3 100755
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -1344,14 +1344,12 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
cmd.add("destroy_ovs_bridge");
cmd.add("--bridge", bridge);
String result = cmd.execute();
- String[] res = result.split(":");
- if (res.length != 2 || !res[0].equalsIgnoreCase("SUCCESS")) {
+ if (result != null) {
// TODO: Should make this error not fatal?
// Can Concurrent VM shutdown/migration/reboot events can cause
// this method
// to be executed on a bridge which has already been removed?
- throw new CloudRuntimeException("Unable to remove OVS bridge "
- + bridge + ":" + res);
+ throw new CloudRuntimeException("Unable to remove OVS bridge " + bridge);
}
return;
} catch (Exception e) {
@@ -1360,16 +1358,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
}
}
- private boolean networkExist(String nwName) {
- Script.runSimpleBashScript("ifconfig " + nwName);
- String result = Script.runSimpleBashScript("echo $?");
- return result.equals("0");
- }
-
private synchronized boolean findOrCreateTunnelNetwork(long key) {
try {
String nwName = "OVSTunnel" + key;
- if (networkExist(nwName)) {
+ if (checkNetwork(nwName)) {
return true;
}
// if not found, create a new one
@@ -1377,7 +1369,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
otherConfig.put("ovs-host-setup", "");
Script.runSimpleBashScript("ovs-vsctl -- --may-exist add-br "
+ nwName + " -- set bridge " + nwName
- + " other_config:ovs_host_setup=\" \"");
+ + " other_config:ovs_host_setup='-1'");
s_logger.debug("### KVM network for tunnels created:" + nwName);
} catch (Exception e) {
s_logger.warn("createTunnelNetwork failed", e);
@@ -1410,12 +1402,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
cmd.add("--cs_host_id", ((Long) hostId).toString());
cmd.add("--bridge", nwName);
String result = cmd.execute();
- String[] res = result.split(":");
- if (res.length != 2 || !res[0].equalsIgnoreCase("SUCCESS")) {
+ if (result != null) {
throw new CloudRuntimeException(
"Unable to pre-configure OVS bridge " + nwName
- + " for network ID:" + networkId + " - "
- + res);
+ + " for network ID:" + networkId);
}
}
} catch (Exception e) {
@@ -1445,9 +1435,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
command.add("--dst_host", cmd.getTo().toString());
String result = command.execute();
- String[] res = result.split(":");
- if (res.length == 2 && res[0].equalsIgnoreCase("SUCCESS")) {
- return new OvsCreateTunnelAnswer(cmd, true, result, res[1],
+ if (result != null) {
+ return new OvsCreateTunnelAnswer(cmd, true, result, null,
bridge);
} else {
return new OvsCreateTunnelAnswer(cmd, false, result, bridge);
@@ -1473,7 +1462,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
command.add("--bridge", bridge);
command.add("--iface_name", cmd.getInPortName());
String result = command.execute();
- if (result.equalsIgnoreCase("SUCCESS")) {
+ if (result == null) {
return new Answer(cmd, true, result);
} else {
return new Answer(cmd, false, result);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c7dab82d/scripts/vm/hypervisor/kvm/cloudstack_pluginlib.py
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/kvm/cloudstack_pluginlib.py b/scripts/vm/hypervisor/kvm/cloudstack_pluginlib.py
deleted file mode 100755
index f886aa3..0000000
--- a/scripts/vm/hypervisor/kvm/cloudstack_pluginlib.py
+++ /dev/null
@@ -1,219 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# cloudstack_pluginlib for openvswitch on KVM hypervisor
-
-import ConfigParser
-import logging
-import os
-import subprocess
-
-from time import localtime, asctime
-
-DEFAULT_LOG_FORMAT = "%(asctime)s %(levelname)8s [%(name)s] %(message)s"
-DEFAULT_LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
-DEFAULT_LOG_FILE = "/var/log/cloudstack_plugins.log"
-
-PLUGIN_CONFIG_PATH = "/usr/share/cloudstack-common/scripts/vm/hypervisor/xenserver/cloudstack_plugins.conf"
-OVSDB_PID_PATH = "/var/run/openvswitch/ovsdb-server.pid"
-OVSDB_DAEMON_PATH = "ovsdb-server"
-OVS_PID_PATH = "/var/run/openvswitch/ovs-vswitchd.pid"
-OVS_DAEMON_PATH = "ovs-vswitchd"
-VSCTL_PATH = "/usr/bin/ovs-vsctl"
-OFCTL_PATH = "/usr/bin/ovs-ofctl"
-
-class PluginError(Exception):
- """Base Exception class for all plugin errors."""
- def __init__(self, *args):
- Exception.__init__(self, *args)
-
-
-def setup_logging(log_file=None):
- debug = False
- verbose = False
- log_format = DEFAULT_LOG_FORMAT
- log_date_format = DEFAULT_LOG_DATE_FORMAT
- # try to read plugin configuration file
- if os.path.exists(PLUGIN_CONFIG_PATH):
- config = ConfigParser.ConfigParser()
- config.read(PLUGIN_CONFIG_PATH)
- try:
- options = config.options('LOGGING')
- if 'debug' in options:
- debug = config.getboolean('LOGGING', 'debug')
- if 'verbose' in options:
- verbose = config.getboolean('LOGGING', 'verbose')
- if 'format' in options:
- log_format = config.get('LOGGING', 'format')
- if 'date_format' in options:
- log_date_format = config.get('LOGGING', 'date_format')
- if 'file' in options:
- log_file_2 = config.get('LOGGING', 'file')
- except ValueError:
- # configuration file contained invalid attributes
- # ignore them
- pass
- except ConfigParser.NoSectionError:
- # Missing 'Logging' section in configuration file
- pass
-
- root_logger = logging.root
- if debug:
- root_logger.setLevel(logging.DEBUG)
- elif verbose:
- root_logger.setLevel(logging.INFO)
- else:
- root_logger.setLevel(logging.WARNING)
- formatter = logging.Formatter(log_format, log_date_format)
-
- log_filename = log_file or log_file_2 or DEFAULT_LOG_FILE
-
- logfile_handler = logging.FileHandler(log_filename)
- logfile_handler.setFormatter(formatter)
- root_logger.addHandler(logfile_handler)
-
-
-def do_cmd(cmd):
- """Abstracts out the basics of issuing system commands. If the command
- returns anything in stderr, a PluginError is raised with that information.
- Otherwise, the output from stdout is returned.
- """
-
- pipe = subprocess.PIPE
- logging.debug("Executing:%s", cmd)
- proc = subprocess.Popen(cmd, shell=False, stdin=pipe, stdout=pipe,
- stderr=pipe, close_fds=True)
- ret_code = proc.wait()
- err = proc.stderr.read()
- if ret_code:
- logging.debug("The command exited with the error code: " +
- "%s (stderr output:%s)" % (ret_code, err))
- raise PluginError(err)
- output = proc.stdout.read()
- if output.endswith('\n'):
- output = output[:-1]
- return output
-
-
-def _is_process_run(pidFile, name):
- try:
- fpid = open(pidFile, "r")
- pid = fpid.readline()
- fpid.close()
- except IOError, e:
- return -1
-
- pid = pid[:-1]
- ps = os.popen("ps -ae")
- for l in ps:
- if pid in l and name in l:
- ps.close()
- return 0
-
- ps.close()
- return -2
-
-
-def _is_tool_exist(name):
- if os.path.exists(name):
- return 0
- return -1
-
-
-def check_switch():
- global result
-
- ret = _is_process_run(OVSDB_PID_PATH, OVSDB_DAEMON_PATH)
- if ret < 0:
- if ret == -1:
- return "NO_DB_PID_FILE"
- if ret == -2:
- return "DB_NOT_RUN"
-
- ret = _is_process_run(OVS_PID_PATH, OVS_DAEMON_PATH)
- if ret < 0:
- if ret == -1:
- return "NO_SWITCH_PID_FILE"
- if ret == -2:
- return "SWITCH_NOT_RUN"
-
- if _is_tool_exist(VSCTL_PATH) < 0:
- return "NO_VSCTL"
-
- if _is_tool_exist(OFCTL_PATH) < 0:
- return "NO_OFCTL"
-
- return "SUCCESS"
-
-
-def _build_flow_expr(**kwargs):
- is_delete_expr = kwargs.get('delete', False)
- flow = ""
- if not is_delete_expr:
- flow = "hard_timeout=%s,idle_timeout=%s,priority=%s"\
- % (kwargs.get('hard_timeout', '0'),
- kwargs.get('idle_timeout', '0'),
- kwargs.get('priority', '1'))
- in_port = 'in_port' in kwargs and ",in_port=%s" % kwargs['in_port'] or ''
- dl_type = 'dl_type' in kwargs and ",dl_type=%s" % kwargs['dl_type'] or ''
- dl_src = 'dl_src' in kwargs and ",dl_src=%s" % kwargs['dl_src'] or ''
- dl_dst = 'dl_dst' in kwargs and ",dl_dst=%s" % kwargs['dl_dst'] or ''
- nw_src = 'nw_src' in kwargs and ",nw_src=%s" % kwargs['nw_src'] or ''
- nw_dst = 'nw_dst' in kwargs and ",nw_dst=%s" % kwargs['nw_dst'] or ''
- proto = 'proto' in kwargs and ",%s" % kwargs['proto'] or ''
- ip = ('nw_src' in kwargs or 'nw_dst' in kwargs) and ',ip' or ''
- flow = (flow + in_port + dl_type + dl_src + dl_dst +
- (ip or proto) + nw_src + nw_dst)
- return flow
-
-
-def add_flow(bridge, **kwargs):
- """
- Builds a flow expression for **kwargs and adds the flow entry
- to an Open vSwitch instance
- """
- flow = _build_flow_expr(**kwargs)
- actions = 'actions' in kwargs and ",actions=%s" % kwargs['actions'] or ''
- flow = flow + actions
- addflow = [OFCTL_PATH, "add-flow", bridge, flow]
- do_cmd(addflow)
-
-
-def del_flows(bridge, **kwargs):
- """
- Removes flows according to criteria passed as keyword.
- """
- flow = _build_flow_expr(delete=True, **kwargs)
- # out_port condition does not exist for all flow commands
- out_port = ("out_port" in kwargs and
- ",out_port=%s" % kwargs['out_port'] or '')
- flow = flow + out_port
- delFlow = [OFCTL_PATH, 'del-flows', bridge, flow]
- do_cmd(delFlow)
-
-
-def del_all_flows(bridge):
- delFlow = [OFCTL_PATH, "del-flows", bridge]
- do_cmd(delFlow)
-
- normalFlow = "priority=0 idle_timeout=0 hard_timeout=0 actions=normal"
- add_flow(bridge, normalFlow)
-
-
-def del_port(bridge, port):
- delPort = [VSCTL_PATH, "del-port", bridge, port]
- do_cmd(delPort)
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c7dab82d/scripts/vm/network/vnet/cloudstack_pluginlib.py
----------------------------------------------------------------------
diff --git a/scripts/vm/network/vnet/cloudstack_pluginlib.py b/scripts/vm/network/vnet/cloudstack_pluginlib.py
new file mode 100755
index 0000000..f886aa3
--- /dev/null
+++ b/scripts/vm/network/vnet/cloudstack_pluginlib.py
@@ -0,0 +1,219 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# cloudstack_pluginlib for openvswitch on KVM hypervisor
+
+import ConfigParser
+import logging
+import os
+import subprocess
+
+from time import localtime, asctime
+
+DEFAULT_LOG_FORMAT = "%(asctime)s %(levelname)8s [%(name)s] %(message)s"
+DEFAULT_LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
+DEFAULT_LOG_FILE = "/var/log/cloudstack_plugins.log"
+
+PLUGIN_CONFIG_PATH = "/usr/share/cloudstack-common/scripts/vm/hypervisor/xenserver/cloudstack_plugins.conf"
+OVSDB_PID_PATH = "/var/run/openvswitch/ovsdb-server.pid"
+OVSDB_DAEMON_PATH = "ovsdb-server"
+OVS_PID_PATH = "/var/run/openvswitch/ovs-vswitchd.pid"
+OVS_DAEMON_PATH = "ovs-vswitchd"
+VSCTL_PATH = "/usr/bin/ovs-vsctl"
+OFCTL_PATH = "/usr/bin/ovs-ofctl"
+
+class PluginError(Exception):
+ """Base Exception class for all plugin errors."""
+ def __init__(self, *args):
+ Exception.__init__(self, *args)
+
+
+def setup_logging(log_file=None):
+ debug = False
+ verbose = False
+ log_format = DEFAULT_LOG_FORMAT
+ log_date_format = DEFAULT_LOG_DATE_FORMAT
+ # try to read plugin configuration file
+ if os.path.exists(PLUGIN_CONFIG_PATH):
+ config = ConfigParser.ConfigParser()
+ config.read(PLUGIN_CONFIG_PATH)
+ try:
+ options = config.options('LOGGING')
+ if 'debug' in options:
+ debug = config.getboolean('LOGGING', 'debug')
+ if 'verbose' in options:
+ verbose = config.getboolean('LOGGING', 'verbose')
+ if 'format' in options:
+ log_format = config.get('LOGGING', 'format')
+ if 'date_format' in options:
+ log_date_format = config.get('LOGGING', 'date_format')
+ if 'file' in options:
+ log_file_2 = config.get('LOGGING', 'file')
+ except ValueError:
+ # configuration file contained invalid attributes
+ # ignore them
+ pass
+ except ConfigParser.NoSectionError:
+ # Missing 'Logging' section in configuration file
+ pass
+
+ root_logger = logging.root
+ if debug:
+ root_logger.setLevel(logging.DEBUG)
+ elif verbose:
+ root_logger.setLevel(logging.INFO)
+ else:
+ root_logger.setLevel(logging.WARNING)
+ formatter = logging.Formatter(log_format, log_date_format)
+
+ log_filename = log_file or log_file_2 or DEFAULT_LOG_FILE
+
+ logfile_handler = logging.FileHandler(log_filename)
+ logfile_handler.setFormatter(formatter)
+ root_logger.addHandler(logfile_handler)
+
+
+def do_cmd(cmd):
+ """Abstracts out the basics of issuing system commands. If the command
+ returns anything in stderr, a PluginError is raised with that information.
+ Otherwise, the output from stdout is returned.
+ """
+
+ pipe = subprocess.PIPE
+ logging.debug("Executing:%s", cmd)
+ proc = subprocess.Popen(cmd, shell=False, stdin=pipe, stdout=pipe,
+ stderr=pipe, close_fds=True)
+ ret_code = proc.wait()
+ err = proc.stderr.read()
+ if ret_code:
+ logging.debug("The command exited with the error code: " +
+ "%s (stderr output:%s)" % (ret_code, err))
+ raise PluginError(err)
+ output = proc.stdout.read()
+ if output.endswith('\n'):
+ output = output[:-1]
+ return output
+
+
+def _is_process_run(pidFile, name):
+ try:
+ fpid = open(pidFile, "r")
+ pid = fpid.readline()
+ fpid.close()
+ except IOError, e:
+ return -1
+
+ pid = pid[:-1]
+ ps = os.popen("ps -ae")
+ for l in ps:
+ if pid in l and name in l:
+ ps.close()
+ return 0
+
+ ps.close()
+ return -2
+
+
+def _is_tool_exist(name):
+ if os.path.exists(name):
+ return 0
+ return -1
+
+
+def check_switch():
+ global result
+
+ ret = _is_process_run(OVSDB_PID_PATH, OVSDB_DAEMON_PATH)
+ if ret < 0:
+ if ret == -1:
+ return "NO_DB_PID_FILE"
+ if ret == -2:
+ return "DB_NOT_RUN"
+
+ ret = _is_process_run(OVS_PID_PATH, OVS_DAEMON_PATH)
+ if ret < 0:
+ if ret == -1:
+ return "NO_SWITCH_PID_FILE"
+ if ret == -2:
+ return "SWITCH_NOT_RUN"
+
+ if _is_tool_exist(VSCTL_PATH) < 0:
+ return "NO_VSCTL"
+
+ if _is_tool_exist(OFCTL_PATH) < 0:
+ return "NO_OFCTL"
+
+ return "SUCCESS"
+
+
+def _build_flow_expr(**kwargs):
+ is_delete_expr = kwargs.get('delete', False)
+ flow = ""
+ if not is_delete_expr:
+ flow = "hard_timeout=%s,idle_timeout=%s,priority=%s"\
+ % (kwargs.get('hard_timeout', '0'),
+ kwargs.get('idle_timeout', '0'),
+ kwargs.get('priority', '1'))
+ in_port = 'in_port' in kwargs and ",in_port=%s" % kwargs['in_port'] or ''
+ dl_type = 'dl_type' in kwargs and ",dl_type=%s" % kwargs['dl_type'] or ''
+ dl_src = 'dl_src' in kwargs and ",dl_src=%s" % kwargs['dl_src'] or ''
+ dl_dst = 'dl_dst' in kwargs and ",dl_dst=%s" % kwargs['dl_dst'] or ''
+ nw_src = 'nw_src' in kwargs and ",nw_src=%s" % kwargs['nw_src'] or ''
+ nw_dst = 'nw_dst' in kwargs and ",nw_dst=%s" % kwargs['nw_dst'] or ''
+ proto = 'proto' in kwargs and ",%s" % kwargs['proto'] or ''
+ ip = ('nw_src' in kwargs or 'nw_dst' in kwargs) and ',ip' or ''
+ flow = (flow + in_port + dl_type + dl_src + dl_dst +
+ (ip or proto) + nw_src + nw_dst)
+ return flow
+
+
+def add_flow(bridge, **kwargs):
+ """
+ Builds a flow expression for **kwargs and adds the flow entry
+ to an Open vSwitch instance
+ """
+ flow = _build_flow_expr(**kwargs)
+ actions = 'actions' in kwargs and ",actions=%s" % kwargs['actions'] or ''
+ flow = flow + actions
+ addflow = [OFCTL_PATH, "add-flow", bridge, flow]
+ do_cmd(addflow)
+
+
+def del_flows(bridge, **kwargs):
+ """
+ Removes flows according to criteria passed as keyword.
+ """
+ flow = _build_flow_expr(delete=True, **kwargs)
+ # out_port condition does not exist for all flow commands
+ out_port = ("out_port" in kwargs and
+ ",out_port=%s" % kwargs['out_port'] or '')
+ flow = flow + out_port
+ delFlow = [OFCTL_PATH, 'del-flows', bridge, flow]
+ do_cmd(delFlow)
+
+
+def del_all_flows(bridge):
+ delFlow = [OFCTL_PATH, "del-flows", bridge]
+ do_cmd(delFlow)
+
+ normalFlow = "priority=0 idle_timeout=0 hard_timeout=0 actions=normal"
+ add_flow(bridge, normalFlow)
+
+
+def del_port(bridge, port):
+ delPort = [VSCTL_PATH, "del-port", bridge, port]
+ do_cmd(delPort)
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c7dab82d/scripts/vm/network/vnet/ovstunnel.py
----------------------------------------------------------------------
diff --git a/scripts/vm/network/vnet/ovstunnel.py b/scripts/vm/network/vnet/ovstunnel.py
index 67ef89b..225876a 100755
--- a/scripts/vm/network/vnet/ovstunnel.py
+++ b/scripts/vm/network/vnet/ovstunnel.py
@@ -27,16 +27,16 @@ import os
import sys
import subprocess
import time
+from optparse import OptionParser, OptionGroup, OptParseError, BadOptionError, OptionError, OptionConflictError, OptionValueError
from time import localtime as _localtime, asctime as _asctime
-lib.setup_logging("/var/log/ovstunnel.log")
-
def setup_ovs_bridge(bridge, key, cs_host_id):
res = lib.check_switch()
if res != "SUCCESS":
- return "FAILURE:%s" % res
+ #return "FAILURE:%s" % res
+ return 'false'
logging.debug("About to manually create the bridge:%s" % bridge)
#set gre_key to bridge
@@ -44,15 +44,18 @@ def setup_ovs_bridge(bridge, key, cs_host_id):
"other_config:gre_key=%s" % key])
logging.debug("Bridge has been manually created:%s" % res)
if res:
- result = "FAILURE:%s" % res
+# result = "FAILURE:%s" % res
+ result = 'false'
else:
# Verify the bridge actually exists, with the gre_key properly set
res = lib.do_cmd([lib.VSCTL_PATH, "get", "bridge",
bridge, "other_config:gre_key"])
if key in res:
- result = "SUCCESS:%s" % bridge
+# result = "SUCCESS:%s" % bridge
+ result = 'true'
else:
- result = "FAILURE:%s" % res
+# result = "FAILURE:%s" % res
+ result = 'false'
lib.do_cmd([lib.VSCTL_PATH, "set", "bridge", bridge, "other_config:is-ovs-tun-network=True"])
#get list of hosts using this bridge
@@ -69,29 +72,34 @@ def destroy_ovs_bridge(bridge):
res = lib.check_switch()
if res != "SUCCESS":
- return res
+# return res
+ return 'false'
+
res = lib.do_cmd([lib.VSCTL_PATH, "del-br", bridge])
logging.debug("Bridge has been manually removed:%s" % res)
if res:
- result = "FAILURE:%s" % res
+# result = "FAILURE:%s" % res
+ result = 'false'
else:
- result = "SUCCESS:%s" % bridge
+# result = "SUCCESS:%s" % bridge
+ result = 'true'
logging.debug("Destroy_ovs_bridge completed with result:%s" % result)
return result
-def create_tunnel(bridge, remote_ip, gre_key, src_host, dst_host):
+def create_tunnel(bridge, remote_ip, key, src_host, dst_host):
logging.debug("Entering create_tunnel")
res = lib.check_switch()
if res != "SUCCESS":
logging.debug("Openvswitch running: NO")
- return "FAILURE:%s" % res
+# return "FAILURE:%s" % res
+ return 'false'
# We need to keep the name below 14 characters
# src and target are enough - consider a fixed length hash
- name = "t%s-%s-%s" % (gre_key, src_host, dst_host)
+ name = "t%s-%s-%s" % (key, src_host, dst_host)
# Verify the bridge to be created
# NOTE: Timeout should not be necessary anymore
@@ -101,7 +109,9 @@ def create_tunnel(bridge, remote_ip, gre_key, src_host, dst_host):
if bridge not in res:
logging.debug("WARNING:Can't find bridge %s for creating " +
"tunnel!" % bridge)
- return "FAILURE:NO_BRIDGE"
+# return "FAILURE:NO_BRIDGE"
+ return 'false'
+
logging.debug("bridge %s for creating tunnel - VERIFIED" % bridge)
tunnel_setup = False
drop_flow_setup = False
@@ -109,7 +119,7 @@ def create_tunnel(bridge, remote_ip, gre_key, src_host, dst_host):
# Create a port and configure the tunnel interface for it
add_tunnel = [lib.VSCTL_PATH, "add-port", bridge,
name, "--", "set", "interface",
- name, "type=gre", "options:key=%s" % gre_key,
+ name, "type=gre", "options:key=%s" % key,
"options:remote_ip=%s" % remote_ip]
lib.do_cmd(add_tunnel)
tunnel_setup = True
@@ -123,7 +133,8 @@ def create_tunnel(bridge, remote_ip, gre_key, src_host, dst_host):
if len(iface_list) != 1:
logging.debug("WARNING: Unexpected output while verifying " +
"port %s on bridge %s" % (name, bridge))
- return "FAILURE:VERIFY_PORT_FAILED"
+# return "FAILURE:VERIFY_PORT_FAILED"
+ return 'false'
# verify interface
iface_uuid = iface_list[0]
@@ -135,10 +146,12 @@ def create_tunnel(bridge, remote_ip, gre_key, src_host, dst_host):
key_validation = lib.do_cmd(verify_interface_key)
ip_validation = lib.do_cmd(verify_interface_ip)
- if not gre_key in key_validation or not remote_ip in ip_validation:
+ if not key in key_validation or not remote_ip in ip_validation:
logging.debug("WARNING: Unexpected output while verifying " +
"interface %s on bridge %s" % (name, bridge))
- return "FAILURE:VERIFY_INTERFACE_FAILED"
+# return "FAILURE:VERIFY_INTERFACE_FAILED"
+ return 'false'
+
logging.debug("Tunnel interface validated:%s" % verify_interface_ip)
cmd_tun_ofport = [lib.VSCTL_PATH, "get", "interface",
iface_uuid, "ofport"]
@@ -153,7 +166,8 @@ def create_tunnel(bridge, remote_ip, gre_key, src_host, dst_host):
nw_dst='224.0.0.0/24', actions='drop')
drop_flow_setup = True
logging.debug("Broadcast drop rules added")
- return "SUCCESS:%s" % name
+# return "SUCCESS:%s" % name
+ return 'true'
except:
logging.debug("An unexpected error occured. Rolling back")
if tunnel_setup:
@@ -174,9 +188,38 @@ def destroy_tunnel(bridge, iface_name):
ofport = get_field_of_interface(iface_name, "ofport")
lib.del_flows(bridge, in_port=ofport)
lib.del_port(bridge, iface_name)
- return "SUCCESS"
+# return "SUCCESS"
+ return 'true'
def get_field_of_interface(iface_name, field):
get_iface_cmd = [lib.VSCTL_PATH, "get", "interface", iface_name, field]
res = lib.do_cmd(get_iface_cmd)
return res
+
+if __name__ == '__main__':
+ logging.basicConfig(filename="/var/log/cloudstack/agent/ovstunnel.log", format="%(asctime)s - %(message)s", level=logging.DEBUG)
+ parser = OptionParser()
+ parser.add_option("--key", dest="key")
+ parser.add_option("--cs_host_id", dest="cs_host_id")
+ parser.add_option("--bridge", dest="bridge")
+ parser.add_option("--remote_ip", dest="remote_ip")
+ parser.add_option("--src_host", dest="src_host")
+ parser.add_option("--dst_host", dest="dst_host")
+ parser.add_option("--iface_name", dest="iface_name")
+ (option, args) = parser.parse_args()
+ if len(args) == 0:
+ logging.debug("No command to execute")
+ sys.exit(1)
+ cmd = args[0]
+ if cmd == "setup_ovs_bridge":
+ setup_ovs_bridge(option.bridge, option.key, option.cs_host_id)
+ elif cmd == "destroy_ovs_bridge":
+ destroy_ovs_bridge(option.bridge)
+ elif cmd == "create_tunnel":
+ create_tunnel(option.bridge, option.remote_ip, option.key, option.src_host, option.dst_host)
+ elif cmd == "destroy_tunnel":
+ destroy_tunnel(option.bridge, option.iface_name)
+ else:
+ logging.debug("Unknown command: " + cmd)
+ sys.exit(1)
+