From 3f3100bdd74e1ea0e8ef510e990f9a7dbb0e6499 Mon Sep 17 00:00:00 2001 From: Michael Leone Date: Mon, 19 Jan 2026 14:46:46 -0500 Subject: [PATCH 1/3] feat: issue #5 add list verb to api * adds a list verb to the api command * adds list commands for systems, environments, and deployments --- cmd/ctrlc/root/api/api.go | 2 + .../root/api/list/deployments/deployments.go | 55 +++++++++++++++++++ .../api/list/environments/environments.go | 55 +++++++++++++++++++ cmd/ctrlc/root/api/list/list.go | 25 +++++++++ cmd/ctrlc/root/api/list/systems/systems.go | 55 +++++++++++++++++++ 5 files changed, 192 insertions(+) create mode 100644 cmd/ctrlc/root/api/list/deployments/deployments.go create mode 100644 cmd/ctrlc/root/api/list/environments/environments.go create mode 100644 cmd/ctrlc/root/api/list/list.go create mode 100644 cmd/ctrlc/root/api/list/systems/systems.go diff --git a/cmd/ctrlc/root/api/api.go b/cmd/ctrlc/root/api/api.go index 1924873..cce1acc 100644 --- a/cmd/ctrlc/root/api/api.go +++ b/cmd/ctrlc/root/api/api.go @@ -5,6 +5,7 @@ import ( "os" "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/get" + "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/list" "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/upsert" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -45,6 +46,7 @@ func NewAPICmd() *cobra.Command { cmd.AddCommand(get.NewGetCmd()) cmd.AddCommand(upsert.NewUpsertCmd()) + cmd.AddCommand(list.NewListCmd()) return cmd } diff --git a/cmd/ctrlc/root/api/list/deployments/deployments.go b/cmd/ctrlc/root/api/list/deployments/deployments.go new file mode 100644 index 0000000..9cf2eaa --- /dev/null +++ b/cmd/ctrlc/root/api/list/deployments/deployments.go @@ -0,0 +1,55 @@ +package deployments + +import ( + "fmt" + + "github.com/ctrlplanedev/cli/internal/api" + "github.com/ctrlplanedev/cli/internal/cliutil" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +func NewListDeploymentsCmd() *cobra.Command { + var limit int + var offset int + + cmd := &cobra.Command{ + Use: "deployments", + Short: "List deployments", + Long: `Commands for getting resources.`, + RunE: func(cmd *cobra.Command, args []string) error { + apiURL := viper.GetString("url") + apiKey := viper.GetString("api-key") + workspace := viper.GetString("workspace") + + client, err := api.NewAPIKeyClientWithResponses(apiURL, apiKey) + if err != nil { + return fmt.Errorf("failed to create API client: %w", err) + } + + workspaceID := client.GetWorkspaceID(cmd.Context(), workspace) + + params := &api.ListDeploymentsParams{} + if limit > 0 { + params.Limit = &limit + } + if offset > 0 { + params.Offset = &offset + } + resp, err := client.ListDeployments(cmd.Context(), workspaceID.String(), params) + if err != nil { + + return fmt.Errorf("failed to get resources: %w", err) + } + + return cliutil.HandleResponseOutput(cmd, resp) + }, + } + + cmd.Flags().IntVarP(&limit, "limit", "l", 50, "Limit the number of results") + cmd.Flags().IntVarP(&offset, "offset", "o", 0, "Offset the results") + + cmd.MarkFlagRequired("workspace") + + return cmd +} diff --git a/cmd/ctrlc/root/api/list/environments/environments.go b/cmd/ctrlc/root/api/list/environments/environments.go new file mode 100644 index 0000000..12741ff --- /dev/null +++ b/cmd/ctrlc/root/api/list/environments/environments.go @@ -0,0 +1,55 @@ +package environments + +import ( + "fmt" + + "github.com/ctrlplanedev/cli/internal/api" + "github.com/ctrlplanedev/cli/internal/cliutil" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +func NewListEnvironmentsCmd() *cobra.Command { + var limit int + var offset int + + cmd := &cobra.Command{ + Use: "environments", + Short: "List environments", + Long: `Commands for getting resources.`, + RunE: func(cmd *cobra.Command, args []string) error { + apiURL := viper.GetString("url") + apiKey := viper.GetString("api-key") + workspace := viper.GetString("workspace") + + client, err := api.NewAPIKeyClientWithResponses(apiURL, apiKey) + if err != nil { + return fmt.Errorf("failed to create API client: %w", err) + } + + workspaceID := client.GetWorkspaceID(cmd.Context(), workspace) + + params := &api.ListEnvironmentsParams{} + if limit > 0 { + params.Limit = &limit + } + if offset > 0 { + params.Offset = &offset + } + resp, err := client.ListEnvironments(cmd.Context(), workspaceID.String(), params) + if err != nil { + + return fmt.Errorf("failed to get resources: %w", err) + } + + return cliutil.HandleResponseOutput(cmd, resp) + }, + } + + cmd.Flags().IntVarP(&limit, "limit", "l", 50, "Limit the number of results") + cmd.Flags().IntVarP(&offset, "offset", "o", 0, "Offset the results") + + cmd.MarkFlagRequired("workspace") + + return cmd +} diff --git a/cmd/ctrlc/root/api/list/list.go b/cmd/ctrlc/root/api/list/list.go new file mode 100644 index 0000000..f517267 --- /dev/null +++ b/cmd/ctrlc/root/api/list/list.go @@ -0,0 +1,25 @@ +package list + +import ( + "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/list/deployments" + "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/list/environments" + "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/list/systems" + "github.com/spf13/cobra" +) + +func NewListCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "list ", + Short: "List types of resources in ctrlplane", + Long: `Command for listing resources int ctrlplane ie: systems|environments.`, + RunE: func(cmd *cobra.Command, args []string) error { + return cmd.Help() + }, + } + + cmd.AddCommand(systems.NewListSystemsCmd()) + cmd.AddCommand(environments.NewListEnvironmentsCmd()) + cmd.AddCommand(deployments.NewListDeploymentsCmd()) + + return cmd +} diff --git a/cmd/ctrlc/root/api/list/systems/systems.go b/cmd/ctrlc/root/api/list/systems/systems.go new file mode 100644 index 0000000..875b7a3 --- /dev/null +++ b/cmd/ctrlc/root/api/list/systems/systems.go @@ -0,0 +1,55 @@ +package systems + +import ( + "fmt" + + "github.com/ctrlplanedev/cli/internal/api" + "github.com/ctrlplanedev/cli/internal/cliutil" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +func NewListSystemsCmd() *cobra.Command { + var limit int + var offset int + + cmd := &cobra.Command{ + Use: "systems", + Short: "List systems", + Long: `Commands for getting resources.`, + RunE: func(cmd *cobra.Command, args []string) error { + apiURL := viper.GetString("url") + apiKey := viper.GetString("api-key") + workspace := viper.GetString("workspace") + + client, err := api.NewAPIKeyClientWithResponses(apiURL, apiKey) + if err != nil { + return fmt.Errorf("failed to create API client: %w", err) + } + + workspaceID := client.GetWorkspaceID(cmd.Context(), workspace) + + params := &api.ListSystemsParams{} + if limit > 0 { + params.Limit = &limit + } + if offset > 0 { + params.Offset = &offset + } + resp, err := client.ListSystems(cmd.Context(), workspaceID.String(), params) + if err != nil { + + return fmt.Errorf("failed to get resources: %w", err) + } + + return cliutil.HandleResponseOutput(cmd, resp) + }, + } + + cmd.Flags().IntVarP(&limit, "limit", "l", 50, "Limit the number of results") + cmd.Flags().IntVarP(&offset, "offset", "o", 0, "Offset the results") + + cmd.MarkFlagRequired("workspace") + + return cmd +} From cc8a7b6e8bfa273d8baf350e49e06906259ff289 Mon Sep 17 00:00:00 2001 From: Michael Leone Date: Mon, 19 Jan 2026 14:55:52 -0500 Subject: [PATCH 2/3] fix: fix copy in command output * changes copy to match the resource name --- cmd/ctrlc/root/api/list/deployments/deployments.go | 4 ++-- cmd/ctrlc/root/api/list/environments/environments.go | 4 ++-- cmd/ctrlc/root/api/list/systems/systems.go | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/ctrlc/root/api/list/deployments/deployments.go b/cmd/ctrlc/root/api/list/deployments/deployments.go index 9cf2eaa..3ef9bdc 100644 --- a/cmd/ctrlc/root/api/list/deployments/deployments.go +++ b/cmd/ctrlc/root/api/list/deployments/deployments.go @@ -16,7 +16,7 @@ func NewListDeploymentsCmd() *cobra.Command { cmd := &cobra.Command{ Use: "deployments", Short: "List deployments", - Long: `Commands for getting resources.`, + Long: `Commands for getting deployments.`, RunE: func(cmd *cobra.Command, args []string) error { apiURL := viper.GetString("url") apiKey := viper.GetString("api-key") @@ -39,7 +39,7 @@ func NewListDeploymentsCmd() *cobra.Command { resp, err := client.ListDeployments(cmd.Context(), workspaceID.String(), params) if err != nil { - return fmt.Errorf("failed to get resources: %w", err) + return fmt.Errorf("failed to get deployments: %w", err) } return cliutil.HandleResponseOutput(cmd, resp) diff --git a/cmd/ctrlc/root/api/list/environments/environments.go b/cmd/ctrlc/root/api/list/environments/environments.go index 12741ff..a5a4875 100644 --- a/cmd/ctrlc/root/api/list/environments/environments.go +++ b/cmd/ctrlc/root/api/list/environments/environments.go @@ -16,7 +16,7 @@ func NewListEnvironmentsCmd() *cobra.Command { cmd := &cobra.Command{ Use: "environments", Short: "List environments", - Long: `Commands for getting resources.`, + Long: `Commands for getting environments.`, RunE: func(cmd *cobra.Command, args []string) error { apiURL := viper.GetString("url") apiKey := viper.GetString("api-key") @@ -39,7 +39,7 @@ func NewListEnvironmentsCmd() *cobra.Command { resp, err := client.ListEnvironments(cmd.Context(), workspaceID.String(), params) if err != nil { - return fmt.Errorf("failed to get resources: %w", err) + return fmt.Errorf("failed to get environments: %w", err) } return cliutil.HandleResponseOutput(cmd, resp) diff --git a/cmd/ctrlc/root/api/list/systems/systems.go b/cmd/ctrlc/root/api/list/systems/systems.go index 875b7a3..2fe00ff 100644 --- a/cmd/ctrlc/root/api/list/systems/systems.go +++ b/cmd/ctrlc/root/api/list/systems/systems.go @@ -16,7 +16,7 @@ func NewListSystemsCmd() *cobra.Command { cmd := &cobra.Command{ Use: "systems", Short: "List systems", - Long: `Commands for getting resources.`, + Long: `Commands for getting systems.`, RunE: func(cmd *cobra.Command, args []string) error { apiURL := viper.GetString("url") apiKey := viper.GetString("api-key") @@ -39,7 +39,7 @@ func NewListSystemsCmd() *cobra.Command { resp, err := client.ListSystems(cmd.Context(), workspaceID.String(), params) if err != nil { - return fmt.Errorf("failed to get resources: %w", err) + return fmt.Errorf("failed to get systems: %w", err) } return cliutil.HandleResponseOutput(cmd, resp) From f8c58e67e8d715bec75553e1d0252e22d236c1c9 Mon Sep 17 00:00:00 2001 From: Michael Leone Date: Wed, 21 Jan 2026 11:24:34 -0500 Subject: [PATCH 3/3] refactor: remove list verb * after talking with jsbroks, the command should work similar to kubectl, I've moved the list verb under go, will refactor to dry up the code as most things are the same beetween the calls --- cmd/ctrlc/root/api/api.go | 2 -- .../{list => get}/deployments/deployments.go | 2 +- .../environments/environments.go | 2 +- cmd/ctrlc/root/api/get/get.go | 6 +++++ .../root/api/{list => get}/systems/systems.go | 2 +- cmd/ctrlc/root/api/list/list.go | 25 ------------------- 6 files changed, 9 insertions(+), 30 deletions(-) rename cmd/ctrlc/root/api/{list => get}/deployments/deployments.go (96%) rename cmd/ctrlc/root/api/{list => get}/environments/environments.go (96%) rename cmd/ctrlc/root/api/{list => get}/systems/systems.go (96%) delete mode 100644 cmd/ctrlc/root/api/list/list.go diff --git a/cmd/ctrlc/root/api/api.go b/cmd/ctrlc/root/api/api.go index cce1acc..1924873 100644 --- a/cmd/ctrlc/root/api/api.go +++ b/cmd/ctrlc/root/api/api.go @@ -5,7 +5,6 @@ import ( "os" "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/get" - "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/list" "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/upsert" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -46,7 +45,6 @@ func NewAPICmd() *cobra.Command { cmd.AddCommand(get.NewGetCmd()) cmd.AddCommand(upsert.NewUpsertCmd()) - cmd.AddCommand(list.NewListCmd()) return cmd } diff --git a/cmd/ctrlc/root/api/list/deployments/deployments.go b/cmd/ctrlc/root/api/get/deployments/deployments.go similarity index 96% rename from cmd/ctrlc/root/api/list/deployments/deployments.go rename to cmd/ctrlc/root/api/get/deployments/deployments.go index 3ef9bdc..9a4b07c 100644 --- a/cmd/ctrlc/root/api/list/deployments/deployments.go +++ b/cmd/ctrlc/root/api/get/deployments/deployments.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/viper" ) -func NewListDeploymentsCmd() *cobra.Command { +func NewDeploymentsCmd() *cobra.Command { var limit int var offset int diff --git a/cmd/ctrlc/root/api/list/environments/environments.go b/cmd/ctrlc/root/api/get/environments/environments.go similarity index 96% rename from cmd/ctrlc/root/api/list/environments/environments.go rename to cmd/ctrlc/root/api/get/environments/environments.go index a5a4875..5276f07 100644 --- a/cmd/ctrlc/root/api/list/environments/environments.go +++ b/cmd/ctrlc/root/api/get/environments/environments.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/viper" ) -func NewListEnvironmentsCmd() *cobra.Command { +func NewEnvironmentsCmd() *cobra.Command { var limit int var offset int diff --git a/cmd/ctrlc/root/api/get/get.go b/cmd/ctrlc/root/api/get/get.go index d22be74..9d0044c 100644 --- a/cmd/ctrlc/root/api/get/get.go +++ b/cmd/ctrlc/root/api/get/get.go @@ -1,7 +1,10 @@ package get import ( + "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/get/deployments" + "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/get/environments" "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/get/resources" + "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/get/systems" "github.com/spf13/cobra" ) @@ -16,6 +19,9 @@ func NewGetCmd() *cobra.Command { } cmd.AddCommand(resources.NewResourcesCmd()) + cmd.AddCommand(deployments.NewDeploymentsCmd()) + cmd.AddCommand(systems.NewSystemsCmd()) + cmd.AddCommand(environments.NewEnvironmentsCmd()) return cmd } diff --git a/cmd/ctrlc/root/api/list/systems/systems.go b/cmd/ctrlc/root/api/get/systems/systems.go similarity index 96% rename from cmd/ctrlc/root/api/list/systems/systems.go rename to cmd/ctrlc/root/api/get/systems/systems.go index 2fe00ff..8bb923d 100644 --- a/cmd/ctrlc/root/api/list/systems/systems.go +++ b/cmd/ctrlc/root/api/get/systems/systems.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/viper" ) -func NewListSystemsCmd() *cobra.Command { +func NewSystemsCmd() *cobra.Command { var limit int var offset int diff --git a/cmd/ctrlc/root/api/list/list.go b/cmd/ctrlc/root/api/list/list.go deleted file mode 100644 index f517267..0000000 --- a/cmd/ctrlc/root/api/list/list.go +++ /dev/null @@ -1,25 +0,0 @@ -package list - -import ( - "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/list/deployments" - "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/list/environments" - "github.com/ctrlplanedev/cli/cmd/ctrlc/root/api/list/systems" - "github.com/spf13/cobra" -) - -func NewListCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "list ", - Short: "List types of resources in ctrlplane", - Long: `Command for listing resources int ctrlplane ie: systems|environments.`, - RunE: func(cmd *cobra.Command, args []string) error { - return cmd.Help() - }, - } - - cmd.AddCommand(systems.NewListSystemsCmd()) - cmd.AddCommand(environments.NewListEnvironmentsCmd()) - cmd.AddCommand(deployments.NewListDeploymentsCmd()) - - return cmd -}