Commit 496d018a authored by Thibault VINCENT's avatar Thibault VINCENT
Browse files

add: live tunneled migration handler + tunneling handlers

parent 1b76925e
Loading
Loading
Loading
Loading
+74 −1
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ from sjrpc.utils import RpcHandler
from sjrpc.utils import pure
from errors import HostError, HypervisorError
from common import LocalHost
from jobs import ReceiveFileJob, SendFileJob
from jobs import ReceiveFileJob, SendFileJob, DrbdCopyJob, TCPTunnelJob
from __init__ import __version__

#FIXME should not be needed
@@ -683,6 +683,79 @@ class NodeHandler(RpcHandler):
            except:
                pass
    
    ###
    # Migration and helpers
    
    @pure
    def tun_setup(self, local=True):
        '''
        '''
        # facilities
        jobmgr = self._host_handle.jobmgr
        # create the job
        job = TCPTunnelJob(jobmgr)
        job.prepare()
        job.start_now()
        # start listening
        job.tunnel_listen(local)
        # build a ressource
        return {
            'jid'  : job.get_id(),
            'key'  : 'FIXME',
            'port' : job.tunnel_get_server_port(),
            }
    
    @pure
    def tun_connect(self, res, remote_res, remote_ip):
        '''
        '''
        # facilities
        jobmgr = self._host_handle.jobmgr
        # get the job
        job = jobmgr.get_job(res['jid'])
        # connect to the remote endpoint
        job.tunnel_connect((remote_ip, remote_res['port']))
    
    @pure
    def tun_connect_hv(self, res, migration=False):
        '''
        '''
        # FIXME magic values
        ip = '127.0.0.1'
        if migration and self._host_handle.get_hv_type() == 'xen':
            port = 8002
        else:
            port = 16509
        # facilities
        jobmgr = self._host_handle.jobmgr
        # get the job
        job = jobmgr.get_job(res['jid'])
        # connect to libvirt
        job.tunnel_connect((ip, port))

    @pure
    def tun_destroy(self, res):
        '''
        '''
        # facilities
        jobmgr = self._host_handle.jobmgr
        # stop the tunnel
        jobmgr.cancel(res['jid'])
    
    @pure
    def vm_migrate_tunneled(self, name, tun_res):
        '''
        '''
        debug('request for tunneled migration of VM `%s`', name)
        # local listenning tunnel port
        tun_port = tun_res.get('port')
        debug('tunnel port = `%d`', tun_port)
        # acquire vm object
        vm = self._host_handle.vm_get(name)
        # migrate
        vm.migrate('127.0.0.1', tun_port)
    
    
    ##################################
    #   Storage control
    ##################################