Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 44 additions & 70 deletions out/openapi.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 16 additions & 6 deletions packages/common/api-types/src/namespaces/runner_configs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,17 @@ use std::collections::HashMap;
use gas::prelude::*;
use utoipa::ToSchema;

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct RunnerConfig {
#[serde(flatten)]
pub kind: RunnerConfigKind,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
#[serde(rename_all = "snake_case")]
pub enum RunnerConfig {
pub enum RunnerConfigKind {
Normal {},
Serverless {
url: String,
Expand All @@ -21,17 +29,18 @@ pub enum RunnerConfig {

impl Into<rivet_types::runner_configs::RunnerConfig> for RunnerConfig {
fn into(self) -> rivet_types::runner_configs::RunnerConfig {
match self {
RunnerConfig::Normal {} => rivet_types::runner_configs::RunnerConfig::Normal {},
RunnerConfig::Serverless {
let RunnerConfig { kind, metadata } = self;
let kind = match kind {
RunnerConfigKind::Normal {} => rivet_types::runner_configs::RunnerConfigKind::Normal {},
RunnerConfigKind::Serverless {
url,
headers,
request_lifespan,
slots_per_runner,
min_runners,
max_runners,
runners_margin,
} => rivet_types::runner_configs::RunnerConfig::Serverless {
} => rivet_types::runner_configs::RunnerConfigKind::Serverless {
url,
headers: headers.unwrap_or_default(),
request_lifespan,
Expand All @@ -40,6 +49,7 @@ impl Into<rivet_types::runner_configs::RunnerConfig> for RunnerConfig {
max_runners,
runners_margin: runners_margin.unwrap_or_default(),
},
}
};
rivet_types::runner_configs::RunnerConfig { kind, metadata }
}
}
14 changes: 7 additions & 7 deletions packages/common/config/src/config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -167,13 +167,13 @@ impl Root {

pub fn validate_and_set_defaults(&mut self) -> Result<()> {
// Set default pubsub to Postgres if configured for database
if self.pubsub.is_none()
&& let Some(Database::Postgres(pg)) = &self.database
{
self.pubsub = Some(PubSub::PostgresNotify(pubsub::Postgres {
url: pg.url.clone(),
memory_optimization: true,
}));
if self.pubsub.is_none() {
if let Some(Database::Postgres(pg)) = &self.database {
self.pubsub = Some(PubSub::PostgresNotify(pubsub::Postgres {
url: pg.url.clone(),
memory_optimization: true,
}));
}
}

Ok(())
Expand Down
114 changes: 89 additions & 25 deletions packages/common/types/src/runner_configs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,17 @@ use std::collections::HashMap;
use gas::prelude::*;
use utoipa::ToSchema;

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct RunnerConfig {
#[serde(flatten)]
pub kind: RunnerConfigKind,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
#[serde(rename_all = "snake_case")]
pub enum RunnerConfig {
pub enum RunnerConfigKind {
Normal {},
Serverless {
url: String,
Expand All @@ -19,15 +27,74 @@ pub enum RunnerConfig {
},
}

impl From<RunnerConfig> for rivet_data::generated::namespace_runner_config_v2::RunnerConfig {
fn from(value: RunnerConfig) -> Self {
let RunnerConfig { kind, metadata } = value;
rivet_data::generated::namespace_runner_config_v2::RunnerConfig {
metadata: metadata.and_then(|value| serde_json::to_string(&value).ok()),
kind: match kind {
RunnerConfigKind::Normal {} => {
rivet_data::generated::namespace_runner_config_v2::RunnerConfigKind::Normal
}
RunnerConfigKind::Serverless {
url,
headers,
request_lifespan,
slots_per_runner,
min_runners,
max_runners,
runners_margin,
} => {
rivet_data::generated::namespace_runner_config_v2::RunnerConfigKind::Serverless(
rivet_data::generated::namespace_runner_config_v2::Serverless {
url,
headers: headers.into(),
request_lifespan,
slots_per_runner,
min_runners,
max_runners,
runners_margin,
},
)
}
},
}
}
}

impl From<rivet_data::generated::namespace_runner_config_v2::RunnerConfig> for RunnerConfig {
fn from(value: rivet_data::generated::namespace_runner_config_v2::RunnerConfig) -> Self {
let rivet_data::generated::namespace_runner_config_v2::RunnerConfig { metadata, kind } =
value;
RunnerConfig {
metadata: metadata.and_then(|raw| serde_json::from_str(&raw).ok()),
kind: match kind {
rivet_data::generated::namespace_runner_config_v2::RunnerConfigKind::Normal => {
RunnerConfigKind::Normal {}
}
rivet_data::generated::namespace_runner_config_v2::RunnerConfigKind::Serverless(
o,
) => RunnerConfigKind::Serverless {
url: o.url,
headers: o.headers.into(),
request_lifespan: o.request_lifespan,
slots_per_runner: o.slots_per_runner,
min_runners: o.min_runners,
max_runners: o.max_runners,
runners_margin: o.runners_margin,
},
},
}
}
}

impl From<RunnerConfig> for rivet_data::generated::namespace_runner_config_v1::Data {
fn from(value: RunnerConfig) -> Self {
match value {
RunnerConfig::Normal {} => {
rivet_data::generated::namespace_runner_config_v1::Data::Normal(
rivet_data::generated::namespace_runner_config_v1::Normal {},
)
match value.kind {
RunnerConfigKind::Normal { .. } => {
unreachable!("Normal runner configs do not have a v1 representation",)
}
RunnerConfig::Serverless {
RunnerConfigKind::Serverless {
url,
headers,
request_lifespan,
Expand All @@ -52,31 +119,28 @@ impl From<RunnerConfig> for rivet_data::generated::namespace_runner_config_v1::D

impl From<rivet_data::generated::namespace_runner_config_v1::Data> for RunnerConfig {
fn from(value: rivet_data::generated::namespace_runner_config_v1::Data) -> Self {
match value {
rivet_data::generated::namespace_runner_config_v1::Data::Normal(_) => {
RunnerConfig::Normal {}
}
rivet_data::generated::namespace_runner_config_v1::Data::Serverless(o) => {
RunnerConfig::Serverless {
url: o.url,
headers: o.headers.into(),
request_lifespan: o.request_lifespan,
slots_per_runner: o.slots_per_runner,
min_runners: o.min_runners,
max_runners: o.max_runners,
runners_margin: o.runners_margin,
RunnerConfig {
metadata: None,
kind: match value {
rivet_data::generated::namespace_runner_config_v1::Data::Serverless(o) => {
RunnerConfigKind::Serverless {
url: o.url,
headers: o.headers.into(),
request_lifespan: o.request_lifespan,
slots_per_runner: o.slots_per_runner,
min_runners: o.min_runners,
max_runners: o.max_runners,
runners_margin: o.runners_margin,
}
}
}
},
}
}
}

impl RunnerConfig {
/// If updates to this run config affects the autoscaler.
pub fn affects_autoscaler(&self) -> bool {
match self {
Self::Serverless { .. } => true,
Self::Normal { .. } => false,
}
matches!(self.kind, RunnerConfigKind::Serverless { .. })
}
}
Loading
Loading