mirror of https://github.com/k3s-io/k3s
Merge pull request #40057 from MrHohn/kubectl-create-seletor
Automatic merge from submit-queue (batch tested with PRs 40328, 40057) Allows kubectl create -f to filter by selector. From #32544. The underlying `seletor` infrastructrue was implemented by #32599. The test is basically copy-paste of the corresponding test for `kubectl apply -f -l`. ```release-note kubectl create now accepts the label selector flag for filtering objects to create ```pull/6/head
commit
f545d6ad47
|
@ -900,6 +900,22 @@ run_kubectl_apply_tests() {
|
||||||
kubectl delete svc prune-svc 2>&1 "${kube_flags[@]}"
|
kubectl delete svc prune-svc 2>&1 "${kube_flags[@]}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Runs tests related to kubectl create --filename(-f) --selector(-l).
|
||||||
|
run_kubectl_create_filter_tests() {
|
||||||
|
## kubectl create -f with label selector should only create matching objects
|
||||||
|
# Pre-Condition: no POD exists
|
||||||
|
kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
|
||||||
|
# create
|
||||||
|
kubectl create -l unique-label=bingbang -f hack/testdata/filter "${kube_flags[@]}"
|
||||||
|
# check right pod exists
|
||||||
|
kube::test::get_object_assert 'pods selector-test-pod' "{{${labels_field}.name}}" 'selector-test-pod'
|
||||||
|
# check wrong pod doesn't exist
|
||||||
|
output_message=$(! kubectl get pods selector-test-pod-dont-apply 2>&1 "${kube_flags[@]}")
|
||||||
|
kube::test::if_has_string "${output_message}" 'pods "selector-test-pod-dont-apply" not found'
|
||||||
|
# cleanup
|
||||||
|
kubectl delete pods selector-test-pod
|
||||||
|
}
|
||||||
|
|
||||||
# Runs tests for --save-config tests.
|
# Runs tests for --save-config tests.
|
||||||
run_save_config_tests() {
|
run_save_config_tests() {
|
||||||
## Configuration annotations should be set when --save-config is enabled
|
## Configuration annotations should be set when --save-config is enabled
|
||||||
|
@ -2592,6 +2608,7 @@ runTests() {
|
||||||
# run for federation apiserver as well.
|
# run for federation apiserver as well.
|
||||||
run_kubectl_apply_tests
|
run_kubectl_apply_tests
|
||||||
run_kubectl_run_tests
|
run_kubectl_run_tests
|
||||||
|
run_kubectl_create_filter_tests
|
||||||
fi
|
fi
|
||||||
|
|
||||||
###############
|
###############
|
||||||
|
|
|
@ -31,6 +31,12 @@ import (
|
||||||
"k8s.io/kubernetes/pkg/kubectl/resource"
|
"k8s.io/kubernetes/pkg/kubectl/resource"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type CreateOptions struct {
|
||||||
|
FilenameOptions resource.FilenameOptions
|
||||||
|
Selector string
|
||||||
|
EditBeforeCreate bool
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
create_long = templates.LongDesc(`
|
create_long = templates.LongDesc(`
|
||||||
Create a resource by filename or stdin.
|
Create a resource by filename or stdin.
|
||||||
|
@ -49,7 +55,7 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewCmdCreate(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command {
|
func NewCmdCreate(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command {
|
||||||
options := &resource.FilenameOptions{}
|
var options CreateOptions
|
||||||
|
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "create -f FILENAME",
|
Use: "create -f FILENAME",
|
||||||
|
@ -57,27 +63,28 @@ func NewCmdCreate(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command {
|
||||||
Long: create_long,
|
Long: create_long,
|
||||||
Example: create_example,
|
Example: create_example,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
if cmdutil.IsFilenameEmpty(options.Filenames) {
|
if cmdutil.IsFilenameEmpty(options.FilenameOptions.Filenames) {
|
||||||
defaultRunFunc := cmdutil.DefaultSubCommandRun(errOut)
|
defaultRunFunc := cmdutil.DefaultSubCommandRun(errOut)
|
||||||
defaultRunFunc(cmd, args)
|
defaultRunFunc(cmd, args)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
cmdutil.CheckErr(ValidateArgs(cmd, args))
|
cmdutil.CheckErr(ValidateArgs(cmd, args))
|
||||||
cmdutil.CheckErr(RunCreate(f, cmd, out, errOut, options))
|
cmdutil.CheckErr(RunCreate(f, cmd, out, errOut, &options))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
usage := "to use to create the resource"
|
usage := "to use to create the resource"
|
||||||
cmdutil.AddFilenameOptionFlags(cmd, options, usage)
|
cmdutil.AddFilenameOptionFlags(cmd, &options.FilenameOptions, usage)
|
||||||
cmd.MarkFlagRequired("filename")
|
cmd.MarkFlagRequired("filename")
|
||||||
cmdutil.AddValidateFlags(cmd)
|
cmdutil.AddValidateFlags(cmd)
|
||||||
cmdutil.AddPrinterFlags(cmd)
|
cmdutil.AddPrinterFlags(cmd)
|
||||||
cmd.Flags().Bool("edit", false, "Edit the API resource before creating")
|
cmd.Flags().BoolVar(&options.EditBeforeCreate, "edit", false, "Edit the API resource before creating")
|
||||||
cmd.Flags().Bool("windows-line-endings", gruntime.GOOS == "windows", "Only relevant if --edit=true. Use Windows line-endings (default Unix line-endings)")
|
cmd.Flags().Bool("windows-line-endings", gruntime.GOOS == "windows", "Only relevant if --edit=true. Use Windows line-endings (default Unix line-endings)")
|
||||||
cmdutil.AddApplyAnnotationFlags(cmd)
|
cmdutil.AddApplyAnnotationFlags(cmd)
|
||||||
cmdutil.AddRecordFlag(cmd)
|
cmdutil.AddRecordFlag(cmd)
|
||||||
cmdutil.AddDryRunFlag(cmd)
|
cmdutil.AddDryRunFlag(cmd)
|
||||||
cmdutil.AddInclude3rdPartyFlags(cmd)
|
cmdutil.AddInclude3rdPartyFlags(cmd)
|
||||||
|
cmd.Flags().StringVarP(&options.Selector, "selector", "l", "", "Selector (label query) to filter on, supports '=', '==', and '!='.")
|
||||||
|
|
||||||
// create subcommands
|
// create subcommands
|
||||||
cmd.AddCommand(NewCmdCreateNamespace(f, out))
|
cmd.AddCommand(NewCmdCreateNamespace(f, out))
|
||||||
|
@ -100,9 +107,9 @@ func ValidateArgs(cmd *cobra.Command, args []string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunCreate(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, options *resource.FilenameOptions) error {
|
func RunCreate(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, options *CreateOptions) error {
|
||||||
if cmdutil.GetFlagBool(cmd, "edit") {
|
if options.EditBeforeCreate {
|
||||||
return RunEditOnCreate(f, out, errOut, cmd, options)
|
return RunEditOnCreate(f, out, errOut, cmd, &options.FilenameOptions)
|
||||||
}
|
}
|
||||||
schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagString(cmd, "schema-cache-dir"))
|
schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagString(cmd, "schema-cache-dir"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -122,7 +129,8 @@ func RunCreate(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opt
|
||||||
Schema(schema).
|
Schema(schema).
|
||||||
ContinueOnError().
|
ContinueOnError().
|
||||||
NamespaceParam(cmdNamespace).DefaultNamespace().
|
NamespaceParam(cmdNamespace).DefaultNamespace().
|
||||||
FilenameParam(enforceNamespace, options).
|
FilenameParam(enforceNamespace, &options.FilenameOptions).
|
||||||
|
SelectorParam(options.Selector).
|
||||||
Flatten().
|
Flatten().
|
||||||
Do()
|
Do()
|
||||||
err = r.Err()
|
err = r.Err()
|
||||||
|
|
Loading…
Reference in New Issue