Skip to content

Commit

Permalink
podman generate kube should not include images command
Browse files Browse the repository at this point in the history
If the command came from the underlying image, then we should
not include it in the generate yaml file.

Fixes: containers#11672

Signed-off-by: Daniel J Walsh <[email protected]>
  • Loading branch information
rhatdan committed Sep 22, 2021
1 parent 420ff1d commit 45ee5c5
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 14 deletions.
33 changes: 23 additions & 10 deletions libpod/kube.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package libpod

import (
"context"
"fmt"
"math/rand"
"os"
"reflect"
"sort"
"strconv"
"strings"
Expand All @@ -27,14 +29,14 @@ import (

// GenerateForKube takes a slice of libpod containers and generates
// one v1.Pod description that includes just a single container.
func GenerateForKube(ctrs []*Container) (*v1.Pod, error) {
func GenerateForKube(ctx context.Context, ctrs []*Container) (*v1.Pod, error) {
// Generate the v1.Pod yaml description
return simplePodWithV1Containers(ctrs)
return simplePodWithV1Containers(ctx, ctrs)
}

// GenerateForKube takes a slice of libpod containers and generates
// one v1.Pod description
func (p *Pod) GenerateForKube() (*v1.Pod, []v1.ServicePort, error) {
func (p *Pod) GenerateForKube(ctx context.Context) (*v1.Pod, []v1.ServicePort, error) {
// Generate the v1.Pod yaml description
var (
ports []v1.ContainerPort //nolint
Expand Down Expand Up @@ -78,7 +80,7 @@ func (p *Pod) GenerateForKube() (*v1.Pod, []v1.ServicePort, error) {
servicePorts = containerPortsToServicePorts(ports)
hostNetwork = infraContainer.NetworkMode() == string(namespaces.NetworkMode(specgen.Host))
}
pod, err := p.podWithContainers(allContainers, ports, hostNetwork)
pod, err := p.podWithContainers(ctx, allContainers, ports, hostNetwork)
if err != nil {
return nil, servicePorts, err
}
Expand Down Expand Up @@ -218,7 +220,7 @@ func containersToServicePorts(containers []v1.Container) []v1.ServicePort {
return sps
}

func (p *Pod) podWithContainers(containers []*Container, ports []v1.ContainerPort, hostNetwork bool) (*v1.Pod, error) {
func (p *Pod) podWithContainers(ctx context.Context, containers []*Container, ports []v1.ContainerPort, hostNetwork bool) (*v1.Pod, error) {
deDupPodVolumes := make(map[string]*v1.Volume)
first := true
podContainers := make([]v1.Container, 0, len(containers))
Expand All @@ -239,7 +241,7 @@ func (p *Pod) podWithContainers(containers []*Container, ports []v1.ContainerPor

isInit := ctr.IsInitCtr()

ctr, volumes, _, err := containerToV1Container(ctr)
ctr, volumes, _, err := containerToV1Container(ctx, ctr)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -267,7 +269,7 @@ func (p *Pod) podWithContainers(containers []*Container, ports []v1.ContainerPor
deDupPodVolumes[vol.Name] = &vol
}
} else {
_, _, infraDNS, err := containerToV1Container(ctr)
_, _, infraDNS, err := containerToV1Container(ctx, ctr)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -337,7 +339,7 @@ func newPodObject(podName string, annotations map[string]string, initCtrs, conta

// simplePodWithV1Containers is a function used by inspect when kube yaml needs to be generated
// for a single container. we "insert" that container description in a pod.
func simplePodWithV1Containers(ctrs []*Container) (*v1.Pod, error) {
func simplePodWithV1Containers(ctx context.Context, ctrs []*Container) (*v1.Pod, error) {
kubeCtrs := make([]v1.Container, 0, len(ctrs))
kubeInitCtrs := []v1.Container{}
kubeVolumes := make([]v1.Volume, 0)
Expand All @@ -355,7 +357,7 @@ func simplePodWithV1Containers(ctrs []*Container) (*v1.Pod, error) {
if !ctr.HostNetwork() {
hostNetwork = false
}
kubeCtr, kubeVols, ctrDNS, err := containerToV1Container(ctr)
kubeCtr, kubeVols, ctrDNS, err := containerToV1Container(ctx, ctr)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -411,7 +413,7 @@ func simplePodWithV1Containers(ctrs []*Container) (*v1.Pod, error) {

// containerToV1Container converts information we know about a libpod container
// to a V1.Container specification.
func containerToV1Container(c *Container) (v1.Container, []v1.Volume, *v1.PodDNSConfig, error) {
func containerToV1Container(ctx context.Context, c *Container) (v1.Container, []v1.Volume, *v1.PodDNSConfig, error) {
kubeContainer := v1.Container{}
kubeVolumes := []v1.Volume{}
kubeSec, err := generateKubeSecurityContext(c)
Expand Down Expand Up @@ -463,6 +465,17 @@ func containerToV1Container(c *Container) (v1.Container, []v1.Volume, *v1.PodDNS
_, image := c.Image()
kubeContainer.Image = image
kubeContainer.Stdin = c.Stdin()
img, _, err := c.runtime.libimageRuntime.LookupImage(image, nil)
if err != nil {
return kubeContainer, kubeVolumes, nil, err
}
imgData, err := img.Inspect(ctx, false)
if err != nil {
return kubeContainer, kubeVolumes, nil, err
}
if reflect.DeepEqual(imgData.Config.Cmd, kubeContainer.Command) {
kubeContainer.Command = nil
}

kubeContainer.WorkingDir = c.WorkingDir()
kubeContainer.Ports = ports
Expand Down
8 changes: 4 additions & 4 deletions pkg/domain/infra/abi/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ func (ic *ContainerEngine) GenerateKube(ctx context.Context, nameOrIDs []string,

// Generate kube pods and services from pods.
if len(pods) >= 1 {
pos, svcs, err := getKubePods(pods, options.Service)
pos, svcs, err := getKubePods(ctx, pods, options.Service)
if err != nil {
return nil, err
}
Expand All @@ -120,7 +120,7 @@ func (ic *ContainerEngine) GenerateKube(ctx context.Context, nameOrIDs []string,

// Generate the kube pods from containers.
if len(ctrs) >= 1 {
po, err := libpod.GenerateForKube(ctrs)
po, err := libpod.GenerateForKube(ctx, ctrs)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -153,12 +153,12 @@ func (ic *ContainerEngine) GenerateKube(ctx context.Context, nameOrIDs []string,
}

// getKubePods returns kube pod and service YAML files from podman pods.
func getKubePods(pods []*libpod.Pod, getService bool) ([][]byte, [][]byte, error) {
func getKubePods(ctx context.Context, pods []*libpod.Pod, getService bool) ([][]byte, [][]byte, error) {
pos := [][]byte{}
svcs := [][]byte{}

for _, p := range pods {
po, sp, err := p.GenerateForKube()
po, sp, err := p.GenerateForKube(ctx)
if err != nil {
return nil, nil, err
}
Expand Down
39 changes: 39 additions & 0 deletions test/e2e/generate_kube_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -792,6 +792,45 @@ var _ = Describe("Podman generate kube", func() {
Expect(containers[0].Args).To(Equal([]string{"10s"}))
})

It("podman generate kube - no command", func() {
session := podmanTest.Podman([]string{"create", "--name", "test", ALPINE})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))

kube := podmanTest.Podman([]string{"generate", "kube", "test"})
kube.WaitWithDefaultTimeout()
Expect(kube).Should(Exit(0))

// Now make sure that the container's command is not set to the
// entrypoint and it's arguments to "10s".
pod := new(v1.Pod)
err := yaml.Unmarshal(kube.Out.Contents(), pod)
Expect(err).To(BeNil())

containers := pod.Spec.Containers
Expect(len(containers)).To(Equal(1))
Expect(len(containers[0].Command)).To(Equal(0))

cmd := []string{"echo", "hi"}
session = podmanTest.Podman(append([]string{"create", "--name", "test1", ALPINE}, cmd...))
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))

kube = podmanTest.Podman([]string{"generate", "kube", "test1"})
kube.WaitWithDefaultTimeout()
Expect(kube).Should(Exit(0))

// Now make sure that the container's command is not set to the
// entrypoint and it's arguments to "10s".
pod = new(v1.Pod)
err = yaml.Unmarshal(kube.Out.Contents(), pod)
Expect(err).To(BeNil())

containers = pod.Spec.Containers
Expect(len(containers)).To(Equal(1))
Expect(containers[0].Command).To(Equal(cmd))
})

It("podman generate kube - use entrypoint from image", func() {
// Build an image with an entrypoint.
containerfile := `FROM quay.io/libpod/alpine:latest
Expand Down

0 comments on commit 45ee5c5

Please sign in to comment.