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 region_clusters: RegionClustersService,
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 region_clusters: RegionClustersService { 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/{}/edit", 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.post("/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/{}/edit", 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/{}/edit", 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<RegionCluster>, 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 RegionClustersService {
231 inner: Arc<ClientInner>,
232}
233
234impl RegionClustersService {
235 pub async fn create(&self, region_id: i64, req: &CreateRegionClusterRequest) -> 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<&RegionClusterListOptions>) -> Result<PaginatedResponse<RegionCluster>, 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<RegionCluster, 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: &EditRegionClusterRequest) -> Result<IdResponse, Error> {
260 self.inner.put(&format!("/api/v1/regions/{}/clusters/{}/edit", 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: &SetRegionClusterReadyRequest) -> Result<SetReadyRegionClusterResponse, 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<CreateStorageResponse, 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/{}/edit", 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_bucket(&self, req: &TestStorageBucketRequest) -> Result<TestBucketStorageResponse, 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 backfill_fingerprints(&self) -> Result<BackfillFingerprintsStorageResponse, Error> {
349 self.inner.post_empty("/api/v1/storages/backfill-fingerprints").await
350 }
351}
352
353pub struct VolumesService {
355 inner: Arc<ClientInner>,
356}
357
358impl VolumesService {
359 pub async fn create(&self, req: &CreateVolumeRequest) -> Result<CreateVolumeResponse, Error> {
360 self.inner.post("/api/v1/volumes/create", req).await
361 }
362
363 pub async fn list(&self, opts: &VolumeListOptions) -> Result<PaginatedResponse<Volume>, Error> {
364 let mut query: Vec<(&str, String)> = Vec::new();
365 query.push(("accountId", opts.account_id.to_string()));
366 if let Some(v) = &opts.region_id {
367 query.push(("regionId", v.to_string()));
368 }
369 if let Some(v) = &opts.region_cluster_id {
370 query.push(("regionClusterId", v.to_string()));
371 }
372 if let Some(v) = &opts.storage_id {
373 query.push(("storageId", v.to_string()));
374 }
375 if let Some(v) = &opts.volume_type {
376 query.push(("volumeType", v.to_string()));
377 }
378 if let Some(v) = &opts.locked {
379 query.push(("locked", v.to_string()));
380 }
381 if let Some(v) = &opts.is_active {
382 query.push(("isActive", v.to_string()));
383 }
384 if let Some(v) = &opts.page {
385 query.push(("page", v.to_string()));
386 }
387 if let Some(v) = &opts.limit {
388 query.push(("limit", v.to_string()));
389 }
390 self.inner.get("/api/v1/volumes/list", &query).await
391 }
392
393 pub async fn get(&self, volume_id: i64) -> Result<Volume, Error> {
394 self.inner.get(&format!("/api/v1/volumes/{}", volume_id), &[]).await
395 }
396
397 pub async fn edit(&self, volume_id: i64, req: &EditVolumeRequest) -> Result<IdResponse, Error> {
398 self.inner.put(&format!("/api/v1/volumes/{}/edit", volume_id), req).await
399 }
400
401 pub async fn lock(&self, volume_id: i64) -> Result<IdResponse, Error> {
402 self.inner.post_empty(&format!("/api/v1/volumes/{}/lock", volume_id)).await
403 }
404
405 pub async fn unlock(&self, volume_id: i64) -> Result<IdResponse, Error> {
406 self.inner.post_empty(&format!("/api/v1/volumes/{}/unlock", volume_id)).await
407 }
408
409 pub async fn move_cluster(&self, volume_id: i64, req: &MoveVolumeClusterRequest) -> Result<MoveClusterVolumeResponse, Error> {
410 self.inner.post(&format!("/api/v1/volumes/{}/move-cluster", volume_id), req).await
411 }
412
413 pub async fn deactivate(&self, volume_id: i64, req: &DeactivateVolumeRequest) -> Result<IdResponse, Error> {
414 self.inner.post(&format!("/api/v1/volumes/{}/deactivate", volume_id), req).await
415 }
416
417 pub async fn activate(&self, volume_id: i64) -> Result<IdResponse, Error> {
418 self.inner.post_empty(&format!("/api/v1/volumes/{}/activate", volume_id)).await
419 }
420
421 pub async fn generate_api_keys(&self, volume_id: i64, req: &GenerateVolumeAPIKeysRequest) -> Result<GenerateAPIKeysVolumeResponse, Error> {
422 self.inner.post(&format!("/api/v1/volumes/{}/api-keys/generate", volume_id), req).await
423 }
424
425 pub async fn list_api_keys(&self, volume_id: i64) -> Result<ListAPIKeysVolumeResponse, Error> {
426 self.inner.get(&format!("/api/v1/volumes/{}/api-keys", volume_id), &[]).await
427 }
428
429 pub async fn revoke_api_key(&self, volume_id: i64, req: &RevokeVolumeAPIKeyRequest) -> Result<(), Error> {
430 self.inner.post::<serde_json::Value, _>(&format!("/api/v1/volumes/{}/api-keys/revoke", volume_id), req).await.map(|_| ())
431 }
432
433 pub async fn revoke_api_keys_by_user(&self, volume_id: i64, req: &RevokeVolumeAPIKeysByUserRequest) -> Result<(), Error> {
434 self.inner.post::<serde_json::Value, _>(&format!("/api/v1/volumes/{}/api-keys/revoke-by-user", volume_id), req).await.map(|_| ())
435 }
436
437 pub async fn generate_stt_key(&self, volume_id: i64, req: &GenerateVolumeSttKeyRequest) -> Result<GenerateSttKeyVolumeResponse, Error> {
438 self.inner.post(&format!("/api/v1/volumes/{}/stt-key/generate", volume_id), req).await
439 }
440
441 pub async fn update_quota(&self, volume_id: i64, req: &UpdateVolumeQuotaRequest) -> Result<IdResponse, Error> {
442 self.inner.put(&format!("/api/v1/volumes/{}/quota", volume_id), req).await
443 }
444
445 pub async fn stats(&self, volume_id: i64) -> Result<StatsVolumeResponse, Error> {
446 self.inner.get(&format!("/api/v1/volumes/{}/stats", volume_id), &[]).await
447 }
448
449 pub async fn size_history(&self, volume_id: i64, from: Option<&str>, to: Option<&str>) -> Result<SizeHistoryVolumeResponse, Error> {
450 let mut query: Vec<(&str, String)> = Vec::new();
451 if let Some(v) = from {
452 query.push(("from", v.to_string()));
453 }
454 if let Some(v) = to {
455 query.push(("to", v.to_string()));
456 }
457 self.inner.get(&format!("/api/v1/volumes/{}/size-history", volume_id), &query).await
458 }
459
460 pub async fn create_fork(&self, volume_id: i64, req: &CreateVolumeForkRequest) -> Result<Fork, Error> {
461 self.inner.post(&format!("/api/v1/volumes/{}/forks/create", volume_id), req).await
462 }
463
464 pub async fn list_forks(&self, volume_id: i64, volume_type: Option<&str>) -> Result<Vec<Fork>, Error> {
465 let mut query: Vec<(&str, String)> = Vec::new();
466 if let Some(v) = volume_type {
467 query.push(("volumeType", v.to_string()));
468 }
469 self.inner.get(&format!("/api/v1/volumes/{}/forks", volume_id), &query).await
470 }
471
472 pub async fn list_all_forks(&self, volume_id: i64, volume_type: Option<&str>) -> Result<Vec<Fork>, Error> {
473 let mut query: Vec<(&str, String)> = Vec::new();
474 if let Some(v) = volume_type {
475 query.push(("volumeType", v.to_string()));
476 }
477 self.inner.get(&format!("/api/v1/volumes/{}/forks?include_inactive=true", volume_id), &query).await
478 }
479
480 pub async fn delete_fork(&self, volume_id: i64, fork_name: &str, req: &DeleteVolumeForkRequest) -> Result<DeleteForkVolumeResponse, Error> {
481 self.inner.post(&format!("/api/v1/volumes/{}/forks/{}/delete", volume_id, fork_name), req).await
482 }
483
484 pub async fn restore_fork(&self, volume_id: i64, fork_name: &str, req: &RestoreVolumeForkRequest) -> Result<Fork, Error> {
485 self.inner.post(&format!("/api/v1/volumes/{}/forks/{}/restore", volume_id, fork_name), req).await
486 }
487}
488
489pub struct VolumeForkTreesService {
491 inner: Arc<ClientInner>,
492}
493
494impl VolumeForkTreesService {
495 pub async fn list(&self, volume_id: i64, fork_name: &str, opts: Option<&VolumeForkTreeListOptions>) -> Result<CursorPaginatedResponse<ForkTreeEntry>, Error> {
496 let mut query: Vec<(&str, String)> = Vec::new();
497 if let Some(opts) = opts {
498 if let Some(v) = &opts.path {
499 query.push(("path", v.to_string()));
500 }
501 if let Some(v) = &opts.as_of {
502 query.push(("asOf", v.to_string()));
503 }
504 if let Some(v) = &opts.cursor {
505 query.push(("cursor", v.to_string()));
506 }
507 if let Some(v) = &opts.limit {
508 query.push(("limit", v.to_string()));
509 }
510 if let Some(v) = &opts.sort {
511 query.push(("sort", v.to_string()));
512 }
513 if let Some(v) = &opts.kind {
514 query.push(("kind", v.to_string()));
515 }
516 }
517 self.inner.get(&format!("/api/v1/volumes/{}/forks/{}/tree", volume_id, fork_name), &query).await
518 }
519}
520
521pub struct VolumeForkEntriesService {
523 inner: Arc<ClientInner>,
524}
525
526impl VolumeForkEntriesService {
527 pub async fn get(&self, volume_id: i64, fork_name: &str, path: Option<&str>, inode: Option<i64>, as_of: Option<i64>) -> Result<ForkEntryDetail, Error> {
528 let mut query: Vec<(&str, String)> = Vec::new();
529 if let Some(v) = path {
530 query.push(("path", v.to_string()));
531 }
532 if let Some(v) = inode {
533 query.push(("inode", v.to_string()));
534 }
535 if let Some(v) = as_of {
536 query.push(("asOf", v.to_string()));
537 }
538 self.inner.get(&format!("/api/v1/volumes/{}/forks/{}/entry", volume_id, fork_name), &query).await
539 }
540
541 pub async fn versions(&self, volume_id: i64, fork_name: &str, opts: Option<&VolumeForkEntryListOptions>) -> Result<CursorPaginatedResponse<ForkEntryVersion>, Error> {
542 let mut query: Vec<(&str, String)> = Vec::new();
543 if let Some(opts) = opts {
544 if let Some(v) = &opts.path {
545 query.push(("path", v.to_string()));
546 }
547 if let Some(v) = &opts.cursor {
548 query.push(("cursor", v.to_string()));
549 }
550 if let Some(v) = &opts.limit {
551 query.push(("limit", v.to_string()));
552 }
553 }
554 self.inner.get(&format!("/api/v1/volumes/{}/forks/{}/entry/versions", volume_id, fork_name), &query).await
555 }
556}
557
558pub struct VolumeForkSearchesService {
560 inner: Arc<ClientInner>,
561}
562
563impl VolumeForkSearchesService {
564 pub async fn find(&self, volume_id: i64, fork_name: &str, opts: Option<&VolumeForkSearchListOptions>) -> Result<CursorPaginatedResponse<ForkTreeMatch>, Error> {
565 let mut query: Vec<(&str, String)> = Vec::new();
566 if let Some(opts) = opts {
567 if let Some(v) = &opts.q {
568 query.push(("q", v.to_string()));
569 }
570 if let Some(v) = &opts.path {
571 query.push(("path", v.to_string()));
572 }
573 if let Some(v) = &opts.as_of {
574 query.push(("asOf", v.to_string()));
575 }
576 if let Some(v) = &opts.exact {
577 query.push(("exact", v.to_string()));
578 }
579 if let Some(v) = &opts.cursor {
580 query.push(("cursor", v.to_string()));
581 }
582 if let Some(v) = &opts.limit {
583 query.push(("limit", v.to_string()));
584 }
585 if let Some(v) = &opts.kind {
586 query.push(("kind", v.to_string()));
587 }
588 }
589 self.inner.get(&format!("/api/v1/volumes/{}/forks/{}/search", volume_id, fork_name), &query).await
590 }
591}
592
593pub struct AuditLogsService {
595 inner: Arc<ClientInner>,
596}
597
598impl AuditLogsService {
599 pub async fn list(&self, opts: &AuditLogListOptions) -> Result<CursorPaginatedResponse<AuditLog>, Error> {
600 let mut query: Vec<(&str, String)> = Vec::new();
601 query.push(("accountId", opts.account_id.to_string()));
602 if let Some(v) = &opts.region_id {
603 query.push(("regionId", v.to_string()));
604 }
605 if let Some(v) = &opts.region_cluster_id {
606 query.push(("regionClusterId", 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 if let Some(v) = &opts.subject {
615 query.push(("subject", v.to_string()));
616 }
617 self.inner.get("/api/v1/audit-logs/list", &query).await
618 }
619}
620
621pub struct RegionAuditLogsService {
623 inner: Arc<ClientInner>,
624}
625
626impl RegionAuditLogsService {
627 pub async fn list(&self, region_id: i64, opts: Option<&RegionAuditLogListOptions>) -> Result<CursorPaginatedResponse<AuditLog>, Error> {
628 let mut query: Vec<(&str, String)> = Vec::new();
629 if let Some(opts) = opts {
630 if let Some(v) = &opts.region_cluster_id {
631 query.push(("regionClusterId", v.to_string()));
632 }
633 if let Some(v) = &opts.cursor {
634 query.push(("cursor", v.to_string()));
635 }
636 if let Some(v) = &opts.limit {
637 query.push(("limit", v.to_string()));
638 }
639 if let Some(v) = &opts.subject {
640 query.push(("subject", v.to_string()));
641 }
642 if let Some(v) = &opts.node {
643 query.push(("node", v.to_string()));
644 }
645 }
646 self.inner.get(&format!("/api/v1/regions/{}/audit-logs/list", region_id), &query).await
647 }
648}
649
650pub struct ServiceNodesService {
652 inner: Arc<ClientInner>,
653}
654
655impl ServiceNodesService {
656 pub async fn list(&self, region_id: i64, service_type: Option<&str>, status: Option<&str>, inactive_hours: Option<i64>, region_cluster_id: Option<i64>) -> Result<Vec<ServiceNode>, Error> {
657 let mut query: Vec<(&str, String)> = Vec::new();
658 if let Some(v) = service_type {
659 query.push(("serviceType", v.to_string()));
660 }
661 if let Some(v) = status {
662 query.push(("status", v.to_string()));
663 }
664 if let Some(v) = inactive_hours {
665 query.push(("inactiveHours", v.to_string()));
666 }
667 if let Some(v) = region_cluster_id {
668 query.push(("regionClusterId", v.to_string()));
669 }
670 self.inner.get(&format!("/api/v1/regions/{}/nodes", region_id), &query).await
671 }
672
673 pub async fn stats(&self, region_id: i64, node_id: &str) -> Result<String, Error> {
674 self.inner.get(&format!("/api/v1/regions/{}/nodes/{}/stats", region_id, crate::http::encode_segment(node_id)), &[]).await
675 }
676
677 pub async fn stats_history(&self, region_id: i64, node_id: &str) -> Result<StatsHistoryServiceNodeResponse, Error> {
678 self.inner.get(&format!("/api/v1/regions/{}/nodes/{}/stats/history", region_id, crate::http::encode_segment(node_id)), &[]).await
679 }
680}
681
682pub struct NodesService {
684 inner: Arc<ClientInner>,
685}
686
687impl NodesService {
688 pub async fn list_all(&self, account_id: i64, service_type: Option<&str>, status: Option<&str>, inactive_hours: Option<i64>) -> Result<Vec<ServiceNode>, Error> {
689 let mut query: Vec<(&str, String)> = Vec::new();
690 query.push(("accountId", account_id.to_string()));
691 if let Some(v) = service_type {
692 query.push(("serviceType", v.to_string()));
693 }
694 if let Some(v) = status {
695 query.push(("status", v.to_string()));
696 }
697 if let Some(v) = inactive_hours {
698 query.push(("inactiveHours", v.to_string()));
699 }
700 self.inner.get("/api/v1/nodes", &query).await
701 }
702}
703
704pub struct ClientSessionsService {
706 inner: Arc<ClientInner>,
707}
708
709impl ClientSessionsService {
710 pub async fn list(&self, opts: &ClientSessionListOptions) -> Result<PaginatedResponse<ClientSession>, Error> {
711 let mut query: Vec<(&str, String)> = Vec::new();
712 query.push(("accountId", opts.account_id.to_string()));
713 if let Some(v) = &opts.region_id {
714 query.push(("regionId", v.to_string()));
715 }
716 if let Some(v) = &opts.region_cluster_id {
717 query.push(("regionClusterId", v.to_string()));
718 }
719 if let Some(v) = &opts.volume_id {
720 query.push(("volumeId", v.to_string()));
721 }
722 if let Some(v) = &opts.user_id {
723 query.push(("userId", v.to_string()));
724 }
725 if let Some(v) = &opts.client_type {
726 query.push(("clientType", v.to_string()));
727 }
728 if let Some(v) = &opts.status {
729 query.push(("status", v.to_string()));
730 }
731 if let Some(v) = &opts.is_active {
732 query.push(("isActive", v.to_string()));
733 }
734 if let Some(v) = &opts.os_name {
735 query.push(("osName", v.to_string()));
736 }
737 if let Some(v) = &opts.platform {
738 query.push(("platform", v.to_string()));
739 }
740 if let Some(v) = &opts.search {
741 query.push(("search", v.to_string()));
742 }
743 if let Some(v) = &opts.page {
744 query.push(("page", v.to_string()));
745 }
746 if let Some(v) = &opts.limit {
747 query.push(("limit", v.to_string()));
748 }
749 self.inner.get("/api/v1/client-sessions/list", &query).await
750 }
751
752 pub async fn get(&self, session_id: i64) -> Result<ClientSession, Error> {
753 self.inner.get(&format!("/api/v1/client-sessions/{}", session_id), &[]).await
754 }
755
756 pub async fn summary(&self, account_id: i64, region_id: Option<i64>, region_cluster_id: Option<i64>, volume_id: Option<i64>, user_id: Option<i64>) -> Result<SessionSummary, Error> {
757 let mut query: Vec<(&str, String)> = Vec::new();
758 query.push(("accountId", account_id.to_string()));
759 if let Some(v) = region_id {
760 query.push(("regionId", v.to_string()));
761 }
762 if let Some(v) = region_cluster_id {
763 query.push(("regionClusterId", v.to_string()));
764 }
765 if let Some(v) = volume_id {
766 query.push(("volumeId", v.to_string()));
767 }
768 if let Some(v) = user_id {
769 query.push(("userId", v.to_string()));
770 }
771 self.inner.get("/api/v1/client-sessions/summary", &query).await
772 }
773}
774
775pub struct DiscoverService {
777 inner: Arc<ClientInner>,
778}
779
780impl DiscoverService {
781 pub async fn meta(&self, access_key_id: &str) -> Result<DiscoverMetaResponse, Error> {
782 let mut query: Vec<(&str, String)> = Vec::new();
783 query.push(("access_key_id", access_key_id.to_string()));
784 self.inner.get("/api/v1/discover/meta", &query).await
785 }
786
787 pub async fn metrics_targets(&self) -> Result<Vec<MetricsTarget>, Error> {
788 self.inner.get("/api/v1/discover/metrics-targets", &[]).await
789 }
790}
791
792pub struct MetricsService {
794 inner: Arc<ClientInner>,
795}
796
797impl MetricsService {
798 pub async fn generate_token(&self, req: &GenerateMetricTokenRequest) -> Result<MetricsTokenResponse, Error> {
799 self.inner.post("/api/v1/metrics/token", req).await
800 }
801}
802
803pub struct DashboardService {
805 inner: Arc<ClientInner>,
806}
807
808impl DashboardService {
809 pub async fn stats(&self, account_id: i64) -> Result<DashboardStats, Error> {
810 let mut query: Vec<(&str, String)> = Vec::new();
811 query.push(("accountId", account_id.to_string()));
812 self.inner.get("/api/v1/dashboard/stats", &query).await
813 }
814}
815
816pub struct LicenseService {
818 inner: Arc<ClientInner>,
819}
820
821impl LicenseService {
822 pub async fn get(&self) -> Result<LicenseDetails, Error> {
823 self.inner.get("/api/v1/license", &[]).await
824 }
825
826 pub async fn terms(&self) -> Result<LicenseTerms, Error> {
827 self.inner.get("/api/v1/license/terms", &[]).await
828 }
829
830 pub async fn load(&self, req: &LoadLicenseRequest) -> Result<LicenseLoadResult, Error> {
831 self.inner.post("/api/v1/license/load", req).await
832 }
833
834 pub async fn list(&self) -> Result<LicenseList, Error> {
835 self.inner.get("/api/v1/license/list", &[]).await
836 }
837}
838
839pub struct AlertsService {
841 inner: Arc<ClientInner>,
842}
843
844impl AlertsService {
845 pub async fn list(&self, opts: Option<&AlertListOptions>) -> Result<PaginatedResponse<ServiceAlert>, Error> {
846 let mut query: Vec<(&str, String)> = Vec::new();
847 if let Some(opts) = opts {
848 if let Some(v) = &opts.active {
849 query.push(("active", v.to_string()));
850 }
851 if let Some(v) = &opts.account_id {
852 query.push(("accountId", v.to_string()));
853 }
854 if let Some(v) = &opts.region_id {
855 query.push(("regionId", v.to_string()));
856 }
857 if let Some(v) = &opts.severity {
858 query.push(("severity", v.to_string()));
859 }
860 if let Some(v) = &opts.category {
861 query.push(("category", v.to_string()));
862 }
863 if let Some(v) = &opts.since {
864 query.push(("since", v.to_string()));
865 }
866 if let Some(v) = &opts.page {
867 query.push(("page", v.to_string()));
868 }
869 if let Some(v) = &opts.limit {
870 query.push(("limit", v.to_string()));
871 }
872 }
873 self.inner.get("/api/v1/alerts/list", &query).await
874 }
875
876 pub async fn count(&self) -> Result<AlertCountResponse, Error> {
877 self.inner.get("/api/v1/alerts/count", &[]).await
878 }
879
880 pub async fn resolve(&self, alert_id: &str) -> Result<(), Error> {
881 self.inner.post_empty::<serde_json::Value>(&format!("/api/v1/alerts/{}/resolve", alert_id)).await.map(|_| ())
882 }
883}
884
885pub struct RegionAlertsService {
887 inner: Arc<ClientInner>,
888}
889
890impl RegionAlertsService {
891 pub async fn list(&self, region_id: i64, opts: Option<&RegionAlertListOptions>) -> Result<PaginatedResponse<RegionAlert>, Error> {
892 let mut query: Vec<(&str, String)> = Vec::new();
893 if let Some(opts) = opts {
894 if let Some(v) = &opts.active {
895 query.push(("active", v.to_string()));
896 }
897 if let Some(v) = &opts.severity {
898 query.push(("severity", v.to_string()));
899 }
900 if let Some(v) = &opts.category {
901 query.push(("category", v.to_string()));
902 }
903 if let Some(v) = &opts.node_id {
904 query.push(("nodeId", v.to_string()));
905 }
906 if let Some(v) = &opts.region_cluster_id {
907 query.push(("regionClusterId", v.to_string()));
908 }
909 if let Some(v) = &opts.since {
910 query.push(("since", v.to_string()));
911 }
912 if let Some(v) = &opts.page {
913 query.push(("page", v.to_string()));
914 }
915 if let Some(v) = &opts.limit {
916 query.push(("limit", v.to_string()));
917 }
918 }
919 self.inner.get(&format!("/api/v1/regions/{}/alerts/list", region_id), &query).await
920 }
921
922 pub async fn count(&self, region_id: i64, region_cluster_id: Option<i64>) -> Result<AlertCountResponse, Error> {
923 let mut query: Vec<(&str, String)> = Vec::new();
924 if let Some(v) = region_cluster_id {
925 query.push(("regionClusterId", v.to_string()));
926 }
927 self.inner.get(&format!("/api/v1/regions/{}/alerts/count", region_id), &query).await
928 }
929
930 pub async fn resolve(&self, region_id: i64, alert_id: &str) -> Result<(), Error> {
931 self.inner.post_empty::<serde_json::Value>(&format!("/api/v1/regions/{}/alerts/{}/resolve", region_id, alert_id)).await.map(|_| ())
932 }
933}
934
935pub struct GCWorkerEventsService {
937 inner: Arc<ClientInner>,
938}
939
940impl GCWorkerEventsService {
941 pub async fn list(&self, region_id: i64, opts: Option<&GCWorkerEventListOptions>) -> Result<PaginatedResponse<GCWorkerEvent>, Error> {
942 let mut query: Vec<(&str, String)> = Vec::new();
943 if let Some(opts) = opts {
944 if let Some(v) = &opts.node_id {
945 query.push(("nodeId", v.to_string()));
946 }
947 if let Some(v) = &opts.goal {
948 query.push(("goal", v.to_string()));
949 }
950 if let Some(v) = &opts.sid {
951 query.push(("sid", v.to_string()));
952 }
953 if let Some(v) = &opts.region_cluster_id {
954 query.push(("regionClusterId", v.to_string()));
955 }
956 if let Some(v) = &opts.since {
957 query.push(("since", v.to_string()));
958 }
959 if let Some(v) = &opts.page {
960 query.push(("page", v.to_string()));
961 }
962 if let Some(v) = &opts.limit {
963 query.push(("limit", v.to_string()));
964 }
965 }
966 self.inner.get(&format!("/api/v1/regions/{}/gc-worker-events/list", region_id), &query).await
967 }
968
969 pub async fn histogram(&self, region_id: i64, node_id: Option<&str>, goal: Option<&str>, sid: Option<i64>, region_cluster_id: Option<i64>, since: Option<&str>, bucket_seconds: Option<i64>) -> Result<GCWorkerEventHistogramResponse, Error> {
970 let mut query: Vec<(&str, String)> = Vec::new();
971 if let Some(v) = node_id {
972 query.push(("nodeId", v.to_string()));
973 }
974 if let Some(v) = goal {
975 query.push(("goal", v.to_string()));
976 }
977 if let Some(v) = sid {
978 query.push(("sid", v.to_string()));
979 }
980 if let Some(v) = region_cluster_id {
981 query.push(("regionClusterId", v.to_string()));
982 }
983 if let Some(v) = since {
984 query.push(("since", v.to_string()));
985 }
986 if let Some(v) = bucket_seconds {
987 query.push(("bucketSeconds", v.to_string()));
988 }
989 self.inner.get(&format!("/api/v1/regions/{}/gc-worker-events/histogram", region_id), &query).await
990 }
991
992 pub async fn goals(&self, region_id: i64, node_id: Option<&str>) -> Result<GCWorkerEventGoalsResponse, Error> {
993 let mut query: Vec<(&str, String)> = Vec::new();
994 if let Some(v) = node_id {
995 query.push(("nodeId", v.to_string()));
996 }
997 self.inner.get(&format!("/api/v1/regions/{}/gc-worker-events/goals", region_id), &query).await
998 }
999}
1000
1001pub struct VaultService {
1003 inner: Arc<ClientInner>,
1004}
1005
1006impl VaultService {
1007 pub async fn resync(&self) -> Result<(), Error> {
1008 self.inner.post_empty::<serde_json::Value>("/api/v1/vault/resync").await.map(|_| ())
1009 }
1010}