From 2e7b2c15bcf5c2c4fe0452609add14dcdd9fb301 Mon Sep 17 00:00:00 2001 From: Aiden McClelland Date: Mon, 16 May 2022 16:01:53 -0600 Subject: [PATCH] rename ActionImplementation to PackageProcedure --- backend/src/{action/mod.rs => action.rs} | 86 +--------------- backend/src/backup/mod.rs | 6 +- backend/src/config/action.rs | 6 +- backend/src/dependencies.rs | 10 +- backend/src/lib.rs | 1 + backend/src/manager/mod.rs | 10 +- backend/src/migration.rs | 6 +- backend/src/{action => procedure}/docker.rs | 4 +- backend/src/procedure/mod.rs | 104 ++++++++++++++++++++ backend/src/s9pk/manifest.rs | 6 +- backend/src/status/health_check.rs | 4 +- 11 files changed, 132 insertions(+), 111 deletions(-) rename backend/src/{action/mod.rs => action.rs} (70%) rename backend/src/{action => procedure}/docker.rs (99%) create mode 100644 backend/src/procedure/mod.rs diff --git a/backend/src/action/mod.rs b/backend/src/action.rs similarity index 70% rename from backend/src/action/mod.rs rename to backend/src/action.rs index 4fc4d3afe..b7358d394 100644 --- a/backend/src/action/mod.rs +++ b/backend/src/action.rs @@ -21,10 +21,6 @@ use crate::util::Version; use crate::volume::Volumes; use crate::{Error, ResultExt}; -pub mod docker; - -// TODO: create RPC endpoint that looks up the appropriate action and calls `execute` - #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)] pub struct ActionId = String>(Id); impl FromStr for ActionId { @@ -103,7 +99,7 @@ pub struct Action { pub description: String, #[serde(default)] pub warning: Option, - pub implementation: ActionImplementation, + pub implementation: PackageProcedure, pub allowed_statuses: IndexSet, #[serde(default)] pub input_spec: ConfigSpec, @@ -152,76 +148,6 @@ impl Action { } } -#[derive(Clone, Debug, Deserialize, Serialize, HasModel)] -#[serde(rename_all = "kebab-case")] -#[serde(tag = "type")] -pub enum ActionImplementation { - Docker(DockerAction), -} -impl ActionImplementation { - #[instrument] - pub fn validate( - &self, - volumes: &Volumes, - image_ids: &BTreeSet, - expected_io: bool, - ) -> Result<(), color_eyre::eyre::Report> { - match self { - ActionImplementation::Docker(action) => { - action.validate(volumes, image_ids, expected_io) - } - } - } - - #[instrument(skip(ctx, input))] - pub async fn execute Deserialize<'de>>( - &self, - ctx: &RpcContext, - pkg_id: &PackageId, - pkg_version: &Version, - name: Option<&str>, - volumes: &Volumes, - input: Option, - allow_inject: bool, - timeout: Option, - ) -> Result, Error> { - match self { - ActionImplementation::Docker(action) => { - action - .execute( - ctx, - pkg_id, - pkg_version, - name, - volumes, - input, - allow_inject, - timeout, - ) - .await - } - } - } - #[instrument(skip(ctx, input))] - pub async fn sandboxed Deserialize<'de>>( - &self, - ctx: &RpcContext, - pkg_id: &PackageId, - pkg_version: &Version, - volumes: &Volumes, - input: Option, - timeout: Option, - ) -> Result, Error> { - match self { - ActionImplementation::Docker(action) => { - action - .sandboxed(ctx, pkg_id, pkg_version, volumes, input, timeout) - .await - } - } - } -} - fn display_action_result(action_result: ActionResult, matches: &ArgMatches<'_>) { if matches.is_present("format") { return display_serializable(action_result, matches); @@ -278,13 +204,3 @@ pub async fn action( )) } } - -pub struct NoOutput; -impl<'de> Deserialize<'de> for NoOutput { - fn deserialize(_: D) -> Result - where - D: serde::Deserializer<'de>, - { - Ok(NoOutput) - } -} diff --git a/backend/src/backup/mod.rs b/backend/src/backup/mod.rs index 23446b7ce..72a3fa34d 100644 --- a/backend/src/backup/mod.rs +++ b/backend/src/backup/mod.rs @@ -12,12 +12,12 @@ use tokio::io::AsyncWriteExt; use tracing::instrument; use self::target::PackageBackupInfo; -use crate::action::{ActionImplementation, NoOutput}; use crate::context::RpcContext; use crate::dependencies::reconfigure_dependents_with_live_pointers; use crate::id::ImageId; use crate::install::PKG_ARCHIVE_DIR; use crate::net::interface::{InterfaceId, Interfaces}; +use crate::procedure::{NoOutput, PackageProcedure}; use crate::s9pk::manifest::PackageId; use crate::util::serde::IoFormat; use crate::util::{AtomicFile, Version}; @@ -64,8 +64,8 @@ struct BackupMetadata { #[derive(Clone, Debug, Deserialize, Serialize, HasModel)] pub struct BackupActions { - pub create: ActionImplementation, - pub restore: ActionImplementation, + pub create: PackageProcedure, + pub restore: PackageProcedure, } impl BackupActions { pub fn validate(&self, volumes: &Volumes, image_ids: &BTreeSet) -> Result<(), Error> { diff --git a/backend/src/config/action.rs b/backend/src/config/action.rs index 1dced12f8..b15df9950 100644 --- a/backend/src/config/action.rs +++ b/backend/src/config/action.rs @@ -7,10 +7,10 @@ use serde::{Deserialize, Serialize}; use tracing::instrument; use super::{Config, ConfigSpec}; -use crate::action::ActionImplementation; use crate::context::RpcContext; use crate::dependencies::Dependencies; use crate::id::ImageId; +use crate::procedure::PackageProcedure; use crate::s9pk::manifest::PackageId; use crate::status::health_check::HealthCheckId; use crate::util::Version; @@ -26,8 +26,8 @@ pub struct ConfigRes { #[derive(Clone, Debug, Deserialize, Serialize, HasModel)] pub struct ConfigActions { - pub get: ActionImplementation, - pub set: ActionImplementation, + pub get: PackageProcedure, + pub set: PackageProcedure, } impl ConfigActions { #[instrument] diff --git a/backend/src/dependencies.rs b/backend/src/dependencies.rs index 3184a2156..f9a701dd9 100644 --- a/backend/src/dependencies.rs +++ b/backend/src/dependencies.rs @@ -14,10 +14,10 @@ use rpc_toolkit::command; use serde::{Deserialize, Serialize}; use tracing::instrument; -use crate::action::{ActionImplementation, NoOutput}; +use crate::action::{NoOutput, PackageProcedure}; +use crate::config::action::{ConfigActions, ConfigRes}; use crate::config::spec::PackagePointerSpec; -use crate::config::{action::ConfigActions, Config, ConfigSpec}; -use crate::config::{action::ConfigRes, not_found, ConfigReceipts}; +use crate::config::{not_found, Config, ConfigReceipts, ConfigSpec}; use crate::context::RpcContext; use crate::db::model::{CurrentDependencyInfo, InstalledPackageDataEntry}; use crate::s9pk::manifest::{Manifest, PackageId}; @@ -486,8 +486,8 @@ impl DepInfo { #[derive(Clone, Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] pub struct DependencyConfig { - check: ActionImplementation, - auto_configure: ActionImplementation, + check: PackageProcedure, + auto_configure: PackageProcedure, } impl DependencyConfig { pub async fn check( diff --git a/backend/src/lib.rs b/backend/src/lib.rs index 61a887a9c..9b592d0f6 100644 --- a/backend/src/lib.rs +++ b/backend/src/lib.rs @@ -31,6 +31,7 @@ pub mod middleware; pub mod migration; pub mod net; pub mod notifications; +pub mod procedure; pub mod properties; pub mod s9pk; pub mod setup; diff --git a/backend/src/manager/mod.rs b/backend/src/manager/mod.rs index bc9e0e158..2da093fd8 100644 --- a/backend/src/manager/mod.rs +++ b/backend/src/manager/mod.rs @@ -19,13 +19,13 @@ use tokio::sync::{Notify, RwLock}; use torut::onion::TorSecretKeyV3; use tracing::instrument; -use crate::action::docker::DockerAction; -use crate::action::{ActionImplementation, NoOutput}; use crate::context::RpcContext; use crate::manager::sync::synchronizer; use crate::net::interface::InterfaceId; use crate::net::GeneratedCertificateMountPoint; use crate::notifications::NotificationLevel; +use crate::procedure::docker::DockerProcedure; +use crate::procedure::{NoOutput, PackageProcedure}; use crate::s9pk::manifest::{Manifest, PackageId}; use crate::status::MainStatus; use crate::util::{Container, NonDetachingJoinHandle, Version}; @@ -333,7 +333,7 @@ impl Manager { ctx, status: AtomicUsize::new(Status::Stopped as usize), on_stop, - container_name: DockerAction::container_name(&manifest.id, None), + container_name: DockerProcedure::container_name(&manifest.id, None), manifest, tor_keys, synchronized: Notify::new(), @@ -399,7 +399,7 @@ impl Manager { &self.shared.container_name, Some(StopContainerOptions { t: match &self.shared.manifest.main { - ActionImplementation::Docker(a) => a, + PackageProcedure::Docker(a) => a, } .sigterm_timeout .map(|a| *a) @@ -549,7 +549,7 @@ async fn stop(shared: &ManagerSharedState) -> Result<(), Error> { &shared.container_name, Some(StopContainerOptions { t: match &shared.manifest.main { - ActionImplementation::Docker(a) => a, + PackageProcedure::Docker(a) => a, } .sigterm_timeout .map(|a| *a) diff --git a/backend/src/migration.rs b/backend/src/migration.rs index 01d567f63..3ad4e1b33 100644 --- a/backend/src/migration.rs +++ b/backend/src/migration.rs @@ -8,9 +8,9 @@ use patch_db::HasModel; use serde::{Deserialize, Serialize}; use tracing::instrument; -use crate::action::ActionImplementation; use crate::context::RpcContext; use crate::id::ImageId; +use crate::procedure::PackageProcedure; use crate::s9pk::manifest::PackageId; use crate::util::Version; use crate::volume::Volumes; @@ -19,8 +19,8 @@ use crate::{Error, ResultExt}; #[derive(Clone, Debug, Default, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] pub struct Migrations { - pub from: IndexMap, - pub to: IndexMap, + pub from: IndexMap, + pub to: IndexMap, } impl Migrations { #[instrument] diff --git a/backend/src/action/docker.rs b/backend/src/procedure/docker.rs similarity index 99% rename from backend/src/action/docker.rs rename to backend/src/procedure/docker.rs index ca4334e7c..156358aa3 100644 --- a/backend/src/action/docker.rs +++ b/backend/src/procedure/docker.rs @@ -36,7 +36,7 @@ lazy_static::lazy_static! { #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] -pub struct DockerAction { +pub struct DockerProcedure { pub image: ImageId, #[serde(default)] pub system: bool, @@ -54,7 +54,7 @@ pub struct DockerAction { #[serde(default)] pub sigterm_timeout: Option, } -impl DockerAction { +impl DockerProcedure { pub fn validate( &self, volumes: &Volumes, diff --git a/backend/src/procedure/mod.rs b/backend/src/procedure/mod.rs new file mode 100644 index 000000000..96922d919 --- /dev/null +++ b/backend/src/procedure/mod.rs @@ -0,0 +1,104 @@ +use std::collections::{BTreeMap, BTreeSet}; +use std::path::Path; +use std::str::FromStr; +use std::time::Duration; + +use clap::ArgMatches; +use color_eyre::eyre::eyre; +use indexmap::IndexSet; +use patch_db::HasModel; +use rpc_toolkit::command; +use serde::{Deserialize, Serialize}; +use tracing::instrument; + +use self::docker::DockerProcedure; +use crate::config::{Config, ConfigSpec}; +use crate::context::RpcContext; +use crate::id::{Id, ImageId, InvalidId}; +use crate::s9pk::manifest::PackageId; +use crate::util::serde::{display_serializable, parse_stdin_deserializable, IoFormat}; +use crate::util::Version; +use crate::volume::Volumes; +use crate::{Error, ResultExt}; + +pub mod docker; + +// TODO: create RPC endpoint that looks up the appropriate action and calls `execute` + +#[derive(Clone, Debug, Deserialize, Serialize, HasModel)] +#[serde(rename_all = "kebab-case")] +#[serde(tag = "type")] +pub enum PackageProcedure { + Docker(DockerProcedure), +} +impl PackageProcedure { + #[instrument] + pub fn validate( + &self, + volumes: &Volumes, + image_ids: &BTreeSet, + expected_io: bool, + ) -> Result<(), color_eyre::eyre::Report> { + match self { + PackageProcedure::Docker(action) => action.validate(volumes, image_ids, expected_io), + } + } + + #[instrument(skip(ctx, input))] + pub async fn execute Deserialize<'de>>( + &self, + ctx: &RpcContext, + pkg_id: &PackageId, + pkg_version: &Version, + name: Option<&str>, + volumes: &Volumes, + input: Option, + allow_inject: bool, + timeout: Option, + ) -> Result, Error> { + match self { + PackageProcedure::Docker(action) => { + action + .execute( + ctx, + pkg_id, + pkg_version, + name, + volumes, + input, + allow_inject, + timeout, + ) + .await + } + } + } + #[instrument(skip(ctx, input))] + pub async fn sandboxed Deserialize<'de>>( + &self, + ctx: &RpcContext, + pkg_id: &PackageId, + pkg_version: &Version, + volumes: &Volumes, + input: Option, + timeout: Option, + ) -> Result, Error> { + match self { + PackageProcedure::Docker(action) => { + action + .sandboxed(ctx, pkg_id, pkg_version, volumes, input, timeout) + .await + } + } + } +} + +pub struct NoOutput; +impl<'de> Deserialize<'de> for NoOutput { + fn deserialize(_: D) -> Result + where + D: serde::Deserializer<'de>, + { + Ok(NoOutput) + } +} diff --git a/backend/src/s9pk/manifest.rs b/backend/src/s9pk/manifest.rs index fba540939..9406d3229 100644 --- a/backend/src/s9pk/manifest.rs +++ b/backend/src/s9pk/manifest.rs @@ -7,7 +7,7 @@ use patch_db::HasModel; use serde::{Deserialize, Serialize, Serializer}; use url::Url; -use crate::action::{ActionImplementation, Actions}; +use crate::action::{Actions, PackageProcedure}; use crate::backup::BackupActions; use crate::config::action::ConfigActions; use crate::dependencies::Dependencies; @@ -128,12 +128,12 @@ pub struct Manifest { #[serde(default)] pub alerts: Alerts, #[model] - pub main: ActionImplementation, + pub main: PackageProcedure, pub health_checks: HealthChecks, #[model] pub config: Option, #[model] - pub properties: Option, + pub properties: Option, #[model] pub volumes: Volumes, // #[serde(default)] diff --git a/backend/src/status/health_check.rs b/backend/src/status/health_check.rs index c38f08330..886623f35 100644 --- a/backend/src/status/health_check.rs +++ b/backend/src/status/health_check.rs @@ -5,7 +5,7 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Deserializer, Serialize}; use tracing::instrument; -use crate::action::{ActionImplementation, NoOutput}; +use crate::action::{NoOutput, PackageProcedure}; use crate::context::RpcContext; use crate::id::{Id, ImageId}; use crate::s9pk::manifest::PackageId; @@ -89,7 +89,7 @@ pub struct HealthCheck { pub name: String, pub success_message: Option, #[serde(flatten)] - implementation: ActionImplementation, + implementation: PackageProcedure, pub timeout: Option, } impl HealthCheck {