第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

更新特定的 yaml 屬性

更新特定的 yaml 屬性

Go
萬千封印 2022-11-23 20:38:53
我試圖解析一個 yaml 文件并只更新一個屬性,問題是類型是RAW,當(dāng)我更新一個字段時它會更新整個對象,我想要的是僅更新 NatIPNamesfromtest1到test2,但不更改(10000)的值minPortsPerVM我該怎么做?這是山藥apiVersion: core.gardener.cloud/v1beta1kind: Shootmetadata:  name: test  namespace: nsspec:  provider:    type: aaa    infrastructureConfig:      apiVersion: gcp.provider.extensions.gardener.cloud/v1alpha1      kind: InfrastructureConfig      networks:        cloudNAT:          minPortsPerVM: 10000          natIPNames:            - name: test1這是代碼package mainimport (    "encoding/json"    "fmt"    gcpv1alpha1 "github.com/gardener/gardener-extension-provider-gcp/pkg/apis/gcp/v1alpha1"    "github.com/gardener/gardener/pkg/apis/core/v1beta1"    "io/ioutil"    "k8s.io/apimachinery/pkg/runtime"    "k8s.io/apimachinery/pkg/util/yaml")func main() {    shoot, e := parseShoot("test.yaml")    if e != nil {        fmt.Println(e)    }    shoot.Spec.Provider.InfrastructureConfig.Raw = encode(&gcpv1alpha1.InfrastructureConfig{        Networks: gcpv1alpha1.NetworkConfig{            CloudNAT: &gcpv1alpha1.CloudNAT{                //MinPortsPerVM: ,                NatIPNames: []gcpv1alpha1.NatIPName{                    {Name: "test2"},                },            },        },    })    fmt.Println(shoot.Spec.Provider.InfrastructureConfig)}func parseShoot(path string) (*v1beta1.Shoot, error) {    var shootSpec *v1beta1.Shoot    bytes, err := ioutil.ReadFile(path)    if err != nil {        return nil, err    }    err = yaml.Unmarshal(bytes, &shootSpec)    if err != nil {        return nil, err    }    return shootSpec, nil}func encode(obj runtime.Object) []byte {    data, _ := json.Marshal(obj)    return data}
查看完整描述

1 回答

?
茅侃侃

TA貢獻(xiàn)1842條經(jīng)驗 獲得超22個贊

我不太了解園丁的財產(chǎn)。但是您可以做的是為InfrastructureConfig下面的內(nèi)容創(chuàng)建一個結(jié)構(gòu)


type InfraConfig struct {

    APIVersion string `json:"apiVersion"`

    Kind       string `json:"kind"`

    Networks   struct {

        CloudNAT struct {

            MinPortsPerVM int `json:"minPortsPerVM"`

            NatIPNames    []struct {

                Name string `json:"name"`

            } `json:"natIPNames"`

        } `json:"cloudNAT"`

    } `json:"networks"`

}

并創(chuàng)建一個引用該對象的變量并將其解組Raw為如下所示。


    var existingInfraConfig InfraConfig

    err := json.Unmarshal(shoot.Spec.Provider.InfrastructureConfig.Raw, &existingInfraConfig)

然后您可以編輯名稱(您可能想添加一些邏輯來驗證切片以更新正確的索引)并將其編組并將其分配回 InfraConfig,如下所示。


    existingInfraConfig.Networks.CloudNAT.NatIPNames[0].Name = "test2"

    byteData, _ := json.Marshal(existingInfraConfig)


    shoot.Spec.Provider.InfrastructureConfig = &runtime.RawExtension{

        Raw:    byteData,

        Object: nil,

    }

總的來說,就像


package main


import (

    "encoding/json"

    "fmt"

    "github.com/gardener/gardener/pkg/apis/core/v1beta1"

    "io/ioutil"

    "k8s.io/apimachinery/pkg/runtime"

    "k8s.io/apimachinery/pkg/util/yaml"

)


type InfraConfig struct {

    APIVersion string `json:"apiVersion"`

    Kind       string `json:"kind"`

    Networks   struct {

        CloudNAT struct {

            MinPortsPerVM int `json:"minPortsPerVM"`

            NatIPNames    []struct {

                Name string `json:"name"`

            } `json:"natIPNames"`

        } `json:"cloudNAT"`

    } `json:"networks"`

}


func main() {

    shoot, e := parseShoot("test.yaml")

    if e != nil {

        fmt.Println(e)

    }


    var existingInfraConfig InfraConfig

    err := json.Unmarshal(shoot.Spec.Provider.InfrastructureConfig.Raw, &existingInfraConfig)

    fmt.Println(err)


    existingInfraConfig.Networks.CloudNAT.NatIPNames[0].Name = "test2"

    byteData, _ := json.Marshal(existingInfraConfig)


    shoot.Spec.Provider.InfrastructureConfig = &runtime.RawExtension{

        Raw:    byteData,

        Object: nil,

    }

    fmt.Println(string(shoot.Spec.Provider.InfrastructureConfig.Raw))


}


func parseShoot(path string) (*v1beta1.Shoot, error) {

    var shootSpec *v1beta1.Shoot

    bytes, err := ioutil.ReadFile(path)

    if err != nil {

        return nil, err

    }

    err = yaml.Unmarshal(bytes, &shootSpec)

    if err != nil {

        return nil, err

    }

    return shootSpec, nil

}


查看完整回答
反對 回復(fù) 2022-11-23
  • 1 回答
  • 0 關(guān)注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號