From 661de7f39eeab6a6977d59f9a24129477f7c5815 Mon Sep 17 00:00:00 2001 From: Sai Harsha Kottapalli Date: Thu, 23 Jul 2020 19:37:22 +0530 Subject: [PATCH] allow adding annotations to pod when using kubectl run and add tests --- staging/src/k8s.io/kubectl/pkg/cmd/run/run.go | 2 ++ .../kubectl/pkg/generate/versioned/BUILD | 1 + .../kubectl/pkg/generate/versioned/run.go | 35 +++++++++++++++++-- .../pkg/generate/versioned/run_test.go | 29 ++++++++++++++- 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/run/run.go b/staging/src/k8s.io/kubectl/pkg/cmd/run/run.go index 524f0093c4a..d8ae89e19b2 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/run/run.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/run/run.go @@ -173,6 +173,7 @@ func NewCmdRun(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Co func addRunFlags(cmd *cobra.Command, opt *RunOptions) { cmdutil.AddDryRunFlag(cmd) + cmd.Flags().StringArray("annotations", []string{}, i18n.T("Annotations to apply to the pod.")) cmd.Flags().StringVar(&opt.Generator, "generator", opt.Generator, i18n.T("The name of the API generator to use, see http://kubernetes.io/docs/user-guide/kubectl-conventions/#generators for a list.")) cmd.Flags().MarkDeprecated("generator", "has no effect and will be removed in the future.") cmd.Flags().StringVar(&opt.Image, "image", opt.Image, i18n.T("The image for the container to run.")) @@ -319,6 +320,7 @@ func (o *RunOptions) Run(f cmdutil.Factory, cmd *cobra.Command, args []string) e params["args"] = args[1:] } + params["annotations"] = cmdutil.GetFlagStringArray(cmd, "annotations") params["env"] = cmdutil.GetFlagStringArray(cmd, "env") var createdObjects = []*RunObject{} diff --git a/staging/src/k8s.io/kubectl/pkg/generate/versioned/BUILD b/staging/src/k8s.io/kubectl/pkg/generate/versioned/BUILD index e2ee66cc326..5bc62e35566 100644 --- a/staging/src/k8s.io/kubectl/pkg/generate/versioned/BUILD +++ b/staging/src/k8s.io/kubectl/pkg/generate/versioned/BUILD @@ -44,6 +44,7 @@ go_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", + "//staging/src/k8s.io/kubectl/pkg/cmd/util:go_default_library", "//staging/src/k8s.io/kubectl/pkg/generate:go_default_library", "//staging/src/k8s.io/kubectl/pkg/util:go_default_library", "//staging/src/k8s.io/kubectl/pkg/util/hash:go_default_library", diff --git a/staging/src/k8s.io/kubectl/pkg/generate/versioned/run.go b/staging/src/k8s.io/kubectl/pkg/generate/versioned/run.go index 6eade8d9b26..b264c52603d 100644 --- a/staging/src/k8s.io/kubectl/pkg/generate/versioned/run.go +++ b/staging/src/k8s.io/kubectl/pkg/generate/versioned/run.go @@ -21,11 +21,12 @@ import ( "strconv" "strings" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation" + cmdutil "k8s.io/kubectl/pkg/cmd/util" "k8s.io/kubectl/pkg/generate" ) @@ -87,6 +88,27 @@ func getArgs(genericParams map[string]interface{}) ([]string, error) { return args, nil } +// getAnnotations returns map of annotations. +func getAnnotations(genericParams map[string]interface{}) (map[string]string, error) { + annotationStrings, ok := genericParams["annotations"] + if !ok { + return nil, nil + } + + annotationStringArray, ok := annotationStrings.([]string) + if !ok { + return nil, fmt.Errorf("expected []string, found: %v", annotationStrings) + } + + annotations, _, err := cmdutil.ParsePairs(annotationStringArray, "annotations", false) + if err != nil { + return nil, err + } + + delete(genericParams, "annotations") + return annotations, nil +} + // getEnvs returns environment variables. func getEnvs(genericParams map[string]interface{}) ([]v1.EnvVar, error) { var envs []v1.EnvVar @@ -213,6 +235,7 @@ type BasicPod struct{} func (BasicPod) ParamNames() []generate.GeneratorParam { return []generate.GeneratorParam{ {Name: "labels", Required: false}, + {Name: "annotations", Required: false}, {Name: "default-name", Required: false}, {Name: "name", Required: true}, {Name: "image", Required: true}, @@ -244,6 +267,11 @@ func (BasicPod) Generate(genericParams map[string]interface{}) (runtime.Object, return nil, err } + annotations, err := getAnnotations(genericParams) + if err != nil { + return nil, err + } + params, err := getParams(genericParams) if err != nil { return nil, err @@ -296,8 +324,9 @@ func (BasicPod) Generate(genericParams map[string]interface{}) (runtime.Object, pod := v1.Pod{ ObjectMeta: metav1.ObjectMeta{ - Name: name, - Labels: labels, + Name: name, + Labels: labels, + Annotations: annotations, }, Spec: v1.PodSpec{ ServiceAccountName: params["serviceaccount"], diff --git a/staging/src/k8s.io/kubectl/pkg/generate/versioned/run_test.go b/staging/src/k8s.io/kubectl/pkg/generate/versioned/run_test.go index 081e7bb5e4b..e69025cee22 100644 --- a/staging/src/k8s.io/kubectl/pkg/generate/versioned/run_test.go +++ b/staging/src/k8s.io/kubectl/pkg/generate/versioned/run_test.go @@ -20,7 +20,7 @@ import ( "reflect" "testing" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -280,6 +280,33 @@ func TestGeneratePod(t *testing.T) { }, }, }, + { + name: "test11: check annotations", + params: map[string]interface{}{ + "name": "foo", + "image": "someimage", + "replicas": "1", + "labels": "foo=bar,baz=blah", + "annotations": []string{"foo=bar1", "baz=blah1"}, + }, + expected: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Labels: map[string]string{"foo": "bar", "baz": "blah"}, + Annotations: map[string]string{"foo": "bar1", "baz": "blah1"}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "foo", + Image: "someimage", + }, + }, + DNSPolicy: v1.DNSClusterFirst, + RestartPolicy: v1.RestartPolicyAlways, + }, + }, + }, } generator := BasicPod{} for _, tt := range tests {