2021-05-27 11:46:30 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
2022-04-27 14:24:48 +02:00
|
|
|
namespace App\Repository;
|
2021-05-27 11:46:30 +02:00
|
|
|
|
|
|
|
|
2022-04-28 16:25:34 +02:00
|
|
|
use App\Entity\Job;
|
2022-05-19 15:48:06 +02:00
|
|
|
use App\Entity\Run;
|
2021-07-16 14:31:18 +02:00
|
|
|
use Doctrine\DBAL\Exception;
|
2022-04-27 14:24:48 +02:00
|
|
|
use Doctrine\ORM\EntityRepository;
|
2021-05-27 11:46:30 +02:00
|
|
|
|
2022-04-27 14:24:48 +02:00
|
|
|
class RunRepository extends EntityRepository
|
2021-05-27 11:46:30 +02:00
|
|
|
{
|
2021-06-01 13:45:57 +02:00
|
|
|
const FAILED = 'F';
|
|
|
|
const SUCCESS = 'S';
|
|
|
|
const MANUAL = 'M';
|
|
|
|
|
2022-05-19 20:25:05 +02:00
|
|
|
public function getRunsForJob(Job $job, bool $onlyfailed = false, int $maxage = NULL, bool $ordered = true): array
|
2021-05-27 11:46:30 +02:00
|
|
|
{
|
2022-05-17 16:06:46 +02:00
|
|
|
$qb = $this->createQueryBuilder('run');
|
|
|
|
$runs = $qb
|
|
|
|
->where('run.job = :job')
|
|
|
|
->setParameter(':job', $job);
|
|
|
|
|
2021-08-02 14:41:11 +02:00
|
|
|
if ($onlyfailed) {
|
2022-05-17 16:06:46 +02:00
|
|
|
$runs = $runs->andWhere('run.flags LIKE :flags')->setParameter(':flags', '%' . RunRepository::FAILED . '%');
|
2021-05-27 11:46:30 +02:00
|
|
|
}
|
2021-08-03 17:23:41 +02:00
|
|
|
if($maxage !== NULL) {
|
2022-05-17 16:06:46 +02:00
|
|
|
$runs = $runs->andWhere('run.timestamp > :timestamp')->setParameter(':timestamp', time() - ($maxage * 24 * 60 * 60));
|
2021-08-03 17:23:41 +02:00
|
|
|
}
|
2022-05-17 16:06:46 +02:00
|
|
|
if ($ordered) $runs->orderBy('run.timestamp', 'DESC');
|
|
|
|
return $runs->getQuery()->getResult();
|
2021-05-27 11:46:30 +02:00
|
|
|
}
|
2021-06-01 13:45:57 +02:00
|
|
|
|
2022-05-19 15:48:06 +02:00
|
|
|
public function addRun(Job $job, string $exitcode, int $starttime, float $runtime, string $output, array $flags): void
|
2021-06-01 13:45:57 +02:00
|
|
|
{
|
2022-05-19 15:48:06 +02:00
|
|
|
$em = $this->getEntityManager();
|
|
|
|
|
|
|
|
$run = new Run();
|
|
|
|
$run
|
|
|
|
->setJob($job)
|
|
|
|
->setExitcode($exitcode)
|
|
|
|
->setTimestamp($starttime)
|
|
|
|
->setRuntime($runtime)
|
|
|
|
->setOutput($output)
|
|
|
|
->setFlags(implode($flags));
|
|
|
|
$em->persist($run);
|
|
|
|
$em->flush();
|
2021-06-01 13:45:57 +02:00
|
|
|
}
|
2021-06-01 17:41:10 +02:00
|
|
|
|
2022-05-19 15:48:06 +02:00
|
|
|
public function getLastRun(Job $job): array
|
2021-06-01 17:41:10 +02:00
|
|
|
{
|
2022-05-19 15:48:06 +02:00
|
|
|
$em = $this->getEntityManager();
|
|
|
|
$qb = $this->createQueryBuilder('run');
|
|
|
|
|
|
|
|
$lastrun = $qb
|
|
|
|
->where('run.job = :job')
|
|
|
|
->orderBy('run.timestamp', 'DESC')
|
|
|
|
->setParameter(':job', $job)
|
|
|
|
->getQuery()->getFirstResult();
|
|
|
|
|
|
|
|
return $lastrun;
|
2021-06-01 17:41:10 +02:00
|
|
|
}
|
|
|
|
|
2022-05-19 15:48:06 +02:00
|
|
|
public function isSlowJob(Job $job, int $timelimit = 5): bool
|
2021-06-01 17:41:10 +02:00
|
|
|
{
|
2022-05-19 15:48:06 +02:00
|
|
|
$qb = $this->createQueryBuilder('run');
|
|
|
|
|
|
|
|
$slowJob = $qb
|
|
|
|
->select('AVG(run.runtime) AS average')
|
|
|
|
->where('run.job = :job')
|
|
|
|
->setMaxResults(5)
|
|
|
|
->setParameter(':job', $job)
|
|
|
|
->getQuery()->getArrayResult();
|
|
|
|
|
|
|
|
return $slowJob[0]['average'] > $timelimit;
|
2021-06-01 17:41:10 +02:00
|
|
|
}
|
2021-07-16 14:31:18 +02:00
|
|
|
|
2021-07-20 16:29:03 +02:00
|
|
|
public function cleanupRuns(array $jobids, int $maxage = NULL): int
|
2021-07-16 14:31:18 +02:00
|
|
|
{
|
2022-05-19 15:48:06 +02:00
|
|
|
$em = $this->getEntityManager();
|
|
|
|
$jobRepo = $em->getRepository(Job::class);
|
|
|
|
$allJobs = [];
|
|
|
|
|
2021-07-20 16:29:03 +02:00
|
|
|
if(empty($jobids)) {
|
2022-05-19 15:48:06 +02:00
|
|
|
$allJobs = $jobRepo->getAllJobs(true);
|
2021-07-20 16:29:03 +02:00
|
|
|
foreach($allJobs as $key=>$job) {
|
|
|
|
$jobids[] = $key;
|
2021-07-16 14:31:18 +02:00
|
|
|
}
|
2022-05-19 15:48:06 +02:00
|
|
|
} else {
|
|
|
|
foreach($jobids as $jobid) {
|
2022-05-19 20:25:05 +02:00
|
|
|
$job = $jobRepo->find($jobid);
|
2022-05-19 15:48:06 +02:00
|
|
|
$allJobs[] = $job;
|
|
|
|
}
|
2021-07-16 14:31:18 +02:00
|
|
|
}
|
2022-05-19 15:48:06 +02:00
|
|
|
$qb = $this->createQueryBuilder('run');
|
|
|
|
$delete = $qb->delete();
|
2021-07-20 16:29:03 +02:00
|
|
|
if($maxage == NULL) {
|
|
|
|
foreach ($allJobs as $key=>$job) {
|
2022-05-14 11:44:16 +02:00
|
|
|
$jobData = $job->getData();
|
|
|
|
if(isset($jobData['retention']) && in_array($key, $jobids)) {
|
2022-05-19 15:48:06 +02:00
|
|
|
$delete = $delete
|
|
|
|
->orWhere(
|
|
|
|
$qb->expr()->andX(
|
|
|
|
$qb->expr()->eq('run.job', ':job' . $key),
|
|
|
|
$qb->expr()->lt('run.timestamp', ':timestamp' . $key)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
->setParameter(':job' . $key, $job)
|
|
|
|
->setParameter(':timestamp' . $key, time() - ($jobData['retention'] * 24 * 60 * 60));
|
2021-07-20 16:29:03 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if(!empty($jobids)) {
|
2022-05-19 15:48:06 +02:00
|
|
|
$jobexpr = $qb->expr()->orX();
|
|
|
|
foreach($allJobs as $key=>$job){
|
|
|
|
$jobexpr->add('run.job = :job' . $key);
|
|
|
|
$delete = $delete->setParameter(':job' . $key, $job);
|
2021-07-20 16:29:03 +02:00
|
|
|
}
|
2022-05-19 15:48:06 +02:00
|
|
|
$delete = $delete
|
|
|
|
->where($jobexpr);
|
2021-07-20 16:29:03 +02:00
|
|
|
}
|
2022-05-19 15:48:06 +02:00
|
|
|
$delete = $delete
|
|
|
|
->andWhere('run.timestamp < :timestamp')
|
|
|
|
->setParameter(':timestamp', time() - ($maxage * 24 * 60 * 60));
|
2021-07-16 14:31:18 +02:00
|
|
|
}
|
2022-05-19 15:48:06 +02:00
|
|
|
return $delete->getQuery()->execute();
|
2021-07-16 14:31:18 +02:00
|
|
|
}
|
2021-05-27 11:46:30 +02:00
|
|
|
}
|