@@ -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 )
118
- 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 )
160
+ clientRestConfig , err := acg .objectToClientRestConfig (ctx , obj , acg .baseRestConfig )
123
161
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
135
173
136
- kcs , err := kc .Factory .KubernetesClientSet ()
174
+ // Setup the debug log function that Helm will use
175
+ debugLog := getDebugLogger (ctx )
176
+
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
}
@@ -189,3 +222,64 @@ func (c *ownerRefSecretClient) Update(ctx context.Context, in *corev1.Secret, op
189
222
in .OwnerReferences = append (in .OwnerReferences , c .refs ... )
190
223
return c .SecretInterface .Update (ctx , in , opts )
191
224
}
225
+
226
+ type SecretsStorageDriverOpts struct {
227
+ DisableOwnerRefInjection bool
228
+ StorageNamespaceMapper ObjectToStringMapper
229
+ }
230
+
231
+ func DefaultSecretsStorageDriver (opts SecretsStorageDriverOpts ) ObjectToStorageDriverMapper {
232
+ if opts .StorageNamespaceMapper == nil {
233
+ opts .StorageNamespaceMapper = getObjectNamespace
234
+ }
235
+ return func (ctx context.Context , obj client.Object , restConfig * rest.Config ) (driver.Driver , error ) {
236
+ storageNamespace , err := opts .StorageNamespaceMapper (obj )
237
+ if err != nil {
238
+ return nil , fmt .Errorf ("get storage namespace for object: %v" , err )
239
+ }
240
+ secretsInterface , err := v1 .NewForConfig (restConfig )
241
+ if err != nil {
242
+ return nil , fmt .Errorf ("create secrets client for storage: %v" , err )
243
+ }
244
+
245
+ secretClient := secretsInterface .Secrets (storageNamespace )
246
+ if ! opts .DisableOwnerRefInjection {
247
+ ownerRef := metav1 .NewControllerRef (obj , obj .GetObjectKind ().GroupVersionKind ())
248
+ secretClient = & ownerRefSecretClient {
249
+ SecretInterface : secretClient ,
250
+ refs : []metav1.OwnerReference {* ownerRef },
251
+ }
252
+ }
253
+ d := driver .NewSecrets (secretClient )
254
+ d .Log = getDebugLogger (ctx )
255
+ return d , nil
256
+ }
257
+ }
258
+
259
+ func ChunkedSecretsStorageDriver (owner string , chunkSize int , opts SecretsStorageDriverOpts ) ObjectToStorageDriverMapper {
260
+ if opts .StorageNamespaceMapper == nil {
261
+ opts .StorageNamespaceMapper = getObjectNamespace
262
+ }
263
+ return func (ctx context.Context , obj client.Object , restConfig * rest.Config ) (driver.Driver , error ) {
264
+ storageNamespace , err := opts .StorageNamespaceMapper (obj )
265
+ if err != nil {
266
+ return nil , fmt .Errorf ("get storage namespace for object: %v" , err )
267
+ }
268
+ secretsInterface , err := v1 .NewForConfig (restConfig )
269
+ if err != nil {
270
+ return nil , fmt .Errorf ("create secrets client for storage: %v" , err )
271
+ }
272
+
273
+ secretClient := secretsInterface .Secrets (storageNamespace )
274
+ if ! opts .DisableOwnerRefInjection {
275
+ ownerRef := metav1 .NewControllerRef (obj , obj .GetObjectKind ().GroupVersionKind ())
276
+ secretClient = & ownerRefSecretClient {
277
+ SecretInterface : secretClient ,
278
+ refs : []metav1.OwnerReference {* ownerRef },
279
+ }
280
+ }
281
+ d := customstorage .NewChunkedSecrets (secretClient , chunkSize , owner )
282
+ d .Log = getDebugLogger (ctx )
283
+ return d , nil
284
+ }
285
+ }
0 commit comments