Blame internal/weldr/upload.go

Packit 63bb0d
package weldr
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"encoding/json"
Packit 63bb0d
	"errors"
Packit 63bb0d
	"time"
Packit 63bb0d
Packit 63bb0d
	"github.com/osbuild/osbuild-composer/internal/common"
Packit 63bb0d
	"github.com/osbuild/osbuild-composer/internal/distro"
Packit 63bb0d
Packit 63bb0d
	"github.com/google/uuid"
Packit 63bb0d
	"github.com/osbuild/osbuild-composer/internal/target"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type uploadResponse struct {
Packit 63bb0d
	UUID         uuid.UUID              `json:"uuid"`
Packit 63bb0d
	Status       common.ImageBuildState `json:"status"`
Packit 63bb0d
	ProviderName string                 `json:"provider_name"`
Packit 63bb0d
	ImageName    string                 `json:"image_name"`
Packit 63bb0d
	CreationTime float64                `json:"creation_time"`
Packit 63bb0d
	Settings     uploadSettings         `json:"settings"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type uploadSettings interface {
Packit 63bb0d
	isUploadSettings()
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type awsUploadSettings struct {
Packit 63bb0d
	Region          string `json:"region"`
Packit 63bb0d
	AccessKeyID     string `json:"accessKeyID,omitempty"`
Packit 63bb0d
	SecretAccessKey string `json:"secretAccessKey,omitempty"`
Packit 63bb0d
	Bucket          string `json:"bucket"`
Packit 63bb0d
	Key             string `json:"key"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (awsUploadSettings) isUploadSettings() {}
Packit 63bb0d
Packit 63bb0d
type azureUploadSettings struct {
Packit 63bb0d
	StorageAccount   string `json:"storageAccount,omitempty"`
Packit 63bb0d
	StorageAccessKey string `json:"storageAccessKey,omitempty"`
Packit 63bb0d
	Container        string `json:"container"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (azureUploadSettings) isUploadSettings() {}
Packit 63bb0d
Packit 63bb0d
type uploadRequest struct {
Packit 63bb0d
	Provider  string         `json:"provider"`
Packit 63bb0d
	ImageName string         `json:"image_name"`
Packit 63bb0d
	Settings  uploadSettings `json:"settings"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type rawUploadRequest struct {
Packit 63bb0d
	Provider  string          `json:"provider"`
Packit 63bb0d
	ImageName string          `json:"image_name"`
Packit 63bb0d
	Settings  json.RawMessage `json:"settings"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (u *uploadRequest) UnmarshalJSON(data []byte) error {
Packit 63bb0d
	var rawUploadRequest rawUploadRequest
Packit 63bb0d
	err := json.Unmarshal(data, &rawUploadRequest)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	var settings uploadSettings
Packit 63bb0d
	switch rawUploadRequest.Provider {
Packit 63bb0d
	case "azure":
Packit 63bb0d
		settings = new(azureUploadSettings)
Packit 63bb0d
	case "aws":
Packit 63bb0d
		settings = new(awsUploadSettings)
Packit 63bb0d
	default:
Packit 63bb0d
		return errors.New("unexpected provider name")
Packit 63bb0d
	}
Packit 63bb0d
	err = json.Unmarshal(rawUploadRequest.Settings, settings)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	u.Provider = rawUploadRequest.Provider
Packit 63bb0d
	u.ImageName = rawUploadRequest.ImageName
Packit 63bb0d
	u.Settings = settings
Packit 63bb0d
Packit 63bb0d
	return err
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Converts a `Target` to a serializable `uploadResponse`.
Packit 63bb0d
//
Packit 63bb0d
// This ignore the status in `targets`, because that's never set correctly.
Packit 63bb0d
// Instead, it sets each target's status to the ImageBuildState equivalent of
Packit 63bb0d
// `state`.
Packit 63bb0d
//
Packit 63bb0d
// This also ignores any sensitive data passed into targets. Access keys may
Packit 63bb0d
// be passed as input to composer, but should not be possible to be queried.
Packit Service 509fd4
func targetsToUploadResponses(targets []*target.Target, state ComposeState) []uploadResponse {
Packit 63bb0d
	var uploads []uploadResponse
Packit 63bb0d
	for _, t := range targets {
Packit 63bb0d
		upload := uploadResponse{
Packit 63bb0d
			UUID:         t.Uuid,
Packit 63bb0d
			ImageName:    t.ImageName,
Packit 63bb0d
			CreationTime: float64(t.Created.UnixNano()) / 1000000000,
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		switch state {
Packit Service 509fd4
		case ComposeWaiting:
Packit 63bb0d
			upload.Status = common.IBWaiting
Packit Service 509fd4
		case ComposeRunning:
Packit 63bb0d
			upload.Status = common.IBRunning
Packit Service 509fd4
		case ComposeFinished:
Packit 63bb0d
			upload.Status = common.IBFinished
Packit Service 509fd4
		case ComposeFailed:
Packit 63bb0d
			upload.Status = common.IBFailed
Packit 63bb0d
		}
Packit 63bb0d
Packit 63bb0d
		switch options := t.Options.(type) {
Packit 63bb0d
		case *target.AWSTargetOptions:
Packit 63bb0d
			upload.ProviderName = "aws"
Packit 63bb0d
			upload.Settings = &awsUploadSettings{
Packit 63bb0d
				Region: options.Region,
Packit 63bb0d
				Bucket: options.Bucket,
Packit 63bb0d
				Key:    options.Key,
Packit 63bb0d
				// AccessKeyID and SecretAccessKey are intentionally not included.
Packit 63bb0d
			}
Packit 63bb0d
			uploads = append(uploads, upload)
Packit 63bb0d
		case *target.AzureTargetOptions:
Packit 63bb0d
			upload.ProviderName = "azure"
Packit 63bb0d
			upload.Settings = &azureUploadSettings{
Packit 63bb0d
				Container: options.Container,
Packit 63bb0d
				// StorageAccount and StorageAccessKey are intentionally not included.
Packit 63bb0d
			}
Packit 63bb0d
			uploads = append(uploads, upload)
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return uploads
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func uploadRequestToTarget(u uploadRequest, imageType distro.ImageType) *target.Target {
Packit 63bb0d
	var t target.Target
Packit 63bb0d
Packit 63bb0d
	t.Uuid = uuid.New()
Packit 63bb0d
	t.ImageName = u.ImageName
Packit 63bb0d
	t.Status = common.IBWaiting
Packit 63bb0d
	t.Created = time.Now()
Packit 63bb0d
Packit 63bb0d
	switch options := u.Settings.(type) {
Packit 63bb0d
	case *awsUploadSettings:
Packit 63bb0d
		t.Name = "org.osbuild.aws"
Packit 63bb0d
		t.Options = &target.AWSTargetOptions{
Packit 63bb0d
			Filename:        imageType.Filename(),
Packit 63bb0d
			Region:          options.Region,
Packit 63bb0d
			AccessKeyID:     options.AccessKeyID,
Packit 63bb0d
			SecretAccessKey: options.SecretAccessKey,
Packit 63bb0d
			Bucket:          options.Bucket,
Packit 63bb0d
			Key:             options.Key,
Packit 63bb0d
		}
Packit 63bb0d
	case *azureUploadSettings:
Packit 63bb0d
		t.Name = "org.osbuild.azure"
Packit 63bb0d
		t.Options = &target.AzureTargetOptions{
Packit 63bb0d
			Filename:         imageType.Filename(),
Packit 63bb0d
			StorageAccount:   options.StorageAccount,
Packit 63bb0d
			StorageAccessKey: options.StorageAccessKey,
Packit 63bb0d
			Container:        options.Container,
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return &t
Packit 63bb0d
}