debian-forge-composer/internal/weldr/compose.go
Tom Gundersen 61836a7079 weldr/upload: no longer reuse the structs from the target package
For serializeation, make our own private structs. The structs
in the target package are not exactly the same as the ones used by
weldr, so in order to avoid too many compromises, let's just do
an explicity translation.

As a general principle, we aim to only use private types for
serialization and rather translate than reuse for different
purposes.

Signed-off-by: Tom Gundersen <teg@jklm.no>
2020-03-22 22:26:09 +01:00

84 lines
3.2 KiB
Go

package weldr
import (
"sort"
"github.com/google/uuid"
"github.com/osbuild/osbuild-composer/internal/common"
"github.com/osbuild/osbuild-composer/internal/compose"
)
type ComposeEntry struct {
ID uuid.UUID `json:"id"`
Blueprint string `json:"blueprint"`
Version string `json:"version"`
ComposeType common.ImageType `json:"compose_type"`
ImageSize uint64 `json:"image_size"` // This is user-provided image size, not actual file size
QueueStatus common.ImageBuildState `json:"queue_status"`
JobCreated float64 `json:"job_created"`
JobStarted float64 `json:"job_started,omitempty"`
JobFinished float64 `json:"job_finished,omitempty"`
Uploads []uploadResponse `json:"uploads,omitempty"`
}
func composeToComposeEntry(id uuid.UUID, compose compose.Compose, includeUploads bool) *ComposeEntry {
var composeEntry ComposeEntry
composeEntry.ID = id
composeEntry.Blueprint = compose.Blueprint.Name
composeEntry.Version = compose.Blueprint.Version
composeEntry.ComposeType = compose.ImageBuilds[0].ImageType
composeEntry.QueueStatus = compose.ImageBuilds[0].QueueStatus
if includeUploads {
composeEntry.Uploads = targetsToUploadResponses(compose.ImageBuilds[0].Targets)
}
switch compose.ImageBuilds[0].QueueStatus {
case common.IBWaiting:
composeEntry.JobCreated = float64(compose.ImageBuilds[0].JobCreated.UnixNano()) / 1000000000
case common.IBRunning:
composeEntry.JobCreated = float64(compose.ImageBuilds[0].JobCreated.UnixNano()) / 1000000000
composeEntry.JobStarted = float64(compose.ImageBuilds[0].JobStarted.UnixNano()) / 1000000000
case common.IBFinished:
composeEntry.ImageSize = compose.ImageBuilds[0].Size
composeEntry.JobCreated = float64(compose.ImageBuilds[0].JobCreated.UnixNano()) / 1000000000
composeEntry.JobStarted = float64(compose.ImageBuilds[0].JobStarted.UnixNano()) / 1000000000
composeEntry.JobFinished = float64(compose.ImageBuilds[0].JobFinished.UnixNano()) / 1000000000
case common.IBFailed:
composeEntry.JobCreated = float64(compose.ImageBuilds[0].JobCreated.UnixNano()) / 1000000000
composeEntry.JobStarted = float64(compose.ImageBuilds[0].JobStarted.UnixNano()) / 1000000000
composeEntry.JobFinished = float64(compose.ImageBuilds[0].JobFinished.UnixNano()) / 1000000000
default:
panic("invalid compose state")
}
return &composeEntry
}
func composesToComposeEntries(composes map[uuid.UUID]compose.Compose, uuids []uuid.UUID, includeUploads bool) []*ComposeEntry {
var composeEntries []*ComposeEntry
if uuids == nil {
composeEntries = make([]*ComposeEntry, 0, len(composes))
for id, compose := range composes {
composeEntries = append(composeEntries, composeToComposeEntry(id, compose, includeUploads))
}
} else {
composeEntries = make([]*ComposeEntry, 0, len(uuids))
for _, id := range uuids {
if compose, exists := composes[id]; exists {
composeEntries = append(composeEntries, composeToComposeEntry(id, compose, includeUploads))
}
}
}
// make this function output more predictable
sort.Slice(composeEntries, func(i, j int) bool {
return composeEntries[i].ID.String() < composeEntries[j].ID.String()
})
return composeEntries
}