debian-forge-composer/internal/weldr/upload.go
Ondřej Budai f4991cb1ca api: Add support for upload API
This commit introduces basic support for upload API. Currently, all the routes
required by cockpit-composer are supported (except for /compose/log).

Also, ComposeEntry struct is moved outside of the store package. I decided
to do it because it isn't connected in any way to store, it's more connected
to API. Due to this move there's currently a known bug that image size is
not returned. This should be solved by moving Image struct inside Compose
struct by follow-up PR.
2019-12-01 00:05:17 +01:00

110 lines
2.7 KiB
Go

package weldr
import (
"encoding/json"
"errors"
"time"
"github.com/google/uuid"
"github.com/osbuild/osbuild-composer/internal/target"
)
type UploadResponse struct {
Uuid uuid.UUID `json:"uuid"`
Status string `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 = "WAITING"
t.Created = time.Now()
return &t, nil
}