github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/actor/v3action/package.go (about) 1 package v3action 2 3 import ( 4 "fmt" 5 "net/url" 6 "os" 7 "time" 8 9 "code.cloudfoundry.org/cli/actor/sharedaction" 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 11 ) 12 13 const ( 14 DefaultFolderPermissions = 0755 15 DefaultArchiveFilePermissions = 0744 16 ) 17 18 type PackageProcessingFailedError struct{} 19 20 func (PackageProcessingFailedError) Error() string { 21 return "Package failed to process correctly after upload" 22 } 23 24 type PackageProcessingExpiredError struct{} 25 26 func (PackageProcessingExpiredError) Error() string { 27 return "Package expired after upload" 28 } 29 30 type Package ccv3.Package 31 32 type EmptyDirectoryError struct { 33 Path string 34 } 35 36 func (e EmptyDirectoryError) Error() string { 37 return fmt.Sprint(e.Path, "is empty") 38 } 39 40 type DockerImageCredentials struct { 41 Path string 42 Username string 43 Password string 44 } 45 46 func (actor Actor) CreateDockerPackageByApplicationNameAndSpace(appName string, spaceGUID string, dockerImageCredentials DockerImageCredentials) (Package, Warnings, error) { 47 app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID) 48 if err != nil { 49 return Package{}, allWarnings, err 50 } 51 inputPackage := ccv3.Package{ 52 Type: ccv3.PackageTypeDocker, 53 Relationships: ccv3.Relationships{ 54 ccv3.ApplicationRelationship: ccv3.Relationship{GUID: app.GUID}, 55 }, 56 DockerImage: dockerImageCredentials.Path, 57 DockerUsername: dockerImageCredentials.Username, 58 DockerPassword: dockerImageCredentials.Password, 59 } 60 pkg, warnings, err := actor.CloudControllerClient.CreatePackage(inputPackage) 61 allWarnings = append(allWarnings, warnings...) 62 if err != nil { 63 return Package{}, allWarnings, err 64 } 65 return Package(pkg), allWarnings, err 66 } 67 68 func (actor Actor) CreateAndUploadBitsPackageByApplicationNameAndSpace(appName string, spaceGUID string, bitsPath string) (Package, Warnings, error) { 69 app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID) 70 if err != nil { 71 return Package{}, allWarnings, err 72 } 73 74 if bitsPath == "" { 75 bitsPath, err = os.Getwd() 76 if err != nil { 77 return Package{}, allWarnings, err 78 } 79 } 80 81 info, err := os.Stat(bitsPath) 82 if err != nil { 83 return Package{}, allWarnings, err 84 } 85 86 var resources []sharedaction.Resource 87 if info.IsDir() { 88 resources, err = actor.SharedActor.GatherDirectoryResources(bitsPath) 89 } else { 90 resources, err = actor.SharedActor.GatherArchiveResources(bitsPath) 91 } 92 if err != nil { 93 return Package{}, allWarnings, err 94 } 95 96 // potentially match resources here in the future 97 98 var archivePath string 99 if info.IsDir() { 100 archivePath, err = actor.SharedActor.ZipDirectoryResources(bitsPath, resources) 101 } else { 102 archivePath, err = actor.SharedActor.ZipArchiveResources(bitsPath, resources) 103 } 104 if err != nil { 105 return Package{}, allWarnings, err 106 } 107 108 inputPackage := ccv3.Package{ 109 Type: ccv3.PackageTypeBits, 110 Relationships: ccv3.Relationships{ 111 ccv3.ApplicationRelationship: ccv3.Relationship{GUID: app.GUID}, 112 }, 113 } 114 115 pkg, warnings, err := actor.CloudControllerClient.CreatePackage(inputPackage) 116 allWarnings = append(allWarnings, warnings...) 117 if err != nil { 118 return Package{}, allWarnings, err 119 } 120 121 _, warnings, err = actor.CloudControllerClient.UploadPackage(pkg, archivePath) 122 allWarnings = append(allWarnings, warnings...) 123 if err != nil { 124 return Package{}, allWarnings, err 125 } 126 127 for pkg.State != ccv3.PackageStateReady && 128 pkg.State != ccv3.PackageStateFailed && 129 pkg.State != ccv3.PackageStateExpired { 130 time.Sleep(actor.Config.PollingInterval()) 131 pkg, warnings, err = actor.CloudControllerClient.GetPackage(pkg.GUID) 132 allWarnings = append(allWarnings, warnings...) 133 if err != nil { 134 return Package{}, allWarnings, err 135 } 136 } 137 138 if pkg.State == ccv3.PackageStateFailed { 139 return Package{}, allWarnings, PackageProcessingFailedError{} 140 } else if pkg.State == ccv3.PackageStateExpired { 141 return Package{}, allWarnings, PackageProcessingExpiredError{} 142 } 143 144 return Package(pkg), allWarnings, err 145 } 146 147 // GetApplicationPackages returns a list of package of an app. 148 func (actor *Actor) GetApplicationPackages(appName string, spaceGUID string) ([]Package, Warnings, error) { 149 app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID) 150 if err != nil { 151 return nil, allWarnings, err 152 } 153 154 ccv3Packages, warnings, err := actor.CloudControllerClient.GetPackages(url.Values{ 155 ccv3.AppGUIDFilter: []string{app.GUID}, 156 }) 157 allWarnings = append(allWarnings, warnings...) 158 if err != nil { 159 return nil, allWarnings, err 160 } 161 162 var packages []Package 163 for _, ccv3Package := range ccv3Packages { 164 packages = append(packages, Package(ccv3Package)) 165 } 166 167 return packages, allWarnings, nil 168 }