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 b9b34f62596..553d2cf3c2c 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/apply/apply.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/apply/apply.go @@ -399,6 +399,14 @@ func (o *ApplyOptions) applyOneObject(info *resource.Info) error { klog.V(4).Infof("error recording current command: %v", err) } + if len(info.Name) == 0 { + metadata, _ := meta.Accessor(info.Object) + generatedName := metadata.GetGenerateName() + if len(generatedName) > 0 { + return fmt.Errorf("from %s: cannot use generate name with apply", generatedName) + } + } + helper := resource.NewHelper(info.Client, info.Mapping). DryRun(o.DryRunStrategy == cmdutil.DryRunServer). WithFieldManager(o.FieldManager) 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 df3f64fa119..ca910582065 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 @@ -97,6 +97,7 @@ const ( filenameRCPatchTest = "../../../testdata/apply/patch.json" dirName = "../../../testdata/apply/testdir" filenameRCJSON = "../../../testdata/apply/rc.json" + filenamePodGeneratedName = "../../../testdata/apply/pod-generated-name.yaml" filenameWidgetClientside = "../../../testdata/apply/widget-clientside.yaml" filenameWidgetServerside = "../../../testdata/apply/widget-serverside.yaml" @@ -1410,3 +1411,22 @@ func TestDontAllowForceApplyWithServerDryRun(t *testing.T) { t.Fatalf(`expected error "%s"`, expectedError) } + +func TestDontAllowApplyWithPodGeneratedName(t *testing.T) { + expectedError := "error: from testing-: cannot use generate name with apply" + cmdutil.BehaviorOnFatal(func(str string, code int) { + if str != expectedError { + t.Fatalf(`expected error "%s", but got "%s"`, expectedError, str) + } + }) + + tf := cmdtesting.NewTestFactory().WithNamespace("test") + defer tf.Cleanup() + tf.ClientConfigVal = cmdtesting.DefaultClientConfig() + + ioStreams, _, _, _ := genericclioptions.NewTestIOStreams() + cmd := NewCmdApply("kubectl", tf, ioStreams) + cmd.Flags().Set("filename", filenamePodGeneratedName) + cmd.Flags().Set("dry-run", "client") + cmd.Run(cmd, []string{}) +} diff --git a/staging/src/k8s.io/kubectl/testdata/apply/pod-generated-name.yaml b/staging/src/k8s.io/kubectl/testdata/apply/pod-generated-name.yaml new file mode 100644 index 00000000000..35ff7aff473 --- /dev/null +++ b/staging/src/k8s.io/kubectl/testdata/apply/pod-generated-name.yaml @@ -0,0 +1,8 @@ +kind: Pod +apiVersion: v1 +metadata: + generateName: testing- +spec: + containers: + - image: nginx + name: nginx