From 0e8029b27731312593cfc338a95862d3f160224c Mon Sep 17 00:00:00 2001 From: Lee Verberne Date: Fri, 9 Apr 2021 13:53:13 +0200 Subject: [PATCH 1/2] Switch ephemeralcontainers SR to Pod Kind This changes the `/ephemeralcontainers` subresource of `/pods` to use the `Pod` kind rather than `EphemeralContainers`. When designing this API initially it seemed preferable to create a new kind containing only the pod's ephemeral containers, similar to how binding and scaling work. It later became clear that this made admission control more difficult because the controller wouldn't be presented with the entire Pod, so we updated this to operate on the entire Pod, similar to how `/status` works. Kubernetes-commit: d22dc5cb72a627341f4004b5d58d275f3d8773b3 --- kubernetes/typed/core/v1/pod.go | 59 ++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/kubernetes/typed/core/v1/pod.go b/kubernetes/typed/core/v1/pod.go index 14b7bd0f..6692e454 100644 --- a/kubernetes/typed/core/v1/pod.go +++ b/kubernetes/typed/core/v1/pod.go @@ -258,31 +258,72 @@ func (c *pods) ApplyStatus(ctx context.Context, pod *corev1.PodApplyConfiguratio return } +func ephemeralContainersInPod(pod *v1.Pod) *v1.EphemeralContainers { + ephemeralContainers := pod.Spec.EphemeralContainers + if ephemeralContainers == nil { + ephemeralContainers = []v1.EphemeralContainer{} + } + return &v1.EphemeralContainers{ + ObjectMeta: metav1.ObjectMeta{ + Name: pod.Name, + Namespace: pod.Namespace, + UID: pod.UID, + ResourceVersion: pod.ResourceVersion, + CreationTimestamp: pod.CreationTimestamp, + }, + EphemeralContainers: ephemeralContainers, + } + +} + // GetEphemeralContainers takes name of the pod, and returns the corresponding v1.EphemeralContainers object, and an error if there is any. -func (c *pods) GetEphemeralContainers(ctx context.Context, podName string, options metav1.GetOptions) (result *v1.EphemeralContainers, err error) { - result = &v1.EphemeralContainers{} - err = c.client.Get(). +func (c *pods) GetEphemeralContainers(ctx context.Context, podName string, options metav1.GetOptions) (*v1.EphemeralContainers, error) { + pod := &v1.Pod{} + err := c.client.Get(). Namespace(c.ns). Resource("pods"). Name(podName). SubResource("ephemeralcontainers"). VersionedParams(&options, scheme.ParameterCodec). Do(ctx). - Into(result) - return + Into(pod) + + if err != nil { + return nil, err + } + + return ephemeralContainersInPod(pod), nil } // UpdateEphemeralContainers takes the top resource name and the representation of a ephemeralContainers and updates it. Returns the server's representation of the ephemeralContainers, and an error, if there is any. -func (c *pods) UpdateEphemeralContainers(ctx context.Context, podName string, ephemeralContainers *v1.EphemeralContainers, opts metav1.UpdateOptions) (result *v1.EphemeralContainers, err error) { - result = &v1.EphemeralContainers{} +func (c *pods) UpdateEphemeralContainers(ctx context.Context, podName string, ephemeralContainers *v1.EphemeralContainers, opts metav1.UpdateOptions) (*v1.EphemeralContainers, error) { + pod := &v1.Pod{} + err := c.client.Get(). + Namespace(c.ns). + Resource("pods"). + Name(podName). + SubResource("ephemeralcontainers"). + VersionedParams(&metav1.GetOptions{}, scheme.ParameterCodec). + Do(ctx). + Into(pod) + if err != nil { + return nil, err + } + + result := &v1.Pod{} + pod.Spec.EphemeralContainers = ephemeralContainers.EphemeralContainers err = c.client.Put(). Namespace(c.ns). Resource("pods"). Name(podName). SubResource("ephemeralcontainers"). VersionedParams(&opts, scheme.ParameterCodec). - Body(ephemeralContainers). + Body(pod). Do(ctx). Into(result) - return + if err != nil { + return nil, err + } + + return ephemeralContainersInPod(pod), nil } From 2d8ed52d608184cdbe05be2398e824c11699fd92 Mon Sep 17 00:00:00 2001 From: Lee Verberne Date: Mon, 12 Apr 2021 17:28:29 +0200 Subject: [PATCH 2/2] Generated code for Pod-based ephemeralcontainers Kubernetes-commit: d8ee5ab09e0a0f476e2fe07014a453f572fb53a3 --- kubernetes/typed/core/v1/fake/fake_pod.go | 19 ++----- kubernetes/typed/core/v1/pod.go | 66 ++--------------------- 2 files changed, 9 insertions(+), 76 deletions(-) diff --git a/kubernetes/typed/core/v1/fake/fake_pod.go b/kubernetes/typed/core/v1/fake/fake_pod.go index 601cc82d..94312ce3 100644 --- a/kubernetes/typed/core/v1/fake/fake_pod.go +++ b/kubernetes/typed/core/v1/fake/fake_pod.go @@ -189,24 +189,13 @@ func (c *FakePods) ApplyStatus(ctx context.Context, pod *applyconfigurationscore return obj.(*corev1.Pod), err } -// GetEphemeralContainers takes name of the pod, and returns the corresponding ephemeralContainers object, and an error if there is any. -func (c *FakePods) GetEphemeralContainers(ctx context.Context, podName string, options v1.GetOptions) (result *corev1.EphemeralContainers, err error) { +// UpdateEphemeralContainers takes the representation of a pod and updates it. Returns the server's representation of the pod, and an error, if there is any. +func (c *FakePods) UpdateEphemeralContainers(ctx context.Context, podName string, pod *corev1.Pod, opts v1.UpdateOptions) (result *corev1.Pod, err error) { obj, err := c.Fake. - Invokes(testing.NewGetSubresourceAction(podsResource, c.ns, "ephemeralcontainers", podName), &corev1.EphemeralContainers{}) + Invokes(testing.NewUpdateSubresourceAction(podsResource, "ephemeralcontainers", c.ns, pod), &corev1.Pod{}) if obj == nil { return nil, err } - return obj.(*corev1.EphemeralContainers), err -} - -// UpdateEphemeralContainers takes the representation of a ephemeralContainers and updates it. Returns the server's representation of the ephemeralContainers, and an error, if there is any. -func (c *FakePods) UpdateEphemeralContainers(ctx context.Context, podName string, ephemeralContainers *corev1.EphemeralContainers, opts v1.UpdateOptions) (result *corev1.EphemeralContainers, err error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateSubresourceAction(podsResource, "ephemeralcontainers", c.ns, ephemeralContainers), &corev1.EphemeralContainers{}) - - if obj == nil { - return nil, err - } - return obj.(*corev1.EphemeralContainers), err + return obj.(*corev1.Pod), err } diff --git a/kubernetes/typed/core/v1/pod.go b/kubernetes/typed/core/v1/pod.go index 6692e454..63122cf3 100644 --- a/kubernetes/typed/core/v1/pod.go +++ b/kubernetes/typed/core/v1/pod.go @@ -52,8 +52,7 @@ type PodInterface interface { Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Pod, err error) Apply(ctx context.Context, pod *corev1.PodApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Pod, err error) ApplyStatus(ctx context.Context, pod *corev1.PodApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Pod, err error) - GetEphemeralContainers(ctx context.Context, podName string, options metav1.GetOptions) (*v1.EphemeralContainers, error) - UpdateEphemeralContainers(ctx context.Context, podName string, ephemeralContainers *v1.EphemeralContainers, opts metav1.UpdateOptions) (*v1.EphemeralContainers, error) + UpdateEphemeralContainers(ctx context.Context, podName string, pod *v1.Pod, opts metav1.UpdateOptions) (*v1.Pod, error) PodExpansion } @@ -258,60 +257,9 @@ func (c *pods) ApplyStatus(ctx context.Context, pod *corev1.PodApplyConfiguratio return } -func ephemeralContainersInPod(pod *v1.Pod) *v1.EphemeralContainers { - ephemeralContainers := pod.Spec.EphemeralContainers - if ephemeralContainers == nil { - ephemeralContainers = []v1.EphemeralContainer{} - } - return &v1.EphemeralContainers{ - ObjectMeta: metav1.ObjectMeta{ - Name: pod.Name, - Namespace: pod.Namespace, - UID: pod.UID, - ResourceVersion: pod.ResourceVersion, - CreationTimestamp: pod.CreationTimestamp, - }, - EphemeralContainers: ephemeralContainers, - } - -} - -// GetEphemeralContainers takes name of the pod, and returns the corresponding v1.EphemeralContainers object, and an error if there is any. -func (c *pods) GetEphemeralContainers(ctx context.Context, podName string, options metav1.GetOptions) (*v1.EphemeralContainers, error) { - pod := &v1.Pod{} - err := c.client.Get(). - Namespace(c.ns). - Resource("pods"). - Name(podName). - SubResource("ephemeralcontainers"). - VersionedParams(&options, scheme.ParameterCodec). - Do(ctx). - Into(pod) - - if err != nil { - return nil, err - } - - return ephemeralContainersInPod(pod), nil -} - -// UpdateEphemeralContainers takes the top resource name and the representation of a ephemeralContainers and updates it. Returns the server's representation of the ephemeralContainers, and an error, if there is any. -func (c *pods) UpdateEphemeralContainers(ctx context.Context, podName string, ephemeralContainers *v1.EphemeralContainers, opts metav1.UpdateOptions) (*v1.EphemeralContainers, error) { - pod := &v1.Pod{} - err := c.client.Get(). - Namespace(c.ns). - Resource("pods"). - Name(podName). - SubResource("ephemeralcontainers"). - VersionedParams(&metav1.GetOptions{}, scheme.ParameterCodec). - Do(ctx). - Into(pod) - if err != nil { - return nil, err - } - - result := &v1.Pod{} - pod.Spec.EphemeralContainers = ephemeralContainers.EphemeralContainers +// UpdateEphemeralContainers takes the top resource name and the representation of a pod and updates it. Returns the server's representation of the pod, and an error, if there is any. +func (c *pods) UpdateEphemeralContainers(ctx context.Context, podName string, pod *v1.Pod, opts metav1.UpdateOptions) (result *v1.Pod, err error) { + result = &v1.Pod{} err = c.client.Put(). Namespace(c.ns). Resource("pods"). @@ -321,9 +269,5 @@ func (c *pods) UpdateEphemeralContainers(ctx context.Context, podName string, ep Body(pod). Do(ctx). Into(result) - if err != nil { - return nil, err - } - - return ephemeralContainersInPod(pod), nil + return }