github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/cloud/buckets/default_provider.go (about) 1 package buckets 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 "io/ioutil" 8 "time" 9 10 "github.com/olli-ai/jx/v2/pkg/cloud/gke" 11 "github.com/olli-ai/jx/v2/pkg/util" 12 "github.com/pkg/errors" 13 "gocloud.dev/blob" 14 15 // let's immport every provider's blobs so we don't fail when calling the generic library 16 _ "gocloud.dev/blob/azureblob" 17 _ "gocloud.dev/blob/fileblob" 18 _ "gocloud.dev/blob/gcsblob" 19 _ "gocloud.dev/blob/s3blob" 20 ) 21 22 // LegacyBucketProvider is the default provider for non boot clusters 23 type LegacyBucketProvider struct { 24 gcloud gke.GClouder 25 bucket *blob.Bucket 26 classifier string 27 } 28 29 // CreateNewBucketForCluster is not supported for LegacyBucketProvider 30 func (LegacyBucketProvider) CreateNewBucketForCluster(clusterName string, bucketKind string) (string, error) { 31 return "", fmt.Errorf("CreateNewBucketForCluster not implemented for LegacyBucketProvider") 32 } 33 34 // EnsureBucketIsCreated is not supported for LegacyBucketProvider 35 func (LegacyBucketProvider) EnsureBucketIsCreated(bucketURL string) error { 36 return fmt.Errorf("EnsureBucketIsCreated not implemented for LegacyBucketProvider") 37 } 38 39 // DownloadFileFromBucket is not supported for LegacyBucketProvider 40 func (LegacyBucketProvider) DownloadFileFromBucket(bucketURL string) (io.ReadCloser, error) { 41 return nil, fmt.Errorf("DownloadFileFromBucket not implemented for LegacyBucketProvider") 42 } 43 44 // UploadFileToBucket uploads a file to the provider specific bucket with the given outputName using the gocloud library 45 func (p LegacyBucketProvider) UploadFileToBucket(reader io.Reader, outputName string, bucketURL string) (string, error) { 46 opts := &blob.WriterOptions{ 47 ContentType: util.ContentTypeForFileName(outputName), 48 Metadata: map[string]string{ 49 "classification": p.classifier, 50 }, 51 } 52 u := "" 53 ctx := p.createContext() 54 bytes, err := ioutil.ReadAll(reader) 55 if err != nil { 56 return "", err 57 } 58 err = p.bucket.WriteAll(ctx, outputName, bytes, opts) 59 if err != nil { 60 return u, errors.Wrapf(err, "failed to write to bucket %s", outputName) 61 } 62 u = util.UrlJoin(bucketURL, outputName) 63 return u, nil 64 } 65 66 func (LegacyBucketProvider) createContext() context.Context { 67 ctx, _ := context.WithTimeout(context.Background(), time.Second*20) 68 return ctx 69 } 70 71 // Initialize initializes and opens a bucket object for the given bucketURL and classifier 72 func (p *LegacyBucketProvider) Initialize(bucketURL string, classifier string) error { 73 ctx, _ := context.WithTimeout(context.Background(), time.Second*20) 74 if bucketURL == "" { 75 return fmt.Errorf("no BucketURL is configured for the storage location in the TeamSettings") 76 } 77 bucket, err := blob.Open(ctx, bucketURL) 78 if err != nil { 79 return errors.Wrapf(err, "failed to open bucket %s", bucketURL) 80 } 81 p.bucket = bucket 82 p.classifier = classifier 83 return nil 84 } 85 86 // NewLegacyBucketProvider create a new provider for non supported providers or non boot clusters 87 func NewLegacyBucketProvider() Provider { 88 return &LegacyBucketProvider{ 89 gcloud: &gke.GCloud{}, 90 } 91 }