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  }