Skip to content

Commit 4a8cfe0

Browse files
authored
Merge pull request #156 from Arubacloud/fix/td-152-backup-create-zone-flag
fix(database): add --zone flag to backup create command
2 parents b202025 + 86dd64d commit 4a8cfe0

2 files changed

Lines changed: 76 additions & 1 deletion

File tree

cmd/database.backup.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ func init() {
2121
backupCreateCmd.Flags().String("project-id", "", "Project ID (uses context if not specified)")
2222
backupCreateCmd.Flags().String("name", "", "Backup name (required)")
2323
backupCreateCmd.Flags().String("region", "", "Region code (required)")
24+
backupCreateCmd.Flags().String("zone", "", "Availability zone (e.g. ITBG-1); defaults to region when omitted")
2425
backupCreateCmd.Flags().String("dbaas-id", "", "DBaaS instance ID (required)")
2526
backupCreateCmd.Flags().String("database-name", "", "Database name (required)")
2627
backupCreateCmd.Flags().String("billing-period", string(aruba.BillingPeriodHour), "Billing period: Hour, Month, Year")
@@ -95,7 +96,7 @@ The backup will be stored and can be restored later.
9596
9697
Billing period: Hour (default), Month, or Year.`,
9798
Example: ` acloud database backup create \
98-
--name my-backup --region ITBG-Bergamo \
99+
--name my-backup --region ITBG-Bergamo --zone ITBG-1 \
99100
--dbaas-id <dbaas-id> \
100101
--database-name myapp_db`,
101102
Args: cobra.NoArgs,
@@ -132,6 +133,7 @@ type DatabaseDBaaSBackupCreateArgs struct {
132133
ProjectID string
133134
Name string
134135
Region aruba.Region
136+
Zone string
135137
DBaaSID string
136138
DatabaseName string
137139
BillingPeriod aruba.BillingPeriod
@@ -230,6 +232,9 @@ func (a *DatabaseDBaaSBackupCreateArgs) ParseFromCobraCommand(cmd *cobra.Command
230232
} else {
231233
errs = append(errs, err)
232234
}
235+
if a.Zone, err = cmd.Flags().GetString("zone"); err != nil {
236+
errs = append(errs, err)
237+
}
233238
if a.DBaaSID, err = cmd.Flags().GetString("dbaas-id"); err != nil {
234239
errs = append(errs, err)
235240
}
@@ -366,6 +371,10 @@ func DatabaseDBaaSBackupCreate(ctx context.Context, client aruba.Client, args Da
366371
BilledBy(args.BillingPeriod).
367372
RetaggedAs(args.Tags...)
368373

374+
if args.Zone != "" {
375+
bkp.InZone(aruba.Zone(args.Zone))
376+
}
377+
369378
created, err := client.FromDatabase().Backups().Create(ctx, bkp)
370379
if err != nil {
371380
return fmt.Errorf("creating backup: %w", apiErrFromV2(err))

cmd/database.backup_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/Arubacloud/sdk-go/pkg/aruba"
1212
"github.com/Arubacloud/sdk-go/pkg/types"
13+
"github.com/spf13/cobra"
1314
)
1415

1516
func TestDBBackupListCmd(t *testing.T) {
@@ -207,6 +208,29 @@ func TestDBBackupCreateCmd(t *testing.T) {
207208
wantErr: true,
208209
errContains: "dbaas-id",
209210
},
211+
{
212+
name: "success with --zone",
213+
args: []string{
214+
"database", "backup", "create",
215+
"--project-id", "proj-123",
216+
"--name", "my-backup",
217+
"--region", "ITBG-Bergamo",
218+
"--zone", "ITBG-1",
219+
"--dbaas-id", "dbaas-001",
220+
"--database-name", "mydb",
221+
},
222+
setupSrv: func(srv *arubaTestServer) {
223+
id, name := "bkp-zone", "my-backup"
224+
srv.OnPost("/projects/proj-123/providers/Aruba.Database/backups", jsonResponse(200, types.BackupResponse{
225+
Metadata: types.ResourceMetadataResponse{ID: &id, Name: &name},
226+
}))
227+
},
228+
assertOut: func(t *testing.T, out string) {
229+
if !strings.Contains(out, "my-backup") {
230+
t.Errorf("expected name in output, got: %s", out)
231+
}
232+
},
233+
},
210234
{
211235
name: "server error propagates",
212236
args: createArgs,
@@ -730,6 +754,27 @@ func TestDatabaseDBaaSBackupDelete_APIError(t *testing.T) {
730754
}
731755
}
732756

757+
// TestDatabaseDBaaSBackupCreateArgs_ParseZoneFlagError covers the GetString("zone") error
758+
// branch in ParseFromCobraCommand by using a command where "zone" is not registered.
759+
func TestDatabaseDBaaSBackupCreateArgs_ParseZoneFlagError(t *testing.T) {
760+
cmd := &cobra.Command{}
761+
cmd.Flags().String("project-id", "proj-123", "")
762+
cmd.Flags().String("name", "my-backup", "")
763+
cmd.Flags().String("region", "ITBG-Bergamo", "")
764+
// "zone" intentionally omitted so GetString("zone") returns an error
765+
cmd.Flags().String("dbaas-id", "dbaas-001", "")
766+
cmd.Flags().String("database-name", "mydb", "")
767+
cmd.Flags().String("billing-period", "Hour", "")
768+
cmd.Flags().StringSlice("tags", []string{}, "")
769+
_ = cmd.Flags().Set("project-id", "proj-123")
770+
771+
args := &DatabaseDBaaSBackupCreateArgs{}
772+
err := args.ParseFromCobraCommand(cmd)
773+
if err == nil {
774+
t.Fatal("expected error when zone flag is not registered")
775+
}
776+
}
777+
733778
// TestDatabaseDBaaSBackupCreateArgs_ConstructorWrapsErrors verifies that the constructor
734779
// wraps validation failures with ErrValidationFailed.
735780
func TestDatabaseDBaaSBackupCreateArgs_ConstructorWrapsErrors(t *testing.T) {
@@ -778,6 +823,27 @@ func TestDatabaseDBaaSBackupCreate_WithTagsAndRegion(t *testing.T) {
778823
}
779824
}
780825

826+
// TestDatabaseDBaaSBackupCreate_WithZone verifies that an explicit --zone value is forwarded to the builder.
827+
func TestDatabaseDBaaSBackupCreate_WithZone(t *testing.T) {
828+
srv := newArubaTestServer(t)
829+
id, name := "bkp-zone", "my-backup"
830+
srv.OnPost("/projects/proj-123/providers/Aruba.Database/backups", jsonResponse(200, types.BackupResponse{
831+
Metadata: types.ResourceMetadataResponse{ID: &id, Name: &name},
832+
}))
833+
834+
out := captureStdout(func() {
835+
args := validDatabaseDBaaSBackupCreateArgs()
836+
args.Zone = "ITBG-1"
837+
err := DatabaseDBaaSBackupCreate(context.Background(), srv.Client(), args)
838+
if err != nil {
839+
t.Fatalf("unexpected error: %v", err)
840+
}
841+
})
842+
if !strings.Contains(out, "bkp-zone") {
843+
t.Errorf("expected ID in output, got: %s", out)
844+
}
845+
}
846+
781847
// TestDatabaseDBaaSBackupList_WithCallOpts verifies that CallOpts are threaded through.
782848
func TestDatabaseDBaaSBackupList_WithCallOpts(t *testing.T) {
783849
srv := newArubaTestServer(t)

0 commit comments

Comments
 (0)