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 }