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

     1  package storage
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"io"
     7  	"net/url"
     8  	"time"
     9  
    10  	"github.com/Azure/azure-storage-blob-go/azblob"
    11  	"github.com/Azure/go-autorest/autorest/adal"
    12  	"github.com/Azure/go-autorest/autorest/azure"
    13  	"github.com/jenkins-x/jx/v2/pkg/cloud/buckets"
    14  	"github.com/jenkins-x/jx/v2/pkg/config"
    15  )
    16  
    17  var (
    18  	defaultBucketWriteTimeout = 20 * time.Second
    19  )
    20  
    21  // AKSBucketProvider the bucket provider for Azure
    22  type AKSBucketProvider struct {
    23  	Requirements *config.RequirementsConfig
    24  }
    25  
    26  // CreateNewBucketForCluster is not implemented
    27  func (b *AKSBucketProvider) CreateNewBucketForCluster(_ string, _ string) (string, error) {
    28  	return "", nil
    29  }
    30  
    31  // EnsureBucketIsCreated is not implemented
    32  func (b *AKSBucketProvider) EnsureBucketIsCreated(_ string) error {
    33  	return nil
    34  }
    35  
    36  func getAccessToken(resource string) (adal.Token, error) {
    37  
    38  	msiEndpoint, err := adal.GetMSIEndpoint()
    39  	if err != nil {
    40  		return adal.Token{}, fmt.Errorf("failed to get endpoint for MSI: %v", err)
    41  	}
    42  
    43  	spToken, err := adal.NewServicePrincipalTokenFromMSI(msiEndpoint, resource)
    44  	if err != nil {
    45  		return adal.Token{}, fmt.Errorf("failed to get service principal token from MSI: %v", err)
    46  	}
    47  
    48  	err = spToken.Refresh()
    49  	if err != nil {
    50  		return adal.Token{}, fmt.Errorf("failed to refresh service principal token, %w", err)
    51  	}
    52  
    53  	return spToken.Token(), nil
    54  }
    55  
    56  func getContainerURL(bucketURL string) (azblob.ContainerURL, error) {
    57  
    58  	token, err := getAccessToken(azure.PublicCloud.ResourceIdentifiers.Storage)
    59  	if err != nil {
    60  		return azblob.ContainerURL{}, fmt.Errorf("failed to refresh service principal token, %w", err)
    61  	}
    62  
    63  	tokenCredential := azblob.NewTokenCredential(token.AccessToken, nil)
    64  	u, err := url.Parse(bucketURL)
    65  	if err != nil {
    66  		return azblob.ContainerURL{}, fmt.Errorf("failed to parse container url, %w", err)
    67  	}
    68  
    69  	return azblob.NewContainerURL(*u, azblob.NewPipeline(tokenCredential, azblob.PipelineOptions{})), nil
    70  }
    71  
    72  // UploadFileToBucket is yet to be implemented for this provider
    73  func (b *AKSBucketProvider) UploadFileToBucket(r io.Reader, outputName string, bucketURL string) (string, error) {
    74  
    75  	containerURL, err := getContainerURL(bucketURL)
    76  
    77  	if err != nil {
    78  		return "", fmt.Errorf("failed to initialize containerURL, %w", err)
    79  	}
    80  
    81  	blobURL := containerURL.NewBlockBlobURL(outputName)
    82  
    83  	ctx, _ := context.WithTimeout(context.Background(), defaultBucketWriteTimeout)
    84  	_, err = azblob.UploadStreamToBlockBlob(ctx, r, blobURL, azblob.UploadStreamToBlockBlobOptions{})
    85  
    86  	return blobURL.String(), nil
    87  }
    88  
    89  // DownloadFileFromBucket is yet to be implemented for this provider
    90  func (b *AKSBucketProvider) DownloadFileFromBucket(_ string) (io.ReadCloser, error) {
    91  	return nil, nil
    92  }
    93  
    94  // NewAKSBucketProvider create a new provider for AKS
    95  func NewAKSBucketProvider(requirements *config.RequirementsConfig) buckets.Provider {
    96  	return &AKSBucketProvider{
    97  		Requirements: requirements,
    98  	}
    99  }