1#![allow(clippy::too_many_arguments)]
4
5use std::sync::Arc;
6
7use crate::errors::Error;
8use crate::http::ClientInner;
9use crate::types_gen::*;
10
11pub struct Client {
13 pub accounts: AccountsService,
14 pub users: UsersService,
15 pub regions: RegionsService,
16 pub clusters: ClustersService,
17 pub metadata_clusters: MetadataClustersService,
18 pub storages: StoragesService,
19 pub volumes: VolumesService,
20 pub volume_fork_trees: VolumeForkTreesService,
21 pub volume_fork_entries: VolumeForkEntriesService,
22 pub volume_fork_searches: VolumeForkSearchesService,
23 pub audit_logs: AuditLogsService,
24 pub region_audit_logs: RegionAuditLogsService,
25 pub service_nodes: ServiceNodesService,
26 pub nodes: NodesService,
27 pub client_sessions: ClientSessionsService,
28 pub discover: DiscoverService,
29 pub metrics: MetricsService,
30 pub dashboard: DashboardService,
31 pub license: LicenseService,
32 pub alerts: AlertsService,
33 pub region_alerts: RegionAlertsService,
34 pub gc_worker_events: GCWorkerEventsService,
35 pub vault: VaultService,
36}
37
38impl Client {
39 pub fn new(config: Config) -> Result<Self, Error> {
41 let inner = Arc::new(ClientInner::new(config)?);
42 Ok(Self {
43 accounts: AccountsService { inner: Arc::clone(&inner) },
44 users: UsersService { inner: Arc::clone(&inner) },
45 regions: RegionsService { inner: Arc::clone(&inner) },
46 clusters: ClustersService { inner: Arc::clone(&inner) },
47 metadata_clusters: MetadataClustersService { inner: Arc::clone(&inner) },
48 storages: StoragesService { inner: Arc::clone(&inner) },
49 volumes: VolumesService { inner: Arc::clone(&inner) },
50 volume_fork_trees: VolumeForkTreesService { inner: Arc::clone(&inner) },
51 volume_fork_entries: VolumeForkEntriesService { inner: Arc::clone(&inner) },
52 volume_fork_searches: VolumeForkSearchesService { inner: Arc::clone(&inner) },
53 audit_logs: AuditLogsService { inner: Arc::clone(&inner) },
54 region_audit_logs: RegionAuditLogsService { inner: Arc::clone(&inner) },
55 service_nodes: ServiceNodesService { inner: Arc::clone(&inner) },
56 nodes: NodesService { inner: Arc::clone(&inner) },
57 client_sessions: ClientSessionsService { inner: Arc::clone(&inner) },
58 discover: DiscoverService { inner: Arc::clone(&inner) },
59 metrics: MetricsService { inner: Arc::clone(&inner) },
60 dashboard: DashboardService { inner: Arc::clone(&inner) },
61 license: LicenseService { inner: Arc::clone(&inner) },
62 alerts: AlertsService { inner: Arc::clone(&inner) },
63 region_alerts: RegionAlertsService { inner: Arc::clone(&inner) },
64 gc_worker_events: GCWorkerEventsService { inner: Arc::clone(&inner) },
65 vault: VaultService { inner: Arc::clone(&inner) },
66 })
67 }
68}
69
70pub struct AccountsService {
72 inner: Arc<ClientInner>,
73}
74
75impl AccountsService {
76 pub async fn create(&self, req: &CreateAccountRequest) -> Result<IdResponse, Error> {
77 self.inner.post("/api/v1/accounts/create", req).await
78 }
79
80 pub async fn list(&self, opts: Option<&AccountListOptions>) -> Result<PaginatedResponse<Account>, Error> {
81 let mut query: Vec<(&str, String)> = Vec::new();
82 if let Some(opts) = opts {
83 if let Some(v) = &opts.is_active {
84 query.push(("isActive", v.to_string()));
85 }
86 if let Some(v) = &opts.page {
87 query.push(("page", v.to_string()));
88 }
89 if let Some(v) = &opts.limit {
90 query.push(("limit", v.to_string()));
91 }
92 }
93 self.inner.get("/api/v1/accounts/list", &query).await
94 }
95
96 pub async fn get(&self, account_id: i64) -> Result<Account, Error> {
97 self.inner.get(&format!("/api/v1/accounts/{}", account_id), &[]).await
98 }
99
100 pub async fn edit(&self, account_id: i64, req: &EditAccountRequest) -> Result<IdResponse, Error> {
101 self.inner.put(&format!("/api/v1/accounts/{}", account_id), req).await
102 }
103
104 pub async fn lock(&self, account_id: i64) -> Result<IdResponse, Error> {
105 self.inner.post_empty(&format!("/api/v1/accounts/{}/lock", account_id)).await
106 }
107
108 pub async fn unlock(&self, account_id: i64) -> Result<IdResponse, Error> {
109 self.inner.post_empty(&format!("/api/v1/accounts/{}/unlock", account_id)).await
110 }
111
112 pub async fn deactivate(&self, account_id: i64) -> Result<IdResponse, Error> {
113 self.inner.post_empty(&format!("/api/v1/accounts/{}/deactivate", account_id)).await
114 }
115
116 pub async fn update_quota(&self, account_id: i64, req: &UpdateAccountQuotaRequest) -> Result<IdResponse, Error> {
117 self.inner.put(&format!("/api/v1/accounts/{}/quota", account_id), req).await
118 }
119}
120
121pub struct UsersService {
123 inner: Arc<ClientInner>,
124}
125
126impl UsersService {
127 pub async fn add(&self, req: &AddUserRequest) -> Result<IdResponse, Error> {
128 self.inner.post("/api/v1/users/add", req).await
129 }
130
131 pub async fn list(&self, opts: &UserListOptions) -> Result<PaginatedResponse<User>, Error> {
132 let mut query: Vec<(&str, String)> = Vec::new();
133 query.push(("accountId", opts.account_id.to_string()));
134 if let Some(v) = &opts.search {
135 query.push(("search", v.to_string()));
136 }
137 if let Some(v) = &opts.is_active {
138 query.push(("isActive", v.to_string()));
139 }
140 if let Some(v) = &opts.page {
141 query.push(("page", v.to_string()));
142 }
143 if let Some(v) = &opts.limit {
144 query.push(("limit", v.to_string()));
145 }
146 self.inner.get("/api/v1/users/list", &query).await
147 }
148
149 pub async fn get(&self, user_id: i64) -> Result<User, Error> {
150 self.inner.get(&format!("/api/v1/users/{}", user_id), &[]).await
151 }
152
153 pub async fn bulk(&self, req: &BulkUserRequest) -> Result<BulkUserResponse, Error> {
154 self.inner.query("/api/v1/users/bulk", req).await
155 }
156
157 pub async fn edit(&self, user_id: i64, req: &EditUserRequest) -> Result<IdResponse, Error> {
158 self.inner.put(&format!("/api/v1/users/{}", user_id), req).await
159 }
160
161 pub async fn deactivate(&self, user_id: i64) -> Result<IdResponse, Error> {
162 self.inner.post_empty(&format!("/api/v1/users/{}/deactivate", user_id)).await
163 }
164}
165
166pub struct RegionsService {
168 inner: Arc<ClientInner>,
169}
170
171impl RegionsService {
172 pub async fn create(&self, req: &CreateRegionRequest) -> Result<IdResponse, Error> {
173 self.inner.post("/api/v1/regions/create", req).await
174 }
175
176 pub async fn list(&self, opts: &RegionListOptions) -> Result<PaginatedResponse<Region>, Error> {
177 let mut query: Vec<(&str, String)> = Vec::new();
178 query.push(("accountId", opts.account_id.to_string()));
179 if let Some(v) = &opts.is_active {
180 query.push(("isActive", v.to_string()));
181 }
182 if let Some(v) = &opts.page {
183 query.push(("page", v.to_string()));
184 }
185 if let Some(v) = &opts.limit {
186 query.push(("limit", v.to_string()));
187 }
188 self.inner.get("/api/v1/regions/list", &query).await
189 }
190
191 pub async fn get(&self, region_id: i64) -> Result<Region, Error> {
192 self.inner.get(&format!("/api/v1/regions/{}", region_id), &[]).await
193 }
194
195 pub async fn edit(&self, region_id: i64, req: &EditRegionRequest) -> Result<IdResponse, Error> {
196 self.inner.put(&format!("/api/v1/regions/{}", region_id), req).await
197 }
198
199 pub async fn deactivate(&self, region_id: i64) -> Result<IdResponse, Error> {
200 self.inner.post_empty(&format!("/api/v1/regions/{}/deactivate", region_id)).await
201 }
202}
203
204pub struct ClustersService {
206 inner: Arc<ClientInner>,
207}
208
209impl ClustersService {
210 pub async fn list(&self, opts: &ClusterListOptions) -> Result<PaginatedResponse<MetadataCluster>, Error> {
211 let mut query: Vec<(&str, String)> = Vec::new();
212 query.push(("accountId", opts.account_id.to_string()));
213 if let Some(v) = &opts.region_id {
214 query.push(("regionId", v.to_string()));
215 }
216 if let Some(v) = &opts.is_active {
217 query.push(("isActive", v.to_string()));
218 }
219 if let Some(v) = &opts.page {
220 query.push(("page", v.to_string()));
221 }
222 if let Some(v) = &opts.limit {
223 query.push(("limit", v.to_string()));
224 }
225 self.inner.get("/api/v1/clusters/list", &query).await
226 }
227}
228
229pub struct MetadataClustersService {
231 inner: Arc<ClientInner>,
232}
233
234impl MetadataClustersService {
235 pub async fn create(&self, region_id: i64, req: &CreateMetadataClusterRequest) -> Result<IdResponse, Error> {
236 self.inner.post(&format!("/api/v1/regions/{}/clusters/create", region_id), req).await
237 }
238
239 pub async fn list(&self, region_id: i64, opts: Option<&MetadataClusterListOptions>) -> Result<PaginatedResponse<MetadataCluster>, Error> {
240 let mut query: Vec<(&str, String)> = Vec::new();
241 if let Some(opts) = opts {
242 if let Some(v) = &opts.is_active {
243 query.push(("isActive", v.to_string()));
244 }
245 if let Some(v) = &opts.page {
246 query.push(("page", v.to_string()));
247 }
248 if let Some(v) = &opts.limit {
249 query.push(("limit", v.to_string()));
250 }
251 }
252 self.inner.get(&format!("/api/v1/regions/{}/clusters/list", region_id), &query).await
253 }
254
255 pub async fn get(&self, region_id: i64, cluster_id: i64) -> Result<MetadataCluster, Error> {
256 self.inner.get(&format!("/api/v1/regions/{}/clusters/{}", region_id, cluster_id), &[]).await
257 }
258
259 pub async fn edit(&self, region_id: i64, cluster_id: i64, req: &EditMetadataClusterRequest) -> Result<IdResponse, Error> {
260 self.inner.put(&format!("/api/v1/regions/{}/clusters/{}", region_id, cluster_id), req).await
261 }
262
263 pub async fn set_default(&self, region_id: i64, cluster_id: i64) -> Result<IdResponse, Error> {
264 self.inner.post_empty(&format!("/api/v1/regions/{}/clusters/{}/set-default", region_id, cluster_id)).await
265 }
266
267 pub async fn set_ready(&self, region_id: i64, cluster_id: i64, req: &SetMetadataClusterReadyRequest) -> Result<SetReadyMetadataClusterResponse, Error> {
268 self.inner.post(&format!("/api/v1/regions/{}/clusters/{}/set-ready", region_id, cluster_id), req).await
269 }
270
271 pub async fn deactivate(&self, region_id: i64, cluster_id: i64) -> Result<IdResponse, Error> {
272 self.inner.post_empty(&format!("/api/v1/regions/{}/clusters/{}/deactivate", region_id, cluster_id)).await
273 }
274}
275
276pub struct StoragesService {
278 inner: Arc<ClientInner>,
279}
280
281impl StoragesService {
282 pub async fn create(&self, req: &CreateStorageRequest) -> Result<IdResponse, Error> {
283 self.inner.post("/api/v1/storages/create", req).await
284 }
285
286 pub async fn list(&self, opts: &StorageListOptions) -> Result<PaginatedResponse<Storage>, Error> {
287 let mut query: Vec<(&str, String)> = Vec::new();
288 query.push(("accountId", opts.account_id.to_string()));
289 if let Some(v) = &opts.search {
290 query.push(("search", v.to_string()));
291 }
292 if let Some(v) = &opts.region_id {
293 query.push(("regionId", v.to_string()));
294 }
295 if let Some(v) = &opts.storage_type {
296 query.push(("storageType", v.to_string()));
297 }
298 if let Some(v) = &opts.provider_type {
299 query.push(("providerType", v.to_string()));
300 }
301 if let Some(v) = &opts.is_active {
302 query.push(("isActive", v.to_string()));
303 }
304 if let Some(v) = &opts.direct_access {
305 query.push(("directAccess", v.to_string()));
306 }
307 if let Some(v) = &opts.page {
308 query.push(("page", v.to_string()));
309 }
310 if let Some(v) = &opts.limit {
311 query.push(("limit", v.to_string()));
312 }
313 self.inner.get("/api/v1/storages/list", &query).await
314 }
315
316 pub async fn get(&self, storage_id: i64) -> Result<Storage, Error> {
317 self.inner.get(&format!("/api/v1/storages/{}", storage_id), &[]).await
318 }
319
320 pub async fn list_block_volumes(&self, storage_id: i64) -> Result<Vec<BlockVolume>, Error> {
321 self.inner.get(&format!("/api/v1/storages/{}/block-volumes", storage_id), &[]).await
322 }
323
324 pub async fn edit(&self, storage_id: i64, req: &EditStorageRequest) -> Result<IdResponse, Error> {
325 self.inner.put(&format!("/api/v1/storages/{}", storage_id), req).await
326 }
327
328 pub async fn deactivate(&self, storage_id: i64) -> Result<IdResponse, Error> {
329 self.inner.post_empty(&format!("/api/v1/storages/{}/deactivate", storage_id)).await
330 }
331
332 pub async fn test_new_bucket(&self, req: &TestStorageNewBucketRequest) -> Result<TestNewBucketStorageResponse, Error> {
333 self.inner.post("/api/v1/storages/test-bucket", req).await
334 }
335
336 pub async fn test_storage_bucket(&self, storage_id: i64) -> Result<TestStorageBucketStorageResponse, Error> {
337 self.inner.post_empty(&format!("/api/v1/storages/{}/test-bucket", storage_id)).await
338 }
339
340 pub async fn list_compatible(&self, storage_id: i64) -> Result<ListCompatibleStorageResponse, Error> {
341 self.inner.get(&format!("/api/v1/storages/{}/compatible", storage_id), &[]).await
342 }
343
344 pub async fn move_volumes(&self, storage_id: i64, req: &MoveStorageVolumesRequest) -> Result<MoveVolumesStorageResponse, Error> {
345 self.inner.post(&format!("/api/v1/storages/{}/move-volumes", storage_id), req).await
346 }
347
348 pub async fn list_copysets(&self, storage_id: i64, state: Option<&str>, include_retired: Option<bool>) -> Result<Vec<Copyset>, Error> {
349 let mut query: Vec<(&str, String)> = Vec::new();
350 if let Some(v) = state {
351 query.push(("state", v.to_string()));
352 }
353 if let Some(v) = include_retired {
354 query.push(("includeRetired", v.to_string()));
355 }
356 self.inner.get(&format!("/api/v1/storages/{}/copysets", storage_id), &query).await
357 }
358
359 pub async fn get_copyset_status(&self, storage_id: i64, copyset_id: &str) -> Result<Copyset, Error> {
360 self.inner.get(&format!("/api/v1/storages/{}/copysets/{}", storage_id, crate::http::encode_segment(copyset_id)), &[]).await
361 }
362
363 pub async fn drain_copyset(&self, storage_id: i64, copyset_id: &str, req: &DrainStorageCopysetRequest) -> Result<DrainCopysetStorageResponse, Error> {
364 self.inner.post(&format!("/api/v1/storages/{}/copysets/{}/drain", storage_id, crate::http::encode_segment(copyset_id)), req).await
365 }
366
367 pub async fn cancel_drain(&self, storage_id: i64, copyset_id: &str, req: &CancelStorageDrainRequest) -> Result<CancelDrainStorageResponse, Error> {
368 self.inner.post(&format!("/api/v1/storages/{}/copysets/{}/cancel-drain", storage_id, crate::http::encode_segment(copyset_id)), req).await
369 }
370
371 pub async fn update_tags(&self, storage_id: i64, copyset_id: &str, req: &UpdateStorageTagsRequest) -> Result<Copyset, Error> {
372 self.inner.put(&format!("/api/v1/storages/{}/copysets/{}/tags", storage_id, crate::http::encode_segment(copyset_id)), req).await
373 }
374
375 pub async fn register_copyset(&self, storage_id: i64, req: &RegisterStorageCopysetRequest) -> Result<Copyset, Error> {
376 self.inner.post(&format!("/api/v1/storages/{}/copysets", storage_id), req).await
377 }
378
379 pub async fn register_copysets_bulk(&self, storage_id: i64, req: &RegisterStorageCopysetsBulkRequest) -> Result<RegisterCopysetsBulkStorageResponse, Error> {
380 self.inner.post(&format!("/api/v1/storages/{}/copysets/bulk", storage_id), req).await
381 }
382
383 pub async fn add_copyset_member(&self, storage_id: i64, copyset_id: &str, req: &AddStorageCopysetMemberRequest) -> Result<PoolMember, Error> {
384 self.inner.post(&format!("/api/v1/storages/{}/copysets/{}/members", storage_id, crate::http::encode_segment(copyset_id)), req).await
385 }
386
387 pub async fn mark_member_lost(&self, storage_id: i64, copyset_id: &str, req: &MarkStorageMemberLostRequest) -> Result<PoolMember, Error> {
388 self.inner.post(&format!("/api/v1/storages/{}/copysets/{}/members/mark-lost", storage_id, crate::http::encode_segment(copyset_id)), req).await
389 }
390
391 pub async fn remove_member(&self, storage_id: i64, block_volume_id: &str) -> Result<RemoveMemberStorageResponse, Error> {
392 self.inner.delete(&format!("/api/v1/storages/{}/members/{}", storage_id, crate::http::encode_segment(block_volume_id))).await
393 }
394
395 pub async fn backfill_fingerprints(&self) -> Result<BackfillFingerprintsStorageResponse, Error> {
396 self.inner.post_empty("/api/v1/storages/backfill-fingerprints").await
397 }
398}
399
400pub struct VolumesService {
402 inner: Arc<ClientInner>,
403}
404
405impl VolumesService {
406 pub async fn create(&self, req: &CreateVolumeRequest) -> Result<CreateVolumeResponse, Error> {
407 self.inner.post("/api/v1/volumes/create", req).await
408 }
409
410 pub async fn list(&self, opts: &VolumeListOptions) -> Result<PaginatedResponse<Volume>, Error> {
411 let mut query: Vec<(&str, String)> = Vec::new();
412 query.push(("accountId", opts.account_id.to_string()));
413 if let Some(v) = &opts.region_id {
414 query.push(("regionId", v.to_string()));
415 }
416 if let Some(v) = &opts.metadata_cluster_id {
417 query.push(("metadataClusterId", v.to_string()));
418 }
419 if let Some(v) = &opts.storage_id {
420 query.push(("storageId", v.to_string()));
421 }
422 if let Some(v) = &opts.volume_type {
423 query.push(("volumeType", v.to_string()));
424 }
425 if let Some(v) = &opts.locked {
426 query.push(("locked", v.to_string()));
427 }
428 if let Some(v) = &opts.is_active {
429 query.push(("isActive", v.to_string()));
430 }
431 if let Some(v) = &opts.page {
432 query.push(("page", v.to_string()));
433 }
434 if let Some(v) = &opts.limit {
435 query.push(("limit", v.to_string()));
436 }
437 self.inner.get("/api/v1/volumes/list", &query).await
438 }
439
440 pub async fn get(&self, volume_id: i64) -> Result<Volume, Error> {
441 self.inner.get(&format!("/api/v1/volumes/{}", volume_id), &[]).await
442 }
443
444 pub async fn edit(&self, volume_id: i64, req: &EditVolumeRequest) -> Result<IdResponse, Error> {
445 self.inner.put(&format!("/api/v1/volumes/{}", volume_id), req).await
446 }
447
448 pub async fn lock(&self, volume_id: i64) -> Result<IdResponse, Error> {
449 self.inner.post_empty(&format!("/api/v1/volumes/{}/lock", volume_id)).await
450 }
451
452 pub async fn unlock(&self, volume_id: i64) -> Result<IdResponse, Error> {
453 self.inner.post_empty(&format!("/api/v1/volumes/{}/unlock", volume_id)).await
454 }
455
456 pub async fn move_cluster(&self, volume_id: i64, req: &MoveVolumeClusterRequest) -> Result<MoveClusterVolumeResponse, Error> {
457 self.inner.post(&format!("/api/v1/volumes/{}/move-cluster", volume_id), req).await
458 }
459
460 pub async fn deactivate(&self, volume_id: i64, req: &DeactivateVolumeRequest) -> Result<IdResponse, Error> {
461 self.inner.post(&format!("/api/v1/volumes/{}/deactivate", volume_id), req).await
462 }
463
464 pub async fn activate(&self, volume_id: i64) -> Result<IdResponse, Error> {
465 self.inner.post_empty(&format!("/api/v1/volumes/{}/activate", volume_id)).await
466 }
467
468 pub async fn generate_api_keys(&self, volume_id: i64, req: &GenerateVolumeAPIKeysRequest) -> Result<GenerateAPIKeysVolumeResponse, Error> {
469 self.inner.post(&format!("/api/v1/volumes/{}/api-keys/generate", volume_id), req).await
470 }
471
472 pub async fn list_api_keys(&self, volume_id: i64) -> Result<ListAPIKeysVolumeResponse, Error> {
473 self.inner.get(&format!("/api/v1/volumes/{}/api-keys", volume_id), &[]).await
474 }
475
476 pub async fn revoke_api_key(&self, volume_id: i64, req: &RevokeVolumeAPIKeyRequest) -> Result<(), Error> {
477 self.inner.post::<serde_json::Value, _>(&format!("/api/v1/volumes/{}/api-keys/revoke", volume_id), req).await.map(|_| ())
478 }
479
480 pub async fn revoke_api_keys_by_user(&self, volume_id: i64, req: &RevokeVolumeAPIKeysByUserRequest) -> Result<(), Error> {
481 self.inner.post::<serde_json::Value, _>(&format!("/api/v1/volumes/{}/api-keys/revoke-by-user", volume_id), req).await.map(|_| ())
482 }
483
484 pub async fn generate_stt_key(&self, volume_id: i64, req: &GenerateVolumeSttKeyRequest) -> Result<GenerateSttKeyVolumeResponse, Error> {
485 self.inner.post(&format!("/api/v1/volumes/{}/stt-key/generate", volume_id), req).await
486 }
487
488 pub async fn update_quota(&self, volume_id: i64, req: &UpdateVolumeQuotaRequest) -> Result<IdResponse, Error> {
489 self.inner.put(&format!("/api/v1/volumes/{}/quota", volume_id), req).await
490 }
491
492 pub async fn get_copyset_config(&self, volume_id: i64) -> Result<VolumeBlockPlacementConfig, Error> {
493 self.inner.get(&format!("/api/v1/volumes/{}/copyset-config", volume_id), &[]).await
494 }
495
496 pub async fn update_copyset_config(&self, volume_id: i64, req: &UpdateVolumeCopysetConfigRequest) -> Result<VolumeBlockPlacementResizeResult, Error> {
497 self.inner.put(&format!("/api/v1/volumes/{}/copyset-config", volume_id), req).await
498 }
499
500 pub async fn stats(&self, volume_id: i64) -> Result<StatsVolumeResponse, Error> {
501 self.inner.get(&format!("/api/v1/volumes/{}/stats", volume_id), &[]).await
502 }
503
504 pub async fn size_history(&self, volume_id: i64, from: Option<&str>, to: Option<&str>) -> Result<SizeHistoryVolumeResponse, Error> {
505 let mut query: Vec<(&str, String)> = Vec::new();
506 if let Some(v) = from {
507 query.push(("from", v.to_string()));
508 }
509 if let Some(v) = to {
510 query.push(("to", v.to_string()));
511 }
512 self.inner.get(&format!("/api/v1/volumes/{}/size-history", volume_id), &query).await
513 }
514
515 pub async fn create_fork(&self, volume_id: i64, req: &CreateVolumeForkRequest) -> Result<Fork, Error> {
516 self.inner.post(&format!("/api/v1/volumes/{}/forks/create", volume_id), req).await
517 }
518
519 pub async fn exclusive_grants(&self, volume_id: i64, fork: Option<&str>, limit: Option<i64>) -> Result<ExclusiveGrantsResponse, Error> {
520 let mut query: Vec<(&str, String)> = Vec::new();
521 if let Some(v) = fork {
522 query.push(("fork", v.to_string()));
523 }
524 if let Some(v) = limit {
525 query.push(("limit", v.to_string()));
526 }
527 self.inner.get(&format!("/api/v1/volumes/{}/exclusive-grants", volume_id), &query).await
528 }
529
530 pub async fn list_forks(&self, volume_id: i64, volume_type: Option<&str>, include_inactive: Option<bool>) -> Result<Vec<Fork>, Error> {
531 let mut query: Vec<(&str, String)> = Vec::new();
532 if let Some(v) = volume_type {
533 query.push(("volumeType", v.to_string()));
534 }
535 if let Some(v) = include_inactive {
536 query.push(("includeInactive", v.to_string()));
537 }
538 self.inner.get(&format!("/api/v1/volumes/{}/forks", volume_id), &query).await
539 }
540
541 pub async fn delete_fork(&self, volume_id: i64, fork_name: &str, req: &DeleteVolumeForkRequest) -> Result<DeleteForkVolumeResponse, Error> {
542 self.inner.post(&format!("/api/v1/volumes/{}/forks/{}/delete", volume_id, crate::http::encode_segment(fork_name)), req).await
543 }
544
545 pub async fn restore_fork(&self, volume_id: i64, fork_name: &str, req: &RestoreVolumeForkRequest) -> Result<Fork, Error> {
546 self.inner.post(&format!("/api/v1/volumes/{}/forks/{}/restore", volume_id, crate::http::encode_segment(fork_name)), req).await
547 }
548}
549
550pub struct VolumeForkTreesService {
552 inner: Arc<ClientInner>,
553}
554
555impl VolumeForkTreesService {
556 pub async fn list(&self, volume_id: i64, fork_name: &str, opts: Option<&VolumeForkTreeListOptions>) -> Result<StringCursorPaginatedResponse<ForkTreeEntry>, Error> {
557 let mut query: Vec<(&str, String)> = Vec::new();
558 if let Some(opts) = opts {
559 if let Some(v) = &opts.path {
560 query.push(("path", v.to_string()));
561 }
562 if let Some(v) = &opts.as_of {
563 query.push(("asOf", v.to_string()));
564 }
565 if let Some(v) = &opts.cursor {
566 query.push(("cursor", v.to_string()));
567 }
568 if let Some(v) = &opts.limit {
569 query.push(("limit", v.to_string()));
570 }
571 if let Some(v) = &opts.sort {
572 query.push(("sort", v.to_string()));
573 }
574 if let Some(v) = &opts.kind {
575 query.push(("kind", v.to_string()));
576 }
577 }
578 self.inner.get(&format!("/api/v1/volumes/{}/forks/{}/tree", volume_id, crate::http::encode_segment(fork_name)), &query).await
579 }
580}
581
582pub struct VolumeForkEntriesService {
584 inner: Arc<ClientInner>,
585}
586
587impl VolumeForkEntriesService {
588 pub async fn get(&self, volume_id: i64, fork_name: &str, path: Option<&str>, inode: Option<i64>, as_of: Option<i64>) -> Result<ForkEntryDetail, Error> {
589 let mut query: Vec<(&str, String)> = Vec::new();
590 if let Some(v) = path {
591 query.push(("path", v.to_string()));
592 }
593 if let Some(v) = inode {
594 query.push(("inode", v.to_string()));
595 }
596 if let Some(v) = as_of {
597 query.push(("asOf", v.to_string()));
598 }
599 self.inner.get(&format!("/api/v1/volumes/{}/forks/{}/entry", volume_id, crate::http::encode_segment(fork_name)), &query).await
600 }
601
602 pub async fn versions(&self, volume_id: i64, fork_name: &str, opts: Option<&VolumeForkEntryListOptions>) -> Result<CursorPaginatedResponse<ForkEntryVersion>, Error> {
603 let mut query: Vec<(&str, String)> = Vec::new();
604 if let Some(opts) = opts {
605 if let Some(v) = &opts.path {
606 query.push(("path", v.to_string()));
607 }
608 if let Some(v) = &opts.cursor {
609 query.push(("cursor", v.to_string()));
610 }
611 if let Some(v) = &opts.limit {
612 query.push(("limit", v.to_string()));
613 }
614 }
615 self.inner.get(&format!("/api/v1/volumes/{}/forks/{}/entry/versions", volume_id, crate::http::encode_segment(fork_name)), &query).await
616 }
617}
618
619pub struct VolumeForkSearchesService {
621 inner: Arc<ClientInner>,
622}
623
624impl VolumeForkSearchesService {
625 pub async fn find(&self, volume_id: i64, fork_name: &str, opts: Option<&VolumeForkSearchListOptions>) -> Result<CursorPaginatedResponse<ForkTreeMatch>, Error> {
626 let mut query: Vec<(&str, String)> = Vec::new();
627 if let Some(opts) = opts {
628 if let Some(v) = &opts.q {
629 query.push(("q", v.to_string()));
630 }
631 if let Some(v) = &opts.path {
632 query.push(("path", v.to_string()));
633 }
634 if let Some(v) = &opts.as_of {
635 query.push(("asOf", v.to_string()));
636 }
637 if let Some(v) = &opts.exact {
638 query.push(("exact", v.to_string()));
639 }
640 if let Some(v) = &opts.cursor {
641 query.push(("cursor", v.to_string()));
642 }
643 if let Some(v) = &opts.limit {
644 query.push(("limit", v.to_string()));
645 }
646 if let Some(v) = &opts.kind {
647 query.push(("kind", v.to_string()));
648 }
649 }
650 self.inner.get(&format!("/api/v1/volumes/{}/forks/{}/search", volume_id, crate::http::encode_segment(fork_name)), &query).await
651 }
652}
653
654pub struct AuditLogsService {
656 inner: Arc<ClientInner>,
657}
658
659impl AuditLogsService {
660 pub async fn list(&self, opts: &AuditLogListOptions) -> Result<CursorPaginatedResponse<AuditLog>, Error> {
661 let mut query: Vec<(&str, String)> = Vec::new();
662 query.push(("accountId", opts.account_id.to_string()));
663 if let Some(v) = &opts.region_id {
664 query.push(("regionId", v.to_string()));
665 }
666 if let Some(v) = &opts.metadata_cluster_id {
667 query.push(("metadataClusterId", v.to_string()));
668 }
669 if let Some(v) = &opts.cursor {
670 query.push(("cursor", v.to_string()));
671 }
672 if let Some(v) = &opts.limit {
673 query.push(("limit", v.to_string()));
674 }
675 if let Some(v) = &opts.subject {
676 query.push(("subject", v.to_string()));
677 }
678 if let Some(v) = &opts.created_by {
679 query.push(("createdBy", v.to_string()));
680 }
681 self.inner.get("/api/v1/audit-logs/list", &query).await
682 }
683}
684
685pub struct RegionAuditLogsService {
687 inner: Arc<ClientInner>,
688}
689
690impl RegionAuditLogsService {
691 pub async fn list(&self, region_id: i64, opts: Option<&RegionAuditLogListOptions>) -> Result<CursorPaginatedResponse<AuditLog>, Error> {
692 let mut query: Vec<(&str, String)> = Vec::new();
693 if let Some(opts) = opts {
694 if let Some(v) = &opts.metadata_cluster_id {
695 query.push(("metadataClusterId", v.to_string()));
696 }
697 if let Some(v) = &opts.cursor {
698 query.push(("cursor", v.to_string()));
699 }
700 if let Some(v) = &opts.limit {
701 query.push(("limit", v.to_string()));
702 }
703 if let Some(v) = &opts.subject {
704 query.push(("subject", v.to_string()));
705 }
706 if let Some(v) = &opts.node {
707 query.push(("node", v.to_string()));
708 }
709 }
710 self.inner.get(&format!("/api/v1/regions/{}/audit-logs/list", region_id), &query).await
711 }
712}
713
714pub struct ServiceNodesService {
716 inner: Arc<ClientInner>,
717}
718
719impl ServiceNodesService {
720 pub async fn list(&self, region_id: i64, service_type: Option<&str>, status: Option<&str>, inactive_hours: Option<i64>, metadata_cluster_id: Option<i64>) -> Result<Vec<ServiceNode>, Error> {
721 let mut query: Vec<(&str, String)> = Vec::new();
722 if let Some(v) = service_type {
723 query.push(("serviceType", v.to_string()));
724 }
725 if let Some(v) = status {
726 query.push(("status", v.to_string()));
727 }
728 if let Some(v) = inactive_hours {
729 query.push(("inactiveHours", v.to_string()));
730 }
731 if let Some(v) = metadata_cluster_id {
732 query.push(("metadataClusterId", v.to_string()));
733 }
734 self.inner.get(&format!("/api/v1/regions/{}/nodes", region_id), &query).await
735 }
736
737 pub async fn stats(&self, region_id: i64, node_id: &str) -> Result<String, Error> {
738 self.inner.get(&format!("/api/v1/regions/{}/nodes/{}/stats", region_id, crate::http::encode_segment(node_id)), &[]).await
739 }
740
741 pub async fn stats_history(&self, region_id: i64, node_id: &str) -> Result<StatsHistoryServiceNodeResponse, Error> {
742 self.inner.get(&format!("/api/v1/regions/{}/nodes/{}/stats/history", region_id, crate::http::encode_segment(node_id)), &[]).await
743 }
744}
745
746pub struct NodesService {
748 inner: Arc<ClientInner>,
749}
750
751impl NodesService {
752 pub async fn list(&self, account_id: i64, service_type: Option<&str>, status: Option<&str>, inactive_hours: Option<i64>) -> Result<Vec<ServiceNode>, Error> {
753 let mut query: Vec<(&str, String)> = Vec::new();
754 query.push(("accountId", account_id.to_string()));
755 if let Some(v) = service_type {
756 query.push(("serviceType", v.to_string()));
757 }
758 if let Some(v) = status {
759 query.push(("status", v.to_string()));
760 }
761 if let Some(v) = inactive_hours {
762 query.push(("inactiveHours", v.to_string()));
763 }
764 self.inner.get("/api/v1/nodes", &query).await
765 }
766}
767
768pub struct ClientSessionsService {
770 inner: Arc<ClientInner>,
771}
772
773impl ClientSessionsService {
774 pub async fn list(&self, opts: &ClientSessionListOptions) -> Result<PaginatedResponse<ClientSession>, Error> {
775 let mut query: Vec<(&str, String)> = Vec::new();
776 query.push(("accountId", opts.account_id.to_string()));
777 if let Some(v) = &opts.region_id {
778 query.push(("regionId", v.to_string()));
779 }
780 if let Some(v) = &opts.metadata_cluster_id {
781 query.push(("metadataClusterId", v.to_string()));
782 }
783 if let Some(v) = &opts.volume_id {
784 query.push(("volumeId", v.to_string()));
785 }
786 if let Some(v) = &opts.user_id {
787 query.push(("userId", v.to_string()));
788 }
789 if let Some(v) = &opts.client_type {
790 query.push(("clientType", v.to_string()));
791 }
792 if let Some(v) = &opts.status {
793 query.push(("status", v.to_string()));
794 }
795 if let Some(v) = &opts.is_active {
796 query.push(("isActive", v.to_string()));
797 }
798 if let Some(v) = &opts.os_name {
799 query.push(("osName", v.to_string()));
800 }
801 if let Some(v) = &opts.platform {
802 query.push(("platform", v.to_string()));
803 }
804 if let Some(v) = &opts.search {
805 query.push(("search", v.to_string()));
806 }
807 if let Some(v) = &opts.page {
808 query.push(("page", v.to_string()));
809 }
810 if let Some(v) = &opts.limit {
811 query.push(("limit", v.to_string()));
812 }
813 self.inner.get("/api/v1/client-sessions/list", &query).await
814 }
815
816 pub async fn get(&self, session_id: i64) -> Result<ClientSession, Error> {
817 self.inner.get(&format!("/api/v1/client-sessions/{}", session_id), &[]).await
818 }
819
820 pub async fn summary(&self, account_id: i64, region_id: Option<i64>, metadata_cluster_id: Option<i64>, volume_id: Option<i64>, user_id: Option<i64>) -> Result<SessionSummary, Error> {
821 let mut query: Vec<(&str, String)> = Vec::new();
822 query.push(("accountId", account_id.to_string()));
823 if let Some(v) = region_id {
824 query.push(("regionId", v.to_string()));
825 }
826 if let Some(v) = metadata_cluster_id {
827 query.push(("metadataClusterId", v.to_string()));
828 }
829 if let Some(v) = volume_id {
830 query.push(("volumeId", v.to_string()));
831 }
832 if let Some(v) = user_id {
833 query.push(("userId", v.to_string()));
834 }
835 self.inner.get("/api/v1/client-sessions/summary", &query).await
836 }
837
838 pub async fn mount_report(&self, session_id: i64) -> Result<MountReportResponse, Error> {
839 self.inner.get(&format!("/api/v1/client-sessions/{}/mount-report", session_id), &[]).await
840 }
841
842 pub async fn support_bundle(&self, session_id: i64) -> Result<SupportBundle, Error> {
843 self.inner.get(&format!("/api/v1/client-sessions/{}/support-bundle", session_id), &[]).await
844 }
845}
846
847pub struct DiscoverService {
849 inner: Arc<ClientInner>,
850}
851
852impl DiscoverService {
853 pub async fn meta(&self, access_key_id: &str) -> Result<DiscoverMetaResponse, Error> {
854 let mut query: Vec<(&str, String)> = Vec::new();
855 query.push(("accessKeyId", access_key_id.to_string()));
856 self.inner.get("/api/v1/discover/meta", &query).await
857 }
858
859 pub async fn metrics_targets(&self) -> Result<Vec<MetricsTarget>, Error> {
860 self.inner.get("/api/v1/discover/metrics-targets", &[]).await
861 }
862}
863
864pub struct MetricsService {
866 inner: Arc<ClientInner>,
867}
868
869impl MetricsService {
870 pub async fn generate_token(&self, req: &GenerateMetricTokenRequest) -> Result<MetricsTokenResponse, Error> {
871 self.inner.post("/api/v1/metrics/token", req).await
872 }
873}
874
875pub struct DashboardService {
877 inner: Arc<ClientInner>,
878}
879
880impl DashboardService {
881 pub async fn stats(&self, account_id: i64) -> Result<DashboardStats, Error> {
882 let mut query: Vec<(&str, String)> = Vec::new();
883 query.push(("accountId", account_id.to_string()));
884 self.inner.get("/api/v1/dashboard/stats", &query).await
885 }
886}
887
888pub struct LicenseService {
890 inner: Arc<ClientInner>,
891}
892
893impl LicenseService {
894 pub async fn get(&self) -> Result<LicenseDetails, Error> {
895 self.inner.get("/api/v1/license", &[]).await
896 }
897
898 pub async fn terms(&self) -> Result<LicenseTerms, Error> {
899 self.inner.get("/api/v1/license/terms", &[]).await
900 }
901
902 pub async fn load(&self, req: &LoadLicenseRequest) -> Result<LicenseLoadResult, Error> {
903 self.inner.post("/api/v1/license/load", req).await
904 }
905
906 pub async fn list(&self) -> Result<LicenseList, Error> {
907 self.inner.get("/api/v1/license/list", &[]).await
908 }
909}
910
911pub struct AlertsService {
913 inner: Arc<ClientInner>,
914}
915
916impl AlertsService {
917 pub async fn list(&self, opts: Option<&AlertListOptions>) -> Result<PaginatedResponse<ServiceAlert>, Error> {
918 let mut query: Vec<(&str, String)> = Vec::new();
919 if let Some(opts) = opts {
920 if let Some(v) = &opts.active {
921 query.push(("active", v.to_string()));
922 }
923 if let Some(v) = &opts.account_id {
924 query.push(("accountId", v.to_string()));
925 }
926 if let Some(v) = &opts.region_id {
927 query.push(("regionId", v.to_string()));
928 }
929 if let Some(v) = &opts.severity {
930 query.push(("severity", v.to_string()));
931 }
932 if let Some(v) = &opts.category {
933 query.push(("category", v.to_string()));
934 }
935 if let Some(v) = &opts.since {
936 query.push(("since", v.to_string()));
937 }
938 if let Some(v) = &opts.page {
939 query.push(("page", v.to_string()));
940 }
941 if let Some(v) = &opts.limit {
942 query.push(("limit", v.to_string()));
943 }
944 }
945 self.inner.get("/api/v1/alerts/list", &query).await
946 }
947
948 pub async fn count(&self) -> Result<AlertCountResponse, Error> {
949 self.inner.get("/api/v1/alerts/count", &[]).await
950 }
951
952 pub async fn resolve(&self, alert_id: &str) -> Result<ResolveAlertResponse, Error> {
953 self.inner.post_empty(&format!("/api/v1/alerts/{}/resolve", crate::http::encode_segment(alert_id))).await
954 }
955}
956
957pub struct RegionAlertsService {
959 inner: Arc<ClientInner>,
960}
961
962impl RegionAlertsService {
963 pub async fn list(&self, region_id: i64, opts: Option<&RegionAlertListOptions>) -> Result<PaginatedResponse<RegionAlert>, Error> {
964 let mut query: Vec<(&str, String)> = Vec::new();
965 if let Some(opts) = opts {
966 if let Some(v) = &opts.active {
967 query.push(("active", v.to_string()));
968 }
969 if let Some(v) = &opts.severity {
970 query.push(("severity", v.to_string()));
971 }
972 if let Some(v) = &opts.category {
973 query.push(("category", v.to_string()));
974 }
975 if let Some(v) = &opts.node_id {
976 query.push(("nodeId", v.to_string()));
977 }
978 if let Some(v) = &opts.metadata_cluster_id {
979 query.push(("metadataClusterId", v.to_string()));
980 }
981 if let Some(v) = &opts.since {
982 query.push(("since", v.to_string()));
983 }
984 if let Some(v) = &opts.page {
985 query.push(("page", v.to_string()));
986 }
987 if let Some(v) = &opts.limit {
988 query.push(("limit", v.to_string()));
989 }
990 }
991 self.inner.get(&format!("/api/v1/regions/{}/alerts/list", region_id), &query).await
992 }
993
994 pub async fn count(&self, region_id: i64, metadata_cluster_id: Option<i64>) -> Result<AlertCountResponse, Error> {
995 let mut query: Vec<(&str, String)> = Vec::new();
996 if let Some(v) = metadata_cluster_id {
997 query.push(("metadataClusterId", v.to_string()));
998 }
999 self.inner.get(&format!("/api/v1/regions/{}/alerts/count", region_id), &query).await
1000 }
1001
1002 pub async fn resolve(&self, region_id: i64, alert_id: &str) -> Result<ResolveRegionAlertResponse, Error> {
1003 self.inner.post_empty(&format!("/api/v1/regions/{}/alerts/{}/resolve", region_id, crate::http::encode_segment(alert_id))).await
1004 }
1005}
1006
1007pub struct GCWorkerEventsService {
1009 inner: Arc<ClientInner>,
1010}
1011
1012impl GCWorkerEventsService {
1013 pub async fn list(&self, region_id: i64, opts: Option<&GCWorkerEventListOptions>) -> Result<PaginatedResponse<GCWorkerEvent>, Error> {
1014 let mut query: Vec<(&str, String)> = Vec::new();
1015 if let Some(opts) = opts {
1016 if let Some(v) = &opts.node_id {
1017 query.push(("nodeId", v.to_string()));
1018 }
1019 if let Some(v) = &opts.goal {
1020 query.push(("goal", v.to_string()));
1021 }
1022 if let Some(v) = &opts.sid {
1023 query.push(("sid", v.to_string()));
1024 }
1025 if let Some(v) = &opts.metadata_cluster_id {
1026 query.push(("metadataClusterId", v.to_string()));
1027 }
1028 if let Some(v) = &opts.since {
1029 query.push(("since", v.to_string()));
1030 }
1031 if let Some(v) = &opts.page {
1032 query.push(("page", v.to_string()));
1033 }
1034 if let Some(v) = &opts.limit {
1035 query.push(("limit", v.to_string()));
1036 }
1037 }
1038 self.inner.get(&format!("/api/v1/regions/{}/gc-worker-events/list", region_id), &query).await
1039 }
1040
1041 pub async fn histogram(&self, region_id: i64, node_id: Option<&str>, goal: Option<&str>, sid: Option<i64>, metadata_cluster_id: Option<i64>, since: Option<&str>, bucket_seconds: Option<i64>) -> Result<GCWorkerEventHistogramResponse, Error> {
1042 let mut query: Vec<(&str, String)> = Vec::new();
1043 if let Some(v) = node_id {
1044 query.push(("nodeId", v.to_string()));
1045 }
1046 if let Some(v) = goal {
1047 query.push(("goal", v.to_string()));
1048 }
1049 if let Some(v) = sid {
1050 query.push(("sid", v.to_string()));
1051 }
1052 if let Some(v) = metadata_cluster_id {
1053 query.push(("metadataClusterId", v.to_string()));
1054 }
1055 if let Some(v) = since {
1056 query.push(("since", v.to_string()));
1057 }
1058 if let Some(v) = bucket_seconds {
1059 query.push(("bucketSeconds", v.to_string()));
1060 }
1061 self.inner.get(&format!("/api/v1/regions/{}/gc-worker-events/histogram", region_id), &query).await
1062 }
1063
1064 pub async fn goals(&self, region_id: i64, node_id: Option<&str>) -> Result<GCWorkerEventGoalsResponse, Error> {
1065 let mut query: Vec<(&str, String)> = Vec::new();
1066 if let Some(v) = node_id {
1067 query.push(("nodeId", v.to_string()));
1068 }
1069 self.inner.get(&format!("/api/v1/regions/{}/gc-worker-events/goals", region_id), &query).await
1070 }
1071}
1072
1073pub struct VaultService {
1075 inner: Arc<ClientInner>,
1076}
1077
1078impl VaultService {
1079 pub async fn resync(&self) -> Result<(), Error> {
1080 self.inner.post_empty::<serde_json::Value>("/api/v1/vault/resync").await.map(|_| ())
1081 }
1082}