Move package app/cmd/features to app/features + bazel files
				
					
				
			This commit is contained in:
		@@ -31,6 +31,7 @@ filegroup(
 | 
				
			|||||||
        "//cmd/kubeadm/app/cmd:all-srcs",
 | 
					        "//cmd/kubeadm/app/cmd:all-srcs",
 | 
				
			||||||
        "//cmd/kubeadm/app/constants:all-srcs",
 | 
					        "//cmd/kubeadm/app/constants:all-srcs",
 | 
				
			||||||
        "//cmd/kubeadm/app/discovery:all-srcs",
 | 
					        "//cmd/kubeadm/app/discovery:all-srcs",
 | 
				
			||||||
 | 
					        "//cmd/kubeadm/app/features:all-srcs",
 | 
				
			||||||
        "//cmd/kubeadm/app/images:all-srcs",
 | 
					        "//cmd/kubeadm/app/images:all-srcs",
 | 
				
			||||||
        "//cmd/kubeadm/app/node:all-srcs",
 | 
					        "//cmd/kubeadm/app/node:all-srcs",
 | 
				
			||||||
        "//cmd/kubeadm/app/phases/addons/dns:all-srcs",
 | 
					        "//cmd/kubeadm/app/phases/addons/dns:all-srcs",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,8 +22,8 @@ go_library(
 | 
				
			|||||||
    srcs = ["validation.go"],
 | 
					    srcs = ["validation.go"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//cmd/kubeadm/app/apis/kubeadm:go_default_library",
 | 
					        "//cmd/kubeadm/app/apis/kubeadm:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/cmd/features:go_default_library",
 | 
					 | 
				
			||||||
        "//cmd/kubeadm/app/constants:go_default_library",
 | 
					        "//cmd/kubeadm/app/constants:go_default_library",
 | 
				
			||||||
 | 
					        "//cmd/kubeadm/app/features:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/util:go_default_library",
 | 
					        "//cmd/kubeadm/app/util:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/util/token:go_default_library",
 | 
					        "//cmd/kubeadm/app/util/token:go_default_library",
 | 
				
			||||||
        "//pkg/api/validation:go_default_library",
 | 
					        "//pkg/api/validation:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,8 +29,8 @@ import (
 | 
				
			|||||||
	"k8s.io/apimachinery/pkg/util/validation"
 | 
						"k8s.io/apimachinery/pkg/util/validation"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/util/validation/field"
 | 
						"k8s.io/apimachinery/pkg/util/validation/field"
 | 
				
			||||||
	"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
 | 
						"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
 | 
				
			||||||
	"k8s.io/kubernetes/cmd/kubeadm/app/cmd/features"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/cmd/kubeadm/app/constants"
 | 
						"k8s.io/kubernetes/cmd/kubeadm/app/constants"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/cmd/kubeadm/app/features"
 | 
				
			||||||
	kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
 | 
						kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
 | 
				
			||||||
	tokenutil "k8s.io/kubernetes/cmd/kubeadm/app/util/token"
 | 
						tokenutil "k8s.io/kubernetes/cmd/kubeadm/app/util/token"
 | 
				
			||||||
	apivalidation "k8s.io/kubernetes/pkg/api/validation"
 | 
						apivalidation "k8s.io/kubernetes/pkg/api/validation"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,10 +22,10 @@ go_library(
 | 
				
			|||||||
        "//cmd/kubeadm/app/apis/kubeadm:go_default_library",
 | 
					        "//cmd/kubeadm/app/apis/kubeadm:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library",
 | 
					        "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library",
 | 
					        "//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/cmd/features:go_default_library",
 | 
					 | 
				
			||||||
        "//cmd/kubeadm/app/cmd/phases:go_default_library",
 | 
					        "//cmd/kubeadm/app/cmd/phases:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/constants:go_default_library",
 | 
					        "//cmd/kubeadm/app/constants:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/discovery:go_default_library",
 | 
					        "//cmd/kubeadm/app/discovery:go_default_library",
 | 
				
			||||||
 | 
					        "//cmd/kubeadm/app/features:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/phases/addons/dns:go_default_library",
 | 
					        "//cmd/kubeadm/app/phases/addons/dns:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/phases/addons/proxy:go_default_library",
 | 
					        "//cmd/kubeadm/app/phases/addons/proxy:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/phases/apiconfig:go_default_library",
 | 
					        "//cmd/kubeadm/app/phases/apiconfig:go_default_library",
 | 
				
			||||||
@@ -94,7 +94,6 @@ filegroup(
 | 
				
			|||||||
    name = "all-srcs",
 | 
					    name = "all-srcs",
 | 
				
			||||||
    srcs = [
 | 
					    srcs = [
 | 
				
			||||||
        ":package-srcs",
 | 
					        ":package-srcs",
 | 
				
			||||||
        "//cmd/kubeadm/app/cmd/features:all-srcs",
 | 
					 | 
				
			||||||
        "//cmd/kubeadm/app/cmd/phases:all-srcs",
 | 
					        "//cmd/kubeadm/app/cmd/phases:all-srcs",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    tags = ["automanaged"],
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,7 @@ go_library(
 | 
				
			|||||||
        "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library",
 | 
					        "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library",
 | 
					        "//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/constants:go_default_library",
 | 
					        "//cmd/kubeadm/app/constants:go_default_library",
 | 
				
			||||||
 | 
					        "//cmd/kubeadm/app/features:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/phases/bootstraptoken/clusterinfo:go_default_library",
 | 
					        "//cmd/kubeadm/app/phases/bootstraptoken/clusterinfo:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/phases/bootstraptoken/node:go_default_library",
 | 
					        "//cmd/kubeadm/app/phases/bootstraptoken/node:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/phases/certs:go_default_library",
 | 
					        "//cmd/kubeadm/app/phases/certs:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@ package(default_visibility = ["//visibility:public"])
 | 
				
			|||||||
load(
 | 
					load(
 | 
				
			||||||
    "@io_bazel_rules_go//go:def.bzl",
 | 
					    "@io_bazel_rules_go//go:def.bzl",
 | 
				
			||||||
    "go_library",
 | 
					    "go_library",
 | 
				
			||||||
 | 
					    "go_test",
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go_library(
 | 
					go_library(
 | 
				
			||||||
@@ -23,3 +24,10 @@ filegroup(
 | 
				
			|||||||
    srcs = [":package-srcs"],
 | 
					    srcs = [":package-srcs"],
 | 
				
			||||||
    tags = ["automanaged"],
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go_test(
 | 
				
			||||||
 | 
					    name = "go_default_test",
 | 
				
			||||||
 | 
					    srcs = ["features_test.go"],
 | 
				
			||||||
 | 
					    library = ":go_default_library",
 | 
				
			||||||
 | 
					    deps = ["//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@@ -17,6 +17,11 @@ limitations under the License.
 | 
				
			|||||||
package features
 | 
					package features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"sort"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
						utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,3 +66,48 @@ var InitFeatureGates = FeatureList{
 | 
				
			|||||||
	SelfHosting:         {Default: false, PreRelease: utilfeature.Beta},
 | 
						SelfHosting:         {Default: false, PreRelease: utilfeature.Beta},
 | 
				
			||||||
	StoreCertsInSecrets: {Default: false, PreRelease: utilfeature.Alpha},
 | 
						StoreCertsInSecrets: {Default: false, PreRelease: utilfeature.Alpha},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// KnownFeatures returns a slice of strings describing the FeatureList features.
 | 
				
			||||||
 | 
					func KnownFeatures(f *FeatureList) []string {
 | 
				
			||||||
 | 
						var known []string
 | 
				
			||||||
 | 
						for k, v := range *f {
 | 
				
			||||||
 | 
							pre := ""
 | 
				
			||||||
 | 
							if v.PreRelease != utilfeature.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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewFeatureGate parse a string of the form "key1=value1,key2=value2,..." into a
 | 
				
			||||||
 | 
					// map[string]bool of known keys or returns an error.
 | 
				
			||||||
 | 
					func NewFeatureGate(f *FeatureList, value string) (map[string]bool, error) {
 | 
				
			||||||
 | 
						featureGate := map[string]bool{}
 | 
				
			||||||
 | 
						for _, s := range strings.Split(value, ",") {
 | 
				
			||||||
 | 
							if len(s) == 0 {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							arr := strings.SplitN(s, "=", 2)
 | 
				
			||||||
 | 
							if len(arr) != 2 {
 | 
				
			||||||
 | 
								return nil, fmt.Errorf("missing bool value for feature-gate key:%s", s)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							k := strings.TrimSpace(arr[0])
 | 
				
			||||||
 | 
							v := strings.TrimSpace(arr[1])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if !Supports(*f, k) {
 | 
				
			||||||
 | 
								return nil, fmt.Errorf("unrecognized feature-gate key: %s", k)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							boolValue, err := strconv.ParseBool(v)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, fmt.Errorf("invalid value %v for feature-gate key: %s, use true|false instead", v, k)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							featureGate[k] = boolValue
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return featureGate, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										119
									
								
								cmd/kubeadm/app/features/features_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								cmd/kubeadm/app/features/features_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,119 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					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.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"reflect"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestKnownFeatures(t *testing.T) {
 | 
				
			||||||
 | 
						var someFeatures = FeatureList{
 | 
				
			||||||
 | 
							"feature2": {Default: true, PreRelease: utilfeature.Alpha},
 | 
				
			||||||
 | 
							"feature1": {Default: false, PreRelease: utilfeature.Beta},
 | 
				
			||||||
 | 
							"feature3": {Default: false, PreRelease: utilfeature.GA},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r := KnownFeatures(&someFeatures)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(r) != 3 {
 | 
				
			||||||
 | 
							t.Errorf("KnownFeatures returned %d values, expected 3", len(r))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// check the first value is feature1 (the list should be sorted); prerelease and default should be present
 | 
				
			||||||
 | 
						f1 := "feature1=true|false (BETA - default=false)"
 | 
				
			||||||
 | 
						if r[0] != f1 {
 | 
				
			||||||
 | 
							t.Errorf("KnownFeatures returned %s values, expected %s", r[0], f1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// check the second value is feature2; prerelease and default should be present
 | 
				
			||||||
 | 
						f2 := "feature2=true|false (ALPHA - default=true)"
 | 
				
			||||||
 | 
						if r[1] != f2 {
 | 
				
			||||||
 | 
							t.Errorf("KnownFeatures returned %s values, expected %s", r[1], f2)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// check the second value is feature3; prerelease should not shown fo GA features; default should be present
 | 
				
			||||||
 | 
						f3 := "feature3=true|false (default=false)"
 | 
				
			||||||
 | 
						if r[2] != f3 {
 | 
				
			||||||
 | 
							t.Errorf("KnownFeatures returned %s values, expected %s", r[2], f3)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestNewFeatureGate(t *testing.T) {
 | 
				
			||||||
 | 
						var someFeatures = FeatureList{
 | 
				
			||||||
 | 
							"feature1": {Default: false, PreRelease: utilfeature.Beta},
 | 
				
			||||||
 | 
							"feature2": {Default: true, PreRelease: utilfeature.Alpha},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var tests = []struct {
 | 
				
			||||||
 | 
							value                string
 | 
				
			||||||
 | 
							expectedError        bool
 | 
				
			||||||
 | 
							expectedFeaturesGate map[string]bool
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{ //invalid value (missing =)
 | 
				
			||||||
 | 
								value:         "invalidValue",
 | 
				
			||||||
 | 
								expectedError: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{ //invalid value (missing =)
 | 
				
			||||||
 | 
								value:         "feature1=true,invalidValue",
 | 
				
			||||||
 | 
								expectedError: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{ //invalid value (not a boolean)
 | 
				
			||||||
 | 
								value:         "feature1=notABoolean",
 | 
				
			||||||
 | 
								expectedError: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{ //invalid value (not a boolean)
 | 
				
			||||||
 | 
								value:         "feature1=true,feature2=notABoolean",
 | 
				
			||||||
 | 
								expectedError: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{ //unrecognized feature-gate key
 | 
				
			||||||
 | 
								value:         "unknownFeature=false",
 | 
				
			||||||
 | 
								expectedError: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{ //unrecognized feature-gate key
 | 
				
			||||||
 | 
								value:         "feature1=true,unknownFeature=false",
 | 
				
			||||||
 | 
								expectedError: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{ //one feature
 | 
				
			||||||
 | 
								value:                "feature1=true",
 | 
				
			||||||
 | 
								expectedError:        false,
 | 
				
			||||||
 | 
								expectedFeaturesGate: map[string]bool{"feature1": true},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{ //two features
 | 
				
			||||||
 | 
								value:                "feature1=true,feature2=false",
 | 
				
			||||||
 | 
								expectedError:        false,
 | 
				
			||||||
 | 
								expectedFeaturesGate: map[string]bool{"feature1": true, "feature2": false},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, test := range tests {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							r, err := NewFeatureGate(&someFeatures, test.value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if !test.expectedError && err != nil {
 | 
				
			||||||
 | 
								t.Errorf("NewFeatureGate failed when not expected: %v", err)
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							} else if test.expectedError && err == nil {
 | 
				
			||||||
 | 
								t.Error("NewFeatureGate didn't failed when expected")
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if !reflect.DeepEqual(r, test.expectedFeaturesGate) {
 | 
				
			||||||
 | 
								t.Errorf("NewFeatureGate returned a unexpected value")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -30,8 +30,8 @@ go_library(
 | 
				
			|||||||
    ],
 | 
					    ],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//cmd/kubeadm/app/apis/kubeadm:go_default_library",
 | 
					        "//cmd/kubeadm/app/apis/kubeadm:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/cmd/features:go_default_library",
 | 
					 | 
				
			||||||
        "//cmd/kubeadm/app/constants:go_default_library",
 | 
					        "//cmd/kubeadm/app/constants:go_default_library",
 | 
				
			||||||
 | 
					        "//cmd/kubeadm/app/features:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/util:go_default_library",
 | 
					        "//cmd/kubeadm/app/util:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/util/apiclient:go_default_library",
 | 
					        "//cmd/kubeadm/app/util/apiclient:go_default_library",
 | 
				
			||||||
        "//pkg/api:go_default_library",
 | 
					        "//pkg/api:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,8 +28,8 @@ import (
 | 
				
			|||||||
	kuberuntime "k8s.io/apimachinery/pkg/runtime"
 | 
						kuberuntime "k8s.io/apimachinery/pkg/runtime"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
 | 
						kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
 | 
				
			||||||
	"k8s.io/kubernetes/cmd/kubeadm/app/cmd/features"
 | 
					 | 
				
			||||||
	kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
 | 
						kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/cmd/kubeadm/app/features"
 | 
				
			||||||
	"k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient"
 | 
						"k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api"
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user