105 lines
3.0 KiB
Go
105 lines
3.0 KiB
Go
package fedinformer
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
|
|
corev1 "k8s.io/api/core/v1"
|
|
"k8s.io/apimachinery/pkg/api/meta"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/client-go/tools/cache"
|
|
)
|
|
|
|
// StripUnusedFields is the transform function for shared informers,
|
|
// it removes unused fields from objects before they are stored in the cache to save memory.
|
|
func StripUnusedFields(obj interface{}) (interface{}, error) {
|
|
if tombstone, ok := obj.(cache.DeletedFinalStateUnknown); ok {
|
|
obj = tombstone.Obj
|
|
}
|
|
|
|
accessor, err := meta.Accessor(obj)
|
|
if err != nil {
|
|
// shouldn't happen
|
|
return obj, nil
|
|
}
|
|
// ManagedFields is large and we never use it
|
|
accessor.SetManagedFields(nil)
|
|
return obj, nil
|
|
}
|
|
|
|
// NodeTransformFunc is the dedicated transform function for Node objects.
|
|
// It cleans up some parts of the object before it will be put into the controller
|
|
// cache to reduce memory usage.
|
|
//
|
|
// Note: this function removes most of the fields, please make sure your controller
|
|
// doesn't care for the removed fields, especially when use in shared informers.
|
|
func NodeTransformFunc(obj interface{}) (interface{}, error) {
|
|
var node *corev1.Node
|
|
switch t := obj.(type) {
|
|
case *corev1.Node:
|
|
node = t
|
|
case cache.DeletedFinalStateUnknown:
|
|
var ok bool
|
|
node, ok = t.Obj.(*corev1.Node)
|
|
if !ok {
|
|
return obj, fmt.Errorf("expect resource Node but got %v", reflect.TypeOf(t.Obj))
|
|
}
|
|
default:
|
|
return obj, fmt.Errorf("expect resource Node but got %v", reflect.TypeOf(obj))
|
|
}
|
|
|
|
aggregatedNode := &corev1.Node{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: node.Name,
|
|
},
|
|
Status: corev1.NodeStatus{
|
|
Allocatable: node.Status.Allocatable,
|
|
Conditions: node.Status.Conditions,
|
|
},
|
|
}
|
|
return aggregatedNode, nil
|
|
}
|
|
|
|
// PodTransformFunc is the dedicated transform function for Pod objects.
|
|
// It cleans up some parts of the object before it will be put into the controller
|
|
// cache to reduce memory usage.
|
|
//
|
|
// Note: this function removes most of the fields, please make sure your controller
|
|
// doesn't care for the removed fields, especially when use in shared informers.
|
|
func PodTransformFunc(obj interface{}) (interface{}, error) {
|
|
var pod *corev1.Pod
|
|
switch t := obj.(type) {
|
|
case *corev1.Pod:
|
|
pod = t
|
|
case cache.DeletedFinalStateUnknown:
|
|
var ok bool
|
|
pod, ok = t.Obj.(*corev1.Pod)
|
|
if !ok {
|
|
return obj, fmt.Errorf("expect resource Pod but got %v", reflect.TypeOf(t.Obj))
|
|
}
|
|
default:
|
|
return obj, fmt.Errorf("expect resource Pod but got %v", reflect.TypeOf(obj))
|
|
}
|
|
|
|
aggregatedPod := &corev1.Pod{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: pod.Name,
|
|
Namespace: pod.Namespace,
|
|
Labels: pod.Labels,
|
|
DeletionTimestamp: pod.DeletionTimestamp,
|
|
},
|
|
Spec: corev1.PodSpec{
|
|
NodeName: pod.Spec.NodeName,
|
|
InitContainers: pod.Spec.InitContainers,
|
|
Containers: pod.Spec.Containers,
|
|
Overhead: pod.Spec.Overhead,
|
|
},
|
|
Status: corev1.PodStatus{
|
|
Phase: pod.Status.Phase,
|
|
Conditions: pod.Status.Conditions,
|
|
StartTime: pod.Status.StartTime,
|
|
},
|
|
}
|
|
return aggregatedPod, nil
|
|
}
|