package console import ( "errors" "fmt" "log" "net/http" "github.com/carlosframework/platform/internal/hostclaim" "github.com/carlosframework/platform/internal/hostops" "github.com/carlosframework/platform/internal/release" ) const claimResponseUnavailable = "This operation is temporarily unavailable. Try again shortly." func claimResponseRefusal(err error) *doorRefusal { log.Printf("console: claim request refused: %v", err) // No box has room (region HA spec 2 ยง7, H27): every create door's 503. var full *noCapacityError if errors.As(err, &full) { return &doorRefusal{http.StatusServiceUnavailable, noCapacityRefusal(full.Region)} } if errors.Is(err, hostops.ErrPending) || errors.Is(err, hostclaim.ErrConflict) || errors.Is(err, hostclaim.ErrWrongState) || errors.Is(err, release.ErrCASConflict) { return &doorRefusal{http.StatusConflict, claimRetireBusyMsg} } return &doorRefusal{http.StatusServiceUnavailable, claimResponseUnavailable} } func writeClaimResponseError(w http.ResponseWriter, err error) { ref := claimResponseRefusal(err) w.Header().Set("Retry-After", "2") setNoCapacityRetryAfter(w, ref) jsonError(w, ref.Status, ref.Msg) } func (s *Server) renderClaimAccepted(w http.ResponseWriter, r *http.Request, subject, operation, phase string) { w.Header().Set("Retry-After", "2") 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)) }