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