Commit 07d58ce9 authored by Thibault VINCENT's avatar Thibault VINCENT
Browse files

add: handlers to manage drbd

parent 2e8686f0
Loading
Loading
Loading
Loading
+93 −0
Original line number Diff line number Diff line
@@ -796,6 +796,99 @@ class NodeHandler(RpcHandler):
        jmgr = self._host_handle.jobmgr
        jmgr.cancel(jid)
    
    ###
    # Live network copy
    
    @pure
    def drbd_setup(self, pool, name):
        '''
        '''
        if hasattr(self._host_handle, 'storage'):
            # facilities
            sto = self._host_handle.storage()
            lvm = self._host_handle.lvm
            jobmgr = self._host_handle.jobmgr
            drbdpool = self._host_handle.drbdpool
            # get pool and volume handles
            vol_pool = sto.pool_get(pool)
            vol = vol_pool.volume_get(name)
            # stop if it's not an LVM volume
            if vol_pool.get_source_format() != 'lvm2':
                raise HostError('not a LVM2 volume, cannot use DRBD')
            # fetch LV/VG info
            vg_name = vol_pool.get_source_name()
            lv_name = vol.get_name()
            # create job
            job = DrbdCopyJob(jobmgr, lvm, drbdpool, vg_name, lv_name)
            job.start_now()
            return {
                'jid'   : job.get_id(),
                'port'  : job.drbd_get_port(),
                }
        else:
            raise NotImplementedError('host handler has no storage support')
    
    @pure
    def drbd_connect(self, res, remote_res, remote_ip):
        '''
        Connect the local live copy engine to the designated remote host that
        will push or pull data.
        '''
        # facilities
        jobmgr = self._host_handle.jobmgr
        # get the job
        job = jobmgr.get_job(res['jid'])
        # connect node
        job.drbd_connect(remote_ip, remote_res['port'])
    
    @pure
    def drbd_role(self, res, primary):
        '''
        '''
        # facilities
        jobmgr = self._host_handle.jobmgr
        # get the job
        job = jobmgr.get_job(res['jid'])
        # change role
        job.drbd_role(primary=primary)
    
    @pure
    def drbd_takeover(self, res, state):
        '''
        '''
        # facilities
        jobmgr = self._host_handle.jobmgr
        # get the job
        job = jobmgr.get_job(res['jid'])
        # hijack the VM disk DM
        job.drbd_takeover(state)
    
    @pure
    def drbd_sync(self, res):
        '''
        Wait for the live copy engine to complete a pending initial disk
        synchronization.
        '''
        # facilities
        jobmgr = self._host_handle.jobmgr
        # get the job
        job = jobmgr.get_job(res['jid'])
        # wait for sync completion
        job.drbd_waitsync()
    
    @pure
    def drbd_shutdown(self, res):
        '''
        Close connection and destroy all ressources allocated for a live copy.
        '''
        # facilities
        jobmgr = self._host_handle.jobmgr
        # get the job
        job = jobmgr.get_job(res['jid'])
        # FIXME
        job.drbd_stop()