pkg/conversions/pod_conversion.go (73 lines of code) (raw):
// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may
// not use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
package conversions
import (
"fmt"
corev1 "k8s.io/api/core/v1"
metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/tools/cache"
)
// PodConverter implements the interface to convert k8s pod object to a stripped down
// version of pod to save on memory utilized
type podConverter struct {
podResource string
podResourceType runtime.Object
}
// NewPodConverter returns podConverter object
func NewPodConverter() *podConverter {
return &podConverter{
podResource: "pods",
podResourceType: &corev1.Pod{},
}
}
// ConvertObject converts original pod object to stripped down pod object
func (c *podConverter) ConvertObject(originalObj interface{}) (convertedObj interface{}, err error) {
pod, ok := originalObj.(*corev1.Pod)
if ok {
return c.stripDownPod(pod), nil
}
if deleteTombstone, ok := originalObj.(cache.DeletedFinalStateUnknown); ok {
pod, ok = deleteTombstone.Obj.(*corev1.Pod)
if ok {
//the object on a DeletedFinalStateUnknown will be from the cache we don't need to strip it again
return pod, nil
}
}
return nil, fmt.Errorf("failed to convert object to pod")
}
// ConvertList converts the original pod list to stripped down list of pod objects
func (c *podConverter) ConvertList(originalList interface{}) (convertedList interface{}, err error) {
podList, ok := originalList.(*corev1.PodList)
if !ok {
return nil, fmt.Errorf("failed to convert object to pod list")
}
// We need to set continue in order to allow the pagination to work on converted
// pod list object
strippedPodList := corev1.PodList{
ListMeta: metaV1.ListMeta{
Continue: podList.Continue,
ResourceVersion: podList.ResourceVersion,
},
}
for _, pod := range podList.Items {
strippedPod := c.stripDownPod(&pod)
strippedPodList.Items = append(strippedPodList.Items, *strippedPod)
}
return &strippedPodList, nil
}
// Resource to watch and list
func (c *podConverter) Resource() string {
return c.podResource
}
// ResourceType to watch and list
func (c *podConverter) ResourceType() runtime.Object {
return c.podResourceType
}
// StripDownPod removes all the extra details from pod that are not
// required by the controller.
func (c *podConverter) stripDownPod(pod *corev1.Pod) *corev1.Pod {
return &corev1.Pod{
ObjectMeta: metaV1.ObjectMeta{
Name: pod.Name,
Namespace: pod.Namespace,
Labels: pod.Labels,
DeletionTimestamp: pod.DeletionTimestamp,
},
Spec: corev1.PodSpec{
NodeName: pod.Spec.NodeName,
RestartPolicy: pod.Spec.RestartPolicy,
},
Status: corev1.PodStatus{
Conditions: pod.Status.Conditions,
Phase: pod.Status.Phase,
PodIP: pod.Status.PodIP,
},
}
}