github.com/bitrise-io/go-steputils/v2@v2.0.0-alpha.30/cache/network/upload.go (about) 1 package network 2 3 import ( 4 "fmt" 5 "path/filepath" 6 "strings" 7 8 "github.com/bitrise-io/go-utils/v2/log" 9 "github.com/bitrise-io/go-utils/v2/retryhttp" 10 ) 11 12 // UploadParams ... 13 type UploadParams struct { 14 APIBaseURL string 15 Token string 16 ArchivePath string 17 ArchiveSize int64 18 CacheKey string 19 } 20 21 // Upload a cache archive and associate it with the provided cache key 22 func Upload(params UploadParams, logger log.Logger) error { 23 validatedKey, err := validateKey(params.CacheKey, logger) 24 if err != nil { 25 return err 26 } 27 28 client := newAPIClient(retryhttp.NewClient(logger), params.APIBaseURL, params.Token, logger) 29 30 logger.Debugf("Get upload URL") 31 prepareUploadRequest := prepareUploadRequest{ 32 CacheKey: validatedKey, 33 ArchiveFileName: filepath.Base(params.ArchivePath), 34 ArchiveContentType: "application/zstd", 35 ArchiveSizeInBytes: params.ArchiveSize, 36 } 37 resp, err := client.prepareUpload(prepareUploadRequest) 38 if err != nil { 39 return fmt.Errorf("failed to get upload URL: %w", err) 40 } 41 logger.Debugf("Upload ID: %s", resp.ID) 42 43 logger.Debugf("") 44 logger.Debugf("Upload archive") 45 err = client.uploadArchive(params.ArchivePath, resp.UploadMethod, resp.UploadURL, resp.UploadHeaders) 46 if err != nil { 47 return fmt.Errorf("failed to upload archive: %w", err) 48 } 49 50 logger.Debugf("") 51 logger.Debugf("Acknowledge upload") 52 response, err := client.acknowledgeUpload(resp.ID) 53 if err != nil { 54 return fmt.Errorf("failed to finalize upload: %w", err) 55 } 56 57 logger.Debugf("Upload acknowledged") 58 logResponseMessage(response, logger) 59 60 return nil 61 } 62 63 func validateKey(key string, logger log.Logger) (string, error) { 64 if strings.Contains(key, ",") { 65 return "", fmt.Errorf("commas are not allowed in key") 66 } 67 68 if len(key) > maxKeyLength { 69 logger.Warnf("Key is too long, truncating it to the first %d characters", maxKeyLength) 70 return key[:maxKeyLength], nil 71 } 72 return key, nil 73 } 74 75 func logResponseMessage(response acknowledgeResponse, logger log.Logger) { 76 if response.Message == "" || response.Severity == "" { 77 return 78 } 79 80 var loggerFn func(format string, v ...interface{}) 81 switch response.Severity { 82 case "debug": 83 loggerFn = logger.Debugf 84 case "info": 85 loggerFn = logger.Infof 86 case "warning": 87 loggerFn = logger.Warnf 88 case "error": 89 loggerFn = logger.Errorf 90 default: 91 loggerFn = logger.Printf 92 } 93 94 loggerFn("\n") 95 loggerFn(response.Message) 96 loggerFn("\n") 97 }