summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnthony Young <sleepsonthefloor@gmail.com>2010-12-21 14:44:53 -0800
committerAnthony Young <sleepsonthefloor@gmail.com>2010-12-21 14:44:53 -0800
commit08963a0df7a6d1c90ba12ce60cbf15c93b0b70e6 (patch)
tree72d45fa4bc4eb2b9fd7c8f19fbf38352211266d5
parenta3077cbb859a9237f9516ed0f073fe00839277c4 (diff)
prototype works with kvm. now moving call from api to compute
-rw-r--r--nova/api/ec2/cloud.py37
-rw-r--r--nova/compute/instance_types.py2
-rw-r--r--nova/compute/manager.py9
-rw-r--r--nova/virt/libvirt.qemu.xml.template22
-rwxr-xr-xtools/euca_additions/euca-get-ajax-console8
5 files changed, 59 insertions, 19 deletions
diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py
index 469331a66..09fdd32da 100644
--- a/nova/api/ec2/cloud.py
+++ b/nova/api/ec2/cloud.py
@@ -27,6 +27,7 @@ import datetime
import logging
import os
import random
+import re
import subprocess
import time
import uuid
@@ -44,10 +45,13 @@ from nova import utils
from nova.compute.instance_types import INSTANCE_TYPES
from nova.api import cloud
from nova.api.ec2 import images
+from nova.virt import libvirt_conn
+from xml.dom import minidom
FLAGS = flags.FLAGS
flags.DECLARE('storage_availability_zone', 'nova.volume.manager')
+flags.DEFINE_string("console_dmz", "tonbuntu:8000", "location of console proxy")
InvalidInputException = exception.InvalidInputException
@@ -454,6 +458,7 @@ class CloudController(object):
return {"InstanceId": ec2_id,
"Timestamp": now,
"output": base64.b64encode(output)}
+
def get_ajax_console(self, context, instance_id, **kwargs):
"""Create an AJAX Console"""
@@ -461,7 +466,7 @@ class CloudController(object):
internal_id = ec2_id_to_internal_id(ec2_id)
instance_ref = db.instance_get_by_internal_id(context, internal_id)
- def get_port():
+ def get_open_port():
for i in xrange(0,100): # don't loop forever
port = random.randint(10000, 12000)
cmd = "netcat 0.0.0.0 %s -w 2 < /dev/null" % (port,)
@@ -472,15 +477,33 @@ class CloudController(object):
return port
raise 'Unable to find an open port'
- port = get_port()
+ def get_pty_for_instance(instance_id):
+ stdout, stderr = utils.execute('virsh dumpxml instance-%d' % int(instance_id))
+ dom = minidom.parseString(stdout)
+ serials = dom.getElementsByTagName('serial')
+ for serial in serials:
+ if serial.getAttribute('type') == 'pty':
+ source = serial.getElementsByTagName('source')[0]
+ return source.getAttribute('path')
+
+ port = get_open_port()
token = str(uuid.uuid4())
host = instance_ref['host']
- cmd = "%s/tools/ajaxterm/ajaxterm.py --command 'virsh console instance-%d' -t %s -p %s" \
- % (utils.novadir(), internal_id, token, port)
- port_is_unused = subprocess.Popen(cmd, shell=True) #TODO error check
- dmz = 'tonbuntu' #TODO put correct value for dmz
- return {'url': 'http://%s:%s/?token=%s&host=%s&port=%s' % (dmz, 8000, token, host, port)}
+
+ if FLAGS.libvirt_type == 'uml':
+ pass #FIXME
+ elif FLAGS.libvirt_type == 'xen':
+ pass #FIXME
+ else:
+ ajaxterm_cmd = 'socat - %s' % get_pty_for_instance(internal_id)
+
+ cmd = "%s/tools/ajaxterm/ajaxterm.py --command '%s' -t %s -p %s" \
+ % (utils.novadir(), ajaxterm_cmd, token, port)
+
+ subprocess.Popen(cmd, shell=True)
+ FLAGS.console_dmz = 'tonbuntu:8000'
+ return {'url': 'http://%s/?token=%s&host=%s&port=%s' % (FLAGS.console_dmz, token, host, port)}
def describe_volumes(self, context, **kwargs):
if context.user.is_admin():
diff --git a/nova/compute/instance_types.py b/nova/compute/instance_types.py
index 67ee8f8a8..bca9839d0 100644
--- a/nova/compute/instance_types.py
+++ b/nova/compute/instance_types.py
@@ -22,7 +22,7 @@ The built-in instance properties.
"""
INSTANCE_TYPES = {
- 'm1.tiny': dict(memory_mb=512, vcpus=1, local_gb=0, flavorid=1),
+ 'm1.tiny': dict(memory_mb=128, vcpus=1, local_gb=0, flavorid=1),
'm1.small': dict(memory_mb=2048, vcpus=1, local_gb=20, flavorid=2),
'm1.medium': dict(memory_mb=4096, vcpus=2, local_gb=40, flavorid=3),
'm1.large': dict(memory_mb=8192, vcpus=4, local_gb=80, flavorid=4),
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 523bb8893..0897eee45 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -154,6 +154,15 @@ class ComputeManager(manager.Manager):
return self.driver.get_console_output(instance_ref)
+ @exception.wrap_exception
+ def get_ajax_console(self, context, instance_id):
+ """Send the console output for an instance."""
+ context = context.elevated()
+ logging.debug("instance %s: getting ajax console", instance_id)
+ instance_ref = self.db.instance_get(context, instance_id)
+
+ return self.driver.get_console_output(instance_ref)
+
@defer.inlineCallbacks
@exception.wrap_exception
def attach_volume(self, context, instance_id, volume_id, mountpoint):
diff --git a/nova/virt/libvirt.qemu.xml.template b/nova/virt/libvirt.qemu.xml.template
index d5a249665..1f0c8a3ff 100644
--- a/nova/virt/libvirt.qemu.xml.template
+++ b/nova/virt/libvirt.qemu.xml.template
@@ -4,9 +4,6 @@
<type>hvm</type>
<kernel>%(basepath)s/kernel</kernel>
<initrd>%(basepath)s/ramdisk</initrd>
-<!--
- <cmdline>root=/dev/vda1 console=tty0 console=ttyS0,115200</cmdline>
--->
<cmdline>root=/dev/vda1 console=ttyS0</cmdline>
</os>
<features>
@@ -28,15 +25,22 @@
<parameter name="DHCPSERVER" value="%(dhcp_server)s" />
</filterref>
</interface>
- <serial type='pty'>
- <source path='/dev/pts/2'/>
- <target port='0'/>
- </serial>
-<!--
+
+ <!-- The order is significant here. File is first -->
<serial type="file">
<source path='%(basepath)s/console.log'/>
<target port='1'/>
</serial>
--->
+
+ <console type='pty' tty='/dev/pts/2'>
+ <source path='/dev/pts/2'/>
+ <target port='0'/>
+ </console>
+
+ <serial type='pty'>
+ <source path='/dev/pts/2'/>
+ <target port='0'/>
+ </serial>
+
</devices>
</domain>
diff --git a/tools/euca_additions/euca-get-ajax-console b/tools/euca_additions/euca-get-ajax-console
index 14891c1c6..94eada85f 100755
--- a/tools/euca_additions/euca-get-ajax-console
+++ b/tools/euca_additions/euca-get-ajax-console
@@ -1,7 +1,12 @@
#!/usr/bin/env python
-import getopt, sys, os
+import getopt
+import os
+import sys
+sys.path.append('/root/anso/deploy')
+import nova
from euca2ools import Euca2ool, InstanceValidationError, Util, ConnectionFailed
+from nova.boto_extensions import *
usage_string = """
Retrieves a url to an ajax console terminal
@@ -16,7 +21,6 @@ OPTIONAL PARAMETERS
"""
-from nova.boto_extensions import *
def usage(status=1):
print usage_string