rustfs-cli 0.1.30

A Rust S3 CLI client for S3-compatible object storage
Documentation
#![cfg(not(windows))]

mod admin_support;

use std::process::Command;
use std::time::Duration;

use admin_support::{rc_binary, rc_host_alias, start_admin_test_server};

const BETA9_INFO_RESPONSE: &str = r#"{"info":{"mode":"distributed","deploymentID":"deployment-123","servers":[{"endpoint":"http://node1:9000","state":"online","version":"1.0.0-beta.9","drives":[{"endpoint":"http://node1:9000/data1","path":"/data1","state":"ok","totalspace":100,"usedspace":40,"availspace":60,"pool_index":1,"set_index":2,"disk_index":3}]}]},"admin_discovery":{"runtimeCapabilities":"/rustfs/admin/v4/runtime/capabilities","clusterSnapshot":"/rustfs/admin/v4/cluster/snapshot","extensionsCatalog":"/rustfs/admin/v4/extensions/catalog"}}"#;

#[test]
fn cluster_info_displays_disk_location_indexes_from_snake_case_fields() {
    let config_dir = tempfile::tempdir().expect("create config dir");
    let (endpoint, receiver, handle) = start_admin_test_server(BETA9_INFO_RESPONSE);

    let output = Command::new(rc_binary())
        .args(["admin", "info", "cluster", "myalias"])
        .env("RC_CONFIG_DIR", config_dir.path())
        .env("RC_HOST_myalias", rc_host_alias(&endpoint))
        .output()
        .expect("run rc command");

    assert!(
        output.status.success(),
        "stderr: {}",
        String::from_utf8_lossy(&output.stderr)
    );

    let stdout = String::from_utf8(output.stdout).expect("stdout should be UTF-8");
    assert!(
        stdout.contains("Location: pool:1 set:2 disk:3"),
        "stdout: {stdout}"
    );
    assert!(
        stdout.contains("Deployment ID: deployment-123"),
        "stdout: {stdout}"
    );
    assert!(stdout.contains("Servers:       1"), "stdout: {stdout}");
    assert!(
        stdout.contains("Disks:         1 (1 online)"),
        "stdout: {stdout}"
    );

    let request = receiver
        .recv_timeout(Duration::from_secs(5))
        .expect("captured admin request");
    assert_eq!(request.method, "GET");
    assert_eq!(request.target, "/rustfs/admin/v3/info");

    handle.join().expect("admin test server finished");
}

#[test]
fn server_info_reads_servers_from_beta9_info_response() {
    let config_dir = tempfile::tempdir().expect("create config dir");
    let (endpoint, receiver, handle) = start_admin_test_server(BETA9_INFO_RESPONSE);

    let output = Command::new(rc_binary())
        .args(["admin", "info", "server", "myalias"])
        .env("RC_CONFIG_DIR", config_dir.path())
        .env("RC_HOST_myalias", rc_host_alias(&endpoint))
        .output()
        .expect("run rc command");

    assert!(
        output.status.success(),
        "stderr: {}",
        String::from_utf8_lossy(&output.stderr)
    );

    let stdout = String::from_utf8(output.stdout).expect("stdout should be UTF-8");
    assert!(stdout.contains("http://node1:9000"), "stdout: {stdout}");
    assert!(stdout.contains("1.0.0-beta.9"), "stdout: {stdout}");

    let request = receiver
        .recv_timeout(Duration::from_secs(5))
        .expect("captured admin request");
    assert_eq!(request.method, "GET");
    assert_eq!(request.target, "/rustfs/admin/v3/info");

    handle.join().expect("admin test server finished");
}

#[test]
fn disk_info_reads_disks_from_beta9_info_response() {
    let config_dir = tempfile::tempdir().expect("create config dir");
    let (endpoint, receiver, handle) = start_admin_test_server(BETA9_INFO_RESPONSE);

    let output = Command::new(rc_binary())
        .args(["admin", "info", "disk", "myalias"])
        .env("RC_CONFIG_DIR", config_dir.path())
        .env("RC_HOST_myalias", rc_host_alias(&endpoint))
        .output()
        .expect("run rc command");

    assert!(
        output.status.success(),
        "stderr: {}",
        String::from_utf8_lossy(&output.stderr)
    );

    let stdout = String::from_utf8(output.stdout).expect("stdout should be UTF-8");
    assert!(stdout.contains("/data1"), "stdout: {stdout}");
    assert!(stdout.contains("(pool:1 set:2 disk:3)"), "stdout: {stdout}");
    assert!(stdout.contains("40 B / 100 B (40%)"), "stdout: {stdout}");

    let request = receiver
        .recv_timeout(Duration::from_secs(5))
        .expect("captured admin request");
    assert_eq!(request.method, "GET");
    assert_eq!(request.target, "/rustfs/admin/v3/info");

    handle.join().expect("admin test server finished");
}