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 }