Memperbarui resource menggunakan mask kolom

Pelajari cara mengupdate resource secara selektif menggunakan mask kolom. Saat memperbarui resource di Google Cloud, Anda mungkin hanya ingin mengubah kolom tertentu, bukan mengganti seluruh resource. Library klien Rust mendukung mask kolom, sehingga Anda dapat mengontrol secara tepat kolom resource mana yang diperbarui dan kolom lainnya tidak diubah.

Prasyarat

Panduan ini menggunakan Secret Manager API, tetapi konsepnya berlaku untuk resource dan layanan Google Cloud lainnya.

Sebelum melanjutkan, ikuti langkah-langkah di bagian Membuat dan mengakses secret menggunakan Secret Manager untuk mengaktifkan dan mengautentikasi Secret Manager API.

Untuk mengetahui petunjuk penyiapan lengkap untuk library Rust, lihat Menyiapkan lingkungan pengembangan Anda.

Dependensi

Setelah mengaktifkan Secret Manager, deklarasikan dependensi Anda dalam file Cargo.toml:

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

Menginstal jenis yang sudah dikenal

Crate google_cloud_wkt berisi jenis terkenal untuk Google Cloud API. Jenis ini biasanya memiliki encoding JSON kustom dan dapat menyediakan fungsi konversi ke dan dari jenis Rust yang umum digunakan. Crate google_cloud_wkt berisi jenis mask kolom, FieldMask.

Tambahkan crate sebagai dependensi:

cargo add google-cloud-wkt

Mask kolom

FieldMask mewakili sekumpulan jalur kolom simbolis. Mask kolom menentukan subset kolom yang diubah oleh operasi update atau ditampilkan oleh operasi get.

Dalam operasi update, mask kolom menentukan kolom resource target yang akan diupdate. API hanya mengubah nilai kolom yang ditentukan dalam mask dan tidak mengubah kolom lainnya. Jika Anda meneruskan resource untuk mendeskripsikan nilai yang diperbarui, API akan mengabaikan nilai semua kolom yang tidak tercakup oleh mask. Jika Anda tidak memberikan mask kolom saat memperbarui, operasi akan diterapkan ke semua kolom.

Untuk mereset kolom ke nilai default, sertakan kolom dalam mask dan tetapkan nilai default dalam resource yang diberikan. Untuk mereset semua kolom resource, berikan instance default resource dan tetapkan semua kolom dalam mask, atau jangan berikan mask.

Memperbarui kolom pada resource

Pertama, inisialisasi klien Secret Manager dan buat 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:?}");

Output dari operasi pembuatan menunjukkan bahwa kolom labels dan annotations kosong.

Kode berikut memperbarui kolom labels dan annotations:

    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:?}");

Metode set_etag memungkinkan Anda menyetel etag pada rahasia, yang mencegah update serentak ditimpa.

Setelah menyetel label dan anotasi pada secret yang diperbarui, Anda meneruskan mask kolom ke set_update_mask untuk menentukan jalur kolom yang akan diperbarui:

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

Output dari operasi update menunjukkan bahwa kolom telah diperbarui:

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

Memperbarui kolom: kode lengkap

Contoh kode ini melakukan inisialisasi dan membuat secret, lalu menerapkan mask kolom:

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