@@ -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 { // nolint:revive
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
130
+ // Deprecated: use ClientRestConfigMapper and StorageRestConfigMapper instead.
95
131
func RestConfigMapper (f func (context.Context , client.Object , * rest.Config ) (* rest.Config , error )) 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,53 @@ 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
135
-
136
- kcs , err := kc .Factory .KubernetesClientSet ()
137
- if err != nil {
138
- return nil , fmt .Errorf ("create kubernetes clientset: %v" , err )
139
- }
170
+ clientRCG := newRESTClientGetter (clientRestConfig , acg .restMapper , acg .discoveryClient , clientNamespace )
171
+ clientKC := kube .New (clientRCG )
172
+ clientKC .Namespace = clientNamespace
140
173
141
174
// Setup the debug log function that Helm will use
142
175
debugLog := getDebugLogger (ctx )
143
176
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
- }
177
+ storageRestConfig , err := acg .objectToStorageRestConfig (ctx , obj , acg .baseRestConfig )
178
+ if err != nil {
179
+ return nil , fmt .Errorf ("get storage rest config for object: %v" , err )
180
+ }
181
+
182
+ d , err := acg .objectToStorageDriver (ctx , obj , storageRestConfig )
183
+ if err != nil {
184
+ return nil , fmt .Errorf ("get storage driver for object: %v" , err )
151
185
}
152
- d := driver .NewSecrets (secretClient )
153
- d .Log = debugLog
154
186
155
187
// Initialize the storage backend
156
188
s := storage .Init (d )
157
189
158
190
return & action.Configuration {
159
- RESTClientGetter : rcg ,
191
+ RESTClientGetter : clientRCG ,
160
192
Releases : s ,
161
- KubeClient : kc ,
193
+ KubeClient : clientKC ,
162
194
Log : debugLog ,
163
195
}, nil
164
196
}
@@ -177,15 +209,82 @@ var _ v1.SecretInterface = &ownerRefSecretClient{}
177
209
178
210
type ownerRefSecretClient struct {
179
211
v1.SecretInterface
180
- refs []metav1.OwnerReference
212
+ match func (secret * corev1.Secret ) bool
213
+ refs []metav1.OwnerReference
181
214
}
182
215
183
216
func (c * ownerRefSecretClient ) Create (ctx context.Context , in * corev1.Secret , opts metav1.CreateOptions ) (* corev1.Secret , error ) {
184
- in .OwnerReferences = append (in .OwnerReferences , c .refs ... )
217
+ if c .match == nil || c .match (in ) {
218
+ in .OwnerReferences = append (in .OwnerReferences , c .refs ... )
219
+ }
185
220
return c .SecretInterface .Create (ctx , in , opts )
186
221
}
187
222
188
223
func (c * ownerRefSecretClient ) Update (ctx context.Context , in * corev1.Secret , opts metav1.UpdateOptions ) (* corev1.Secret , error ) {
189
- in .OwnerReferences = append (in .OwnerReferences , c .refs ... )
224
+ if c .match == nil || c .match (in ) {
225
+ in .OwnerReferences = append (in .OwnerReferences , c .refs ... )
226
+ }
190
227
return c .SecretInterface .Update (ctx , in , opts )
191
228
}
229
+
230
+ type SecretsStorageDriverOpts struct {
231
+ DisableOwnerRefInjection bool
232
+ StorageNamespaceMapper ObjectToStringMapper
233
+ }
234
+
235
+ func DefaultSecretsStorageDriver (opts SecretsStorageDriverOpts ) ObjectToStorageDriverMapper {
236
+ if opts .StorageNamespaceMapper == nil {
237
+ opts .StorageNamespaceMapper = getObjectNamespace
238
+ }
239
+ return func (ctx context.Context , obj client.Object , restConfig * rest.Config ) (driver.Driver , error ) {
240
+ storageNamespace , err := opts .StorageNamespaceMapper (obj )
241
+ if err != nil {
242
+ return nil , fmt .Errorf ("get storage namespace for object: %v" , err )
243
+ }
244
+ secretsInterface , err := v1 .NewForConfig (restConfig )
245
+ if err != nil {
246
+ return nil , fmt .Errorf ("create secrets client for storage: %v" , err )
247
+ }
248
+
249
+ secretClient := secretsInterface .Secrets (storageNamespace )
250
+ if ! opts .DisableOwnerRefInjection {
251
+ ownerRef := metav1 .NewControllerRef (obj , obj .GetObjectKind ().GroupVersionKind ())
252
+ secretClient = & ownerRefSecretClient {
253
+ SecretInterface : secretClient ,
254
+ refs : []metav1.OwnerReference {* ownerRef },
255
+ }
256
+ }
257
+ d := driver .NewSecrets (secretClient )
258
+ d .Log = getDebugLogger (ctx )
259
+ return d , nil
260
+ }
261
+ }
262
+
263
+ func ChunkedSecretsStorageDriver (owner string , chunkSize int , opts SecretsStorageDriverOpts ) ObjectToStorageDriverMapper {
264
+ if opts .StorageNamespaceMapper == nil {
265
+ opts .StorageNamespaceMapper = getObjectNamespace
266
+ }
267
+ return func (ctx context.Context , obj client.Object , restConfig * rest.Config ) (driver.Driver , error ) {
268
+ storageNamespace , err := opts .StorageNamespaceMapper (obj )
269
+ if err != nil {
270
+ return nil , fmt .Errorf ("get storage namespace for object: %v" , err )
271
+ }
272
+ secretsInterface , err := v1 .NewForConfig (restConfig )
273
+ if err != nil {
274
+ return nil , fmt .Errorf ("create secrets client for storage: %v" , err )
275
+ }
276
+
277
+ secretClient := secretsInterface .Secrets (storageNamespace )
278
+ if ! opts .DisableOwnerRefInjection {
279
+ ownerRef := metav1 .NewControllerRef (obj , obj .GetObjectKind ().GroupVersionKind ())
280
+ secretClient = & ownerRefSecretClient {
281
+ SecretInterface : secretClient ,
282
+ match : func (secret * corev1.Secret ) bool { return secret .Type == customstorage .SecretTypeChunkedIndex },
283
+ refs : []metav1.OwnerReference {* ownerRef },
284
+ }
285
+ }
286
+ d := customstorage .NewChunkedSecrets (secretClient , chunkSize , owner )
287
+ d .Log = getDebugLogger (ctx )
288
+ return d , nil
289
+ }
290
+ }
0 commit comments