github.com/pivotal-cf/go-pivnet/v6@v6.0.2/release_upgrade_paths.go (about)

     1  package pivnet
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"net/http"
     8  )
     9  
    10  type ReleaseUpgradePathsService struct {
    11  	client Client
    12  }
    13  
    14  type ReleaseUpgradePathsResponse struct {
    15  	ReleaseUpgradePaths []ReleaseUpgradePath `json:"upgrade_paths,omitempty"`
    16  }
    17  
    18  type ReleaseUpgradePath struct {
    19  	Release UpgradePathRelease `json:"release,omitempty" yaml:"release,omitempty"`
    20  }
    21  
    22  type UpgradePathRelease struct {
    23  	ID      int    `json:"id,omitempty" yaml:"id,omitempty"`
    24  	Version string `json:"version,omitempty" yaml:"version,omitempty"`
    25  }
    26  
    27  func (r ReleaseUpgradePathsService) Get(productSlug string, releaseID int) ([]ReleaseUpgradePath, error) {
    28  	url := fmt.Sprintf(
    29  		"/products/%s/releases/%d/upgrade_paths",
    30  		productSlug,
    31  		releaseID,
    32  	)
    33  
    34  	var response ReleaseUpgradePathsResponse
    35  	resp, err := r.client.MakeRequest(
    36  		"GET",
    37  		url,
    38  		http.StatusOK,
    39  		nil,
    40  	)
    41  	if err != nil {
    42  		return nil, err
    43  	}
    44  	defer resp.Body.Close()
    45  
    46  	err = json.NewDecoder(resp.Body).Decode(&response)
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  
    51  	return response.ReleaseUpgradePaths, nil
    52  }
    53  
    54  func (r ReleaseUpgradePathsService) Add(
    55  	productSlug string,
    56  	releaseID int,
    57  	previousReleaseID int,
    58  ) error {
    59  	url := fmt.Sprintf(
    60  		"/products/%s/releases/%d/add_upgrade_path",
    61  		productSlug,
    62  		releaseID,
    63  	)
    64  
    65  	body := addRemoveUpgradePathBody{
    66  		UpgradePath: addRemoveUpgradePathBodyUpgradePath{
    67  			ReleaseID: previousReleaseID,
    68  		},
    69  	}
    70  
    71  	b, err := json.Marshal(body)
    72  	if err != nil {
    73  		// Untested as we cannot force an error because we are marshalling
    74  		// a known-good body
    75  		return err
    76  	}
    77  
    78  	resp, err := r.client.MakeRequest(
    79  		"PATCH",
    80  		url,
    81  		http.StatusNoContent,
    82  		bytes.NewReader(b),
    83  	)
    84  	if err != nil {
    85  		return err
    86  	}
    87  	defer resp.Body.Close()
    88  
    89  	return nil
    90  }
    91  
    92  func (r ReleaseUpgradePathsService) Remove(
    93  	productSlug string,
    94  	releaseID int,
    95  	previousReleaseID int,
    96  ) error {
    97  	url := fmt.Sprintf(
    98  		"/products/%s/releases/%d/remove_upgrade_path",
    99  		productSlug,
   100  		releaseID,
   101  	)
   102  
   103  	body := addRemoveUpgradePathBody{
   104  		UpgradePath: addRemoveUpgradePathBodyUpgradePath{
   105  			ReleaseID: previousReleaseID,
   106  		},
   107  	}
   108  
   109  	b, err := json.Marshal(body)
   110  	if err != nil {
   111  		// Untested as we cannot force an error because we are marshalling
   112  		// a known-good body
   113  		return err
   114  	}
   115  
   116  	resp, err := r.client.MakeRequest(
   117  		"PATCH",
   118  		url,
   119  		http.StatusNoContent,
   120  		bytes.NewReader(b),
   121  	)
   122  	if err != nil {
   123  		return err
   124  	}
   125  	defer resp.Body.Close()
   126  
   127  	return nil
   128  }
   129  
   130  type addRemoveUpgradePathBody struct {
   131  	UpgradePath addRemoveUpgradePathBodyUpgradePath `json:"upgrade_path"`
   132  }
   133  
   134  type addRemoveUpgradePathBodyUpgradePath struct {
   135  	ReleaseID int `json:"release_id"`
   136  }