mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 12:43:23 +00:00
Merge pull request #93388 from SaiHarshaK/feature/run-annotate
allow adding annotations to pod when using kubectl run
This commit is contained in:
commit
d20c43157f
@ -173,6 +173,7 @@ func NewCmdRun(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Co
|
|||||||
|
|
||||||
func addRunFlags(cmd *cobra.Command, opt *RunOptions) {
|
func addRunFlags(cmd *cobra.Command, opt *RunOptions) {
|
||||||
cmdutil.AddDryRunFlag(cmd)
|
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().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().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."))
|
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["args"] = args[1:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
params["annotations"] = cmdutil.GetFlagStringArray(cmd, "annotations")
|
||||||
params["env"] = cmdutil.GetFlagStringArray(cmd, "env")
|
params["env"] = cmdutil.GetFlagStringArray(cmd, "env")
|
||||||
|
|
||||||
var createdObjects = []*RunObject{}
|
var createdObjects = []*RunObject{}
|
||||||
|
@ -44,6 +44,7 @@ go_library(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets: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/apimachinery/pkg/util/validation:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/discovery: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/generate:go_default_library",
|
||||||
"//staging/src/k8s.io/kubectl/pkg/util:go_default_library",
|
"//staging/src/k8s.io/kubectl/pkg/util:go_default_library",
|
||||||
"//staging/src/k8s.io/kubectl/pkg/util/hash:go_default_library",
|
"//staging/src/k8s.io/kubectl/pkg/util/hash:go_default_library",
|
||||||
|
@ -21,11 +21,12 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/util/validation"
|
"k8s.io/apimachinery/pkg/util/validation"
|
||||||
|
cmdutil "k8s.io/kubectl/pkg/cmd/util"
|
||||||
"k8s.io/kubectl/pkg/generate"
|
"k8s.io/kubectl/pkg/generate"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -87,6 +88,27 @@ func getArgs(genericParams map[string]interface{}) ([]string, error) {
|
|||||||
return args, nil
|
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.
|
// getEnvs returns environment variables.
|
||||||
func getEnvs(genericParams map[string]interface{}) ([]v1.EnvVar, error) {
|
func getEnvs(genericParams map[string]interface{}) ([]v1.EnvVar, error) {
|
||||||
var envs []v1.EnvVar
|
var envs []v1.EnvVar
|
||||||
@ -213,6 +235,7 @@ type BasicPod struct{}
|
|||||||
func (BasicPod) ParamNames() []generate.GeneratorParam {
|
func (BasicPod) ParamNames() []generate.GeneratorParam {
|
||||||
return []generate.GeneratorParam{
|
return []generate.GeneratorParam{
|
||||||
{Name: "labels", Required: false},
|
{Name: "labels", Required: false},
|
||||||
|
{Name: "annotations", Required: false},
|
||||||
{Name: "default-name", Required: false},
|
{Name: "default-name", Required: false},
|
||||||
{Name: "name", Required: true},
|
{Name: "name", Required: true},
|
||||||
{Name: "image", Required: true},
|
{Name: "image", Required: true},
|
||||||
@ -244,6 +267,11 @@ func (BasicPod) Generate(genericParams map[string]interface{}) (runtime.Object,
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
annotations, err := getAnnotations(genericParams)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
params, err := getParams(genericParams)
|
params, err := getParams(genericParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -296,8 +324,9 @@ func (BasicPod) Generate(genericParams map[string]interface{}) (runtime.Object,
|
|||||||
|
|
||||||
pod := v1.Pod{
|
pod := v1.Pod{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: name,
|
Name: name,
|
||||||
Labels: labels,
|
Labels: labels,
|
||||||
|
Annotations: annotations,
|
||||||
},
|
},
|
||||||
Spec: v1.PodSpec{
|
Spec: v1.PodSpec{
|
||||||
ServiceAccountName: params["serviceaccount"],
|
ServiceAccountName: params["serviceaccount"],
|
||||||
|
@ -20,7 +20,7 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/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{}
|
generator := BasicPod{}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
|
Loading…
Reference in New Issue
Block a user