1mod cluster;
7pub mod tier;
8mod types;
9
10pub use cluster::{
11 BackendInfo, BackendType, BucketsInfo, ClusterInfo, DiskInfo, HealDriveInfo, HealDriveInfos,
12 HealResultItem, HealScanMode, HealStartRequest, HealStatus, HealingDiskInfo, MemStats,
13 ObjectsInfo, PoolDecommissionInfo, PoolStatus, PoolTarget, RebalancePoolProgress,
14 RebalancePoolStatus, RebalanceStartResult, RebalanceStatus, ServerInfo, UsageInfo,
15};
16pub use tier::{
17 TierAliyun, TierAzure, TierConfig, TierCreds, TierGCS, TierHuaweicloud, TierMinIO, TierR2,
18 TierRustFS, TierS3, TierTencent, TierType,
19};
20pub use types::{
21 BucketQuota, CreateServiceAccountRequest, Group, GroupStatus, Policy, PolicyEntity, PolicyInfo,
22 ServiceAccount, ServiceAccountCreateResponse, ServiceAccountCredentials, SetPolicyRequest,
23 UpdateGroupMembersRequest, User, UserStatus,
24};
25
26use async_trait::async_trait;
27
28use crate::error::Result;
29
30#[async_trait]
36pub trait AdminApi: Send + Sync {
37 async fn cluster_info(&self) -> Result<ClusterInfo>;
41
42 async fn heal_status(&self) -> Result<HealStatus>;
44
45 async fn heal_start(&self, request: HealStartRequest) -> Result<HealStatus>;
47
48 async fn heal_stop(&self) -> Result<()>;
50
51 async fn list_pools(&self) -> Result<Vec<PoolStatus>>;
53
54 async fn pool_status(&self, target: PoolTarget) -> Result<PoolStatus>;
56
57 async fn decommission_start(&self, target: PoolTarget) -> Result<()>;
59
60 async fn decommission_cancel(&self, target: PoolTarget) -> Result<()>;
62
63 async fn rebalance_start(&self) -> Result<RebalanceStartResult>;
65
66 async fn rebalance_status(&self) -> Result<RebalanceStatus>;
68
69 async fn rebalance_stop(&self) -> Result<()>;
71
72 async fn list_users(&self) -> Result<Vec<User>>;
76
77 async fn get_user(&self, access_key: &str) -> Result<User>;
79
80 async fn create_user(&self, access_key: &str, secret_key: &str) -> Result<User>;
82
83 async fn delete_user(&self, access_key: &str) -> Result<()>;
85
86 async fn set_user_status(&self, access_key: &str, status: UserStatus) -> Result<()>;
88
89 async fn list_policies(&self) -> Result<Vec<PolicyInfo>>;
93
94 async fn get_policy(&self, name: &str) -> Result<Policy>;
96
97 async fn create_policy(&self, name: &str, policy_document: &str) -> Result<()>;
99
100 async fn delete_policy(&self, name: &str) -> Result<()>;
102
103 async fn attach_policy(
105 &self,
106 policy_names: &[String],
107 entity_type: PolicyEntity,
108 entity_name: &str,
109 ) -> Result<()>;
110
111 async fn detach_policy(
113 &self,
114 policy_names: &[String],
115 entity_type: PolicyEntity,
116 entity_name: &str,
117 ) -> Result<()>;
118
119 async fn list_groups(&self) -> Result<Vec<String>>;
123
124 async fn get_group(&self, name: &str) -> Result<Group>;
126
127 async fn create_group(&self, name: &str, members: Option<&[String]>) -> Result<Group>;
129
130 async fn delete_group(&self, name: &str) -> Result<()>;
132
133 async fn set_group_status(&self, name: &str, status: GroupStatus) -> Result<()>;
135
136 async fn add_group_members(&self, group: &str, members: &[String]) -> Result<()>;
138
139 async fn remove_group_members(&self, group: &str, members: &[String]) -> Result<()>;
141
142 async fn list_service_accounts(&self, user: Option<&str>) -> Result<Vec<ServiceAccount>>;
146
147 async fn get_service_account(&self, access_key: &str) -> Result<ServiceAccount>;
149
150 async fn create_service_account(
152 &self,
153 request: CreateServiceAccountRequest,
154 ) -> Result<ServiceAccount>;
155
156 async fn delete_service_account(&self, access_key: &str) -> Result<()>;
158
159 async fn set_bucket_quota(&self, bucket: &str, quota: u64) -> Result<BucketQuota>;
163
164 async fn get_bucket_quota(&self, bucket: &str) -> Result<BucketQuota>;
166
167 async fn clear_bucket_quota(&self, bucket: &str) -> Result<BucketQuota>;
169
170 async fn list_tiers(&self) -> Result<Vec<TierConfig>>;
174
175 async fn tier_stats(&self) -> Result<serde_json::Value>;
177
178 async fn add_tier(&self, config: TierConfig) -> Result<()>;
180
181 async fn edit_tier(&self, name: &str, creds: TierCreds) -> Result<()>;
183
184 async fn remove_tier(&self, name: &str, force: bool) -> Result<()>;
186
187 async fn set_remote_target(
191 &self,
192 bucket: &str,
193 target: crate::replication::BucketTarget,
194 update: bool,
195 ) -> Result<String>;
196
197 async fn list_remote_targets(
199 &self,
200 bucket: &str,
201 ) -> Result<Vec<crate::replication::BucketTarget>>;
202
203 async fn remove_remote_target(&self, bucket: &str, arn: &str) -> Result<()>;
205
206 async fn replication_metrics(&self, bucket: &str) -> Result<serde_json::Value>;
208}
209
210#[cfg(test)]
211mod tests {
212 use super::*;
213
214 #[test]
216 fn test_user_status_reexport() {
217 assert_eq!(UserStatus::Enabled.to_string(), "enabled");
218 assert_eq!(UserStatus::Disabled.to_string(), "disabled");
219 }
220
221 #[test]
222 fn test_group_status_reexport() {
223 assert_eq!(GroupStatus::Enabled.to_string(), "enabled");
224 assert_eq!(GroupStatus::Disabled.to_string(), "disabled");
225 }
226
227 #[test]
228 fn test_policy_entity_reexport() {
229 assert_eq!(PolicyEntity::User.to_string(), "user");
230 assert_eq!(PolicyEntity::Group.to_string(), "group");
231 }
232
233 #[test]
234 fn test_user_new() {
235 let user = User::new("testuser");
236 assert_eq!(user.access_key, "testuser");
237 assert_eq!(user.status, UserStatus::Enabled);
238 }
239
240 #[test]
241 fn test_group_new() {
242 let group = Group::new("developers");
243 assert_eq!(group.name, "developers");
244 assert_eq!(group.status, GroupStatus::Enabled);
245 }
246
247 #[test]
248 fn test_policy_new() {
249 let policy = Policy::new("readonly", r#"{"Version":"2012-10-17","Statement":[]}"#);
250 assert_eq!(policy.name, "readonly");
251 assert!(policy.parse_document().is_ok());
252 }
253
254 #[test]
255 fn test_service_account_new() {
256 let sa = ServiceAccount::new("AKIAIOSFODNN7EXAMPLE");
257 assert_eq!(sa.access_key, "AKIAIOSFODNN7EXAMPLE");
258 assert!(sa.secret_key.is_none());
259 }
260}