'Run a list of test suites on a particular kernel.
Poll for them to complete, and return whether they worked or not.
:param pairings: List of MachineTestPairing objects to invoke.
:param kernel: Name of the kernel to run.
:param kernel_label: Label (string) of the kernel to run such as
\'<kernel-version> : <config> : <date>\'
If any pairing object has its job_label attribute set it
will override this value for that particular job.
:param kernel_cmdline: The command line to boot the kernel(s) with.
:param wait: boolean - Wait for the results to come back?
:param poll_interval: Interval between polling for job results (in mins)
:param email_from: Send notification email upon completion from here.
:param email_from: Send notification email upon completion to here.'

def run_test_suites(self, pairings, kernel, kernel_label=None, priority='Medium', wait=True, poll_interval=10, email_from=None, email_to=None, timeout=168, max_runtime_hrs=168, kernel_cmdline=None):

    jobs = []
    for pairing in pairings:
        try:
            new_job = self.invoke_test(pairing, kernel, kernel_label, priority, timeout=timeout, kernel_cmdline=kernel_cmdline, max_runtime_hrs=max_runtime_hrs)
            if (not new_job):
                continue
            jobs.append(new_job)
        except Exception as e:
            traceback.print_exc()
    if ((not wait) or (not jobs)):
        return
    tko = TKO()
    while True:
        time.sleep((60 * poll_interval))
        result = self.poll_all_jobs(tko, jobs, email_from, email_to)
        if (result is not None):
            return result
