weldr: move common.ComposeState to weldr

ComposeState is only used by the weldr API.

Drop the JSON marshaller and unmarshaller, because ComposeState is not
used in an JSON-exported field anymore.
This commit is contained in:
Lars Karlitski 2020-10-24 13:40:08 +02:00
parent 669b612d96
commit bcd57a77e2
5 changed files with 62 additions and 67 deletions

View file

@ -69,31 +69,3 @@ func (ibs *ImageBuildState) UnmarshalJSON(data []byte) error {
func (ibs ImageBuildState) MarshalJSON() ([]byte, error) { func (ibs ImageBuildState) MarshalJSON() ([]byte, error) {
return json.Marshal(getStateMapping()[ibs]) return json.Marshal(getStateMapping()[ibs])
} }
type ComposeState int
const (
CWaiting ComposeState = iota
CRunning
CFinished
CFailed
)
// ToString converts ImageBuildState into a human readable string
func (cs ComposeState) ToString() string {
return getStateMapping()[int(cs)]
}
// UnmarshalJSON converts a JSON string into an ImageBuildState
func (ibs *ComposeState) UnmarshalJSON(data []byte) error {
val, err := unmarshalStateHelper(data, getStateMapping())
if err != nil {
return err
}
*ibs = ComposeState(val)
return nil
}
func (ibs ComposeState) MarshalJSON() ([]byte, error) {
return json.Marshal(getStateMapping()[ibs])
}

View file

@ -2,28 +2,26 @@ package common
import ( import (
"encoding/json" "encoding/json"
"github.com/stretchr/testify/assert"
"testing" "testing"
"github.com/stretchr/testify/assert"
) )
func TestJSONConversions(t *testing.T) { func TestJSONConversions(t *testing.T) {
type TestJson struct { type TestJson struct {
Ibs ImageBuildState `json:"ibs"` Ibs ImageBuildState `json:"ibs"`
Cs ComposeState `json:"cs"`
} }
typedCases := []TestJson{ typedCases := []TestJson{
{ {
Ibs: IBWaiting, Ibs: IBWaiting,
Cs: CWaiting,
}, },
{ {
Ibs: IBRunning, Ibs: IBRunning,
Cs: CFailed,
}, },
} }
strCases := []string{ strCases := []string{
`{"ibs": "WAITING", "cs": "WAITING"}`, `{"ibs": "WAITING"}`,
`{"ibs": "RUNNING", "cs": "FAILED"}`, `{"ibs": "RUNNING"}`,
} }
for n, c := range strCases { for n, c := range strCases {

View file

@ -49,6 +49,31 @@ type API struct {
compatOutputDir string compatOutputDir string
} }
type ComposeState int
const (
CWaiting ComposeState = iota
CRunning
CFinished
CFailed
)
// ToString converts ImageBuildState into a human readable string
func (cs ComposeState) ToString() string {
switch cs {
case CWaiting:
return "WAITING"
case CRunning:
return "RUNNING"
case CFinished:
return "FINISHED"
case CFailed:
return "FAILED"
default:
panic("invalid ComposeState value")
}
}
// systemRepoIDs returns a list of the system repos // systemRepoIDs returns a list of the system repos
// NOTE: The system repos have no concept of id vs. name so the id is returned // NOTE: The system repos have no concept of id vs. name so the id is returned
func (api *API) systemRepoNames() (names []string) { func (api *API) systemRepoNames() (names []string) {
@ -162,31 +187,31 @@ func (api *API) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
} }
type composeStatus struct { type composeStatus struct {
State common.ComposeState State ComposeState
Queued time.Time Queued time.Time
Started time.Time Started time.Time
Finished time.Time Finished time.Time
Result *osbuild.Result Result *osbuild.Result
} }
func composeStateFromJobStatus(js *worker.JobStatus) common.ComposeState { func composeStateFromJobStatus(js *worker.JobStatus) ComposeState {
if js.Canceled { if js.Canceled {
return common.CFailed return CFailed
} }
if js.Started.IsZero() { if js.Started.IsZero() {
return common.CWaiting return CWaiting
} }
if js.Finished.IsZero() { if js.Finished.IsZero() {
return common.CRunning return CRunning
} }
if js.Result.OSBuildOutput != nil && js.Result.OSBuildOutput.Success { if js.Result.OSBuildOutput != nil && js.Result.OSBuildOutput.Success {
return common.CFinished return CFinished
} }
return common.CFailed return CFailed
} }
// Returns the state of the image in `compose` and the times the job was // Returns the state of the image in `compose` and the times the job was
@ -199,16 +224,16 @@ func (api *API) getComposeStatus(compose store.Compose) *composeStatus {
// the job queue from the store still contain their valid status and // the job queue from the store still contain their valid status and
// times. Return those here as a fallback. // times. Return those here as a fallback.
if jobId == uuid.Nil { if jobId == uuid.Nil {
var state common.ComposeState var state ComposeState
switch compose.ImageBuild.QueueStatus { switch compose.ImageBuild.QueueStatus {
case common.IBWaiting: case common.IBWaiting:
state = common.CWaiting state = CWaiting
case common.IBRunning: case common.IBRunning:
state = common.CRunning state = CRunning
case common.IBFinished: case common.IBFinished:
state = common.CFinished state = CFinished
case common.IBFailed: case common.IBFailed:
state = common.CFailed state = CFailed
} }
return &composeStatus{ return &composeStatus{
State: state, State: state,
@ -1910,7 +1935,7 @@ func (api *API) composeDeleteHandler(writer http.ResponseWriter, request *http.R
} }
composeStatus := api.getComposeStatus(compose) composeStatus := api.getComposeStatus(compose)
if composeStatus.State != common.CFinished && composeStatus.State != common.CFailed { if composeStatus.State != CFinished && composeStatus.State != CFailed {
errors = append(errors, composeDeleteError{ errors = append(errors, composeDeleteError{
"BuildInWrongState", "BuildInWrongState",
fmt.Sprintf("Compose %s is not in FINISHED or FAILED.", id), fmt.Sprintf("Compose %s is not in FINISHED or FAILED.", id),
@ -1975,7 +2000,7 @@ func (api *API) composeCancelHandler(writer http.ResponseWriter, request *http.R
} }
composeStatus := api.getComposeStatus(compose) composeStatus := api.getComposeStatus(compose)
if composeStatus.State == common.CWaiting { if composeStatus.State == CWaiting {
errors := responseError{ errors := responseError{
ID: "BuildInWrongState", ID: "BuildInWrongState",
Msg: fmt.Sprintf("Build %s has not started yet. No logs to view.", uuidString), Msg: fmt.Sprintf("Build %s has not started yet. No logs to view.", uuidString),
@ -2035,9 +2060,9 @@ func (api *API) composeQueueHandler(writer http.ResponseWriter, request *http.Re
for id, compose := range composes { for id, compose := range composes {
composeStatus := api.getComposeStatus(compose) composeStatus := api.getComposeStatus(compose)
switch composeStatus.State { switch composeStatus.State {
case common.CWaiting: case CWaiting:
reply.New = append(reply.New, composeToComposeEntry(id, compose, composeStatus, includeUploads)) reply.New = append(reply.New, composeToComposeEntry(id, compose, composeStatus, includeUploads))
case common.CRunning: case CRunning:
reply.Run = append(reply.Run, composeToComposeEntry(id, compose, composeStatus, includeUploads)) reply.Run = append(reply.Run, composeToComposeEntry(id, compose, composeStatus, includeUploads))
} }
} }
@ -2219,7 +2244,7 @@ func (api *API) composeImageHandler(writer http.ResponseWriter, request *http.Re
} }
composeStatus := api.getComposeStatus(compose) composeStatus := api.getComposeStatus(compose)
if composeStatus.State != common.CFinished { if composeStatus.State != CFinished {
errors := responseError{ errors := responseError{
ID: "BuildInWrongState", ID: "BuildInWrongState",
Msg: fmt.Sprintf("Build %s is in wrong state: %s", uuidString, composeStatus.State.ToString()), Msg: fmt.Sprintf("Build %s is in wrong state: %s", uuidString, composeStatus.State.ToString()),
@ -2277,7 +2302,7 @@ func (api *API) composeMetadataHandler(writer http.ResponseWriter, request *http
} }
composeStatus := api.getComposeStatus(compose) composeStatus := api.getComposeStatus(compose)
if composeStatus.State != common.CFinished && composeStatus.State != common.CFailed { if composeStatus.State != CFinished && composeStatus.State != CFailed {
errors := responseError{ errors := responseError{
ID: "BuildInWrongState", ID: "BuildInWrongState",
Msg: fmt.Sprintf("Build %s is in wrong state: %s", uuidString, composeStatus.State.ToString()), Msg: fmt.Sprintf("Build %s is in wrong state: %s", uuidString, composeStatus.State.ToString()),
@ -2338,7 +2363,7 @@ func (api *API) composeResultsHandler(writer http.ResponseWriter, request *http.
} }
composeStatus := api.getComposeStatus(compose) composeStatus := api.getComposeStatus(compose)
if composeStatus.State != common.CFinished && composeStatus.State != common.CFailed { if composeStatus.State != CFinished && composeStatus.State != CFailed {
errors := responseError{ errors := responseError{
ID: "BuildInWrongState", ID: "BuildInWrongState",
Msg: fmt.Sprintf("Build %s is in wrong state: %s", uuidString, composeStatus.State.ToString()), Msg: fmt.Sprintf("Build %s is in wrong state: %s", uuidString, composeStatus.State.ToString()),
@ -2429,7 +2454,7 @@ func (api *API) composeLogsHandler(writer http.ResponseWriter, request *http.Req
} }
composeStatus := api.getComposeStatus(compose) composeStatus := api.getComposeStatus(compose)
if composeStatus.State != common.CFinished && composeStatus.State != common.CFailed { if composeStatus.State != CFinished && composeStatus.State != CFailed {
errors := responseError{ errors := responseError{
ID: "BuildInWrongState", ID: "BuildInWrongState",
Msg: fmt.Sprintf("Build %s not in FINISHED or FAILED state.", uuidString), Msg: fmt.Sprintf("Build %s not in FINISHED or FAILED state.", uuidString),
@ -2493,7 +2518,7 @@ func (api *API) composeLogHandler(writer http.ResponseWriter, request *http.Requ
} }
composeStatus := api.getComposeStatus(compose) composeStatus := api.getComposeStatus(compose)
if composeStatus.State == common.CWaiting { if composeStatus.State == CWaiting {
errors := responseError{ errors := responseError{
ID: "BuildInWrongState", ID: "BuildInWrongState",
Msg: fmt.Sprintf("Build %s has not started yet. No logs to view.", uuidString), Msg: fmt.Sprintf("Build %s has not started yet. No logs to view.", uuidString),
@ -2502,7 +2527,7 @@ func (api *API) composeLogHandler(writer http.ResponseWriter, request *http.Requ
return return
} }
if composeStatus.State == common.CRunning { if composeStatus.State == CRunning {
fmt.Fprintf(writer, "Build %s is still running.\n", uuidString) fmt.Fprintf(writer, "Build %s is still running.\n", uuidString)
return return
} }
@ -2523,7 +2548,7 @@ func (api *API) composeFinishedHandler(writer http.ResponseWriter, request *http
includeUploads := isRequestVersionAtLeast(params, 1) includeUploads := isRequestVersionAtLeast(params, 1)
for id, compose := range api.store.GetAllComposes() { for id, compose := range api.store.GetAllComposes() {
composeStatus := api.getComposeStatus(compose) composeStatus := api.getComposeStatus(compose)
if composeStatus.State != common.CFinished { if composeStatus.State != CFinished {
continue continue
} }
reply.Finished = append(reply.Finished, composeToComposeEntry(id, compose, composeStatus, includeUploads)) reply.Finished = append(reply.Finished, composeToComposeEntry(id, compose, composeStatus, includeUploads))
@ -2546,7 +2571,7 @@ func (api *API) composeFailedHandler(writer http.ResponseWriter, request *http.R
includeUploads := isRequestVersionAtLeast(params, 1) includeUploads := isRequestVersionAtLeast(params, 1)
for id, compose := range api.store.GetAllComposes() { for id, compose := range api.store.GetAllComposes() {
composeStatus := api.getComposeStatus(compose) composeStatus := api.getComposeStatus(compose)
if composeStatus.State != common.CFailed { if composeStatus.State != CFailed {
continue continue
} }
reply.Failed = append(reply.Failed, composeToComposeEntry(id, compose, composeStatus, includeUploads)) reply.Failed = append(reply.Failed, composeToComposeEntry(id, compose, composeStatus, includeUploads))

View file

@ -35,23 +35,23 @@ func composeToComposeEntry(id uuid.UUID, compose store.Compose, status *composeS
} }
switch status.State { switch status.State {
case common.CWaiting: case CWaiting:
composeEntry.QueueStatus = common.IBWaiting composeEntry.QueueStatus = common.IBWaiting
composeEntry.JobCreated = float64(status.Queued.UnixNano()) / 1000000000 composeEntry.JobCreated = float64(status.Queued.UnixNano()) / 1000000000
case common.CRunning: case CRunning:
composeEntry.QueueStatus = common.IBRunning composeEntry.QueueStatus = common.IBRunning
composeEntry.JobCreated = float64(status.Queued.UnixNano()) / 1000000000 composeEntry.JobCreated = float64(status.Queued.UnixNano()) / 1000000000
composeEntry.JobStarted = float64(status.Started.UnixNano()) / 1000000000 composeEntry.JobStarted = float64(status.Started.UnixNano()) / 1000000000
case common.CFinished: case CFinished:
composeEntry.QueueStatus = common.IBFinished composeEntry.QueueStatus = common.IBFinished
composeEntry.ImageSize = compose.ImageBuild.Size composeEntry.ImageSize = compose.ImageBuild.Size
composeEntry.JobCreated = float64(status.Queued.UnixNano()) / 1000000000 composeEntry.JobCreated = float64(status.Queued.UnixNano()) / 1000000000
composeEntry.JobStarted = float64(status.Started.UnixNano()) / 1000000000 composeEntry.JobStarted = float64(status.Started.UnixNano()) / 1000000000
composeEntry.JobFinished = float64(status.Finished.UnixNano()) / 1000000000 composeEntry.JobFinished = float64(status.Finished.UnixNano()) / 1000000000
case common.CFailed: case CFailed:
composeEntry.QueueStatus = common.IBFailed composeEntry.QueueStatus = common.IBFailed
composeEntry.JobCreated = float64(status.Queued.UnixNano()) / 1000000000 composeEntry.JobCreated = float64(status.Queued.UnixNano()) / 1000000000
composeEntry.JobStarted = float64(status.Started.UnixNano()) / 1000000000 composeEntry.JobStarted = float64(status.Started.UnixNano()) / 1000000000

View file

@ -91,7 +91,7 @@ func (u *uploadRequest) UnmarshalJSON(data []byte) error {
// //
// This also ignores any sensitive data passed into targets. Access keys may // This also ignores any sensitive data passed into targets. Access keys may
// be passed as input to composer, but should not be possible to be queried. // be passed as input to composer, but should not be possible to be queried.
func targetsToUploadResponses(targets []*target.Target, state common.ComposeState) []uploadResponse { func targetsToUploadResponses(targets []*target.Target, state ComposeState) []uploadResponse {
var uploads []uploadResponse var uploads []uploadResponse
for _, t := range targets { for _, t := range targets {
upload := uploadResponse{ upload := uploadResponse{
@ -101,13 +101,13 @@ func targetsToUploadResponses(targets []*target.Target, state common.ComposeStat
} }
switch state { switch state {
case common.CWaiting: case CWaiting:
upload.Status = common.IBWaiting upload.Status = common.IBWaiting
case common.CRunning: case CRunning:
upload.Status = common.IBRunning upload.Status = common.IBRunning
case common.CFinished: case CFinished:
upload.Status = common.IBFinished upload.Status = common.IBFinished
case common.CFailed: case CFailed:
upload.Status = common.IBFailed upload.Status = common.IBFailed
} }