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 Service bcdfb1
type vmwareUploadSettings struct {
Packit Service bcdfb1
	Host       string `json:"host"`
Packit Service bcdfb1
	Username   string `json:"username"`
Packit Service bcdfb1
	Password   string `json:"password"`
Packit Service bcdfb1
	Datacenter string `json:"datacenter"`
Packit Service bcdfb1
	Cluster    string `json:"cluster"`
Packit Service bcdfb1
	Datastore  string `json:"datastore"`
Packit Service bcdfb1
}
Packit Service bcdfb1
Packit Service bcdfb1
func (vmwareUploadSettings) isUploadSettings() {}
Packit Service bcdfb1
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 Service bcdfb1
	case "vmware":
Packit Service bcdfb1
		settings = new(vmwareUploadSettings)
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 Service bcdfb1
		case *target.VMWareTargetOptions:
Packit Service bcdfb1
			upload.ProviderName = "vmware"
Packit Service bcdfb1
			upload.Settings = &vmwareUploadSettings{
Packit Service bcdfb1
				Host:       options.Host,
Packit Service bcdfb1
				Cluster:    options.Cluster,
Packit Service bcdfb1
				Datacenter: options.Datacenter,
Packit Service bcdfb1
				Datastore:  options.Datastore,
Packit Service bcdfb1
				// Username and Password are intentionally not included.
Packit Service bcdfb1
			}
Packit Service bcdfb1
			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 Service bcdfb1
	case *vmwareUploadSettings:
Packit Service bcdfb1
		t.Name = "org.osbuild.vmware"
Packit Service bcdfb1
		t.Options = &target.VMWareTargetOptions{
Packit Service bcdfb1
			Filename:   imageType.Filename(),
Packit Service bcdfb1
			Username:   options.Username,
Packit Service bcdfb1
			Password:   options.Password,
Packit Service bcdfb1
			Host:       options.Host,
Packit Service bcdfb1
			Cluster:    options.Cluster,
Packit Service bcdfb1
			Datacenter: options.Datacenter,
Packit Service bcdfb1
			Datastore:  options.Datastore,
Packit Service bcdfb1
		}
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return &t
Packit 63bb0d
}