Skip to content

Add --used and --unused flags to load-balancer list #308

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
May 9, 2024
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: 1 addition & 1 deletion docs/stackit_load-balancer_observability-credentials.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,6 @@ stackit load-balancer observability-credentials [flags]
* [stackit load-balancer observability-credentials add](./stackit_load-balancer_observability-credentials_add.md) - Adds observability credentials to Load Balancer
* [stackit load-balancer observability-credentials delete](./stackit_load-balancer_observability-credentials_delete.md) - Deletes observability credentials for Load Balancer
* [stackit load-balancer observability-credentials describe](./stackit_load-balancer_observability-credentials_describe.md) - Shows details of observability credentials for Load Balancer
* [stackit load-balancer observability-credentials list](./stackit_load-balancer_observability-credentials_list.md) - Lists all observability credentials for Load Balancer
* [stackit load-balancer observability-credentials list](./stackit_load-balancer_observability-credentials_list.md) - Lists observability credentials for Load Balancer
* [stackit load-balancer observability-credentials update](./stackit_load-balancer_observability-credentials_update.md) - Updates observability credentials for Load Balancer

18 changes: 13 additions & 5 deletions docs/stackit_load-balancer_observability-credentials_list.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
## stackit load-balancer observability-credentials list

Lists all observability credentials for Load Balancer
Lists observability credentials for Load Balancer

### Synopsis

Lists all observability credentials for Load Balancer.
Lists observability credentials for Load Balancer.

```
stackit load-balancer observability-credentials list [flags]
Expand All @@ -13,13 +13,19 @@ stackit load-balancer observability-credentials list [flags]
### Examples

```
List all observability credentials for Load Balancer
List all Load Balancer observability credentials
$ stackit load-balancer observability-credentials list

List all observability credentials for Load Balancer in JSON format
List all observability credentials being used by Load Balancer
$ stackit load-balancer observability-credentials list --used

List all observability credentials not being used by Load Balancer
$ stackit load-balancer observability-credentials list --unused

List all Load Balancer observability credentials in JSON format
$ stackit load-balancer observability-credentials list --output-format json

List up to 10 observability credentials for Load Balancer
List up to 10 Load Balancer observability credentials
$ stackit load-balancer observability-credentials list --limit 10
```

Expand All @@ -28,6 +34,8 @@ stackit load-balancer observability-credentials list [flags]
```
-h, --help Help for "stackit load-balancer observability-credentials list"
--limit int Maximum number of entries to list
--unused List only credentials not being used by a Load Balancer
--used List only credentials being used by a Load Balancer
```

### Options inherited from parent commands
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
"github.com/stackitcloud/stackit-cli/internal/pkg/projectname"
"github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/client"
"github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/utils"
"github.com/stackitcloud/stackit-cli/internal/pkg/tables"

"github.com/spf13/cobra"
Expand All @@ -22,28 +23,38 @@ import (
const (
instanceIdFlag = "instance-id"
limitFlag = "limit"
usedFlag = "used"
unusedFlag = "unused"
)

type inputModel struct {
*globalflags.GlobalFlagModel
Limit *int64
Limit *int64
Used bool
Unused bool
}

func NewCmd(p *print.Printer) *cobra.Command {
cmd := &cobra.Command{
Use: "list",
Short: "Lists all observability credentials for Load Balancer",
Long: "Lists all observability credentials for Load Balancer.",
Short: "Lists observability credentials for Load Balancer",
Long: "Lists observability credentials for Load Balancer.",
Args: args.NoArgs,
Example: examples.Build(
examples.NewExample(
`List all observability credentials for Load Balancer`,
`List all Load Balancer observability credentials`,
"$ stackit load-balancer observability-credentials list"),
examples.NewExample(
`List all observability credentials for Load Balancer in JSON format`,
`List all observability credentials being used by Load Balancer`,
"$ stackit load-balancer observability-credentials list --used"),
examples.NewExample(
`List all observability credentials not being used by Load Balancer`,
"$ stackit load-balancer observability-credentials list --unused"),
examples.NewExample(
`List all Load Balancer observability credentials in JSON format`,
"$ stackit load-balancer observability-credentials list --output-format json"),
examples.NewExample(
`List up to 10 observability credentials for Load Balancer`,
`List up to 10 Load Balancer observability credentials`,
"$ stackit load-balancer observability-credentials list --limit 10"),
),
RunE: func(cmd *cobra.Command, args []string) error {
Expand Down Expand Up @@ -72,13 +83,23 @@ func NewCmd(p *print.Printer) *cobra.Command {
return fmt.Errorf("list Load Balancer observability credentials: %w", err)
}
credentialsPtr := resp.Credentials
if credentialsPtr == nil || (credentialsPtr != nil && len(*credentialsPtr) == 0) {
if credentialsPtr == nil || len(*credentialsPtr) == 0 {
p.Info("No observability credentials found for Load Balancer on project %q\n", projectLabel)
return nil
}

credentials := *credentialsPtr

filterOp, err := getFilterOp(model.Used, model.Unused)
if err != nil {
return err
}

credentials, err = utils.FilterCredentials(ctx, apiClient, credentials, model.ProjectId, filterOp)
if err != nil {
return fmt.Errorf("filter credentials: %w", err)
}

// Truncate output
if model.Limit != nil && len(credentials) > int(*model.Limit) {
credentials = credentials[:*model.Limit]
Expand All @@ -92,6 +113,10 @@ func NewCmd(p *print.Printer) *cobra.Command {

func configureFlags(cmd *cobra.Command) {
cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list")
cmd.Flags().Bool(usedFlag, false, "List only credentials being used by a Load Balancer")
cmd.Flags().Bool(unusedFlag, false, "List only credentials not being used by a Load Balancer")

cmd.MarkFlagsMutuallyExclusive(usedFlag, unusedFlag)
}

func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) {
Expand All @@ -111,6 +136,8 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) {
model := inputModel{
GlobalFlagModel: globalFlags,
Limit: limit,
Used: flags.FlagToBoolValue(p, cmd, usedFlag),
Unused: flags.FlagToBoolValue(p, cmd, unusedFlag),
}

if p.IsVerbosityDebug() {
Expand Down Expand Up @@ -155,3 +182,20 @@ func outputResult(p *print.Printer, outputFormat string, credentials []loadbalan
return nil
}
}

func getFilterOp(used, unused bool) (int, error) {
// should not happen, cobra handles this
if used && unused {
return 0, fmt.Errorf("used and unused flags are mutually exclusive")
}

if !used && !unused {
return utils.OP_FILTER_NOP, nil
}

if used {
return utils.OP_FILTER_USED, nil
}

return utils.OP_FILTER_UNUSED, nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
lbUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/utils"
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"

"github.com/google/go-cmp/cmp"
Expand Down Expand Up @@ -108,6 +109,34 @@ func TestParseInput(t *testing.T) {
}),
isValid: false,
},
{
description: "used",
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
flagValues[usedFlag] = "true"
}),
isValid: true,
expectedModel: fixtureInputModel(func(model *inputModel) {
model.Used = true
}),
},
{
description: "unused",
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
flagValues[unusedFlag] = "true"
}),
isValid: true,
expectedModel: fixtureInputModel(func(model *inputModel) {
model.Unused = true
}),
},
{
description: "used and unused",
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
flagValues[usedFlag] = "true"
flagValues[unusedFlag] = "true"
}),
isValid: false,
},
}

for _, tt := range tests {
Expand Down Expand Up @@ -137,6 +166,14 @@ func TestParseInput(t *testing.T) {
t.Fatalf("error validating flags: %v", err)
}

err = cmd.ValidateFlagGroups()
if err != nil {
if !tt.isValid {
return
}
t.Fatalf("error validating flags: %v", err)
}

model, err := parseInput(p, cmd)
if err != nil {
if !tt.isValid {
Expand Down Expand Up @@ -183,3 +220,52 @@ func TestBuildRequest(t *testing.T) {
})
}
}

func TestGetFilterOp(t *testing.T) {
tests := []struct {
description string
used bool
unused bool
expectedFilterOp int
isValid bool
}{
{
description: "used",
used: true,
expectedFilterOp: lbUtils.OP_FILTER_USED,
isValid: true,
},
{
description: "unused",
unused: true,
expectedFilterOp: lbUtils.OP_FILTER_UNUSED,
isValid: true,
},
{
description: "used and unused",
used: true,
unused: true,
isValid: false,
},
{
description: "neither used nor unused",
expectedFilterOp: lbUtils.OP_FILTER_NOP,
isValid: true,
},
}

for _, tt := range tests {
t.Run(tt.description, func(t *testing.T) {
filterOp, err := getFilterOp(tt.used, tt.unused)
if err != nil {
if !tt.isValid {
return
}
t.Fatalf("error getting filter op: %v", err)
}
if filterOp != tt.expectedFilterOp {
t.Fatalf("Data does not match: %d", filterOp)
}
})
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ func (m *loadBalancerClientMocked) UpdateTargetPool(ctx context.Context, project
return testClient.UpdateTargetPool(ctx, projectId, loadBalancerName, targetPoolName)
}

func (m *loadBalancerClientMocked) ListLoadBalancersExecute(_ context.Context, _ string) (*loadbalancer.ListLoadBalancersResponse, error) {
return nil, nil
}

func fixtureArgValues(mods ...func(argValues []string)) []string {
argValues := []string{
testIP,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ func (m *loadBalancerClientMocked) UpdateTargetPool(ctx context.Context, project
return testClient.UpdateTargetPool(ctx, projectId, loadBalancerName, targetPoolName)
}

func (m *loadBalancerClientMocked) ListLoadBalancersExecute(_ context.Context, _ string) (*loadbalancer.ListLoadBalancersResponse, error) {
return nil, nil
}

func fixtureArgValues(mods ...func(argValues []string)) []string {
argValues := []string{
testIP,
Expand Down
Loading