Skip to content

Commit 3888a3c

Browse files
upgrade to latest dependencies (#400)
bumping knative.dev/pkg 21eb4c1...844a6bc: > 844a6bc [release-0.25] allow unknown metadata fields (# 2254) > 5bed044 Drop redundant pointers and decoders (# 2259) Signed-off-by: Knative Automation <[email protected]>
1 parent 13d2599 commit 3888a3c

File tree

7 files changed

+148
-32
lines changed

7 files changed

+148
-32
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ require (
3232
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7
3333
knative.dev/eventing v0.25.0
3434
knative.dev/hack v0.0.0-20210622141627-e28525d8d260
35-
knative.dev/pkg v0.0.0-20210803160015-21eb4c167cc5
35+
knative.dev/pkg v0.0.0-20210902173607-844a6bc45596
3636
knative.dev/reconciler-test v0.0.0-20210803183715-b61cc77c06f6
3737
)
3838

go.sum

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1477,8 +1477,9 @@ knative.dev/eventing v0.25.0/go.mod h1:8jIsrnSONPgv+m63OTzpwZQJiQASYl77C3llCyYlB
14771477
knative.dev/hack v0.0.0-20210622141627-e28525d8d260 h1:f2eMtOubAOc/Q7JlvFPDKXiPlJVK+VpX2Cot8hRzCgQ=
14781478
knative.dev/hack v0.0.0-20210622141627-e28525d8d260/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
14791479
knative.dev/hack/schema v0.0.0-20210622141627-e28525d8d260/go.mod h1:ffjwmdcrH5vN3mPhO8RrF2KfNnbHeCE2C60A+2cv3U0=
1480-
knative.dev/pkg v0.0.0-20210803160015-21eb4c167cc5 h1:jpOTmAXg1oLS8u5HPBrFP1XsOSFCQIvlTRxP8TDGg2E=
14811480
knative.dev/pkg v0.0.0-20210803160015-21eb4c167cc5/go.mod h1:RPk5txNA3apR9X40D4MpUOP9/VqOG8CrtABWfOwGVS4=
1481+
knative.dev/pkg v0.0.0-20210902173607-844a6bc45596 h1:LCSg0O51V8I7sfnhw+j9WLBol8f2lCV5HkPyxJT9zzA=
1482+
knative.dev/pkg v0.0.0-20210902173607-844a6bc45596/go.mod h1:RPk5txNA3apR9X40D4MpUOP9/VqOG8CrtABWfOwGVS4=
14821483
knative.dev/reconciler-test v0.0.0-20210803183715-b61cc77c06f6 h1:jSz98FX9JfAMJX3qVeRF7RU7A3XLJJxBNz8GYU5z0bM=
14831484
knative.dev/reconciler-test v0.0.0-20210803183715-b61cc77c06f6/go.mod h1:+Kovy+G5zXZNcuO/uB+zfo37vFKZzsLIlWezt/nKMz0=
14841485
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=

vendor/knative.dev/pkg/webhook/configmaps/configmaps.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ limitations under the License.
1717
package configmaps
1818

1919
import (
20-
"bytes"
2120
"context"
2221
"encoding/json"
2322
"errors"
@@ -192,8 +191,7 @@ func (ac *reconciler) validate(ctx context.Context, req *admissionv1.AdmissionRe
192191

193192
var newObj corev1.ConfigMap
194193
if len(newBytes) != 0 {
195-
newDecoder := json.NewDecoder(bytes.NewBuffer(newBytes))
196-
if err := newDecoder.Decode(&newObj); err != nil {
194+
if err := json.Unmarshal(newBytes, &newObj); err != nil {
197195
return fmt.Errorf("cannot decode incoming new object: %w", err)
198196
}
199197
}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
/*
2+
Copyright 2021 The Knative Authors
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package json
18+
19+
import (
20+
"bytes"
21+
"encoding/json"
22+
"io"
23+
)
24+
25+
var (
26+
emptyMeta = []byte(`:{}`)
27+
metaPrefix = []byte(`{"metadata"`)
28+
metaSuffix = []byte(`}`)
29+
)
30+
31+
var (
32+
// Unmarshal is an alias for json.Unmarshal
33+
Unmarshal = json.Unmarshal
34+
35+
//Marshal is an alias for json.Marshal
36+
Marshal = json.Marshal
37+
)
38+
39+
// Decode will parse the json byte array to the target object. When
40+
// unknown fields are _not_ allowed we still accept unknown
41+
// fields in the Object's metadata
42+
//
43+
// See https://github.com/knative/serving/issues/11448 for details
44+
func Decode(bites []byte, target interface{}, disallowUnknownFields bool) error {
45+
if !disallowUnknownFields {
46+
return json.Unmarshal(bites, target)
47+
}
48+
49+
// If we don't allow unknown fields we skip validating fields in the metadata
50+
// block since that is opaque to us and validated by the API server
51+
start, end, err := findMetadataOffsets(bites)
52+
if err != nil {
53+
return err
54+
} else if start == -1 || end == -1 {
55+
// If for some reason the json does not have metadata continue with normal parsing
56+
dec := json.NewDecoder(bytes.NewReader(bites))
57+
dec.DisallowUnknownFields()
58+
return dec.Decode(target)
59+
}
60+
61+
before := bites[:start]
62+
metadata := bites[start:end]
63+
after := bites[end:]
64+
65+
// Parse everything but skip metadata
66+
dec := json.NewDecoder(io.MultiReader(
67+
bytes.NewReader(before),
68+
bytes.NewReader(emptyMeta),
69+
bytes.NewReader(after),
70+
))
71+
72+
dec.DisallowUnknownFields()
73+
if err := dec.Decode(target); err != nil {
74+
return err
75+
}
76+
77+
// Now we parse just the metadata
78+
dec = json.NewDecoder(io.MultiReader(
79+
bytes.NewReader(metaPrefix),
80+
bytes.NewReader(metadata),
81+
bytes.NewReader(metaSuffix),
82+
))
83+
84+
if err := dec.Decode(target); err != nil {
85+
return err
86+
}
87+
88+
return nil
89+
}
90+
91+
func findMetadataOffsets(bites []byte) (start, end int64, err error) {
92+
start, end = -1, -1
93+
level := 0
94+
95+
var (
96+
dec = json.NewDecoder(bytes.NewReader(bites))
97+
t json.Token
98+
)
99+
100+
for {
101+
t, err = dec.Token()
102+
if err == io.EOF { //nolint
103+
break
104+
}
105+
if err != nil {
106+
return
107+
}
108+
109+
switch v := t.(type) {
110+
case json.Delim:
111+
if v == '{' {
112+
level++
113+
} else if v == '}' {
114+
level--
115+
}
116+
case string:
117+
if v == "metadata" && level == 1 {
118+
start = dec.InputOffset()
119+
x := struct{}{}
120+
if err = dec.Decode(&x); err != nil {
121+
return -1, -1, err
122+
}
123+
end = dec.InputOffset()
124+
125+
// we exit early to stop processing the rest of the object
126+
return
127+
}
128+
}
129+
}
130+
return -1, -1, nil
131+
}

vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/defaulting.go

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ limitations under the License.
1717
package defaulting
1818

1919
import (
20-
"bytes"
2120
"context"
22-
"encoding/json"
2321
"errors"
2422
"fmt"
2523
"sort"
@@ -47,6 +45,7 @@ import (
4745
"knative.dev/pkg/system"
4846
"knative.dev/pkg/webhook"
4947
certresources "knative.dev/pkg/webhook/certificates/resources"
48+
"knative.dev/pkg/webhook/json"
5049
"knative.dev/pkg/webhook/resourcesemantics"
5150
)
5251

@@ -241,21 +240,15 @@ func (ac *reconciler) mutate(ctx context.Context, req *admissionv1.AdmissionRequ
241240

242241
if len(newBytes) != 0 {
243242
newObj = handler.DeepCopyObject().(resourcesemantics.GenericCRD)
244-
newDecoder := json.NewDecoder(bytes.NewBuffer(newBytes))
245-
if ac.disallowUnknownFields {
246-
newDecoder.DisallowUnknownFields()
247-
}
248-
if err := newDecoder.Decode(&newObj); err != nil {
243+
err := json.Decode(newBytes, newObj, ac.disallowUnknownFields)
244+
if err != nil {
249245
return nil, fmt.Errorf("cannot decode incoming new object: %w", err)
250246
}
251247
}
252248
if len(oldBytes) != 0 {
253249
oldObj = handler.DeepCopyObject().(resourcesemantics.GenericCRD)
254-
oldDecoder := json.NewDecoder(bytes.NewBuffer(oldBytes))
255-
if ac.disallowUnknownFields {
256-
oldDecoder.DisallowUnknownFields()
257-
}
258-
if err := oldDecoder.Decode(&oldObj); err != nil {
250+
err := json.Decode(oldBytes, oldObj, ac.disallowUnknownFields)
251+
if err != nil {
259252
return nil, fmt.Errorf("cannot decode incoming old object: %w", err)
260253
}
261254
}

vendor/knative.dev/pkg/webhook/resourcesemantics/validation/validation_admit.go

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ limitations under the License.
1717
package validation
1818

1919
import (
20-
"bytes"
2120
"context"
22-
"encoding/json"
2321
"errors"
2422
"fmt"
2523

@@ -31,6 +29,7 @@ import (
3129
kubeclient "knative.dev/pkg/client/injection/kube/client"
3230
"knative.dev/pkg/logging"
3331
"knative.dev/pkg/webhook"
32+
"knative.dev/pkg/webhook/json"
3433
"knative.dev/pkg/webhook/resourcesemantics"
3534
)
3635

@@ -110,23 +109,17 @@ func (ac *reconciler) decodeRequestAndPrepareContext(
110109
var newObj resourcesemantics.GenericCRD
111110
if len(newBytes) != 0 {
112111
newObj = handler.DeepCopyObject().(resourcesemantics.GenericCRD)
113-
newDecoder := json.NewDecoder(bytes.NewBuffer(newBytes))
114-
if ac.disallowUnknownFields {
115-
newDecoder.DisallowUnknownFields()
116-
}
117-
if err := newDecoder.Decode(&newObj); err != nil {
112+
err := json.Decode(newBytes, newObj, ac.disallowUnknownFields)
113+
if err != nil {
118114
return ctx, nil, fmt.Errorf("cannot decode incoming new object: %w", err)
119115
}
120116
}
121117

122118
var oldObj resourcesemantics.GenericCRD
123119
if len(oldBytes) != 0 {
124120
oldObj = handler.DeepCopyObject().(resourcesemantics.GenericCRD)
125-
oldDecoder := json.NewDecoder(bytes.NewBuffer(oldBytes))
126-
if ac.disallowUnknownFields {
127-
oldDecoder.DisallowUnknownFields()
128-
}
129-
if err := oldDecoder.Decode(&oldObj); err != nil {
121+
err := json.Decode(oldBytes, oldObj, ac.disallowUnknownFields)
122+
if err != nil {
130123
return ctx, nil, fmt.Errorf("cannot decode incoming old object: %w", err)
131124
}
132125
}
@@ -201,8 +194,7 @@ func (ac *reconciler) callback(ctx context.Context, req *admissionv1.AdmissionRe
201194
if c, ok := ac.callbacks[gvk]; ok {
202195
if _, supported := c.supportedVerbs[req.Operation]; supported {
203196
unstruct := &unstructured.Unstructured{}
204-
newDecoder := json.NewDecoder(bytes.NewBuffer(toDecode))
205-
if err := newDecoder.Decode(&unstruct); err != nil {
197+
if err := json.Unmarshal(toDecode, unstruct); err != nil {
206198
return fmt.Errorf("cannot decode incoming new object: %w", err)
207199
}
208200

vendor/modules.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1032,7 +1032,7 @@ knative.dev/eventing/test/test_images/print
10321032
# knative.dev/hack v0.0.0-20210622141627-e28525d8d260
10331033
## explicit
10341034
knative.dev/hack
1035-
# knative.dev/pkg v0.0.0-20210803160015-21eb4c167cc5
1035+
# knative.dev/pkg v0.0.0-20210902173607-844a6bc45596
10361036
## explicit
10371037
knative.dev/pkg/apis
10381038
knative.dev/pkg/apis/duck
@@ -1129,6 +1129,7 @@ knative.dev/pkg/webhook
11291129
knative.dev/pkg/webhook/certificates
11301130
knative.dev/pkg/webhook/certificates/resources
11311131
knative.dev/pkg/webhook/configmaps
1132+
knative.dev/pkg/webhook/json
11321133
knative.dev/pkg/webhook/resourcesemantics
11331134
knative.dev/pkg/webhook/resourcesemantics/defaulting
11341135
knative.dev/pkg/webhook/resourcesemantics/validation

0 commit comments

Comments
 (0)