@@ -5,22 +5,46 @@ package mutation
5
5
6
6
import (
7
7
"context"
8
- "strings"
9
8
9
+ apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
10
+ "k8s.io/apimachinery/pkg/runtime"
11
+ "k8s.io/apimachinery/pkg/runtime/serializer"
12
+ bootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1"
13
+ controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1"
10
14
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
15
+ "sigs.k8s.io/cluster-api/exp/runtime/topologymutation"
16
+ "sigs.k8s.io/controller-runtime/pkg/client"
11
17
12
18
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers"
13
19
)
14
20
21
+ type MetaMutater interface {
22
+ Mutate (
23
+ ctx context.Context ,
24
+ obj runtime.Object ,
25
+ vars map [string ]apiextensionsv1.JSON ,
26
+ holderRef runtimehooksv1.HolderReference ,
27
+ clusterKey client.ObjectKey ,
28
+ ) error
29
+ }
30
+
15
31
type metaGeneratePatches struct {
16
- name string
17
- wrappedHandlers []GeneratePatches
32
+ name string
33
+ decoder runtime.Decoder
34
+ mutaters []MetaMutater
18
35
}
19
36
20
- func NewMetaGeneratePatchesHandler (name string , gp ... GeneratePatches ) handlers.Named {
37
+ func NewMetaGeneratePatchesHandler (name string , m ... MetaMutater ) handlers.Named {
38
+ scheme := runtime .NewScheme ()
39
+ _ = bootstrapv1 .AddToScheme (scheme )
40
+ _ = controlplanev1 .AddToScheme (scheme )
21
41
return metaGeneratePatches {
22
- name : name ,
23
- wrappedHandlers : gp ,
42
+ name : name ,
43
+ decoder : serializer .NewCodecFactory (scheme ).UniversalDecoder (
44
+ controlplanev1 .GroupVersion ,
45
+ bootstrapv1 .GroupVersion ,
46
+ ),
47
+ mutaters : m ,
24
48
}
25
49
}
26
50
@@ -33,20 +57,26 @@ func (mgp metaGeneratePatches) GeneratePatches(
33
57
req * runtimehooksv1.GeneratePatchesRequest ,
34
58
resp * runtimehooksv1.GeneratePatchesResponse ,
35
59
) {
36
- for _ , h := range mgp .wrappedHandlers {
37
- wrappedResp := & runtimehooksv1.GeneratePatchesResponse {}
38
- h .GeneratePatches (ctx , req , wrappedResp )
39
- resp .Items = append (resp .Items , wrappedResp .Items ... )
40
- if wrappedResp .Message != "" {
41
- resp .Message = strings .TrimPrefix (resp .Message + "\n " + wrappedResp .Message , "\n " )
42
- }
43
- resp .Status = wrappedResp .Status
44
- if resp .Status == runtimehooksv1 .ResponseStatusFailure {
45
- return
46
- }
47
- }
60
+ clusterKey := handlers .ClusterKeyFromReq (req )
48
61
49
- if resp .Status == "" {
50
- resp .Status = runtimehooksv1 .ResponseStatusSuccess
51
- }
62
+ topologymutation .WalkTemplates (
63
+ ctx ,
64
+ mgp .decoder ,
65
+ req ,
66
+ resp ,
67
+ func (
68
+ ctx context.Context ,
69
+ obj runtime.Object ,
70
+ vars map [string ]apiextensionsv1.JSON ,
71
+ holderRef runtimehooksv1.HolderReference ,
72
+ ) error {
73
+ for _ , h := range mgp .mutaters {
74
+ if err := h .Mutate (ctx , obj , vars , holderRef , clusterKey ); err != nil {
75
+ return err
76
+ }
77
+ }
78
+
79
+ return nil
80
+ },
81
+ )
52
82
}
0 commit comments