summaryrefslogtreecommitdiffstats
path: root/nova/virt
diff options
context:
space:
mode:
authorSoren Hansen <soren.hansen@rackspace.com>2010-09-20 11:46:18 +0200
committerSoren Hansen <soren.hansen@rackspace.com>2010-09-20 11:46:18 +0200
commita3d003d7ec92f3ae23a667954a790c71efdbfdbe (patch)
treebb5d3f313107a017459b4d4caf4f52527ffa128c /nova/virt
parent75a1815aa2724d64d1f487996265ba9136017029 (diff)
Move the code that extracts the console output into the virt drivers. Move the code that formats it up into the API layer. Add support for Xen console.
Diffstat (limited to 'nova/virt')
-rw-r--r--nova/virt/fake.py2
-rw-r--r--nova/virt/libvirt_conn.py40
-rw-r--r--nova/virt/xenapi.py3
3 files changed, 45 insertions, 0 deletions
diff --git a/nova/virt/fake.py b/nova/virt/fake.py
index 4ae6afcc4..dc6112f20 100644
--- a/nova/virt/fake.py
+++ b/nova/virt/fake.py
@@ -223,6 +223,8 @@ class FakeConnection(object):
"""
return [0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L]
+ def get_console_output(self, instance):
+ return 'FAKE CONSOLE OUTPUT'
class FakeInstance(object):
def __init__(self):
diff --git a/nova/virt/libvirt_conn.py b/nova/virt/libvirt_conn.py
index 09f178c2a..addd9c997 100644
--- a/nova/virt/libvirt_conn.py
+++ b/nova/virt/libvirt_conn.py
@@ -248,6 +248,46 @@ class LibvirtConnection(object):
timer.start(interval=0.5, now=True)
yield local_d
+ def _flush_xen_console(self, virsh_output):
+ logging.info('virsh said: %r' % (virsh_output,))
+ virsh_output = virsh_output[0].strip()
+
+ if virsh_output.startswith('/dev/'):
+ logging.info('cool, it\'s a device')
+ d = process.simple_execute("sudo dd if=%s iflag=nonblock" % virsh_output, check_exit_code=False)
+ d.addCallback(lambda r:r[0])
+ return d
+ else:
+ return ''
+
+ def _append_to_file(self, data, fpath):
+ logging.info('data: %r, fpath: %r' % (data, fpath))
+ fp = open(fpath, 'a+')
+ fp.write(data)
+ return fpath
+
+ def _dump_file(self, fpath):
+ fp = open(fpath, 'r+')
+ contents = fp.read()
+ logging.info('Contents: %r' % (contents,))
+ return contents
+
+ @exception.wrap_exception
+ def get_console_output(self, instance):
+ console_log = os.path.join(FLAGS.instances_path, instance['name'], 'console.log')
+ logging.info('console_log: %s' % console_log)
+ logging.info('FLAGS.libvirt_type: %s' % FLAGS.libvirt_type)
+ if FLAGS.libvirt_type == 'xen':
+ # Xen is spethial
+ d = process.simple_execute("virsh ttyconsole %s" % instance['name'])
+ d.addCallback(self._flush_xen_console)
+ d.addCallback(self._append_to_file, console_log)
+ else:
+ d = defer.succeed(console_log)
+ d.addCallback(self._dump_file)
+ return d
+
+
@defer.inlineCallbacks
def _create_image(self, inst, libvirt_xml):
# syntactic nicety
diff --git a/nova/virt/xenapi.py b/nova/virt/xenapi.py
index 1c6de4403..5fdd2b9fc 100644
--- a/nova/virt/xenapi.py
+++ b/nova/virt/xenapi.py
@@ -299,6 +299,9 @@ class XenAPIConnection(object):
'num_cpu': rec['VCPUs_max'],
'cpu_time': 0}
+ def get_console_output(self, instance):
+ return 'FAKE CONSOLE OUTPUT'
+
@utils.deferredToThread
def _lookup(self, i):
return self._lookup_blocking(i)