Skip to main content

commonware_deployer/aws/
list.rs

1//! `list` subcommand for `ec2`
2
3use 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
11/// Lists all active deployments (created but not destroyed)
12pub fn list() -> Result<(), Error> {
13    // Check if deployer directory exists
14    let deployer_dir = deployer_directory(None);
15    if !deployer_dir.exists() {
16        info!("no deployments found");
17        return Ok(());
18    }
19
20    // Collect active deployments
21    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        // Skip destroyed deployments
29        let destroyed = path.join(DESTROYED_FILE_NAME);
30        if destroyed.exists() {
31            continue;
32        }
33
34        // Load metadata (skip if missing or malformed)
35        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    // Display results sorted by creation time (newest first)
46    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}