Estoy tratando de actualizar una etiqueta de pvc usando la opción de parche de la biblioteca go desde esta interfaz .
¿Hay algún ejemplo de cómo usar esto? Además, si la etiqueta no está allí, ¿el parche también agregará la etiqueta?
Estoy buscando actualizar/agregar my_label en el siguiente objeto:
kind: PersistentVolumeClaim metadata: annotations: pv.kubernetes.io/bind-completed: "yes" pv.kubernetes.io/bound-by-controller: "yes" volume.beta.kubernetes.io/storage-class: "" creationTimestamp: "2021-01-25T18:53:02Z" finalizers: - kubernetes.io/pvc-protection labels: my_label: my_valueSe podría hacer de la siguiente manera:
persVolC := client.CoreV1().PersistentVolumeClaims("default") data := ` [ { "op": "add", "path": "/metadata/labels/mylabel", "value": "myvalue" } ] ` updatedPvc, err := persVolC.Patch(ctx, "name-of-pvc", types.JSONPatchType, []byte(data), meta_v1.PatchOptions{}) if err != nil { log.Fatal(err) }Ejemplo completo en go playground .
Y aquí puede leer sobre el estándar de parches JSON.
Este es un ejemplo en el que vamos a iterar sobre List of PersistentVolumeClaims en el espacio de nombres predeterminado, y vamos a establecer una etiqueta específica my_label: label_test para todos esos elementos . Puede obtener un PVC específico en lugar de Listar todo con la función Get(ctx context.Context, name string, opts metav1.GetOptions)
package main import ( "context" "fmt" "log" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" ) func newClient(contextName string) (kubernetes.Interface, error) { configOverrides := &clientcmd.ConfigOverrides{CurrentContext: contextName} loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() config, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides).ClientConfig() if err != nil { return nil, err } return kubernetes.NewForConfig(config) } func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() client, err := newClient("") if err != nil { log.Fatal(err) } label := make(map[string]string) label["my_label"] = "label_test" persVolC := client.CoreV1().PersistentVolumeClaims("default") pvcs, err := persVolC.List(ctx, meta_v1.ListOptions{}) for _, pvc := range pvcs.Items { vol := pvc.DeepCopy() vol.ObjectMeta.Labels = label upd, err := persVolC.Update(ctx, vol, meta_v1.UpdateOptions{}) if err != nil { log.Fatal(err) } fmt.Println(upd) } } Si desea verificar si existe una etiqueta y actualizarla, puede reemplazar vol.ObjectMeta.Labels = label por
if _, ok := vol.ObjectMeta.Labels["my_label"]; ok { vol.ObjectMeta.Labels["my_label"] = "my_new_label" }