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  }