mirror of https://github.com/containers/podman.git
Merge pull request #19914 from umohnani8/term
Add support for kube TerminationGracePeriodSeconds
This commit is contained in:
commit
325736fcb7
|
|
@ -33,7 +33,7 @@ Note: **N/A** means that the option cannot be supported in a single-node Podman
|
||||||
| topologySpreadConstraints\.labelSelector | N/A |
|
| topologySpreadConstraints\.labelSelector | N/A |
|
||||||
| topologySpreadConstraints\.minDomains | N/A |
|
| topologySpreadConstraints\.minDomains | N/A |
|
||||||
| restartPolicy | ✅ |
|
| restartPolicy | ✅ |
|
||||||
| terminationGracePeriod | no |
|
| terminationGracePeriodSeconds | ✅ |
|
||||||
| activeDeadlineSeconds | no |
|
| activeDeadlineSeconds | no |
|
||||||
| readinessGates\.conditionType | no |
|
| readinessGates\.conditionType | no |
|
||||||
| hostname | ✅ |
|
| hostname | ✅ |
|
||||||
|
|
|
||||||
|
|
@ -435,7 +435,10 @@ func (p *Pod) podWithContainers(ctx context.Context, containers []*Container, po
|
||||||
podInitCtrs := []v1.Container{}
|
podInitCtrs := []v1.Container{}
|
||||||
podAnnotations := make(map[string]string)
|
podAnnotations := make(map[string]string)
|
||||||
dnsInfo := v1.PodDNSConfig{}
|
dnsInfo := v1.PodDNSConfig{}
|
||||||
var hostname string
|
var (
|
||||||
|
hostname string
|
||||||
|
stopTimeout *uint
|
||||||
|
)
|
||||||
|
|
||||||
// Let's sort the containers in order of created time
|
// Let's sort the containers in order of created time
|
||||||
// This will ensure that the init containers are defined in the correct order in the kube yaml
|
// This will ensure that the init containers are defined in the correct order in the kube yaml
|
||||||
|
|
@ -463,6 +466,12 @@ func (p *Pod) podWithContainers(ctx context.Context, containers []*Container, po
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pick the first container that has a stop-timeout set and use that value
|
||||||
|
// Ignore podman's default
|
||||||
|
if ctr.config.StopTimeout != util.DefaultContainerConfig().Engine.StopTimeout && stopTimeout == nil {
|
||||||
|
stopTimeout = &ctr.config.StopTimeout
|
||||||
|
}
|
||||||
|
|
||||||
ctr, volumes, _, annotations, err := containerToV1Container(ctx, ctr, getService)
|
ctr, volumes, _, annotations, err := containerToV1Container(ctx, ctr, getService)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -536,10 +545,11 @@ func (p *Pod) podWithContainers(ctx context.Context, containers []*Container, po
|
||||||
&dnsInfo,
|
&dnsInfo,
|
||||||
hostNetwork,
|
hostNetwork,
|
||||||
hostUsers,
|
hostUsers,
|
||||||
hostname), nil
|
hostname,
|
||||||
|
stopTimeout), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func newPodObject(podName string, annotations map[string]string, initCtrs, containers []v1.Container, volumes []v1.Volume, dnsOptions *v1.PodDNSConfig, hostNetwork, hostUsers bool, hostname string) *v1.Pod {
|
func newPodObject(podName string, annotations map[string]string, initCtrs, containers []v1.Container, volumes []v1.Volume, dnsOptions *v1.PodDNSConfig, hostNetwork, hostUsers bool, hostname string, stopTimeout *uint) *v1.Pod {
|
||||||
tm := v12.TypeMeta{
|
tm := v12.TypeMeta{
|
||||||
Kind: "Pod",
|
Kind: "Pod",
|
||||||
APIVersion: "v1",
|
APIVersion: "v1",
|
||||||
|
|
@ -571,6 +581,10 @@ func newPodObject(podName string, annotations map[string]string, initCtrs, conta
|
||||||
if dnsOptions != nil && (len(dnsOptions.Nameservers)+len(dnsOptions.Searches)+len(dnsOptions.Options) > 0) {
|
if dnsOptions != nil && (len(dnsOptions.Nameservers)+len(dnsOptions.Searches)+len(dnsOptions.Options) > 0) {
|
||||||
ps.DNSConfig = dnsOptions
|
ps.DNSConfig = dnsOptions
|
||||||
}
|
}
|
||||||
|
if stopTimeout != nil {
|
||||||
|
terminationGracePeriod := int64(*stopTimeout)
|
||||||
|
ps.TerminationGracePeriodSeconds = &terminationGracePeriod
|
||||||
|
}
|
||||||
p := v1.Pod{
|
p := v1.Pod{
|
||||||
TypeMeta: tm,
|
TypeMeta: tm,
|
||||||
ObjectMeta: om,
|
ObjectMeta: om,
|
||||||
|
|
@ -590,8 +604,11 @@ func simplePodWithV1Containers(ctx context.Context, ctrs []*Container, getServic
|
||||||
podDNS := v1.PodDNSConfig{}
|
podDNS := v1.PodDNSConfig{}
|
||||||
kubeAnnotations := make(map[string]string)
|
kubeAnnotations := make(map[string]string)
|
||||||
ctrNames := make([]string, 0, len(ctrs))
|
ctrNames := make([]string, 0, len(ctrs))
|
||||||
var hostname string
|
var (
|
||||||
var restartPolicy *string
|
hostname string
|
||||||
|
restartPolicy *string
|
||||||
|
stopTimeout *uint
|
||||||
|
)
|
||||||
for _, ctr := range ctrs {
|
for _, ctr := range ctrs {
|
||||||
ctrNames = append(ctrNames, removeUnderscores(ctr.Name()))
|
ctrNames = append(ctrNames, removeUnderscores(ctr.Name()))
|
||||||
for k, v := range ctr.config.Spec.Annotations {
|
for k, v := range ctr.config.Spec.Annotations {
|
||||||
|
|
@ -616,6 +633,12 @@ func simplePodWithV1Containers(ctx context.Context, ctrs []*Container, getServic
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pick the first container that has a stop-timeout set and use that value
|
||||||
|
// Ignore podman's default
|
||||||
|
if ctr.config.StopTimeout != util.DefaultContainerConfig().Engine.StopTimeout && stopTimeout == nil {
|
||||||
|
stopTimeout = &ctr.config.StopTimeout
|
||||||
|
}
|
||||||
|
|
||||||
// Use the restart policy of the first non-init container
|
// Use the restart policy of the first non-init container
|
||||||
if !isInit && restartPolicy == nil {
|
if !isInit && restartPolicy == nil {
|
||||||
restartPolicy = &ctr.config.RestartPolicy
|
restartPolicy = &ctr.config.RestartPolicy
|
||||||
|
|
@ -707,7 +730,8 @@ func simplePodWithV1Containers(ctx context.Context, ctrs []*Container, getServic
|
||||||
&podDNS,
|
&podDNS,
|
||||||
hostNetwork,
|
hostNetwork,
|
||||||
hostUsers,
|
hostUsers,
|
||||||
hostname)
|
hostname,
|
||||||
|
stopTimeout)
|
||||||
|
|
||||||
// Set the pod's restart policy
|
// Set the pod's restart policy
|
||||||
policy := ""
|
policy := ""
|
||||||
|
|
|
||||||
|
|
@ -855,6 +855,10 @@ func (ic *ContainerEngine) playKubePod(ctx context.Context, podName string, podY
|
||||||
Volumes: volumes,
|
Volumes: volumes,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if podYAML.Spec.TerminationGracePeriodSeconds != nil {
|
||||||
|
specgenOpts.TerminationGracePeriodSeconds = podYAML.Spec.TerminationGracePeriodSeconds
|
||||||
|
}
|
||||||
|
|
||||||
specGen, err := kube.ToSpecGen(ctx, &specgenOpts)
|
specGen, err := kube.ToSpecGen(ctx, &specgenOpts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
|
|
|
||||||
|
|
@ -168,6 +168,8 @@ type CtrSpecGenOptions struct {
|
||||||
InitContainerType string
|
InitContainerType string
|
||||||
// PodSecurityContext is the security context specified for the pod
|
// PodSecurityContext is the security context specified for the pod
|
||||||
PodSecurityContext *v1.PodSecurityContext
|
PodSecurityContext *v1.PodSecurityContext
|
||||||
|
// TerminationGracePeriodSeconds is the grace period given to a container to stop before being forcefully killed
|
||||||
|
TerminationGracePeriodSeconds *int64
|
||||||
}
|
}
|
||||||
|
|
||||||
func ToSpecGen(ctx context.Context, opts *CtrSpecGenOptions) (*specgen.SpecGenerator, error) {
|
func ToSpecGen(ctx context.Context, opts *CtrSpecGenOptions) (*specgen.SpecGenerator, error) {
|
||||||
|
|
@ -584,6 +586,12 @@ func ToSpecGen(ctx context.Context, opts *CtrSpecGenOptions) (*specgen.SpecGener
|
||||||
s.Labels[systemdDefine.EnvVariable] = unit
|
s.Labels[systemdDefine.EnvVariable] = unit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the stopTimeout if terminationGracePeriodSeconds is set in the kube yaml
|
||||||
|
if opts.TerminationGracePeriodSeconds != nil {
|
||||||
|
timeout := uint(*opts.TerminationGracePeriodSeconds)
|
||||||
|
s.StopTimeout = &timeout
|
||||||
|
}
|
||||||
|
|
||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ var _ = Describe("Podman kube generate", func() {
|
||||||
Expect(pod.Spec.Containers[0].SecurityContext).To(BeNil())
|
Expect(pod.Spec.Containers[0].SecurityContext).To(BeNil())
|
||||||
Expect(pod.Spec.Containers[0].Env).To(BeNil())
|
Expect(pod.Spec.Containers[0].Env).To(BeNil())
|
||||||
Expect(pod).To(HaveField("Name", "top-pod"))
|
Expect(pod).To(HaveField("Name", "top-pod"))
|
||||||
|
Expect(pod.Spec.TerminationGracePeriodSeconds).To(BeNil())
|
||||||
|
|
||||||
numContainers := 0
|
numContainers := 0
|
||||||
for range pod.Spec.Containers {
|
for range pod.Spec.Containers {
|
||||||
|
|
@ -1880,4 +1881,25 @@ EXPOSE 2004-2005/tcp`, ALPINE)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(pod.Annotations).To(BeEmpty())
|
Expect(pod.Annotations).To(BeEmpty())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("podman generate kube on pod with --stop-timeout set for ctr", func() {
|
||||||
|
podName := "test-pod"
|
||||||
|
podSession := podmanTest.Podman([]string{"pod", "create", podName})
|
||||||
|
podSession.WaitWithDefaultTimeout()
|
||||||
|
Expect(podSession).Should(Exit(0))
|
||||||
|
|
||||||
|
session := podmanTest.Podman([]string{"create", "--pod", podName, "--stop-timeout", "20", ALPINE, "top"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session).Should(Exit(0))
|
||||||
|
|
||||||
|
kube := podmanTest.Podman([]string{"generate", "kube", podName})
|
||||||
|
kube.WaitWithDefaultTimeout()
|
||||||
|
Expect(kube).Should(Exit(0))
|
||||||
|
|
||||||
|
// TerminationGracePeriodSeconds should be set to 20
|
||||||
|
pod := new(v1.Pod)
|
||||||
|
err := yaml.Unmarshal(kube.Out.Contents(), pod)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(int(*pod.Spec.TerminationGracePeriodSeconds)).To(Equal(20))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -5991,4 +5991,27 @@ EXPOSE 2004-2005/tcp`, ALPINE)
|
||||||
Expect(inspect).Should(Exit(0))
|
Expect(inspect).Should(Exit(0))
|
||||||
Expect(inspect.OutputToString()).To(ContainSubstring(`FOO=bar`))
|
Expect(inspect.OutputToString()).To(ContainSubstring(`FOO=bar`))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("podman kube play with TerminationGracePeriodSeconds set", func() {
|
||||||
|
ctrName := "ctr"
|
||||||
|
ctrNameInPod := "ctr-pod-ctr"
|
||||||
|
outputFile := filepath.Join(podmanTest.TempDir, "pod.yaml")
|
||||||
|
|
||||||
|
create := podmanTest.Podman([]string{"create", "--restart", "never", "--stop-timeout", "20", "--name", ctrName, ALPINE})
|
||||||
|
create.WaitWithDefaultTimeout()
|
||||||
|
Expect(create).Should(Exit(0))
|
||||||
|
|
||||||
|
generate := podmanTest.Podman([]string{"kube", "generate", "-f", outputFile, ctrName})
|
||||||
|
generate.WaitWithDefaultTimeout()
|
||||||
|
Expect(generate).Should(Exit(0))
|
||||||
|
|
||||||
|
play := podmanTest.Podman([]string{"kube", "play", outputFile})
|
||||||
|
play.WaitWithDefaultTimeout()
|
||||||
|
Expect(play).Should(Exit(0))
|
||||||
|
|
||||||
|
inspect := podmanTest.Podman([]string{"inspect", ctrNameInPod, "-f", "{{ .Config.StopTimeout }}"})
|
||||||
|
inspect.WaitWithDefaultTimeout()
|
||||||
|
Expect(inspect).Should(Exit(0))
|
||||||
|
Expect(inspect.OutputToString()).To(Equal("20"))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue