Skip to content

Commit e12c8c2

Browse files
authored
fix: stackit beta server commands - add nil pointer checks and tests for the outputResult functions (#604)
* Add nil pointer checks and tests for the outputResult functions * Add checks if serverLabel is empty
1 parent 6213bb5 commit e12c8c2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+1468
-121
lines changed

internal/cmd/beta/server/backup/create/create.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212
"github.com/stackitcloud/stackit-cli/internal/pkg/flags"
1313
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
1414
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
15+
iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client"
16+
iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils"
1517
"github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client"
1618
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
1719

@@ -65,6 +67,17 @@ func NewCmd(p *print.Printer) *cobra.Command {
6567
return err
6668
}
6769

70+
serverLabel := model.ServerId
71+
// Get server name
72+
if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil {
73+
serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId)
74+
if err != nil {
75+
p.Debug(print.ErrorLevel, "get server name: %v", err)
76+
} else if serverName != "" {
77+
serverLabel = serverName
78+
}
79+
}
80+
6881
if !model.AssumeYes {
6982
prompt := fmt.Sprintf("Are you sure you want to create a Backup for server %s?", model.ServerId)
7083
err = p.PromptForConfirmation(prompt)
@@ -83,7 +96,7 @@ func NewCmd(p *print.Printer) *cobra.Command {
8396
return fmt.Errorf("create Server Backup: %w", err)
8497
}
8598

86-
return outputResult(p, model, resp)
99+
return outputResult(p, model.OutputFormat, serverLabel, *resp)
87100
},
88101
}
89102
configureFlags(cmd)
@@ -140,8 +153,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku
140153
return req, nil
141154
}
142155

143-
func outputResult(p *print.Printer, model *inputModel, resp *serverbackup.BackupJob) error {
144-
switch model.OutputFormat {
156+
func outputResult(p *print.Printer, outputFormat, serverLabel string, resp serverbackup.BackupJob) error {
157+
switch outputFormat {
145158
case print.JSONOutputFormat:
146159
details, err := json.MarshalIndent(resp, "", " ")
147160
if err != nil {
@@ -159,7 +172,7 @@ func outputResult(p *print.Printer, model *inputModel, resp *serverbackup.Backup
159172

160173
return nil
161174
default:
162-
p.Outputf("Triggered creation of server backup for server %s. Backup ID: %s\n", model.ServerId, utils.PtrString(resp.Id))
175+
p.Outputf("Triggered creation of server backup for server %s. Backup ID: %s\n", serverLabel, utils.PtrString(resp.Id))
163176
return nil
164177
}
165178
}

internal/cmd/beta/server/backup/create/create_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,3 +208,31 @@ func TestBuildRequest(t *testing.T) {
208208
})
209209
}
210210
}
211+
212+
func TestOutputResult(t *testing.T) {
213+
type args struct {
214+
outputFormat string
215+
serverLabel string
216+
resp serverbackup.BackupJob
217+
}
218+
tests := []struct {
219+
name string
220+
args args
221+
wantErr bool
222+
}{
223+
{
224+
name: "empty",
225+
args: args{},
226+
wantErr: false,
227+
},
228+
}
229+
p := print.NewPrinter()
230+
p.Cmd = NewCmd(p)
231+
for _, tt := range tests {
232+
t.Run(tt.name, func(t *testing.T) {
233+
if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr {
234+
t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr)
235+
}
236+
})
237+
}
238+
}

internal/cmd/beta/server/backup/describe/describe.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"encoding/json"
66
"fmt"
7+
"strconv"
78

89
"github.com/goccy/go-yaml"
910
"github.com/stackitcloud/stackit-cli/internal/pkg/args"
@@ -64,7 +65,7 @@ func NewCmd(p *print.Printer) *cobra.Command {
6465
return fmt.Errorf("read server backup: %w", err)
6566
}
6667

67-
return outputResult(p, model.OutputFormat, resp)
68+
return outputResult(p, model.OutputFormat, *resp)
6869
},
6970
}
7071
configureFlags(cmd)
@@ -109,7 +110,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku
109110
return req
110111
}
111112

112-
func outputResult(p *print.Printer, outputFormat string, backup *serverbackup.Backup) error {
113+
func outputResult(p *print.Printer, outputFormat string, backup serverbackup.Backup) error {
113114
switch outputFormat {
114115
case print.JSONOutputFormat:
115116
details, err := json.MarshalIndent(backup, "", " ")
@@ -145,7 +146,11 @@ func outputResult(p *print.Printer, outputFormat string, backup *serverbackup.Ba
145146
lastRestored := utils.PtrStringDefault(backup.LastRestoredAt, "")
146147
table.AddRow("LAST RESTORED AT", lastRestored)
147148
table.AddSeparator()
148-
table.AddRow("VOLUME BACKUPS", len(*backup.VolumeBackups))
149+
volBackups := ""
150+
if backups := backup.VolumeBackups; backups != nil {
151+
volBackups = strconv.Itoa(len(*backups))
152+
}
153+
table.AddRow("VOLUME BACKUPS", volBackups)
149154
table.AddSeparator()
150155

151156
err := table.Display(p)

internal/cmd/beta/server/backup/describe/describe_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,3 +209,38 @@ func TestBuildRequest(t *testing.T) {
209209
})
210210
}
211211
}
212+
213+
func TestOutputResult(t *testing.T) {
214+
type args struct {
215+
outputFormat string
216+
backup serverbackup.Backup
217+
}
218+
tests := []struct {
219+
name string
220+
args args
221+
wantErr bool
222+
}{
223+
{
224+
name: "empty",
225+
args: args{},
226+
wantErr: false,
227+
},
228+
{
229+
name: "output format json",
230+
args: args{
231+
outputFormat: print.JSONOutputFormat,
232+
backup: serverbackup.Backup{},
233+
},
234+
wantErr: false,
235+
},
236+
}
237+
p := print.NewPrinter()
238+
p.Cmd = NewCmd(p)
239+
for _, tt := range tests {
240+
t.Run(tt.name, func(t *testing.T) {
241+
if err := outputResult(p, tt.args.outputFormat, tt.args.backup); (err != nil) != tt.wantErr {
242+
t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr)
243+
}
244+
})
245+
}
246+
}

internal/cmd/beta/server/backup/disable/disable.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import (
1010
"github.com/stackitcloud/stackit-cli/internal/pkg/flags"
1111
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
1212
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
13+
iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client"
14+
iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils"
1315
"github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client"
1416
serverbackupUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/utils"
1517

@@ -50,17 +52,28 @@ func NewCmd(p *print.Printer) *cobra.Command {
5052
return err
5153
}
5254

55+
serverLabel := model.ServerId
56+
// Get server name
57+
if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil {
58+
serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId)
59+
if err != nil {
60+
p.Debug(print.ErrorLevel, "get server name: %v", err)
61+
} else if serverName != "" {
62+
serverLabel = serverName
63+
}
64+
}
65+
5366
canDisable, err := serverbackupUtils.CanDisableBackupService(ctx, apiClient, model.ProjectId, model.ServerId)
5467
if err != nil {
5568
return err
5669
}
5770
if !canDisable {
58-
p.Info("Cannot disable backup service for server %s - existing backups or existing backup schedules found\n", model.ServerId)
71+
p.Info("Cannot disable backup service for server %s - existing backups or existing backup schedules found\n", serverLabel)
5972
return nil
6073
}
6174

6275
if !model.AssumeYes {
63-
prompt := fmt.Sprintf("Are you sure you want to disable the backup service for server %s?", model.ServerId)
76+
prompt := fmt.Sprintf("Are you sure you want to disable the backup service for server %s?", serverLabel)
6477
err = p.PromptForConfirmation(prompt)
6578
if err != nil {
6679
return err
@@ -74,7 +87,7 @@ func NewCmd(p *print.Printer) *cobra.Command {
7487
return fmt.Errorf("disable server backup service: %w", err)
7588
}
7689

77-
p.Info("Disabled Server Backup service for server %s\n", model.ServerId)
90+
p.Info("Disabled Server Backup service for server %s\n", serverLabel)
7891
return nil
7992
},
8093
}

internal/cmd/beta/server/backup/enable/enable.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"github.com/stackitcloud/stackit-cli/internal/pkg/flags"
1212
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
1313
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
14+
iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client"
15+
iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils"
1416
"github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client"
1517

1618
"github.com/spf13/cobra"
@@ -50,8 +52,19 @@ func NewCmd(p *print.Printer) *cobra.Command {
5052
return err
5153
}
5254

55+
serverLabel := model.ServerId
56+
// Get server name
57+
if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil {
58+
serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId)
59+
if err != nil {
60+
p.Debug(print.ErrorLevel, "get server name: %v", err)
61+
} else if serverName != "" {
62+
serverLabel = serverName
63+
}
64+
}
65+
5366
if !model.AssumeYes {
54-
prompt := fmt.Sprintf("Are you sure you want to enable the Server Backup service for server %s?", model.ServerId)
67+
prompt := fmt.Sprintf("Are you sure you want to enable the Server Backup service for server %s?", serverLabel)
5568
err = p.PromptForConfirmation(prompt)
5669
if err != nil {
5770
return err
@@ -67,7 +80,7 @@ func NewCmd(p *print.Printer) *cobra.Command {
6780
}
6881
}
6982

70-
p.Info("Enabled backup service for server %s\n", model.ServerId)
83+
p.Info("Enabled backup service for server %s\n", serverLabel)
7184
return nil
7285
},
7386
}

internal/cmd/beta/server/backup/list/list.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import (
1313
"github.com/stackitcloud/stackit-cli/internal/pkg/flags"
1414
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
1515
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
16+
iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client"
17+
iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils"
1618
"github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client"
1719
"github.com/stackitcloud/stackit-cli/internal/pkg/tables"
1820
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
@@ -65,7 +67,17 @@ func NewCmd(p *print.Printer) *cobra.Command {
6567
}
6668
backups := *resp.Items
6769
if len(backups) == 0 {
68-
p.Info("No backups found for server %s\n", model.ServerId)
70+
serverLabel := model.ServerId
71+
// Get server name
72+
if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil {
73+
serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId)
74+
if err != nil {
75+
p.Debug(print.ErrorLevel, "get server name: %v", err)
76+
} else if serverName != "" {
77+
serverLabel = serverName
78+
}
79+
}
80+
p.Info("No backups found for server %s\n", serverLabel)
6981
return nil
7082
}
7183

@@ -150,6 +162,10 @@ func outputResult(p *print.Printer, outputFormat string, backups []serverbackup.
150162
s := backups[i]
151163

152164
lastRestored := utils.PtrStringDefault(s.LastRestoredAt, "")
165+
var volBackups int
166+
if s.VolumeBackups != nil {
167+
volBackups = len(*s.VolumeBackups)
168+
}
153169
table.AddRow(
154170
utils.PtrString(s.Id),
155171
utils.PtrString(s.Name),
@@ -158,7 +174,7 @@ func outputResult(p *print.Printer, outputFormat string, backups []serverbackup.
158174
utils.PtrString(s.CreatedAt),
159175
utils.PtrString(s.ExpireAt),
160176
lastRestored,
161-
len(*s.VolumeBackups),
177+
volBackups,
162178
)
163179
}
164180
err := table.Display(p)

internal/cmd/beta/server/backup/list/list_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,39 @@ func TestBuildRequest(t *testing.T) {
186186
})
187187
}
188188
}
189+
190+
func TestOutputResult(t *testing.T) {
191+
type args struct {
192+
outputFormat string
193+
backups []serverbackup.Backup
194+
}
195+
tests := []struct {
196+
name string
197+
args args
198+
wantErr bool
199+
}{
200+
{
201+
name: "empty",
202+
args: args{},
203+
wantErr: false,
204+
},
205+
{
206+
name: "empty backup",
207+
args: args{
208+
backups: []serverbackup.Backup{
209+
{},
210+
},
211+
},
212+
wantErr: false,
213+
},
214+
}
215+
p := print.NewPrinter()
216+
p.Cmd = NewCmd(p)
217+
for _, tt := range tests {
218+
t.Run(tt.name, func(t *testing.T) {
219+
if err := outputResult(p, tt.args.outputFormat, tt.args.backups); (err != nil) != tt.wantErr {
220+
t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr)
221+
}
222+
})
223+
}
224+
}

0 commit comments

Comments
 (0)