diff --git a/internal/cmd/beta/server/backup/create/create.go b/internal/cmd/beta/server/backup/create/create.go index f53f3b9ef..d64d14c0a 100644 --- a/internal/cmd/beta/server/backup/create/create.go +++ b/internal/cmd/beta/server/backup/create/create.go @@ -12,6 +12,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -65,6 +67,17 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a Backup for server %s?", model.ServerId) err = p.PromptForConfirmation(prompt) @@ -83,7 +96,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Server Backup: %w", err) } - return outputResult(p, model, resp) + return outputResult(p, model.OutputFormat, serverLabel, *resp) }, } configureFlags(cmd) @@ -140,8 +153,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku return req, nil } -func outputResult(p *print.Printer, model *inputModel, resp *serverbackup.BackupJob) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat, serverLabel string, resp serverbackup.BackupJob) error { + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(resp, "", " ") if err != nil { @@ -159,7 +172,7 @@ func outputResult(p *print.Printer, model *inputModel, resp *serverbackup.Backup return nil default: - p.Outputf("Triggered creation of server backup for server %s. Backup ID: %s\n", model.ServerId, utils.PtrString(resp.Id)) + p.Outputf("Triggered creation of server backup for server %s. Backup ID: %s\n", serverLabel, utils.PtrString(resp.Id)) return nil } } diff --git a/internal/cmd/beta/server/backup/create/create_test.go b/internal/cmd/beta/server/backup/create/create_test.go index 18bf4046d..a4fd801f3 100644 --- a/internal/cmd/beta/server/backup/create/create_test.go +++ b/internal/cmd/beta/server/backup/create/create_test.go @@ -208,3 +208,31 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + serverLabel string + resp serverbackup.BackupJob + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/backup/describe/describe.go b/internal/cmd/beta/server/backup/describe/describe.go index 3396fd18c..2f55048cd 100644 --- a/internal/cmd/beta/server/backup/describe/describe.go +++ b/internal/cmd/beta/server/backup/describe/describe.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "strconv" "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -64,7 +65,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server backup: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(p, model.OutputFormat, *resp) }, } configureFlags(cmd) @@ -109,7 +110,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku return req } -func outputResult(p *print.Printer, outputFormat string, backup *serverbackup.Backup) error { +func outputResult(p *print.Printer, outputFormat string, backup serverbackup.Backup) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(backup, "", " ") @@ -145,7 +146,11 @@ func outputResult(p *print.Printer, outputFormat string, backup *serverbackup.Ba lastRestored := utils.PtrStringDefault(backup.LastRestoredAt, "") table.AddRow("LAST RESTORED AT", lastRestored) table.AddSeparator() - table.AddRow("VOLUME BACKUPS", len(*backup.VolumeBackups)) + volBackups := "" + if backups := backup.VolumeBackups; backups != nil { + volBackups = strconv.Itoa(len(*backups)) + } + table.AddRow("VOLUME BACKUPS", volBackups) table.AddSeparator() err := table.Display(p) diff --git a/internal/cmd/beta/server/backup/describe/describe_test.go b/internal/cmd/beta/server/backup/describe/describe_test.go index a4f979e0a..efa3e370a 100644 --- a/internal/cmd/beta/server/backup/describe/describe_test.go +++ b/internal/cmd/beta/server/backup/describe/describe_test.go @@ -209,3 +209,38 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + backup serverbackup.Backup + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "output format json", + args: args{ + outputFormat: print.JSONOutputFormat, + backup: serverbackup.Backup{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.backup); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/backup/disable/disable.go b/internal/cmd/beta/server/backup/disable/disable.go index 3f3777ccb..1d1ff797b 100644 --- a/internal/cmd/beta/server/backup/disable/disable.go +++ b/internal/cmd/beta/server/backup/disable/disable.go @@ -10,6 +10,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client" serverbackupUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/utils" @@ -50,17 +52,28 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + canDisable, err := serverbackupUtils.CanDisableBackupService(ctx, apiClient, model.ProjectId, model.ServerId) if err != nil { return err } if !canDisable { - p.Info("Cannot disable backup service for server %s - existing backups or existing backup schedules found\n", model.ServerId) + p.Info("Cannot disable backup service for server %s - existing backups or existing backup schedules found\n", serverLabel) return nil } if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to disable the backup service for server %s?", model.ServerId) + prompt := fmt.Sprintf("Are you sure you want to disable the backup service for server %s?", serverLabel) err = p.PromptForConfirmation(prompt) if err != nil { return err @@ -74,7 +87,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("disable server backup service: %w", err) } - p.Info("Disabled Server Backup service for server %s\n", model.ServerId) + p.Info("Disabled Server Backup service for server %s\n", serverLabel) return nil }, } diff --git a/internal/cmd/beta/server/backup/enable/enable.go b/internal/cmd/beta/server/backup/enable/enable.go index b4192a177..c6e6bc01c 100644 --- a/internal/cmd/beta/server/backup/enable/enable.go +++ b/internal/cmd/beta/server/backup/enable/enable.go @@ -11,6 +11,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client" "github.com/spf13/cobra" @@ -50,8 +52,19 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to enable the Server Backup service for server %s?", model.ServerId) + prompt := fmt.Sprintf("Are you sure you want to enable the Server Backup service for server %s?", serverLabel) err = p.PromptForConfirmation(prompt) if err != nil { return err @@ -67,7 +80,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } } - p.Info("Enabled backup service for server %s\n", model.ServerId) + p.Info("Enabled backup service for server %s\n", serverLabel) return nil }, } diff --git a/internal/cmd/beta/server/backup/list/list.go b/internal/cmd/beta/server/backup/list/list.go index 244444766..fa060a413 100644 --- a/internal/cmd/beta/server/backup/list/list.go +++ b/internal/cmd/beta/server/backup/list/list.go @@ -13,6 +13,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -65,7 +67,17 @@ func NewCmd(p *print.Printer) *cobra.Command { } backups := *resp.Items if len(backups) == 0 { - p.Info("No backups found for server %s\n", model.ServerId) + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + p.Info("No backups found for server %s\n", serverLabel) return nil } @@ -150,6 +162,10 @@ func outputResult(p *print.Printer, outputFormat string, backups []serverbackup. s := backups[i] lastRestored := utils.PtrStringDefault(s.LastRestoredAt, "") + var volBackups int + if s.VolumeBackups != nil { + volBackups = len(*s.VolumeBackups) + } table.AddRow( utils.PtrString(s.Id), utils.PtrString(s.Name), @@ -158,7 +174,7 @@ func outputResult(p *print.Printer, outputFormat string, backups []serverbackup. utils.PtrString(s.CreatedAt), utils.PtrString(s.ExpireAt), lastRestored, - len(*s.VolumeBackups), + volBackups, ) } err := table.Display(p) diff --git a/internal/cmd/beta/server/backup/list/list_test.go b/internal/cmd/beta/server/backup/list/list_test.go index fccc16027..087803962 100644 --- a/internal/cmd/beta/server/backup/list/list_test.go +++ b/internal/cmd/beta/server/backup/list/list_test.go @@ -186,3 +186,39 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + backups []serverbackup.Backup + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty backup", + args: args{ + backups: []serverbackup.Backup{ + {}, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.backups); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/backup/schedule/create/create.go b/internal/cmd/beta/server/backup/schedule/create/create.go index dc10d8bcd..19b789291 100644 --- a/internal/cmd/beta/server/backup/schedule/create/create.go +++ b/internal/cmd/beta/server/backup/schedule/create/create.go @@ -12,6 +12,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -73,8 +75,19 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a Backup Schedule for server %s?", model.ServerId) + prompt := fmt.Sprintf("Are you sure you want to create a Backup Schedule for server %s?", serverLabel) err = p.PromptForConfirmation(prompt) if err != nil { return err @@ -91,7 +104,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Server Backup Schedule: %w", err) } - return outputResult(p, model, resp) + return outputResult(p, model.OutputFormat, serverLabel, *resp) }, } configureFlags(cmd) @@ -159,8 +172,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku return req, nil } -func outputResult(p *print.Printer, model *inputModel, resp *serverbackup.BackupSchedule) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat, serverLabel string, resp serverbackup.BackupSchedule) error { + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(resp, "", " ") if err != nil { @@ -178,7 +191,7 @@ func outputResult(p *print.Printer, model *inputModel, resp *serverbackup.Backup return nil default: - p.Outputf("Created server backup schedule for server %s. Backup Schedule ID: %s\n", model.ServerId, utils.PtrString(resp.Id)) + p.Outputf("Created server backup schedule for server %s. Backup Schedule ID: %s\n", serverLabel, utils.PtrString(resp.Id)) return nil } } diff --git a/internal/cmd/beta/server/backup/schedule/create/create_test.go b/internal/cmd/beta/server/backup/schedule/create/create_test.go index 54307cb30..fbbb4e08e 100644 --- a/internal/cmd/beta/server/backup/schedule/create/create_test.go +++ b/internal/cmd/beta/server/backup/schedule/create/create_test.go @@ -219,3 +219,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat, serverLabel string + resp serverbackup.BackupSchedule + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/backup/schedule/delete/delete.go b/internal/cmd/beta/server/backup/schedule/delete/delete.go index 60e30643a..1417aba8e 100644 --- a/internal/cmd/beta/server/backup/schedule/delete/delete.go +++ b/internal/cmd/beta/server/backup/schedule/delete/delete.go @@ -10,6 +10,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client" "github.com/spf13/cobra" @@ -51,8 +53,19 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete server backup schedule %q? (This cannot be undone)", model.ScheduleId) + prompt := fmt.Sprintf("Are you sure you want to delete server backup schedule %q? (This cannot be undone)", serverLabel) err = p.PromptForConfirmation(prompt) if err != nil { return err diff --git a/internal/cmd/beta/server/backup/schedule/describe/describe.go b/internal/cmd/beta/server/backup/schedule/describe/describe.go index 7c91a0bee..4fd94511d 100644 --- a/internal/cmd/beta/server/backup/schedule/describe/describe.go +++ b/internal/cmd/beta/server/backup/schedule/describe/describe.go @@ -64,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server backup schedule: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(p, model.OutputFormat, *resp) }, } configureFlags(cmd) @@ -109,7 +109,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku return req } -func outputResult(p *print.Printer, outputFormat string, schedule *serverbackup.BackupSchedule) error { +func outputResult(p *print.Printer, outputFormat string, schedule serverbackup.BackupSchedule) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(schedule, "", " ") @@ -138,9 +138,9 @@ func outputResult(p *print.Printer, outputFormat string, schedule *serverbackup. table.AddRow("RRULE", utils.PtrString(schedule.Rrule)) table.AddSeparator() if schedule.BackupProperties != nil { - table.AddRow("BACKUP NAME", *schedule.BackupProperties.Name) + table.AddRow("BACKUP NAME", utils.PtrString(schedule.BackupProperties.Name)) table.AddSeparator() - table.AddRow("BACKUP RETENTION DAYS", *schedule.BackupProperties.RetentionPeriod) + table.AddRow("BACKUP RETENTION DAYS", utils.PtrString(schedule.BackupProperties.RetentionPeriod)) table.AddSeparator() ids := schedule.BackupProperties.VolumeIds table.AddRow("BACKUP VOLUME IDS", utils.JoinStringPtr(ids, "\n")) diff --git a/internal/cmd/beta/server/backup/schedule/describe/describe_test.go b/internal/cmd/beta/server/backup/schedule/describe/describe_test.go index 985989f62..d199f2dd3 100644 --- a/internal/cmd/beta/server/backup/schedule/describe/describe_test.go +++ b/internal/cmd/beta/server/backup/schedule/describe/describe_test.go @@ -4,12 +4,11 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/serverbackup" ) @@ -209,3 +208,66 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + schedule serverbackup.BackupSchedule + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "nil backup properties", + args: args{ + schedule: serverbackup.BackupSchedule{ + BackupProperties: nil, + }, + }, + }, + { + name: "empty backup properties", + args: args{ + schedule: serverbackup.BackupSchedule{ + BackupProperties: &serverbackup.BackupProperties{}, + }, + }, + }, + { + name: "nil volume ids", + args: args{ + schedule: serverbackup.BackupSchedule{ + BackupProperties: &serverbackup.BackupProperties{ + VolumeIds: nil, + }, + }, + }, + }, + { + name: "empty volume ids", + args: args{ + schedule: serverbackup.BackupSchedule{ + BackupProperties: &serverbackup.BackupProperties{ + VolumeIds: &[]string{}, + }, + }, + }, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.schedule); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/backup/schedule/list/list.go b/internal/cmd/beta/server/backup/schedule/list/list.go index 366d6a09b..ff8ba067d 100644 --- a/internal/cmd/beta/server/backup/schedule/list/list.go +++ b/internal/cmd/beta/server/backup/schedule/list/list.go @@ -13,6 +13,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -57,6 +59,17 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + // Call API req := buildRequest(ctx, model, apiClient) resp, err := req.Execute() @@ -65,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } schedules := *resp.Items if len(schedules) == 0 { - p.Info("No backup schedules found for server %s\n", model.ServerId) + p.Info("No backup schedules found for server %s\n", serverLabel) return nil } diff --git a/internal/cmd/beta/server/backup/schedule/list/list_test.go b/internal/cmd/beta/server/backup/schedule/list/list_test.go index e8667ba02..66bcf4748 100644 --- a/internal/cmd/beta/server/backup/schedule/list/list_test.go +++ b/internal/cmd/beta/server/backup/schedule/list/list_test.go @@ -186,3 +186,50 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + schedules []serverbackup.BackupSchedule + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty backup properties", + args: args{ + outputFormat: "", + schedules: []serverbackup.BackupSchedule{ + { + BackupProperties: &serverbackup.BackupProperties{}, + }, + }, + }, + wantErr: false, + }, + { + name: "output format json", + args: args{ + outputFormat: print.JSONOutputFormat, + schedules: []serverbackup.BackupSchedule{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.schedules); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/backup/schedule/update/update.go b/internal/cmd/beta/server/backup/schedule/update/update.go index 02fe6c92a..7c278c270 100644 --- a/internal/cmd/beta/server/backup/schedule/update/update.go +++ b/internal/cmd/beta/server/backup/schedule/update/update.go @@ -100,7 +100,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update Server Backup Schedule: %w", err) } - return outputResult(p, model, resp) + return outputResult(p, model.OutputFormat, *resp) }, } configureFlags(cmd) @@ -184,8 +184,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku return req, nil } -func outputResult(p *print.Printer, model *inputModel, resp *serverbackup.BackupSchedule) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat string, resp serverbackup.BackupSchedule) error { + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(resp, "", " ") if err != nil { diff --git a/internal/cmd/beta/server/backup/schedule/update/update_test.go b/internal/cmd/beta/server/backup/schedule/update/update_test.go index 86a5be4bc..c30a67cbd 100644 --- a/internal/cmd/beta/server/backup/schedule/update/update_test.go +++ b/internal/cmd/beta/server/backup/schedule/update/update_test.go @@ -276,3 +276,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + resp serverbackup.BackupSchedule + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/command/create/create.go b/internal/cmd/beta/server/command/create/create.go index 2729653f7..1ca0577f9 100644 --- a/internal/cmd/beta/server/command/create/create.go +++ b/internal/cmd/beta/server/command/create/create.go @@ -13,6 +13,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/runcommand/client" runcommandUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/runcommand/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -61,8 +63,19 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a Command for server %s?", model.ServerId) + prompt := fmt.Sprintf("Are you sure you want to create a Command for server %s?", serverLabel) err = p.PromptForConfirmation(prompt) if err != nil { return err @@ -79,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Server Command: %w", err) } - return outputResult(p, model, resp) + return outputResult(p, model.OutputFormat, serverLabel, *resp) }, } configureFlags(cmd) @@ -137,8 +150,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *runcommand. return req, nil } -func outputResult(p *print.Printer, model *inputModel, resp *runcommand.NewCommandResponse) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat, serverLabel string, resp runcommand.NewCommandResponse) error { + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(resp, "", " ") if err != nil { @@ -156,7 +169,7 @@ func outputResult(p *print.Printer, model *inputModel, resp *runcommand.NewComma return nil default: - p.Outputf("Created server command for server %s. Command ID: %s\n", model.ServerId, utils.PtrString(resp.Id)) + p.Outputf("Created server command for server %s. Command ID: %s\n", serverLabel, utils.PtrString(resp.Id)) return nil } } diff --git a/internal/cmd/beta/server/command/create/create_test.go b/internal/cmd/beta/server/command/create/create_test.go index 31ea154bf..c1a72f8b6 100644 --- a/internal/cmd/beta/server/command/create/create_test.go +++ b/internal/cmd/beta/server/command/create/create_test.go @@ -201,3 +201,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat, serverLabel string + resp runcommand.NewCommandResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/command/describe/describe.go b/internal/cmd/beta/server/command/describe/describe.go index 7bc408969..cfc1f067f 100644 --- a/internal/cmd/beta/server/command/describe/describe.go +++ b/internal/cmd/beta/server/command/describe/describe.go @@ -63,7 +63,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server command: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(p, model.OutputFormat, *resp) }, } configureFlags(cmd) @@ -108,7 +108,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *runcommand. return req } -func outputResult(p *print.Printer, outputFormat string, command *runcommand.CommandDetails) error { +func outputResult(p *print.Printer, outputFormat string, command runcommand.CommandDetails) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(command, "", " ") diff --git a/internal/cmd/beta/server/command/describe/describe_test.go b/internal/cmd/beta/server/command/describe/describe_test.go index 46fac2707..0d0b76f25 100644 --- a/internal/cmd/beta/server/command/describe/describe_test.go +++ b/internal/cmd/beta/server/command/describe/describe_test.go @@ -239,3 +239,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + command runcommand.CommandDetails + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.command); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/command/list/list.go b/internal/cmd/beta/server/command/list/list.go index 5768eef26..8db186da9 100644 --- a/internal/cmd/beta/server/command/list/list.go +++ b/internal/cmd/beta/server/command/list/list.go @@ -13,6 +13,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/runcommand/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -57,18 +59,28 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + // Call API req := buildRequest(ctx, model, apiClient) resp, err := req.Execute() if err != nil { return fmt.Errorf("list server commands: %w", err) } - commands := *resp.Items - if len(commands) == 0 { - p.Info("No commands found for server %s\n", model.ServerId) + if commands := resp.Items; commands == nil || len(*commands) == 0 { + p.Info("No commands found for server %s\n", serverLabel) return nil } - + commands := *resp.Items // Truncate output if model.Limit != nil && len(commands) > int(*model.Limit) { commands = commands[:*model.Limit] diff --git a/internal/cmd/beta/server/command/list/list_test.go b/internal/cmd/beta/server/command/list/list_test.go index e49a614c7..3d8ced5f2 100644 --- a/internal/cmd/beta/server/command/list/list_test.go +++ b/internal/cmd/beta/server/command/list/list_test.go @@ -186,3 +186,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + commands []runcommand.Commands + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.commands); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/command/template/describe/describe.go b/internal/cmd/beta/server/command/template/describe/describe.go index c44216b17..fd60b8c46 100644 --- a/internal/cmd/beta/server/command/template/describe/describe.go +++ b/internal/cmd/beta/server/command/template/describe/describe.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "fmt" - "strings" "github.com/goccy/go-yaml" "github.com/spf13/cobra" @@ -64,7 +63,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server command template: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(p, model.OutputFormat, *resp) }, } configureFlags(cmd) @@ -109,7 +108,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *runcommand. return req } -func outputResult(p *print.Printer, outputFormat string, commandTemplate *runcommand.CommandTemplateSchema) error { +func outputResult(p *print.Printer, outputFormat string, commandTemplate runcommand.CommandTemplateSchema) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(commandTemplate, "", " ") @@ -136,7 +135,7 @@ func outputResult(p *print.Printer, outputFormat string, commandTemplate *runcom table.AddRow("DESCRIPTION", utils.PtrString(commandTemplate.Description)) table.AddSeparator() if commandTemplate.OsType != nil { - table.AddRow("OS TYPE", strings.Join(*commandTemplate.OsType, "\n")) + table.AddRow("OS TYPE", utils.JoinStringPtr(commandTemplate.OsType, "\n")) table.AddSeparator() } if commandTemplate.ParameterSchema != nil { diff --git a/internal/cmd/beta/server/command/template/describe/describe_test.go b/internal/cmd/beta/server/command/template/describe/describe_test.go index 560d0ee93..b01268ae6 100644 --- a/internal/cmd/beta/server/command/template/describe/describe_test.go +++ b/internal/cmd/beta/server/command/template/describe/describe_test.go @@ -239,3 +239,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + commandTemplate runcommand.CommandTemplateSchema + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.commandTemplate); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/command/template/list/list.go b/internal/cmd/beta/server/command/template/list/list.go index 5290173a2..8be97f03b 100644 --- a/internal/cmd/beta/server/command/template/list/list.go +++ b/internal/cmd/beta/server/command/template/list/list.go @@ -61,11 +61,11 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { return fmt.Errorf("list server command templates: %w", err) } - templates := *resp.Items - if len(templates) == 0 { + if templates := resp.Items; templates == nil || len(*templates) == 0 { p.Info("No commands templates found\n") return nil } + templates := *resp.Items // Truncate output if model.Limit != nil && len(templates) > int(*model.Limit) { diff --git a/internal/cmd/beta/server/command/template/list/list_test.go b/internal/cmd/beta/server/command/template/list/list_test.go index 119302574..5c6cb12c8 100644 --- a/internal/cmd/beta/server/command/template/list/list_test.go +++ b/internal/cmd/beta/server/command/template/list/list_test.go @@ -183,3 +183,38 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + templates []runcommand.CommandTemplate + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty command template", + args: args{ + templates: []runcommand.CommandTemplate{ + {}, + }, + }, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.templates); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/console/console.go b/internal/cmd/beta/server/console/console.go index d5af1372e..026c942cb 100644 --- a/internal/cmd/beta/server/console/console.go +++ b/internal/cmd/beta/server/console/console.go @@ -62,6 +62,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId + } else if serverLabel == "" { + serverLabel = model.ServerId } // Call API @@ -71,7 +73,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("server console: %w", err) } - return outputResult(p, model, serverLabel, resp) + return outputResult(p, model.OutputFormat, serverLabel, *resp) }, } return cmd @@ -106,9 +108,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return apiClient.GetServerConsole(ctx, model.ProjectId, model.ServerId) } -func outputResult(p *print.Printer, model *inputModel, serverLabel string, serverUrl *iaas.ServerConsoleUrl) error { - outputFormat := model.OutputFormat - +func outputResult(p *print.Printer, outputFormat, serverLabel string, serverUrl iaas.ServerConsoleUrl) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(serverUrl, "", " ") diff --git a/internal/cmd/beta/server/console/console_test.go b/internal/cmd/beta/server/console/console_test.go index 1dfc48384..4d9b9e6c1 100644 --- a/internal/cmd/beta/server/console/console_test.go +++ b/internal/cmd/beta/server/console/console_test.go @@ -6,6 +6,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -206,3 +207,39 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat, serverLabel string + serverUrl iaas.ServerConsoleUrl + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "set server url", + args: args{ + serverUrl: iaas.ServerConsoleUrl{ + Url: utils.Ptr(""), + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.serverUrl); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/create/create.go b/internal/cmd/beta/server/create/create.go index 23a22a3ba..fb0cb24f6 100644 --- a/internal/cmd/beta/server/create/create.go +++ b/internal/cmd/beta/server/create/create.go @@ -155,7 +155,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model, projectLabel, resp) + return outputResult(p, model.OutputFormat, projectLabel, resp) }, } configureFlags(cmd) @@ -334,8 +334,11 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return req.CreateServerPayload(payload) } -func outputResult(p *print.Printer, model *inputModel, projectLabel string, server *iaas.Server) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat, projectLabel string, server *iaas.Server) error { + if server == nil { + return fmt.Errorf("server response is empty") + } + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(server, "", " ") if err != nil { diff --git a/internal/cmd/beta/server/create/create_test.go b/internal/cmd/beta/server/create/create_test.go index 2ac1afcac..b5ffb23f9 100644 --- a/internal/cmd/beta/server/create/create_test.go +++ b/internal/cmd/beta/server/create/create_test.go @@ -408,3 +408,38 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + projectLabel string + server *iaas.Server + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty with iaas server", + args: args{ + server: &iaas.Server{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.server); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/deallocate/deallocate.go b/internal/cmd/beta/server/deallocate/deallocate.go index 0bfe4205a..3cb27fb0b 100644 --- a/internal/cmd/beta/server/deallocate/deallocate.go +++ b/internal/cmd/beta/server/deallocate/deallocate.go @@ -57,6 +57,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId + } else if serverLabel == "" { + serverLabel = model.ServerId } if !model.AssumeYes { diff --git a/internal/cmd/beta/server/delete/delete.go b/internal/cmd/beta/server/delete/delete.go index 43b2a77cb..eaf994419 100644 --- a/internal/cmd/beta/server/delete/delete.go +++ b/internal/cmd/beta/server/delete/delete.go @@ -60,6 +60,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId + } else if serverLabel == "" { + serverLabel = model.ProjectId } if !model.AssumeYes { diff --git a/internal/cmd/beta/server/describe/describe.go b/internal/cmd/beta/server/describe/describe.go index 3b4b0cef8..ab87b4ba5 100644 --- a/internal/cmd/beta/server/describe/describe.go +++ b/internal/cmd/beta/server/describe/describe.go @@ -65,7 +65,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server: %w", err) } - return outputResult(p, model, resp) + return outputResult(p, model.OutputFormat, resp) }, } return cmd @@ -103,9 +103,10 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return req } -func outputResult(p *print.Printer, model *inputModel, server *iaas.Server) error { - outputFormat := model.OutputFormat - +func outputResult(p *print.Printer, outputFormat string, server *iaas.Server) error { + if server == nil { + return fmt.Errorf("api response is empty") + } switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(server, "", " ") diff --git a/internal/cmd/beta/server/describe/describe_test.go b/internal/cmd/beta/server/describe/describe_test.go index defc5dec6..d16a3ec04 100644 --- a/internal/cmd/beta/server/describe/describe_test.go +++ b/internal/cmd/beta/server/describe/describe_test.go @@ -217,3 +217,38 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + server *iaas.Server + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty server", + args: args{ + outputFormat: "", + server: &iaas.Server{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.server); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/list/list_test.go b/internal/cmd/beta/server/list/list_test.go index 8cc72571b..a8dfe0e1e 100644 --- a/internal/cmd/beta/server/list/list_test.go +++ b/internal/cmd/beta/server/list/list_test.go @@ -203,3 +203,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + servers []iaas.Server + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.servers); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/log/log.go b/internal/cmd/beta/server/log/log.go index 2de1b3246..3aaa51ed7 100644 --- a/internal/cmd/beta/server/log/log.go +++ b/internal/cmd/beta/server/log/log.go @@ -71,6 +71,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId + } else if serverLabel == "" { + serverLabel = model.ServerId } // Call API @@ -86,10 +88,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(lines) > int(*model.Length) { // Truncate output and show most recent logs start := len(lines) - int(*model.Length) - return outputResult(p, model, serverLabel, strings.Join(lines[start:], "\n")) + return outputResult(p, model.OutputFormat, serverLabel, strings.Join(lines[start:], "\n")) } - return outputResult(p, model, serverLabel, log) + return outputResult(p, model.OutputFormat, serverLabel, log) }, } configureFlags(cmd) @@ -138,9 +140,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return apiClient.GetServerLog(ctx, model.ProjectId, model.ServerId) } -func outputResult(p *print.Printer, model *inputModel, serverLabel, log string) error { - outputFormat := model.OutputFormat - +func outputResult(p *print.Printer, outputFormat, serverLabel, log string) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(log, "", " ") diff --git a/internal/cmd/beta/server/log/log_test.go b/internal/cmd/beta/server/log/log_test.go index 5e10870d6..50ce7c723 100644 --- a/internal/cmd/beta/server/log/log_test.go +++ b/internal/cmd/beta/server/log/log_test.go @@ -220,3 +220,31 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + serverLabel string + log string + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.log); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/machine-type/describe/describe.go b/internal/cmd/beta/server/machine-type/describe/describe.go index 6274f85ac..365a07205 100644 --- a/internal/cmd/beta/server/machine-type/describe/describe.go +++ b/internal/cmd/beta/server/machine-type/describe/describe.go @@ -101,6 +101,9 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, machineType *iaas.MachineType) error { + if machineType == nil { + return fmt.Errorf("api response for machine type is empty") + } switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(machineType, "", " ") diff --git a/internal/cmd/beta/server/machine-type/describe/describe_test.go b/internal/cmd/beta/server/machine-type/describe/describe_test.go index 44c5bcb78..32f6d9a0b 100644 --- a/internal/cmd/beta/server/machine-type/describe/describe_test.go +++ b/internal/cmd/beta/server/machine-type/describe/describe_test.go @@ -204,3 +204,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + machineType *iaas.MachineType + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.machineType); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/machine-type/list/list.go b/internal/cmd/beta/server/machine-type/list/list.go index ffa6343b5..a8511e53a 100644 --- a/internal/cmd/beta/server/machine-type/list/list.go +++ b/internal/cmd/beta/server/machine-type/list/list.go @@ -85,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { *resp.Items = (*resp.Items)[:*model.Limit] } - return outputResult(p, model, resp) + return outputResult(p, model.OutputFormat, *resp) }, } @@ -132,9 +132,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return apiClient.ListMachineTypes(ctx, model.ProjectId) } -func outputResult(p *print.Printer, model *inputModel, machineTypes *iaas.MachineTypeListResponse) error { - outputFormat := model.OutputFormat - +func outputResult(p *print.Printer, outputFormat string, machineTypes iaas.MachineTypeListResponse) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(machineTypes, "", " ") @@ -157,8 +155,10 @@ func outputResult(p *print.Printer, model *inputModel, machineTypes *iaas.Machin table.SetTitle("Machine-Types") table.SetHeader("NAME", "DESCRIPTION") - for _, machineType := range *machineTypes.GetItems() { - table.AddRow(*machineType.Name, utils.PtrString(machineType.Description)) + if items := machineTypes.GetItems(); items != nil && len(*items) > 0 { + for _, machineType := range *items { + table.AddRow(*machineType.Name, utils.PtrString(machineType.Description)) + } } err := table.Display(p) diff --git a/internal/cmd/beta/server/machine-type/list/list_test.go b/internal/cmd/beta/server/machine-type/list/list_test.go index a76fcf00b..a38d4f386 100644 --- a/internal/cmd/beta/server/machine-type/list/list_test.go +++ b/internal/cmd/beta/server/machine-type/list/list_test.go @@ -188,3 +188,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + machineTypes iaas.MachineTypeListResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.machineTypes); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/network-interface/detach/detach.go b/internal/cmd/beta/server/network-interface/detach/detach.go index 57e9c1f7a..993c4426c 100644 --- a/internal/cmd/beta/server/network-interface/detach/detach.go +++ b/internal/cmd/beta/server/network-interface/detach/detach.go @@ -68,6 +68,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId + } else if serverLabel == "" { + serverLabel = *model.ServerId } // if the delete flag is provided a network interface is detached and deleted diff --git a/internal/cmd/beta/server/network-interface/list/list.go b/internal/cmd/beta/server/network-interface/list/list.go index 8f0d3b928..de6fd5100 100644 --- a/internal/cmd/beta/server/network-interface/list/list.go +++ b/internal/cmd/beta/server/network-interface/list/list.go @@ -76,6 +76,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId + } else if serverLabel == "" { + serverLabel = *model.ServerId } p.Info("No attached network interfaces found for server %q\n", serverLabel) return nil diff --git a/internal/cmd/beta/server/network-interface/list/list_test.go b/internal/cmd/beta/server/network-interface/list/list_test.go index 9f729b86a..5ce4e90c6 100644 --- a/internal/cmd/beta/server/network-interface/list/list_test.go +++ b/internal/cmd/beta/server/network-interface/list/list_test.go @@ -209,3 +209,40 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + serverId string + serverNics []iaas.NIC + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty nic", + args: args{ + serverNics: []iaas.NIC{ + {}, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serverId, tt.args.serverNics); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/os-update/create/create.go b/internal/cmd/beta/server/os-update/create/create.go index db998a374..ac00b378e 100644 --- a/internal/cmd/beta/server/os-update/create/create.go +++ b/internal/cmd/beta/server/os-update/create/create.go @@ -12,6 +12,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverosupdate/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -60,8 +62,19 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a os-update for server %s?", model.ServerId) + prompt := fmt.Sprintf("Are you sure you want to create a os-update for server %s?", serverLabel) err = p.PromptForConfirmation(prompt) if err != nil { return err @@ -78,7 +91,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Server os-update: %w", err) } - return outputResult(p, model, resp) + return outputResult(p, model.OutputFormat, serverLabel, *resp) }, } configureFlags(cmd) @@ -123,8 +136,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverupdat return req, nil } -func outputResult(p *print.Printer, model *inputModel, resp *serverupdate.Update) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat, serverLabel string, resp serverupdate.Update) error { + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(resp, "", " ") if err != nil { @@ -142,7 +155,7 @@ func outputResult(p *print.Printer, model *inputModel, resp *serverupdate.Update return nil default: - p.Outputf("Triggered creation of server os-update for server %s. Update ID: %s\n", model.ServerId, utils.PtrString(resp.Id)) + p.Outputf("Triggered creation of server os-update for server %s. Update ID: %s\n", serverLabel, utils.PtrString(resp.Id)) return nil } } diff --git a/internal/cmd/beta/server/os-update/create/create_test.go b/internal/cmd/beta/server/os-update/create/create_test.go index 2402f81a8..e2a38ea36 100644 --- a/internal/cmd/beta/server/os-update/create/create_test.go +++ b/internal/cmd/beta/server/os-update/create/create_test.go @@ -203,3 +203,31 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + serverLabel string + resp serverupdate.Update + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/os-update/describe/describe.go b/internal/cmd/beta/server/os-update/describe/describe.go index 820edddda..ac3a588d7 100644 --- a/internal/cmd/beta/server/os-update/describe/describe.go +++ b/internal/cmd/beta/server/os-update/describe/describe.go @@ -63,7 +63,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server os-update: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(p, model.OutputFormat, *resp) }, } configureFlags(cmd) @@ -108,7 +108,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverupdat return req } -func outputResult(p *print.Printer, outputFormat string, update *serverupdate.Update) error { +func outputResult(p *print.Printer, outputFormat string, update serverupdate.Update) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(update, "", " ") diff --git a/internal/cmd/beta/server/os-update/describe/describe_test.go b/internal/cmd/beta/server/os-update/describe/describe_test.go index e02f0298f..fb345e40a 100644 --- a/internal/cmd/beta/server/os-update/describe/describe_test.go +++ b/internal/cmd/beta/server/os-update/describe/describe_test.go @@ -209,3 +209,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + update serverupdate.Update + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.update); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/os-update/disable/disable.go b/internal/cmd/beta/server/os-update/disable/disable.go index 1fbc89823..cfd937ec1 100644 --- a/internal/cmd/beta/server/os-update/disable/disable.go +++ b/internal/cmd/beta/server/os-update/disable/disable.go @@ -10,6 +10,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverosupdate/client" "github.com/spf13/cobra" @@ -49,8 +51,19 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to disable the os-update service for server %s?", model.ServerId) + prompt := fmt.Sprintf("Are you sure you want to disable the os-update service for server %s?", serverLabel) err = p.PromptForConfirmation(prompt) if err != nil { return err @@ -64,7 +77,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("disable server os-update service: %w", err) } - p.Info("Disabled Server os-update service for server %s\n", model.ServerId) + p.Info("Disabled Server os-update service for server %s\n", serverLabel) return nil }, } diff --git a/internal/cmd/beta/server/os-update/enable/enable.go b/internal/cmd/beta/server/os-update/enable/enable.go index c16d19318..9cb96b806 100644 --- a/internal/cmd/beta/server/os-update/enable/enable.go +++ b/internal/cmd/beta/server/os-update/enable/enable.go @@ -11,6 +11,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverosupdate/client" "github.com/spf13/cobra" @@ -50,8 +52,19 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to enable the server os-update service for server %s?", model.ServerId) + prompt := fmt.Sprintf("Are you sure you want to enable the server os-update service for server %s?", serverLabel) err = p.PromptForConfirmation(prompt) if err != nil { return err @@ -67,7 +80,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } } - p.Info("Enabled os-update service for server %s\n", model.ServerId) + p.Info("Enabled os-update service for server %s\n", serverLabel) return nil }, } diff --git a/internal/cmd/beta/server/os-update/list/list.go b/internal/cmd/beta/server/os-update/list/list.go index 10e71108f..6da7e4fcc 100644 --- a/internal/cmd/beta/server/os-update/list/list.go +++ b/internal/cmd/beta/server/os-update/list/list.go @@ -12,6 +12,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverosupdate/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -67,7 +69,17 @@ func NewCmd(p *print.Printer) *cobra.Command { } updates := *resp.Items if len(updates) == 0 { - p.Info("No os-updates found for server %s\n", model.ServerId) + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + p.Info("No os-updates found for server %s\n", serverLabel) return nil } diff --git a/internal/cmd/beta/server/os-update/list/list_test.go b/internal/cmd/beta/server/os-update/list/list_test.go index 32f75311c..4b6df9161 100644 --- a/internal/cmd/beta/server/os-update/list/list_test.go +++ b/internal/cmd/beta/server/os-update/list/list_test.go @@ -186,3 +186,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + updates []serverupdate.Update + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.updates); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/os-update/schedule/create/create.go b/internal/cmd/beta/server/os-update/schedule/create/create.go index 861ec9629..f36756391 100644 --- a/internal/cmd/beta/server/os-update/schedule/create/create.go +++ b/internal/cmd/beta/server/os-update/schedule/create/create.go @@ -12,6 +12,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverosupdate/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -69,8 +71,19 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a os-update Schedule for server %s?", model.ServerId) + prompt := fmt.Sprintf("Are you sure you want to create a os-update Schedule for server %s?", serverLabel) err = p.PromptForConfirmation(prompt) if err != nil { return err @@ -87,7 +100,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Server os-update Schedule: %w", err) } - return outputResult(p, model, resp) + return outputResult(p, model.OutputFormat, serverLabel, *resp) }, } configureFlags(cmd) @@ -143,8 +156,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverupdat return req, nil } -func outputResult(p *print.Printer, model *inputModel, resp *serverupdate.UpdateSchedule) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat, serverLabel string, resp serverupdate.UpdateSchedule) error { + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(resp, "", " ") if err != nil { @@ -162,7 +175,7 @@ func outputResult(p *print.Printer, model *inputModel, resp *serverupdate.Update return nil default: - p.Outputf("Created server os-update schedule for server %s. os-update Schedule ID: %s\n", model.ServerId, utils.PtrString(resp.Id)) + p.Outputf("Created server os-update schedule for server %s. os-update Schedule ID: %s\n", serverLabel, utils.PtrString(resp.Id)) return nil } } diff --git a/internal/cmd/beta/server/os-update/schedule/create/create_test.go b/internal/cmd/beta/server/os-update/schedule/create/create_test.go index 31e6f781b..169167532 100644 --- a/internal/cmd/beta/server/os-update/schedule/create/create_test.go +++ b/internal/cmd/beta/server/os-update/schedule/create/create_test.go @@ -210,3 +210,31 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + serverLabel string + resp serverupdate.UpdateSchedule + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/os-update/schedule/describe/describe.go b/internal/cmd/beta/server/os-update/schedule/describe/describe.go index e0a20bf1f..efacb1fbe 100644 --- a/internal/cmd/beta/server/os-update/schedule/describe/describe.go +++ b/internal/cmd/beta/server/os-update/schedule/describe/describe.go @@ -63,7 +63,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server os-update schedule: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(p, model.OutputFormat, *resp) }, } configureFlags(cmd) @@ -108,7 +108,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverupdat return req } -func outputResult(p *print.Printer, outputFormat string, schedule *serverupdate.UpdateSchedule) error { +func outputResult(p *print.Printer, outputFormat string, schedule serverupdate.UpdateSchedule) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(schedule, "", " ") diff --git a/internal/cmd/beta/server/os-update/schedule/describe/describe_test.go b/internal/cmd/beta/server/os-update/schedule/describe/describe_test.go index f1165bb00..411148262 100644 --- a/internal/cmd/beta/server/os-update/schedule/describe/describe_test.go +++ b/internal/cmd/beta/server/os-update/schedule/describe/describe_test.go @@ -209,3 +209,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + schedule serverupdate.UpdateSchedule + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.schedule); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/os-update/schedule/list/list.go b/internal/cmd/beta/server/os-update/schedule/list/list.go index 8efd95198..ad46f0de2 100644 --- a/internal/cmd/beta/server/os-update/schedule/list/list.go +++ b/internal/cmd/beta/server/os-update/schedule/list/list.go @@ -13,6 +13,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverosupdate/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -65,7 +67,17 @@ func NewCmd(p *print.Printer) *cobra.Command { } schedules := *resp.Items if len(schedules) == 0 { - p.Info("No os-update schedules found for server %s\n", model.ServerId) + serverLabel := model.ServerId + // Get server name + if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + if err != nil { + p.Debug(print.ErrorLevel, "get server name: %v", err) + } else if serverName != "" { + serverLabel = serverName + } + } + p.Info("No os-update schedules found for server %s\n", serverLabel) return nil } diff --git a/internal/cmd/beta/server/os-update/schedule/list/list_test.go b/internal/cmd/beta/server/os-update/schedule/list/list_test.go index 6c0ce72f7..61a3ca5ca 100644 --- a/internal/cmd/beta/server/os-update/schedule/list/list_test.go +++ b/internal/cmd/beta/server/os-update/schedule/list/list_test.go @@ -186,3 +186,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + schedules []serverupdate.UpdateSchedule + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.schedules); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/os-update/schedule/update/update.go b/internal/cmd/beta/server/os-update/schedule/update/update.go index 7b4b057a3..cea340336 100644 --- a/internal/cmd/beta/server/os-update/schedule/update/update.go +++ b/internal/cmd/beta/server/os-update/schedule/update/update.go @@ -92,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update Server os-update Schedule: %w", err) } - return outputResult(p, model, resp) + return outputResult(p, model.OutputFormat, *resp) }, } configureFlags(cmd) @@ -166,8 +166,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverupdat return req, nil } -func outputResult(p *print.Printer, model *inputModel, resp *serverupdate.UpdateSchedule) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat string, resp serverupdate.UpdateSchedule) error { + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(resp, "", " ") if err != nil { diff --git a/internal/cmd/beta/server/os-update/schedule/update/update_test.go b/internal/cmd/beta/server/os-update/schedule/update/update_test.go index 20d8afe36..a821be003 100644 --- a/internal/cmd/beta/server/os-update/schedule/update/update_test.go +++ b/internal/cmd/beta/server/os-update/schedule/update/update_test.go @@ -263,3 +263,30 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + resp serverupdate.UpdateSchedule + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/public-ip/attach/attach.go b/internal/cmd/beta/server/public-ip/attach/attach.go index 47d55e750..ff6e6c05d 100644 --- a/internal/cmd/beta/server/public-ip/attach/attach.go +++ b/internal/cmd/beta/server/public-ip/attach/attach.go @@ -56,8 +56,8 @@ func NewCmd(p *print.Printer) *cobra.Command { publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.PublicIpId) if err != nil { p.Debug(print.ErrorLevel, "get public ip name: %v", err) - } - if publicIpLabel == "" { + publicIpLabel = model.PublicIpId + } else if publicIpLabel == "" { publicIpLabel = model.PublicIpId } @@ -65,6 +65,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId + } else if serverLabel == "" { + serverLabel = *model.ServerId } if !model.AssumeYes { diff --git a/internal/cmd/beta/server/public-ip/detach/detach.go b/internal/cmd/beta/server/public-ip/detach/detach.go index d476db50f..a5c0d366e 100644 --- a/internal/cmd/beta/server/public-ip/detach/detach.go +++ b/internal/cmd/beta/server/public-ip/detach/detach.go @@ -58,8 +58,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get public ip: %v", err) publicIpLabel = model.PublicIpId - } - if publicIpLabel == "" { + } else if publicIpLabel == "" { publicIpLabel = model.PublicIpId } @@ -67,6 +66,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId + } else if serverLabel == "" { + serverLabel = *model.ServerId } if !model.AssumeYes { diff --git a/internal/cmd/beta/server/reboot/reboot.go b/internal/cmd/beta/server/reboot/reboot.go index d5ec2bae5..2c32ac2c4 100644 --- a/internal/cmd/beta/server/reboot/reboot.go +++ b/internal/cmd/beta/server/reboot/reboot.go @@ -65,8 +65,9 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId + } else if serverLabel == "" { + serverLabel = model.ServerId } - if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to reboot server %q?", serverLabel) err = p.PromptForConfirmation(prompt) diff --git a/internal/cmd/beta/server/rescue/rescue.go b/internal/cmd/beta/server/rescue/rescue.go index ef6474220..69f4be349 100644 --- a/internal/cmd/beta/server/rescue/rescue.go +++ b/internal/cmd/beta/server/rescue/rescue.go @@ -61,6 +61,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId + } else if serverLabel == "" { + serverLabel = model.ServerId } if !model.AssumeYes { diff --git a/internal/cmd/beta/server/resize/resize.go b/internal/cmd/beta/server/resize/resize.go index 105967c6e..6cd7da807 100644 --- a/internal/cmd/beta/server/resize/resize.go +++ b/internal/cmd/beta/server/resize/resize.go @@ -61,6 +61,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId + } else if serverLabel == "" { + serverLabel = model.ServerId } if !model.AssumeYes { diff --git a/internal/cmd/beta/server/service-account/attach/attach.go b/internal/cmd/beta/server/service-account/attach/attach.go index 87bfbaa31..cb822440d 100644 --- a/internal/cmd/beta/server/service-account/attach/attach.go +++ b/internal/cmd/beta/server/service-account/attach/attach.go @@ -59,6 +59,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId + } else if serverLabel == "" { + serverLabel = *model.ServerId } if !model.AssumeYes { @@ -76,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("attach service account to server: %w", err) } - return outputResult(p, model.OutputFormat, model.ServiceAccMail, serverLabel, resp) + return outputResult(p, model.OutputFormat, model.ServiceAccMail, serverLabel, *resp) }, } configureFlags(cmd) @@ -120,7 +122,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return req } -func outputResult(p *print.Printer, outputFormat, serviceAccMail, serverLabel string, serviceAccounts *iaas.ServiceAccountMailListResponse) error { +func outputResult(p *print.Printer, outputFormat, serviceAccMail, serverLabel string, serviceAccounts iaas.ServiceAccountMailListResponse) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(serviceAccounts, "", " ") diff --git a/internal/cmd/beta/server/service-account/attach/attach_test.go b/internal/cmd/beta/server/service-account/attach/attach_test.go index f7854c24b..fddde577b 100644 --- a/internal/cmd/beta/server/service-account/attach/attach_test.go +++ b/internal/cmd/beta/server/service-account/attach/attach_test.go @@ -224,3 +224,32 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + serviceAccMail string + serverLabel string + serviceAccounts iaas.ServiceAccountMailListResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serviceAccMail, tt.args.serverLabel, tt.args.serviceAccounts); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/service-account/detach/detach.go b/internal/cmd/beta/server/service-account/detach/detach.go index 7c5587842..e6ed7df88 100644 --- a/internal/cmd/beta/server/service-account/detach/detach.go +++ b/internal/cmd/beta/server/service-account/detach/detach.go @@ -59,6 +59,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId + } else if serverLabel == "" { + serverLabel = *model.ServerId } if !model.AssumeYes { @@ -76,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("detach service account request: %w", err) } - return outputResult(p, model.OutputFormat, model.ServiceAccMail, serverLabel, resp) + return outputResult(p, model.OutputFormat, model.ServiceAccMail, serverLabel, *resp) }, } configureFlags(cmd) @@ -120,7 +122,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return req } -func outputResult(p *print.Printer, outputFormat, serviceAccMail, serverLabel string, service *iaas.ServiceAccountMailListResponse) error { +func outputResult(p *print.Printer, outputFormat, serviceAccMail, serverLabel string, service iaas.ServiceAccountMailListResponse) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(service, "", " ") diff --git a/internal/cmd/beta/server/service-account/detach/detach_test.go b/internal/cmd/beta/server/service-account/detach/detach_test.go index 5250e0a6f..ffee083d4 100644 --- a/internal/cmd/beta/server/service-account/detach/detach_test.go +++ b/internal/cmd/beta/server/service-account/detach/detach_test.go @@ -224,3 +224,32 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + serviceAccMail string + serverLabel string + service iaas.ServiceAccountMailListResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serviceAccMail, tt.args.serverLabel, tt.args.service); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/service-account/list/list.go b/internal/cmd/beta/server/service-account/list/list.go index e02b9d3ae..0b5120e7d 100644 --- a/internal/cmd/beta/server/service-account/list/list.go +++ b/internal/cmd/beta/server/service-account/list/list.go @@ -67,6 +67,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverName = *model.ServerId + } else if serverName == "" { + serverName = *model.ServerId } // Call API @@ -77,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } serviceAccounts := *resp.Items if len(serviceAccounts) == 0 { - p.Info("No service accounts found for server %s\n", *model.ServerId) + p.Info("No service accounts found for server %s\n", serverName) return nil } diff --git a/internal/cmd/beta/server/service-account/list/list_test.go b/internal/cmd/beta/server/service-account/list/list_test.go index 04ba8c721..961ba2a0a 100644 --- a/internal/cmd/beta/server/service-account/list/list_test.go +++ b/internal/cmd/beta/server/service-account/list/list_test.go @@ -219,3 +219,41 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + serverId string + serverName string + serviceAccounts []string + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty service account", + args: args{ + serviceAccounts: []string{ + "", + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serverId, tt.args.serverName, tt.args.serviceAccounts); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/start/start.go b/internal/cmd/beta/server/start/start.go index 9c8447982..e9f908703 100644 --- a/internal/cmd/beta/server/start/start.go +++ b/internal/cmd/beta/server/start/start.go @@ -57,6 +57,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId + } else if serverLabel == "" { + serverLabel = model.ServerId } // Call API diff --git a/internal/cmd/beta/server/stop/stop.go b/internal/cmd/beta/server/stop/stop.go index d16a636de..53952101f 100644 --- a/internal/cmd/beta/server/stop/stop.go +++ b/internal/cmd/beta/server/stop/stop.go @@ -57,6 +57,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId + } else if serverLabel == "" { + serverLabel = model.ServerId } if !model.AssumeYes { diff --git a/internal/cmd/beta/server/unrescue/unrescue.go b/internal/cmd/beta/server/unrescue/unrescue.go index 39a7040f7..647a15e85 100644 --- a/internal/cmd/beta/server/unrescue/unrescue.go +++ b/internal/cmd/beta/server/unrescue/unrescue.go @@ -57,6 +57,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId + } else if serverLabel == "" { + serverLabel = model.ServerId } if !model.AssumeYes { diff --git a/internal/cmd/beta/server/update/update.go b/internal/cmd/beta/server/update/update.go index 9067d5a45..223942890 100644 --- a/internal/cmd/beta/server/update/update.go +++ b/internal/cmd/beta/server/update/update.go @@ -67,6 +67,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId + } else if serverLabel == "" { + serverLabel = model.ServerId } if !model.AssumeYes { @@ -84,7 +86,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update server: %w", err) } - return outputResult(p, model, serverLabel, resp) + return outputResult(p, model.OutputFormat, serverLabel, resp) }, } configureFlags(cmd) @@ -143,8 +145,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return req.UpdateServerPayload(payload) } -func outputResult(p *print.Printer, model *inputModel, serverLabel string, server *iaas.Server) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat, serverLabel string, server *iaas.Server) error { + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(server, "", " ") if err != nil { diff --git a/internal/cmd/beta/server/update/update_test.go b/internal/cmd/beta/server/update/update_test.go index f06cbd6a5..5286eb70f 100644 --- a/internal/cmd/beta/server/update/update_test.go +++ b/internal/cmd/beta/server/update/update_test.go @@ -250,3 +250,31 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + serverLabel string + server *iaas.Server + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.server); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/volume/attach/attach.go b/internal/cmd/beta/server/volume/attach/attach.go index 25b2a722a..5a5f3b484 100644 --- a/internal/cmd/beta/server/volume/attach/attach.go +++ b/internal/cmd/beta/server/volume/attach/attach.go @@ -68,8 +68,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId - } - if volumeLabel == "" { + } else if volumeLabel == "" { volumeLabel = model.VolumeId } @@ -77,6 +76,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId + } else if serverLabel == "" { + serverLabel = *model.ServerId } if !model.AssumeYes { @@ -94,7 +95,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("attach server volume: %w", err) } - return outputResult(p, model.OutputFormat, volumeLabel, serverLabel, resp) + return outputResult(p, model.OutputFormat, volumeLabel, serverLabel, *resp) }, } configureFlags(cmd) @@ -143,7 +144,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return req.AddVolumeToServerPayload(payload) } -func outputResult(p *print.Printer, outputFormat, volumeLabel, serverLabel string, volume *iaas.VolumeAttachment) error { +func outputResult(p *print.Printer, outputFormat, volumeLabel, serverLabel string, volume iaas.VolumeAttachment) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(volume, "", " ") diff --git a/internal/cmd/beta/server/volume/attach/attach_test.go b/internal/cmd/beta/server/volume/attach/attach_test.go index 9dd33f77f..29dd0ff1f 100644 --- a/internal/cmd/beta/server/volume/attach/attach_test.go +++ b/internal/cmd/beta/server/volume/attach/attach_test.go @@ -249,3 +249,32 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + volumeLabel string + serverLabel string + volume iaas.VolumeAttachment + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.volumeLabel, tt.args.serverLabel, tt.args.volume); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/volume/describe/describe.go b/internal/cmd/beta/server/volume/describe/describe.go index 29648759e..8ec3b488a 100644 --- a/internal/cmd/beta/server/volume/describe/describe.go +++ b/internal/cmd/beta/server/volume/describe/describe.go @@ -68,12 +68,16 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId + } else if volumeLabel == "" { + volumeLabel = model.VolumeId } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId + } else if serverLabel == "" { + serverLabel = *model.ServerId } // Call API @@ -83,7 +87,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("describe server volume: %w", err) } - return outputResult(p, model.OutputFormat, serverLabel, volumeLabel, resp) + return outputResult(p, model.OutputFormat, serverLabel, volumeLabel, *resp) }, } configureFlags(cmd) @@ -127,7 +131,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return req } -func outputResult(p *print.Printer, outputFormat, serverLabel, volumeLabel string, volume *iaas.VolumeAttachment) error { +func outputResult(p *print.Printer, outputFormat, serverLabel, volumeLabel string, volume iaas.VolumeAttachment) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(volume, "", " ") @@ -158,7 +162,7 @@ func outputResult(p *print.Printer, outputFormat, serverLabel, volumeLabel strin table.AddRow("VOLUME NAME", volumeLabel) table.AddSeparator() } - table.AddRow("DELETE ON TERMINATION", *volume.DeleteOnTermination) + table.AddRow("DELETE ON TERMINATION", utils.PtrString(volume.DeleteOnTermination)) table.AddSeparator() err := table.Display(p) diff --git a/internal/cmd/beta/server/volume/describe/describe_test.go b/internal/cmd/beta/server/volume/describe/describe_test.go index 1d53423de..c86b57259 100644 --- a/internal/cmd/beta/server/volume/describe/describe_test.go +++ b/internal/cmd/beta/server/volume/describe/describe_test.go @@ -225,3 +225,32 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + serverLabel string + volumeLabel string + volume iaas.VolumeAttachment + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.volumeLabel, tt.args.volume); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/volume/detach/detach.go b/internal/cmd/beta/server/volume/detach/detach.go index 8e07fd216..858d749e5 100644 --- a/internal/cmd/beta/server/volume/detach/detach.go +++ b/internal/cmd/beta/server/volume/detach/detach.go @@ -58,8 +58,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId - } - if volumeLabel == "" { + } else if volumeLabel == "" { volumeLabel = model.VolumeId } @@ -67,6 +66,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId + } else if serverLabel == "" { + serverLabel = *model.ServerId } if !model.AssumeYes { diff --git a/internal/cmd/beta/server/volume/list/list.go b/internal/cmd/beta/server/volume/list/list.go index f6f39e7ad..54bde7194 100644 --- a/internal/cmd/beta/server/volume/list/list.go +++ b/internal/cmd/beta/server/volume/list/list.go @@ -60,6 +60,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId + } else if serverLabel == "" { + serverLabel = *model.ServerId } // Call API @@ -70,7 +72,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } volumes := *resp.Items if len(volumes) == 0 { - p.Info("No volumes found for server %s\n", *model.ServerId) + p.Info("No volumes found for server %s\n", serverLabel) return nil } @@ -149,7 +151,11 @@ func outputResult(p *print.Printer, outputFormat, serverLabel string, volumeName table.SetHeader("SERVER ID", "SERVER NAME", "VOLUME ID", "VOLUME NAME") for i := range volumes { s := volumes[i] - table.AddRow(utils.PtrString(s.ServerId), serverLabel, utils.PtrString(s.VolumeId), volumeNames[i]) + var volumeName string + if len(volumeNames)-1 > i { + volumeName = volumeNames[i] + } + table.AddRow(utils.PtrString(s.ServerId), serverLabel, utils.PtrString(s.VolumeId), volumeName) } err := table.Display(p) if err != nil { diff --git a/internal/cmd/beta/server/volume/list/list_test.go b/internal/cmd/beta/server/volume/list/list_test.go index 288c65fd6..b9c37814f 100644 --- a/internal/cmd/beta/server/volume/list/list_test.go +++ b/internal/cmd/beta/server/volume/list/list_test.go @@ -191,3 +191,41 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + serverLabel string + volumeNames []string + volumes []iaas.VolumeAttachment + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty volume", + args: args{ + volumes: []iaas.VolumeAttachment{ + {}, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.volumeNames, tt.args.volumes); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/server/volume/update/update.go b/internal/cmd/beta/server/volume/update/update.go index 289593b65..7b90de143 100644 --- a/internal/cmd/beta/server/volume/update/update.go +++ b/internal/cmd/beta/server/volume/update/update.go @@ -64,8 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId - } - if volumeLabel == "" { + } else if volumeLabel == "" { volumeLabel = model.VolumeId } @@ -73,6 +72,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId + } else if serverLabel == "" { + serverLabel = *model.ServerId } if !model.AssumeYes { @@ -90,7 +91,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update server volume: %w", err) } - return outputResult(p, model.OutputFormat, volumeLabel, serverLabel, resp) + return outputResult(p, model.OutputFormat, volumeLabel, serverLabel, *resp) }, } configureFlags(cmd) @@ -139,7 +140,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return req.UpdateAttachedVolumePayload(payload) } -func outputResult(p *print.Printer, outputFormat, volumeLabel, serverLabel string, volume *iaas.VolumeAttachment) error { +func outputResult(p *print.Printer, outputFormat, volumeLabel, serverLabel string, volume iaas.VolumeAttachment) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(volume, "", " ") diff --git a/internal/cmd/beta/server/volume/update/update_test.go b/internal/cmd/beta/server/volume/update/update_test.go index 5d8171fbf..46d5a0d20 100644 --- a/internal/cmd/beta/server/volume/update/update_test.go +++ b/internal/cmd/beta/server/volume/update/update_test.go @@ -248,3 +248,32 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + volumeLabel string + serverLabel string + volume iaas.VolumeAttachment + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.volumeLabel, tt.args.serverLabel, tt.args.volume); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +}