Skip to content

Commit d5013d4

Browse files
authored
Merge pull request #765 from jetstack/lift-sd
Lift service discovery client out of CyberArkClient
2 parents f765740 + e9b255c commit d5013d4

4 files changed

Lines changed: 52 additions & 23 deletions

File tree

cmd/agent_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ func TestOutputModes(t *testing.T) {
3333

3434
t.Run("machinehub", func(t *testing.T) {
3535
arktesting.SkipIfNoEnv(t)
36+
37+
t.Log("This test runs against a live service and has been known to flake. If you see timeout issues it's possible that the test is flaking and it could be unrelated to your changes.")
38+
3639
runSubprocess(t, repoRoot, []string{
3740
"--agent-config-file", filepath.Join(repoRoot, "examples/machinehub/config.yaml"),
3841
"--input-path", filepath.Join(repoRoot, "examples/machinehub/input.json"),

internal/cyberark/client.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,24 +49,23 @@ func LoadClientConfigFromEnvironment() (ClientConfig, error) {
4949
// NewDatauploadClient initializes and returns a new CyberArk Data Upload client.
5050
// It performs service discovery to find the necessary API endpoints and authenticates
5151
// using the provided client configuration.
52-
func NewDatauploadClient(ctx context.Context, httpClient *http.Client, cfg ClientConfig) (*dataupload.CyberArkClient, error) {
53-
discoveryClient := servicediscovery.New(httpClient)
54-
serviceMap, err := discoveryClient.DiscoverServices(ctx, cfg.Subdomain)
55-
if err != nil {
56-
return nil, err
57-
}
52+
func NewDatauploadClient(ctx context.Context, httpClient *http.Client, serviceMap *servicediscovery.Services, cfg ClientConfig) (*dataupload.CyberArkClient, error) {
5853
identityAPI := serviceMap.Identity.API
5954
if identityAPI == "" {
6055
return nil, errors.New("service discovery returned an empty identity API")
6156
}
62-
identityClient := identity.New(httpClient, identityAPI, cfg.Subdomain)
63-
err = identityClient.LoginUsernamePassword(ctx, cfg.Username, []byte(cfg.Secret))
64-
if err != nil {
65-
return nil, err
66-
}
57+
6758
discoveryAPI := serviceMap.DiscoveryContext.API
6859
if discoveryAPI == "" {
6960
return nil, errors.New("service discovery returned an empty discovery API")
7061
}
62+
63+
identityClient := identity.New(httpClient, identityAPI, cfg.Subdomain)
64+
65+
err := identityClient.LoginUsernamePassword(ctx, cfg.Username, []byte(cfg.Secret))
66+
if err != nil {
67+
return nil, err
68+
}
69+
7170
return dataupload.New(httpClient, discoveryAPI, identityClient.AuthenticateRequest), nil
7271
}

internal/cyberark/client_test.go

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

33
import (
44
"crypto/x509"
5-
"errors"
65
"testing"
76

87
"github.com/jetstack/venafi-connection-lib/http_client"
@@ -13,6 +12,7 @@ import (
1312
"github.com/jetstack/preflight/internal/cyberark"
1413
"github.com/jetstack/preflight/internal/cyberark/dataupload"
1514
"github.com/jetstack/preflight/internal/cyberark/servicediscovery"
15+
arktesting "github.com/jetstack/preflight/internal/cyberark/testing"
1616
"github.com/jetstack/preflight/pkg/testutil"
1717
"github.com/jetstack/preflight/pkg/version"
1818

@@ -32,13 +32,21 @@ func TestCyberArkClient_PutSnapshot_MockAPI(t *testing.T) {
3232
Secret: "somepassword",
3333
}
3434

35-
cl, err := cyberark.NewDatauploadClient(ctx, httpClient, cfg)
35+
discoveryClient := servicediscovery.New(httpClient)
36+
37+
serviceMap, err := discoveryClient.DiscoverServices(t.Context(), cfg.Subdomain)
38+
if err != nil {
39+
t.Fatalf("failed to discover mock services: %v", err)
40+
}
41+
42+
cl, err := cyberark.NewDatauploadClient(ctx, httpClient, serviceMap, cfg)
3643
require.NoError(t, err)
3744

3845
err = cl.PutSnapshot(ctx, dataupload.Snapshot{
3946
ClusterID: "ffffffff-ffff-ffff-ffff-ffffffffffff",
4047
AgentVersion: version.PreflightVersion,
4148
})
49+
4250
require.NoError(t, err)
4351
}
4452

@@ -55,26 +63,33 @@ func TestCyberArkClient_PutSnapshot_MockAPI(t *testing.T) {
5563
// go test ./internal/cyberark \
5664
// -v -count 1 -run TestCyberArkClient_PutSnapshot_RealAPI -args -testing.v 6
5765
func TestCyberArkClient_PutSnapshot_RealAPI(t *testing.T) {
66+
arktesting.SkipIfNoEnv(t)
67+
68+
t.Log("This test runs against a live service and has been known to flake. If you see timeout issues it's possible that the test is flaking and it could be unrelated to your changes.")
69+
5870
logger := ktesting.NewLogger(t, ktesting.DefaultConfig)
5971
ctx := klog.NewContext(t.Context(), logger)
6072

6173
var rootCAs *x509.CertPool
6274
httpClient := http_client.NewDefaultClient(version.UserAgent(), rootCAs)
6375

6476
cfg, err := cyberark.LoadClientConfigFromEnvironment()
77+
require.NoError(t, err)
78+
79+
discoveryClient := servicediscovery.New(httpClient)
80+
81+
serviceMap, err := discoveryClient.DiscoverServices(t.Context(), cfg.Subdomain)
6582
if err != nil {
66-
if errors.Is(err, cyberark.ErrMissingEnvironmentVariables) {
67-
t.Skipf("Skipping: %s", err)
68-
}
69-
require.NoError(t, err)
83+
t.Fatalf("failed to discover services: %v", err)
7084
}
7185

72-
cl, err := cyberark.NewDatauploadClient(ctx, httpClient, cfg)
86+
cl, err := cyberark.NewDatauploadClient(ctx, httpClient, serviceMap, cfg)
7387
require.NoError(t, err)
7488

7589
err = cl.PutSnapshot(ctx, dataupload.Snapshot{
7690
ClusterID: "ffffffff-ffff-ffff-ffff-ffffffffffff",
7791
AgentVersion: version.PreflightVersion,
7892
})
93+
7994
require.NoError(t, err)
8095
}

pkg/client/client_cyberark.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/jetstack/preflight/api"
2020
"github.com/jetstack/preflight/internal/cyberark"
2121
"github.com/jetstack/preflight/internal/cyberark/dataupload"
22+
"github.com/jetstack/preflight/internal/cyberark/servicediscovery"
2223
"github.com/jetstack/preflight/pkg/logs"
2324
"github.com/jetstack/preflight/pkg/version"
2425
)
@@ -37,10 +38,12 @@ var _ Client = &CyberArkClient{}
3738
// If the configuration is invalid or missing, an error is returned.
3839
func NewCyberArk(httpClient *http.Client) (*CyberArkClient, error) {
3940
configLoader := cyberark.LoadClientConfigFromEnvironment
41+
4042
_, err := configLoader()
4143
if err != nil {
4244
return nil, err
4345
}
46+
4447
return &CyberArkClient{
4548
configLoader: configLoader,
4649
httpClient: httpClient,
@@ -56,6 +59,19 @@ func NewCyberArk(httpClient *http.Client) (*CyberArkClient, error) {
5659
// The supplied Options are not used by this publisher.
5760
func (o *CyberArkClient) PostDataReadingsWithOptions(ctx context.Context, readings []*api.DataReading, opts Options) error {
5861
log := klog.FromContext(ctx)
62+
63+
cfg, err := o.configLoader()
64+
if err != nil {
65+
return fmt.Errorf("failed to load config: %w", err)
66+
}
67+
68+
discoveryClient := servicediscovery.New(o.httpClient)
69+
70+
serviceMap, err := discoveryClient.DiscoverServices(ctx, cfg.Subdomain)
71+
if err != nil {
72+
return err
73+
}
74+
5975
snapshot := baseSnapshotFromOptions(opts)
6076

6177
if err := convertDataReadings(defaultExtractorFunctions, readings, &snapshot); err != nil {
@@ -65,11 +81,7 @@ func (o *CyberArkClient) PostDataReadingsWithOptions(ctx context.Context, readin
6581
// Minimize the snapshot to reduce size and improve privacy
6682
minimizeSnapshot(log.V(logs.Debug), &snapshot)
6783

68-
cfg, err := o.configLoader()
69-
if err != nil {
70-
return err
71-
}
72-
datauploadClient, err := cyberark.NewDatauploadClient(ctx, o.httpClient, cfg)
84+
datauploadClient, err := cyberark.NewDatauploadClient(ctx, o.httpClient, serviceMap, cfg)
7385
if err != nil {
7486
return fmt.Errorf("while initializing data upload client: %s", err)
7587
}

0 commit comments

Comments
 (0)