github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/actor/v7pushaction/create_bits_package_for_application.go (about)

     1  package v7pushaction
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/actionerror"
     5  	"code.cloudfoundry.org/cli/actor/sharedaction"
     6  	"code.cloudfoundry.org/cli/actor/v7action"
     7  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
     8  	log "github.com/sirupsen/logrus"
     9  	"os"
    10  )
    11  
    12  const PushRetries = 3
    13  
    14  func (actor Actor) CreateBitsPackageForApplication(pushPlan PushPlan, eventStream chan<- Event, progressBar ProgressBar) (PushPlan, Warnings, error) {
    15  	if !pushPlan.DockerImageCredentialsNeedsUpdate {
    16  		pkg, warnings, err := actor.CreateAndUploadApplicationBits(pushPlan, progressBar, eventStream)
    17  		if err != nil {
    18  			return pushPlan, warnings, err
    19  		}
    20  
    21  		polledPackage, pollWarnings, err := actor.V7Actor.PollPackage(pkg)
    22  
    23  		pushPlan.PackageGUID = polledPackage.GUID
    24  
    25  		return pushPlan, append(warnings, pollWarnings...), err
    26  	}
    27  
    28  	return pushPlan, nil, nil
    29  }
    30  
    31  func (actor Actor) CreateAndUploadApplicationBits(plan PushPlan, progressBar ProgressBar, eventStream chan<- Event) (v7action.Package, Warnings, error) {
    32  	log.WithField("Path", plan.BitsPath).Info("creating archive")
    33  	var allWarnings Warnings
    34  
    35  	eventStream <- ResourceMatching
    36  	matchedResources, unmatchedResources, warnings, err := actor.MatchResources(plan.AllResources)
    37  	allWarnings = append(allWarnings, warnings...)
    38  	if err != nil {
    39  		return v7action.Package{}, allWarnings, err
    40  	}
    41  
    42  	eventStream <- CreatingPackage
    43  	log.WithField("GUID", plan.Application.GUID).Info("creating package")
    44  	pkg, createPackageWarnings, err := actor.V7Actor.CreateBitsPackageByApplication(plan.Application.GUID)
    45  	allWarnings = append(allWarnings, createPackageWarnings...)
    46  	if err != nil {
    47  		return v7action.Package{}, allWarnings, err
    48  	}
    49  
    50  	if len(unmatchedResources) > 0 {
    51  		eventStream <- CreatingArchive
    52  		archivePath, archiveErr := actor.CreateAndReturnArchivePath(plan, unmatchedResources)
    53  		if archiveErr != nil {
    54  			return v7action.Package{}, allWarnings, archiveErr
    55  		}
    56  		defer os.RemoveAll(archivePath)
    57  
    58  		// Uploading package/app bits
    59  		for count := 0; count < PushRetries; count++ {
    60  			eventStream <- ReadingArchive
    61  			log.WithField("GUID", plan.Application.GUID).Info("reading archive")
    62  			file, size, readErr := actor.SharedActor.ReadArchive(archivePath)
    63  			if readErr != nil {
    64  				return v7action.Package{}, allWarnings, readErr
    65  			}
    66  			defer file.Close()
    67  
    68  			eventStream <- UploadingApplicationWithArchive
    69  			progressReader := progressBar.NewProgressBarWrapper(file, size)
    70  			var uploadWarnings v7action.Warnings
    71  			pkg, uploadWarnings, err = actor.V7Actor.UploadBitsPackage(pkg, matchedResources, progressReader, size)
    72  			allWarnings = append(allWarnings, uploadWarnings...)
    73  
    74  			if _, ok := err.(ccerror.PipeSeekError); ok {
    75  				eventStream <- RetryUpload
    76  				continue
    77  			}
    78  			break
    79  		}
    80  
    81  		if err != nil {
    82  			if e, ok := err.(ccerror.PipeSeekError); ok {
    83  				return v7action.Package{}, allWarnings, actionerror.UploadFailedError{Err: e.Err}
    84  			}
    85  			return v7action.Package{}, allWarnings, err
    86  		}
    87  
    88  		eventStream <- UploadWithArchiveComplete
    89  	} else {
    90  		eventStream <- UploadingApplication
    91  		var uploadWarnings v7action.Warnings
    92  		pkg, uploadWarnings, err = actor.V7Actor.UploadBitsPackage(pkg, matchedResources, nil, 0)
    93  		allWarnings = append(allWarnings, uploadWarnings...)
    94  		if err != nil {
    95  			return v7action.Package{}, allWarnings, err
    96  		}
    97  	}
    98  	return pkg, allWarnings, nil
    99  }
   100  
   101  func (actor Actor) CreateAndReturnArchivePath(plan PushPlan, unmatchedResources []sharedaction.V3Resource) (string, error) {
   102  	// translate between v3 and v2 resources
   103  	var v2Resources []sharedaction.Resource
   104  	for _, resource := range unmatchedResources {
   105  		v2Resources = append(v2Resources, resource.ToV2Resource())
   106  	}
   107  
   108  	if plan.Archive {
   109  		return actor.SharedActor.ZipArchiveResources(plan.BitsPath, v2Resources)
   110  	}
   111  	return actor.SharedActor.ZipDirectoryResources(plan.BitsPath, v2Resources)
   112  }