[pbs-devel] [PATCH proxmox-backup v8 03/45] api: config: implement endpoints to manipulate and list s3 configs

Christian Ebner c.ebner at proxmox.com
Fri Jul 18 10:40:45 CEST 2025


On 7/18/25 9:32 AM, Lukas Wagner wrote:
> 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 :)

If fine by you, I'll keep this for now and do this as a followup, 
including the same changes to the sync jobs and other configs were we 
have this pattern. Would like to focus on the other comments first, as 
these seem more pressing.

> [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(())
>> +}
> 
> 





More information about the pbs-devel mailing list