cloudapi: add build job dependency checks

If an osbuild or koji-osbuild job has failed, add
a check to see if it is a result of the build jobs
dependencies and return the dependency failure job
error furthest up the chain of errors & add this
error to the details filed of the build job error.
This commit is contained in:
Gianluca Zuccarelli 2022-04-08 14:44:13 +01:00 committed by Sanne Raymaekers
parent 596464e8a2
commit e31fb36d65
3 changed files with 30 additions and 21 deletions

View file

@ -61,6 +61,7 @@ const (
ErrorGettingDepsolveJobStatus ServiceErrorCode = 1013
ErrorDepsolveJobCanceled ServiceErrorCode = 1014
ErrorUnexpectedNumberOfImageBuilds ServiceErrorCode = 1015
ErrorGettingBuildDependencyStatus ServiceErrorCode = 1016
// Errors contained within this file
ErrorUnspecified ServiceErrorCode = 10000
@ -126,6 +127,7 @@ func getServiceErrors() serviceErrors {
serviceError{ErrorGettingDepsolveJobStatus, http.StatusInternalServerError, "Unable to get depsolve job status"},
serviceError{ErrorDepsolveJobCanceled, http.StatusInternalServerError, "Depsolve job was cancelled"},
serviceError{ErrorUnexpectedNumberOfImageBuilds, http.StatusInternalServerError, "Compose has unexpected number of image builds"},
serviceError{ErrorGettingBuildDependencyStatus, http.StatusInternalServerError, "Error checking status of build job dependencies"},
serviceError{ErrorUnspecified, http.StatusInternalServerError, "Unspecified internal error "},
serviceError{ErrorNotHTTPError, http.StatusInternalServerError, "Error is not an instance of HTTPError"},

View file

@ -513,11 +513,18 @@ func (h *apiHandlers) GetComposeStatus(ctx echo.Context, id string) error {
if jobType == "osbuild" {
var result worker.OSBuildJobResult
status, _, err := h.server.workers.OSBuildJobStatus(jobId, &result)
status, deps, err := h.server.workers.OSBuildJobStatus(jobId, &result)
if err != nil {
return HTTPError(ErrorMalformedOSBuildJobResult)
}
if result.JobError != nil && result.JobError.HasDependencyError() {
err = h.server.workers.CheckBuildDependencies(deps[0], result.JobError)
if err != nil {
return HTTPError(ErrorGettingBuildDependencyStatus)
}
}
var us *UploadStatus
if result.TargetResults != nil {
// Only single upload target is allowed, therefore only a single upload target result is allowed as well
@ -598,10 +605,16 @@ func (h *apiHandlers) GetComposeStatus(ctx echo.Context, id string) error {
var buildJobStatuses []ImageStatus
for i := 1; i < len(deps); i++ {
var buildJobResult worker.OSBuildKojiJobResult
buildJobStatus, _, err := h.server.workers.OSBuildKojiJobStatus(deps[i], &buildJobResult)
buildJobStatus, buildDeps, err := h.server.workers.OSBuildKojiJobStatus(deps[i], &buildJobResult)
if err != nil {
return HTTPError(ErrorMalformedOSBuildJobResult)
}
if buildJobResult.JobError != nil && buildJobResult.JobError.HasDependencyError() {
err = h.server.workers.CheckBuildDependencies(buildDeps[1], buildJobResult.JobError)
if err != nil {
return HTTPError(ErrorGettingBuildDependencyStatus)
}
}
buildJobResults = append(buildJobResults, buildJobResult)
buildJobStatuses = append(buildJobStatuses, ImageStatus{
Status: imageStatusFromKojiJobStatus(buildJobStatus, &initResult, &buildJobResult),

View file

@ -138,7 +138,6 @@ func (s *Server) enqueue(jobType string, job interface{}, dependencies []uuid.UU
}
func (s *Server) CheckBuildDependencies(dep uuid.UUID, jobErr *clienterrors.Error) error {
var depErrs []clienterrors.Error
var manifestJR ManifestJobByIDResult
_, deps, err := s.ManifestJobStatus(dep, &manifestJR)
if err != nil {
@ -146,28 +145,23 @@ func (s *Server) CheckBuildDependencies(dep uuid.UUID, jobErr *clienterrors.Erro
}
if manifestJobErr := manifestJR.JobError; manifestJobErr != nil {
if manifestJobErr.HasDependencyError() && len(deps) > 0 {
if len(deps) > 1 {
return fmt.Errorf("Unexpected number of dependencies received")
}
var depsolveJR DepsolveJobResult
_, _, err := s.DepsolveJobStatus(deps[0], &depsolveJR)
if err != nil {
return err
}
if depJobErr := depsolveJR.JobError; depJobErr != nil {
depErrs = append(depErrs, *depJobErr)
}
if !manifestJobErr.HasDependencyError() {
jobErr.Details = manifestJobErr
return nil
}
if len(deps) > 1 {
return fmt.Errorf("Unexpected number of dependencies received")
}
depErrs = append(depErrs, *manifestJobErr)
var depsolveJR DepsolveJobResult
_, _, err := s.DepsolveJobStatus(deps[0], &depsolveJR)
if err != nil {
return err
}
jobErr.Details = depsolveJR.JobError
}
jobErr.Details = clienterrors.ErrorDetails{
FailedDependencies: depErrs,
}
return nil
}