carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1package console
2
3import (
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
14const claimResponseUnavailable = "This operation is temporarily unavailable. Try again shortly."
15
16func 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
29func 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
36func (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