@@ -17,8 +17,10 @@ limitations under the License.
17
17
package client
18
18
19
19
import (
20
+ "bytes"
20
21
"context"
21
22
"errors"
23
+ "io"
22
24
"strconv"
23
25
"time"
24
26
@@ -27,6 +29,8 @@ import (
27
29
. "github.com/onsi/gomega"
28
30
"helm.sh/helm/v3/pkg/action"
29
31
"helm.sh/helm/v3/pkg/chartutil"
32
+ "helm.sh/helm/v3/pkg/kube"
33
+ "helm.sh/helm/v3/pkg/postrender"
30
34
"helm.sh/helm/v3/pkg/release"
31
35
"helm.sh/helm/v3/pkg/releaseutil"
32
36
"helm.sh/helm/v3/pkg/storage/driver"
@@ -36,6 +40,7 @@ import (
36
40
"k8s.io/apimachinery/pkg/api/meta"
37
41
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
38
42
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
43
+ "k8s.io/apimachinery/pkg/runtime"
39
44
"k8s.io/apimachinery/pkg/runtime/schema"
40
45
apitypes "k8s.io/apimachinery/pkg/types"
41
46
"k8s.io/apimachinery/pkg/util/rand"
@@ -78,12 +83,15 @@ var _ = Describe("ActionClient", func() {
78
83
79
84
var (
80
85
actionConfigGetter ActionConfigGetter
86
+ cli kube.Interface
81
87
obj client.Object
82
88
)
83
89
BeforeEach (func () {
84
90
var err error
85
91
actionConfigGetter , err = NewActionConfigGetter (cfg , rm , logr .Discard ())
86
92
Expect (err ).ShouldNot (HaveOccurred ())
93
+ cli = kube .New (newRESTClientGetter (cfg , rm , "" ))
94
+ Expect (err ).ShouldNot (HaveOccurred ())
87
95
obj = testutil .BuildTestCR (gvk )
88
96
})
89
97
@@ -236,6 +244,40 @@ var _ = Describe("ActionClient", func() {
236
244
})
237
245
Expect (err ).To (MatchError (ContainSubstring (expectErr .Error ())))
238
246
247
+ // Uninstall the chart to cleanup for other tests.
248
+ _ , err = ac .Uninstall (obj .GetName ())
249
+ Expect (err ).To (BeNil ())
250
+ })
251
+ It ("should get clients with postrenderers" , func () {
252
+
253
+ acg , err := NewActionClientGetter (actionConfigGetter , AppendPostRenderers (newMockPostRenderer ("foo" , "bar" )))
254
+ Expect (err ).To (BeNil ())
255
+ Expect (acg ).NotTo (BeNil ())
256
+
257
+ ac , err := acg .ActionClientFor (obj )
258
+ Expect (err ).To (BeNil ())
259
+
260
+ _ , err = ac .Install (obj .GetName (), obj .GetNamespace (), & chrt , chartutil.Values {})
261
+ Expect (err ).To (BeNil ())
262
+
263
+ rel , err := ac .Get (obj .GetName ())
264
+ Expect (err ).To (BeNil ())
265
+
266
+ rl , err := cli .Build (bytes .NewBufferString (rel .Manifest ), false )
267
+ Expect (err ).To (BeNil ())
268
+
269
+ Expect (rl ).NotTo (BeEmpty ())
270
+ err = rl .Visit (func (info * resource.Info , err error ) error {
271
+ Expect (err ).To (BeNil ())
272
+ Expect (info .Object ).NotTo (BeNil ())
273
+ objMeta , err := meta .Accessor (info .Object )
274
+ Expect (err ).To (BeNil ())
275
+ Expect (objMeta .GetAnnotations ()).To (HaveKey ("foo" ))
276
+ Expect (objMeta .GetAnnotations ()["foo" ]).To (Equal ("bar" ))
277
+ return nil
278
+ })
279
+ Expect (err ).To (BeNil ())
280
+
239
281
// Uninstall the chart to cleanup for other tests.
240
282
_ , err = ac .Uninstall (obj .GetName ())
241
283
Expect (err ).To (BeNil ())
@@ -807,3 +849,66 @@ func newTestDeployment(containers []v1.Container) *appsv1.Deployment {
807
849
},
808
850
}
809
851
}
852
+
853
+ type mockPostRenderer struct {
854
+ k8sCli kube.Interface
855
+ key string
856
+ value string
857
+ }
858
+
859
+ var _ postrender.PostRenderer = & mockPostRenderer {}
860
+
861
+ func newMockPostRenderer (key , value string ) PostRendererProvider {
862
+ return func (rm meta.RESTMapper , kubeClient kube.Interface , obj client.Object ) postrender.PostRenderer {
863
+ return & mockPostRenderer {
864
+ k8sCli : kubeClient ,
865
+ key : key ,
866
+ value : value ,
867
+ }
868
+ }
869
+ }
870
+
871
+ func (m * mockPostRenderer ) Run (renderedManifests * bytes.Buffer ) (modifiedManifests * bytes.Buffer , err error ) {
872
+ b , err := io .ReadAll (renderedManifests )
873
+ if err != nil {
874
+ return nil , err
875
+ }
876
+ rl , err := m .k8sCli .Build (bytes .NewBuffer (b ), false )
877
+ if err != nil {
878
+ return nil , err
879
+ }
880
+ out := bytes.Buffer {}
881
+ if err := rl .Visit (m .visit (& out )); err != nil {
882
+ return nil , err
883
+ }
884
+ return & out , nil
885
+ }
886
+
887
+ func (m * mockPostRenderer ) visit (out * bytes.Buffer ) func (r * resource.Info , err error ) error {
888
+ return func (r * resource.Info , rErr error ) error {
889
+ if rErr != nil {
890
+ return rErr
891
+ }
892
+ objMap , err := runtime .DefaultUnstructuredConverter .ToUnstructured (r .Object )
893
+ if err != nil {
894
+ return err
895
+ }
896
+ u := & unstructured.Unstructured {Object : objMap }
897
+
898
+ annotations := u .GetAnnotations ()
899
+ if annotations == nil {
900
+ annotations = map [string ]string {}
901
+ }
902
+ annotations [m .key ] = m .value
903
+ u .SetAnnotations (annotations )
904
+
905
+ outData , err := yaml .Marshal (u .Object )
906
+ if err != nil {
907
+ return err
908
+ }
909
+ if _ , err := out .WriteString ("---\n " + string (outData )); err != nil {
910
+ return err
911
+ }
912
+ return nil
913
+ }
914
+ }
0 commit comments