Further fleshing out

This commit is contained in:
Ana Hobden 2022-09-20 13:11:30 -07:00
parent 8addef670d
commit 2ef7951994
5 changed files with 71 additions and 30 deletions

View file

@ -17,9 +17,9 @@ impl<'a> Actionable<'a> for ConfigureShellProfile {
fn description(&self) -> Vec<ActionDescription> { fn description(&self) -> Vec<ActionDescription> {
vec![ vec![
ActionDescription::new( ActionDescription::new(
"Start the systemd Nix daemon".to_string(), "Configure the shell profiles".to_string(),
vec![ vec![
"The `nix` command line tool communicates with a running Nix daemon managed by your init system".to_string() "Update shell profiles to import Nix".to_string()
] ]
), ),
] ]

View file

@ -28,7 +28,7 @@ impl<'a> Actionable<'a> for FetchNix {
vec![ActionDescription::new( vec![ActionDescription::new(
format!("Fetch Nix from `{url}`"), format!("Fetch Nix from `{url}`"),
vec![format!( vec![format!(
"Fetch a Nix archive and unpack it to `{}`", destination.display() "Unpack it to `{}`, so it can later be moved into the Nix store at /nix", destination.display()
)], )],
)] )]
} }

View file

@ -17,9 +17,9 @@ impl<'a> Actionable<'a> for SetupDefaultProfile {
fn description(&self) -> Vec<ActionDescription> { fn description(&self) -> Vec<ActionDescription> {
vec![ vec![
ActionDescription::new( ActionDescription::new(
"Start the systemd Nix daemon".to_string(), "Setup the default Nix profile".to_string(),
vec![ vec![
"The `nix` command line tool communicates with a running Nix daemon managed by your init system".to_string() "TODO".to_string()
] ]
), ),
] ]
@ -38,9 +38,9 @@ impl<'a> Revertable<'a> for SetupDefaultProfileReceipt {
fn description(&self) -> Vec<ActionDescription> { fn description(&self) -> Vec<ActionDescription> {
vec![ vec![
ActionDescription::new( ActionDescription::new(
"Stop the systemd Nix daemon".to_string(), "Unset the default Nix profile".to_string(),
vec![ vec![
"The `nix` command line tool communicates with a running Nix daemon managed by your init system".to_string() "TODO".to_string()
] ]
), ),
] ]

View file

@ -1,13 +1,30 @@
use tokio::task::JoinSet;
use crate::actions::base::{SetupDefaultProfile, ConfigureNixDaemonService, ConfigureShellProfile, SetupDefaultProfileReceipt, ConfigureNixDaemonServiceReceipt, ConfigureShellProfileReceipt};
use crate::{HarmonicError, InstallSettings}; use crate::{HarmonicError, InstallSettings};
use crate::actions::{ActionDescription, ActionReceipt, Actionable, Revertable}; use crate::actions::{ActionDescription, ActionReceipt, Actionable, Revertable};
#[derive(Debug, serde::Deserialize, serde::Serialize, Clone)] #[derive(Debug, serde::Deserialize, serde::Serialize, Clone)]
pub struct ConfigureNix {} pub struct ConfigureNix {
setup_default_profile: SetupDefaultProfile,
configure_nix_daemon_service: ConfigureNixDaemonService,
configure_shell_profile: Option<ConfigureShellProfile>,
}
impl ConfigureNix { impl ConfigureNix {
pub fn plan(settings: InstallSettings) -> Self { pub fn plan(settings: InstallSettings) -> Self {
Self {} let setup_default_profile = SetupDefaultProfile::plan();
let configure_nix_daemon_service = ConfigureNixDaemonService::plan();
let configure_shell_profile = if settings.modify_profile {
Some(ConfigureShellProfile::plan())
} else {
None
};
Self { setup_default_profile, configure_nix_daemon_service, configure_shell_profile }
} }
} }
@ -15,23 +32,50 @@ impl ConfigureNix {
impl<'a> Actionable<'a> for ConfigureNix { impl<'a> Actionable<'a> for ConfigureNix {
type Receipt = ConfigureNixReceipt; type Receipt = ConfigureNixReceipt;
fn description(&self) -> Vec<ActionDescription> { fn description(&self) -> Vec<ActionDescription> {
vec![ let Self { setup_default_profile, configure_nix_daemon_service, configure_shell_profile } = &self;
ActionDescription::new(
"Configure the Nix daemon".to_string(), let mut buf = setup_default_profile.description();
vec![ buf.append(&mut configure_nix_daemon_service.description());
"Blah".to_string() if let Some(configure_shell_profile) = configure_shell_profile {
] buf.append(&mut configure_shell_profile.description());
), }
]
buf
} }
async fn execute(self) -> Result<Self::Receipt, HarmonicError> { async fn execute(self) -> Result<Self::Receipt, HarmonicError> {
todo!() let Self { setup_default_profile, configure_nix_daemon_service, configure_shell_profile } = self;
let (setup_default_profile, configure_nix_daemon_service, configure_shell_profile) = if let Some(configure_shell_profile) = configure_shell_profile {
let (a, b, c) = tokio::try_join!(
setup_default_profile.execute(),
configure_nix_daemon_service.execute(),
configure_shell_profile.execute(),
)?;
(a, b, Some(c))
} else {
let (a, b) = tokio::try_join!(
setup_default_profile.execute(),
configure_nix_daemon_service.execute(),
)?;
(a, b, None)
};
Ok(Self::Receipt {
setup_default_profile,
configure_nix_daemon_service,
configure_shell_profile,
})
} }
} }
#[derive(Debug, serde::Deserialize, serde::Serialize, Clone)] #[derive(Debug, serde::Deserialize, serde::Serialize, Clone)]
pub struct ConfigureNixReceipt {} pub struct ConfigureNixReceipt {
setup_default_profile: SetupDefaultProfileReceipt,
configure_nix_daemon_service: ConfigureNixDaemonServiceReceipt,
configure_shell_profile: Option<ConfigureShellProfileReceipt>,
}
#[async_trait::async_trait] #[async_trait::async_trait]
impl<'a> Revertable<'a> for ConfigureNixReceipt { impl<'a> Revertable<'a> for ConfigureNixReceipt {

View file

@ -38,28 +38,24 @@ impl<'a> Actionable<'a> for CreateUsersAndGroup {
type Receipt = CreateUsersAndGroupReceipt; type Receipt = CreateUsersAndGroupReceipt;
fn description(&self) -> Vec<ActionDescription> { fn description(&self) -> Vec<ActionDescription> {
let Self { let Self {
create_users: _,
create_group: _,
settings: InstallSettings { settings: InstallSettings {
explain: _,
daemon_user_count, daemon_user_count,
channels: _,
modify_profile: _,
nix_build_group_name, nix_build_group_name,
nix_build_group_id, nix_build_group_id,
nix_build_user_prefix, nix_build_user_prefix,
nix_build_user_id_base, nix_build_user_id_base,
nix_package_url, ..
} },
..
} = &self; } = &self;
vec![ vec![
ActionDescription::new( ActionDescription::new(
format!("Create build users and group"), format!("Create build users and group"),
vec![ vec![
format!("The nix daemon requires system users it can act as in order to build"), format!("The nix daemon requires system users (and a group they share) which it can act as in order to build"),
format!("This action will create group `{nix_build_group_name}` with uid `{nix_build_group_id}`"), format!("Create group `{nix_build_group_name}` with uid `{nix_build_group_id}`"),
format!("This action will create {daemon_user_count} users with prefix `{nix_build_user_prefix}` starting at uid `{nix_build_user_id_base}`"), format!("Create {daemon_user_count} users with prefix `{nix_build_user_prefix}` starting at uid `{nix_build_user_id_base}`"),
], ],
) )
] ]
@ -74,9 +70,10 @@ impl<'a> Actionable<'a> for CreateUsersAndGroup {
// Create users // Create users
// TODO(@hoverbear): Abstract this, it will be common // TODO(@hoverbear): Abstract this, it will be common
let mut set = JoinSet::new(); let mut set = JoinSet::new();
let mut successes = Vec::with_capacity(create_users.len()); let mut successes = Vec::with_capacity(create_users.len());
let mut errors = Vec::default(); let mut errors = Vec::default();
for create_user in create_users { for create_user in create_users {
let _abort_handle = set.spawn(async move { create_user.execute().await }); let _abort_handle = set.spawn(async move { create_user.execute().await });
} }