diff --git a/go.mod b/go.mod index d93c51127fc..a5e122b265e 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( k8s.io/code-generator v0.22.5 k8s.io/klog v1.0.0 k8s.io/kube-openapi v0.0.0-20220114203427-a0453230fd26 - knative.dev/pkg v0.0.0-20220104185830-52e42b760b54 + knative.dev/pkg v0.0.0-20220131144930-f4b57aef0006 ) require ( @@ -37,12 +37,10 @@ require ( github.com/aws/aws-sdk-go-v2/service/ecr v1.14.0 // indirect github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.11.0 // indirect github.com/emicklei/go-restful v2.15.0+incompatible // indirect - github.com/go-logr/logr v1.2.2 // indirect github.com/google/go-containerregistry/pkg/authn/kubernetes v0.0.0-20220120123041-d22850aca581 // indirect go.uber.org/multierr v1.7.0 // indirect golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect - k8s.io/klog/v2 v2.40.1 // indirect k8s.io/utils v0.0.0-20211208161948-7d6a63dca704 // indirect ) diff --git a/go.sum b/go.sum index d2fb6155253..0c051eac379 100644 --- a/go.sum +++ b/go.sum @@ -2183,9 +2183,9 @@ k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20211208161948-7d6a63dca704 h1:ZKMMxTvduyf5WUtREOqg5LiXaN1KO/+0oOQPRFrClpo= k8s.io/utils v0.0.0-20211208161948-7d6a63dca704/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -knative.dev/hack v0.0.0-20211203062838-e11ac125e707/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= -knative.dev/pkg v0.0.0-20220104185830-52e42b760b54 h1:rSu9UPVufkvSTKhPoF5vTJTPNmvzwW4Dza1pD9GgO2w= -knative.dev/pkg v0.0.0-20220104185830-52e42b760b54/go.mod h1:189cvGP0mwpqwZGFrLk5WuERIsNI/J6HuQ1CIX7SXxY= +knative.dev/hack v0.0.0-20220128200847-51a42b2eb63e/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= +knative.dev/pkg v0.0.0-20220131144930-f4b57aef0006 h1:0Kv7dIOimyHno/7jbQ6LCi15ME+e/b5tY0pwi99kanQ= +knative.dev/pkg v0.0.0-20220131144930-f4b57aef0006/go.mod h1:bZMFTPDPHV3wXuiQ09UJuEGYYQnfpe81MCxNvsMAiJk= mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= diff --git a/vendor/knative.dev/pkg/apis/duck/v1/source_types.go b/vendor/knative.dev/pkg/apis/duck/v1/source_types.go index 2c5493d8cd1..bed832f32f1 100644 --- a/vendor/knative.dev/pkg/apis/duck/v1/source_types.go +++ b/vendor/knative.dev/pkg/apis/duck/v1/source_types.go @@ -181,9 +181,10 @@ func (s *Source) Validate(ctx context.Context) *apis.FieldError { func (s *SourceSpec) Validate(ctx context.Context) *apis.FieldError { if s == nil { - return nil + return apis.ErrMissingField("spec") } - return s.CloudEventOverrides.Validate(ctx).ViaField("ceOverrides") + return s.Sink.Validate(ctx).ViaField("sink"). + Also(s.CloudEventOverrides.Validate(ctx).ViaField("ceOverrides")) } func (ceOverrides *CloudEventOverrides) Validate(ctx context.Context) *apis.FieldError { diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/client.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/client.go index 41cc82eaffc..602a06911cf 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/client.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/client.go @@ -29,7 +29,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // clientGenerator produces a file of listers for a given GroupVersion and diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/duck.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/duck.go index 678ddcc7dd3..997863f2654 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/duck.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/duck.go @@ -23,7 +23,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // duckGenerator produces logic to register a duck.InformerFactory for a particular diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/factory.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/factory.go index 55a0db18cb2..1885cad6bb8 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/factory.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/factory.go @@ -23,7 +23,7 @@ import ( "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // factoryTestGenerator produces a file of factory injection of a given type. diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_client.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_client.go index 76725f2bd96..4eee7212ffd 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_client.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_client.go @@ -22,7 +22,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // fakeClientGenerator produces a file of listers for a given GroupVersion and diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_duck.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_duck.go index 8d7616a3929..d297c896750 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_duck.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_duck.go @@ -23,7 +23,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // fakeDuckGenerator produces a file of listers for a given GroupVersion and diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_factory.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_factory.go index 63fbdc37944..d0f25d00a8a 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_factory.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_factory.go @@ -22,7 +22,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // fakeFactoryGenerator produces a file of listers for a given GroupVersion and diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_filtered_factory.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_filtered_factory.go index 1e747f4b7b4..c5a9f972869 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_filtered_factory.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_filtered_factory.go @@ -22,7 +22,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // fakeFilteredFactoryGenerator produces a file of listers for a given GroupVersion and diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_filtered_informer.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_filtered_informer.go index 47b7008844f..7e5e8ae203a 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_filtered_informer.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_filtered_informer.go @@ -23,7 +23,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // fakeFilteredInformerGenerator produces a file of listers for a given GroupVersion and diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_informer.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_informer.go index 6be8a1b692b..84769e05d95 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_informer.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fake_informer.go @@ -23,7 +23,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // fakeInformerGenerator produces a file of listers for a given GroupVersion and diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/filtered_factory.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/filtered_factory.go index 58e65432f5a..f8292306223 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/filtered_factory.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/filtered_factory.go @@ -22,8 +22,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - - "k8s.io/klog" + "k8s.io/klog/v2" ) // factoryTestGenerator produces a file of factory injection of a given type. diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/filtered_informer.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/filtered_informer.go index 3100052a86d..53debfb38e5 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/filtered_informer.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/filtered_informer.go @@ -24,7 +24,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // injectionTestGenerator produces a file of listers for a given GroupVersion and diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/informer.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/informer.go index 2138b85f6a7..d00158b28e5 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/informer.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/informer.go @@ -24,7 +24,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // injectionTestGenerator produces a file of listers for a given GroupVersion and diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/packages.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/packages.go index f79339824bf..62a143d43ed 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/packages.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/packages.go @@ -27,7 +27,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" informergenargs "knative.dev/pkg/codegen/cmd/injection-gen/args" ) diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller.go index 63556dec60a..376623537a0 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller.go @@ -22,7 +22,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // reconcilerControllerGenerator produces a file for setting up the reconciler diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller_stub.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller_stub.go index 13dff4d5169..83b913d5e4c 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller_stub.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller_stub.go @@ -22,7 +22,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // reconcilerControllerStubGenerator produces a file of the stub of the diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler.go index 5e3f23faf41..a292a24b557 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler.go @@ -24,7 +24,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // reconcilerReconcilerGenerator produces a reconciler struct for the given type. diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler_stub.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler_stub.go index 197afe9d0e1..bb7d59eeaa9 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler_stub.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler_stub.go @@ -22,7 +22,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // reconcilerReconcilerStubGenerator produces a file of the stub of how to diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_state.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_state.go index 9ef36250536..08b148efff1 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_state.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_state.go @@ -22,7 +22,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/klog" + "k8s.io/klog/v2" ) // reconcilerStateGenerator produces a reconciler state object to manage reconciliation runs. diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/main.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/main.go index 30f20a0dd3f..eae5699f739 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/main.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/main.go @@ -22,7 +22,7 @@ import ( "k8s.io/code-generator/pkg/util" "k8s.io/gengo/args" - "k8s.io/klog" + "k8s.io/klog/v2" "github.com/spf13/pflag" generatorargs "knative.dev/pkg/codegen/cmd/injection-gen/args" diff --git a/vendor/knative.dev/pkg/injection/config.go b/vendor/knative.dev/pkg/injection/config.go index f54f84b4519..c3531b9e407 100644 --- a/vendor/knative.dev/pkg/injection/config.go +++ b/vendor/knative.dev/pkg/injection/config.go @@ -21,7 +21,7 @@ import ( "log" "k8s.io/client-go/rest" - "k8s.io/klog" + "k8s.io/klog/v2" "knative.dev/pkg/environment" ) diff --git a/vendor/knative.dev/pkg/leaderelection/config.go b/vendor/knative.dev/pkg/leaderelection/config.go index 0694395bf90..f07c30cea0f 100644 --- a/vendor/knative.dev/pkg/leaderelection/config.go +++ b/vendor/knative.dev/pkg/leaderelection/config.go @@ -98,9 +98,9 @@ func (c *Config) GetComponentConfig(name string) ComponentConfig { func defaultConfig() *Config { return &Config{ Buckets: 1, - LeaseDuration: 15 * time.Second, - RenewDeadline: 10 * time.Second, - RetryPeriod: 2 * time.Second, + LeaseDuration: 60 * time.Second, + RenewDeadline: 40 * time.Second, + RetryPeriod: 10 * time.Second, } } diff --git a/vendor/knative.dev/pkg/leaderelection/doc.go b/vendor/knative.dev/pkg/leaderelection/doc.go new file mode 100644 index 00000000000..fb7e162f768 --- /dev/null +++ b/vendor/knative.dev/pkg/leaderelection/doc.go @@ -0,0 +1,27 @@ +/* +Copyright 2020 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. +*/ + +// LeaderElection provides an interface for controllers implementing using +// controller injection: +// https://github.com/knative/pkg/blob/main/injection/README.md +// +// Leaderelection uses the context-stuffing mechanism to provide config-driven +// management of multiple election strategies (currently, using Kubernetes +// etcd-based election primitives or StatefulSet indexes and counts). +// +// For more details, see the original design document: +// https://docs.google.com/document/d/e/2PACX-1vTh40N-Kk6EPNzYpITiLg8YJk0qZyZv7KgMpcQS72T9Lv_F2PQeGybx4TtH0E1N1aUgLQer7b8u3lDc/pub +package leaderelection diff --git a/vendor/knative.dev/pkg/test/logging/logging.go b/vendor/knative.dev/pkg/test/logging/logging.go index ace64469944..74df6dfdeaa 100644 --- a/vendor/knative.dev/pkg/test/logging/logging.go +++ b/vendor/knative.dev/pkg/test/logging/logging.go @@ -33,7 +33,7 @@ import ( "go.opencensus.io/trace" "go.uber.org/zap" "go.uber.org/zap/zapcore" - "k8s.io/klog" + "k8s.io/klog/v2" ) const ( diff --git a/vendor/knative.dev/pkg/version/version.go b/vendor/knative.dev/pkg/version/version.go index 56b7ae95825..b304f2b0a5e 100644 --- a/vendor/knative.dev/pkg/version/version.go +++ b/vendor/knative.dev/pkg/version/version.go @@ -33,7 +33,7 @@ const ( // NOTE: If you are changing this line, please also update the minimum kubernetes // version listed here: // https://github.com/knative/docs/blob/mkdocs/docs/snippets/prerequisites.md - defaultMinimumVersion = "v1.20.0" + defaultMinimumVersion = "v1.21.0" ) func getMinimumVersion() string { diff --git a/vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/controller.go b/vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/controller.go index a4a41d0beaf..b50fcf8f41d 100644 --- a/vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/controller.go +++ b/vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/controller.go @@ -29,6 +29,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/cache" + "knative.dev/pkg/controller" "knative.dev/pkg/system" "knative.dev/pkg/webhook" @@ -42,6 +43,7 @@ func NewAdmissionController( handlers map[schema.GroupVersionKind]resourcesemantics.GenericCRD, wc func(context.Context) context.Context, disallowUnknownFields bool, + callbacks ...map[schema.GroupVersionKind]Callback, ) *controller.Impl { client := kubeclient.Get(ctx) @@ -51,6 +53,19 @@ func NewAdmissionController( key := types.NamespacedName{Name: name} + // This not ideal, we are using a variadic argument to effectively make callbacks optional + // This allows this addition to be non-breaking to consumers of /pkg + // TODO: once all sub-repos have adopted this, we might move this back to a traditional param. + var unwrappedCallbacks map[schema.GroupVersionKind]Callback + switch len(callbacks) { + case 0: + unwrappedCallbacks = map[schema.GroupVersionKind]Callback{} + case 1: + unwrappedCallbacks = callbacks[0] + default: + panic("NewAdmissionController may not be called with multiple callback maps") + } + wh := &reconciler{ LeaderAwareFuncs: pkgreconciler.LeaderAwareFuncs{ // Have this reconciler enqueue our singleton whenever it becomes leader. @@ -60,9 +75,10 @@ func NewAdmissionController( }, }, - key: key, - path: path, - handlers: handlers, + key: key, + path: path, + handlers: handlers, + callbacks: unwrappedCallbacks, withContext: wc, disallowUnknownFields: disallowUnknownFields, diff --git a/vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/defaulting.go b/vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/defaulting.go index 504dcaa0661..a8a30fae13d 100644 --- a/vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/defaulting.go +++ b/vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/defaulting.go @@ -25,16 +25,18 @@ import ( "github.com/gobuffalo/flect" "go.uber.org/zap" - jsonpatch "gomodules.xyz/jsonpatch/v2" + "gomodules.xyz/jsonpatch/v2" admissionv1 "k8s.io/api/admission/v1" admissionregistrationv1 "k8s.io/api/admissionregistration/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes" admissionlisters "k8s.io/client-go/listers/admissionregistration/v1" corelisters "k8s.io/client-go/listers/core/v1" + "knative.dev/pkg/apis" "knative.dev/pkg/apis/duck" "knative.dev/pkg/controller" @@ -56,9 +58,10 @@ type reconciler struct { webhook.StatelessAdmissionImpl pkgreconciler.LeaderAwareFuncs - key types.NamespacedName - path string - handlers map[schema.GroupVersionKind]resourcesemantics.GenericCRD + key types.NamespacedName + path string + handlers map[schema.GroupVersionKind]resourcesemantics.GenericCRD + callbacks map[schema.GroupVersionKind]Callback withContext func(context.Context) context.Context @@ -70,6 +73,37 @@ type reconciler struct { secretName string } +// CallbackFunc is the function to be invoked. +type CallbackFunc func(ctx context.Context, unstructured *unstructured.Unstructured) error + +// Callback is a generic function to be called by a consumer of defaulting. +type Callback struct { + // function is the callback to be invoked. + function CallbackFunc + + // supportedVerbs are the verbs supported for the callback. + // The function will only be called on these actions. + supportedVerbs map[webhook.Operation]struct{} +} + +// NewCallback creates a new callback function to be invoked on supported verbs. +func NewCallback(function func(context.Context, *unstructured.Unstructured) error, supportedVerbs ...webhook.Operation) Callback { + if function == nil { + panic("expected function, got nil") + } + m := make(map[webhook.Operation]struct{}) + for _, op := range supportedVerbs { + if op == webhook.Delete { + panic("Verb " + webhook.Delete + " not allowed") + } + if _, has := m[op]; has { + panic("duplicate verbs not allowed") + } + m[op] = struct{}{} + } + return Callback{function: function, supportedVerbs: m} +} + var _ controller.Reconciler = (*reconciler)(nil) var _ pkgreconciler.LeaderAware = (*reconciler)(nil) var _ webhook.AdmissionController = (*reconciler)(nil) @@ -137,7 +171,17 @@ func (ac *reconciler) reconcileMutatingWebhook(ctx context.Context, caCert []byt logger := logging.FromContext(ctx) rules := make([]admissionregistrationv1.RuleWithOperations, 0, len(ac.handlers)) + gvks := make(map[schema.GroupVersionKind]struct{}, len(ac.handlers)+len(ac.callbacks)) for gvk := range ac.handlers { + gvks[gvk] = struct{}{} + } + for gvk := range ac.callbacks { + if _, ok := gvks[gvk]; !ok { + gvks[gvk] = struct{}{} + } + } + + for gvk := range gvks { plural := strings.ToLower(flect.Pluralize(gvk.Kind)) rules = append(rules, admissionregistrationv1.RuleWithOperations{ @@ -231,8 +275,18 @@ func (ac *reconciler) mutate(ctx context.Context, req *admissionv1.AdmissionRequ logger := logging.FromContext(ctx) handler, ok := ac.handlers[gvk] if !ok { - logger.Error("Unhandled kind: ", gvk) - return nil, fmt.Errorf("unhandled kind: %v", gvk) + if _, ok := ac.callbacks[gvk]; !ok { + logger.Error("Unhandled kind: ", gvk) + return nil, fmt.Errorf("unhandled kind: %v", gvk) + } + patches, err := ac.callback(ctx, gvk, req, true /* shouldSetUserInfo */, duck.JSONPatch{}) + if err != nil { + logger.Errorw("Failed the callback defaulter", zap.Error(err)) + // Return the error message as-is to give the defaulter callback + // discretion over (our portion of) the message that the user sees. + return nil, err + } + return json.Marshal(patches) } // nil values denote absence of `old` (create) or `new` (delete) objects. @@ -302,6 +356,13 @@ func (ac *reconciler) mutate(ctx context.Context, req *admissionv1.AdmissionRequ return nil, err } + if patches, err = ac.callback(ctx, gvk, req, false /* shouldSetUserInfo */, patches); err != nil { + logger.Errorw("Failed the callback defaulter", zap.Error(err)) + // Return the error message as-is to give the defaulter callback + // discretion over (our portion of) the message that the user sees. + return nil, err + } + // None of the validators will accept a nil value for newObj. if newObj == nil { return nil, errMissingNewObject @@ -329,6 +390,57 @@ func (ac *reconciler) setUserInfoAnnotations(ctx context.Context, patches duck.J return append(patches, patch...), nil } +func (ac *reconciler) callback(ctx context.Context, gvk schema.GroupVersionKind, req *admissionv1.AdmissionRequest, shouldSetUserInfo bool, patches duck.JSONPatch) (duck.JSONPatch, error) { + // Get callback. + callback, ok := ac.callbacks[gvk] + if !ok { + return patches, nil + } + + // Check if request operation is a supported webhook operation. + if _, isSupported := callback.supportedVerbs[req.Operation]; !isSupported { + return patches, nil + } + + oldBytes := req.OldObject.Raw + newBytes := req.Object.Raw + + before := &unstructured.Unstructured{} + after := &unstructured.Unstructured{} + + // Get unstructured object. + if err := json.Unmarshal(newBytes, before); err != nil { + return nil, fmt.Errorf("cannot decode object: %w", err) + } + // Copy before in after unstructured objects. + before.DeepCopyInto(after) + + // Setup context. + if len(oldBytes) != 0 { + if req.SubResource == "" { + ctx = apis.WithinUpdate(ctx, before) + } else { + ctx = apis.WithinSubResourceUpdate(ctx, before, req.SubResource) + } + } else { + ctx = apis.WithinCreate(ctx) + } + ctx = apis.WithUserInfo(ctx, &req.UserInfo) + + // Call callback passing after. + if err := callback.function(ctx, after); err != nil { + return patches, err + } + + if shouldSetUserInfo { + setUserInfoAnnotations(adaptUnstructuredHasSpecCtx(ctx, req), unstructuredHasSpec{after}, req.Resource.Group) + } + + // Create patches. + patch, err := duck.CreatePatch(before.Object, after.Object) + return append(patches, patch...), err +} + // roundTripPatch generates the JSONPatch that corresponds to round tripping the given bytes through // the Golang type (JSON -> Golang type -> JSON). Because it is not always true that // bytes == json.Marshal(json.Unmarshal(bytes)). diff --git a/vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/user_info.go b/vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/user_info.go index 36c1cfbd215..f206588e46d 100644 --- a/vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/user_info.go +++ b/vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/user_info.go @@ -19,11 +19,19 @@ package defaulting import ( "context" + admissionv1 "k8s.io/api/admission/v1" "k8s.io/apimachinery/pkg/api/equality" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "knative.dev/pkg/apis" ) +var ( + emptyGroupUpdaterAnnotation = apis.UpdaterAnnotationSuffix[1:] + emptyGroupCreatorAnnotation = apis.CreatorAnnotationSuffix[1:] +) + // setUserInfoAnnotations sets creator and updater annotations on a resource. func setUserInfoAnnotations(ctx context.Context, resource apis.HasSpec, groupName string) { if ui := apis.GetUserInfo(ctx); ui != nil { @@ -38,15 +46,52 @@ func setUserInfoAnnotations(ctx context.Context, resource apis.HasSpec, groupNam objectMetaAccessor.GetObjectMeta().SetAnnotations(annotations) } + updaterAnnotation := emptyGroupUpdaterAnnotation + creatorAnnotation := emptyGroupCreatorAnnotation + if groupName != "" { + updaterAnnotation = groupName + apis.UpdaterAnnotationSuffix + creatorAnnotation = groupName + apis.CreatorAnnotationSuffix + } + if apis.IsInUpdate(ctx) { old := apis.GetBaseline(ctx).(apis.HasSpec) if equality.Semantic.DeepEqual(old.GetUntypedSpec(), resource.GetUntypedSpec()) { return } - annotations[groupName+apis.UpdaterAnnotationSuffix] = ui.Username + annotations[updaterAnnotation] = ui.Username + } else { + annotations[creatorAnnotation] = ui.Username + annotations[updaterAnnotation] = ui.Username + } + objectMetaAccessor.GetObjectMeta().SetAnnotations(annotations) + } +} + +type unstructuredHasSpec struct { + *unstructured.Unstructured +} + +func (us unstructuredHasSpec) GetObjectMeta() metav1.Object { + return us.Unstructured +} + +var _ metav1.ObjectMetaAccessor = unstructuredHasSpec{} + +func (us unstructuredHasSpec) GetUntypedSpec() interface{} { + if s, ok := us.Unstructured.Object["spec"]; ok { + return s + } + return nil +} + +func adaptUnstructuredHasSpecCtx(ctx context.Context, req *admissionv1.AdmissionRequest) context.Context { + if apis.IsInUpdate(ctx) { + b := apis.GetBaseline(ctx) + if apis.IsInStatusUpdate(ctx) { + ctx = apis.WithinSubResourceUpdate(ctx, unstructuredHasSpec{b.(*unstructured.Unstructured)}, req.SubResource) } else { - annotations[groupName+apis.CreatorAnnotationSuffix] = ui.Username - annotations[groupName+apis.UpdaterAnnotationSuffix] = ui.Username + ctx = apis.WithinUpdate(ctx, unstructuredHasSpec{b.(*unstructured.Unstructured)}) } } + return ctx } diff --git a/vendor/modules.txt b/vendor/modules.txt index d3c80f2f51c..e35e9dce7b1 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -187,7 +187,6 @@ github.com/go-kit/log/level # github.com/go-logfmt/logfmt v0.5.0 github.com/go-logfmt/logfmt # github.com/go-logr/logr v1.2.2 -## explicit github.com/go-logr/logr # github.com/go-openapi/jsonpointer v0.19.5 github.com/go-openapi/jsonpointer @@ -997,7 +996,6 @@ k8s.io/gengo/types ## explicit k8s.io/klog # k8s.io/klog/v2 v2.40.1 -## explicit k8s.io/klog/v2 # k8s.io/kube-openapi v0.0.0-20220114203427-a0453230fd26 ## explicit @@ -1015,7 +1013,7 @@ k8s.io/utils/buffer k8s.io/utils/integer k8s.io/utils/pointer k8s.io/utils/trace -# knative.dev/pkg v0.0.0-20220104185830-52e42b760b54 +# knative.dev/pkg v0.0.0-20220131144930-f4b57aef0006 ## explicit knative.dev/pkg/apis knative.dev/pkg/apis/duck