github.com/LukasHeimann/cloudfoundrycli@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  }