Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/stackit_beta_sfs_snapshot.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,5 @@ stackit beta sfs snapshot [flags]
* [stackit beta sfs snapshot delete](./stackit_beta_sfs_snapshot_delete.md) - Deletes a snapshot
* [stackit beta sfs snapshot describe](./stackit_beta_sfs_snapshot_describe.md) - Shows details of a snapshot
* [stackit beta sfs snapshot list](./stackit_beta_sfs_snapshot_list.md) - Lists all snapshots of a resource pool
* [stackit beta sfs snapshot update](./stackit_beta_sfs_snapshot_update.md) - Updates a new snapshot of a resource pool

46 changes: 46 additions & 0 deletions docs/stackit_beta_sfs_snapshot_update.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
## stackit beta sfs snapshot update

Updates a new snapshot of a resource pool

### Synopsis

Updates a new snapshot of a resource pool.

```
stackit beta sfs snapshot update SNAPSHOT_NAME [flags]
```

### Examples

```
Updates the name of a snapshot with name "snapshot-name" of a resource pool with ID "xxx"
$ stackit beta sfs snapshot update snapshot-name --resource-pool-id xxx --name new-snapshot-name

Updates the comment of a snapshot with name "snapshot-name" of a resource pool with ID "xxx"
$ stackit beta sfs snapshot update snapshot-name --resource-pool-id xxx --comment "snapshot-comment"
```

### Options

```
--comment string A comment to add more information to the snapshot
-h, --help Help for "stackit beta sfs snapshot update"
--name string Snapshot name
--resource-pool-id string The resource pool from which the snapshot should be updated
```

### Options inherited from parent commands

```
-y, --assume-yes If set, skips all confirmation prompts
--async If set, runs the command asynchronously
-o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"]
-p, --project-id string Project ID
--region string Target region for region-specific requests
--verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info")
```

### SEE ALSO

* [stackit beta sfs snapshot](./stackit_beta_sfs_snapshot.md) - Provides functionality for SFS snapshots

2 changes: 2 additions & 0 deletions internal/cmd/beta/sfs/snapshot/snapshot.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/snapshot/delete"
"github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/snapshot/describe"
"github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/snapshot/list"
"github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/snapshot/update"
"github.com/stackitcloud/stackit-cli/internal/pkg/args"
"github.com/stackitcloud/stackit-cli/internal/pkg/types"
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
Expand All @@ -29,4 +30,5 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) {
cmd.AddCommand(delete.NewCmd(params))
cmd.AddCommand(describe.NewCmd(params))
cmd.AddCommand(list.NewCmd(params))
cmd.AddCommand(update.NewCmd(params))
}
151 changes: 151 additions & 0 deletions internal/cmd/beta/sfs/snapshot/update/update.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
package update

import (
"context"
"fmt"

"github.com/spf13/cobra"
sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api"

"github.com/stackitcloud/stackit-cli/internal/pkg/args"
"github.com/stackitcloud/stackit-cli/internal/pkg/errors"
"github.com/stackitcloud/stackit-cli/internal/pkg/examples"
"github.com/stackitcloud/stackit-cli/internal/pkg/flags"
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
"github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client"
sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils"
"github.com/stackitcloud/stackit-cli/internal/pkg/types"
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
)

const (
snapshotNameArg = "SNAPSHOT_NAME"

resourcePoolIdFlag = "resource-pool-id"
newSnapshotNameFlag = "name"
commentFlag = "comment"
)

type inputModel struct {
*globalflags.GlobalFlagModel
ResourcePoolId string
SnapshotName string
NewSnapshotName string
Comment *string
}

func NewCmd(params *types.CmdParams) *cobra.Command {
cmd := &cobra.Command{
Use: fmt.Sprintf("update %s", snapshotNameArg),
Short: "Updates a new snapshot of a resource pool",
Long: "Updates a new snapshot of a resource pool.",
Args: args.SingleArg(snapshotNameArg, nil),
Example: examples.Build(
examples.NewExample(
`Updates the name of a snapshot with name "snapshot-name" of a resource pool with ID "xxx"`,
"$ stackit beta sfs snapshot update snapshot-name --resource-pool-id xxx --name new-snapshot-name",
),
examples.NewExample(
`Updates the comment of a snapshot with name "snapshot-name" of a resource pool with ID "xxx"`,
`$ stackit beta sfs snapshot update snapshot-name --resource-pool-id xxx --comment "snapshot-comment"`,
),
),
RunE: func(cmd *cobra.Command, args []string) error {
ctx := context.Background()
model, err := parseInput(params.Printer, cmd, args)
if err != nil {
return err
}

// Configure API client
apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion)
if err != nil {
return err
}

resourcePoolLabel, err := sfsUtils.GetResourcePoolName(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ResourcePoolId)
if err != nil {
params.Printer.Debug(print.ErrorLevel, "get resource pool name: %v", err)
resourcePoolLabel = model.ResourcePoolId
} else if resourcePoolLabel == "" {
resourcePoolLabel = model.ResourcePoolId
}

prompt := fmt.Sprintf("Are you sure you want to update the snapshot %q for resource pool %q?", model.SnapshotName, resourcePoolLabel)
err = params.Printer.PromptForConfirmation(prompt)
if err != nil {
return err
}

// Call API
req := buildRequest(ctx, model, apiClient)
resp, err := req.Execute()
if err != nil {
return fmt.Errorf("update snapshot: %w", err)
}

return outputResult(params.Printer, model.OutputFormat, model.SnapshotName, resourcePoolLabel, resp)
},
}
configureFlags(cmd)
return cmd
}

func configureFlags(cmd *cobra.Command) {
cmd.Flags().String(newSnapshotNameFlag, "", "Snapshot name")
cmd.Flags().String(commentFlag, "", "A comment to add more information to the snapshot")
cmd.Flags().Var(flags.UUIDFlag(), resourcePoolIdFlag, "The resource pool from which the snapshot should be updated")

cmd.MarkFlagsOneRequired(newSnapshotNameFlag, commentFlag)
err := flags.MarkFlagsRequired(cmd, resourcePoolIdFlag)
cobra.CheckErr(err)
}

func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiUpdateResourcePoolSnapshotRequest {
req := apiClient.DefaultAPI.UpdateResourcePoolSnapshot(ctx, model.ProjectId, model.Region, model.ResourcePoolId, model.SnapshotName)

payload := sfs.UpdateResourcePoolSnapshotPayload{
Comment: *sfs.NewNullableString(model.Comment),
}

if model.NewSnapshotName != "" {
payload.Name = *sfs.NewNullableString(utils.Ptr(model.NewSnapshotName))
}
return req.UpdateResourcePoolSnapshotPayload(payload)
}

func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) {
snapshotName := inputArgs[0]
globalFlags := globalflags.Parse(p, cmd)
if globalFlags.ProjectId == "" {
return nil, &errors.ProjectIdError{}
}

model := inputModel{
GlobalFlagModel: globalFlags,
SnapshotName: snapshotName,
NewSnapshotName: flags.FlagToStringValue(p, cmd, newSnapshotNameFlag),
ResourcePoolId: flags.FlagToStringValue(p, cmd, resourcePoolIdFlag),
Comment: flags.FlagToStringPointer(p, cmd, commentFlag),
}

p.DebugInputModel(model)
return &model, nil
}

func outputResult(p *print.Printer, outputFormat, snapshotLabel, resourcePoolLabel string, resp *sfs.UpdateResourcePoolSnapshotResponse) error {
return p.OutputResult(outputFormat, resp, func() error {
if resp == nil || resp.ResourcePoolSnapshot == nil {
p.Outputln("SFS snapshot response is empty")
return nil
}

p.Outputf(
"Updated snapshot %q for resource pool %q.\n",
snapshotLabel,
resourcePoolLabel,
)
return nil
})
}
Loading
Loading