summaryrefslogtreecommitdiff
path: root/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go
diff options
context:
space:
mode:
authorDaniel J Walsh <dwalsh@redhat.com>2018-03-30 05:49:37 -0400
committerAtomic Bot <atomic-devel@projectatomic.io>2018-04-03 14:48:52 +0000
commit838df4eec4496868e772d5708e00f38bad478718 (patch)
tree89e72bb0b9668ff4005156d590465602589ec4c3 /vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go
parentf41dc0b2580ae83129264edbe45b92231bd119a2 (diff)
downloadpodman-838df4eec4496868e772d5708e00f38bad478718.tar.gz
podman-838df4eec4496868e772d5708e00f38bad478718.tar.bz2
podman-838df4eec4496868e772d5708e00f38bad478718.zip
Vendor in latest containers/image
Some more features. docker-archive generates docker legacy compatible images Do not create $DiffID subdirectories for layers with no configs Ensure the layer IDs in legacy docker/tarfile metadata are unique docker-archive: repeated layers are symlinked in the tar file sysregistries: remove all trailing slashes Improve docker/* error messages Fix failure to make auth directory Create a new slice in Schema1.UpdateLayerInfos Drop unused storageImageDestination.{image,systemContext} Load a *storage.Image only once in storageImageSource Support gzip for docker-archive files Remove .tar extension from blob and config file names ostree, src: support copy of compressed layers ostree: re-pull layer if it misses uncompressed_digest|uncompressed_size image: fix docker schema v1 -> OCI conversion Add /etc/containers/certs.d as default certs directory Signed-off-by: Daniel J Walsh <dwalsh@redhat.com> Closes: #569 Approved by: mheon
Diffstat (limited to 'vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go')
-rw-r--r--vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go308
1 files changed, 0 insertions, 308 deletions
diff --git a/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go b/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go
deleted file mode 100644
index 306877124..000000000
--- a/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go
+++ /dev/null
@@ -1,308 +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 feature
-
-import (
- "fmt"
- "sort"
- "strconv"
- "strings"
- "sync"
- "sync/atomic"
-
- "github.com/golang/glog"
- "github.com/spf13/pflag"
-)
-
-type Feature string
-
-const (
- flagName = "feature-gates"
-
- // allAlphaGate is a global toggle for alpha features. Per-feature key
- // values override the default set by allAlphaGate. Examples:
- // AllAlpha=false,NewFeature=true will result in newFeature=true
- // AllAlpha=true,NewFeature=false will result in newFeature=false
- allAlphaGate Feature = "AllAlpha"
-)
-
-var (
- // The generic features.
- defaultFeatures = map[Feature]FeatureSpec{
- allAlphaGate: {Default: false, PreRelease: Alpha},
- }
-
- // Special handling for a few gates.
- specialFeatures = map[Feature]func(known map[Feature]FeatureSpec, enabled map[Feature]bool, val bool){
- allAlphaGate: setUnsetAlphaGates,
- }
-
- // DefaultFeatureGate is a shared global FeatureGate.
- DefaultFeatureGate FeatureGate = NewFeatureGate()
-)
-
-type FeatureSpec struct {
- Default bool
- PreRelease prerelease
-}
-
-type prerelease string
-
-const (
- // Values for PreRelease.
- Alpha = prerelease("ALPHA")
- Beta = prerelease("BETA")
- GA = prerelease("")
-
- // Deprecated
- Deprecated = prerelease("DEPRECATED")
-)
-
-// FeatureGate parses and stores flag gates for known features from
-// a string like feature1=true,feature2=false,...
-type FeatureGate interface {
- // AddFlag adds a flag for setting global feature gates to the specified FlagSet.
- AddFlag(fs *pflag.FlagSet)
- // Set parses and stores flag gates for known features
- // from a string like feature1=true,feature2=false,...
- Set(value string) error
- // SetFromMap stores flag gates for known features from a map[string]bool or returns an error
- SetFromMap(m map[string]bool) error
- // Enabled returns true if the key is enabled.
- Enabled(key Feature) bool
- // Add adds features to the featureGate.
- Add(features map[Feature]FeatureSpec) error
- // KnownFeatures returns a slice of strings describing the FeatureGate's known features.
- KnownFeatures() []string
-}
-
-// featureGate implements FeatureGate as well as pflag.Value for flag parsing.
-type featureGate struct {
- special map[Feature]func(map[Feature]FeatureSpec, map[Feature]bool, bool)
-
- // lock guards writes to known, enabled, and reads/writes of closed
- lock sync.Mutex
- // known holds a map[Feature]FeatureSpec
- known *atomic.Value
- // enabled holds a map[Feature]bool
- enabled *atomic.Value
- // closed is set to true when AddFlag is called, and prevents subsequent calls to Add
- closed bool
-}
-
-func setUnsetAlphaGates(known map[Feature]FeatureSpec, enabled map[Feature]bool, val bool) {
- for k, v := range known {
- if v.PreRelease == Alpha {
- if _, found := enabled[k]; !found {
- enabled[k] = val
- }
- }
- }
-}
-
-// Set, String, and Type implement pflag.Value
-var _ pflag.Value = &featureGate{}
-
-func NewFeatureGate() *featureGate {
- known := map[Feature]FeatureSpec{}
- for k, v := range defaultFeatures {
- known[k] = v
- }
-
- knownValue := &atomic.Value{}
- knownValue.Store(known)
-
- enabled := map[Feature]bool{}
- enabledValue := &atomic.Value{}
- enabledValue.Store(enabled)
-
- f := &featureGate{
- known: knownValue,
- special: specialFeatures,
- enabled: enabledValue,
- }
- return f
-}
-
-// Set parses a string of the form "key1=value1,key2=value2,..." into a
-// map[string]bool of known keys or returns an error.
-func (f *featureGate) Set(value string) error {
- f.lock.Lock()
- defer f.lock.Unlock()
-
- // Copy existing state
- known := map[Feature]FeatureSpec{}
- for k, v := range f.known.Load().(map[Feature]FeatureSpec) {
- known[k] = v
- }
- enabled := map[Feature]bool{}
- for k, v := range f.enabled.Load().(map[Feature]bool) {
- enabled[k] = v
- }
-
- for _, s := range strings.Split(value, ",") {
- if len(s) == 0 {
- continue
- }
- arr := strings.SplitN(s, "=", 2)
- k := Feature(strings.TrimSpace(arr[0]))
- featureSpec, ok := known[k]
- if !ok {
- return fmt.Errorf("unrecognized key: %s", k)
- }
- if len(arr) != 2 {
- return fmt.Errorf("missing bool value for %s", k)
- }
- v := strings.TrimSpace(arr[1])
- boolValue, err := strconv.ParseBool(v)
- if err != nil {
- return fmt.Errorf("invalid value of %s: %s, err: %v", k, v, err)
- }
- enabled[k] = boolValue
- if boolValue && featureSpec.PreRelease == Deprecated {
- glog.Warningf("enabling deprecated feature gate %s", k)
- }
-
- // Handle "special" features like "all alpha gates"
- if fn, found := f.special[k]; found {
- fn(known, enabled, boolValue)
- }
- }
-
- // Persist changes
- f.known.Store(known)
- f.enabled.Store(enabled)
-
- glog.Infof("feature gates: %v", enabled)
- return nil
-}
-
-// SetFromMap stores flag gates for known features from a map[string]bool or returns an error
-func (f *featureGate) SetFromMap(m map[string]bool) error {
- f.lock.Lock()
- defer f.lock.Unlock()
-
- // Copy existing state
- known := map[Feature]FeatureSpec{}
- for k, v := range f.known.Load().(map[Feature]FeatureSpec) {
- known[k] = v
- }
- enabled := map[Feature]bool{}
- for k, v := range f.enabled.Load().(map[Feature]bool) {
- enabled[k] = v
- }
-
- for k, v := range m {
- k := Feature(k)
- _, ok := known[k]
- if !ok {
- return fmt.Errorf("unrecognized key: %s", k)
- }
- enabled[k] = v
- // Handle "special" features like "all alpha gates"
- if fn, found := f.special[k]; found {
- fn(known, enabled, v)
- }
- }
-
- // Persist changes
- f.known.Store(known)
- f.enabled.Store(enabled)
-
- glog.Infof("feature gates: %v", f.enabled)
- return nil
-}
-
-// String returns a string containing all enabled feature gates, formatted as "key1=value1,key2=value2,...".
-func (f *featureGate) String() string {
- pairs := []string{}
- for k, v := range f.enabled.Load().(map[Feature]bool) {
- pairs = append(pairs, fmt.Sprintf("%s=%t", k, v))
- }
- sort.Strings(pairs)
- return strings.Join(pairs, ",")
-}
-
-func (f *featureGate) Type() string {
- return "mapStringBool"
-}
-
-// Add adds features to the featureGate.
-func (f *featureGate) Add(features map[Feature]FeatureSpec) error {
- f.lock.Lock()
- defer f.lock.Unlock()
-
- if f.closed {
- return fmt.Errorf("cannot add a feature gate after adding it to the flag set")
- }
-
- // Copy existing state
- known := map[Feature]FeatureSpec{}
- for k, v := range f.known.Load().(map[Feature]FeatureSpec) {
- known[k] = v
- }
-
- for name, spec := range features {
- if existingSpec, found := known[name]; found {
- if existingSpec == spec {
- continue
- }
- return fmt.Errorf("feature gate %q with different spec already exists: %v", name, existingSpec)
- }
-
- known[name] = spec
- }
-
- // Persist updated state
- f.known.Store(known)
-
- return nil
-}
-
-// Enabled returns true if the key is enabled.
-func (f *featureGate) Enabled(key Feature) bool {
- if v, ok := f.enabled.Load().(map[Feature]bool)[key]; ok {
- return v
- }
- return f.known.Load().(map[Feature]FeatureSpec)[key].Default
-}
-
-// AddFlag adds a flag for setting global feature gates to the specified FlagSet.
-func (f *featureGate) AddFlag(fs *pflag.FlagSet) {
- f.lock.Lock()
- f.closed = true
- f.lock.Unlock()
-
- known := f.KnownFeatures()
- fs.Var(f, flagName, ""+
- "A set of key=value pairs that describe feature gates for alpha/experimental features. "+
- "Options are:\n"+strings.Join(known, "\n"))
-}
-
-// KnownFeatures returns a slice of strings describing the FeatureGate's known features.
-func (f *featureGate) KnownFeatures() []string {
- var known []string
- for k, v := range f.known.Load().(map[Feature]FeatureSpec) {
- pre := ""
- if v.PreRelease != GA {
- pre = fmt.Sprintf("%s - ", v.PreRelease)
- }
- known = append(known, fmt.Sprintf("%s=true|false (%sdefault=%t)", k, pre, v.Default))
- }
- sort.Strings(known)
- return known
-}