debian-forge-composer/internal/weldr/upload.go
Martin Sehnoutka ab6b6da76c Weldr API: use the new compose/store API
The compose now contains multiple image builds, but Weldr API does not
support this feature. Use the first image build every time.

Also start using the new types instead of plain strings.
2020-02-12 11:17:26 +01:00

111 lines
2.7 KiB
Go

package weldr
import (
"encoding/json"
"errors"
"github.com/osbuild/osbuild-composer/internal/common"
"time"
"github.com/google/uuid"
"github.com/osbuild/osbuild-composer/internal/target"
)
type UploadResponse struct {
Uuid uuid.UUID `json:"uuid"`
Status common.ImageBuildState `json:"status"`
ProviderName string `json:"provider_name"`
ImageName string `json:"image_name"`
CreationTime float64 `json:"creation_time"`
Settings target.TargetOptions `json:"settings"`
}
type UploadRequest struct {
Provider string `json:"provider"`
ImageName string `json:"image_name"`
Settings target.TargetOptions `json:"settings"`
}
type rawUploadRequest struct {
Provider string `json:"provider"`
ImageName string `json:"image_name"`
Settings json.RawMessage `json:"settings"`
}
func (u *UploadRequest) UnmarshalJSON(data []byte) error {
var rawUpload rawUploadRequest
err := json.Unmarshal(data, &rawUpload)
if err != nil {
return err
}
// we need to convert provider name to target name to use the unmarshaller
targetName := providerNameToTargetNameMap[rawUpload.Provider]
options, err := target.UnmarshalTargetOptions(targetName, rawUpload.Settings)
u.Provider = rawUpload.Provider
u.ImageName = rawUpload.ImageName
u.Settings = options
return err
}
var targetNameToProviderNameMap = map[string]string{
"org.osbuild.aws": "aws",
"org.osbuild.azure": "azure",
}
var providerNameToTargetNameMap = map[string]string{
"aws": "org.osbuild.aws",
"azure": "org.osbuild.azure",
}
func targetToUploadResponse(t *target.Target) UploadResponse {
var u UploadResponse
providerName, providerExist := targetNameToProviderNameMap[t.Name]
if !providerExist {
panic("target name " + t.Name + " is not defined in conversion map!")
}
u.CreationTime = float64(t.Created.UnixNano()) / 1000000000
u.ImageName = t.ImageName
u.ProviderName = providerName
u.Status = t.Status
u.Uuid = t.Uuid
u.Settings = t.Options
return u
}
func TargetsToUploadResponses(targets []*target.Target) []UploadResponse {
var uploads []UploadResponse
for _, t := range targets {
if t.Name == "org.osbuild.local" {
continue
}
upload := targetToUploadResponse(t)
uploads = append(uploads, upload)
}
return uploads
}
func UploadRequestToTarget(u UploadRequest) (*target.Target, error) {
var t target.Target
targetName, targetExist := providerNameToTargetNameMap[u.Provider]
if !targetExist {
return nil, errors.New("Unknown provider name " + u.Provider)
}
t.Uuid = uuid.New()
t.ImageName = u.ImageName
t.Options = u.Settings
t.Name = targetName
t.Status = common.IBWaiting
t.Created = time.Now()
return &t, nil
}