diff --git a/build/visible_to/BUILD b/build/visible_to/BUILD index 9ef8af95a7..baf30d938a 100644 --- a/build/visible_to/BUILD +++ b/build/visible_to/BUILD @@ -391,10 +391,9 @@ package_group( name = "pkg_kubectl_util_CONSUMERS", packages = [ "//pkg/kubectl", - "//pkg/kubectl/cmd", - "//pkg/kubectl/cmd/logs", - "//pkg/kubectl/cmd/portforward", - "//pkg/kubectl/cmd/rollingupdate", + "//pkg/kubectl/cmd/...", + "//pkg/kubectl/generate", + "//pkg/kubectl/generate/versioned", "//pkg/kubectl/proxy", ], ) diff --git a/hack/.golint_failures b/hack/.golint_failures index 7905bfc32b..ddf5b65d53 100644 --- a/hack/.golint_failures +++ b/hack/.golint_failures @@ -189,6 +189,8 @@ pkg/kubectl/cmd/util/openapi pkg/kubectl/cmd/util/sanity pkg/kubectl/cmd/version pkg/kubectl/cmd/wait +pkg/kubectl/generate +pkg/kubectl/generate/versioned pkg/kubectl/metricsutil pkg/kubectl/util pkg/kubectl/util/slice diff --git a/pkg/kubectl/BUILD b/pkg/kubectl/BUILD index f68f57b8d8..b993d1c12b 100644 --- a/pkg/kubectl/BUILD +++ b/pkg/kubectl/BUILD @@ -9,29 +9,11 @@ load( go_test( name = "go_default_test", srcs = [ - "autoscale_test.go", - "clusterrolebinding_test.go", - "configmap_test.go", - "deployment_test.go", - "env_file_test.go", - "generate_test.go", "history_test.go", - "namespace_test.go", - "pdb_test.go", - "priorityclass_test.go", - "quota_test.go", - "rolebinding_test.go", "rollback_test.go", "rolling_updater_test.go", "rollout_status_test.go", - "run_test.go", "scale_test.go", - "secret_for_docker_registry_test.go", - "secret_for_tls_test.go", - "secret_test.go", - "service_basic_test.go", - "service_test.go", - "serviceaccount_test.go", "sorter_test.go", ], embed = [":go_default_library"], @@ -39,21 +21,11 @@ go_test( "//pkg/kubectl/scheme:go_default_library", "//pkg/kubectl/util:go_default_library", "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/v1:go_default_library", @@ -69,9 +41,6 @@ go_test( "//staging/src/k8s.io/client-go/scale:go_default_library", "//staging/src/k8s.io/client-go/scale/fake:go_default_library", "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//vendor/github.com/spf13/cobra:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", ], ) @@ -79,32 +48,14 @@ go_library( name = "go_default_library", srcs = [ "apply.go", - "autoscale.go", - "clusterrolebinding.go", "conditions.go", - "configmap.go", - "deployment.go", "doc.go", - "env_file.go", - "generate.go", "history.go", "interfaces.go", - "namespace.go", - "pdb.go", - "priorityclass.go", - "quota.go", - "rolebinding.go", "rollback.go", "rolling_updater.go", "rollout_status.go", - "run.go", "scale.go", - "secret.go", - "secret_for_docker_registry.go", - "secret_for_tls.go", - "service.go", - "service_basic.go", - "serviceaccount.go", "sorter.go", ], importpath = "k8s.io/kubernetes/pkg/kubectl", @@ -112,30 +63,19 @@ go_library( "//pkg/apis/core:go_default_library", "//pkg/apis/core/v1:go_default_library", "//pkg/controller/deployment/util:go_default_library", - "//pkg/credentialprovider:go_default_library", "//pkg/kubectl/apps:go_default_library", "//pkg/kubectl/scheme:go_default_library", "//pkg/kubectl/util:go_default_library", - "//pkg/kubectl/util/hash:go_default_library", "//pkg/kubectl/util/podutils:go_default_library", "//pkg/kubectl/util/slice:go_default_library", "//pkg/printers:go_default_library", "//pkg/printers/internalversion:go_default_library", "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", @@ -143,12 +83,9 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", @@ -160,8 +97,6 @@ go_library( "//staging/src/k8s.io/client-go/util/jsonpath:go_default_library", "//staging/src/k8s.io/client-go/util/retry:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/spf13/cobra:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/vbom.ml/util/sortorder:go_default_library", ], ) @@ -180,7 +115,9 @@ filegroup( "//pkg/kubectl/apply:all-srcs", "//pkg/kubectl/apps:all-srcs", "//pkg/kubectl/cmd:all-srcs", + "//pkg/kubectl/describe:all-srcs", "//pkg/kubectl/explain:all-srcs", + "//pkg/kubectl/generate:all-srcs", "//pkg/kubectl/metricsutil:all-srcs", "//pkg/kubectl/polymorphichelpers:all-srcs", "//pkg/kubectl/proxy:all-srcs", diff --git a/pkg/kubectl/cmd/autoscale/BUILD b/pkg/kubectl/cmd/autoscale/BUILD index c601d795d4..1c9aea0718 100644 --- a/pkg/kubectl/cmd/autoscale/BUILD +++ b/pkg/kubectl/cmd/autoscale/BUILD @@ -8,6 +8,8 @@ go_library( deps = [ "//pkg/kubectl:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", + "//pkg/kubectl/generate:go_default_library", + "//pkg/kubectl/generate/versioned:go_default_library", "//pkg/kubectl/polymorphichelpers:go_default_library", "//pkg/kubectl/scheme:go_default_library", "//pkg/kubectl/util/i18n:go_default_library", diff --git a/pkg/kubectl/cmd/autoscale/autoscale.go b/pkg/kubectl/cmd/autoscale/autoscale.go index d609c98bbc..f51c93be5f 100644 --- a/pkg/kubectl/cmd/autoscale/autoscale.go +++ b/pkg/kubectl/cmd/autoscale/autoscale.go @@ -30,6 +30,8 @@ import ( autoscalingv1client "k8s.io/client-go/kubernetes/typed/autoscaling/v1" "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/polymorphichelpers" "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" @@ -73,7 +75,7 @@ type AutoscaleOptions struct { dryRun bool builder *resource.Builder canBeAutoscaled polymorphichelpers.CanBeAutoscaledFunc - generatorFunc func(string, *meta.RESTMapping) (kubectl.StructuredGenerator, error) + generatorFunc func(string, *meta.RESTMapping) (generate.StructuredGenerator, error) HPAClient autoscalingv1client.HorizontalPodAutoscalersGetter @@ -114,7 +116,7 @@ func NewCmdAutoscale(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) * o.RecordFlags.AddFlags(cmd) o.PrintFlags.AddFlags(cmd) - cmd.Flags().StringVar(&o.Generator, "generator", cmdutil.HorizontalPodAutoscalerV1GeneratorName, i18n.T("The name of the API generator to use. Currently there is only 1 generator.")) + cmd.Flags().StringVar(&o.Generator, "generator", generateversioned.HorizontalPodAutoscalerV1GeneratorName, i18n.T("The name of the API generator to use. Currently there is only 1 generator.")) cmd.Flags().Int32Var(&o.Min, "min", -1, "The lower limit for the number of pods that can be set by the autoscaler. If it's not specified or negative, the server will apply a default value.") cmd.Flags().Int32Var(&o.Max, "max", -1, "The upper limit for the number of pods that can be set by the autoscaler. Required.") cmd.MarkFlagRequired("max") @@ -147,10 +149,10 @@ func (o *AutoscaleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args o.HPAClient = kubeClient.AutoscalingV1() // get the generator - o.generatorFunc = func(name string, mapping *meta.RESTMapping) (kubectl.StructuredGenerator, error) { + o.generatorFunc = func(name string, mapping *meta.RESTMapping) (generate.StructuredGenerator, error) { switch o.Generator { - case cmdutil.HorizontalPodAutoscalerV1GeneratorName: - return &kubectl.HorizontalPodAutoscalerGeneratorV1{ + case generateversioned.HorizontalPodAutoscalerV1GeneratorName: + return &generateversioned.HorizontalPodAutoscalerGeneratorV1{ Name: name, MinReplicas: o.Min, MaxReplicas: o.Max, diff --git a/pkg/kubectl/cmd/create/BUILD b/pkg/kubectl/cmd/create/BUILD index d20be32539..3f043b50b5 100644 --- a/pkg/kubectl/cmd/create/BUILD +++ b/pkg/kubectl/cmd/create/BUILD @@ -25,6 +25,8 @@ go_library( "//pkg/kubectl:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", "//pkg/kubectl/cmd/util/editor:go_default_library", + "//pkg/kubectl/generate:go_default_library", + "//pkg/kubectl/generate/versioned:go_default_library", "//pkg/kubectl/scheme:go_default_library", "//pkg/kubectl/util/i18n:go_default_library", "//pkg/kubectl/util/templates:go_default_library", @@ -74,9 +76,8 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//pkg/kubectl:go_default_library", "//pkg/kubectl/cmd/testing:go_default_library", - "//pkg/kubectl/cmd/util:go_default_library", + "//pkg/kubectl/generate/versioned:go_default_library", "//pkg/kubectl/scheme:go_default_library", "//staging/src/k8s.io/api/batch/v1:go_default_library", "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", diff --git a/pkg/kubectl/cmd/create/create.go b/pkg/kubectl/cmd/create/create.go index bb00c1b006..b96b62eca8 100644 --- a/pkg/kubectl/cmd/create/create.go +++ b/pkg/kubectl/cmd/create/create.go @@ -39,6 +39,7 @@ import ( "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/cmd/util/editor" + "k8s.io/kubernetes/pkg/kubectl/generate" "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/util/templates" @@ -346,7 +347,7 @@ type CreateSubcommandOptions struct { // Name of resource being created Name string // StructuredGenerator is the resource generator for the object being created - StructuredGenerator kubectl.StructuredGenerator + StructuredGenerator generate.StructuredGenerator // DryRun is true if the command should be simulated but not run against the server DryRun bool CreateAnnotation bool @@ -369,7 +370,7 @@ func NewCreateSubcommandOptions(ioStreams genericclioptions.IOStreams) *CreateSu } } -func (o *CreateSubcommandOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []string, generator kubectl.StructuredGenerator) error { +func (o *CreateSubcommandOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []string, generator generate.StructuredGenerator) error { name, err := NameFromCommandArgs(cmd, args) if err != nil { return err diff --git a/pkg/kubectl/cmd/create/create_clusterrolebinding.go b/pkg/kubectl/cmd/create/create_clusterrolebinding.go index cfd02f2494..882da888cc 100644 --- a/pkg/kubectl/cmd/create/create_clusterrolebinding.go +++ b/pkg/kubectl/cmd/create/create_clusterrolebinding.go @@ -20,8 +20,9 @@ import ( "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/util/templates" ) @@ -61,7 +62,7 @@ func NewCmdCreateClusterRoleBinding(f cmdutil.Factory, ioStreams genericclioptio cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.ClusterRoleBindingV1GeneratorName) + cmdutil.AddGeneratorFlags(cmd, generateversioned.ClusterRoleBindingV1GeneratorName) cmd.Flags().String("clusterrole", "", i18n.T("ClusterRole this ClusterRoleBinding should reference")) cmd.MarkFlagCustom("clusterrole", "__kubectl_get_resource_clusterrole") cmd.Flags().StringArray("user", []string{}, "Usernames to bind to the clusterrole") @@ -76,10 +77,10 @@ func (o *ClusterRoleBindingOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, return err } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.ClusterRoleBindingV1GeneratorName: - generator = &kubectl.ClusterRoleBindingGeneratorV1{ + case generateversioned.ClusterRoleBindingV1GeneratorName: + generator = &generateversioned.ClusterRoleBindingGeneratorV1{ Name: name, ClusterRole: cmdutil.GetFlagString(cmd, "clusterrole"), Users: cmdutil.GetFlagStringArray(cmd, "user"), diff --git a/pkg/kubectl/cmd/create/create_configmap.go b/pkg/kubectl/cmd/create/create_configmap.go index 46e5230ae2..4837d658f9 100644 --- a/pkg/kubectl/cmd/create/create_configmap.go +++ b/pkg/kubectl/cmd/create/create_configmap.go @@ -20,8 +20,9 @@ import ( "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/util/templates" ) @@ -83,7 +84,7 @@ func NewCmdCreateConfigMap(f cmdutil.Factory, ioStreams genericclioptions.IOStre cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.ConfigMapV1GeneratorName) + cmdutil.AddGeneratorFlags(cmd, generateversioned.ConfigMapV1GeneratorName) cmd.Flags().StringSlice("from-file", []string{}, "Key file can be specified using its file path, in which case file basename will be used as configmap key, or optionally with a key and file path, in which case the given key will be used. Specifying a directory will iterate each named file in the directory whose basename is a valid configmap key.") cmd.Flags().StringArray("from-literal", []string{}, "Specify a key and literal value to insert in configmap (i.e. mykey=somevalue)") cmd.Flags().String("from-env-file", "", "Specify the path to a file to read lines of key=val pairs to create a configmap (i.e. a Docker .env file).") @@ -97,10 +98,10 @@ func (o *ConfigMapOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, args []s return err } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.ConfigMapV1GeneratorName: - generator = &kubectl.ConfigMapGeneratorV1{ + case generateversioned.ConfigMapV1GeneratorName: + generator = &generateversioned.ConfigMapGeneratorV1{ Name: name, FileSources: cmdutil.GetFlagStringSlice(cmd, "from-file"), LiteralSources: cmdutil.GetFlagStringArray(cmd, "from-literal"), diff --git a/pkg/kubectl/cmd/create/create_deployment.go b/pkg/kubectl/cmd/create/create_deployment.go index 82bde7ba93..1a069f73ff 100644 --- a/pkg/kubectl/cmd/create/create_deployment.go +++ b/pkg/kubectl/cmd/create/create_deployment.go @@ -20,8 +20,9 @@ import ( "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/util/templates" ) @@ -77,30 +78,30 @@ func generatorFromName( generatorName string, imageNames []string, deploymentName string, -) (kubectl.StructuredGenerator, bool) { +) (generate.StructuredGenerator, bool) { switch generatorName { - case cmdutil.DeploymentBasicAppsV1GeneratorName: - generator := &kubectl.DeploymentBasicAppsGeneratorV1{ - BaseDeploymentGenerator: kubectl.BaseDeploymentGenerator{ + case generateversioned.DeploymentBasicAppsV1GeneratorName: + generator := &generateversioned.DeploymentBasicAppsGeneratorV1{ + BaseDeploymentGenerator: generateversioned.BaseDeploymentGenerator{ Name: deploymentName, Images: imageNames, }, } return generator, true - case cmdutil.DeploymentBasicAppsV1Beta1GeneratorName: - generator := &kubectl.DeploymentBasicAppsGeneratorV1Beta1{ - BaseDeploymentGenerator: kubectl.BaseDeploymentGenerator{ + case generateversioned.DeploymentBasicAppsV1Beta1GeneratorName: + generator := &generateversioned.DeploymentBasicAppsGeneratorV1Beta1{ + BaseDeploymentGenerator: generateversioned.BaseDeploymentGenerator{ Name: deploymentName, Images: imageNames, }, } return generator, true - case cmdutil.DeploymentBasicV1Beta1GeneratorName: - generator := &kubectl.DeploymentBasicGeneratorV1{ - BaseDeploymentGenerator: kubectl.BaseDeploymentGenerator{ + case generateversioned.DeploymentBasicV1Beta1GeneratorName: + generator := &generateversioned.DeploymentBasicGeneratorV1{ + BaseDeploymentGenerator: generateversioned.BaseDeploymentGenerator{ Name: deploymentName, Images: imageNames, }, @@ -125,8 +126,8 @@ func (o *DeploymentOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, args [] generatorName := cmdutil.GetFlagString(cmd, "generator") if len(generatorName) == 0 { - generatorName = cmdutil.DeploymentBasicAppsV1GeneratorName - generatorNameTemp, err := cmdutil.FallbackGeneratorNameIfNecessary(generatorName, clientset.Discovery(), o.CreateSubcommandOptions.ErrOut) + generatorName = generateversioned.DeploymentBasicAppsV1GeneratorName + generatorNameTemp, err := generateversioned.FallbackGeneratorNameIfNecessary(generatorName, clientset.Discovery(), o.CreateSubcommandOptions.ErrOut) if err != nil { return err } diff --git a/pkg/kubectl/cmd/create/create_deployment_test.go b/pkg/kubectl/cmd/create/create_deployment_test.go index bbe9d691d6..0284dc3508 100644 --- a/pkg/kubectl/cmd/create/create_deployment_test.go +++ b/pkg/kubectl/cmd/create/create_deployment_test.go @@ -27,18 +27,17 @@ import ( "k8s.io/cli-runtime/pkg/genericclioptions" restclient "k8s.io/client-go/rest" "k8s.io/client-go/rest/fake" - "k8s.io/kubernetes/pkg/kubectl" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/scheme" ) func Test_generatorFromName(t *testing.T) { const ( nonsenseName = "not-a-real-generator-name" - basicName = cmdutil.DeploymentBasicV1Beta1GeneratorName - basicAppsV1Beta1Name = cmdutil.DeploymentBasicAppsV1Beta1GeneratorName - basicAppsV1Name = cmdutil.DeploymentBasicAppsV1GeneratorName + basicName = generateversioned.DeploymentBasicV1Beta1GeneratorName + basicAppsV1Beta1Name = generateversioned.DeploymentBasicAppsV1Beta1GeneratorName + basicAppsV1Name = generateversioned.DeploymentBasicAppsV1GeneratorName deploymentName = "deployment-name" ) imageNames := []string{"image-1", "image-2"} @@ -51,8 +50,8 @@ func Test_generatorFromName(t *testing.T) { assert.True(t, ok) { - expectedGenerator := &kubectl.DeploymentBasicGeneratorV1{ - BaseDeploymentGenerator: kubectl.BaseDeploymentGenerator{ + expectedGenerator := &generateversioned.DeploymentBasicGeneratorV1{ + BaseDeploymentGenerator: generateversioned.BaseDeploymentGenerator{ Name: deploymentName, Images: imageNames, }, @@ -64,8 +63,8 @@ func Test_generatorFromName(t *testing.T) { assert.True(t, ok) { - expectedGenerator := &kubectl.DeploymentBasicAppsGeneratorV1Beta1{ - BaseDeploymentGenerator: kubectl.BaseDeploymentGenerator{ + expectedGenerator := &generateversioned.DeploymentBasicAppsGeneratorV1Beta1{ + BaseDeploymentGenerator: generateversioned.BaseDeploymentGenerator{ Name: deploymentName, Images: imageNames, }, @@ -77,8 +76,8 @@ func Test_generatorFromName(t *testing.T) { assert.True(t, ok) { - expectedGenerator := &kubectl.DeploymentBasicAppsGeneratorV1{ - BaseDeploymentGenerator: kubectl.BaseDeploymentGenerator{ + expectedGenerator := &generateversioned.DeploymentBasicAppsGeneratorV1{ + BaseDeploymentGenerator: generateversioned.BaseDeploymentGenerator{ Name: deploymentName, Images: imageNames, }, diff --git a/pkg/kubectl/cmd/create/create_namespace.go b/pkg/kubectl/cmd/create/create_namespace.go index 46409c703d..04ea190cf8 100644 --- a/pkg/kubectl/cmd/create/create_namespace.go +++ b/pkg/kubectl/cmd/create/create_namespace.go @@ -20,8 +20,9 @@ import ( "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/util/templates" ) @@ -62,7 +63,7 @@ func NewCmdCreateNamespace(f cmdutil.Factory, ioStreams genericclioptions.IOStre cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.NamespaceV1GeneratorName) + cmdutil.AddGeneratorFlags(cmd, generateversioned.NamespaceV1GeneratorName) return cmd } @@ -73,10 +74,10 @@ func (o *NamespaceOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, args []s return err } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.NamespaceV1GeneratorName: - generator = &kubectl.NamespaceGeneratorV1{Name: name} + case generateversioned.NamespaceV1GeneratorName: + generator = &generateversioned.NamespaceGeneratorV1{Name: name} default: return errUnsupportedGenerator(cmd, generatorName) } diff --git a/pkg/kubectl/cmd/create/create_pdb.go b/pkg/kubectl/cmd/create/create_pdb.go index fbb283001c..7a0f5b91af 100644 --- a/pkg/kubectl/cmd/create/create_pdb.go +++ b/pkg/kubectl/cmd/create/create_pdb.go @@ -20,8 +20,9 @@ import ( "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/util/templates" ) @@ -67,7 +68,7 @@ func NewCmdCreatePodDisruptionBudget(f cmdutil.Factory, ioStreams genericcliopti cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.PodDisruptionBudgetV2GeneratorName) + cmdutil.AddGeneratorFlags(cmd, generateversioned.PodDisruptionBudgetV2GeneratorName) cmd.Flags().String("min-available", "", i18n.T("The minimum number or percentage of available pods this budget requires.")) cmd.Flags().String("max-unavailable", "", i18n.T("The maximum number or percentage of unavailable pods this budget requires.")) @@ -81,16 +82,16 @@ func (o *PodDisruptionBudgetOpts) Complete(f cmdutil.Factory, cmd *cobra.Command return err } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.PodDisruptionBudgetV1GeneratorName: - generator = &kubectl.PodDisruptionBudgetV1Generator{ + case generateversioned.PodDisruptionBudgetV1GeneratorName: + generator = &generateversioned.PodDisruptionBudgetV1Generator{ Name: name, MinAvailable: cmdutil.GetFlagString(cmd, "min-available"), Selector: cmdutil.GetFlagString(cmd, "selector"), } - case cmdutil.PodDisruptionBudgetV2GeneratorName: - generator = &kubectl.PodDisruptionBudgetV2Generator{ + case generateversioned.PodDisruptionBudgetV2GeneratorName: + generator = &generateversioned.PodDisruptionBudgetV2Generator{ Name: name, MinAvailable: cmdutil.GetFlagString(cmd, "min-available"), MaxUnavailable: cmdutil.GetFlagString(cmd, "max-unavailable"), diff --git a/pkg/kubectl/cmd/create/create_priorityclass.go b/pkg/kubectl/cmd/create/create_priorityclass.go index e51638c861..5cf7f52920 100644 --- a/pkg/kubectl/cmd/create/create_priorityclass.go +++ b/pkg/kubectl/cmd/create/create_priorityclass.go @@ -20,8 +20,9 @@ import ( "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/util/templates" ) @@ -65,7 +66,7 @@ func NewCmdCreatePriorityClass(f cmdutil.Factory, ioStreams genericclioptions.IO cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.PriorityClassV1Alpha1GeneratorName) + cmdutil.AddGeneratorFlags(cmd, generateversioned.PriorityClassV1Alpha1GeneratorName) cmd.Flags().Int32("value", 0, i18n.T("the value of this priority class.")) cmd.Flags().Bool("global-default", false, i18n.T("global-default specifies whether this PriorityClass should be considered as the default priority.")) @@ -79,10 +80,10 @@ func (o *PriorityClassOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, args return err } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.PriorityClassV1Alpha1GeneratorName: - generator = &kubectl.PriorityClassV1Generator{ + case generateversioned.PriorityClassV1Alpha1GeneratorName: + generator = &generateversioned.PriorityClassV1Generator{ Name: name, Value: cmdutil.GetFlagInt32(cmd, "value"), GlobalDefault: cmdutil.GetFlagBool(cmd, "global-default"), diff --git a/pkg/kubectl/cmd/create/create_quota.go b/pkg/kubectl/cmd/create/create_quota.go index 9c43ed42e2..95676a1830 100644 --- a/pkg/kubectl/cmd/create/create_quota.go +++ b/pkg/kubectl/cmd/create/create_quota.go @@ -20,8 +20,9 @@ import ( "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/util/templates" ) @@ -65,7 +66,7 @@ func NewCmdCreateQuota(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.ResourceQuotaV1GeneratorName) + cmdutil.AddGeneratorFlags(cmd, generateversioned.ResourceQuotaV1GeneratorName) cmd.Flags().String("hard", "", i18n.T("A comma-delimited set of resource=quantity pairs that define a hard limit.")) cmd.Flags().String("scopes", "", i18n.T("A comma-delimited set of quota scopes that must all match each object tracked by the quota.")) return cmd @@ -77,10 +78,10 @@ func (o *QuotaOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, args []strin return err } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.ResourceQuotaV1GeneratorName: - generator = &kubectl.ResourceQuotaGeneratorV1{ + case generateversioned.ResourceQuotaV1GeneratorName: + generator = &generateversioned.ResourceQuotaGeneratorV1{ Name: name, Hard: cmdutil.GetFlagString(cmd, "hard"), Scopes: cmdutil.GetFlagString(cmd, "scopes"), diff --git a/pkg/kubectl/cmd/create/create_rolebinding.go b/pkg/kubectl/cmd/create/create_rolebinding.go index 977e8f1930..4b8f2b28ed 100644 --- a/pkg/kubectl/cmd/create/create_rolebinding.go +++ b/pkg/kubectl/cmd/create/create_rolebinding.go @@ -20,8 +20,9 @@ import ( "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/util/templates" ) @@ -61,7 +62,7 @@ func NewCmdCreateRoleBinding(f cmdutil.Factory, ioStreams genericclioptions.IOSt cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.RoleBindingV1GeneratorName) + cmdutil.AddGeneratorFlags(cmd, generateversioned.RoleBindingV1GeneratorName) cmd.Flags().String("clusterrole", "", i18n.T("ClusterRole this RoleBinding should reference")) cmd.Flags().String("role", "", i18n.T("Role this RoleBinding should reference")) cmd.Flags().StringArray("user", []string{}, "Usernames to bind to the role") @@ -76,10 +77,10 @@ func (o *RoleBindingOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, args [ return err } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.RoleBindingV1GeneratorName: - generator = &kubectl.RoleBindingGeneratorV1{ + case generateversioned.RoleBindingV1GeneratorName: + generator = &generateversioned.RoleBindingGeneratorV1{ Name: name, ClusterRole: cmdutil.GetFlagString(cmd, "clusterrole"), Role: cmdutil.GetFlagString(cmd, "role"), diff --git a/pkg/kubectl/cmd/create/create_secret.go b/pkg/kubectl/cmd/create/create_secret.go index 96fd3a30c9..4512dffbda 100644 --- a/pkg/kubectl/cmd/create/create_secret.go +++ b/pkg/kubectl/cmd/create/create_secret.go @@ -20,8 +20,9 @@ import ( "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/util/templates" ) @@ -98,7 +99,7 @@ func NewCmdCreateSecretGeneric(f cmdutil.Factory, ioStreams genericclioptions.IO cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.SecretV1GeneratorName) + cmdutil.AddGeneratorFlags(cmd, generateversioned.SecretV1GeneratorName) cmd.Flags().StringSlice("from-file", []string{}, "Key files can be specified using their file path, in which case a default name will be given to them, or optionally with a name and file path, in which case the given name will be used. Specifying a directory will iterate each named file in the directory that is a valid secret key.") cmd.Flags().StringArray("from-literal", []string{}, "Specify a key and literal value to insert in secret (i.e. mykey=somevalue)") cmd.Flags().String("from-env-file", "", "Specify the path to a file to read lines of key=val pairs to create a secret (i.e. a Docker .env file).") @@ -113,10 +114,10 @@ func (o *SecretGenericOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, args return err } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.SecretV1GeneratorName: - generator = &kubectl.SecretGeneratorV1{ + case generateversioned.SecretV1GeneratorName: + generator = &generateversioned.SecretGeneratorV1{ Name: name, Type: cmdutil.GetFlagString(cmd, "type"), FileSources: cmdutil.GetFlagStringSlice(cmd, "from-file"), @@ -183,7 +184,7 @@ func NewCmdCreateSecretDockerRegistry(f cmdutil.Factory, ioStreams genericcliopt cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.SecretForDockerRegistryV1GeneratorName) + cmdutil.AddGeneratorFlags(cmd, generateversioned.SecretForDockerRegistryV1GeneratorName) cmd.Flags().String("docker-username", "", i18n.T("Username for Docker registry authentication")) cmd.MarkFlagRequired("docker-username") cmd.Flags().String("docker-password", "", i18n.T("Password for Docker registry authentication")) @@ -212,10 +213,10 @@ func (o *SecretDockerRegistryOpts) Complete(f cmdutil.Factory, cmd *cobra.Comman } } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.SecretForDockerRegistryV1GeneratorName: - generator = &kubectl.SecretForDockerRegistryGeneratorV1{ + case generateversioned.SecretForDockerRegistryV1GeneratorName: + generator = &generateversioned.SecretForDockerRegistryGeneratorV1{ Name: name, Username: cmdutil.GetFlagString(cmd, "docker-username"), Email: cmdutil.GetFlagString(cmd, "docker-email"), @@ -274,7 +275,7 @@ func NewCmdCreateSecretTLS(f cmdutil.Factory, ioStreams genericclioptions.IOStre cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.SecretForTLSV1GeneratorName) + cmdutil.AddGeneratorFlags(cmd, generateversioned.SecretForTLSV1GeneratorName) cmd.Flags().String("cert", "", i18n.T("Path to PEM encoded public key certificate.")) cmd.Flags().String("key", "", i18n.T("Path to private key associated with given certificate.")) cmd.Flags().Bool("append-hash", false, "Append a hash of the secret to its name.") @@ -293,10 +294,10 @@ func (o *SecretTLSOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, args []s return cmdutil.UsageErrorf(cmd, "flag %s is required", requiredFlag) } } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.SecretForTLSV1GeneratorName: - generator = &kubectl.SecretForTLSGeneratorV1{ + case generateversioned.SecretForTLSV1GeneratorName: + generator = &generateversioned.SecretForTLSGeneratorV1{ Name: name, Key: cmdutil.GetFlagString(cmd, "key"), Cert: cmdutil.GetFlagString(cmd, "cert"), diff --git a/pkg/kubectl/cmd/create/create_service.go b/pkg/kubectl/cmd/create/create_service.go index 4b31641fd0..ee34f1814f 100644 --- a/pkg/kubectl/cmd/create/create_service.go +++ b/pkg/kubectl/cmd/create/create_service.go @@ -21,8 +21,9 @@ import ( "k8s.io/api/core/v1" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/util/templates" ) @@ -86,7 +87,7 @@ func NewCmdCreateServiceClusterIP(f cmdutil.Factory, ioStreams genericclioptions cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.ServiceClusterIPGeneratorV1Name) + cmdutil.AddGeneratorFlags(cmd, generateversioned.ServiceClusterIPGeneratorV1Name) addPortFlags(cmd) cmd.Flags().String("clusterip", "", i18n.T("Assign your own ClusterIP or set to 'None' for a 'headless' service (no loadbalancing).")) return cmd @@ -102,10 +103,10 @@ func (o *ServiceClusterIPOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, a return err } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.ServiceClusterIPGeneratorV1Name: - generator = &kubectl.ServiceCommonGeneratorV1{ + case generateversioned.ServiceClusterIPGeneratorV1Name: + generator = &generateversioned.ServiceCommonGeneratorV1{ Name: name, TCP: cmdutil.GetFlagStringSlice(cmd, "tcp"), Type: v1.ServiceTypeClusterIP, @@ -158,7 +159,7 @@ func NewCmdCreateServiceNodePort(f cmdutil.Factory, ioStreams genericclioptions. cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.ServiceNodePortGeneratorV1Name) + cmdutil.AddGeneratorFlags(cmd, generateversioned.ServiceNodePortGeneratorV1Name) cmd.Flags().Int("node-port", 0, "Port used to expose the service on each node in a cluster.") addPortFlags(cmd) return cmd @@ -170,10 +171,10 @@ func (o *ServiceNodePortOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, ar return err } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.ServiceNodePortGeneratorV1Name: - generator = &kubectl.ServiceCommonGeneratorV1{ + case generateversioned.ServiceNodePortGeneratorV1Name: + generator = &generateversioned.ServiceCommonGeneratorV1{ Name: name, TCP: cmdutil.GetFlagStringSlice(cmd, "tcp"), Type: v1.ServiceTypeNodePort, @@ -227,7 +228,7 @@ func NewCmdCreateServiceLoadBalancer(f cmdutil.Factory, ioStreams genericcliopti cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.ServiceLoadBalancerGeneratorV1Name) + cmdutil.AddGeneratorFlags(cmd, generateversioned.ServiceLoadBalancerGeneratorV1Name) addPortFlags(cmd) return cmd } @@ -238,10 +239,10 @@ func (o *ServiceLoadBalancerOpts) Complete(f cmdutil.Factory, cmd *cobra.Command return err } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.ServiceLoadBalancerGeneratorV1Name: - generator = &kubectl.ServiceCommonGeneratorV1{ + case generateversioned.ServiceLoadBalancerGeneratorV1Name: + generator = &generateversioned.ServiceCommonGeneratorV1{ Name: name, TCP: cmdutil.GetFlagStringSlice(cmd, "tcp"), Type: v1.ServiceTypeLoadBalancer, @@ -298,7 +299,7 @@ func NewCmdCreateServiceExternalName(f cmdutil.Factory, ioStreams genericcliopti cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.ServiceExternalNameGeneratorV1Name) + cmdutil.AddGeneratorFlags(cmd, generateversioned.ServiceExternalNameGeneratorV1Name) addPortFlags(cmd) cmd.Flags().String("external-name", "", i18n.T("External name of service")) cmd.MarkFlagRequired("external-name") @@ -311,10 +312,10 @@ func (o *ServiceExternalNameOpts) Complete(f cmdutil.Factory, cmd *cobra.Command return err } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.ServiceExternalNameGeneratorV1Name: - generator = &kubectl.ServiceCommonGeneratorV1{ + case generateversioned.ServiceExternalNameGeneratorV1Name: + generator = &generateversioned.ServiceCommonGeneratorV1{ Name: name, Type: v1.ServiceTypeExternalName, ExternalName: cmdutil.GetFlagString(cmd, "external-name"), diff --git a/pkg/kubectl/cmd/create/create_serviceaccount.go b/pkg/kubectl/cmd/create/create_serviceaccount.go index dfec6680f1..6909035610 100644 --- a/pkg/kubectl/cmd/create/create_serviceaccount.go +++ b/pkg/kubectl/cmd/create/create_serviceaccount.go @@ -20,8 +20,9 @@ import ( "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/util/templates" ) @@ -62,7 +63,7 @@ func NewCmdCreateServiceAccount(f cmdutil.Factory, ioStreams genericclioptions.I cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.ServiceAccountV1GeneratorName) + cmdutil.AddGeneratorFlags(cmd, generateversioned.ServiceAccountV1GeneratorName) return cmd } @@ -72,10 +73,10 @@ func (o *ServiceAccountOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, arg return err } - var generator kubectl.StructuredGenerator + var generator generate.StructuredGenerator switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.ServiceAccountV1GeneratorName: - generator = &kubectl.ServiceAccountGeneratorV1{Name: name} + case generateversioned.ServiceAccountV1GeneratorName: + generator = &generateversioned.ServiceAccountGeneratorV1{Name: name} default: return errUnsupportedGenerator(cmd, generatorName) } diff --git a/pkg/kubectl/cmd/describe/BUILD b/pkg/kubectl/cmd/describe/BUILD index fbd5177413..4b1aaea02b 100644 --- a/pkg/kubectl/cmd/describe/BUILD +++ b/pkg/kubectl/cmd/describe/BUILD @@ -7,6 +7,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/kubectl/cmd/util:go_default_library", + "//pkg/kubectl/describe/versioned:go_default_library", "//pkg/kubectl/util/i18n:go_default_library", "//pkg/kubectl/util/templates:go_default_library", "//pkg/printers:go_default_library", @@ -29,7 +30,7 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/kubectl/cmd/testing:go_default_library", - "//pkg/kubectl/cmd/util:go_default_library", + "//pkg/kubectl/describe/versioned:go_default_library", "//pkg/kubectl/scheme:go_default_library", "//pkg/printers:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", diff --git a/pkg/kubectl/cmd/describe/describe.go b/pkg/kubectl/cmd/describe/describe.go index 9b65fa794e..472f1ffcff 100644 --- a/pkg/kubectl/cmd/describe/describe.go +++ b/pkg/kubectl/cmd/describe/describe.go @@ -29,6 +29,7 @@ import ( "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/cli-runtime/pkg/genericclioptions/resource" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + describeversioned "k8s.io/kubernetes/pkg/kubectl/describe/versioned" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/util/templates" "k8s.io/kubernetes/pkg/printers" @@ -138,7 +139,7 @@ func (o *DescribeOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [ o.BuilderArgs = args o.Describer = func(mapping *meta.RESTMapping) (printers.Describer, error) { - return cmdutil.DescriberFn(f, mapping) + return describeversioned.DescriberFn(f, mapping) } o.NewBuilder = f.NewBuilder diff --git a/pkg/kubectl/cmd/describe/describe_test.go b/pkg/kubectl/cmd/describe/describe_test.go index 8855e6ea14..7ed9fd93ae 100644 --- a/pkg/kubectl/cmd/describe/describe_test.go +++ b/pkg/kubectl/cmd/describe/describe_test.go @@ -27,7 +27,7 @@ import ( "k8s.io/cli-runtime/pkg/genericclioptions/resource" "k8s.io/client-go/rest/fake" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + describe "k8s.io/kubernetes/pkg/kubectl/describe/versioned" "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/printers" ) @@ -35,11 +35,11 @@ import ( // Verifies that schemas that are not in the master tree of Kubernetes can be retrieved via Get. func TestDescribeUnknownSchemaObject(t *testing.T) { d := &testDescriber{Output: "test output"} - oldFn := cmdutil.DescriberFn + oldFn := describe.DescriberFn defer func() { - cmdutil.DescriberFn = oldFn + describe.DescriberFn = oldFn }() - cmdutil.DescriberFn = d.describerFor + describe.DescriberFn = d.describerFor tf := cmdtesting.NewTestFactory().WithNamespace("non-default") defer tf.Cleanup() @@ -67,11 +67,11 @@ func TestDescribeUnknownSchemaObject(t *testing.T) { // Verifies that schemas that are not in the master tree of Kubernetes can be retrieved via Get. func TestDescribeUnknownNamespacedSchemaObject(t *testing.T) { d := &testDescriber{Output: "test output"} - oldFn := cmdutil.DescriberFn + oldFn := describe.DescriberFn defer func() { - cmdutil.DescriberFn = oldFn + describe.DescriberFn = oldFn }() - cmdutil.DescriberFn = d.describerFor + describe.DescriberFn = d.describerFor tf := cmdtesting.NewTestFactory() defer tf.Cleanup() @@ -99,11 +99,11 @@ func TestDescribeUnknownNamespacedSchemaObject(t *testing.T) { func TestDescribeObject(t *testing.T) { d := &testDescriber{Output: "test output"} - oldFn := cmdutil.DescriberFn + oldFn := describe.DescriberFn defer func() { - cmdutil.DescriberFn = oldFn + describe.DescriberFn = oldFn }() - cmdutil.DescriberFn = d.describerFor + describe.DescriberFn = d.describerFor _, _, rc := cmdtesting.TestData() tf := cmdtesting.NewTestFactory().WithNamespace("test") @@ -140,11 +140,11 @@ func TestDescribeObject(t *testing.T) { func TestDescribeListObjects(t *testing.T) { d := &testDescriber{Output: "test output"} - oldFn := cmdutil.DescriberFn + oldFn := describe.DescriberFn defer func() { - cmdutil.DescriberFn = oldFn + describe.DescriberFn = oldFn }() - cmdutil.DescriberFn = d.describerFor + describe.DescriberFn = d.describerFor pods, _, _ := cmdtesting.TestData() tf := cmdtesting.NewTestFactory().WithNamespace("test") @@ -167,11 +167,11 @@ func TestDescribeListObjects(t *testing.T) { func TestDescribeObjectShowEvents(t *testing.T) { d := &testDescriber{Output: "test output"} - oldFn := cmdutil.DescriberFn + oldFn := describe.DescriberFn defer func() { - cmdutil.DescriberFn = oldFn + describe.DescriberFn = oldFn }() - cmdutil.DescriberFn = d.describerFor + describe.DescriberFn = d.describerFor pods, _, _ := cmdtesting.TestData() tf := cmdtesting.NewTestFactory().WithNamespace("test") @@ -193,11 +193,11 @@ func TestDescribeObjectShowEvents(t *testing.T) { func TestDescribeObjectSkipEvents(t *testing.T) { d := &testDescriber{Output: "test output"} - oldFn := cmdutil.DescriberFn + oldFn := describe.DescriberFn defer func() { - cmdutil.DescriberFn = oldFn + describe.DescriberFn = oldFn }() - cmdutil.DescriberFn = d.describerFor + describe.DescriberFn = d.describerFor pods, _, _ := cmdtesting.TestData() tf := cmdtesting.NewTestFactory().WithNamespace("test") diff --git a/pkg/kubectl/cmd/expose/BUILD b/pkg/kubectl/cmd/expose/BUILD index 4b191792d5..71c17b46e6 100644 --- a/pkg/kubectl/cmd/expose/BUILD +++ b/pkg/kubectl/cmd/expose/BUILD @@ -8,6 +8,8 @@ go_library( deps = [ "//pkg/kubectl:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", + "//pkg/kubectl/generate:go_default_library", + "//pkg/kubectl/generate/versioned:go_default_library", "//pkg/kubectl/polymorphichelpers:go_default_library", "//pkg/kubectl/scheme:go_default_library", "//pkg/kubectl/util/i18n:go_default_library", diff --git a/pkg/kubectl/cmd/expose/expose.go b/pkg/kubectl/cmd/expose/expose.go index 0921ec6cd1..c826e2a7b7 100644 --- a/pkg/kubectl/cmd/expose/expose.go +++ b/pkg/kubectl/cmd/expose/expose.go @@ -35,6 +35,8 @@ import ( "k8s.io/client-go/dynamic" "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/polymorphichelpers" "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" @@ -90,7 +92,7 @@ type ExposeServiceOptions struct { DryRun bool EnforceNamespace bool - Generators func(string) map[string]kubectl.Generator + Generators func(string) map[string]generate.Generator CanBeExposed polymorphichelpers.CanBeExposedFunc MapBasedSelectorForObject func(runtime.Object) (string, error) PortsForObject polymorphichelpers.PortsForObjectFunc @@ -187,7 +189,7 @@ func (o *ExposeServiceOptions) Complete(f cmdutil.Factory, cmd *cobra.Command) e return err } - o.Generators = cmdutil.GeneratorFn + o.Generators = generateversioned.GeneratorFn o.Builder = f.NewBuilder() o.CanBeExposed = polymorphichelpers.CanBeExposedFn o.MapBasedSelectorForObject = polymorphichelpers.MapBasedSelectorForObjectFn @@ -240,7 +242,7 @@ func (o *ExposeServiceOptions) RunExpose(cmd *cobra.Command, args []string) erro return err } - params := kubectl.MakeParams(cmd, names) + params := generate.MakeParams(cmd, names) name := info.Name if len(name) > validation.DNS1035LabelMaxLength { name = name[:validation.DNS1035LabelMaxLength] @@ -249,7 +251,7 @@ func (o *ExposeServiceOptions) RunExpose(cmd *cobra.Command, args []string) erro // For objects that need a pod selector, derive it from the exposed object in case a user // didn't explicitly specify one via --selector - if s, found := params["selector"]; found && kubectl.IsZero(s) { + if s, found := params["selector"]; found && generate.IsZero(s) { s, err := o.MapBasedSelectorForObject(info.Object) if err != nil { return cmdutil.UsageErrorf(cmd, "couldn't retrieve selectors via --selector flag or introspection: %v", err) @@ -261,7 +263,7 @@ func (o *ExposeServiceOptions) RunExpose(cmd *cobra.Command, args []string) erro // For objects that need a port, derive it from the exposed object in case a user // didn't explicitly specify one via --port - if port, found := params["port"]; found && kubectl.IsZero(port) { + if port, found := params["port"]; found && generate.IsZero(port) { ports, err := o.PortsForObject(info.Object) if err != nil { return cmdutil.UsageErrorf(cmd, "couldn't find port via --port flag or introspection: %v", err) @@ -285,23 +287,23 @@ func (o *ExposeServiceOptions) RunExpose(cmd *cobra.Command, args []string) erro if err != nil { return cmdutil.UsageErrorf(cmd, "couldn't find protocol via introspection: %v", err) } - if protocols := kubectl.MakeProtocols(protocolsMap); !kubectl.IsZero(protocols) { + if protocols := generate.MakeProtocols(protocolsMap); !generate.IsZero(protocols) { params["protocols"] = protocols } } - if kubectl.IsZero(params["labels"]) { + if generate.IsZero(params["labels"]) { labels, err := meta.NewAccessor().Labels(info.Object) if err != nil { return err } - params["labels"] = kubectl.MakeLabels(labels) + params["labels"] = generate.MakeLabels(labels) } - if err = kubectl.ValidateParams(names, params); err != nil { + if err = generate.ValidateParams(names, params); err != nil { return err } // Check for invalid flags used against the present generator. - if err := kubectl.EnsureFlagsValid(cmd, generators, generatorName); err != nil { + if err := generate.EnsureFlagsValid(cmd, generators, generatorName); err != nil { return err } diff --git a/pkg/kubectl/cmd/run/BUILD b/pkg/kubectl/cmd/run/BUILD index f255879209..bffca3654e 100644 --- a/pkg/kubectl/cmd/run/BUILD +++ b/pkg/kubectl/cmd/run/BUILD @@ -12,6 +12,8 @@ go_library( "//pkg/kubectl/cmd/exec:go_default_library", "//pkg/kubectl/cmd/logs:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", + "//pkg/kubectl/generate:go_default_library", + "//pkg/kubectl/generate/versioned:go_default_library", "//pkg/kubectl/polymorphichelpers:go_default_library", "//pkg/kubectl/scheme:go_default_library", "//pkg/kubectl/util/i18n:go_default_library", diff --git a/pkg/kubectl/cmd/run/run.go b/pkg/kubectl/cmd/run/run.go index 7ed5cab8e9..87dfc6e5b4 100644 --- a/pkg/kubectl/cmd/run/run.go +++ b/pkg/kubectl/cmd/run/run.go @@ -44,6 +44,8 @@ import ( "k8s.io/kubernetes/pkg/kubectl/cmd/exec" "k8s.io/kubernetes/pkg/kubectl/cmd/logs" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/generate" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/polymorphichelpers" "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" @@ -309,20 +311,20 @@ func (o *RunOptions) Run(f cmdutil.Factory, cmd *cobra.Command, args []string) e generatorName := o.Generator if len(o.Schedule) != 0 && len(generatorName) == 0 { - generatorName = cmdutil.CronJobV1Beta1GeneratorName + generatorName = generateversioned.CronJobV1Beta1GeneratorName } if len(generatorName) == 0 { switch restartPolicy { case corev1.RestartPolicyAlways: - generatorName = cmdutil.DeploymentAppsV1Beta1GeneratorName + generatorName = generateversioned.DeploymentAppsV1Beta1GeneratorName case corev1.RestartPolicyOnFailure: - generatorName = cmdutil.JobV1GeneratorName + generatorName = generateversioned.JobV1GeneratorName case corev1.RestartPolicyNever: - generatorName = cmdutil.RunPodV1GeneratorName + generatorName = generateversioned.RunPodV1GeneratorName } // Falling back because the generator was not provided and the default one could be unavailable. - generatorNameTemp, err := cmdutil.FallbackGeneratorNameIfNecessary(generatorName, clientset.Discovery(), o.ErrOut) + generatorNameTemp, err := generateversioned.FallbackGeneratorNameIfNecessary(generatorName, clientset.Discovery(), o.ErrOut) if err != nil { return err } @@ -336,17 +338,17 @@ func (o *RunOptions) Run(f cmdutil.Factory, cmd *cobra.Command, args []string) e // start deprecating all generators except for 'run-pod/v1' which will be // the only supported on a route to simple kubectl run which should mimic // docker run - if generatorName != cmdutil.RunPodV1GeneratorName { + if generatorName != generateversioned.RunPodV1GeneratorName { fmt.Fprintf(o.ErrOut, "kubectl run --generator=%s is DEPRECATED and will be removed in a future version. Use kubectl create instead.\n", generatorName) } - generators := cmdutil.GeneratorFn("run") + generators := generateversioned.GeneratorFn("run") generator, found := generators[generatorName] if !found { return cmdutil.UsageErrorf(cmd, "generator %q not found", generatorName) } names := generator.ParamNames() - params := kubectl.MakeParams(cmd, names) + params := generate.MakeParams(cmd, names) params["name"] = args[0] if len(args) > 1 { params["args"] = args[1:] @@ -592,7 +594,7 @@ func verifyImagePullPolicy(cmd *cobra.Command) error { } func (o *RunOptions) generateService(f cmdutil.Factory, cmd *cobra.Command, serviceGenerator string, paramsIn map[string]interface{}, namespace string) (*RunObject, error) { - generators := cmdutil.GeneratorFn("expose") + generators := generateversioned.GeneratorFn("expose") generator, found := generators[serviceGenerator] if !found { return nil, fmt.Errorf("missing service generator: %s", serviceGenerator) @@ -637,8 +639,8 @@ func (o *RunOptions) generateService(f cmdutil.Factory, cmd *cobra.Command, serv return runObject, nil } -func (o *RunOptions) createGeneratedObject(f cmdutil.Factory, cmd *cobra.Command, generator kubectl.Generator, names []kubectl.GeneratorParam, params map[string]interface{}, overrides, namespace string) (*RunObject, error) { - err := kubectl.ValidateParams(names, params) +func (o *RunOptions) createGeneratedObject(f cmdutil.Factory, cmd *cobra.Command, generator generate.Generator, names []generate.GeneratorParam, params map[string]interface{}, overrides, namespace string) (*RunObject, error) { + err := generate.ValidateParams(names, params) if err != nil { return nil, err } diff --git a/pkg/kubectl/cmd/set/BUILD b/pkg/kubectl/cmd/set/BUILD index e03f1efe5f..cf756dbef4 100644 --- a/pkg/kubectl/cmd/set/BUILD +++ b/pkg/kubectl/cmd/set/BUILD @@ -19,9 +19,9 @@ go_library( importpath = "k8s.io/kubernetes/pkg/kubectl/cmd/set", visibility = ["//build/visible_to:pkg_kubectl_cmd_set_CONSUMERS"], deps = [ - "//pkg/kubectl:go_default_library", "//pkg/kubectl/cmd/set/env:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", + "//pkg/kubectl/generate/versioned:go_default_library", "//pkg/kubectl/polymorphichelpers:go_default_library", "//pkg/kubectl/scheme:go_default_library", "//pkg/kubectl/util/i18n:go_default_library", diff --git a/pkg/kubectl/cmd/set/set_resources.go b/pkg/kubectl/cmd/set/set_resources.go index ee2eb12c73..6b94b6a4fe 100644 --- a/pkg/kubectl/cmd/set/set_resources.go +++ b/pkg/kubectl/cmd/set/set_resources.go @@ -29,8 +29,8 @@ import ( "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/cli-runtime/pkg/genericclioptions/printers" "k8s.io/cli-runtime/pkg/genericclioptions/resource" - "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + generateversioned "k8s.io/kubernetes/pkg/kubectl/generate/versioned" "k8s.io/kubernetes/pkg/kubectl/polymorphichelpers" "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" @@ -206,7 +206,7 @@ func (o *SetResourcesOptions) Validate() error { return fmt.Errorf("you must specify an update to requests or limits (in the form of --requests/--limits)") } - o.ResourceRequirements, err = kubectl.HandleResourceRequirementsV1(map[string]string{"limits": o.Limits, "requests": o.Requests}) + o.ResourceRequirements, err = generateversioned.HandleResourceRequirementsV1(map[string]string{"limits": o.Limits, "requests": o.Requests}) if err != nil { return err } diff --git a/pkg/kubectl/cmd/util/BUILD b/pkg/kubectl/cmd/util/BUILD index 907ded08b0..936a98459c 100644 --- a/pkg/kubectl/cmd/util/BUILD +++ b/pkg/kubectl/cmd/util/BUILD @@ -7,7 +7,6 @@ go_library( "crdfinder.go", "factory.go", "factory_client_access.go", - "generator.go", "helpers.go", "kubectl_match_version.go", "printing.go", @@ -16,22 +15,12 @@ go_library( visibility = ["//build/visible_to:pkg_kubectl_cmd_util_CONSUMERS"], deps = [ "//pkg/api/legacyscheme:go_default_library", - "//pkg/client/clientset_generated/internalclientset:go_default_library", - "//pkg/kubectl:go_default_library", "//pkg/kubectl/cmd/util/openapi:go_default_library", "//pkg/kubectl/cmd/util/openapi/validation:go_default_library", "//pkg/kubectl/util/templates:go_default_library", "//pkg/kubectl/validation:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", "//pkg/version:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -73,6 +62,7 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ], diff --git a/pkg/kubectl/cmd/util/helpers.go b/pkg/kubectl/cmd/util/helpers.go index 36bdc6ca31..da9e25d04d 100644 --- a/pkg/kubectl/cmd/util/helpers.go +++ b/pkg/kubectl/cmd/util/helpers.go @@ -44,9 +44,6 @@ import ( "k8s.io/client-go/rest" "k8s.io/client-go/scale" "k8s.io/client-go/tools/clientcmd" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/printers" - printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" utilexec "k8s.io/utils/exec" ) @@ -619,53 +616,6 @@ func ShouldIncludeUninitialized(cmd *cobra.Command, includeUninitialized bool) b return shouldIncludeUninitialized } -// DescriberFunc gives a way to display the specified RESTMapping type -type DescriberFunc func(restClientGetter genericclioptions.RESTClientGetter, mapping *meta.RESTMapping) (printers.Describer, error) - -// DescriberFn gives a way to easily override the function for unit testing if needed -var DescriberFn DescriberFunc = describer - -// Returns a Describer for displaying the specified RESTMapping type or an error. -func describer(restClientGetter genericclioptions.RESTClientGetter, mapping *meta.RESTMapping) (printers.Describer, error) { - clientConfig, err := restClientGetter.ToRESTConfig() - if err != nil { - return nil, err - } - // try to get a describer - if describer, ok := printersinternal.DescriberFor(mapping.GroupVersionKind.GroupKind(), clientConfig); ok { - return describer, nil - } - // if this is a kind we don't have a describer for yet, go generic if possible - if genericDescriber, genericErr := genericDescriber(restClientGetter, mapping); genericErr == nil { - return genericDescriber, nil - } - // otherwise return an unregistered error - return nil, fmt.Errorf("no description has been implemented for %s", mapping.GroupVersionKind.String()) -} - -// helper function to make a generic describer, or return an error -func genericDescriber(restClientGetter genericclioptions.RESTClientGetter, mapping *meta.RESTMapping) (printers.Describer, error) { - clientConfig, err := restClientGetter.ToRESTConfig() - if err != nil { - return nil, err - } - - // used to fetch the resource - dynamicClient, err := dynamic.NewForConfig(clientConfig) - if err != nil { - return nil, err - } - - // used to get events for the resource - clientSet, err := internalclientset.NewForConfig(clientConfig) - if err != nil { - return nil, err - } - - eventsClient := clientSet.Core() - return printersinternal.GenericDescriberFor(mapping, dynamicClient, eventsClient), nil -} - // ScaleClientFunc provides a ScalesGetter type ScaleClientFunc func(genericclioptions.RESTClientGetter) (scale.ScalesGetter, error) @@ -697,3 +647,12 @@ func scaleClient(restClientGetter genericclioptions.RESTClientGetter) (scale.Sca return scale.New(restClient, mapper, dynamic.LegacyAPIPathResolverFunc, resolver), nil } + +func Warning(cmdErr io.Writer, newGeneratorName, oldGeneratorName string) { + fmt.Fprintf(cmdErr, "WARNING: New generator %q specified, "+ + "but it isn't available. "+ + "Falling back to %q.\n", + newGeneratorName, + oldGeneratorName, + ) +} diff --git a/pkg/kubectl/cmd/util/helpers_test.go b/pkg/kubectl/cmd/util/helpers_test.go index 183006110f..e1e2f4522e 100644 --- a/pkg/kubectl/cmd/util/helpers_test.go +++ b/pkg/kubectl/cmd/util/helpers_test.go @@ -31,14 +31,13 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/utils/exec" ) func TestMerge(t *testing.T) { - grace := int64(30) - enableServiceLinks := corev1.DefaultEnableServiceLinks tests := []struct { obj runtime.Object fragment string @@ -60,14 +59,7 @@ func TestMerge(t *testing.T) { ObjectMeta: metav1.ObjectMeta{ Name: "foo", }, - Spec: corev1.PodSpec{ - RestartPolicy: corev1.RestartPolicyAlways, - DNSPolicy: corev1.DNSClusterFirst, - TerminationGracePeriodSeconds: &grace, - SecurityContext: &corev1.PodSecurityContext{}, - SchedulerName: corev1.DefaultSchedulerName, - EnableServiceLinks: &enableServiceLinks, - }, + Spec: corev1.PodSpec{}, }, }, /* TODO: uncomment this test once Merge is updated to use @@ -127,20 +119,12 @@ func TestMerge(t *testing.T) { Spec: corev1.PodSpec{ Volumes: []corev1.Volume{ { - Name: "v1", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}, + Name: "v1", }, { - Name: "v2", - VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}, + Name: "v2", }, }, - RestartPolicy: corev1.RestartPolicyAlways, - DNSPolicy: corev1.DNSClusterFirst, - TerminationGracePeriodSeconds: &grace, - SecurityContext: &corev1.PodSecurityContext{}, - SchedulerName: corev1.DefaultSchedulerName, - EnableServiceLinks: &enableServiceLinks, }, }, }, @@ -166,12 +150,9 @@ func TestMerge(t *testing.T) { APIVersion: "v1", }, Spec: corev1.ServiceSpec{ - SessionAffinity: "None", - Type: corev1.ServiceTypeClusterIP, Ports: []corev1.ServicePort{ { - Protocol: corev1.ProtocolTCP, - Port: 0, + Port: 0, }, }, }, @@ -192,8 +173,6 @@ func TestMerge(t *testing.T) { APIVersion: "v1", }, Spec: corev1.ServiceSpec{ - SessionAffinity: "None", - Type: corev1.ServiceTypeClusterIP, Selector: map[string]string{ "version": "v2", }, @@ -210,7 +189,7 @@ func TestMerge(t *testing.T) { if err != nil { t.Errorf("testcase[%d], unexpected error: %v", i, err) } else if !apiequality.Semantic.DeepEqual(test.expected, out) { - t.Errorf("\n\ntestcase[%d]\nexpected:\n%+v\nsaw:\n%+v", i, test.expected, out) + t.Errorf("\n\ntestcase[%d]\nexpected:\n%s", i, diff.ObjectReflectDiff(test.expected, out)) } } if test.expectErr && err == nil { diff --git a/pkg/kubectl/describe/BUILD b/pkg/kubectl/describe/BUILD new file mode 100644 index 0000000000..533c5dfb2c --- /dev/null +++ b/pkg/kubectl/describe/BUILD @@ -0,0 +1,30 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["describe.go"], + importpath = "k8s.io/kubernetes/pkg/kubectl/describe", + visibility = ["//visibility:public"], + deps = [ + "//pkg/printers:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/cli-runtime/pkg/genericclioptions:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//pkg/kubectl/describe/versioned:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/pkg/kubectl/describe/describe.go b/pkg/kubectl/describe/describe.go new file mode 100644 index 0000000000..aa6f37a071 --- /dev/null +++ b/pkg/kubectl/describe/describe.go @@ -0,0 +1,26 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package describe + +import ( + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/cli-runtime/pkg/genericclioptions" + "k8s.io/kubernetes/pkg/printers" +) + +// DescriberFunc gives a way to display the specified RESTMapping type +type DescriberFunc func(restClientGetter genericclioptions.RESTClientGetter, mapping *meta.RESTMapping) (printers.Describer, error) diff --git a/pkg/kubectl/describe/versioned/BUILD b/pkg/kubectl/describe/versioned/BUILD new file mode 100644 index 0000000000..988d7ecc22 --- /dev/null +++ b/pkg/kubectl/describe/versioned/BUILD @@ -0,0 +1,31 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["describe.go"], + importpath = "k8s.io/kubernetes/pkg/kubectl/describe/versioned", + visibility = ["//visibility:public"], + deps = [ + "//pkg/client/clientset_generated/internalclientset:go_default_library", + "//pkg/kubectl/describe:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/cli-runtime/pkg/genericclioptions:go_default_library", + "//staging/src/k8s.io/client-go/dynamic:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/pkg/kubectl/describe/versioned/describe.go b/pkg/kubectl/describe/versioned/describe.go new file mode 100644 index 0000000000..7246126ed9 --- /dev/null +++ b/pkg/kubectl/describe/versioned/describe.go @@ -0,0 +1,73 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package versioned + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/cli-runtime/pkg/genericclioptions" + "k8s.io/client-go/dynamic" + "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" + "k8s.io/kubernetes/pkg/kubectl/describe" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" +) + +// DescriberFn gives a way to easily override the function for unit testing if needed +var DescriberFn describe.DescriberFunc = Describer + +// Describer returns a Describer for displaying the specified RESTMapping type or an error. +func Describer(restClientGetter genericclioptions.RESTClientGetter, mapping *meta.RESTMapping) (printers.Describer, error) { + clientConfig, err := restClientGetter.ToRESTConfig() + if err != nil { + return nil, err + } + // try to get a describer + if describer, ok := printersinternal.DescriberFor(mapping.GroupVersionKind.GroupKind(), clientConfig); ok { + return describer, nil + } + // if this is a kind we don't have a describer for yet, go generic if possible + if genericDescriber, genericErr := genericDescriber(restClientGetter, mapping); genericErr == nil { + return genericDescriber, nil + } + // otherwise return an unregistered error + return nil, fmt.Errorf("no description has been implemented for %s", mapping.GroupVersionKind.String()) +} + +// helper function to make a generic describer, or return an error +func genericDescriber(restClientGetter genericclioptions.RESTClientGetter, mapping *meta.RESTMapping) (printers.Describer, error) { + clientConfig, err := restClientGetter.ToRESTConfig() + if err != nil { + return nil, err + } + + // used to fetch the resource + dynamicClient, err := dynamic.NewForConfig(clientConfig) + if err != nil { + return nil, err + } + + // used to get events for the resource + clientSet, err := internalclientset.NewForConfig(clientConfig) + if err != nil { + return nil, err + } + + eventsClient := clientSet.Core() + return printersinternal.GenericDescriberFor(mapping, dynamicClient, eventsClient), nil +} diff --git a/pkg/kubectl/generate/BUILD b/pkg/kubectl/generate/BUILD new file mode 100644 index 0000000000..ac22efa521 --- /dev/null +++ b/pkg/kubectl/generate/BUILD @@ -0,0 +1,38 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = ["generate.go"], + importpath = "k8s.io/kubernetes/pkg/kubectl/generate", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//vendor/github.com/spf13/cobra:go_default_library", + "//vendor/github.com/spf13/pflag:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = ["generate_test.go"], + embed = [":go_default_library"], + deps = ["//vendor/github.com/spf13/cobra:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//pkg/kubectl/generate/versioned:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/pkg/kubectl/generate.go b/pkg/kubectl/generate/generate.go similarity index 97% rename from pkg/kubectl/generate.go rename to pkg/kubectl/generate/generate.go index 07d8bb8932..65abaafd82 100644 --- a/pkg/kubectl/generate.go +++ b/pkg/kubectl/generate/generate.go @@ -1,5 +1,5 @@ /* -Copyright 2014 The Kubernetes Authors. +Copyright 2018 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package generate import ( "fmt" @@ -24,10 +24,14 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" + "k8s.io/apimachinery/pkg/runtime" utilerrors "k8s.io/apimachinery/pkg/util/errors" ) +// GeneratorFunc returns the generators for the provided command +type GeneratorFunc func(cmdName string) map[string]Generator + // GeneratorParam is a parameter for a generator // TODO: facilitate structured json generator input schemes type GeneratorParam struct { @@ -98,7 +102,7 @@ func AnnotateFlags(cmd *cobra.Command, generators map[string]Generator) { } } -// EnsureFlagsValid ensures that no invalid flags are being used against a generator. +// EnsureFlagsValid ensures that no invalid flags are being used against a func EnsureFlagsValid(cmd *cobra.Command, generators map[string]Generator, generatorInUse string) error { AnnotateFlags(cmd, generators) diff --git a/pkg/kubectl/generate_test.go b/pkg/kubectl/generate/generate_test.go similarity index 99% rename from pkg/kubectl/generate_test.go rename to pkg/kubectl/generate/generate_test.go index d62d79469d..b241fff6fc 100644 --- a/pkg/kubectl/generate_test.go +++ b/pkg/kubectl/generate/generate_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package generate import ( "reflect" diff --git a/pkg/kubectl/generate/versioned/BUILD b/pkg/kubectl/generate/versioned/BUILD new file mode 100644 index 0000000000..c770342936 --- /dev/null +++ b/pkg/kubectl/generate/versioned/BUILD @@ -0,0 +1,111 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "autoscale.go", + "clusterrolebinding.go", + "configmap.go", + "deployment.go", + "env_file.go", + "generator.go", + "namespace.go", + "pdb.go", + "priorityclass.go", + "quota.go", + "rolebinding.go", + "run.go", + "secret.go", + "secret_for_docker_registry.go", + "secret_for_tls.go", + "service.go", + "service_basic.go", + "serviceaccount.go", + ], + importpath = "k8s.io/kubernetes/pkg/kubectl/generate/versioned", + visibility = ["//visibility:public"], + deps = [ + "//pkg/kubectl/generate:go_default_library", + "//pkg/kubectl/util:go_default_library", + "//pkg/kubectl/util/hash:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", + "//staging/src/k8s.io/api/batch/v1:go_default_library", + "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", + "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/api/rbac/v1:go_default_library", + "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", + "//staging/src/k8s.io/client-go/discovery:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = [ + "autoscale_test.go", + "clusterrolebinding_test.go", + "configmap_test.go", + "deployment_test.go", + "env_file_test.go", + "namespace_test.go", + "pdb_test.go", + "priorityclass_test.go", + "quota_test.go", + "rolebinding_test.go", + "run_test.go", + "secret_for_docker_registry_test.go", + "secret_for_tls_test.go", + "secret_test.go", + "service_basic_test.go", + "service_test.go", + "serviceaccount_test.go", + ], + embed = [":go_default_library"], + deps = [ + "//pkg/kubectl/generate:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", + "//staging/src/k8s.io/api/batch/v1:go_default_library", + "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", + "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/api/rbac/v1:go_default_library", + "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/client-go/util/testing:go_default_library", + "//vendor/k8s.io/utils/pointer:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/pkg/kubectl/autoscale.go b/pkg/kubectl/generate/versioned/autoscale.go similarity index 94% rename from pkg/kubectl/autoscale.go rename to pkg/kubectl/generate/versioned/autoscale.go index 39c78ca31d..790b07e581 100644 --- a/pkg/kubectl/autoscale.go +++ b/pkg/kubectl/generate/versioned/autoscale.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" @@ -22,6 +22,7 @@ import ( autoscalingv1 "k8s.io/api/autoscaling/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/kubectl/generate" ) // HorizontalPodAutoscalerV1Generator supports stable generation of a horizontal pod autoscaler. @@ -36,7 +37,7 @@ type HorizontalPodAutoscalerGeneratorV1 struct { } // Ensure it supports the generator pattern that uses parameters specified during construction. -var _ StructuredGenerator = &HorizontalPodAutoscalerGeneratorV1{} +var _ generate.StructuredGenerator = &HorizontalPodAutoscalerGeneratorV1{} // StructuredGenerate outputs a horizontal pod autoscaler object using the configured fields. func (s *HorizontalPodAutoscalerGeneratorV1) StructuredGenerate() (runtime.Object, error) { diff --git a/pkg/kubectl/autoscale_test.go b/pkg/kubectl/generate/versioned/autoscale_test.go similarity index 99% rename from pkg/kubectl/autoscale_test.go rename to pkg/kubectl/generate/versioned/autoscale_test.go index 754123e1d7..49b76b5b36 100644 --- a/pkg/kubectl/autoscale_test.go +++ b/pkg/kubectl/generate/versioned/autoscale_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "reflect" diff --git a/pkg/kubectl/clusterrolebinding.go b/pkg/kubectl/generate/versioned/clusterrolebinding.go similarity index 89% rename from pkg/kubectl/clusterrolebinding.go rename to pkg/kubectl/generate/versioned/clusterrolebinding.go index d946560691..b874c63794 100644 --- a/pkg/kubectl/clusterrolebinding.go +++ b/pkg/kubectl/generate/versioned/clusterrolebinding.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" @@ -24,6 +24,7 @@ import ( rbacv1beta1 "k8s.io/api/rbac/v1beta1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/kubernetes/pkg/kubectl/generate" ) // ClusterRoleBindingGeneratorV1 supports stable generation of a clusterRoleBinding. @@ -41,14 +42,14 @@ type ClusterRoleBindingGeneratorV1 struct { } // Ensure it supports the generator pattern that uses parameter injection. -var _ Generator = &ClusterRoleBindingGeneratorV1{} +var _ generate.Generator = &ClusterRoleBindingGeneratorV1{} // Ensure it supports the generator pattern that uses parameters specified during construction. -var _ StructuredGenerator = &ClusterRoleBindingGeneratorV1{} +var _ generate.StructuredGenerator = &ClusterRoleBindingGeneratorV1{} // Generate returns a clusterRoleBinding using the specified parameters. func (s ClusterRoleBindingGeneratorV1) Generate(genericParams map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(s.ParamNames(), genericParams) + err := generate.ValidateParams(s.ParamNames(), genericParams) if err != nil { return nil, err } @@ -94,13 +95,13 @@ func (s ClusterRoleBindingGeneratorV1) Generate(genericParams map[string]interfa } // ParamNames returns the set of supported input parameters when using the parameter injection generator pattern. -func (s ClusterRoleBindingGeneratorV1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"clusterrole", false}, - {"user", false}, - {"group", false}, - {"serviceaccount", false}, +func (s ClusterRoleBindingGeneratorV1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "clusterrole", Required: false}, + {Name: "user", Required: false}, + {Name: "group", Required: false}, + {Name: "serviceaccount", Required: false}, } } diff --git a/pkg/kubectl/clusterrolebinding_test.go b/pkg/kubectl/generate/versioned/clusterrolebinding_test.go similarity index 99% rename from pkg/kubectl/clusterrolebinding_test.go rename to pkg/kubectl/generate/versioned/clusterrolebinding_test.go index 1ab1af351a..868abe3638 100644 --- a/pkg/kubectl/clusterrolebinding_test.go +++ b/pkg/kubectl/generate/versioned/clusterrolebinding_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "reflect" diff --git a/pkg/kubectl/configmap.go b/pkg/kubectl/generate/versioned/configmap.go similarity index 93% rename from pkg/kubectl/configmap.go rename to pkg/kubectl/generate/versioned/configmap.go index ba4ac1ee20..67058422ca 100644 --- a/pkg/kubectl/configmap.go +++ b/pkg/kubectl/generate/versioned/configmap.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" @@ -27,6 +27,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation" + "k8s.io/kubernetes/pkg/kubectl/generate" "k8s.io/kubernetes/pkg/kubectl/util" "k8s.io/kubernetes/pkg/kubectl/util/hash" ) @@ -48,14 +49,14 @@ type ConfigMapGeneratorV1 struct { } // Ensure it supports the generator pattern that uses parameter injection. -var _ Generator = &ConfigMapGeneratorV1{} +var _ generate.Generator = &ConfigMapGeneratorV1{} // Ensure it supports the generator pattern that uses parameters specified during construction. -var _ StructuredGenerator = &ConfigMapGeneratorV1{} +var _ generate.StructuredGenerator = &ConfigMapGeneratorV1{} // Generate returns a configMap using the specified parameters. func (s ConfigMapGeneratorV1) Generate(genericParams map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(s.ParamNames(), genericParams) + err := generate.ValidateParams(s.ParamNames(), genericParams) if err != nil { return nil, err } @@ -111,15 +112,15 @@ func (s ConfigMapGeneratorV1) Generate(genericParams map[string]interface{}) (ru } // ParamNames returns the set of supported input parameters when using the parameter injection generator pattern. -func (s ConfigMapGeneratorV1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"type", false}, - {"from-file", false}, - {"from-literal", false}, - {"from-env-file", false}, - {"force", false}, - {"hash", false}, +func (s ConfigMapGeneratorV1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "type", Required: false}, + {Name: "from-file", Required: false}, + {Name: "from-literal", Required: false}, + {Name: "from-env-file", Required: false}, + {Name: "force", Required: false}, + {Name: "hash", Required: false}, } } diff --git a/pkg/kubectl/configmap_test.go b/pkg/kubectl/generate/versioned/configmap_test.go similarity index 99% rename from pkg/kubectl/configmap_test.go rename to pkg/kubectl/generate/versioned/configmap_test.go index 820b5867c9..7fbcd5ca53 100644 --- a/pkg/kubectl/configmap_test.go +++ b/pkg/kubectl/generate/versioned/configmap_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "io/ioutil" diff --git a/pkg/kubectl/deployment.go b/pkg/kubectl/generate/versioned/deployment.go similarity index 95% rename from pkg/kubectl/deployment.go rename to pkg/kubectl/generate/versioned/deployment.go index 9686d200d5..d5b23eba8d 100644 --- a/pkg/kubectl/deployment.go +++ b/pkg/kubectl/generate/versioned/deployment.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" @@ -26,6 +26,7 @@ import ( extensionsv1beta1 "k8s.io/api/extensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/kubectl/generate" ) // BaseDeploymentGenerator: implement the common functionality of @@ -94,7 +95,7 @@ type DeploymentBasicGeneratorV1 struct { } // Ensure it supports the generator pattern that uses parameters specified during construction -var _ StructuredGenerator = &DeploymentBasicGeneratorV1{} +var _ generate.StructuredGenerator = &DeploymentBasicGeneratorV1{} // StructuredGenerate outputs a deployment object using the configured fields func (s *DeploymentBasicGeneratorV1) StructuredGenerate() (runtime.Object, error) { @@ -124,7 +125,7 @@ type DeploymentBasicAppsGeneratorV1Beta1 struct { } // Ensure it supports the generator pattern that uses parameters specified during construction -var _ StructuredGenerator = &DeploymentBasicAppsGeneratorV1Beta1{} +var _ generate.StructuredGenerator = &DeploymentBasicAppsGeneratorV1Beta1{} // StructuredGenerate outputs a deployment object using the configured fields func (s *DeploymentBasicAppsGeneratorV1Beta1) StructuredGenerate() (runtime.Object, error) { @@ -154,7 +155,7 @@ type DeploymentBasicAppsGeneratorV1 struct { } // Ensure it supports the generator pattern that uses parameters specified during construction -var _ StructuredGenerator = &DeploymentBasicAppsGeneratorV1{} +var _ generate.StructuredGenerator = &DeploymentBasicAppsGeneratorV1{} // StructuredGenerate outputs a deployment object using the configured fields func (s *DeploymentBasicAppsGeneratorV1) StructuredGenerate() (runtime.Object, error) { diff --git a/pkg/kubectl/deployment_test.go b/pkg/kubectl/generate/versioned/deployment_test.go similarity index 99% rename from pkg/kubectl/deployment_test.go rename to pkg/kubectl/generate/versioned/deployment_test.go index 58753ca287..8319a1fc92 100644 --- a/pkg/kubectl/deployment_test.go +++ b/pkg/kubectl/generate/versioned/deployment_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "reflect" diff --git a/pkg/kubectl/env_file.go b/pkg/kubectl/generate/versioned/env_file.go similarity index 99% rename from pkg/kubectl/env_file.go rename to pkg/kubectl/generate/versioned/env_file.go index 8221d5936c..1277257f24 100644 --- a/pkg/kubectl/env_file.go +++ b/pkg/kubectl/generate/versioned/env_file.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "bufio" diff --git a/pkg/kubectl/env_file_test.go b/pkg/kubectl/generate/versioned/env_file_test.go similarity index 99% rename from pkg/kubectl/env_file_test.go rename to pkg/kubectl/generate/versioned/env_file_test.go index 9adf2749b4..5f98b46e30 100644 --- a/pkg/kubectl/env_file_test.go +++ b/pkg/kubectl/generate/versioned/env_file_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "os" diff --git a/pkg/kubectl/cmd/util/generator.go b/pkg/kubectl/generate/versioned/generator.go similarity index 72% rename from pkg/kubectl/cmd/util/generator.go rename to pkg/kubectl/generate/versioned/generator.go index 7d02669bee..64539a50a6 100644 --- a/pkg/kubectl/cmd/util/generator.go +++ b/pkg/kubectl/generate/versioned/generator.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package util +package versioned import ( "fmt" @@ -29,9 +29,12 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/discovery" - "k8s.io/kubernetes/pkg/kubectl" + "k8s.io/kubernetes/pkg/kubectl/generate" ) +// GeneratorFn gives a way to easily override the function for unit testing if needed +var GeneratorFn generate.GeneratorFunc = DefaultGenerators + const ( // TODO(sig-cli): Enforce consistent naming for generators here. // See discussion in https://github.com/kubernetes/kubernetes/issues/46237 @@ -67,70 +70,64 @@ const ( PriorityClassV1Alpha1GeneratorName = "priorityclass/v1alpha1" ) -// GeneratorFunc returns the generators for the provided command -type GeneratorFunc func(cmdName string) map[string]kubectl.Generator - -// GeneratorFn gives a way to easily override the function for unit testing if needed -var GeneratorFn GeneratorFunc = defaultGenerators - -// defaultGenerators returns the set of default generators for use in Factory instances -func defaultGenerators(cmdName string) map[string]kubectl.Generator { - var generator map[string]kubectl.Generator +// DefaultGenerators returns the set of default generators for use in Factory instances +func DefaultGenerators(cmdName string) map[string]generate.Generator { + var generator map[string]generate.Generator switch cmdName { case "expose": - generator = map[string]kubectl.Generator{ - ServiceV1GeneratorName: kubectl.ServiceGeneratorV1{}, - ServiceV2GeneratorName: kubectl.ServiceGeneratorV2{}, + generator = map[string]generate.Generator{ + ServiceV1GeneratorName: ServiceGeneratorV1{}, + ServiceV2GeneratorName: ServiceGeneratorV2{}, } case "service-clusterip": - generator = map[string]kubectl.Generator{ - ServiceClusterIPGeneratorV1Name: kubectl.ServiceClusterIPGeneratorV1{}, + generator = map[string]generate.Generator{ + ServiceClusterIPGeneratorV1Name: ServiceClusterIPGeneratorV1{}, } case "service-nodeport": - generator = map[string]kubectl.Generator{ - ServiceNodePortGeneratorV1Name: kubectl.ServiceNodePortGeneratorV1{}, + generator = map[string]generate.Generator{ + ServiceNodePortGeneratorV1Name: ServiceNodePortGeneratorV1{}, } case "service-loadbalancer": - generator = map[string]kubectl.Generator{ - ServiceLoadBalancerGeneratorV1Name: kubectl.ServiceLoadBalancerGeneratorV1{}, + generator = map[string]generate.Generator{ + ServiceLoadBalancerGeneratorV1Name: ServiceLoadBalancerGeneratorV1{}, } case "deployment": // Create Deployment has only StructuredGenerators and no // param-based Generators. // The StructuredGenerators are as follows (as of 2018-03-16): - // DeploymentBasicV1Beta1GeneratorName -> kubectl.DeploymentBasicGeneratorV1 - // DeploymentBasicAppsV1Beta1GeneratorName -> kubectl.DeploymentBasicAppsGeneratorV1Beta1 - // DeploymentBasicAppsV1GeneratorName -> kubectl.DeploymentBasicAppsGeneratorV1 - generator = map[string]kubectl.Generator{} + // DeploymentBasicV1Beta1GeneratorName -> DeploymentBasicGeneratorV1 + // DeploymentBasicAppsV1Beta1GeneratorName -> DeploymentBasicAppsGeneratorV1Beta1 + // DeploymentBasicAppsV1GeneratorName -> DeploymentBasicAppsGeneratorV1 + generator = map[string]generate.Generator{} case "run": - generator = map[string]kubectl.Generator{ - RunV1GeneratorName: kubectl.BasicReplicationController{}, - RunPodV1GeneratorName: kubectl.BasicPod{}, - DeploymentV1Beta1GeneratorName: kubectl.DeploymentV1Beta1{}, - DeploymentAppsV1Beta1GeneratorName: kubectl.DeploymentAppsV1Beta1{}, - JobV1GeneratorName: kubectl.JobV1{}, - CronJobV2Alpha1GeneratorName: kubectl.CronJobV2Alpha1{}, - CronJobV1Beta1GeneratorName: kubectl.CronJobV1Beta1{}, + generator = map[string]generate.Generator{ + RunV1GeneratorName: BasicReplicationController{}, + RunPodV1GeneratorName: BasicPod{}, + DeploymentV1Beta1GeneratorName: DeploymentV1Beta1{}, + DeploymentAppsV1Beta1GeneratorName: DeploymentAppsV1Beta1{}, + JobV1GeneratorName: JobV1{}, + CronJobV2Alpha1GeneratorName: CronJobV2Alpha1{}, + CronJobV1Beta1GeneratorName: CronJobV1Beta1{}, } case "namespace": - generator = map[string]kubectl.Generator{ - NamespaceV1GeneratorName: kubectl.NamespaceGeneratorV1{}, + generator = map[string]generate.Generator{ + NamespaceV1GeneratorName: NamespaceGeneratorV1{}, } case "quota": - generator = map[string]kubectl.Generator{ - ResourceQuotaV1GeneratorName: kubectl.ResourceQuotaGeneratorV1{}, + generator = map[string]generate.Generator{ + ResourceQuotaV1GeneratorName: ResourceQuotaGeneratorV1{}, } case "secret": - generator = map[string]kubectl.Generator{ - SecretV1GeneratorName: kubectl.SecretGeneratorV1{}, + generator = map[string]generate.Generator{ + SecretV1GeneratorName: SecretGeneratorV1{}, } case "secret-for-docker-registry": - generator = map[string]kubectl.Generator{ - SecretForDockerRegistryV1GeneratorName: kubectl.SecretForDockerRegistryGeneratorV1{}, + generator = map[string]generate.Generator{ + SecretForDockerRegistryV1GeneratorName: SecretForDockerRegistryGeneratorV1{}, } case "secret-for-tls": - generator = map[string]kubectl.Generator{ - SecretForTLSV1GeneratorName: kubectl.SecretForTLSGeneratorV1{}, + generator = map[string]generate.Generator{ + SecretForTLSV1GeneratorName: SecretForTLSGeneratorV1{}, } } @@ -226,12 +223,3 @@ func HasResource(client discovery.DiscoveryInterface, resource schema.GroupVersi } return false, nil } - -func Warning(cmdErr io.Writer, newGeneratorName, oldGeneratorName string) { - fmt.Fprintf(cmdErr, "WARNING: New generator %q specified, "+ - "but it isn't available. "+ - "Falling back to %q.\n", - newGeneratorName, - oldGeneratorName, - ) -} diff --git a/pkg/kubectl/namespace.go b/pkg/kubectl/generate/versioned/namespace.go similarity index 84% rename from pkg/kubectl/namespace.go rename to pkg/kubectl/generate/versioned/namespace.go index 03723cdaa8..8921764db6 100644 --- a/pkg/kubectl/namespace.go +++ b/pkg/kubectl/generate/versioned/namespace.go @@ -14,13 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/kubectl/generate" ) // NamespaceGeneratorV1 supports stable generation of a namespace @@ -30,14 +31,14 @@ type NamespaceGeneratorV1 struct { } // Ensure it supports the generator pattern that uses parameter injection -var _ Generator = &NamespaceGeneratorV1{} +var _ generate.Generator = &NamespaceGeneratorV1{} // Ensure it supports the generator pattern that uses parameters specified during construction -var _ StructuredGenerator = &NamespaceGeneratorV1{} +var _ generate.StructuredGenerator = &NamespaceGeneratorV1{} // Generate returns a namespace using the specified parameters func (g NamespaceGeneratorV1) Generate(genericParams map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(g.ParamNames(), genericParams) + err := generate.ValidateParams(g.ParamNames(), genericParams) if err != nil { return nil, err } @@ -54,9 +55,9 @@ func (g NamespaceGeneratorV1) Generate(genericParams map[string]interface{}) (ru } // ParamNames returns the set of supported input parameters when using the parameter injection generator pattern -func (g NamespaceGeneratorV1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, +func (g NamespaceGeneratorV1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, } } diff --git a/pkg/kubectl/namespace_test.go b/pkg/kubectl/generate/versioned/namespace_test.go similarity index 99% rename from pkg/kubectl/namespace_test.go rename to pkg/kubectl/generate/versioned/namespace_test.go index db07fdc6d8..b99fcc8939 100644 --- a/pkg/kubectl/namespace_test.go +++ b/pkg/kubectl/generate/versioned/namespace_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "reflect" diff --git a/pkg/kubectl/pdb.go b/pkg/kubectl/generate/versioned/pdb.go similarity index 87% rename from pkg/kubectl/pdb.go rename to pkg/kubectl/generate/versioned/pdb.go index df2cc8f53b..a8cc6469e1 100644 --- a/pkg/kubectl/pdb.go +++ b/pkg/kubectl/generate/versioned/pdb.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" @@ -23,6 +23,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/kubernetes/pkg/kubectl/generate" ) // PodDisruptionBudgetV1Generator supports stable generation of a pod disruption budget. @@ -33,18 +34,18 @@ type PodDisruptionBudgetV1Generator struct { } // Ensure it supports the generator pattern that uses parameters specified during construction. -var _ StructuredGenerator = &PodDisruptionBudgetV1Generator{} +var _ generate.StructuredGenerator = &PodDisruptionBudgetV1Generator{} -func (PodDisruptionBudgetV1Generator) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"min-available", false}, - {"selector", true}, +func (PodDisruptionBudgetV1Generator) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "min-available", Required: false}, + {Name: "selector", Required: true}, } } func (s PodDisruptionBudgetV1Generator) Generate(params map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(s.ParamNames(), params) + err := generate.ValidateParams(s.ParamNames(), params) if err != nil { return nil, err } @@ -115,19 +116,19 @@ type PodDisruptionBudgetV2Generator struct { } // Ensure it supports the generator pattern that uses parameters specified during construction. -var _ StructuredGenerator = &PodDisruptionBudgetV2Generator{} +var _ generate.StructuredGenerator = &PodDisruptionBudgetV2Generator{} -func (PodDisruptionBudgetV2Generator) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"min-available", false}, - {"max-unavailable", false}, - {"selector", true}, +func (PodDisruptionBudgetV2Generator) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "min-available", Required: false}, + {Name: "max-unavailable", Required: false}, + {Name: "selector", Required: true}, } } func (s PodDisruptionBudgetV2Generator) Generate(params map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(s.ParamNames(), params) + err := generate.ValidateParams(s.ParamNames(), params) if err != nil { return nil, err } diff --git a/pkg/kubectl/pdb_test.go b/pkg/kubectl/generate/versioned/pdb_test.go similarity index 99% rename from pkg/kubectl/pdb_test.go rename to pkg/kubectl/generate/versioned/pdb_test.go index 96696710f4..ab16c5b8f4 100644 --- a/pkg/kubectl/pdb_test.go +++ b/pkg/kubectl/generate/versioned/pdb_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "reflect" diff --git a/pkg/kubectl/priorityclass.go b/pkg/kubectl/generate/versioned/priorityclass.go similarity index 82% rename from pkg/kubectl/priorityclass.go rename to pkg/kubectl/generate/versioned/priorityclass.go index 51c71a5701..bd10d47181 100644 --- a/pkg/kubectl/priorityclass.go +++ b/pkg/kubectl/generate/versioned/priorityclass.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" @@ -22,6 +22,7 @@ import ( scheduling "k8s.io/api/scheduling/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/kubectl/generate" ) // PriorityClassV1Generator supports stable generation of a priorityClass. @@ -33,19 +34,19 @@ type PriorityClassV1Generator struct { } // Ensure it supports the generator pattern that uses parameters specified during construction. -var _ StructuredGenerator = &PriorityClassV1Generator{} +var _ generate.StructuredGenerator = &PriorityClassV1Generator{} -func (PriorityClassV1Generator) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"value", true}, - {"global-default", false}, - {"description", false}, +func (PriorityClassV1Generator) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "value", Required: true}, + {Name: "global-default", Required: false}, + {Name: "description", Required: false}, } } func (s PriorityClassV1Generator) Generate(params map[string]interface{}) (runtime.Object, error) { - if err := ValidateParams(s.ParamNames(), params); err != nil { + if err := generate.ValidateParams(s.ParamNames(), params); err != nil { return nil, err } diff --git a/pkg/kubectl/priorityclass_test.go b/pkg/kubectl/generate/versioned/priorityclass_test.go similarity index 99% rename from pkg/kubectl/priorityclass_test.go rename to pkg/kubectl/generate/versioned/priorityclass_test.go index d1606e7f29..0a42407d23 100644 --- a/pkg/kubectl/priorityclass_test.go +++ b/pkg/kubectl/generate/versioned/priorityclass_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( scheduling "k8s.io/api/scheduling/v1beta1" diff --git a/pkg/kubectl/quota.go b/pkg/kubectl/generate/versioned/quota.go similarity index 87% rename from pkg/kubectl/quota.go rename to pkg/kubectl/generate/versioned/quota.go index d51b74af95..c3710acb3b 100644 --- a/pkg/kubectl/quota.go +++ b/pkg/kubectl/generate/versioned/quota.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" @@ -22,6 +22,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/kubectl/generate" ) // ResourceQuotaGeneratorV1 supports stable generation of a resource quota @@ -37,22 +38,22 @@ type ResourceQuotaGeneratorV1 struct { } // ParamNames returns the set of supported input parameters when using the parameter injection generator pattern -func (g ResourceQuotaGeneratorV1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"hard", true}, - {"scopes", false}, +func (g ResourceQuotaGeneratorV1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "hard", Required: true}, + {Name: "scopes", Required: false}, } } // Ensure it supports the generator pattern that uses parameter injection -var _ Generator = &ResourceQuotaGeneratorV1{} +var _ generate.Generator = &ResourceQuotaGeneratorV1{} // Ensure it supports the generator pattern that uses parameters specified during construction -var _ StructuredGenerator = &ResourceQuotaGeneratorV1{} +var _ generate.StructuredGenerator = &ResourceQuotaGeneratorV1{} func (g ResourceQuotaGeneratorV1) Generate(genericParams map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(g.ParamNames(), genericParams) + err := generate.ValidateParams(g.ParamNames(), genericParams) if err != nil { return nil, err } diff --git a/pkg/kubectl/quota_test.go b/pkg/kubectl/generate/versioned/quota_test.go similarity index 99% rename from pkg/kubectl/quota_test.go rename to pkg/kubectl/generate/versioned/quota_test.go index 46fe804962..65380a6395 100644 --- a/pkg/kubectl/quota_test.go +++ b/pkg/kubectl/generate/versioned/quota_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "reflect" diff --git a/pkg/kubectl/rolebinding.go b/pkg/kubectl/generate/versioned/rolebinding.go similarity index 89% rename from pkg/kubectl/rolebinding.go rename to pkg/kubectl/generate/versioned/rolebinding.go index 0eddb1e034..ed91208855 100644 --- a/pkg/kubectl/rolebinding.go +++ b/pkg/kubectl/generate/versioned/rolebinding.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" @@ -24,6 +24,7 @@ import ( rbacv1 "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/kubernetes/pkg/kubectl/generate" ) // RoleBindingGeneratorV1 supports stable generation of a roleBinding. @@ -43,14 +44,14 @@ type RoleBindingGeneratorV1 struct { } // Ensure it supports the generator pattern that uses parameter injection. -var _ Generator = &RoleBindingGeneratorV1{} +var _ generate.Generator = &RoleBindingGeneratorV1{} // Ensure it supports the generator pattern that uses parameters specified during construction. -var _ StructuredGenerator = &RoleBindingGeneratorV1{} +var _ generate.StructuredGenerator = &RoleBindingGeneratorV1{} // Generate returns a roleBinding using the specified parameters. func (s RoleBindingGeneratorV1) Generate(genericParams map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(s.ParamNames(), genericParams) + err := generate.ValidateParams(s.ParamNames(), genericParams) if err != nil { return nil, err } @@ -97,14 +98,14 @@ func (s RoleBindingGeneratorV1) Generate(genericParams map[string]interface{}) ( } // ParamNames returns the set of supported input parameters when using the parameter injection generator pattern. -func (s RoleBindingGeneratorV1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"clusterrole", false}, - {"role", false}, - {"user", false}, - {"group", false}, - {"serviceaccount", false}, +func (s RoleBindingGeneratorV1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "clusterrole", Required: false}, + {Name: "role", Required: false}, + {Name: "user", Required: false}, + {Name: "group", Required: false}, + {Name: "serviceaccount", Required: false}, } } diff --git a/pkg/kubectl/rolebinding_test.go b/pkg/kubectl/generate/versioned/rolebinding_test.go similarity index 99% rename from pkg/kubectl/rolebinding_test.go rename to pkg/kubectl/generate/versioned/rolebinding_test.go index ccc2ba5c63..0e7073ac61 100644 --- a/pkg/kubectl/rolebinding_test.go +++ b/pkg/kubectl/generate/versioned/rolebinding_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "reflect" diff --git a/pkg/kubectl/run.go b/pkg/kubectl/generate/versioned/run.go similarity index 74% rename from pkg/kubectl/run.go rename to pkg/kubectl/generate/versioned/run.go index 7fe1f2fe2b..4a3c00258a 100644 --- a/pkg/kubectl/run.go +++ b/pkg/kubectl/generate/versioned/run.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" @@ -31,28 +31,29 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation" + "k8s.io/kubernetes/pkg/kubectl/generate" ) type DeploymentV1Beta1 struct{} -func (DeploymentV1Beta1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"labels", false}, - {"default-name", false}, - {"name", true}, - {"replicas", true}, - {"image", true}, - {"image-pull-policy", false}, - {"port", false}, - {"hostport", false}, - {"stdin", false}, - {"tty", false}, - {"command", false}, - {"args", false}, - {"env", false}, - {"requests", false}, - {"limits", false}, - {"serviceaccount", false}, +func (DeploymentV1Beta1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "labels", Required: false}, + {Name: "default-name", Required: false}, + {Name: "name", Required: true}, + {Name: "replicas", Required: true}, + {Name: "image", Required: true}, + {Name: "image-pull-policy", Required: false}, + {Name: "port", Required: false}, + {Name: "hostport", Required: false}, + {Name: "stdin", Required: false}, + {Name: "tty", Required: false}, + {Name: "command", Required: false}, + {Name: "args", Required: false}, + {Name: "env", Required: false}, + {Name: "requests", Required: false}, + {Name: "limits", Required: false}, + {Name: "serviceaccount", Required: false}, } } @@ -123,24 +124,24 @@ func (DeploymentV1Beta1) Generate(genericParams map[string]interface{}) (runtime type DeploymentAppsV1Beta1 struct{} -func (DeploymentAppsV1Beta1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"labels", false}, - {"default-name", false}, - {"name", true}, - {"replicas", true}, - {"image", true}, - {"image-pull-policy", false}, - {"port", false}, - {"hostport", false}, - {"stdin", false}, - {"tty", false}, - {"command", false}, - {"args", false}, - {"env", false}, - {"requests", false}, - {"limits", false}, - {"serviceaccount", false}, +func (DeploymentAppsV1Beta1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "labels", Required: false}, + {Name: "default-name", Required: false}, + {Name: "name", Required: true}, + {Name: "replicas", Required: true}, + {Name: "image", Required: true}, + {Name: "image-pull-policy", Required: false}, + {Name: "port", Required: false}, + {Name: "hostport", Required: false}, + {Name: "stdin", Required: false}, + {Name: "tty", Required: false}, + {Name: "command", Required: false}, + {Name: "args", Required: false}, + {Name: "env", Required: false}, + {Name: "requests", Required: false}, + {Name: "limits", Required: false}, + {Name: "serviceaccount", Required: false}, } } @@ -215,7 +216,7 @@ func getLabels(params map[string]string, name string) (map[string]string, error) var labels map[string]string var err error if found && len(labelString) > 0 { - labels, err = ParseLabels(labelString) + labels, err = generate.ParseLabels(labelString) if err != nil { return nil, err } @@ -288,25 +289,25 @@ func getEnvs(genericParams map[string]interface{}) ([]v1.EnvVar, error) { type JobV1 struct{} -func (JobV1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"labels", false}, - {"default-name", false}, - {"name", true}, - {"image", true}, - {"image-pull-policy", false}, - {"port", false}, - {"hostport", false}, - {"stdin", false}, - {"leave-stdin-open", false}, - {"tty", false}, - {"command", false}, - {"args", false}, - {"env", false}, - {"requests", false}, - {"limits", false}, - {"restart", false}, - {"serviceaccount", false}, +func (JobV1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "labels", Required: false}, + {Name: "default-name", Required: false}, + {Name: "name", Required: true}, + {Name: "image", Required: true}, + {Name: "image-pull-policy", Required: false}, + {Name: "port", Required: false}, + {Name: "hostport", Required: false}, + {Name: "stdin", Required: false}, + {Name: "leave-stdin-open", Required: false}, + {Name: "tty", Required: false}, + {Name: "command", Required: false}, + {Name: "args", Required: false}, + {Name: "env", Required: false}, + {Name: "requests", Required: false}, + {Name: "limits", Required: false}, + {Name: "restart", Required: false}, + {Name: "serviceaccount", Required: false}, } } @@ -346,7 +347,7 @@ func (JobV1) Generate(genericParams map[string]interface{}) (runtime.Object, err return nil, err } - leaveStdinOpen, err := GetBool(params, "leave-stdin-open", false) + leaveStdinOpen, err := generate.GetBool(params, "leave-stdin-open", false) if err != nil { return nil, err } @@ -382,26 +383,26 @@ func (JobV1) Generate(genericParams map[string]interface{}) (runtime.Object, err type CronJobV2Alpha1 struct{} -func (CronJobV2Alpha1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"labels", false}, - {"default-name", false}, - {"name", true}, - {"image", true}, - {"image-pull-policy", false}, - {"port", false}, - {"hostport", false}, - {"stdin", false}, - {"leave-stdin-open", false}, - {"tty", false}, - {"command", false}, - {"args", false}, - {"env", false}, - {"requests", false}, - {"limits", false}, - {"restart", false}, - {"schedule", true}, - {"serviceaccount", false}, +func (CronJobV2Alpha1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "labels", Required: false}, + {Name: "default-name", Required: false}, + {Name: "name", Required: true}, + {Name: "image", Required: true}, + {Name: "image-pull-policy", Required: false}, + {Name: "port", Required: false}, + {Name: "hostport", Required: false}, + {Name: "stdin", Required: false}, + {Name: "leave-stdin-open", Required: false}, + {Name: "tty", Required: false}, + {Name: "command", Required: false}, + {Name: "args", Required: false}, + {Name: "env", Required: false}, + {Name: "requests", Required: false}, + {Name: "limits", Required: false}, + {Name: "restart", Required: false}, + {Name: "schedule", Required: true}, + {Name: "serviceaccount", Required: false}, } } @@ -441,7 +442,7 @@ func (CronJobV2Alpha1) Generate(genericParams map[string]interface{}) (runtime.O return nil, err } - leaveStdinOpen, err := GetBool(params, "leave-stdin-open", false) + leaveStdinOpen, err := generate.GetBool(params, "leave-stdin-open", false) if err != nil { return nil, err } @@ -483,26 +484,26 @@ func (CronJobV2Alpha1) Generate(genericParams map[string]interface{}) (runtime.O type CronJobV1Beta1 struct{} -func (CronJobV1Beta1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"labels", false}, - {"default-name", false}, - {"name", true}, - {"image", true}, - {"image-pull-policy", false}, - {"port", false}, - {"hostport", false}, - {"stdin", false}, - {"leave-stdin-open", false}, - {"tty", false}, - {"command", false}, - {"args", false}, - {"env", false}, - {"requests", false}, - {"limits", false}, - {"restart", false}, - {"schedule", true}, - {"serviceaccount", false}, +func (CronJobV1Beta1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "labels", Required: false}, + {Name: "default-name", Required: false}, + {Name: "name", Required: true}, + {Name: "image", Required: true}, + {Name: "image-pull-policy", Required: false}, + {Name: "port", Required: false}, + {Name: "hostport", Required: false}, + {Name: "stdin", Required: false}, + {Name: "leave-stdin-open", Required: false}, + {Name: "tty", Required: false}, + {Name: "command", Required: false}, + {Name: "args", Required: false}, + {Name: "env", Required: false}, + {Name: "requests", Required: false}, + {Name: "limits", Required: false}, + {Name: "restart", Required: false}, + {Name: "schedule", Required: true}, + {Name: "serviceaccount", Required: false}, } } @@ -542,7 +543,7 @@ func (CronJobV1Beta1) Generate(genericParams map[string]interface{}) (runtime.Ob return nil, err } - leaveStdinOpen, err := GetBool(params, "leave-stdin-open", false) + leaveStdinOpen, err := generate.GetBool(params, "leave-stdin-open", false) if err != nil { return nil, err } @@ -584,24 +585,24 @@ func (CronJobV1Beta1) Generate(genericParams map[string]interface{}) (runtime.Ob type BasicReplicationController struct{} -func (BasicReplicationController) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"labels", false}, - {"default-name", false}, - {"name", true}, - {"replicas", true}, - {"image", true}, - {"image-pull-policy", false}, - {"port", false}, - {"hostport", false}, - {"stdin", false}, - {"tty", false}, - {"command", false}, - {"args", false}, - {"env", false}, - {"requests", false}, - {"limits", false}, - {"serviceaccount", false}, +func (BasicReplicationController) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "labels", Required: false}, + {Name: "default-name", Required: false}, + {Name: "name", Required: true}, + {Name: "replicas", Required: true}, + {Name: "image", Required: true}, + {Name: "image-pull-policy", Required: false}, + {Name: "port", Required: false}, + {Name: "hostport", Required: false}, + {Name: "stdin", Required: false}, + {Name: "tty", Required: false}, + {Name: "command", Required: false}, + {Name: "args", Required: false}, + {Name: "env", Required: false}, + {Name: "requests", Required: false}, + {Name: "limits", Required: false}, + {Name: "serviceaccount", Required: false}, } } @@ -649,12 +650,12 @@ func HandleResourceRequirementsV1(params map[string]string) (v1.ResourceRequirem // makePodSpec returns PodSpec filled with passed parameters. func makePodSpec(params map[string]string, name string) (*v1.PodSpec, error) { - stdin, err := GetBool(params, "stdin", false) + stdin, err := generate.GetBool(params, "stdin", false) if err != nil { return nil, err } - tty, err := GetBool(params, "tty", false) + tty, err := generate.GetBool(params, "tty", false) if err != nil { return nil, err } @@ -747,7 +748,7 @@ func (BasicReplicationController) Generate(genericParams map[string]interface{}) // updatePodContainers updates PodSpec.Containers with passed parameters. func updatePodContainers(params map[string]string, args []string, envs []v1.EnvVar, imagePullPolicy v1.PullPolicy, podSpec *v1.PodSpec) error { if len(args) > 0 { - command, err := GetBool(params, "command", false) + command, err := generate.GetBool(params, "command", false) if err != nil { return err } @@ -806,25 +807,25 @@ func updatePodPorts(params map[string]string, podSpec *v1.PodSpec) (err error) { type BasicPod struct{} -func (BasicPod) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"labels", false}, - {"default-name", false}, - {"name", true}, - {"image", true}, - {"image-pull-policy", false}, - {"port", false}, - {"hostport", false}, - {"stdin", false}, - {"leave-stdin-open", false}, - {"tty", false}, - {"restart", false}, - {"command", false}, - {"args", false}, - {"env", false}, - {"requests", false}, - {"limits", false}, - {"serviceaccount", false}, +func (BasicPod) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "labels", Required: false}, + {Name: "default-name", Required: false}, + {Name: "name", Required: true}, + {Name: "image", Required: true}, + {Name: "image-pull-policy", Required: false}, + {Name: "port", Required: false}, + {Name: "hostport", Required: false}, + {Name: "stdin", Required: false}, + {Name: "leave-stdin-open", Required: false}, + {Name: "tty", Required: false}, + {Name: "restart", Required: false}, + {Name: "command", Required: false}, + {Name: "args", Required: false}, + {Name: "env", Required: false}, + {Name: "requests", Required: false}, + {Name: "limits", Required: false}, + {Name: "serviceaccount", Required: false}, } } @@ -854,16 +855,16 @@ func (BasicPod) Generate(genericParams map[string]interface{}) (runtime.Object, return nil, err } - stdin, err := GetBool(params, "stdin", false) + stdin, err := generate.GetBool(params, "stdin", false) if err != nil { return nil, err } - leaveStdinOpen, err := GetBool(params, "leave-stdin-open", false) + leaveStdinOpen, err := generate.GetBool(params, "leave-stdin-open", false) if err != nil { return nil, err } - tty, err := GetBool(params, "tty", false) + tty, err := generate.GetBool(params, "tty", false) if err != nil { return nil, err } diff --git a/pkg/kubectl/run_test.go b/pkg/kubectl/generate/versioned/run_test.go similarity index 99% rename from pkg/kubectl/run_test.go rename to pkg/kubectl/generate/versioned/run_test.go index 0615c2ad71..14073d2a8d 100644 --- a/pkg/kubectl/run_test.go +++ b/pkg/kubectl/generate/versioned/run_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "reflect" diff --git a/pkg/kubectl/secret.go b/pkg/kubectl/generate/versioned/secret.go similarity index 92% rename from pkg/kubectl/secret.go rename to pkg/kubectl/generate/versioned/secret.go index 9a0ff5281d..bca194139f 100644 --- a/pkg/kubectl/secret.go +++ b/pkg/kubectl/generate/versioned/secret.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" @@ -26,6 +26,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation" + "k8s.io/kubernetes/pkg/kubectl/generate" "k8s.io/kubernetes/pkg/kubectl/util" "k8s.io/kubernetes/pkg/kubectl/util/hash" ) @@ -47,14 +48,14 @@ type SecretGeneratorV1 struct { } // Ensure it supports the generator pattern that uses parameter injection -var _ Generator = &SecretGeneratorV1{} +var _ generate.Generator = &SecretGeneratorV1{} // Ensure it supports the generator pattern that uses parameters specified during construction -var _ StructuredGenerator = &SecretGeneratorV1{} +var _ generate.StructuredGenerator = &SecretGeneratorV1{} // Generate returns a secret using the specified parameters func (s SecretGeneratorV1) Generate(genericParams map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(s.ParamNames(), genericParams) + err := generate.ValidateParams(s.ParamNames(), genericParams) if err != nil { return nil, err } @@ -112,15 +113,15 @@ func (s SecretGeneratorV1) Generate(genericParams map[string]interface{}) (runti } // ParamNames returns the set of supported input parameters when using the parameter injection generator pattern -func (s SecretGeneratorV1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"type", false}, - {"from-file", false}, - {"from-literal", false}, - {"from-env-file", false}, - {"force", false}, - {"append-hash", false}, +func (s SecretGeneratorV1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "type", Required: false}, + {Name: "from-file", Required: false}, + {Name: "from-literal", Required: false}, + {Name: "from-env-file", Required: false}, + {Name: "force", Required: false}, + {Name: "append-hash", Required: false}, } } diff --git a/pkg/kubectl/secret_for_docker_registry.go b/pkg/kubectl/generate/versioned/secret_for_docker_registry.go similarity index 75% rename from pkg/kubectl/secret_for_docker_registry.go rename to pkg/kubectl/generate/versioned/secret_for_docker_registry.go index da95e6d458..e8996b8f2c 100644 --- a/pkg/kubectl/secret_for_docker_registry.go +++ b/pkg/kubectl/generate/versioned/secret_for_docker_registry.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "encoding/json" @@ -22,7 +22,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/kubernetes/pkg/credentialprovider" + "k8s.io/kubernetes/pkg/kubectl/generate" "k8s.io/kubernetes/pkg/kubectl/util/hash" ) @@ -45,14 +45,14 @@ type SecretForDockerRegistryGeneratorV1 struct { } // Ensure it supports the generator pattern that uses parameter injection -var _ Generator = &SecretForDockerRegistryGeneratorV1{} +var _ generate.Generator = &SecretForDockerRegistryGeneratorV1{} // Ensure it supports the generator pattern that uses parameters specified during construction -var _ StructuredGenerator = &SecretForDockerRegistryGeneratorV1{} +var _ generate.StructuredGenerator = &SecretForDockerRegistryGeneratorV1{} // Generate returns a secret using the specified parameters func (s SecretForDockerRegistryGeneratorV1) Generate(genericParams map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(s.ParamNames(), genericParams) + err := generate.ValidateParams(s.ParamNames(), genericParams) if err != nil { return nil, err } @@ -114,15 +114,15 @@ func (s SecretForDockerRegistryGeneratorV1) StructuredGenerate() (runtime.Object } // ParamNames returns the set of supported input parameters when using the parameter injection generator pattern -func (s SecretForDockerRegistryGeneratorV1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"from-file", false}, - {"docker-username", true}, - {"docker-email", false}, - {"docker-password", true}, - {"docker-server", true}, - {"append-hash", false}, +func (s SecretForDockerRegistryGeneratorV1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "from-file", Required: false}, + {Name: "docker-username", Required: true}, + {Name: "docker-email", Required: false}, + {Name: "docker-password", Required: true}, + {Name: "docker-server", Required: true}, + {Name: "append-hash", Required: false}, } } @@ -148,15 +148,34 @@ func (s SecretForDockerRegistryGeneratorV1) validate() error { // handleDockerCfgJsonContent serializes a ~/.docker/config.json file func handleDockerCfgJsonContent(username, password, email, server string) ([]byte, error) { - dockercfgAuth := credentialprovider.DockerConfigEntry{ + dockercfgAuth := DockerConfigEntry{ Username: username, Password: password, Email: email, } - dockerCfgJson := credentialprovider.DockerConfigJson{ - Auths: map[string]credentialprovider.DockerConfigEntry{server: dockercfgAuth}, + dockerCfgJson := DockerConfigJson{ + Auths: map[string]DockerConfigEntry{server: dockercfgAuth}, } return json.Marshal(dockerCfgJson) } + +// DockerConfigJson represents a local docker auth config file +// for pulling images. +type DockerConfigJson struct { + Auths DockerConfig `json:"auths"` + // +optional + HttpHeaders map[string]string `json:"HttpHeaders,omitempty"` +} + +// DockerConfig represents the config file used by the docker CLI. +// This config that represents the credentials that should be used +// when pulling images from specific image repositories. +type DockerConfig map[string]DockerConfigEntry + +type DockerConfigEntry struct { + Username string + Password string + Email string +} diff --git a/pkg/kubectl/secret_for_docker_registry_test.go b/pkg/kubectl/generate/versioned/secret_for_docker_registry_test.go similarity index 98% rename from pkg/kubectl/secret_for_docker_registry_test.go rename to pkg/kubectl/generate/versioned/secret_for_docker_registry_test.go index dec0729ae9..3cb73f68f4 100644 --- a/pkg/kubectl/secret_for_docker_registry_test.go +++ b/pkg/kubectl/generate/versioned/secret_for_docker_registry_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "reflect" @@ -73,7 +73,7 @@ func TestSecretForDockerRegistryGenerate(t *testing.T) { }, expected: &v1.Secret{ ObjectMeta: metav1.ObjectMeta{ - Name: "foo-548cm7fgdh", + Name: "foo-7566tc6mgc", }, Data: map[string][]byte{ v1.DockerConfigJsonKey: secretData, diff --git a/pkg/kubectl/secret_for_tls.go b/pkg/kubectl/generate/versioned/secret_for_tls.go similarity index 89% rename from pkg/kubectl/secret_for_tls.go rename to pkg/kubectl/generate/versioned/secret_for_tls.go index 825e759086..0733dab7c1 100644 --- a/pkg/kubectl/secret_for_tls.go +++ b/pkg/kubectl/generate/versioned/secret_for_tls.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "crypto/tls" @@ -23,6 +23,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/kubectl/generate" "k8s.io/kubernetes/pkg/kubectl/util/hash" ) @@ -39,14 +40,14 @@ type SecretForTLSGeneratorV1 struct { } // Ensure it supports the generator pattern that uses parameter injection -var _ Generator = &SecretForTLSGeneratorV1{} +var _ generate.Generator = &SecretForTLSGeneratorV1{} // Ensure it supports the generator pattern that uses parameters specified during construction -var _ StructuredGenerator = &SecretForTLSGeneratorV1{} +var _ generate.StructuredGenerator = &SecretForTLSGeneratorV1{} // Generate returns a secret using the specified parameters func (s SecretForTLSGeneratorV1) Generate(genericParams map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(s.ParamNames(), genericParams) + err := generate.ValidateParams(s.ParamNames(), genericParams) if err != nil { return nil, err } @@ -121,12 +122,12 @@ func readFile(file string) ([]byte, error) { } // ParamNames returns the set of supported input parameters when using the parameter injection generator pattern -func (s SecretForTLSGeneratorV1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"key", true}, - {"cert", true}, - {"append-hash", false}, +func (s SecretForTLSGeneratorV1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "key", Required: true}, + {Name: "cert", Required: true}, + {Name: "append-hash", Required: false}, } } diff --git a/pkg/kubectl/secret_for_tls_test.go b/pkg/kubectl/generate/versioned/secret_for_tls_test.go similarity index 99% rename from pkg/kubectl/secret_for_tls_test.go rename to pkg/kubectl/generate/versioned/secret_for_tls_test.go index 487ff14583..aa8ff3bbe7 100644 --- a/pkg/kubectl/secret_for_tls_test.go +++ b/pkg/kubectl/generate/versioned/secret_for_tls_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" diff --git a/pkg/kubectl/secret_test.go b/pkg/kubectl/generate/versioned/secret_test.go similarity index 99% rename from pkg/kubectl/secret_test.go rename to pkg/kubectl/generate/versioned/secret_test.go index 8ad27ea427..9f80ee6f8f 100644 --- a/pkg/kubectl/secret_test.go +++ b/pkg/kubectl/generate/versioned/secret_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "os" diff --git a/pkg/kubectl/service.go b/pkg/kubectl/generate/versioned/service.go similarity index 83% rename from pkg/kubectl/service.go rename to pkg/kubectl/generate/versioned/service.go index 7f0e0d869f..bea484098e 100644 --- a/pkg/kubectl/service.go +++ b/pkg/kubectl/generate/versioned/service.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" @@ -25,58 +25,59 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/kubernetes/pkg/kubectl/generate" ) // The only difference between ServiceGeneratorV1 and V2 is that the service port is named "default" in V1, while it is left unnamed in V2. type ServiceGeneratorV1 struct{} -func (ServiceGeneratorV1) ParamNames() []GeneratorParam { +func (ServiceGeneratorV1) ParamNames() []generate.GeneratorParam { return paramNames() } func (ServiceGeneratorV1) Generate(params map[string]interface{}) (runtime.Object, error) { params["port-name"] = "default" - return generate(params) + return generateService(params) } type ServiceGeneratorV2 struct{} -func (ServiceGeneratorV2) ParamNames() []GeneratorParam { +func (ServiceGeneratorV2) ParamNames() []generate.GeneratorParam { return paramNames() } func (ServiceGeneratorV2) Generate(params map[string]interface{}) (runtime.Object, error) { - return generate(params) + return generateService(params) } -func paramNames() []GeneratorParam { - return []GeneratorParam{ - {"default-name", true}, - {"name", false}, - {"selector", true}, +func paramNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "default-name", Required: true}, + {Name: "name", Required: false}, + {Name: "selector", Required: true}, // port will be used if a user specifies --port OR the exposed object // has one port - {"port", false}, + {Name: "port", Required: false}, // ports will be used iff a user doesn't specify --port AND the // exposed object has multiple ports - {"ports", false}, - {"labels", false}, - {"external-ip", false}, - {"load-balancer-ip", false}, - {"type", false}, - {"protocol", false}, + {Name: "ports", Required: false}, + {Name: "labels", Required: false}, + {Name: "external-ip", Required: false}, + {Name: "load-balancer-ip", Required: false}, + {Name: "type", Required: false}, + {Name: "protocol", Required: false}, // protocols will be used to keep port-protocol mapping derived from // exposed object - {"protocols", false}, - {"container-port", false}, // alias of target-port - {"target-port", false}, - {"port-name", false}, - {"session-affinity", false}, - {"cluster-ip", false}, + {Name: "protocols", Required: false}, + {Name: "container-port", Required: false}, // alias of target-port + {Name: "target-port", Required: false}, + {Name: "port-name", Required: false}, + {Name: "session-affinity", Required: false}, + {Name: "cluster-ip", Required: false}, } } -func generate(genericParams map[string]interface{}) (runtime.Object, error) { +func generateService(genericParams map[string]interface{}) (runtime.Object, error) { params := map[string]string{} for key, value := range genericParams { strVal, isString := value.(string) @@ -89,7 +90,7 @@ func generate(genericParams map[string]interface{}) (runtime.Object, error) { if !found || len(selectorString) == 0 { return nil, fmt.Errorf("'selector' is a required parameter.") } - selector, err := ParseLabels(selectorString) + selector, err := generate.ParseLabels(selectorString) if err != nil { return nil, err } @@ -97,7 +98,7 @@ func generate(genericParams map[string]interface{}) (runtime.Object, error) { labelsString, found := params["labels"] var labels map[string]string if found && len(labelsString) > 0 { - labels, err = ParseLabels(labelsString) + labels, err = generate.ParseLabels(labelsString) if err != nil { return nil, err } @@ -123,7 +124,7 @@ func generate(genericParams map[string]interface{}) (runtime.Object, error) { protocolsString, found := params["protocols"] var portProtocolMap map[string]string if found && len(protocolsString) > 0 { - portProtocolMap, err = ParseProtocols(protocolsString) + portProtocolMap, err = generate.ParseProtocols(protocolsString) if err != nil { return nil, err } diff --git a/pkg/kubectl/service_basic.go b/pkg/kubectl/generate/versioned/service_basic.go similarity index 85% rename from pkg/kubectl/service_basic.go rename to pkg/kubectl/generate/versioned/service_basic.go index 1f31bd09a2..be1e6667f3 100644 --- a/pkg/kubectl/service_basic.go +++ b/pkg/kubectl/generate/versioned/service_basic.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" @@ -26,6 +26,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/validation" + "k8s.io/kubernetes/pkg/kubectl/generate" ) type ServiceCommonGeneratorV1 struct { @@ -54,31 +55,31 @@ type ServiceExternalNameGeneratorV1 struct { ServiceCommonGeneratorV1 } -func (ServiceClusterIPGeneratorV1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"tcp", true}, - {"clusterip", false}, +func (ServiceClusterIPGeneratorV1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "tcp", Required: true}, + {Name: "clusterip", Required: false}, } } -func (ServiceNodePortGeneratorV1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"tcp", true}, - {"nodeport", true}, +func (ServiceNodePortGeneratorV1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "tcp", Required: true}, + {Name: "nodeport", Required: true}, } } -func (ServiceLoadBalancerGeneratorV1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"tcp", true}, +func (ServiceLoadBalancerGeneratorV1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "tcp", Required: true}, } } -func (ServiceExternalNameGeneratorV1) ParamNames() []GeneratorParam { - return []GeneratorParam{ - {"name", true}, - {"externalname", true}, +func (ServiceExternalNameGeneratorV1) ParamNames() []generate.GeneratorParam { + return []generate.GeneratorParam{ + {Name: "name", Required: true}, + {Name: "externalname", Required: true}, } } @@ -138,7 +139,7 @@ func (s ServiceCommonGeneratorV1) GenerateCommon(params map[string]interface{}) } func (s ServiceLoadBalancerGeneratorV1) Generate(params map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(s.ParamNames(), params) + err := generate.ValidateParams(s.ParamNames(), params) if err != nil { return nil, err } @@ -151,7 +152,7 @@ func (s ServiceLoadBalancerGeneratorV1) Generate(params map[string]interface{}) } func (s ServiceNodePortGeneratorV1) Generate(params map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(s.ParamNames(), params) + err := generate.ValidateParams(s.ParamNames(), params) if err != nil { return nil, err } @@ -164,7 +165,7 @@ func (s ServiceNodePortGeneratorV1) Generate(params map[string]interface{}) (run } func (s ServiceClusterIPGeneratorV1) Generate(params map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(s.ParamNames(), params) + err := generate.ValidateParams(s.ParamNames(), params) if err != nil { return nil, err } @@ -177,7 +178,7 @@ func (s ServiceClusterIPGeneratorV1) Generate(params map[string]interface{}) (ru } func (s ServiceExternalNameGeneratorV1) Generate(params map[string]interface{}) (runtime.Object, error) { - err := ValidateParams(s.ParamNames(), params) + err := generate.ValidateParams(s.ParamNames(), params) if err != nil { return nil, err } diff --git a/pkg/kubectl/service_basic_test.go b/pkg/kubectl/generate/versioned/service_basic_test.go similarity index 99% rename from pkg/kubectl/service_basic_test.go rename to pkg/kubectl/generate/versioned/service_basic_test.go index b1c89921b0..5857eecf79 100644 --- a/pkg/kubectl/service_basic_test.go +++ b/pkg/kubectl/generate/versioned/service_basic_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "reflect" diff --git a/pkg/kubectl/service_test.go b/pkg/kubectl/generate/versioned/service_test.go similarity index 99% rename from pkg/kubectl/service_test.go rename to pkg/kubectl/generate/versioned/service_test.go index 5c0ae4fd22..bf19851600 100644 --- a/pkg/kubectl/service_test.go +++ b/pkg/kubectl/generate/versioned/service_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "reflect" @@ -23,12 +23,13 @@ import ( "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/kubernetes/pkg/kubectl/generate" ) func TestGenerateService(t *testing.T) { tests := []struct { name string - generator Generator + generator generate.Generator params map[string]interface{} expected v1.Service }{ diff --git a/pkg/kubectl/serviceaccount.go b/pkg/kubectl/generate/versioned/serviceaccount.go similarity index 92% rename from pkg/kubectl/serviceaccount.go rename to pkg/kubectl/generate/versioned/serviceaccount.go index fa701e140a..e69b88de18 100644 --- a/pkg/kubectl/serviceaccount.go +++ b/pkg/kubectl/generate/versioned/serviceaccount.go @@ -14,13 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "fmt" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/kubectl/generate" ) // ServiceAccountGeneratorV1 supports stable generation of a service account @@ -30,7 +31,7 @@ type ServiceAccountGeneratorV1 struct { } // Ensure it supports the generator pattern that uses parameters specified during construction -var _ StructuredGenerator = &ServiceAccountGeneratorV1{} +var _ generate.StructuredGenerator = &ServiceAccountGeneratorV1{} // StructuredGenerate outputs a service account object using the configured fields func (g *ServiceAccountGeneratorV1) StructuredGenerate() (runtime.Object, error) { diff --git a/pkg/kubectl/serviceaccount_test.go b/pkg/kubectl/generate/versioned/serviceaccount_test.go similarity index 98% rename from pkg/kubectl/serviceaccount_test.go rename to pkg/kubectl/generate/versioned/serviceaccount_test.go index d2e45ec05e..136f11de9e 100644 --- a/pkg/kubectl/serviceaccount_test.go +++ b/pkg/kubectl/generate/versioned/serviceaccount_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package versioned import ( "reflect" diff --git a/pkg/kubectl/polymorphichelpers/BUILD b/pkg/kubectl/polymorphichelpers/BUILD index 07bd70b7ef..235416ff41 100644 --- a/pkg/kubectl/polymorphichelpers/BUILD +++ b/pkg/kubectl/polymorphichelpers/BUILD @@ -23,6 +23,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/kubectl:go_default_library", + "//pkg/kubectl/generate:go_default_library", "//pkg/kubectl/scheme:go_default_library", "//pkg/kubectl/util/podutils:go_default_library", "//staging/src/k8s.io/api/apps/v1:go_default_library", diff --git a/pkg/kubectl/polymorphichelpers/mapbasedselectorforobject.go b/pkg/kubectl/polymorphichelpers/mapbasedselectorforobject.go index 6e0561d5a7..422302629e 100644 --- a/pkg/kubectl/polymorphichelpers/mapbasedselectorforobject.go +++ b/pkg/kubectl/polymorphichelpers/mapbasedselectorforobject.go @@ -25,7 +25,7 @@ import ( corev1 "k8s.io/api/core/v1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/kubernetes/pkg/kubectl" + "k8s.io/kubernetes/pkg/kubectl/generate" ) // mapBasedSelectorForObject returns the map-based selector associated with the provided object. If a @@ -35,19 +35,19 @@ func mapBasedSelectorForObject(object runtime.Object) (string, error) { // TODO: replace with a swagger schema based approach (identify pod selector via schema introspection) switch t := object.(type) { case *corev1.ReplicationController: - return kubectl.MakeLabels(t.Spec.Selector), nil + return generate.MakeLabels(t.Spec.Selector), nil case *corev1.Pod: if len(t.Labels) == 0 { return "", fmt.Errorf("the pod has no labels and cannot be exposed") } - return kubectl.MakeLabels(t.Labels), nil + return generate.MakeLabels(t.Labels), nil case *corev1.Service: if t.Spec.Selector == nil { return "", fmt.Errorf("the service has no pod selector set") } - return kubectl.MakeLabels(t.Spec.Selector), nil + return generate.MakeLabels(t.Spec.Selector), nil case *extensionsv1beta1.Deployment: // TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals @@ -55,28 +55,28 @@ func mapBasedSelectorForObject(object runtime.Object) (string, error) { if len(t.Spec.Selector.MatchExpressions) > 0 { return "", fmt.Errorf("couldn't convert expressions - \"%+v\" to map-based selector format", t.Spec.Selector.MatchExpressions) } - return kubectl.MakeLabels(t.Spec.Selector.MatchLabels), nil + return generate.MakeLabels(t.Spec.Selector.MatchLabels), nil case *appsv1.Deployment: // TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals // operator, DoubleEquals operator and In operator with only one element in the set. if len(t.Spec.Selector.MatchExpressions) > 0 { return "", fmt.Errorf("couldn't convert expressions - \"%+v\" to map-based selector format", t.Spec.Selector.MatchExpressions) } - return kubectl.MakeLabels(t.Spec.Selector.MatchLabels), nil + return generate.MakeLabels(t.Spec.Selector.MatchLabels), nil case *appsv1beta2.Deployment: // TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals // operator, DoubleEquals operator and In operator with only one element in the set. if len(t.Spec.Selector.MatchExpressions) > 0 { return "", fmt.Errorf("couldn't convert expressions - \"%+v\" to map-based selector format", t.Spec.Selector.MatchExpressions) } - return kubectl.MakeLabels(t.Spec.Selector.MatchLabels), nil + return generate.MakeLabels(t.Spec.Selector.MatchLabels), nil case *appsv1beta1.Deployment: // TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals // operator, DoubleEquals operator and In operator with only one element in the set. if len(t.Spec.Selector.MatchExpressions) > 0 { return "", fmt.Errorf("couldn't convert expressions - \"%+v\" to map-based selector format", t.Spec.Selector.MatchExpressions) } - return kubectl.MakeLabels(t.Spec.Selector.MatchLabels), nil + return generate.MakeLabels(t.Spec.Selector.MatchLabels), nil case *extensionsv1beta1.ReplicaSet: // TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals @@ -84,21 +84,21 @@ func mapBasedSelectorForObject(object runtime.Object) (string, error) { if len(t.Spec.Selector.MatchExpressions) > 0 { return "", fmt.Errorf("couldn't convert expressions - \"%+v\" to map-based selector format", t.Spec.Selector.MatchExpressions) } - return kubectl.MakeLabels(t.Spec.Selector.MatchLabels), nil + return generate.MakeLabels(t.Spec.Selector.MatchLabels), nil case *appsv1.ReplicaSet: // TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals // operator, DoubleEquals operator and In operator with only one element in the set. if len(t.Spec.Selector.MatchExpressions) > 0 { return "", fmt.Errorf("couldn't convert expressions - \"%+v\" to map-based selector format", t.Spec.Selector.MatchExpressions) } - return kubectl.MakeLabels(t.Spec.Selector.MatchLabels), nil + return generate.MakeLabels(t.Spec.Selector.MatchLabels), nil case *appsv1beta2.ReplicaSet: // TODO(madhusudancs): Make this smarter by admitting MatchExpressions with Equals // operator, DoubleEquals operator and In operator with only one element in the set. if len(t.Spec.Selector.MatchExpressions) > 0 { return "", fmt.Errorf("couldn't convert expressions - \"%+v\" to map-based selector format", t.Spec.Selector.MatchExpressions) } - return kubectl.MakeLabels(t.Spec.Selector.MatchLabels), nil + return generate.MakeLabels(t.Spec.Selector.MatchLabels), nil default: return "", fmt.Errorf("cannot extract pod selector from %T", object) diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index 03e84b7232..ef0641d4cf 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -57,11 +57,6 @@ import ( "k8s.io/kubernetes/pkg/printers" ) -func init() { - legacyscheme.Scheme.AddKnownTypes(schema.GroupVersion{Group: "", Version: runtime.APIVersionInternal}, &TestPrintType{}) - legacyscheme.Scheme.AddKnownTypes(schema.GroupVersion{Group: "", Version: "v1"}, &TestPrintType{}) -} - var testData = TestStruct{ TypeMeta: metav1.TypeMeta{APIVersion: "foo/bar", Kind: "TestStruct"}, Key: "testValue",