...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package resourceoverrides
16
17 import (
18 "context"
19
20 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/k8s"
21 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/resourceoverrides/operations"
22
23 "github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
24 apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
25 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
26 "k8s.io/apimachinery/pkg/runtime/schema"
27 )
28
29
30
31 type CRDDecorate func(crd *apiextensions.CustomResourceDefinition) error
32
33
34
35 type PreActuationTransform func(r *k8s.Resource) error
36
37
38
39 type PostActuationTransform func(original, reconciled *k8s.Resource, tfState *terraform.InstanceState, dclState *unstructured.Unstructured) error
40
41
42 type ConfigValidate func(r *unstructured.Unstructured) error
43
44
45
46 type PreTerraformExport func(ctx context.Context, op *operations.TerraformExport) error
47
48
49 type PostUpdateStatusTransform func(r *k8s.Resource) error
50
51
52
53
54 type ResourceOverride struct {
55 CRDDecorate CRDDecorate
56 ConfigValidate ConfigValidate
57 PreActuationTransform PreActuationTransform
58 PostActuationTransform PostActuationTransform
59 PreTerraformExport PreTerraformExport
60 PostUpdateStatusTransform PostUpdateStatusTransform
61 }
62
63 type ResourceOverrides struct {
64 Kind string
65 Overrides []ResourceOverride
66 }
67
68 type ResourceOverridesHandler struct {
69 overridesPerKindMap map[string]ResourceOverrides
70 }
71
72 func NewResourceOverridesHandler() *ResourceOverridesHandler {
73 return &ResourceOverridesHandler{
74 overridesPerKindMap: make(map[string]ResourceOverrides),
75 }
76 }
77
78 var Handler = NewResourceOverridesHandler()
79
80 func (h *ResourceOverridesHandler) CRDDecorate(crd *apiextensions.CustomResourceDefinition) error {
81 kind := crd.Spec.Names.Kind
82 ro, found := h.registration(kind)
83 if !found {
84 return nil
85 }
86 for _, o := range ro.Overrides {
87 if o.CRDDecorate != nil {
88 if err := o.CRDDecorate(crd); err != nil {
89 return err
90 }
91 }
92 }
93 return nil
94 }
95
96 func (h *ResourceOverridesHandler) ConfigValidate(r *unstructured.Unstructured) error {
97 kind := r.GetKind()
98 ro, found := h.registration(kind)
99 if !found {
100 return nil
101 }
102 for _, o := range ro.Overrides {
103 if o.ConfigValidate != nil {
104 if err := o.ConfigValidate(r); err != nil {
105 return err
106 }
107 }
108 }
109 return nil
110 }
111
112 func (h *ResourceOverridesHandler) PreActuationTransform(r *k8s.Resource) error {
113 ro, found := h.registration(r.Kind)
114 if !found {
115 return nil
116 }
117 for _, o := range ro.Overrides {
118 if o.PreActuationTransform != nil {
119 if err := o.PreActuationTransform(r); err != nil {
120 return err
121 }
122 }
123 }
124 return nil
125 }
126
127 func (h *ResourceOverridesHandler) PostActuationTransform(original, post *k8s.Resource, tfState *terraform.InstanceState, dclState *unstructured.Unstructured) error {
128 ro, found := h.registration(original.Kind)
129 if !found {
130 return nil
131 }
132 for _, o := range ro.Overrides {
133 if o.PostActuationTransform != nil {
134 if err := o.PostActuationTransform(original, post, tfState, dclState); err != nil {
135 return err
136 }
137 }
138 }
139 return nil
140 }
141
142 func (h *ResourceOverridesHandler) PreTerraformExport(ctx context.Context, gvk schema.GroupVersionKind, op *operations.TerraformExport) error {
143 kind := gvk.Kind
144 ro, found := h.registration(kind)
145 if !found {
146 return nil
147 }
148 for _, o := range ro.Overrides {
149 if o.PreTerraformExport != nil {
150 if err := o.PreTerraformExport(ctx, op); err != nil {
151 return err
152 }
153 }
154 }
155 return nil
156 }
157
158 func (h *ResourceOverridesHandler) PostUpdateStatusTransform(r *k8s.Resource) error {
159 ro, found := h.registration(r.Kind)
160 if !found {
161 return nil
162 }
163 for _, o := range ro.Overrides {
164 if o.PostUpdateStatusTransform != nil {
165 if err := o.PostUpdateStatusTransform(r); err != nil {
166 return err
167 }
168 }
169 }
170 return nil
171 }
172
173 func (h *ResourceOverridesHandler) HasOverrides(kind string) bool {
174 _, found := h.registration(kind)
175 return found
176 }
177
178 func (h *ResourceOverridesHandler) HasConfigValidate(kind string) bool {
179 ro, found := h.registration(kind)
180 if !found {
181 return false
182 }
183 for _, o := range ro.Overrides {
184 if o.ConfigValidate != nil {
185 return true
186 }
187 }
188 return false
189 }
190
191 func (h *ResourceOverridesHandler) registration(kind string) (*ResourceOverrides, bool) {
192 ro, found := h.overridesPerKindMap[kind]
193 if !found {
194 return nil, false
195 }
196 return &ro, found
197 }
198
199 func (h *ResourceOverridesHandler) Register(ro ResourceOverrides) {
200 h.overridesPerKindMap[ro.Kind] = ro
201 }
202
203 func init() {
204 Handler.Register(GetStorageBucketResourceOverrides())
205 Handler.Register(GetSQLInstanceResourceOverrides())
206 Handler.Register(GetContainerClusterResourceOverrides())
207 Handler.Register(GetLoggingLogSinkResourceOverrides())
208 Handler.Register(GetComputeInstanceResourceOverrides())
209 Handler.Register(GetDNSRecordSetOverrides())
210 Handler.Register(GetComputeBackendServiceResourceOverrides())
211 Handler.Register(GetVPCAccessConnectorResourceOverrides())
212
213
214 Handler.Register(GetIAMCustomRoleResourceOverrides())
215 }
216
View as plain text