summaryrefslogtreecommitdiff
path: root/vendor/k8s.io
diff options
context:
space:
mode:
authordependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>2020-12-09 09:17:32 +0000
committerDaniel J Walsh <dwalsh@redhat.com>2020-12-09 06:05:03 -0500
commit37fbf28d74927b959b36ceade7fde3402ea08e05 (patch)
treed053b6a2fd3e05946bbf71134d80efcb9a8a449c /vendor/k8s.io
parentdd295f297b6dd51d22c64c75f4ef4f80f953bbde (diff)
downloadpodman-37fbf28d74927b959b36ceade7fde3402ea08e05.tar.gz
podman-37fbf28d74927b959b36ceade7fde3402ea08e05.tar.bz2
podman-37fbf28d74927b959b36ceade7fde3402ea08e05.zip
Bump k8s.io/apimachinery from 0.19.4 to 0.20.0
Bumps [k8s.io/apimachinery](https://github.com/kubernetes/apimachinery) from 0.19.4 to 0.20.0. - [Release notes](https://github.com/kubernetes/apimachinery/releases) - [Commits](https://github.com/kubernetes/apimachinery/compare/v0.19.4...v0.20.0) Signed-off-by: dependabot-preview[bot] <support@dependabot.com> Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
Diffstat (limited to 'vendor/k8s.io')
-rw-r--r--vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto2
-rw-r--r--vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go36
-rw-r--r--vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS1
-rw-r--r--vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto3
-rw-r--r--vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version.go9
-rw-r--r--vendor/k8s.io/apimachinery/pkg/apis/meta/v1/helpers.go14
-rw-r--r--vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go15
-rw-r--r--vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time_fuzz.go39
-rw-r--r--vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time.go15
-rw-r--r--vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time_fuzz.go39
-rw-r--r--vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go1
-rw-r--r--vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go8
-rw-r--r--vendor/k8s.io/apimachinery/pkg/conversion/converter.go598
-rw-r--r--vendor/k8s.io/apimachinery/pkg/labels/labels.go19
-rw-r--r--vendor/k8s.io/apimachinery/pkg/labels/selector.go50
-rw-r--r--vendor/k8s.io/apimachinery/pkg/runtime/converter.go3
-rw-r--r--vendor/k8s.io/apimachinery/pkg/runtime/generated.proto2
-rw-r--r--vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go2
-rw-r--r--vendor/k8s.io/apimachinery/pkg/runtime/negotiate.go33
-rw-r--r--vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto2
-rw-r--r--vendor/k8s.io/apimachinery/pkg/runtime/schema/interfaces.go4
-rw-r--r--vendor/k8s.io/apimachinery/pkg/runtime/scheme.go30
-rw-r--r--vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go12
-rw-r--r--vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go23
-rw-r--r--vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go4
-rw-r--r--vendor/k8s.io/apimachinery/pkg/types/namespacedname.go6
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/clock/clock.go18
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/errors/errors.go2
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/framer/framer.go3
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go50
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go49
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade.go17
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto2
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/intstr/instr_fuzz.go42
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go70
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/json/json.go33
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/net/http.go51
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/net/port_range.go2
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go4
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go3
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/validation/validation.go6
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/yaml/decoder.go31
-rw-r--r--vendor/k8s.io/apimachinery/pkg/watch/mux.go65
-rw-r--r--vendor/k8s.io/apimachinery/pkg/watch/streamwatcher.go2
-rw-r--r--vendor/k8s.io/apimachinery/pkg/watch/watch.go2
-rw-r--r--vendor/k8s.io/klog/v2/README.md6
-rw-r--r--vendor/k8s.io/klog/v2/SECURITY.md22
-rw-r--r--vendor/k8s.io/klog/v2/klog.go177
48 files changed, 722 insertions, 905 deletions
diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto b/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto
index 18a6c7cd6..472104d54 100644
--- a/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto
+++ b/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto
@@ -17,7 +17,7 @@ limitations under the License.
// This file was autogenerated by go-to-protobuf. Do not edit it manually!
-syntax = 'proto2';
+syntax = "proto2";
package k8s.io.apimachinery.pkg.api.resource;
diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go
index d95e03aa9..8d718945d 100644
--- a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go
+++ b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go
@@ -20,6 +20,7 @@ import (
"bytes"
"errors"
"fmt"
+ "math"
"math/big"
"strconv"
"strings"
@@ -120,7 +121,7 @@ const (
)
// MustParse turns the given string into a quantity or panics; for tests
-// or others cases where you know the string is valid.
+// or other cases where you know the string is valid.
func MustParse(str string) Quantity {
q, err := ParseQuantity(str)
if err != nil {
@@ -442,6 +443,36 @@ func (q *Quantity) CanonicalizeBytes(out []byte) (result, suffix []byte) {
}
}
+// AsApproximateFloat64 returns a float64 representation of the quantity which may
+// lose precision. If the value of the quantity is outside the range of a float64
+// +Inf/-Inf will be returned.
+func (q *Quantity) AsApproximateFloat64() float64 {
+ var base float64
+ var exponent int
+ if q.d.Dec != nil {
+ base, _ = big.NewFloat(0).SetInt(q.d.Dec.UnscaledBig()).Float64()
+ exponent = int(-q.d.Dec.Scale())
+ } else {
+ base = float64(q.i.value)
+ exponent = int(q.i.scale)
+ }
+ if exponent == 0 {
+ return base
+ }
+
+ // multiply by the appropriate exponential scale
+ switch q.Format {
+ case DecimalExponent, DecimalSI:
+ return base * math.Pow10(exponent)
+ default:
+ // fast path for exponents that can fit in 64 bits
+ if exponent > 0 && exponent < 7 {
+ return base * float64(int64(1)<<(exponent*10))
+ }
+ return base * math.Pow(2, float64(exponent*10))
+ }
+}
+
// AsInt64 returns a representation of the current value as an int64 if a fast conversion
// is possible. If false is returned, callers must use the inf.Dec form of this quantity.
func (q *Quantity) AsInt64() (int64, bool) {
@@ -598,6 +629,9 @@ const int64QuantityExpectedBytes = 18
// String is an expensive operation and caching this result significantly reduces the cost of
// normal parse / marshal operations on Quantity.
func (q *Quantity) String() string {
+ if q == nil {
+ return "<nil>"
+ }
if len(q.s) == 0 {
result := make([]byte, 0, int64QuantityExpectedBytes)
number, suffix := q.CanonicalizeBytes(result)
diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS
index 15b4c875a..40018601c 100644
--- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS
+++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS
@@ -26,6 +26,5 @@ reviewers:
- mml
- mbohlool
- therc
-- mqliang
- kevin-wangzefeng
- jianhuiz
diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto
index b72d43ff0..fd24483c0 100644
--- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto
+++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto
@@ -17,7 +17,7 @@ limitations under the License.
// This file was autogenerated by go-to-protobuf. Do not edit it manually!
-syntax = 'proto2';
+syntax = "proto2";
package k8s.io.apimachinery.pkg.apis.meta.v1;
@@ -375,6 +375,7 @@ message GroupVersionResource {
// A label selector is a label query over a set of resources. The result of matchLabels and
// matchExpressions are ANDed. An empty label selector matches all objects. A null
// label selector matches no objects.
+// +structType=atomic
message LabelSelector {
// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
// map is equivalent to an element of matchExpressions, whose key field is "key", the
diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version.go
index bd4c6d9b5..54a0944af 100644
--- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version.go
+++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version.go
@@ -34,6 +34,9 @@ type GroupResource struct {
}
func (gr *GroupResource) String() string {
+ if gr == nil {
+ return "<nil>"
+ }
if len(gr.Group) == 0 {
return gr.Resource
}
@@ -51,6 +54,9 @@ type GroupVersionResource struct {
}
func (gvr *GroupVersionResource) String() string {
+ if gvr == nil {
+ return "<nil>"
+ }
return strings.Join([]string{gvr.Group, "/", gvr.Version, ", Resource=", gvr.Resource}, "")
}
@@ -64,6 +70,9 @@ type GroupKind struct {
}
func (gk *GroupKind) String() string {
+ if gk == nil {
+ return "<nil>"
+ }
if len(gk.Group) == 0 {
return gk.Kind
}
diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/helpers.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/helpers.go
index ad989ad75..3c5a1518c 100644
--- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/helpers.go
+++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/helpers.go
@@ -201,6 +201,20 @@ func SetMetaDataAnnotation(obj *ObjectMeta, ann string, value string) {
obj.Annotations[ann] = value
}
+// HasLabel returns a bool if passed in label exists
+func HasLabel(obj ObjectMeta, label string) bool {
+ _, found := obj.Labels[label]
+ return found
+}
+
+// SetMetaDataLabel sets the label and value
+func SetMetaDataLabel(obj *ObjectMeta, label string, value string) {
+ if obj.Labels == nil {
+ obj.Labels = make(map[string]string)
+ }
+ obj.Labels[label] = value
+}
+
// SingleObject returns a ListOptions for watching a single object.
func SingleObject(meta ObjectMeta) ListOptions {
return ListOptions{
diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go
index cdd9a6a7a..8eb37f436 100644
--- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go
+++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go
@@ -19,8 +19,6 @@ package v1
import (
"encoding/json"
"time"
-
- "github.com/google/gofuzz"
)
const RFC3339Micro = "2006-01-02T15:04:05.000000Z07:00"
@@ -181,16 +179,3 @@ func (t MicroTime) MarshalQueryParameter() (string, error) {
return t.UTC().Format(RFC3339Micro), nil
}
-
-// Fuzz satisfies fuzz.Interface.
-func (t *MicroTime) Fuzz(c fuzz.Continue) {
- if t == nil {
- return
- }
- // Allow for about 1000 years of randomness. Accurate to a tenth of
- // micro second. Leave off nanoseconds because JSON doesn't
- // represent them so they can't round-trip properly.
- t.Time = time.Unix(c.Rand.Int63n(1000*365*24*60*60), 1000*c.Rand.Int63n(1000000))
-}
-
-var _ fuzz.Interface = &MicroTime{}
diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time_fuzz.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time_fuzz.go
new file mode 100644
index 000000000..befab16f7
--- /dev/null
+++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time_fuzz.go
@@ -0,0 +1,39 @@
+// +build !notest
+
+/*
+Copyright 2020 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1
+
+import (
+ "time"
+
+ fuzz "github.com/google/gofuzz"
+)
+
+// Fuzz satisfies fuzz.Interface.
+func (t *MicroTime) Fuzz(c fuzz.Continue) {
+ if t == nil {
+ return
+ }
+ // Allow for about 1000 years of randomness. Accurate to a tenth of
+ // micro second. Leave off nanoseconds because JSON doesn't
+ // represent them so they can't round-trip properly.
+ t.Time = time.Unix(c.Rand.Int63n(1000*365*24*60*60), 1000*c.Rand.Int63n(1000000))
+}
+
+// ensure MicroTime implements fuzz.Interface
+var _ fuzz.Interface = &MicroTime{}
diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time.go
index 4a1d89cfc..421770d43 100644
--- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time.go
+++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time.go
@@ -19,8 +19,6 @@ package v1
import (
"encoding/json"
"time"
-
- fuzz "github.com/google/gofuzz"
)
// Time is a wrapper around time.Time which supports correct
@@ -182,16 +180,3 @@ func (t Time) MarshalQueryParameter() (string, error) {
return t.UTC().Format(time.RFC3339), nil
}
-
-// Fuzz satisfies fuzz.Interface.
-func (t *Time) Fuzz(c fuzz.Continue) {
- if t == nil {
- return
- }
- // Allow for about 1000 years of randomness. Leave off nanoseconds
- // because JSON doesn't represent them so they can't round-trip
- // properly.
- t.Time = time.Unix(c.Rand.Int63n(1000*365*24*60*60), 0)
-}
-
-var _ fuzz.Interface = &Time{}
diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time_fuzz.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time_fuzz.go
new file mode 100644
index 000000000..94ad8d7cf
--- /dev/null
+++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time_fuzz.go
@@ -0,0 +1,39 @@
+// +build !notest
+
+/*
+Copyright 2020 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1
+
+import (
+ "time"
+
+ fuzz "github.com/google/gofuzz"
+)
+
+// Fuzz satisfies fuzz.Interface.
+func (t *Time) Fuzz(c fuzz.Continue) {
+ if t == nil {
+ return
+ }
+ // Allow for about 1000 years of randomness. Leave off nanoseconds
+ // because JSON doesn't represent them so they can't round-trip
+ // properly.
+ t.Time = time.Unix(c.Rand.Int63n(1000*365*24*60*60), 0)
+}
+
+// ensure Time implements fuzz.Interface
+var _ fuzz.Interface = &Time{}
diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go
index bb57f2cc4..d84878d7c 100644
--- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go
+++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go
@@ -1092,6 +1092,7 @@ type Patch struct{}
// A label selector is a label query over a set of resources. The result of matchLabels and
// matchExpressions are ANDed. An empty label selector matches all objects. A null
// label selector matches no objects.
+// +structType=atomic
type LabelSelector struct {
// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
// map is equivalent to an element of matchExpressions, whose key field is "key", the
diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go
index 54a231e49..7b101ea51 100644
--- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go
+++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go
@@ -282,14 +282,6 @@ func getNestedString(obj map[string]interface{}, fields ...string) string {
return val
}
-func getNestedInt64(obj map[string]interface{}, fields ...string) int64 {
- val, found, err := NestedInt64(obj, fields...)
- if !found || err != nil {
- return 0
- }
- return val
-}
-
func getNestedInt64Pointer(obj map[string]interface{}, fields ...string) *int64 {
val, found, err := NestedInt64(obj, fields...)
if !found || err != nil {
diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/converter.go b/vendor/k8s.io/apimachinery/pkg/conversion/converter.go
index 838d5b0aa..791348476 100644
--- a/vendor/k8s.io/apimachinery/pkg/conversion/converter.go
+++ b/vendor/k8s.io/apimachinery/pkg/conversion/converter.go
@@ -26,16 +26,6 @@ type typePair struct {
dest reflect.Type
}
-type typeNamePair struct {
- fieldType reflect.Type
- fieldName string
-}
-
-// DebugLogger allows you to get debugging messages if necessary.
-type DebugLogger interface {
- Logf(format string, args ...interface{})
-}
-
type NameFunc func(t reflect.Type) string
var DefaultNameFunc = func(t reflect.Type) string { return t.Name() }
@@ -57,24 +47,6 @@ type Converter struct {
ignoredConversions map[typePair]struct{}
ignoredUntypedConversions map[typePair]struct{}
- // This is a map from a source field type and name, to a list of destination
- // field type and name.
- structFieldDests map[typeNamePair][]typeNamePair
-
- // Allows for the opposite lookup of structFieldDests. So that SourceFromDest
- // copy flag also works. So this is a map of destination field name, to potential
- // source field name and type to look for.
- structFieldSources map[typeNamePair][]typeNamePair
-
- // Map from an input type to a function which can apply a key name mapping
- inputFieldMappingFuncs map[reflect.Type]FieldMappingFunc
-
- // Map from an input type to a set of default conversion flags.
- inputDefaultFlags map[reflect.Type]FieldMatchingFlags
-
- // If non-nil, will be called to print helpful debugging info. Quite verbose.
- Debug DebugLogger
-
// nameFunc is called to retrieve the name of a type; this name is used for the
// purpose of deciding whether two types match or not (i.e., will we attempt to
// do a conversion). The default returns the go type name.
@@ -89,11 +61,6 @@ func NewConverter(nameFn NameFunc) *Converter {
ignoredConversions: make(map[typePair]struct{}),
ignoredUntypedConversions: make(map[typePair]struct{}),
nameFunc: nameFn,
- structFieldDests: make(map[typeNamePair][]typeNamePair),
- structFieldSources: make(map[typeNamePair][]typeNamePair),
-
- inputFieldMappingFuncs: make(map[reflect.Type]FieldMappingFunc),
- inputDefaultFlags: make(map[reflect.Type]FieldMatchingFlags),
}
c.RegisterUntypedConversionFunc(
(*[]byte)(nil), (*[]byte)(nil),
@@ -112,11 +79,9 @@ func (c *Converter) WithConversions(fns ConversionFuncs) *Converter {
return &copied
}
-// DefaultMeta returns the conversion FieldMappingFunc and meta for a given type.
-func (c *Converter) DefaultMeta(t reflect.Type) (FieldMatchingFlags, *Meta) {
- return c.inputDefaultFlags[t], &Meta{
- KeyNameMapping: c.inputFieldMappingFuncs[t],
- }
+// DefaultMeta returns meta for a given type.
+func (c *Converter) DefaultMeta(t reflect.Type) *Meta {
+ return &Meta{}
}
// Convert_Slice_byte_To_Slice_byte prevents recursing into every byte
@@ -136,24 +101,12 @@ func Convert_Slice_byte_To_Slice_byte(in *[]byte, out *[]byte, s Scope) error {
type Scope interface {
// Call Convert to convert sub-objects. Note that if you call it with your own exact
// parameters, you'll run out of stack space before anything useful happens.
- Convert(src, dest interface{}, flags FieldMatchingFlags) error
-
- // SrcTags and DestTags contain the struct tags that src and dest had, respectively.
- // If the enclosing object was not a struct, then these will contain no tags, of course.
- SrcTag() reflect.StructTag
- DestTag() reflect.StructTag
-
- // Flags returns the flags with which the conversion was started.
- Flags() FieldMatchingFlags
+ Convert(src, dest interface{}) error
// Meta returns any information originally passed to Convert.
Meta() *Meta
}
-// FieldMappingFunc can convert an input field value into different values, depending on
-// the value of the source or destination struct tags.
-type FieldMappingFunc func(key string, sourceTag, destTag reflect.StructTag) (source string, dest string)
-
func NewConversionFuncs() ConversionFuncs {
return ConversionFuncs{
untyped: make(map[typePair]ConversionFunc),
@@ -194,9 +147,6 @@ func (c ConversionFuncs) Merge(other ConversionFuncs) ConversionFuncs {
// Meta is supplied by Scheme, when it calls Convert.
type Meta struct {
- // KeyNameMapping is an optional function which may map the listed key (field name)
- // into a source and destination value.
- KeyNameMapping FieldMappingFunc
// Context is an optional field that callers may use to pass info to conversion functions.
Context interface{}
}
@@ -205,84 +155,11 @@ type Meta struct {
type scope struct {
converter *Converter
meta *Meta
- flags FieldMatchingFlags
-
- // srcStack & destStack are separate because they may not have a 1:1
- // relationship.
- srcStack scopeStack
- destStack scopeStack
-}
-
-type scopeStackElem struct {
- tag reflect.StructTag
- value reflect.Value
- key string
-}
-
-type scopeStack []scopeStackElem
-
-func (s *scopeStack) pop() {
- n := len(*s)
- *s = (*s)[:n-1]
-}
-
-func (s *scopeStack) push(e scopeStackElem) {
- *s = append(*s, e)
-}
-
-func (s *scopeStack) top() *scopeStackElem {
- return &(*s)[len(*s)-1]
-}
-
-func (s scopeStack) describe() string {
- desc := ""
- if len(s) > 1 {
- desc = "(" + s[1].value.Type().String() + ")"
- }
- for i, v := range s {
- if i < 2 {
- // First layer on stack is not real; second is handled specially above.
- continue
- }
- if v.key == "" {
- desc += fmt.Sprintf(".%v", v.value.Type())
- } else {
- desc += fmt.Sprintf(".%v", v.key)
- }
- }
- return desc
-}
-
-// Formats src & dest as indices for printing.
-func (s *scope) setIndices(src, dest int) {
- s.srcStack.top().key = fmt.Sprintf("[%v]", src)
- s.destStack.top().key = fmt.Sprintf("[%v]", dest)
-}
-
-// Formats src & dest as map keys for printing.
-func (s *scope) setKeys(src, dest interface{}) {
- s.srcStack.top().key = fmt.Sprintf(`["%v"]`, src)
- s.destStack.top().key = fmt.Sprintf(`["%v"]`, dest)
}
// Convert continues a conversion.
-func (s *scope) Convert(src, dest interface{}, flags FieldMatchingFlags) error {
- return s.converter.Convert(src, dest, flags, s.meta)
-}
-
-// SrcTag returns the tag of the struct containing the current source item, if any.
-func (s *scope) SrcTag() reflect.StructTag {
- return s.srcStack.top().tag
-}
-
-// DestTag returns the tag of the struct containing the current dest item, if any.
-func (s *scope) DestTag() reflect.StructTag {
- return s.destStack.top().tag
-}
-
-// Flags returns the flags with which the current conversion was started.
-func (s *scope) Flags() FieldMatchingFlags {
- return s.flags
+func (s *scope) Convert(src, dest interface{}) error {
+ return s.converter.Convert(src, dest, s.meta)
}
// Meta returns the meta object that was originally passed to Convert.
@@ -290,50 +167,6 @@ func (s *scope) Meta() *Meta {
return s.meta
}
-// describe prints the path to get to the current (source, dest) values.
-func (s *scope) describe() (src, dest string) {
- return s.srcStack.describe(), s.destStack.describe()
-}
-
-// error makes an error that includes information about where we were in the objects
-// we were asked to convert.
-func (s *scope) errorf(message string, args ...interface{}) error {
- srcPath, destPath := s.describe()
- where := fmt.Sprintf("converting %v to %v: ", srcPath, destPath)
- return fmt.Errorf(where+message, args...)
-}
-
-// Verifies whether a conversion function has a correct signature.
-func verifyConversionFunctionSignature(ft reflect.Type) error {
- if ft.Kind() != reflect.Func {
- return fmt.Errorf("expected func, got: %v", ft)
- }
- if ft.NumIn() != 3 {
- return fmt.Errorf("expected three 'in' params, got: %v", ft)
- }
- if ft.NumOut() != 1 {
- return fmt.Errorf("expected one 'out' param, got: %v", ft)
- }
- if ft.In(0).Kind() != reflect.Ptr {
- return fmt.Errorf("expected pointer arg for 'in' param 0, got: %v", ft)
- }
- if ft.In(1).Kind() != reflect.Ptr {
- return fmt.Errorf("expected pointer arg for 'in' param 1, got: %v", ft)
- }
- scopeType := Scope(nil)
- if e, a := reflect.TypeOf(&scopeType).Elem(), ft.In(2); e != a {
- return fmt.Errorf("expected '%v' arg for 'in' param 2, got '%v' (%v)", e, a, ft)
- }
- var forErrorType error
- // This convolution is necessary, otherwise TypeOf picks up on the fact
- // that forErrorType is nil.
- errorType := reflect.TypeOf(&forErrorType).Elem()
- if ft.Out(0) != errorType {
- return fmt.Errorf("expected error return, got: %v", ft)
- }
- return nil
-}
-
// RegisterUntypedConversionFunc registers a function that converts between a and b by passing objects of those
// types to the provided function. The function *must* accept objects of a and b - this machinery will not enforce
// any other guarantee.
@@ -364,71 +197,16 @@ func (c *Converter) RegisterIgnoredConversion(from, to interface{}) error {
return nil
}
-// RegisterInputDefaults registers a field name mapping function, used when converting
-// from maps to structs. Inputs to the conversion methods are checked for this type and a mapping
-// applied automatically if the input matches in. A set of default flags for the input conversion
-// may also be provided, which will be used when no explicit flags are requested.
-func (c *Converter) RegisterInputDefaults(in interface{}, fn FieldMappingFunc, defaultFlags FieldMatchingFlags) error {
- fv := reflect.ValueOf(in)
- ft := fv.Type()
- if ft.Kind() != reflect.Ptr {
- return fmt.Errorf("expected pointer 'in' argument, got: %v", ft)
- }
- c.inputFieldMappingFuncs[ft] = fn
- c.inputDefaultFlags[ft] = defaultFlags
- return nil
-}
-
-// FieldMatchingFlags contains a list of ways in which struct fields could be
-// copied. These constants may be | combined.
-type FieldMatchingFlags int
-
-const (
- // Loop through destination fields, search for matching source
- // field to copy it from. Source fields with no corresponding
- // destination field will be ignored. If SourceToDest is
- // specified, this flag is ignored. If neither is specified,
- // or no flags are passed, this flag is the default.
- DestFromSource FieldMatchingFlags = 0
- // Loop through source fields, search for matching dest field
- // to copy it into. Destination fields with no corresponding
- // source field will be ignored.
- SourceToDest FieldMatchingFlags = 1 << iota
- // Don't treat it as an error if the corresponding source or
- // dest field can't be found.
- IgnoreMissingFields
- // Don't require type names to match.
- AllowDifferentFieldTypeNames
-)
-
-// IsSet returns true if the given flag or combination of flags is set.
-func (f FieldMatchingFlags) IsSet(flag FieldMatchingFlags) bool {
- if flag == DestFromSource {
- // The bit logic doesn't work on the default value.
- return f&SourceToDest != SourceToDest
- }
- return f&flag == flag
-}
-
// Convert will translate src to dest if it knows how. Both must be pointers.
// If no conversion func is registered and the default copying mechanism
// doesn't work on this type pair, an error will be returned.
-// Read the comments on the various FieldMatchingFlags constants to understand
-// what the 'flags' parameter does.
// 'meta' is given to allow you to pass information to conversion functions,
// it is not used by Convert() other than storing it in the scope.
// Not safe for objects with cyclic references!
-func (c *Converter) Convert(src, dest interface{}, flags FieldMatchingFlags, meta *Meta) error {
- return c.doConversion(src, dest, flags, meta, c.convert)
-}
-
-type conversionFunc func(sv, dv reflect.Value, scope *scope) error
-
-func (c *Converter) doConversion(src, dest interface{}, flags FieldMatchingFlags, meta *Meta, f conversionFunc) error {
+func (c *Converter) Convert(src, dest interface{}, meta *Meta) error {
pair := typePair{reflect.TypeOf(src), reflect.TypeOf(dest)}
scope := &scope{
converter: c,
- flags: flags,
meta: meta,
}
@@ -452,366 +230,4 @@ func (c *Converter) doConversion(src, dest interface{}, flags FieldMatchingFlags
return err
}
return fmt.Errorf("converting (%s) to (%s): unknown conversion", sv.Type(), dv.Type())
-
- // TODO: Everything past this point is deprecated.
- // Remove in 1.20 once we're sure it didn't break anything.
-
- // Leave something on the stack, so that calls to struct tag getters never fail.
- scope.srcStack.push(scopeStackElem{})
- scope.destStack.push(scopeStackElem{})
- return f(sv, dv, scope)
-}
-
-// callUntyped calls predefined conversion func.
-func (c *Converter) callUntyped(sv, dv reflect.Value, f ConversionFunc, scope *scope) error {
- if !dv.CanAddr() {
- return scope.errorf("cant addr dest")
- }
- var svPointer reflect.Value
- if sv.CanAddr() {
- svPointer = sv.Addr()
- } else {
- svPointer = reflect.New(sv.Type())
- svPointer.Elem().Set(sv)
- }
- dvPointer := dv.Addr()
- return f(svPointer.Interface(), dvPointer.Interface(), scope)
-}
-
-// convert recursively copies sv into dv, calling an appropriate conversion function if
-// one is registered.
-func (c *Converter) convert(sv, dv reflect.Value, scope *scope) error {
- dt, st := dv.Type(), sv.Type()
- pair := typePair{st, dt}
-
- // ignore conversions of this type
- if _, ok := c.ignoredConversions[pair]; ok {
- if c.Debug != nil {
- c.Debug.Logf("Ignoring conversion of '%v' to '%v'", st, dt)
- }
- return nil
- }
-
- // Convert sv to dv.
- pair = typePair{reflect.PtrTo(sv.Type()), reflect.PtrTo(dv.Type())}
- if f, ok := c.conversionFuncs.untyped[pair]; ok {
- return c.callUntyped(sv, dv, f, scope)
- }
- if f, ok := c.generatedConversionFuncs.untyped[pair]; ok {
- return c.callUntyped(sv, dv, f, scope)
- }
-
- if !dv.CanSet() {
- return scope.errorf("Cannot set dest. (Tried to deep copy something with unexported fields?)")
- }
-
- if !scope.flags.IsSet(AllowDifferentFieldTypeNames) && c.nameFunc(dt) != c.nameFunc(st) {
- return scope.errorf(
- "type names don't match (%v, %v), and no conversion 'func (%v, %v) error' registered.",
- c.nameFunc(st), c.nameFunc(dt), st, dt)
- }
-
- switch st.Kind() {
- case reflect.Map, reflect.Ptr, reflect.Slice, reflect.Interface, reflect.Struct:
- // Don't copy these via assignment/conversion!
- default:
- // This should handle all simple types.
- if st.AssignableTo(dt) {
- dv.Set(sv)
- return nil
- }
- if st.ConvertibleTo(dt) {
- dv.Set(sv.Convert(dt))
- return nil
- }
- }
-
- if c.Debug != nil {
- c.Debug.Logf("Trying to convert '%v' to '%v'", st, dt)
- }
-
- scope.srcStack.push(scopeStackElem{value: sv})
- scope.destStack.push(scopeStackElem{value: dv})
- defer scope.srcStack.pop()
- defer scope.destStack.pop()
-
- switch dv.Kind() {
- case reflect.Struct:
- return c.convertKV(toKVValue(sv), toKVValue(dv), scope)
- case reflect.Slice:
- if sv.IsNil() {
- // Don't make a zero-length slice.
- dv.Set(reflect.Zero(dt))
- return nil
- }
- dv.Set(reflect.MakeSlice(dt, sv.Len(), sv.Cap()))
- for i := 0; i < sv.Len(); i++ {
- scope.setIndices(i, i)
- if err := c.convert(sv.Index(i), dv.Index(i), scope); err != nil {
- return err
- }
- }
- case reflect.Ptr:
- if sv.IsNil() {
- // Don't copy a nil ptr!
- dv.Set(reflect.Zero(dt))
- return nil
- }
- dv.Set(reflect.New(dt.Elem()))
- switch st.Kind() {
- case reflect.Ptr, reflect.Interface:
- return c.convert(sv.Elem(), dv.Elem(), scope)
- default:
- return c.convert(sv, dv.Elem(), scope)
- }
- case reflect.Map:
- if sv.IsNil() {
- // Don't copy a nil ptr!
- dv.Set(reflect.Zero(dt))
- return nil
- }
- dv.Set(reflect.MakeMap(dt))
- for _, sk := range sv.MapKeys() {
- dk := reflect.New(dt.Key()).Elem()
- if err := c.convert(sk, dk, scope); err != nil {
- return err
- }
- dkv := reflect.New(dt.Elem()).Elem()
- scope.setKeys(sk.Interface(), dk.Interface())
- // TODO: sv.MapIndex(sk) may return a value with CanAddr() == false,
- // because a map[string]struct{} does not allow a pointer reference.
- // Calling a custom conversion function defined for the map value
- // will panic. Example is PodInfo map[string]ContainerStatus.
- if err := c.convert(sv.MapIndex(sk), dkv, scope); err != nil {
- return err
- }
- dv.SetMapIndex(dk, dkv)
- }
- case reflect.Interface:
- if sv.IsNil() {
- // Don't copy a nil interface!
- dv.Set(reflect.Zero(dt))
- return nil
- }
- tmpdv := reflect.New(sv.Elem().Type()).Elem()
- if err := c.convert(sv.Elem(), tmpdv, scope); err != nil {
- return err
- }
- dv.Set(reflect.ValueOf(tmpdv.Interface()))
- return nil
- default:
- return scope.errorf("couldn't copy '%v' into '%v'; didn't understand types", st, dt)
- }
- return nil
-}
-
-var stringType = reflect.TypeOf("")
-
-func toKVValue(v reflect.Value) kvValue {
- switch v.Kind() {
- case reflect.Struct:
- return structAdaptor(v)
- case reflect.Map:
- if v.Type().Key().AssignableTo(stringType) {
- return stringMapAdaptor(v)
- }
- }
-
- return nil
-}
-
-// kvValue lets us write the same conversion logic to work with both maps
-// and structs. Only maps with string keys make sense for this.
-type kvValue interface {
- // returns all keys, as a []string.
- keys() []string
- // Will just return "" for maps.
- tagOf(key string) reflect.StructTag
- // Will return the zero Value if the key doesn't exist.
- value(key string) reflect.Value
- // Maps require explicit setting-- will do nothing for structs.
- // Returns false on failure.
- confirmSet(key string, v reflect.Value) bool
-}
-
-type stringMapAdaptor reflect.Value
-
-func (a stringMapAdaptor) len() int {
- return reflect.Value(a).Len()
-}
-
-func (a stringMapAdaptor) keys() []string {
- v := reflect.Value(a)
- keys := make([]string, v.Len())
- for i, v := range v.MapKeys() {
- if v.IsNil() {
- continue
- }
- switch t := v.Interface().(type) {
- case string:
- keys[i] = t
- }
- }
- return keys
-}
-
-func (a stringMapAdaptor) tagOf(key string) reflect.StructTag {
- return ""
-}
-
-func (a stringMapAdaptor) value(key string) reflect.Value {
- return reflect.Value(a).MapIndex(reflect.ValueOf(key))
-}
-
-func (a stringMapAdaptor) confirmSet(key string, v reflect.Value) bool {
- return true
-}
-
-type structAdaptor reflect.Value
-
-func (a structAdaptor) len() int {
- v := reflect.Value(a)
- return v.Type().NumField()
-}
-
-func (a structAdaptor) keys() []string {
- v := reflect.Value(a)
- t := v.Type()
- keys := make([]string, t.NumField())
- for i := range keys {
- keys[i] = t.Field(i).Name
- }
- return keys
-}
-
-func (a structAdaptor) tagOf(key string) reflect.StructTag {
- v := reflect.Value(a)
- field, ok := v.Type().FieldByName(key)
- if ok {
- return field.Tag
- }
- return ""
-}
-
-func (a structAdaptor) value(key string) reflect.Value {
- v := reflect.Value(a)
- return v.FieldByName(key)
-}
-
-func (a structAdaptor) confirmSet(key string, v reflect.Value) bool {
- return true
-}
-
-// convertKV can convert things that consist of key/value pairs, like structs
-// and some maps.
-func (c *Converter) convertKV(skv, dkv kvValue, scope *scope) error {
- if skv == nil || dkv == nil {
- // TODO: add keys to stack to support really understandable error messages.
- return fmt.Errorf("Unable to convert %#v to %#v", skv, dkv)
- }
-
- lister := dkv
- if scope.flags.IsSet(SourceToDest) {
- lister = skv
- }
-
- var mapping FieldMappingFunc
- if scope.meta != nil && scope.meta.KeyNameMapping != nil {
- mapping = scope.meta.KeyNameMapping
- }
-
- for _, key := range lister.keys() {
- if found, err := c.checkField(key, skv, dkv, scope); found {
- if err != nil {
- return err
- }
- continue
- }
- stag := skv.tagOf(key)
- dtag := dkv.tagOf(key)
- skey := key
- dkey := key
- if mapping != nil {
- skey, dkey = scope.meta.KeyNameMapping(key, stag, dtag)
- }
-
- df := dkv.value(dkey)
- sf := skv.value(skey)
- if !df.IsValid() || !sf.IsValid() {
- switch {
- case scope.flags.IsSet(IgnoreMissingFields):
- // No error.
- case scope.flags.IsSet(SourceToDest):
- return scope.errorf("%v not present in dest", dkey)
- default:
- return scope.errorf("%v not present in src", skey)
- }
- continue
- }
- scope.srcStack.top().key = skey
- scope.srcStack.top().tag = stag
- scope.destStack.top().key = dkey
- scope.destStack.top().tag = dtag
- if err := c.convert(sf, df, scope); err != nil {
- return err
- }
- }
- return nil
-}
-
-// checkField returns true if the field name matches any of the struct
-// field copying rules. The error should be ignored if it returns false.
-func (c *Converter) checkField(fieldName string, skv, dkv kvValue, scope *scope) (bool, error) {
- replacementMade := false
- if scope.flags.IsSet(DestFromSource) {
- df := dkv.value(fieldName)
- if !df.IsValid() {
- return false, nil
- }
- destKey := typeNamePair{df.Type(), fieldName}
- // Check each of the potential source (type, name) pairs to see if they're
- // present in sv.
- for _, potentialSourceKey := range c.structFieldSources[destKey] {
- sf := skv.value(potentialSourceKey.fieldName)
- if !sf.IsValid() {
- continue
- }
- if sf.Type() == potentialSourceKey.fieldType {
- // Both the source's name and type matched, so copy.
- scope.srcStack.top().key = potentialSourceKey.fieldName
- scope.destStack.top().key = fieldName
- if err := c.convert(sf, df, scope); err != nil {
- return true, err
- }
- dkv.confirmSet(fieldName, df)
- replacementMade = true
- }
- }
- return replacementMade, nil
- }
-
- sf := skv.value(fieldName)
- if !sf.IsValid() {
- return false, nil
- }
- srcKey := typeNamePair{sf.Type(), fieldName}
- // Check each of the potential dest (type, name) pairs to see if they're
- // present in dv.
- for _, potentialDestKey := range c.structFieldDests[srcKey] {
- df := dkv.value(potentialDestKey.fieldName)
- if !df.IsValid() {
- continue
- }
- if df.Type() == potentialDestKey.fieldType {
- // Both the dest's name and type matched, so copy.
- scope.srcStack.top().key = fieldName
- scope.destStack.top().key = potentialDestKey.fieldName
- if err := c.convert(sf, df, scope); err != nil {
- return true, err
- }
- dkv.confirmSet(potentialDestKey.fieldName, df)
- replacementMade = true
- }
- }
- return replacementMade, nil
}
diff --git a/vendor/k8s.io/apimachinery/pkg/labels/labels.go b/vendor/k8s.io/apimachinery/pkg/labels/labels.go
index d9eeb4f91..d6bbeeaca 100644
--- a/vendor/k8s.io/apimachinery/pkg/labels/labels.go
+++ b/vendor/k8s.io/apimachinery/pkg/labels/labels.go
@@ -141,25 +141,6 @@ func Equals(labels1, labels2 Set) bool {
return true
}
-// AreLabelsInWhiteList verifies if the provided label list
-// is in the provided whitelist and returns true, otherwise false.
-func AreLabelsInWhiteList(labels, whitelist Set) bool {
- if len(whitelist) == 0 {
- return true
- }
-
- for k, v := range labels {
- value, ok := whitelist[k]
- if !ok {
- return false
- }
- if value != v {
- return false
- }
- }
- return true
-}
-
// ConvertSelectorToLabelsMap converts selector string to labels map
// and validates keys and values
func ConvertSelectorToLabelsMap(selector string) (Set, error) {
diff --git a/vendor/k8s.io/apimachinery/pkg/labels/selector.go b/vendor/k8s.io/apimachinery/pkg/labels/selector.go
index bf62f98a4..50ae4f7ce 100644
--- a/vendor/k8s.io/apimachinery/pkg/labels/selector.go
+++ b/vendor/k8s.io/apimachinery/pkg/labels/selector.go
@@ -263,11 +263,11 @@ func (r *Requirement) Values() sets.String {
}
// Empty returns true if the internalSelector doesn't restrict selection space
-func (lsel internalSelector) Empty() bool {
- if lsel == nil {
+func (s internalSelector) Empty() bool {
+ if s == nil {
return true
}
- return len(lsel) == 0
+ return len(s) == 0
}
// String returns a human-readable string that represents this
@@ -330,51 +330,51 @@ func safeSort(in []string) []string {
}
// Add adds requirements to the selector. It copies the current selector returning a new one
-func (lsel internalSelector) Add(reqs ...Requirement) Selector {
- var sel internalSelector
- for ix := range lsel {
- sel = append(sel, lsel[ix])
+func (s internalSelector) Add(reqs ...Requirement) Selector {
+ var ret internalSelector
+ for ix := range s {
+ ret = append(ret, s[ix])
}
for _, r := range reqs {
- sel = append(sel, r)
+ ret = append(ret, r)
}
- sort.Sort(ByKey(sel))
- return sel
+ sort.Sort(ByKey(ret))
+ return ret
}
// Matches for a internalSelector returns true if all
// its Requirements match the input Labels. If any
// Requirement does not match, false is returned.
-func (lsel internalSelector) Matches(l Labels) bool {
- for ix := range lsel {
- if matches := lsel[ix].Matches(l); !matches {
+func (s internalSelector) Matches(l Labels) bool {
+ for ix := range s {
+ if matches := s[ix].Matches(l); !matches {
return false
}
}
return true
}
-func (lsel internalSelector) Requirements() (Requirements, bool) { return Requirements(lsel), true }
+func (s internalSelector) Requirements() (Requirements, bool) { return Requirements(s), true }
// String returns a comma-separated string of all
// the internalSelector Requirements' human-readable strings.
-func (lsel internalSelector) String() string {
+func (s internalSelector) String() string {
var reqs []string
- for ix := range lsel {
- reqs = append(reqs, lsel[ix].String())
+ for ix := range s {
+ reqs = append(reqs, s[ix].String())
}
return strings.Join(reqs, ",")
}
// RequiresExactMatch introspect whether a given selector requires a single specific field
// to be set, and if so returns the value it requires.
-func (lsel internalSelector) RequiresExactMatch(label string) (value string, found bool) {
- for ix := range lsel {
- if lsel[ix].key == label {
- switch lsel[ix].operator {
+func (s internalSelector) RequiresExactMatch(label string) (value string, found bool) {
+ for ix := range s {
+ if s[ix].key == label {
+ switch s[ix].operator {
case selection.Equals, selection.DoubleEquals, selection.In:
- if len(lsel[ix].strValues) == 1 {
- return lsel[ix].strValues[0], true
+ if len(s[ix].strValues) == 1 {
+ return s[ix].strValues[0], true
}
}
return "", false
@@ -789,12 +789,12 @@ func (p *Parser) parseIdentifiersList() (sets.String, error) {
// parseExactValue parses the only value for exact match style
func (p *Parser) parseExactValue() (sets.String, error) {
s := sets.NewString()
- tok, lit := p.lookahead(Values)
+ tok, _ := p.lookahead(Values)
if tok == EndOfStringToken || tok == CommaToken {
s.Insert("")
return s, nil
}
- tok, lit = p.consume(Values)
+ tok, lit := p.consume(Values)
if tok == IdentifierToken {
s.Insert(lit)
return s, nil
diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/converter.go b/vendor/k8s.io/apimachinery/pkg/runtime/converter.go
index 871e4c8c4..4a6cc6857 100644
--- a/vendor/k8s.io/apimachinery/pkg/runtime/converter.go
+++ b/vendor/k8s.io/apimachinery/pkg/runtime/converter.go
@@ -186,6 +186,9 @@ func fromUnstructured(sv, dv reflect.Value) error {
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
dv.Set(sv.Convert(dt))
return nil
+ case reflect.Float32, reflect.Float64:
+ dv.Set(sv.Convert(dt))
+ return nil
}
case reflect.Float32, reflect.Float64:
switch dt.Kind() {
diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto b/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto
index 0e212ec94..3b25391fa 100644
--- a/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto
+++ b/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto
@@ -17,7 +17,7 @@ limitations under the License.
// This file was autogenerated by go-to-protobuf. Do not edit it manually!
-syntax = 'proto2';
+syntax = "proto2";
package k8s.io.apimachinery.pkg.runtime;
diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go b/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go
index f44693c0c..3e1fab1d1 100644
--- a/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go
+++ b/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go
@@ -57,7 +57,7 @@ type Encoder interface {
// Identifiers of two different encoders should be equal if and only if for every input
// object it will be encoded to the same representation by both of them.
//
- // Identifier is inteted for use with CacheableObject#CacheEncode method. In order to
+ // Identifier is intended for use with CacheableObject#CacheEncode method. In order to
// correctly handle CacheableObject, Encode() method should look similar to below, where
// doEncode() is the encoding logic of implemented encoder:
// func (e *MyEncoder) Encode(obj Object, w io.Writer) error {
diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/negotiate.go b/vendor/k8s.io/apimachinery/pkg/runtime/negotiate.go
index 159b30120..3ab119b0a 100644
--- a/vendor/k8s.io/apimachinery/pkg/runtime/negotiate.go
+++ b/vendor/k8s.io/apimachinery/pkg/runtime/negotiate.go
@@ -92,39 +92,6 @@ func NewClientNegotiator(serializer NegotiatedSerializer, gv schema.GroupVersion
}
}
-// NewInternalClientNegotiator applies the default client rules for connecting to a Kubernetes apiserver
-// where objects are converted to gv prior to sending and decoded to their internal representation prior
-// to retrieval.
-//
-// DEPRECATED: Internal clients are deprecated and will be removed in a future Kubernetes release.
-func NewInternalClientNegotiator(serializer NegotiatedSerializer, gv schema.GroupVersion) ClientNegotiator {
- decode := schema.GroupVersions{
- {
- Group: gv.Group,
- Version: APIVersionInternal,
- },
- // always include the legacy group as a decoding target to handle non-error `Status` return types
- {
- Group: "",
- Version: APIVersionInternal,
- },
- }
- return &clientNegotiator{
- encode: gv,
- decode: decode,
- serializer: serializer,
- }
-}
-
-// NewSimpleClientNegotiator will negotiate for a single serializer. This should only be used
-// for testing or when the caller is taking responsibility for setting the GVK on encoded objects.
-func NewSimpleClientNegotiator(info SerializerInfo, gv schema.GroupVersion) ClientNegotiator {
- return &clientNegotiator{
- serializer: &simpleNegotiatedSerializer{info: info},
- encode: gv,
- }
-}
-
type simpleNegotiatedSerializer struct {
info SerializerInfo
}
diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto b/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto
index 5aeeaa100..c50766a4b 100644
--- a/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto
+++ b/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto
@@ -17,7 +17,7 @@ limitations under the License.
// This file was autogenerated by go-to-protobuf. Do not edit it manually!
-syntax = 'proto2';
+syntax = "proto2";
package k8s.io.apimachinery.pkg.runtime.schema;
diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/schema/interfaces.go b/vendor/k8s.io/apimachinery/pkg/runtime/schema/interfaces.go
index b57066845..f04453fb0 100644
--- a/vendor/k8s.io/apimachinery/pkg/runtime/schema/interfaces.go
+++ b/vendor/k8s.io/apimachinery/pkg/runtime/schema/interfaces.go
@@ -23,8 +23,8 @@ type ObjectKind interface {
// SetGroupVersionKind sets or clears the intended serialized kind of an object. Passing kind nil
// should clear the current setting.
SetGroupVersionKind(kind GroupVersionKind)
- // GroupVersionKind returns the stored group, version, and kind of an object, or nil if the object does
- // not expose or provide these fields.
+ // GroupVersionKind returns the stored group, version, and kind of an object, or an empty struct
+ // if the object does not expose or provide these fields.
GroupVersionKind() GroupVersionKind
}
diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go b/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go
index 3b254961d..697dd4ed7 100644
--- a/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go
+++ b/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go
@@ -18,7 +18,6 @@ package runtime
import (
"fmt"
- "net/url"
"reflect"
"strings"
@@ -105,9 +104,6 @@ func NewScheme() *Scheme {
// Enable couple default conversions by default.
utilruntime.Must(RegisterEmbeddedConversions(s))
utilruntime.Must(RegisterStringConversions(s))
-
- utilruntime.Must(s.RegisterInputDefaults(&map[string][]string{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields))
- utilruntime.Must(s.RegisterInputDefaults(&url.Values{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields))
return s
}
@@ -309,11 +305,6 @@ func (s *Scheme) New(kind schema.GroupVersionKind) (Object, error) {
return nil, NewNotRegisteredErrForKind(s.schemeName, kind)
}
-// Log sets a logger on the scheme. For test purposes only
-func (s *Scheme) Log(l conversion.DebugLogger) {
- s.converter.Debug = l
-}
-
// AddIgnoredConversionType identifies a pair of types that should be skipped by
// conversion (because the data inside them is explicitly dropped during
// conversion).
@@ -342,14 +333,6 @@ func (s *Scheme) AddFieldLabelConversionFunc(gvk schema.GroupVersionKind, conver
return nil
}
-// RegisterInputDefaults sets the provided field mapping function and field matching
-// as the defaults for the provided input type. The fn may be nil, in which case no
-// mapping will happen by default. Use this method to register a mechanism for handling
-// a specific input type in conversion, such as a map[string]string to structs.
-func (s *Scheme) RegisterInputDefaults(in interface{}, fn conversion.FieldMappingFunc, defaultFlags conversion.FieldMatchingFlags) error {
- return s.converter.RegisterInputDefaults(in, fn, defaultFlags)
-}
-
// AddTypeDefaultingFunc registers a function that is passed a pointer to an
// object and can default fields on the object. These functions will be invoked
// when Default() is called. The function will never be called unless the
@@ -433,12 +416,9 @@ func (s *Scheme) Convert(in, out interface{}, context interface{}) error {
in = typed
}
- flags, meta := s.generateConvertMeta(in)
+ meta := s.generateConvertMeta(in)
meta.Context = context
- if flags == 0 {
- flags = conversion.AllowDifferentFieldTypeNames
- }
- return s.converter.Convert(in, out, flags, meta)
+ return s.converter.Convert(in, out, meta)
}
// ConvertFieldLabel alters the given field label and value for an kind field selector from
@@ -535,9 +515,9 @@ func (s *Scheme) convertToVersion(copy bool, in Object, target GroupVersioner) (
in = in.DeepCopyObject()
}
- flags, meta := s.generateConvertMeta(in)
+ meta := s.generateConvertMeta(in)
meta.Context = target
- if err := s.converter.Convert(in, out, flags, meta); err != nil {
+ if err := s.converter.Convert(in, out, meta); err != nil {
return nil, err
}
@@ -565,7 +545,7 @@ func (s *Scheme) unstructuredToTyped(in Unstructured) (Object, error) {
}
// generateConvertMeta constructs the meta value we pass to Convert.
-func (s *Scheme) generateConvertMeta(in interface{}) (conversion.FieldMatchingFlags, *conversion.Meta) {
+func (s *Scheme) generateConvertMeta(in interface{}) *conversion.Meta {
return s.converter.DefaultMeta(reflect.TypeOf(in))
}
diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go
index f21b0ef19..e55ab94d1 100644
--- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go
+++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go
@@ -108,10 +108,9 @@ func newSerializersForScheme(scheme *runtime.Scheme, mf json.MetaFactory, option
// CodecFactory provides methods for retrieving codecs and serializers for specific
// versions and content types.
type CodecFactory struct {
- scheme *runtime.Scheme
- serializers []serializerType
- universal runtime.Decoder
- accepts []runtime.SerializerInfo
+ scheme *runtime.Scheme
+ universal runtime.Decoder
+ accepts []runtime.SerializerInfo
legacySerializer runtime.Serializer
}
@@ -216,9 +215,8 @@ func newCodecFactory(scheme *runtime.Scheme, serializers []serializerType) Codec
}
return CodecFactory{
- scheme: scheme,
- serializers: serializers,
- universal: recognizer.NewDecoder(decoders...),
+ scheme: scheme,
+ universal: recognizer.NewDecoder(decoders...),
accepts: accepts,
diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go
index e081d7ff1..83b2e1393 100644
--- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go
+++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go
@@ -96,6 +96,7 @@ type SerializerOptions struct {
Strict bool
}
+// Serializer handles encoding versioned objects into the proper JSON form
type Serializer struct {
meta MetaFactory
options SerializerOptions
@@ -144,10 +145,10 @@ func (customNumberDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) {
}
}
-// CaseSensitiveJsonIterator returns a jsoniterator API that's configured to be
+// CaseSensitiveJSONIterator returns a jsoniterator API that's configured to be
// case-sensitive when unmarshalling, and otherwise compatible with
// the encoding/json standard library.
-func CaseSensitiveJsonIterator() jsoniter.API {
+func CaseSensitiveJSONIterator() jsoniter.API {
config := jsoniter.Config{
EscapeHTML: true,
SortMapKeys: true,
@@ -159,10 +160,10 @@ func CaseSensitiveJsonIterator() jsoniter.API {
return config
}
-// StrictCaseSensitiveJsonIterator returns a jsoniterator API that's configured to be
+// StrictCaseSensitiveJSONIterator returns a jsoniterator API that's configured to be
// case-sensitive, but also disallows unknown fields when unmarshalling. It is compatible with
// the encoding/json standard library.
-func StrictCaseSensitiveJsonIterator() jsoniter.API {
+func StrictCaseSensitiveJSONIterator() jsoniter.API {
config := jsoniter.Config{
EscapeHTML: true,
SortMapKeys: true,
@@ -179,8 +180,8 @@ func StrictCaseSensitiveJsonIterator() jsoniter.API {
// from outside. Still does not protect from package level jsoniter.Register*() functions - someone calling them
// in some other library will mess with every usage of the jsoniter library in the whole program.
// See https://github.com/json-iterator/go/issues/265
-var caseSensitiveJsonIterator = CaseSensitiveJsonIterator()
-var strictCaseSensitiveJsonIterator = StrictCaseSensitiveJsonIterator()
+var caseSensitiveJSONIterator = CaseSensitiveJSONIterator()
+var strictCaseSensitiveJSONIterator = StrictCaseSensitiveJSONIterator()
// gvkWithDefaults returns group kind and version defaulting from provided default
func gvkWithDefaults(actual, defaultGVK schema.GroupVersionKind) schema.GroupVersionKind {
@@ -236,7 +237,7 @@ func (s *Serializer) Decode(originalData []byte, gvk *schema.GroupVersionKind, i
types, _, err := s.typer.ObjectKinds(into)
switch {
case runtime.IsNotRegisteredError(err), isUnstructured:
- if err := caseSensitiveJsonIterator.Unmarshal(data, into); err != nil {
+ if err := caseSensitiveJSONIterator.Unmarshal(data, into); err != nil {
return nil, actual, err
}
return into, actual, nil
@@ -260,7 +261,7 @@ func (s *Serializer) Decode(originalData []byte, gvk *schema.GroupVersionKind, i
return nil, actual, err
}
- if err := caseSensitiveJsonIterator.Unmarshal(data, obj); err != nil {
+ if err := caseSensitiveJSONIterator.Unmarshal(data, obj); err != nil {
return nil, actual, err
}
@@ -285,7 +286,7 @@ func (s *Serializer) Decode(originalData []byte, gvk *schema.GroupVersionKind, i
// due to that a matching field doesn't exist in the object. hence we can return a typed strictDecoderError,
// the actual error is that the object contains unknown field.
strictObj := obj.DeepCopyObject()
- if err := strictCaseSensitiveJsonIterator.Unmarshal(altered, strictObj); err != nil {
+ if err := strictCaseSensitiveJSONIterator.Unmarshal(altered, strictObj); err != nil {
return nil, actual, runtime.NewStrictDecodingError(err.Error(), string(originalData))
}
// Always return the same object as the non-strict serializer to avoid any deviations.
@@ -302,7 +303,7 @@ func (s *Serializer) Encode(obj runtime.Object, w io.Writer) error {
func (s *Serializer) doEncode(obj runtime.Object, w io.Writer) error {
if s.options.Yaml {
- json, err := caseSensitiveJsonIterator.Marshal(obj)
+ json, err := caseSensitiveJSONIterator.Marshal(obj)
if err != nil {
return err
}
@@ -315,7 +316,7 @@ func (s *Serializer) doEncode(obj runtime.Object, w io.Writer) error {
}
if s.options.Pretty {
- data, err := caseSensitiveJsonIterator.MarshalIndent(obj, "", " ")
+ data, err := caseSensitiveJSONIterator.MarshalIndent(obj, "", " ")
if err != nil {
return err
}
diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go
index f606b7d72..404fb1b7e 100644
--- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go
+++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go
@@ -61,6 +61,7 @@ func (e errNotMarshalable) Status() metav1.Status {
}
}
+// IsNotMarshalable checks the type of error, returns a boolean true if error is not nil and not marshalable false otherwise
func IsNotMarshalable(err error) bool {
_, ok := err.(errNotMarshalable)
return err != nil && ok
@@ -77,6 +78,7 @@ func NewSerializer(creater runtime.ObjectCreater, typer runtime.ObjectTyper) *Se
}
}
+// Serializer handles encoding versioned objects into the proper wire form
type Serializer struct {
prefix []byte
creater runtime.ObjectCreater
@@ -457,8 +459,10 @@ func (s *RawSerializer) Identifier() runtime.Identifier {
return rawSerializerIdentifier
}
+// LengthDelimitedFramer is exported variable of type lengthDelimitedFramer
var LengthDelimitedFramer = lengthDelimitedFramer{}
+// Provides length delimited frame reader and writer methods
type lengthDelimitedFramer struct{}
// NewFrameWriter implements stream framing for this serializer
diff --git a/vendor/k8s.io/apimachinery/pkg/types/namespacedname.go b/vendor/k8s.io/apimachinery/pkg/types/namespacedname.go
index 88f0de36d..b19750f3a 100644
--- a/vendor/k8s.io/apimachinery/pkg/types/namespacedname.go
+++ b/vendor/k8s.io/apimachinery/pkg/types/namespacedname.go
@@ -16,10 +16,6 @@ limitations under the License.
package types
-import (
- "fmt"
-)
-
// NamespacedName comprises a resource name, with a mandatory namespace,
// rendered as "<namespace>/<name>". Being a type captures intent and
// helps make sure that UIDs, namespaced names and non-namespaced names
@@ -39,5 +35,5 @@ const (
// String returns the general purpose string representation
func (n NamespacedName) String() string {
- return fmt.Sprintf("%s%c%s", n.Namespace, Separator, n.Name)
+ return n.Namespace + string(Separator) + n.Name
}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/clock/clock.go b/vendor/k8s.io/apimachinery/pkg/util/clock/clock.go
index 6cf13d83d..3e1e2517b 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/clock/clock.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/clock/clock.go
@@ -348,7 +348,13 @@ func (f *fakeTimer) Stop() bool {
// Reset conditionally updates the firing time of the timer. If the
// timer has neither fired nor been stopped then this call resets the
// timer to the fake clock's "now" + d and returns true, otherwise
-// this call returns false. This is like time.Timer::Reset.
+// it creates a new waiter, adds it to the clock, and returns true.
+//
+// It is not possible to return false, because a fake timer can be reset
+// from any state (waiting to fire, already fired, and stopped).
+//
+// See the GoDoc for time.Timer::Reset for more context on why
+// the return value of Reset() is not useful.
func (f *fakeTimer) Reset(d time.Duration) bool {
f.fakeClock.lock.Lock()
defer f.fakeClock.lock.Unlock()
@@ -360,7 +366,15 @@ func (f *fakeTimer) Reset(d time.Duration) bool {
return true
}
}
- return false
+ // No existing waiter, timer has already fired or been reset.
+ // We should still enable Reset() to succeed by creating a
+ // new waiter and adding it to the clock's waiters.
+ newWaiter := fakeClockWaiter{
+ targetTime: f.fakeClock.time.Add(d),
+ destChan: seekChan,
+ }
+ f.fakeClock.waiters = append(f.fakeClock.waiters, newWaiter)
+ return true
}
// Ticker defines the Ticker interface
diff --git a/vendor/k8s.io/apimachinery/pkg/util/errors/errors.go b/vendor/k8s.io/apimachinery/pkg/util/errors/errors.go
index 5bafc218e..1f5a04fd4 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/errors/errors.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/errors/errors.go
@@ -163,7 +163,7 @@ func matchesError(err error, fns ...Matcher) bool {
// filterErrors returns any errors (or nested errors, if the list contains
// nested Errors) for which all fns return false. If no errors
-// remain a nil list is returned. The resulting silec will have all
+// remain a nil list is returned. The resulting slice will have all
// nested slices flattened as a side effect.
func filterErrors(list []error, fns ...Matcher) []error {
result := []error{}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/framer/framer.go b/vendor/k8s.io/apimachinery/pkg/util/framer/framer.go
index 066680f44..45aa74bf5 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/framer/framer.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/framer/framer.go
@@ -132,12 +132,14 @@ func (r *jsonFrameReader) Read(data []byte) (int, error) {
// Return whatever remaining data exists from an in progress frame
if n := len(r.remaining); n > 0 {
if n <= len(data) {
+ //lint:ignore SA4006,SA4010 underlying array of data is modified here.
data = append(data[0:0], r.remaining...)
r.remaining = nil
return n, nil
}
n = len(data)
+ //lint:ignore SA4006,SA4010 underlying array of data is modified here.
data = append(data[0:0], r.remaining[:n]...)
r.remaining = r.remaining[n:]
return n, io.ErrShortBuffer
@@ -155,6 +157,7 @@ func (r *jsonFrameReader) Read(data []byte) (int, error) {
// and set m to it, which means we need to copy the partial result back into data and preserve
// the remaining result for subsequent reads.
if len(m) > n {
+ //lint:ignore SA4006,SA4010 underlying array of data is modified here.
data = append(data[0:0], m[:n]...)
r.remaining = m[n:]
return n, io.ErrShortBuffer
diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go
index 7a6881250..336b4908b 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go
@@ -34,38 +34,62 @@ type connection struct {
streams []httpstream.Stream
streamLock sync.Mutex
newStreamHandler httpstream.NewStreamHandler
+ ping func() (time.Duration, error)
}
// NewClientConnection creates a new SPDY client connection.
func NewClientConnection(conn net.Conn) (httpstream.Connection, error) {
+ return NewClientConnectionWithPings(conn, 0)
+}
+
+// NewClientConnectionWithPings creates a new SPDY client connection.
+//
+// If pingPeriod is non-zero, a background goroutine will send periodic Ping
+// frames to the server. Use this to keep idle connections through certain load
+// balancers alive longer.
+func NewClientConnectionWithPings(conn net.Conn, pingPeriod time.Duration) (httpstream.Connection, error) {
spdyConn, err := spdystream.NewConnection(conn, false)
if err != nil {
defer conn.Close()
return nil, err
}
- return newConnection(spdyConn, httpstream.NoOpNewStreamHandler), nil
+ return newConnection(spdyConn, httpstream.NoOpNewStreamHandler, pingPeriod, spdyConn.Ping), nil
}
// NewServerConnection creates a new SPDY server connection. newStreamHandler
// will be invoked when the server receives a newly created stream from the
// client.
func NewServerConnection(conn net.Conn, newStreamHandler httpstream.NewStreamHandler) (httpstream.Connection, error) {
+ return NewServerConnectionWithPings(conn, newStreamHandler, 0)
+}
+
+// NewServerConnectionWithPings creates a new SPDY server connection.
+// newStreamHandler will be invoked when the server receives a newly created
+// stream from the client.
+//
+// If pingPeriod is non-zero, a background goroutine will send periodic Ping
+// frames to the server. Use this to keep idle connections through certain load
+// balancers alive longer.
+func NewServerConnectionWithPings(conn net.Conn, newStreamHandler httpstream.NewStreamHandler, pingPeriod time.Duration) (httpstream.Connection, error) {
spdyConn, err := spdystream.NewConnection(conn, true)
if err != nil {
defer conn.Close()
return nil, err
}
- return newConnection(spdyConn, newStreamHandler), nil
+ return newConnection(spdyConn, newStreamHandler, pingPeriod, spdyConn.Ping), nil
}
// newConnection returns a new connection wrapping conn. newStreamHandler
// will be invoked when the server receives a newly created stream from the
// client.
-func newConnection(conn *spdystream.Connection, newStreamHandler httpstream.NewStreamHandler) httpstream.Connection {
- c := &connection{conn: conn, newStreamHandler: newStreamHandler}
+func newConnection(conn *spdystream.Connection, newStreamHandler httpstream.NewStreamHandler, pingPeriod time.Duration, pingFn func() (time.Duration, error)) httpstream.Connection {
+ c := &connection{conn: conn, newStreamHandler: newStreamHandler, ping: pingFn}
go conn.Serve(c.newSpdyStream)
+ if pingPeriod > 0 && pingFn != nil {
+ go c.sendPings(pingPeriod)
+ }
return c
}
@@ -143,3 +167,21 @@ func (c *connection) newSpdyStream(stream *spdystream.Stream) {
func (c *connection) SetIdleTimeout(timeout time.Duration) {
c.conn.SetIdleTimeout(timeout)
}
+
+func (c *connection) sendPings(period time.Duration) {
+ t := time.NewTicker(period)
+ defer t.Stop()
+ for {
+ select {
+ case <-c.conn.CloseChan():
+ return
+ case <-t.C:
+ }
+ if _, err := c.ping(); err != nil {
+ klog.V(3).Infof("SPDY Ping failed: %v", err)
+ // Continue, in case this is a transient failure.
+ // c.conn.CloseChan above will tell us when the connection is
+ // actually closed.
+ }
+ }
+}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go
index 6309fbc26..4cb1cfadc 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go
@@ -30,6 +30,7 @@ import (
"net/http/httputil"
"net/url"
"strings"
+ "time"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -70,6 +71,9 @@ type SpdyRoundTripper struct {
// requireSameHostRedirects restricts redirect following to only follow redirects to the same host
// as the original request.
requireSameHostRedirects bool
+ // pingPeriod is a period for sending Ping frames over established
+ // connections.
+ pingPeriod time.Duration
}
var _ utilnet.TLSClientConfigHolder = &SpdyRoundTripper{}
@@ -79,20 +83,53 @@ var _ utilnet.Dialer = &SpdyRoundTripper{}
// NewRoundTripper creates a new SpdyRoundTripper that will use the specified
// tlsConfig.
func NewRoundTripper(tlsConfig *tls.Config, followRedirects, requireSameHostRedirects bool) *SpdyRoundTripper {
- return NewRoundTripperWithProxy(tlsConfig, followRedirects, requireSameHostRedirects, utilnet.NewProxierWithNoProxyCIDR(http.ProxyFromEnvironment))
+ return NewRoundTripperWithConfig(RoundTripperConfig{
+ TLS: tlsConfig,
+ FollowRedirects: followRedirects,
+ RequireSameHostRedirects: requireSameHostRedirects,
+ })
}
// NewRoundTripperWithProxy creates a new SpdyRoundTripper that will use the
// specified tlsConfig and proxy func.
func NewRoundTripperWithProxy(tlsConfig *tls.Config, followRedirects, requireSameHostRedirects bool, proxier func(*http.Request) (*url.URL, error)) *SpdyRoundTripper {
+ return NewRoundTripperWithConfig(RoundTripperConfig{
+ TLS: tlsConfig,
+ FollowRedirects: followRedirects,
+ RequireSameHostRedirects: requireSameHostRedirects,
+ Proxier: proxier,
+ })
+}
+
+// NewRoundTripperWithProxy creates a new SpdyRoundTripper with the specified
+// configuration.
+func NewRoundTripperWithConfig(cfg RoundTripperConfig) *SpdyRoundTripper {
+ if cfg.Proxier == nil {
+ cfg.Proxier = utilnet.NewProxierWithNoProxyCIDR(http.ProxyFromEnvironment)
+ }
return &SpdyRoundTripper{
- tlsConfig: tlsConfig,
- followRedirects: followRedirects,
- requireSameHostRedirects: requireSameHostRedirects,
- proxier: proxier,
+ tlsConfig: cfg.TLS,
+ followRedirects: cfg.FollowRedirects,
+ requireSameHostRedirects: cfg.RequireSameHostRedirects,
+ proxier: cfg.Proxier,
+ pingPeriod: cfg.PingPeriod,
}
}
+// RoundTripperConfig is a set of options for an SpdyRoundTripper.
+type RoundTripperConfig struct {
+ // TLS configuration used by the round tripper.
+ TLS *tls.Config
+ // Proxier is a proxy function invoked on each request. Optional.
+ Proxier func(*http.Request) (*url.URL, error)
+ // PingPeriod is a period for sending SPDY Pings on the connection.
+ // Optional.
+ PingPeriod time.Duration
+
+ FollowRedirects bool
+ RequireSameHostRedirects bool
+}
+
// TLSClientConfig implements pkg/util/net.TLSClientConfigHolder for proper TLS checking during
// proxying with a spdy roundtripper.
func (s *SpdyRoundTripper) TLSClientConfig() *tls.Config {
@@ -316,7 +353,7 @@ func (s *SpdyRoundTripper) NewConnection(resp *http.Response) (httpstream.Connec
return nil, fmt.Errorf("unable to upgrade connection: %s", responseError)
}
- return NewClientConnection(s.conn)
+ return NewClientConnectionWithPings(s.conn, s.pingPeriod)
}
// statusScheme is private scheme for the decoding here until someone fixes the TODO in NewConnection
diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade.go b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade.go
index 045d214d2..f17eb09e9 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade.go
@@ -24,6 +24,7 @@ import (
"net/http"
"strings"
"sync/atomic"
+ "time"
"k8s.io/apimachinery/pkg/util/httpstream"
"k8s.io/apimachinery/pkg/util/runtime"
@@ -34,6 +35,7 @@ const HeaderSpdy31 = "SPDY/3.1"
// responseUpgrader knows how to upgrade HTTP responses. It
// implements the httpstream.ResponseUpgrader interface.
type responseUpgrader struct {
+ pingPeriod time.Duration
}
// connWrapper is used to wrap a hijacked connection and its bufio.Reader. All
@@ -64,7 +66,18 @@ func (w *connWrapper) Close() error {
// capable of upgrading HTTP responses using SPDY/3.1 via the
// spdystream package.
func NewResponseUpgrader() httpstream.ResponseUpgrader {
- return responseUpgrader{}
+ return NewResponseUpgraderWithPings(0)
+}
+
+// NewResponseUpgraderWithPings returns a new httpstream.ResponseUpgrader that
+// is capable of upgrading HTTP responses using SPDY/3.1 via the spdystream
+// package.
+//
+// If pingPeriod is non-zero, for each incoming connection a background
+// goroutine will send periodic Ping frames to the server. Use this to keep
+// idle connections through certain load balancers alive longer.
+func NewResponseUpgraderWithPings(pingPeriod time.Duration) httpstream.ResponseUpgrader {
+ return responseUpgrader{pingPeriod: pingPeriod}
}
// UpgradeResponse upgrades an HTTP response to one that supports multiplexed
@@ -97,7 +110,7 @@ func (u responseUpgrader) UpgradeResponse(w http.ResponseWriter, req *http.Reque
}
connWithBuf := &connWrapper{Conn: conn, bufReader: bufrw.Reader}
- spdyConn, err := NewServerConnection(connWithBuf, newStreamHandler)
+ spdyConn, err := NewServerConnectionWithPings(connWithBuf, newStreamHandler, u.pingPeriod)
if err != nil {
runtime.HandleError(fmt.Errorf("unable to upgrade: error creating SPDY server connection: %v", err))
return nil
diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto b/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto
index e79fb9e57..a76f79851 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto
+++ b/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto
@@ -17,7 +17,7 @@ limitations under the License.
// This file was autogenerated by go-to-protobuf. Do not edit it manually!
-syntax = 'proto2';
+syntax = "proto2";
package k8s.io.apimachinery.pkg.util.intstr;
diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/instr_fuzz.go b/vendor/k8s.io/apimachinery/pkg/util/intstr/instr_fuzz.go
new file mode 100644
index 000000000..2501d5516
--- /dev/null
+++ b/vendor/k8s.io/apimachinery/pkg/util/intstr/instr_fuzz.go
@@ -0,0 +1,42 @@
+// +build !notest
+
+/*
+Copyright 2020 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package intstr
+
+import (
+ fuzz "github.com/google/gofuzz"
+)
+
+// Fuzz satisfies fuzz.Interface
+func (intstr *IntOrString) Fuzz(c fuzz.Continue) {
+ if intstr == nil {
+ return
+ }
+ if c.RandBool() {
+ intstr.Type = Int
+ c.Fuzz(&intstr.IntVal)
+ intstr.StrVal = ""
+ } else {
+ intstr.Type = String
+ intstr.IntVal = 0
+ c.Fuzz(&intstr.StrVal)
+ }
+}
+
+// ensure IntOrString implements fuzz.Interface
+var _ fuzz.Interface = &IntOrString{}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go b/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go
index 6576def82..c0e8927fe 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go
@@ -25,7 +25,6 @@ import (
"strconv"
"strings"
- "github.com/google/gofuzz"
"k8s.io/klog/v2"
)
@@ -90,6 +89,9 @@ func (intstr *IntOrString) UnmarshalJSON(value []byte) error {
// String returns the string value, or the Itoa of the int value.
func (intstr *IntOrString) String() string {
+ if intstr == nil {
+ return "<nil>"
+ }
if intstr.Type == String {
return intstr.StrVal
}
@@ -129,21 +131,6 @@ func (IntOrString) OpenAPISchemaType() []string { return []string{"string"} }
// the OpenAPI spec of this type.
func (IntOrString) OpenAPISchemaFormat() string { return "int-or-string" }
-func (intstr *IntOrString) Fuzz(c fuzz.Continue) {
- if intstr == nil {
- return
- }
- if c.RandBool() {
- intstr.Type = Int
- c.Fuzz(&intstr.IntVal)
- intstr.StrVal = ""
- } else {
- intstr.Type = String
- intstr.IntVal = 0
- c.Fuzz(&intstr.StrVal)
- }
-}
-
func ValueOrDefault(intOrPercent *IntOrString, defaultValue IntOrString) *IntOrString {
if intOrPercent == nil {
return &defaultValue
@@ -151,6 +138,33 @@ func ValueOrDefault(intOrPercent *IntOrString, defaultValue IntOrString) *IntOrS
return intOrPercent
}
+// GetScaledValueFromIntOrPercent is meant to replace GetValueFromIntOrPercent.
+// This method returns a scaled value from an IntOrString type. If the IntOrString
+// is a percentage string value it's treated as a percentage and scaled appropriately
+// in accordance to the total, if it's an int value it's treated as a a simple value and
+// if it is a string value which is either non-numeric or numeric but lacking a trailing '%' it returns an error.
+func GetScaledValueFromIntOrPercent(intOrPercent *IntOrString, total int, roundUp bool) (int, error) {
+ if intOrPercent == nil {
+ return 0, errors.New("nil value for IntOrString")
+ }
+ value, isPercent, err := getIntOrPercentValueSafely(intOrPercent)
+ if err != nil {
+ return 0, fmt.Errorf("invalid value for IntOrString: %v", err)
+ }
+ if isPercent {
+ if roundUp {
+ value = int(math.Ceil(float64(value) * (float64(total)) / 100))
+ } else {
+ value = int(math.Floor(float64(value) * (float64(total)) / 100))
+ }
+ }
+ return value, nil
+}
+
+// GetValueFromIntOrPercent was deprecated in favor of
+// GetScaledValueFromIntOrPercent. This method was treating all int as a numeric value and all
+// strings with or without a percent symbol as a percentage value.
+// Deprecated
func GetValueFromIntOrPercent(intOrPercent *IntOrString, total int, roundUp bool) (int, error) {
if intOrPercent == nil {
return 0, errors.New("nil value for IntOrString")
@@ -169,6 +183,8 @@ func GetValueFromIntOrPercent(intOrPercent *IntOrString, total int, roundUp bool
return value, nil
}
+// getIntOrPercentValue is a legacy function and only meant to be called by GetValueFromIntOrPercent
+// For a more correct implementation call getIntOrPercentSafely
func getIntOrPercentValue(intOrStr *IntOrString) (int, bool, error) {
switch intOrStr.Type {
case Int:
@@ -183,3 +199,25 @@ func getIntOrPercentValue(intOrStr *IntOrString) (int, bool, error) {
}
return 0, false, fmt.Errorf("invalid type: neither int nor percentage")
}
+
+func getIntOrPercentValueSafely(intOrStr *IntOrString) (int, bool, error) {
+ switch intOrStr.Type {
+ case Int:
+ return intOrStr.IntValue(), false, nil
+ case String:
+ isPercent := false
+ s := intOrStr.StrVal
+ if strings.HasSuffix(s, "%") {
+ isPercent = true
+ s = strings.TrimSuffix(intOrStr.StrVal, "%")
+ } else {
+ return 0, false, fmt.Errorf("invalid type: string is not a percentage")
+ }
+ v, err := strconv.Atoi(s)
+ if err != nil {
+ return 0, false, fmt.Errorf("invalid value %q: %v", intOrStr.StrVal, err)
+ }
+ return int(v), isPercent, nil
+ }
+ return 0, false, fmt.Errorf("invalid type: neither int nor percentage")
+}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/json/json.go b/vendor/k8s.io/apimachinery/pkg/util/json/json.go
index 204834883..778e58f70 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/json/json.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/json/json.go
@@ -39,7 +39,8 @@ func Marshal(v interface{}) ([]byte, error) {
const maxDepth = 10000
// Unmarshal unmarshals the given data
-// If v is a *map[string]interface{}, numbers are converted to int64 or float64
+// If v is a *map[string]interface{}, *[]interface{}, or *interface{} numbers
+// are converted to int64 or float64
func Unmarshal(data []byte, v interface{}) error {
switch v := v.(type) {
case *map[string]interface{}:
@@ -52,7 +53,7 @@ func Unmarshal(data []byte, v interface{}) error {
return err
}
// If the decode succeeds, post-process the map to convert json.Number objects to int64 or float64
- return convertMapNumbers(*v, 0)
+ return ConvertMapNumbers(*v, 0)
case *[]interface{}:
// Build a decoder from the given data
@@ -64,7 +65,7 @@ func Unmarshal(data []byte, v interface{}) error {
return err
}
// If the decode succeeds, post-process the map to convert json.Number objects to int64 or float64
- return convertSliceNumbers(*v, 0)
+ return ConvertSliceNumbers(*v, 0)
case *interface{}:
// Build a decoder from the given data
@@ -76,29 +77,31 @@ func Unmarshal(data []byte, v interface{}) error {
return err
}
// If the decode succeeds, post-process the map to convert json.Number objects to int64 or float64
- return convertInterfaceNumbers(v, 0)
+ return ConvertInterfaceNumbers(v, 0)
default:
return json.Unmarshal(data, v)
}
}
-func convertInterfaceNumbers(v *interface{}, depth int) error {
+// ConvertInterfaceNumbers converts any json.Number values to int64 or float64.
+// Values which are map[string]interface{} or []interface{} are recursively visited
+func ConvertInterfaceNumbers(v *interface{}, depth int) error {
var err error
switch v2 := (*v).(type) {
case json.Number:
*v, err = convertNumber(v2)
case map[string]interface{}:
- err = convertMapNumbers(v2, depth+1)
+ err = ConvertMapNumbers(v2, depth+1)
case []interface{}:
- err = convertSliceNumbers(v2, depth+1)
+ err = ConvertSliceNumbers(v2, depth+1)
}
return err
}
-// convertMapNumbers traverses the map, converting any json.Number values to int64 or float64.
+// ConvertMapNumbers traverses the map, converting any json.Number values to int64 or float64.
// values which are map[string]interface{} or []interface{} are recursively visited
-func convertMapNumbers(m map[string]interface{}, depth int) error {
+func ConvertMapNumbers(m map[string]interface{}, depth int) error {
if depth > maxDepth {
return fmt.Errorf("exceeded max depth of %d", maxDepth)
}
@@ -109,9 +112,9 @@ func convertMapNumbers(m map[string]interface{}, depth int) error {
case json.Number:
m[k], err = convertNumber(v)
case map[string]interface{}:
- err = convertMapNumbers(v, depth+1)
+ err = ConvertMapNumbers(v, depth+1)
case []interface{}:
- err = convertSliceNumbers(v, depth+1)
+ err = ConvertSliceNumbers(v, depth+1)
}
if err != nil {
return err
@@ -120,9 +123,9 @@ func convertMapNumbers(m map[string]interface{}, depth int) error {
return nil
}
-// convertSliceNumbers traverses the slice, converting any json.Number values to int64 or float64.
+// ConvertSliceNumbers traverses the slice, converting any json.Number values to int64 or float64.
// values which are map[string]interface{} or []interface{} are recursively visited
-func convertSliceNumbers(s []interface{}, depth int) error {
+func ConvertSliceNumbers(s []interface{}, depth int) error {
if depth > maxDepth {
return fmt.Errorf("exceeded max depth of %d", maxDepth)
}
@@ -133,9 +136,9 @@ func convertSliceNumbers(s []interface{}, depth int) error {
case json.Number:
s[i], err = convertNumber(v)
case map[string]interface{}:
- err = convertMapNumbers(v, depth+1)
+ err = ConvertMapNumbers(v, depth+1)
case []interface{}:
- err = convertSliceNumbers(v, depth+1)
+ err = ConvertSliceNumbers(v, depth+1)
}
if err != nil {
return err
diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/http.go b/vendor/k8s.io/apimachinery/pkg/util/net/http.go
index 945886c43..ba63d02df 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/net/http.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/net/http.go
@@ -33,6 +33,7 @@ import (
"regexp"
"strconv"
"strings"
+ "time"
"unicode"
"unicode/utf8"
@@ -132,13 +133,61 @@ func SetTransportDefaults(t *http.Transport) *http.Transport {
if s := os.Getenv("DISABLE_HTTP2"); len(s) > 0 {
klog.Infof("HTTP2 has been explicitly disabled")
} else if allowsHTTP2(t) {
- if err := http2.ConfigureTransport(t); err != nil {
+ if err := configureHTTP2Transport(t); err != nil {
klog.Warningf("Transport failed http2 configuration: %v", err)
}
}
return t
}
+func readIdleTimeoutSeconds() int {
+ ret := 30
+ // User can set the readIdleTimeout to 0 to disable the HTTP/2
+ // connection health check.
+ if s := os.Getenv("HTTP2_READ_IDLE_TIMEOUT_SECONDS"); len(s) > 0 {
+ i, err := strconv.Atoi(s)
+ if err != nil {
+ klog.Warningf("Illegal HTTP2_READ_IDLE_TIMEOUT_SECONDS(%q): %v."+
+ " Default value %d is used", s, err, ret)
+ return ret
+ }
+ ret = i
+ }
+ return ret
+}
+
+func pingTimeoutSeconds() int {
+ ret := 15
+ if s := os.Getenv("HTTP2_PING_TIMEOUT_SECONDS"); len(s) > 0 {
+ i, err := strconv.Atoi(s)
+ if err != nil {
+ klog.Warningf("Illegal HTTP2_PING_TIMEOUT_SECONDS(%q): %v."+
+ " Default value %d is used", s, err, ret)
+ return ret
+ }
+ ret = i
+ }
+ return ret
+}
+
+func configureHTTP2Transport(t *http.Transport) error {
+ t2, err := http2.ConfigureTransports(t)
+ if err != nil {
+ return err
+ }
+ // The following enables the HTTP/2 connection health check added in
+ // https://github.com/golang/net/pull/55. The health check detects and
+ // closes broken transport layer connections. Without the health check,
+ // a broken connection can linger too long, e.g., a broken TCP
+ // connection will be closed by the Linux kernel after 13 to 30 minutes
+ // by default, which caused
+ // https://github.com/kubernetes/client-go/issues/374 and
+ // https://github.com/kubernetes/kubernetes/issues/87615.
+ t2.ReadIdleTimeout = time.Duration(readIdleTimeoutSeconds()) * time.Second
+ t2.PingTimeout = time.Duration(pingTimeoutSeconds()) * time.Second
+ return nil
+}
+
func allowsHTTP2(t *http.Transport) bool {
if t.TLSClientConfig == nil || len(t.TLSClientConfig.NextProtos) == 0 {
// the transport expressed no NextProto preference, allow
diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/port_range.go b/vendor/k8s.io/apimachinery/pkg/util/net/port_range.go
index 7b6eca893..42ecffcca 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/net/port_range.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/net/port_range.go
@@ -130,7 +130,7 @@ func (*PortRange) Type() string {
}
// ParsePortRange parses a string of the form "min-max", inclusive at both
-// ends, and initializs a new PortRange from it.
+// ends, and initializes a new PortRange from it.
func ParsePortRange(value string) (*PortRange, error) {
pr := &PortRange{}
err := pr.Set(value)
diff --git a/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go b/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go
index e8a9f609f..035c52811 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go
@@ -79,7 +79,7 @@ func logPanic(r interface{}) {
}
}
-// ErrorHandlers is a list of functions which will be invoked when an unreturnable
+// ErrorHandlers is a list of functions which will be invoked when a nonreturnable
// error occurs.
// TODO(lavalamp): for testability, this and the below HandleError function
// should be packaged up into a testable and reusable object.
@@ -165,7 +165,7 @@ func RecoverFromPanic(err *error) {
}
}
-// Must panics on non-nil errors. Useful to handling programmer level errors.
+// Must panics on non-nil errors. Useful to handling programmer level errors.
func Must(err error) {
if err != nil {
panic(err)
diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go b/vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go
index 2efc8eec7..f9be7ac33 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go
@@ -67,6 +67,9 @@ func (p *Path) Key(key string) *Path {
// String produces a string representation of the Path.
func (p *Path) String() string {
+ if p == nil {
+ return "<nil>"
+ }
// make a slice to iterate
elems := []*Path{}
for ; p != nil; p = p.parent {
diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go b/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go
index 4752b29a9..c8b419984 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go
@@ -175,7 +175,7 @@ func IsValidLabelValue(value string) []string {
}
const dns1123LabelFmt string = "[a-z0-9]([-a-z0-9]*[a-z0-9])?"
-const dns1123LabelErrMsg string = "a DNS-1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character"
+const dns1123LabelErrMsg string = "a lowercase RFC 1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character"
// DNS1123LabelMaxLength is a label's max length in DNS (RFC 1123)
const DNS1123LabelMaxLength int = 63
@@ -196,7 +196,7 @@ func IsDNS1123Label(value string) []string {
}
const dns1123SubdomainFmt string = dns1123LabelFmt + "(\\." + dns1123LabelFmt + ")*"
-const dns1123SubdomainErrorMsg string = "a DNS-1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character"
+const dns1123SubdomainErrorMsg string = "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character"
// DNS1123SubdomainMaxLength is a subdomain's max length in DNS (RFC 1123)
const DNS1123SubdomainMaxLength int = 253
@@ -347,7 +347,7 @@ func IsValidPortName(port string) []string {
// IsValidIP tests that the argument is a valid IP address.
func IsValidIP(value string) []string {
if net.ParseIP(value) == nil {
- return []string{"must be a valid IP address, (e.g. 10.9.8.7)"}
+ return []string{"must be a valid IP address, (e.g. 10.9.8.7 or 2001:db8::ffff)"}
}
return nil
}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/yaml/decoder.go b/vendor/k8s.io/apimachinery/pkg/util/yaml/decoder.go
index 492171faf..7fe706467 100644
--- a/vendor/k8s.io/apimachinery/pkg/util/yaml/decoder.go
+++ b/vendor/k8s.io/apimachinery/pkg/util/yaml/decoder.go
@@ -26,10 +26,41 @@ import (
"strings"
"unicode"
+ jsonutil "k8s.io/apimachinery/pkg/util/json"
+
"k8s.io/klog/v2"
"sigs.k8s.io/yaml"
)
+// Unmarshal unmarshals the given data
+// If v is a *map[string]interface{}, *[]interface{}, or *interface{} numbers
+// are converted to int64 or float64
+func Unmarshal(data []byte, v interface{}) error {
+ preserveIntFloat := func(d *json.Decoder) *json.Decoder {
+ d.UseNumber()
+ return d
+ }
+ switch v := v.(type) {
+ case *map[string]interface{}:
+ if err := yaml.Unmarshal(data, v, preserveIntFloat); err != nil {
+ return err
+ }
+ return jsonutil.ConvertMapNumbers(*v, 0)
+ case *[]interface{}:
+ if err := yaml.Unmarshal(data, v, preserveIntFloat); err != nil {
+ return err
+ }
+ return jsonutil.ConvertSliceNumbers(*v, 0)
+ case *interface{}:
+ if err := yaml.Unmarshal(data, v, preserveIntFloat); err != nil {
+ return err
+ }
+ return jsonutil.ConvertInterfaceNumbers(v, 0)
+ default:
+ return yaml.Unmarshal(data, v)
+ }
+}
+
// ToJSON converts a single YAML document into a JSON document
// or returns an error. If the document appears to be JSON the
// YAML decoding path is not used (so that error messages are
diff --git a/vendor/k8s.io/apimachinery/pkg/watch/mux.go b/vendor/k8s.io/apimachinery/pkg/watch/mux.go
index 0ac8dc4ef..0aaf01adc 100644
--- a/vendor/k8s.io/apimachinery/pkg/watch/mux.go
+++ b/vendor/k8s.io/apimachinery/pkg/watch/mux.go
@@ -40,15 +40,12 @@ const incomingQueueLength = 25
// Broadcaster distributes event notifications among any number of watchers. Every event
// is delivered to every watcher.
type Broadcaster struct {
- // TODO: see if this lock is needed now that new watchers go through
- // the incoming channel.
- lock sync.Mutex
-
watchers map[int64]*broadcasterWatcher
nextWatcher int64
distributing sync.WaitGroup
incoming chan Event
+ stopped chan struct{}
// How large to make watcher's channel.
watchQueueLength int
@@ -68,6 +65,7 @@ func NewBroadcaster(queueLength int, fullChannelBehavior FullChannelBehavior) *B
m := &Broadcaster{
watchers: map[int64]*broadcasterWatcher{},
incoming: make(chan Event, incomingQueueLength),
+ stopped: make(chan struct{}),
watchQueueLength: queueLength,
fullChannelBehavior: fullChannelBehavior,
}
@@ -96,10 +94,15 @@ func (obj functionFakeRuntimeObject) DeepCopyObject() runtime.Object {
// The purpose of this terrible hack is so that watchers added after an event
// won't ever see that event, and will always see any event after they are
// added.
-func (b *Broadcaster) blockQueue(f func()) {
+func (m *Broadcaster) blockQueue(f func()) {
+ select {
+ case <-m.stopped:
+ return
+ default:
+ }
var wg sync.WaitGroup
wg.Add(1)
- b.incoming <- Event{
+ m.incoming <- Event{
Type: internalRunFunctionMarker,
Object: functionFakeRuntimeObject(func() {
defer wg.Done()
@@ -111,12 +114,11 @@ func (b *Broadcaster) blockQueue(f func()) {
// Watch adds a new watcher to the list and returns an Interface for it.
// Note: new watchers will only receive new events. They won't get an entire history
-// of previous events.
+// of previous events. It will block until the watcher is actually added to the
+// broadcaster.
func (m *Broadcaster) Watch() Interface {
var w *broadcasterWatcher
m.blockQueue(func() {
- m.lock.Lock()
- defer m.lock.Unlock()
id := m.nextWatcher
m.nextWatcher++
w = &broadcasterWatcher{
@@ -127,18 +129,22 @@ func (m *Broadcaster) Watch() Interface {
}
m.watchers[id] = w
})
+ if w == nil {
+ // The panic here is to be consistent with the previous interface behavior
+ // we are willing to re-evaluate in the future.
+ panic("broadcaster already stopped")
+ }
return w
}
// WatchWithPrefix adds a new watcher to the list and returns an Interface for it. It sends
// queuedEvents down the new watch before beginning to send ordinary events from Broadcaster.
// The returned watch will have a queue length that is at least large enough to accommodate
-// all of the items in queuedEvents.
+// all of the items in queuedEvents. It will block until the watcher is actually added to
+// the broadcaster.
func (m *Broadcaster) WatchWithPrefix(queuedEvents []Event) Interface {
var w *broadcasterWatcher
m.blockQueue(func() {
- m.lock.Lock()
- defer m.lock.Unlock()
id := m.nextWatcher
m.nextWatcher++
length := m.watchQueueLength
@@ -156,26 +162,29 @@ func (m *Broadcaster) WatchWithPrefix(queuedEvents []Event) Interface {
w.result <- e
}
})
+ if w == nil {
+ // The panic here is to be consistent with the previous interface behavior
+ // we are willing to re-evaluate in the future.
+ panic("broadcaster already stopped")
+ }
return w
}
// stopWatching stops the given watcher and removes it from the list.
func (m *Broadcaster) stopWatching(id int64) {
- m.lock.Lock()
- defer m.lock.Unlock()
- w, ok := m.watchers[id]
- if !ok {
- // No need to do anything, it's already been removed from the list.
- return
- }
- delete(m.watchers, id)
- close(w.result)
+ m.blockQueue(func() {
+ w, ok := m.watchers[id]
+ if !ok {
+ // No need to do anything, it's already been removed from the list.
+ return
+ }
+ delete(m.watchers, id)
+ close(w.result)
+ })
}
// closeAll disconnects all watchers (presumably in response to a Shutdown call).
func (m *Broadcaster) closeAll() {
- m.lock.Lock()
- defer m.lock.Unlock()
for _, w := range m.watchers {
close(w.result)
}
@@ -194,9 +203,12 @@ func (m *Broadcaster) Action(action EventType, obj runtime.Object) {
// until all events have been distributed through the outbound channels. Note
// that since they can be buffered, this means that the watchers might not
// have received the data yet as it can remain sitting in the buffered
-// channel.
+// channel. It will block until the broadcaster stop request is actually executed
func (m *Broadcaster) Shutdown() {
- close(m.incoming)
+ m.blockQueue(func() {
+ close(m.stopped)
+ close(m.incoming)
+ })
m.distributing.Wait()
}
@@ -217,8 +229,6 @@ func (m *Broadcaster) loop() {
// distribute sends event to all watchers. Blocking.
func (m *Broadcaster) distribute(event Event) {
- m.lock.Lock()
- defer m.lock.Unlock()
if m.fullChannelBehavior == DropIfChannelFull {
for _, w := range m.watchers {
select {
@@ -252,6 +262,7 @@ func (mw *broadcasterWatcher) ResultChan() <-chan Event {
}
// Stop stops watching and removes mw from its list.
+// It will block until the watcher stop request is actually executed
func (mw *broadcasterWatcher) Stop() {
mw.stop.Do(func() {
close(mw.stopped)
diff --git a/vendor/k8s.io/apimachinery/pkg/watch/streamwatcher.go b/vendor/k8s.io/apimachinery/pkg/watch/streamwatcher.go
index 8271e9b70..99f6770b9 100644
--- a/vendor/k8s.io/apimachinery/pkg/watch/streamwatcher.go
+++ b/vendor/k8s.io/apimachinery/pkg/watch/streamwatcher.go
@@ -97,9 +97,9 @@ func (sw *StreamWatcher) stopping() bool {
// receive reads result from the decoder in a loop and sends down the result channel.
func (sw *StreamWatcher) receive() {
+ defer utilruntime.HandleCrash()
defer close(sw.result)
defer sw.Stop()
- defer utilruntime.HandleCrash()
for {
action, obj, err := sw.source.Decode()
if err != nil {
diff --git a/vendor/k8s.io/apimachinery/pkg/watch/watch.go b/vendor/k8s.io/apimachinery/pkg/watch/watch.go
index 1f4911a31..fd0550e4a 100644
--- a/vendor/k8s.io/apimachinery/pkg/watch/watch.go
+++ b/vendor/k8s.io/apimachinery/pkg/watch/watch.go
@@ -276,7 +276,7 @@ func (f *RaceFreeFakeWatcher) Action(action EventType, obj runtime.Object) {
}
}
-// ProxyWatcher lets you wrap your channel in watch Interface. Threadsafe.
+// ProxyWatcher lets you wrap your channel in watch Interface. threadsafe.
type ProxyWatcher struct {
result chan Event
stopCh chan struct{}
diff --git a/vendor/k8s.io/klog/v2/README.md b/vendor/k8s.io/klog/v2/README.md
index 2f9f6f0d8..64d29622e 100644
--- a/vendor/k8s.io/klog/v2/README.md
+++ b/vendor/k8s.io/klog/v2/README.md
@@ -27,7 +27,7 @@ Historical context is available here:
How to use klog
===============
-- Replace imports for `github.com/golang/glog` with `k8s.io/klog`
+- Replace imports for `"github.com/golang/glog"` with `"k8s.io/klog/v2"`
- Use `klog.InitFlags(nil)` explicitly for initializing global flags as we no longer use `init()` method to register the flags
- You can now use `log_file` instead of `log_dir` for logging to a single file (See `examples/log_file/usage_log_file.go`)
- If you want to redirect everything logged using klog somewhere else (say syslog!), you can use `klog.SetOutput()` method and supply a `io.Writer`. (See `examples/set_output/usage_set_output.go`)
@@ -35,6 +35,10 @@ How to use klog
**NOTE**: please use the newer go versions that support semantic import versioning in modules, ideally go 1.11.4 or greater.
+### Coexisting with klog/v2
+
+See [this example](examples/coexist_klog_v1_and_v2/) to see how to coexist with both klog/v1 and klog/v2.
+
### Coexisting with glog
This package can be used side by side with glog. [This example](examples/coexist_glog/coexist_glog.go) shows how to initialize and synchronize flags from the global `flag.CommandLine` FlagSet. In addition, the example makes use of stderr as combined output by setting `alsologtostderr` (or `logtostderr`) to `true`.
diff --git a/vendor/k8s.io/klog/v2/SECURITY.md b/vendor/k8s.io/klog/v2/SECURITY.md
new file mode 100644
index 000000000..2083d44cd
--- /dev/null
+++ b/vendor/k8s.io/klog/v2/SECURITY.md
@@ -0,0 +1,22 @@
+# Security Policy
+
+## Security Announcements
+
+Join the [kubernetes-security-announce] group for security and vulnerability announcements.
+
+You can also subscribe to an RSS feed of the above using [this link][kubernetes-security-announce-rss].
+
+## Reporting a Vulnerability
+
+Instructions for reporting a vulnerability can be found on the
+[Kubernetes Security and Disclosure Information] page.
+
+## Supported Versions
+
+Information about supported Kubernetes versions can be found on the
+[Kubernetes version and version skew support policy] page on the Kubernetes website.
+
+[kubernetes-security-announce]: https://groups.google.com/forum/#!forum/kubernetes-security-announce
+[kubernetes-security-announce-rss]: https://groups.google.com/forum/feed/kubernetes-security-announce/msgs/rss_v2_0.xml?num=50
+[Kubernetes version and version skew support policy]: https://kubernetes.io/docs/setup/release/version-skew-policy/#supported-versions
+[Kubernetes Security and Disclosure Information]: https://kubernetes.io/docs/reference/issues-security/security/#report-a-vulnerability
diff --git a/vendor/k8s.io/klog/v2/klog.go b/vendor/k8s.io/klog/v2/klog.go
index ae2b86138..23cced625 100644
--- a/vendor/k8s.io/klog/v2/klog.go
+++ b/vendor/k8s.io/klog/v2/klog.go
@@ -413,6 +413,7 @@ func init() {
logging.skipHeaders = false
logging.addDirHeader = false
logging.skipLogHeaders = false
+ logging.oneOutput = false
go logging.flushDaemon()
}
@@ -432,6 +433,7 @@ func InitFlags(flagset *flag.FlagSet) {
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")
flagset.BoolVar(&logging.skipLogHeaders, "skip_log_headers", logging.skipLogHeaders, "If true, avoid headers when opening log files")
flagset.Var(&logging.stderrThreshold, "stderrthreshold", "logs at or above this threshold go to stderr")
flagset.Var(&logging.vmodule, "vmodule", "comma-separated list of pattern=N settings for file-filtered logging")
@@ -505,6 +507,12 @@ type loggingT struct {
// If set, all output will be redirected unconditionally to the provided logr.Logger
logr logr.Logger
+
+ // If true, messages will not be propagated to lower severity log levels
+ oneOutput bool
+
+ // If set, all output will be filtered through the filter.
+ filter LogFilter
}
// buffer holds a byte Buffer for reuse. The zero value is ready for use.
@@ -687,7 +695,7 @@ func (buf *buffer) someDigits(i, d int) int {
return copy(buf.tmp[i:], buf.tmp[j:])
}
-func (l *loggingT) println(s severity, logr logr.Logger, args ...interface{}) {
+func (l *loggingT) println(s severity, logr logr.Logger, filter LogFilter, args ...interface{}) {
buf, file, line := l.header(s, 0)
// if logr is set, we clear the generated header as we rely on the backing
// logr implementation to print headers
@@ -695,15 +703,18 @@ func (l *loggingT) println(s severity, logr logr.Logger, args ...interface{}) {
l.putBuffer(buf)
buf = l.getBuffer()
}
+ if filter != nil {
+ args = filter.Filter(args)
+ }
fmt.Fprintln(buf, args...)
l.output(s, logr, buf, file, line, false)
}
-func (l *loggingT) print(s severity, logr logr.Logger, args ...interface{}) {
- l.printDepth(s, logr, 1, args...)
+func (l *loggingT) print(s severity, logr logr.Logger, filter LogFilter, args ...interface{}) {
+ l.printDepth(s, logr, filter, 1, args...)
}
-func (l *loggingT) printDepth(s severity, logr logr.Logger, depth int, args ...interface{}) {
+func (l *loggingT) printDepth(s severity, logr logr.Logger, filter LogFilter, depth int, args ...interface{}) {
buf, file, line := l.header(s, depth)
// if logr is set, we clear the generated header as we rely on the backing
// logr implementation to print headers
@@ -711,6 +722,9 @@ func (l *loggingT) printDepth(s severity, logr logr.Logger, depth int, args ...i
l.putBuffer(buf)
buf = l.getBuffer()
}
+ if filter != nil {
+ args = filter.Filter(args)
+ }
fmt.Fprint(buf, args...)
if buf.Bytes()[buf.Len()-1] != '\n' {
buf.WriteByte('\n')
@@ -718,7 +732,7 @@ func (l *loggingT) printDepth(s severity, logr logr.Logger, depth int, args ...i
l.output(s, logr, buf, file, line, false)
}
-func (l *loggingT) printf(s severity, logr logr.Logger, format string, args ...interface{}) {
+func (l *loggingT) printf(s severity, logr logr.Logger, filter LogFilter, format string, args ...interface{}) {
buf, file, line := l.header(s, 0)
// if logr is set, we clear the generated header as we rely on the backing
// logr implementation to print headers
@@ -726,6 +740,9 @@ func (l *loggingT) printf(s severity, logr logr.Logger, format string, args ...i
l.putBuffer(buf)
buf = l.getBuffer()
}
+ if filter != nil {
+ format, args = filter.FilterF(format, args)
+ }
fmt.Fprintf(buf, format, args...)
if buf.Bytes()[buf.Len()-1] != '\n' {
buf.WriteByte('\n')
@@ -736,7 +753,7 @@ func (l *loggingT) printf(s severity, logr logr.Logger, format string, args ...i
// printWithFileLine behaves like print but uses the provided file and line number. If
// alsoLogToStderr is true, the log message always appears on standard error; it
// will also appear in the log file unless --logtostderr is set.
-func (l *loggingT) printWithFileLine(s severity, logr logr.Logger, file string, line int, alsoToStderr bool, args ...interface{}) {
+func (l *loggingT) printWithFileLine(s severity, logr logr.Logger, filter LogFilter, file string, line int, alsoToStderr bool, args ...interface{}) {
buf := l.formatHeader(s, file, line)
// if logr is set, we clear the generated header as we rely on the backing
// logr implementation to print headers
@@ -744,6 +761,9 @@ func (l *loggingT) printWithFileLine(s severity, logr logr.Logger, file string,
l.putBuffer(buf)
buf = l.getBuffer()
}
+ if filter != nil {
+ args = filter.Filter(args)
+ }
fmt.Fprint(buf, args...)
if buf.Bytes()[buf.Len()-1] != '\n' {
buf.WriteByte('\n')
@@ -752,18 +772,24 @@ func (l *loggingT) printWithFileLine(s severity, logr logr.Logger, file string,
}
// if loggr is specified, will call loggr.Error, otherwise output with logging module.
-func (l *loggingT) errorS(err error, loggr logr.Logger, msg string, keysAndValues ...interface{}) {
+func (l *loggingT) errorS(err error, loggr logr.Logger, filter LogFilter, msg string, keysAndValues ...interface{}) {
+ if filter != nil {
+ msg, keysAndValues = filter.FilterS(msg, keysAndValues)
+ }
if loggr != nil {
- loggr.Error(err, msg, keysAndValues)
+ loggr.Error(err, msg, keysAndValues...)
return
}
l.printS(err, msg, keysAndValues...)
}
// if loggr is specified, will call loggr.Info, otherwise output with logging module.
-func (l *loggingT) infoS(loggr logr.Logger, msg string, keysAndValues ...interface{}) {
+func (l *loggingT) infoS(loggr logr.Logger, filter LogFilter, msg string, keysAndValues ...interface{}) {
+ if filter != nil {
+ msg, keysAndValues = filter.FilterS(msg, keysAndValues)
+ }
if loggr != nil {
- loggr.Info(msg, keysAndValues)
+ loggr.Info(msg, keysAndValues...)
return
}
l.printS(nil, msg, keysAndValues...)
@@ -785,7 +811,7 @@ func (l *loggingT) printS(err error, msg string, keysAndValues ...interface{}) {
} else {
s = errorLog
}
- l.printDepth(s, logging.logr, 2, b)
+ l.printDepth(s, logging.logr, nil, 2, b)
}
const missingValue = "(MISSING)"
@@ -919,18 +945,22 @@ func (l *loggingT) output(s severity, log logr.Logger, buf *buffer, file string,
}
}
- switch s {
- case fatalLog:
- l.file[fatalLog].Write(data)
- fallthrough
- case errorLog:
- l.file[errorLog].Write(data)
- fallthrough
- case warningLog:
- l.file[warningLog].Write(data)
- fallthrough
- case infoLog:
- l.file[infoLog].Write(data)
+ if l.oneOutput {
+ l.file[s].Write(data)
+ } else {
+ switch s {
+ case fatalLog:
+ l.file[fatalLog].Write(data)
+ fallthrough
+ case errorLog:
+ l.file[errorLog].Write(data)
+ fallthrough
+ case warningLog:
+ l.file[warningLog].Write(data)
+ fallthrough
+ case infoLog:
+ l.file[infoLog].Write(data)
+ }
}
}
}
@@ -1077,11 +1107,19 @@ func (sb *syncBuffer) rotateFile(now time.Time, startup bool) error {
}
var err error
sb.file, _, err = create(severityName[sb.sev], now, startup)
- sb.nbytes = 0
if err != nil {
return err
}
-
+ if startup {
+ fileInfo, err := sb.file.Stat()
+ if err != nil {
+ return fmt.Errorf("file stat could not get fileinfo: %v", err)
+ }
+ // init file size
+ sb.nbytes = uint64(fileInfo.Size())
+ } else {
+ sb.nbytes = 0
+ }
sb.Writer = bufio.NewWriterSize(sb.file, bufferSize)
if sb.logger.skipLogHeaders {
@@ -1197,7 +1235,7 @@ func (lb logBridge) Write(b []byte) (n int, err error) {
}
// printWithFileLine with alsoToStderr=true, so standard log messages
// always appear on standard error.
- logging.printWithFileLine(severity(lb), logging.logr, file, line, true, text)
+ logging.printWithFileLine(severity(lb), logging.logr, logging.filter, file, line, true, text)
return len(b), nil
}
@@ -1232,13 +1270,14 @@ func (l *loggingT) setV(pc uintptr) Level {
type Verbose struct {
enabled bool
logr logr.Logger
+ filter LogFilter
}
func newVerbose(level Level, b bool) Verbose {
if logging.logr == nil {
- return Verbose{b, nil}
+ return Verbose{b, nil, logging.filter}
}
- return Verbose{b, logging.logr.V(int(level))}
+ return Verbose{b, logging.logr.V(int(level)), logging.filter}
}
// V reports whether verbosity at the call site is at least the requested level.
@@ -1265,7 +1304,7 @@ func V(level Level) Verbose {
return newVerbose(level, true)
}
- // It's off globally but it vmodule may still be set.
+ // It's off globally but vmodule may still be set.
// Here is another cheap but safe test to see if vmodule is enabled.
if atomic.LoadInt32(&logging.filterLength) > 0 {
// Now we need a proper lock to use the logging structure. The pcs field
@@ -1296,7 +1335,7 @@ func (v Verbose) Enabled() bool {
// See the documentation of V for usage.
func (v Verbose) Info(args ...interface{}) {
if v.enabled {
- logging.print(infoLog, v.logr, args...)
+ logging.print(infoLog, v.logr, v.filter, args...)
}
}
@@ -1304,7 +1343,7 @@ func (v Verbose) Info(args ...interface{}) {
// See the documentation of V for usage.
func (v Verbose) Infoln(args ...interface{}) {
if v.enabled {
- logging.println(infoLog, v.logr, args...)
+ logging.println(infoLog, v.logr, v.filter, args...)
}
}
@@ -1312,7 +1351,7 @@ func (v Verbose) Infoln(args ...interface{}) {
// See the documentation of V for usage.
func (v Verbose) Infof(format string, args ...interface{}) {
if v.enabled {
- logging.printf(infoLog, v.logr, format, args...)
+ logging.printf(infoLog, v.logr, v.filter, format, args...)
}
}
@@ -1320,40 +1359,47 @@ func (v Verbose) Infof(format string, args ...interface{}) {
// See the documentation of V for usage.
func (v Verbose) InfoS(msg string, keysAndValues ...interface{}) {
if v.enabled {
- logging.infoS(v.logr, msg, keysAndValues...)
+ logging.infoS(v.logr, v.filter, msg, keysAndValues...)
}
}
-// Error is equivalent to the global Error function, guarded by the value of v.
-// See the documentation of V for usage.
+// Deprecated: Use ErrorS instead.
func (v Verbose) Error(err error, msg string, args ...interface{}) {
if v.enabled {
- logging.errorS(err, v.logr, msg, args...)
+ logging.errorS(err, v.logr, v.filter, msg, args...)
+ }
+}
+
+// ErrorS is equivalent to the global Error function, guarded by the value of v.
+// See the documentation of V for usage.
+func (v Verbose) ErrorS(err error, msg string, keysAndValues ...interface{}) {
+ if v.enabled {
+ logging.errorS(err, v.logr, v.filter, msg, keysAndValues...)
}
}
// Info logs to the INFO log.
// Arguments are handled in the manner of fmt.Print; a newline is appended if missing.
func Info(args ...interface{}) {
- logging.print(infoLog, logging.logr, args...)
+ logging.print(infoLog, logging.logr, logging.filter, args...)
}
// InfoDepth acts as Info but uses depth to determine which call frame to log.
// InfoDepth(0, "msg") is the same as Info("msg").
func InfoDepth(depth int, args ...interface{}) {
- logging.printDepth(infoLog, logging.logr, depth, args...)
+ logging.printDepth(infoLog, logging.logr, logging.filter, depth, args...)
}
// Infoln logs to the INFO log.
// Arguments are handled in the manner of fmt.Println; a newline is always appended.
func Infoln(args ...interface{}) {
- logging.println(infoLog, logging.logr, args...)
+ logging.println(infoLog, logging.logr, logging.filter, args...)
}
// Infof logs to the INFO log.
// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing.
func Infof(format string, args ...interface{}) {
- logging.printf(infoLog, logging.logr, format, args...)
+ logging.printf(infoLog, logging.logr, logging.filter, format, args...)
}
// InfoS structured logs to the INFO log.
@@ -1365,55 +1411,55 @@ func Infof(format string, args ...interface{}) {
// output:
// >> I1025 00:15:15.525108 1 controller_utils.go:116] "Pod status updated" pod="kubedns" status="ready"
func InfoS(msg string, keysAndValues ...interface{}) {
- logging.infoS(logging.logr, msg, keysAndValues...)
+ logging.infoS(logging.logr, logging.filter, msg, keysAndValues...)
}
// Warning logs to the WARNING and INFO logs.
// Arguments are handled in the manner of fmt.Print; a newline is appended if missing.
func Warning(args ...interface{}) {
- logging.print(warningLog, logging.logr, args...)
+ logging.print(warningLog, logging.logr, logging.filter, args...)
}
// WarningDepth acts as Warning but uses depth to determine which call frame to log.
// WarningDepth(0, "msg") is the same as Warning("msg").
func WarningDepth(depth int, args ...interface{}) {
- logging.printDepth(warningLog, logging.logr, depth, args...)
+ logging.printDepth(warningLog, logging.logr, logging.filter, depth, args...)
}
// Warningln logs to the WARNING and INFO logs.
// Arguments are handled in the manner of fmt.Println; a newline is always appended.
func Warningln(args ...interface{}) {
- logging.println(warningLog, logging.logr, args...)
+ logging.println(warningLog, logging.logr, logging.filter, args...)
}
// Warningf logs to the WARNING and INFO logs.
// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing.
func Warningf(format string, args ...interface{}) {
- logging.printf(warningLog, logging.logr, format, args...)
+ logging.printf(warningLog, logging.logr, logging.filter, format, args...)
}
// Error logs to the ERROR, WARNING, and INFO logs.
// Arguments are handled in the manner of fmt.Print; a newline is appended if missing.
func Error(args ...interface{}) {
- logging.print(errorLog, logging.logr, args...)
+ logging.print(errorLog, logging.logr, logging.filter, args...)
}
// ErrorDepth acts as Error but uses depth to determine which call frame to log.
// ErrorDepth(0, "msg") is the same as Error("msg").
func ErrorDepth(depth int, args ...interface{}) {
- logging.printDepth(errorLog, logging.logr, depth, args...)
+ logging.printDepth(errorLog, logging.logr, logging.filter, depth, args...)
}
// Errorln logs to the ERROR, WARNING, and INFO logs.
// Arguments are handled in the manner of fmt.Println; a newline is always appended.
func Errorln(args ...interface{}) {
- logging.println(errorLog, logging.logr, args...)
+ logging.println(errorLog, logging.logr, logging.filter, args...)
}
// Errorf logs to the ERROR, WARNING, and INFO logs.
// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing.
func Errorf(format string, args ...interface{}) {
- logging.printf(errorLog, logging.logr, format, args...)
+ logging.printf(errorLog, logging.logr, logging.filter, format, args...)
}
// ErrorS structured logs to the ERROR, WARNING, and INFO logs.
@@ -1426,34 +1472,34 @@ func Errorf(format string, args ...interface{}) {
// output:
// >> E1025 00:15:15.525108 1 controller_utils.go:114] "Failed to update pod status" err="timeout"
func ErrorS(err error, msg string, keysAndValues ...interface{}) {
- logging.errorS(err, logging.logr, msg, keysAndValues...)
+ logging.errorS(err, logging.logr, logging.filter, msg, keysAndValues...)
}
// Fatal logs to the FATAL, ERROR, WARNING, and INFO logs,
// including a stack trace of all running goroutines, then calls os.Exit(255).
// Arguments are handled in the manner of fmt.Print; a newline is appended if missing.
func Fatal(args ...interface{}) {
- logging.print(fatalLog, logging.logr, args...)
+ logging.print(fatalLog, logging.logr, logging.filter, args...)
}
// FatalDepth acts as Fatal but uses depth to determine which call frame to log.
// FatalDepth(0, "msg") is the same as Fatal("msg").
func FatalDepth(depth int, args ...interface{}) {
- logging.printDepth(fatalLog, logging.logr, depth, args...)
+ logging.printDepth(fatalLog, logging.logr, logging.filter, depth, args...)
}
// Fatalln logs to the FATAL, ERROR, WARNING, and INFO logs,
// including a stack trace of all running goroutines, then calls os.Exit(255).
// Arguments are handled in the manner of fmt.Println; a newline is always appended.
func Fatalln(args ...interface{}) {
- logging.println(fatalLog, logging.logr, args...)
+ logging.println(fatalLog, logging.logr, logging.filter, args...)
}
// Fatalf logs to the FATAL, ERROR, WARNING, and INFO logs,
// including a stack trace of all running goroutines, then calls os.Exit(255).
// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing.
func Fatalf(format string, args ...interface{}) {
- logging.printf(fatalLog, logging.logr, format, args...)
+ logging.printf(fatalLog, logging.logr, logging.filter, format, args...)
}
// fatalNoStacks is non-zero if we are to exit without dumping goroutine stacks.
@@ -1464,27 +1510,42 @@ var fatalNoStacks uint32
// Arguments are handled in the manner of fmt.Print; a newline is appended if missing.
func Exit(args ...interface{}) {
atomic.StoreUint32(&fatalNoStacks, 1)
- logging.print(fatalLog, logging.logr, args...)
+ logging.print(fatalLog, logging.logr, logging.filter, args...)
}
// ExitDepth acts as Exit but uses depth to determine which call frame to log.
// ExitDepth(0, "msg") is the same as Exit("msg").
func ExitDepth(depth int, args ...interface{}) {
atomic.StoreUint32(&fatalNoStacks, 1)
- logging.printDepth(fatalLog, logging.logr, depth, args...)
+ logging.printDepth(fatalLog, logging.logr, logging.filter, depth, args...)
}
// Exitln logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1).
func Exitln(args ...interface{}) {
atomic.StoreUint32(&fatalNoStacks, 1)
- logging.println(fatalLog, logging.logr, args...)
+ logging.println(fatalLog, logging.logr, logging.filter, args...)
}
// Exitf logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1).
// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing.
func Exitf(format string, args ...interface{}) {
atomic.StoreUint32(&fatalNoStacks, 1)
- logging.printf(fatalLog, logging.logr, format, args...)
+ logging.printf(fatalLog, logging.logr, logging.filter, format, args...)
+}
+
+// LogFilter is a collection of functions that can filter all logging calls,
+// e.g. for sanitization of arguments and prevent accidental leaking of secrets.
+type LogFilter interface {
+ Filter(args []interface{}) []interface{}
+ FilterF(format string, args []interface{}) (string, []interface{})
+ FilterS(msg string, keysAndValues []interface{}) (string, []interface{})
+}
+
+func SetLogFilter(filter LogFilter) {
+ logging.mu.Lock()
+ defer logging.mu.Unlock()
+
+ logging.filter = filter
}
// ObjectRef references a kubernetes object