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  }