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()
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(
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()
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()
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()