github.com/pivotal-cf/go-pivnet/v6@v6.0.2/artifact_references.go (about) 1 package pivnet 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "net/http" 8 ) 9 10 type ArtifactReferencesService struct { 11 client Client 12 } 13 14 type CreateArtifactReferenceConfig struct { 15 ProductSlug string 16 Description string 17 DocsURL string 18 Digest string 19 Name string 20 ArtifactPath string 21 SystemRequirements []string 22 } 23 24 type ArtifactReferencesResponse struct { 25 ArtifactReferences []ArtifactReference `json:"artifact_references,omitempty"` 26 } 27 28 type ArtifactReferenceResponse struct { 29 ArtifactReference ArtifactReference `json:"artifact_reference,omitempty"` 30 } 31 32 type ReplicationStatus string 33 34 const ( 35 InProgress ReplicationStatus = "in_progress" 36 Complete ReplicationStatus = "complete" 37 FailedToReplicate ReplicationStatus = "failed_to_replicate" 38 ) 39 40 type ArtifactReference struct { 41 ID int `json:"id,omitempty" yaml:"id,omitempty"` 42 ArtifactPath string `json:"artifact_path,omitempty" yaml:"artifact_path,omitempty"` 43 Description string `json:"description,omitempty" yaml:"description,omitempty"` 44 Digest string `json:"digest,omitempty" yaml:"digest,omitempty"` 45 DocsURL string `json:"docs_url,omitempty" yaml:"docs_url,omitempty"` 46 Name string `json:"name,omitempty" yaml:"name,omitempty"` 47 SystemRequirements []string `json:"system_requirements,omitempty" yaml:"system_requirements,omitempty"` 48 ReleaseVersions []string `json:"release_versions,omitempty" yaml:"release_versions,omitempty"` 49 ReplicationStatus ReplicationStatus `json:"replication_status,omitempty" yaml:"replication_status,omitempty"` 50 } 51 52 type createUpdateArtifactReferenceBody struct { 53 ArtifactReference ArtifactReference `json:"artifact_reference"` 54 } 55 56 func (p ArtifactReferencesService) List(productSlug string) ([]ArtifactReference, error) { 57 url := fmt.Sprintf("/products/%s/artifact_references", productSlug) 58 59 var response ArtifactReferencesResponse 60 resp, err := p.client.MakeRequest( 61 "GET", 62 url, 63 http.StatusOK, 64 nil, 65 ) 66 if err != nil { 67 return []ArtifactReference{}, err 68 } 69 defer resp.Body.Close() 70 71 err = json.NewDecoder(resp.Body).Decode(&response) 72 if err != nil { 73 return []ArtifactReference{}, err 74 } 75 76 return response.ArtifactReferences, nil 77 } 78 79 func (p ArtifactReferencesService) ListForDigest(productSlug string, digest string) ([]ArtifactReference, error) { 80 url := fmt.Sprintf("/products/%s/artifact_references", productSlug) 81 params := []QueryParameter{ 82 {"digest", digest}, 83 } 84 85 var response ArtifactReferencesResponse 86 resp, err := p.client.MakeRequestWithParams( 87 "GET", 88 url, 89 http.StatusOK, 90 params, 91 nil, 92 ) 93 if err != nil { 94 return []ArtifactReference{}, err 95 } 96 defer resp.Body.Close() 97 98 err = json.NewDecoder(resp.Body).Decode(&response) 99 if err != nil { 100 return []ArtifactReference{}, err 101 } 102 103 return response.ArtifactReferences, nil 104 } 105 106 func (p ArtifactReferencesService) ListForRelease(productSlug string, releaseID int) ([]ArtifactReference, error) { 107 url := fmt.Sprintf( 108 "/products/%s/releases/%d/artifact_references", 109 productSlug, 110 releaseID, 111 ) 112 113 var response ArtifactReferencesResponse 114 resp, err := p.client.MakeRequest( 115 "GET", 116 url, 117 http.StatusOK, 118 nil, 119 ) 120 if err != nil { 121 return []ArtifactReference{}, err 122 } 123 defer resp.Body.Close() 124 125 err = json.NewDecoder(resp.Body).Decode(&response) 126 if err != nil { 127 return []ArtifactReference{}, err 128 } 129 130 return response.ArtifactReferences, nil 131 } 132 133 func (p ArtifactReferencesService) Get(productSlug string, artifactReferenceID int) (ArtifactReference, error) { 134 url := fmt.Sprintf( 135 "/products/%s/artifact_references/%d", 136 productSlug, 137 artifactReferenceID, 138 ) 139 140 var response ArtifactReferenceResponse 141 resp, err := p.client.MakeRequest( 142 "GET", 143 url, 144 http.StatusOK, 145 nil, 146 ) 147 if err != nil { 148 return ArtifactReference{}, err 149 } 150 defer resp.Body.Close() 151 152 err = json.NewDecoder(resp.Body).Decode(&response) 153 if err != nil { 154 return ArtifactReference{}, err 155 } 156 157 return response.ArtifactReference, nil 158 } 159 160 func (p ArtifactReferencesService) Update(productSlug string, artifactReference ArtifactReference) (ArtifactReference, error) { 161 url := fmt.Sprintf("/products/%s/artifact_references/%d", productSlug, artifactReference.ID) 162 163 body := createUpdateArtifactReferenceBody{ 164 ArtifactReference: ArtifactReference{ 165 Description: artifactReference.Description, 166 Name: artifactReference.Name, 167 DocsURL: artifactReference.DocsURL, 168 SystemRequirements: artifactReference.SystemRequirements, 169 }, 170 } 171 172 b, err := json.Marshal(body) 173 if err != nil { 174 return ArtifactReference{}, err 175 } 176 177 var response ArtifactReferenceResponse 178 resp, err := p.client.MakeRequest( 179 "PATCH", 180 url, 181 http.StatusOK, 182 bytes.NewReader(b), 183 ) 184 if err != nil { 185 return ArtifactReference{}, err 186 } 187 defer resp.Body.Close() 188 189 err = json.NewDecoder(resp.Body).Decode(&response) 190 if err != nil { 191 return ArtifactReference{}, err 192 } 193 194 return response.ArtifactReference, nil 195 } 196 197 func (p ArtifactReferencesService) GetForRelease(productSlug string, releaseID int, artifactReferenceID int) (ArtifactReference, error) { 198 url := fmt.Sprintf( 199 "/products/%s/releases/%d/artifact_references/%d", 200 productSlug, 201 releaseID, 202 artifactReferenceID, 203 ) 204 205 var response ArtifactReferenceResponse 206 resp, err := p.client.MakeRequest( 207 "GET", 208 url, 209 http.StatusOK, 210 nil, 211 ) 212 if err != nil { 213 return ArtifactReference{}, err 214 } 215 defer resp.Body.Close() 216 217 err = json.NewDecoder(resp.Body).Decode(&response) 218 if err != nil { 219 return ArtifactReference{}, err 220 } 221 222 return response.ArtifactReference, nil 223 } 224 225 func (p ArtifactReferencesService) Create(config CreateArtifactReferenceConfig) (ArtifactReference, error) { 226 url := fmt.Sprintf("/products/%s/artifact_references", config.ProductSlug) 227 228 body := createUpdateArtifactReferenceBody{ 229 ArtifactReference: ArtifactReference{ 230 ArtifactPath: config.ArtifactPath, 231 Description: config.Description, 232 Digest: config.Digest, 233 DocsURL: config.DocsURL, 234 Name: config.Name, 235 SystemRequirements: config.SystemRequirements, 236 }, 237 } 238 239 b, err := json.Marshal(body) 240 if err != nil { 241 // Untested as we cannot force an error because we are marshalling 242 // a known-good body 243 return ArtifactReference{}, err 244 } 245 246 var response ArtifactReferenceResponse 247 resp, err := p.client.MakeRequest( 248 "POST", 249 url, 250 http.StatusCreated, 251 bytes.NewReader(b), 252 ) 253 if err != nil { 254 _, ok := err.(ErrTooManyRequests) 255 if ok { 256 return ArtifactReference{}, fmt.Errorf("You have hit the artifact reference creation limit. Please wait before creating more artifact references. Contact pivnet-eng@pivotal.io with additional questions.") 257 } else { 258 return ArtifactReference{}, err 259 } 260 } 261 defer resp.Body.Close() 262 263 err = json.NewDecoder(resp.Body).Decode(&response) 264 if err != nil { 265 return ArtifactReference{}, err 266 } 267 268 return response.ArtifactReference, nil 269 } 270 271 func (p ArtifactReferencesService) Delete(productSlug string, id int) (ArtifactReference, error) { 272 url := fmt.Sprintf( 273 "/products/%s/artifact_references/%d", 274 productSlug, 275 id, 276 ) 277 278 var response ArtifactReferenceResponse 279 resp, err := p.client.MakeRequest( 280 "DELETE", 281 url, 282 http.StatusOK, 283 nil, 284 ) 285 if err != nil { 286 return ArtifactReference{}, err 287 } 288 defer resp.Body.Close() 289 290 err = json.NewDecoder(resp.Body).Decode(&response) 291 if err != nil { 292 return ArtifactReference{}, err 293 } 294 295 return response.ArtifactReference, nil 296 } 297 298 func (p ArtifactReferencesService) AddToRelease( 299 productSlug string, 300 releaseID int, 301 artifactReferenceID int, 302 ) error { 303 url := fmt.Sprintf( 304 "/products/%s/releases/%d/add_artifact_reference", 305 productSlug, 306 releaseID, 307 ) 308 309 body := createUpdateArtifactReferenceBody{ 310 ArtifactReference: ArtifactReference{ 311 ID: artifactReferenceID, 312 }, 313 } 314 315 b, err := json.Marshal(body) 316 if err != nil { 317 // Untested as we cannot force an error because we are marshalling 318 // a known-good body 319 return err 320 } 321 322 resp, err := p.client.MakeRequest( 323 "PATCH", 324 url, 325 http.StatusNoContent, 326 bytes.NewReader(b), 327 ) 328 if err != nil { 329 return err 330 } 331 defer resp.Body.Close() 332 333 return nil 334 } 335 336 func (p ArtifactReferencesService) RemoveFromRelease( 337 productSlug string, 338 releaseID int, 339 artifactReferenceID int, 340 ) error { 341 url := fmt.Sprintf( 342 "/products/%s/releases/%d/remove_artifact_reference", 343 productSlug, 344 releaseID, 345 ) 346 347 body := createUpdateArtifactReferenceBody{ 348 ArtifactReference: ArtifactReference{ 349 ID: artifactReferenceID, 350 }, 351 } 352 353 b, err := json.Marshal(body) 354 if err != nil { 355 // Untested as we cannot force an error because we are marshalling 356 // a known-good body 357 return err 358 } 359 360 resp, err := p.client.MakeRequest( 361 "PATCH", 362 url, 363 http.StatusNoContent, 364 bytes.NewReader(b), 365 ) 366 if err != nil { 367 return err 368 } 369 defer resp.Body.Close() 370 371 return nil 372 }