mirror of
https://github.com/containers/skopeo.git
synced 2025-07-11 13:44:15 +00:00
Merge pull request #294 from runcom/fix-image-spec-dep
fix OCI image-spec dependency
This commit is contained in:
commit
d7156f9b3d
@ -23,12 +23,11 @@ golang.org/x/net master https://github.com/golang/net.git
|
|||||||
github.com/docker/distribution master
|
github.com/docker/distribution master
|
||||||
github.com/docker/libtrust master
|
github.com/docker/libtrust master
|
||||||
github.com/opencontainers/runc master
|
github.com/opencontainers/runc master
|
||||||
github.com/opencontainers/image-spec v1.0.0-rc3
|
github.com/opencontainers/image-spec master
|
||||||
github.com/mtrmac/gpgme master
|
github.com/mtrmac/gpgme master
|
||||||
# openshift/origin' k8s dependencies as of OpenShift v1.1.5
|
# openshift/origin' k8s dependencies as of OpenShift v1.1.5
|
||||||
github.com/golang/glog 44145f04b68cf362d9c4df2182967c2275eaefed
|
github.com/golang/glog 44145f04b68cf362d9c4df2182967c2275eaefed
|
||||||
k8s.io/kubernetes 4a3f9c5b19c7ff804cbc1bf37a15c044ca5d2353 https://github.com/openshift/kubernetes
|
k8s.io/client-go master
|
||||||
k8s.io/apimachinery master
|
|
||||||
github.com/ghodss/yaml 73d445a93680fa1a78ae23a5839bad48f32ba1ee
|
github.com/ghodss/yaml 73d445a93680fa1a78ae23a5839bad48f32ba1ee
|
||||||
gopkg.in/yaml.v2 d466437aa4adc35830964cffc5b5f262c63ddcb4
|
gopkg.in/yaml.v2 d466437aa4adc35830964cffc5b5f262c63ddcb4
|
||||||
github.com/imdario/mergo 6633656539c1639d9d78127b7d47c622b5d7b6dc
|
github.com/imdario/mergo 6633656539c1639d9d78127b7d47c622b5d7b6dc
|
||||||
|
22
vendor/github.com/containers/image/docker/docker_image_dest.go
generated
vendored
22
vendor/github.com/containers/image/docker/docker_image_dest.go
generated
vendored
@ -17,6 +17,21 @@ import (
|
|||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var manifestMIMETypes = []string{
|
||||||
|
// TODO(runcom): we'll add OCI as part of another PR here
|
||||||
|
manifest.DockerV2Schema2MediaType,
|
||||||
|
manifest.DockerV2Schema1SignedMediaType,
|
||||||
|
manifest.DockerV2Schema1MediaType,
|
||||||
|
}
|
||||||
|
|
||||||
|
func supportedManifestMIMETypesMap() map[string]bool {
|
||||||
|
m := make(map[string]bool, len(manifestMIMETypes))
|
||||||
|
for _, mt := range manifestMIMETypes {
|
||||||
|
m[mt] = true
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
type dockerImageDestination struct {
|
type dockerImageDestination struct {
|
||||||
ref dockerReference
|
ref dockerReference
|
||||||
c *dockerClient
|
c *dockerClient
|
||||||
@ -47,12 +62,7 @@ func (d *dockerImageDestination) Close() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *dockerImageDestination) SupportedManifestMIMETypes() []string {
|
func (d *dockerImageDestination) SupportedManifestMIMETypes() []string {
|
||||||
return []string{
|
return manifestMIMETypes
|
||||||
// TODO(runcom): we'll add OCI as part of another PR here
|
|
||||||
manifest.DockerV2Schema2MediaType,
|
|
||||||
manifest.DockerV2Schema1SignedMediaType,
|
|
||||||
manifest.DockerV2Schema1MediaType,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SupportsSignatures returns an error (to be displayed to the user) if the destination certainly can't store signatures.
|
// SupportsSignatures returns an error (to be displayed to the user) if the destination certainly can't store signatures.
|
||||||
|
11
vendor/github.com/containers/image/docker/docker_image_src.go
generated
vendored
11
vendor/github.com/containers/image/docker/docker_image_src.go
generated
vendored
@ -39,6 +39,17 @@ func newImageSource(ctx *types.SystemContext, ref dockerReference, requestedMani
|
|||||||
if requestedManifestMIMETypes == nil {
|
if requestedManifestMIMETypes == nil {
|
||||||
requestedManifestMIMETypes = manifest.DefaultRequestedManifestMIMETypes
|
requestedManifestMIMETypes = manifest.DefaultRequestedManifestMIMETypes
|
||||||
}
|
}
|
||||||
|
supportedMIMEs := supportedManifestMIMETypesMap()
|
||||||
|
acceptableRequestedMIMEs := false
|
||||||
|
for _, mtrequested := range requestedManifestMIMETypes {
|
||||||
|
if supportedMIMEs[mtrequested] {
|
||||||
|
acceptableRequestedMIMEs = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !acceptableRequestedMIMEs {
|
||||||
|
requestedManifestMIMETypes = manifest.DefaultRequestedManifestMIMETypes
|
||||||
|
}
|
||||||
return &dockerImageSource{
|
return &dockerImageSource{
|
||||||
ref: ref,
|
ref: ref,
|
||||||
requestedManifestMIMETypes: requestedManifestMIMETypes,
|
requestedManifestMIMETypes: requestedManifestMIMETypes,
|
||||||
|
28
vendor/github.com/containers/image/image/docker_schema2.go
generated
vendored
28
vendor/github.com/containers/image/image/docker_schema2.go
generated
vendored
@ -12,6 +12,7 @@ import (
|
|||||||
"github.com/containers/image/manifest"
|
"github.com/containers/image/manifest"
|
||||||
"github.com/containers/image/types"
|
"github.com/containers/image/types"
|
||||||
"github.com/opencontainers/go-digest"
|
"github.com/opencontainers/go-digest"
|
||||||
|
imgspecv1 "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -166,6 +167,8 @@ func (m *manifestSchema2) UpdatedImage(options types.ManifestUpdateOptions) (typ
|
|||||||
case "": // No conversion, OK
|
case "": // No conversion, OK
|
||||||
case manifest.DockerV2Schema1SignedMediaType, manifest.DockerV2Schema1MediaType:
|
case manifest.DockerV2Schema1SignedMediaType, manifest.DockerV2Schema1MediaType:
|
||||||
return copy.convertToManifestSchema1(options.InformationOnly.Destination)
|
return copy.convertToManifestSchema1(options.InformationOnly.Destination)
|
||||||
|
case imgspecv1.MediaTypeImageManifest:
|
||||||
|
return copy.convertToManifestOCI1()
|
||||||
default:
|
default:
|
||||||
return nil, errors.Errorf("Conversion of image manifest from %s to %s is not implemented", manifest.DockerV2Schema2MediaType, options.ManifestMIMEType)
|
return nil, errors.Errorf("Conversion of image manifest from %s to %s is not implemented", manifest.DockerV2Schema2MediaType, options.ManifestMIMEType)
|
||||||
}
|
}
|
||||||
@ -173,6 +176,31 @@ func (m *manifestSchema2) UpdatedImage(options types.ManifestUpdateOptions) (typ
|
|||||||
return memoryImageFromManifest(©), nil
|
return memoryImageFromManifest(©), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *manifestSchema2) convertToManifestOCI1() (types.Image, error) {
|
||||||
|
// Create a copy of the descriptor.
|
||||||
|
config := m.ConfigDescriptor
|
||||||
|
|
||||||
|
// The only difference between OCI and DockerSchema2 is the mediatypes. The
|
||||||
|
// media type of the manifest is handled by manifestSchema2FromComponents.
|
||||||
|
config.MediaType = imgspecv1.MediaTypeImageConfig
|
||||||
|
|
||||||
|
layers := make([]descriptor, len(m.LayersDescriptors))
|
||||||
|
for idx := range layers {
|
||||||
|
layers[idx] = m.LayersDescriptors[idx]
|
||||||
|
if m.LayersDescriptors[idx].MediaType == manifest.DockerV2Schema2ForeignLayerMediaType {
|
||||||
|
layers[idx].MediaType = imgspecv1.MediaTypeImageLayerNonDistributable
|
||||||
|
} else {
|
||||||
|
layers[idx].MediaType = imgspecv1.MediaTypeImageLayerGzip
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rather than copying the ConfigBlob now, we just pass m.src to the
|
||||||
|
// translated manifest, since the only difference is the mediatype of
|
||||||
|
// descriptors there is no change to any blob stored in m.src.
|
||||||
|
m1 := manifestOCI1FromComponents(config, m.src, nil, layers)
|
||||||
|
return memoryImageFromManifest(m1), nil
|
||||||
|
}
|
||||||
|
|
||||||
// Based on docker/distribution/manifest/schema1/config_builder.go
|
// Based on docker/distribution/manifest/schema1/config_builder.go
|
||||||
func (m *manifestSchema2) convertToManifestSchema1(dest types.ImageDestination) (types.Image, error) {
|
func (m *manifestSchema2) convertToManifestSchema1(dest types.ImageDestination) (types.Image, error) {
|
||||||
configBytes, err := m.ConfigBlob()
|
configBytes, err := m.ConfigBlob()
|
||||||
|
8
vendor/github.com/containers/image/image/oci.go
generated
vendored
8
vendor/github.com/containers/image/image/oci.go
generated
vendored
@ -15,7 +15,6 @@ type manifestOCI1 struct {
|
|||||||
src types.ImageSource // May be nil if configBlob is not nil
|
src types.ImageSource // May be nil if configBlob is not nil
|
||||||
configBlob []byte // If set, corresponds to contents of ConfigDescriptor.
|
configBlob []byte // If set, corresponds to contents of ConfigDescriptor.
|
||||||
SchemaVersion int `json:"schemaVersion"`
|
SchemaVersion int `json:"schemaVersion"`
|
||||||
MediaType string `json:"mediaType"`
|
|
||||||
ConfigDescriptor descriptor `json:"config"`
|
ConfigDescriptor descriptor `json:"config"`
|
||||||
LayersDescriptors []descriptor `json:"layers"`
|
LayersDescriptors []descriptor `json:"layers"`
|
||||||
}
|
}
|
||||||
@ -29,12 +28,11 @@ func manifestOCI1FromManifest(src types.ImageSource, manifest []byte) (genericMa
|
|||||||
}
|
}
|
||||||
|
|
||||||
// manifestOCI1FromComponents builds a new manifestOCI1 from the supplied data:
|
// manifestOCI1FromComponents builds a new manifestOCI1 from the supplied data:
|
||||||
func manifestOCI1FromComponents(config descriptor, configBlob []byte, layers []descriptor) genericManifest {
|
func manifestOCI1FromComponents(config descriptor, src types.ImageSource, configBlob []byte, layers []descriptor) genericManifest {
|
||||||
return &manifestOCI1{
|
return &manifestOCI1{
|
||||||
src: nil,
|
src: src,
|
||||||
configBlob: configBlob,
|
configBlob: configBlob,
|
||||||
SchemaVersion: 2,
|
SchemaVersion: 2,
|
||||||
MediaType: imgspecv1.MediaTypeImageManifest,
|
|
||||||
ConfigDescriptor: config,
|
ConfigDescriptor: config,
|
||||||
LayersDescriptors: layers,
|
LayersDescriptors: layers,
|
||||||
}
|
}
|
||||||
@ -45,7 +43,7 @@ func (m *manifestOCI1) serialize() ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *manifestOCI1) manifestMIMEType() string {
|
func (m *manifestOCI1) manifestMIMEType() string {
|
||||||
return m.MediaType
|
return imgspecv1.MediaTypeImageManifest
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConfigInfo returns a complete BlobInfo for the separate config object, or a BlobInfo{Digest:""} if there isn't a separate object.
|
// ConfigInfo returns a complete BlobInfo for the separate config object, or a BlobInfo{Digest:""} if there isn't a separate object.
|
||||||
|
58
vendor/github.com/containers/image/oci/layout/oci_dest.go
generated
vendored
58
vendor/github.com/containers/image/oci/layout/oci_dest.go
generated
vendored
@ -37,7 +37,6 @@ func (d *ociImageDestination) Close() {
|
|||||||
func (d *ociImageDestination) SupportedManifestMIMETypes() []string {
|
func (d *ociImageDestination) SupportedManifestMIMETypes() []string {
|
||||||
return []string{
|
return []string{
|
||||||
imgspecv1.MediaTypeImageManifest,
|
imgspecv1.MediaTypeImageManifest,
|
||||||
manifest.DockerV2Schema2MediaType,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,60 +133,16 @@ func (d *ociImageDestination) ReapplyBlob(info types.BlobInfo) (types.BlobInfo,
|
|||||||
return info, nil
|
return info, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createManifest(m []byte) ([]byte, string, error) {
|
|
||||||
om := imgspecv1.Manifest{}
|
|
||||||
mt := manifest.GuessMIMEType(m)
|
|
||||||
switch mt {
|
|
||||||
case manifest.DockerV2Schema1MediaType, manifest.DockerV2Schema1SignedMediaType:
|
|
||||||
// There a simple reason about not yet implementing this.
|
|
||||||
// OCI image-spec assure about backward compatibility with docker v2s2 but not v2s1
|
|
||||||
// generating a v2s2 is a migration docker does when upgrading to 1.10.3
|
|
||||||
// and I don't think we should bother about this now (I don't want to have migration code here in skopeo)
|
|
||||||
return nil, "", errors.New("can't create an OCI manifest from Docker V2 schema 1 manifest")
|
|
||||||
case manifest.DockerV2Schema2MediaType:
|
|
||||||
if err := json.Unmarshal(m, &om); err != nil {
|
|
||||||
return nil, "", err
|
|
||||||
}
|
|
||||||
om.MediaType = imgspecv1.MediaTypeImageManifest
|
|
||||||
for i, l := range om.Layers {
|
|
||||||
if l.MediaType == manifest.DockerV2Schema2ForeignLayerMediaType {
|
|
||||||
om.Layers[i].MediaType = imgspecv1.MediaTypeImageLayerNonDistributable
|
|
||||||
} else {
|
|
||||||
om.Layers[i].MediaType = imgspecv1.MediaTypeImageLayer
|
|
||||||
}
|
|
||||||
}
|
|
||||||
om.Config.MediaType = imgspecv1.MediaTypeImageConfig
|
|
||||||
b, err := json.Marshal(om)
|
|
||||||
if err != nil {
|
|
||||||
return nil, "", err
|
|
||||||
}
|
|
||||||
return b, om.MediaType, nil
|
|
||||||
case manifest.DockerV2ListMediaType:
|
|
||||||
return nil, "", errors.New("can't create an OCI manifest from Docker V2 schema 2 manifest list")
|
|
||||||
case imgspecv1.MediaTypeImageManifestList:
|
|
||||||
return nil, "", errors.New("can't create an OCI manifest from OCI manifest list")
|
|
||||||
case imgspecv1.MediaTypeImageManifest:
|
|
||||||
return m, mt, nil
|
|
||||||
}
|
|
||||||
return nil, "", errors.Errorf("unrecognized manifest media type %q", mt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *ociImageDestination) PutManifest(m []byte) error {
|
func (d *ociImageDestination) PutManifest(m []byte) error {
|
||||||
// TODO(mitr, runcom): this breaks signatures entirely since at this point we're creating a new manifest
|
digest, err := manifest.Digest(m)
|
||||||
// and signatures don't apply anymore. Will fix.
|
|
||||||
ociMan, mt, err := createManifest(m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
digest, err := manifest.Digest(ociMan)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
desc := imgspecv1.Descriptor{}
|
desc := imgspecv1.Descriptor{}
|
||||||
desc.Digest = digest.String()
|
desc.Digest = digest
|
||||||
// TODO(runcom): beaware and add support for OCI manifest list
|
// TODO(runcom): beaware and add support for OCI manifest list
|
||||||
desc.MediaType = mt
|
desc.MediaType = imgspecv1.MediaTypeImageManifest
|
||||||
desc.Size = int64(len(ociMan))
|
desc.Size = int64(len(m))
|
||||||
data, err := json.Marshal(desc)
|
data, err := json.Marshal(desc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -197,7 +152,10 @@ func (d *ociImageDestination) PutManifest(m []byte) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := ioutil.WriteFile(blobPath, ociMan, 0644); err != nil {
|
if err := ensureParentDirectoryExists(blobPath); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := ioutil.WriteFile(blobPath, m, 0644); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// TODO(runcom): ugly here?
|
// TODO(runcom): ugly here?
|
||||||
|
119
vendor/github.com/containers/image/openshift/openshift-copies.go
generated
vendored
119
vendor/github.com/containers/image/openshift/openshift-copies.go
generated
vendored
@ -13,14 +13,14 @@ import (
|
|||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ghodss/yaml"
|
"github.com/ghodss/yaml"
|
||||||
"github.com/imdario/mergo"
|
"github.com/imdario/mergo"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
"golang.org/x/net/http2"
|
||||||
utilnet "k8s.io/apimachinery/pkg/util/net"
|
"k8s.io/client-go/util/homedir"
|
||||||
"k8s.io/kubernetes/pkg/util/homedir"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// restTLSClientConfig is a modified copy of k8s.io/kubernets/pkg/client/restclient.TLSClientConfig.
|
// restTLSClientConfig is a modified copy of k8s.io/kubernets/pkg/client/restclient.TLSClientConfig.
|
||||||
@ -450,6 +450,55 @@ func (config *directClientConfig) getCluster() clientcmdCluster {
|
|||||||
return mergedClusterInfo
|
return mergedClusterInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// aggregateErr is a modified copy of k8s.io/apimachinery/pkg/util/errors.aggregate.
|
||||||
|
// 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 aggregateErr []error
|
||||||
|
|
||||||
|
// newAggregate is a modified copy of k8s.io/apimachinery/pkg/util/errors.NewAggregate.
|
||||||
|
// 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) error {
|
||||||
|
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 aggregateErr(errs)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error is a modified copy of k8s.io/apimachinery/pkg/util/errors.aggregate.Error.
|
||||||
|
// Error is part of the error interface.
|
||||||
|
func (agg aggregateErr) Error() string {
|
||||||
|
if len(agg) == 0 {
|
||||||
|
// This should never happen, really.
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if len(agg) == 1 {
|
||||||
|
return agg[0].Error()
|
||||||
|
}
|
||||||
|
result := fmt.Sprintf("[%s", agg[0].Error())
|
||||||
|
for i := 1; i < len(agg); i++ {
|
||||||
|
result += fmt.Sprintf(", %s", agg[i].Error())
|
||||||
|
}
|
||||||
|
result += "]"
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// REMOVED: aggregateErr.Errors
|
||||||
|
|
||||||
// errConfigurationInvalid is a modified? copy of k8s.io/kubernetes/pkg/client/unversioned/clientcmd.errConfigurationInvalid.
|
// errConfigurationInvalid is a modified? copy of k8s.io/kubernetes/pkg/client/unversioned/clientcmd.errConfigurationInvalid.
|
||||||
// errConfigurationInvalid is a set of errors indicating the configuration is invalid.
|
// errConfigurationInvalid is a set of errors indicating the configuration is invalid.
|
||||||
type errConfigurationInvalid []error
|
type errConfigurationInvalid []error
|
||||||
@ -470,7 +519,7 @@ func newErrConfigurationInvalid(errs []error) error {
|
|||||||
|
|
||||||
// Error implements the error interface
|
// Error implements the error interface
|
||||||
func (e errConfigurationInvalid) Error() string {
|
func (e errConfigurationInvalid) Error() string {
|
||||||
return fmt.Sprintf("invalid configuration: %v", utilerrors.NewAggregate(e).Error())
|
return fmt.Sprintf("invalid configuration: %v", newAggregate(e).Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
// clientConfigLoadingRules is a modified copy of k8s.io/kubernetes/pkg/client/unversioned/clientcmd.ClientConfigLoadingRules
|
// clientConfigLoadingRules is a modified copy of k8s.io/kubernetes/pkg/client/unversioned/clientcmd.ClientConfigLoadingRules
|
||||||
@ -550,7 +599,7 @@ func (rules *clientConfigLoadingRules) Load() (*clientcmdConfig, error) {
|
|||||||
errlist = append(errlist, err)
|
errlist = append(errlist, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return config, utilerrors.NewAggregate(errlist)
|
return config, newAggregate(errlist)
|
||||||
}
|
}
|
||||||
|
|
||||||
// loadFromFile is a modified copy of k8s.io/kubernetes/pkg/client/unversioned/clientcmd.LoadFromFile
|
// loadFromFile is a modified copy of k8s.io/kubernetes/pkg/client/unversioned/clientcmd.LoadFromFile
|
||||||
@ -799,6 +848,52 @@ func transportNew(config *restConfig) (http.RoundTripper, error) {
|
|||||||
return rt, nil
|
return rt, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// newProxierWithNoProxyCIDR is a modified copy of k8s.io/apimachinery/pkg/util/net.NewProxierWithNoProxyCIDR.
|
||||||
|
// 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 envvar has a CIDR in it
|
||||||
|
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) {
|
||||||
|
host := req.URL.Host
|
||||||
|
// for some urls, the Host is already the host, not the host:port
|
||||||
|
if net.ParseIP(host) == nil {
|
||||||
|
var err error
|
||||||
|
host, _, err = net.SplitHostPort(req.URL.Host)
|
||||||
|
if err != nil {
|
||||||
|
return delegate(req)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ip := net.ParseIP(host)
|
||||||
|
if ip == nil {
|
||||||
|
return delegate(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, cidr := range cidrs {
|
||||||
|
if cidr.Contains(ip) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return delegate(req)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// tlsCacheGet is a modified copy of k8s.io/kubernetes/pkg/client/transport.tlsTransportCache.get.
|
// tlsCacheGet is a modified copy of k8s.io/kubernetes/pkg/client/transport.tlsTransportCache.get.
|
||||||
func tlsCacheGet(config *restConfig) (http.RoundTripper, error) {
|
func tlsCacheGet(config *restConfig) (http.RoundTripper, error) {
|
||||||
// REMOVED: any actual caching
|
// REMOVED: any actual caching
|
||||||
@ -813,15 +908,23 @@ func tlsCacheGet(config *restConfig) (http.RoundTripper, error) {
|
|||||||
return http.DefaultTransport, nil
|
return http.DefaultTransport, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return utilnet.SetTransportDefaults(&http.Transport{ // FIXME??
|
// REMOVED: Call to k8s.io/apimachinery/pkg/util/net.SetTransportDefaults; instead of the generic machinery and conditionals, hard-coded the result here.
|
||||||
Proxy: http.ProxyFromEnvironment,
|
t := &http.Transport{
|
||||||
|
// 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
|
||||||
|
Proxy: newProxierWithNoProxyCIDR(http.ProxyFromEnvironment),
|
||||||
TLSHandshakeTimeout: 10 * time.Second,
|
TLSHandshakeTimeout: 10 * time.Second,
|
||||||
TLSClientConfig: tlsConfig,
|
TLSClientConfig: tlsConfig,
|
||||||
Dial: (&net.Dialer{
|
Dial: (&net.Dialer{
|
||||||
Timeout: 30 * time.Second,
|
Timeout: 30 * time.Second,
|
||||||
KeepAlive: 30 * time.Second,
|
KeepAlive: 30 * time.Second,
|
||||||
}).Dial,
|
}).Dial,
|
||||||
}), nil
|
}
|
||||||
|
// Allow clients to disable http2 if needed.
|
||||||
|
if s := os.Getenv("DISABLE_HTTP2"); len(s) == 0 {
|
||||||
|
_ = http2.ConfigureTransport(t)
|
||||||
|
}
|
||||||
|
return t, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// tlsConfigFor is a modified copy of k8s.io/kubernetes/pkg/client/transport.TLSConfigFor.
|
// tlsConfigFor is a modified copy of k8s.io/kubernetes/pkg/client/transport.TLSConfigFor.
|
||||||
|
191
vendor/github.com/golang/glog/LICENSE
generated
vendored
191
vendor/github.com/golang/glog/LICENSE
generated
vendored
@ -1,191 +0,0 @@
|
|||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction, and
|
|
||||||
distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by the copyright
|
|
||||||
owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all other entities
|
|
||||||
that control, are controlled by, or are under common control with that entity.
|
|
||||||
For the purposes of this definition, "control" means (i) the power, direct or
|
|
||||||
indirect, to cause the direction or management of such entity, whether by
|
|
||||||
contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity exercising
|
|
||||||
permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications, including
|
|
||||||
but not limited to software source code, documentation source, and configuration
|
|
||||||
files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical transformation or
|
|
||||||
translation of a Source form, including but not limited to compiled object code,
|
|
||||||
generated documentation, and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or Object form, made
|
|
||||||
available under the License, as indicated by a copyright notice that is included
|
|
||||||
in or attached to the work (an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object form, that
|
|
||||||
is based on (or derived from) the Work and for which the editorial revisions,
|
|
||||||
annotations, elaborations, or other modifications represent, as a whole, an
|
|
||||||
original work of authorship. For the purposes of this License, Derivative Works
|
|
||||||
shall not include works that remain separable from, or merely link (or bind by
|
|
||||||
name) to the interfaces of, the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including the original version
|
|
||||||
of the Work and any modifications or additions to that Work or Derivative Works
|
|
||||||
thereof, that is intentionally submitted to Licensor for inclusion in the Work
|
|
||||||
by the copyright owner or by an individual or Legal Entity authorized to submit
|
|
||||||
on behalf of the copyright owner. For the purposes of this definition,
|
|
||||||
"submitted" means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems, and
|
|
||||||
issue tracking systems that are managed by, or on behalf of, the Licensor for
|
|
||||||
the purpose of discussing and improving the Work, but excluding communication
|
|
||||||
that is conspicuously marked or otherwise designated in writing by the copyright
|
|
||||||
owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
|
|
||||||
of whom a Contribution has been received by Licensor and subsequently
|
|
||||||
incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License.
|
|
||||||
|
|
||||||
Subject to the terms and conditions of this License, each Contributor hereby
|
|
||||||
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
|
|
||||||
irrevocable copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the Work and such
|
|
||||||
Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License.
|
|
||||||
|
|
||||||
Subject to the terms and conditions of this License, each Contributor hereby
|
|
||||||
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
|
|
||||||
irrevocable (except as stated in this section) patent license to make, have
|
|
||||||
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
|
|
||||||
such license applies only to those patent claims licensable by such Contributor
|
|
||||||
that are necessarily infringed by their Contribution(s) alone or by combination
|
|
||||||
of their Contribution(s) with the Work to which such Contribution(s) was
|
|
||||||
submitted. If You institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
|
|
||||||
Contribution incorporated within the Work constitutes direct or contributory
|
|
||||||
patent infringement, then any patent licenses granted to You under this License
|
|
||||||
for that Work shall terminate as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution.
|
|
||||||
|
|
||||||
You may reproduce and distribute copies of the Work or Derivative Works thereof
|
|
||||||
in any medium, with or without modifications, and in Source or Object form,
|
|
||||||
provided that You meet the following conditions:
|
|
||||||
|
|
||||||
You must give any other recipients of the Work or Derivative Works a copy of
|
|
||||||
this License; and
|
|
||||||
You must cause any modified files to carry prominent notices stating that You
|
|
||||||
changed the files; and
|
|
||||||
You must retain, in the Source form of any Derivative Works that You distribute,
|
|
||||||
all copyright, patent, trademark, and attribution notices from the Source form
|
|
||||||
of the Work, excluding those notices that do not pertain to any part of the
|
|
||||||
Derivative Works; and
|
|
||||||
If the Work includes a "NOTICE" text file as part of its distribution, then any
|
|
||||||
Derivative Works that You distribute must include a readable copy of the
|
|
||||||
attribution notices contained within such NOTICE file, excluding those notices
|
|
||||||
that do not pertain to any part of the Derivative Works, in at least one of the
|
|
||||||
following places: within a NOTICE text file distributed as part of the
|
|
||||||
Derivative Works; within the Source form or documentation, if provided along
|
|
||||||
with the Derivative Works; or, within a display generated by the Derivative
|
|
||||||
Works, if and wherever such third-party notices normally appear. The contents of
|
|
||||||
the NOTICE file are for informational purposes only and do not modify the
|
|
||||||
License. You may add Your own attribution notices within Derivative Works that
|
|
||||||
You distribute, alongside or as an addendum to the NOTICE text from the Work,
|
|
||||||
provided that such additional attribution notices cannot be construed as
|
|
||||||
modifying the License.
|
|
||||||
You may add Your own copyright statement to Your modifications and may provide
|
|
||||||
additional or different license terms and conditions for use, reproduction, or
|
|
||||||
distribution of Your modifications, or for any such Derivative Works as a whole,
|
|
||||||
provided Your use, reproduction, and distribution of the Work otherwise complies
|
|
||||||
with the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions.
|
|
||||||
|
|
||||||
Unless You explicitly state otherwise, any Contribution intentionally submitted
|
|
||||||
for inclusion in the Work by You to the Licensor shall be under the terms and
|
|
||||||
conditions of this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify the terms of
|
|
||||||
any separate license agreement you may have executed with Licensor regarding
|
|
||||||
such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks.
|
|
||||||
|
|
||||||
This License does not grant permission to use the trade names, trademarks,
|
|
||||||
service marks, or product names of the Licensor, except as required for
|
|
||||||
reasonable and customary use in describing the origin of the Work and
|
|
||||||
reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty.
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, Licensor provides the
|
|
||||||
Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
|
|
||||||
including, without limitation, any warranties or conditions of TITLE,
|
|
||||||
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
|
|
||||||
solely responsible for determining the appropriateness of using or
|
|
||||||
redistributing the Work and assume any risks associated with Your exercise of
|
|
||||||
permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability.
|
|
||||||
|
|
||||||
In no event and under no legal theory, whether in tort (including negligence),
|
|
||||||
contract, or otherwise, unless required by applicable law (such as deliberate
|
|
||||||
and grossly negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special, incidental,
|
|
||||||
or consequential damages of any character arising as a result of this License or
|
|
||||||
out of the use or inability to use the Work (including but not limited to
|
|
||||||
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
|
|
||||||
any and all other commercial damages or losses), even if such Contributor has
|
|
||||||
been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability.
|
|
||||||
|
|
||||||
While redistributing the Work or Derivative Works thereof, You may choose to
|
|
||||||
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
|
|
||||||
other liability obligations and/or rights consistent with this License. However,
|
|
||||||
in accepting such obligations, You may act only on Your own behalf and on Your
|
|
||||||
sole responsibility, not on behalf of any other Contributor, and only if You
|
|
||||||
agree to indemnify, defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason of your
|
|
||||||
accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following boilerplate
|
|
||||||
notice, with the fields enclosed by brackets "[]" replaced with your own
|
|
||||||
identifying information. (Don't include the brackets!) The text should be
|
|
||||||
enclosed in the appropriate comment syntax for the file format. We also
|
|
||||||
recommend that a file or class name and description of purpose be included on
|
|
||||||
the same "printed page" as the copyright notice for easier identification within
|
|
||||||
third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
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.
|
|
1177
vendor/github.com/golang/glog/glog.go
generated
vendored
1177
vendor/github.com/golang/glog/glog.go
generated
vendored
File diff suppressed because it is too large
Load Diff
124
vendor/github.com/golang/glog/glog_file.go
generated
vendored
124
vendor/github.com/golang/glog/glog_file.go
generated
vendored
@ -1,124 +0,0 @@
|
|||||||
// Go support for leveled logs, analogous to https://code.google.com/p/google-glog/
|
|
||||||
//
|
|
||||||
// Copyright 2013 Google Inc. All Rights Reserved.
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
|
|
||||||
// File I/O for logs.
|
|
||||||
|
|
||||||
package glog
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"os/user"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// MaxSize is the maximum size of a log file in bytes.
|
|
||||||
var MaxSize uint64 = 1024 * 1024 * 1800
|
|
||||||
|
|
||||||
// logDirs lists the candidate directories for new log files.
|
|
||||||
var logDirs []string
|
|
||||||
|
|
||||||
// If non-empty, overrides the choice of directory in which to write logs.
|
|
||||||
// See createLogDirs for the full list of possible destinations.
|
|
||||||
var logDir = flag.String("log_dir", "", "If non-empty, write log files in this directory")
|
|
||||||
|
|
||||||
func createLogDirs() {
|
|
||||||
if *logDir != "" {
|
|
||||||
logDirs = append(logDirs, *logDir)
|
|
||||||
}
|
|
||||||
logDirs = append(logDirs, os.TempDir())
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
pid = os.Getpid()
|
|
||||||
program = filepath.Base(os.Args[0])
|
|
||||||
host = "unknownhost"
|
|
||||||
userName = "unknownuser"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
h, err := os.Hostname()
|
|
||||||
if err == nil {
|
|
||||||
host = shortHostname(h)
|
|
||||||
}
|
|
||||||
|
|
||||||
current, err := user.Current()
|
|
||||||
if err == nil {
|
|
||||||
userName = current.Username
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sanitize userName since it may contain filepath separators on Windows.
|
|
||||||
userName = strings.Replace(userName, `\`, "_", -1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// shortHostname returns its argument, truncating at the first period.
|
|
||||||
// For instance, given "www.google.com" it returns "www".
|
|
||||||
func shortHostname(hostname string) string {
|
|
||||||
if i := strings.Index(hostname, "."); i >= 0 {
|
|
||||||
return hostname[:i]
|
|
||||||
}
|
|
||||||
return hostname
|
|
||||||
}
|
|
||||||
|
|
||||||
// logName returns a new log file name containing tag, with start time t, and
|
|
||||||
// the name for the symlink for tag.
|
|
||||||
func logName(tag string, t time.Time) (name, link string) {
|
|
||||||
name = fmt.Sprintf("%s.%s.%s.log.%s.%04d%02d%02d-%02d%02d%02d.%d",
|
|
||||||
program,
|
|
||||||
host,
|
|
||||||
userName,
|
|
||||||
tag,
|
|
||||||
t.Year(),
|
|
||||||
t.Month(),
|
|
||||||
t.Day(),
|
|
||||||
t.Hour(),
|
|
||||||
t.Minute(),
|
|
||||||
t.Second(),
|
|
||||||
pid)
|
|
||||||
return name, program + "." + tag
|
|
||||||
}
|
|
||||||
|
|
||||||
var onceLogDirs sync.Once
|
|
||||||
|
|
||||||
// create creates a new log file and returns the file and its filename, which
|
|
||||||
// contains tag ("INFO", "FATAL", etc.) and t. If the file is created
|
|
||||||
// successfully, create also attempts to update the symlink for that tag, ignoring
|
|
||||||
// errors.
|
|
||||||
func create(tag string, t time.Time) (f *os.File, filename string, err error) {
|
|
||||||
onceLogDirs.Do(createLogDirs)
|
|
||||||
if len(logDirs) == 0 {
|
|
||||||
return nil, "", errors.New("log: no log dirs")
|
|
||||||
}
|
|
||||||
name, link := logName(tag, t)
|
|
||||||
var lastErr error
|
|
||||||
for _, dir := range logDirs {
|
|
||||||
fname := filepath.Join(dir, name)
|
|
||||||
f, err := os.Create(fname)
|
|
||||||
if err == nil {
|
|
||||||
symlink := filepath.Join(dir, link)
|
|
||||||
os.Remove(symlink) // ignore err
|
|
||||||
os.Symlink(name, symlink) // ignore err
|
|
||||||
return f, fname, nil
|
|
||||||
}
|
|
||||||
lastErr = err
|
|
||||||
}
|
|
||||||
return nil, "", fmt.Errorf("log: cannot create log: %v", lastErr)
|
|
||||||
}
|
|
23
vendor/github.com/opencontainers/image-spec/specs-go/v1/config.go
generated
vendored
23
vendor/github.com/opencontainers/image-spec/specs-go/v1/config.go
generated
vendored
@ -14,20 +14,13 @@
|
|||||||
|
|
||||||
package v1
|
package v1
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
// ImageConfig defines the execution parameters which should be used as a base when running a container using an image.
|
// ImageConfig defines the execution parameters which should be used as a base when running a container using an image.
|
||||||
type ImageConfig struct {
|
type ImageConfig struct {
|
||||||
// User defines the username or UID which the process in the container should run as.
|
// User defines the username or UID which the process in the container should run as.
|
||||||
User string `json:"User,omitempty"`
|
User string `json:"User,omitempty"`
|
||||||
|
|
||||||
// Memory defines the memory limit.
|
|
||||||
Memory int64 `json:"Memory,omitempty"`
|
|
||||||
|
|
||||||
// MemorySwap defines the total memory usage limit (memory + swap).
|
|
||||||
MemorySwap int64 `json:"MemorySwap,omitempty"`
|
|
||||||
|
|
||||||
// CPUShares is the CPU shares (relative weight vs. other containers).
|
|
||||||
CPUShares int64 `json:"CpuShares,omitempty"`
|
|
||||||
|
|
||||||
// ExposedPorts a set of ports to expose from a container running this image.
|
// ExposedPorts a set of ports to expose from a container running this image.
|
||||||
ExposedPorts map[string]struct{} `json:"ExposedPorts,omitempty"`
|
ExposedPorts map[string]struct{} `json:"ExposedPorts,omitempty"`
|
||||||
|
|
||||||
@ -45,6 +38,9 @@ type ImageConfig struct {
|
|||||||
|
|
||||||
// WorkingDir sets the current working directory of the entrypoint process in the container.
|
// WorkingDir sets the current working directory of the entrypoint process in the container.
|
||||||
WorkingDir string `json:"WorkingDir,omitempty"`
|
WorkingDir string `json:"WorkingDir,omitempty"`
|
||||||
|
|
||||||
|
// Labels contains arbitrary metadata for the container.
|
||||||
|
Labels map[string]string `json:"labels,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// RootFS describes a layer content addresses
|
// RootFS describes a layer content addresses
|
||||||
@ -58,8 +54,8 @@ type RootFS struct {
|
|||||||
|
|
||||||
// History describes the history of a layer.
|
// History describes the history of a layer.
|
||||||
type History struct {
|
type History struct {
|
||||||
// Created is the creation time.
|
// Created is the combined date and time at which the layer was created, formatted as defined by RFC 3339, section 5.6.
|
||||||
Created string `json:"created,omitempty"`
|
Created time.Time `json:"created,omitempty"`
|
||||||
|
|
||||||
// CreatedBy is the command which created the layer.
|
// CreatedBy is the command which created the layer.
|
||||||
CreatedBy string `json:"created_by,omitempty"`
|
CreatedBy string `json:"created_by,omitempty"`
|
||||||
@ -75,9 +71,10 @@ type History struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Image is the JSON structure which describes some basic information about the image.
|
// Image is the JSON structure which describes some basic information about the image.
|
||||||
|
// This provides the `application/vnd.oci.image.config.v1+json` mediatype when marshalled to JSON.
|
||||||
type Image struct {
|
type Image struct {
|
||||||
// Created defines an ISO-8601 formatted combined date and time at which the image was created.
|
// Created is the combined date and time at which the image was created, formatted as defined by RFC 3339, section 5.6.
|
||||||
Created string `json:"created,omitempty"`
|
Created time.Time `json:"created,omitempty"`
|
||||||
|
|
||||||
// Author defines the name and/or email address of the person or entity which created and is responsible for maintaining the image.
|
// Author defines the name and/or email address of the person or entity which created and is responsible for maintaining the image.
|
||||||
Author string `json:"author,omitempty"`
|
Author string `json:"author,omitempty"`
|
||||||
|
9
vendor/github.com/opencontainers/image-spec/specs-go/v1/descriptor.go
generated
vendored
9
vendor/github.com/opencontainers/image-spec/specs-go/v1/descriptor.go
generated
vendored
@ -14,13 +14,16 @@
|
|||||||
|
|
||||||
package v1
|
package v1
|
||||||
|
|
||||||
|
import digest "github.com/opencontainers/go-digest"
|
||||||
|
|
||||||
// Descriptor describes the disposition of targeted content.
|
// Descriptor describes the disposition of targeted content.
|
||||||
|
// This structure provides `application/vnd.oci.descriptor.v1+json` mediatype when marshalled to JSON
|
||||||
type Descriptor struct {
|
type Descriptor struct {
|
||||||
// MediaType contains the MIME type of the referenced object.
|
// MediaType is the media type of the object this schema refers to.
|
||||||
MediaType string `json:"mediaType"`
|
MediaType string `json:"mediaType,omitempty"`
|
||||||
|
|
||||||
// Digest is the digest of the targeted content.
|
// Digest is the digest of the targeted content.
|
||||||
Digest string `json:"digest"`
|
Digest digest.Digest `json:"digest"`
|
||||||
|
|
||||||
// Size specifies the size in bytes of the blob.
|
// Size specifies the size in bytes of the blob.
|
||||||
Size int64 `json:"size"`
|
Size int64 `json:"size"`
|
||||||
|
3
vendor/github.com/opencontainers/image-spec/specs-go/v1/layout.go
generated
vendored
3
vendor/github.com/opencontainers/image-spec/specs-go/v1/layout.go
generated
vendored
@ -16,6 +16,9 @@ package v1
|
|||||||
|
|
||||||
import "regexp"
|
import "regexp"
|
||||||
|
|
||||||
|
// ImageLayoutVersion is the version of ImageLayout
|
||||||
|
const ImageLayoutVersion = "1.0.0"
|
||||||
|
|
||||||
// ImageLayout is the structure in the "oci-layout" file, found in the root
|
// ImageLayout is the structure in the "oci-layout" file, found in the root
|
||||||
// of an OCI Image-layout directory.
|
// of an OCI Image-layout directory.
|
||||||
type ImageLayout struct {
|
type ImageLayout struct {
|
||||||
|
2
vendor/github.com/opencontainers/image-spec/specs-go/v1/manifest.go
generated
vendored
2
vendor/github.com/opencontainers/image-spec/specs-go/v1/manifest.go
generated
vendored
@ -16,7 +16,7 @@ package v1
|
|||||||
|
|
||||||
import "github.com/opencontainers/image-spec/specs-go"
|
import "github.com/opencontainers/image-spec/specs-go"
|
||||||
|
|
||||||
// Manifest defines a schema2 manifest
|
// Manifest provides `application/vnd.oci.image.manifest.list.v1+json` mediatype structure when marshalled to JSON.
|
||||||
type Manifest struct {
|
type Manifest struct {
|
||||||
specs.Versioned
|
specs.Versioned
|
||||||
|
|
||||||
|
3
vendor/github.com/opencontainers/image-spec/specs-go/v1/manifest_list.go
generated
vendored
3
vendor/github.com/opencontainers/image-spec/specs-go/v1/manifest_list.go
generated
vendored
@ -50,7 +50,8 @@ type ManifestDescriptor struct {
|
|||||||
Platform Platform `json:"platform"`
|
Platform Platform `json:"platform"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ManifestList references manifests for various platforms.
|
// ManifestList references manifests for various platforms.
|
||||||
|
// This structure provides `application/vnd.oci.image.manifest.list.v1+json` mediatype when marshalled to JSON.
|
||||||
type ManifestList struct {
|
type ManifestList struct {
|
||||||
specs.Versioned
|
specs.Versioned
|
||||||
|
|
||||||
|
13
vendor/github.com/opencontainers/image-spec/specs-go/v1/mediatype.go
generated
vendored
13
vendor/github.com/opencontainers/image-spec/specs-go/v1/mediatype.go
generated
vendored
@ -25,11 +25,20 @@ const (
|
|||||||
MediaTypeImageManifestList = "application/vnd.oci.image.manifest.list.v1+json"
|
MediaTypeImageManifestList = "application/vnd.oci.image.manifest.list.v1+json"
|
||||||
|
|
||||||
// MediaTypeImageLayer is the media type used for layers referenced by the manifest.
|
// MediaTypeImageLayer is the media type used for layers referenced by the manifest.
|
||||||
MediaTypeImageLayer = "application/vnd.oci.image.layer.v1.tar+gzip"
|
MediaTypeImageLayer = "application/vnd.oci.image.layer.v1.tar"
|
||||||
|
|
||||||
|
// MediaTypeImageLayerGzip is the media type used for gzipped layers
|
||||||
|
// referenced by the manifest.
|
||||||
|
MediaTypeImageLayerGzip = "application/vnd.oci.image.layer.v1.tar+gzip"
|
||||||
|
|
||||||
// MediaTypeImageLayerNonDistributable is the media type for layers referenced by
|
// MediaTypeImageLayerNonDistributable is the media type for layers referenced by
|
||||||
// the manifest but with distribution restrictions.
|
// the manifest but with distribution restrictions.
|
||||||
MediaTypeImageLayerNonDistributable = "application/vnd.oci.image.layer.nondistributable.v1.tar+gzip"
|
MediaTypeImageLayerNonDistributable = "application/vnd.oci.image.layer.nondistributable.v1.tar"
|
||||||
|
|
||||||
|
// MediaTypeImageLayerNonDistributableGzip is the media type for
|
||||||
|
// gzipped layers referenced by the manifest but with distribution
|
||||||
|
// restrictions.
|
||||||
|
MediaTypeImageLayerNonDistributableGzip = "application/vnd.oci.image.layer.nondistributable.v1.tar+gzip"
|
||||||
|
|
||||||
// MediaTypeImageConfig specifies the media type for the image configuration.
|
// MediaTypeImageConfig specifies the media type for the image configuration.
|
||||||
MediaTypeImageConfig = "application/vnd.oci.image.config.v1+json"
|
MediaTypeImageConfig = "application/vnd.oci.image.config.v1+json"
|
||||||
|
2
vendor/github.com/opencontainers/image-spec/specs-go/version.go
generated
vendored
2
vendor/github.com/opencontainers/image-spec/specs-go/version.go
generated
vendored
@ -25,7 +25,7 @@ const (
|
|||||||
VersionPatch = 0
|
VersionPatch = 0
|
||||||
|
|
||||||
// VersionDev indicates development branch. Releases will be empty string.
|
// VersionDev indicates development branch. Releases will be empty string.
|
||||||
VersionDev = "-rc3"
|
VersionDev = "-rc3-dev"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Version is the specification version that the package types support.
|
// Version is the specification version that the package types support.
|
||||||
|
3
vendor/github.com/opencontainers/image-spec/specs-go/versioned.go
generated
vendored
3
vendor/github.com/opencontainers/image-spec/specs-go/versioned.go
generated
vendored
@ -20,7 +20,4 @@ package specs
|
|||||||
type Versioned struct {
|
type Versioned struct {
|
||||||
// SchemaVersion is the image manifest schema that this image follows
|
// SchemaVersion is the image manifest schema that this image follows
|
||||||
SchemaVersion int `json:"schemaVersion"`
|
SchemaVersion int `json:"schemaVersion"`
|
||||||
|
|
||||||
// MediaType is the media type of this schema.
|
|
||||||
MediaType string `json:"mediaType"`
|
|
||||||
}
|
}
|
||||||
|
18
vendor/k8s.io/apimachinery/pkg/util/errors/doc.go
generated
vendored
18
vendor/k8s.io/apimachinery/pkg/util/errors/doc.go
generated
vendored
@ -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"
|
|
182
vendor/k8s.io/apimachinery/pkg/util/errors/errors.go
generated
vendored
182
vendor/k8s.io/apimachinery/pkg/util/errors/errors.go
generated
vendored
@ -1,182 +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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Aggregate represents an object that contains multiple errors, but does not
|
|
||||||
// necessarily have singular semantic meaning.
|
|
||||||
type Aggregate interface {
|
|
||||||
error
|
|
||||||
Errors() []error
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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()
|
|
||||||
}
|
|
||||||
result := fmt.Sprintf("[%s", agg[0].Error())
|
|
||||||
for i := 1; i < len(agg); i++ {
|
|
||||||
result += fmt.Sprintf(", %s", agg[i].Error())
|
|
||||||
}
|
|
||||||
result += "]"
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 silec 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)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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")
|
|
269
vendor/k8s.io/apimachinery/pkg/util/net/http.go
generated
vendored
269
vendor/k8s.io/apimachinery/pkg/util/net/http.go
generated
vendored
@ -1,269 +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 (
|
|
||||||
"crypto/tls"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"net"
|
|
||||||
"net/http"
|
|
||||||
"net/url"
|
|
||||||
"os"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/golang/glog"
|
|
||||||
"golang.org/x/net/http2"
|
|
||||||
)
|
|
||||||
|
|
||||||
// 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 uerr, ok := err.(*url.Error); ok {
|
|
||||||
err = uerr.Err
|
|
||||||
}
|
|
||||||
switch {
|
|
||||||
case err == io.EOF:
|
|
||||||
return true
|
|
||||||
case err.Error() == "http: can't write HTTP request on broken connection":
|
|
||||||
return true
|
|
||||||
case strings.Contains(err.Error(), "connection reset by peer"):
|
|
||||||
return true
|
|
||||||
case strings.Contains(strings.ToLower(err.Error()), "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 t.Dial == nil {
|
|
||||||
t.Dial = defaultTransport.Dial
|
|
||||||
}
|
|
||||||
if t.TLSHandshakeTimeout == 0 {
|
|
||||||
t.TLSHandshakeTimeout = defaultTransport.TLSHandshakeTimeout
|
|
||||||
}
|
|
||||||
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 {
|
|
||||||
glog.Infof("HTTP2 has been explicitly disabled")
|
|
||||||
} else {
|
|
||||||
if err := http2.ConfigureTransport(t); err != nil {
|
|
||||||
glog.Warningf("Transport failed http2 configuration: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return t
|
|
||||||
}
|
|
||||||
|
|
||||||
type RoundTripperWrapper interface {
|
|
||||||
http.RoundTripper
|
|
||||||
WrappedRoundTripper() http.RoundTripper
|
|
||||||
}
|
|
||||||
|
|
||||||
type DialFunc func(net, addr string) (net.Conn, error)
|
|
||||||
|
|
||||||
func Dialer(transport http.RoundTripper) (DialFunc, error) {
|
|
||||||
if transport == nil {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
switch transport := transport.(type) {
|
|
||||||
case *http.Transport:
|
|
||||||
return transport.Dial, nil
|
|
||||||
case RoundTripperWrapper:
|
|
||||||
return Dialer(transport.WrappedRoundTripper())
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("unknown transport type: %v", transport)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CloneTLSConfig returns a tls.Config with all exported fields except SessionTicketsDisabled and SessionTicketKey copied.
|
|
||||||
// This makes it safe to call CloneTLSConfig on a config in active use by a server.
|
|
||||||
// TODO: replace with tls.Config#Clone when we move to go1.8
|
|
||||||
func CloneTLSConfig(cfg *tls.Config) *tls.Config {
|
|
||||||
if cfg == nil {
|
|
||||||
return &tls.Config{}
|
|
||||||
}
|
|
||||||
return &tls.Config{
|
|
||||||
Rand: cfg.Rand,
|
|
||||||
Time: cfg.Time,
|
|
||||||
Certificates: cfg.Certificates,
|
|
||||||
NameToCertificate: cfg.NameToCertificate,
|
|
||||||
GetCertificate: cfg.GetCertificate,
|
|
||||||
RootCAs: cfg.RootCAs,
|
|
||||||
NextProtos: cfg.NextProtos,
|
|
||||||
ServerName: cfg.ServerName,
|
|
||||||
ClientAuth: cfg.ClientAuth,
|
|
||||||
ClientCAs: cfg.ClientCAs,
|
|
||||||
InsecureSkipVerify: cfg.InsecureSkipVerify,
|
|
||||||
CipherSuites: cfg.CipherSuites,
|
|
||||||
PreferServerCipherSuites: cfg.PreferServerCipherSuites,
|
|
||||||
ClientSessionCache: cfg.ClientSessionCache,
|
|
||||||
MinVersion: cfg.MinVersion,
|
|
||||||
MaxVersion: cfg.MaxVersion,
|
|
||||||
CurvePreferences: cfg.CurvePreferences,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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: %v", 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 userAgent, ok := req.Header["User-Agent"]; ok {
|
|
||||||
if len(userAgent) > 0 {
|
|
||||||
return userAgent[0]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "unknown"
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 {
|
|
||||||
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 {
|
|
||||||
return ip
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try the X-Real-Ip header.
|
|
||||||
hdrRealIp := hdr.Get("X-Real-Ip")
|
|
||||||
if hdrRealIp != "" {
|
|
||||||
ip := net.ParseIP(hdrRealIp)
|
|
||||||
if ip != nil {
|
|
||||||
return ip
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fallback to Remote Address in request, which will give the correct client IP when there is no proxy.
|
|
||||||
// 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 {
|
|
||||||
return net.ParseIP(host)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fallback if Remote Address was just IP.
|
|
||||||
return net.ParseIP(req.RemoteAddr)
|
|
||||||
}
|
|
||||||
|
|
||||||
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 envvar has a CIDR in it
|
|
||||||
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) {
|
|
||||||
host := req.URL.Host
|
|
||||||
// for some urls, the Host is already the host, not the host:port
|
|
||||||
if net.ParseIP(host) == nil {
|
|
||||||
var err error
|
|
||||||
host, _, err = net.SplitHostPort(req.URL.Host)
|
|
||||||
if err != nil {
|
|
||||||
return delegate(req)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ip := net.ParseIP(host)
|
|
||||||
if ip == nil {
|
|
||||||
return delegate(req)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, cidr := range cidrs {
|
|
||||||
if cidr.Contains(ip) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return delegate(req)
|
|
||||||
}
|
|
||||||
}
|
|
278
vendor/k8s.io/apimachinery/pkg/util/net/interface.go
generated
vendored
278
vendor/k8s.io/apimachinery/pkg/util/net/interface.go
generated
vendored
@ -1,278 +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"
|
|
||||||
|
|
||||||
"github.com/golang/glog"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Route struct {
|
|
||||||
Interface string
|
|
||||||
Destination net.IP
|
|
||||||
Gateway net.IP
|
|
||||||
// TODO: add more fields here if needed
|
|
||||||
}
|
|
||||||
|
|
||||||
func getRoutes(input io.Reader) ([]Route, error) {
|
|
||||||
routes := []Route{}
|
|
||||||
if input == nil {
|
|
||||||
return nil, fmt.Errorf("input is nil")
|
|
||||||
}
|
|
||||||
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)
|
|
||||||
routes = append(routes, Route{})
|
|
||||||
route := &routes[len(routes)-1]
|
|
||||||
route.Interface = fields[0]
|
|
||||||
ip, err := parseIP(fields[1])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
route.Destination = ip
|
|
||||||
ip, err = parseIP(fields[2])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
route.Gateway = ip
|
|
||||||
}
|
|
||||||
return routes, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseIP(str string) (net.IP, error) {
|
|
||||||
if str == "" {
|
|
||||||
return nil, fmt.Errorf("input is nil")
|
|
||||||
}
|
|
||||||
bytes, err := hex.DecodeString(str)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
//TODO add ipv6 support
|
|
||||||
if len(bytes) != net.IPv4len {
|
|
||||||
return nil, fmt.Errorf("only IPv4 is supported")
|
|
||||||
}
|
|
||||||
bytes[0], bytes[1], bytes[2], bytes[3] = bytes[3], bytes[2], bytes[1], bytes[0]
|
|
||||||
return net.IP(bytes), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func isInterfaceUp(intf *net.Interface) bool {
|
|
||||||
if intf == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if intf.Flags&net.FlagUp != 0 {
|
|
||||||
glog.V(4).Infof("Interface %v is up", intf.Name)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
//getFinalIP method receives all the IP addrs of a Interface
|
|
||||||
//and returns a nil if the address is Loopback, Ipv6, link-local or nil.
|
|
||||||
//It returns a valid IPv4 if an Ipv4 address is found in the array.
|
|
||||||
func getFinalIP(addrs []net.Addr) (net.IP, error) {
|
|
||||||
if len(addrs) > 0 {
|
|
||||||
for i := range addrs {
|
|
||||||
glog.V(4).Infof("Checking addr %s.", addrs[i].String())
|
|
||||||
ip, _, err := net.ParseCIDR(addrs[i].String())
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
//Only IPv4
|
|
||||||
//TODO : add IPv6 support
|
|
||||||
if ip.To4() != nil {
|
|
||||||
if !ip.IsLoopback() && !ip.IsLinkLocalMulticast() && !ip.IsLinkLocalUnicast() {
|
|
||||||
glog.V(4).Infof("IP found %v", ip)
|
|
||||||
return ip, nil
|
|
||||||
} else {
|
|
||||||
glog.V(4).Infof("Loopback/link-local found %v", ip)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
glog.V(4).Infof("%v is not a valid IPv4 address", ip)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getIPFromInterface(intfName string, 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
|
|
||||||
}
|
|
||||||
glog.V(4).Infof("Interface %q has %d addresses :%v.", intfName, len(addrs), addrs)
|
|
||||||
finalIP, err := getFinalIP(addrs)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if finalIP != nil {
|
|
||||||
glog.V(4).Infof("valid IPv4 address for interface %q found as %v.", intfName, finalIP)
|
|
||||||
return finalIP, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func flagsSet(flags net.Flags, test net.Flags) bool {
|
|
||||||
return flags&test != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func flagsClear(flags net.Flags, test net.Flags) bool {
|
|
||||||
return flags&test == 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func chooseHostInterfaceNativeGo() (net.IP, error) {
|
|
||||||
intfs, err := net.Interfaces()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
i := 0
|
|
||||||
var ip net.IP
|
|
||||||
for i = range intfs {
|
|
||||||
if flagsSet(intfs[i].Flags, net.FlagUp) && flagsClear(intfs[i].Flags, net.FlagLoopback|net.FlagPointToPoint) {
|
|
||||||
addrs, err := intfs[i].Addrs()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if len(addrs) > 0 {
|
|
||||||
for _, addr := range addrs {
|
|
||||||
if addrIP, _, err := net.ParseCIDR(addr.String()); err == nil {
|
|
||||||
if addrIP.To4() != nil {
|
|
||||||
ip = addrIP.To4()
|
|
||||||
if !ip.IsLinkLocalMulticast() && !ip.IsLinkLocalUnicast() {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ip != nil {
|
|
||||||
// This interface should suffice.
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ip == nil {
|
|
||||||
return nil, fmt.Errorf("no acceptable interface from host")
|
|
||||||
}
|
|
||||||
glog.V(4).Infof("Choosing interface %s (IP %v) as default", intfs[i].Name, ip)
|
|
||||||
return ip, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//ChooseHostInterface is a method used fetch an IP for a daemon.
|
|
||||||
//It uses data from /proc/net/route file.
|
|
||||||
//For a node with no internet connection ,it returns error
|
|
||||||
//For a multi n/w interface node it returns the IP of the interface with gateway on it.
|
|
||||||
func ChooseHostInterface() (net.IP, error) {
|
|
||||||
inFile, err := os.Open("/proc/net/route")
|
|
||||||
if err != nil {
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
return chooseHostInterfaceNativeGo()
|
|
||||||
}
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer inFile.Close()
|
|
||||||
var nw networkInterfacer = networkInterface{}
|
|
||||||
return chooseHostInterfaceFromRoute(inFile, nw)
|
|
||||||
}
|
|
||||||
|
|
||||||
type networkInterfacer interface {
|
|
||||||
InterfaceByName(intfName string) (*net.Interface, error)
|
|
||||||
Addrs(intf *net.Interface) ([]net.Addr, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type networkInterface struct{}
|
|
||||||
|
|
||||||
func (_ networkInterface) InterfaceByName(intfName string) (*net.Interface, error) {
|
|
||||||
intf, err := net.InterfaceByName(intfName)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return intf, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_ networkInterface) Addrs(intf *net.Interface) ([]net.Addr, error) {
|
|
||||||
addrs, err := intf.Addrs()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return addrs, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func chooseHostInterfaceFromRoute(inFile io.Reader, nw networkInterfacer) (net.IP, error) {
|
|
||||||
routes, err := getRoutes(inFile)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
zero := net.IP{0, 0, 0, 0}
|
|
||||||
var finalIP net.IP
|
|
||||||
for i := range routes {
|
|
||||||
//find interface with gateway
|
|
||||||
if routes[i].Destination.Equal(zero) {
|
|
||||||
glog.V(4).Infof("Default route transits interface %q", routes[i].Interface)
|
|
||||||
finalIP, err := getIPFromInterface(routes[i].Interface, nw)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if finalIP != nil {
|
|
||||||
glog.V(4).Infof("Choosing IP %v ", finalIP)
|
|
||||||
return finalIP, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
glog.V(4).Infof("No valid IP found")
|
|
||||||
if finalIP == nil {
|
|
||||||
return nil, fmt.Errorf("Unable to select an IP.")
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// If bind-address is usable, return it directly
|
|
||||||
// If bind-address is not usable (unset, 0.0.0.0, or loopback), we will use the host's default
|
|
||||||
// interface.
|
|
||||||
func ChooseBindAddress(bindAddress net.IP) (net.IP, error) {
|
|
||||||
if bindAddress == nil || bindAddress.IsUnspecified() || bindAddress.IsLoopback() {
|
|
||||||
hostIP, err := ChooseHostInterface()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
bindAddress = hostIP
|
|
||||||
}
|
|
||||||
return bindAddress, nil
|
|
||||||
}
|
|
113
vendor/k8s.io/apimachinery/pkg/util/net/port_range.go
generated
vendored
113
vendor/k8s.io/apimachinery/pkg/util/net/port_range.go
generated
vendored
@ -1,113 +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 "min-max", 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 {
|
|
||||||
value = strings.TrimSpace(value)
|
|
||||||
|
|
||||||
// TODO: Accept "80" syntax
|
|
||||||
// TODO: Accept "80+8" syntax
|
|
||||||
|
|
||||||
if value == "" {
|
|
||||||
pr.Base = 0
|
|
||||||
pr.Size = 0
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
hyphenIndex := strings.Index(value, "-")
|
|
||||||
if hyphenIndex == -1 {
|
|
||||||
return fmt.Errorf("expected hyphen in port range")
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
var low int
|
|
||||||
var high int
|
|
||||||
low, err = strconv.Atoi(value[:hyphenIndex])
|
|
||||||
if err == nil {
|
|
||||||
high, err = strconv.Atoi(value[hyphenIndex+1:])
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("unable to parse port range: %s: %v", value, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
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 initializs 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
|
|
||||||
}
|
|
77
vendor/k8s.io/apimachinery/pkg/util/net/port_split.go
generated
vendored
77
vendor/k8s.io/apimachinery/pkg/util/net/port_split.go
generated
vendored
@ -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
|
|
||||||
}
|
|
46
vendor/k8s.io/apimachinery/pkg/util/net/util.go
generated
vendored
46
vendor/k8s.io/apimachinery/pkg/util/net/util.go
generated
vendored
@ -1,46 +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 (
|
|
||||||
"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 {
|
|
||||||
opErr, ok := err.(*net.OpError)
|
|
||||||
if ok && opErr.Err.Error() == syscall.ECONNRESET.Error() {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
203
vendor/k8s.io/apimachinery/pkg/util/sets/byte.go
generated
vendored
203
vendor/k8s.io/apimachinery/pkg/util/sets/byte.go
generated
vendored
@ -1,203 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2017 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 set-gen. Do not edit it manually!
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
// New 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) {
|
|
||||||
for _, item := range items {
|
|
||||||
s[item] = Empty{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete removes all items from the set.
|
|
||||||
func (s Byte) Delete(items ...byte) {
|
|
||||||
for _, item := range items {
|
|
||||||
delete(s, item)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
20
vendor/k8s.io/apimachinery/pkg/util/sets/doc.go
generated
vendored
20
vendor/k8s.io/apimachinery/pkg/util/sets/doc.go
generated
vendored
@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2017 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 set-gen. Do not edit it manually!
|
|
||||||
|
|
||||||
// Package sets has auto-generated set types.
|
|
||||||
package sets
|
|
23
vendor/k8s.io/apimachinery/pkg/util/sets/empty.go
generated
vendored
23
vendor/k8s.io/apimachinery/pkg/util/sets/empty.go
generated
vendored
@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2017 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 set-gen. Do not edit it manually!
|
|
||||||
|
|
||||||
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{}
|
|
203
vendor/k8s.io/apimachinery/pkg/util/sets/int.go
generated
vendored
203
vendor/k8s.io/apimachinery/pkg/util/sets/int.go
generated
vendored
@ -1,203 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2017 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 set-gen. Do not edit it manually!
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
// New 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) {
|
|
||||||
for _, item := range items {
|
|
||||||
s[item] = Empty{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete removes all items from the set.
|
|
||||||
func (s Int) Delete(items ...int) {
|
|
||||||
for _, item := range items {
|
|
||||||
delete(s, item)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
203
vendor/k8s.io/apimachinery/pkg/util/sets/int64.go
generated
vendored
203
vendor/k8s.io/apimachinery/pkg/util/sets/int64.go
generated
vendored
@ -1,203 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2017 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 set-gen. Do not edit it manually!
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
// New 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) {
|
|
||||||
for _, item := range items {
|
|
||||||
s[item] = Empty{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete removes all items from the set.
|
|
||||||
func (s Int64) Delete(items ...int64) {
|
|
||||||
for _, item := range items {
|
|
||||||
delete(s, item)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
203
vendor/k8s.io/apimachinery/pkg/util/sets/string.go
generated
vendored
203
vendor/k8s.io/apimachinery/pkg/util/sets/string.go
generated
vendored
@ -1,203 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2017 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 set-gen. Do not edit it manually!
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
// New 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) {
|
|
||||||
for _, item := range items {
|
|
||||||
s[item] = Empty{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete removes all items from the set.
|
|
||||||
func (s String) Delete(items ...string) {
|
|
||||||
for _, item := range items {
|
|
||||||
delete(s, item)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
0
vendor/k8s.io/apimachinery/LICENSE → vendor/k8s.io/client-go/LICENSE
generated
vendored
0
vendor/k8s.io/apimachinery/LICENSE → vendor/k8s.io/client-go/LICENSE
generated
vendored
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2016 The Kubernetes Authors All rights reserved.
|
Copyright 2016 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@ -24,6 +24,13 @@ import (
|
|||||||
// HomeDir returns the home directory for the current user
|
// HomeDir returns the home directory for the current user
|
||||||
func HomeDir() string {
|
func HomeDir() string {
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" {
|
||||||
|
|
||||||
|
// First prefer the HOME environmental variable
|
||||||
|
if home := os.Getenv("HOME"); len(home) > 0 {
|
||||||
|
if _, err := os.Stat(home); err == nil {
|
||||||
|
return home
|
||||||
|
}
|
||||||
|
}
|
||||||
if homeDrive, homePath := os.Getenv("HOMEDRIVE"), os.Getenv("HOMEPATH"); len(homeDrive) > 0 && len(homePath) > 0 {
|
if homeDrive, homePath := os.Getenv("HOMEDRIVE"), os.Getenv("HOMEPATH"); len(homeDrive) > 0 && len(homePath) > 0 {
|
||||||
homeDir := homeDrive + homePath
|
homeDir := homeDrive + homePath
|
||||||
if _, err := os.Stat(homeDir); err == nil {
|
if _, err := os.Stat(homeDir); err == nil {
|
Loading…
Reference in New Issue
Block a user