diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/apply/apply.go b/staging/src/k8s.io/kubectl/pkg/cmd/apply/apply.go index ee553f6e169..b9b34f62596 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/apply/apply.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/apply/apply.go @@ -250,6 +250,10 @@ func (o *ApplyOptions) Complete(f cmdutil.Factory, cmd *cobra.Command) error { return err } + if o.DryRunStrategy == cmdutil.DryRunServer && o.DeleteOptions.ForceDeletion { + return fmt.Errorf("--dry-run=server cannot be used with --force") + } + o.OpenAPISchema, _ = f.OpenAPISchema() o.Validator, err = f.Validator(cmdutil.GetFlagBool(cmd, "validate")) if err != nil { diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/apply/apply_test.go b/staging/src/k8s.io/kubectl/pkg/cmd/apply/apply_test.go index 2f6fe3dec01..df3f64fa119 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/apply/apply_test.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/apply/apply_test.go @@ -1382,3 +1382,31 @@ func TestForceApply(t *testing.T) { }) } } + +func TestDontAllowForceApplyWithServerDryRun(t *testing.T) { + expectedError := "error: --dry-run=server cannot be used with --force" + + cmdutil.BehaviorOnFatal(func(str string, code int) { + panic(str) + }) + defer func() { + actualError := recover() + if expectedError != actualError { + t.Fatalf(`expected error "%s", but got "%s"`, expectedError, actualError) + } + }() + + tf := cmdtesting.NewTestFactory().WithNamespace("test") + defer tf.Cleanup() + + tf.ClientConfigVal = cmdtesting.DefaultClientConfig() + + ioStreams, _, _, _ := genericclioptions.NewTestIOStreams() + cmd := NewCmdApply("kubectl", tf, ioStreams) + cmd.Flags().Set("filename", filenameRC) + cmd.Flags().Set("dry-run", "server") + cmd.Flags().Set("force", "true") + cmd.Run(cmd, []string{}) + + t.Fatalf(`expected error "%s"`, expectedError) +}