mirror of
https://github.com/hashicorp/packer.git
synced 2026-09-20 15:01:40 -04:00
* Updating the license from MPL to Business Source License Going forward, this project will be licensed under the Business Source License v1.1. Please see our blog post for more details at https://hashi.co/bsl-blog, FAQ at https://hashi.co/license-faq, and details of the license at www.hashicorp.com/bsl. * Update copyright file headers to BUSL-1.1 --------- Co-authored-by: hashicorp-copywrite[bot] <110428419+hashicorp-copywrite[bot]@users.noreply.github.com>
254 lines
7.6 KiB
Go
254 lines
7.6 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package api
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/hashicorp/hcp-sdk-go/clients/cloud-packer-service/stable/2021-04-30/client/packer_service"
|
|
"github.com/hashicorp/hcp-sdk-go/clients/cloud-packer-service/stable/2021-04-30/models"
|
|
"google.golang.org/grpc/codes"
|
|
)
|
|
|
|
func (client *Client) CreateBucket(
|
|
ctx context.Context,
|
|
bucketSlug,
|
|
bucketDescription string,
|
|
bucketLabels map[string]string,
|
|
) (*packer_service.PackerServiceCreateBucketOK, error) {
|
|
|
|
createBktParams := packer_service.NewPackerServiceCreateBucketParams()
|
|
createBktParams.LocationOrganizationID = client.OrganizationID
|
|
createBktParams.LocationProjectID = client.ProjectID
|
|
createBktParams.Body = packer_service.PackerServiceCreateBucketBody{
|
|
BucketSlug: bucketSlug,
|
|
Description: bucketDescription,
|
|
Labels: bucketLabels,
|
|
}
|
|
|
|
return client.Packer.PackerServiceCreateBucket(createBktParams, nil)
|
|
}
|
|
|
|
func (client *Client) DeleteBucket(
|
|
ctx context.Context,
|
|
bucketSlug string,
|
|
) (*packer_service.PackerServiceDeleteBucketOK, error) {
|
|
|
|
deleteBktParams := packer_service.NewPackerServiceDeleteBucketParamsWithContext(ctx)
|
|
deleteBktParams.LocationOrganizationID = client.OrganizationID
|
|
deleteBktParams.LocationProjectID = client.ProjectID
|
|
deleteBktParams.BucketSlug = bucketSlug
|
|
|
|
return client.Packer.PackerServiceDeleteBucket(deleteBktParams, nil)
|
|
}
|
|
|
|
// UpsertBucket tries to create a bucket on a HCP Packer Registry. If the bucket
|
|
// exists it will handle the error and update the bucket with the provided
|
|
// details.
|
|
func (client *Client) UpsertBucket(
|
|
ctx context.Context,
|
|
bucketSlug,
|
|
bucketDescription string,
|
|
bucketLabels map[string]string,
|
|
) error {
|
|
|
|
// Create bucket if exist we continue as is, eventually we want to treat
|
|
// this like an upsert
|
|
_, err := client.CreateBucket(ctx, bucketSlug, bucketDescription, bucketLabels)
|
|
if err != nil && !CheckErrorCode(err, codes.AlreadyExists) {
|
|
return err
|
|
}
|
|
|
|
if err == nil {
|
|
return nil
|
|
}
|
|
|
|
params := packer_service.NewPackerServiceUpdateBucketParamsWithContext(ctx)
|
|
params.LocationOrganizationID = client.OrganizationID
|
|
params.LocationProjectID = client.ProjectID
|
|
params.BucketSlug = bucketSlug
|
|
params.Body = packer_service.PackerServiceUpdateBucketBody{
|
|
Description: bucketDescription,
|
|
Labels: bucketLabels,
|
|
}
|
|
_, err = client.Packer.PackerServiceUpdateBucket(params, nil)
|
|
|
|
return err
|
|
}
|
|
|
|
func (client *Client) CreateIteration(
|
|
ctx context.Context,
|
|
bucketSlug,
|
|
fingerprint string,
|
|
templateType models.HashicorpCloudPackerIterationTemplateType,
|
|
) (*packer_service.PackerServiceCreateIterationOK, error) {
|
|
|
|
params := packer_service.NewPackerServiceCreateIterationParamsWithContext(ctx)
|
|
params.LocationOrganizationID = client.OrganizationID
|
|
params.LocationProjectID = client.ProjectID
|
|
params.BucketSlug = bucketSlug
|
|
params.Body = packer_service.PackerServiceCreateIterationBody{
|
|
Fingerprint: fingerprint,
|
|
TemplateType: templateType.Pointer(),
|
|
}
|
|
|
|
return client.Packer.PackerServiceCreateIteration(params, nil)
|
|
}
|
|
|
|
type GetIterationOption func(*packer_service.PackerServiceGetIterationParams)
|
|
|
|
var (
|
|
GetIteration_byID = func(id string) GetIterationOption {
|
|
return func(params *packer_service.PackerServiceGetIterationParams) {
|
|
params.IterationID = &id
|
|
}
|
|
}
|
|
GetIteration_byFingerprint = func(fingerprint string) GetIterationOption {
|
|
return func(params *packer_service.PackerServiceGetIterationParams) {
|
|
params.Fingerprint = &fingerprint
|
|
}
|
|
}
|
|
)
|
|
|
|
func (client *Client) GetIteration(ctx context.Context, bucketSlug string, opts ...GetIterationOption) (*models.HashicorpCloudPackerIteration, error) {
|
|
getItParams := packer_service.NewPackerServiceGetIterationParams()
|
|
getItParams.LocationOrganizationID = client.OrganizationID
|
|
getItParams.LocationProjectID = client.ProjectID
|
|
getItParams.BucketSlug = bucketSlug
|
|
|
|
for _, opt := range opts {
|
|
opt(getItParams)
|
|
}
|
|
|
|
resp, err := client.Packer.PackerServiceGetIteration(getItParams, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if resp.Payload.Iteration != nil {
|
|
return resp.Payload.Iteration, nil
|
|
}
|
|
|
|
return nil, fmt.Errorf("something went wrong retrieving the iteration for bucket %s", bucketSlug)
|
|
}
|
|
|
|
func (client *Client) CreateBuild(
|
|
ctx context.Context,
|
|
bucketSlug,
|
|
runUUID,
|
|
iterationID,
|
|
fingerprint,
|
|
componentType string,
|
|
status models.HashicorpCloudPackerBuildStatus,
|
|
) (*packer_service.PackerServiceCreateBuildOK, error) {
|
|
|
|
params := packer_service.NewPackerServiceCreateBuildParamsWithContext(ctx)
|
|
|
|
params.LocationOrganizationID = client.OrganizationID
|
|
params.LocationProjectID = client.ProjectID
|
|
params.BucketSlug = bucketSlug
|
|
params.IterationID = iterationID
|
|
params.Body = packer_service.PackerServiceCreateBuildBody{
|
|
Fingerprint: fingerprint,
|
|
Build: &models.HashicorpCloudPackerBuildCreateBody{
|
|
ComponentType: componentType,
|
|
PackerRunUUID: runUUID,
|
|
Status: status.Pointer(),
|
|
},
|
|
}
|
|
|
|
return client.Packer.PackerServiceCreateBuild(params, nil)
|
|
}
|
|
|
|
// ListBuilds queries an Iteration on HCP Packer registry for all of it's
|
|
// associated builds. Currently all builds are returned regardless of status.
|
|
func (client *Client) ListBuilds(
|
|
ctx context.Context,
|
|
bucketSlug string,
|
|
iterationID string,
|
|
) ([]*models.HashicorpCloudPackerBuild, error) {
|
|
|
|
params := packer_service.NewPackerServiceListBuildsParamsWithContext(ctx)
|
|
params.LocationOrganizationID = client.OrganizationID
|
|
params.LocationProjectID = client.ProjectID
|
|
params.BucketSlug = bucketSlug
|
|
params.IterationID = iterationID
|
|
|
|
resp, err := client.Packer.PackerServiceListBuilds(params, nil)
|
|
if err != nil {
|
|
return []*models.HashicorpCloudPackerBuild{}, err
|
|
}
|
|
|
|
return resp.Payload.Builds, nil
|
|
}
|
|
|
|
// UpdateBuild updates a single iteration build entry with the incoming input
|
|
// data.
|
|
func (client *Client) UpdateBuild(
|
|
ctx context.Context,
|
|
buildID,
|
|
runUUID,
|
|
cloudProvider,
|
|
sourceImageID string,
|
|
sourceIterationID string,
|
|
sourceChannelID string,
|
|
labels map[string]string,
|
|
status models.HashicorpCloudPackerBuildStatus,
|
|
images []*models.HashicorpCloudPackerImageCreateBody,
|
|
) (string, error) {
|
|
|
|
params := packer_service.NewPackerServiceUpdateBuildParamsWithContext(ctx)
|
|
params.BuildID = buildID
|
|
params.LocationOrganizationID = client.OrganizationID
|
|
params.LocationProjectID = client.ProjectID
|
|
|
|
params.Body = packer_service.PackerServiceUpdateBuildBody{
|
|
Updates: &models.HashicorpCloudPackerBuildUpdates{
|
|
Images: images,
|
|
PackerRunUUID: runUUID,
|
|
Labels: labels,
|
|
Status: status.Pointer(),
|
|
CloudProvider: cloudProvider,
|
|
SourceImageID: sourceImageID,
|
|
SourceIterationID: sourceIterationID,
|
|
SourceChannelID: sourceChannelID,
|
|
},
|
|
}
|
|
|
|
resp, err := client.Packer.PackerServiceUpdateBuild(params, nil)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
if resp == nil {
|
|
return "", errors.New("Not sure why response is nil")
|
|
}
|
|
|
|
return resp.Payload.Build.ID, nil
|
|
}
|
|
|
|
// GetChannel loads the named channel that is associated to the bucket slug . If the
|
|
// channel does not exist in HCP Packer, GetChannel returns an error.
|
|
func (client *Client) GetChannel(ctx context.Context, bucketSlug string, channelName string) (*models.HashicorpCloudPackerChannel, error) {
|
|
params := packer_service.NewPackerServiceGetChannelParamsWithContext(ctx)
|
|
params.LocationOrganizationID = client.OrganizationID
|
|
params.LocationProjectID = client.ProjectID
|
|
params.BucketSlug = bucketSlug
|
|
params.Slug = channelName
|
|
|
|
resp, err := client.Packer.PackerServiceGetChannel(params, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if resp.Payload.Channel == nil {
|
|
return nil, fmt.Errorf("there is no channel with the name %s associated with the bucket %s",
|
|
channelName, bucketSlug)
|
|
}
|
|
|
|
return resp.Payload.Channel, nil
|
|
}
|