@@ -17,6 +17,8 @@ limitations under the License.
17
17
package scope
18
18
19
19
import (
20
+ "crypto/tls"
21
+ "crypto/x509"
20
22
"net/http"
21
23
"sync"
22
24
@@ -60,6 +62,7 @@ type ClientProvider struct {
60
62
ociClientsLock * sync.RWMutex
61
63
ociAuthConfigProvider common.ConfigurationProvider
62
64
ociClientOverrides * v1beta2.ClientOverrides
65
+ certOverride * x509.CertPool
63
66
}
64
67
65
68
// ClientProviderParams is the params struct for NewClientProvider
@@ -69,6 +72,9 @@ type ClientProviderParams struct {
69
72
70
73
// ClientOverrides contains information about client host url overrides.
71
74
ClientOverrides * v1beta2.ClientOverrides
75
+
76
+ // CertOverride a x509 CertPool to use as an override for client TLSClientConfig
77
+ CertOverride * x509.CertPool
72
78
}
73
79
74
80
// NewClientProvider builds the ClientProvider with a client for the given region
@@ -81,6 +87,7 @@ func NewClientProvider(params ClientProviderParams) (*ClientProvider, error) {
81
87
82
88
provider := ClientProvider {
83
89
Logger : & log ,
90
+ certOverride : params .CertOverride ,
84
91
ociAuthConfigProvider : params .OciAuthConfigProvider ,
85
92
ociClients : map [string ]OCIClients {},
86
93
ociClientsLock : new (sync.RWMutex ),
@@ -138,7 +145,7 @@ func (c *ClientProvider) createClients(region string) (OCIClients, error) {
138
145
if err != nil {
139
146
return OCIClients {}, err
140
147
}
141
- identityClient , err := c .createIdentityClient (region , c .ociAuthConfigProvider , c .Logger )
148
+ identityClt , err := c .createIdentityClient (region , c .ociAuthConfigProvider , c .Logger )
142
149
if err != nil {
143
150
return OCIClients {}, err
144
151
}
@@ -150,7 +157,7 @@ func (c *ClientProvider) createClients(region string) (OCIClients, error) {
150
157
if err != nil {
151
158
return OCIClients {}, err
152
159
}
153
- containerEngineClient , err := c .createContainerEngineClient (region , c .ociAuthConfigProvider , c .Logger )
160
+ containerEngineClt , err := c .createContainerEngineClient (region , c .ociAuthConfigProvider , c .Logger )
154
161
if err != nil {
155
162
return OCIClients {}, err
156
163
}
@@ -167,10 +174,10 @@ func (c *ClientProvider) createClients(region string) (OCIClients, error) {
167
174
VCNClient : vcnClient ,
168
175
NetworkLoadBalancerClient : nlbClient ,
169
176
LoadBalancerClient : lbClient ,
170
- IdentityClient : identityClient ,
177
+ IdentityClient : identityClt ,
171
178
ComputeClient : computeClient ,
172
179
ComputeManagementClient : computeManagementClient ,
173
- ContainerEngineClient : containerEngineClient ,
180
+ ContainerEngineClient : containerEngineClt ,
174
181
BaseClient : baseClient ,
175
182
}, err
176
183
}
@@ -182,6 +189,20 @@ func (c *ClientProvider) createVncClient(region string, ociAuthConfigProvider co
182
189
return nil , err
183
190
}
184
191
vcnClient .SetRegion (region )
192
+
193
+ if c .certOverride != nil {
194
+ if client , ok := vcnClient .HTTPClient .(* http.Client ); ok {
195
+ err = c .setCerts (client )
196
+ if err != nil {
197
+ logger .Error (err , "unable to create OCI VCN Client" )
198
+ return nil , err
199
+ }
200
+ } else {
201
+ return nil , errors .New ("The VCN Client dispatcher is not of http.Client type. Can not patch the tls config." )
202
+ }
203
+
204
+ }
205
+
185
206
if c .ociClientOverrides != nil && c .ociClientOverrides .VCNClientUrl != nil {
186
207
vcnClient .Host = * c .ociClientOverrides .VCNClientUrl
187
208
}
@@ -197,6 +218,19 @@ func (c *ClientProvider) createNLbClient(region string, ociAuthConfigProvider co
197
218
return nil , err
198
219
}
199
220
nlbClient .SetRegion (region )
221
+
222
+ if c .certOverride != nil {
223
+ if client , ok := nlbClient .HTTPClient .(* http.Client ); ok {
224
+ err = c .setCerts (client )
225
+ if err != nil {
226
+ logger .Error (err , "unable to create OCI NetworkLoadBalancer Client" )
227
+ return nil , err
228
+ }
229
+ } else {
230
+ return nil , errors .New ("The Network Loadbalancer Client dispatcher is not of http.Client type. Can not patch the tls config." )
231
+ }
232
+ }
233
+
200
234
if c .ociClientOverrides != nil && c .ociClientOverrides .NetworkLoadBalancerClientUrl != nil {
201
235
nlbClient .Host = * c .ociClientOverrides .NetworkLoadBalancerClientUrl
202
236
}
@@ -212,6 +246,19 @@ func (c *ClientProvider) createLBClient(region string, ociAuthConfigProvider com
212
246
return nil , err
213
247
}
214
248
lbClient .SetRegion (region )
249
+
250
+ if c .certOverride != nil {
251
+ if client , ok := lbClient .HTTPClient .(* http.Client ); ok {
252
+ err = c .setCerts (client )
253
+ if err != nil {
254
+ logger .Error (err , "unable to create OCI Loadbalancer Client" )
255
+ return nil , err
256
+ }
257
+ } else {
258
+ return nil , errors .New ("The Loadbalancer Client dispatcher is not of http.Client type. Can not patch the tls config." )
259
+ }
260
+ }
261
+
215
262
if c .ociClientOverrides != nil && c .ociClientOverrides .LoadBalancerClientUrl != nil {
216
263
lbClient .Host = * c .ociClientOverrides .LoadBalancerClientUrl
217
264
}
@@ -221,19 +268,31 @@ func (c *ClientProvider) createLBClient(region string, ociAuthConfigProvider com
221
268
}
222
269
223
270
func (c * ClientProvider ) createIdentityClient (region string , ociAuthConfigProvider common.ConfigurationProvider , logger * logr.Logger ) (* identity.IdentityClient , error ) {
224
- identityClient , err := identity .NewIdentityClientWithConfigurationProvider (ociAuthConfigProvider )
271
+ identityClt , err := identity .NewIdentityClientWithConfigurationProvider (ociAuthConfigProvider )
225
272
if err != nil {
226
273
logger .Error (err , "unable to create OCI Identity Client" )
227
274
return nil , err
228
275
}
229
- identityClient .SetRegion (region )
276
+ identityClt .SetRegion (region )
277
+
278
+ if c .certOverride != nil {
279
+ if client , ok := identityClt .HTTPClient .(* http.Client ); ok {
280
+ err = c .setCerts (client )
281
+ if err != nil {
282
+ logger .Error (err , "unable to create OCI Identity Client" )
283
+ return nil , err
284
+ }
285
+ } else {
286
+ return nil , errors .New ("The Identity Client dispatcher is not of http.Client type. Can not patch the tls config." )
287
+ }
288
+ }
230
289
231
290
if c .ociClientOverrides != nil && c .ociClientOverrides .IdentityClientUrl != nil {
232
- identityClient .Host = * c .ociClientOverrides .IdentityClientUrl
291
+ identityClt .Host = * c .ociClientOverrides .IdentityClientUrl
233
292
}
234
- identityClient .Interceptor = setVersionHeader ()
293
+ identityClt .Interceptor = setVersionHeader ()
235
294
236
- return & identityClient , nil
295
+ return & identityClt , nil
237
296
}
238
297
239
298
func (c * ClientProvider ) createComputeClient (region string , ociAuthConfigProvider common.ConfigurationProvider , logger * logr.Logger ) (* core.ComputeClient , error ) {
@@ -243,6 +302,19 @@ func (c *ClientProvider) createComputeClient(region string, ociAuthConfigProvide
243
302
return nil , err
244
303
}
245
304
computeClient .SetRegion (region )
305
+
306
+ if c .certOverride != nil {
307
+ if client , ok := computeClient .HTTPClient .(* http.Client ); ok {
308
+ err = c .setCerts (client )
309
+ if err != nil {
310
+ logger .Error (err , "unable to create OCI Compute Client" )
311
+ return nil , err
312
+ }
313
+ } else {
314
+ return nil , errors .New ("The Compute Client dispatcher is not of http.Client type. Can not patch the tls config." )
315
+ }
316
+ }
317
+
246
318
if c .ociClientOverrides != nil && c .ociClientOverrides .ComputeClientUrl != nil {
247
319
computeClient .Host = * c .ociClientOverrides .ComputeClientUrl
248
320
}
@@ -258,6 +330,19 @@ func (c *ClientProvider) createComputeManagementClient(region string, ociAuthCon
258
330
return nil , err
259
331
}
260
332
computeManagementClient .SetRegion (region )
333
+
334
+ if c .certOverride != nil {
335
+ if client , ok := computeManagementClient .HTTPClient .(* http.Client ); ok {
336
+ err = c .setCerts (client )
337
+ if err != nil {
338
+ logger .Error (err , "unable to create OCI Compute Management Client" )
339
+ return nil , err
340
+ }
341
+ } else {
342
+ return nil , errors .New ("The Compute Management Client dispatcher is not of http.Client type. Can not patch the tls config." )
343
+ }
344
+ }
345
+
261
346
if c .ociClientOverrides != nil && c .ociClientOverrides .ComputeManagementClientUrl != nil {
262
347
computeManagementClient .Host = * c .ociClientOverrides .ComputeManagementClientUrl
263
348
}
@@ -267,18 +352,31 @@ func (c *ClientProvider) createComputeManagementClient(region string, ociAuthCon
267
352
}
268
353
269
354
func (c * ClientProvider ) createContainerEngineClient (region string , ociAuthConfigProvider common.ConfigurationProvider , logger * logr.Logger ) (* containerengine.ContainerEngineClient , error ) {
270
- containerEngineClient , err := containerengine .NewContainerEngineClientWithConfigurationProvider (ociAuthConfigProvider )
355
+ containerEngineClt , err := containerengine .NewContainerEngineClientWithConfigurationProvider (ociAuthConfigProvider )
271
356
if err != nil {
272
357
logger .Error (err , "unable to create OCI Container Engine Client" )
273
358
return nil , err
274
359
}
275
- containerEngineClient .SetRegion (region )
360
+ containerEngineClt .SetRegion (region )
361
+
362
+ if c .certOverride != nil {
363
+ if client , ok := containerEngineClt .HTTPClient .(* http.Client ); ok {
364
+ err = c .setCerts (client )
365
+ if err != nil {
366
+ logger .Error (err , "unable to create OCI Container Engine Client" )
367
+ return nil , err
368
+ }
369
+ } else {
370
+ return nil , errors .New ("The Container Engine Client dispatcher is not of http.Client type. Can not patch the tls config." )
371
+ }
372
+ }
373
+
276
374
if c .ociClientOverrides != nil && c .ociClientOverrides .ContainerEngineClientUrl != nil {
277
- containerEngineClient .Host = * c .ociClientOverrides .ContainerEngineClientUrl
375
+ containerEngineClt .Host = * c .ociClientOverrides .ContainerEngineClientUrl
278
376
}
279
- containerEngineClient .Interceptor = setVersionHeader ()
377
+ containerEngineClt .Interceptor = setVersionHeader ()
280
378
281
- return & containerEngineClient , nil
379
+ return & containerEngineClt , nil
282
380
}
283
381
284
382
func (c * ClientProvider ) createBaseClient (region string , ociAuthConfigProvider common.ConfigurationProvider , logger * logr.Logger ) (base.BaseClient , error ) {
@@ -296,3 +394,18 @@ func setVersionHeader() func(request *http.Request) error {
296
394
return nil
297
395
}
298
396
}
397
+
398
+ // setCerts updates the client TLSClientConfig with the ClientProvider certOverride
399
+ func (c * ClientProvider ) setCerts (client * http.Client ) error {
400
+ tr := client .Transport .(* http.Transport ).Clone ()
401
+ if tr .TLSClientConfig != nil {
402
+ tr .TLSClientConfig .RootCAs = c .certOverride
403
+ } else {
404
+ tr .TLSClientConfig = & tls.Config {
405
+ RootCAs : c .certOverride ,
406
+ }
407
+ }
408
+ client .Transport = tr
409
+
410
+ return nil
411
+ }
0 commit comments