github.com/sleungcy/cli@v7.1.0+incompatible/api/cloudcontroller/ccv3/buildpack.go (about) 1 package ccv3 2 3 import ( 4 "encoding/json" 5 "io" 6 7 "code.cloudfoundry.org/cli/api/cloudcontroller" 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/internal" 9 "code.cloudfoundry.org/cli/api/cloudcontroller/uploads" 10 "code.cloudfoundry.org/cli/resources" 11 "code.cloudfoundry.org/cli/types" 12 ) 13 14 // Buildpack represents a Cloud Controller V3 buildpack. 15 type Buildpack struct { 16 // Enabled is true when the buildpack can be used for staging. 17 Enabled types.NullBool 18 // Filename is the uploaded filename of the buildpack. 19 Filename string 20 // GUID is the unique identifier for the buildpack. 21 GUID string 22 // Locked is true when the buildpack cannot be updated. 23 Locked types.NullBool 24 // Name is the name of the buildpack. To be used by app buildpack field. 25 // (only alphanumeric characters) 26 Name string 27 // Position is the order in which the buildpacks are checked during buildpack 28 // auto-detection. 29 Position types.NullInt 30 // Stack is the name of the stack that the buildpack will use. 31 Stack string 32 // State is the current state of the buildpack. 33 State string 34 // Links are links to related resources. 35 Links APILinks 36 // resources.Metadata is used for custom tagging of API resources 37 Metadata *resources.Metadata 38 } 39 40 // MarshalJSON converts a Package into a Cloud Controller Package. 41 func (buildpack Buildpack) MarshalJSON() ([]byte, error) { 42 ccBuildpack := struct { 43 Name string `json:"name,omitempty"` 44 Stack string `json:"stack,omitempty"` 45 Position *int `json:"position,omitempty"` 46 Enabled *bool `json:"enabled,omitempty"` 47 Locked *bool `json:"locked,omitempty"` 48 Metadata *resources.Metadata `json:"metadata,omitempty"` 49 }{ 50 Name: buildpack.Name, 51 Stack: buildpack.Stack, 52 } 53 54 if buildpack.Position.IsSet { 55 ccBuildpack.Position = &buildpack.Position.Value 56 } 57 if buildpack.Enabled.IsSet { 58 ccBuildpack.Enabled = &buildpack.Enabled.Value 59 } 60 if buildpack.Locked.IsSet { 61 ccBuildpack.Locked = &buildpack.Locked.Value 62 } 63 64 return json.Marshal(ccBuildpack) 65 } 66 67 func (buildpack *Buildpack) UnmarshalJSON(data []byte) error { 68 var ccBuildpack struct { 69 GUID string `json:"guid,omitempty"` 70 Links APILinks `json:"links,omitempty"` 71 Name string `json:"name,omitempty"` 72 Filename string `json:"filename,omitempty"` 73 Stack string `json:"stack,omitempty"` 74 State string `json:"state,omitempty"` 75 Enabled types.NullBool `json:"enabled"` 76 Locked types.NullBool `json:"locked"` 77 Position types.NullInt `json:"position"` 78 Metadata *resources.Metadata `json:"metadata"` 79 } 80 81 err := cloudcontroller.DecodeJSON(data, &ccBuildpack) 82 if err != nil { 83 return err 84 } 85 86 buildpack.Enabled = ccBuildpack.Enabled 87 buildpack.Filename = ccBuildpack.Filename 88 buildpack.GUID = ccBuildpack.GUID 89 buildpack.Locked = ccBuildpack.Locked 90 buildpack.Name = ccBuildpack.Name 91 buildpack.Position = ccBuildpack.Position 92 buildpack.Stack = ccBuildpack.Stack 93 buildpack.State = ccBuildpack.State 94 buildpack.Links = ccBuildpack.Links 95 buildpack.Metadata = ccBuildpack.Metadata 96 97 return nil 98 } 99 100 // CreateBuildpack creates a buildpack with the given settings, Type and the 101 // ApplicationRelationship must be set. 102 func (client *Client) CreateBuildpack(bp Buildpack) (Buildpack, Warnings, error) { 103 var responseBody Buildpack 104 105 _, warnings, err := client.MakeRequest(RequestParams{ 106 RequestName: internal.PostBuildpackRequest, 107 RequestBody: bp, 108 ResponseBody: &responseBody, 109 }) 110 111 return responseBody, warnings, err 112 } 113 114 // DeleteBuildpack deletes the buildpack with the provided guid. 115 func (client Client) DeleteBuildpack(buildpackGUID string) (JobURL, Warnings, error) { 116 jobURL, warnings, err := client.MakeRequest(RequestParams{ 117 RequestName: internal.DeleteBuildpackRequest, 118 URIParams: internal.Params{"buildpack_guid": buildpackGUID}, 119 }) 120 121 return jobURL, warnings, err 122 } 123 124 // GetBuildpacks lists buildpacks with optional filters. 125 func (client *Client) GetBuildpacks(query ...Query) ([]Buildpack, Warnings, error) { 126 var resources []Buildpack 127 128 _, warnings, err := client.MakeListRequest(RequestParams{ 129 RequestName: internal.GetBuildpacksRequest, 130 Query: query, 131 ResponseBody: Buildpack{}, 132 AppendToList: func(item interface{}) error { 133 resources = append(resources, item.(Buildpack)) 134 return nil 135 }, 136 }) 137 138 return resources, warnings, err 139 } 140 141 func (client Client) UpdateBuildpack(buildpack Buildpack) (Buildpack, Warnings, error) { 142 var responseBody Buildpack 143 144 _, warnings, err := client.MakeRequest(RequestParams{ 145 RequestName: internal.PatchBuildpackRequest, 146 URIParams: internal.Params{"buildpack_guid": buildpack.GUID}, 147 RequestBody: buildpack, 148 ResponseBody: &responseBody, 149 }) 150 151 return responseBody, warnings, err 152 } 153 154 // UploadBuildpack uploads the contents of a buildpack zip to the server. 155 func (client *Client) UploadBuildpack(buildpackGUID string, buildpackPath string, buildpack io.Reader, buildpackLength int64) (JobURL, Warnings, error) { 156 157 contentLength, err := uploads.CalculateRequestSize(buildpackLength, buildpackPath, "bits") 158 if err != nil { 159 return "", nil, err 160 } 161 162 contentType, body, writeErrors := uploads.CreateMultipartBodyAndHeader(buildpack, buildpackPath, "bits") 163 164 responseLocation, warnings, err := client.MakeRequestUploadAsync( 165 internal.PostBuildpackBitsRequest, 166 internal.Params{"buildpack_guid": buildpackGUID}, 167 contentType, 168 body, 169 contentLength, 170 nil, 171 writeErrors, 172 ) 173 174 return JobURL(responseLocation), warnings, err 175 }