From 45c54d43b6db0d994699e98805dc98b9893b3cb6 Mon Sep 17 00:00:00 2001 From: Travis Hampton Date: Wed, 29 Nov 2023 18:36:24 -0600 Subject: [PATCH 1/2] Fix tenant flags --- pkg/cmd/tenant/variables/list/list.go | 39 ++++++++++-- pkg/cmd/tenant/view/view.go | 87 ++++++++++++--------------- 2 files changed, 72 insertions(+), 54 deletions(-) diff --git a/pkg/cmd/tenant/variables/list/list.go b/pkg/cmd/tenant/variables/list/list.go index 8c92dd8b..f0c19fb1 100644 --- a/pkg/cmd/tenant/variables/list/list.go +++ b/pkg/cmd/tenant/variables/list/list.go @@ -1,13 +1,16 @@ package list import ( + "errors" "fmt" + "github.com/MakeNowJust/heredoc/v2" "github.com/OctopusDeploy/cli/pkg/apiclient" "github.com/OctopusDeploy/cli/pkg/constants" "github.com/OctopusDeploy/cli/pkg/factory" "github.com/OctopusDeploy/cli/pkg/output" "github.com/OctopusDeploy/cli/pkg/question/selectors" + "github.com/OctopusDeploy/cli/pkg/util/flag" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/actiontemplates" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/client" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/core" @@ -18,8 +21,22 @@ import ( const ( LibraryVariableSetType = "Library" ProjectType = "Project" + FlagTenant = "tenant" + FlagName = "name" ) +type ListFlags struct { + Tenant *flag.Flag[string] + Name *flag.Flag[string] +} + +func NewListFlags() *ListFlags { + return &ListFlags{ + Tenant: flag.New[string](FlagTenant, false), + Name: flag.New[string](FlagName, false), + } +} + type VariableValue struct { Type string OwnerName string @@ -68,6 +85,8 @@ func NewVariableValueProjectAsJson(v *VariableValue) *VariableValueProjectAsJson } func NewCmdList(f factory.Factory) *cobra.Command { + listFlags := NewListFlags() + cmd := &cobra.Command{ Use: "list", Short: "List tenant variables", @@ -78,28 +97,36 @@ func NewCmdList(f factory.Factory) *cobra.Command { `, constants.ExecutableName), Aliases: []string{"ls"}, RunE: func(cmd *cobra.Command, args []string) error { - if len(args) == 0 { - return fmt.Errorf("must supply tenant identifier") + if len(args) > 0 && listFlags.Tenant.Value == "" { + listFlags.Tenant.Value = args[0] } - return listRun(cmd, f, args[0]) + return listRun(cmd, f, listFlags) }, } + flags := cmd.Flags() + flags.StringVarP(&listFlags.Tenant.Value, listFlags.Tenant.Name, "t", "", "Name or ID of the tenant to list variables for") + flags.StringVarP(&listFlags.Name.Value, listFlags.Name.Name, "n", "", "filter variables to match only ones with a name containing the given string") return cmd } -func listRun(cmd *cobra.Command, f factory.Factory, id string) error { +func listRun(cmd *cobra.Command, f factory.Factory, flags *ListFlags) error { client, err := f.GetSpacedClient(apiclient.NewRequester(cmd)) if err != nil { return err } - tenant, err := client.Tenants.GetByIdentifier(id) + tenant := flags.Tenant.Value + if tenant == "" { + return errors.New("tenant must be specified") + } + + selectedTenant, err := client.Tenants.GetByIdentifier(tenant) if err != nil { return err } - vars, err := client.Tenants.GetVariables(tenant) + vars, err := client.Tenants.GetVariables(selectedTenant) if err != nil { return err } diff --git a/pkg/cmd/tenant/view/view.go b/pkg/cmd/tenant/view/view.go index 746e49ab..eabd6fd2 100644 --- a/pkg/cmd/tenant/view/view.go +++ b/pkg/cmd/tenant/view/view.go @@ -1,47 +1,40 @@ package view import ( + "errors" "fmt" + "github.com/OctopusDeploy/cli/pkg/apiclient" - "io" "github.com/MakeNowJust/heredoc/v2" "github.com/OctopusDeploy/cli/pkg/constants" "github.com/OctopusDeploy/cli/pkg/factory" "github.com/OctopusDeploy/cli/pkg/output" - "github.com/OctopusDeploy/cli/pkg/usage" "github.com/OctopusDeploy/cli/pkg/util/flag" - "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/client" "github.com/pkg/browser" "github.com/spf13/cobra" ) const ( - FlagWeb = "web" + FlagTenant = "tenant" + FlagWeb = "web" ) type ViewFlags struct { - Web *flag.Flag[bool] + Tenant *flag.Flag[string] + Web *flag.Flag[bool] } func NewViewFlags() *ViewFlags { return &ViewFlags{ - Web: flag.New[bool](FlagWeb, false), + Tenant: flag.New[string](FlagTenant, false), + Web: flag.New[bool](FlagWeb, false), } } -type ViewOptions struct { - Client *client.Client - Host string - out io.Writer - idOrName string - flags *ViewFlags -} - func NewCmdView(f factory.Factory) *cobra.Command { viewFlags := NewViewFlags() cmd := &cobra.Command{ - Args: usage.ExactArgs(1), Use: "view { | }", Short: "View a tenant", Long: "View a tenant in Octopus Deploy", @@ -50,67 +43,65 @@ func NewCmdView(f factory.Factory) *cobra.Command { $ %[1]s tenant view 'Tenant' `, constants.ExecutableName), RunE: func(cmd *cobra.Command, args []string) error { - client, err := f.GetSpacedClient(apiclient.NewRequester(cmd)) - if err != nil { - return err - } - - if len(args) == 0 { - return fmt.Errorf("tenant identifier is required") - } - - opts := &ViewOptions{ - client, - f.GetCurrentHost(), - cmd.OutOrStdout(), - args[0], - viewFlags, + if len(args) > 0 && viewFlags.Tenant.Value == "" { + viewFlags.Tenant.Value = args[0] } - - return viewRun(opts) + return viewRun(cmd, f, viewFlags) }, } flags := cmd.Flags() + flags.StringVarP(&viewFlags.Tenant.Value, viewFlags.Tenant.Name, "t", "", "Name or ID of the tenant to list variables for") flags.BoolVarP(&viewFlags.Web.Value, viewFlags.Web.Name, "w", false, "Open in web browser") return cmd } -func viewRun(opts *ViewOptions) error { - tenant, err := opts.Client.Tenants.GetByIdentifier(opts.idOrName) +func viewRun(cmd *cobra.Command, f factory.Factory, flags *ViewFlags) error { + client, err := f.GetSpacedClient(apiclient.NewRequester(cmd)) + if err != nil { + return err + } + + tenant := flags.Tenant.Value + if tenant == "" { + return errors.New("tenant must be specified") + } + + selectedTenant, err := client.Tenants.GetByIdentifier(tenant) if err != nil { return err } - fmt.Fprintf(opts.out, "%s %s\n", output.Bold(tenant.Name), output.Dimf("(%s)", tenant.ID)) + out := cmd.OutOrStdout() + fmt.Fprintf(out, "%s %s\n", output.Bold(selectedTenant.Name), output.Dimf("(%s)", selectedTenant.ID)) - if len(tenant.TenantTags) > 0 { - fmt.Fprintf(opts.out, "Tags: ") + if len(selectedTenant.TenantTags) > 0 { + fmt.Fprintf(out, "Tags: ") } - for i, tag := range tenant.TenantTags { + for i, tag := range selectedTenant.TenantTags { suffix := ", " - if i == len(tenant.TenantTags)-1 { + if i == len(selectedTenant.TenantTags)-1 { suffix = "" } - fmt.Fprintf(opts.out, "%s%s", tag, suffix) + fmt.Fprintf(out, "%s%s", tag, suffix) } - if len(tenant.TenantTags) > 0 { - fmt.Fprintf(opts.out, "\n") + if len(selectedTenant.TenantTags) > 0 { + fmt.Fprintf(out, "\n") } - if tenant.Description == "" { - fmt.Fprintln(opts.out, output.Dim(constants.NoDescription)) + if selectedTenant.Description == "" { + fmt.Fprintln(out, output.Dim(constants.NoDescription)) } else { - fmt.Fprintln(opts.out, output.Dim(tenant.Description)) + fmt.Fprintln(out, output.Dim(selectedTenant.Description)) } - link := fmt.Sprintf("%s/app#/%s/tenants/%s/overview", opts.Host, tenant.SpaceID, tenant.ID) + link := fmt.Sprintf("%s/app#/%s/tenants/%s/overview", f.GetCurrentHost(), selectedTenant.SpaceID, selectedTenant.ID) // footer - fmt.Fprintf(opts.out, "View this tenant in Octopus Deploy: %s\n", output.Blue(link)) + fmt.Fprintf(out, "View this tenant in Octopus Deploy: %s\n", output.Blue(link)) - if opts.flags.Web.Value { + if flags.Web.Value { browser.OpenURL(link) } From 64468926699da144a148f02236a6b974dd0c1a46 Mon Sep 17 00:00:00 2001 From: Travis Hampton Date: Wed, 29 Nov 2023 19:07:58 -0600 Subject: [PATCH 2/2] Remove name flag for now. --- pkg/cmd/tenant/variables/list/list.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pkg/cmd/tenant/variables/list/list.go b/pkg/cmd/tenant/variables/list/list.go index f0c19fb1..b8843595 100644 --- a/pkg/cmd/tenant/variables/list/list.go +++ b/pkg/cmd/tenant/variables/list/list.go @@ -22,18 +22,15 @@ const ( LibraryVariableSetType = "Library" ProjectType = "Project" FlagTenant = "tenant" - FlagName = "name" ) type ListFlags struct { Tenant *flag.Flag[string] - Name *flag.Flag[string] } func NewListFlags() *ListFlags { return &ListFlags{ Tenant: flag.New[string](FlagTenant, false), - Name: flag.New[string](FlagName, false), } } @@ -106,7 +103,6 @@ func NewCmdList(f factory.Factory) *cobra.Command { flags := cmd.Flags() flags.StringVarP(&listFlags.Tenant.Value, listFlags.Tenant.Name, "t", "", "Name or ID of the tenant to list variables for") - flags.StringVarP(&listFlags.Name.Value, listFlags.Name.Name, "n", "", "filter variables to match only ones with a name containing the given string") return cmd }