Skip to content

Commit e7fecd5

Browse files
committed
feat(pegboard): add pegboard runner config for normal runners & runner metadata (#3150)
1 parent 7ec41dc commit e7fecd5

File tree

20 files changed

+508
-261
lines changed

20 files changed

+508
-261
lines changed

out/openapi.json

Lines changed: 44 additions & 70 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/common/api-types/src/namespaces/runner_configs.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,18 @@ use std::collections::HashMap;
33
use gas::prelude::*;
44
use utoipa::ToSchema;
55

6+
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
7+
pub struct RunnerConfig {
8+
#[serde(flatten)]
9+
pub kind: RunnerConfigKind,
10+
#[serde(default, skip_serializing_if = "Option::is_none")]
11+
pub metadata: Option<serde_json::Value>,
12+
}
13+
614
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
715
#[serde(rename_all = "snake_case")]
8-
pub enum RunnerConfig {
16+
pub enum RunnerConfigKind {
17+
Normal {},
918
Serverless {
1019
url: String,
1120
headers: Option<HashMap<String, String>>,
@@ -20,16 +29,18 @@ pub enum RunnerConfig {
2029

2130
impl Into<rivet_types::runner_configs::RunnerConfig> for RunnerConfig {
2231
fn into(self) -> rivet_types::runner_configs::RunnerConfig {
23-
match self {
24-
RunnerConfig::Serverless {
32+
let RunnerConfig { kind, metadata } = self;
33+
let kind = match kind {
34+
RunnerConfigKind::Normal {} => rivet_types::runner_configs::RunnerConfigKind::Normal {},
35+
RunnerConfigKind::Serverless {
2536
url,
2637
headers,
2738
request_lifespan,
2839
slots_per_runner,
2940
min_runners,
3041
max_runners,
3142
runners_margin,
32-
} => rivet_types::runner_configs::RunnerConfig::Serverless {
43+
} => rivet_types::runner_configs::RunnerConfigKind::Serverless {
3344
url,
3445
headers: headers.unwrap_or_default(),
3546
request_lifespan,
@@ -38,6 +49,7 @@ impl Into<rivet_types::runner_configs::RunnerConfig> for RunnerConfig {
3849
max_runners,
3950
runners_margin: runners_margin.unwrap_or_default(),
4051
},
41-
}
52+
};
53+
rivet_types::runner_configs::RunnerConfig { kind, metadata }
4254
}
4355
}

packages/common/types/src/keys/namespace/runner_config.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ use utoipa::ToSchema;
55
#[serde(rename_all = "snake_case")]
66
pub enum RunnerConfigVariant {
77
Serverless = 0,
8+
Normal = 1,
89
}
910

1011
impl RunnerConfigVariant {
1112
pub fn parse(v: &str) -> Option<Self> {
1213
match v {
1314
"serverless" => Some(RunnerConfigVariant::Serverless),
15+
"normal" => Some(RunnerConfigVariant::Normal),
1416
_ => None,
1517
}
1618
}
@@ -20,6 +22,7 @@ impl std::fmt::Display for RunnerConfigVariant {
2022
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2123
match self {
2224
RunnerConfigVariant::Serverless => write!(f, "serverless"),
25+
RunnerConfigVariant::Normal => write!(f, "normal"),
2326
}
2427
}
2528
}

packages/common/types/src/runner_configs.rs

Lines changed: 56 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,18 @@ use std::collections::HashMap;
33
use gas::prelude::*;
44
use utoipa::ToSchema;
55

6+
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
7+
pub struct RunnerConfig {
8+
#[serde(flatten)]
9+
pub kind: RunnerConfigKind,
10+
#[serde(default, skip_serializing_if = "Option::is_none")]
11+
pub metadata: Option<serde_json::Value>,
12+
}
13+
614
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
715
#[serde(rename_all = "snake_case")]
8-
pub enum RunnerConfig {
16+
pub enum RunnerConfigKind {
17+
Normal {},
918
Serverless {
1019
url: String,
1120
headers: HashMap<String, String>,
@@ -18,46 +27,70 @@ pub enum RunnerConfig {
1827
},
1928
}
2029

21-
impl From<RunnerConfig> for rivet_data::generated::namespace_runner_config_v1::Data {
30+
impl From<RunnerConfig> for rivet_data::generated::namespace_runner_config_v2::RunnerConfig {
2231
fn from(value: RunnerConfig) -> Self {
23-
match value {
24-
RunnerConfig::Serverless {
25-
url,
26-
headers,
27-
request_lifespan,
28-
slots_per_runner,
29-
min_runners,
30-
max_runners,
31-
runners_margin,
32-
} => rivet_data::generated::namespace_runner_config_v1::Data::Serverless(
33-
rivet_data::generated::namespace_runner_config_v1::Serverless {
32+
let RunnerConfig { kind, metadata } = value;
33+
rivet_data::generated::namespace_runner_config_v2::RunnerConfig {
34+
metadata: metadata.and_then(|value| serde_json::to_string(&value).ok()),
35+
kind: match kind {
36+
RunnerConfigKind::Normal {} => {
37+
rivet_data::generated::namespace_runner_config_v2::RunnerConfigKind::Normal
38+
}
39+
RunnerConfigKind::Serverless {
3440
url,
35-
headers: headers.into(),
41+
headers,
3642
request_lifespan,
3743
slots_per_runner,
3844
min_runners,
3945
max_runners,
4046
runners_margin,
41-
},
42-
),
47+
} => {
48+
rivet_data::generated::namespace_runner_config_v2::RunnerConfigKind::Serverless(
49+
rivet_data::generated::namespace_runner_config_v2::Serverless {
50+
url,
51+
headers: headers.into(),
52+
request_lifespan,
53+
slots_per_runner,
54+
min_runners,
55+
max_runners,
56+
runners_margin,
57+
},
58+
)
59+
}
60+
},
4361
}
4462
}
4563
}
4664

47-
impl From<rivet_data::generated::namespace_runner_config_v1::Data> for RunnerConfig {
48-
fn from(value: rivet_data::generated::namespace_runner_config_v1::Data) -> Self {
49-
match value {
50-
rivet_data::generated::namespace_runner_config_v1::Data::Serverless(o) => {
51-
RunnerConfig::Serverless {
65+
impl From<rivet_data::generated::namespace_runner_config_v2::RunnerConfig> for RunnerConfig {
66+
fn from(value: rivet_data::generated::namespace_runner_config_v2::RunnerConfig) -> Self {
67+
let rivet_data::generated::namespace_runner_config_v2::RunnerConfig { metadata, kind } =
68+
value;
69+
RunnerConfig {
70+
metadata: metadata.and_then(|raw| serde_json::from_str(&raw).ok()),
71+
kind: match kind {
72+
rivet_data::generated::namespace_runner_config_v2::RunnerConfigKind::Normal => {
73+
RunnerConfigKind::Normal {}
74+
}
75+
rivet_data::generated::namespace_runner_config_v2::RunnerConfigKind::Serverless(
76+
o,
77+
) => RunnerConfigKind::Serverless {
5278
url: o.url,
5379
headers: o.headers.into(),
5480
request_lifespan: o.request_lifespan,
5581
slots_per_runner: o.slots_per_runner,
5682
min_runners: o.min_runners,
5783
max_runners: o.max_runners,
5884
runners_margin: o.runners_margin,
59-
}
60-
}
85+
},
86+
},
6187
}
6288
}
6389
}
90+
91+
impl RunnerConfig {
92+
/// If updates to this run config affects the autoscaler.
93+
pub fn affects_autoscaler(&self) -> bool {
94+
matches!(self.kind, RunnerConfigKind::Serverless { .. })
95+
}
96+
}

packages/core/pegboard-serverless/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use pegboard::keys;
1515
use reqwest::header::{HeaderName, HeaderValue};
1616
use reqwest_eventsource as sse;
1717
use rivet_runner_protocol as protocol;
18-
use rivet_types::runner_configs::RunnerConfig;
18+
use rivet_types::runner_configs::{RunnerConfig, RunnerConfigKind};
1919
use tokio::{sync::oneshot, task::JoinHandle, time::Duration};
2020
use universaldb::options::StreamingMode;
2121
use universaldb::utils::IsolationLevel::*;
@@ -119,15 +119,15 @@ async fn tick(
119119
let namespace = namespace.first().context("runner namespace not found")?;
120120
let namespace_name = &namespace.name;
121121

122-
let RunnerConfig::Serverless {
122+
let RunnerConfigKind::Serverless {
123123
url,
124124
headers,
125125
request_lifespan,
126126
slots_per_runner,
127127
min_runners,
128128
max_runners,
129129
runners_margin,
130-
} = &runner_config.config
130+
} = &runner_config.config.kind
131131
else {
132132
tracing::warn!(
133133
?ns_id,

0 commit comments

Comments
 (0)