55 lines
1.7 KiB
Rust
55 lines
1.7 KiB
Rust
|
use std::error::Error;
|
||
|
use std::fs;
|
||
|
use ipnet::Ipv4Net;
|
||
|
use serde::{Deserialize, Serialize};
|
||
|
use url::Url;
|
||
|
use crate::OrgCommands;
|
||
|
use crate::api::APIErrorResponse;
|
||
|
|
||
|
pub async fn org_main(command: OrgCommands, server: Url) -> Result<(), Box<dyn Error>> {
|
||
|
match command {
|
||
|
OrgCommands::Create { cidr } => create_org(cidr, server).await,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[derive(Serialize)]
|
||
|
pub struct CreateOrgBody {
|
||
|
pub cidr: String
|
||
|
}
|
||
|
|
||
|
#[derive(Deserialize)]
|
||
|
pub struct OrgCreateResponse {
|
||
|
pub organization: String,
|
||
|
pub ca: String,
|
||
|
pub network: String
|
||
|
}
|
||
|
|
||
|
pub async fn create_org(cidr: Ipv4Net, server: Url) -> Result<(), Box<dyn Error>> {
|
||
|
let client = reqwest::Client::new();
|
||
|
|
||
|
let sess_token_store = dirs::config_dir().unwrap().join("tfcli-session.token");
|
||
|
let session_token = fs::read_to_string(&sess_token_store)?;
|
||
|
let auth_token_store = dirs::config_dir().unwrap().join("tfcli-auth.token");
|
||
|
let auth_token = fs::read_to_string(&auth_token_store)?;
|
||
|
|
||
|
let token = format!("{} {}", session_token, auth_token);
|
||
|
|
||
|
let res = client.post(server.join("/v1/organization")?).json(&CreateOrgBody { cidr: cidr.to_string() }).bearer_auth(token).send().await?;
|
||
|
|
||
|
if res.status().is_success() {
|
||
|
let resp: OrgCreateResponse = res.json().await?;
|
||
|
println!("Created organization successfully.");
|
||
|
println!("Organization: {}", resp.organization);
|
||
|
println!(" Signing CA: {}", resp.ca);
|
||
|
println!(" Network: {}", resp.network);
|
||
|
} else {
|
||
|
let resp: APIErrorResponse = res.json().await?;
|
||
|
|
||
|
eprintln!("[error] Error creating org: {} {}", resp.errors[0].code, resp.errors[0].message);
|
||
|
|
||
|
std::process::exit(1);
|
||
|
}
|
||
|
|
||
|
Ok(())
|
||
|
}
|