|
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 |
}
|