diff --git a/cmd/test/main.go b/cmd/test/main.go index 269c9a1b1..66b06525b 100644 --- a/cmd/test/main.go +++ b/cmd/test/main.go @@ -51,6 +51,7 @@ type K8sValidator interface { type TestCommandFlags struct { Output string + SaveResults string K8sVersion string ExcludePattern string IgnoreMissingSchemas bool @@ -70,6 +71,7 @@ type TestCommandFlags struct { func NewTestCommandFlags() *TestCommandFlags { return &TestCommandFlags{ Output: "", + SaveResults: "", K8sVersion: "", ExcludePattern: "", IgnoreMissingSchemas: false, @@ -149,6 +151,7 @@ type CliClient interface { type TestCommandData struct { Output string + SaveResults string K8sVersion string ExcludePattern string IgnoreMissingSchemas bool @@ -275,6 +278,7 @@ func (flags *TestCommandFlags) AddFlags(cmd *cobra.Command) { cmd.Flags().BoolVar(&flags.OnlyK8sFiles, "only-k8s-files", false, "Evaluate only valid yaml files with the properties 'apiVersion' and 'kind'. Ignore everything else") cmd.Flags().BoolVar(&flags.Verbose, "verbose", false, "Display 'How to Fix' link") cmd.Flags().BoolVar(&flags.NoRecord, "no-record", false, "Don’t send policy checks metadata to the backend") + cmd.Flags().StringVarP(&flags.SaveResults, "save-results", "", "", "Enter the path to the directory where you want to save the output file") cmd.Flags().StringVar(&flags.SkipValidation, "skip-validation", "", "Skip validation step. Possible values: 'schema'") @@ -349,6 +353,7 @@ func GenerateTestCommandData(testCommandFlags *TestCommandFlags, localConfigCont } testCommandOptions := &TestCommandData{Output: testCommandFlags.Output, + SaveResults: testCommandFlags.SaveResults, K8sVersion: k8sVersion, ExcludePattern: testCommandFlags.ExcludePattern, IgnoreMissingSchemas: testCommandFlags.IgnoreMissingSchemas, @@ -465,7 +470,7 @@ func test(ctx *TestCommandContext, paths []string, testCommandData *TestCommandD PassedPolicyCheckCount: passedPolicyCheckCount, } - err = evaluation.PrintResults(&evaluation.PrintResultsData{ + evaluationData := &evaluation.PrintResultsData{ Results: results, AdditionalJUnitData: evaluationResultData.AdditionalJUnitData, InvalidYamlFiles: validationManager.InvalidYamlFiles(), @@ -481,7 +486,20 @@ func test(ctx *TestCommandContext, paths []string, testCommandData *TestCommandD CliVersion: ctx.CliVersion, IsCI: ctx.CiContext.IsCI, Quiet: testCommandData.Quiet, - }) + } + err = evaluation.PrintResults(evaluationData) + + if testCommandData.SaveResults != "" { + resultsText, err := evaluation.GetjsonResult(evaluationData) + if err != nil { + return err + } + + err = ioutil.WriteFile(testCommandData.SaveResults, []byte(resultsText), 0666) + if err != nil { + return err + } + } if evaluationResultData.PromptMessage != "" { ctx.Printer.PrintPromptMessage(evaluationResultData.PromptMessage) diff --git a/cmd/test/main_test.go b/cmd/test/main_test.go index b32cfa3f4..425c7b696 100644 --- a/cmd/test/main_test.go +++ b/cmd/test/main_test.go @@ -748,6 +748,7 @@ func TestTestCommandFlagsValidation(t *testing.T) { test_testCommand_output_flags_validation(t, ctx) test_testCommand_version_flags_validation(t, ctx) test_testCommand_no_record_flag(t, ctx) + test_testCommand_save_results_flag(t, ctx) } func TestTestCommandEmptyDir(t *testing.T) { @@ -918,6 +919,15 @@ func test_testCommand_no_record_flag(t *testing.T, ctx *TestCommandContext) { assert.Equal(t, ViolationsFoundError, err) } +func test_testCommand_save_results_flag(t *testing.T, ctx *TestCommandContext) { + flags := TestCommandFlags{SaveResults: "./"} + err := flags.Validate() + assert.NoError(t, err) + + err = executeTestCommand(ctx, []string{"8/*", "--save-results=" + "../non-exsisted-dir/test.json"}) + assert.EqualError(t, err, "open ../non-exsisted-dir/test.json: no such file or directory") +} + func newFilesConfigurationsChan(path string) chan *extractor.FileConfigurations { filesConfigurationsChan := make(chan *extractor.FileConfigurations, 1)