readysite / pkg / platform / providers / gcp / platform.go
1.4 KB
platform.go
package gcp

import (
	"context"
	"fmt"

	compute "cloud.google.com/go/compute/apiv1"
	"github.com/readysite/readysite/pkg/platform"
	"google.golang.org/api/dns/v1"
	"google.golang.org/api/option"
)

type backend struct {
	instances *compute.InstancesClient
	disks     *compute.DisksClient
	dns       *dns.Service
	project   string
	ctx       context.Context
}

// New creates a GCP platform
func New(projectID string, opts ...option.ClientOption) (*platform.Platform, error) {
	ctx := context.Background()

	instances, err := compute.NewInstancesRESTClient(ctx, opts...)
	if err != nil {
		return nil, fmt.Errorf("create instances client: %w", err)
	}

	disks, err := compute.NewDisksRESTClient(ctx, opts...)
	if err != nil {
		return nil, fmt.Errorf("create disks client: %w", err)
	}

	dnsService, err := dns.NewService(ctx, opts...)
	if err != nil {
		return nil, fmt.Errorf("create dns service: %w", err)
	}

	return &platform.Platform{
		Backend: &backend{
			instances: instances,
			disks:     disks,
			dns:       dnsService,
			project:   projectID,
			ctx:       ctx,
		},
	}, nil
}

// Close releases all client resources
func (b *backend) Close() error {
	var errs []error
	if err := b.instances.Close(); err != nil {
		errs = append(errs, err)
	}
	if err := b.disks.Close(); err != nil {
		errs = append(errs, err)
	}
	if len(errs) > 0 {
		return fmt.Errorf("close errors: %v", errs)
	}
	return nil
}
← Back