summaryrefslogtreecommitdiff
path: root/vendor/k8s.io/apimachinery/pkg/util
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/k8s.io/apimachinery/pkg/util')
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/errors/doc.go18
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/errors/errors.go249
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go369
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto43
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/intstr/instr_fuzz.go42
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go223
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/json/json.go159
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/naming/from_stack.go93
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/net/http.go774
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/net/interface.go499
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/net/port_range.go149
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/net/port_split.go77
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/net/util.go56
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go173
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/sets/byte.go205
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/sets/doc.go20
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/sets/empty.go23
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/sets/int.go205
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/sets/int32.go205
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/sets/int64.go205
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/sets/string.go205
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go272
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go117
-rw-r--r--vendor/k8s.io/apimachinery/pkg/util/validation/validation.go503
24 files changed, 0 insertions, 4884 deletions
diff --git a/vendor/k8s.io/apimachinery/pkg/util/errors/doc.go b/vendor/k8s.io/apimachinery/pkg/util/errors/doc.go
deleted file mode 100644
index 5d4d6250a..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/errors/doc.go
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
-Copyright 2015 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 errors implements various utility functions and types around errors.
-package errors // import "k8s.io/apimachinery/pkg/util/errors"
diff --git a/vendor/k8s.io/apimachinery/pkg/util/errors/errors.go b/vendor/k8s.io/apimachinery/pkg/util/errors/errors.go
deleted file mode 100644
index 1f5a04fd4..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/errors/errors.go
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
-Copyright 2015 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 errors
-
-import (
- "errors"
- "fmt"
-
- "k8s.io/apimachinery/pkg/util/sets"
-)
-
-// MessageCountMap contains occurrence for each error message.
-type MessageCountMap map[string]int
-
-// Aggregate represents an object that contains multiple errors, but does not
-// necessarily have singular semantic meaning.
-// The aggregate can be used with `errors.Is()` to check for the occurrence of
-// a specific error type.
-// Errors.As() is not supported, because the caller presumably cares about a
-// specific error of potentially multiple that match the given type.
-type Aggregate interface {
- error
- Errors() []error
- Is(error) bool
-}
-
-// NewAggregate converts a slice of errors into an Aggregate interface, which
-// is itself an implementation of the error interface. If the slice is empty,
-// this returns nil.
-// It will check if any of the element of input error list is nil, to avoid
-// nil pointer panic when call Error().
-func NewAggregate(errlist []error) Aggregate {
- if len(errlist) == 0 {
- return nil
- }
- // In case of input error list contains nil
- var errs []error
- for _, e := range errlist {
- if e != nil {
- errs = append(errs, e)
- }
- }
- if len(errs) == 0 {
- return nil
- }
- return aggregate(errs)
-}
-
-// This helper implements the error and Errors interfaces. Keeping it private
-// prevents people from making an aggregate of 0 errors, which is not
-// an error, but does satisfy the error interface.
-type aggregate []error
-
-// Error is part of the error interface.
-func (agg aggregate) Error() string {
- if len(agg) == 0 {
- // This should never happen, really.
- return ""
- }
- if len(agg) == 1 {
- return agg[0].Error()
- }
- seenerrs := sets.NewString()
- result := ""
- agg.visit(func(err error) bool {
- msg := err.Error()
- if seenerrs.Has(msg) {
- return false
- }
- seenerrs.Insert(msg)
- if len(seenerrs) > 1 {
- result += ", "
- }
- result += msg
- return false
- })
- if len(seenerrs) == 1 {
- return result
- }
- return "[" + result + "]"
-}
-
-func (agg aggregate) Is(target error) bool {
- return agg.visit(func(err error) bool {
- return errors.Is(err, target)
- })
-}
-
-func (agg aggregate) visit(f func(err error) bool) bool {
- for _, err := range agg {
- switch err := err.(type) {
- case aggregate:
- if match := err.visit(f); match {
- return match
- }
- case Aggregate:
- for _, nestedErr := range err.Errors() {
- if match := f(nestedErr); match {
- return match
- }
- }
- default:
- if match := f(err); match {
- return match
- }
- }
- }
-
- return false
-}
-
-// Errors is part of the Aggregate interface.
-func (agg aggregate) Errors() []error {
- return []error(agg)
-}
-
-// Matcher is used to match errors. Returns true if the error matches.
-type Matcher func(error) bool
-
-// FilterOut removes all errors that match any of the matchers from the input
-// error. If the input is a singular error, only that error is tested. If the
-// input implements the Aggregate interface, the list of errors will be
-// processed recursively.
-//
-// This can be used, for example, to remove known-OK errors (such as io.EOF or
-// os.PathNotFound) from a list of errors.
-func FilterOut(err error, fns ...Matcher) error {
- if err == nil {
- return nil
- }
- if agg, ok := err.(Aggregate); ok {
- return NewAggregate(filterErrors(agg.Errors(), fns...))
- }
- if !matchesError(err, fns...) {
- return err
- }
- return nil
-}
-
-// matchesError returns true if any Matcher returns true
-func matchesError(err error, fns ...Matcher) bool {
- for _, fn := range fns {
- if fn(err) {
- return true
- }
- }
- return false
-}
-
-// 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 slice will have all
-// nested slices flattened as a side effect.
-func filterErrors(list []error, fns ...Matcher) []error {
- result := []error{}
- for _, err := range list {
- r := FilterOut(err, fns...)
- if r != nil {
- result = append(result, r)
- }
- }
- return result
-}
-
-// Flatten takes an Aggregate, which may hold other Aggregates in arbitrary
-// nesting, and flattens them all into a single Aggregate, recursively.
-func Flatten(agg Aggregate) Aggregate {
- result := []error{}
- if agg == nil {
- return nil
- }
- for _, err := range agg.Errors() {
- if a, ok := err.(Aggregate); ok {
- r := Flatten(a)
- if r != nil {
- result = append(result, r.Errors()...)
- }
- } else {
- if err != nil {
- result = append(result, err)
- }
- }
- }
- return NewAggregate(result)
-}
-
-// CreateAggregateFromMessageCountMap converts MessageCountMap Aggregate
-func CreateAggregateFromMessageCountMap(m MessageCountMap) Aggregate {
- if m == nil {
- return nil
- }
- result := make([]error, 0, len(m))
- for errStr, count := range m {
- var countStr string
- if count > 1 {
- countStr = fmt.Sprintf(" (repeated %v times)", count)
- }
- result = append(result, fmt.Errorf("%v%v", errStr, countStr))
- }
- return NewAggregate(result)
-}
-
-// Reduce will return err or, if err is an Aggregate and only has one item,
-// the first item in the aggregate.
-func Reduce(err error) error {
- if agg, ok := err.(Aggregate); ok && err != nil {
- switch len(agg.Errors()) {
- case 1:
- return agg.Errors()[0]
- case 0:
- return nil
- }
- }
- return err
-}
-
-// AggregateGoroutines runs the provided functions in parallel, stuffing all
-// non-nil errors into the returned Aggregate.
-// Returns nil if all the functions complete successfully.
-func AggregateGoroutines(funcs ...func() error) Aggregate {
- errChan := make(chan error, len(funcs))
- for _, f := range funcs {
- go func(f func() error) { errChan <- f() }(f)
- }
- errs := make([]error, 0)
- for i := 0; i < cap(errChan); i++ {
- if err := <-errChan; err != nil {
- errs = append(errs, err)
- }
- }
- return NewAggregate(errs)
-}
-
-// ErrPreconditionViolated is returned when the precondition is violated
-var ErrPreconditionViolated = errors.New("precondition is violated")
diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go
deleted file mode 100644
index a4792034a..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
-Copyright 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.
-*/
-
-// Code generated by protoc-gen-gogo. DO NOT EDIT.
-// source: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto
-
-package intstr
-
-import (
- fmt "fmt"
-
- io "io"
- math "math"
- math_bits "math/bits"
-
- proto "github.com/gogo/protobuf/proto"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
-
-func (m *IntOrString) Reset() { *m = IntOrString{} }
-func (*IntOrString) ProtoMessage() {}
-func (*IntOrString) Descriptor() ([]byte, []int) {
- return fileDescriptor_94e046ae3ce6121c, []int{0}
-}
-func (m *IntOrString) XXX_Unmarshal(b []byte) error {
- return m.Unmarshal(b)
-}
-func (m *IntOrString) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- b = b[:cap(b)]
- n, err := m.MarshalToSizedBuffer(b)
- if err != nil {
- return nil, err
- }
- return b[:n], nil
-}
-func (m *IntOrString) XXX_Merge(src proto.Message) {
- xxx_messageInfo_IntOrString.Merge(m, src)
-}
-func (m *IntOrString) XXX_Size() int {
- return m.Size()
-}
-func (m *IntOrString) XXX_DiscardUnknown() {
- xxx_messageInfo_IntOrString.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_IntOrString proto.InternalMessageInfo
-
-func init() {
- proto.RegisterType((*IntOrString)(nil), "k8s.io.apimachinery.pkg.util.intstr.IntOrString")
-}
-
-func init() {
- proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto", fileDescriptor_94e046ae3ce6121c)
-}
-
-var fileDescriptor_94e046ae3ce6121c = []byte{
- // 292 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x8f, 0x31, 0x4b, 0x33, 0x31,
- 0x1c, 0xc6, 0x93, 0xb7, 0x7d, 0x8b, 0x9e, 0xe0, 0x50, 0x1c, 0x8a, 0x43, 0x7a, 0x28, 0xc8, 0x0d,
- 0x9a, 0xac, 0xe2, 0xd8, 0xad, 0x20, 0x08, 0x57, 0x71, 0x70, 0xbb, 0x6b, 0x63, 0x1a, 0xae, 0x4d,
- 0x42, 0xee, 0x7f, 0xc2, 0x6d, 0xfd, 0x08, 0xba, 0x39, 0xfa, 0x71, 0x6e, 0xec, 0xd8, 0x41, 0x8a,
- 0x17, 0xbf, 0x85, 0x93, 0x5c, 0xee, 0x40, 0xa7, 0xe4, 0x79, 0x9e, 0xdf, 0x2f, 0x90, 0xe0, 0x36,
- 0xbb, 0xce, 0xa9, 0xd4, 0x2c, 0x2b, 0x52, 0x6e, 0x15, 0x07, 0x9e, 0xb3, 0x67, 0xae, 0x16, 0xda,
- 0xb2, 0x6e, 0x48, 0x8c, 0x5c, 0x27, 0xf3, 0xa5, 0x54, 0xdc, 0x96, 0xcc, 0x64, 0x82, 0x15, 0x20,
- 0x57, 0x4c, 0x2a, 0xc8, 0xc1, 0x32, 0xc1, 0x15, 0xb7, 0x09, 0xf0, 0x05, 0x35, 0x56, 0x83, 0x1e,
- 0x9e, 0xb7, 0x12, 0xfd, 0x2b, 0x51, 0x93, 0x09, 0xda, 0x48, 0xb4, 0x95, 0x4e, 0xaf, 0x84, 0x84,
- 0x65, 0x91, 0xd2, 0xb9, 0x5e, 0x33, 0xa1, 0x85, 0x66, 0xde, 0x4d, 0x8b, 0x27, 0x9f, 0x7c, 0xf0,
- 0xb7, 0xf6, 0xcd, 0xb3, 0x57, 0x1c, 0x1c, 0x4d, 0x15, 0xdc, 0xd9, 0x19, 0x58, 0xa9, 0xc4, 0x30,
- 0x0a, 0xfa, 0x50, 0x1a, 0x3e, 0xc2, 0x21, 0x8e, 0x7a, 0x93, 0x93, 0x6a, 0x3f, 0x46, 0x6e, 0x3f,
- 0xee, 0xdf, 0x97, 0x86, 0x7f, 0x77, 0x67, 0xec, 0x89, 0xe1, 0x45, 0x30, 0x90, 0x0a, 0x1e, 0x92,
- 0xd5, 0xe8, 0x5f, 0x88, 0xa3, 0xff, 0x93, 0xe3, 0x8e, 0x1d, 0x4c, 0x7d, 0x1b, 0x77, 0x6b, 0xc3,
- 0xe5, 0x60, 0x1b, 0xae, 0x17, 0xe2, 0xe8, 0xf0, 0x97, 0x9b, 0xf9, 0x36, 0xee, 0xd6, 0x9b, 0x83,
- 0xb7, 0xf7, 0x31, 0xda, 0x7c, 0x84, 0x68, 0x72, 0x59, 0xd5, 0x04, 0x6d, 0x6b, 0x82, 0x76, 0x35,
- 0x41, 0x1b, 0x47, 0x70, 0xe5, 0x08, 0xde, 0x3a, 0x82, 0x77, 0x8e, 0xe0, 0x4f, 0x47, 0xf0, 0xcb,
- 0x17, 0x41, 0x8f, 0x83, 0xf6, 0xc3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x52, 0xa0, 0xb5, 0xc9,
- 0x64, 0x01, 0x00, 0x00,
-}
-
-func (m *IntOrString) Marshal() (dAtA []byte, err error) {
- size := m.Size()
- dAtA = make([]byte, size)
- n, err := m.MarshalToSizedBuffer(dAtA[:size])
- if err != nil {
- return nil, err
- }
- return dAtA[:n], nil
-}
-
-func (m *IntOrString) MarshalTo(dAtA []byte) (int, error) {
- size := m.Size()
- return m.MarshalToSizedBuffer(dAtA[:size])
-}
-
-func (m *IntOrString) MarshalToSizedBuffer(dAtA []byte) (int, error) {
- i := len(dAtA)
- _ = i
- var l int
- _ = l
- i -= len(m.StrVal)
- copy(dAtA[i:], m.StrVal)
- i = encodeVarintGenerated(dAtA, i, uint64(len(m.StrVal)))
- i--
- dAtA[i] = 0x1a
- i = encodeVarintGenerated(dAtA, i, uint64(m.IntVal))
- i--
- dAtA[i] = 0x10
- i = encodeVarintGenerated(dAtA, i, uint64(m.Type))
- i--
- dAtA[i] = 0x8
- return len(dAtA) - i, nil
-}
-
-func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int {
- offset -= sovGenerated(v)
- base := offset
- for v >= 1<<7 {
- dAtA[offset] = uint8(v&0x7f | 0x80)
- v >>= 7
- offset++
- }
- dAtA[offset] = uint8(v)
- return base
-}
-func (m *IntOrString) Size() (n int) {
- if m == nil {
- return 0
- }
- var l int
- _ = l
- n += 1 + sovGenerated(uint64(m.Type))
- n += 1 + sovGenerated(uint64(m.IntVal))
- l = len(m.StrVal)
- n += 1 + l + sovGenerated(uint64(l))
- return n
-}
-
-func sovGenerated(x uint64) (n int) {
- return (math_bits.Len64(x|1) + 6) / 7
-}
-func sozGenerated(x uint64) (n int) {
- return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63))))
-}
-func (m *IntOrString) Unmarshal(dAtA []byte) error {
- l := len(dAtA)
- iNdEx := 0
- for iNdEx < l {
- preIndex := iNdEx
- var wire uint64
- for shift := uint(0); ; shift += 7 {
- if shift >= 64 {
- return ErrIntOverflowGenerated
- }
- if iNdEx >= l {
- return io.ErrUnexpectedEOF
- }
- b := dAtA[iNdEx]
- iNdEx++
- wire |= uint64(b&0x7F) << shift
- if b < 0x80 {
- break
- }
- }
- fieldNum := int32(wire >> 3)
- wireType := int(wire & 0x7)
- if wireType == 4 {
- return fmt.Errorf("proto: IntOrString: wiretype end group for non-group")
- }
- if fieldNum <= 0 {
- return fmt.Errorf("proto: IntOrString: illegal tag %d (wire type %d)", fieldNum, wire)
- }
- switch fieldNum {
- case 1:
- if wireType != 0 {
- return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType)
- }
- m.Type = 0
- for shift := uint(0); ; shift += 7 {
- if shift >= 64 {
- return ErrIntOverflowGenerated
- }
- if iNdEx >= l {
- return io.ErrUnexpectedEOF
- }
- b := dAtA[iNdEx]
- iNdEx++
- m.Type |= Type(b&0x7F) << shift
- if b < 0x80 {
- break
- }
- }
- case 2:
- if wireType != 0 {
- return fmt.Errorf("proto: wrong wireType = %d for field IntVal", wireType)
- }
- m.IntVal = 0
- for shift := uint(0); ; shift += 7 {
- if shift >= 64 {
- return ErrIntOverflowGenerated
- }
- if iNdEx >= l {
- return io.ErrUnexpectedEOF
- }
- b := dAtA[iNdEx]
- iNdEx++
- m.IntVal |= int32(b&0x7F) << shift
- if b < 0x80 {
- break
- }
- }
- case 3:
- if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field StrVal", wireType)
- }
- var stringLen uint64
- for shift := uint(0); ; shift += 7 {
- if shift >= 64 {
- return ErrIntOverflowGenerated
- }
- if iNdEx >= l {
- return io.ErrUnexpectedEOF
- }
- b := dAtA[iNdEx]
- iNdEx++
- stringLen |= uint64(b&0x7F) << shift
- if b < 0x80 {
- break
- }
- }
- intStringLen := int(stringLen)
- if intStringLen < 0 {
- return ErrInvalidLengthGenerated
- }
- postIndex := iNdEx + intStringLen
- if postIndex < 0 {
- return ErrInvalidLengthGenerated
- }
- if postIndex > l {
- return io.ErrUnexpectedEOF
- }
- m.StrVal = string(dAtA[iNdEx:postIndex])
- iNdEx = postIndex
- default:
- iNdEx = preIndex
- skippy, err := skipGenerated(dAtA[iNdEx:])
- if err != nil {
- return err
- }
- if (skippy < 0) || (iNdEx+skippy) < 0 {
- return ErrInvalidLengthGenerated
- }
- if (iNdEx + skippy) > l {
- return io.ErrUnexpectedEOF
- }
- iNdEx += skippy
- }
- }
-
- if iNdEx > l {
- return io.ErrUnexpectedEOF
- }
- return nil
-}
-func skipGenerated(dAtA []byte) (n int, err error) {
- l := len(dAtA)
- iNdEx := 0
- depth := 0
- for iNdEx < l {
- var wire uint64
- for shift := uint(0); ; shift += 7 {
- if shift >= 64 {
- return 0, ErrIntOverflowGenerated
- }
- if iNdEx >= l {
- return 0, io.ErrUnexpectedEOF
- }
- b := dAtA[iNdEx]
- iNdEx++
- wire |= (uint64(b) & 0x7F) << shift
- if b < 0x80 {
- break
- }
- }
- wireType := int(wire & 0x7)
- switch wireType {
- case 0:
- for shift := uint(0); ; shift += 7 {
- if shift >= 64 {
- return 0, ErrIntOverflowGenerated
- }
- if iNdEx >= l {
- return 0, io.ErrUnexpectedEOF
- }
- iNdEx++
- if dAtA[iNdEx-1] < 0x80 {
- break
- }
- }
- case 1:
- iNdEx += 8
- case 2:
- var length int
- for shift := uint(0); ; shift += 7 {
- if shift >= 64 {
- return 0, ErrIntOverflowGenerated
- }
- if iNdEx >= l {
- return 0, io.ErrUnexpectedEOF
- }
- b := dAtA[iNdEx]
- iNdEx++
- length |= (int(b) & 0x7F) << shift
- if b < 0x80 {
- break
- }
- }
- if length < 0 {
- return 0, ErrInvalidLengthGenerated
- }
- iNdEx += length
- case 3:
- depth++
- case 4:
- if depth == 0 {
- return 0, ErrUnexpectedEndOfGroupGenerated
- }
- depth--
- case 5:
- iNdEx += 4
- default:
- return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
- }
- if iNdEx < 0 {
- return 0, ErrInvalidLengthGenerated
- }
- if depth == 0 {
- return iNdEx, nil
- }
- }
- return 0, io.ErrUnexpectedEOF
-}
-
-var (
- ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling")
- ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow")
- ErrUnexpectedEndOfGroupGenerated = fmt.Errorf("proto: unexpected end of group")
-)
diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto b/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto
deleted file mode 100644
index a76f79851..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-Copyright 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.
-*/
-
-
-// This file was autogenerated by go-to-protobuf. Do not edit it manually!
-
-syntax = "proto2";
-
-package k8s.io.apimachinery.pkg.util.intstr;
-
-// Package-wide variables from generator "generated".
-option go_package = "intstr";
-
-// IntOrString is a type that can hold an int32 or a string. When used in
-// JSON or YAML marshalling and unmarshalling, it produces or consumes the
-// inner type. This allows you to have, for example, a JSON field that can
-// accept a name or number.
-// TODO: Rename to Int32OrString
-//
-// +protobuf=true
-// +protobuf.options.(gogoproto.goproto_stringer)=false
-// +k8s:openapi-gen=true
-message IntOrString {
- optional int64 type = 1;
-
- optional int32 intVal = 2;
-
- optional string strVal = 3;
-}
-
diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/instr_fuzz.go b/vendor/k8s.io/apimachinery/pkg/util/intstr/instr_fuzz.go
deleted file mode 100644
index 2501d5516..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/intstr/instr_fuzz.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// +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
deleted file mode 100644
index c0e8927fe..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
-Copyright 2014 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 (
- "encoding/json"
- "errors"
- "fmt"
- "math"
- "runtime/debug"
- "strconv"
- "strings"
-
- "k8s.io/klog/v2"
-)
-
-// IntOrString is a type that can hold an int32 or a string. When used in
-// JSON or YAML marshalling and unmarshalling, it produces or consumes the
-// inner type. This allows you to have, for example, a JSON field that can
-// accept a name or number.
-// TODO: Rename to Int32OrString
-//
-// +protobuf=true
-// +protobuf.options.(gogoproto.goproto_stringer)=false
-// +k8s:openapi-gen=true
-type IntOrString struct {
- Type Type `protobuf:"varint,1,opt,name=type,casttype=Type"`
- IntVal int32 `protobuf:"varint,2,opt,name=intVal"`
- StrVal string `protobuf:"bytes,3,opt,name=strVal"`
-}
-
-// Type represents the stored type of IntOrString.
-type Type int64
-
-const (
- Int Type = iota // The IntOrString holds an int.
- String // The IntOrString holds a string.
-)
-
-// FromInt creates an IntOrString object with an int32 value. It is
-// your responsibility not to call this method with a value greater
-// than int32.
-// TODO: convert to (val int32)
-func FromInt(val int) IntOrString {
- if val > math.MaxInt32 || val < math.MinInt32 {
- klog.Errorf("value: %d overflows int32\n%s\n", val, debug.Stack())
- }
- return IntOrString{Type: Int, IntVal: int32(val)}
-}
-
-// FromString creates an IntOrString object with a string value.
-func FromString(val string) IntOrString {
- return IntOrString{Type: String, StrVal: val}
-}
-
-// Parse the given string and try to convert it to an integer before
-// setting it as a string value.
-func Parse(val string) IntOrString {
- i, err := strconv.Atoi(val)
- if err != nil {
- return FromString(val)
- }
- return FromInt(i)
-}
-
-// UnmarshalJSON implements the json.Unmarshaller interface.
-func (intstr *IntOrString) UnmarshalJSON(value []byte) error {
- if value[0] == '"' {
- intstr.Type = String
- return json.Unmarshal(value, &intstr.StrVal)
- }
- intstr.Type = Int
- return json.Unmarshal(value, &intstr.IntVal)
-}
-
-// 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
- }
- return strconv.Itoa(intstr.IntValue())
-}
-
-// IntValue returns the IntVal if type Int, or if
-// it is a String, will attempt a conversion to int,
-// returning 0 if a parsing error occurs.
-func (intstr *IntOrString) IntValue() int {
- if intstr.Type == String {
- i, _ := strconv.Atoi(intstr.StrVal)
- return i
- }
- return int(intstr.IntVal)
-}
-
-// MarshalJSON implements the json.Marshaller interface.
-func (intstr IntOrString) MarshalJSON() ([]byte, error) {
- switch intstr.Type {
- case Int:
- return json.Marshal(intstr.IntVal)
- case String:
- return json.Marshal(intstr.StrVal)
- default:
- return []byte{}, fmt.Errorf("impossible IntOrString.Type")
- }
-}
-
-// OpenAPISchemaType is used by the kube-openapi generator when constructing
-// the OpenAPI spec of this type.
-//
-// See: https://github.com/kubernetes/kube-openapi/tree/master/pkg/generators
-func (IntOrString) OpenAPISchemaType() []string { return []string{"string"} }
-
-// OpenAPISchemaFormat is used by the kube-openapi generator when constructing
-// the OpenAPI spec of this type.
-func (IntOrString) OpenAPISchemaFormat() string { return "int-or-string" }
-
-func ValueOrDefault(intOrPercent *IntOrString, defaultValue IntOrString) *IntOrString {
- if intOrPercent == nil {
- return &defaultValue
- }
- 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")
- }
- value, isPercent, err := getIntOrPercentValue(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
-}
-
-// 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:
- return intOrStr.IntValue(), false, nil
- case String:
- s := strings.Replace(intOrStr.StrVal, "%", "", -1)
- v, err := strconv.Atoi(s)
- if err != nil {
- return 0, false, fmt.Errorf("invalid value %q: %v", intOrStr.StrVal, err)
- }
- return int(v), true, nil
- }
- 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
deleted file mode 100644
index 778e58f70..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/json/json.go
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
-Copyright 2015 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 json
-
-import (
- "bytes"
- "encoding/json"
- "fmt"
- "io"
-)
-
-// NewEncoder delegates to json.NewEncoder
-// It is only here so this package can be a drop-in for common encoding/json uses
-func NewEncoder(w io.Writer) *json.Encoder {
- return json.NewEncoder(w)
-}
-
-// Marshal delegates to json.Marshal
-// It is only here so this package can be a drop-in for common encoding/json uses
-func Marshal(v interface{}) ([]byte, error) {
- return json.Marshal(v)
-}
-
-// limit recursive depth to prevent stack overflow errors
-const maxDepth = 10000
-
-// 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 {
- switch v := v.(type) {
- case *map[string]interface{}:
- // Build a decoder from the given data
- decoder := json.NewDecoder(bytes.NewBuffer(data))
- // Preserve numbers, rather than casting to float64 automatically
- decoder.UseNumber()
- // Run the decode
- if err := decoder.Decode(v); err != nil {
- return err
- }
- // If the decode succeeds, post-process the map to convert json.Number objects to int64 or float64
- return ConvertMapNumbers(*v, 0)
-
- case *[]interface{}:
- // Build a decoder from the given data
- decoder := json.NewDecoder(bytes.NewBuffer(data))
- // Preserve numbers, rather than casting to float64 automatically
- decoder.UseNumber()
- // Run the decode
- if err := decoder.Decode(v); err != nil {
- return err
- }
- // If the decode succeeds, post-process the map to convert json.Number objects to int64 or float64
- return ConvertSliceNumbers(*v, 0)
-
- case *interface{}:
- // Build a decoder from the given data
- decoder := json.NewDecoder(bytes.NewBuffer(data))
- // Preserve numbers, rather than casting to float64 automatically
- decoder.UseNumber()
- // Run the decode
- if err := decoder.Decode(v); err != nil {
- return err
- }
- // If the decode succeeds, post-process the map to convert json.Number objects to int64 or float64
- return ConvertInterfaceNumbers(v, 0)
-
- default:
- return json.Unmarshal(data, v)
- }
-}
-
-// 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)
- case []interface{}:
- err = ConvertSliceNumbers(v2, depth+1)
- }
- return err
-}
-
-// 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 {
- if depth > maxDepth {
- return fmt.Errorf("exceeded max depth of %d", maxDepth)
- }
-
- var err error
- for k, v := range m {
- switch v := v.(type) {
- case json.Number:
- m[k], err = convertNumber(v)
- case map[string]interface{}:
- err = ConvertMapNumbers(v, depth+1)
- case []interface{}:
- err = ConvertSliceNumbers(v, depth+1)
- }
- if err != nil {
- return err
- }
- }
- return nil
-}
-
-// 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 {
- if depth > maxDepth {
- return fmt.Errorf("exceeded max depth of %d", maxDepth)
- }
-
- var err error
- for i, v := range s {
- switch v := v.(type) {
- case json.Number:
- s[i], err = convertNumber(v)
- case map[string]interface{}:
- err = ConvertMapNumbers(v, depth+1)
- case []interface{}:
- err = ConvertSliceNumbers(v, depth+1)
- }
- if err != nil {
- return err
- }
- }
- return nil
-}
-
-// convertNumber converts a json.Number to an int64 or float64, or returns an error
-func convertNumber(n json.Number) (interface{}, error) {
- // Attempt to convert to an int64 first
- if i, err := n.Int64(); err == nil {
- return i, nil
- }
- // Return a float64 (default json.Decode() behavior)
- // An overflow will return an error
- return n.Float64()
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/naming/from_stack.go b/vendor/k8s.io/apimachinery/pkg/util/naming/from_stack.go
deleted file mode 100644
index d69bf32ca..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/naming/from_stack.go
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
-Copyright 2018 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 naming
-
-import (
- "fmt"
- "regexp"
- goruntime "runtime"
- "runtime/debug"
- "strconv"
- "strings"
-)
-
-// GetNameFromCallsite walks back through the call stack until we find a caller from outside of the ignoredPackages
-// it returns back a shortpath/filename:line to aid in identification of this reflector when it starts logging
-func GetNameFromCallsite(ignoredPackages ...string) string {
- name := "????"
- const maxStack = 10
- for i := 1; i < maxStack; i++ {
- _, file, line, ok := goruntime.Caller(i)
- if !ok {
- file, line, ok = extractStackCreator()
- if !ok {
- break
- }
- i += maxStack
- }
- if hasPackage(file, append(ignoredPackages, "/runtime/asm_")) {
- continue
- }
-
- file = trimPackagePrefix(file)
- name = fmt.Sprintf("%s:%d", file, line)
- break
- }
- return name
-}
-
-// hasPackage returns true if the file is in one of the ignored packages.
-func hasPackage(file string, ignoredPackages []string) bool {
- for _, ignoredPackage := range ignoredPackages {
- if strings.Contains(file, ignoredPackage) {
- return true
- }
- }
- return false
-}
-
-// trimPackagePrefix reduces duplicate values off the front of a package name.
-func trimPackagePrefix(file string) string {
- if l := strings.LastIndex(file, "/vendor/"); l >= 0 {
- return file[l+len("/vendor/"):]
- }
- if l := strings.LastIndex(file, "/src/"); l >= 0 {
- return file[l+5:]
- }
- if l := strings.LastIndex(file, "/pkg/"); l >= 0 {
- return file[l+1:]
- }
- return file
-}
-
-var stackCreator = regexp.MustCompile(`(?m)^created by (.*)\n\s+(.*):(\d+) \+0x[[:xdigit:]]+$`)
-
-// extractStackCreator retrieves the goroutine file and line that launched this stack. Returns false
-// if the creator cannot be located.
-// TODO: Go does not expose this via runtime https://github.com/golang/go/issues/11440
-func extractStackCreator() (string, int, bool) {
- stack := debug.Stack()
- matches := stackCreator.FindStringSubmatch(string(stack))
- if len(matches) != 4 {
- return "", 0, false
- }
- line, err := strconv.Atoi(matches[3])
- if err != nil {
- return "", 0, false
- }
- return matches[2], line, true
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/http.go b/vendor/k8s.io/apimachinery/pkg/util/net/http.go
deleted file mode 100644
index d75ac6efa..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/net/http.go
+++ /dev/null
@@ -1,774 +0,0 @@
-/*
-Copyright 2016 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 net
-
-import (
- "bufio"
- "bytes"
- "context"
- "crypto/tls"
- "errors"
- "fmt"
- "io"
- "mime"
- "net"
- "net/http"
- "net/url"
- "os"
- "path"
- "regexp"
- "strconv"
- "strings"
- "time"
- "unicode"
- "unicode/utf8"
-
- "golang.org/x/net/http2"
- "k8s.io/klog/v2"
-)
-
-// JoinPreservingTrailingSlash does a path.Join of the specified elements,
-// preserving any trailing slash on the last non-empty segment
-func JoinPreservingTrailingSlash(elem ...string) string {
- // do the basic path join
- result := path.Join(elem...)
-
- // find the last non-empty segment
- for i := len(elem) - 1; i >= 0; i-- {
- if len(elem[i]) > 0 {
- // if the last segment ended in a slash, ensure our result does as well
- if strings.HasSuffix(elem[i], "/") && !strings.HasSuffix(result, "/") {
- result += "/"
- }
- break
- }
- }
-
- return result
-}
-
-// IsTimeout returns true if the given error is a network timeout error
-func IsTimeout(err error) bool {
- var neterr net.Error
- if errors.As(err, &neterr) {
- return neterr != nil && neterr.Timeout()
- }
- return false
-}
-
-// IsProbableEOF returns true if the given error resembles a connection termination
-// scenario that would justify assuming that the watch is empty.
-// These errors are what the Go http stack returns back to us which are general
-// connection closure errors (strongly correlated) and callers that need to
-// differentiate probable errors in connection behavior between normal "this is
-// disconnected" should use the method.
-func IsProbableEOF(err error) bool {
- if err == nil {
- return false
- }
- var uerr *url.Error
- if errors.As(err, &uerr) {
- err = uerr.Err
- }
- msg := err.Error()
- switch {
- case err == io.EOF:
- return true
- case err == io.ErrUnexpectedEOF:
- return true
- case msg == "http: can't write HTTP request on broken connection":
- return true
- case strings.Contains(msg, "http2: server sent GOAWAY and closed the connection"):
- return true
- case strings.Contains(msg, "connection reset by peer"):
- return true
- case strings.Contains(strings.ToLower(msg), "use of closed network connection"):
- return true
- }
- return false
-}
-
-var defaultTransport = http.DefaultTransport.(*http.Transport)
-
-// SetOldTransportDefaults applies the defaults from http.DefaultTransport
-// for the Proxy, Dial, and TLSHandshakeTimeout fields if unset
-func SetOldTransportDefaults(t *http.Transport) *http.Transport {
- if t.Proxy == nil || isDefault(t.Proxy) {
- // http.ProxyFromEnvironment doesn't respect CIDRs and that makes it impossible to exclude things like pod and service IPs from proxy settings
- // ProxierWithNoProxyCIDR allows CIDR rules in NO_PROXY
- t.Proxy = NewProxierWithNoProxyCIDR(http.ProxyFromEnvironment)
- }
- // If no custom dialer is set, use the default context dialer
- //lint:file-ignore SA1019 Keep supporting deprecated Dial method of custom transports
- if t.DialContext == nil && t.Dial == nil {
- t.DialContext = defaultTransport.DialContext
- }
- if t.TLSHandshakeTimeout == 0 {
- t.TLSHandshakeTimeout = defaultTransport.TLSHandshakeTimeout
- }
- if t.IdleConnTimeout == 0 {
- t.IdleConnTimeout = defaultTransport.IdleConnTimeout
- }
- return t
-}
-
-// SetTransportDefaults applies the defaults from http.DefaultTransport
-// for the Proxy, Dial, and TLSHandshakeTimeout fields if unset
-func SetTransportDefaults(t *http.Transport) *http.Transport {
- t = SetOldTransportDefaults(t)
- // Allow clients to disable http2 if needed.
- if s := os.Getenv("DISABLE_HTTP2"); len(s) > 0 {
- klog.Info("HTTP2 has been explicitly disabled")
- } else if allowsHTTP2(t) {
- 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
- return true
- }
- for _, p := range t.TLSClientConfig.NextProtos {
- if p == http2.NextProtoTLS {
- // the transport explicitly allowed http/2
- return true
- }
- }
- // the transport explicitly set NextProtos and excluded http/2
- return false
-}
-
-type RoundTripperWrapper interface {
- http.RoundTripper
- WrappedRoundTripper() http.RoundTripper
-}
-
-type DialFunc func(ctx context.Context, net, addr string) (net.Conn, error)
-
-func DialerFor(transport http.RoundTripper) (DialFunc, error) {
- if transport == nil {
- return nil, nil
- }
-
- switch transport := transport.(type) {
- case *http.Transport:
- // transport.DialContext takes precedence over transport.Dial
- if transport.DialContext != nil {
- return transport.DialContext, nil
- }
- // adapt transport.Dial to the DialWithContext signature
- if transport.Dial != nil {
- return func(ctx context.Context, net, addr string) (net.Conn, error) {
- return transport.Dial(net, addr)
- }, nil
- }
- // otherwise return nil
- return nil, nil
- case RoundTripperWrapper:
- return DialerFor(transport.WrappedRoundTripper())
- default:
- return nil, fmt.Errorf("unknown transport type: %T", transport)
- }
-}
-
-type TLSClientConfigHolder interface {
- TLSClientConfig() *tls.Config
-}
-
-func TLSClientConfig(transport http.RoundTripper) (*tls.Config, error) {
- if transport == nil {
- return nil, nil
- }
-
- switch transport := transport.(type) {
- case *http.Transport:
- return transport.TLSClientConfig, nil
- case TLSClientConfigHolder:
- return transport.TLSClientConfig(), nil
- case RoundTripperWrapper:
- return TLSClientConfig(transport.WrappedRoundTripper())
- default:
- return nil, fmt.Errorf("unknown transport type: %T", transport)
- }
-}
-
-func FormatURL(scheme string, host string, port int, path string) *url.URL {
- return &url.URL{
- Scheme: scheme,
- Host: net.JoinHostPort(host, strconv.Itoa(port)),
- Path: path,
- }
-}
-
-func GetHTTPClient(req *http.Request) string {
- if ua := req.UserAgent(); len(ua) != 0 {
- return ua
- }
- return "unknown"
-}
-
-// SourceIPs splits the comma separated X-Forwarded-For header and joins it with
-// the X-Real-Ip header and/or req.RemoteAddr, ignoring invalid IPs.
-// The X-Real-Ip is omitted if it's already present in the X-Forwarded-For chain.
-// The req.RemoteAddr is always the last IP in the returned list.
-// It returns nil if all of these are empty or invalid.
-func SourceIPs(req *http.Request) []net.IP {
- var srcIPs []net.IP
-
- hdr := req.Header
- // First check the X-Forwarded-For header for requests via proxy.
- hdrForwardedFor := hdr.Get("X-Forwarded-For")
- if hdrForwardedFor != "" {
- // X-Forwarded-For can be a csv of IPs in case of multiple proxies.
- // Use the first valid one.
- parts := strings.Split(hdrForwardedFor, ",")
- for _, part := range parts {
- ip := net.ParseIP(strings.TrimSpace(part))
- if ip != nil {
- srcIPs = append(srcIPs, ip)
- }
- }
- }
-
- // Try the X-Real-Ip header.
- hdrRealIp := hdr.Get("X-Real-Ip")
- if hdrRealIp != "" {
- ip := net.ParseIP(hdrRealIp)
- // Only append the X-Real-Ip if it's not already contained in the X-Forwarded-For chain.
- if ip != nil && !containsIP(srcIPs, ip) {
- srcIPs = append(srcIPs, ip)
- }
- }
-
- // Always include the request Remote Address as it cannot be easily spoofed.
- var remoteIP net.IP
- // Remote Address in Go's HTTP server is in the form host:port so we need to split that first.
- host, _, err := net.SplitHostPort(req.RemoteAddr)
- if err == nil {
- remoteIP = net.ParseIP(host)
- }
- // Fallback if Remote Address was just IP.
- if remoteIP == nil {
- remoteIP = net.ParseIP(req.RemoteAddr)
- }
-
- // Don't duplicate remote IP if it's already the last address in the chain.
- if remoteIP != nil && (len(srcIPs) == 0 || !remoteIP.Equal(srcIPs[len(srcIPs)-1])) {
- srcIPs = append(srcIPs, remoteIP)
- }
-
- return srcIPs
-}
-
-// Checks whether the given IP address is contained in the list of IPs.
-func containsIP(ips []net.IP, ip net.IP) bool {
- for _, v := range ips {
- if v.Equal(ip) {
- return true
- }
- }
- return false
-}
-
-// Extracts and returns the clients IP from the given request.
-// Looks at X-Forwarded-For header, X-Real-Ip header and request.RemoteAddr in that order.
-// Returns nil if none of them are set or is set to an invalid value.
-func GetClientIP(req *http.Request) net.IP {
- ips := SourceIPs(req)
- if len(ips) == 0 {
- return nil
- }
- return ips[0]
-}
-
-// Prepares the X-Forwarded-For header for another forwarding hop by appending the previous sender's
-// IP address to the X-Forwarded-For chain.
-func AppendForwardedForHeader(req *http.Request) {
- // Copied from net/http/httputil/reverseproxy.go:
- if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
- // If we aren't the first proxy retain prior
- // X-Forwarded-For information as a comma+space
- // separated list and fold multiple headers into one.
- if prior, ok := req.Header["X-Forwarded-For"]; ok {
- clientIP = strings.Join(prior, ", ") + ", " + clientIP
- }
- req.Header.Set("X-Forwarded-For", clientIP)
- }
-}
-
-var defaultProxyFuncPointer = fmt.Sprintf("%p", http.ProxyFromEnvironment)
-
-// isDefault checks to see if the transportProxierFunc is pointing to the default one
-func isDefault(transportProxier func(*http.Request) (*url.URL, error)) bool {
- transportProxierPointer := fmt.Sprintf("%p", transportProxier)
- return transportProxierPointer == defaultProxyFuncPointer
-}
-
-// NewProxierWithNoProxyCIDR constructs a Proxier function that respects CIDRs in NO_PROXY and delegates if
-// no matching CIDRs are found
-func NewProxierWithNoProxyCIDR(delegate func(req *http.Request) (*url.URL, error)) func(req *http.Request) (*url.URL, error) {
- // we wrap the default method, so we only need to perform our check if the NO_PROXY (or no_proxy) envvar has a CIDR in it
- noProxyEnv := os.Getenv("NO_PROXY")
- if noProxyEnv == "" {
- noProxyEnv = os.Getenv("no_proxy")
- }
- noProxyRules := strings.Split(noProxyEnv, ",")
-
- cidrs := []*net.IPNet{}
- for _, noProxyRule := range noProxyRules {
- _, cidr, _ := net.ParseCIDR(noProxyRule)
- if cidr != nil {
- cidrs = append(cidrs, cidr)
- }
- }
-
- if len(cidrs) == 0 {
- return delegate
- }
-
- return func(req *http.Request) (*url.URL, error) {
- ip := net.ParseIP(req.URL.Hostname())
- if ip == nil {
- return delegate(req)
- }
-
- for _, cidr := range cidrs {
- if cidr.Contains(ip) {
- return nil, nil
- }
- }
-
- return delegate(req)
- }
-}
-
-// DialerFunc implements Dialer for the provided function.
-type DialerFunc func(req *http.Request) (net.Conn, error)
-
-func (fn DialerFunc) Dial(req *http.Request) (net.Conn, error) {
- return fn(req)
-}
-
-// Dialer dials a host and writes a request to it.
-type Dialer interface {
- // Dial connects to the host specified by req's URL, writes the request to the connection, and
- // returns the opened net.Conn.
- Dial(req *http.Request) (net.Conn, error)
-}
-
-// ConnectWithRedirects uses dialer to send req, following up to 10 redirects (relative to
-// originalLocation). It returns the opened net.Conn and the raw response bytes.
-// If requireSameHostRedirects is true, only redirects to the same host are permitted.
-func ConnectWithRedirects(originalMethod string, originalLocation *url.URL, header http.Header, originalBody io.Reader, dialer Dialer, requireSameHostRedirects bool) (net.Conn, []byte, error) {
- const (
- maxRedirects = 9 // Fail on the 10th redirect
- maxResponseSize = 16384 // play it safe to allow the potential for lots of / large headers
- )
-
- var (
- location = originalLocation
- method = originalMethod
- intermediateConn net.Conn
- rawResponse = bytes.NewBuffer(make([]byte, 0, 256))
- body = originalBody
- )
-
- defer func() {
- if intermediateConn != nil {
- intermediateConn.Close()
- }
- }()
-
-redirectLoop:
- for redirects := 0; ; redirects++ {
- if redirects > maxRedirects {
- return nil, nil, fmt.Errorf("too many redirects (%d)", redirects)
- }
-
- req, err := http.NewRequest(method, location.String(), body)
- if err != nil {
- return nil, nil, err
- }
-
- req.Header = header
-
- intermediateConn, err = dialer.Dial(req)
- if err != nil {
- return nil, nil, err
- }
-
- // Peek at the backend response.
- rawResponse.Reset()
- respReader := bufio.NewReader(io.TeeReader(
- io.LimitReader(intermediateConn, maxResponseSize), // Don't read more than maxResponseSize bytes.
- rawResponse)) // Save the raw response.
- resp, err := http.ReadResponse(respReader, nil)
- if err != nil {
- // Unable to read the backend response; let the client handle it.
- klog.Warningf("Error reading backend response: %v", err)
- break redirectLoop
- }
-
- switch resp.StatusCode {
- case http.StatusFound:
- // Redirect, continue.
- default:
- // Don't redirect.
- break redirectLoop
- }
-
- // Redirected requests switch to "GET" according to the HTTP spec:
- // https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3
- method = "GET"
- // don't send a body when following redirects
- body = nil
-
- resp.Body.Close() // not used
-
- // Prepare to follow the redirect.
- redirectStr := resp.Header.Get("Location")
- if redirectStr == "" {
- return nil, nil, fmt.Errorf("%d response missing Location header", resp.StatusCode)
- }
- // We have to parse relative to the current location, NOT originalLocation. For example,
- // if we request http://foo.com/a and get back "http://bar.com/b", the result should be
- // http://bar.com/b. If we then make that request and get back a redirect to "/c", the result
- // should be http://bar.com/c, not http://foo.com/c.
- location, err = location.Parse(redirectStr)
- if err != nil {
- return nil, nil, fmt.Errorf("malformed Location header: %v", err)
- }
-
- // Only follow redirects to the same host. Otherwise, propagate the redirect response back.
- if requireSameHostRedirects && location.Hostname() != originalLocation.Hostname() {
- return nil, nil, fmt.Errorf("hostname mismatch: expected %s, found %s", originalLocation.Hostname(), location.Hostname())
- }
-
- // Reset the connection.
- intermediateConn.Close()
- intermediateConn = nil
- }
-
- connToReturn := intermediateConn
- intermediateConn = nil // Don't close the connection when we return it.
- return connToReturn, rawResponse.Bytes(), nil
-}
-
-// CloneRequest creates a shallow copy of the request along with a deep copy of the Headers.
-func CloneRequest(req *http.Request) *http.Request {
- r := new(http.Request)
-
- // shallow clone
- *r = *req
-
- // deep copy headers
- r.Header = CloneHeader(req.Header)
-
- return r
-}
-
-// CloneHeader creates a deep copy of an http.Header.
-func CloneHeader(in http.Header) http.Header {
- out := make(http.Header, len(in))
- for key, values := range in {
- newValues := make([]string, len(values))
- copy(newValues, values)
- out[key] = newValues
- }
- return out
-}
-
-// WarningHeader contains a single RFC2616 14.46 warnings header
-type WarningHeader struct {
- // Codeindicates the type of warning. 299 is a miscellaneous persistent warning
- Code int
- // Agent contains the name or pseudonym of the server adding the Warning header.
- // A single "-" is recommended when agent is unknown.
- Agent string
- // Warning text
- Text string
-}
-
-// ParseWarningHeaders extract RFC2616 14.46 warnings headers from the specified set of header values.
-// Multiple comma-separated warnings per header are supported.
-// If errors are encountered on a header, the remainder of that header are skipped and subsequent headers are parsed.
-// Returns successfully parsed warnings and any errors encountered.
-func ParseWarningHeaders(headers []string) ([]WarningHeader, []error) {
- var (
- results []WarningHeader
- errs []error
- )
- for _, header := range headers {
- for len(header) > 0 {
- result, remainder, err := ParseWarningHeader(header)
- if err != nil {
- errs = append(errs, err)
- break
- }
- results = append(results, result)
- header = remainder
- }
- }
- return results, errs
-}
-
-var (
- codeMatcher = regexp.MustCompile(`^[0-9]{3}$`)
- wordDecoder = &mime.WordDecoder{}
-)
-
-// ParseWarningHeader extracts one RFC2616 14.46 warning from the specified header,
-// returning an error if the header does not contain a correctly formatted warning.
-// Any remaining content in the header is returned.
-func ParseWarningHeader(header string) (result WarningHeader, remainder string, err error) {
- // https://tools.ietf.org/html/rfc2616#section-14.46
- // updated by
- // https://tools.ietf.org/html/rfc7234#section-5.5
- // https://tools.ietf.org/html/rfc7234#appendix-A
- // Some requirements regarding production and processing of the Warning
- // header fields have been relaxed, as it is not widely implemented.
- // Furthermore, the Warning header field no longer uses RFC 2047
- // encoding, nor does it allow multiple languages, as these aspects were
- // not implemented.
- //
- // Format is one of:
- // warn-code warn-agent "warn-text"
- // warn-code warn-agent "warn-text" "warn-date"
- //
- // warn-code is a three digit number
- // warn-agent is unquoted and contains no spaces
- // warn-text is quoted with backslash escaping (RFC2047-encoded according to RFC2616, not encoded according to RFC7234)
- // warn-date is optional, quoted, and in HTTP-date format (no embedded or escaped quotes)
- //
- // additional warnings can optionally be included in the same header by comma-separating them:
- // warn-code warn-agent "warn-text" "warn-date"[, warn-code warn-agent "warn-text" "warn-date", ...]
-
- // tolerate leading whitespace
- header = strings.TrimSpace(header)
-
- parts := strings.SplitN(header, " ", 3)
- if len(parts) != 3 {
- return WarningHeader{}, "", errors.New("invalid warning header: fewer than 3 segments")
- }
- code, agent, textDateRemainder := parts[0], parts[1], parts[2]
-
- // verify code format
- if !codeMatcher.Match([]byte(code)) {
- return WarningHeader{}, "", errors.New("invalid warning header: code segment is not 3 digits between 100-299")
- }
- codeInt, _ := strconv.ParseInt(code, 10, 64)
-
- // verify agent presence
- if len(agent) == 0 {
- return WarningHeader{}, "", errors.New("invalid warning header: empty agent segment")
- }
- if !utf8.ValidString(agent) || hasAnyRunes(agent, unicode.IsControl) {
- return WarningHeader{}, "", errors.New("invalid warning header: invalid agent")
- }
-
- // verify textDateRemainder presence
- if len(textDateRemainder) == 0 {
- return WarningHeader{}, "", errors.New("invalid warning header: empty text segment")
- }
-
- // extract text
- text, dateAndRemainder, err := parseQuotedString(textDateRemainder)
- if err != nil {
- return WarningHeader{}, "", fmt.Errorf("invalid warning header: %v", err)
- }
- // tolerate RFC2047-encoded text from warnings produced according to RFC2616
- if decodedText, err := wordDecoder.DecodeHeader(text); err == nil {
- text = decodedText
- }
- if !utf8.ValidString(text) || hasAnyRunes(text, unicode.IsControl) {
- return WarningHeader{}, "", errors.New("invalid warning header: invalid text")
- }
- result = WarningHeader{Code: int(codeInt), Agent: agent, Text: text}
-
- if len(dateAndRemainder) > 0 {
- if dateAndRemainder[0] == '"' {
- // consume date
- foundEndQuote := false
- for i := 1; i < len(dateAndRemainder); i++ {
- if dateAndRemainder[i] == '"' {
- foundEndQuote = true
- remainder = strings.TrimSpace(dateAndRemainder[i+1:])
- break
- }
- }
- if !foundEndQuote {
- return WarningHeader{}, "", errors.New("invalid warning header: unterminated date segment")
- }
- } else {
- remainder = dateAndRemainder
- }
- }
- if len(remainder) > 0 {
- if remainder[0] == ',' {
- // consume comma if present
- remainder = strings.TrimSpace(remainder[1:])
- } else {
- return WarningHeader{}, "", errors.New("invalid warning header: unexpected token after warn-date")
- }
- }
-
- return result, remainder, nil
-}
-
-func parseQuotedString(quotedString string) (string, string, error) {
- if len(quotedString) == 0 {
- return "", "", errors.New("invalid quoted string: 0-length")
- }
-
- if quotedString[0] != '"' {
- return "", "", errors.New("invalid quoted string: missing initial quote")
- }
-
- quotedString = quotedString[1:]
- var remainder string
- escaping := false
- closedQuote := false
- result := &strings.Builder{}
-loop:
- for i := 0; i < len(quotedString); i++ {
- b := quotedString[i]
- switch b {
- case '"':
- if escaping {
- result.WriteByte(b)
- escaping = false
- } else {
- closedQuote = true
- remainder = strings.TrimSpace(quotedString[i+1:])
- break loop
- }
- case '\\':
- if escaping {
- result.WriteByte(b)
- escaping = false
- } else {
- escaping = true
- }
- default:
- result.WriteByte(b)
- escaping = false
- }
- }
-
- if !closedQuote {
- return "", "", errors.New("invalid quoted string: missing closing quote")
- }
- return result.String(), remainder, nil
-}
-
-func NewWarningHeader(code int, agent, text string) (string, error) {
- if code < 0 || code > 999 {
- return "", errors.New("code must be between 0 and 999")
- }
- if len(agent) == 0 {
- agent = "-"
- } else if !utf8.ValidString(agent) || strings.ContainsAny(agent, `\"`) || hasAnyRunes(agent, unicode.IsSpace, unicode.IsControl) {
- return "", errors.New("agent must be valid UTF-8 and must not contain spaces, quotes, backslashes, or control characters")
- }
- if !utf8.ValidString(text) || hasAnyRunes(text, unicode.IsControl) {
- return "", errors.New("text must be valid UTF-8 and must not contain control characters")
- }
- return fmt.Sprintf("%03d %s %s", code, agent, makeQuotedString(text)), nil
-}
-
-func hasAnyRunes(s string, runeCheckers ...func(rune) bool) bool {
- for _, r := range s {
- for _, checker := range runeCheckers {
- if checker(r) {
- return true
- }
- }
- }
- return false
-}
-
-func makeQuotedString(s string) string {
- result := &bytes.Buffer{}
- // opening quote
- result.WriteRune('"')
- for _, c := range s {
- switch c {
- case '"', '\\':
- // escape " and \
- result.WriteRune('\\')
- result.WriteRune(c)
- default:
- // write everything else as-is
- result.WriteRune(c)
- }
- }
- // closing quote
- result.WriteRune('"')
- return result.String()
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/interface.go b/vendor/k8s.io/apimachinery/pkg/util/net/interface.go
deleted file mode 100644
index 9adf4cfe4..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/net/interface.go
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
-Copyright 2016 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 net
-
-import (
- "bufio"
- "encoding/hex"
- "fmt"
- "io"
- "net"
- "os"
-
- "strings"
-
- "k8s.io/klog/v2"
-)
-
-type AddressFamily uint
-
-const (
- familyIPv4 AddressFamily = 4
- familyIPv6 AddressFamily = 6
-)
-
-type AddressFamilyPreference []AddressFamily
-
-var (
- preferIPv4 = AddressFamilyPreference{familyIPv4, familyIPv6}
- preferIPv6 = AddressFamilyPreference{familyIPv6, familyIPv4}
-)
-
-const (
- // LoopbackInterfaceName is the default name of the loopback interface
- LoopbackInterfaceName = "lo"
-)
-
-const (
- ipv4RouteFile = "/proc/net/route"
- ipv6RouteFile = "/proc/net/ipv6_route"
-)
-
-type Route struct {
- Interface string
- Destination net.IP
- Gateway net.IP
- Family AddressFamily
-}
-
-type RouteFile struct {
- name string
- parse func(input io.Reader) ([]Route, error)
-}
-
-// noRoutesError can be returned in case of no routes
-type noRoutesError struct {
- message string
-}
-
-func (e noRoutesError) Error() string {
- return e.message
-}
-
-// IsNoRoutesError checks if an error is of type noRoutesError
-func IsNoRoutesError(err error) bool {
- if err == nil {
- return false
- }
- switch err.(type) {
- case noRoutesError:
- return true
- default:
- return false
- }
-}
-
-var (
- v4File = RouteFile{name: ipv4RouteFile, parse: getIPv4DefaultRoutes}
- v6File = RouteFile{name: ipv6RouteFile, parse: getIPv6DefaultRoutes}
-)
-
-func (rf RouteFile) extract() ([]Route, error) {
- file, err := os.Open(rf.name)
- if err != nil {
- return nil, err
- }
- defer file.Close()
- return rf.parse(file)
-}
-
-// getIPv4DefaultRoutes obtains the IPv4 routes, and filters out non-default routes.
-func getIPv4DefaultRoutes(input io.Reader) ([]Route, error) {
- routes := []Route{}
- scanner := bufio.NewReader(input)
- for {
- line, err := scanner.ReadString('\n')
- if err == io.EOF {
- break
- }
- //ignore the headers in the route info
- if strings.HasPrefix(line, "Iface") {
- continue
- }
- fields := strings.Fields(line)
- // Interested in fields:
- // 0 - interface name
- // 1 - destination address
- // 2 - gateway
- dest, err := parseIP(fields[1], familyIPv4)
- if err != nil {
- return nil, err
- }
- gw, err := parseIP(fields[2], familyIPv4)
- if err != nil {
- return nil, err
- }
- if !dest.Equal(net.IPv4zero) {
- continue
- }
- routes = append(routes, Route{
- Interface: fields[0],
- Destination: dest,
- Gateway: gw,
- Family: familyIPv4,
- })
- }
- return routes, nil
-}
-
-func getIPv6DefaultRoutes(input io.Reader) ([]Route, error) {
- routes := []Route{}
- scanner := bufio.NewReader(input)
- for {
- line, err := scanner.ReadString('\n')
- if err == io.EOF {
- break
- }
- fields := strings.Fields(line)
- // Interested in fields:
- // 0 - destination address
- // 4 - gateway
- // 9 - interface name
- dest, err := parseIP(fields[0], familyIPv6)
- if err != nil {
- return nil, err
- }
- gw, err := parseIP(fields[4], familyIPv6)
- if err != nil {
- return nil, err
- }
- if !dest.Equal(net.IPv6zero) {
- continue
- }
- if gw.Equal(net.IPv6zero) {
- continue // loopback
- }
- routes = append(routes, Route{
- Interface: fields[9],
- Destination: dest,
- Gateway: gw,
- Family: familyIPv6,
- })
- }
- return routes, nil
-}
-
-// parseIP takes the hex IP address string from route file and converts it
-// to a net.IP address. For IPv4, the value must be converted to big endian.
-func parseIP(str string, family AddressFamily) (net.IP, error) {
- if str == "" {
- return nil, fmt.Errorf("input is nil")
- }
- bytes, err := hex.DecodeString(str)
- if err != nil {
- return nil, err
- }
- if family == familyIPv4 {
- if len(bytes) != net.IPv4len {
- return nil, fmt.Errorf("invalid IPv4 address in route")
- }
- return net.IP([]byte{bytes[3], bytes[2], bytes[1], bytes[0]}), nil
- }
- // Must be IPv6
- if len(bytes) != net.IPv6len {
- return nil, fmt.Errorf("invalid IPv6 address in route")
- }
- return net.IP(bytes), nil
-}
-
-func isInterfaceUp(intf *net.Interface) bool {
- if intf == nil {
- return false
- }
- if intf.Flags&net.FlagUp != 0 {
- klog.V(4).Infof("Interface %v is up", intf.Name)
- return true
- }
- return false
-}
-
-func isLoopbackOrPointToPoint(intf *net.Interface) bool {
- return intf.Flags&(net.FlagLoopback|net.FlagPointToPoint) != 0
-}
-
-// getMatchingGlobalIP returns the first valid global unicast address of the given
-// 'family' from the list of 'addrs'.
-func getMatchingGlobalIP(addrs []net.Addr, family AddressFamily) (net.IP, error) {
- if len(addrs) > 0 {
- for i := range addrs {
- klog.V(4).Infof("Checking addr %s.", addrs[i].String())
- ip, _, err := net.ParseCIDR(addrs[i].String())
- if err != nil {
- return nil, err
- }
- if memberOf(ip, family) {
- if ip.IsGlobalUnicast() {
- klog.V(4).Infof("IP found %v", ip)
- return ip, nil
- } else {
- klog.V(4).Infof("Non-global unicast address found %v", ip)
- }
- } else {
- klog.V(4).Infof("%v is not an IPv%d address", ip, int(family))
- }
-
- }
- }
- return nil, nil
-}
-
-// getIPFromInterface gets the IPs on an interface and returns a global unicast address, if any. The
-// interface must be up, the IP must in the family requested, and the IP must be a global unicast address.
-func getIPFromInterface(intfName string, forFamily AddressFamily, nw networkInterfacer) (net.IP, error) {
- intf, err := nw.InterfaceByName(intfName)
- if err != nil {
- return nil, err
- }
- if isInterfaceUp(intf) {
- addrs, err := nw.Addrs(intf)
- if err != nil {
- return nil, err
- }
- klog.V(4).Infof("Interface %q has %d addresses :%v.", intfName, len(addrs), addrs)
- matchingIP, err := getMatchingGlobalIP(addrs, forFamily)
- if err != nil {
- return nil, err
- }
- if matchingIP != nil {
- klog.V(4).Infof("Found valid IPv%d address %v for interface %q.", int(forFamily), matchingIP, intfName)
- return matchingIP, nil
- }
- }
- return nil, nil
-}
-
-// getIPFromLoopbackInterface gets the IPs on a loopback interface and returns a global unicast address, if any.
-// The loopback interface must be up, the IP must in the family requested, and the IP must be a global unicast address.
-func getIPFromLoopbackInterface(forFamily AddressFamily, nw networkInterfacer) (net.IP, error) {
- intfs, err := nw.Interfaces()
- if err != nil {
- return nil, err
- }
- for _, intf := range intfs {
- if !isInterfaceUp(&intf) {
- continue
- }
- if intf.Flags&(net.FlagLoopback) != 0 {
- addrs, err := nw.Addrs(&intf)
- if err != nil {
- return nil, err
- }
- klog.V(4).Infof("Interface %q has %d addresses :%v.", intf.Name, len(addrs), addrs)
- matchingIP, err := getMatchingGlobalIP(addrs, forFamily)
- if err != nil {
- return nil, err
- }
- if matchingIP != nil {
- klog.V(4).Infof("Found valid IPv%d address %v for interface %q.", int(forFamily), matchingIP, intf.Name)
- return matchingIP, nil
- }
- }
- }
- return nil, nil
-}
-
-// memberOf tells if the IP is of the desired family. Used for checking interface addresses.
-func memberOf(ip net.IP, family AddressFamily) bool {
- if ip.To4() != nil {
- return family == familyIPv4
- } else {
- return family == familyIPv6
- }
-}
-
-// chooseIPFromHostInterfaces looks at all system interfaces, trying to find one that is up that
-// has a global unicast address (non-loopback, non-link local, non-point2point), and returns the IP.
-// addressFamilies determines whether it prefers IPv4 or IPv6
-func chooseIPFromHostInterfaces(nw networkInterfacer, addressFamilies AddressFamilyPreference) (net.IP, error) {
- intfs, err := nw.Interfaces()
- if err != nil {
- return nil, err
- }
- if len(intfs) == 0 {
- return nil, fmt.Errorf("no interfaces found on host.")
- }
- for _, family := range addressFamilies {
- klog.V(4).Infof("Looking for system interface with a global IPv%d address", uint(family))
- for _, intf := range intfs {
- if !isInterfaceUp(&intf) {
- klog.V(4).Infof("Skipping: down interface %q", intf.Name)
- continue
- }
- if isLoopbackOrPointToPoint(&intf) {
- klog.V(4).Infof("Skipping: LB or P2P interface %q", intf.Name)
- continue
- }
- addrs, err := nw.Addrs(&intf)
- if err != nil {
- return nil, err
- }
- if len(addrs) == 0 {
- klog.V(4).Infof("Skipping: no addresses on interface %q", intf.Name)
- continue
- }
- for _, addr := range addrs {
- ip, _, err := net.ParseCIDR(addr.String())
- if err != nil {
- return nil, fmt.Errorf("Unable to parse CIDR for interface %q: %s", intf.Name, err)
- }
- if !memberOf(ip, family) {
- klog.V(4).Infof("Skipping: no address family match for %q on interface %q.", ip, intf.Name)
- continue
- }
- // TODO: Decide if should open up to allow IPv6 LLAs in future.
- if !ip.IsGlobalUnicast() {
- klog.V(4).Infof("Skipping: non-global address %q on interface %q.", ip, intf.Name)
- continue
- }
- klog.V(4).Infof("Found global unicast address %q on interface %q.", ip, intf.Name)
- return ip, nil
- }
- }
- }
- return nil, fmt.Errorf("no acceptable interface with global unicast address found on host")
-}
-
-// ChooseHostInterface is a method used fetch an IP for a daemon.
-// If there is no routing info file, it will choose a global IP from the system
-// interfaces. Otherwise, it will use IPv4 and IPv6 route information to return the
-// IP of the interface with a gateway on it (with priority given to IPv4). For a node
-// with no internet connection, it returns error.
-func ChooseHostInterface() (net.IP, error) {
- return chooseHostInterface(preferIPv4)
-}
-
-func chooseHostInterface(addressFamilies AddressFamilyPreference) (net.IP, error) {
- var nw networkInterfacer = networkInterface{}
- if _, err := os.Stat(ipv4RouteFile); os.IsNotExist(err) {
- return chooseIPFromHostInterfaces(nw, addressFamilies)
- }
- routes, err := getAllDefaultRoutes()
- if err != nil {
- return nil, err
- }
- return chooseHostInterfaceFromRoute(routes, nw, addressFamilies)
-}
-
-// networkInterfacer defines an interface for several net library functions. Production
-// code will forward to net library functions, and unit tests will override the methods
-// for testing purposes.
-type networkInterfacer interface {
- InterfaceByName(intfName string) (*net.Interface, error)
- Addrs(intf *net.Interface) ([]net.Addr, error)
- Interfaces() ([]net.Interface, error)
-}
-
-// networkInterface implements the networkInterfacer interface for production code, just
-// wrapping the underlying net library function calls.
-type networkInterface struct{}
-
-func (_ networkInterface) InterfaceByName(intfName string) (*net.Interface, error) {
- return net.InterfaceByName(intfName)
-}
-
-func (_ networkInterface) Addrs(intf *net.Interface) ([]net.Addr, error) {
- return intf.Addrs()
-}
-
-func (_ networkInterface) Interfaces() ([]net.Interface, error) {
- return net.Interfaces()
-}
-
-// getAllDefaultRoutes obtains IPv4 and IPv6 default routes on the node. If unable
-// to read the IPv4 routing info file, we return an error. If unable to read the IPv6
-// routing info file (which is optional), we'll just use the IPv4 route information.
-// Using all the routing info, if no default routes are found, an error is returned.
-func getAllDefaultRoutes() ([]Route, error) {
- routes, err := v4File.extract()
- if err != nil {
- return nil, err
- }
- v6Routes, _ := v6File.extract()
- routes = append(routes, v6Routes...)
- if len(routes) == 0 {
- return nil, noRoutesError{
- message: fmt.Sprintf("no default routes found in %q or %q", v4File.name, v6File.name),
- }
- }
- return routes, nil
-}
-
-// chooseHostInterfaceFromRoute cycles through each default route provided, looking for a
-// global IP address from the interface for the route. If there are routes but no global
-// address is obtained from the interfaces, it checks if the loopback interface has a global address.
-// addressFamilies determines whether it prefers IPv4 or IPv6
-func chooseHostInterfaceFromRoute(routes []Route, nw networkInterfacer, addressFamilies AddressFamilyPreference) (net.IP, error) {
- for _, family := range addressFamilies {
- klog.V(4).Infof("Looking for default routes with IPv%d addresses", uint(family))
- for _, route := range routes {
- if route.Family != family {
- continue
- }
- klog.V(4).Infof("Default route transits interface %q", route.Interface)
- finalIP, err := getIPFromInterface(route.Interface, family, nw)
- if err != nil {
- return nil, err
- }
- if finalIP != nil {
- klog.V(4).Infof("Found active IP %v ", finalIP)
- return finalIP, nil
- }
- // In case of network setups where default routes are present, but network
- // interfaces use only link-local addresses (e.g. as described in RFC5549).
- // the global IP is assigned to the loopback interface, and we should use it
- loopbackIP, err := getIPFromLoopbackInterface(family, nw)
- if err != nil {
- return nil, err
- }
- if loopbackIP != nil {
- klog.V(4).Infof("Found active IP %v on Loopback interface", loopbackIP)
- return loopbackIP, nil
- }
- }
- }
- klog.V(4).Infof("No active IP found by looking at default routes")
- return nil, fmt.Errorf("unable to select an IP from default routes.")
-}
-
-// ResolveBindAddress returns the IP address of a daemon, based on the given bindAddress:
-// If bindAddress is unset, it returns the host's default IP, as with ChooseHostInterface().
-// If bindAddress is unspecified or loopback, it returns the default IP of the same
-// address family as bindAddress.
-// Otherwise, it just returns bindAddress.
-func ResolveBindAddress(bindAddress net.IP) (net.IP, error) {
- addressFamilies := preferIPv4
- if bindAddress != nil && memberOf(bindAddress, familyIPv6) {
- addressFamilies = preferIPv6
- }
-
- if bindAddress == nil || bindAddress.IsUnspecified() || bindAddress.IsLoopback() {
- hostIP, err := chooseHostInterface(addressFamilies)
- if err != nil {
- return nil, err
- }
- bindAddress = hostIP
- }
- return bindAddress, nil
-}
-
-// ChooseBindAddressForInterface choose a global IP for a specific interface, with priority given to IPv4.
-// This is required in case of network setups where default routes are present, but network
-// interfaces use only link-local addresses (e.g. as described in RFC5549).
-// e.g when using BGP to announce a host IP over link-local ip addresses and this ip address is attached to the lo interface.
-func ChooseBindAddressForInterface(intfName string) (net.IP, error) {
- var nw networkInterfacer = networkInterface{}
- for _, family := range preferIPv4 {
- ip, err := getIPFromInterface(intfName, family, nw)
- if err != nil {
- return nil, err
- }
- if ip != nil {
- return ip, nil
- }
- }
- return nil, fmt.Errorf("unable to select an IP from %s network interface", intfName)
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/port_range.go b/vendor/k8s.io/apimachinery/pkg/util/net/port_range.go
deleted file mode 100644
index 42ecffcca..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/net/port_range.go
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
-Copyright 2015 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 net
-
-import (
- "fmt"
- "strconv"
- "strings"
-)
-
-// PortRange represents a range of TCP/UDP ports. To represent a single port,
-// set Size to 1.
-type PortRange struct {
- Base int
- Size int
-}
-
-// Contains tests whether a given port falls within the PortRange.
-func (pr *PortRange) Contains(p int) bool {
- return (p >= pr.Base) && ((p - pr.Base) < pr.Size)
-}
-
-// String converts the PortRange to a string representation, which can be
-// parsed by PortRange.Set or ParsePortRange.
-func (pr PortRange) String() string {
- if pr.Size == 0 {
- return ""
- }
- return fmt.Sprintf("%d-%d", pr.Base, pr.Base+pr.Size-1)
-}
-
-// Set parses a string of the form "value", "min-max", or "min+offset", inclusive at both ends, and
-// sets the PortRange from it. This is part of the flag.Value and pflag.Value
-// interfaces.
-func (pr *PortRange) Set(value string) error {
- const (
- SinglePortNotation = 1 << iota
- HyphenNotation
- PlusNotation
- )
-
- value = strings.TrimSpace(value)
- hyphenIndex := strings.Index(value, "-")
- plusIndex := strings.Index(value, "+")
-
- if value == "" {
- pr.Base = 0
- pr.Size = 0
- return nil
- }
-
- var err error
- var low, high int
- var notation int
-
- if plusIndex == -1 && hyphenIndex == -1 {
- notation |= SinglePortNotation
- }
- if hyphenIndex != -1 {
- notation |= HyphenNotation
- }
- if plusIndex != -1 {
- notation |= PlusNotation
- }
-
- switch notation {
- case SinglePortNotation:
- var port int
- port, err = strconv.Atoi(value)
- if err != nil {
- return err
- }
- low = port
- high = port
- case HyphenNotation:
- low, err = strconv.Atoi(value[:hyphenIndex])
- if err != nil {
- return err
- }
- high, err = strconv.Atoi(value[hyphenIndex+1:])
- if err != nil {
- return err
- }
- case PlusNotation:
- var offset int
- low, err = strconv.Atoi(value[:plusIndex])
- if err != nil {
- return err
- }
- offset, err = strconv.Atoi(value[plusIndex+1:])
- if err != nil {
- return err
- }
- high = low + offset
- default:
- return fmt.Errorf("unable to parse port range: %s", value)
- }
-
- if low > 65535 || high > 65535 {
- return fmt.Errorf("the port range cannot be greater than 65535: %s", value)
- }
-
- if high < low {
- return fmt.Errorf("end port cannot be less than start port: %s", value)
- }
-
- pr.Base = low
- pr.Size = 1 + high - low
- return nil
-}
-
-// Type returns a descriptive string about this type. This is part of the
-// pflag.Value interface.
-func (*PortRange) Type() string {
- return "portRange"
-}
-
-// ParsePortRange parses a string of the form "min-max", inclusive at both
-// ends, and initializes a new PortRange from it.
-func ParsePortRange(value string) (*PortRange, error) {
- pr := &PortRange{}
- err := pr.Set(value)
- if err != nil {
- return nil, err
- }
- return pr, nil
-}
-
-func ParsePortRangeOrDie(value string) *PortRange {
- pr, err := ParsePortRange(value)
- if err != nil {
- panic(fmt.Sprintf("couldn't parse port range %q: %v", value, err))
- }
- return pr
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/port_split.go b/vendor/k8s.io/apimachinery/pkg/util/net/port_split.go
deleted file mode 100644
index c0fd4e20f..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/net/port_split.go
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
-Copyright 2015 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 net
-
-import (
- "strings"
-
- "k8s.io/apimachinery/pkg/util/sets"
-)
-
-var validSchemes = sets.NewString("http", "https", "")
-
-// SplitSchemeNamePort takes a string of the following forms:
-// * "<name>", returns "", "<name>","", true
-// * "<name>:<port>", returns "", "<name>","<port>",true
-// * "<scheme>:<name>:<port>", returns "<scheme>","<name>","<port>",true
-//
-// Name must be non-empty or valid will be returned false.
-// Scheme must be "http" or "https" if specified
-// Port is returned as a string, and it is not required to be numeric (could be
-// used for a named port, for example).
-func SplitSchemeNamePort(id string) (scheme, name, port string, valid bool) {
- parts := strings.Split(id, ":")
- switch len(parts) {
- case 1:
- name = parts[0]
- case 2:
- name = parts[0]
- port = parts[1]
- case 3:
- scheme = parts[0]
- name = parts[1]
- port = parts[2]
- default:
- return "", "", "", false
- }
-
- if len(name) > 0 && validSchemes.Has(scheme) {
- return scheme, name, port, true
- } else {
- return "", "", "", false
- }
-}
-
-// JoinSchemeNamePort returns a string that specifies the scheme, name, and port:
-// * "<name>"
-// * "<name>:<port>"
-// * "<scheme>:<name>:<port>"
-// None of the parameters may contain a ':' character
-// Name is required
-// Scheme must be "", "http", or "https"
-func JoinSchemeNamePort(scheme, name, port string) string {
- if len(scheme) > 0 {
- // Must include three segments to specify scheme
- return scheme + ":" + name + ":" + port
- }
- if len(port) > 0 {
- // Must include two segments to specify port
- return name + ":" + port
- }
- // Return name alone
- return name
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/util.go b/vendor/k8s.io/apimachinery/pkg/util/net/util.go
deleted file mode 100644
index 5950087e0..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/net/util.go
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
-Copyright 2016 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 net
-
-import (
- "errors"
- "net"
- "reflect"
- "syscall"
-)
-
-// IPNetEqual checks if the two input IPNets are representing the same subnet.
-// For example,
-// 10.0.0.1/24 and 10.0.0.0/24 are the same subnet.
-// 10.0.0.1/24 and 10.0.0.0/25 are not the same subnet.
-func IPNetEqual(ipnet1, ipnet2 *net.IPNet) bool {
- if ipnet1 == nil || ipnet2 == nil {
- return false
- }
- if reflect.DeepEqual(ipnet1.Mask, ipnet2.Mask) && ipnet1.Contains(ipnet2.IP) && ipnet2.Contains(ipnet1.IP) {
- return true
- }
- return false
-}
-
-// Returns if the given err is "connection reset by peer" error.
-func IsConnectionReset(err error) bool {
- var errno syscall.Errno
- if errors.As(err, &errno) {
- return errno == syscall.ECONNRESET
- }
- return false
-}
-
-// Returns if the given err is "connection refused" error
-func IsConnectionRefused(err error) bool {
- var errno syscall.Errno
- if errors.As(err, &errno) {
- return errno == syscall.ECONNREFUSED
- }
- return false
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go b/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go
deleted file mode 100644
index 035c52811..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
-Copyright 2014 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 runtime
-
-import (
- "fmt"
- "net/http"
- "runtime"
- "sync"
- "time"
-
- "k8s.io/klog/v2"
-)
-
-var (
- // ReallyCrash controls the behavior of HandleCrash and now defaults
- // true. It's still exposed so components can optionally set to false
- // to restore prior behavior.
- ReallyCrash = true
-)
-
-// PanicHandlers is a list of functions which will be invoked when a panic happens.
-var PanicHandlers = []func(interface{}){logPanic}
-
-// HandleCrash simply catches a crash and logs an error. Meant to be called via
-// defer. Additional context-specific handlers can be provided, and will be
-// called in case of panic. HandleCrash actually crashes, after calling the
-// handlers and logging the panic message.
-//
-// E.g., you can provide one or more additional handlers for something like shutting down go routines gracefully.
-func HandleCrash(additionalHandlers ...func(interface{})) {
- if r := recover(); r != nil {
- for _, fn := range PanicHandlers {
- fn(r)
- }
- for _, fn := range additionalHandlers {
- fn(r)
- }
- if ReallyCrash {
- // Actually proceed to panic.
- panic(r)
- }
- }
-}
-
-// logPanic logs the caller tree when a panic occurs (except in the special case of http.ErrAbortHandler).
-func logPanic(r interface{}) {
- if r == http.ErrAbortHandler {
- // honor the http.ErrAbortHandler sentinel panic value:
- // ErrAbortHandler is a sentinel panic value to abort a handler.
- // While any panic from ServeHTTP aborts the response to the client,
- // panicking with ErrAbortHandler also suppresses logging of a stack trace to the server's error log.
- return
- }
-
- // Same as stdlib http server code. Manually allocate stack trace buffer size
- // to prevent excessively large logs
- const size = 64 << 10
- stacktrace := make([]byte, size)
- stacktrace = stacktrace[:runtime.Stack(stacktrace, false)]
- if _, ok := r.(string); ok {
- klog.Errorf("Observed a panic: %s\n%s", r, stacktrace)
- } else {
- klog.Errorf("Observed a panic: %#v (%v)\n%s", r, r, stacktrace)
- }
-}
-
-// 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.
-var ErrorHandlers = []func(error){
- logError,
- (&rudimentaryErrorBackoff{
- lastErrorTime: time.Now(),
- // 1ms was the number folks were able to stomach as a global rate limit.
- // If you need to log errors more than 1000 times a second you
- // should probably consider fixing your code instead. :)
- minPeriod: time.Millisecond,
- }).OnError,
-}
-
-// HandlerError is a method to invoke when a non-user facing piece of code cannot
-// return an error and needs to indicate it has been ignored. Invoking this method
-// is preferable to logging the error - the default behavior is to log but the
-// errors may be sent to a remote server for analysis.
-func HandleError(err error) {
- // this is sometimes called with a nil error. We probably shouldn't fail and should do nothing instead
- if err == nil {
- return
- }
-
- for _, fn := range ErrorHandlers {
- fn(err)
- }
-}
-
-// logError prints an error with the call stack of the location it was reported
-func logError(err error) {
- klog.ErrorDepth(2, err)
-}
-
-type rudimentaryErrorBackoff struct {
- minPeriod time.Duration // immutable
- // TODO(lavalamp): use the clock for testability. Need to move that
- // package for that to be accessible here.
- lastErrorTimeLock sync.Mutex
- lastErrorTime time.Time
-}
-
-// OnError will block if it is called more often than the embedded period time.
-// This will prevent overly tight hot error loops.
-func (r *rudimentaryErrorBackoff) OnError(error) {
- r.lastErrorTimeLock.Lock()
- defer r.lastErrorTimeLock.Unlock()
- d := time.Since(r.lastErrorTime)
- if d < r.minPeriod {
- // If the time moves backwards for any reason, do nothing
- time.Sleep(r.minPeriod - d)
- }
- r.lastErrorTime = time.Now()
-}
-
-// GetCaller returns the caller of the function that calls it.
-func GetCaller() string {
- var pc [1]uintptr
- runtime.Callers(3, pc[:])
- f := runtime.FuncForPC(pc[0])
- if f == nil {
- return fmt.Sprintf("Unable to find caller")
- }
- return f.Name()
-}
-
-// RecoverFromPanic replaces the specified error with an error containing the
-// original error, and the call tree when a panic occurs. This enables error
-// handlers to handle errors and panics the same way.
-func RecoverFromPanic(err *error) {
- if r := recover(); r != nil {
- // Same as stdlib http server code. Manually allocate stack trace buffer size
- // to prevent excessively large logs
- const size = 64 << 10
- stacktrace := make([]byte, size)
- stacktrace = stacktrace[:runtime.Stack(stacktrace, false)]
-
- *err = fmt.Errorf(
- "recovered from panic %q. (err=%v) Call stack:\n%s",
- r,
- *err,
- stacktrace)
- }
-}
-
-// 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/sets/byte.go b/vendor/k8s.io/apimachinery/pkg/util/sets/byte.go
deleted file mode 100644
index 9bfa85d43..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/sets/byte.go
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
-Copyright 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.
-*/
-
-// Code generated by set-gen. DO NOT EDIT.
-
-package sets
-
-import (
- "reflect"
- "sort"
-)
-
-// sets.Byte is a set of bytes, implemented via map[byte]struct{} for minimal memory consumption.
-type Byte map[byte]Empty
-
-// NewByte creates a Byte from a list of values.
-func NewByte(items ...byte) Byte {
- ss := Byte{}
- ss.Insert(items...)
- return ss
-}
-
-// ByteKeySet creates a Byte from a keys of a map[byte](? extends interface{}).
-// If the value passed in is not actually a map, this will panic.
-func ByteKeySet(theMap interface{}) Byte {
- v := reflect.ValueOf(theMap)
- ret := Byte{}
-
- for _, keyValue := range v.MapKeys() {
- ret.Insert(keyValue.Interface().(byte))
- }
- return ret
-}
-
-// Insert adds items to the set.
-func (s Byte) Insert(items ...byte) Byte {
- for _, item := range items {
- s[item] = Empty{}
- }
- return s
-}
-
-// Delete removes all items from the set.
-func (s Byte) Delete(items ...byte) Byte {
- for _, item := range items {
- delete(s, item)
- }
- return s
-}
-
-// Has returns true if and only if item is contained in the set.
-func (s Byte) Has(item byte) bool {
- _, contained := s[item]
- return contained
-}
-
-// HasAll returns true if and only if all items are contained in the set.
-func (s Byte) HasAll(items ...byte) bool {
- for _, item := range items {
- if !s.Has(item) {
- return false
- }
- }
- return true
-}
-
-// HasAny returns true if any items are contained in the set.
-func (s Byte) HasAny(items ...byte) bool {
- for _, item := range items {
- if s.Has(item) {
- return true
- }
- }
- return false
-}
-
-// Difference returns a set of objects that are not in s2
-// For example:
-// s1 = {a1, a2, a3}
-// s2 = {a1, a2, a4, a5}
-// s1.Difference(s2) = {a3}
-// s2.Difference(s1) = {a4, a5}
-func (s Byte) Difference(s2 Byte) Byte {
- result := NewByte()
- for key := range s {
- if !s2.Has(key) {
- result.Insert(key)
- }
- }
- return result
-}
-
-// Union returns a new set which includes items in either s1 or s2.
-// For example:
-// s1 = {a1, a2}
-// s2 = {a3, a4}
-// s1.Union(s2) = {a1, a2, a3, a4}
-// s2.Union(s1) = {a1, a2, a3, a4}
-func (s1 Byte) Union(s2 Byte) Byte {
- result := NewByte()
- for key := range s1 {
- result.Insert(key)
- }
- for key := range s2 {
- result.Insert(key)
- }
- return result
-}
-
-// Intersection returns a new set which includes the item in BOTH s1 and s2
-// For example:
-// s1 = {a1, a2}
-// s2 = {a2, a3}
-// s1.Intersection(s2) = {a2}
-func (s1 Byte) Intersection(s2 Byte) Byte {
- var walk, other Byte
- result := NewByte()
- if s1.Len() < s2.Len() {
- walk = s1
- other = s2
- } else {
- walk = s2
- other = s1
- }
- for key := range walk {
- if other.Has(key) {
- result.Insert(key)
- }
- }
- return result
-}
-
-// IsSuperset returns true if and only if s1 is a superset of s2.
-func (s1 Byte) IsSuperset(s2 Byte) bool {
- for item := range s2 {
- if !s1.Has(item) {
- return false
- }
- }
- return true
-}
-
-// Equal returns true if and only if s1 is equal (as a set) to s2.
-// Two sets are equal if their membership is identical.
-// (In practice, this means same elements, order doesn't matter)
-func (s1 Byte) Equal(s2 Byte) bool {
- return len(s1) == len(s2) && s1.IsSuperset(s2)
-}
-
-type sortableSliceOfByte []byte
-
-func (s sortableSliceOfByte) Len() int { return len(s) }
-func (s sortableSliceOfByte) Less(i, j int) bool { return lessByte(s[i], s[j]) }
-func (s sortableSliceOfByte) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-
-// List returns the contents as a sorted byte slice.
-func (s Byte) List() []byte {
- res := make(sortableSliceOfByte, 0, len(s))
- for key := range s {
- res = append(res, key)
- }
- sort.Sort(res)
- return []byte(res)
-}
-
-// UnsortedList returns the slice with contents in random order.
-func (s Byte) UnsortedList() []byte {
- res := make([]byte, 0, len(s))
- for key := range s {
- res = append(res, key)
- }
- return res
-}
-
-// Returns a single element from the set.
-func (s Byte) PopAny() (byte, bool) {
- for key := range s {
- s.Delete(key)
- return key, true
- }
- var zeroValue byte
- return zeroValue, false
-}
-
-// Len returns the size of the set.
-func (s Byte) Len() int {
- return len(s)
-}
-
-func lessByte(lhs, rhs byte) bool {
- return lhs < rhs
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/doc.go b/vendor/k8s.io/apimachinery/pkg/util/sets/doc.go
deleted file mode 100644
index b152a0bf0..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/sets/doc.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
-Copyright 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.
-*/
-
-// Code generated by set-gen. DO NOT EDIT.
-
-// Package sets has auto-generated set types.
-package sets
diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/empty.go b/vendor/k8s.io/apimachinery/pkg/util/sets/empty.go
deleted file mode 100644
index e11e622c5..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/sets/empty.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-Copyright 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.
-*/
-
-// Code generated by set-gen. DO NOT EDIT.
-
-package sets
-
-// Empty is public since it is used by some internal API objects for conversions between external
-// string arrays and internal sets, and conversion logic requires public types today.
-type Empty struct{}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/int.go b/vendor/k8s.io/apimachinery/pkg/util/sets/int.go
deleted file mode 100644
index 88bd70967..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/sets/int.go
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
-Copyright 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.
-*/
-
-// Code generated by set-gen. DO NOT EDIT.
-
-package sets
-
-import (
- "reflect"
- "sort"
-)
-
-// sets.Int is a set of ints, implemented via map[int]struct{} for minimal memory consumption.
-type Int map[int]Empty
-
-// NewInt creates a Int from a list of values.
-func NewInt(items ...int) Int {
- ss := Int{}
- ss.Insert(items...)
- return ss
-}
-
-// IntKeySet creates a Int from a keys of a map[int](? extends interface{}).
-// If the value passed in is not actually a map, this will panic.
-func IntKeySet(theMap interface{}) Int {
- v := reflect.ValueOf(theMap)
- ret := Int{}
-
- for _, keyValue := range v.MapKeys() {
- ret.Insert(keyValue.Interface().(int))
- }
- return ret
-}
-
-// Insert adds items to the set.
-func (s Int) Insert(items ...int) Int {
- for _, item := range items {
- s[item] = Empty{}
- }
- return s
-}
-
-// Delete removes all items from the set.
-func (s Int) Delete(items ...int) Int {
- for _, item := range items {
- delete(s, item)
- }
- return s
-}
-
-// Has returns true if and only if item is contained in the set.
-func (s Int) Has(item int) bool {
- _, contained := s[item]
- return contained
-}
-
-// HasAll returns true if and only if all items are contained in the set.
-func (s Int) HasAll(items ...int) bool {
- for _, item := range items {
- if !s.Has(item) {
- return false
- }
- }
- return true
-}
-
-// HasAny returns true if any items are contained in the set.
-func (s Int) HasAny(items ...int) bool {
- for _, item := range items {
- if s.Has(item) {
- return true
- }
- }
- return false
-}
-
-// Difference returns a set of objects that are not in s2
-// For example:
-// s1 = {a1, a2, a3}
-// s2 = {a1, a2, a4, a5}
-// s1.Difference(s2) = {a3}
-// s2.Difference(s1) = {a4, a5}
-func (s Int) Difference(s2 Int) Int {
- result := NewInt()
- for key := range s {
- if !s2.Has(key) {
- result.Insert(key)
- }
- }
- return result
-}
-
-// Union returns a new set which includes items in either s1 or s2.
-// For example:
-// s1 = {a1, a2}
-// s2 = {a3, a4}
-// s1.Union(s2) = {a1, a2, a3, a4}
-// s2.Union(s1) = {a1, a2, a3, a4}
-func (s1 Int) Union(s2 Int) Int {
- result := NewInt()
- for key := range s1 {
- result.Insert(key)
- }
- for key := range s2 {
- result.Insert(key)
- }
- return result
-}
-
-// Intersection returns a new set which includes the item in BOTH s1 and s2
-// For example:
-// s1 = {a1, a2}
-// s2 = {a2, a3}
-// s1.Intersection(s2) = {a2}
-func (s1 Int) Intersection(s2 Int) Int {
- var walk, other Int
- result := NewInt()
- if s1.Len() < s2.Len() {
- walk = s1
- other = s2
- } else {
- walk = s2
- other = s1
- }
- for key := range walk {
- if other.Has(key) {
- result.Insert(key)
- }
- }
- return result
-}
-
-// IsSuperset returns true if and only if s1 is a superset of s2.
-func (s1 Int) IsSuperset(s2 Int) bool {
- for item := range s2 {
- if !s1.Has(item) {
- return false
- }
- }
- return true
-}
-
-// Equal returns true if and only if s1 is equal (as a set) to s2.
-// Two sets are equal if their membership is identical.
-// (In practice, this means same elements, order doesn't matter)
-func (s1 Int) Equal(s2 Int) bool {
- return len(s1) == len(s2) && s1.IsSuperset(s2)
-}
-
-type sortableSliceOfInt []int
-
-func (s sortableSliceOfInt) Len() int { return len(s) }
-func (s sortableSliceOfInt) Less(i, j int) bool { return lessInt(s[i], s[j]) }
-func (s sortableSliceOfInt) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-
-// List returns the contents as a sorted int slice.
-func (s Int) List() []int {
- res := make(sortableSliceOfInt, 0, len(s))
- for key := range s {
- res = append(res, key)
- }
- sort.Sort(res)
- return []int(res)
-}
-
-// UnsortedList returns the slice with contents in random order.
-func (s Int) UnsortedList() []int {
- res := make([]int, 0, len(s))
- for key := range s {
- res = append(res, key)
- }
- return res
-}
-
-// Returns a single element from the set.
-func (s Int) PopAny() (int, bool) {
- for key := range s {
- s.Delete(key)
- return key, true
- }
- var zeroValue int
- return zeroValue, false
-}
-
-// Len returns the size of the set.
-func (s Int) Len() int {
- return len(s)
-}
-
-func lessInt(lhs, rhs int) bool {
- return lhs < rhs
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/int32.go b/vendor/k8s.io/apimachinery/pkg/util/sets/int32.go
deleted file mode 100644
index 96a485554..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/sets/int32.go
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
-Copyright 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.
-*/
-
-// Code generated by set-gen. DO NOT EDIT.
-
-package sets
-
-import (
- "reflect"
- "sort"
-)
-
-// sets.Int32 is a set of int32s, implemented via map[int32]struct{} for minimal memory consumption.
-type Int32 map[int32]Empty
-
-// NewInt32 creates a Int32 from a list of values.
-func NewInt32(items ...int32) Int32 {
- ss := Int32{}
- ss.Insert(items...)
- return ss
-}
-
-// Int32KeySet creates a Int32 from a keys of a map[int32](? extends interface{}).
-// If the value passed in is not actually a map, this will panic.
-func Int32KeySet(theMap interface{}) Int32 {
- v := reflect.ValueOf(theMap)
- ret := Int32{}
-
- for _, keyValue := range v.MapKeys() {
- ret.Insert(keyValue.Interface().(int32))
- }
- return ret
-}
-
-// Insert adds items to the set.
-func (s Int32) Insert(items ...int32) Int32 {
- for _, item := range items {
- s[item] = Empty{}
- }
- return s
-}
-
-// Delete removes all items from the set.
-func (s Int32) Delete(items ...int32) Int32 {
- for _, item := range items {
- delete(s, item)
- }
- return s
-}
-
-// Has returns true if and only if item is contained in the set.
-func (s Int32) Has(item int32) bool {
- _, contained := s[item]
- return contained
-}
-
-// HasAll returns true if and only if all items are contained in the set.
-func (s Int32) HasAll(items ...int32) bool {
- for _, item := range items {
- if !s.Has(item) {
- return false
- }
- }
- return true
-}
-
-// HasAny returns true if any items are contained in the set.
-func (s Int32) HasAny(items ...int32) bool {
- for _, item := range items {
- if s.Has(item) {
- return true
- }
- }
- return false
-}
-
-// Difference returns a set of objects that are not in s2
-// For example:
-// s1 = {a1, a2, a3}
-// s2 = {a1, a2, a4, a5}
-// s1.Difference(s2) = {a3}
-// s2.Difference(s1) = {a4, a5}
-func (s Int32) Difference(s2 Int32) Int32 {
- result := NewInt32()
- for key := range s {
- if !s2.Has(key) {
- result.Insert(key)
- }
- }
- return result
-}
-
-// Union returns a new set which includes items in either s1 or s2.
-// For example:
-// s1 = {a1, a2}
-// s2 = {a3, a4}
-// s1.Union(s2) = {a1, a2, a3, a4}
-// s2.Union(s1) = {a1, a2, a3, a4}
-func (s1 Int32) Union(s2 Int32) Int32 {
- result := NewInt32()
- for key := range s1 {
- result.Insert(key)
- }
- for key := range s2 {
- result.Insert(key)
- }
- return result
-}
-
-// Intersection returns a new set which includes the item in BOTH s1 and s2
-// For example:
-// s1 = {a1, a2}
-// s2 = {a2, a3}
-// s1.Intersection(s2) = {a2}
-func (s1 Int32) Intersection(s2 Int32) Int32 {
- var walk, other Int32
- result := NewInt32()
- if s1.Len() < s2.Len() {
- walk = s1
- other = s2
- } else {
- walk = s2
- other = s1
- }
- for key := range walk {
- if other.Has(key) {
- result.Insert(key)
- }
- }
- return result
-}
-
-// IsSuperset returns true if and only if s1 is a superset of s2.
-func (s1 Int32) IsSuperset(s2 Int32) bool {
- for item := range s2 {
- if !s1.Has(item) {
- return false
- }
- }
- return true
-}
-
-// Equal returns true if and only if s1 is equal (as a set) to s2.
-// Two sets are equal if their membership is identical.
-// (In practice, this means same elements, order doesn't matter)
-func (s1 Int32) Equal(s2 Int32) bool {
- return len(s1) == len(s2) && s1.IsSuperset(s2)
-}
-
-type sortableSliceOfInt32 []int32
-
-func (s sortableSliceOfInt32) Len() int { return len(s) }
-func (s sortableSliceOfInt32) Less(i, j int) bool { return lessInt32(s[i], s[j]) }
-func (s sortableSliceOfInt32) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-
-// List returns the contents as a sorted int32 slice.
-func (s Int32) List() []int32 {
- res := make(sortableSliceOfInt32, 0, len(s))
- for key := range s {
- res = append(res, key)
- }
- sort.Sort(res)
- return []int32(res)
-}
-
-// UnsortedList returns the slice with contents in random order.
-func (s Int32) UnsortedList() []int32 {
- res := make([]int32, 0, len(s))
- for key := range s {
- res = append(res, key)
- }
- return res
-}
-
-// Returns a single element from the set.
-func (s Int32) PopAny() (int32, bool) {
- for key := range s {
- s.Delete(key)
- return key, true
- }
- var zeroValue int32
- return zeroValue, false
-}
-
-// Len returns the size of the set.
-func (s Int32) Len() int {
- return len(s)
-}
-
-func lessInt32(lhs, rhs int32) bool {
- return lhs < rhs
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/int64.go b/vendor/k8s.io/apimachinery/pkg/util/sets/int64.go
deleted file mode 100644
index b375a1b06..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/sets/int64.go
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
-Copyright 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.
-*/
-
-// Code generated by set-gen. DO NOT EDIT.
-
-package sets
-
-import (
- "reflect"
- "sort"
-)
-
-// sets.Int64 is a set of int64s, implemented via map[int64]struct{} for minimal memory consumption.
-type Int64 map[int64]Empty
-
-// NewInt64 creates a Int64 from a list of values.
-func NewInt64(items ...int64) Int64 {
- ss := Int64{}
- ss.Insert(items...)
- return ss
-}
-
-// Int64KeySet creates a Int64 from a keys of a map[int64](? extends interface{}).
-// If the value passed in is not actually a map, this will panic.
-func Int64KeySet(theMap interface{}) Int64 {
- v := reflect.ValueOf(theMap)
- ret := Int64{}
-
- for _, keyValue := range v.MapKeys() {
- ret.Insert(keyValue.Interface().(int64))
- }
- return ret
-}
-
-// Insert adds items to the set.
-func (s Int64) Insert(items ...int64) Int64 {
- for _, item := range items {
- s[item] = Empty{}
- }
- return s
-}
-
-// Delete removes all items from the set.
-func (s Int64) Delete(items ...int64) Int64 {
- for _, item := range items {
- delete(s, item)
- }
- return s
-}
-
-// Has returns true if and only if item is contained in the set.
-func (s Int64) Has(item int64) bool {
- _, contained := s[item]
- return contained
-}
-
-// HasAll returns true if and only if all items are contained in the set.
-func (s Int64) HasAll(items ...int64) bool {
- for _, item := range items {
- if !s.Has(item) {
- return false
- }
- }
- return true
-}
-
-// HasAny returns true if any items are contained in the set.
-func (s Int64) HasAny(items ...int64) bool {
- for _, item := range items {
- if s.Has(item) {
- return true
- }
- }
- return false
-}
-
-// Difference returns a set of objects that are not in s2
-// For example:
-// s1 = {a1, a2, a3}
-// s2 = {a1, a2, a4, a5}
-// s1.Difference(s2) = {a3}
-// s2.Difference(s1) = {a4, a5}
-func (s Int64) Difference(s2 Int64) Int64 {
- result := NewInt64()
- for key := range s {
- if !s2.Has(key) {
- result.Insert(key)
- }
- }
- return result
-}
-
-// Union returns a new set which includes items in either s1 or s2.
-// For example:
-// s1 = {a1, a2}
-// s2 = {a3, a4}
-// s1.Union(s2) = {a1, a2, a3, a4}
-// s2.Union(s1) = {a1, a2, a3, a4}
-func (s1 Int64) Union(s2 Int64) Int64 {
- result := NewInt64()
- for key := range s1 {
- result.Insert(key)
- }
- for key := range s2 {
- result.Insert(key)
- }
- return result
-}
-
-// Intersection returns a new set which includes the item in BOTH s1 and s2
-// For example:
-// s1 = {a1, a2}
-// s2 = {a2, a3}
-// s1.Intersection(s2) = {a2}
-func (s1 Int64) Intersection(s2 Int64) Int64 {
- var walk, other Int64
- result := NewInt64()
- if s1.Len() < s2.Len() {
- walk = s1
- other = s2
- } else {
- walk = s2
- other = s1
- }
- for key := range walk {
- if other.Has(key) {
- result.Insert(key)
- }
- }
- return result
-}
-
-// IsSuperset returns true if and only if s1 is a superset of s2.
-func (s1 Int64) IsSuperset(s2 Int64) bool {
- for item := range s2 {
- if !s1.Has(item) {
- return false
- }
- }
- return true
-}
-
-// Equal returns true if and only if s1 is equal (as a set) to s2.
-// Two sets are equal if their membership is identical.
-// (In practice, this means same elements, order doesn't matter)
-func (s1 Int64) Equal(s2 Int64) bool {
- return len(s1) == len(s2) && s1.IsSuperset(s2)
-}
-
-type sortableSliceOfInt64 []int64
-
-func (s sortableSliceOfInt64) Len() int { return len(s) }
-func (s sortableSliceOfInt64) Less(i, j int) bool { return lessInt64(s[i], s[j]) }
-func (s sortableSliceOfInt64) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-
-// List returns the contents as a sorted int64 slice.
-func (s Int64) List() []int64 {
- res := make(sortableSliceOfInt64, 0, len(s))
- for key := range s {
- res = append(res, key)
- }
- sort.Sort(res)
- return []int64(res)
-}
-
-// UnsortedList returns the slice with contents in random order.
-func (s Int64) UnsortedList() []int64 {
- res := make([]int64, 0, len(s))
- for key := range s {
- res = append(res, key)
- }
- return res
-}
-
-// Returns a single element from the set.
-func (s Int64) PopAny() (int64, bool) {
- for key := range s {
- s.Delete(key)
- return key, true
- }
- var zeroValue int64
- return zeroValue, false
-}
-
-// Len returns the size of the set.
-func (s Int64) Len() int {
- return len(s)
-}
-
-func lessInt64(lhs, rhs int64) bool {
- return lhs < rhs
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/string.go b/vendor/k8s.io/apimachinery/pkg/util/sets/string.go
deleted file mode 100644
index e6f37db88..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/sets/string.go
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
-Copyright 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.
-*/
-
-// Code generated by set-gen. DO NOT EDIT.
-
-package sets
-
-import (
- "reflect"
- "sort"
-)
-
-// sets.String is a set of strings, implemented via map[string]struct{} for minimal memory consumption.
-type String map[string]Empty
-
-// NewString creates a String from a list of values.
-func NewString(items ...string) String {
- ss := String{}
- ss.Insert(items...)
- return ss
-}
-
-// StringKeySet creates a String from a keys of a map[string](? extends interface{}).
-// If the value passed in is not actually a map, this will panic.
-func StringKeySet(theMap interface{}) String {
- v := reflect.ValueOf(theMap)
- ret := String{}
-
- for _, keyValue := range v.MapKeys() {
- ret.Insert(keyValue.Interface().(string))
- }
- return ret
-}
-
-// Insert adds items to the set.
-func (s String) Insert(items ...string) String {
- for _, item := range items {
- s[item] = Empty{}
- }
- return s
-}
-
-// Delete removes all items from the set.
-func (s String) Delete(items ...string) String {
- for _, item := range items {
- delete(s, item)
- }
- return s
-}
-
-// Has returns true if and only if item is contained in the set.
-func (s String) Has(item string) bool {
- _, contained := s[item]
- return contained
-}
-
-// HasAll returns true if and only if all items are contained in the set.
-func (s String) HasAll(items ...string) bool {
- for _, item := range items {
- if !s.Has(item) {
- return false
- }
- }
- return true
-}
-
-// HasAny returns true if any items are contained in the set.
-func (s String) HasAny(items ...string) bool {
- for _, item := range items {
- if s.Has(item) {
- return true
- }
- }
- return false
-}
-
-// Difference returns a set of objects that are not in s2
-// For example:
-// s1 = {a1, a2, a3}
-// s2 = {a1, a2, a4, a5}
-// s1.Difference(s2) = {a3}
-// s2.Difference(s1) = {a4, a5}
-func (s String) Difference(s2 String) String {
- result := NewString()
- for key := range s {
- if !s2.Has(key) {
- result.Insert(key)
- }
- }
- return result
-}
-
-// Union returns a new set which includes items in either s1 or s2.
-// For example:
-// s1 = {a1, a2}
-// s2 = {a3, a4}
-// s1.Union(s2) = {a1, a2, a3, a4}
-// s2.Union(s1) = {a1, a2, a3, a4}
-func (s1 String) Union(s2 String) String {
- result := NewString()
- for key := range s1 {
- result.Insert(key)
- }
- for key := range s2 {
- result.Insert(key)
- }
- return result
-}
-
-// Intersection returns a new set which includes the item in BOTH s1 and s2
-// For example:
-// s1 = {a1, a2}
-// s2 = {a2, a3}
-// s1.Intersection(s2) = {a2}
-func (s1 String) Intersection(s2 String) String {
- var walk, other String
- result := NewString()
- if s1.Len() < s2.Len() {
- walk = s1
- other = s2
- } else {
- walk = s2
- other = s1
- }
- for key := range walk {
- if other.Has(key) {
- result.Insert(key)
- }
- }
- return result
-}
-
-// IsSuperset returns true if and only if s1 is a superset of s2.
-func (s1 String) IsSuperset(s2 String) bool {
- for item := range s2 {
- if !s1.Has(item) {
- return false
- }
- }
- return true
-}
-
-// Equal returns true if and only if s1 is equal (as a set) to s2.
-// Two sets are equal if their membership is identical.
-// (In practice, this means same elements, order doesn't matter)
-func (s1 String) Equal(s2 String) bool {
- return len(s1) == len(s2) && s1.IsSuperset(s2)
-}
-
-type sortableSliceOfString []string
-
-func (s sortableSliceOfString) Len() int { return len(s) }
-func (s sortableSliceOfString) Less(i, j int) bool { return lessString(s[i], s[j]) }
-func (s sortableSliceOfString) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-
-// List returns the contents as a sorted string slice.
-func (s String) List() []string {
- res := make(sortableSliceOfString, 0, len(s))
- for key := range s {
- res = append(res, key)
- }
- sort.Sort(res)
- return []string(res)
-}
-
-// UnsortedList returns the slice with contents in random order.
-func (s String) UnsortedList() []string {
- res := make([]string, 0, len(s))
- for key := range s {
- res = append(res, key)
- }
- return res
-}
-
-// Returns a single element from the set.
-func (s String) PopAny() (string, bool) {
- for key := range s {
- s.Delete(key)
- return key, true
- }
- var zeroValue string
- return zeroValue, false
-}
-
-// Len returns the size of the set.
-func (s String) Len() int {
- return len(s)
-}
-
-func lessString(lhs, rhs string) bool {
- return lhs < rhs
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go b/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go
deleted file mode 100644
index c283ad189..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
-Copyright 2014 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 field
-
-import (
- "fmt"
- "reflect"
- "strconv"
- "strings"
-
- utilerrors "k8s.io/apimachinery/pkg/util/errors"
- "k8s.io/apimachinery/pkg/util/sets"
-)
-
-// Error is an implementation of the 'error' interface, which represents a
-// field-level validation error.
-type Error struct {
- Type ErrorType
- Field string
- BadValue interface{}
- Detail string
-}
-
-var _ error = &Error{}
-
-// Error implements the error interface.
-func (v *Error) Error() string {
- return fmt.Sprintf("%s: %s", v.Field, v.ErrorBody())
-}
-
-// ErrorBody returns the error message without the field name. This is useful
-// for building nice-looking higher-level error reporting.
-func (v *Error) ErrorBody() string {
- var s string
- switch v.Type {
- case ErrorTypeRequired, ErrorTypeForbidden, ErrorTypeTooLong, ErrorTypeInternal:
- s = v.Type.String()
- default:
- value := v.BadValue
- valueType := reflect.TypeOf(value)
- if value == nil || valueType == nil {
- value = "null"
- } else if valueType.Kind() == reflect.Ptr {
- if reflectValue := reflect.ValueOf(value); reflectValue.IsNil() {
- value = "null"
- } else {
- value = reflectValue.Elem().Interface()
- }
- }
- switch t := value.(type) {
- case int64, int32, float64, float32, bool:
- // use simple printer for simple types
- s = fmt.Sprintf("%s: %v", v.Type, value)
- case string:
- s = fmt.Sprintf("%s: %q", v.Type, t)
- case fmt.Stringer:
- // anything that defines String() is better than raw struct
- s = fmt.Sprintf("%s: %s", v.Type, t.String())
- default:
- // fallback to raw struct
- // TODO: internal types have panic guards against json.Marshalling to prevent
- // accidental use of internal types in external serialized form. For now, use
- // %#v, although it would be better to show a more expressive output in the future
- s = fmt.Sprintf("%s: %#v", v.Type, value)
- }
- }
- if len(v.Detail) != 0 {
- s += fmt.Sprintf(": %s", v.Detail)
- }
- return s
-}
-
-// ErrorType is a machine readable value providing more detail about why
-// a field is invalid. These values are expected to match 1-1 with
-// CauseType in api/types.go.
-type ErrorType string
-
-// TODO: These values are duplicated in api/types.go, but there's a circular dep. Fix it.
-const (
- // ErrorTypeNotFound is used to report failure to find a requested value
- // (e.g. looking up an ID). See NotFound().
- ErrorTypeNotFound ErrorType = "FieldValueNotFound"
- // ErrorTypeRequired is used to report required values that are not
- // provided (e.g. empty strings, null values, or empty arrays). See
- // Required().
- ErrorTypeRequired ErrorType = "FieldValueRequired"
- // ErrorTypeDuplicate is used to report collisions of values that must be
- // unique (e.g. unique IDs). See Duplicate().
- ErrorTypeDuplicate ErrorType = "FieldValueDuplicate"
- // ErrorTypeInvalid is used to report malformed values (e.g. failed regex
- // match, too long, out of bounds). See Invalid().
- ErrorTypeInvalid ErrorType = "FieldValueInvalid"
- // ErrorTypeNotSupported is used to report unknown values for enumerated
- // fields (e.g. a list of valid values). See NotSupported().
- ErrorTypeNotSupported ErrorType = "FieldValueNotSupported"
- // ErrorTypeForbidden is used to report valid (as per formatting rules)
- // values which would be accepted under some conditions, but which are not
- // permitted by the current conditions (such as security policy). See
- // Forbidden().
- ErrorTypeForbidden ErrorType = "FieldValueForbidden"
- // ErrorTypeTooLong is used to report that the given value is too long.
- // This is similar to ErrorTypeInvalid, but the error will not include the
- // too-long value. See TooLong().
- ErrorTypeTooLong ErrorType = "FieldValueTooLong"
- // ErrorTypeTooMany is used to report "too many". This is used to
- // report that a given list has too many items. This is similar to FieldValueTooLong,
- // but the error indicates quantity instead of length.
- ErrorTypeTooMany ErrorType = "FieldValueTooMany"
- // ErrorTypeInternal is used to report other errors that are not related
- // to user input. See InternalError().
- ErrorTypeInternal ErrorType = "InternalError"
-)
-
-// String converts a ErrorType into its corresponding canonical error message.
-func (t ErrorType) String() string {
- switch t {
- case ErrorTypeNotFound:
- return "Not found"
- case ErrorTypeRequired:
- return "Required value"
- case ErrorTypeDuplicate:
- return "Duplicate value"
- case ErrorTypeInvalid:
- return "Invalid value"
- case ErrorTypeNotSupported:
- return "Unsupported value"
- case ErrorTypeForbidden:
- return "Forbidden"
- case ErrorTypeTooLong:
- return "Too long"
- case ErrorTypeTooMany:
- return "Too many"
- case ErrorTypeInternal:
- return "Internal error"
- default:
- panic(fmt.Sprintf("unrecognized validation error: %q", string(t)))
- }
-}
-
-// NotFound returns a *Error indicating "value not found". This is
-// used to report failure to find a requested value (e.g. looking up an ID).
-func NotFound(field *Path, value interface{}) *Error {
- return &Error{ErrorTypeNotFound, field.String(), value, ""}
-}
-
-// Required returns a *Error indicating "value required". This is used
-// to report required values that are not provided (e.g. empty strings, null
-// values, or empty arrays).
-func Required(field *Path, detail string) *Error {
- return &Error{ErrorTypeRequired, field.String(), "", detail}
-}
-
-// Duplicate returns a *Error indicating "duplicate value". This is
-// used to report collisions of values that must be unique (e.g. names or IDs).
-func Duplicate(field *Path, value interface{}) *Error {
- return &Error{ErrorTypeDuplicate, field.String(), value, ""}
-}
-
-// Invalid returns a *Error indicating "invalid value". This is used
-// to report malformed values (e.g. failed regex match, too long, out of bounds).
-func Invalid(field *Path, value interface{}, detail string) *Error {
- return &Error{ErrorTypeInvalid, field.String(), value, detail}
-}
-
-// NotSupported returns a *Error indicating "unsupported value".
-// This is used to report unknown values for enumerated fields (e.g. a list of
-// valid values).
-func NotSupported(field *Path, value interface{}, validValues []string) *Error {
- detail := ""
- if len(validValues) > 0 {
- quotedValues := make([]string, len(validValues))
- for i, v := range validValues {
- quotedValues[i] = strconv.Quote(v)
- }
- detail = "supported values: " + strings.Join(quotedValues, ", ")
- }
- return &Error{ErrorTypeNotSupported, field.String(), value, detail}
-}
-
-// Forbidden returns a *Error indicating "forbidden". This is used to
-// report valid (as per formatting rules) values which would be accepted under
-// some conditions, but which are not permitted by current conditions (e.g.
-// security policy).
-func Forbidden(field *Path, detail string) *Error {
- return &Error{ErrorTypeForbidden, field.String(), "", detail}
-}
-
-// TooLong returns a *Error indicating "too long". This is used to
-// report that the given value is too long. This is similar to
-// Invalid, but the returned error will not include the too-long
-// value.
-func TooLong(field *Path, value interface{}, maxLength int) *Error {
- return &Error{ErrorTypeTooLong, field.String(), value, fmt.Sprintf("must have at most %d bytes", maxLength)}
-}
-
-// TooMany returns a *Error indicating "too many". This is used to
-// report that a given list has too many items. This is similar to TooLong,
-// but the returned error indicates quantity instead of length.
-func TooMany(field *Path, actualQuantity, maxQuantity int) *Error {
- return &Error{ErrorTypeTooMany, field.String(), actualQuantity, fmt.Sprintf("must have at most %d items", maxQuantity)}
-}
-
-// InternalError returns a *Error indicating "internal error". This is used
-// to signal that an error was found that was not directly related to user
-// input. The err argument must be non-nil.
-func InternalError(field *Path, err error) *Error {
- return &Error{ErrorTypeInternal, field.String(), nil, err.Error()}
-}
-
-// ErrorList holds a set of Errors. It is plausible that we might one day have
-// non-field errors in this same umbrella package, but for now we don't, so
-// we can keep it simple and leave ErrorList here.
-type ErrorList []*Error
-
-// NewErrorTypeMatcher returns an errors.Matcher that returns true
-// if the provided error is a Error and has the provided ErrorType.
-func NewErrorTypeMatcher(t ErrorType) utilerrors.Matcher {
- return func(err error) bool {
- if e, ok := err.(*Error); ok {
- return e.Type == t
- }
- return false
- }
-}
-
-// ToAggregate converts the ErrorList into an errors.Aggregate.
-func (list ErrorList) ToAggregate() utilerrors.Aggregate {
- errs := make([]error, 0, len(list))
- errorMsgs := sets.NewString()
- for _, err := range list {
- msg := fmt.Sprintf("%v", err)
- if errorMsgs.Has(msg) {
- continue
- }
- errorMsgs.Insert(msg)
- errs = append(errs, err)
- }
- return utilerrors.NewAggregate(errs)
-}
-
-func fromAggregate(agg utilerrors.Aggregate) ErrorList {
- errs := agg.Errors()
- list := make(ErrorList, len(errs))
- for i := range errs {
- list[i] = errs[i].(*Error)
- }
- return list
-}
-
-// Filter removes items from the ErrorList that match the provided fns.
-func (list ErrorList) Filter(fns ...utilerrors.Matcher) ErrorList {
- err := utilerrors.FilterOut(list.ToAggregate(), fns...)
- if err == nil {
- return nil
- }
- // FilterOut takes an Aggregate and returns an Aggregate
- return fromAggregate(err.(utilerrors.Aggregate))
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go b/vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go
deleted file mode 100644
index daccb0589..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
-Copyright 2015 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 field
-
-import (
- "bytes"
- "fmt"
- "strconv"
-)
-
-type pathOptions struct {
- path *Path
-}
-
-// PathOption modifies a pathOptions
-type PathOption func(o *pathOptions)
-
-// WithPath generates a PathOption
-func WithPath(p *Path) PathOption {
- return func(o *pathOptions) {
- o.path = p
- }
-}
-
-// ToPath produces *Path from a set of PathOption
-func ToPath(opts ...PathOption) *Path {
- c := &pathOptions{}
- for _, opt := range opts {
- opt(c)
- }
- return c.path
-}
-
-// Path represents the path from some root to a particular field.
-type Path struct {
- name string // the name of this field or "" if this is an index
- index string // if name == "", this is a subscript (index or map key) of the previous element
- parent *Path // nil if this is the root element
-}
-
-// NewPath creates a root Path object.
-func NewPath(name string, moreNames ...string) *Path {
- r := &Path{name: name, parent: nil}
- for _, anotherName := range moreNames {
- r = &Path{name: anotherName, parent: r}
- }
- return r
-}
-
-// Root returns the root element of this Path.
-func (p *Path) Root() *Path {
- for ; p.parent != nil; p = p.parent {
- // Do nothing.
- }
- return p
-}
-
-// Child creates a new Path that is a child of the method receiver.
-func (p *Path) Child(name string, moreNames ...string) *Path {
- r := NewPath(name, moreNames...)
- r.Root().parent = p
- return r
-}
-
-// Index indicates that the previous Path is to be subscripted by an int.
-// This sets the same underlying value as Key.
-func (p *Path) Index(index int) *Path {
- return &Path{index: strconv.Itoa(index), parent: p}
-}
-
-// Key indicates that the previous Path is to be subscripted by a string.
-// This sets the same underlying value as Index.
-func (p *Path) Key(key string) *Path {
- return &Path{index: key, parent: p}
-}
-
-// 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 {
- elems = append(elems, p)
- }
-
- // iterate, but it has to be backwards
- buf := bytes.NewBuffer(nil)
- for i := range elems {
- p := elems[len(elems)-1-i]
- if p.parent != nil && len(p.name) > 0 {
- // This is either the root or it is a subscript.
- buf.WriteString(".")
- }
- if len(p.name) > 0 {
- buf.WriteString(p.name)
- } else {
- fmt.Fprintf(buf, "[%s]", p.index)
- }
- }
- return buf.String()
-}
diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go b/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go
deleted file mode 100644
index c8b419984..000000000
--- a/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go
+++ /dev/null
@@ -1,503 +0,0 @@
-/*
-Copyright 2014 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 validation
-
-import (
- "fmt"
- "math"
- "net"
- "regexp"
- "strconv"
- "strings"
-
- "k8s.io/apimachinery/pkg/util/validation/field"
-)
-
-const qnameCharFmt string = "[A-Za-z0-9]"
-const qnameExtCharFmt string = "[-A-Za-z0-9_.]"
-const qualifiedNameFmt string = "(" + qnameCharFmt + qnameExtCharFmt + "*)?" + qnameCharFmt
-const qualifiedNameErrMsg string = "must consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character"
-const qualifiedNameMaxLength int = 63
-
-var qualifiedNameRegexp = regexp.MustCompile("^" + qualifiedNameFmt + "$")
-
-// IsQualifiedName tests whether the value passed is what Kubernetes calls a
-// "qualified name". This is a format used in various places throughout the
-// system. If the value is not valid, a list of error strings is returned.
-// Otherwise an empty list (or nil) is returned.
-func IsQualifiedName(value string) []string {
- var errs []string
- parts := strings.Split(value, "/")
- var name string
- switch len(parts) {
- case 1:
- name = parts[0]
- case 2:
- var prefix string
- prefix, name = parts[0], parts[1]
- if len(prefix) == 0 {
- errs = append(errs, "prefix part "+EmptyError())
- } else if msgs := IsDNS1123Subdomain(prefix); len(msgs) != 0 {
- errs = append(errs, prefixEach(msgs, "prefix part ")...)
- }
- default:
- return append(errs, "a qualified name "+RegexError(qualifiedNameErrMsg, qualifiedNameFmt, "MyName", "my.name", "123-abc")+
- " with an optional DNS subdomain prefix and '/' (e.g. 'example.com/MyName')")
- }
-
- if len(name) == 0 {
- errs = append(errs, "name part "+EmptyError())
- } else if len(name) > qualifiedNameMaxLength {
- errs = append(errs, "name part "+MaxLenError(qualifiedNameMaxLength))
- }
- if !qualifiedNameRegexp.MatchString(name) {
- errs = append(errs, "name part "+RegexError(qualifiedNameErrMsg, qualifiedNameFmt, "MyName", "my.name", "123-abc"))
- }
- return errs
-}
-
-// IsFullyQualifiedName checks if the name is fully qualified. This is similar
-// to IsFullyQualifiedDomainName but requires a minimum of 3 segments instead of
-// 2 and does not accept a trailing . as valid.
-// TODO: This function is deprecated and preserved until all callers migrate to
-// IsFullyQualifiedDomainName; please don't add new callers.
-func IsFullyQualifiedName(fldPath *field.Path, name string) field.ErrorList {
- var allErrors field.ErrorList
- if len(name) == 0 {
- return append(allErrors, field.Required(fldPath, ""))
- }
- if errs := IsDNS1123Subdomain(name); len(errs) > 0 {
- return append(allErrors, field.Invalid(fldPath, name, strings.Join(errs, ",")))
- }
- if len(strings.Split(name, ".")) < 3 {
- return append(allErrors, field.Invalid(fldPath, name, "should be a domain with at least three segments separated by dots"))
- }
- return allErrors
-}
-
-// IsFullyQualifiedDomainName checks if the domain name is fully qualified. This
-// is similar to IsFullyQualifiedName but only requires a minimum of 2 segments
-// instead of 3 and accepts a trailing . as valid.
-func IsFullyQualifiedDomainName(fldPath *field.Path, name string) field.ErrorList {
- var allErrors field.ErrorList
- if len(name) == 0 {
- return append(allErrors, field.Required(fldPath, ""))
- }
- if strings.HasSuffix(name, ".") {
- name = name[:len(name)-1]
- }
- if errs := IsDNS1123Subdomain(name); len(errs) > 0 {
- return append(allErrors, field.Invalid(fldPath, name, strings.Join(errs, ",")))
- }
- if len(strings.Split(name, ".")) < 2 {
- return append(allErrors, field.Invalid(fldPath, name, "should be a domain with at least two segments separated by dots"))
- }
- for _, label := range strings.Split(name, ".") {
- if errs := IsDNS1123Label(label); len(errs) > 0 {
- return append(allErrors, field.Invalid(fldPath, label, strings.Join(errs, ",")))
- }
- }
- return allErrors
-}
-
-// Allowed characters in an HTTP Path as defined by RFC 3986. A HTTP path may
-// contain:
-// * unreserved characters (alphanumeric, '-', '.', '_', '~')
-// * percent-encoded octets
-// * sub-delims ("!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "=")
-// * a colon character (":")
-const httpPathFmt string = `[A-Za-z0-9/\-._~%!$&'()*+,;=:]+`
-
-var httpPathRegexp = regexp.MustCompile("^" + httpPathFmt + "$")
-
-// IsDomainPrefixedPath checks if the given string is a domain-prefixed path
-// (e.g. acme.io/foo). All characters before the first "/" must be a valid
-// subdomain as defined by RFC 1123. All characters trailing the first "/" must
-// be valid HTTP Path characters as defined by RFC 3986.
-func IsDomainPrefixedPath(fldPath *field.Path, dpPath string) field.ErrorList {
- var allErrs field.ErrorList
- if len(dpPath) == 0 {
- return append(allErrs, field.Required(fldPath, ""))
- }
-
- segments := strings.SplitN(dpPath, "/", 2)
- if len(segments) != 2 || len(segments[0]) == 0 || len(segments[1]) == 0 {
- return append(allErrs, field.Invalid(fldPath, dpPath, "must be a domain-prefixed path (such as \"acme.io/foo\")"))
- }
-
- host := segments[0]
- for _, err := range IsDNS1123Subdomain(host) {
- allErrs = append(allErrs, field.Invalid(fldPath, host, err))
- }
-
- path := segments[1]
- if !httpPathRegexp.MatchString(path) {
- return append(allErrs, field.Invalid(fldPath, path, RegexError("Invalid path", httpPathFmt)))
- }
-
- return allErrs
-}
-
-const labelValueFmt string = "(" + qualifiedNameFmt + ")?"
-const labelValueErrMsg string = "a valid label must be an empty string or consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character"
-
-// LabelValueMaxLength is a label's max length
-const LabelValueMaxLength int = 63
-
-var labelValueRegexp = regexp.MustCompile("^" + labelValueFmt + "$")
-
-// IsValidLabelValue tests whether the value passed is a valid label value. If
-// the value is not valid, a list of error strings is returned. Otherwise an
-// empty list (or nil) is returned.
-func IsValidLabelValue(value string) []string {
- var errs []string
- if len(value) > LabelValueMaxLength {
- errs = append(errs, MaxLenError(LabelValueMaxLength))
- }
- if !labelValueRegexp.MatchString(value) {
- errs = append(errs, RegexError(labelValueErrMsg, labelValueFmt, "MyValue", "my_value", "12345"))
- }
- return errs
-}
-
-const dns1123LabelFmt string = "[a-z0-9]([-a-z0-9]*[a-z0-9])?"
-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
-
-var dns1123LabelRegexp = regexp.MustCompile("^" + dns1123LabelFmt + "$")
-
-// IsDNS1123Label tests for a string that conforms to the definition of a label in
-// DNS (RFC 1123).
-func IsDNS1123Label(value string) []string {
- var errs []string
- if len(value) > DNS1123LabelMaxLength {
- errs = append(errs, MaxLenError(DNS1123LabelMaxLength))
- }
- if !dns1123LabelRegexp.MatchString(value) {
- errs = append(errs, RegexError(dns1123LabelErrMsg, dns1123LabelFmt, "my-name", "123-abc"))
- }
- return errs
-}
-
-const dns1123SubdomainFmt string = dns1123LabelFmt + "(\\." + dns1123LabelFmt + ")*"
-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
-
-var dns1123SubdomainRegexp = regexp.MustCompile("^" + dns1123SubdomainFmt + "$")
-
-// IsDNS1123Subdomain tests for a string that conforms to the definition of a
-// subdomain in DNS (RFC 1123).
-func IsDNS1123Subdomain(value string) []string {
- var errs []string
- if len(value) > DNS1123SubdomainMaxLength {
- errs = append(errs, MaxLenError(DNS1123SubdomainMaxLength))
- }
- if !dns1123SubdomainRegexp.MatchString(value) {
- errs = append(errs, RegexError(dns1123SubdomainErrorMsg, dns1123SubdomainFmt, "example.com"))
- }
- return errs
-}
-
-const dns1035LabelFmt string = "[a-z]([-a-z0-9]*[a-z0-9])?"
-const dns1035LabelErrMsg string = "a DNS-1035 label must consist of lower case alphanumeric characters or '-', start with an alphabetic character, and end with an alphanumeric character"
-
-// DNS1035LabelMaxLength is a label's max length in DNS (RFC 1035)
-const DNS1035LabelMaxLength int = 63
-
-var dns1035LabelRegexp = regexp.MustCompile("^" + dns1035LabelFmt + "$")
-
-// IsDNS1035Label tests for a string that conforms to the definition of a label in
-// DNS (RFC 1035).
-func IsDNS1035Label(value string) []string {
- var errs []string
- if len(value) > DNS1035LabelMaxLength {
- errs = append(errs, MaxLenError(DNS1035LabelMaxLength))
- }
- if !dns1035LabelRegexp.MatchString(value) {
- errs = append(errs, RegexError(dns1035LabelErrMsg, dns1035LabelFmt, "my-name", "abc-123"))
- }
- return errs
-}
-
-// wildcard definition - RFC 1034 section 4.3.3.
-// examples:
-// - valid: *.bar.com, *.foo.bar.com
-// - invalid: *.*.bar.com, *.foo.*.com, *bar.com, f*.bar.com, *
-const wildcardDNS1123SubdomainFmt = "\\*\\." + dns1123SubdomainFmt
-const wildcardDNS1123SubdomainErrMsg = "a wildcard DNS-1123 subdomain must start with '*.', followed by a valid DNS subdomain, which must consist of lower case alphanumeric characters, '-' or '.' and end with an alphanumeric character"
-
-// IsWildcardDNS1123Subdomain tests for a string that conforms to the definition of a
-// wildcard subdomain in DNS (RFC 1034 section 4.3.3).
-func IsWildcardDNS1123Subdomain(value string) []string {
- wildcardDNS1123SubdomainRegexp := regexp.MustCompile("^" + wildcardDNS1123SubdomainFmt + "$")
-
- var errs []string
- if len(value) > DNS1123SubdomainMaxLength {
- errs = append(errs, MaxLenError(DNS1123SubdomainMaxLength))
- }
- if !wildcardDNS1123SubdomainRegexp.MatchString(value) {
- errs = append(errs, RegexError(wildcardDNS1123SubdomainErrMsg, wildcardDNS1123SubdomainFmt, "*.example.com"))
- }
- return errs
-}
-
-const cIdentifierFmt string = "[A-Za-z_][A-Za-z0-9_]*"
-const identifierErrMsg string = "a valid C identifier must start with alphabetic character or '_', followed by a string of alphanumeric characters or '_'"
-
-var cIdentifierRegexp = regexp.MustCompile("^" + cIdentifierFmt + "$")
-
-// IsCIdentifier tests for a string that conforms the definition of an identifier
-// in C. This checks the format, but not the length.
-func IsCIdentifier(value string) []string {
- if !cIdentifierRegexp.MatchString(value) {
- return []string{RegexError(identifierErrMsg, cIdentifierFmt, "my_name", "MY_NAME", "MyName")}
- }
- return nil
-}
-
-// IsValidPortNum tests that the argument is a valid, non-zero port number.
-func IsValidPortNum(port int) []string {
- if 1 <= port && port <= 65535 {
- return nil
- }
- return []string{InclusiveRangeError(1, 65535)}
-}
-
-// IsInRange tests that the argument is in an inclusive range.
-func IsInRange(value int, min int, max int) []string {
- if value >= min && value <= max {
- return nil
- }
- return []string{InclusiveRangeError(min, max)}
-}
-
-// Now in libcontainer UID/GID limits is 0 ~ 1<<31 - 1
-// TODO: once we have a type for UID/GID we should make these that type.
-const (
- minUserID = 0
- maxUserID = math.MaxInt32
- minGroupID = 0
- maxGroupID = math.MaxInt32
-)
-
-// IsValidGroupID tests that the argument is a valid Unix GID.
-func IsValidGroupID(gid int64) []string {
- if minGroupID <= gid && gid <= maxGroupID {
- return nil
- }
- return []string{InclusiveRangeError(minGroupID, maxGroupID)}
-}
-
-// IsValidUserID tests that the argument is a valid Unix UID.
-func IsValidUserID(uid int64) []string {
- if minUserID <= uid && uid <= maxUserID {
- return nil
- }
- return []string{InclusiveRangeError(minUserID, maxUserID)}
-}
-
-var portNameCharsetRegex = regexp.MustCompile("^[-a-z0-9]+$")
-var portNameOneLetterRegexp = regexp.MustCompile("[a-z]")
-
-// IsValidPortName check that the argument is valid syntax. It must be
-// non-empty and no more than 15 characters long. It may contain only [-a-z0-9]
-// and must contain at least one letter [a-z]. It must not start or end with a
-// hyphen, nor contain adjacent hyphens.
-//
-// Note: We only allow lower-case characters, even though RFC 6335 is case
-// insensitive.
-func IsValidPortName(port string) []string {
- var errs []string
- if len(port) > 15 {
- errs = append(errs, MaxLenError(15))
- }
- if !portNameCharsetRegex.MatchString(port) {
- errs = append(errs, "must contain only alpha-numeric characters (a-z, 0-9), and hyphens (-)")
- }
- if !portNameOneLetterRegexp.MatchString(port) {
- errs = append(errs, "must contain at least one letter or number (a-z, 0-9)")
- }
- if strings.Contains(port, "--") {
- errs = append(errs, "must not contain consecutive hyphens")
- }
- if len(port) > 0 && (port[0] == '-' || port[len(port)-1] == '-') {
- errs = append(errs, "must not begin or end with a hyphen")
- }
- return errs
-}
-
-// 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 or 2001:db8::ffff)"}
- }
- return nil
-}
-
-// IsValidIPv4Address tests that the argument is a valid IPv4 address.
-func IsValidIPv4Address(fldPath *field.Path, value string) field.ErrorList {
- var allErrors field.ErrorList
- ip := net.ParseIP(value)
- if ip == nil || ip.To4() == nil {
- allErrors = append(allErrors, field.Invalid(fldPath, value, "must be a valid IPv4 address"))
- }
- return allErrors
-}
-
-// IsValidIPv6Address tests that the argument is a valid IPv6 address.
-func IsValidIPv6Address(fldPath *field.Path, value string) field.ErrorList {
- var allErrors field.ErrorList
- ip := net.ParseIP(value)
- if ip == nil || ip.To4() != nil {
- allErrors = append(allErrors, field.Invalid(fldPath, value, "must be a valid IPv6 address"))
- }
- return allErrors
-}
-
-const percentFmt string = "[0-9]+%"
-const percentErrMsg string = "a valid percent string must be a numeric string followed by an ending '%'"
-
-var percentRegexp = regexp.MustCompile("^" + percentFmt + "$")
-
-// IsValidPercent checks that string is in the form of a percentage
-func IsValidPercent(percent string) []string {
- if !percentRegexp.MatchString(percent) {
- return []string{RegexError(percentErrMsg, percentFmt, "1%", "93%")}
- }
- return nil
-}
-
-const httpHeaderNameFmt string = "[-A-Za-z0-9]+"
-const httpHeaderNameErrMsg string = "a valid HTTP header must consist of alphanumeric characters or '-'"
-
-var httpHeaderNameRegexp = regexp.MustCompile("^" + httpHeaderNameFmt + "$")
-
-// IsHTTPHeaderName checks that a string conforms to the Go HTTP library's
-// definition of a valid header field name (a stricter subset than RFC7230).
-func IsHTTPHeaderName(value string) []string {
- if !httpHeaderNameRegexp.MatchString(value) {
- return []string{RegexError(httpHeaderNameErrMsg, httpHeaderNameFmt, "X-Header-Name")}
- }
- return nil
-}
-
-const envVarNameFmt = "[-._a-zA-Z][-._a-zA-Z0-9]*"
-const envVarNameFmtErrMsg string = "a valid environment variable name must consist of alphabetic characters, digits, '_', '-', or '.', and must not start with a digit"
-
-var envVarNameRegexp = regexp.MustCompile("^" + envVarNameFmt + "$")
-
-// IsEnvVarName tests if a string is a valid environment variable name.
-func IsEnvVarName(value string) []string {
- var errs []string
- if !envVarNameRegexp.MatchString(value) {
- errs = append(errs, RegexError(envVarNameFmtErrMsg, envVarNameFmt, "my.env-name", "MY_ENV.NAME", "MyEnvName1"))
- }
-
- errs = append(errs, hasChDirPrefix(value)...)
- return errs
-}
-
-const configMapKeyFmt = `[-._a-zA-Z0-9]+`
-const configMapKeyErrMsg string = "a valid config key must consist of alphanumeric characters, '-', '_' or '.'"
-
-var configMapKeyRegexp = regexp.MustCompile("^" + configMapKeyFmt + "$")
-
-// IsConfigMapKey tests for a string that is a valid key for a ConfigMap or Secret
-func IsConfigMapKey(value string) []string {
- var errs []string
- if len(value) > DNS1123SubdomainMaxLength {
- errs = append(errs, MaxLenError(DNS1123SubdomainMaxLength))
- }
- if !configMapKeyRegexp.MatchString(value) {
- errs = append(errs, RegexError(configMapKeyErrMsg, configMapKeyFmt, "key.name", "KEY_NAME", "key-name"))
- }
- errs = append(errs, hasChDirPrefix(value)...)
- return errs
-}
-
-// MaxLenError returns a string explanation of a "string too long" validation
-// failure.
-func MaxLenError(length int) string {
- return fmt.Sprintf("must be no more than %d characters", length)
-}
-
-// RegexError returns a string explanation of a regex validation failure.
-func RegexError(msg string, fmt string, examples ...string) string {
- if len(examples) == 0 {
- return msg + " (regex used for validation is '" + fmt + "')"
- }
- msg += " (e.g. "
- for i := range examples {
- if i > 0 {
- msg += " or "
- }
- msg += "'" + examples[i] + "', "
- }
- msg += "regex used for validation is '" + fmt + "')"
- return msg
-}
-
-// EmptyError returns a string explanation of a "must not be empty" validation
-// failure.
-func EmptyError() string {
- return "must be non-empty"
-}
-
-func prefixEach(msgs []string, prefix string) []string {
- for i := range msgs {
- msgs[i] = prefix + msgs[i]
- }
- return msgs
-}
-
-// InclusiveRangeError returns a string explanation of a numeric "must be
-// between" validation failure.
-func InclusiveRangeError(lo, hi int) string {
- return fmt.Sprintf(`must be between %d and %d, inclusive`, lo, hi)
-}
-
-func hasChDirPrefix(value string) []string {
- var errs []string
- switch {
- case value == ".":
- errs = append(errs, `must not be '.'`)
- case value == "..":
- errs = append(errs, `must not be '..'`)
- case strings.HasPrefix(value, ".."):
- errs = append(errs, `must not start with '..'`)
- }
- return errs
-}
-
-// IsValidSocketAddr checks that string represents a valid socket address
-// as defined in RFC 789. (e.g 0.0.0.0:10254 or [::]:10254))
-func IsValidSocketAddr(value string) []string {
- var errs []string
- ip, port, err := net.SplitHostPort(value)
- if err != nil {
- errs = append(errs, "must be a valid socket address format, (e.g. 0.0.0.0:10254 or [::]:10254)")
- return errs
- }
- portInt, _ := strconv.Atoi(port)
- errs = append(errs, IsValidPortNum(portInt)...)
- errs = append(errs, IsValidIP(ip)...)
- return errs
-}