1
16
17 package testing
18
19 import (
20 "errors"
21 "fmt"
22
23 "k8s.io/apimachinery/pkg/api/meta"
24 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
26 "k8s.io/apimachinery/pkg/runtime"
27 "k8s.io/apimachinery/pkg/runtime/schema"
28 "k8s.io/apimachinery/pkg/util/managedfields"
29 "k8s.io/apimachinery/pkg/util/managedfields/internal"
30 )
31
32
33
34 type FakeObjectCreater struct{}
35
36 func (f *FakeObjectCreater) New(gvk schema.GroupVersionKind) (runtime.Object, error) {
37 u := unstructured.Unstructured{Object: map[string]interface{}{}}
38 u.SetAPIVersion(gvk.GroupVersion().String())
39 u.SetKind(gvk.Kind)
40 return &u, nil
41 }
42
43
44
45 type FakeObjectConvertor struct{}
46
47
48 func (c *FakeObjectConvertor) Convert(in, out, context interface{}) error {
49 out = in
50 return nil
51 }
52
53 func (c *FakeObjectConvertor) ConvertToVersion(in runtime.Object, _ runtime.GroupVersioner) (runtime.Object, error) {
54 return in, nil
55 }
56
57 func (c *FakeObjectConvertor) ConvertFieldLabel(_ schema.GroupVersionKind, _, _ string) (string, string, error) {
58 return "", "", errors.New("not implemented")
59 }
60
61
62
63 type FakeObjectDefaulter struct{}
64
65 func (d *FakeObjectDefaulter) Default(in runtime.Object) {}
66
67 type TestFieldManagerImpl struct {
68 fieldManager *internal.FieldManager
69 apiVersion string
70 emptyObj runtime.Object
71 liveObj runtime.Object
72 }
73
74
75 func (f *TestFieldManagerImpl) APIVersion() string {
76 return f.apiVersion
77 }
78
79
80 func (f *TestFieldManagerImpl) Reset() {
81 f.liveObj = f.emptyObj.DeepCopyObject()
82 }
83
84
85 func (f *TestFieldManagerImpl) Live() runtime.Object {
86 return f.liveObj.DeepCopyObject()
87 }
88
89
90
91 func (f *TestFieldManagerImpl) Apply(obj runtime.Object, manager string, force bool) error {
92 out, err := f.fieldManager.Apply(f.liveObj, obj, manager, force)
93 if err == nil {
94 f.liveObj = out
95 }
96 return err
97 }
98
99
100
101 func (f *TestFieldManagerImpl) Update(obj runtime.Object, manager string) error {
102 out, err := f.fieldManager.Update(f.liveObj, obj, manager)
103 if err == nil {
104 f.liveObj = out
105 }
106 return err
107 }
108
109
110
111 func (f *TestFieldManagerImpl) ManagedFields() []metav1.ManagedFieldsEntry {
112 accessor, err := meta.Accessor(f.liveObj)
113 if err != nil {
114 panic(fmt.Errorf("couldn't get accessor: %v", err))
115 }
116
117 return accessor.GetManagedFields()
118 }
119
120
121 func NewTestFieldManagerImpl(typeConverter managedfields.TypeConverter, gvk schema.GroupVersionKind, subresource string, chainFieldManager func(internal.Manager) internal.Manager) *TestFieldManagerImpl {
122 f, err := internal.NewStructuredMergeManager(
123 typeConverter,
124 &FakeObjectConvertor{},
125 &FakeObjectDefaulter{},
126 gvk.GroupVersion(),
127 gvk.GroupVersion(),
128 nil,
129 )
130 if err != nil {
131 panic(err)
132 }
133 live := &unstructured.Unstructured{}
134 live.SetKind(gvk.Kind)
135 live.SetAPIVersion(gvk.GroupVersion().String())
136
137
138
139
140 f = internal.NewVersionCheckManager(
141 internal.NewLastAppliedUpdater(
142 internal.NewLastAppliedManager(
143 internal.NewProbabilisticSkipNonAppliedManager(
144 internal.NewBuildManagerInfoManager(
145 internal.NewManagedFieldsUpdater(
146 internal.NewStripMetaManager(f),
147 ), gvk.GroupVersion(), subresource,
148 ), &FakeObjectCreater{}, internal.DefaultTrackOnCreateProbability,
149 ), typeConverter, &FakeObjectConvertor{}, gvk.GroupVersion(),
150 ),
151 ), gvk,
152 )
153 if chainFieldManager != nil {
154 f = chainFieldManager(f)
155 }
156 return &TestFieldManagerImpl{
157 fieldManager: internal.NewFieldManager(f, subresource),
158 apiVersion: gvk.GroupVersion().String(),
159 emptyObj: live,
160 liveObj: live.DeepCopyObject(),
161 }
162 }
163
View as plain text