mod cluster;
mod types;
pub use cluster::{
BackendInfo, BackendType, BucketsInfo, ClusterInfo, DiskInfo, HealDriveInfo, HealDriveInfos,
HealResultItem, HealScanMode, HealStartRequest, HealStatus, HealingDiskInfo, MemStats,
ObjectsInfo, ServerInfo, UsageInfo,
};
pub use types::{
BucketQuota, CreateServiceAccountRequest, Group, GroupStatus, Policy, PolicyEntity, PolicyInfo,
ServiceAccount, ServiceAccountCreateResponse, ServiceAccountCredentials, SetPolicyRequest,
UpdateGroupMembersRequest, User, UserStatus,
};
use async_trait::async_trait;
use crate::error::Result;
#[async_trait]
pub trait AdminApi: Send + Sync {
async fn cluster_info(&self) -> Result<ClusterInfo>;
async fn heal_status(&self) -> Result<HealStatus>;
async fn heal_start(&self, request: HealStartRequest) -> Result<HealStatus>;
async fn heal_stop(&self) -> Result<()>;
async fn list_users(&self) -> Result<Vec<User>>;
async fn get_user(&self, access_key: &str) -> Result<User>;
async fn create_user(&self, access_key: &str, secret_key: &str) -> Result<User>;
async fn delete_user(&self, access_key: &str) -> Result<()>;
async fn set_user_status(&self, access_key: &str, status: UserStatus) -> Result<()>;
async fn list_policies(&self) -> Result<Vec<PolicyInfo>>;
async fn get_policy(&self, name: &str) -> Result<Policy>;
async fn create_policy(&self, name: &str, policy_document: &str) -> Result<()>;
async fn delete_policy(&self, name: &str) -> Result<()>;
async fn attach_policy(
&self,
policy_names: &[String],
entity_type: PolicyEntity,
entity_name: &str,
) -> Result<()>;
async fn detach_policy(
&self,
policy_names: &[String],
entity_type: PolicyEntity,
entity_name: &str,
) -> Result<()>;
async fn list_groups(&self) -> Result<Vec<String>>;
async fn get_group(&self, name: &str) -> Result<Group>;
async fn create_group(&self, name: &str, members: Option<&[String]>) -> Result<Group>;
async fn delete_group(&self, name: &str) -> Result<()>;
async fn set_group_status(&self, name: &str, status: GroupStatus) -> Result<()>;
async fn add_group_members(&self, group: &str, members: &[String]) -> Result<()>;
async fn remove_group_members(&self, group: &str, members: &[String]) -> Result<()>;
async fn list_service_accounts(&self, user: Option<&str>) -> Result<Vec<ServiceAccount>>;
async fn get_service_account(&self, access_key: &str) -> Result<ServiceAccount>;
async fn create_service_account(
&self,
request: CreateServiceAccountRequest,
) -> Result<ServiceAccount>;
async fn delete_service_account(&self, access_key: &str) -> Result<()>;
async fn set_bucket_quota(&self, bucket: &str, quota: u64) -> Result<BucketQuota>;
async fn get_bucket_quota(&self, bucket: &str) -> Result<BucketQuota>;
async fn clear_bucket_quota(&self, bucket: &str) -> Result<BucketQuota>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_user_status_reexport() {
assert_eq!(UserStatus::Enabled.to_string(), "enabled");
assert_eq!(UserStatus::Disabled.to_string(), "disabled");
}
#[test]
fn test_group_status_reexport() {
assert_eq!(GroupStatus::Enabled.to_string(), "enabled");
assert_eq!(GroupStatus::Disabled.to_string(), "disabled");
}
#[test]
fn test_policy_entity_reexport() {
assert_eq!(PolicyEntity::User.to_string(), "user");
assert_eq!(PolicyEntity::Group.to_string(), "group");
}
#[test]
fn test_user_new() {
let user = User::new("testuser");
assert_eq!(user.access_key, "testuser");
assert_eq!(user.status, UserStatus::Enabled);
}
#[test]
fn test_group_new() {
let group = Group::new("developers");
assert_eq!(group.name, "developers");
assert_eq!(group.status, GroupStatus::Enabled);
}
#[test]
fn test_policy_new() {
let policy = Policy::new("readonly", r#"{"Version":"2012-10-17","Statement":[]}"#);
assert_eq!(policy.name, "readonly");
assert!(policy.parse_document().is_ok());
}
#[test]
fn test_service_account_new() {
let sa = ServiceAccount::new("AKIAIOSFODNN7EXAMPLE");
assert_eq!(sa.access_key, "AKIAIOSFODNN7EXAMPLE");
assert!(sa.secret_key.is_none());
}
}