From ae082df0000a785b693b2f4aa434650a81a94bdf Mon Sep 17 00:00:00 2001 From: Stephen Shirley Date: Fri, 24 Jun 2011 13:29:48 +0200 Subject: [PATCH] Adding a wrapper around connecting to kvm console The wrapper will connect to the console, and check in the background if the instance is paused, unpausing it as necessary. Signed-off-by: Stephen Shirley Reviewed-by: Michael Hanselmann --- Makefile.am | 1 + lib/constants.py | 1 + lib/hypervisor/hv_kvm.py | 4 +++- tools/kvm-console-wrapper | 42 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100755 tools/kvm-console-wrapper diff --git a/Makefile.am b/Makefile.am index 8e3d289..a1287f8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -496,6 +496,7 @@ pkglib_SCRIPTS = \ daemons/daemon-util \ tools/kvm-ifup \ tools/xm-console-wrapper \ + tools/kvm-console-wrapper \ $(pkglib_python_scripts) nodist_pkglib_SCRIPTS = \ diff --git a/lib/constants.py b/lib/constants.py index 75589bf..a431853 100644 --- a/lib/constants.py +++ b/lib/constants.py @@ -144,6 +144,7 @@ QUEUE_DIR = DATA_DIR + "/queue" DAEMON_UTIL = _autoconf.PKGLIBDIR + "/daemon-util" SETUP_SSH = _autoconf.TOOLSDIR + "/setup-ssh" KVM_IFUP = _autoconf.PKGLIBDIR + "/kvm-ifup" +KVM_CONSOLE_WRAPPER = _autoconf.PKGLIBDIR + "/kvm-console-wrapper" XM_CONSOLE_WRAPPER = _autoconf.PKGLIBDIR + "/xm-console-wrapper" ETC_HOSTS = "/etc/hosts" DEFAULT_FILE_STORAGE_DIR = _autoconf.FILE_STORAGE_DIR diff --git a/lib/hypervisor/hv_kvm.py b/lib/hypervisor/hv_kvm.py index 7e947a6..3253911 100644 --- a/lib/hypervisor/hv_kvm.py +++ b/lib/hypervisor/hv_kvm.py @@ -1138,7 +1138,9 @@ class KVMHypervisor(hv_base.BaseHypervisor): """ if hvparams[constants.HV_SERIAL_CONSOLE]: - cmd = [constants.SOCAT_PATH, + cmd = [constants.KVM_CONSOLE_WRAPPER, + utils.ShellQuote(instance.name), constants.SOCAT_PATH, + utils.ShellQuote(cls._InstanceMonitor(instance.name)), "STDIO,%s" % cls._SocatUnixConsoleParams(), "UNIX-CONNECT:%s" % cls._InstanceSerial(instance.name)] return objects.InstanceConsole(instance=instance.name, diff --git a/tools/kvm-console-wrapper b/tools/kvm-console-wrapper new file mode 100755 index 0000000..757abff --- /dev/null +++ b/tools/kvm-console-wrapper @@ -0,0 +1,42 @@ +#!/bin/bash + +# Copyright (C) 2011 Google Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +INSTANCE="$1" +SOCAT="$2" +MONITOR="$3" +PARAMS="$4" +CONSOLE="$5" + +unpause() { + echo "info status" | + "$SOCAT" STDIO "UNIX-CONNECT:$MONITOR" 2>/dev/null | + grep -q '^VM status: paused' || return + # As there is no way to be sure when the main socat has actually connected to + # the instance console, sleep for a few seconds before unpausing the + # instance. This is a tradeoff between missing some console output if the + # node is overloaded and making the user wait everytime when the node isn't + # so busy. + sleep 3 + # Send \r\n after notice as terminal is in raw mode + printf "Instance $INSTANCE is paused, unpausing\r\n" + echo "c" | "$SOCAT" STDIO "UNIX-CONNECT:$MONITOR" &>/dev/null +} + +unpause & +"$SOCAT" "$PARAMS" "$CONSOLE" -- 1.7.10.4