diff --git a/tools/thothctl/internal/workspaceops/operations.go b/tools/thothctl/internal/workspaceops/operations.go index 96bc78a0..cde79731 100644 --- a/tools/thothctl/internal/workspaceops/operations.go +++ b/tools/thothctl/internal/workspaceops/operations.go @@ -357,11 +357,13 @@ func validateResult(result Result) error { if !workspacePattern.MatchString(result.WorkspaceID) { return errors.New("workspace maintenance returned an invalid workspace identity") } - if len(result.WorkspaceRevision) != 40 || !isLowerHex(result.WorkspaceRevision) { - return errors.New("workspace maintenance returned an invalid workspace revision") - } - if !strings.HasPrefix(result.DescriptorBlob, "sha256:") || len(result.DescriptorBlob) != len("sha256:")+64 || !isLowerHex(strings.TrimPrefix(result.DescriptorBlob, "sha256:")) { - return errors.New("workspace maintenance returned an invalid descriptor digest") + if result.Status != "failed" { + if len(result.WorkspaceRevision) != 40 || !isLowerHex(result.WorkspaceRevision) { + return errors.New("workspace maintenance returned an invalid workspace revision") + } + if !strings.HasPrefix(result.DescriptorBlob, "sha256:") || len(result.DescriptorBlob) != len("sha256:")+64 || !isLowerHex(strings.TrimPrefix(result.DescriptorBlob, "sha256:")) { + return errors.New("workspace maintenance returned an invalid descriptor digest") + } } validStatuses := map[string]struct{}{"succeeded": {}, "unchanged": {}, "dry_run": {}, "blocked": {}, "failed": {}} if _, ok := validStatuses[result.Status]; !ok { @@ -370,9 +372,11 @@ func validateResult(result Result) error { if strings.TrimSpace(result.Code) == "" || strings.TrimSpace(result.Operation) == "" || result.CompletedStages == nil { return errors.New("workspace maintenance omitted required fields") } - for _, digest := range result.ArtifactIdentities { - if strings.TrimSpace(digest.Kind) == "" || !strings.HasPrefix(digest.Digest, "sha256:") { - return errors.New("workspace maintenance returned an invalid artifact identity") + if result.Status != "failed" { + for _, digest := range result.ArtifactIdentities { + if strings.TrimSpace(digest.Kind) == "" || !strings.HasPrefix(digest.Digest, "sha256:") { + return errors.New("workspace maintenance returned an invalid artifact identity") + } } } return nil