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
2 changes: 2 additions & 0 deletions docs/stackit_argus_credentials.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,6 @@ stackit argus credentials [flags]

* [stackit argus](./stackit_argus.md) - Provides functionality for Argus
* [stackit argus credentials create](./stackit_argus_credentials_create.md) - Creates credentials for an Argus instance.
* [stackit argus credentials delete](./stackit_argus_credentials_delete.md) - Deletes credentials of an Argus instance
* [stackit argus credentials list](./stackit_argus_credentials_list.md) - Lists the usernames of all credentials for an Argus instance

7 changes: 2 additions & 5 deletions docs/stackit_argus_credentials_create.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ Creates credentials for an Argus instance.

### Synopsis

Creates credentials for an Argus instance.
Creates credentials (username and password) for an Argus instance.
The credentials will be generated and included in the response. You won't be able to retrieve the password later.

```
stackit argus credentials create [flags]
Expand All @@ -15,16 +16,12 @@ stackit argus credentials create [flags]
```
Create credentials for Argus instance with ID "xxx"
$ stackit argus credentials create --instance-id xxx

Create credentials for Argus instance with ID "xxx" and hide the password in the output
$ stackit argus credentials create --instance-id xxx --hide-password
```

### Options

```
-h, --help Help for "stackit argus credentials create"
--hide-password Hide password in output
--instance-id string Instance ID
```

Expand Down
40 changes: 40 additions & 0 deletions docs/stackit_argus_credentials_delete.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
## stackit argus credentials delete

Deletes credentials of an Argus instance

### Synopsis

Deletes credentials of an Argus instance.

```
stackit argus credentials delete USERNAME [flags]
```

### Examples

```
Delete credentials of username "xxx" for Argus instance with ID "yyy"
$ stackit argus credentials delete xxx --instance-id yyy
```

### Options

```
-h, --help Help for "stackit argus credentials delete"
--instance-id string Instance ID
```

### 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"]
-p, --project-id string Project ID
--verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info")
```

### SEE ALSO

* [stackit argus credentials](./stackit_argus_credentials.md) - Provides functionality for Argus credentials

47 changes: 47 additions & 0 deletions docs/stackit_argus_credentials_list.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
## stackit argus credentials list

Lists the usernames of all credentials for an Argus instance

### Synopsis

Lists the usernames of all credentials for an Argus instance.

```
stackit argus credentials list [flags]
```

### Examples

```
List the usernames of all credentials for an Argus instance with ID "xxx"
$ stackit argus credentials list --instance-id xxx

List the usernames of all credentials for an Argus instance in JSON format
$ stackit argus credentials list --instance-id xxx --output-format json

List the usernames of up to 10 credentials for an Argus instance
$ stackit argus credentials list --instance-id xxx --limit 10
```

### Options

```
-h, --help Help for "stackit argus credentials list"
--instance-id string Instance ID
--limit int Maximum number of entries to list
```

### 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"]
-p, --project-id string Project ID
--verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info")
```

### SEE ALSO

* [stackit argus credentials](./stackit_argus_credentials.md) - Provides functionality for Argus credentials

24 changes: 8 additions & 16 deletions internal/cmd/argus/credentials/create/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,30 +18,27 @@ import (
)

const (
instanceIdFlag = "instance-id"
hidePasswordFlag = "hide-password"
instanceIdFlag = "instance-id"
)

type inputModel struct {
*globalflags.GlobalFlagModel

HidePassword bool
InstanceId string
InstanceId string
}

func NewCmd(p *print.Printer) *cobra.Command {
cmd := &cobra.Command{
Use: "create",
Short: "Creates credentials for an Argus instance.",
Long: "Creates credentials for an Argus instance.",
Args: args.NoArgs,
Long: fmt.Sprintf("%s\n%s",
"Creates credentials (username and password) for an Argus instance.",
"The credentials will be generated and included in the response. You won't be able to retrieve the password later."),
Args: args.NoArgs,
Example: examples.Build(
examples.NewExample(
`Create credentials for Argus instance with ID "xxx"`,
"$ stackit argus credentials create --instance-id xxx"),
examples.NewExample(
`Create credentials for Argus instance with ID "xxx" and hide the password in the output`,
"$ stackit argus credentials create --instance-id xxx --hide-password"),
),
RunE: func(cmd *cobra.Command, args []string) error {
ctx := context.Background()
Expand Down Expand Up @@ -85,11 +82,8 @@ func NewCmd(p *print.Printer) *cobra.Command {
if username != "" {
p.Outputf("Username: %s\n", username)
}
if model.HidePassword {
p.Outputf("Password: <hidden>\n")
} else {
p.Outputf("Password: %s\n", *resp.Credentials.Password)
}

p.Outputf("Password: %s\n", *resp.Credentials.Password)
return nil
},
}
Expand All @@ -99,7 +93,6 @@ func NewCmd(p *print.Printer) *cobra.Command {

func configureFlags(cmd *cobra.Command) {
cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "Instance ID")
cmd.Flags().Bool(hidePasswordFlag, false, "Hide password in output")

err := flags.MarkFlagsRequired(cmd, instanceIdFlag)
cobra.CheckErr(err)
Expand All @@ -114,7 +107,6 @@ func parseInput(cmd *cobra.Command) (*inputModel, error) {
return &inputModel{
GlobalFlagModel: globalFlags,
InstanceId: flags.FlagToStringValue(cmd, instanceIdFlag),
HidePassword: flags.FlagToBoolValue(cmd, hidePasswordFlag),
}, nil
}

Expand Down
35 changes: 1 addition & 34 deletions internal/cmd/argus/credentials/create/create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {
ProjectId: testProjectId,
Verbosity: globalflags.VerbosityDefault,
},
InstanceId: testInstanceId,
HidePassword: false,
InstanceId: testInstanceId,
}
for _, mod := range mods {
mod(model)
Expand Down Expand Up @@ -115,38 +114,6 @@ func TestParseInput(t *testing.T) {
}),
isValid: false,
},
{
description: "hide password true",
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
flagValues[hidePasswordFlag] = "true"
}),
isValid: true,
expectedModel: fixtureInputModel(func(model *inputModel) {
model.HidePassword = true
}),
},
{
description: "hide password false",
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
flagValues[hidePasswordFlag] = "false"
}),
expectedModel: fixtureInputModel(),
isValid: true,
},
{
description: "hide password invalid 1",
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
flagValues[hidePasswordFlag] = "invalid"
}),
isValid: false,
},
{
description: "hide password invalid 2",
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
flagValues[hidePasswordFlag] = ""
}),
isValid: false,
},
}

for _, tt := range tests {
Expand Down
4 changes: 4 additions & 0 deletions internal/cmd/argus/credentials/credentials.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package credentials

import (
"github.com/stackitcloud/stackit-cli/internal/cmd/argus/credentials/create"
"github.com/stackitcloud/stackit-cli/internal/cmd/argus/credentials/delete"
"github.com/stackitcloud/stackit-cli/internal/cmd/argus/credentials/list"
"github.com/stackitcloud/stackit-cli/internal/pkg/args"
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
Expand All @@ -23,4 +25,6 @@ func NewCmd(p *print.Printer) *cobra.Command {

func addSubcommands(cmd *cobra.Command, p *print.Printer) {
cmd.AddCommand(create.NewCmd(p))
cmd.AddCommand(delete.NewCmd(p))
cmd.AddCommand(list.NewCmd(p))
}
109 changes: 109 additions & 0 deletions internal/cmd/argus/credentials/delete/delete.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package delete

import (
"context"
"fmt"

"github.com/stackitcloud/stackit-cli/internal/pkg/args"
"github.com/stackitcloud/stackit-cli/internal/pkg/errors"
"github.com/stackitcloud/stackit-cli/internal/pkg/examples"
"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/argus/client"
argusUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/argus/utils"
"github.com/stackitcloud/stackit-sdk-go/services/argus"

"github.com/spf13/cobra"
)

const (
usernameArg = "USERNAME"

instanceIdFlag = "instance-id"
)

type inputModel struct {
*globalflags.GlobalFlagModel
InstanceId string
Username string
}

func NewCmd(p *print.Printer) *cobra.Command {
cmd := &cobra.Command{
Use: fmt.Sprintf("delete %s", usernameArg),
Short: "Deletes credentials of an Argus instance",
Long: "Deletes credentials of an Argus instance.",
Args: args.SingleArg(usernameArg, nil),
Example: examples.Build(
examples.NewExample(
`Delete credentials of username "xxx" for Argus instance with ID "yyy"`,
"$ stackit argus credentials delete xxx --instance-id yyy"),
),
RunE: func(cmd *cobra.Command, args []string) error {
ctx := context.Background()
model, err := parseInput(cmd, args)
if err != nil {
return err
}

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

instanceLabel, err := argusUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId)
if err != nil {
instanceLabel = model.InstanceId
}

if !model.AssumeYes {
prompt := fmt.Sprintf("Are you sure you want to delete credentials for username %q of instance %q? (This cannot be undone)", model.Username, instanceLabel)
err = p.PromptForConfirmation(prompt)
if err != nil {
return err
}
}

// Call API
req := buildRequest(ctx, model, apiClient)
_, err = req.Execute()
if err != nil {
return fmt.Errorf("delete Argus credentials: %w", err)
}

p.Info("Deleted credentials for username %q of instance %q\n", model.Username, instanceLabel)
return nil
},
}
configureFlags(cmd)
return cmd
}

func configureFlags(cmd *cobra.Command) {
cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "Instance ID")

err := flags.MarkFlagsRequired(cmd, instanceIdFlag)
cobra.CheckErr(err)
}

func parseInput(cmd *cobra.Command, inputArgs []string) (*inputModel, error) {
username := inputArgs[0]

globalFlags := globalflags.Parse(cmd)
if globalFlags.ProjectId == "" {
return nil, &errors.ProjectIdError{}
}

return &inputModel{
GlobalFlagModel: globalFlags,
InstanceId: flags.FlagToStringValue(cmd, instanceIdFlag),
Username: username,
}, nil
}

func buildRequest(ctx context.Context, model *inputModel, apiClient *argus.APIClient) argus.ApiDeleteCredentialsRequest {
req := apiClient.DeleteCredentials(ctx, model.InstanceId, model.ProjectId, model.Username)
return req
}
Loading