Skip to content

Commit 2ad23d2

Browse files
Handle trust bundle presence in management endpoint for v4 client (#175)
Set Credentials.Insecure to true in v4 clientCache.GetOrCreate. v4 SDK doesn't have trust bundle as an input. Until we have a better solution, we will set Insecure to true if trust bundle is provided to avoid breaking existing consumers of v3 SDK. This internally would set VerifySSL property of the http client in the v4 client.
1 parent def33ae commit 2ad23d2

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111

1212
### Changed
1313
- Updated v4 API clients from v4 alpha to v4 beta APIs
14+
- Handle trust bundle in v4 client cache GetOrCreate by setting VerifySSL
1415

1516
## [0.4.0] - 2024-05-03
1617
### Added

v4/cache.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ func (c *ClientCache) GetOrCreate(cachedClientParams CachedClientParams, opts ..
110110
SessionAuth: c.useSessionAuth,
111111
}
112112

113+
// TODO(sid): v4 SDK doesn't have trust bundle as an input. Until we have a better solution, we will
114+
// set Insecure to true if trust bundle is provided to avoid breaking existing consumers of v3 SDK.
115+
if cachedClientParams.ManagementEndpoint().AdditionalTrustBundle != "" {
116+
credentials.Insecure = true
117+
}
118+
113119
setDefaultsForCredentials(&credentials)
114120
if err := validateCredentials(credentials); err != nil {
115121
return nil, fmt.Errorf("failed to validate credentials for cachedClientParams with key %s: %w", cachedClientParams.Key(), err)

v4/cache_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/stretchr/testify/assert"
77

88
"github.com/nutanix-cloud-native/prism-go-client/environment/types"
9+
"github.com/nutanix-cloud-native/prism-go-client/internal/testhelpers"
910
)
1011

1112
func TestNewClientCacheReturnsNewCache(t *testing.T) {
@@ -93,3 +94,64 @@ func TestDeleteDoesNotErrorIfClientNotPresentInCache(t *testing.T) {
9394

9495
cache.Delete(&cachedClientParams{name: "cluster1"}) // No error expected
9596
}
97+
98+
func TestGetOrCreateSetsVerifySSL(t *testing.T) {
99+
cache := NewClientCache()
100+
mgmtEndpoint := testhelpers.ManagementEndpointFromEnvironment(t)
101+
cp := &cachedClientParams{
102+
name: "cluster1",
103+
mgmtEndpoint: *mgmtEndpoint,
104+
}
105+
c, err := cache.GetOrCreate(cp)
106+
assert.NoError(t, err)
107+
assert.True(t, c.CategoriesApiInstance.ApiClient.VerifySSL)
108+
assert.True(t, c.ClustersApiInstance.ApiClient.VerifySSL)
109+
assert.True(t, c.ImagesApiInstance.ApiClient.VerifySSL)
110+
assert.True(t, c.StorageContainerAPI.ApiClient.VerifySSL)
111+
assert.True(t, c.SubnetsApiInstance.ApiClient.VerifySSL)
112+
assert.True(t, c.SubnetIPReservationApi.ApiClient.VerifySSL)
113+
assert.True(t, c.TasksApiInstance.ApiClient.VerifySSL)
114+
assert.True(t, c.VolumeGroupsApiInstance.ApiClient.VerifySSL)
115+
assert.True(t, c.VmApiInstance.ApiClient.VerifySSL)
116+
117+
cache.Delete(cp)
118+
119+
certBundle := `-----BEGIN CERTIFICATE-----
120+
MIIEYDCCA0igAwIBAgILBAAAAAABL07hRQwwDQYJKoZIhvcNAQEFBQAwVzELMAkG
121+
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
122+
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xMTA0MTMxMDAw
123+
MDBaFw0yMjA0MTMxMDAwMDBaMF0xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
124+
YWxTaWduIG52LXNhMTMwMQYDVQQDEypHbG9iYWxTaWduIE9yZ2FuaXphdGlvbiBW
125+
YWxpZGF0aW9uIENBIC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
126+
AQDdNR3yIFQmGtDvpW+Bdllw3Of01AMkHyQOnSKf1Ccyeit87ovjYWI4F6+0S3qf
127+
ZyEcLZVUunm6tsTyDSF0F2d04rFkCJlgePtnwkv3J41vNnbPMYzl8QbX3FcOW6zu
128+
zi2rqqlwLwKGyLHQCAeV6irs0Z7kNlw7pja1Q4ur944+ABv/hVlrYgGNguhKujiz
129+
4MP0bRmn6gXdhGfCZsckAnNate6kGdn8AM62pI3ffr1fsjqdhDFPyGMM5NgNUqN+
130+
ARvUZ6UYKOsBp4I82Y4d5UcNuotZFKMfH0vq4idGhs6dOcRmQafiFSNrVkfB7cVT
131+
5NSAH2v6gEaYsgmmD5W+ZoiTAgMBAAGjggElMIIBITAOBgNVHQ8BAf8EBAMCAQYw
132+
EgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUXUayjcRLdBy77fVztjq3OI91
133+
nn4wRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8vd3d3
134+
Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCowKKAmoCSGImh0
135+
dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYBBQUHAQEEMTAv
136+
MC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9yb290cjEw
137+
HwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZIhvcNAQEFBQAD
138+
ggEBABvgiADHBREc/6stSEJSzSBo53xBjcEnxSxZZ6CaNduzUKcbYumlO/q2IQen
139+
fPMOK25+Lk2TnLryhj5jiBDYW2FQEtuHrhm70t8ylgCoXtwtI7yw07VKoI5lkS/Z
140+
9oL2dLLffCbvGSuXL+Ch7rkXIkg/pfcNYNUNUUflWP63n41edTzGQfDPgVRJEcYX
141+
pOBWYdw9P91nbHZF2krqrhqkYE/Ho9aqp9nNgSvBZnWygI/1h01fwlr1kMbawb30
142+
hag8IyrhFHvBN91i0ZJsumB9iOQct+R2UTjEqUdOqCsukNK1OFHrwZyKarXMsh3o
143+
wFZUTKiL8IkyhtyTMr5NGvo1dbU=
144+
-----END CERTIFICATE-----`
145+
cp.mgmtEndpoint.AdditionalTrustBundle = certBundle
146+
c, err = cache.GetOrCreate(cp)
147+
assert.NoError(t, err)
148+
assert.False(t, c.CategoriesApiInstance.ApiClient.VerifySSL)
149+
assert.False(t, c.ClustersApiInstance.ApiClient.VerifySSL)
150+
assert.False(t, c.ImagesApiInstance.ApiClient.VerifySSL)
151+
assert.False(t, c.StorageContainerAPI.ApiClient.VerifySSL)
152+
assert.False(t, c.SubnetsApiInstance.ApiClient.VerifySSL)
153+
assert.False(t, c.SubnetIPReservationApi.ApiClient.VerifySSL)
154+
assert.False(t, c.TasksApiInstance.ApiClient.VerifySSL)
155+
assert.False(t, c.VolumeGroupsApiInstance.ApiClient.VerifySSL)
156+
assert.False(t, c.VmApiInstance.ApiClient.VerifySSL)
157+
}

0 commit comments

Comments
 (0)