From 97f83ad1806feff19360709c3fea7dede797d56a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Go=CC=88kc=CC=A7e=20Go=CC=88k=20Klingel?= Date: Thu, 23 May 2024 11:51:53 +0200 Subject: [PATCH 01/13] implement FileOutput method --- internal/pkg/print/print.go | 21 ++++++++++++++ internal/pkg/print/print_test.go | 48 ++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/internal/pkg/print/print.go b/internal/pkg/print/print.go index 205836393..1f20b354e 100644 --- a/internal/pkg/print/print.go +++ b/internal/pkg/print/print.go @@ -197,6 +197,27 @@ func (p *Printer) PagerDisplay(content string) error { return nil } +func (p *Printer) FileOutput(outputFileName, content string) error { + fo, err := os.Create(outputFileName) + if err != nil { + return fmt.Errorf("create output file: %w", err) + } + + defer func() { + tempErr := fo.Close() + if tempErr != nil { + err = fmt.Errorf("close output file: %w", tempErr) + } + }() + + _, err = fo.WriteString(content) + if err != nil { + return fmt.Errorf("write content to output file: %w", err) + } + + return nil +} + // Returns True if the verbosity level is set to Debug, False otherwise. func (p *Printer) IsVerbosityDebug() bool { return p.Verbosity == DebugLevel diff --git a/internal/pkg/print/print_test.go b/internal/pkg/print/print_test.go index 712288639..7689a1e46 100644 --- a/internal/pkg/print/print_test.go +++ b/internal/pkg/print/print_test.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "log/slog" + "os" "testing" "github.com/spf13/cobra" @@ -13,6 +14,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" ) +const outputFilePath = "./testPayload.json" + func TestOutputf(t *testing.T) { tests := []struct { description string @@ -854,3 +857,48 @@ func TestIsVerbosityError(t *testing.T) { }) } } + +func TestFileOutput(t *testing.T) { + tests := []struct { + description string + content string + verbosity Level + outputFile string + }{ + { + description: "write into file", + content: "Test message", + verbosity: DebugLevel, + outputFile: outputFilePath, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + cmd := &cobra.Command{} + p := &Printer{ + Cmd: cmd, + Verbosity: tt.verbosity, + } + + err := p.FileOutput(tt.outputFile, tt.content) + if err != nil { + t.Fatalf("unexpected error: %s", err.Error()) + } + + expectedOutput := tt.content + + output, err := os.ReadFile(tt.outputFile) + if err != nil { + t.Fatalf("unexpected error: %s", err.Error()) + } + if string(output) != expectedOutput { + t.Errorf("unexpected output: got %q, want %q", output, expectedOutput) + } + }) + } + // Cleanup + err := os.RemoveAll(outputFilePath) + if err != nil { + t.Errorf("failed cleaning test data") + } +} From 28d205ccfc2edc7c7b7b02f13ab2ecc9cd866fc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Go=CC=88kc=CC=A7e=20Go=CC=88k=20Klingel?= Date: Thu, 23 May 2024 11:52:34 +0200 Subject: [PATCH 02/13] implement --file-path for generate_payload commands --- .../generate-payload/generate_payload.go | 36 ++++++++++++++----- .../generate-payload/generate_payload_test.go | 17 ++++++++- .../generate-payload/generate_payload.go | 36 ++++++++++++++----- .../generate-payload/generate_payload_test.go | 23 ++++++++++-- .../generate-payload/generate_payload.go | 22 +++++++++--- .../generate-payload/generate_payload_test.go | 23 ++++++++++-- 6 files changed, 129 insertions(+), 28 deletions(-) diff --git a/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go b/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go index 310ac67f3..f0201c52f 100644 --- a/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go +++ b/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go @@ -20,12 +20,14 @@ import ( const ( jobNameFlag = "job-name" instanceIdFlag = "instance-id" + filePathFlag = "file-path" ) type inputModel struct { *globalflags.GlobalFlagModel JobName *string InstanceId string + FilePath *string } func NewCmd(p *print.Printer) *cobra.Command { @@ -44,12 +46,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Example: examples.Build( examples.NewExample( `Generate a Create payload with default values, and adapt it with custom values for the different configuration options`, - `$ stackit argus scrape-config generate-payload > ./payload.json`, + `$ stackit argus scrape-config generate-payload --file-path ./payload.json`, ``, `$ stackit argus scrape-config create my-config --payload @./payload.json`), examples.NewExample( `Generate an Update payload with the values of an existing configuration named "my-config" for Argus instance xxx, and adapt it with custom values for the different configuration options`, - `$ stackit argus scrape-config generate-payload --job-name my-config --instance-id xxx > ./payload.json`, + `$ stackit argus scrape-config generate-payload --job-name my-config --instance-id xxx --file-path ./payload.json`, ``, `$ stackit argus scrape-config update my-config --payload @./payload.json`), ), @@ -68,7 +70,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.JobName == nil { createPayload := argusUtils.DefaultCreateScrapeConfigPayload - return outputCreateResult(p, &createPayload) + return outputCreateResult(p, model, &createPayload) } req := buildRequest(ctx, model, apiClient) @@ -82,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("map update scrape config payloads: %w", err) } - return outputUpdateResult(p, payload) + return outputUpdateResult(p, model, payload) }, } configureFlags(cmd) @@ -92,6 +94,7 @@ func NewCmd(p *print.Printer) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "Instance ID") cmd.Flags().StringP(jobNameFlag, "n", "", "If set, generates an update payload with the current state of the given scrape config. If unset, generates a create payload with default values") + cmd.Flags().StringP(filePathFlag, "f", "", "If set, writes the payload in the given file. If unset, writes the payload to the standard output") } func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { @@ -108,6 +111,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { GlobalFlagModel: globalFlags, JobName: jobName, InstanceId: flags.FlagToStringValue(p, cmd, instanceIdFlag), + FilePath: flags.FlagToStringPointer(p, cmd, filePathFlag), }, nil } @@ -116,22 +120,38 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *argus.APICl return req } -func outputCreateResult(p *print.Printer, payload *argus.CreateScrapeConfigPayload) error { +func outputCreateResult(p *print.Printer, model *inputModel, payload *argus.CreateScrapeConfigPayload) error { payloadBytes, err := json.MarshalIndent(*payload, "", " ") if err != nil { return fmt.Errorf("marshal payload: %w", err) } - p.Outputln(string(payloadBytes)) + + if model.FilePath != nil { + err = p.FileOutput(*model.FilePath, string(payloadBytes)) + if err != nil { + return fmt.Errorf("write payload to the file: %w", err) + } + } else { + p.Outputln(string(payloadBytes)) + } return nil } -func outputUpdateResult(p *print.Printer, payload *argus.UpdateScrapeConfigPayload) error { +func outputUpdateResult(p *print.Printer, model *inputModel, payload *argus.UpdateScrapeConfigPayload) error { payloadBytes, err := json.MarshalIndent(*payload, "", " ") if err != nil { return fmt.Errorf("marshal payload: %w", err) } - p.Outputln(string(payloadBytes)) + + if model.FilePath != nil { + err = p.FileOutput(*model.FilePath, string(payloadBytes)) + if err != nil { + return fmt.Errorf("write payload to the file: %w", err) + } + } else { + p.Outputln(string(payloadBytes)) + } return nil } diff --git a/internal/cmd/argus/scrape-config/generate-payload/generate_payload_test.go b/internal/cmd/argus/scrape-config/generate-payload/generate_payload_test.go index 3c1fafd38..5c04abd5c 100644 --- a/internal/cmd/argus/scrape-config/generate-payload/generate_payload_test.go +++ b/internal/cmd/argus/scrape-config/generate-payload/generate_payload_test.go @@ -22,13 +22,17 @@ var testClient = &argus.APIClient{} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() -const testJobName = "test-job-name" +const ( + testJobName = "test-job-name" + testFilePath = "example-file" +) func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ projectIdFlag: testProjectId, instanceIdFlag: testInstanceId, jobNameFlag: testJobName, + filePathFlag: testFilePath, } for _, mod := range mods { mod(flagValues) @@ -44,6 +48,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { }, InstanceId: testInstanceId, JobName: utils.Ptr(testJobName), + FilePath: utils.Ptr(testFilePath), } for _, mod := range mods { mod(model) @@ -80,6 +85,16 @@ func TestParseInput(t *testing.T) { GlobalFlagModel: &globalflags.GlobalFlagModel{Verbosity: globalflags.VerbosityDefault}, }, }, + { + description: "file path missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, filePathFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.FilePath = nil + }), + }, { description: "job name missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index 6275ba819..8a988e86e 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -20,11 +20,13 @@ import ( const ( loadBalancerNameFlag = "lb-name" + filePathFlag = "file-path" ) type inputModel struct { *globalflags.GlobalFlagModel LoadBalancerName *string + FilePath *string } var ( @@ -118,12 +120,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Example: examples.Build( examples.NewExample( `Generate a payload, and adapt it with custom values for the different configuration options`, - `$ stackit load-balancer generate-payload > ./payload.json`, + `$ stackit load-balancer generate-payload --file-path ./payload.json`, ``, `$ stackit load-balancer create --payload @./payload.json`), examples.NewExample( `Generate a payload with values of an existing load balancer, and adapt it with custom values for the different configuration options`, - `$ stackit load-balancer generate-payload --lb-name xxx > ./payload.json`, + `$ stackit load-balancer generate-payload --lb-name xxx --file-path ./payload.json`, ``, `$ stackit load-balancer update xxx --payload @./payload.json`), ), @@ -142,7 +144,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.LoadBalancerName == nil { createPayload := DefaultCreateLoadBalancerPayload - return outputCreateResult(p, &createPayload) + return outputCreateResult(p, model, &createPayload) } req := buildRequest(ctx, model, apiClient) @@ -162,7 +164,7 @@ func NewCmd(p *print.Printer) *cobra.Command { TargetPools: resp.TargetPools, Version: resp.Version, } - return outputUpdateResult(p, updatePayload) + return outputUpdateResult(p, model, updatePayload) }, } configureFlags(cmd) @@ -171,6 +173,7 @@ func NewCmd(p *print.Printer) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().StringP(loadBalancerNameFlag, "n", "", "If set, generates the payload with the current values of the given load balancer. If unset, generates the payload with empty values") + cmd.Flags().StringP(filePathFlag, "f", "", "If set, writes the payload in the given file. If unset, writes the payload to the standard output") } func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { @@ -185,6 +188,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { model := inputModel{ GlobalFlagModel: globalFlags, LoadBalancerName: loadBalancerName, + FilePath: flags.FlagToStringPointer(p, cmd, filePathFlag), } if p.IsVerbosityDebug() { @@ -204,22 +208,38 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalance return req } -func outputCreateResult(p *print.Printer, payload *loadbalancer.CreateLoadBalancerPayload) error { +func outputCreateResult(p *print.Printer, model *inputModel, payload *loadbalancer.CreateLoadBalancerPayload) error { payloadBytes, err := json.MarshalIndent(*payload, "", " ") if err != nil { return fmt.Errorf("marshal create load balancer payload: %w", err) } - p.Outputln(string(payloadBytes)) + + if model.FilePath != nil { + err = p.FileOutput(*model.FilePath, string(payloadBytes)) + if err != nil { + return fmt.Errorf("write create load balancer payload to the file: %w", err) + } + } else { + p.Outputln(string(payloadBytes)) + } return nil } -func outputUpdateResult(p *print.Printer, payload *loadbalancer.UpdateLoadBalancerPayload) error { +func outputUpdateResult(p *print.Printer, model *inputModel, payload *loadbalancer.UpdateLoadBalancerPayload) error { payloadBytes, err := json.MarshalIndent(*payload, "", " ") if err != nil { return fmt.Errorf("marshal update load balancer payload: %w", err) } - p.Outputln(string(payloadBytes)) + + if model.FilePath != nil { + err = p.FileOutput(*model.FilePath, string(payloadBytes)) + if err != nil { + return fmt.Errorf("write update load balancer payload to the file: %w", err) + } + } else { + p.Outputln(string(payloadBytes)) + } return nil } diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go index a1661d545..b8f48fc69 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go @@ -23,10 +23,16 @@ var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &loadbalancer.APIClient{} var testProjectId = uuid.NewString() +const ( + testLoadBalancerName = "example-name" + testFilePath = "example-file" +) + func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ projectIdFlag: testProjectId, - loadBalancerNameFlag: "example-name", + loadBalancerNameFlag: testLoadBalancerName, + filePathFlag: testFilePath, } for _, mod := range mods { mod(flagValues) @@ -40,7 +46,8 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, }, - LoadBalancerName: utils.Ptr("example-name"), + LoadBalancerName: utils.Ptr(testLoadBalancerName), + FilePath: utils.Ptr(testFilePath), } for _, mod := range mods { mod(model) @@ -49,7 +56,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiGetLoadBalancerRequest)) loadbalancer.ApiGetLoadBalancerRequest { - request := testClient.GetLoadBalancer(testCtx, testProjectId, "example-name") + request := testClient.GetLoadBalancer(testCtx, testProjectId, testLoadBalancerName) for _, mod := range mods { mod(&request) } @@ -87,6 +94,16 @@ func TestParseInput(t *testing.T) { model.LoadBalancerName = nil }), }, + { + description: "file path missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, filePathFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.FilePath = nil + }), + }, { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index 130495b0a..a6a778dd4 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -20,11 +20,13 @@ import ( const ( clusterNameFlag = "cluster-name" + filePathFlag = "file-path" ) type inputModel struct { *globalflags.GlobalFlagModel ClusterName *string + FilePath *string } func NewCmd(p *print.Printer) *cobra.Command { @@ -39,12 +41,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Example: examples.Build( examples.NewExample( `Generate a payload with default values, and adapt it with custom values for the different configuration options`, - `$ stackit ske cluster generate-payload > ./payload.json`, + `$ stackit ske cluster generate-payload --file-path ./payload.json`, ``, `$ stackit ske cluster create my-cluster --payload @./payload.json`), examples.NewExample( `Generate a payload with values of a cluster, and adapt it with custom values for the different configuration options`, - `$ stackit ske cluster generate-payload --cluster-name my-cluster > ./payload.json`, + `$ stackit ske cluster generate-payload --cluster-name my-cluster --file-path ./payload.json`, ``, `$ stackit ske cluster update my-cluster --payload @./payload.json`), ), @@ -83,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } } - return outputResult(p, payload) + return outputResult(p, model, payload) }, } configureFlags(cmd) @@ -92,6 +94,7 @@ func NewCmd(p *print.Printer) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().StringP(clusterNameFlag, "n", "", "If set, generates the payload with the current state of the given cluster. If unset, generates the payload with default values") + cmd.Flags().StringP(filePathFlag, "f", "", "If set, writes the payload in the given file. If unset, writes the payload to the standard output") } func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { @@ -106,6 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { model := inputModel{ GlobalFlagModel: globalFlags, ClusterName: clusterName, + FilePath: flags.FlagToStringPointer(p, cmd, filePathFlag), } if p.IsVerbosityDebug() { @@ -125,12 +129,20 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClie return req } -func outputResult(p *print.Printer, payload *ske.CreateOrUpdateClusterPayload) error { +func outputResult(p *print.Printer, model *inputModel, payload *ske.CreateOrUpdateClusterPayload) error { payloadBytes, err := json.MarshalIndent(*payload, "", " ") if err != nil { return fmt.Errorf("marshal payload: %w", err) } - p.Outputln(string(payloadBytes)) + + if model.FilePath != nil { + err = p.FileOutput(*model.FilePath, string(payloadBytes)) + if err != nil { + return fmt.Errorf("write payload to the file: %w", err) + } + } else { + p.Outputln(string(payloadBytes)) + } return nil } diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go b/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go index 502596390..3cf60e949 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go @@ -22,10 +22,16 @@ var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &ske.APIClient{} var testProjectId = uuid.NewString() +const ( + testClusterName = "example-name" + testFilePath = "example-file" +) + func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ projectIdFlag: testProjectId, - clusterNameFlag: "example-name", + clusterNameFlag: testClusterName, + filePathFlag: testFilePath, } for _, mod := range mods { mod(flagValues) @@ -39,7 +45,8 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, }, - ClusterName: utils.Ptr("example-name"), + ClusterName: utils.Ptr(testClusterName), + FilePath: utils.Ptr(testFilePath), } for _, mod := range mods { mod(model) @@ -48,7 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiGetClusterRequest)) ske.ApiGetClusterRequest { - request := testClient.GetCluster(testCtx, testProjectId, "example-name") + request := testClient.GetCluster(testCtx, testProjectId, testClusterName) for _, mod := range mods { mod(&request) } @@ -86,6 +93,16 @@ func TestParseInput(t *testing.T) { model.ClusterName = nil }), }, + { + description: "file path missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, filePathFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.FilePath = nil + }), + }, { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { From 4061bb7588641bb6e3a764a7bb5cf0b442058a00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Go=CC=88kc=CC=A7e=20Go=CC=88k=20Klingel?= Date: Thu, 23 May 2024 11:54:20 +0200 Subject: [PATCH 03/13] update docs --- docs/stackit_argus_scrape-config_generate-payload.md | 5 +++-- docs/stackit_load-balancer_generate-payload.md | 9 +++++---- docs/stackit_ske_cluster_generate-payload.md | 5 +++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/docs/stackit_argus_scrape-config_generate-payload.md b/docs/stackit_argus_scrape-config_generate-payload.md index 9f246dfbd..d76ac25e6 100644 --- a/docs/stackit_argus_scrape-config_generate-payload.md +++ b/docs/stackit_argus_scrape-config_generate-payload.md @@ -20,12 +20,12 @@ stackit argus scrape-config generate-payload [flags] ``` Generate a Create payload with default values, and adapt it with custom values for the different configuration options - $ stackit argus scrape-config generate-payload > ./payload.json + $ stackit argus scrape-config generate-payload --file-path ./payload.json $ stackit argus scrape-config create my-config --payload @./payload.json Generate an Update payload with the values of an existing configuration named "my-config" for Argus instance xxx, and adapt it with custom values for the different configuration options - $ stackit argus scrape-config generate-payload --job-name my-config --instance-id xxx > ./payload.json + $ stackit argus scrape-config generate-payload --job-name my-config --instance-id xxx --file-path ./payload.json $ stackit argus scrape-config update my-config --payload @./payload.json ``` @@ -33,6 +33,7 @@ stackit argus scrape-config generate-payload [flags] ### Options ``` + -f, --file-path string If set, writes the payload in the given file. If unset, writes the payload to the standard output -h, --help Help for "stackit argus scrape-config generate-payload" --instance-id string Instance ID -n, --job-name string If set, generates an update payload with the current state of the given scrape config. If unset, generates a create payload with default values diff --git a/docs/stackit_load-balancer_generate-payload.md b/docs/stackit_load-balancer_generate-payload.md index b0533dfb2..10718d3de 100644 --- a/docs/stackit_load-balancer_generate-payload.md +++ b/docs/stackit_load-balancer_generate-payload.md @@ -15,12 +15,12 @@ stackit load-balancer generate-payload [flags] ``` Generate a payload, and adapt it with custom values for the different configuration options - $ stackit load-balancer generate-payload > ./payload.json + $ stackit load-balancer generate-payload --file-path ./payload.json $ stackit load-balancer create --payload @./payload.json Generate a payload with values of an existing load balancer, and adapt it with custom values for the different configuration options - $ stackit load-balancer generate-payload --lb-name xxx > ./payload.json + $ stackit load-balancer generate-payload --lb-name xxx --file-path ./payload.json $ stackit load-balancer update xxx --payload @./payload.json ``` @@ -28,8 +28,9 @@ stackit load-balancer generate-payload [flags] ### Options ``` - -h, --help Help for "stackit load-balancer generate-payload" - -n, --lb-name string If set, generates the payload with the current values of the given load balancer. If unset, generates the payload with empty values + -f, --file-path string If set, writes the payload in the given file. If unset, writes the payload to the standard output + -h, --help Help for "stackit load-balancer generate-payload" + -n, --lb-name string If set, generates the payload with the current values of the given load balancer. If unset, generates the payload with empty values ``` ### Options inherited from parent commands diff --git a/docs/stackit_ske_cluster_generate-payload.md b/docs/stackit_ske_cluster_generate-payload.md index dc07bfa22..d5b3386c0 100644 --- a/docs/stackit_ske_cluster_generate-payload.md +++ b/docs/stackit_ske_cluster_generate-payload.md @@ -15,12 +15,12 @@ stackit ske cluster generate-payload [flags] ``` Generate a payload with default values, and adapt it with custom values for the different configuration options - $ stackit ske cluster generate-payload > ./payload.json + $ stackit ske cluster generate-payload --file-path ./payload.json $ stackit ske cluster create my-cluster --payload @./payload.json Generate a payload with values of a cluster, and adapt it with custom values for the different configuration options - $ stackit ske cluster generate-payload --cluster-name my-cluster > ./payload.json + $ stackit ske cluster generate-payload --cluster-name my-cluster --file-path ./payload.json $ stackit ske cluster update my-cluster --payload @./payload.json ``` @@ -29,6 +29,7 @@ stackit ske cluster generate-payload [flags] ``` -n, --cluster-name string If set, generates the payload with the current state of the given cluster. If unset, generates the payload with default values + -f, --file-path string If set, writes the payload in the given file. If unset, writes the payload to the standard output -h, --help Help for "stackit ske cluster generate-payload" ``` From 562955c776854aed8b39bf5020251b01429fd8e9 Mon Sep 17 00:00:00 2001 From: GokceGK <161626272+GokceGK@users.noreply.github.com> Date: Thu, 23 May 2024 14:46:05 +0200 Subject: [PATCH 04/13] Update internal/cmd/argus/scrape-config/generate-payload/generate_payload.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Diogo Ferrão --- .../argus/scrape-config/generate-payload/generate_payload.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go b/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go index f0201c52f..9a3e7a818 100644 --- a/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go +++ b/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go @@ -94,7 +94,7 @@ func NewCmd(p *print.Printer) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "Instance ID") cmd.Flags().StringP(jobNameFlag, "n", "", "If set, generates an update payload with the current state of the given scrape config. If unset, generates a create payload with default values") - cmd.Flags().StringP(filePathFlag, "f", "", "If set, writes the payload in the given file. If unset, writes the payload to the standard output") + cmd.Flags().StringP(filePathFlag, "f", "", "If set, writes the payload to the given file. If unset, writes the payload to the standard output") } func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { From bb1c96002a46ac842ada6fb8fe6d402b81e9503e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Go=CC=88kc=CC=A7e=20Go=CC=88k=20Klingel?= Date: Thu, 23 May 2024 15:11:01 +0200 Subject: [PATCH 05/13] move FileOutput function to fileutils in pkg --- internal/pkg/fileutils/file_utils.go | 27 +++++++++++++ internal/pkg/fileutils/file_utils_test.go | 43 +++++++++++++++++++++ internal/pkg/print/print.go | 21 ----------- internal/pkg/print/print_test.go | 46 ----------------------- 4 files changed, 70 insertions(+), 67 deletions(-) create mode 100644 internal/pkg/fileutils/file_utils.go create mode 100644 internal/pkg/fileutils/file_utils_test.go diff --git a/internal/pkg/fileutils/file_utils.go b/internal/pkg/fileutils/file_utils.go new file mode 100644 index 000000000..eaca1bb44 --- /dev/null +++ b/internal/pkg/fileutils/file_utils.go @@ -0,0 +1,27 @@ +package fileutils + +import ( + "fmt" + "os" +) + +func FileOutput(outputFileName, content string) error { + fo, err := os.Create(outputFileName) + if err != nil { + return fmt.Errorf("create output file: %w", err) + } + + defer func() { + tempErr := fo.Close() + if tempErr != nil { + err = fmt.Errorf("close output file: %w", tempErr) + } + }() + + _, err = fo.WriteString(content) + if err != nil { + return fmt.Errorf("write content to output file: %w", err) + } + + return nil +} diff --git a/internal/pkg/fileutils/file_utils_test.go b/internal/pkg/fileutils/file_utils_test.go new file mode 100644 index 000000000..6f5de8571 --- /dev/null +++ b/internal/pkg/fileutils/file_utils_test.go @@ -0,0 +1,43 @@ +package fileutils + +import ( + "os" + "testing" +) + +const outputFilePath = "./testPayload.json" + +func TestFileOutput(t *testing.T) { + tests := []struct { + description string + content string + outputFile string + }{ + { + description: "write into file", + content: "Test message", + outputFile: outputFilePath, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := FileOutput(tt.outputFile, tt.content) + if err != nil { + t.Fatalf("unexpected error: %s", err.Error()) + } + + output, err := os.ReadFile(tt.outputFile) + if err != nil { + t.Fatalf("unexpected error: %s", err.Error()) + } + if string(output) != tt.content { + t.Errorf("unexpected output: got %q, want %q", output, tt.content) + } + }) + } + // Cleanup + err := os.RemoveAll(outputFilePath) + if err != nil { + t.Errorf("failed cleaning test data") + } +} diff --git a/internal/pkg/print/print.go b/internal/pkg/print/print.go index 1f20b354e..205836393 100644 --- a/internal/pkg/print/print.go +++ b/internal/pkg/print/print.go @@ -197,27 +197,6 @@ func (p *Printer) PagerDisplay(content string) error { return nil } -func (p *Printer) FileOutput(outputFileName, content string) error { - fo, err := os.Create(outputFileName) - if err != nil { - return fmt.Errorf("create output file: %w", err) - } - - defer func() { - tempErr := fo.Close() - if tempErr != nil { - err = fmt.Errorf("close output file: %w", tempErr) - } - }() - - _, err = fo.WriteString(content) - if err != nil { - return fmt.Errorf("write content to output file: %w", err) - } - - return nil -} - // Returns True if the verbosity level is set to Debug, False otherwise. func (p *Printer) IsVerbosityDebug() bool { return p.Verbosity == DebugLevel diff --git a/internal/pkg/print/print_test.go b/internal/pkg/print/print_test.go index 7689a1e46..ed7b7f1dd 100644 --- a/internal/pkg/print/print_test.go +++ b/internal/pkg/print/print_test.go @@ -6,7 +6,6 @@ import ( "fmt" "io" "log/slog" - "os" "testing" "github.com/spf13/cobra" @@ -857,48 +856,3 @@ func TestIsVerbosityError(t *testing.T) { }) } } - -func TestFileOutput(t *testing.T) { - tests := []struct { - description string - content string - verbosity Level - outputFile string - }{ - { - description: "write into file", - content: "Test message", - verbosity: DebugLevel, - outputFile: outputFilePath, - }, - } - for _, tt := range tests { - t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - p := &Printer{ - Cmd: cmd, - Verbosity: tt.verbosity, - } - - err := p.FileOutput(tt.outputFile, tt.content) - if err != nil { - t.Fatalf("unexpected error: %s", err.Error()) - } - - expectedOutput := tt.content - - output, err := os.ReadFile(tt.outputFile) - if err != nil { - t.Fatalf("unexpected error: %s", err.Error()) - } - if string(output) != expectedOutput { - t.Errorf("unexpected output: got %q, want %q", output, expectedOutput) - } - }) - } - // Cleanup - err := os.RemoveAll(outputFilePath) - if err != nil { - t.Errorf("failed cleaning test data") - } -} From eec3d05029225a5aee735d132eb352207789a57a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Go=CC=88kc=CC=A7e=20Go=CC=88k=20Klingel?= Date: Thu, 23 May 2024 15:15:42 +0200 Subject: [PATCH 06/13] change used FileOutput function --- .../argus/scrape-config/generate-payload/generate_payload.go | 5 +++-- .../cmd/load-balancer/generate-payload/generate_payload.go | 5 +++-- .../cmd/ske/cluster/generate-payload/generate_payload.go | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go b/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go index 9a3e7a818..84d742b79 100644 --- a/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go +++ b/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/fileutils" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -127,7 +128,7 @@ func outputCreateResult(p *print.Printer, model *inputModel, payload *argus.Crea } if model.FilePath != nil { - err = p.FileOutput(*model.FilePath, string(payloadBytes)) + err = fileutils.FileOutput(*model.FilePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write payload to the file: %w", err) } @@ -145,7 +146,7 @@ func outputUpdateResult(p *print.Printer, model *inputModel, payload *argus.Upda } if model.FilePath != nil { - err = p.FileOutput(*model.FilePath, string(payloadBytes)) + err = fileutils.FileOutput(*model.FilePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write payload to the file: %w", err) } diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index 8a988e86e..3848b0050 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/fileutils" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -215,7 +216,7 @@ func outputCreateResult(p *print.Printer, model *inputModel, payload *loadbalanc } if model.FilePath != nil { - err = p.FileOutput(*model.FilePath, string(payloadBytes)) + err = fileutils.FileOutput(*model.FilePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write create load balancer payload to the file: %w", err) } @@ -233,7 +234,7 @@ func outputUpdateResult(p *print.Printer, model *inputModel, payload *loadbalanc } if model.FilePath != nil { - err = p.FileOutput(*model.FilePath, string(payloadBytes)) + err = fileutils.FileOutput(*model.FilePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write update load balancer payload to the file: %w", err) } diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index a6a778dd4..dfaf93a7e 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/fileutils" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -136,7 +137,7 @@ func outputResult(p *print.Printer, model *inputModel, payload *ske.CreateOrUpda } if model.FilePath != nil { - err = p.FileOutput(*model.FilePath, string(payloadBytes)) + err = fileutils.FileOutput(*model.FilePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write payload to the file: %w", err) } From da28d959d88617f36be891bb2cde540d3bdd119f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Go=CC=88kc=CC=A7e=20Go=CC=88k=20Klingel?= Date: Thu, 23 May 2024 15:18:31 +0200 Subject: [PATCH 07/13] edit flag descriptions --- internal/cmd/load-balancer/generate-payload/generate_payload.go | 2 +- internal/cmd/ske/cluster/generate-payload/generate_payload.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index 3848b0050..03c278727 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -174,7 +174,7 @@ func NewCmd(p *print.Printer) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().StringP(loadBalancerNameFlag, "n", "", "If set, generates the payload with the current values of the given load balancer. If unset, generates the payload with empty values") - cmd.Flags().StringP(filePathFlag, "f", "", "If set, writes the payload in the given file. If unset, writes the payload to the standard output") + cmd.Flags().StringP(filePathFlag, "f", "", "If set, writes the payload to the given file. If unset, writes the payload to the standard output") } func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index dfaf93a7e..6c758f4eb 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -95,7 +95,7 @@ func NewCmd(p *print.Printer) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().StringP(clusterNameFlag, "n", "", "If set, generates the payload with the current state of the given cluster. If unset, generates the payload with default values") - cmd.Flags().StringP(filePathFlag, "f", "", "If set, writes the payload in the given file. If unset, writes the payload to the standard output") + cmd.Flags().StringP(filePathFlag, "f", "", "If set, writes the payload to the given file. If unset, writes the payload to the standard output") } func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { From 053b37d76556745cc47532bddf5257ba1943cc97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Go=CC=88kc=CC=A7e=20Go=CC=88k=20Klingel?= Date: Thu, 23 May 2024 15:24:15 +0200 Subject: [PATCH 08/13] pass only filePath as argument --- .../generate-payload/generate_payload.go | 16 ++++++++-------- .../generate-payload/generate_payload.go | 17 ++++++++--------- .../generate-payload/generate_payload.go | 8 ++++---- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go b/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go index 84d742b79..b56c8250a 100644 --- a/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go +++ b/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go @@ -71,7 +71,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.JobName == nil { createPayload := argusUtils.DefaultCreateScrapeConfigPayload - return outputCreateResult(p, model, &createPayload) + return outputCreateResult(p, model.FilePath, &createPayload) } req := buildRequest(ctx, model, apiClient) @@ -85,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("map update scrape config payloads: %w", err) } - return outputUpdateResult(p, model, payload) + return outputUpdateResult(p, model.FilePath, payload) }, } configureFlags(cmd) @@ -121,14 +121,14 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *argus.APICl return req } -func outputCreateResult(p *print.Printer, model *inputModel, payload *argus.CreateScrapeConfigPayload) error { +func outputCreateResult(p *print.Printer, filePath *string, payload *argus.CreateScrapeConfigPayload) error { payloadBytes, err := json.MarshalIndent(*payload, "", " ") if err != nil { return fmt.Errorf("marshal payload: %w", err) } - if model.FilePath != nil { - err = fileutils.FileOutput(*model.FilePath, string(payloadBytes)) + if filePath != nil { + err = fileutils.FileOutput(*filePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write payload to the file: %w", err) } @@ -139,14 +139,14 @@ func outputCreateResult(p *print.Printer, model *inputModel, payload *argus.Crea return nil } -func outputUpdateResult(p *print.Printer, model *inputModel, payload *argus.UpdateScrapeConfigPayload) error { +func outputUpdateResult(p *print.Printer, filePath *string, payload *argus.UpdateScrapeConfigPayload) error { payloadBytes, err := json.MarshalIndent(*payload, "", " ") if err != nil { return fmt.Errorf("marshal payload: %w", err) } - if model.FilePath != nil { - err = fileutils.FileOutput(*model.FilePath, string(payloadBytes)) + if filePath != nil { + err = fileutils.FileOutput(*filePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write payload to the file: %w", err) } diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index 03c278727..4398ec9b4 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "fmt" - "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -145,7 +144,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.LoadBalancerName == nil { createPayload := DefaultCreateLoadBalancerPayload - return outputCreateResult(p, model, &createPayload) + return outputCreateResult(p, model.FilePath, &createPayload) } req := buildRequest(ctx, model, apiClient) @@ -165,7 +164,7 @@ func NewCmd(p *print.Printer) *cobra.Command { TargetPools: resp.TargetPools, Version: resp.Version, } - return outputUpdateResult(p, model, updatePayload) + return outputUpdateResult(p, model.FilePath, updatePayload) }, } configureFlags(cmd) @@ -209,14 +208,14 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalance return req } -func outputCreateResult(p *print.Printer, model *inputModel, payload *loadbalancer.CreateLoadBalancerPayload) error { +func outputCreateResult(p *print.Printer, filePath *string, payload *loadbalancer.CreateLoadBalancerPayload) error { payloadBytes, err := json.MarshalIndent(*payload, "", " ") if err != nil { return fmt.Errorf("marshal create load balancer payload: %w", err) } - if model.FilePath != nil { - err = fileutils.FileOutput(*model.FilePath, string(payloadBytes)) + if filePath != nil { + err = fileutils.FileOutput(*filePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write create load balancer payload to the file: %w", err) } @@ -227,14 +226,14 @@ func outputCreateResult(p *print.Printer, model *inputModel, payload *loadbalanc return nil } -func outputUpdateResult(p *print.Printer, model *inputModel, payload *loadbalancer.UpdateLoadBalancerPayload) error { +func outputUpdateResult(p *print.Printer, filePath *string, payload *loadbalancer.UpdateLoadBalancerPayload) error { payloadBytes, err := json.MarshalIndent(*payload, "", " ") if err != nil { return fmt.Errorf("marshal update load balancer payload: %w", err) } - if model.FilePath != nil { - err = fileutils.FileOutput(*model.FilePath, string(payloadBytes)) + if filePath != nil { + err = fileutils.FileOutput(*filePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write update load balancer payload to the file: %w", err) } diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index 6c758f4eb..a8fb2f16a 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -86,7 +86,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } } - return outputResult(p, model, payload) + return outputResult(p, model.FilePath, payload) }, } configureFlags(cmd) @@ -130,14 +130,14 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClie return req } -func outputResult(p *print.Printer, model *inputModel, payload *ske.CreateOrUpdateClusterPayload) error { +func outputResult(p *print.Printer, filePath *string, payload *ske.CreateOrUpdateClusterPayload) error { payloadBytes, err := json.MarshalIndent(*payload, "", " ") if err != nil { return fmt.Errorf("marshal payload: %w", err) } - if model.FilePath != nil { - err = fileutils.FileOutput(*model.FilePath, string(payloadBytes)) + if filePath != nil { + err = fileutils.FileOutput(*filePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write payload to the file: %w", err) } From 8663721410a80d5a0f7f4ac57ed2761c4b516da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Go=CC=88kc=CC=A7e=20Go=CC=88k=20Klingel?= Date: Thu, 23 May 2024 15:34:19 +0200 Subject: [PATCH 09/13] add example without --file-path flag --- .../argus/scrape-config/generate-payload/generate_payload.go | 3 +++ .../cmd/load-balancer/generate-payload/generate_payload.go | 3 +++ internal/cmd/ske/cluster/generate-payload/generate_payload.go | 3 +++ 3 files changed, 9 insertions(+) diff --git a/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go b/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go index b56c8250a..3a7d181b0 100644 --- a/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go +++ b/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go @@ -55,6 +55,9 @@ func NewCmd(p *print.Printer) *cobra.Command { `$ stackit argus scrape-config generate-payload --job-name my-config --instance-id xxx --file-path ./payload.json`, ``, `$ stackit argus scrape-config update my-config --payload @./payload.json`), + examples.NewExample( + `Generate an Update payload with the values of an existing configuration named "my-config" for Argus instance xxx, and preview it in the terminal`, + `$ stackit argus scrape-config generate-payload --job-name my-config --instance-id xxx`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index 4398ec9b4..47248440f 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -128,6 +128,9 @@ func NewCmd(p *print.Printer) *cobra.Command { `$ stackit load-balancer generate-payload --lb-name xxx --file-path ./payload.json`, ``, `$ stackit load-balancer update xxx --payload @./payload.json`), + examples.NewExample( + `Generate a payload with values of an existing load balancer, and preview it in the terminal`, + `$ stackit load-balancer generate-payload --lb-name xxx`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index a8fb2f16a..c6e7ab1a2 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -50,6 +50,9 @@ func NewCmd(p *print.Printer) *cobra.Command { `$ stackit ske cluster generate-payload --cluster-name my-cluster --file-path ./payload.json`, ``, `$ stackit ske cluster update my-cluster --payload @./payload.json`), + examples.NewExample( + `Generate a payload with values of a cluster, and preview it in the terminal`, + `$ stackit ske cluster generate-payload --cluster-name my-cluster`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() From 739e4d607f452b87037aaf29cbc7481061d685c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Go=CC=88kc=CC=A7e=20Go=CC=88k=20Klingel?= Date: Thu, 23 May 2024 15:35:00 +0200 Subject: [PATCH 10/13] update docs --- docs/stackit_argus_scrape-config_generate-payload.md | 5 ++++- docs/stackit_load-balancer_generate-payload.md | 5 ++++- docs/stackit_ske_cluster_generate-payload.md | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/stackit_argus_scrape-config_generate-payload.md b/docs/stackit_argus_scrape-config_generate-payload.md index d76ac25e6..a6d725a27 100644 --- a/docs/stackit_argus_scrape-config_generate-payload.md +++ b/docs/stackit_argus_scrape-config_generate-payload.md @@ -28,12 +28,15 @@ stackit argus scrape-config generate-payload [flags] $ stackit argus scrape-config generate-payload --job-name my-config --instance-id xxx --file-path ./payload.json $ stackit argus scrape-config update my-config --payload @./payload.json + + Generate an Update payload with the values of an existing configuration named "my-config" for Argus instance xxx, and preview it in the terminal + $ stackit argus scrape-config generate-payload --job-name my-config --instance-id xxx ``` ### Options ``` - -f, --file-path string If set, writes the payload in the given file. If unset, writes the payload to the standard output + -f, --file-path string If set, writes the payload to the given file. If unset, writes the payload to the standard output -h, --help Help for "stackit argus scrape-config generate-payload" --instance-id string Instance ID -n, --job-name string If set, generates an update payload with the current state of the given scrape config. If unset, generates a create payload with default values diff --git a/docs/stackit_load-balancer_generate-payload.md b/docs/stackit_load-balancer_generate-payload.md index 10718d3de..07636cb2e 100644 --- a/docs/stackit_load-balancer_generate-payload.md +++ b/docs/stackit_load-balancer_generate-payload.md @@ -23,12 +23,15 @@ stackit load-balancer generate-payload [flags] $ stackit load-balancer generate-payload --lb-name xxx --file-path ./payload.json $ stackit load-balancer update xxx --payload @./payload.json + + Generate a payload with values of an existing load balancer, and preview it in the terminal + $ stackit load-balancer generate-payload --lb-name xxx ``` ### Options ``` - -f, --file-path string If set, writes the payload in the given file. If unset, writes the payload to the standard output + -f, --file-path string If set, writes the payload to the given file. If unset, writes the payload to the standard output -h, --help Help for "stackit load-balancer generate-payload" -n, --lb-name string If set, generates the payload with the current values of the given load balancer. If unset, generates the payload with empty values ``` diff --git a/docs/stackit_ske_cluster_generate-payload.md b/docs/stackit_ske_cluster_generate-payload.md index d5b3386c0..9a40bb105 100644 --- a/docs/stackit_ske_cluster_generate-payload.md +++ b/docs/stackit_ske_cluster_generate-payload.md @@ -23,13 +23,16 @@ stackit ske cluster generate-payload [flags] $ stackit ske cluster generate-payload --cluster-name my-cluster --file-path ./payload.json $ stackit ske cluster update my-cluster --payload @./payload.json + + Generate a payload with values of a cluster, and preview it in the terminal + $ stackit ske cluster generate-payload --cluster-name my-cluster ``` ### Options ``` -n, --cluster-name string If set, generates the payload with the current state of the given cluster. If unset, generates the payload with default values - -f, --file-path string If set, writes the payload in the given file. If unset, writes the payload to the standard output + -f, --file-path string If set, writes the payload to the given file. If unset, writes the payload to the standard output -h, --help Help for "stackit ske cluster generate-payload" ``` From 8cf4d8bea5b3ea22acc7f6a7c94e91dfbe118bd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Go=CC=88kc=CC=A7e=20Go=CC=88k=20Klingel?= Date: Thu, 23 May 2024 15:36:58 +0200 Subject: [PATCH 11/13] remove unused arg --- internal/cmd/load-balancer/generate-payload/generate_payload.go | 1 + internal/pkg/print/print_test.go | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index 47248440f..a5bdc8eec 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/pkg/print/print_test.go b/internal/pkg/print/print_test.go index ed7b7f1dd..712288639 100644 --- a/internal/pkg/print/print_test.go +++ b/internal/pkg/print/print_test.go @@ -13,8 +13,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" ) -const outputFilePath = "./testPayload.json" - func TestOutputf(t *testing.T) { tests := []struct { description string From 1d6b75684a20f1d12fbc6edf2ef2cf037e73bf04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Go=CC=88kc=CC=A7e=20Go=CC=88k=20Klingel?= Date: Thu, 23 May 2024 15:41:23 +0200 Subject: [PATCH 12/13] rename function --- .../argus/scrape-config/generate-payload/generate_payload.go | 4 ++-- .../cmd/load-balancer/generate-payload/generate_payload.go | 4 ++-- internal/cmd/ske/cluster/generate-payload/generate_payload.go | 2 +- internal/pkg/fileutils/file_utils.go | 2 +- internal/pkg/fileutils/file_utils_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go b/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go index 3a7d181b0..9d5e720f2 100644 --- a/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go +++ b/internal/cmd/argus/scrape-config/generate-payload/generate_payload.go @@ -131,7 +131,7 @@ func outputCreateResult(p *print.Printer, filePath *string, payload *argus.Creat } if filePath != nil { - err = fileutils.FileOutput(*filePath, string(payloadBytes)) + err = fileutils.WriteToFile(*filePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write payload to the file: %w", err) } @@ -149,7 +149,7 @@ func outputUpdateResult(p *print.Printer, filePath *string, payload *argus.Updat } if filePath != nil { - err = fileutils.FileOutput(*filePath, string(payloadBytes)) + err = fileutils.WriteToFile(*filePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write payload to the file: %w", err) } diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index a5bdc8eec..4d560fc42 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -219,7 +219,7 @@ func outputCreateResult(p *print.Printer, filePath *string, payload *loadbalance } if filePath != nil { - err = fileutils.FileOutput(*filePath, string(payloadBytes)) + err = fileutils.WriteToFile(*filePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write create load balancer payload to the file: %w", err) } @@ -237,7 +237,7 @@ func outputUpdateResult(p *print.Printer, filePath *string, payload *loadbalance } if filePath != nil { - err = fileutils.FileOutput(*filePath, string(payloadBytes)) + err = fileutils.WriteToFile(*filePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write update load balancer payload to the file: %w", err) } diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index c6e7ab1a2..054fea2b3 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -140,7 +140,7 @@ func outputResult(p *print.Printer, filePath *string, payload *ske.CreateOrUpdat } if filePath != nil { - err = fileutils.FileOutput(*filePath, string(payloadBytes)) + err = fileutils.WriteToFile(*filePath, string(payloadBytes)) if err != nil { return fmt.Errorf("write payload to the file: %w", err) } diff --git a/internal/pkg/fileutils/file_utils.go b/internal/pkg/fileutils/file_utils.go index eaca1bb44..d3b31c692 100644 --- a/internal/pkg/fileutils/file_utils.go +++ b/internal/pkg/fileutils/file_utils.go @@ -5,7 +5,7 @@ import ( "os" ) -func FileOutput(outputFileName, content string) error { +func WriteToFile(outputFileName, content string) error { fo, err := os.Create(outputFileName) if err != nil { return fmt.Errorf("create output file: %w", err) diff --git a/internal/pkg/fileutils/file_utils_test.go b/internal/pkg/fileutils/file_utils_test.go index 6f5de8571..746249353 100644 --- a/internal/pkg/fileutils/file_utils_test.go +++ b/internal/pkg/fileutils/file_utils_test.go @@ -7,7 +7,7 @@ import ( const outputFilePath = "./testPayload.json" -func TestFileOutput(t *testing.T) { +func TestWriteToFile(t *testing.T) { tests := []struct { description string content string @@ -21,7 +21,7 @@ func TestFileOutput(t *testing.T) { } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - err := FileOutput(tt.outputFile, tt.content) + err := WriteToFile(tt.outputFile, tt.content) if err != nil { t.Fatalf("unexpected error: %s", err.Error()) } From 4074906b283d597721e0834647113ff68de00090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Go=CC=88kc=CC=A7e=20Go=CC=88k=20Klingel?= Date: Thu, 23 May 2024 15:46:26 +0200 Subject: [PATCH 13/13] change error handling --- internal/pkg/fileutils/file_utils.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/internal/pkg/fileutils/file_utils.go b/internal/pkg/fileutils/file_utils.go index d3b31c692..69a0234c6 100644 --- a/internal/pkg/fileutils/file_utils.go +++ b/internal/pkg/fileutils/file_utils.go @@ -5,23 +5,24 @@ import ( "os" ) -func WriteToFile(outputFileName, content string) error { +func WriteToFile(outputFileName, content string) (err error) { fo, err := os.Create(outputFileName) if err != nil { return fmt.Errorf("create output file: %w", err) } - defer func() { tempErr := fo.Close() if tempErr != nil { - err = fmt.Errorf("close output file: %w", tempErr) + if err != nil { + err = fmt.Errorf("%w; close output file: %w", err, tempErr) + } else { + err = fmt.Errorf("close output file: %w", tempErr) + } } }() - _, err = fo.WriteString(content) if err != nil { return fmt.Errorf("write content to output file: %w", err) } - - return nil + return err }