추가 작업은 적용되지 않습니다: 경로가 부족합니다: "/spec/volumes/0": 값이 부족합니다

12303 단어 json-patch

묘사

package main

import (
    "encoding/json"
    "fmt"

    jsonpatch "github.com/evanphx/json-patch"

    corev1 "k8s.io/api/core/v1"

)

func main()  {

    var pod = corev1.Pod{

        Spec:       corev1.PodSpec{
            Volumes: []corev1.Volume{
                {
                    Name: "default-token-lsh6v",
                    VolumeSource: corev1.VolumeSource{
                        Secret: &corev1.SecretVolumeSource{
                            SecretName: "default-token-lsh6v",
                        },
                    },
                },
            },
        },
    }


    podBytes, _ := json.Marshal(&pod)

    fmt.Printf("old document: %s\n", podBytes)
    //      {"op": "add", "path": "/spec/dnsConfig/options", "value": [{"name":"single-request-reopen"}]}

    patchJSON := []byte(`[
        {"op": "add", "path": "/spec", "value": {"dnsConfig": {"options":[{"name":"single-request-reopen"}] }}   },
        {"op": "add", "path": "/spec/volumes/0", "value": 
             {
                "name":"default-token-lsh6v1111",
                "secret":{
                   "secretName":"default-token-lsh6v1111"
                }
             }
         }

    ]`)

    patch, err := jsonpatch.DecodePatch(patchJSON)
    if err != nil {
        panic(err)
    }

    modified, err := patch.Apply(podBytes)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Modified document: %s\n", modified)

}

old document: {"metadata":{"creationTimestamp":null},"spec":{"volumes":[{"name":"default-token-lsh6v","secret":{"secretName":"default-token-lsh6v"}}],"containers":null},"status":{}}

panic: add operation does not apply: doc is missing path: "/spec/volumes/0": missing value

토론 #1

덮어쓰기

토론 #2

package main

import (
    "encoding/json"
    "fmt"

    jsonpatch "github.com/evanphx/json-patch"
    corev1 "k8s.io/api/core/v1"
    //metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func main()  {

    var pod = corev1.Pod{

        Spec:       corev1.PodSpec{
            //Volumes: []corev1.Volume{
            //  {
            //      Name: "default-token-lsh6v",
            //      VolumeSource: corev1.VolumeSource{
            //          Secret: &corev1.SecretVolumeSource{
            //              SecretName: "default-token-lsh6v",
            //          },
            //      },
            //  },
            //},

        },

    }

    podBytes, _ := json.Marshal(&pod)

    fmt.Printf("old document: %s\n", podBytes)
    patchJSON := []byte(`[
   {
      "op":"add",
      "path":"/spec/dnsConfig",
      "value":{

            "options":[
               {
                  "name":"single-request-reopen"
               }
            ]

      }
   },
   {
      "op":"add",
      "path":"/spec/volumes/-",
      "value":{
         "name":"default-token-lsh6v1111",
         "secret":{
            "secretName":"default-token-lsh6v1111"
         }
      }
   }
]`)

    patch, err := jsonpatch.DecodePatch(patchJSON)
    if err != nil {
        panic(err)
    }

    modified, err := patch.Apply(podBytes)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Modified document: %s\n", modified)

}
대신 값을 추가하는 방법
주석을 취소하면 실행할 수 있지만 구조의 내부 값은 고정되지 않습니다pod.Spec.Volumes에 값을 추가하고 싶습니다. pod.Spec.Volumes 비어 있든 없든

토론 #셋

. 색인 (0, -, 등) 에서 기존 그룹을 추가하려고 하면 같은 오류를 볼 수 있습니다.
객체에 첨부해도 덮어씁니다.
그래서 전반적으로 말하자면, 나의 경험을 보면, 나는 이미 붕괴된 것 같다.

토론 #4

@evanphx PTAL

토론 #5

그래서 코드를 봤습니다. 현재 테스트 용례가 잘 작동하고 있습니다.
    {
        `{"metadata":{"creationTimestamp":null},"spec":{"volumes":[{"name":"default-token-lsh6v","secret":{"secretName":"default-token-lsh6v"}}],"containers":null},"status":{}}`,
        `[ { "op": "add", "path": "/spec/volumes/-", "value": {"name":"foobar"} } ]`,
        `{"metadata":{"creationTimestamp":null},"spec":{"volumes":[{"name":"default-token-lsh6v","secret":{"secretName":"default-token-lsh6v"}},{"name":"foobar"}],"containers":null},"status":{}}`,
        false,
        false,
    },

토론 #6

[ { "op": "add", "path": "/spec/volumes/-", "value": {"name":"foobar"} } ]
마땅히
[ {
      "op":"add",
      "path":"/spec",
      "value":{
         "dnsConfig":{
            "options":[
               {
                  "name":"single-request-reopen"
               }
            ]
         }
      }
   },{ "op": "add", "path": "/spec/volumes/-", "value": {"name":"foobar"} } ]
다시 한 번 @evanphx

토론 #7

네, 알겠습니다.이것은 첫 번째 줄입니다. add to /specvolumes 그룹이 있는 현재 값을 삭제하고 있습니다.

토론 #8

첫 번째 배선을 옮기거나 첫 번째 배선에 수조가 있는 volumes 키도 포함하면 일을 할 수 있습니다.

토론 #9

기본적으로 규범에 규정된 목표의 경로가 이미 존재해야 하기 때문에 문서에 존재하거나 이전의 패치선을 사용하여 만들어야 합니다.

토론 #10

데이터 하나만 추가하고 싶어요.😔,규범의 값은 map[string]interface{}입니다. 다른 키

토론 #11

를 초과하면 안 된다고 생각합니다. Append는 정상적으로 작동할 수 있지만volumes 키는 반드시 존재해야 합니다.
2021년 5월 25일 화요일 저녁 9:25장 관장.***
쓰기:

I just want to append a data😔

— You are receiving this because you were mentioned.

Reply to this email directly, view it on GitHub https://github.com/evanphx/json-patch/issues/138#issuecomment-848443194, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAAAB4FPBP5T2DEFXUL3DDTPRZ3FANCNFSM42IZKHTA .

토론 #12

에 추가할 첫 번째 하네스/spec/spec의 기존 값을 덮어씁니다.dnsOptions만 추가하려면 추가할 패치를 지정하십시오.

토론 #13

Your first patch line, to add /spec overwrites the existing value of /spec. If you just want to add dnsOptions specify a patch to add that.

package main

import (
    "encoding/json"
    "fmt"

    jsonpatch "github.com/evanphx/json-patch"
    corev1 "k8s.io/api/core/v1"
    //metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func main() {

    var pod = corev1.Pod{

        Spec: corev1.PodSpec{
            Volumes: []corev1.Volume{
                {
                    Name: "default-token-lsh6v",
                    VolumeSource: corev1.VolumeSource{
                        Secret: &corev1.SecretVolumeSource{
                            SecretName: "default-token-lsh6v",
                        },
                    },
                },
            },
        },
    }

    podBytes, _ := json.Marshal(&pod)

    fmt.Printf("old document: %s\n", podBytes)
    patchJSON := []byte(`[
   {
      "op":"add",
      "path":"/spec/dnsConfig/options",
      "value": [
               {
                  "name":"single-request-reopen"
               }
            ]
   },
   {
      "op":"add",
      "path":"/spec/volumes",
      "value":[{
         "name":"default-token-lsh6v1111",
         "secret":{
            "secretName":"default-token-lsh6v1111"
         }
      }]
   }
]`)

    patch, err := jsonpatch.DecodePatch(patchJSON)
    if err != nil {
        panic(err)
    }

    modified, err := patch.Apply(podBytes)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Modified document: %s\n", modified)

}
$ go run json2.go
old document: {"metadata":{"creationTimestamp":null},"spec":{"volumes":[{"name":"default-token-lsh6v","secret":{"secretName":"default-token-lsh6v"}}],"containers":null},"status":{}}
panic: add operation does not apply: doc is missing path: "/spec/dnsConfig/options": missing value

goroutine 1 [running]:
main.main()
        D:/github/go/test/json2.go:62 +0x445
exit status 2

토론 #14

오류가 문제를 알려 줍니다.dnsConfig에 내용을 추가하려고 시도하고 있지만, dnsConfig에 내용을 추가할 대상이 없습니다.패치에 dnsConfig를 추가한 다음 뭔가를 추가해야 합니다.

토론 #15

The error is telling you the issue. You're trying to add something to dnsConfig, but there is no object at dnsConfig to add something to. Your patch needs to add dnsConfig, then add something to it.


기존 키

토론 #16

를 덮어쓰는 대신 값을 추가하는 방법을 알고 싶을 뿐입니다. 무엇을 하고 싶은지 모르겠습니다.이 예에서 먼저 dnsConfig 값을 추가해야 합니다.만약 당신이 실제 세계의 코드가 dnsConfig가 있다면, 당신은 직접 그것에 추가할 수 있습니다.

토론 #17

최신 코드를 사용하려면 MD ok 참조
package main

import (
    "encoding/json"
    "fmt"

    jsonpatch "test/json-patch/v5"
    corev1 "k8s.io/api/core/v1"

)

func main()  {

    var pod = corev1.Pod{

        Spec:       corev1.PodSpec{
            //Volumes: []corev1.Volume{
            //  {
            //      Name: "default-token-lsh6v",
            //      VolumeSource: corev1.VolumeSource{
            //          Secret: &corev1.SecretVolumeSource{
            //              SecretName: "default-token-lsh6v",
            //          },
            //      },
            //  },
            //},
        },
    }


    podBytes, _ := json.Marshal(&pod)

    fmt.Printf("old document: %s\n", podBytes)
    //      {"op": "add", "path": "/spec/dnsConfig/options", "value": [{"name":"single-request-reopen"}]}

    patchJSON := []byte(`[
   {
      "op":"add",
      "path":"/spec/dnsConfig",
      "value":{

            "options":[
               {
                  "name":"single-request-reopen"
               }
            ]

      }
   },
   {
      "op":"add",
      "path":"/spec/volumes/-",
      "value":{
         "name":"default-token-lsh6v1111",
         "secret":{
            "secretName":"default-token-lsh6v1111"
         }
      }
   }
]`)

    patch, err := jsonpatch.DecodePatch(patchJSON)
    if err != nil {
        panic(err)
    }

    aplyOps := jsonpatch.NewApplyOptions()
    aplyOps.AllowMissingPathOnRemove = true
    aplyOps.EnsurePathExistsOnAdd = true

    //modified, err := patch.Apply(podBytes)
    modified, err := patch.ApplyWithOptions(podBytes, aplyOps)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Modified document: %s\n", modified)

}

좋은 웹페이지 즐겨찾기