Skip to content

Commit 99dc0aa

Browse files
Merge pull request #700 from jetstack/VC-43403-dataupload-client
[VC-43403] Refactor the CyberArk dataupload client to take an HTTP client
2 parents 9b720ac + 3fa015d commit 99dc0aa

File tree

4 files changed

+48
-51
lines changed

4 files changed

+48
-51
lines changed

pkg/client/client_cyberark.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ import (
66

77
type CyberArkClient = dataupload.CyberArkClient
88

9-
var NewCyberArkClient = dataupload.NewCyberArkClient
9+
var NewCyberArkClient = dataupload.New

pkg/internal/cyberark/dataupload/dataupload.go

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"bytes"
55
"context"
66
"crypto/sha256"
7-
"crypto/x509"
87
"encoding/base64"
98
"encoding/hex"
109
"encoding/json"
@@ -13,8 +12,6 @@ import (
1312
"net/http"
1413
"net/url"
1514

16-
"k8s.io/client-go/transport"
17-
1815
"github.com/jetstack/preflight/api"
1916
"github.com/jetstack/preflight/pkg/version"
2017
)
@@ -31,8 +28,8 @@ const (
3128
)
3229

3330
type CyberArkClient struct {
34-
baseURL string
35-
client *http.Client
31+
baseURL string
32+
httpClient *http.Client
3633

3734
authenticateRequest func(req *http.Request) error
3835
}
@@ -41,19 +38,12 @@ type Options struct {
4138
ClusterName string
4239
}
4340

44-
func NewCyberArkClient(trustedCAs *x509.CertPool, baseURL string, authenticateRequest func(req *http.Request) error) (*CyberArkClient, error) {
45-
cyberClient := &http.Client{}
46-
tr := http.DefaultTransport.(*http.Transport).Clone()
47-
if trustedCAs != nil {
48-
tr.TLSClientConfig.RootCAs = trustedCAs
49-
}
50-
cyberClient.Transport = transport.NewDebuggingRoundTripper(tr, transport.DebugByContext)
51-
41+
func New(httpClient *http.Client, baseURL string, authenticateRequest func(req *http.Request) error) *CyberArkClient {
5242
return &CyberArkClient{
5343
baseURL: baseURL,
54-
client: cyberClient,
44+
httpClient: httpClient,
5545
authenticateRequest: authenticateRequest,
56-
}, nil
46+
}
5747
}
5848

5949
// PostDataReadingsWithOptions PUTs the supplied payload to an [AWS presigned URL] which it obtains via the CyberArk inventory API.
@@ -96,7 +86,7 @@ func (c *CyberArkClient) PostDataReadingsWithOptions(ctx context.Context, payloa
9686
req.Header.Set("X-Amz-Checksum-Sha256", checksumBase64)
9787
version.SetUserAgent(req)
9888

99-
res, err := c.client.Do(req)
89+
res, err := c.httpClient.Do(req)
10090
if err != nil {
10191
return err
10292
}
@@ -145,7 +135,7 @@ func (c *CyberArkClient) retrievePresignedUploadURL(ctx context.Context, checksu
145135
}
146136
version.SetUserAgent(req)
147137

148-
res, err := c.client.Do(req)
138+
res, err := c.httpClient.Do(req)
149139
if err != nil {
150140
return "", err
151141
}

pkg/internal/cyberark/dataupload/dataupload_test.go

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package dataupload_test
22

33
import (
44
"crypto/x509"
5-
"encoding/pem"
65
"fmt"
76
"net/http"
87
"os"
@@ -109,19 +108,14 @@ func TestCyberArkClient_PostDataReadingsWithOptions(t *testing.T) {
109108

110109
for _, tc := range tests {
111110
t.Run(tc.name, func(t *testing.T) {
112-
server := dataupload.MockDataUploadServer()
113-
defer server.Close()
111+
logger := ktesting.NewLogger(t, ktesting.DefaultConfig)
112+
ctx := klog.NewContext(t.Context(), logger)
114113

115-
certPool := x509.NewCertPool()
116-
require.True(t, certPool.AppendCertsFromPEM(pem.EncodeToMemory(&pem.Block{
117-
Type: "CERTIFICATE",
118-
Bytes: server.Server.TLS.Certificates[0].Certificate[0],
119-
})))
114+
datauploadAPIBaseURL, httpClient := dataupload.MockDataUploadServer(t)
120115

121-
cyberArkClient, err := dataupload.NewCyberArkClient(certPool, server.Server.URL, tc.authenticate)
122-
require.NoError(t, err)
116+
cyberArkClient := dataupload.New(httpClient, datauploadAPIBaseURL, tc.authenticate)
123117

124-
err = cyberArkClient.PostDataReadingsWithOptions(t.Context(), tc.payload, tc.opts)
118+
err := cyberArkClient.PostDataReadingsWithOptions(ctx, tc.payload, tc.opts)
125119
tc.requireFn(t, err)
126120
})
127121
}
@@ -153,12 +147,8 @@ func TestPostDataReadingsWithOptionsWithRealAPI(t *testing.T) {
153147
logger := ktesting.NewLogger(t, ktesting.DefaultConfig)
154148
ctx := klog.NewContext(t.Context(), logger)
155149

156-
const (
157-
discoveryContextServiceName = "inventory"
158-
separator = "."
159-
)
160-
161-
serviceURL := fmt.Sprintf("https://%s%s%s.%s", subdomain, separator, discoveryContextServiceName, platformDomain)
150+
// TODO(wallrj): get this from the servicediscovery API instead.
151+
inventoryAPI := fmt.Sprintf("https://%s.inventory.%s", subdomain, platformDomain)
162152

163153
var rootCAs *x509.CertPool
164154
httpClient := http_client.NewDefaultClient(version.UserAgent(), rootCAs)
@@ -173,9 +163,7 @@ func TestPostDataReadingsWithOptionsWithRealAPI(t *testing.T) {
173163
err = identityClient.LoginUsernamePassword(ctx, username, []byte(secret))
174164
require.NoError(t, err)
175165

176-
cyberArkClient, err := dataupload.NewCyberArkClient(nil, serviceURL, identityClient.AuthenticateRequest)
177-
require.NoError(t, err)
178-
166+
cyberArkClient := dataupload.New(httpClient, inventoryAPI, identityClient.AuthenticateRequest)
179167
err = cyberArkClient.PostDataReadingsWithOptions(ctx, api.DataReadingsPost{}, dataupload.Options{
180168
ClusterName: "bb068932-c80d-460d-88df-34bc7f3f3297",
181169
})

pkg/internal/cyberark/dataupload/mock.go

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ import (
88
"io"
99
"net/http"
1010
"net/http/httptest"
11+
"testing"
1112

12-
"github.com/jetstack/preflight/pkg/version"
13+
"k8s.io/client-go/transport"
1314

14-
_ "embed"
15+
"github.com/jetstack/preflight/pkg/version"
1516
)
1617

1718
const (
@@ -21,21 +22,39 @@ const (
2122
)
2223

2324
type mockDataUploadServer struct {
24-
Server *httptest.Server
25+
t testing.TB
26+
serverURL string
2527
}
2628

27-
// MockDataUploadServer returns a mocked data upload server with default values.
28-
func MockDataUploadServer() *mockDataUploadServer {
29-
mds := &mockDataUploadServer{}
30-
mds.Server = httptest.NewTLSServer(mds)
31-
return mds
32-
}
33-
34-
func (mds *mockDataUploadServer) Close() {
35-
mds.Server.Close()
29+
// MockDataUploadServer starts a server which mocks the CyberArk
30+
// Discovery and Context API, and an HTTP client with the CA certs needed to
31+
// connect to it.
32+
//
33+
// The returned URL can be supplied to the `dataupload.New` function as the base
34+
// URL for the discoverycontext API.
35+
//
36+
// The returned HTTP client has a transport which logs requests and responses
37+
// depending on log level of the logger supplied in the context.
38+
//
39+
// The mock server will return a successful response when the cluster ID matches
40+
// successClusterID. Other cluster IDs can be used to trigger various failure
41+
// responses.
42+
func MockDataUploadServer(t testing.TB) (string, *http.Client) {
43+
mux := http.NewServeMux()
44+
server := httptest.NewTLSServer(mux)
45+
t.Cleanup(server.Close)
46+
mds := &mockDataUploadServer{
47+
t: t,
48+
serverURL: server.URL,
49+
}
50+
mux.Handle("/", mds)
51+
httpClient := server.Client()
52+
httpClient.Transport = transport.NewDebuggingRoundTripper(httpClient.Transport, transport.DebugByContext)
53+
return server.URL, httpClient
3654
}
3755

3856
func (mds *mockDataUploadServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
57+
mds.t.Log(r.Method, r.RequestURI)
3958
switch r.URL.Path {
4059
case apiPathSnapshotLinks:
4160
mds.handleSnapshotLinks(w, r)
@@ -109,7 +128,7 @@ func (mds *mockDataUploadServer) handleSnapshotLinks(w http.ResponseWriter, r *h
109128
// Write response body
110129
w.WriteHeader(http.StatusOK)
111130
w.Header().Set("Content-Type", "application/json")
112-
presignedURL := mds.Server.URL + "/presigned-upload"
131+
presignedURL := mds.serverURL + "/presigned-upload"
113132
_ = json.NewEncoder(w).Encode(struct {
114133
URL string `json:"url"`
115134
}{presignedURL})

0 commit comments

Comments
 (0)