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 }