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