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()
params = {'session_id': sid, 'task_id': task_id} if srid: params['sr_id'] = srid if restore: params['restore'] = restore log.debug('PUT with following params: %s', params) _resp = c.put('/import', slot.get_reader(), slot.size_uncompressed, params) log.info( 'Finished import of VM %s', vm_name, ) if progress: progress.join(300) if progress.is_alive(): log.warn('Task did not finished') else: if progress.error: msg = 'Import failed: %s' % progress.result log.error(msg) print >> sys.stderr, msg else: res = progress.result m = re.search(r'<value>(OpaqueRef:[^<]+)</value>', res) if m: vm_id = m.group(1) try: vm_uuid = session.xenapi.VM.get_uuid(vm_id)
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()