| 1 | package console |
| 2 | |
| 3 | import ( |
| 4 | "errors" |
| 5 | "fmt" |
| 6 | "log" |
| 7 | "net/http" |
| 8 | |
| 9 | "github.com/carlosframework/platform/internal/hostclaim" |
| 10 | "github.com/carlosframework/platform/internal/hostops" |
| 11 | "github.com/carlosframework/platform/internal/release" |
| 12 | ) |
| 13 | |
| 14 | const claimResponseUnavailable = "This operation is temporarily unavailable. Try again shortly." |
| 15 | |
| 16 | func claimResponseRefusal(err error) *doorRefusal { |
| 17 | log.Printf("console: claim request refused: %v", err) |
| 18 | // No box has room (region HA spec 2 §7, H27): every create door's 503. |
| 19 | var full *noCapacityError |
| 20 | if errors.As(err, &full) { |
| 21 | return &doorRefusal{http.StatusServiceUnavailable, noCapacityRefusal(full.Region)} |
| 22 | } |
| 23 | if errors.Is(err, hostops.ErrPending) || errors.Is(err, hostclaim.ErrConflict) || errors.Is(err, hostclaim.ErrWrongState) || errors.Is(err, release.ErrCASConflict) { |
| 24 | return &doorRefusal{http.StatusConflict, claimRetireBusyMsg} |
| 25 | } |
| 26 | return &doorRefusal{http.StatusServiceUnavailable, claimResponseUnavailable} |
| 27 | } |
| 28 | |
| 29 | func writeClaimResponseError(w http.ResponseWriter, err error) { |
| 30 | ref := claimResponseRefusal(err) |
| 31 | w.Header().Set("Retry-After", "2") |
| 32 | setNoCapacityRetryAfter(w, ref) |
| 33 | jsonError(w, ref.Status, ref.Msg) |
| 34 | } |
| 35 | |
| 36 | func (s *Server) renderClaimAccepted(w http.ResponseWriter, r *http.Request, subject, operation, phase string) { |
| 37 | w.Header().Set("Retry-After", "2") |
| 38 | s.renderMessage(w, r, http.StatusAccepted, "Operation accepted", fmt.Sprintf("Operation %s for %s is %s. It is still in progress. Check the app's status before trying again.", operation, subject, phase)) |
| 39 | } |
| 40 | |