admin api: update cors and lifecycle rules in UpdateBucket

This commit is contained in:
Alex Auvolat
2026-03-06 12:20:03 +01:00
committed by Alex
parent 64087172ff
commit 19e5f83164
4 changed files with 58 additions and 0 deletions
+18
View File
@@ -4285,6 +4285,24 @@
"UpdateBucketRequestBody": {
"type": "object",
"properties": {
"corsRules": {
"type": [
"array",
"null"
],
"items": {
"$ref": "#/components/schemas/cors.Rule"
}
},
"lifecycleRules": {
"type": [
"array",
"null"
],
"items": {
"$ref": "#/components/schemas/lifecycle.Rule"
}
},
"quotas": {
"oneOf": [
{
+4
View File
@@ -949,6 +949,10 @@ pub struct UpdateBucketResponse(pub GetBucketInfoResponse);
pub struct UpdateBucketRequestBody {
pub website_access: Option<UpdateBucketWebsiteAccess>,
pub quotas: Option<ApiBucketQuotas>,
#[serde(default)]
pub cors_rules: Option<Vec<xml::cors::CorsRule>>,
#[serde(default)]
pub lifecycle_rules: Option<Vec<xml::lifecycle::LifecycleRule>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
+32
View File
@@ -323,6 +323,38 @@ impl RequestHandler for UpdateBucketRequest {
});
}
if let Some(cr) = self.body.cors_rules {
let cors_config = if cr.is_empty() {
None
} else {
let cc = xml::cors::CorsConfiguration {
xmlns: (),
cors_rules: cr,
};
cc.validate()?;
Some(cc.into_garage_cors_config()?)
};
state.cors_config.update(cors_config);
}
if let Some(lr) = self.body.lifecycle_rules {
let lifecycle_config = if lr.is_empty() {
None
} else {
let lc = xml::lifecycle::LifecycleConfiguration {
xmlns: (),
lifecycle_rules: lr,
};
Some(
lc.validate_into_garage_lifecycle_config()
.ok_or_bad_request("Invalid lifecycle configuration")?,
)
};
state.lifecycle_config.update(lifecycle_config);
}
garage.bucket_table.insert(&bucket).await?;
Ok(UpdateBucketResponse(
+4
View File
@@ -324,6 +324,8 @@ impl Cli {
body: UpdateBucketRequestBody {
website_access: Some(wa),
quotas: None,
cors_rules: None,
lifecycle_rules: None,
},
})
.await?;
@@ -374,6 +376,8 @@ impl Cli {
body: UpdateBucketRequestBody {
website_access: None,
quotas: Some(new_quotas),
cors_rules: None,
lifecycle_rules: None,
},
})
.await?;