Skip to content

Commit 2f99eef

Browse files
committed
Refactor create push.rs views into data.rs owned data & cleanup
1 parent 7e6f729 commit 2f99eef

File tree

4 files changed

+193
-261
lines changed

4 files changed

+193
-261
lines changed

src/cli.rs

+19-32
Original file line numberDiff line numberDiff line change
@@ -66,22 +66,19 @@ struct PromptPart<'a> {
6666
}
6767

6868
fn print_deployment(
69-
parts: &[(
70-
&data::DeployData,
71-
data::DeployDefs,
72-
)],
69+
parts: &[&data::DeployData],
7370
) -> Result<(), toml::ser::Error> {
7471
let mut part_map: HashMap<String, HashMap<String, PromptPart>> = HashMap::new();
7572

76-
for (data, defs) in parts {
73+
for data in parts {
7774
part_map
7875
.entry(data.node_name.to_string())
7976
.or_insert_with(HashMap::new)
8077
.insert(
8178
data.profile_name.to_string(),
8279
PromptPart {
83-
user: &defs.profile_user,
84-
ssh_user: &defs.ssh_user,
80+
user: &data.profile_user,
81+
ssh_user: &data.ssh_user,
8582
path: &data.profile.profile_settings.path,
8683
hostname: &data.node.node_settings.hostname,
8784
ssh_opts: &data.merged_settings.ssh_opts,
@@ -108,10 +105,7 @@ pub enum PromptDeploymentError {
108105
}
109106

110107
fn prompt_deployment(
111-
parts: &[(
112-
&data::DeployData,
113-
data::DeployDefs,
114-
)],
108+
parts: &[&data::DeployData],
115109
) -> Result<(), PromptDeploymentError> {
116110
print_deployment(parts)?;
117111

@@ -198,14 +192,10 @@ async fn run_deploy(
198192
.collect::<Result<Vec<Vec<data::DeployData<'_>>>, data::ResolveTargetError>>()?;
199193
let deploy_datas: Vec<&data::DeployData<'_>> = deploy_datas_.iter().flatten().collect();
200194

201-
let mut parts: Vec<(
202-
&data::DeployData,
203-
data::DeployDefs,
204-
)> = Vec::new();
195+
let mut parts: Vec<&data::DeployData> = Vec::new();
205196

206197
for deploy_data in deploy_datas {
207-
let deploy_defs = deploy_data.defs()?;
208-
parts.push((deploy_data, deploy_defs));
198+
parts.push(deploy_data);
209199
}
210200

211201
if cmd_flags.interactive {
@@ -214,27 +204,24 @@ async fn run_deploy(
214204
print_deployment(&parts[..])?;
215205
}
216206

217-
for (deploy_data, deploy_defs) in &parts {
218-
deploy::push::push_profile(deploy::push::PushProfileData {
219-
supports_flakes: &supports_flakes,
220-
check_sigs: &cmd_flags.checksigs,
221-
repo: &deploy_data.repo,
222-
deploy_data: &deploy_data,
223-
deploy_defs: &deploy_defs,
224-
keep_result: &cmd_flags.keep_result,
225-
result_path: cmd_flags.result_path.as_deref(),
226-
extra_build_args: &cmd_flags.extra_build_args,
227-
})
207+
for deploy_data in &parts {
208+
deploy::push::push_profile(
209+
supports_flakes,
210+
deploy::push::ShowDerivationCommand::from_data(&deploy_data),
211+
deploy::push::BuildCommand::from_data(&deploy_data),
212+
deploy::push::SignCommand::from_data(&deploy_data),
213+
deploy::push::CopyCommand::from_data(&deploy_data),
214+
)
228215
.await?;
229216
}
230217

231-
let mut succeeded: Vec<(&data::DeployData, &data::DeployDefs)> = vec![];
218+
let mut succeeded: Vec<&data::DeployData> = vec![];
232219

233220
// Run all deployments
234221
// In case of an error rollback any previoulsy made deployment.
235222
// Rollbacks adhere to the global seeting to auto_rollback and secondary
236223
// the profile's configuration
237-
for (deploy_data, deploy_defs) in &parts {
224+
for deploy_data in &parts {
238225
if let Err(e) = deploy::deploy::deploy_profile(
239226
&deploy_data.node_name,
240227
&deploy_data.profile_name,
@@ -253,7 +240,7 @@ async fn run_deploy(
253240
// revoking all previous deploys
254241
// (adheres to profile configuration if not set explicitely by
255242
// the command line)
256-
for (deploy_data, _) in &succeeded {
243+
for deploy_data in &succeeded {
257244
if deploy_data.merged_settings.auto_rollback.unwrap_or(true) {
258245
deploy::deploy::revoke(
259246
&deploy_data.node_name,
@@ -266,7 +253,7 @@ async fn run_deploy(
266253
}
267254
break;
268255
}
269-
succeeded.push((deploy_data, deploy_defs))
256+
succeeded.push(deploy_data)
270257
}
271258

272259
Ok(())

src/data.rs

+15-121
Original file line numberDiff line numberDiff line change
@@ -260,16 +260,18 @@ pub struct DeployData<'a> {
260260
pub node_name: String,
261261
pub profile_name: String,
262262

263-
pub hostname: Option<&'a str>,
264-
265263
pub flags: &'a Flags,
266264
pub node: &'a settings::Node,
267265
pub profile: &'a settings::Profile,
268266
pub merged_settings: settings::GenericSettings,
269267

268+
pub hostname: &'a str,
269+
270270
pub ssh_user: String,
271+
pub ssh_uri: String,
271272
pub temp_path: String,
272273
pub profile_path: String,
274+
pub profile_user: String,
273275
pub sudo: Option<String>,
274276
}
275277

@@ -318,14 +320,6 @@ pub struct Flags {
318320
pub rollback_succeeded: bool,
319321
}
320322

321-
#[derive(Debug)]
322-
pub struct DeployDefs {
323-
pub ssh_user: String,
324-
pub profile_user: String,
325-
pub profile_path: String,
326-
pub sudo: Option<String>,
327-
}
328-
329323
impl<'a> DeployData<'a> {
330324

331325
fn new(
@@ -351,14 +345,10 @@ impl<'a> DeployData<'a> {
351345
Some(ref x) => x.to_owned(),
352346
None => "/tmp".to_string(),
353347
};
354-
let profile_user = match merged_settings.user {
355-
Some(ref x) => x.to_owned(),
356-
None => match merged_settings.ssh_user {
357-
Some(ref x) => x.to_owned(),
358-
None => {
359-
return Err(DeployDataError::NoProfileUser(profile_name, node_name))
360-
}
361-
},
348+
let profile_user = if let Some(ref x) = merged_settings.user { x.to_owned() } else {
349+
if let Some(ref x) = merged_settings.ssh_user { x.to_owned() } else {
350+
return Err(DeployDataError::NoProfileUser(profile_name, node_name))
351+
}
362352
};
363353
let profile_path = match profile.profile_settings.profile_path {
364354
None => format!("/nix/var/nix/profiles/{}", match &profile_user[..] {
@@ -375,6 +365,11 @@ impl<'a> DeployData<'a> {
375365
Some(ref user) if user != &ssh_user => Some(format!("sudo -u {}", user)),
376366
_ => None,
377367
};
368+
let hostname = match hostname {
369+
Some(x) => x,
370+
None => &node.node_settings.hostname,
371+
};
372+
let ssh_uri = format!("ssh://{}@{}", &ssh_user, &hostname);
378373

379374
Ok(DeployData {
380375
repo,
@@ -384,114 +379,13 @@ impl<'a> DeployData<'a> {
384379
profile,
385380
hostname,
386381
ssh_user,
382+
ssh_uri,
387383
temp_path,
388384
profile_path,
385+
profile_user,
389386
sudo,
390387
flags,
391388
merged_settings,
392389
})
393390
}
394-
395-
pub fn defs(&'a self) -> Result<DeployDefs, DeployDataError> {
396-
let ssh_user = match self.merged_settings.ssh_user {
397-
Some(ref u) => u.clone(),
398-
None => whoami::username(),
399-
};
400-
let profile_user = self.get_profile_user()?;
401-
let profile_path = self.get_profile_path()?;
402-
let sudo = self.sudo()?;
403-
404-
Ok(DeployDefs {
405-
ssh_user,
406-
profile_user,
407-
profile_path,
408-
sudo,
409-
})
410-
}
411-
412-
pub fn sudo(&'a self) -> Result<Option<String>, DeployDataError> {
413-
let ssh_user = match self.merged_settings.ssh_user {
414-
Some(ref u) => u.clone(),
415-
None => whoami::username(),
416-
};
417-
Ok(
418-
match self.merged_settings.user {
419-
Some(ref user) if user != &ssh_user => Some(format!("sudo -u {}", user)),
420-
_ => None,
421-
}
422-
)
423-
}
424-
425-
pub fn temp_path(&'a self) -> Result<String, DeployDataError> {
426-
Ok(
427-
match self.merged_settings.temp_path {
428-
Some(ref x) => x.to_owned(),
429-
None => "/tmp".to_string(),
430-
}
431-
)
432-
}
433-
434-
pub fn ssh_uri(&'a self) -> Result<String, DeployDataError> {
435-
436-
let hostname = match self.hostname {
437-
Some(x) => x,
438-
None => &self.node.node_settings.hostname,
439-
};
440-
let curr_user = &whoami::username();
441-
let ssh_user = match self.merged_settings.ssh_user {
442-
Some(ref u) => u,
443-
None => curr_user,
444-
};
445-
Ok(format!("ssh://{}@{}", ssh_user, hostname))
446-
}
447-
448-
// can be dropped once ssh fully supports ipv6 uris
449-
pub fn ssh_non_uri(&'a self) -> Result<String, DeployDataError> {
450-
451-
let hostname = match self.hostname {
452-
Some(x) => x,
453-
None => &self.node.node_settings.hostname,
454-
};
455-
let curr_user = &whoami::username();
456-
let ssh_user = match self.merged_settings.ssh_user {
457-
Some(ref u) => u,
458-
None => curr_user,
459-
};
460-
Ok(format!("{}@{}", ssh_user, hostname))
461-
}
462-
463-
pub fn ssh_opts(&'a self) -> Result<impl Iterator<Item = &String>, DeployDataError> {
464-
Ok(self.merged_settings.ssh_opts.iter())
465-
}
466-
467-
pub fn get_profile_path(&'a self) -> Result<String, DeployDataError> {
468-
let profile_user = self.get_profile_user()?;
469-
let profile_path = match self.profile.profile_settings.profile_path {
470-
None => match &profile_user[..] {
471-
"root" => format!("/nix/var/nix/profiles/{}", self.profile_name),
472-
_ => format!(
473-
"/nix/var/nix/profiles/per-user/{}/{}",
474-
profile_user, self.profile_name
475-
),
476-
},
477-
Some(ref x) => x.clone(),
478-
};
479-
Ok(profile_path)
480-
}
481-
482-
pub fn get_profile_user(&'a self) -> Result<String, DeployDataError> {
483-
let profile_user = match self.merged_settings.user {
484-
Some(ref x) => x.clone(),
485-
None => match self.merged_settings.ssh_user {
486-
Some(ref x) => x.clone(),
487-
None => {
488-
return Err(DeployDataError::NoProfileUser(
489-
self.profile_name.to_owned(),
490-
self.node_name.to_owned(),
491-
))
492-
}
493-
},
494-
};
495-
Ok(profile_user)
496-
}
497391
}

src/deploy.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,7 @@ pub struct SshCommand<'a> {
1717

1818
impl<'a> SshCommand<'a> {
1919
pub fn from_data(d: &'a data::DeployData) -> Result<Self, data::DeployDataError> {
20-
let hostname = match d.hostname {
21-
Some(x) => x,
22-
None => &d.node.node_settings.hostname,
23-
};
24-
let hoststring = format!("{}@{}", &d.ssh_user, hostname);
20+
let hoststring = format!("{}@{}", &d.ssh_user, d.hostname);
2521
let opts = d.merged_settings.ssh_opts.as_ref();
2622
Ok(SshCommand {hoststring, opts})
2723
}

0 commit comments

Comments
 (0)