github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/actor/v7action/package.go (about) 1 package v7action 2 3 import ( 4 "code.cloudfoundry.org/cli/resources" 5 "io" 6 "time" 7 8 "code.cloudfoundry.org/cli/actor/actionerror" 9 "code.cloudfoundry.org/cli/actor/sharedaction" 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 11 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 12 log "github.com/sirupsen/logrus" 13 ) 14 15 const ( 16 DefaultFolderPermissions = 0755 17 DefaultArchiveFilePermissions = 0744 18 ) 19 20 type Package resources.Package 21 22 type DockerImageCredentials struct { 23 Path string 24 Username string 25 Password string 26 } 27 28 func (actor Actor) CreateDockerPackageByApplication(appGUID string, dockerImageCredentials DockerImageCredentials) (Package, Warnings, error) { 29 inputPackage := resources.Package{ 30 Type: constant.PackageTypeDocker, 31 Relationships: resources.Relationships{ 32 constant.RelationshipTypeApplication: resources.Relationship{GUID: appGUID}, 33 }, 34 DockerImage: dockerImageCredentials.Path, 35 DockerUsername: dockerImageCredentials.Username, 36 DockerPassword: dockerImageCredentials.Password, 37 } 38 pkg, warnings, err := actor.CloudControllerClient.CreatePackage(inputPackage) 39 return Package(pkg), Warnings(warnings), err 40 } 41 42 func (actor Actor) CreateDockerPackageByApplicationNameAndSpace(appName string, spaceGUID string, dockerImageCredentials DockerImageCredentials) (Package, Warnings, error) { 43 app, getWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID) 44 if err != nil { 45 return Package{}, getWarnings, err 46 } 47 pkg, warnings, err := actor.CreateDockerPackageByApplication(app.GUID, dockerImageCredentials) 48 return pkg, append(getWarnings, warnings...), err 49 } 50 51 // GetApplicationPackages returns a list of package of an app. 52 func (actor *Actor) GetApplicationPackages(appName string, spaceGUID string) ([]Package, Warnings, error) { 53 app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID) 54 if err != nil { 55 return nil, allWarnings, err 56 } 57 58 ccv3Packages, warnings, err := actor.CloudControllerClient.GetPackages( 59 ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{app.GUID}}, 60 ) 61 allWarnings = append(allWarnings, warnings...) 62 if err != nil { 63 return nil, allWarnings, err 64 } 65 66 var packages []Package 67 for _, ccv3Package := range ccv3Packages { 68 packages = append(packages, Package(ccv3Package)) 69 } 70 71 return packages, allWarnings, nil 72 } 73 74 func (actor Actor) CreateBitsPackageByApplication(appGUID string) (Package, Warnings, error) { 75 inputPackage := resources.Package{ 76 Type: constant.PackageTypeBits, 77 Relationships: resources.Relationships{ 78 constant.RelationshipTypeApplication: resources.Relationship{GUID: appGUID}, 79 }, 80 } 81 82 pkg, warnings, err := actor.CloudControllerClient.CreatePackage(inputPackage) 83 if err != nil { 84 return Package{}, Warnings(warnings), err 85 } 86 87 return Package(pkg), Warnings(warnings), err 88 } 89 90 func (actor Actor) UploadBitsPackage(pkg Package, matchedResources []sharedaction.V3Resource, newResources io.Reader, newResourcesLength int64) (Package, Warnings, error) { 91 apiResources := make([]ccv3.Resource, 0, len(matchedResources)) // Explicitly done to prevent nils 92 93 for _, resource := range matchedResources { 94 apiResources = append(apiResources, ccv3.Resource(resource)) 95 } 96 97 appPkg, warnings, err := actor.CloudControllerClient.UploadBitsPackage(resources.Package(pkg), apiResources, newResources, newResourcesLength) 98 return Package(appPkg), Warnings(warnings), err 99 } 100 101 // PollPackage returns a package of an app. 102 func (actor Actor) PollPackage(pkg Package) (Package, Warnings, error) { 103 var allWarnings Warnings 104 105 for pkg.State != constant.PackageReady && pkg.State != constant.PackageFailed && pkg.State != constant.PackageExpired { 106 time.Sleep(actor.Config.PollingInterval()) 107 ccPkg, warnings, err := actor.CloudControllerClient.GetPackage(pkg.GUID) 108 log.WithFields(log.Fields{ 109 "package_guid": pkg.GUID, 110 "state": pkg.State, 111 }).Debug("polling package state") 112 113 allWarnings = append(allWarnings, warnings...) 114 if err != nil { 115 return Package{}, allWarnings, err 116 } 117 118 pkg = Package(ccPkg) 119 } 120 121 if pkg.State == constant.PackageFailed { 122 return Package{}, allWarnings, actionerror.PackageProcessingFailedError{} 123 } else if pkg.State == constant.PackageExpired { 124 return Package{}, allWarnings, actionerror.PackageProcessingExpiredError{} 125 } 126 127 return pkg, allWarnings, nil 128 }