github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/actor/v7action/package.go (about) 1 package v7action 2 3 import ( 4 "io" 5 "os" 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 ccv3.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 := ccv3.Package{ 30 Type: constant.PackageTypeDocker, 31 Relationships: ccv3.Relationships{ 32 constant.RelationshipTypeApplication: ccv3.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 func (actor Actor) CreateAndUploadBitsPackageByApplicationNameAndSpace(appName string, spaceGUID string, bitsPath string) (Package, Warnings, error) { 52 app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID) 53 if err != nil { 54 return Package{}, allWarnings, err 55 } 56 57 if bitsPath == "" { 58 bitsPath, err = os.Getwd() 59 if err != nil { 60 return Package{}, allWarnings, err 61 } 62 } 63 64 info, err := os.Stat(bitsPath) 65 if err != nil { 66 return Package{}, allWarnings, err 67 } 68 69 var resources []sharedaction.Resource 70 if info.IsDir() { 71 resources, err = actor.SharedActor.GatherDirectoryResources(bitsPath) 72 } else { 73 resources, err = actor.SharedActor.GatherArchiveResources(bitsPath) 74 } 75 if err != nil { 76 return Package{}, allWarnings, err 77 } 78 79 // potentially match resources here in the future 80 81 var archivePath string 82 if info.IsDir() { 83 archivePath, err = actor.SharedActor.ZipDirectoryResources(bitsPath, resources) 84 } else { 85 archivePath, err = actor.SharedActor.ZipArchiveResources(bitsPath, resources) 86 } 87 if err != nil { 88 os.RemoveAll(archivePath) 89 return Package{}, allWarnings, err 90 } 91 defer os.RemoveAll(archivePath) 92 93 inputPackage := ccv3.Package{ 94 Type: constant.PackageTypeBits, 95 Relationships: ccv3.Relationships{ 96 constant.RelationshipTypeApplication: ccv3.Relationship{GUID: app.GUID}, 97 }, 98 } 99 100 pkg, warnings, err := actor.CloudControllerClient.CreatePackage(inputPackage) 101 allWarnings = append(allWarnings, warnings...) 102 if err != nil { 103 return Package{}, allWarnings, err 104 } 105 106 _, warnings, err = actor.CloudControllerClient.UploadPackage(pkg, archivePath) 107 allWarnings = append(allWarnings, warnings...) 108 if err != nil { 109 return Package{}, allWarnings, err 110 } 111 112 for pkg.State != constant.PackageReady && 113 pkg.State != constant.PackageFailed && 114 pkg.State != constant.PackageExpired { 115 time.Sleep(actor.Config.PollingInterval()) 116 pkg, warnings, err = actor.CloudControllerClient.GetPackage(pkg.GUID) 117 allWarnings = append(allWarnings, warnings...) 118 if err != nil { 119 return Package{}, allWarnings, err 120 } 121 } 122 123 if pkg.State == constant.PackageFailed { 124 return Package{}, allWarnings, actionerror.PackageProcessingFailedError{} 125 } else if pkg.State == constant.PackageExpired { 126 return Package{}, allWarnings, actionerror.PackageProcessingExpiredError{} 127 } 128 129 updatedPackage, updatedWarnings, err := actor.PollPackage(Package(pkg)) 130 return updatedPackage, append(allWarnings, updatedWarnings...), err 131 } 132 133 func (actor Actor) GetNewestReadyPackageForApplication(appGUID string) (Package, Warnings, error) { 134 ccv3Packages, warnings, err := actor.CloudControllerClient.GetPackages( 135 ccv3.Query{ 136 Key: ccv3.AppGUIDFilter, 137 Values: []string{appGUID}, 138 }, 139 ccv3.Query{ 140 Key: ccv3.StatesFilter, 141 Values: []string{string(constant.PackageReady)}, 142 }, 143 ccv3.Query{ 144 Key: ccv3.OrderBy, 145 Values: []string{ccv3.CreatedAtDescendingOrder}, 146 }, 147 ) 148 149 if err != nil { 150 return Package{}, Warnings(warnings), err 151 } 152 153 if len(ccv3Packages) == 0 { 154 return Package{}, Warnings(warnings), actionerror.PackageNotFoundInAppError{} 155 } 156 157 return Package(ccv3Packages[0]), Warnings(warnings), nil 158 } 159 160 // GetApplicationPackages returns a list of package of an app. 161 func (actor *Actor) GetApplicationPackages(appName string, spaceGUID string) ([]Package, Warnings, error) { 162 app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID) 163 if err != nil { 164 return nil, allWarnings, err 165 } 166 167 ccv3Packages, warnings, err := actor.CloudControllerClient.GetPackages( 168 ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{app.GUID}}, 169 ) 170 allWarnings = append(allWarnings, warnings...) 171 if err != nil { 172 return nil, allWarnings, err 173 } 174 175 var packages []Package 176 for _, ccv3Package := range ccv3Packages { 177 packages = append(packages, Package(ccv3Package)) 178 } 179 180 return packages, allWarnings, nil 181 } 182 183 func (actor Actor) CreateBitsPackageByApplication(appGUID string) (Package, Warnings, error) { 184 inputPackage := ccv3.Package{ 185 Type: constant.PackageTypeBits, 186 Relationships: ccv3.Relationships{ 187 constant.RelationshipTypeApplication: ccv3.Relationship{GUID: appGUID}, 188 }, 189 } 190 191 pkg, warnings, err := actor.CloudControllerClient.CreatePackage(inputPackage) 192 if err != nil { 193 return Package{}, Warnings(warnings), err 194 } 195 196 return Package(pkg), Warnings(warnings), err 197 } 198 199 func (actor Actor) UploadBitsPackage(pkg Package, matchedResources []sharedaction.V3Resource, newResources io.Reader, newResourcesLength int64) (Package, Warnings, error) { 200 apiResources := make([]ccv3.Resource, 0, len(matchedResources)) // Explicitly done to prevent nils 201 202 for _, resource := range matchedResources { 203 apiResources = append(apiResources, ccv3.Resource(resource)) 204 } 205 206 appPkg, warnings, err := actor.CloudControllerClient.UploadBitsPackage(ccv3.Package(pkg), apiResources, newResources, newResourcesLength) 207 return Package(appPkg), Warnings(warnings), err 208 } 209 210 // PollPackage returns a package of an app. 211 func (actor Actor) PollPackage(pkg Package) (Package, Warnings, error) { 212 var allWarnings Warnings 213 214 for pkg.State != constant.PackageReady && pkg.State != constant.PackageFailed && pkg.State != constant.PackageExpired { 215 time.Sleep(actor.Config.PollingInterval()) 216 ccPkg, warnings, err := actor.CloudControllerClient.GetPackage(pkg.GUID) 217 log.WithFields(log.Fields{ 218 "package_guid": pkg.GUID, 219 "state": pkg.State, 220 }).Debug("polling package state") 221 222 allWarnings = append(allWarnings, warnings...) 223 if err != nil { 224 return Package{}, allWarnings, err 225 } 226 227 pkg = Package(ccPkg) 228 } 229 230 if pkg.State == constant.PackageFailed { 231 return Package{}, allWarnings, actionerror.PackageProcessingFailedError{} 232 } else if pkg.State == constant.PackageExpired { 233 return Package{}, allWarnings, actionerror.PackageProcessingExpiredError{} 234 } 235 236 return pkg, allWarnings, nil 237 }