추가 작업은 적용되지 않습니다: 경로가 부족합니다: "/spec/volumes/0": 값이 부족합니다
묘사
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/spec
는 volumes
그룹이 있는 현재 값을 삭제하고 있습니다.토론 #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 adddnsOptions
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)
}
Reference
이 문제에 관하여(추가 작업은 적용되지 않습니다: 경로가 부족합니다: "/spec/volumes/0": 값이 부족합니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/evanphx/json-patch/issues/138텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)