@@ -33,6 +33,8 @@ import (
33
33
v1 "k8s.io/client-go/kubernetes/typed/core/v1"
34
34
"k8s.io/client-go/rest"
35
35
"sigs.k8s.io/controller-runtime/pkg/client"
36
+
37
+ customstorage "github.com/operator-framework/helm-operator-plugins/pkg/storage"
36
38
)
37
39
38
40
type ActionConfigGetter interface {
@@ -57,14 +59,25 @@ func NewActionConfigGetter(baseRestConfig *rest.Config, rm meta.RESTMapper, opts
57
59
if acg .objectToClientNamespace == nil {
58
60
acg .objectToClientNamespace = getObjectNamespace
59
61
}
60
- if acg .objectToStorageNamespace == nil {
61
- acg .objectToStorageNamespace = getObjectNamespace
62
+ if acg .objectToClientRestConfig == nil {
63
+ acg .objectToClientRestConfig = func (_ context.Context , _ client.Object , baseRestConfig * rest.Config ) (* rest.Config , error ) {
64
+ return rest .CopyConfig (baseRestConfig ), nil
65
+ }
62
66
}
63
- if acg .objectToRestConfig == nil {
64
- acg .objectToRestConfig = func (_ context.Context , _ client.Object , baseRestConfig * rest.Config ) (* rest.Config , error ) {
67
+ if acg .objectToStorageRestConfig == nil {
68
+ acg .objectToStorageRestConfig = func (_ context.Context , _ client.Object , baseRestConfig * rest.Config ) (* rest.Config , error ) {
65
69
return rest .CopyConfig (baseRestConfig ), nil
66
70
}
67
71
}
72
+ if acg .objectToStorageDriver == nil {
73
+ if acg .objectToStorageNamespace == nil {
74
+ acg .objectToStorageNamespace = getObjectNamespace
75
+ }
76
+ acg .objectToStorageDriver = DefaultSecretsStorageDriver (SecretsStorageDriverOpts {
77
+ DisableOwnerRefInjection : acg .disableStorageOwnerRefInjection ,
78
+ StorageNamespaceMapper : acg .objectToStorageNamespace ,
79
+ })
80
+ }
68
81
return acg , nil
69
82
}
70
83
@@ -73,28 +86,52 @@ var _ ActionConfigGetter = &actionConfigGetter{}
73
86
type ActionConfigGetterOption func (getter * actionConfigGetter )
74
87
75
88
type ObjectToStringMapper func (client.Object ) (string , error )
89
+ type ObjectToRestConfigMapper func (context.Context , client.Object , * rest.Config ) (* rest.Config , error )
90
+ type ObjectToStorageDriverMapper func (context.Context , client.Object , * rest.Config ) (driver.Driver , error )
91
+
92
+ func ClientRestConfigMapper (f ObjectToRestConfigMapper ) ActionConfigGetterOption {
93
+ return func (getter * actionConfigGetter ) {
94
+ getter .objectToClientRestConfig = f
95
+ }
96
+ }
76
97
77
98
func ClientNamespaceMapper (m ObjectToStringMapper ) ActionConfigGetterOption { // nolint:revive
78
99
return func (getter * actionConfigGetter ) {
79
100
getter .objectToClientNamespace = m
80
101
}
81
102
}
82
103
104
+ func StorageRestConfigMapper (f ObjectToRestConfigMapper ) ActionConfigGetterOption {
105
+ return func (getter * actionConfigGetter ) {
106
+ getter .objectToStorageRestConfig = f
107
+ }
108
+ }
109
+
110
+ func StorageDriverMapper (f ObjectToStorageDriverMapper ) ActionConfigGetterOption {
111
+ return func (getter * actionConfigGetter ) {
112
+ getter .objectToStorageDriver = f
113
+ }
114
+ }
115
+
116
+ // Deprecated: use StorageDriverMapper(DefaultSecretsStorageDriver(SecretsStorageDriverOpts)) instead.
83
117
func StorageNamespaceMapper (m ObjectToStringMapper ) ActionConfigGetterOption {
84
118
return func (getter * actionConfigGetter ) {
85
119
getter .objectToStorageNamespace = m
86
120
}
87
121
}
88
122
123
+ // Deprecated: use StorageDriverMapper(DefaultSecretsStorageDriver(SecretsStorageDriverOpts)) instead.
89
124
func DisableStorageOwnerRefInjection (v bool ) ActionConfigGetterOption {
90
125
return func (getter * actionConfigGetter ) {
91
126
getter .disableStorageOwnerRefInjection = v
92
127
}
93
128
}
94
129
95
- func RestConfigMapper (f func (context.Context , client.Object , * rest.Config ) (* rest.Config , error )) ActionConfigGetterOption {
130
+ // Deprecated: use ClientRestConfigMapper and StorageRestConfigMapper instead.
131
+ func RestConfigMapper (f ObjectToRestConfigMapper ) ActionConfigGetterOption {
96
132
return func (getter * actionConfigGetter ) {
97
- getter .objectToRestConfig = f
133
+ getter .objectToClientRestConfig = f
134
+ getter .objectToStorageRestConfig = f
98
135
}
99
136
}
100
137
@@ -107,58 +144,54 @@ type actionConfigGetter struct {
107
144
restMapper meta.RESTMapper
108
145
discoveryClient discovery.CachedDiscoveryInterface
109
146
110
- objectToClientNamespace ObjectToStringMapper
111
- objectToStorageNamespace ObjectToStringMapper
112
- objectToRestConfig func (context.Context , client.Object , * rest.Config ) (* rest.Config , error )
147
+ objectToClientRestConfig ObjectToRestConfigMapper
148
+ objectToClientNamespace ObjectToStringMapper
149
+
150
+ objectToStorageRestConfig ObjectToRestConfigMapper
151
+ objectToStorageDriver ObjectToStorageDriverMapper
152
+
153
+ // Deprecated: only keep around for backward compatibility with StorageNamespaceMapper option.
154
+ objectToStorageNamespace ObjectToStringMapper
155
+ // Deprecated: only keep around for backward compatibility with DisableStorageOwnerRefInjection option.
113
156
disableStorageOwnerRefInjection bool
114
157
}
115
158
116
159
func (acg * actionConfigGetter ) ActionConfigFor (ctx context.Context , obj client.Object ) (* action.Configuration , error ) {
117
- storageNs , err := acg .objectToStorageNamespace ( obj )
160
+ clientRestConfig , err := acg .objectToClientRestConfig ( ctx , obj , acg . baseRestConfig )
118
161
if err != nil {
119
- return nil , fmt .Errorf ("get storage namespace for object: %v" , err )
120
- }
121
-
122
- restConfig , err := acg .objectToRestConfig (ctx , obj , acg .baseRestConfig )
123
- if err != nil {
124
- return nil , fmt .Errorf ("get rest config for object: %v" , err )
162
+ return nil , fmt .Errorf ("get client rest config for object: %v" , err )
125
163
}
126
164
127
165
clientNamespace , err := acg .objectToClientNamespace (obj )
128
166
if err != nil {
129
167
return nil , fmt .Errorf ("get client namespace for object: %v" , err )
130
168
}
131
169
132
- rcg := newRESTClientGetter (restConfig , acg .restMapper , acg .discoveryClient , clientNamespace )
133
- kc := kube .New (rcg )
134
- kc .Namespace = clientNamespace
170
+ clientRCG := newRESTClientGetter (clientRestConfig , acg .restMapper , acg .discoveryClient , clientNamespace )
171
+ clientKC := kube .New (clientRCG )
172
+ clientKC .Namespace = clientNamespace
173
+
174
+ // Setup the debug log function that Helm will use
175
+ debugLog := getDebugLogger (ctx )
135
176
136
- kcs , err := kc . Factory . KubernetesClientSet ( )
177
+ storageRestConfig , err := acg . objectToStorageRestConfig ( ctx , obj , acg . baseRestConfig )
137
178
if err != nil {
138
- return nil , fmt .Errorf ("create kubernetes clientset : %v" , err )
179
+ return nil , fmt .Errorf ("get storage rest config for object : %v" , err )
139
180
}
140
181
141
- // Setup the debug log function that Helm will use
142
- debugLog := getDebugLogger (ctx )
182
+ d , err := acg .objectToStorageDriver (ctx , obj , storageRestConfig )
183
+ if err != nil {
184
+ return nil , fmt .Errorf ("get storage driver for object: %v" , err )
143
185
144
- secretClient := kcs .CoreV1 ().Secrets (storageNs )
145
- if ! acg .disableStorageOwnerRefInjection {
146
- ownerRef := metav1 .NewControllerRef (obj , obj .GetObjectKind ().GroupVersionKind ())
147
- secretClient = & ownerRefSecretClient {
148
- SecretInterface : secretClient ,
149
- refs : []metav1.OwnerReference {* ownerRef },
150
- }
151
186
}
152
- d := driver .NewSecrets (secretClient )
153
- d .Log = debugLog
154
187
155
188
// Initialize the storage backend
156
189
s := storage .Init (d )
157
190
158
191
return & action.Configuration {
159
- RESTClientGetter : rcg ,
192
+ RESTClientGetter : clientRCG ,
160
193
Releases : s ,
161
- KubeClient : kc ,
194
+ KubeClient : clientKC ,
162
195
Log : debugLog ,
163
196
}, nil
164
197
}
@@ -177,15 +210,82 @@ var _ v1.SecretInterface = &ownerRefSecretClient{}
177
210
178
211
type ownerRefSecretClient struct {
179
212
v1.SecretInterface
180
- refs []metav1.OwnerReference
213
+ match func (secret * corev1.Secret ) bool
214
+ refs []metav1.OwnerReference
181
215
}
182
216
183
217
func (c * ownerRefSecretClient ) Create (ctx context.Context , in * corev1.Secret , opts metav1.CreateOptions ) (* corev1.Secret , error ) {
184
- in .OwnerReferences = append (in .OwnerReferences , c .refs ... )
218
+ if c .match == nil || c .match (in ) {
219
+ in .OwnerReferences = append (in .OwnerReferences , c .refs ... )
220
+ }
185
221
return c .SecretInterface .Create (ctx , in , opts )
186
222
}
187
223
188
224
func (c * ownerRefSecretClient ) Update (ctx context.Context , in * corev1.Secret , opts metav1.UpdateOptions ) (* corev1.Secret , error ) {
189
- in .OwnerReferences = append (in .OwnerReferences , c .refs ... )
225
+ if c .match == nil || c .match (in ) {
226
+ in .OwnerReferences = append (in .OwnerReferences , c .refs ... )
227
+ }
190
228
return c .SecretInterface .Update (ctx , in , opts )
191
229
}
230
+
231
+ type SecretsStorageDriverOpts struct {
232
+ DisableOwnerRefInjection bool
233
+ StorageNamespaceMapper ObjectToStringMapper
234
+ }
235
+
236
+ func DefaultSecretsStorageDriver (opts SecretsStorageDriverOpts ) ObjectToStorageDriverMapper {
237
+ if opts .StorageNamespaceMapper == nil {
238
+ opts .StorageNamespaceMapper = getObjectNamespace
239
+ }
240
+ return func (ctx context.Context , obj client.Object , restConfig * rest.Config ) (driver.Driver , error ) {
241
+ storageNamespace , err := opts .StorageNamespaceMapper (obj )
242
+ if err != nil {
243
+ return nil , fmt .Errorf ("get storage namespace for object: %v" , err )
244
+ }
245
+ secretsInterface , err := v1 .NewForConfig (restConfig )
246
+ if err != nil {
247
+ return nil , fmt .Errorf ("create secrets client for storage: %v" , err )
248
+ }
249
+
250
+ secretClient := secretsInterface .Secrets (storageNamespace )
251
+ if ! opts .DisableOwnerRefInjection {
252
+ ownerRef := metav1 .NewControllerRef (obj , obj .GetObjectKind ().GroupVersionKind ())
253
+ secretClient = & ownerRefSecretClient {
254
+ SecretInterface : secretClient ,
255
+ refs : []metav1.OwnerReference {* ownerRef },
256
+ }
257
+ }
258
+ d := driver .NewSecrets (secretClient )
259
+ d .Log = getDebugLogger (ctx )
260
+ return d , nil
261
+ }
262
+ }
263
+
264
+ func ChunkedSecretsStorageDriver (owner string , chunkSize int , opts SecretsStorageDriverOpts ) ObjectToStorageDriverMapper {
265
+ if opts .StorageNamespaceMapper == nil {
266
+ opts .StorageNamespaceMapper = getObjectNamespace
267
+ }
268
+ return func (ctx context.Context , obj client.Object , restConfig * rest.Config ) (driver.Driver , error ) {
269
+ storageNamespace , err := opts .StorageNamespaceMapper (obj )
270
+ if err != nil {
271
+ return nil , fmt .Errorf ("get storage namespace for object: %v" , err )
272
+ }
273
+ secretsInterface , err := v1 .NewForConfig (restConfig )
274
+ if err != nil {
275
+ return nil , fmt .Errorf ("create secrets client for storage: %v" , err )
276
+ }
277
+
278
+ secretClient := secretsInterface .Secrets (storageNamespace )
279
+ if ! opts .DisableOwnerRefInjection {
280
+ ownerRef := metav1 .NewControllerRef (obj , obj .GetObjectKind ().GroupVersionKind ())
281
+ secretClient = & ownerRefSecretClient {
282
+ SecretInterface : secretClient ,
283
+ match : func (secret * corev1.Secret ) bool { return secret .Type == customstorage .SecretTypeChunkedIndex },
284
+ refs : []metav1.OwnerReference {* ownerRef },
285
+ }
286
+ }
287
+ d := customstorage .NewChunkedSecrets (secretClient , chunkSize , owner )
288
+ d .Log = getDebugLogger (ctx )
289
+ return d , nil
290
+ }
291
+ }
0 commit comments