From a08bfa6bfba39d31e47382d58a6a4d9a6da800e8 Mon Sep 17 00:00:00 2001 From: Garrett Date: Wed, 10 Mar 2021 03:15:33 +0000 Subject: [PATCH 1/3] Validate hostname, name, and cluster address on wsp create --- coder-sdk/workspace_providers.go | 11 +++++++++++ internal/cmd/providers.go | 25 +++++++++++++++++++------ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/coder-sdk/workspace_providers.go b/coder-sdk/workspace_providers.go index 33b94655..224e3eb0 100644 --- a/coder-sdk/workspace_providers.go +++ b/coder-sdk/workspace_providers.go @@ -41,6 +41,14 @@ const ( WorkspaceProviderReady WorkspaceProviderStatus = "ready" ) +// WorkspaceProviderStatus represents the configuration state of a workspace provider. +type WorkspaceProviderType string + +// Workspace Provider statuses. +const ( + WorkspaceProviderKubernetes WorkspaceProviderType = "kubernetes" +) + // WorkspaceProviderByID fetches a workspace provider entity by its unique ID. func (c *DefaultClient) WorkspaceProviderByID(ctx context.Context, id string) (*KubernetesProvider, error) { var wp KubernetesProvider @@ -64,6 +72,9 @@ func (c *DefaultClient) WorkspaceProviders(ctx context.Context) (*WorkspaceProvi // CreateWorkspaceProviderReq defines the request parameters for creating a new workspace provider entity. type CreateWorkspaceProviderReq struct { Name string `json:"name"` + Type WorkspaceProviderType `json:"type"` + Hostname string `json:"hostname"` + ClusterAddress string `json:"cluster_address"` } // CreateWorkspaceProviderRes defines the response from creating a new workspace provider entity. diff --git a/internal/cmd/providers.go b/internal/cmd/providers.go index e771dcf1..70b84c28 100644 --- a/internal/cmd/providers.go +++ b/internal/cmd/providers.go @@ -7,7 +7,6 @@ import ( "golang.org/x/xerrors" "cdr.dev/coder-cli/coder-sdk" - "cdr.dev/coder-cli/internal/x/xcobra" "cdr.dev/coder-cli/pkg/clog" "cdr.dev/coder-cli/pkg/tablewriter" ) @@ -29,13 +28,18 @@ func providersCmd() *cobra.Command { } func createProviderCmd() *cobra.Command { + var ( + name string + hostname string + clusterAddress string + ) cmd := &cobra.Command{ - Use: "create [workspace_provider_name]", + Use: "create --name=[name] --hostname=[hostname] --clusterAddress=[clusterAddress]", Short: "create a new workspace provider.", - Args: xcobra.ExactArgs(1), Long: "Create a new Coder workspace provider.", Example: `# create a new workspace provider in a pending state -coder providers create my-new-workspace-provider`, + +coder providers create --name=my-provider --hostname=provider.example.com --clusterAddress=255.255.255.255`, RunE: func(cmd *cobra.Command, args []string) error { ctx := cmd.Context() @@ -44,9 +48,11 @@ coder providers create my-new-workspace-provider`, return err } - // ExactArgs(1) ensures our name value can't panic on an out of bounds. createReq := &coder.CreateWorkspaceProviderReq{ - Name: args[0], + Name: name, + Type: coder.WorkspaceProviderKubernetes, + Hostname: hostname, + ClusterAddress: clusterAddress, } wp, err := client.CreateWorkspaceProvider(ctx, *createReq) @@ -63,6 +69,13 @@ coder providers create my-new-workspace-provider`, return nil }, } + + cmd.Flags().StringVar(&name, "name", "", "workspace provider name") + cmd.Flags().StringVar(&hostname, "hostname", "", "workspace provider hostname") + cmd.Flags().StringVar(&clusterAddress, "clusterAddress", "", "kubernetes cluster apiserver endpoint") + _ = cmd.MarkFlagRequired("name") + _ = cmd.MarkFlagRequired("hostname") + _ = cmd.MarkFlagRequired("clusterAdress") return cmd } From bfe525ab5cc3767e1bf9c14731d14e8433a77915 Mon Sep 17 00:00:00 2001 From: Garrett Date: Wed, 10 Mar 2021 19:43:41 +0000 Subject: [PATCH 2/3] fmt --- coder-sdk/workspace_providers.go | 12 ++++++------ internal/cmd/providers.go | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/coder-sdk/workspace_providers.go b/coder-sdk/workspace_providers.go index 224e3eb0..b252a1b9 100644 --- a/coder-sdk/workspace_providers.go +++ b/coder-sdk/workspace_providers.go @@ -41,10 +41,10 @@ const ( WorkspaceProviderReady WorkspaceProviderStatus = "ready" ) -// WorkspaceProviderStatus represents the configuration state of a workspace provider. +// WorkspaceProviderType represents the type of workspace provider. type WorkspaceProviderType string -// Workspace Provider statuses. +// Workspace Provider types. const ( WorkspaceProviderKubernetes WorkspaceProviderType = "kubernetes" ) @@ -71,10 +71,10 @@ func (c *DefaultClient) WorkspaceProviders(ctx context.Context) (*WorkspaceProvi // CreateWorkspaceProviderReq defines the request parameters for creating a new workspace provider entity. type CreateWorkspaceProviderReq struct { - Name string `json:"name"` - Type WorkspaceProviderType `json:"type"` - Hostname string `json:"hostname"` - ClusterAddress string `json:"cluster_address"` + Name string `json:"name"` + Type WorkspaceProviderType `json:"type"` + Hostname string `json:"hostname"` + ClusterAddress string `json:"cluster_address"` } // CreateWorkspaceProviderRes defines the response from creating a new workspace provider entity. diff --git a/internal/cmd/providers.go b/internal/cmd/providers.go index 70b84c28..9464d7ad 100644 --- a/internal/cmd/providers.go +++ b/internal/cmd/providers.go @@ -29,8 +29,8 @@ func providersCmd() *cobra.Command { func createProviderCmd() *cobra.Command { var ( - name string - hostname string + name string + hostname string clusterAddress string ) cmd := &cobra.Command{ @@ -49,9 +49,9 @@ coder providers create --name=my-provider --hostname=provider.example.com --clus } createReq := &coder.CreateWorkspaceProviderReq{ - Name: name, - Type: coder.WorkspaceProviderKubernetes, - Hostname: hostname, + Name: name, + Type: coder.WorkspaceProviderKubernetes, + Hostname: hostname, ClusterAddress: clusterAddress, } From 710e3cf8c4d3e844d080ae886beb3454e83b5fc5 Mon Sep 17 00:00:00 2001 From: Garrett Date: Wed, 10 Mar 2021 19:50:43 +0000 Subject: [PATCH 3/3] comments --- internal/cmd/providers.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/internal/cmd/providers.go b/internal/cmd/providers.go index 9464d7ad..8f3530f6 100644 --- a/internal/cmd/providers.go +++ b/internal/cmd/providers.go @@ -3,6 +3,8 @@ package cmd import ( "fmt" + "cdr.dev/coder-cli/internal/x/xcobra" + "github.com/spf13/cobra" "golang.org/x/xerrors" @@ -29,17 +31,17 @@ func providersCmd() *cobra.Command { func createProviderCmd() *cobra.Command { var ( - name string hostname string clusterAddress string ) cmd := &cobra.Command{ - Use: "create --name=[name] --hostname=[hostname] --clusterAddress=[clusterAddress]", + Use: "create [name] --hostname=[hostname] --clusterAddress=[clusterAddress]", + Args: xcobra.ExactArgs(1), Short: "create a new workspace provider.", Long: "Create a new Coder workspace provider.", Example: `# create a new workspace provider in a pending state -coder providers create --name=my-provider --hostname=provider.example.com --clusterAddress=255.255.255.255`, +coder providers create my-provider --hostname=https://provider.example.com --cluster-address=https://255.255.255.255`, RunE: func(cmd *cobra.Command, args []string) error { ctx := cmd.Context() @@ -48,8 +50,9 @@ coder providers create --name=my-provider --hostname=provider.example.com --clus return err } + // ExactArgs(1) ensures our name value can't panic on an out of bounds. createReq := &coder.CreateWorkspaceProviderReq{ - Name: name, + Name: args[0], Type: coder.WorkspaceProviderKubernetes, Hostname: hostname, ClusterAddress: clusterAddress, @@ -70,12 +73,10 @@ coder providers create --name=my-provider --hostname=provider.example.com --clus }, } - cmd.Flags().StringVar(&name, "name", "", "workspace provider name") cmd.Flags().StringVar(&hostname, "hostname", "", "workspace provider hostname") - cmd.Flags().StringVar(&clusterAddress, "clusterAddress", "", "kubernetes cluster apiserver endpoint") - _ = cmd.MarkFlagRequired("name") + cmd.Flags().StringVar(&clusterAddress, "cluster-address", "", "kubernetes cluster apiserver endpoint") _ = cmd.MarkFlagRequired("hostname") - _ = cmd.MarkFlagRequired("clusterAdress") + _ = cmd.MarkFlagRequired("cluster-address") return cmd }