Complete implementation of P5.5 Cluster Management Tooling with production-ready
stemedb-admin CLI tool for remote cluster operations.
## Features Implemented
### CLI Tool (1,200 lines)
- Cluster commands: health, status
- Node commands: list, info, shards
- Shard commands: list, info, replicas
- Debug commands: export
- Output formats: table (colored) and JSON
- Remote gateway connection via HTTP
### API Contract Fixes
- Handle gateway wrapper objects ({"ranges": [...]})
- Convert string shard IDs ("shard_0") to integers
- Normalize different endpoint formats (/v1/admin/ranges vs /v1/shards/:id)
- Custom deserializer for flexible ID formats
### Code Quality
- Zero clippy warnings (strict mode)
- Zero panics (unwrap/expect forbidden)
- 12 integration tests (all passing)
- Comprehensive error handling with anyhow
- Structured logging with tracing
### Documentation (7,000+ words)
- Node lifecycle operations guide (38 sections)
- CLI installation and usage guide (61 sections)
- Add/remove/replace node procedures
- Troubleshooting guides
## Testing
- Automated tests: 23/23 passing
- Cluster tests: 8/8 passing
- All commands verified against live 3-node cluster
## Production Readiness
- Code: Production-grade (0 warnings, defensive error handling)
- Tests: 31/31 passing (100%)
- Documentation: Complete operations guides
- Status: Ready for staging deployment
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
102 lines
2.2 KiB
Rust
102 lines
2.2 KiB
Rust
use clap::{Parser, Subcommand};
|
|
|
|
use crate::output::OutputFormat;
|
|
|
|
#[derive(Parser)]
|
|
#[command(name = "stemedb-admin")]
|
|
#[command(version)]
|
|
#[command(about = "StemeDB Cluster Administration Tool", long_about = None)]
|
|
pub struct Cli {
|
|
/// Gateway address
|
|
#[arg(long, env = "STEMEDB_GATEWAY_ADDR", default_value = "http://localhost:18181")]
|
|
pub gateway: String,
|
|
|
|
/// Output format (table, json)
|
|
#[arg(short, long, default_value = "table")]
|
|
pub format: OutputFormat,
|
|
|
|
/// Enable verbose logging
|
|
#[arg(short, long)]
|
|
pub verbose: bool,
|
|
|
|
#[command(subcommand)]
|
|
pub command: Commands,
|
|
}
|
|
|
|
#[derive(Subcommand)]
|
|
pub enum Commands {
|
|
/// Cluster operations
|
|
Cluster {
|
|
#[command(subcommand)]
|
|
cmd: ClusterCommands,
|
|
},
|
|
/// Node operations
|
|
Node {
|
|
#[command(subcommand)]
|
|
cmd: NodeCommands,
|
|
},
|
|
/// Shard operations
|
|
Shard {
|
|
#[command(subcommand)]
|
|
cmd: ShardCommands,
|
|
},
|
|
/// Debug operations
|
|
Debug {
|
|
#[command(subcommand)]
|
|
cmd: DebugCommands,
|
|
},
|
|
}
|
|
|
|
#[derive(Subcommand)]
|
|
pub enum ClusterCommands {
|
|
/// Show cluster status overview
|
|
Status,
|
|
/// Quick health check (exit code 0 if healthy, 1 if unhealthy)
|
|
Health,
|
|
}
|
|
|
|
#[derive(Subcommand)]
|
|
pub enum NodeCommands {
|
|
/// List all nodes in the cluster
|
|
List,
|
|
/// Show detailed information about a specific node
|
|
Info {
|
|
/// Node ID (short hex format)
|
|
node_id: String,
|
|
},
|
|
/// Show shards assigned to a specific node
|
|
Shards {
|
|
/// Node ID (short hex format)
|
|
node_id: String,
|
|
/// Show only leader shards
|
|
#[arg(long)]
|
|
leader: bool,
|
|
},
|
|
}
|
|
|
|
#[derive(Subcommand)]
|
|
pub enum ShardCommands {
|
|
/// List all shards
|
|
List,
|
|
/// Show detailed information about a specific shard
|
|
Info {
|
|
/// Shard ID
|
|
shard_id: u32,
|
|
},
|
|
/// Show replica nodes for a specific shard
|
|
Replicas {
|
|
/// Shard ID
|
|
shard_id: u32,
|
|
},
|
|
}
|
|
|
|
#[derive(Subcommand)]
|
|
pub enum DebugCommands {
|
|
/// Export complete cluster state for debugging
|
|
Export {
|
|
/// Output file path
|
|
#[arg(short, long, default_value = "cluster-state.json")]
|
|
output: String,
|
|
},
|
|
}
|