greentic-start-dev 1.1.27190108346

Greentic lifecycle runner for start/restart/stop orchestration
Documentation
use std::path::Path;

pub fn add_tenant(root: &Path, tenant: &str) -> anyhow::Result<()> {
    let tenant_dir = root.join("tenants").join(tenant);
    std::fs::create_dir_all(tenant_dir.join("teams"))?;
    let gmap_path = tenant_dir.join("tenant.gmap");
    if !gmap_path.exists() {
        std::fs::write(gmap_path, "_ = forbidden\n")?;
    }
    Ok(())
}

pub fn add_team(root: &Path, tenant: &str, team: &str) -> anyhow::Result<()> {
    let team_dir = root.join("tenants").join(tenant).join("teams").join(team);
    std::fs::create_dir_all(&team_dir)?;
    let gmap_path = team_dir.join("team.gmap");
    if !gmap_path.exists() {
        std::fs::write(gmap_path, "_ = forbidden\n")?;
    }
    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn add_tenant_creates_default_structure_once() {
        let dir = tempfile::tempdir().expect("tempdir");
        add_tenant(dir.path(), "acme").expect("add tenant");

        let tenant_dir = dir.path().join("tenants").join("acme");
        assert!(tenant_dir.join("teams").is_dir());
        assert_eq!(
            std::fs::read_to_string(tenant_dir.join("tenant.gmap")).expect("tenant gmap"),
            "_ = forbidden\n"
        );

        std::fs::write(tenant_dir.join("tenant.gmap"), "custom = allow\n").expect("custom gmap");
        add_tenant(dir.path(), "acme").expect("add tenant again");
        assert_eq!(
            std::fs::read_to_string(tenant_dir.join("tenant.gmap")).expect("tenant gmap"),
            "custom = allow\n"
        );
    }

    #[test]
    fn add_team_creates_team_gmap_without_overwriting_existing_file() {
        let dir = tempfile::tempdir().expect("tempdir");
        add_team(dir.path(), "acme", "ops").expect("add team");

        let team_dir = dir
            .path()
            .join("tenants")
            .join("acme")
            .join("teams")
            .join("ops");
        assert!(team_dir.is_dir());
        assert_eq!(
            std::fs::read_to_string(team_dir.join("team.gmap")).expect("team gmap"),
            "_ = forbidden\n"
        );

        std::fs::write(team_dir.join("team.gmap"), "team = custom\n").expect("custom team gmap");
        add_team(dir.path(), "acme", "ops").expect("add team again");
        assert_eq!(
            std::fs::read_to_string(team_dir.join("team.gmap")).expect("team gmap"),
            "team = custom\n"
        );
    }
}