github.com/jenkins-x/jx/v2@v2.1.155/pkg/cloud/gke/storage/bucket_provider.go (about)

     1  package storage
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"net/url"
     7  	"strings"
     8  	"time"
     9  
    10  	uuid2 "github.com/google/uuid"
    11  	"github.com/jenkins-x/jx-logging/pkg/log"
    12  	"github.com/jenkins-x/jx/v2/pkg/cloud/buckets"
    13  	"github.com/jenkins-x/jx/v2/pkg/cloud/gke"
    14  	"github.com/jenkins-x/jx/v2/pkg/config"
    15  	"github.com/jenkins-x/jx/v2/pkg/util"
    16  	"github.com/pkg/errors"
    17  )
    18  
    19  var (
    20  	defaultBucketWriteTimeout = 20 * time.Second
    21  )
    22  
    23  // GKEBucketProvider the bucket provider for GKE
    24  type GKEBucketProvider struct {
    25  	Requirements *config.RequirementsConfig
    26  	gcloud       gke.GClouder
    27  }
    28  
    29  // CreateNewBucketForCluster creates a new dynamic bucket
    30  func (b *GKEBucketProvider) CreateNewBucketForCluster(clusterName string, bucketKind string) (string, error) {
    31  	uuid := uuid2.New()
    32  	bucketURL := fmt.Sprintf("gs://%s-%s-%s", clusterName, bucketKind, uuid.String())
    33  	if len(bucketURL) > 60 {
    34  		bucketURL = bucketURL[:60]
    35  	}
    36  	if strings.HasSuffix(bucketURL, "-") {
    37  		bucketURL = bucketURL[:59]
    38  	}
    39  	err := b.EnsureBucketIsCreated(bucketURL)
    40  	if err != nil {
    41  		return bucketURL, errors.Wrapf(err, "failed to create bucket %s", bucketURL)
    42  	}
    43  
    44  	return bucketURL, nil
    45  }
    46  
    47  // EnsureBucketIsCreated ensures the bucket URL is createtd
    48  func (b *GKEBucketProvider) EnsureBucketIsCreated(bucketURL string) error {
    49  	project := b.Requirements.Cluster.ProjectID
    50  	if project == "" {
    51  		return fmt.Errorf("requirements do not specify a project")
    52  	}
    53  	u, err := url.Parse(bucketURL)
    54  	if err != nil {
    55  		return errors.Wrapf(err, "failed to parse bucket name from %s", bucketURL)
    56  	}
    57  	bucketName := u.Host
    58  
    59  	exists, err := b.gcloud.BucketExists(project, bucketName)
    60  	if err != nil {
    61  		return errors.Wrap(err, "checking if the provided bucket exists")
    62  	}
    63  	if exists {
    64  		return nil
    65  	}
    66  
    67  	infoBucketURL := util.ColorInfo(bucketURL)
    68  	log.Logger().Infof("The bucket %s does not exist so lets create it", infoBucketURL)
    69  	region := gke.GetRegionFromZone(b.Requirements.Cluster.Zone)
    70  	err = b.gcloud.CreateBucket(project, bucketName, region)
    71  	b.gcloud.AddBucketLabel(bucketName, b.gcloud.UserLabel())
    72  	if err != nil {
    73  		return errors.Wrapf(err, "there was a problem creating the bucket %s in the GKE Project %s",
    74  			bucketName, project)
    75  	}
    76  	return nil
    77  }
    78  
    79  // UploadFileToBucket uploads a file to the provided GCS bucket with the provided outputName
    80  func (b *GKEBucketProvider) UploadFileToBucket(reader io.Reader, key string, bucketURL string) (string, error) {
    81  	log.Logger().Debugf("Uploading to bucket %s with key %s", bucketURL, key)
    82  	err := buckets.WriteBucket(bucketURL, key, reader, defaultBucketWriteTimeout)
    83  	return bucketURL + "/" + key, err
    84  }
    85  
    86  // DownloadFileFromBucket downloads a file from GCS from the given bucketURL and server its contents with a bufio.Scanner
    87  func (b *GKEBucketProvider) DownloadFileFromBucket(bucketURL string) (io.ReadCloser, error) {
    88  	return gke.StreamTransferFileFromBucket(bucketURL)
    89  }
    90  
    91  // NewGKEBucketProvider create a new provider for GKE
    92  func NewGKEBucketProvider(requirements *config.RequirementsConfig) buckets.Provider {
    93  	return &GKEBucketProvider{
    94  		Requirements: requirements,
    95  		gcloud:       &gke.GCloud{},
    96  	}
    97  }