Skip to content

Commit 58f1c9c

Browse files
Refactor the TLSPKMode to be OutputMode and add a Local File mode
Signed-off-by: Richard Wall <[email protected]>
1 parent 35d754b commit 58f1c9c

File tree

5 files changed

+116
-95
lines changed

5 files changed

+116
-95
lines changed

cmd/agent_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ func TestAgentRunOneShot(t *testing.T) {
2727
"agent",
2828
"--one-shot",
2929
// TODO(wallrj): This should not be required when an `--input-file` has been supplied.
30-
"--api-token=should-not-be-required",
31-
// TODO(wallrj): This should not be required when an `--input-file` has been supplied.
3230
"--install-namespace=default",
3331
"--agent-config-file=testdata/agent/one-shot/success/config.yaml",
3432
"--input-path=testdata/agent/one-shot/success/input.json",

pkg/agent/config.go

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -324,15 +324,16 @@ func InitAgentCmdFlags(c *cobra.Command, cfg *AgentCmdFlags) {
324324

325325
}
326326

327-
// TLSPKMode controls how to authenticate to TLSPK / Jetstack Secure. Only one
328-
// TLSPKMode may be provided if using those backends.
329-
type TLSPKMode string
327+
// OutputMode controls how the collected data is published.
328+
// Only one OutputMode may be provided.
329+
type OutputMode string
330330

331331
const (
332-
JetstackSecureOAuth TLSPKMode = "Jetstack Secure OAuth"
333-
JetstackSecureAPIToken TLSPKMode = "Jetstack Secure API Token"
334-
VenafiCloudKeypair TLSPKMode = "Venafi Cloud Key Pair Service Account"
335-
VenafiCloudVenafiConnection TLSPKMode = "Venafi Cloud VenafiConnection"
332+
JetstackSecureOAuth OutputMode = "Jetstack Secure OAuth"
333+
JetstackSecureAPIToken OutputMode = "Jetstack Secure API Token"
334+
VenafiCloudKeypair OutputMode = "Venafi Cloud Key Pair Service Account"
335+
VenafiCloudVenafiConnection OutputMode = "Venafi Cloud VenafiConnection"
336+
LocalFile OutputMode = "Local File"
336337
)
337338

338339
// The command-line flags and the config file are combined into this struct by
@@ -345,7 +346,7 @@ type CombinedConfig struct {
345346
StrictMode bool
346347
OneShot bool
347348

348-
TLSPKMode TLSPKMode
349+
OutputMode OutputMode
349350

350351
// Used by all TLSPK modes.
351352
ClusterID string
@@ -389,7 +390,7 @@ func ValidateAndCombineConfig(log logr.Logger, cfg Config, flags AgentCmdFlags)
389390

390391
{
391392
var (
392-
mode TLSPKMode
393+
mode OutputMode
393394
reason string
394395
keysAndValues []any
395396
)
@@ -419,18 +420,22 @@ func ValidateAndCombineConfig(log logr.Logger, cfg Config, flags AgentCmdFlags)
419420
case !flags.VenafiCloudMode && flags.CredentialsPath != "":
420421
mode = JetstackSecureOAuth
421422
reason = "--credentials-file was specified without --venafi-cloud"
423+
case flags.OutputPath != "":
424+
mode = LocalFile
425+
reason = "--output-path was specified"
422426
default:
423-
return CombinedConfig{}, nil, fmt.Errorf("no TLSPK mode specified. " +
424-
"To enable one of the TLSPK modes, you can:\n" +
427+
return CombinedConfig{}, nil, fmt.Errorf("no output mode specified. " +
428+
"To enable one of the output modes, you can:\n" +
425429
" - Use (--venafi-cloud with --credentials-file) or (--client-id with --private-key-path) to use the " + string(VenafiCloudKeypair) + " mode.\n" +
426430
" - Use --venafi-connection for the " + string(VenafiCloudVenafiConnection) + " mode.\n" +
427431
" - Use --credentials-file alone if you want to use the " + string(JetstackSecureOAuth) + " mode.\n" +
428-
" - Use --api-token if you want to use the " + string(JetstackSecureAPIToken) + " mode.")
432+
" - Use --api-token if you want to use the " + string(JetstackSecureAPIToken) + " mode.\n" +
433+
" - Use --output-path for " + string(LocalFile) + " mode.")
429434
}
430435

431436
keysAndValues = append(keysAndValues, "mode", mode, "reason", reason)
432-
log.V(logs.Debug).Info("Configured to push to Venafi", keysAndValues...)
433-
res.TLSPKMode = mode
437+
log.V(logs.Debug).Info("Output mode selected", keysAndValues...)
438+
res.OutputMode = mode
434439
}
435440

436441
var errs error
@@ -459,7 +464,7 @@ func ValidateAndCombineConfig(log logr.Logger, cfg Config, flags AgentCmdFlags)
459464
endpointPath = cfg.Endpoint.Path
460465
case !hasServerField && !hasEndpointField:
461466
server = "https://preflight.jetstack.io"
462-
if res.TLSPKMode == VenafiCloudKeypair {
467+
if res.OutputMode == VenafiCloudKeypair {
463468
// The VenafiCloudVenafiConnection mode doesn't need a server.
464469
server = client.VenafiCloudProdURL
465470
}
@@ -468,7 +473,7 @@ func ValidateAndCombineConfig(log logr.Logger, cfg Config, flags AgentCmdFlags)
468473
if urlErr != nil || url.Hostname() == "" {
469474
errs = multierror.Append(errs, fmt.Errorf("server %q is not a valid URL", server))
470475
}
471-
if res.TLSPKMode == VenafiCloudVenafiConnection && server != "" {
476+
if res.OutputMode == VenafiCloudVenafiConnection && server != "" {
472477
log.Info(fmt.Sprintf("ignoring the server field specified in the config file. In %s mode, this field is not needed.", VenafiCloudVenafiConnection))
473478
server = ""
474479
}
@@ -479,10 +484,10 @@ func ValidateAndCombineConfig(log logr.Logger, cfg Config, flags AgentCmdFlags)
479484
// Validation of `venafi-cloud.upload_path`.
480485
{
481486
var uploadPath string
482-
switch res.TLSPKMode { // nolint:exhaustive
487+
switch res.OutputMode { // nolint:exhaustive
483488
case VenafiCloudKeypair:
484489
if cfg.VenafiCloud == nil || cfg.VenafiCloud.UploadPath == "" {
485-
errs = multierror.Append(errs, fmt.Errorf("the venafi-cloud.upload_path field is required when using the %s mode", res.TLSPKMode))
490+
errs = multierror.Append(errs, fmt.Errorf("the venafi-cloud.upload_path field is required when using the %s mode", res.OutputMode))
486491
break // Skip to the end of the switch statement.
487492
}
488493
_, urlErr := url.Parse(cfg.VenafiCloud.UploadPath)
@@ -499,7 +504,7 @@ func ValidateAndCombineConfig(log logr.Logger, cfg Config, flags AgentCmdFlags)
499504
// change this value with the new --venafi-connection flag, and this
500505
// field is simply ignored.
501506
if cfg.VenafiCloud != nil && cfg.VenafiCloud.UploadPath != "" {
502-
log.Info(fmt.Sprintf(`ignoring the venafi-cloud.upload_path field in the config file. In %s mode, this field is not needed.`, res.TLSPKMode))
507+
log.Info(fmt.Sprintf(`ignoring the venafi-cloud.upload_path field in the config file. In %s mode, this field is not needed.`, res.OutputMode))
503508
}
504509
uploadPath = ""
505510
}
@@ -517,18 +522,18 @@ func ValidateAndCombineConfig(log logr.Logger, cfg Config, flags AgentCmdFlags)
517522
// https://venafi.atlassian.net/browse/VC-35385 is done.
518523
{
519524
if cfg.VenafiCloud != nil && cfg.VenafiCloud.UploaderID != "" {
520-
log.Info(fmt.Sprintf(`ignoring the venafi-cloud.uploader_id field in the config file. This field is not needed in %s mode.`, res.TLSPKMode))
525+
log.Info(fmt.Sprintf(`ignoring the venafi-cloud.uploader_id field in the config file. This field is not needed in %s mode.`, res.OutputMode))
521526
}
522527
}
523528

524529
// Validation of `cluster_id` and `organization_id`.
525530
{
526531
var clusterID string
527532
var organizationID string // Only used by the old jetstack-secure mode.
528-
switch res.TLSPKMode { // nolint:exhaustive
533+
switch res.OutputMode { // nolint:exhaustive
529534
case VenafiCloudKeypair, VenafiCloudVenafiConnection:
530535
if cfg.ClusterID == "" {
531-
errs = multierror.Append(errs, fmt.Errorf("cluster_id is required in %s mode", res.TLSPKMode))
536+
errs = multierror.Append(errs, fmt.Errorf("cluster_id is required in %s mode", res.OutputMode))
532537
}
533538
clusterID = cfg.ClusterID
534539
case JetstackSecureOAuth, JetstackSecureAPIToken:
@@ -592,7 +597,7 @@ func ValidateAndCombineConfig(log logr.Logger, cfg Config, flags AgentCmdFlags)
592597
res.InstallNS = installNS
593598

594599
// Validation of --venafi-connection and --venafi-connection-namespace.
595-
if res.TLSPKMode == VenafiCloudVenafiConnection {
600+
if res.OutputMode == VenafiCloudVenafiConnection {
596601
res.VenConnName = flags.VenConnName
597602
venConnNS := flags.VenConnNS
598603
if flags.VenConnNS == "" {
@@ -639,12 +644,12 @@ func ValidateAndCombineConfig(log logr.Logger, cfg Config, flags AgentCmdFlags)
639644
return CombinedConfig{}, nil, errs
640645
}
641646

642-
preflightClient, err := validateCredsAndCreateClient(log, flags.CredentialsPath, flags.ClientID, flags.PrivateKeyPath, flags.APIToken, res)
647+
outputClient, err := validateCredsAndCreateClient(log, flags.CredentialsPath, flags.ClientID, flags.PrivateKeyPath, flags.APIToken, res)
643648
if err != nil {
644649
return CombinedConfig{}, nil, multierror.Prefix(err, "validating creds:")
645650
}
646651

647-
return res, preflightClient, nil
652+
return res, outputClient, nil
648653
}
649654

650655
// Validation of --credentials-file/-k, --client-id, and --private-key-path,
@@ -656,9 +661,9 @@ func ValidateAndCombineConfig(log logr.Logger, cfg Config, flags AgentCmdFlags)
656661
func validateCredsAndCreateClient(log logr.Logger, flagCredentialsPath, flagClientID, flagPrivateKeyPath, flagAPIToken string, cfg CombinedConfig) (client.Client, error) {
657662
var errs error
658663

659-
var preflightClient client.Client
664+
var outputClient client.Client
660665
metadata := &api.AgentMetadata{Version: version.PreflightVersion, ClusterID: cfg.ClusterID}
661-
switch cfg.TLSPKMode {
666+
switch cfg.OutputMode {
662667
case JetstackSecureOAuth:
663668
// Note that there are no command line flags to configure the
664669
// JetstackSecureOAuth mode.
@@ -674,7 +679,7 @@ func validateCredsAndCreateClient(log logr.Logger, flagCredentialsPath, flagClie
674679
break // Don't continue with the client if credentials file invalid.
675680
}
676681

677-
preflightClient, err = client.NewOAuthClient(metadata, creds, cfg.Server)
682+
outputClient, err = client.NewOAuthClient(metadata, creds, cfg.Server)
678683
if err != nil {
679684
errs = multierror.Append(errs, err)
680685
}
@@ -726,7 +731,7 @@ func validateCredsAndCreateClient(log logr.Logger, flagCredentialsPath, flagClie
726731
log.Info("Loading upload_path from \"venafi-cloud\" configuration.")
727732

728733
var err error
729-
preflightClient, err = client.NewVenafiCloudClient(metadata, creds, cfg.Server, uploaderID, cfg.UploadPath)
734+
outputClient, err = client.NewVenafiCloudClient(metadata, creds, cfg.Server, uploaderID, cfg.UploadPath)
730735
if err != nil {
731736
errs = multierror.Append(errs, err)
732737
}
@@ -738,25 +743,27 @@ func validateCredsAndCreateClient(log logr.Logger, flagCredentialsPath, flagClie
738743
break // Don't continue with the client if kubeconfig wasn't loaded.
739744
}
740745

741-
preflightClient, err = client.NewVenConnClient(restCfg, metadata, cfg.InstallNS, cfg.VenConnName, cfg.VenConnNS, nil)
746+
outputClient, err = client.NewVenConnClient(restCfg, metadata, cfg.InstallNS, cfg.VenConnName, cfg.VenConnNS, nil)
742747
if err != nil {
743748
errs = multierror.Append(errs, err)
744749
}
745750
case JetstackSecureAPIToken:
746751
var err error
747-
preflightClient, err = client.NewAPITokenClient(metadata, flagAPIToken, cfg.Server)
752+
outputClient, err = client.NewAPITokenClient(metadata, flagAPIToken, cfg.Server)
748753
if err != nil {
749754
errs = multierror.Append(errs, err)
750755
}
756+
case LocalFile:
757+
outputClient = client.NewFileClient(cfg.OutputPath)
751758
default:
752-
panic(fmt.Errorf("programmer mistake: auth mode not implemented: %s", cfg.TLSPKMode))
759+
panic(fmt.Errorf("programmer mistake: output mode not implemented: %s", cfg.OutputMode))
753760
}
754761

755762
if errs != nil {
756-
return nil, fmt.Errorf("failed loading config using the %s mode: %w", cfg.TLSPKMode, errs)
763+
return nil, fmt.Errorf("failed loading config using the %s mode: %w", cfg.OutputMode, errs)
757764
}
758765

759-
return preflightClient, nil
766+
return outputClient, nil
760767
}
761768

762769
// Same as ValidateAndCombineConfig but just for validating the data gatherers.

pkg/agent/config_test.go

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func Test_ValidateAndCombineConfig(t *testing.T) {
9696
withCmdLineFlags("--period", "99m", "--credentials-file", fakeCredsPath))
9797
require.NoError(t, err)
9898
assert.Equal(t, testutil.Undent(`
99-
INFO Configured to push to Venafi mode="Jetstack Secure OAuth" reason="--credentials-file was specified without --venafi-cloud"
99+
INFO Output mode selected mode="Jetstack Secure OAuth" reason="--credentials-file was specified without --venafi-cloud"
100100
INFO Both the 'period' field and --period are set. Using the value provided with --period.
101101
`), gotLogs.String())
102102
assert.Equal(t, 99*time.Minute, got.Period)
@@ -178,12 +178,12 @@ func Test_ValidateAndCombineConfig(t *testing.T) {
178178

179179
// The log line printed by pflag is not captured by the log recorder.
180180
assert.Equal(t, testutil.Undent(`
181-
INFO Configured to push to Venafi mode="Jetstack Secure OAuth" reason="--credentials-file was specified without --venafi-cloud"
181+
INFO Output mode selected mode="Jetstack Secure OAuth" reason="--credentials-file was specified without --venafi-cloud"
182182
INFO Using period from config period="1h0m0s"
183183
`), b.String())
184184
})
185185

186-
t.Run("error when no auth method specified", func(t *testing.T) {
186+
t.Run("error when no output mode specified", func(t *testing.T) {
187187
_, cl, err := ValidateAndCombineConfig(discardLogs(),
188188
withConfig(testutil.Undent(`
189189
server: https://api.venafi.eu
@@ -194,11 +194,12 @@ func Test_ValidateAndCombineConfig(t *testing.T) {
194194
withoutCmdLineFlags(),
195195
)
196196
assert.EqualError(t, err, testutil.Undent(`
197-
no TLSPK mode specified. To enable one of the TLSPK modes, you can:
197+
no output mode specified. To enable one of the output modes, you can:
198198
- Use (--venafi-cloud with --credentials-file) or (--client-id with --private-key-path) to use the Venafi Cloud Key Pair Service Account mode.
199199
- Use --venafi-connection for the Venafi Cloud VenafiConnection mode.
200200
- Use --credentials-file alone if you want to use the Jetstack Secure OAuth mode.
201-
- Use --api-token if you want to use the Jetstack Secure API Token mode.`))
201+
- Use --api-token if you want to use the Jetstack Secure API Token mode.
202+
- Use --output-path for Local File mode.`))
202203
assert.Nil(t, cl)
203204
})
204205

@@ -226,8 +227,8 @@ func Test_ValidateAndCombineConfig(t *testing.T) {
226227
withCmdLineFlags("--credentials-file", credsPath),
227228
)
228229
expect := CombinedConfig{
229-
TLSPKMode: "Jetstack Secure OAuth",
230-
ClusterID: "example-cluster",
230+
OutputMode: "Jetstack Secure OAuth",
231+
ClusterID: "example-cluster",
231232
DataGatherers: []DataGatherer{{Kind: "dummy",
232233
Name: "d1",
233234
Config: &dummyConfig{},
@@ -275,7 +276,7 @@ func Test_ValidateAndCombineConfig(t *testing.T) {
275276
InputPath: "/home",
276277
OutputPath: "/nothome",
277278
UploadPath: "/testing/path",
278-
TLSPKMode: VenafiCloudKeypair,
279+
OutputMode: VenafiCloudKeypair,
279280
ClusterID: "the cluster name",
280281
BackoffMaxTime: 99 * time.Minute,
281282
InstallNS: "venafi",
@@ -299,7 +300,7 @@ func Test_ValidateAndCombineConfig(t *testing.T) {
299300
withCmdLineFlags("--client-id", "5bc7d07c-45da-11ef-a878-523f1e1d7de1", "--private-key-path", privKeyPath),
300301
)
301302
require.NoError(t, err)
302-
assert.Equal(t, VenafiCloudKeypair, got.TLSPKMode)
303+
assert.Equal(t, VenafiCloudKeypair, got.OutputMode)
303304
assert.IsType(t, &client.VenafiCloudClient{}, cl)
304305
})
305306

@@ -388,7 +389,7 @@ func Test_ValidateAndCombineConfig(t *testing.T) {
388389
`)),
389390
withCmdLineFlags("--credentials-file", path))
390391
require.NoError(t, err)
391-
assert.Equal(t, CombinedConfig{Server: "https://api.venafi.eu", Period: time.Hour, OrganizationID: "foo", ClusterID: "bar", TLSPKMode: JetstackSecureOAuth, BackoffMaxTime: 10 * time.Minute, InstallNS: "venafi"}, got)
392+
assert.Equal(t, CombinedConfig{Server: "https://api.venafi.eu", Period: time.Hour, OrganizationID: "foo", ClusterID: "bar", OutputMode: JetstackSecureOAuth, BackoffMaxTime: 10 * time.Minute, InstallNS: "venafi"}, got)
392393
assert.IsType(t, &client.OAuthClient{}, cl)
393394
})
394395

@@ -467,7 +468,7 @@ func Test_ValidateAndCombineConfig(t *testing.T) {
467468
`)),
468469
withCmdLineFlags("--client-id", "5bc7d07c-45da-11ef-a878-523f1e1d7de1", "--private-key-path", path))
469470
require.NoError(t, err)
470-
assert.Equal(t, CombinedConfig{Server: "https://api.venafi.eu", Period: time.Hour, TLSPKMode: VenafiCloudKeypair, ClusterID: "the cluster name", UploadPath: "/foo/bar", BackoffMaxTime: 10 * time.Minute, InstallNS: "venafi"}, got)
471+
assert.Equal(t, CombinedConfig{Server: "https://api.venafi.eu", Period: time.Hour, OutputMode: VenafiCloudKeypair, ClusterID: "the cluster name", UploadPath: "/foo/bar", BackoffMaxTime: 10 * time.Minute, InstallNS: "venafi"}, got)
471472
assert.IsType(t, &client.VenafiCloudClient{}, cl)
472473
})
473474

@@ -489,7 +490,7 @@ func Test_ValidateAndCombineConfig(t *testing.T) {
489490
`)),
490491
withCmdLineFlags("--venafi-cloud", "--credentials-file", credsPath))
491492
require.NoError(t, err)
492-
assert.Equal(t, CombinedConfig{Server: "https://api.venafi.eu", Period: time.Hour, TLSPKMode: VenafiCloudKeypair, ClusterID: "the cluster name", UploadPath: "/foo/bar", BackoffMaxTime: 10 * time.Minute, InstallNS: "venafi"}, got)
493+
assert.Equal(t, CombinedConfig{Server: "https://api.venafi.eu", Period: time.Hour, OutputMode: VenafiCloudKeypair, ClusterID: "the cluster name", UploadPath: "/foo/bar", BackoffMaxTime: 10 * time.Minute, InstallNS: "venafi"}, got)
493494
})
494495

495496
t.Run("venafi-cloud-keypair-auth: venafi-cloud.upload_path field is required", func(t *testing.T) {
@@ -566,7 +567,7 @@ func Test_ValidateAndCombineConfig(t *testing.T) {
566567
assert.Equal(t, CombinedConfig{
567568
Period: 1 * time.Hour,
568569
ClusterID: "the cluster name",
569-
TLSPKMode: VenafiCloudVenafiConnection,
570+
OutputMode: VenafiCloudVenafiConnection,
570571
VenConnName: "venafi-components",
571572
VenConnNS: "venafi",
572573
InstallNS: "venafi",
@@ -592,13 +593,13 @@ func Test_ValidateAndCombineConfig(t *testing.T) {
592593
)
593594
require.NoError(t, err)
594595
assert.Equal(t, testutil.Undent(`
595-
INFO Configured to push to Venafi venConnName="venafi-components" mode="Venafi Cloud VenafiConnection" reason="--venafi-connection was specified"
596+
INFO Output mode selected venConnName="venafi-components" mode="Venafi Cloud VenafiConnection" reason="--venafi-connection was specified"
596597
INFO ignoring the server field specified in the config file. In Venafi Cloud VenafiConnection mode, this field is not needed.
597598
INFO ignoring the venafi-cloud.upload_path field in the config file. In Venafi Cloud VenafiConnection mode, this field is not needed.
598599
INFO ignoring the venafi-cloud.uploader_id field in the config file. This field is not needed in Venafi Cloud VenafiConnection mode.
599600
INFO Using period from config period="1h0m0s"
600601
`), gotLogs.String())
601-
assert.Equal(t, VenafiCloudVenafiConnection, got.TLSPKMode)
602+
assert.Equal(t, VenafiCloudVenafiConnection, got.OutputMode)
602603
assert.IsType(t, &client.VenConnClient{}, gotCl)
603604
})
604605

@@ -613,7 +614,16 @@ func Test_ValidateAndCombineConfig(t *testing.T) {
613614
`)),
614615
withCmdLineFlags("--venafi-connection", "venafi-components"))
615616
require.NoError(t, err)
616-
assert.Equal(t, VenafiCloudVenafiConnection, got.TLSPKMode)
617+
assert.Equal(t, VenafiCloudVenafiConnection, got.OutputMode)
618+
})
619+
t.Run("--output-file selects local file mode", func(t *testing.T) {
620+
t.Setenv("POD_NAMESPACE", "venafi")
621+
t.Setenv("KUBECONFIG", withFile(t, fakeKubeconfig))
622+
got, _, err := ValidateAndCombineConfig(discardLogs(),
623+
withConfig(""),
624+
withCmdLineFlags("--period", "1m", "--output-path", t.TempDir()))
625+
require.NoError(t, err)
626+
assert.Equal(t, LocalFile, got.OutputMode)
617627
})
618628
}
619629

@@ -652,7 +662,7 @@ func Test_ValidateAndCombineConfig_VenafiCloudKeyPair(t *testing.T) {
652662
)
653663
require.NoError(t, err)
654664
testutil.TrustCA(t, cl, cert)
655-
assert.Equal(t, VenafiCloudKeypair, got.TLSPKMode)
665+
assert.Equal(t, VenafiCloudKeypair, got.OutputMode)
656666

657667
err = cl.PostDataReadingsWithOptions(ctx, nil, client.Options{ClusterName: "test cluster name"})
658668
require.NoError(t, err)

0 commit comments

Comments
 (0)