Skip to content

Commit

Permalink
upgrade to latest dependencies (#1196)
Browse files Browse the repository at this point in the history
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 <automation@knative.team>
  • Loading branch information
knative-automation committed Sep 2, 2021
1 parent e49a86c commit bf35b7e
Show file tree
Hide file tree
Showing 6 changed files with 147 additions and 29 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ require (
k8s.io/utils v0.0.0-20210111153108-fddb29f9d009
knative.dev/eventing v0.25.0
knative.dev/hack v0.0.0-20210622141627-e28525d8d260
knative.dev/pkg v0.0.0-20210803160015-21eb4c167cc5
knative.dev/pkg v0.0.0-20210902173607-844a6bc45596
knative.dev/reconciler-test v0.0.0-20210803183715-b61cc77c06f6
)
3 changes: 2 additions & 1 deletion go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1225,8 +1225,9 @@ knative.dev/eventing v0.25.0/go.mod h1:8jIsrnSONPgv+m63OTzpwZQJiQASYl77C3llCyYlB
knative.dev/hack v0.0.0-20210622141627-e28525d8d260 h1:f2eMtOubAOc/Q7JlvFPDKXiPlJVK+VpX2Cot8hRzCgQ=
knative.dev/hack v0.0.0-20210622141627-e28525d8d260/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
knative.dev/hack/schema v0.0.0-20210622141627-e28525d8d260/go.mod h1:ffjwmdcrH5vN3mPhO8RrF2KfNnbHeCE2C60A+2cv3U0=
knative.dev/pkg v0.0.0-20210803160015-21eb4c167cc5 h1:jpOTmAXg1oLS8u5HPBrFP1XsOSFCQIvlTRxP8TDGg2E=
knative.dev/pkg v0.0.0-20210803160015-21eb4c167cc5/go.mod h1:RPk5txNA3apR9X40D4MpUOP9/VqOG8CrtABWfOwGVS4=
knative.dev/pkg v0.0.0-20210902173607-844a6bc45596 h1:LCSg0O51V8I7sfnhw+j9WLBol8f2lCV5HkPyxJT9zzA=
knative.dev/pkg v0.0.0-20210902173607-844a6bc45596/go.mod h1:RPk5txNA3apR9X40D4MpUOP9/VqOG8CrtABWfOwGVS4=
knative.dev/reconciler-test v0.0.0-20210803183715-b61cc77c06f6 h1:jSz98FX9JfAMJX3qVeRF7RU7A3XLJJxBNz8GYU5z0bM=
knative.dev/reconciler-test v0.0.0-20210803183715-b61cc77c06f6/go.mod h1:+Kovy+G5zXZNcuO/uB+zfo37vFKZzsLIlWezt/nKMz0=
modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
Expand Down
131 changes: 131 additions & 0 deletions vendor/knative.dev/pkg/webhook/json/decode.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
/*
Copyright 2021 The Knative Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package json

import (
"bytes"
"encoding/json"
"io"
)

var (
emptyMeta = []byte(`:{}`)
metaPrefix = []byte(`{"metadata"`)
metaSuffix = []byte(`}`)
)

var (
// Unmarshal is an alias for json.Unmarshal
Unmarshal = json.Unmarshal

//Marshal is an alias for json.Marshal
Marshal = json.Marshal
)

// Decode will parse the json byte array to the target object. When
// unknown fields are _not_ allowed we still accept unknown
// fields in the Object's metadata
//
// See https://github.com/knative/serving/issues/11448 for details
func Decode(bites []byte, target interface{}, disallowUnknownFields bool) error {
if !disallowUnknownFields {
return json.Unmarshal(bites, target)
}

// If we don't allow unknown fields we skip validating fields in the metadata
// block since that is opaque to us and validated by the API server
start, end, err := findMetadataOffsets(bites)
if err != nil {
return err
} else if start == -1 || end == -1 {
// If for some reason the json does not have metadata continue with normal parsing
dec := json.NewDecoder(bytes.NewReader(bites))
dec.DisallowUnknownFields()
return dec.Decode(target)
}

before := bites[:start]
metadata := bites[start:end]
after := bites[end:]

// Parse everything but skip metadata
dec := json.NewDecoder(io.MultiReader(
bytes.NewReader(before),
bytes.NewReader(emptyMeta),
bytes.NewReader(after),
))

dec.DisallowUnknownFields()
if err := dec.Decode(target); err != nil {
return err
}

// Now we parse just the metadata
dec = json.NewDecoder(io.MultiReader(
bytes.NewReader(metaPrefix),
bytes.NewReader(metadata),
bytes.NewReader(metaSuffix),
))

if err := dec.Decode(target); err != nil {
return err
}

return nil
}

func findMetadataOffsets(bites []byte) (start, end int64, err error) {
start, end = -1, -1
level := 0

var (
dec = json.NewDecoder(bytes.NewReader(bites))
t json.Token
)

for {
t, err = dec.Token()
if err == io.EOF { //nolint
break
}
if err != nil {
return
}

switch v := t.(type) {
case json.Delim:
if v == '{' {
level++
} else if v == '}' {
level--
}
case string:
if v == "metadata" && level == 1 {
start = dec.InputOffset()
x := struct{}{}
if err = dec.Decode(&x); err != nil {
return -1, -1, err
}
end = dec.InputOffset()

// we exit early to stop processing the rest of the object
return
}
}
}
return -1, -1, nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,7 @@ limitations under the License.
package defaulting

import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"sort"
Expand Down Expand Up @@ -47,6 +45,7 @@ import (
"knative.dev/pkg/system"
"knative.dev/pkg/webhook"
certresources "knative.dev/pkg/webhook/certificates/resources"
"knative.dev/pkg/webhook/json"
"knative.dev/pkg/webhook/resourcesemantics"
)

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

if len(newBytes) != 0 {
newObj = handler.DeepCopyObject().(resourcesemantics.GenericCRD)
newDecoder := json.NewDecoder(bytes.NewBuffer(newBytes))
if ac.disallowUnknownFields {
newDecoder.DisallowUnknownFields()
}
if err := newDecoder.Decode(&newObj); err != nil {
err := json.Decode(newBytes, newObj, ac.disallowUnknownFields)
if err != nil {
return nil, fmt.Errorf("cannot decode incoming new object: %w", err)
}
}
if len(oldBytes) != 0 {
oldObj = handler.DeepCopyObject().(resourcesemantics.GenericCRD)
oldDecoder := json.NewDecoder(bytes.NewBuffer(oldBytes))
if ac.disallowUnknownFields {
oldDecoder.DisallowUnknownFields()
}
if err := oldDecoder.Decode(&oldObj); err != nil {
err := json.Decode(oldBytes, oldObj, ac.disallowUnknownFields)
if err != nil {
return nil, fmt.Errorf("cannot decode incoming old object: %w", err)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,7 @@ limitations under the License.
package validation

import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"

Expand All @@ -31,6 +29,7 @@ import (
kubeclient "knative.dev/pkg/client/injection/kube/client"
"knative.dev/pkg/logging"
"knative.dev/pkg/webhook"
"knative.dev/pkg/webhook/json"
"knative.dev/pkg/webhook/resourcesemantics"
)

Expand Down Expand Up @@ -110,23 +109,17 @@ func (ac *reconciler) decodeRequestAndPrepareContext(
var newObj resourcesemantics.GenericCRD
if len(newBytes) != 0 {
newObj = handler.DeepCopyObject().(resourcesemantics.GenericCRD)
newDecoder := json.NewDecoder(bytes.NewBuffer(newBytes))
if ac.disallowUnknownFields {
newDecoder.DisallowUnknownFields()
}
if err := newDecoder.Decode(&newObj); err != nil {
err := json.Decode(newBytes, newObj, ac.disallowUnknownFields)
if err != nil {
return ctx, nil, fmt.Errorf("cannot decode incoming new object: %w", err)
}
}

var oldObj resourcesemantics.GenericCRD
if len(oldBytes) != 0 {
oldObj = handler.DeepCopyObject().(resourcesemantics.GenericCRD)
oldDecoder := json.NewDecoder(bytes.NewBuffer(oldBytes))
if ac.disallowUnknownFields {
oldDecoder.DisallowUnknownFields()
}
if err := oldDecoder.Decode(&oldObj); err != nil {
err := json.Decode(oldBytes, oldObj, ac.disallowUnknownFields)
if err != nil {
return ctx, nil, fmt.Errorf("cannot decode incoming old object: %w", err)
}
}
Expand Down Expand Up @@ -201,8 +194,7 @@ func (ac *reconciler) callback(ctx context.Context, req *admissionv1.AdmissionRe
if c, ok := ac.callbacks[gvk]; ok {
if _, supported := c.supportedVerbs[req.Operation]; supported {
unstruct := &unstructured.Unstructured{}
newDecoder := json.NewDecoder(bytes.NewBuffer(toDecode))
if err := newDecoder.Decode(&unstruct); err != nil {
if err := json.Unmarshal(toDecode, unstruct); err != nil {
return fmt.Errorf("cannot decode incoming new object: %w", err)
}

Expand Down
3 changes: 2 additions & 1 deletion vendor/modules.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1065,7 +1065,7 @@ knative.dev/eventing/test/test_images/request-sender
# knative.dev/hack v0.0.0-20210622141627-e28525d8d260
## explicit
knative.dev/hack
# knative.dev/pkg v0.0.0-20210803160015-21eb4c167cc5
# knative.dev/pkg v0.0.0-20210902173607-844a6bc45596
## explicit
knative.dev/pkg/apis
knative.dev/pkg/apis/duck
Expand Down Expand Up @@ -1153,6 +1153,7 @@ knative.dev/pkg/version
knative.dev/pkg/webhook
knative.dev/pkg/webhook/certificates
knative.dev/pkg/webhook/certificates/resources
knative.dev/pkg/webhook/json
knative.dev/pkg/webhook/resourcesemantics
knative.dev/pkg/webhook/resourcesemantics/defaulting
knative.dev/pkg/webhook/resourcesemantics/validation
Expand Down

0 comments on commit bf35b7e

Please sign in to comment.