Skip to content
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

K8 endpoint updates #159

Merged
merged 5 commits into from
Aug 30, 2021
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
33 changes: 33 additions & 0 deletions kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ type KubernetesService interface {
ListClusters(ctx context.Context, options *ListOptions) ([]Cluster, *Meta, error)
UpdateCluster(ctx context.Context, vkeID string, updateReq *ClusterReqUpdate) error
DeleteCluster(ctx context.Context, id string) error
DeleteClusterWithResources(ctx context.Context, id string) error

CreateNodePool(ctx context.Context, vkeID string, nodePoolReq *NodePoolReq) (*NodePool, error)
ListNodePools(ctx context.Context, vkeID string, options *ListOptions) ([]NodePool, *Meta, error)
Expand All @@ -29,6 +30,7 @@ type KubernetesService interface {
RecycleNodePoolInstance(ctx context.Context, vkeID, nodePoolID, nodeID string) error

GetKubeConfig(ctx context.Context, vkeID string) (*KubeConfig, error)
GetVersions(ctx context.Context) (*Versions, error)
}

// KubernetesHandler handles interaction with the kubernetes methods for the Vultr API
Expand Down Expand Up @@ -119,6 +121,11 @@ type vkeNodePoolBase struct {
NodePool *NodePool `json:"node_pool"`
}

// Versions that are supported for VKE
type Versions struct {
Versions []string `json:"versions"`
}

// CreateCluster will create a Kubernetes cluster.
func (k *KubernetesHandler) CreateCluster(ctx context.Context, createReq *ClusterReq) (*Cluster, error) {
req, err := k.client.NewRequest(ctx, http.MethodPost, vkePath, createReq)
Expand Down Expand Up @@ -191,6 +198,16 @@ func (k *KubernetesHandler) DeleteCluster(ctx context.Context, id string) error
return k.client.DoWithContext(ctx, req, nil)
}

// DeleteClusterWithResources will delete a Kubernetes cluster and all related resources.
func (k *KubernetesHandler) DeleteClusterWithResources(ctx context.Context, id string) error {
req, err := k.client.NewRequest(ctx, http.MethodDelete, fmt.Sprintf("%s/%s/delete-with-linked-resources", vkePath, id), nil)
if err != nil {
return err
}

return k.client.DoWithContext(ctx, req, nil)
}

// CreateNodePool creates a nodepool on a VKE cluster
func (k *KubernetesHandler) CreateNodePool(ctx context.Context, vkeID string, nodePoolReq *NodePoolReq) (*NodePool, error) {
req, err := k.client.NewRequest(ctx, http.MethodPost, fmt.Sprintf("%s/%s/node-pools", vkePath, vkeID), nodePoolReq)
Expand Down Expand Up @@ -303,3 +320,19 @@ func (k *KubernetesHandler) GetKubeConfig(ctx context.Context, vkeID string) (*K

return kc, nil
}

// GetVersions returns the supported kubernetes versions
func (k *KubernetesHandler) GetVersions(ctx context.Context) (*Versions, error) {
uri := "/v2/kubernetes/versions"
req, err := k.client.NewRequest(ctx, http.MethodGet, uri, nil)
if err != nil {
return nil, err
}

versions := new(Versions)
if err = k.client.DoWithContext(ctx, req, &versions); err != nil {
return nil, err
}

return versions, nil
}
41 changes: 41 additions & 0 deletions kubernetes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,20 @@ func TestKubernetesHandler_DeleteCluster(t *testing.T) {
}
}

func TestKubernetesHandler_DeleteClusterWithResources(t *testing.T) {
setup()
defer teardown()

mux.HandleFunc(fmt.Sprintf("%s/%s/delete-with-linked-resources", vkePath, "14b3e7d6-ffb5-4994-8502-57fcd9db3b33"), func(writer http.ResponseWriter, request *http.Request) {
fmt.Fprint(writer)
})

err := client.Kubernetes.DeleteClusterWithResources(ctx, "14b3e7d6-ffb5-4994-8502-57fcd9db3b33")
if err != nil {
t.Errorf("Kubernetes.DeleteClusterWithResources returned %+v", err)
}
}

func TestKubernetesHandler_CreateNodePool(t *testing.T) {
setup()
defer teardown()
Expand Down Expand Up @@ -664,3 +678,30 @@ func TestKubernetesHandler_GetKubeConfig(t *testing.T) {
t.Error("Kubernetes.GetKubeConfig returned nil")
}
}

func TestKubernetesHandler_GetVersions(t *testing.T) {
setup()
defer teardown()
path := "/v2/kubernetes/versions"
mux.HandleFunc(fmt.Sprintf(path), func(writer http.ResponseWriter, request *http.Request) {
response := `{"versions": ["v1.20.0+1"]}`
fmt.Fprint(writer, response)
})

config, err := client.Kubernetes.GetVersions(ctx)
if err != nil {
t.Errorf("Kubernetes.GetVersions returned %+v", err)
}

expected := &Versions{Versions: []string{"v1.20.0+1"}}
if !reflect.DeepEqual(config, expected) {
t.Errorf("Kubernetes.GetVersions returned %+v, expected %+v", config, expected)
}

c, can := context.WithTimeout(ctx, 1*time.Microsecond)
defer can()
_, err = client.Kubernetes.GetVersions(c)
if err == nil {
t.Error("Kubernetes.GetVersions returned nil")
}
}