Skip to content

Commit b08d214

Browse files
committed
lift service discovery client out of CyberArkClient
Service discovery will also be required for getting encryption keys for envelope encryption. This change makes the service discovery client available so we can fetch keys before we sanitise / encrypt secret data Signed-off-by: Ashley Davis <ashley.davis@cyberark.com>
1 parent f765740 commit b08d214

3 files changed

Lines changed: 46 additions & 18 deletions

File tree

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: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

@@ -66,15 +74,24 @@ func TestCyberArkClient_PutSnapshot_RealAPI(t *testing.T) {
6674
if errors.Is(err, cyberark.ErrMissingEnvironmentVariables) {
6775
t.Skipf("Skipping: %s", err)
6876
}
77+
6978
require.NoError(t, err)
7079
}
7180

72-
cl, err := cyberark.NewDatauploadClient(ctx, httpClient, cfg)
81+
discoveryClient := servicediscovery.New(httpClient)
82+
83+
serviceMap, err := discoveryClient.DiscoverServices(t.Context(), cfg.Subdomain)
84+
if err != nil {
85+
t.Fatalf("failed to discover services: %v", err)
86+
}
87+
88+
cl, err := cyberark.NewDatauploadClient(ctx, httpClient, serviceMap, cfg)
7389
require.NoError(t, err)
7490

7591
err = cl.PutSnapshot(ctx, dataupload.Snapshot{
7692
ClusterID: "ffffffff-ffff-ffff-ffff-ffffffffffff",
7793
AgentVersion: version.PreflightVersion,
7894
})
95+
7996
require.NoError(t, err)
8097
}

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)