def wait_till_job_ready(self):
     event = get_event_by_condition(self.main_vm,
                                    'BLOCK_JOB_READY',
                                    self.params.get_numeric(
                                        'job_ready_timeout', 120),
                                    device=self._jobs[0])
     if event is None:
         self.test.fail('Job failed to reach ready state')
 def cancel_job(self):
     self.main_vm.monitor.cmd("job-cancel", {'id': self._jobs[0]})
     event = get_event_by_condition(self.main_vm,
                                    'BLOCK_JOB_CANCELLED',
                                    self.params.get_numeric(
                                        'job_cancelled_timeout', 60),
                                    device=self._jobs[0])
     if event is None:
         self.test.fail('Job failed to cancel')
Example #3
0
    def check_io_error_event(self):
        event = get_event_by_condition(
            self.main_vm, 'BLOCK_IO_ERROR',
            self.params.get_numeric('event_timeout', 30))

        if event:
            if event['data'].get('reason') != self.params['error_msg']:
                self.test.fail('Unexpected error')
        else:
            self.test.fail('Failed to get BLOCK_IO_ERROR event')
Example #4
0
 def check_no_space_error(self):
     # check 'error' message in BLOCK_JOB_COMPLETED event
     tmo = self.params.get_numeric('job_complete_timeout', 900)
     event = get_event_by_condition(self.main_vm, BLOCK_JOB_COMPLETED_EVENT,
                                    tmo)
     if event:
         if event['data'].get('error') != self.params['error_msg']:
             self.test.fail('Unexpected error: %s' %
                            event['data'].get('error'))
     else:
         self.test.fail('Failed to get BLOCK_JOB_COMPLETED event')
 def check_no_space_error(self):
     tmo = self.params.get_numeric('job_completed_timeout', 360)
     cond = {'device': self.inc_job_id}
     event = get_event_by_condition(self.main_vm, BLOCK_JOB_COMPLETED_EVENT,
                                    tmo, **cond)
     if event:
         if event['data'].get('error') != self.params['error_msg']:
             self.test.fail('Unexpected error: %s' %
                            event['data'].get('error'))
     else:
         self.test.fail('Failed to get BLOCK_JOB_COMPLETED event')
    def verify_job_status(self):
        tmo = self.params.get_numeric('job_completed_timeout', 30)

        # check offset/len in BLOCK_JOB_COMPLETED event
        cond = {'device': self._job}
        event = job_utils.get_event_by_condition(
            self.main_vm, job_utils.BLOCK_JOB_COMPLETED_EVENT, tmo, **cond)
        if event:
            if event['data'].get('offset') != 0 or event['data'].get('len') != 0:
                self.test.fail('offset and len should always be 0')
        else:
            self.test.fail('Failed to get BLOCK_JOB_COMPLETED event for %s'
                           % self._job)
 def check_second_job_no_space_error(self):
     """
     We always get the 'no enough space' error for the 2nd job
     """
     tmo = self.params.get_numeric('job_completed_timeout', 360)
     cond = {'device': self._job_ids[1]}
     event = get_event_by_condition(self.main_vm, 'BLOCK_JOB_COMPLETED',
                                    tmo, **cond)
     if event:
         if event['data'].get('error') != self.params['error_msg']:
             self.test.fail('Unexpected error: %s' % event['data']['error'])
     else:
         self.test.fail('Failed to get BLOCK_JOB_COMPLETED event')
    def check_no_space_error(self):
        tmo = self.params.get_numeric('block_io_error_timeout', 60)

        # check 'error' message in BLOCK_JOB_COMPLETED event
        cond = {'device': self._job}
        event = job_utils.get_event_by_condition(
            self.main_vm, job_utils.BLOCK_JOB_COMPLETED_EVENT, tmo, **cond)
        if event:
            if event['data'].get('error') != self.params['error_msg']:
                self.test.fail('Unexpected error: %s' %
                               event['data'].get('error'))
        else:
            self.test.fail('Failed to get BLOCK_JOB_COMPLETED event for %s' %
                           self._job)
    def check_job_error_event(self):
        """
        Check if BLOCK_JOB_ERROR can be received, then clear all
        """
        tmo = self.params.get_numeric('job_error_timeout', 120)
        event = job_utils.get_event_by_condition(
            self.main_vm,
            job_utils.BLOCK_JOB_ERROR_EVENT,
            tmo,
            device=self._job,
            action='ignore')

        if not event:
            self.test.fail('Failed to get BLOCK_JOB_ERROR event for %s in %s' %
                           (self._job, tmo))
        self.main_vm.monitor.clear_event(job_utils.BLOCK_JOB_ERROR_EVENT)
Example #10
0
 def wait_till_export_removed(self):
     """
     When we remove an export with block-export-del, the export may still
     stay around after this command returns, BLOCK_EXPORT_DELETED will be
     emitted when a block export is removed and its id can be reused.
     """
     if self._export_uid is not None:
         cond = {'id': self._export_uid}
         tmo = self._image_params.get_numeric('block_export_del_timeout',
                                              60)
         event = get_event_by_condition(self._vm, 'BLOCK_EXPORT_DELETED',
                                        tmo, **cond)
         if event is None:
             raise exceptions.TestFail(
                 'Failed to receive BLOCK_EXPORT_DELETED')
         self._export_uid = None
    def check_first_job_status(self):
        """
        when completion-mode is
            grouped: the 1st job should be cancelled
            default: the 1st job should complete without any error
        """
        job_event = 'BLOCK_JOB_CANCELLED' if self.params.get(
            "completion_mode") == "grouped" else 'BLOCK_JOB_COMPLETED'
        tmo = self.params.get_numeric('job_completed_timeout', 360)
        cond = {'device': self._job_ids[0]}
        event = get_event_by_condition(self.main_vm, job_event, tmo, **cond)

        if event:
            if event['data'].get('error'):
                self.test.fail('Unexpected error: %s' % event['data']['error'])
        else:
            self.test.fail('Failed to get %s for the first job' % job_event)
Example #12
0
 def commit_snapshots(self):
     device = self.params.get("device_tag")
     device_params = self.params.object_params(device)
     snapshot_tags = device_params["snapshot_tags"].split()
     self.device_node = self.get_node_name(device)
     options = ["speed", "auto-finalize", "auto-dismiss"]
     arguments = self.params.copy_from_keys(options)
     arguments["speed"] = self.params["commit_speed"]
     arguments["auto-finalize"] = self.params.get_boolean("finalize")
     arguments["auto-dismiss"] = self.params.get_boolean("dismiss")
     device = self.get_node_name(snapshot_tags[-1])
     commit_cmd = backup_utils.block_commit_qmp_cmd
     cmd, args = commit_cmd(device, **arguments)
     self.main_vm.monitor.cmd(cmd, args)
     job_id = args.get("job-id", device)
     self.main_vm.monitor.cmd("block-job-set-speed", {
         'device': job_id,
         'speed': 10240
     })
     self.commit_op("stop")
     self.commit_op("cont")
     self.commit_op("job-pause", {'id': job_id})
     self.commit_op("job-resume", {'id': job_id})
     self.commit_op("job-cancel", {'id': job_id})
     event = job_utils.get_event_by_condition(self.main_vm,
                                              'BLOCK_JOB_CANCELLED',
                                              self.params.get_numeric(
                                                  'job_cancelled_timeout',
                                                  60),
                                              device=job_id)
     if event is None:
         self.test.fail('Job failed to cancel')
     if not self.params.get_boolean("dismiss"):
         self.commit_op("job-dismiss", {'id': job_id})
     self.main_vm.monitor.cmd(cmd, args)
     self.main_vm.monitor.cmd("block-job-set-speed", {
         'device': job_id,
         'speed': 0
     })
     job_utils.wait_until_block_job_completed(self.main_vm, job_id)
 def commit_snapshots(self):
     device = self.params.get("device_tag")
     device_params = self.params.object_params(device)
     snapshot_tags = device_params["snapshot_tags"].split()
     self.device_node = self.get_node_name(device)
     device = self.get_node_name(snapshot_tags[-1])
     commit_cmd = backup_utils.block_commit_qmp_cmd
     cmd, args = commit_cmd(device)
     self.main_vm.monitor.cmd(cmd, args)
     job_id = args.get("job-id", device)
     job_utils.wait_until_job_status_match(self.main_vm,
                                           "ready",
                                           job_id,
                                           timeout=120)
     self.main_vm.monitor.cmd("job-pause", {"id": job_id})
     if not job_utils.is_block_job_paused(self.main_vm, job_id):
         self.test.fail("Block job is not paused")
     self.main_vm.monitor.cmd("job-complete", {"id": job_id})
     self.main_vm.monitor.cmd("job-resume", {"id": job_id})
     if not job_utils.get_event_by_condition(self.main_vm,
                                             "BLOCK_JOB_COMPLETED"):
         self.test.fail("Block backup job not finished")
 def do_test(self):
     self.snapshot_test()
     self.blockdev_stream()
     job_utils.check_block_jobs_started(
         self.main_vm, [self._job],
         self.params.get_numeric('job_started_timeout', 30))
     self.main_vm.monitor.cmd("job-pause", {'id': self._job})
     job_utils.check_block_jobs_paused(
         self.main_vm, [self._job],
         self.params.get_numeric('job_paused_interval', 30))
     self.main_vm.monitor.cmd(
         "block-job-set-speed", {
             'device': self._job,
             'speed': self.params.get_numeric('resume_speed')
         })
     self.main_vm.monitor.cmd("job-resume", {'id': self._job})
     job_utils.check_block_jobs_running(
         self.main_vm, [self._job],
         self.params.get_numeric('job_running_timeout', 300))
     self.main_vm.monitor.cmd("job-cancel", {'id': self._job})
     event = job_utils.get_event_by_condition(self.main_vm,
                                              'BLOCK_JOB_CANCELLED',
                                              self.params.get_numeric(
                                                  'job_cancelled_timeout',
                                                  30),
                                              device=self._job)
     if not event:
         self.test.fail('Failed to get BLOCK_JOB_CANCELLED event for %s' %
                        self._job)
     job_utils.block_job_dismiss(self.main_vm, self._job)
     self._stream_options['speed'] = 0
     self.blockdev_stream()
     self.wait_stream_job_completed()
     self.check_backing_file()
     self.clone_vm.create()
     self.mount_data_disks()
     self.verify_data_file()
Example #15
0
 def wait_block_io_error(self):
     event = get_event_by_condition(
         self.main_vm, 'BLOCK_IO_ERROR',
         self.params.get_numeric('event_timeout', 30))
     if event is None:
         self.test.fail('Failed to get BLOCK_IO_ERROR event')
Example #16
0
 def check_vm_reset_event(self):
     tmo = self.params.get_numeric('vm_reset_timeout', 60)
     if get_event_by_condition(self.main_vm, 'RESET', tmo) is None:
         self.test.fail('Failed to reset VM after triggering crash')