1
16
17 package internal
18
19 import (
20 "fmt"
21 "math/rand"
22
23 "k8s.io/apimachinery/pkg/api/meta"
24 "k8s.io/apimachinery/pkg/runtime"
25 )
26
27 type skipNonAppliedManager struct {
28 fieldManager Manager
29 objectCreater runtime.ObjectCreater
30 beforeApplyManagerName string
31 probability float32
32 }
33
34 var _ Manager = &skipNonAppliedManager{}
35
36
37 func NewSkipNonAppliedManager(fieldManager Manager, objectCreater runtime.ObjectCreater) Manager {
38 return NewProbabilisticSkipNonAppliedManager(fieldManager, objectCreater, 0.0)
39 }
40
41
42
43 func NewProbabilisticSkipNonAppliedManager(fieldManager Manager, objectCreater runtime.ObjectCreater, p float32) Manager {
44 return &skipNonAppliedManager{
45 fieldManager: fieldManager,
46 objectCreater: objectCreater,
47 beforeApplyManagerName: "before-first-apply",
48 probability: p,
49 }
50 }
51
52
53 func (f *skipNonAppliedManager) Update(liveObj, newObj runtime.Object, managed Managed, manager string) (runtime.Object, Managed, error) {
54 accessor, err := meta.Accessor(liveObj)
55 if err != nil {
56 return newObj, managed, nil
57 }
58
59
60 if len(managed.Fields()) == 0 {
61
62
63
64 if len(accessor.GetUID()) == 0 {
65 if f.probability <= rand.Float32() {
66 return newObj, managed, nil
67 }
68 } else {
69 return newObj, managed, nil
70 }
71 }
72 return f.fieldManager.Update(liveObj, newObj, managed, manager)
73 }
74
75
76 func (f *skipNonAppliedManager) Apply(liveObj, appliedObj runtime.Object, managed Managed, fieldManager string, force bool) (runtime.Object, Managed, error) {
77 if len(managed.Fields()) == 0 {
78 gvk := appliedObj.GetObjectKind().GroupVersionKind()
79 emptyObj, err := f.objectCreater.New(gvk)
80 if err != nil {
81 return nil, nil, fmt.Errorf("failed to create empty object of type %v: %v", gvk, err)
82 }
83 liveObj, managed, err = f.fieldManager.Update(emptyObj, liveObj, managed, f.beforeApplyManagerName)
84 if err != nil {
85 return nil, nil, fmt.Errorf("failed to create manager for existing fields: %v", err)
86 }
87 }
88 return f.fieldManager.Apply(liveObj, appliedObj, managed, fieldManager, force)
89 }
90
View as plain text