From b8911b8d79f7ca4030c6e2cdff9f873a47848021 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Mon, 4 Feb 2019 09:47:54 -0800 Subject: [PATCH] Importing latest json-patch. --- Godeps/Godeps.json | 4 +- .../Godeps/Godeps.json | 2 +- .../k8s.io/apimachinery/Godeps/Godeps.json | 2 +- .../src/k8s.io/apiserver/Godeps/Godeps.json | 2 +- .../src/k8s.io/cli-runtime/Godeps/Godeps.json | 2 +- .../src/k8s.io/client-go/Godeps/Godeps.json | 2 +- staging/src/k8s.io/csi-api/Godeps/Godeps.json | 2 +- .../k8s.io/kube-aggregator/Godeps/Godeps.json | 2 +- staging/src/k8s.io/metrics/Godeps/Godeps.json | 2 +- .../src/k8s.io/node-api/Godeps/Godeps.json | 2 +- .../sample-apiserver/Godeps/Godeps.json | 2 +- .../sample-cli-plugin/Godeps/Godeps.json | 2 +- .../sample-controller/Godeps/Godeps.json | 2 +- vendor/github.com/evanphx/json-patch/BUILD | 1 + .../github.com/evanphx/json-patch/README.md | 10 +-- .../github.com/evanphx/json-patch/errors.go | 38 ++++++++++ vendor/github.com/evanphx/json-patch/patch.go | 76 +++++++------------ 17 files changed, 84 insertions(+), 69 deletions(-) create mode 100644 vendor/github.com/evanphx/json-patch/errors.go diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index e0a6e8c2cde..d18a7f3d6a6 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -1555,8 +1555,8 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Comment": "v4.1.0-11-gd4020504c68b6b", - "Rev": "d4020504c68b6bfa818032bedfb48e33e9638506" + "Comment": "v4.1.0-19-g5858425f75500d", + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/exponent-io/jsonpath", diff --git a/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json b/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json index 57ac02a4fa3..a12f882c749 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json @@ -372,7 +372,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "d4020504c68b6bfa818032bedfb48e33e9638506" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/ghodss/yaml", diff --git a/staging/src/k8s.io/apimachinery/Godeps/Godeps.json b/staging/src/k8s.io/apimachinery/Godeps/Godeps.json index ce90141c15b..8a4e7017f9e 100644 --- a/staging/src/k8s.io/apimachinery/Godeps/Godeps.json +++ b/staging/src/k8s.io/apimachinery/Godeps/Godeps.json @@ -24,7 +24,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "d4020504c68b6bfa818032bedfb48e33e9638506" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/gogo/protobuf/proto", diff --git a/staging/src/k8s.io/apiserver/Godeps/Godeps.json b/staging/src/k8s.io/apiserver/Godeps/Godeps.json index cad4fc800c8..01cf0d08af1 100644 --- a/staging/src/k8s.io/apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/apiserver/Godeps/Godeps.json @@ -372,7 +372,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "d4020504c68b6bfa818032bedfb48e33e9638506" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/ghodss/yaml", diff --git a/staging/src/k8s.io/cli-runtime/Godeps/Godeps.json b/staging/src/k8s.io/cli-runtime/Godeps/Godeps.json index bea1493a2f5..b14ca95c219 100644 --- a/staging/src/k8s.io/cli-runtime/Godeps/Godeps.json +++ b/staging/src/k8s.io/cli-runtime/Godeps/Godeps.json @@ -12,7 +12,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "d4020504c68b6bfa818032bedfb48e33e9638506" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/gogo/protobuf/proto", diff --git a/staging/src/k8s.io/client-go/Godeps/Godeps.json b/staging/src/k8s.io/client-go/Godeps/Godeps.json index 182f7b4148d..e192dbff101 100644 --- a/staging/src/k8s.io/client-go/Godeps/Godeps.json +++ b/staging/src/k8s.io/client-go/Godeps/Godeps.json @@ -56,7 +56,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "d4020504c68b6bfa818032bedfb48e33e9638506" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/gogo/protobuf/proto", diff --git a/staging/src/k8s.io/csi-api/Godeps/Godeps.json b/staging/src/k8s.io/csi-api/Godeps/Godeps.json index 4bad4f3392e..c0ccdb927c2 100644 --- a/staging/src/k8s.io/csi-api/Godeps/Godeps.json +++ b/staging/src/k8s.io/csi-api/Godeps/Godeps.json @@ -12,7 +12,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "d4020504c68b6bfa818032bedfb48e33e9638506" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/gogo/protobuf/proto", diff --git a/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json b/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json index 83c2a8625b0..dbef31bbd1a 100644 --- a/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json +++ b/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json @@ -96,7 +96,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "d4020504c68b6bfa818032bedfb48e33e9638506" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/go-openapi/jsonpointer", diff --git a/staging/src/k8s.io/metrics/Godeps/Godeps.json b/staging/src/k8s.io/metrics/Godeps/Godeps.json index 787839a7b07..2e7417c2fb5 100644 --- a/staging/src/k8s.io/metrics/Godeps/Godeps.json +++ b/staging/src/k8s.io/metrics/Godeps/Godeps.json @@ -12,7 +12,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "d4020504c68b6bfa818032bedfb48e33e9638506" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/gogo/protobuf/proto", diff --git a/staging/src/k8s.io/node-api/Godeps/Godeps.json b/staging/src/k8s.io/node-api/Godeps/Godeps.json index 2ec3d9fcbd8..d61f8337d33 100644 --- a/staging/src/k8s.io/node-api/Godeps/Godeps.json +++ b/staging/src/k8s.io/node-api/Godeps/Godeps.json @@ -12,7 +12,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "d4020504c68b6bfa818032bedfb48e33e9638506" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/gogo/protobuf/proto", diff --git a/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json b/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json index 30abbf59cd5..6c123a88ca4 100644 --- a/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json @@ -88,7 +88,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "d4020504c68b6bfa818032bedfb48e33e9638506" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/go-openapi/jsonpointer", diff --git a/staging/src/k8s.io/sample-cli-plugin/Godeps/Godeps.json b/staging/src/k8s.io/sample-cli-plugin/Godeps/Godeps.json index 18d8ded2d56..713dd908821 100644 --- a/staging/src/k8s.io/sample-cli-plugin/Godeps/Godeps.json +++ b/staging/src/k8s.io/sample-cli-plugin/Godeps/Godeps.json @@ -12,7 +12,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "d4020504c68b6bfa818032bedfb48e33e9638506" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/gogo/protobuf/proto", diff --git a/staging/src/k8s.io/sample-controller/Godeps/Godeps.json b/staging/src/k8s.io/sample-controller/Godeps/Godeps.json index 724f5704af1..45b74dc86a3 100644 --- a/staging/src/k8s.io/sample-controller/Godeps/Godeps.json +++ b/staging/src/k8s.io/sample-controller/Godeps/Godeps.json @@ -12,7 +12,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "d4020504c68b6bfa818032bedfb48e33e9638506" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/gogo/protobuf/proto", diff --git a/vendor/github.com/evanphx/json-patch/BUILD b/vendor/github.com/evanphx/json-patch/BUILD index 4fba85b4597..5373f7f42e8 100644 --- a/vendor/github.com/evanphx/json-patch/BUILD +++ b/vendor/github.com/evanphx/json-patch/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = [ + "errors.go", "merge.go", "patch.go", ], diff --git a/vendor/github.com/evanphx/json-patch/README.md b/vendor/github.com/evanphx/json-patch/README.md index ad011b2fac6..9c7f87f7cea 100644 --- a/vendor/github.com/evanphx/json-patch/README.md +++ b/vendor/github.com/evanphx/json-patch/README.md @@ -34,13 +34,9 @@ go get -u github.com/evanphx/json-patch functionality can be disabled by setting `jsonpatch.SupportNegativeIndices = false`. -* There is a global configuration variable `jsonpatch.ArraySizeLimit`, which - limits the length of any array the patched object can have. It defaults to 0, - which means there is no limit. - -* There is a global configuration variable `jsonpatch.ArraySizeAdditionLimit`, - which limits the increase of array length caused by each operation. It - defaults to 0, which means there is no limit. +* There is a global configuration variable `jsonpatch.AccumulatedCopySizeLimit`, + which limits the total size increase in bytes caused by "copy" operations in a + patch. It defaults to 0, which means there is no limit. ## Create and apply a merge patch Given both an original JSON document and a modified JSON document, you can create diff --git a/vendor/github.com/evanphx/json-patch/errors.go b/vendor/github.com/evanphx/json-patch/errors.go new file mode 100644 index 00000000000..75304b4437c --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/errors.go @@ -0,0 +1,38 @@ +package jsonpatch + +import "fmt" + +// AccumulatedCopySizeError is an error type returned when the accumulated size +// increase caused by copy operations in a patch operation has exceeded the +// limit. +type AccumulatedCopySizeError struct { + limit int64 + accumulated int64 +} + +// NewAccumulatedCopySizeError returns an AccumulatedCopySizeError. +func NewAccumulatedCopySizeError(l, a int64) *AccumulatedCopySizeError { + return &AccumulatedCopySizeError{limit: l, accumulated: a} +} + +// Error implements the error interface. +func (a *AccumulatedCopySizeError) Error() string { + return fmt.Sprintf("Unable to complete the copy, the accumulated size increase of copy is %d, exceeding the limit %d", a.accumulated, a.limit) +} + +// ArraySizeError is an error type returned when the array size has exceeded +// the limit. +type ArraySizeError struct { + limit int + size int +} + +// NewArraySizeError returns an ArraySizeError. +func NewArraySizeError(l, s int) *ArraySizeError { + return &ArraySizeError{limit: l, size: s} +} + +// Error implements the error interface. +func (a *ArraySizeError) Error() string { + return fmt.Sprintf("Unable to create array of size %d, limit is %d", a.size, a.limit) +} diff --git a/vendor/github.com/evanphx/json-patch/patch.go b/vendor/github.com/evanphx/json-patch/patch.go index b1ec06ae173..c9cf590216c 100644 --- a/vendor/github.com/evanphx/json-patch/patch.go +++ b/vendor/github.com/evanphx/json-patch/patch.go @@ -14,9 +14,15 @@ const ( eAry ) -var SupportNegativeIndices bool = true -var ArraySizeLimit int = 0 -var ArraySizeAdditionLimit int = 0 +var ( + // SupportNegativeIndices decides whether to support non-standard practice of + // allowing negative indices to mean indices starting at the end of an array. + // Default to true. + SupportNegativeIndices bool = true + // AccumulatedCopySizeLimit limits the total size increase in bytes caused by + // "copy" operations in a patch. + AccumulatedCopySizeLimit int64 = 0 +) type lazyNode struct { raw *json.RawMessage @@ -65,17 +71,18 @@ func (n *lazyNode) UnmarshalJSON(data []byte) error { return nil } -func deepCopy(src *lazyNode) (*lazyNode, error) { +func deepCopy(src *lazyNode) (*lazyNode, int, error) { if src == nil { - return nil, nil + return nil, 0, nil } a, err := src.MarshalJSON() if err != nil { - return nil, err + return nil, 0, err } - ra := make(json.RawMessage, len(a)) + sz := len(a) + ra := make(json.RawMessage, sz) copy(ra, a) - return newLazyNode(&ra), nil + return newLazyNode(&ra), sz, nil } func (n *lazyNode) intoDoc() (*partialDoc, error) { @@ -359,44 +366,14 @@ func (d *partialDoc) remove(key string) error { return nil } +// set should only be used to implement the "replace" operation, so "key" must +// be an already existing index in "d". func (d *partialArray) set(key string, val *lazyNode) error { - if key == "-" { - *d = append(*d, val) - return nil - } - idx, err := strconv.Atoi(key) if err != nil { return err } - - sz := len(*d) - - if diff := idx + 1 - sz; ArraySizeAdditionLimit > 0 && diff > ArraySizeAdditionLimit { - return fmt.Errorf("Unable to increase the array size by %d, the limit is %d", diff, ArraySizeAdditionLimit) - } - - if idx+1 > sz { - sz = idx + 1 - } - - if ArraySizeLimit > 0 && sz > ArraySizeLimit { - return fmt.Errorf("Unable to create array of size %d, limit is %d", sz, ArraySizeLimit) - } - - ary := make([]*lazyNode, sz) - - cur := *d - - copy(ary, cur) - - if idx >= len(ary) { - return fmt.Errorf("Unable to access invalid index: %d", idx) - } - - ary[idx] = val - - *d = ary + (*d)[idx] = val return nil } @@ -412,9 +389,6 @@ func (d *partialArray) add(key string, val *lazyNode) error { } sz := len(*d) + 1 - if ArraySizeLimit > 0 && sz > ArraySizeLimit { - return fmt.Errorf("Unable to create array of size %d, limit is %d", sz, ArraySizeLimit) - } ary := make([]*lazyNode, sz) @@ -556,7 +530,7 @@ func (p Patch) move(doc *container, op operation) error { return fmt.Errorf("jsonpatch move operation does not apply: doc is missing destination path: %s", path) } - return con.set(key, val) + return con.add(key, val) } func (p Patch) test(doc *container, op operation) error { @@ -590,7 +564,7 @@ func (p Patch) test(doc *container, op operation) error { return fmt.Errorf("Testing value %s failed", path) } -func (p Patch) copy(doc *container, op operation) error { +func (p Patch) copy(doc *container, op operation, accumulatedCopySize *int64) error { from := op.from() con, key := findObject(doc, from) @@ -612,10 +586,14 @@ func (p Patch) copy(doc *container, op operation) error { return fmt.Errorf("jsonpatch copy operation does not apply: doc is missing destination path: %s", path) } - valCopy, err := deepCopy(val) + valCopy, sz, err := deepCopy(val) if err != nil { return err } + (*accumulatedCopySize) += int64(sz) + if AccumulatedCopySizeLimit > 0 && *accumulatedCopySize > AccumulatedCopySizeLimit { + return NewAccumulatedCopySizeError(AccumulatedCopySizeLimit, *accumulatedCopySize) + } return con.add(key, valCopy) } @@ -670,6 +648,8 @@ func (p Patch) ApplyIndent(doc []byte, indent string) ([]byte, error) { err = nil + var accumulatedCopySize int64 + for _, op := range p { switch op.kind() { case "add": @@ -683,7 +663,7 @@ func (p Patch) ApplyIndent(doc []byte, indent string) ([]byte, error) { case "test": err = p.test(&pd, op) case "copy": - err = p.copy(&pd, op) + err = p.copy(&pd, op, &accumulatedCopySize) default: err = fmt.Errorf("Unexpected kind: %s", op.kind()) }