Skip to main content

rebuilderd_common/api/v1/models/
queue.rs

1use crate::api::v1::{BuildStatus, Priority};
2use chrono::{DateTime, NaiveDateTime, Utc};
3#[cfg(feature = "diesel")]
4use diesel::Queryable;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Serialize, Deserialize)]
8pub struct QueueJobRequest {
9    pub distribution: Option<String>,
10    pub release: Option<String>,
11    pub component: Option<String>,
12    pub name: Option<String>,
13    pub version: Option<String>,
14    pub architecture: Option<String>,
15    pub status: Option<BuildStatus>,
16    pub priority: Option<Priority>,
17}
18
19#[derive(Debug, Serialize, Deserialize)]
20pub struct PopQueuedJobRequest {
21    pub supported_backends: Vec<String>,
22    pub architecture: String,
23    pub supported_architectures: Vec<String>,
24}
25
26#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
27#[cfg_attr(feature = "diesel", derive(Queryable))]
28#[cfg_attr(feature = "diesel", diesel(check_for_backend(diesel::sqlite::Sqlite)))]
29pub struct QueuedJob {
30    pub id: i32,
31    pub name: String,
32    pub version: String,
33    pub distribution: String,
34    pub release: Option<String>,
35    pub architecture: String,
36    pub backend: String,
37    pub url: String,
38    pub next_retry: Option<NaiveDateTime>,
39    pub priority: Priority,
40    pub queued_at: NaiveDateTime,
41    pub started_at: Option<NaiveDateTime>,
42}
43
44impl QueuedJob {
45    pub fn is_due(&self, now: DateTime<Utc>) -> bool {
46        if let Some(next_retry) = self.next_retry {
47            next_retry <= now.naive_utc()
48        } else {
49            true
50        }
51    }
52
53    pub fn running_since(&self, now: DateTime<Utc>) -> Option<chrono::TimeDelta> {
54        let started_at = self.started_at?;
55        let duration = now.naive_utc() - started_at;
56        Some(duration)
57    }
58}
59
60#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
61#[cfg_attr(feature = "diesel", derive(Queryable))]
62#[cfg_attr(feature = "diesel", diesel(check_for_backend(diesel::sqlite::Sqlite)))]
63pub struct QueuedJobArtifact {
64    pub name: String,
65    pub version: String,
66    pub architecture: String,
67    pub url: String,
68}
69
70#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
71pub struct QueuedJobWithArtifacts {
72    pub job: QueuedJob,
73    pub artifacts: Vec<QueuedJobArtifact>,
74}
75
76#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
77pub enum JobAssignment {
78    Nothing,
79    Rebuild(Box<QueuedJobWithArtifacts>),
80}