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 }