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
}