Commit 348afef5 authored by Anael Beutot's avatar Anael Beutot
Browse files

VM console handler.

parent 9f234c5c
Loading
Loading
Loading
Loading
+30 −1
Original line number Diff line number Diff line
import logging
import socket
import weakref
from StringIO import StringIO
from itertools import chain, imap
from xml.etree import cElementTree as et

import libvirt
from sjrpc.utils import threadless
from sjrpc.utils import threadless, pass_connection

from cloudcontrol.node.host import Handler as HostHandler
from cloudcontrol.node.tags import Tag, tag_inspector, get_tags
@@ -127,6 +128,7 @@ class Handler(HostHandler):
        self.main.reset_handler('drbd_takeover', self.drbd_takeover)
        self.main.reset_handler('drbd_sync_status', self.drbd_sync_status)
        self.main.reset_handler('drbd_shutdown', self.drbd_shutdown)
        self.main.reset_handler('vm_open_console', self.vm_open_console)

        # if everything went fine, unregister the timer
        self.timer.stop()
@@ -185,6 +187,7 @@ class Handler(HostHandler):
        self.main.remove_handler('drbd_takeover')
        self.main.remove_handler('drbd_sync_status')
        self.main.remove_handler('drbd_shutdown')
        self.main.remove_handler('vm_open_console')
        # launch connection timer
        self.timer.start()

@@ -349,6 +352,32 @@ class Handler(HostHandler):

        logger.debug('Sucessfuly live migrated vm %s', name)

    @threadless
    @pass_connection
    def vm_open_console(self, conn, name):
        """
        :param conn: sjRPC connection instance
        :param name: VM name
        """
        vm = self.hypervisor.domains[name]

        # create connection to the VM console
        try:
            endpoint = vm.open_console()
        except socket.error:
            # cannot create socketpair
            logger.error('Cannot create connection to VM console')
            raise

        def on_close(tun):
            """Method of Tunnel protocol close callback."""
            tun.endpoint.close()
            vm.close_console()

        # connect as tunnel endpoint
        proto = conn.create_tunnel(endpoint=endpoint, on_close=on_close)
        return proto.label

    def vol_create(self, pool, name, size):
        logger.debug('Volume create %s, pool %s, size %s', name, pool, size)
        try: