tpu-provisioner/internal/cloud/gke_service.go (76 lines of code) (raw):
package cloud
import (
"context"
"fmt"
"net/http"
containerv1beta1 "google.golang.org/api/container/v1beta1"
"google.golang.org/api/googleapi"
)
type NodePoolService interface {
Get(ctx context.Context, name string) (*containerv1beta1.NodePool, error)
List(ctx context.Context) (*containerv1beta1.ListNodePoolsResponse, error)
Create(ctx context.Context, req *containerv1beta1.CreateNodePoolRequest, callbacks OpCallbacks) error
Delete(ctx context.Context, name string, callbacks OpCallbacks) error
}
type OpCallbacks struct {
NotFound func()
ReqFailure func(err error)
OpFailure func(err error)
Success func()
}
var _ NodePoolService = &GKENodePoolService{}
type GKENodePoolService struct {
ClusterContext GKEContext
Service *containerv1beta1.Service
}
func (g *GKENodePoolService) Get(ctx context.Context, name string) (*containerv1beta1.NodePool, error) {
return g.Service.Projects.Locations.Clusters.NodePools.Get(g.ClusterContext.NodePoolName(name)).Context(ctx).Do()
}
func (g *GKENodePoolService) List(ctx context.Context) (*containerv1beta1.ListNodePoolsResponse, error) {
return g.Service.Projects.Locations.Clusters.NodePools.List(g.ClusterContext.ClusterName()).Context(ctx).Do()
}
func (g *GKENodePoolService) Create(ctx context.Context, req *containerv1beta1.CreateNodePoolRequest, callbacks OpCallbacks) error {
call := g.Service.Projects.Locations.Clusters.NodePools.Create(g.ClusterContext.ClusterName(), req)
op, err := call.Do()
if err != nil {
if callbacks.ReqFailure != nil {
callbacks.ReqFailure(err)
}
return fmt.Errorf("do: %w", err)
}
if err := waitForGkeOp(g.Service, g.ClusterContext, op); err != nil {
if callbacks.OpFailure != nil {
callbacks.OpFailure(err)
}
return fmt.Errorf("waiting for operation: %w", err)
}
if callbacks.Success != nil {
callbacks.Success()
}
return nil
}
func (g *GKENodePoolService) Delete(ctx context.Context, name string, callbacks OpCallbacks) error {
op, err := g.Service.Projects.Locations.Clusters.Delete(g.ClusterContext.NodePoolName(name)).Context(ctx).Do()
if err != nil {
if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == http.StatusNotFound {
if callbacks.NotFound != nil {
callbacks.NotFound()
}
return nil
}
if callbacks.ReqFailure != nil {
callbacks.ReqFailure(err)
}
return fmt.Errorf("deleting node pool %q: %w", name, err)
}
if err := waitForGkeOp(g.Service, g.ClusterContext, op); err != nil {
if callbacks.OpFailure != nil {
callbacks.OpFailure(err)
}
return err
}
if callbacks.Success != nil {
callbacks.Success()
}
return nil
}