Ressource mit einer Feldmaske aktualisieren

Informationen zum selektiven Aktualisieren von Ressourcen mithilfe von Feldmasken. Wenn Sie eine Ressource in Google Cloudaktualisieren, möchten Sie möglicherweise nur bestimmte Felder ändern, anstatt die gesamte Ressource zu ersetzen. Die Rust-Clientbibliotheken unterstützen Feldmasken. Damit können Sie genau steuern, welche Felder einer Ressource aktualisiert werden, während andere Felder unverändert bleiben.

Vorbereitung

In dieser Anleitung wird die Secret Manager API verwendet, die Konzepte gelten aber auch für andere Google Cloud Ressourcen und Dienste.

Bevor Sie fortfahren, folgen Sie der Anleitung unter Secret mit Secret Manager erstellen und darauf zugreifen, um die Secret Manager API zu aktivieren und zu authentifizieren.

Eine vollständige Einrichtungsanleitung für die Rust-Bibliotheken finden Sie unter Entwicklungsumgebung einrichten.

Abhängigkeiten

Nachdem Sie Secret Manager aktiviert haben, deklarieren Sie Ihre Abhängigkeiten in der Datei Cargo.toml:

cargo add google-cloud-secretmanager-v1
cargo add tokio

Bekannte Typen installieren

Die Crate google_cloud_wkt enthält bekannte Typen für Google Cloud APIs. Diese Typen haben in der Regel eine benutzerdefinierte JSON-Codierung und bieten möglicherweise Konvertierungsfunktionen für und aus häufig verwendeten Rust-Typen. Die Crate google_cloud_wkt enthält den Feldmaskentyp FieldMask.

Fügen Sie das Crate als Abhängigkeit hinzu:

cargo add google-cloud-wkt

Feldmasken

Eine FieldMask stellt eine Reihe von symbolischen Feldpfaden dar. Feldmasken geben eine Teilmenge von Feldern an, die durch einen Aktualisierungsvorgang geändert oder durch einen Abrufvorgang zurückgegeben werden.

Bei einem Aktualisierungsvorgang wird mit einer Feldmaske angegeben, welche Felder der Zielressource aktualisiert werden sollen. Die API ändert nur die Werte der in der Maske angegebenen Felder und lässt die anderen unverändert. Wenn Sie eine Ressource übergeben, um die aktualisierten Werte zu beschreiben, ignoriert die API die Werte aller Felder, die nicht von der Maske abgedeckt werden. Wenn Sie beim Aktualisieren keine Feldmaske angeben, wird der Vorgang auf alle Felder angewendet.

Wenn Sie ein Feld auf den Standardwert zurücksetzen möchten, fügen Sie das Feld in die Maske ein und legen Sie den Standardwert in der bereitgestellten Ressource fest. Wenn Sie alle Felder einer Ressource zurücksetzen möchten, geben Sie eine Standardinstanz der Ressource an und legen Sie alle Felder in der Maske fest oder geben Sie keine Maske an.

Felder einer Ressource aktualisieren

Initialisieren Sie zuerst einen Secret Manager-Client und erstellen Sie ein Secret:

    let client = SecretManagerService::builder().build().await?;

    let secret = client
        .create_secret()
        .set_parent(format!("projects/{project_id}"))
        .set_secret_id("your-secret")
        .set_secret(
            Secret::new().set_replication(Replication::new().set_automatic(Automatic::new())),
        )
        .send()
        .await?;
    println!("CREATE = {secret:?}");

Die Ausgabe des Erstellungsvorgangs zeigt, dass die Felder labels und annotations leer sind.

Mit dem folgenden Code werden die Felder labels und annotations aktualisiert:

    let tag = |mut labels: HashMap<_, _>, msg: &str| {
        labels.insert("updated".to_string(), msg.to_string());
        labels
    };

    let update = client
        .update_secret()
        .set_secret(
            Secret::new()
                .set_name(&secret.name)
                .set_etag(secret.etag)
                .set_labels(tag(secret.labels, "your-label"))
                .set_annotations(tag(secret.annotations, "your-annotations")),
        )
        .set_update_mask(FieldMask::default().set_paths(["annotations", "labels"]))
        .send()
        .await?;
    println!("UPDATE = {update:?}");

Mit der Methode set_etag können Sie ein ETag für das Secret festlegen, um zu verhindern, dass gleichzeitige Aktualisierungen überschrieben werden.

Nachdem Sie Labels und Annotationen für das aktualisierte Secret festgelegt haben, übergeben Sie eine Feldmaske an set_update_mask, um die zu aktualisierenden Feldpfade anzugeben:

        .set_update_mask(FieldMask::default().set_paths(["annotations", "labels"]))

Die Ausgabe des Aktualisierungsvorgangs zeigt, dass die Felder aktualisiert wurden:

labels: {"updated": "your-label"},
...
annotations: {"updated": "your-annotations"},

Feld aktualisieren: vollständiger Code

In diesem Beispielcode wird ein Secret initialisiert und erstellt und dann eine Feldmaske angewendet:

use google_cloud_secretmanager_v1::client::SecretManagerService;
use google_cloud_secretmanager_v1::model::replication::Automatic;
use google_cloud_secretmanager_v1::model::{Replication, Secret};
use google_cloud_wkt::FieldMask;
use std::collections::HashMap;

pub async fn sample(project_id: &str) -> anyhow::Result<()> {
    let client = SecretManagerService::builder().build().await?;

    let secret = client
        .create_secret()
        .set_parent(format!("projects/{project_id}"))
        .set_secret_id("your-secret")
        .set_secret(
            Secret::new().set_replication(Replication::new().set_automatic(Automatic::new())),
        )
        .send()
        .await?;
    println!("CREATE = {secret:?}");

    let tag = |mut labels: HashMap<_, _>, msg: &str| {
        labels.insert("updated".to_string(), msg.to_string());
        labels
    };

    let update = client
        .update_secret()
        .set_secret(
            Secret::new()
                .set_name(&secret.name)
                .set_etag(secret.etag)
                .set_labels(tag(secret.labels, "your-label"))
                .set_annotations(tag(secret.annotations, "your-annotations")),
        )
        .set_update_mask(FieldMask::default().set_paths(["annotations", "labels"]))
        .send()
        .await?;
    println!("UPDATE = {update:?}");

    Ok(())
}