[pbs-devel] [PATCH proxmox-backup v8 03/45] api: config: implement endpoints to manipulate and list s3 configs
Lukas Wagner
l.wagner at proxmox.com
Fri Jul 18 09:32:58 CEST 2025
Reviewed-by: Lukas Wagner <l.wagner at proxmox.com>
On 2025-07-15 14:52, Christian Ebner wrote:
> +/// Update an s3 client configuration.
> +#[allow(clippy::too_many_arguments)]
> +pub fn update_s3_client_config(
> + id: String,
> + update: S3ClientConfigUpdater,
> + update_secrets: S3ClientSecretsConfigUpdater,
> + delete: Option<Vec<DeletableProperty>>,
> + digest: Option<String>,
> + _rpcenv: &mut dyn RpcEnvironment,
> +) -> Result<(), Error> {
> + let _lock = s3::lock_config()?;
> + let (mut config, expected_digest) = s3::config()?;
> + let (mut secrets, secrets_digest) = s3::secrets_config()?;
> + let expected_digest = digest_with_secrets(&expected_digest, &secrets_digest);
> +
> + // Secrets are not included in digest concurrent changes therefore not detected.
> + if let Some(ref digest) = digest {
> + let digest = <[u8; 32]>::from_hex(digest)?;
> + crate::tools::detect_modified_configuration_file(&digest, &expected_digest)?;
> + }
> +
> + let mut data: S3ClientConfig = config.lookup("s3client", &id)?;
> +
> + if let Some(delete) = delete {
> + for delete_prop in delete {
> + match delete_prop {
> + DeletableProperty::Port => {
> + data.port = None;
> + }
> + DeletableProperty::Region => {
> + data.region = None;
> + }
> + DeletableProperty::Fingerprint => {
> + data.fingerprint = None;
> + }
> + DeletableProperty::PathStyle => {
> + data.path_style = None;
> + }
> + }
> + }
> + }
Some time ago I've found that it is quite useful to
destructure the updater like I did in proxmox-notify [1].
This ensures that you don't forget to update the
API handler after adding a new field to the config struct.
Not a must, just a suggestion, since I like this pattern quite a bit :)
[1] https://git.proxmox.com/?p=proxmox.git;a=blob;f=proxmox-notify/src/api/webhook.rs;h=9d904d0bf57f9f789bb6723e1d8ca710fcf0cb96;hb=HEAD#l175
> +
> + if let Some(endpoint) = update.endpoint {
> + data.endpoint = endpoint;
> + }
> + if let Some(port) = update.port {
> + data.port = Some(port);
> + }
> + if let Some(region) = update.region {
> + data.region = Some(region);
> + }
> + if let Some(access_key) = update.access_key {
> + data.access_key = access_key;
> + }
> + if let Some(fingerprint) = update.fingerprint {
> + data.fingerprint = Some(fingerprint);
> + }
> + if let Some(path_style) = update.path_style {
> + data.path_style = Some(path_style);
> + }
> +
> + let mut secrets_data: S3ClientSecretsConfig = secrets.lookup("s3secrets", &id)?;
> + if let Some(secret_key) = update_secrets.secret_key {
> + secrets_data.secret_key = secret_key;
> + }
> +
> + config.set_data(&id, "s3client", &data)?;
> + secrets.set_data(&id, "s3secrets", &secrets_data)?;
> + s3::save_config(&config, &secrets)?;
> +
> + Ok(())
> +}
--
- Lukas
More information about the pbs-devel
mailing list