Example #1
0
 def backup(self, session, vm_id, vm_name, host, storage, force_shutdown=False, show_progress=False):
     uuid=session.xenapi.VM.get_uuid(vm_id)  # @ReservedAssignment
     state = session.xenapi.VM.get_power_state(vm_id)
     restore_actions=[]
     try:
         
         if state =='Paused':
             log.error('Cannot backup VM is state Paused')
             return
         elif state =='Suspended':
             log.warn('Backing up machine in suspended stated')
         elif state =='Running':
             if not force_shutdown:
                 try:
                     tt_id=session.xenapi.VM.snapshot(vm_id,'Temp.backup of %s'% vm_name )
                 except XenAPI.Failure, f:
                     if f.details[0]== 'SR_OPERATION_NOT_SUPPORTED':
                         raise CommandError('Cannot create snapshot of vm %s (try backup in halted state, or detach disks, that do not support snapshots)'% vm_name)
                     else:
                         raise
                 uuid=session.xenapi.VM.get_uuid(tt_id)
                 restore_actions.append(lambda: uninstall_VM(session, tt_id))
                 log.debug('Made snapshot of %s to uuid: %s', vm_name, uuid)
             else:
                 log.debug('Shutting down VM')
                 session.xenapi.VM.clean_shutdown(vm_id)
                 restore_actions.append(lambda: session.xenapi.VM.start(vm_id, False, False))
     
         sid=session._session
         rack=storage.get_rack_for(vm_name)
         log.info('Starting backup for VM %s (uuid=%s) on server %s', vm_name, uuid, host['name'])
         progress=None
         with Client(host['url']) as c:
             resp=c.get('/export', {'session_id':sid, 'uuid': uuid})
             task_id=resp.getheader('task-id')
             restore_actions.append(lambda: cancel_task(session,task_id))
             if show_progress:
                 log.debug("Starting progress monitor")
                 progress=ProgressMonitor(session, task_id)
                 progress.start()
             s=rack.create_slot()
             writer=s.get_writer()
             bufsize=1048576
             while True:
                 data=resp.read(bufsize)
                 if not data: break
                 writer.write(data)
             s.close() # close only if finished
         if progress:
             progress.stop()
         rack.shrink()
Example #2
0
                                else:
                                    log.warn('VM is not a template')
                            except XenAPI.Failure, f:
                                log.error('Cannot change template to VM: %s',
                                          f)
                        if self.args.rename:
                            try:
                                session.xenapi.VM.set_name_label(
                                    vm_id, self.args.rename)
                                log.info('VM Renamed to %s', self.args.rename)
                            except XenAPI.Failure, f:
                                log.error('Cannot rename VM: %s', f)

                    else:
                        log.error('Import result does not contain VM id')
            progress.stop()

    @classmethod
    def add_params(self, parser):
        super(RestoreOneCommand, self).add_params(parser)
        parser.add_argument('--no-progress',
                            action='store_true',
                            help="Do not print progress")
        parser.add_argument(
            '--restore',
            action='store_true',
            help="Restore as replacement of original VM (MAC is the same)")
        parser.add_argument(
            '--sr_id',
            help="uuid of SR to import to (if other then default SR)")
        parser.add_argument(
Example #3
0
 def backup(self, session, vm_id, vm_name, host, storage, force_shutdown=False, show_progress=False,
            compress_on_server=False, insecure=False):
     uuid=session.xenapi.VM.get_uuid(vm_id)  # @ReservedAssignment
     vm_uuid=uuid
     state = session.xenapi.VM.get_power_state(vm_id)
     restore_actions=[]
     try:
         
         if state =='Paused':
             log.error('Cannot backup VM is state Paused')
             return
         elif state =='Suspended':
             log.warn('Backing up machine in suspended stated')
         elif state =='Running':
             if not force_shutdown:
                 try:
                     tt_id=session.xenapi.VM.snapshot(vm_id,SNAPSHOT_PREFIX+ vm_name )
                 except XenAPI.Failure, f:
                     if f.details[0]== 'SR_OPERATION_NOT_SUPPORTED':
                         raise CommandError('Cannot create snapshot of vm %s (try backup in halted state, or detach disks, that do not support snapshots)'% vm_name)
                     else:
                         raise
                 uuid=session.xenapi.VM.get_uuid(tt_id)
                 restore_actions.append(lambda: uninstall_VM(session, tt_id))
                 log.debug('Made snapshot of %s(%s) to snapshot uuid: %s', vm_name, vm_uuid, uuid)
             else:
                 log.debug('Shutting down VM')
                 session.xenapi.VM.clean_shutdown(vm_id)
                 def restart_vm():
                     session.xenapi.VM.start(vm_id, False, False)
                     log.debug('Started VM')
                 restore_actions.append(restart_vm)
     
         sid=session._session
         rack=storage.get_rack_for(vm_name, vm_uuid)
         log.info('Starting backup for VM %s (uuid=%s) on server %s', vm_name, vm_uuid, host['name'])
         progress=None
         with Client(unsecure(host['url'],insecure)) as c:
             params={'session_id':sid, 'uuid': uuid}
             if compress_on_server:
                 params['use_compression']="true"
             resp=c.get('/export', params)
             task_id=resp.getheader('task-id')
             restore_actions.append(lambda: cancel_task(session,task_id))
             if show_progress:
                 log.debug("Starting progress monitor")
                 progress=ProgressMonitor(session, task_id)
                 progress.start()
             s=rack.create_slot()
             writer=s.get_writer()
             bufsize=65536 # 64k is enough - around this size got best performance
             while True:
                 data=resp.read(bufsize)
                 if not data: break
                 writer.write(data)
             s.close() # close only if finished
         if progress:
             progress.join(10)
             if progress.is_alive():
                 log.warn('Task did not finished')
             else:
                 if progress.error:
                     msg='Export failed: %s'%progress.result
                     log.error(msg)
                     print >>sys.stderr, msg
             progress.stop()
         rack.shrink()
Example #4
0
    def backup(self,
               session,
               vm_id,
               vm_name,
               host,
               storage,
               force_shutdown=False,
               show_progress=False,
               compress_on_server=False,
               insecure=False):
        uuid = session.xenapi.VM.get_uuid(vm_id)  # @ReservedAssignment
        vm_uuid = uuid
        state = session.xenapi.VM.get_power_state(vm_id)
        restore_actions = []
        try:

            if state == 'Paused':
                log.error('Cannot backup VM is state Paused')
                return
            elif state == 'Suspended':
                log.warn('Backing up machine in suspended stated')
            elif state == 'Running':
                if not force_shutdown:
                    try:
                        tt_id = session.xenapi.VM.snapshot(
                            vm_id, SNAPSHOT_PREFIX + vm_name)
                    except XenAPI.Failure, f:
                        if f.details[0] == 'SR_OPERATION_NOT_SUPPORTED':
                            raise CommandError(
                                'Cannot create snapshot of vm %s (try backup in halted state, or detach disks, that do not support snapshots)'
                                % vm_name)
                        else:
                            raise
                    uuid = session.xenapi.VM.get_uuid(tt_id)
                    restore_actions.append(
                        lambda: uninstall_VM(session, tt_id))
                    log.debug('Made snapshot of %s(%s) to snapshot uuid: %s',
                              vm_name, vm_uuid, uuid)
                else:
                    log.debug('Shutting down VM')
                    session.xenapi.VM.clean_shutdown(vm_id)

                    def restart_vm():
                        session.xenapi.VM.start(vm_id, False, False)
                        log.debug('Started VM')

                    restore_actions.append(restart_vm)

            sid = session._session
            rack = storage.get_rack_for(vm_name, vm_uuid)
            log.info('Starting backup for VM %s (uuid=%s) on server %s',
                     vm_name, vm_uuid, host['name'])
            progress = None
            with Client(unsecure(host['url'], insecure)) as c:
                params = {'session_id': sid, 'uuid': uuid}
                if compress_on_server:
                    params['use_compression'] = "true"
                resp = c.get('/export', params)
                task_id = resp.getheader('task-id')
                restore_actions.append(lambda: cancel_task(session, task_id))
                if show_progress:
                    log.debug("Starting progress monitor")
                    progress = ProgressMonitor(session, task_id)
                    progress.start()
                s = rack.create_slot()
                writer = s.get_writer()
                bufsize = 65536  # 64k is enough - around this size got best performance
                while True:
                    data = resp.read(bufsize)
                    if not data: break
                    writer.write(data)
                s.close()  # close only if finished
            if progress:
                progress.join(10)
                if progress.is_alive():
                    log.warn('Task did not finished')
                else:
                    if progress.error:
                        msg = 'Export failed: %s' % progress.result
                        log.error(msg)
                        print >> sys.stderr, msg
                progress.stop()
            rack.shrink()
Example #5
0
    def backup(self,
               session,
               vm_id,
               vm_name,
               host,
               storage,
               force_shutdown=False,
               show_progress=False):
        uuid = session.xenapi.VM.get_uuid(vm_id)  # @ReservedAssignment
        state = session.xenapi.VM.get_power_state(vm_id)
        restore_actions = []
        try:

            if state == 'Paused':
                log.error('Cannot backup VM is state Paused')
                return
            elif state == 'Suspended':
                log.warn('Backing up machine in suspended stated')
            elif state == 'Running':
                if not force_shutdown:
                    try:
                        tt_id = session.xenapi.VM.snapshot(
                            vm_id, 'Temp.backup of %s' % vm_name)
                    except XenAPI.Failure, f:
                        if f.details[0] == 'SR_OPERATION_NOT_SUPPORTED':
                            raise CommandError(
                                'Cannot create snapshot of vm %s (try backup in halted state, or detach disks, that do not support snapshots)'
                                % vm_name)
                        else:
                            raise
                    uuid = session.xenapi.VM.get_uuid(tt_id)
                    restore_actions.append(
                        lambda: uninstall_VM(session, tt_id))
                    log.debug('Made snapshot of %s to uuid: %s', vm_name, uuid)
                else:
                    log.debug('Shutting down VM')
                    session.xenapi.VM.clean_shutdown(vm_id)
                    restore_actions.append(
                        lambda: session.xenapi.VM.start(vm_id, False, False))

            sid = session._session
            rack = storage.get_rack_for(vm_name)
            log.info('Starting backup for VM %s (uuid=%s) on server %s',
                     vm_name, uuid, host['name'])
            progress = None
            with Client(host['url']) as c:
                resp = c.get('/export', {'session_id': sid, 'uuid': uuid})
                task_id = resp.getheader('task-id')
                restore_actions.append(lambda: cancel_task(session, task_id))
                if show_progress:
                    log.debug("Starting progress monitor")
                    progress = ProgressMonitor(session, task_id)
                    progress.start()
                s = rack.create_slot()
                writer = s.get_writer()
                bufsize = 1048576
                while True:
                    data = resp.read(bufsize)
                    if not data: break
                    writer.write(data)
                s.close()  # close only if finished
            if progress:
                progress.stop()
            rack.shrink()