mirror of https://github.com/knative/client.git
upgrade to latest dependencies (#1761)
bumping knative.dev/networking 0d4e937...c037e29:
> c037e29 upgrade to latest dependencies (# 737)
> 9b791e2 Update community files (# 736)
> 22df410 upgrade to latest dependencies (# 735)
> 6d96d69 upgrade to latest dependencies (# 734)
bumping k8s.io/klog/v2 0990e81...9ae4992:
> 9ae4992 Merge pull request # 355 from pohly/call-overhead-benchmarks
> cb9292a Merge pull request # 349 from pohly/init-flags-concurrency
> f08fd26 klog: benchmark the overhead when logging is off
> 02fe323 Merge pull request # 345 from dims/bump-version-of-golang-to-1.19-and-drop-older-versions
> 28f7906 make InitFlags read-only
> d64acbd Merge pull request # 344 from harshanarayana/bug/GIT-343/logr-handle-marshalling-non-string-values
> 8c0f205 reformat to golang 1.19 standards
> a952486 add test for the command line usage
> dcddc5f kvlistformat: fix the issue with display marshalled value for non string type
> 6f5eeb9 Bump version of golang to 1.19 and prune older versions
bumping knative.dev/serving 1b38451...cd1cd1a:
> cd1cd1a upgrade to latest dependencies (# 13496)
> 3a9cefb Update net-istio nightly (# 13497)
> 638e114 Update net-istio nightly (# 13491)
> 149d152 Update net-istio nightly (# 13490)
> 2522268 Update net-gateway-api nightly (# 13489)
> 7157519 Update community files (# 13477)
> 87aad28 Update net-contour nightly (# 13482)
> 8f5491a Update net-gateway-api nightly (# 13481)
> 358853a Update net-certmanager nightly (# 13480)
> 26bb82f Update net-kourier nightly (# 13479)
> 1f3302d Update net-kourier nightly (# 13475)
> bb6457f upgrade to latest dependencies (# 13474)
> 651f27e next K8s min version is 1.24 (# 13473)
> aee40fd upgrade to latest dependencies (# 13467)
> 2b20603 add missing 'component' label to webhook template (# 13469)
> 874cceb Update net-gateway-api nightly (# 13466)
> aebc16c Update net-istio nightly (# 13460)
> 0df133d Update net-certmanager nightly (# 13461)
> 8848735 Update net-kourier nightly (# 13463)
> 44295ff Update net-contour nightly (# 13462)
> bd88e05 Use new keys for internal encryption secret data (# 13388)
> 0511892 Update net-certmanager nightly (# 13457)
> afc6942 Update net-kourier nightly (# 13456)
> 2a22058 Update net-contour nightly (# 13454)
> 8c79b7f Update net-gateway-api nightly (# 13455)
> c3e0f12 Add support for QPOptions TLS + Audience bound Tokens (# 13384)
> fd1b9ed Set filtered factory label in controller main + Upgrade to latest dependencies (# 13442)
> 601c762 Update net-certmanager nightly (# 13452)
> f9fd5c8 Update net-contour nightly (# 13446)
> 9106a61 Update net-certmanager nightly (# 13445)
bumping knative.dev/eventing 6de07e8...41653ce:
> 41653ce Bump kind and k8s (# 6620)
> 2e02230 Use pointer.XYZ() function instead of deprecated pointer.XYZPtr() (# 6617)
> 0401105 Remove k8s 1.23 kind (# 6616)
> e214072 [main] Upgrade to latest dependencies (# 6611)
> 00a31f2 [main] Update community files (# 6614)
> ed5e0a7 Knative enhance failed events extensions in mt channel broker (# 6569)
> e8fec2a Remove strict subscriber feature flag (# 6608)
> c6bfda3 Decrease exportTraceLimit to 100 (# 6612)
> 03eafac [main] Upgrade to latest dependencies (# 6609)
> 82bf83c Fix development docs on installing IMC (# 6605)
> 1c76762 [Scheduler] Handle permanent pending pods (# 6599)
> a390f74 [main] Upgrade to latest dependencies (# 6590)
> 1d02f98 Add Ansu as scheduler approver (# 6600)
> a653058 Set SecurityContext for test Pods (# 6584)
> 4809791 Updates for Go 1.19 (# 6594)
bumping k8s.io/api 4b838ea...88912e3:
> 88912e3 Update dependencies to v0.25.4 tag
> e7b469b Merge pull request # 112808 from cheftako/automated-cherry-pick-of-# 112689-upstream-release-1.25
> 1102e6f Updated vendor to the new preferred versions.
bumping knative.dev/pkg 389f811...05b694e:
> 05b694e upgrade to latest dependencies (# 2653)
> 242a3d7 Fix nil pointer deref in drain when it's reset (# 2645)
> f5c1a03 Update community files (# 2641)
> bd66b9b upgrade to latest dependencies (# 2640)
> dca788a Min K8s version is now 1.24 (# 2639)
> 6255ebd upgrade to latest dependencies (# 2638)
> 0243d64 Function AllowRestrictedPodSecurityStandard for modifying test pods (# 2625)
bumping k8s.io/apimachinery 478dd6e...4fbe8e4:
> 4fbe8e4 Merge pull request # 112218 from haoruan/automated-cherry-pick-of-# 111936-upstream-release-1.25
> cf171ba Merge pull request # 112808 from cheftako/automated-cherry-pick-of-# 112689-upstream-release-1.25
> b4db414 Marshal MicroTime to json and proto at the same precision
> cb0507f Updated vendor to the new preferred versions.
bumping k8s.io/gengo 397b4ae...fad74ee:
> fad74ee Merge pull request # 234 from aojea/use_github_actions
> e83a76d Merge pull request # 233 from rainest/fix/filter-abort
> f99002e remove travis
> 3913671 Merge pull request # 199 from rainest/log/lower-severity-uncopyable
> 535f8cc Restore uncopyable type case in Filter
> 3bcdbc7 Merge pull request # 232 from alexzielenski/defaulter-const-symbol-reference
> 914c10e Update examples/deepcopy-gen/generators/deepcopy.go
> c0856e2 Merge pull request # 231 from weilaaa/add_method_symmetric_difference_in_set
> 945b13c fix typo
> ad375a7 Fail if any requested type cannot be copied
> 66c86ac add method symmetric difference in set
> 49f7e1e fix typo
> 20f90a4 Update examples/defaulter-gen/generators/defaulter.go
> e1d2c67 remove incorrect quotes from ref regex comment
> 91632a7 address comments
> bab4b7f allow +default to refer to symbols in code
bumping k8s.io/utils ee6ede2...8e77b1f:
> 8e77b1f Merge pull request # 265 from danwinship/fix-dumb-api-mistake
> 1a15be2 Merge pull request # 270 from dashpole/trace_panic
> ba5a213 Fix an API accident with net.IPFamily
> 61b03e2 Merge pull request # 268 from petr-muller/deprecation-convention
> 71bfc7b make traces safe for concurrent use
> cfd413d Merge pull request # 263 from saltbo/fix-invalid-gha-goverion
> d90ac11 pointer: make deprecation comments follow convention
> 460b63a demonstrate trace panic
> 4270251 Merge pull request # 259 from LJTian/master
> 4a5ee0b fix: update the go-versions format for the gha
> 665eaae Merge pull request # 261 from liggitt/clean-deps
> 1be0ed5 Update Go standard libs address to reduce jump time
> 7796b5f Merge pull request # 260 from dims/bump-dependencies-and-go-language-version
> 25648b1 Drop testify dependency
> e9cbc92 Merge pull request # 242 from MushuEE/patch-3
> c9660c8 Bump dependencies and go language version
> 49b64f9 Drop afero dependency
> ad59060 Merge pull request # 253 from kschoche/add_uint_to_pointer_pkg
> d7bf925 Ineffective break statements triggering SA4011
> 2e139fc Merge pull request # 254 from dims/bump-version-of-golang-to-1.19
> d45ae35 add uint64 and uint to pointer pkg
> e3a7968 Bump version of golang to 1.19
bumping k8s.io/code-generator 7e9837e...6523e22:
> 6523e22 Merge pull request # 112808 from cheftako/automated-cherry-pick-of-# 112689-upstream-release-1.25
> 59f8301 Updated vendor to the new preferred versions.
bumping knative.dev/hack 8f3c705...c12c1bf:
> c12c1bf Revert of # 257 (# 258)
> 6397aac 🐛 Don't use NodeLocalDNS addon (# 257)
> 2e610ce Update community files (# 256)
> de2ff40 Allow tests to skip dumping resources on failure (# 255)
> 646aac0 e2e script tweaks (# 252)
> d470f52 Format go code (# 253)
> b035462 Calculate Image references properly (# 251)
> 1ba176e Trap calls are now executed in LIFO order (# 249)
bumping k8s.io/client-go 593f096...7226b15:
> 7226b15 Update dependencies to v0.25.4 tag
> 166ab05 Merge pull request # 112808 from cheftako/automated-cherry-pick-of-# 112689-upstream-release-1.25
> 4b5a638 Updated vendor to the new preferred versions.
bumping k8s.io/apiextensions-apiserver ebdae04...2c55649:
> 2c55649 Update dependencies to v0.25.4 tag
> 67ebb5f Merge pull request # 112808 from cheftako/automated-cherry-pick-of-# 112689-upstream-release-1.25
> 05d7571 Updated vendor to the new preferred versions.
> 2d6e469 Bump konnectivity-client to v0.0.33
Signed-off-by: Knative Automation <automation@knative.team>
Signed-off-by: Knative Automation <automation@knative.team>
This commit is contained in:
parent
9de74647cd
commit
bad1ba3051
26
go.mod
26
go.mod
|
|
@ -14,17 +14,17 @@ require (
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4
|
||||||
golang.org/x/term v0.0.0-20220919170432-7a66f970e087
|
golang.org/x/term v0.0.0-20220919170432-7a66f970e087
|
||||||
gotest.tools/v3 v3.3.0
|
gotest.tools/v3 v3.3.0
|
||||||
k8s.io/api v0.25.2
|
k8s.io/api v0.25.4
|
||||||
k8s.io/apiextensions-apiserver v0.25.2
|
k8s.io/apiextensions-apiserver v0.25.4
|
||||||
k8s.io/apimachinery v0.25.2
|
k8s.io/apimachinery v0.25.4
|
||||||
k8s.io/cli-runtime v0.25.2
|
k8s.io/cli-runtime v0.25.2
|
||||||
k8s.io/client-go v0.25.2
|
k8s.io/client-go v0.25.4
|
||||||
k8s.io/code-generator v0.25.2
|
k8s.io/code-generator v0.25.4
|
||||||
knative.dev/eventing v0.35.1-0.20221104013907-6de07e818049
|
knative.dev/eventing v0.35.1-0.20221118131140-41653ce64478
|
||||||
knative.dev/hack v0.0.0-20221104013908-8f3c7050408b
|
knative.dev/hack v0.0.0-20221122182941-c12c1bfbd6d2
|
||||||
knative.dev/networking v0.0.0-20221104155004-0d4e93709170
|
knative.dev/networking v0.0.0-20221123133043-c037e29a5cf4
|
||||||
knative.dev/pkg v0.0.0-20221104155204-389f811cea0a
|
knative.dev/pkg v0.0.0-20221123154742-05b694ec4d3a
|
||||||
knative.dev/serving v0.35.1-0.20221107125622-1b38451a92f2
|
knative.dev/serving v0.35.1-0.20221123150142-cd1cd1a61257
|
||||||
sigs.k8s.io/yaml v1.3.0
|
sigs.k8s.io/yaml v1.3.0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -126,10 +126,10 @@ require (
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
k8s.io/gengo v0.0.0-20220613173612-397b4ae3bce7 // indirect
|
k8s.io/gengo v0.0.0-20221011193443-fad74ee6edd9 // indirect
|
||||||
k8s.io/klog/v2 v2.70.2-0.20220707122935-0990e81f1a8f // indirect
|
k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 // indirect
|
||||||
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect
|
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect
|
||||||
k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed // indirect
|
k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 // indirect
|
||||||
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
|
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
|
||||||
sigs.k8s.io/kustomize/api v0.12.1 // indirect
|
sigs.k8s.io/kustomize/api v0.12.1 // indirect
|
||||||
sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect
|
sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect
|
||||||
|
|
|
||||||
57
go.sum
57
go.sum
|
|
@ -178,7 +178,6 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
|
||||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||||
github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
|
github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
|
||||||
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
|
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
|
||||||
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
|
||||||
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
||||||
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
||||||
|
|
@ -466,7 +465,6 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd
|
||||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
|
||||||
github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw=
|
github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw=
|
||||||
github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
|
github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
|
||||||
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
|
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
|
||||||
|
|
@ -527,7 +525,7 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
|
go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
|
||||||
go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
||||||
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
|
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||||
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
|
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
|
||||||
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
|
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
|
||||||
|
|
@ -1067,38 +1065,37 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
|
||||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
k8s.io/api v0.25.2 h1:v6G8RyFcwf0HR5jQGIAYlvtRNrxMJQG1xJzaSeVnIS8=
|
k8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs=
|
||||||
k8s.io/api v0.25.2/go.mod h1:qP1Rn4sCVFwx/xIhe+we2cwBLTXNcheRyYXwajonhy0=
|
k8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ=
|
||||||
k8s.io/apiextensions-apiserver v0.25.2 h1:8uOQX17RE7XL02ngtnh3TgifY7EhekpK+/piwzQNnBo=
|
k8s.io/apiextensions-apiserver v0.25.4 h1:7hu9pF+xikxQuQZ7/30z/qxIPZc2J1lFElPtr7f+B6U=
|
||||||
k8s.io/apiextensions-apiserver v0.25.2/go.mod h1:iRwwRDlWPfaHhuBfQ0WMa5skdQfrE18QXJaJvIDLvE8=
|
k8s.io/apiextensions-apiserver v0.25.4/go.mod h1:bkSGki5YBoZWdn5pWtNIdGvDrrsRWlmnvl9a+tAw5vQ=
|
||||||
k8s.io/apimachinery v0.25.2 h1:WbxfAjCx+AeN8Ilp9joWnyJ6xu9OMeS/fsfjK/5zaQs=
|
k8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc=
|
||||||
k8s.io/apimachinery v0.25.2/go.mod h1:hqqA1X0bsgsxI6dXsJ4HnNTBOmJNxyPp8dw3u2fSHwA=
|
k8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo=
|
||||||
k8s.io/cli-runtime v0.25.2 h1:XOx+SKRjBpYMLY/J292BHTkmyDffl/qOx3YSuFZkTuc=
|
k8s.io/cli-runtime v0.25.2 h1:XOx+SKRjBpYMLY/J292BHTkmyDffl/qOx3YSuFZkTuc=
|
||||||
k8s.io/cli-runtime v0.25.2/go.mod h1:OQx3+/0st6x5YpkkJQlEWLC73V0wHsOFMC1/roxV8Oc=
|
k8s.io/cli-runtime v0.25.2/go.mod h1:OQx3+/0st6x5YpkkJQlEWLC73V0wHsOFMC1/roxV8Oc=
|
||||||
k8s.io/client-go v0.25.2 h1:SUPp9p5CwM0yXGQrwYurw9LWz+YtMwhWd0GqOsSiefo=
|
k8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8=
|
||||||
k8s.io/client-go v0.25.2/go.mod h1:i7cNU7N+yGQmJkewcRD2+Vuj4iz7b30kI8OcL3horQ4=
|
k8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw=
|
||||||
k8s.io/code-generator v0.25.2 h1:qEHux0+E1c+j1MhsWn9+4Z6av8zrZBixOTPW064rSiY=
|
k8s.io/code-generator v0.25.4 h1:tjQ7/+9eN7UOiU2DP+0v4ntTI4JZLi2c1N0WllpFhTc=
|
||||||
k8s.io/code-generator v0.25.2/go.mod h1:f61OcU2VqVQcjt/6TrU0sta1TA5hHkOO6ZZPwkL9Eys=
|
k8s.io/code-generator v0.25.4/go.mod h1:9F5fuVZOMWRme7MYj2YT3L9ropPWPokd9VRhVyD3+0w=
|
||||||
k8s.io/gengo v0.0.0-20220613173612-397b4ae3bce7 h1:RGb68G3yotdQggcyenx9y0+lnVJCXXcLa6geXOMlf5o=
|
k8s.io/gengo v0.0.0-20221011193443-fad74ee6edd9 h1:iu3o/SxaHVI7tKPtkGzD3M9IzrE21j+CUKH98NQJ8Ms=
|
||||||
k8s.io/gengo v0.0.0-20220613173612-397b4ae3bce7/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
k8s.io/gengo v0.0.0-20221011193443-fad74ee6edd9/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||||
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
|
|
||||||
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
|
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
|
||||||
k8s.io/klog/v2 v2.70.2-0.20220707122935-0990e81f1a8f h1:dltw7bAn8bCrQ2CmzzhgoieUZEbWqrvIGVdHGioP5nY=
|
k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 h1:hWRbsoRWt44OEBnYUd4ceLy4ofBoh+p9vauWp/I5Gdg=
|
||||||
k8s.io/klog/v2 v2.70.2-0.20220707122935-0990e81f1a8f/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
||||||
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA=
|
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA=
|
||||||
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU=
|
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU=
|
||||||
k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed h1:jAne/RjBTyawwAy0utX5eqigAwz/lQhTmy+Hr/Cpue4=
|
k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 h1:GfD9OzL11kvZN5iArC6oTS7RTj7oJOIfnislxYlqTj8=
|
||||||
k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||||
knative.dev/eventing v0.35.1-0.20221104013907-6de07e818049 h1:JAbeKbn+3ZgD2PO+K3wZVJwcAlIkxFRCvKE+t9ui3Jo=
|
knative.dev/eventing v0.35.1-0.20221118131140-41653ce64478 h1:V9dz+2u28klK87h5fUxQT077beNofUEYByQ/QcMelv8=
|
||||||
knative.dev/eventing v0.35.1-0.20221104013907-6de07e818049/go.mod h1:MUVPi3EN46i+13b0azAsZ09oevqd21RZzZPmRpUwwNo=
|
knative.dev/eventing v0.35.1-0.20221118131140-41653ce64478/go.mod h1:E56YAT2bNLH6h6XBf7DpjRHxKpnl3NGnEMdz66L3YIc=
|
||||||
knative.dev/hack v0.0.0-20221104013908-8f3c7050408b h1:EqqlOqjCy/hVexdmPpUjcplO2eZc12+jTdTpodfLaI4=
|
knative.dev/hack v0.0.0-20221122182941-c12c1bfbd6d2 h1:/1qij7gQhnVLVH6hI8HqMBYUhMGurGcbqnHXwOKbWgs=
|
||||||
knative.dev/hack v0.0.0-20221104013908-8f3c7050408b/go.mod h1:yk2OjGDsbEnQjfxdm0/HJKS2WqTLEFg/N6nUs6Rqx3Q=
|
knative.dev/hack v0.0.0-20221122182941-c12c1bfbd6d2/go.mod h1:yk2OjGDsbEnQjfxdm0/HJKS2WqTLEFg/N6nUs6Rqx3Q=
|
||||||
knative.dev/networking v0.0.0-20221104155004-0d4e93709170 h1:/DP0jHUGFJcF20BH4waFLz/W/RBMH4f7wQpf12t0eDI=
|
knative.dev/networking v0.0.0-20221123133043-c037e29a5cf4 h1:U5sh7aUCCev1tHcWPHlniBQVYbCBRXya75DfwJvd/3c=
|
||||||
knative.dev/networking v0.0.0-20221104155004-0d4e93709170/go.mod h1:qwWlbknoGTz/NV+MKB7Hb2nMjwI5zfum3KLLSl2QUMc=
|
knative.dev/networking v0.0.0-20221123133043-c037e29a5cf4/go.mod h1:DCcDFXdCCa1md7kTbmW7FDqyCRdCThMqBv3CQ+JO7kY=
|
||||||
knative.dev/pkg v0.0.0-20221104155204-389f811cea0a h1:mb0PB0FFD4ep9T2pmOJ089Ie9aviuCRrTWX26Egpvrs=
|
knative.dev/pkg v0.0.0-20221123154742-05b694ec4d3a h1:mTDxXL+zRBMz7BcdM3WOgw9FVbmkIN/3cvEj4MeS8zI=
|
||||||
knative.dev/pkg v0.0.0-20221104155204-389f811cea0a/go.mod h1:JwNkOLWAeuMYlH9WQA83k+afGCanWcvWvdXZsI3xKo4=
|
knative.dev/pkg v0.0.0-20221123154742-05b694ec4d3a/go.mod h1:fckNBPf9bu5/p1RbnOhEauX7r+kfN1zSQupEVtkaYBs=
|
||||||
knative.dev/serving v0.35.1-0.20221107125622-1b38451a92f2 h1:CY8DQUaej+EKqypQlQQoL56/4sImB+sMtRLvntpEExU=
|
knative.dev/serving v0.35.1-0.20221123150142-cd1cd1a61257 h1:aYk6Q035hrIq/Kw8eb9KHezixjWo8Bi/0ayZYorEStk=
|
||||||
knative.dev/serving v0.35.1-0.20221107125622-1b38451a92f2/go.mod h1:+fo5a6d4Aw68JT5b39fcibyq9pWX6adcUvdjYhxeE1o=
|
knative.dev/serving v0.35.1-0.20221123150142-cd1cd1a61257/go.mod h1:CrLD+Rg65djuCzkf+phhXRdqRde6siZJ6roZUTuiKRY=
|
||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,12 @@ func (m *MicroTime) ProtoMicroTime() *Timestamp {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return &Timestamp{}
|
return &Timestamp{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// truncate precision to microseconds to match JSON marshaling/unmarshaling
|
||||||
|
truncatedNanoseconds := time.Duration(m.Time.Nanosecond()).Truncate(time.Microsecond)
|
||||||
return &Timestamp{
|
return &Timestamp{
|
||||||
Seconds: m.Time.Unix(),
|
Seconds: m.Time.Unix(),
|
||||||
Nanos: int32(m.Time.Nanosecond()),
|
Nanos: int32(truncatedNanoseconds),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -51,7 +54,10 @@ func (m *MicroTime) Unmarshal(data []byte) error {
|
||||||
if err := p.Unmarshal(data); err != nil {
|
if err := p.Unmarshal(data); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
m.Time = time.Unix(p.Seconds, int64(p.Nanos)).Local()
|
|
||||||
|
// truncate precision to microseconds to match JSON marshaling/unmarshaling
|
||||||
|
truncatedNanoseconds := time.Duration(p.Nanos).Truncate(time.Microsecond)
|
||||||
|
m.Time = time.Unix(p.Seconds, int64(truncatedNanoseconds)).Local()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -173,19 +173,25 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
|
||||||
pkgNeedsGeneration := (ptagValue == tagValuePackage)
|
pkgNeedsGeneration := (ptagValue == tagValuePackage)
|
||||||
if !pkgNeedsGeneration {
|
if !pkgNeedsGeneration {
|
||||||
// If the pkg-scoped tag did not exist, scan all types for one that
|
// If the pkg-scoped tag did not exist, scan all types for one that
|
||||||
// explicitly wants generation.
|
// explicitly wants generation. Ensure all types that want generation
|
||||||
|
// can be copied.
|
||||||
|
var uncopyable []string
|
||||||
for _, t := range pkg.Types {
|
for _, t := range pkg.Types {
|
||||||
klog.V(5).Infof(" considering type %q", t.Name.String())
|
klog.V(5).Infof(" considering type %q", t.Name.String())
|
||||||
ttag := extractEnabledTypeTag(t)
|
ttag := extractEnabledTypeTag(t)
|
||||||
if ttag != nil && ttag.value == "true" {
|
if ttag != nil && ttag.value == "true" {
|
||||||
klog.V(5).Infof(" tag=true")
|
klog.V(5).Infof(" tag=true")
|
||||||
if !copyableType(t) {
|
if !copyableType(t) {
|
||||||
klog.Fatalf("Type %v requests deepcopy generation but is not copyable", t)
|
uncopyable = append(uncopyable, fmt.Sprintf("%v", t))
|
||||||
|
} else {
|
||||||
|
pkgNeedsGeneration = true
|
||||||
}
|
}
|
||||||
pkgNeedsGeneration = true
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if len(uncopyable) > 0 {
|
||||||
|
klog.Fatalf("Types requested deepcopy generation but are not copyable: %s",
|
||||||
|
strings.Join(uncopyable, ", "))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if pkgNeedsGeneration {
|
if pkgNeedsGeneration {
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
|
@ -497,6 +498,23 @@ func mustEnforceDefault(t *types.Type, depth int, omitEmpty bool) (interface{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var refRE = regexp.MustCompile(`^ref\((?P<reference>[^"]+)\)$`)
|
||||||
|
var refREIdentIndex = refRE.SubexpIndex("reference")
|
||||||
|
|
||||||
|
// parseAsRef looks for strings that match one of the following:
|
||||||
|
// - ref(Ident)
|
||||||
|
// - ref(pkgpath.Ident)
|
||||||
|
// If the input string matches either of these, it will return the (optional)
|
||||||
|
// pkgpath, the Ident, and true. Otherwise it will return empty strings and
|
||||||
|
// false.
|
||||||
|
func parseAsRef(s string) (string, bool) {
|
||||||
|
matches := refRE.FindStringSubmatch(s)
|
||||||
|
if len(matches) < refREIdentIndex || matches[refREIdentIndex] == "" {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
return matches[refREIdentIndex], true
|
||||||
|
}
|
||||||
|
|
||||||
func populateDefaultValue(node *callNode, t *types.Type, tags string, commentLines []string) *callNode {
|
func populateDefaultValue(node *callNode, t *types.Type, tags string, commentLines []string) *callNode {
|
||||||
defaultMap := extractDefaultTag(commentLines)
|
defaultMap := extractDefaultTag(commentLines)
|
||||||
var defaultString string
|
var defaultString string
|
||||||
|
|
@ -513,8 +531,12 @@ func populateDefaultValue(node *callNode, t *types.Type, tags string, commentLin
|
||||||
} else if len(defaultMap) == 0 {
|
} else if len(defaultMap) == 0 {
|
||||||
return node
|
return node
|
||||||
}
|
}
|
||||||
|
var symbolReference string
|
||||||
var defaultValue interface{}
|
var defaultValue interface{}
|
||||||
if err := json.Unmarshal([]byte(defaultString), &defaultValue); err != nil {
|
if id, ok := parseAsRef(defaultString); ok {
|
||||||
|
symbolReference = id
|
||||||
|
defaultString = ""
|
||||||
|
} else if err := json.Unmarshal([]byte(defaultString), &defaultValue); err != nil {
|
||||||
klog.Fatalf("Failed to unmarshal default: %v", err)
|
klog.Fatalf("Failed to unmarshal default: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -542,7 +564,8 @@ func populateDefaultValue(node *callNode, t *types.Type, tags string, commentLin
|
||||||
|
|
||||||
node.defaultIsPrimitive = t.IsPrimitive()
|
node.defaultIsPrimitive = t.IsPrimitive()
|
||||||
node.defaultType = t.String()
|
node.defaultType = t.String()
|
||||||
node.defaultValue = defaultString
|
node.defaultValue.InlineConstant = defaultString
|
||||||
|
node.defaultValue.SymbolReference = symbolReference
|
||||||
node.defaultDepth = depth
|
node.defaultDepth = depth
|
||||||
return node
|
return node
|
||||||
}
|
}
|
||||||
|
|
@ -668,6 +691,11 @@ const (
|
||||||
conversionPackagePath = "k8s.io/apimachinery/pkg/conversion"
|
conversionPackagePath = "k8s.io/apimachinery/pkg/conversion"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type symbolTracker interface {
|
||||||
|
namer.ImportTracker
|
||||||
|
AddSymbol(types.Name)
|
||||||
|
}
|
||||||
|
|
||||||
// genDefaulter produces a file with a autogenerated conversions.
|
// genDefaulter produces a file with a autogenerated conversions.
|
||||||
type genDefaulter struct {
|
type genDefaulter struct {
|
||||||
generator.DefaultGen
|
generator.DefaultGen
|
||||||
|
|
@ -676,7 +704,7 @@ type genDefaulter struct {
|
||||||
peerPackages []string
|
peerPackages []string
|
||||||
newDefaulters defaulterFuncMap
|
newDefaulters defaulterFuncMap
|
||||||
existingDefaulters defaulterFuncMap
|
existingDefaulters defaulterFuncMap
|
||||||
imports namer.ImportTracker
|
imports symbolTracker
|
||||||
typesForInit []*types.Type
|
typesForInit []*types.Type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -766,6 +794,24 @@ func (g *genDefaulter) GenerateType(c *generator.Context, t *types.Type, w io.Wr
|
||||||
}
|
}
|
||||||
i := 0
|
i := 0
|
||||||
callTree.VisitInOrder(func(ancestors []*callNode, current *callNode) {
|
callTree.VisitInOrder(func(ancestors []*callNode, current *callNode) {
|
||||||
|
if len(current.defaultValue.SymbolReference) > 0 {
|
||||||
|
// If the defaultValue was a reference to a symbol instead of a constant,
|
||||||
|
// make sure to add it to imports and resolve the name of the symbol
|
||||||
|
// before generating the defaults.
|
||||||
|
parsedName := types.ParseFullyQualifiedName(current.defaultValue.SymbolReference)
|
||||||
|
g.imports.AddSymbol(parsedName)
|
||||||
|
|
||||||
|
// Rewrite the fully qualified name using the local package name
|
||||||
|
// from the imports
|
||||||
|
localPackage := g.imports.LocalNameOf(parsedName.Package)
|
||||||
|
if len(localPackage) > 0 {
|
||||||
|
current.defaultValue.SymbolReference = localPackage + "." + parsedName.Name
|
||||||
|
} else {
|
||||||
|
current.defaultValue.SymbolReference = parsedName.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if len(current.call) == 0 {
|
if len(current.call) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -795,26 +841,26 @@ func (g *genDefaulter) generateDefaulter(inType *types.Type, callTree *callNode,
|
||||||
// how in Go code an access would be performed. For example, if a defaulting function exists on a container
|
// how in Go code an access would be performed. For example, if a defaulting function exists on a container
|
||||||
// lifecycle hook, to invoke that defaulter correctly would require this Go code:
|
// lifecycle hook, to invoke that defaulter correctly would require this Go code:
|
||||||
//
|
//
|
||||||
// for i := range pod.Spec.Containers {
|
// for i := range pod.Spec.Containers {
|
||||||
// o := &pod.Spec.Containers[i]
|
// o := &pod.Spec.Containers[i]
|
||||||
// if o.LifecycleHook != nil {
|
// if o.LifecycleHook != nil {
|
||||||
// SetDefaults_LifecycleHook(o.LifecycleHook)
|
// SetDefaults_LifecycleHook(o.LifecycleHook)
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// That would be represented by a call tree like:
|
// That would be represented by a call tree like:
|
||||||
//
|
//
|
||||||
// callNode
|
// callNode
|
||||||
// field: "Spec"
|
// field: "Spec"
|
||||||
// children:
|
// children:
|
||||||
// - field: "Containers"
|
// - field: "Containers"
|
||||||
// children:
|
// children:
|
||||||
// - index: true
|
// - index: true
|
||||||
// children:
|
// children:
|
||||||
// - field: "LifecycleHook"
|
// - field: "LifecycleHook"
|
||||||
// elem: true
|
// elem: true
|
||||||
// call:
|
// call:
|
||||||
// - SetDefaults_LifecycleHook
|
// - SetDefaults_LifecycleHook
|
||||||
//
|
//
|
||||||
// which we can traverse to build that Go struct (you must call the field Spec, then Containers, then range over
|
// which we can traverse to build that Go struct (you must call the field Spec, then Containers, then range over
|
||||||
// that field, then check whether the LifecycleHook field is nil, before calling SetDefaults_LifecycleHook on
|
// that field, then check whether the LifecycleHook field is nil, before calling SetDefaults_LifecycleHook on
|
||||||
|
|
@ -836,7 +882,7 @@ type callNode struct {
|
||||||
|
|
||||||
// defaultValue is the defaultValue of a callNode struct
|
// defaultValue is the defaultValue of a callNode struct
|
||||||
// Only primitive types and pointer types are eligible to have a default value
|
// Only primitive types and pointer types are eligible to have a default value
|
||||||
defaultValue string
|
defaultValue defaultValue
|
||||||
|
|
||||||
// defaultIsPrimitive is used to determine how to assign the default value.
|
// defaultIsPrimitive is used to determine how to assign the default value.
|
||||||
// Primitive types will be directly assigned while complex types will use JSON unmarshalling
|
// Primitive types will be directly assigned while complex types will use JSON unmarshalling
|
||||||
|
|
@ -862,6 +908,28 @@ type callNode struct {
|
||||||
defaultType string
|
defaultType string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type defaultValue struct {
|
||||||
|
// The value was written directly in the marker comment and
|
||||||
|
// has been parsed as JSON
|
||||||
|
InlineConstant string
|
||||||
|
// The name of the symbol relative to the parsed package path
|
||||||
|
// i.e. k8s.io/pkg.apis.v1.Foo if from another package or simply `Foo`
|
||||||
|
// if within the same package.
|
||||||
|
SymbolReference string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d defaultValue) IsEmpty() bool {
|
||||||
|
resolved := d.Resolved()
|
||||||
|
return resolved == ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d defaultValue) Resolved() string {
|
||||||
|
if len(d.InlineConstant) > 0 {
|
||||||
|
return d.InlineConstant
|
||||||
|
}
|
||||||
|
return d.SymbolReference
|
||||||
|
}
|
||||||
|
|
||||||
// CallNodeVisitorFunc is a function for visiting a call tree. ancestors is the list of all parents
|
// CallNodeVisitorFunc is a function for visiting a call tree. ancestors is the list of all parents
|
||||||
// of this node to the root of the tree - will be empty at the root.
|
// of this node to the root of the tree - will be empty at the root.
|
||||||
type CallNodeVisitorFunc func(ancestors []*callNode, node *callNode)
|
type CallNodeVisitorFunc func(ancestors []*callNode, node *callNode)
|
||||||
|
|
@ -929,11 +997,11 @@ func getTypeZeroValue(t string) (interface{}, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *callNode) writeDefaulter(varName string, index string, isVarPointer bool, sw *generator.SnippetWriter) {
|
func (n *callNode) writeDefaulter(varName string, index string, isVarPointer bool, sw *generator.SnippetWriter) {
|
||||||
if n.defaultValue == "" {
|
if n.defaultValue.IsEmpty() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
args := generator.Args{
|
args := generator.Args{
|
||||||
"defaultValue": n.defaultValue,
|
"defaultValue": n.defaultValue.Resolved(),
|
||||||
"varName": varName,
|
"varName": varName,
|
||||||
"index": index,
|
"index": index,
|
||||||
"varDepth": n.defaultDepth,
|
"varDepth": n.defaultDepth,
|
||||||
|
|
@ -1046,7 +1114,7 @@ func (n *callNode) WriteMethod(varName string, depth int, ancestors []*callNode,
|
||||||
}
|
}
|
||||||
sw.Do("}\n", nil)
|
sw.Do("}\n", nil)
|
||||||
case n.key:
|
case n.key:
|
||||||
if n.defaultValue != "" {
|
if !n.defaultValue.IsEmpty() {
|
||||||
// Map keys are typed and cannot share the same index variable as arrays and other maps
|
// Map keys are typed and cannot share the same index variable as arrays and other maps
|
||||||
index = index + "_" + ancestors[len(ancestors)-1].field
|
index = index + "_" + ancestors[len(ancestors)-1].field
|
||||||
vars["index"] = index
|
vars["index"] = index
|
||||||
|
|
|
||||||
|
|
@ -255,15 +255,15 @@ func (s $.type|public$) Clone() $.type|public$ {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Difference returns a set of objects that are not in s2
|
// Difference returns a set of objects that are not in s2.
|
||||||
// For example:
|
// For example:
|
||||||
// s1 = {a1, a2, a3}
|
// s1 = {a1, a2, a3}
|
||||||
// s2 = {a1, a2, a4, a5}
|
// s2 = {a1, a2, a4, a5}
|
||||||
// s1.Difference(s2) = {a3}
|
// s1.Difference(s2) = {a3}
|
||||||
// s2.Difference(s1) = {a4, a5}
|
// s2.Difference(s1) = {a4, a5}
|
||||||
func (s $.type|public$) Difference(s2 $.type|public$) $.type|public$ {
|
func (s1 $.type|public$) Difference(s2 $.type|public$) $.type|public$ {
|
||||||
result := New$.type|public$()
|
result := New$.type|public$()
|
||||||
for key := range s {
|
for key := range s1 {
|
||||||
if !s2.Has(key) {
|
if !s2.Has(key) {
|
||||||
result.Insert(key)
|
result.Insert(key)
|
||||||
}
|
}
|
||||||
|
|
@ -271,6 +271,16 @@ func (s $.type|public$) Difference(s2 $.type|public$) $.type|public$ {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SymmetricDifference returns a set of elements which are in either of the sets, but not in their intersection.
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2, a3}
|
||||||
|
// s2 = {a1, a2, a4, a5}
|
||||||
|
// s1.SymmetricDifference(s2) = {a3, a4, a5}
|
||||||
|
// s2.SymmetricDifference(s1) = {a3, a4, a5}
|
||||||
|
func (s1 $.type|public$) SymmetricDifference(s2 $.type|public$) $.type|public$ {
|
||||||
|
return s1.Difference(s2).Union(s2.Difference(s1))
|
||||||
|
}
|
||||||
|
|
||||||
// Union returns a new set which includes items in either s1 or s2.
|
// Union returns a new set which includes items in either s1 or s2.
|
||||||
// For example:
|
// For example:
|
||||||
// s1 = {a1, a2}
|
// s1 = {a1, a2}
|
||||||
|
|
|
||||||
|
|
@ -96,15 +96,15 @@ func (s Byte) Clone() Byte {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Difference returns a set of objects that are not in s2
|
// Difference returns a set of objects that are not in s2.
|
||||||
// For example:
|
// For example:
|
||||||
// s1 = {a1, a2, a3}
|
// s1 = {a1, a2, a3}
|
||||||
// s2 = {a1, a2, a4, a5}
|
// s2 = {a1, a2, a4, a5}
|
||||||
// s1.Difference(s2) = {a3}
|
// s1.Difference(s2) = {a3}
|
||||||
// s2.Difference(s1) = {a4, a5}
|
// s2.Difference(s1) = {a4, a5}
|
||||||
func (s Byte) Difference(s2 Byte) Byte {
|
func (s1 Byte) Difference(s2 Byte) Byte {
|
||||||
result := NewByte()
|
result := NewByte()
|
||||||
for key := range s {
|
for key := range s1 {
|
||||||
if !s2.Has(key) {
|
if !s2.Has(key) {
|
||||||
result.Insert(key)
|
result.Insert(key)
|
||||||
}
|
}
|
||||||
|
|
@ -112,6 +112,16 @@ func (s Byte) Difference(s2 Byte) Byte {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SymmetricDifference returns a set of elements which are in either of the sets, but not in their intersection.
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2, a3}
|
||||||
|
// s2 = {a1, a2, a4, a5}
|
||||||
|
// s1.SymmetricDifference(s2) = {a3, a4, a5}
|
||||||
|
// s2.SymmetricDifference(s1) = {a3, a4, a5}
|
||||||
|
func (s1 Byte) SymmetricDifference(s2 Byte) Byte {
|
||||||
|
return s1.Difference(s2).Union(s2.Difference(s1))
|
||||||
|
}
|
||||||
|
|
||||||
// Union returns a new set which includes items in either s1 or s2.
|
// Union returns a new set which includes items in either s1 or s2.
|
||||||
// For example:
|
// For example:
|
||||||
// s1 = {a1, a2}
|
// s1 = {a1, a2}
|
||||||
|
|
|
||||||
|
|
@ -96,15 +96,15 @@ func (s Int) Clone() Int {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Difference returns a set of objects that are not in s2
|
// Difference returns a set of objects that are not in s2.
|
||||||
// For example:
|
// For example:
|
||||||
// s1 = {a1, a2, a3}
|
// s1 = {a1, a2, a3}
|
||||||
// s2 = {a1, a2, a4, a5}
|
// s2 = {a1, a2, a4, a5}
|
||||||
// s1.Difference(s2) = {a3}
|
// s1.Difference(s2) = {a3}
|
||||||
// s2.Difference(s1) = {a4, a5}
|
// s2.Difference(s1) = {a4, a5}
|
||||||
func (s Int) Difference(s2 Int) Int {
|
func (s1 Int) Difference(s2 Int) Int {
|
||||||
result := NewInt()
|
result := NewInt()
|
||||||
for key := range s {
|
for key := range s1 {
|
||||||
if !s2.Has(key) {
|
if !s2.Has(key) {
|
||||||
result.Insert(key)
|
result.Insert(key)
|
||||||
}
|
}
|
||||||
|
|
@ -112,6 +112,16 @@ func (s Int) Difference(s2 Int) Int {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SymmetricDifference returns a set of elements which are in either of the sets, but not in their intersection.
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2, a3}
|
||||||
|
// s2 = {a1, a2, a4, a5}
|
||||||
|
// s1.SymmetricDifference(s2) = {a3, a4, a5}
|
||||||
|
// s2.SymmetricDifference(s1) = {a3, a4, a5}
|
||||||
|
func (s1 Int) SymmetricDifference(s2 Int) Int {
|
||||||
|
return s1.Difference(s2).Union(s2.Difference(s1))
|
||||||
|
}
|
||||||
|
|
||||||
// Union returns a new set which includes items in either s1 or s2.
|
// Union returns a new set which includes items in either s1 or s2.
|
||||||
// For example:
|
// For example:
|
||||||
// s1 = {a1, a2}
|
// s1 = {a1, a2}
|
||||||
|
|
|
||||||
|
|
@ -96,15 +96,15 @@ func (s Int64) Clone() Int64 {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Difference returns a set of objects that are not in s2
|
// Difference returns a set of objects that are not in s2.
|
||||||
// For example:
|
// For example:
|
||||||
// s1 = {a1, a2, a3}
|
// s1 = {a1, a2, a3}
|
||||||
// s2 = {a1, a2, a4, a5}
|
// s2 = {a1, a2, a4, a5}
|
||||||
// s1.Difference(s2) = {a3}
|
// s1.Difference(s2) = {a3}
|
||||||
// s2.Difference(s1) = {a4, a5}
|
// s2.Difference(s1) = {a4, a5}
|
||||||
func (s Int64) Difference(s2 Int64) Int64 {
|
func (s1 Int64) Difference(s2 Int64) Int64 {
|
||||||
result := NewInt64()
|
result := NewInt64()
|
||||||
for key := range s {
|
for key := range s1 {
|
||||||
if !s2.Has(key) {
|
if !s2.Has(key) {
|
||||||
result.Insert(key)
|
result.Insert(key)
|
||||||
}
|
}
|
||||||
|
|
@ -112,6 +112,16 @@ func (s Int64) Difference(s2 Int64) Int64 {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SymmetricDifference returns a set of elements which are in either of the sets, but not in their intersection.
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2, a3}
|
||||||
|
// s2 = {a1, a2, a4, a5}
|
||||||
|
// s1.SymmetricDifference(s2) = {a3, a4, a5}
|
||||||
|
// s2.SymmetricDifference(s1) = {a3, a4, a5}
|
||||||
|
func (s1 Int64) SymmetricDifference(s2 Int64) Int64 {
|
||||||
|
return s1.Difference(s2).Union(s2.Difference(s1))
|
||||||
|
}
|
||||||
|
|
||||||
// Union returns a new set which includes items in either s1 or s2.
|
// Union returns a new set which includes items in either s1 or s2.
|
||||||
// For example:
|
// For example:
|
||||||
// s1 = {a1, a2}
|
// s1 = {a1, a2}
|
||||||
|
|
|
||||||
|
|
@ -96,15 +96,15 @@ func (s String) Clone() String {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Difference returns a set of objects that are not in s2
|
// Difference returns a set of objects that are not in s2.
|
||||||
// For example:
|
// For example:
|
||||||
// s1 = {a1, a2, a3}
|
// s1 = {a1, a2, a3}
|
||||||
// s2 = {a1, a2, a4, a5}
|
// s2 = {a1, a2, a4, a5}
|
||||||
// s1.Difference(s2) = {a3}
|
// s1.Difference(s2) = {a3}
|
||||||
// s2.Difference(s1) = {a4, a5}
|
// s2.Difference(s1) = {a4, a5}
|
||||||
func (s String) Difference(s2 String) String {
|
func (s1 String) Difference(s2 String) String {
|
||||||
result := NewString()
|
result := NewString()
|
||||||
for key := range s {
|
for key := range s1 {
|
||||||
if !s2.Has(key) {
|
if !s2.Has(key) {
|
||||||
result.Insert(key)
|
result.Insert(key)
|
||||||
}
|
}
|
||||||
|
|
@ -112,6 +112,16 @@ func (s String) Difference(s2 String) String {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SymmetricDifference returns a set of elements which are in either of the sets, but not in their intersection.
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2, a3}
|
||||||
|
// s2 = {a1, a2, a4, a5}
|
||||||
|
// s1.SymmetricDifference(s2) = {a3, a4, a5}
|
||||||
|
// s2.SymmetricDifference(s1) = {a3, a4, a5}
|
||||||
|
func (s1 String) SymmetricDifference(s2 String) String {
|
||||||
|
return s1.Difference(s2).Union(s2.Difference(s1))
|
||||||
|
}
|
||||||
|
|
||||||
// Union returns a new set which includes items in either s1 or s2.
|
// Union returns a new set which includes items in either s1 or s2.
|
||||||
// For example:
|
// For example:
|
||||||
// s1 = {a1, a2}
|
// s1 = {a1, a2}
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ import (
|
||||||
"k8s.io/gengo/types"
|
"k8s.io/gengo/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewImportTracker(typesToAdd ...*types.Type) namer.ImportTracker {
|
func NewImportTracker(typesToAdd ...*types.Type) *namer.DefaultImportTracker {
|
||||||
tracker := namer.NewDefaultImportTracker(types.Name{})
|
tracker := namer.NewDefaultImportTracker(types.Name{})
|
||||||
tracker.IsInvalidType = func(*types.Type) bool { return false }
|
tracker.IsInvalidType = func(*types.Type) bool { return false }
|
||||||
tracker.LocalName = func(name types.Name) string { return golangTrackerLocalName(&tracker, name) }
|
tracker.LocalName = func(name types.Name) string { return golangTrackerLocalName(&tracker, name) }
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,27 @@ func (tracker *DefaultImportTracker) AddTypes(types ...*types.Type) {
|
||||||
tracker.AddType(t)
|
tracker.AddType(t)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func (tracker *DefaultImportTracker) AddSymbol(symbol types.Name) {
|
||||||
|
if tracker.local.Package == symbol.Package {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(symbol.Package) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
path := symbol.Path
|
||||||
|
if len(path) == 0 {
|
||||||
|
path = symbol.Package
|
||||||
|
}
|
||||||
|
if _, ok := tracker.pathToName[path]; ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
name := tracker.LocalName(symbol)
|
||||||
|
tracker.nameToPath[name] = path
|
||||||
|
tracker.pathToName[path] = name
|
||||||
|
}
|
||||||
|
|
||||||
func (tracker *DefaultImportTracker) AddType(t *types.Type) {
|
func (tracker *DefaultImportTracker) AddType(t *types.Type) {
|
||||||
if tracker.local.Package == t.Name.Package {
|
if tracker.local.Package == t.Name.Package {
|
||||||
return
|
return
|
||||||
|
|
@ -70,19 +91,7 @@ func (tracker *DefaultImportTracker) AddType(t *types.Type) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(t.Name.Package) == 0 {
|
tracker.AddSymbol(t.Name)
|
||||||
return
|
|
||||||
}
|
|
||||||
path := t.Name.Path
|
|
||||||
if len(path) == 0 {
|
|
||||||
path = t.Name.Package
|
|
||||||
}
|
|
||||||
if _, ok := tracker.pathToName[path]; ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
name := tracker.LocalName(t.Name)
|
|
||||||
tracker.nameToPath[name] = path
|
|
||||||
tracker.pathToName[path] = name
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tracker *DefaultImportTracker) ImportLines() []string {
|
func (tracker *DefaultImportTracker) ImportLines() []string {
|
||||||
|
|
|
||||||
|
|
@ -47,8 +47,9 @@ var (
|
||||||
// If set, all log lines will be suppressed from the regular output, and
|
// If set, all log lines will be suppressed from the regular output, and
|
||||||
// redirected to the logr implementation.
|
// redirected to the logr implementation.
|
||||||
// Use as:
|
// Use as:
|
||||||
// ...
|
//
|
||||||
// klog.SetLogger(zapr.NewLogger(zapLog))
|
// ...
|
||||||
|
// klog.SetLogger(zapr.NewLogger(zapLog))
|
||||||
//
|
//
|
||||||
// To remove a backing logr implemention, use ClearLogger. Setting an
|
// To remove a backing logr implemention, use ClearLogger. Setting an
|
||||||
// empty logger with SetLogger(logr.Logger{}) does not work.
|
// empty logger with SetLogger(logr.Logger{}) does not work.
|
||||||
|
|
|
||||||
|
|
@ -145,7 +145,7 @@ func KVListFormat(b *bytes.Buffer, keysAndValues ...interface{}) {
|
||||||
case string:
|
case string:
|
||||||
writeStringValue(b, true, value)
|
writeStringValue(b, true, value)
|
||||||
default:
|
default:
|
||||||
writeStringValue(b, false, fmt.Sprintf("%+v", v))
|
writeStringValue(b, false, fmt.Sprintf("%+v", value))
|
||||||
}
|
}
|
||||||
case []byte:
|
case []byte:
|
||||||
// In https://github.com/kubernetes/klog/pull/237 it was decided
|
// In https://github.com/kubernetes/klog/pull/237 it was decided
|
||||||
|
|
|
||||||
|
|
@ -39,39 +39,38 @@
|
||||||
// This package provides several flags that modify this behavior.
|
// This package provides several flags that modify this behavior.
|
||||||
// As a result, flag.Parse must be called before any logging is done.
|
// As a result, flag.Parse must be called before any logging is done.
|
||||||
//
|
//
|
||||||
// -logtostderr=true
|
// -logtostderr=true
|
||||||
// Logs are written to standard error instead of to files.
|
// Logs are written to standard error instead of to files.
|
||||||
// This shortcuts most of the usual output routing:
|
// This shortcuts most of the usual output routing:
|
||||||
// -alsologtostderr, -stderrthreshold and -log_dir have no
|
// -alsologtostderr, -stderrthreshold and -log_dir have no
|
||||||
// effect and output redirection at runtime with SetOutput is
|
// effect and output redirection at runtime with SetOutput is
|
||||||
// ignored.
|
// ignored.
|
||||||
// -alsologtostderr=false
|
// -alsologtostderr=false
|
||||||
// Logs are written to standard error as well as to files.
|
// Logs are written to standard error as well as to files.
|
||||||
// -stderrthreshold=ERROR
|
// -stderrthreshold=ERROR
|
||||||
// Log events at or above this severity are logged to standard
|
// Log events at or above this severity are logged to standard
|
||||||
// error as well as to files.
|
// error as well as to files.
|
||||||
// -log_dir=""
|
// -log_dir=""
|
||||||
// Log files will be written to this directory instead of the
|
// Log files will be written to this directory instead of the
|
||||||
// default temporary directory.
|
// default temporary directory.
|
||||||
//
|
//
|
||||||
// Other flags provide aids to debugging.
|
// Other flags provide aids to debugging.
|
||||||
//
|
|
||||||
// -log_backtrace_at=""
|
|
||||||
// When set to a file and line number holding a logging statement,
|
|
||||||
// such as
|
|
||||||
// -log_backtrace_at=gopherflakes.go:234
|
|
||||||
// a stack trace will be written to the Info log whenever execution
|
|
||||||
// hits that statement. (Unlike with -vmodule, the ".go" must be
|
|
||||||
// present.)
|
|
||||||
// -v=0
|
|
||||||
// Enable V-leveled logging at the specified level.
|
|
||||||
// -vmodule=""
|
|
||||||
// The syntax of the argument is a comma-separated list of pattern=N,
|
|
||||||
// where pattern is a literal file name (minus the ".go" suffix) or
|
|
||||||
// "glob" pattern and N is a V level. For instance,
|
|
||||||
// -vmodule=gopher*=3
|
|
||||||
// sets the V level to 3 in all Go files whose names begin "gopher".
|
|
||||||
//
|
//
|
||||||
|
// -log_backtrace_at=""
|
||||||
|
// When set to a file and line number holding a logging statement,
|
||||||
|
// such as
|
||||||
|
// -log_backtrace_at=gopherflakes.go:234
|
||||||
|
// a stack trace will be written to the Info log whenever execution
|
||||||
|
// hits that statement. (Unlike with -vmodule, the ".go" must be
|
||||||
|
// present.)
|
||||||
|
// -v=0
|
||||||
|
// Enable V-leveled logging at the specified level.
|
||||||
|
// -vmodule=""
|
||||||
|
// The syntax of the argument is a comma-separated list of pattern=N,
|
||||||
|
// where pattern is a literal file name (minus the ".go" suffix) or
|
||||||
|
// "glob" pattern and N is a V level. For instance,
|
||||||
|
// -vmodule=gopher*=3
|
||||||
|
// sets the V level to 3 in all Go files whose names begin "gopher".
|
||||||
package klog
|
package klog
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
@ -397,45 +396,48 @@ type flushSyncWriter interface {
|
||||||
io.Writer
|
io.Writer
|
||||||
}
|
}
|
||||||
|
|
||||||
// init sets up the defaults.
|
var logging loggingT
|
||||||
|
var commandLine flag.FlagSet
|
||||||
|
|
||||||
|
// init sets up the defaults and creates command line flags.
|
||||||
func init() {
|
func init() {
|
||||||
|
commandLine.StringVar(&logging.logDir, "log_dir", "", "If non-empty, write log files in this directory (no effect when -logtostderr=true)")
|
||||||
|
commandLine.StringVar(&logging.logFile, "log_file", "", "If non-empty, use this log file (no effect when -logtostderr=true)")
|
||||||
|
commandLine.Uint64Var(&logging.logFileMaxSizeMB, "log_file_max_size", 1800,
|
||||||
|
"Defines the maximum size a log file can grow to (no effect when -logtostderr=true). Unit is megabytes. "+
|
||||||
|
"If the value is 0, the maximum file size is unlimited.")
|
||||||
|
commandLine.BoolVar(&logging.toStderr, "logtostderr", true, "log to standard error instead of files")
|
||||||
|
commandLine.BoolVar(&logging.alsoToStderr, "alsologtostderr", false, "log to standard error as well as files (no effect when -logtostderr=true)")
|
||||||
|
logging.setVState(0, nil, false)
|
||||||
|
commandLine.Var(&logging.verbosity, "v", "number for the log level verbosity")
|
||||||
|
commandLine.BoolVar(&logging.addDirHeader, "add_dir_header", false, "If true, adds the file directory to the header of the log messages")
|
||||||
|
commandLine.BoolVar(&logging.skipHeaders, "skip_headers", false, "If true, avoid header prefixes in the log messages")
|
||||||
|
commandLine.BoolVar(&logging.oneOutput, "one_output", false, "If true, only write logs to their native severity level (vs also writing to each lower severity level; no effect when -logtostderr=true)")
|
||||||
|
commandLine.BoolVar(&logging.skipLogHeaders, "skip_log_headers", false, "If true, avoid headers when opening log files (no effect when -logtostderr=true)")
|
||||||
logging.stderrThreshold = severityValue{
|
logging.stderrThreshold = severityValue{
|
||||||
Severity: severity.ErrorLog, // Default stderrThreshold is ERROR.
|
Severity: severity.ErrorLog, // Default stderrThreshold is ERROR.
|
||||||
}
|
}
|
||||||
logging.setVState(0, nil, false)
|
commandLine.Var(&logging.stderrThreshold, "stderrthreshold", "logs at or above this threshold go to stderr when writing to files and stderr (no effect when -logtostderr=true or -alsologtostderr=false)")
|
||||||
logging.logDir = ""
|
commandLine.Var(&logging.vmodule, "vmodule", "comma-separated list of pattern=N settings for file-filtered logging")
|
||||||
logging.logFile = ""
|
commandLine.Var(&logging.traceLocation, "log_backtrace_at", "when logging hits line file:N, emit a stack trace")
|
||||||
logging.logFileMaxSizeMB = 1800
|
|
||||||
logging.toStderr = true
|
logging.settings.contextualLoggingEnabled = true
|
||||||
logging.alsoToStderr = false
|
|
||||||
logging.skipHeaders = false
|
|
||||||
logging.addDirHeader = false
|
|
||||||
logging.skipLogHeaders = false
|
|
||||||
logging.oneOutput = false
|
|
||||||
logging.flushD = newFlushDaemon(logging.lockAndFlushAll, nil)
|
logging.flushD = newFlushDaemon(logging.lockAndFlushAll, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitFlags is for explicitly initializing the flags.
|
// InitFlags is for explicitly initializing the flags.
|
||||||
|
// It may get called repeatedly for different flagsets, but not
|
||||||
|
// twice for the same one. May get called concurrently
|
||||||
|
// to other goroutines using klog. However, only some flags
|
||||||
|
// may get set concurrently (see implementation).
|
||||||
func InitFlags(flagset *flag.FlagSet) {
|
func InitFlags(flagset *flag.FlagSet) {
|
||||||
if flagset == nil {
|
if flagset == nil {
|
||||||
flagset = flag.CommandLine
|
flagset = flag.CommandLine
|
||||||
}
|
}
|
||||||
|
|
||||||
flagset.StringVar(&logging.logDir, "log_dir", logging.logDir, "If non-empty, write log files in this directory (no effect when -logtostderr=true)")
|
commandLine.VisitAll(func(f *flag.Flag) {
|
||||||
flagset.StringVar(&logging.logFile, "log_file", logging.logFile, "If non-empty, use this log file (no effect when -logtostderr=true)")
|
flagset.Var(f.Value, f.Name, f.Usage)
|
||||||
flagset.Uint64Var(&logging.logFileMaxSizeMB, "log_file_max_size", logging.logFileMaxSizeMB,
|
})
|
||||||
"Defines the maximum size a log file can grow to (no effect when -logtostderr=true). Unit is megabytes. "+
|
|
||||||
"If the value is 0, the maximum file size is unlimited.")
|
|
||||||
flagset.BoolVar(&logging.toStderr, "logtostderr", logging.toStderr, "log to standard error instead of files")
|
|
||||||
flagset.BoolVar(&logging.alsoToStderr, "alsologtostderr", logging.alsoToStderr, "log to standard error as well as files (no effect when -logtostderr=true)")
|
|
||||||
flagset.Var(&logging.verbosity, "v", "number for the log level verbosity")
|
|
||||||
flagset.BoolVar(&logging.addDirHeader, "add_dir_header", logging.addDirHeader, "If true, adds the file directory to the header of the log messages")
|
|
||||||
flagset.BoolVar(&logging.skipHeaders, "skip_headers", logging.skipHeaders, "If true, avoid header prefixes in the log messages")
|
|
||||||
flagset.BoolVar(&logging.oneOutput, "one_output", logging.oneOutput, "If true, only write logs to their native severity level (vs also writing to each lower severity level; no effect when -logtostderr=true)")
|
|
||||||
flagset.BoolVar(&logging.skipLogHeaders, "skip_log_headers", logging.skipLogHeaders, "If true, avoid headers when opening log files (no effect when -logtostderr=true)")
|
|
||||||
flagset.Var(&logging.stderrThreshold, "stderrthreshold", "logs at or above this threshold go to stderr when writing to files and stderr (no effect when -logtostderr=true or -alsologtostderr=false)")
|
|
||||||
flagset.Var(&logging.vmodule, "vmodule", "comma-separated list of pattern=N settings for file-filtered logging")
|
|
||||||
flagset.Var(&logging.traceLocation, "log_backtrace_at", "when logging hits line file:N, emit a stack trace")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flush flushes all pending log I/O.
|
// Flush flushes all pending log I/O.
|
||||||
|
|
@ -550,12 +552,6 @@ type loggingT struct {
|
||||||
vmap map[uintptr]Level
|
vmap map[uintptr]Level
|
||||||
}
|
}
|
||||||
|
|
||||||
var logging = loggingT{
|
|
||||||
settings: settings{
|
|
||||||
contextualLoggingEnabled: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// setVState sets a consistent state for V logging.
|
// setVState sets a consistent state for V logging.
|
||||||
// l.mu is held.
|
// l.mu is held.
|
||||||
func (l *loggingT) setVState(verbosity Level, filter []modulePat, setFilter bool) {
|
func (l *loggingT) setVState(verbosity Level, filter []modulePat, setFilter bool) {
|
||||||
|
|
@ -633,8 +629,11 @@ It returns a buffer containing the formatted header and the user's file and line
|
||||||
The depth specifies how many stack frames above lives the source line to be identified in the log message.
|
The depth specifies how many stack frames above lives the source line to be identified in the log message.
|
||||||
|
|
||||||
Log lines have this form:
|
Log lines have this form:
|
||||||
|
|
||||||
Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg...
|
Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg...
|
||||||
|
|
||||||
where the fields are defined as follows:
|
where the fields are defined as follows:
|
||||||
|
|
||||||
L A single character, representing the log level (eg 'I' for INFO)
|
L A single character, representing the log level (eg 'I' for INFO)
|
||||||
mm The month (zero padded; ie May is '05')
|
mm The month (zero padded; ie May is '05')
|
||||||
dd The day (zero padded)
|
dd The day (zero padded)
|
||||||
|
|
@ -1298,9 +1297,13 @@ func newVerbose(level Level, b bool) Verbose {
|
||||||
// The returned value is a struct of type Verbose, which implements Info, Infoln
|
// The returned value is a struct of type Verbose, which implements Info, Infoln
|
||||||
// and Infof. These methods will write to the Info log if called.
|
// and Infof. These methods will write to the Info log if called.
|
||||||
// Thus, one may write either
|
// Thus, one may write either
|
||||||
|
//
|
||||||
// if klog.V(2).Enabled() { klog.Info("log this") }
|
// if klog.V(2).Enabled() { klog.Info("log this") }
|
||||||
|
//
|
||||||
// or
|
// or
|
||||||
|
//
|
||||||
// klog.V(2).Info("log this")
|
// klog.V(2).Info("log this")
|
||||||
|
//
|
||||||
// The second form is shorter but the first is cheaper if logging is off because it does
|
// The second form is shorter but the first is cheaper if logging is off because it does
|
||||||
// not evaluate its arguments.
|
// not evaluate its arguments.
|
||||||
//
|
//
|
||||||
|
|
@ -1582,10 +1585,10 @@ func ErrorSDepth(depth int, err error, msg string, keysAndValues ...interface{})
|
||||||
//
|
//
|
||||||
// Callers who want more control over handling of fatal events may instead use a
|
// Callers who want more control over handling of fatal events may instead use a
|
||||||
// combination of different functions:
|
// combination of different functions:
|
||||||
// - some info or error logging function, optionally with a stack trace
|
// - some info or error logging function, optionally with a stack trace
|
||||||
// value generated by github.com/go-logr/lib/dbg.Backtrace
|
// value generated by github.com/go-logr/lib/dbg.Backtrace
|
||||||
// - Flush to flush pending log data
|
// - Flush to flush pending log data
|
||||||
// - panic, os.Exit or returning to the caller with an error
|
// - panic, os.Exit or returning to the caller with an error
|
||||||
//
|
//
|
||||||
// Arguments are handled in the manner of fmt.Print; a newline is appended if missing.
|
// Arguments are handled in the manner of fmt.Print; a newline is appended if missing.
|
||||||
func Fatal(args ...interface{}) {
|
func Fatal(args ...interface{}) {
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ type IPFamily string
|
||||||
// Constants for valid IPFamilys:
|
// Constants for valid IPFamilys:
|
||||||
const (
|
const (
|
||||||
IPv4 IPFamily = "4"
|
IPv4 IPFamily = "4"
|
||||||
IPv6 = "6"
|
IPv6 IPFamily = "6"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Protocol is a network protocol support by LocalPort.
|
// Protocol is a network protocol support by LocalPort.
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,7 @@ func Int(i int) *int {
|
||||||
}
|
}
|
||||||
|
|
||||||
// IntPtr is a function variable referring to Int.
|
// IntPtr is a function variable referring to Int.
|
||||||
|
//
|
||||||
// Deprecated: Use Int instead.
|
// Deprecated: Use Int instead.
|
||||||
var IntPtr = Int // for back-compat
|
var IntPtr = Int // for back-compat
|
||||||
|
|
||||||
|
|
@ -66,6 +67,7 @@ func IntDeref(ptr *int, def int) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
// IntPtrDerefOr is a function variable referring to IntDeref.
|
// IntPtrDerefOr is a function variable referring to IntDeref.
|
||||||
|
//
|
||||||
// Deprecated: Use IntDeref instead.
|
// Deprecated: Use IntDeref instead.
|
||||||
var IntPtrDerefOr = IntDeref // for back-compat
|
var IntPtrDerefOr = IntDeref // for back-compat
|
||||||
|
|
||||||
|
|
@ -75,6 +77,7 @@ func Int32(i int32) *int32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int32Ptr is a function variable referring to Int32.
|
// Int32Ptr is a function variable referring to Int32.
|
||||||
|
//
|
||||||
// Deprecated: Use Int32 instead.
|
// Deprecated: Use Int32 instead.
|
||||||
var Int32Ptr = Int32 // for back-compat
|
var Int32Ptr = Int32 // for back-compat
|
||||||
|
|
||||||
|
|
@ -88,6 +91,7 @@ func Int32Deref(ptr *int32, def int32) int32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int32PtrDerefOr is a function variable referring to Int32Deref.
|
// Int32PtrDerefOr is a function variable referring to Int32Deref.
|
||||||
|
//
|
||||||
// Deprecated: Use Int32Deref instead.
|
// Deprecated: Use Int32Deref instead.
|
||||||
var Int32PtrDerefOr = Int32Deref // for back-compat
|
var Int32PtrDerefOr = Int32Deref // for back-compat
|
||||||
|
|
||||||
|
|
@ -103,12 +107,73 @@ func Int32Equal(a, b *int32) bool {
|
||||||
return *a == *b
|
return *a == *b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Uint returns a pointer to an uint
|
||||||
|
func Uint(i uint) *uint {
|
||||||
|
return &i
|
||||||
|
}
|
||||||
|
|
||||||
|
// UintPtr is a function variable referring to Uint.
|
||||||
|
//
|
||||||
|
// Deprecated: Use Uint instead.
|
||||||
|
var UintPtr = Uint // for back-compat
|
||||||
|
|
||||||
|
// UintDeref dereferences the uint ptr and returns it if not nil, or else
|
||||||
|
// returns def.
|
||||||
|
func UintDeref(ptr *uint, def uint) uint {
|
||||||
|
if ptr != nil {
|
||||||
|
return *ptr
|
||||||
|
}
|
||||||
|
return def
|
||||||
|
}
|
||||||
|
|
||||||
|
// UintPtrDerefOr is a function variable referring to UintDeref.
|
||||||
|
//
|
||||||
|
// Deprecated: Use UintDeref instead.
|
||||||
|
var UintPtrDerefOr = UintDeref // for back-compat
|
||||||
|
|
||||||
|
// Uint32 returns a pointer to an uint32.
|
||||||
|
func Uint32(i uint32) *uint32 {
|
||||||
|
return &i
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint32Ptr is a function variable referring to Uint32.
|
||||||
|
//
|
||||||
|
// Deprecated: Use Uint32 instead.
|
||||||
|
var Uint32Ptr = Uint32 // for back-compat
|
||||||
|
|
||||||
|
// Uint32Deref dereferences the uint32 ptr and returns it if not nil, or else
|
||||||
|
// returns def.
|
||||||
|
func Uint32Deref(ptr *uint32, def uint32) uint32 {
|
||||||
|
if ptr != nil {
|
||||||
|
return *ptr
|
||||||
|
}
|
||||||
|
return def
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint32PtrDerefOr is a function variable referring to Uint32Deref.
|
||||||
|
//
|
||||||
|
// Deprecated: Use Uint32Deref instead.
|
||||||
|
var Uint32PtrDerefOr = Uint32Deref // for back-compat
|
||||||
|
|
||||||
|
// Uint32Equal returns true if both arguments are nil or both arguments
|
||||||
|
// dereference to the same value.
|
||||||
|
func Uint32Equal(a, b *uint32) bool {
|
||||||
|
if (a == nil) != (b == nil) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if a == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return *a == *b
|
||||||
|
}
|
||||||
|
|
||||||
// Int64 returns a pointer to an int64.
|
// Int64 returns a pointer to an int64.
|
||||||
func Int64(i int64) *int64 {
|
func Int64(i int64) *int64 {
|
||||||
return &i
|
return &i
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int64Ptr is a function variable referring to Int64.
|
// Int64Ptr is a function variable referring to Int64.
|
||||||
|
//
|
||||||
// Deprecated: Use Int64 instead.
|
// Deprecated: Use Int64 instead.
|
||||||
var Int64Ptr = Int64 // for back-compat
|
var Int64Ptr = Int64 // for back-compat
|
||||||
|
|
||||||
|
|
@ -122,6 +187,7 @@ func Int64Deref(ptr *int64, def int64) int64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int64PtrDerefOr is a function variable referring to Int64Deref.
|
// Int64PtrDerefOr is a function variable referring to Int64Deref.
|
||||||
|
//
|
||||||
// Deprecated: Use Int64Deref instead.
|
// Deprecated: Use Int64Deref instead.
|
||||||
var Int64PtrDerefOr = Int64Deref // for back-compat
|
var Int64PtrDerefOr = Int64Deref // for back-compat
|
||||||
|
|
||||||
|
|
@ -137,12 +203,49 @@ func Int64Equal(a, b *int64) bool {
|
||||||
return *a == *b
|
return *a == *b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Uint64 returns a pointer to an uint64.
|
||||||
|
func Uint64(i uint64) *uint64 {
|
||||||
|
return &i
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint64Ptr is a function variable referring to Uint64.
|
||||||
|
//
|
||||||
|
// Deprecated: Use Uint64 instead.
|
||||||
|
var Uint64Ptr = Uint64 // for back-compat
|
||||||
|
|
||||||
|
// Uint64Deref dereferences the uint64 ptr and returns it if not nil, or else
|
||||||
|
// returns def.
|
||||||
|
func Uint64Deref(ptr *uint64, def uint64) uint64 {
|
||||||
|
if ptr != nil {
|
||||||
|
return *ptr
|
||||||
|
}
|
||||||
|
return def
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uint64PtrDerefOr is a function variable referring to Uint64Deref.
|
||||||
|
//
|
||||||
|
// Deprecated: Use Uint64Deref instead.
|
||||||
|
var Uint64PtrDerefOr = Uint64Deref // for back-compat
|
||||||
|
|
||||||
|
// Uint64Equal returns true if both arguments are nil or both arguments
|
||||||
|
// dereference to the same value.
|
||||||
|
func Uint64Equal(a, b *uint64) bool {
|
||||||
|
if (a == nil) != (b == nil) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if a == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return *a == *b
|
||||||
|
}
|
||||||
|
|
||||||
// Bool returns a pointer to a bool.
|
// Bool returns a pointer to a bool.
|
||||||
func Bool(b bool) *bool {
|
func Bool(b bool) *bool {
|
||||||
return &b
|
return &b
|
||||||
}
|
}
|
||||||
|
|
||||||
// BoolPtr is a function variable referring to Bool.
|
// BoolPtr is a function variable referring to Bool.
|
||||||
|
//
|
||||||
// Deprecated: Use Bool instead.
|
// Deprecated: Use Bool instead.
|
||||||
var BoolPtr = Bool // for back-compat
|
var BoolPtr = Bool // for back-compat
|
||||||
|
|
||||||
|
|
@ -156,6 +259,7 @@ func BoolDeref(ptr *bool, def bool) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// BoolPtrDerefOr is a function variable referring to BoolDeref.
|
// BoolPtrDerefOr is a function variable referring to BoolDeref.
|
||||||
|
//
|
||||||
// Deprecated: Use BoolDeref instead.
|
// Deprecated: Use BoolDeref instead.
|
||||||
var BoolPtrDerefOr = BoolDeref // for back-compat
|
var BoolPtrDerefOr = BoolDeref // for back-compat
|
||||||
|
|
||||||
|
|
@ -177,6 +281,7 @@ func String(s string) *string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// StringPtr is a function variable referring to String.
|
// StringPtr is a function variable referring to String.
|
||||||
|
//
|
||||||
// Deprecated: Use String instead.
|
// Deprecated: Use String instead.
|
||||||
var StringPtr = String // for back-compat
|
var StringPtr = String // for back-compat
|
||||||
|
|
||||||
|
|
@ -190,6 +295,7 @@ func StringDeref(ptr *string, def string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// StringPtrDerefOr is a function variable referring to StringDeref.
|
// StringPtrDerefOr is a function variable referring to StringDeref.
|
||||||
|
//
|
||||||
// Deprecated: Use StringDeref instead.
|
// Deprecated: Use StringDeref instead.
|
||||||
var StringPtrDerefOr = StringDeref // for back-compat
|
var StringPtrDerefOr = StringDeref // for back-compat
|
||||||
|
|
||||||
|
|
@ -211,6 +317,7 @@ func Float32(i float32) *float32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Float32Ptr is a function variable referring to Float32.
|
// Float32Ptr is a function variable referring to Float32.
|
||||||
|
//
|
||||||
// Deprecated: Use Float32 instead.
|
// Deprecated: Use Float32 instead.
|
||||||
var Float32Ptr = Float32
|
var Float32Ptr = Float32
|
||||||
|
|
||||||
|
|
@ -224,6 +331,7 @@ func Float32Deref(ptr *float32, def float32) float32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Float32PtrDerefOr is a function variable referring to Float32Deref.
|
// Float32PtrDerefOr is a function variable referring to Float32Deref.
|
||||||
|
//
|
||||||
// Deprecated: Use Float32Deref instead.
|
// Deprecated: Use Float32Deref instead.
|
||||||
var Float32PtrDerefOr = Float32Deref // for back-compat
|
var Float32PtrDerefOr = Float32Deref // for back-compat
|
||||||
|
|
||||||
|
|
@ -245,6 +353,7 @@ func Float64(i float64) *float64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Float64Ptr is a function variable referring to Float64.
|
// Float64Ptr is a function variable referring to Float64.
|
||||||
|
//
|
||||||
// Deprecated: Use Float64 instead.
|
// Deprecated: Use Float64 instead.
|
||||||
var Float64Ptr = Float64
|
var Float64Ptr = Float64
|
||||||
|
|
||||||
|
|
@ -258,6 +367,7 @@ func Float64Deref(ptr *float64, def float64) float64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Float64PtrDerefOr is a function variable referring to Float64Deref.
|
// Float64PtrDerefOr is a function variable referring to Float64Deref.
|
||||||
|
//
|
||||||
// Deprecated: Use Float64Deref instead.
|
// Deprecated: Use Float64Deref instead.
|
||||||
var Float64PtrDerefOr = Float64Deref // for back-compat
|
var Float64PtrDerefOr = Float64Deref // for back-compat
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
|
|
@ -93,13 +94,16 @@ func (s traceStep) writeItem(b *bytes.Buffer, formatter string, startTime time.T
|
||||||
// Trace keeps track of a set of "steps" and allows us to log a specific
|
// Trace keeps track of a set of "steps" and allows us to log a specific
|
||||||
// step if it took longer than its share of the total allowed time
|
// step if it took longer than its share of the total allowed time
|
||||||
type Trace struct {
|
type Trace struct {
|
||||||
|
// constant fields
|
||||||
name string
|
name string
|
||||||
fields []Field
|
fields []Field
|
||||||
threshold *time.Duration
|
|
||||||
startTime time.Time
|
startTime time.Time
|
||||||
endTime *time.Time
|
|
||||||
traceItems []traceItem
|
|
||||||
parentTrace *Trace
|
parentTrace *Trace
|
||||||
|
// fields guarded by a lock
|
||||||
|
lock sync.RWMutex
|
||||||
|
threshold *time.Duration
|
||||||
|
endTime *time.Time
|
||||||
|
traceItems []traceItem
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Trace) time() time.Time {
|
func (t *Trace) time() time.Time {
|
||||||
|
|
@ -138,6 +142,8 @@ func New(name string, fields ...Field) *Trace {
|
||||||
// how long it took. The Fields add key value pairs to provide additional details about the trace
|
// how long it took. The Fields add key value pairs to provide additional details about the trace
|
||||||
// step.
|
// step.
|
||||||
func (t *Trace) Step(msg string, fields ...Field) {
|
func (t *Trace) Step(msg string, fields ...Field) {
|
||||||
|
t.lock.Lock()
|
||||||
|
defer t.lock.Unlock()
|
||||||
if t.traceItems == nil {
|
if t.traceItems == nil {
|
||||||
// traces almost always have less than 6 steps, do this to avoid more than a single allocation
|
// traces almost always have less than 6 steps, do this to avoid more than a single allocation
|
||||||
t.traceItems = make([]traceItem, 0, 6)
|
t.traceItems = make([]traceItem, 0, 6)
|
||||||
|
|
@ -153,7 +159,9 @@ func (t *Trace) Nest(msg string, fields ...Field) *Trace {
|
||||||
newTrace := New(msg, fields...)
|
newTrace := New(msg, fields...)
|
||||||
if t != nil {
|
if t != nil {
|
||||||
newTrace.parentTrace = t
|
newTrace.parentTrace = t
|
||||||
|
t.lock.Lock()
|
||||||
t.traceItems = append(t.traceItems, newTrace)
|
t.traceItems = append(t.traceItems, newTrace)
|
||||||
|
t.lock.Unlock()
|
||||||
}
|
}
|
||||||
return newTrace
|
return newTrace
|
||||||
}
|
}
|
||||||
|
|
@ -163,7 +171,9 @@ func (t *Trace) Nest(msg string, fields ...Field) *Trace {
|
||||||
// is logged.
|
// is logged.
|
||||||
func (t *Trace) Log() {
|
func (t *Trace) Log() {
|
||||||
endTime := time.Now()
|
endTime := time.Now()
|
||||||
|
t.lock.Lock()
|
||||||
t.endTime = &endTime
|
t.endTime = &endTime
|
||||||
|
t.lock.Unlock()
|
||||||
// an explicit logging request should dump all the steps out at the higher level
|
// an explicit logging request should dump all the steps out at the higher level
|
||||||
if t.parentTrace == nil { // We don't start logging until Log or LogIfLong is called on the root trace
|
if t.parentTrace == nil { // We don't start logging until Log or LogIfLong is called on the root trace
|
||||||
t.logTrace()
|
t.logTrace()
|
||||||
|
|
@ -178,13 +188,17 @@ func (t *Trace) Log() {
|
||||||
// If the Trace is nested it is not immediately logged. Instead, it is logged when the trace it
|
// If the Trace is nested it is not immediately logged. Instead, it is logged when the trace it
|
||||||
// is nested within is logged.
|
// is nested within is logged.
|
||||||
func (t *Trace) LogIfLong(threshold time.Duration) {
|
func (t *Trace) LogIfLong(threshold time.Duration) {
|
||||||
|
t.lock.Lock()
|
||||||
t.threshold = &threshold
|
t.threshold = &threshold
|
||||||
|
t.lock.Unlock()
|
||||||
t.Log()
|
t.Log()
|
||||||
}
|
}
|
||||||
|
|
||||||
// logTopLevelTraces finds all traces in a hierarchy of nested traces that should be logged but do not have any
|
// logTopLevelTraces finds all traces in a hierarchy of nested traces that should be logged but do not have any
|
||||||
// parents that will be logged, due to threshold limits, and logs them as top level traces.
|
// parents that will be logged, due to threshold limits, and logs them as top level traces.
|
||||||
func (t *Trace) logTrace() {
|
func (t *Trace) logTrace() {
|
||||||
|
t.lock.RLock()
|
||||||
|
defer t.lock.RUnlock()
|
||||||
if t.durationIsWithinThreshold() {
|
if t.durationIsWithinThreshold() {
|
||||||
var buffer bytes.Buffer
|
var buffer bytes.Buffer
|
||||||
traceNum := rand.Int31()
|
traceNum := rand.Int31()
|
||||||
|
|
@ -244,9 +258,13 @@ func (t *Trace) calculateStepThreshold() *time.Duration {
|
||||||
traceThreshold := *t.threshold
|
traceThreshold := *t.threshold
|
||||||
for _, s := range t.traceItems {
|
for _, s := range t.traceItems {
|
||||||
nestedTrace, ok := s.(*Trace)
|
nestedTrace, ok := s.(*Trace)
|
||||||
if ok && nestedTrace.threshold != nil {
|
if ok {
|
||||||
traceThreshold = traceThreshold - *nestedTrace.threshold
|
nestedTrace.lock.RLock()
|
||||||
lenTrace--
|
if nestedTrace.threshold != nil {
|
||||||
|
traceThreshold = traceThreshold - *nestedTrace.threshold
|
||||||
|
lenTrace--
|
||||||
|
}
|
||||||
|
nestedTrace.lock.RUnlock()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -177,7 +177,7 @@ type SubscriptionsAPIFilter struct {
|
||||||
|
|
||||||
// TriggerFilterAttributes is a map of context attribute names to values for
|
// TriggerFilterAttributes is a map of context attribute names to values for
|
||||||
// filtering by equality. Only exact matches will pass the filter. You can use
|
// filtering by equality. Only exact matches will pass the filter. You can use
|
||||||
// the value '' to indicate all strings match.
|
// the value ” to indicate all strings match.
|
||||||
type TriggerFilterAttributes map[string]string
|
type TriggerFilterAttributes map[string]string
|
||||||
|
|
||||||
// TriggerStatus represents the current state of a Trigger.
|
// TriggerStatus represents the current state of a Trigger.
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,5 @@ const (
|
||||||
DeliveryRetryAfter = "delivery-retryafter"
|
DeliveryRetryAfter = "delivery-retryafter"
|
||||||
DeliveryTimeout = "delivery-timeout"
|
DeliveryTimeout = "delivery-timeout"
|
||||||
KReferenceMapping = "kreference-mapping"
|
KReferenceMapping = "kreference-mapping"
|
||||||
StrictSubscriber = "strict-subscriber"
|
|
||||||
NewTriggerFilters = "new-trigger-filters"
|
NewTriggerFilters = "new-trigger-filters"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,6 @@ package v1
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"knative.dev/eventing/pkg/apis/feature"
|
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp/cmpopts"
|
"github.com/google/go-cmp/cmp/cmpopts"
|
||||||
"k8s.io/apimachinery/pkg/api/equality"
|
"k8s.io/apimachinery/pkg/api/equality"
|
||||||
"knative.dev/pkg/apis"
|
"knative.dev/pkg/apis"
|
||||||
|
|
@ -50,31 +48,18 @@ func (ss *SubscriptionSpec) Validate(ctx context.Context) *apis.FieldError {
|
||||||
errs = errs.Also(fe.ViaField("channel"))
|
errs = errs.Also(fe.ViaField("channel"))
|
||||||
}
|
}
|
||||||
|
|
||||||
missingSubscriber := isDestinationNilOrEmpty(ss.Subscriber)
|
// Check if we follow the spec and have a valid reference to a subscriber
|
||||||
missingReply := isDestinationNilOrEmpty(ss.Reply)
|
if isDestinationNilOrEmpty(ss.Subscriber) {
|
||||||
|
|
||||||
// Check if StrictSubscriber flag is enabled, if so we follow the spec and check for a valid reference to a subscriber
|
|
||||||
if missingSubscriber && feature.FromContext(ctx).IsEnabled(feature.StrictSubscriber) {
|
|
||||||
fe := apis.ErrMissingField("subscriber")
|
fe := apis.ErrMissingField("subscriber")
|
||||||
fe.Details = "the Subscription must reference a subscriber"
|
fe.Details = "the Subscription must reference a subscriber"
|
||||||
errs = errs.Also(fe)
|
errs = errs.Also(fe)
|
||||||
|
} else {
|
||||||
} else { // if the flag is not set, we use pre 0.26 behavior
|
|
||||||
if missingSubscriber && missingReply {
|
|
||||||
fe := apis.ErrMissingField("reply", "subscriber")
|
|
||||||
fe.Details = "the Subscription must reference at least one of (reply or a subscriber)"
|
|
||||||
errs = errs.Also(fe)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if !missingSubscriber {
|
|
||||||
if fe := ss.Subscriber.Validate(ctx); fe != nil {
|
if fe := ss.Subscriber.Validate(ctx); fe != nil {
|
||||||
errs = errs.Also(fe.ViaField("subscriber"))
|
errs = errs.Also(fe.ViaField("subscriber"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !missingReply {
|
if !isDestinationNilOrEmpty(ss.Reply) {
|
||||||
if fe := ss.Reply.Validate(ctx); fe != nil {
|
if fe := ss.Reply.Validate(ctx); fe != nil {
|
||||||
errs = errs.Also(fe.ViaField("reply"))
|
errs = errs.Also(fe.ViaField("reply"))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
@ -47,14 +47,14 @@ var localSchemeBuilder = runtime.SchemeBuilder{
|
||||||
// AddToScheme adds all types of this clientset into the given scheme. This allows composition
|
// AddToScheme adds all types of this clientset into the given scheme. This allows composition
|
||||||
// of clientsets, like in:
|
// of clientsets, like in:
|
||||||
//
|
//
|
||||||
// import (
|
// import (
|
||||||
// "k8s.io/client-go/kubernetes"
|
// "k8s.io/client-go/kubernetes"
|
||||||
// clientsetscheme "k8s.io/client-go/kubernetes/scheme"
|
// clientsetscheme "k8s.io/client-go/kubernetes/scheme"
|
||||||
// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
|
// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
|
||||||
// )
|
// )
|
||||||
//
|
//
|
||||||
// kclientset, _ := kubernetes.NewForConfig(c)
|
// kclientset, _ := kubernetes.NewForConfig(c)
|
||||||
// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
|
// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
|
||||||
//
|
//
|
||||||
// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
|
// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
|
||||||
// correctly.
|
// correctly.
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
|
||||||
|
|
@ -123,6 +123,10 @@ This is a helper script for Knative E2E test scripts. To use it:
|
||||||
when a test fails, and can dump extra information about the current state of
|
when a test fails, and can dump extra information about the current state of
|
||||||
the cluster (typically using `kubectl`).
|
the cluster (typically using `kubectl`).
|
||||||
|
|
||||||
|
1. [optional] Write the `on_success` function. It will be called when a test succeeds
|
||||||
|
|
||||||
|
1. [optional] Write the `on_failure` function. It will be called when a test fails
|
||||||
|
|
||||||
1. [optional] Write the `parse_flags()` function. It will be called whenever an
|
1. [optional] Write the `parse_flags()` function. It will be called whenever an
|
||||||
unrecognized flag is passed to the script, allowing you to define your own
|
unrecognized flag is passed to the script, allowing you to define your own
|
||||||
flags. The function must return 0 if the flag is unrecognized, or the number
|
flags. The function must return 0 if the flag is unrecognized, or the number
|
||||||
|
|
|
||||||
|
|
@ -21,13 +21,8 @@ source "$(dirname "${BASH_SOURCE[0]:-$0}")/infra-library.sh"
|
||||||
|
|
||||||
readonly TEST_RESULT_FILE=/tmp/${REPO_NAME}-e2e-result
|
readonly TEST_RESULT_FILE=/tmp/${REPO_NAME}-e2e-result
|
||||||
|
|
||||||
# Flag whether test is using a boskos GCP project
|
|
||||||
IS_BOSKOS=0
|
|
||||||
|
|
||||||
# Tear down the test resources.
|
# Tear down the test resources.
|
||||||
function teardown_test_resources() {
|
function teardown_test_resources() {
|
||||||
# On boskos, save time and don't teardown as the cluster will be destroyed anyway.
|
|
||||||
(( IS_BOSKOS )) && return
|
|
||||||
header "Tearing down test environment"
|
header "Tearing down test environment"
|
||||||
if function_exists test_teardown; then
|
if function_exists test_teardown; then
|
||||||
test_teardown
|
test_teardown
|
||||||
|
|
@ -89,10 +84,9 @@ function setup_test_cluster() {
|
||||||
kubectl config set-context "${k8s_cluster}" --namespace=default
|
kubectl config set-context "${k8s_cluster}" --namespace=default
|
||||||
|
|
||||||
echo "- Cluster is ${k8s_cluster}"
|
echo "- Cluster is ${k8s_cluster}"
|
||||||
echo "- Docker is ${KO_DOCKER_REPO}"
|
echo "- KO_DOCKER_REPO is ${KO_DOCKER_REPO}"
|
||||||
|
|
||||||
# Do not run teardowns if we explicitly want to skip them.
|
(( TEARDOWN )) && add_trap teardown_test_resources EXIT
|
||||||
(( ! SKIP_TEARDOWNS )) && add_trap teardown_test_resources EXIT
|
|
||||||
|
|
||||||
# Handle failures ourselves, so we can dump useful info.
|
# Handle failures ourselves, so we can dump useful info.
|
||||||
set +o errexit
|
set +o errexit
|
||||||
|
|
@ -111,7 +105,7 @@ function success() {
|
||||||
echo "**************************************"
|
echo "**************************************"
|
||||||
echo "*** E2E TESTS PASSED ***"
|
echo "*** E2E TESTS PASSED ***"
|
||||||
echo "**************************************"
|
echo "**************************************"
|
||||||
dump_metrics
|
function_exists on_success && on_success
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -122,13 +116,18 @@ function fail_test() {
|
||||||
if [[ "X${message:-}X" == "XX" ]]; then
|
if [[ "X${message:-}X" == "XX" ]]; then
|
||||||
message='test failed'
|
message='test failed'
|
||||||
fi
|
fi
|
||||||
add_trap "dump_cluster_state;dump_metrics" EXIT
|
function_exists on_failure && on_failure
|
||||||
|
(( ! SKIP_DUMP_ON_FAILURE )) && dump_cluster_state
|
||||||
abort "${message}"
|
abort "${message}"
|
||||||
}
|
}
|
||||||
|
|
||||||
SKIP_TEARDOWNS=0
|
# Since create_test_cluster invokes the test script
|
||||||
|
# recursively we don't want to override these on the second
|
||||||
|
# invocation
|
||||||
|
TEARDOWN=${TEARDOWN:-0}
|
||||||
|
CLOUD_PROVIDER=${CLOUD_PROVIDER:-"gke"}
|
||||||
|
SKIP_DUMP_ON_FAILURE=${SKIP_DUMP_ON_FAILURE:-0}
|
||||||
E2E_SCRIPT=""
|
E2E_SCRIPT=""
|
||||||
CLOUD_PROVIDER="gke"
|
|
||||||
|
|
||||||
# Parse flags and initialize the test cluster.
|
# Parse flags and initialize the test cluster.
|
||||||
function initialize() {
|
function initialize() {
|
||||||
|
|
@ -165,9 +164,10 @@ function initialize() {
|
||||||
# Try parsing flag as a standard one.
|
# Try parsing flag as a standard one.
|
||||||
case ${parameter} in
|
case ${parameter} in
|
||||||
--run-tests) run_tests=1 ;;
|
--run-tests) run_tests=1 ;;
|
||||||
--skip-teardowns) SKIP_TEARDOWNS=1 ;;
|
--teardown) TEARDOWN=1 ;;
|
||||||
--skip-istio-addon) echo "--skip-istio-addon is no longer supported"
|
--skip-teardowns) echo "--skip-teardowns is no longer supported - opt in with --teardown" ;;
|
||||||
;; # This flag is a noop
|
--skip-dump-on-failure) SKIP_DUMP_ON_FAILURE=1 ;;
|
||||||
|
--skip-istio-addon) echo "--skip-istio-addon is no longer supported" ;;
|
||||||
*)
|
*)
|
||||||
case ${parameter} in
|
case ${parameter} in
|
||||||
--cloud-provider) shift; CLOUD_PROVIDER="$1" ;;
|
--cloud-provider) shift; CLOUD_PROVIDER="$1" ;;
|
||||||
|
|
@ -177,14 +177,13 @@ function initialize() {
|
||||||
shift
|
shift
|
||||||
done
|
done
|
||||||
|
|
||||||
(( IS_PROW )) && [[ -z "${GCP_PROJECT_ID:-}" ]] && IS_BOSKOS=1
|
|
||||||
|
|
||||||
if [[ "${CLOUD_PROVIDER}" == "gke" ]]; then
|
if [[ "${CLOUD_PROVIDER}" == "gke" ]]; then
|
||||||
custom_flags+=("--addons=NodeLocalDNS")
|
custom_flags+=("--addons=NodeLocalDNS")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
readonly IS_BOSKOS
|
readonly SKIP_DUMP_ON_FAILURE
|
||||||
readonly SKIP_TEARDOWNS
|
readonly TEARDOWN
|
||||||
|
readonly CLOUD_PROVIDER
|
||||||
|
|
||||||
if (( ! run_tests )); then
|
if (( ! run_tests )); then
|
||||||
create_test_cluster "${CLOUD_PROVIDER}" custom_flags e2e_script_command
|
create_test_cluster "${CLOUD_PROVIDER}" custom_flags e2e_script_command
|
||||||
|
|
|
||||||
|
|
@ -133,6 +133,12 @@ function create_gke_test_cluster() {
|
||||||
if [[ "${ENABLE_PREEMPTIBLE_NODES:-}" == "true" ]]; then
|
if [[ "${ENABLE_PREEMPTIBLE_NODES:-}" == "true" ]]; then
|
||||||
extra_gcloud_flags="${extra_gcloud_flags} --preemptible"
|
extra_gcloud_flags="${extra_gcloud_flags} --preemptible"
|
||||||
fi
|
fi
|
||||||
|
if ! command -v kubetest2 >/dev/null; then
|
||||||
|
tmpbin="$(mktemp -d)"
|
||||||
|
echo "kubetest2 not found, installing in temp path: ${tmpbin}"
|
||||||
|
GOBIN="$tmpbin" go install sigs.k8s.io/kubetest2/...@latest
|
||||||
|
export PATH="${tmpbin}:${PATH}"
|
||||||
|
fi
|
||||||
run_kntest kubetest2 gke "${_custom_flags[@]}" \
|
run_kntest kubetest2 gke "${_custom_flags[@]}" \
|
||||||
--test-command="${_test_command[*]}" \
|
--test-command="${_test_command[*]}" \
|
||||||
--extra-gcloud-flags="${extra_gcloud_flags}"
|
--extra-gcloud-flags="${extra_gcloud_flags}"
|
||||||
|
|
|
||||||
|
|
@ -647,7 +647,7 @@ function add_trap {
|
||||||
local current_trap
|
local current_trap
|
||||||
current_trap="$(trap -p "$trap_signal" | cut -d\' -f2)"
|
current_trap="$(trap -p "$trap_signal" | cut -d\' -f2)"
|
||||||
local new_cmd="($cmd)"
|
local new_cmd="($cmd)"
|
||||||
[[ -n "${current_trap}" ]] && new_cmd="${current_trap};${new_cmd}"
|
[[ -n "${current_trap}" ]] && new_cmd="${new_cmd};${current_trap}"
|
||||||
trap -- "${new_cmd}" "$trap_signal"
|
trap -- "${new_cmd}" "$trap_signal"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ RELEASE_NOTES=""
|
||||||
RELEASE_BRANCH=""
|
RELEASE_BRANCH=""
|
||||||
RELEASE_GCS_BUCKET="knative-nightly/${REPO_NAME}"
|
RELEASE_GCS_BUCKET="knative-nightly/${REPO_NAME}"
|
||||||
RELEASE_DIR=""
|
RELEASE_DIR=""
|
||||||
KO_FLAGS="-P --platform=all --image-refs=imagerefs.txt"
|
KO_FLAGS="-P --platform=all"
|
||||||
VALIDATION_TESTS="./test/presubmit-tests.sh"
|
VALIDATION_TESTS="./test/presubmit-tests.sh"
|
||||||
ARTIFACTS_TO_PUBLISH=""
|
ARTIFACTS_TO_PUBLISH=""
|
||||||
FROM_NIGHTLY_RELEASE=""
|
FROM_NIGHTLY_RELEASE=""
|
||||||
|
|
@ -312,8 +312,22 @@ function build_from_source() {
|
||||||
sign_release || abort "error signing the release"
|
sign_release || abort "error signing the release"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function get_images_in_yamls() {
|
||||||
|
rm -rf imagerefs.txt
|
||||||
|
echo "Assembling a list of image refences to sign"
|
||||||
|
for file in $@; do
|
||||||
|
[[ "${file##*.}" != "yaml" ]] && continue
|
||||||
|
echo "Inspecting ${file}"
|
||||||
|
for image in $(grep -oh "\S*${KO_DOCKER_REPO}\S*" "${file}"); do
|
||||||
|
echo $image >> imagerefs.txt
|
||||||
|
done
|
||||||
|
done
|
||||||
|
sort -uo imagerefs.txt imagerefs.txt # Remove duplicate entries
|
||||||
|
}
|
||||||
|
|
||||||
# Build a release from source.
|
# Build a release from source.
|
||||||
function sign_release() {
|
function sign_release() {
|
||||||
|
get_images_in_yamls "${ARTIFACTS_TO_PUBLISH}"
|
||||||
if (( ! IS_PROW )); then # This function can't be run by devs on their laptops
|
if (( ! IS_PROW )); then # This function can't be run by devs on their laptops
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -159,7 +159,7 @@ function delete_dns_record() {
|
||||||
}
|
}
|
||||||
|
|
||||||
# Script entry point.
|
# Script entry point.
|
||||||
initialize "$@" --skip-istio-addon --min-nodes=4 --max-nodes=4 --enable-ha --cluster-version=1.23
|
initialize "$@" --skip-istio-addon --min-nodes=4 --max-nodes=4 --enable-ha --cluster-version=1.24
|
||||||
|
|
||||||
# Run the tests
|
# Run the tests
|
||||||
header "Running tests"
|
header "Running tests"
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@
|
||||||
source $(dirname $0)/e2e-common.sh
|
source $(dirname $0)/e2e-common.sh
|
||||||
|
|
||||||
# Script entry point.
|
# Script entry point.
|
||||||
initialize --skip-istio-addon --min-nodes=4 --max-nodes=4 --enable-ha --cluster-version=1.23 "$@"
|
initialize --skip-istio-addon --min-nodes=4 --max-nodes=4 --enable-ha --cluster-version=1.24 "$@"
|
||||||
|
|
||||||
# Run the tests
|
# Run the tests
|
||||||
header "Running tests"
|
header "Running tests"
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ function stage_test_resources() {
|
||||||
# Skip installing istio as an add-on.
|
# Skip installing istio as an add-on.
|
||||||
# Skip installing a pvc as it is not used in upgrade tests
|
# Skip installing a pvc as it is not used in upgrade tests
|
||||||
# Skip installing a resource quota as it is not used in upgrade tests
|
# Skip installing a resource quota as it is not used in upgrade tests
|
||||||
PVC=0 QUOTA=0 initialize "$@" --skip-istio-addon --min-nodes=4 --max-nodes=4 --cluster-version=1.23 \
|
PVC=0 QUOTA=0 initialize "$@" --skip-istio-addon --min-nodes=4 --max-nodes=4 --cluster-version=1.24 \
|
||||||
--install-latest-release
|
--install-latest-release
|
||||||
|
|
||||||
# TODO(#2656): Reduce the timeout after we get this test to consistently passing.
|
# TODO(#2656): Reduce the timeout after we get this test to consistently passing.
|
||||||
|
|
|
||||||
|
|
@ -584,7 +584,7 @@ gotest.tools/v3/internal/assert
|
||||||
gotest.tools/v3/internal/difflib
|
gotest.tools/v3/internal/difflib
|
||||||
gotest.tools/v3/internal/format
|
gotest.tools/v3/internal/format
|
||||||
gotest.tools/v3/internal/source
|
gotest.tools/v3/internal/source
|
||||||
# k8s.io/api v0.25.2
|
# k8s.io/api v0.25.4
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
k8s.io/api/admissionregistration/v1
|
k8s.io/api/admissionregistration/v1
|
||||||
k8s.io/api/admissionregistration/v1beta1
|
k8s.io/api/admissionregistration/v1beta1
|
||||||
|
|
@ -632,14 +632,14 @@ k8s.io/api/scheduling/v1beta1
|
||||||
k8s.io/api/storage/v1
|
k8s.io/api/storage/v1
|
||||||
k8s.io/api/storage/v1alpha1
|
k8s.io/api/storage/v1alpha1
|
||||||
k8s.io/api/storage/v1beta1
|
k8s.io/api/storage/v1beta1
|
||||||
# k8s.io/apiextensions-apiserver v0.25.2
|
# k8s.io/apiextensions-apiserver v0.25.4
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions
|
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions
|
||||||
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1
|
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1
|
||||||
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1
|
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1
|
||||||
k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme
|
k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme
|
||||||
k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1
|
k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1
|
||||||
# k8s.io/apimachinery v0.25.2
|
# k8s.io/apimachinery v0.25.4
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
k8s.io/apimachinery/pkg/api/equality
|
k8s.io/apimachinery/pkg/api/equality
|
||||||
k8s.io/apimachinery/pkg/api/errors
|
k8s.io/apimachinery/pkg/api/errors
|
||||||
|
|
@ -695,7 +695,7 @@ k8s.io/apimachinery/third_party/forked/golang/reflect
|
||||||
k8s.io/cli-runtime/pkg/genericclioptions
|
k8s.io/cli-runtime/pkg/genericclioptions
|
||||||
k8s.io/cli-runtime/pkg/printers
|
k8s.io/cli-runtime/pkg/printers
|
||||||
k8s.io/cli-runtime/pkg/resource
|
k8s.io/cli-runtime/pkg/resource
|
||||||
# k8s.io/client-go v0.25.2
|
# k8s.io/client-go v0.25.4
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
k8s.io/client-go/applyconfigurations/admissionregistration/v1
|
k8s.io/client-go/applyconfigurations/admissionregistration/v1
|
||||||
k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1
|
k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1
|
||||||
|
|
@ -833,7 +833,7 @@ k8s.io/client-go/util/jsonpath
|
||||||
k8s.io/client-go/util/keyutil
|
k8s.io/client-go/util/keyutil
|
||||||
k8s.io/client-go/util/retry
|
k8s.io/client-go/util/retry
|
||||||
k8s.io/client-go/util/workqueue
|
k8s.io/client-go/util/workqueue
|
||||||
# k8s.io/code-generator v0.25.2
|
# k8s.io/code-generator v0.25.4
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
k8s.io/code-generator
|
k8s.io/code-generator
|
||||||
k8s.io/code-generator/cmd/client-gen
|
k8s.io/code-generator/cmd/client-gen
|
||||||
|
|
@ -868,7 +868,7 @@ k8s.io/code-generator/cmd/set-gen
|
||||||
k8s.io/code-generator/pkg/namer
|
k8s.io/code-generator/pkg/namer
|
||||||
k8s.io/code-generator/pkg/util
|
k8s.io/code-generator/pkg/util
|
||||||
k8s.io/code-generator/third_party/forked/golang/reflect
|
k8s.io/code-generator/third_party/forked/golang/reflect
|
||||||
# k8s.io/gengo v0.0.0-20220613173612-397b4ae3bce7
|
# k8s.io/gengo v0.0.0-20221011193443-fad74ee6edd9
|
||||||
## explicit; go 1.13
|
## explicit; go 1.13
|
||||||
k8s.io/gengo/args
|
k8s.io/gengo/args
|
||||||
k8s.io/gengo/examples/deepcopy-gen/generators
|
k8s.io/gengo/examples/deepcopy-gen/generators
|
||||||
|
|
@ -880,7 +880,7 @@ k8s.io/gengo/generator
|
||||||
k8s.io/gengo/namer
|
k8s.io/gengo/namer
|
||||||
k8s.io/gengo/parser
|
k8s.io/gengo/parser
|
||||||
k8s.io/gengo/types
|
k8s.io/gengo/types
|
||||||
# k8s.io/klog/v2 v2.70.2-0.20220707122935-0990e81f1a8f
|
# k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54
|
||||||
## explicit; go 1.13
|
## explicit; go 1.13
|
||||||
k8s.io/klog/v2
|
k8s.io/klog/v2
|
||||||
k8s.io/klog/v2/internal/buffer
|
k8s.io/klog/v2/internal/buffer
|
||||||
|
|
@ -904,8 +904,8 @@ k8s.io/kube-openapi/pkg/spec3
|
||||||
k8s.io/kube-openapi/pkg/util/proto
|
k8s.io/kube-openapi/pkg/util/proto
|
||||||
k8s.io/kube-openapi/pkg/util/sets
|
k8s.io/kube-openapi/pkg/util/sets
|
||||||
k8s.io/kube-openapi/pkg/validation/spec
|
k8s.io/kube-openapi/pkg/validation/spec
|
||||||
# k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed
|
# k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2
|
||||||
## explicit; go 1.12
|
## explicit; go 1.18
|
||||||
k8s.io/utils/buffer
|
k8s.io/utils/buffer
|
||||||
k8s.io/utils/clock
|
k8s.io/utils/clock
|
||||||
k8s.io/utils/clock/testing
|
k8s.io/utils/clock/testing
|
||||||
|
|
@ -917,7 +917,7 @@ k8s.io/utils/net
|
||||||
k8s.io/utils/pointer
|
k8s.io/utils/pointer
|
||||||
k8s.io/utils/strings/slices
|
k8s.io/utils/strings/slices
|
||||||
k8s.io/utils/trace
|
k8s.io/utils/trace
|
||||||
# knative.dev/eventing v0.35.1-0.20221104013907-6de07e818049
|
# knative.dev/eventing v0.35.1-0.20221118131140-41653ce64478
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
knative.dev/eventing/pkg/apis/config
|
knative.dev/eventing/pkg/apis/config
|
||||||
knative.dev/eventing/pkg/apis/duck
|
knative.dev/eventing/pkg/apis/duck
|
||||||
|
|
@ -945,10 +945,10 @@ knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1
|
||||||
knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1/fake
|
knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1/fake
|
||||||
knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1beta2
|
knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1beta2
|
||||||
knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1beta2/fake
|
knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1beta2/fake
|
||||||
# knative.dev/hack v0.0.0-20221104013908-8f3c7050408b
|
# knative.dev/hack v0.0.0-20221122182941-c12c1bfbd6d2
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
knative.dev/hack
|
knative.dev/hack
|
||||||
# knative.dev/networking v0.0.0-20221104155004-0d4e93709170
|
# knative.dev/networking v0.0.0-20221123133043-c037e29a5cf4
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
knative.dev/networking/pkg
|
knative.dev/networking/pkg
|
||||||
knative.dev/networking/pkg/apis/networking
|
knative.dev/networking/pkg/apis/networking
|
||||||
|
|
@ -963,7 +963,7 @@ knative.dev/networking/pkg/http/probe
|
||||||
knative.dev/networking/pkg/http/proxy
|
knative.dev/networking/pkg/http/proxy
|
||||||
knative.dev/networking/pkg/http/stats
|
knative.dev/networking/pkg/http/stats
|
||||||
knative.dev/networking/pkg/k8s
|
knative.dev/networking/pkg/k8s
|
||||||
# knative.dev/pkg v0.0.0-20221104155204-389f811cea0a
|
# knative.dev/pkg v0.0.0-20221123154742-05b694ec4d3a
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
knative.dev/pkg/apis
|
knative.dev/pkg/apis
|
||||||
knative.dev/pkg/apis/duck
|
knative.dev/pkg/apis/duck
|
||||||
|
|
@ -1013,7 +1013,7 @@ knative.dev/pkg/tracing/config
|
||||||
knative.dev/pkg/tracing/propagation
|
knative.dev/pkg/tracing/propagation
|
||||||
knative.dev/pkg/tracing/propagation/tracecontextb3
|
knative.dev/pkg/tracing/propagation/tracecontextb3
|
||||||
knative.dev/pkg/tracker
|
knative.dev/pkg/tracker
|
||||||
# knative.dev/serving v0.35.1-0.20221107125622-1b38451a92f2
|
# knative.dev/serving v0.35.1-0.20221123150142-cd1cd1a61257
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
knative.dev/serving/pkg/apis/autoscaling
|
knative.dev/serving/pkg/apis/autoscaling
|
||||||
knative.dev/serving/pkg/apis/autoscaling/v1alpha1
|
knative.dev/serving/pkg/apis/autoscaling/v1alpha1
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue