From 098d8efecc6c9bb8a263a8dc1864273327fbb214 Mon Sep 17 00:00:00 2001 From: Oleksandr Krutko Date: Wed, 15 Oct 2025 23:37:03 +0300 Subject: [PATCH 1/3] add option to remove Pod name prefix in resulting container name Signed-off-by: Oleksandr Krutko --- cmd/podman/kube/play.go | 3 +++ docs/source/markdown/podman-kube-play.1.md.in | 4 ++++ pkg/domain/entities/play.go | 2 ++ pkg/domain/infra/abi/play.go | 1 + pkg/specgen/generate/kube/kube.go | 8 +++++++- 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/cmd/podman/kube/play.go b/cmd/podman/kube/play.go index cfa6f39495..c850641eaf 100644 --- a/cmd/podman/kube/play.go +++ b/cmd/podman/kube/play.go @@ -205,6 +205,9 @@ func playFlags(cmd *cobra.Command) { exitFlagName := "service-exit-code-propagation" flags.StringVar(&playOptions.ExitCodePropagation, exitFlagName, "", "Exit-code propagation of the service container") _ = flags.MarkHidden(exitFlagName) + + noPodPrefix := "no-pod-prefix" + flags.BoolVar(&playOptions.NoPodPrefix, noPodPrefix, false, "Don't use pod name as prefix in resulting container name.") } } diff --git a/docs/source/markdown/podman-kube-play.1.md.in b/docs/source/markdown/podman-kube-play.1.md.in index 0d4cbec4a6..1aef64c2a6 100644 --- a/docs/source/markdown/podman-kube-play.1.md.in +++ b/docs/source/markdown/podman-kube-play.1.md.in @@ -260,6 +260,10 @@ When no network option is specified and *host* network mode is not configured in This option conflicts with host added in the Kubernetes YAML. +#### **--no-pod-prefix** + +Don't use pod name as prefix in resulting container name. + #### **--publish**=*[[ip:][hostPort]:]containerPort[/protocol]* Define or override a port definition in the YAML file. diff --git a/pkg/domain/entities/play.go b/pkg/domain/entities/play.go index ae51bebd67..cc5a4fa5f5 100644 --- a/pkg/domain/entities/play.go +++ b/pkg/domain/entities/play.go @@ -81,6 +81,8 @@ type PlayKubeOptions struct { Wait bool // SystemContext - used when building the image SystemContext *types.SystemContext + // Don't use pod name as prefix in resulting container name. + NoPodPrefix bool } // PlayKubePod represents a single pod and associated containers created by play kube diff --git a/pkg/domain/infra/abi/play.go b/pkg/domain/infra/abi/play.go index 15d1a61aa4..bf41e73a44 100644 --- a/pkg/domain/infra/abi/play.go +++ b/pkg/domain/infra/abi/play.go @@ -1089,6 +1089,7 @@ func (ic *ContainerEngine) playKubePod(ctx context.Context, podName string, podY VolumesFrom: volumesFrom, ImageVolumes: automountImages, UtsNSIsHost: p.UtsNs.IsHost(), + NoPodPrefix: options.NoPodPrefix, } if podYAML.Spec.TerminationGracePeriodSeconds != nil { diff --git a/pkg/specgen/generate/kube/kube.go b/pkg/specgen/generate/kube/kube.go index 9fa93634c1..51a05130b3 100644 --- a/pkg/specgen/generate/kube/kube.go +++ b/pkg/specgen/generate/kube/kube.go @@ -185,6 +185,8 @@ type CtrSpecGenOptions struct { PodSecurityContext *v1.PodSecurityContext // TerminationGracePeriodSeconds is the grace period given to a container to stop before being forcefully killed TerminationGracePeriodSeconds *int64 + // Don't use pod name as prefix in resulting container name. + NoPodPrefix bool } func ToSpecGen(ctx context.Context, opts *CtrSpecGenOptions) (*specgen.SpecGenerator, error) { @@ -217,7 +219,11 @@ func ToSpecGen(ctx context.Context, opts *CtrSpecGenOptions) (*specgen.SpecGener return nil, errors.New("got empty pod name on container creation when playing kube") } - s.Name = fmt.Sprintf("%s-%s", opts.PodName, opts.Container.Name) + if opts.NoPodPrefix { + s.Name = opts.Container.Name + } else { + s.Name = fmt.Sprintf("%s-%s", opts.PodName, opts.Container.Name) + } s.Terminal = &opts.Container.TTY From f6dd05d9c49014d37e44f434edcaf6a0c726cc41 Mon Sep 17 00:00:00 2001 From: Oleksandr Krutko Date: Fri, 17 Oct 2025 01:11:41 +0300 Subject: [PATCH 2/3] add test for container name without Pod name prefix feature Signed-off-by: Oleksandr Krutko --- test/e2e/play_kube_test.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/e2e/play_kube_test.go b/test/e2e/play_kube_test.go index ed253a5aea..b1996961d0 100644 --- a/test/e2e/play_kube_test.go +++ b/test/e2e/play_kube_test.go @@ -6420,4 +6420,13 @@ spec: Expect(testfile).ToNot(BeAnExistingFile(), "file should never be created on the host") }) + + It("test container name without Pod name prefix", func() { + err := writeYaml(podnameEqualsContainerNameYaml, kubeYaml) + Expect(err).ToNot(HaveOccurred()) + + podmanTest.PodmanExitCleanly("kube", "play", "--no-pod-prefix", kubeYaml) + inspect := podmanTest.PodmanExitCleanly("inspect", "podnameEqualsContainerNameYaml") + Expect(inspect.InspectContainerToJSON()[0].Name).Should(Equal("podnameEqualsContainerNameYaml")) + }) }) From bb4fa066b3453b71b7d6000b4e4a871b9ce07787 Mon Sep 17 00:00:00 2001 From: Oleksandr Krutko Date: Fri, 17 Oct 2025 23:21:39 +0300 Subject: [PATCH 3/3] fix remote command parameters Signed-off-by: Oleksandr Krutko --- cmd/podman/kube/play.go | 6 +++--- docs/source/markdown/podman-kube-play.1.md.in | 2 +- pkg/api/handlers/libpod/kube.go | 2 ++ pkg/bindings/kube/types.go | 1 + pkg/bindings/kube/types_play_options.go | 15 +++++++++++++++ pkg/domain/entities/play.go | 2 +- pkg/domain/infra/tunnel/kube.go | 1 + test/e2e/play_kube_test.go | 19 ++++++++++++++++--- 8 files changed, 40 insertions(+), 8 deletions(-) diff --git a/cmd/podman/kube/play.go b/cmd/podman/kube/play.go index c850641eaf..c21dc6ef7c 100644 --- a/cmd/podman/kube/play.go +++ b/cmd/podman/kube/play.go @@ -176,6 +176,9 @@ func playFlags(cmd *cobra.Command) { flags.BoolVar(&playOptions.UseLongAnnotations, noTruncFlagName, false, "Use annotations that are not truncated to the Kubernetes maximum length of 63 characters") _ = flags.MarkHidden(noTruncFlagName) + noPodPrefix := "no-pod-prefix" + flags.BoolVar(&playOptions.NoPodPrefix, noPodPrefix, false, "Do not prefix container name with pod name") + if !registry.IsRemote() { certDirFlagName := "cert-dir" flags.StringVar(&playOptions.CertDir, certDirFlagName, "", "`Pathname` of a directory containing TLS certificates and keys") @@ -205,9 +208,6 @@ func playFlags(cmd *cobra.Command) { exitFlagName := "service-exit-code-propagation" flags.StringVar(&playOptions.ExitCodePropagation, exitFlagName, "", "Exit-code propagation of the service container") _ = flags.MarkHidden(exitFlagName) - - noPodPrefix := "no-pod-prefix" - flags.BoolVar(&playOptions.NoPodPrefix, noPodPrefix, false, "Don't use pod name as prefix in resulting container name.") } } diff --git a/docs/source/markdown/podman-kube-play.1.md.in b/docs/source/markdown/podman-kube-play.1.md.in index 1aef64c2a6..9876af730f 100644 --- a/docs/source/markdown/podman-kube-play.1.md.in +++ b/docs/source/markdown/podman-kube-play.1.md.in @@ -262,7 +262,7 @@ This option conflicts with host added in the Kubernetes YAML. #### **--no-pod-prefix** -Don't use pod name as prefix in resulting container name. +Do not prefix container name with pod name. #### **--publish**=*[[ip:][hostPort]:]containerPort[/protocol]* diff --git a/pkg/api/handlers/libpod/kube.go b/pkg/api/handlers/libpod/kube.go index 9e2f7ecbb4..6b6a47e2d0 100644 --- a/pkg/api/handlers/libpod/kube.go +++ b/pkg/api/handlers/libpod/kube.go @@ -123,6 +123,7 @@ func KubePlay(w http.ResponseWriter, r *http.Request) { Userns string `schema:"userns"` Wait bool `schema:"wait"` Build bool `schema:"build"` + NoPodPrefix bool `schema:"noPodPrefix"` }{ TLSVerify: true, Start: true, @@ -198,6 +199,7 @@ func KubePlay(w http.ResponseWriter, r *http.Request) { Userns: query.Userns, Wait: query.Wait, ContextDir: contextDirectory, + NoPodPrefix: query.NoPodPrefix, } if _, found := r.URL.Query()["build"]; found { options.Build = types.NewOptionalBool(query.Build) diff --git a/pkg/bindings/kube/types.go b/pkg/bindings/kube/types.go index c2e86a2dda..38c22b1c60 100644 --- a/pkg/bindings/kube/types.go +++ b/pkg/bindings/kube/types.go @@ -63,6 +63,7 @@ type PlayOptions struct { // Wait - indicates whether to return after having created the pods Wait *bool ServiceContainer *bool + NoPodPrefix *bool } // ApplyOptions are optional options for applying kube YAML files to a k8s cluster diff --git a/pkg/bindings/kube/types_play_options.go b/pkg/bindings/kube/types_play_options.go index e7c82eaf31..2323df08f0 100644 --- a/pkg/bindings/kube/types_play_options.go +++ b/pkg/bindings/kube/types_play_options.go @@ -407,3 +407,18 @@ func (o *PlayOptions) GetServiceContainer() bool { } return *o.ServiceContainer } + +// WithNoPodPrefix set field NoPodPrefix to given value +func (o *PlayOptions) WithNoPodPrefix(value bool) *PlayOptions { + o.NoPodPrefix = &value + return o +} + +// GetNoPodPrefix returns value of field NoPodPrefix +func (o *PlayOptions) GetNoPodPrefix() bool { + if o.NoPodPrefix == nil { + var z bool + return z + } + return *o.NoPodPrefix +} diff --git a/pkg/domain/entities/play.go b/pkg/domain/entities/play.go index cc5a4fa5f5..9df0dbda46 100644 --- a/pkg/domain/entities/play.go +++ b/pkg/domain/entities/play.go @@ -81,7 +81,7 @@ type PlayKubeOptions struct { Wait bool // SystemContext - used when building the image SystemContext *types.SystemContext - // Don't use pod name as prefix in resulting container name. + // Do not prefix container name with pod name NoPodPrefix bool } diff --git a/pkg/domain/infra/tunnel/kube.go b/pkg/domain/infra/tunnel/kube.go index 9e27c52957..e9198590dc 100644 --- a/pkg/domain/infra/tunnel/kube.go +++ b/pkg/domain/infra/tunnel/kube.go @@ -75,6 +75,7 @@ func (ic *ContainerEngine) PlayKube(_ context.Context, body io.Reader, opts enti options.WithPublishPorts(opts.PublishPorts) options.WithPublishAllPorts(opts.PublishAllPorts) options.WithNoTrunc(opts.UseLongAnnotations) + options.WithNoPodPrefix(opts.NoPodPrefix) return play.KubeWithBody(ic.ClientCtx, body, options) } diff --git a/test/e2e/play_kube_test.go b/test/e2e/play_kube_test.go index b1996961d0..6842d6d900 100644 --- a/test/e2e/play_kube_test.go +++ b/test/e2e/play_kube_test.go @@ -222,6 +222,19 @@ spec: - sleep - "3600"` +var simpleWithoutPodPrefixYaml = ` +apiVersion: v1 +kind: Pod +metadata: + name: libpod-test +spec: + containers: + - name: simpleWithoutPodPrefix + image: ` + CITEST_IMAGE + ` + command: + - sleep + - "3600"` + var unknownKindYaml = ` apiVersion: v1 kind: UnknownKind @@ -6422,11 +6435,11 @@ spec: }) It("test container name without Pod name prefix", func() { - err := writeYaml(podnameEqualsContainerNameYaml, kubeYaml) + err := writeYaml(simpleWithoutPodPrefixYaml, kubeYaml) Expect(err).ToNot(HaveOccurred()) podmanTest.PodmanExitCleanly("kube", "play", "--no-pod-prefix", kubeYaml) - inspect := podmanTest.PodmanExitCleanly("inspect", "podnameEqualsContainerNameYaml") - Expect(inspect.InspectContainerToJSON()[0].Name).Should(Equal("podnameEqualsContainerNameYaml")) + inspect := podmanTest.PodmanExitCleanly("inspect", "simpleWithoutPodPrefix") + Expect(inspect.InspectContainerToJSON()[0].Name).Should(Equal("simpleWithoutPodPrefix")) }) })