KeiSeiKit-1.0/_primitives/_rust/kei-compute-vultr/src/main.rs
Parfii-bot a4e667de10 KeiSeiKit-public — clean state
Single-commit clean baseline after security scrub of niche-tells,
project codenames, internal jargon, and contributor-email leaks.

Contents:
- 100 Rust crates (_primitives/_rust/)
- 37 agent manifests (_manifests/) + generated specs (_generated/)
- 67 user-invocable skills (skills/)
- 33 hooks (hooks/)
- Composition blocks (_blocks/)
- Documentation (docs/, README.md)
- TS adapter packages (_ts_packages/)
- Assembler (_assembler/)
- Roles (_roles/)
- Templates (_templates/)
- Forgejo CI (.forgejo/)

Author: Denis Parfionovich <info@greendragon.info>

License: see LICENSE.
2026-05-01 12:09:03 +08:00

146 lines
4.1 KiB
Rust

// SPDX-License-Identifier: Apache-2.0
// Copyright 2026 <author org>
//
//! kei-compute-vultr — CLI front-end for the Vultr Cloud v2 ComputeProvider.
//!
//! Subcommands mirror kei-compute-hetzner:
//! dna — print the provider's DNA
//! cloud-init — render YAML cloud-init from CLI args
//! provision — call POST /instances (real API, requires VULTR_API_KEY)
//! status — call GET /instances/<id>
use clap::{Parser, Subcommand};
use kei_compute_vultr::{CloudInitSpec, VultrCompute};
use kei_runtime_core::{ComputeProvider, HasDna, VmHandle, VmSpec};
#[derive(Parser, Debug)]
#[command(name = "kei-compute-vultr", version)]
struct Cli {
#[command(subcommand)]
cmd: Cmd,
}
#[derive(Subcommand, Debug)]
enum Cmd {
/// Print the constructor DNA.
Dna,
/// Render a cloud-init YAML to stdout.
CloudInit {
#[arg(long)]
user_handle: String,
#[arg(long)]
tailscale_auth_key: String,
#[arg(long, default_value = "ANTHROPIC_API_KEY")]
anthropic_api_key_env: String,
#[arg(long)]
git_remote_url: String,
#[arg(long, default_value = "0 3 * * *")]
schedule_cron: String,
#[arg(long)]
install_forgejo_local: bool,
#[arg(long, default_value = "https://cp.example")]
control_plane_url: String,
#[arg(long)]
base64: bool,
},
/// Provision a Vultr instance (live API call).
Provision {
#[arg(long)]
region: String,
#[arg(long)]
tier: String,
#[arg(long)]
ssh_pubkey: String,
#[arg(long, default_value = "")]
cloud_init: String,
},
/// Get current status of a previously-provisioned instance.
Status {
#[arg(long)]
instance_id: String,
#[arg(long)]
region: String,
#[arg(long)]
tier: String,
},
}
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let cli = Cli::parse();
match cli.cmd {
Cmd::Dna => {
let c = VultrCompute::from_env()?;
println!("{}", c.dna());
}
Cmd::CloudInit {
user_handle,
tailscale_auth_key,
anthropic_api_key_env,
git_remote_url,
schedule_cron,
install_forgejo_local,
control_plane_url,
base64,
} => {
let spec = CloudInitSpec {
user_handle,
tailscale_auth_key,
anthropic_api_key_env,
git_remote_url,
schedule_cron,
install_forgejo_local,
control_plane_url,
};
if base64 {
println!("{}", spec.render_base64());
} else {
print!("{}", spec.render());
}
}
Cmd::Provision {
region,
tier,
ssh_pubkey,
cloud_init,
} => {
let c = VultrCompute::from_env()?;
let user_dna = kei_runtime_core::DnaBuilder::new("user")
.cap("EM")
.scope("cli")
.body(b"kei-compute-vultr-cli")
.build()?;
let spec = VmSpec {
user_dna,
region,
tier,
ssh_pubkey,
cloud_init,
labels: vec![("project".into(), "kei".into())],
};
let h = c.create(&spec).await?;
println!("{}", serde_json::to_string_pretty(&h)?);
}
Cmd::Status {
instance_id,
region,
tier,
} => {
let c = VultrCompute::from_env()?;
let h = VmHandle {
dna: c.dna().clone(),
external_id: instance_id,
provider: c.provider_name().to_string(),
region,
tier,
ipv4: None,
ipv6: None,
tailscale_ip: None,
created_at_ms: 0,
};
let s = c.status(&h).await?;
println!("{s:?}");
}
}
Ok(())
}