commonware_deployer/aws/
list.rs1use crate::aws::{deployer_directory, Error, Metadata, DESTROYED_FILE_NAME, METADATA_FILE_NAME};
4use chrono::{DateTime, Local, Utc};
5use std::{
6 cmp::Reverse,
7 fs::{self, File},
8};
9use tracing::info;
10
11pub fn list() -> Result<(), Error> {
13 let deployer_dir = deployer_directory(None);
15 if !deployer_dir.exists() {
16 info!("no deployments found");
17 return Ok(());
18 }
19
20 let mut active = Vec::new();
22 for entry in fs::read_dir(&deployer_dir)? {
23 let path = entry?.path();
24 if !path.is_dir() {
25 continue;
26 }
27
28 let destroyed = path.join(DESTROYED_FILE_NAME);
30 if destroyed.exists() {
31 continue;
32 }
33
34 let metadata_path = path.join(METADATA_FILE_NAME);
36 let Ok(file) = File::open(&metadata_path) else {
37 continue;
38 };
39 let Ok(metadata) = serde_yaml::from_reader::<_, Metadata>(file) else {
40 continue;
41 };
42 active.push(metadata);
43 }
44
45 if active.is_empty() {
47 info!("no active deployments");
48 } else {
49 active.sort_by_key(|a| Reverse(a.created_at));
50 for d in &active {
51 let created_at = DateTime::<Utc>::from_timestamp(d.created_at as i64, 0).map(|dt| {
52 dt.with_timezone(&Local)
53 .format("%Y-%m-%d %H:%M:%S")
54 .to_string()
55 });
56 info!(
57 tag = d.tag.as_str(),
58 created_at,
59 regions = ?d.regions,
60 instances = d.instance_count,
61 );
62 }
63 }
64 Ok(())
65}