From 4a82f6380e6a7d7c841477fc914fd96e6c09adad Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Wed, 14 Jun 2023 14:15:51 +0200 Subject: [PATCH] admin api: move all endpoints to v1/ by default (v0/ still supported) --- doc/drafts/admin-api.md | 44 ++++++++++++++++++++-------------------- src/api/admin/router.rs | 44 ++++++++++++++++++++-------------------- src/api/router_macros.rs | 7 +------ 3 files changed, 45 insertions(+), 50 deletions(-) diff --git a/doc/drafts/admin-api.md b/doc/drafts/admin-api.md index 668de1bd..79ea7e8c 100644 --- a/doc/drafts/admin-api.md +++ b/doc/drafts/admin-api.md @@ -194,7 +194,7 @@ Example response body: } ``` -#### ConnectClusterNodes `POST /v0/connect` +#### ConnectClusterNodes `POST /v1/connect` Instructs this Garage node to connect to other Garage nodes at specified addresses. @@ -319,7 +319,7 @@ Contrary to the CLI that may update only a subset of the fields values must be specified. -#### ApplyClusterLayout `POST /v0/layout/apply` +#### ApplyClusterLayout `POST /v1/layout/apply` Applies to the cluster the layout changes currently registered as staged layout changes. @@ -336,7 +336,7 @@ Similarly to the CLI, the body must include the version of the new layout that will be created, which MUST be 1 + the value of the currently existing layout in the cluster. -#### RevertClusterLayout `POST /v0/layout/revert` +#### RevertClusterLayout `POST /v1/layout/revert` Clears all of the staged layout changes. @@ -357,7 +357,7 @@ existing layout in the cluster. ### Access key operations -#### ListKeys `GET /v0/key` +#### ListKeys `GET /v1/key` Returns all API access keys in the cluster. @@ -376,7 +376,7 @@ Example response: ] ``` -#### CreateKey `POST /v0/key` +#### CreateKey `POST /v1/key` Creates a new API access key. @@ -388,7 +388,7 @@ Request body format: } ``` -#### ImportKey `POST /v0/key/import` +#### ImportKey `POST /v1/key/import` Imports an existing API key. @@ -402,8 +402,8 @@ Request body format: } ``` -#### GetKeyInfo `GET /v0/key?id=` -#### GetKeyInfo `GET /v0/key?search=` +#### GetKeyInfo `GET /v1/key?id=` +#### GetKeyInfo `GET /v1/key?search=` Returns information about the requested API access key. @@ -474,11 +474,11 @@ Example response: } ``` -#### DeleteKey `DELETE /v0/key?id=` +#### DeleteKey `DELETE /v1/key?id=` Deletes an API access key. -#### UpdateKey `POST /v0/key?id=` +#### UpdateKey `POST /v1/key?id=` Updates information about the specified API access key. @@ -501,7 +501,7 @@ The possible flags in `allow` and `deny` are: `createBucket`. ### Bucket operations -#### ListBuckets `GET /v0/bucket` +#### ListBuckets `GET /v1/bucket` Returns all storage buckets in the cluster. @@ -543,8 +543,8 @@ Example response: ] ``` -#### GetBucketInfo `GET /v0/bucket?id=` -#### GetBucketInfo `GET /v0/bucket?globalAlias=` +#### GetBucketInfo `GET /v1/bucket?id=` +#### GetBucketInfo `GET /v1/bucket?globalAlias=` Returns information about the requested storage bucket. @@ -587,7 +587,7 @@ Example response: } ``` -#### CreateBucket `POST /v0/bucket` +#### CreateBucket `POST /v1/bucket` Creates a new storage bucket. @@ -627,13 +627,13 @@ or no alias at all. Technically, you can also specify both `globalAlias` and `localAlias` and that would create two aliases, but I don't see why you would want to do that. -#### DeleteBucket `DELETE /v0/bucket?id=` +#### DeleteBucket `DELETE /v1/bucket?id=` Deletes a storage bucket. A bucket cannot be deleted if it is not empty. Warning: this will delete all aliases associated with the bucket! -#### UpdateBucket `PUT /v0/bucket?id=` +#### UpdateBucket `PUT /v1/bucket?id=` Updates configuration of the given bucket. @@ -667,7 +667,7 @@ to change only one of the two quotas. ### Operations on permissions for keys on buckets -#### BucketAllowKey `POST /v0/bucket/allow` +#### BucketAllowKey `POST /v1/bucket/allow` Allows a key to do read/write/owner operations on a bucket. @@ -688,7 +688,7 @@ Request body format: Flags in `permissions` which have the value `true` will be activated. Other flags will remain unchanged. -#### BucketDenyKey `POST /v0/bucket/deny` +#### BucketDenyKey `POST /v1/bucket/deny` Denies a key from doing read/write/owner operations on a bucket. @@ -712,19 +712,19 @@ Other flags will remain unchanged. ### Operations on bucket aliases -#### GlobalAliasBucket `PUT /v0/bucket/alias/global?id=&alias=` +#### GlobalAliasBucket `PUT /v1/bucket/alias/global?id=&alias=` Empty body. Creates a global alias for a bucket. -#### GlobalUnaliasBucket `DELETE /v0/bucket/alias/global?id=&alias=` +#### GlobalUnaliasBucket `DELETE /v1/bucket/alias/global?id=&alias=` Removes a global alias for a bucket. -#### LocalAliasBucket `PUT /v0/bucket/alias/local?id=&accessKeyId=&alias=` +#### LocalAliasBucket `PUT /v1/bucket/alias/local?id=&accessKeyId=&alias=` Empty body. Creates a local alias for a bucket in the namespace of a specific access key. -#### LocalUnaliasBucket `DELETE /v0/bucket/alias/local?id=&accessKeyId&alias=` +#### LocalUnaliasBucket `DELETE /v1/bucket/alias/local?id=&accessKeyId&alias=` Removes a local alias for a bucket in the namespace of a specific access key. diff --git a/src/api/admin/router.rs b/src/api/admin/router.rs index b98db284..077509e3 100644 --- a/src/api/admin/router.rs +++ b/src/api/admin/router.rs @@ -97,35 +97,35 @@ impl Endpoint { GET "/metrics" => Metrics, GET "/v1/status" => GetClusterStatus, GET "/v1/health" => GetClusterHealth, - POST "/v0/connect" => ConnectClusterNodes, + POST ("/v0/connect" | "/v1/connect") => ConnectClusterNodes, // Layout endpoints GET "/v1/layout" => GetClusterLayout, POST "/v1/layout" => UpdateClusterLayout, - POST "/v0/layout/apply" => ApplyClusterLayout, - POST "/v0/layout/revert" => RevertClusterLayout, + POST ("/v0/layout/apply" | "/v1/layout/apply") => ApplyClusterLayout, + POST ("/v0/layout/revert" | "/v1/layout/revert") => RevertClusterLayout, // API key endpoints - GET "/v0/key" if id => GetKeyInfo (query_opt::id, query_opt::search), - GET "/v0/key" if search => GetKeyInfo (query_opt::id, query_opt::search), - POST "/v0/key" if id => UpdateKey (query::id), - POST "/v0/key" => CreateKey, - POST "/v0/key/import" => ImportKey, - DELETE "/v0/key" if id => DeleteKey (query::id), - GET "/v0/key" => ListKeys, + GET ("/v0/key" | "/v1/key") if id => GetKeyInfo (query_opt::id, query_opt::search), + GET ("/v0/key" | "/v1/key") if search => GetKeyInfo (query_opt::id, query_opt::search), + POST ("/v0/key" | "/v1/key") if id => UpdateKey (query::id), + POST ("/v0/key" | "/v1/key") => CreateKey, + POST ("/v0/key/import" | "/v1/key/import") => ImportKey, + DELETE ("/v0/key" | "/v1/key") if id => DeleteKey (query::id), + GET ("/v0/key" | "/v1/key") => ListKeys, // Bucket endpoints - GET "/v0/bucket" if id => GetBucketInfo (query_opt::id, query_opt::global_alias), - GET "/v0/bucket" if global_alias => GetBucketInfo (query_opt::id, query_opt::global_alias), - GET "/v0/bucket" => ListBuckets, - POST "/v0/bucket" => CreateBucket, - DELETE "/v0/bucket" if id => DeleteBucket (query::id), - PUT "/v0/bucket" if id => UpdateBucket (query::id), + GET ("/v0/bucket" | "/v1/bucket") if id => GetBucketInfo (query_opt::id, query_opt::global_alias), + GET ("/v0/bucket" | "/v1/bucket") if global_alias => GetBucketInfo (query_opt::id, query_opt::global_alias), + GET ("/v0/bucket" | "/v1/bucket") => ListBuckets, + POST ("/v0/bucket" | "/v1/bucket") => CreateBucket, + DELETE ("/v0/bucket" | "/v1/bucket") if id => DeleteBucket (query::id), + PUT ("/v0/bucket" | "/v1/bucket") if id => UpdateBucket (query::id), // Bucket-key permissions - POST "/v0/bucket/allow" => BucketAllowKey, - POST "/v0/bucket/deny" => BucketDenyKey, + POST ("/v0/bucket/allow" | "/v1/bucket/allow") => BucketAllowKey, + POST ("/v0/bucket/deny" | "/v1/bucket/deny") => BucketDenyKey, // Bucket aliases - PUT "/v0/bucket/alias/global" => GlobalAliasBucket (query::id, query::alias), - DELETE "/v0/bucket/alias/global" => GlobalUnaliasBucket (query::id, query::alias), - PUT "/v0/bucket/alias/local" => LocalAliasBucket (query::id, query::access_key_id, query::alias), - DELETE "/v0/bucket/alias/local" => LocalUnaliasBucket (query::id, query::access_key_id, query::alias), + PUT ("/v0/bucket/alias/global" | "/v1/bucket/alias/global") => GlobalAliasBucket (query::id, query::alias), + DELETE ("/v0/bucket/alias/global" | "/v1/bucket/alias/global") => GlobalUnaliasBucket (query::id, query::alias), + PUT ("/v0/bucket/alias/local" | "/v1/bucket/alias/local") => LocalAliasBucket (query::id, query::access_key_id, query::alias), + DELETE ("/v0/bucket/alias/local" | "/v1/bucket/alias/local") => LocalUnaliasBucket (query::id, query::access_key_id, query::alias), ]); if let Some(message) = query.nonempty_message() { diff --git a/src/api/router_macros.rs b/src/api/router_macros.rs index 07b5570c..cfecbc92 100644 --- a/src/api/router_macros.rs +++ b/src/api/router_macros.rs @@ -26,6 +26,7 @@ macro_rules! router_match { $($meth:ident $path:pat $(if $required:ident)? => $api:ident $(($($conv:ident :: $param:ident),*))?,)* ]) => {{ { + #[allow(unused_parens)] match ($method, $reqpath) { $( (&Method::$meth, $path) if true $(&& $query.$required.is_some())? => Endpoint::$api { @@ -128,12 +129,6 @@ macro_rules! router_match { } } }; - (@if ($($cond:tt)+) then ($($then:tt)*) else ($($else:tt)*)) => { - $($then)* - }; - (@if () then ($($then:tt)*) else ($($else:tt)*)) => { - $($else)* - }; } /// This macro is used to generate part of the code in this module. It must be called only one, and