@@ -57,14 +57,25 @@ func NewActionConfigGetter(baseRestConfig *rest.Config, rm meta.RESTMapper, opts
57
57
if acg .objectToClientNamespace == nil {
58
58
acg .objectToClientNamespace = getObjectNamespace
59
59
}
60
- if acg .objectToStorageNamespace == nil {
61
- acg .objectToStorageNamespace = getObjectNamespace
60
+ if acg .objectToClientRestConfig == nil {
61
+ acg .objectToClientRestConfig = func (_ context.Context , _ client.Object , baseRestConfig * rest.Config ) (* rest.Config , error ) {
62
+ return rest .CopyConfig (baseRestConfig ), nil
63
+ }
62
64
}
63
- if acg .objectToRestConfig == nil {
64
- acg .objectToRestConfig = func (_ context.Context , _ client.Object , baseRestConfig * rest.Config ) (* rest.Config , error ) {
65
+ if acg .objectToStorageRestConfig == nil {
66
+ acg .objectToStorageRestConfig = func (_ context.Context , _ client.Object , baseRestConfig * rest.Config ) (* rest.Config , error ) {
65
67
return rest .CopyConfig (baseRestConfig ), nil
66
68
}
67
69
}
70
+ if acg .objectToStorageDriver == nil {
71
+ if acg .objectToStorageNamespace == nil {
72
+ acg .objectToStorageNamespace = getObjectNamespace
73
+ }
74
+ acg .objectToStorageDriver = DefaultSecretsStorageDriver (SecretsStorageDriverOpts {
75
+ DisableOwnerRefInjection : acg .disableStorageOwnerRefInjection ,
76
+ StorageNamespaceMapper : acg .objectToStorageNamespace ,
77
+ })
78
+ }
68
79
return acg , nil
69
80
}
70
81
@@ -73,28 +84,52 @@ var _ ActionConfigGetter = &actionConfigGetter{}
73
84
type ActionConfigGetterOption func (getter * actionConfigGetter )
74
85
75
86
type ObjectToStringMapper func (client.Object ) (string , error )
87
+ type ObjectToRestConfigMapper func (context.Context , client.Object , * rest.Config ) (* rest.Config , error )
88
+ type ObjectToStorageDriverMapper func (context.Context , client.Object , * rest.Config ) (driver.Driver , error )
89
+
90
+ func ClientRestConfigMapper (f ObjectToRestConfigMapper ) ActionConfigGetterOption { // nolint:revive
91
+ return func (getter * actionConfigGetter ) {
92
+ getter .objectToClientRestConfig = f
93
+ }
94
+ }
76
95
77
96
func ClientNamespaceMapper (m ObjectToStringMapper ) ActionConfigGetterOption { // nolint:revive
78
97
return func (getter * actionConfigGetter ) {
79
98
getter .objectToClientNamespace = m
80
99
}
81
100
}
82
101
102
+ func StorageRestConfigMapper (f ObjectToRestConfigMapper ) ActionConfigGetterOption {
103
+ return func (getter * actionConfigGetter ) {
104
+ getter .objectToStorageRestConfig = f
105
+ }
106
+ }
107
+
108
+ func StorageDriverMapper (f ObjectToStorageDriverMapper ) ActionConfigGetterOption {
109
+ return func (getter * actionConfigGetter ) {
110
+ getter .objectToStorageDriver = f
111
+ }
112
+ }
113
+
114
+ // Deprecated: use StorageDriverMapper(DefaultSecretsStorageDriver(SecretsStorageDriverOpts)) instead.
83
115
func StorageNamespaceMapper (m ObjectToStringMapper ) ActionConfigGetterOption {
84
116
return func (getter * actionConfigGetter ) {
85
117
getter .objectToStorageNamespace = m
86
118
}
87
119
}
88
120
121
+ // Deprecated: use StorageDriverMapper(DefaultSecretsStorageDriver(SecretsStorageDriverOpts)) instead.
89
122
func DisableStorageOwnerRefInjection (v bool ) ActionConfigGetterOption {
90
123
return func (getter * actionConfigGetter ) {
91
124
getter .disableStorageOwnerRefInjection = v
92
125
}
93
126
}
94
127
128
+ // Deprecated: use ClientRestConfigMapper and StorageRestConfigMapper instead.
95
129
func RestConfigMapper (f func (context.Context , client.Object , * rest.Config ) (* rest.Config , error )) ActionConfigGetterOption {
96
130
return func (getter * actionConfigGetter ) {
97
- getter .objectToRestConfig = f
131
+ getter .objectToClientRestConfig = f
132
+ getter .objectToStorageRestConfig = f
98
133
}
99
134
}
100
135
@@ -107,58 +142,53 @@ type actionConfigGetter struct {
107
142
restMapper meta.RESTMapper
108
143
discoveryClient discovery.CachedDiscoveryInterface
109
144
110
- objectToClientNamespace ObjectToStringMapper
111
- objectToStorageNamespace ObjectToStringMapper
112
- objectToRestConfig func (context.Context , client.Object , * rest.Config ) (* rest.Config , error )
145
+ objectToClientRestConfig ObjectToRestConfigMapper
146
+ objectToClientNamespace ObjectToStringMapper
147
+
148
+ objectToStorageRestConfig ObjectToRestConfigMapper
149
+ objectToStorageDriver ObjectToStorageDriverMapper
150
+
151
+ // Deprecated: only keep around for backward compatibility with StorageNamespaceMapper option.
152
+ objectToStorageNamespace ObjectToStringMapper
153
+ // Deprecated: only keep around for backward compatibility with DisableStorageOwnerRefInjection option.
113
154
disableStorageOwnerRefInjection bool
114
155
}
115
156
116
157
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 )
158
+ clientRestConfig , err := acg .objectToClientRestConfig (ctx , obj , acg .baseRestConfig )
123
159
if err != nil {
124
- return nil , fmt .Errorf ("get rest config for object: %v" , err )
160
+ return nil , fmt .Errorf ("get client rest config for object: %v" , err )
125
161
}
126
162
127
163
clientNamespace , err := acg .objectToClientNamespace (obj )
128
164
if err != nil {
129
165
return nil , fmt .Errorf ("get client namespace for object: %v" , err )
130
166
}
131
167
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
- }
168
+ clientRCG := newRESTClientGetter (clientRestConfig , acg .restMapper , acg .discoveryClient , clientNamespace )
169
+ clientKC := kube .New (clientRCG )
170
+ clientKC .Namespace = clientNamespace
140
171
141
172
// Setup the debug log function that Helm will use
142
173
debugLog := getDebugLogger (ctx )
143
174
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
- }
175
+ storageRestConfig , err := acg .objectToStorageRestConfig (ctx , obj , acg .baseRestConfig )
176
+ if err != nil {
177
+ return nil , fmt .Errorf ("get storage rest config for object: %v" , err )
178
+ }
179
+
180
+ d , err := acg .objectToStorageDriver (ctx , obj , storageRestConfig )
181
+ if err != nil {
182
+ return nil , fmt .Errorf ("get storage driver for object: %v" , err )
151
183
}
152
- d := driver .NewSecrets (secretClient )
153
- d .Log = debugLog
154
184
155
185
// Initialize the storage backend
156
186
s := storage .Init (d )
157
187
158
188
return & action.Configuration {
159
- RESTClientGetter : rcg ,
189
+ RESTClientGetter : clientRCG ,
160
190
Releases : s ,
161
- KubeClient : kc ,
191
+ KubeClient : clientKC ,
162
192
Log : debugLog ,
163
193
}, nil
164
194
}
@@ -177,15 +207,53 @@ var _ v1.SecretInterface = &ownerRefSecretClient{}
177
207
178
208
type ownerRefSecretClient struct {
179
209
v1.SecretInterface
180
- refs []metav1.OwnerReference
210
+ match func (secret * corev1.Secret ) bool
211
+ refs []metav1.OwnerReference
181
212
}
182
213
183
214
func (c * ownerRefSecretClient ) Create (ctx context.Context , in * corev1.Secret , opts metav1.CreateOptions ) (* corev1.Secret , error ) {
184
- in .OwnerReferences = append (in .OwnerReferences , c .refs ... )
215
+ if c .match == nil || c .match (in ) {
216
+ in .OwnerReferences = append (in .OwnerReferences , c .refs ... )
217
+ }
185
218
return c .SecretInterface .Create (ctx , in , opts )
186
219
}
187
220
188
221
func (c * ownerRefSecretClient ) Update (ctx context.Context , in * corev1.Secret , opts metav1.UpdateOptions ) (* corev1.Secret , error ) {
189
- in .OwnerReferences = append (in .OwnerReferences , c .refs ... )
222
+ if c .match == nil || c .match (in ) {
223
+ in .OwnerReferences = append (in .OwnerReferences , c .refs ... )
224
+ }
190
225
return c .SecretInterface .Update (ctx , in , opts )
191
226
}
227
+
228
+ type SecretsStorageDriverOpts struct {
229
+ DisableOwnerRefInjection bool
230
+ StorageNamespaceMapper ObjectToStringMapper
231
+ }
232
+
233
+ func DefaultSecretsStorageDriver (opts SecretsStorageDriverOpts ) ObjectToStorageDriverMapper {
234
+ if opts .StorageNamespaceMapper == nil {
235
+ opts .StorageNamespaceMapper = getObjectNamespace
236
+ }
237
+ return func (ctx context.Context , obj client.Object , restConfig * rest.Config ) (driver.Driver , error ) {
238
+ storageNamespace , err := opts .StorageNamespaceMapper (obj )
239
+ if err != nil {
240
+ return nil , fmt .Errorf ("get storage namespace for object: %v" , err )
241
+ }
242
+ secretsInterface , err := v1 .NewForConfig (restConfig )
243
+ if err != nil {
244
+ return nil , fmt .Errorf ("create secrets client for storage: %v" , err )
245
+ }
246
+
247
+ secretClient := secretsInterface .Secrets (storageNamespace )
248
+ if ! opts .DisableOwnerRefInjection {
249
+ ownerRef := metav1 .NewControllerRef (obj , obj .GetObjectKind ().GroupVersionKind ())
250
+ secretClient = & ownerRefSecretClient {
251
+ SecretInterface : secretClient ,
252
+ refs : []metav1.OwnerReference {* ownerRef },
253
+ }
254
+ }
255
+ d := driver .NewSecrets (secretClient )
256
+ d .Log = getDebugLogger (ctx )
257
+ return d , nil
258
+ }
259
+ }
0 commit comments