mirror of
https://github.com/actions/actions-runner-controller.git
synced 2025-12-10 19:50:30 +00:00
This introduces a linter to PRs to help with code reviews and code hygiene. I've also gone ahead and fixed (or ignored) the existing lints. I've only setup the default linters right now. There are many more options that are documented at https://golangci-lint.run/. The GitHub Action should add appropriate annotations to the lint job for the PR. Contributors can also lint locally using `make lint`.
227 lines
5.9 KiB
Go
227 lines
5.9 KiB
Go
package fake
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
"unicode"
|
|
)
|
|
|
|
const (
|
|
RegistrationToken = "fake-registration-token"
|
|
|
|
RunnersListBody = `
|
|
{
|
|
"total_count": 2,
|
|
"runners": [
|
|
{"id": 1, "name": "test1", "os": "linux", "status": "online", "busy": false},
|
|
{"id": 2, "name": "test2", "os": "linux", "status": "offline", "busy": false}
|
|
]
|
|
}
|
|
`
|
|
)
|
|
|
|
type ListRunnersHandler struct {
|
|
Status int
|
|
Body string
|
|
}
|
|
|
|
func (h *ListRunnersHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|
w.WriteHeader(h.Status)
|
|
fmt.Fprintf(w, h.Body)
|
|
}
|
|
|
|
type Handler struct {
|
|
Status int
|
|
Body string
|
|
|
|
Statuses map[string]string
|
|
}
|
|
|
|
func (h *Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|
w.WriteHeader(h.Status)
|
|
|
|
status := req.URL.Query().Get("status")
|
|
if h.Statuses != nil {
|
|
if body, ok := h.Statuses[status]; ok {
|
|
fmt.Fprint(w, body)
|
|
return
|
|
}
|
|
}
|
|
|
|
fmt.Fprintf(w, h.Body)
|
|
}
|
|
|
|
type MapHandler struct {
|
|
Status int
|
|
Bodies map[int]string
|
|
}
|
|
|
|
func (h *MapHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|
// Parse out int key from URL path
|
|
key, err := strconv.Atoi(strings.TrimFunc(req.URL.Path, func(r rune) bool { return !unicode.IsNumber(r) }))
|
|
if err != nil {
|
|
w.WriteHeader(400)
|
|
} else if body := h.Bodies[key]; len(body) == 0 {
|
|
w.WriteHeader(404)
|
|
} else {
|
|
w.WriteHeader(h.Status)
|
|
fmt.Fprint(w, body)
|
|
}
|
|
}
|
|
|
|
type ServerConfig struct {
|
|
*FixedResponses
|
|
}
|
|
|
|
// NewServer creates a fake server for running unit tests
|
|
func NewServer(opts ...Option) *httptest.Server {
|
|
config := ServerConfig{
|
|
FixedResponses: &FixedResponses{},
|
|
}
|
|
|
|
for _, o := range opts {
|
|
o(&config)
|
|
}
|
|
|
|
routes := map[string]http.Handler{
|
|
// For CreateRegistrationToken
|
|
"/repos/test/valid/actions/runners/registration-token": &Handler{
|
|
Status: http.StatusCreated,
|
|
Body: fmt.Sprintf("{\"token\": \"%s\", \"expires_at\": \"%s\"}", RegistrationToken, time.Now().Add(time.Hour*1).Format(time.RFC3339)),
|
|
},
|
|
"/repos/test/invalid/actions/runners/registration-token": &Handler{
|
|
Status: http.StatusOK,
|
|
Body: fmt.Sprintf("{\"token\": \"%s\", \"expires_at\": \"%s\"}", RegistrationToken, time.Now().Add(time.Hour*1).Format(time.RFC3339)),
|
|
},
|
|
"/repos/test/error/actions/runners/registration-token": &Handler{
|
|
Status: http.StatusBadRequest,
|
|
Body: "",
|
|
},
|
|
"/orgs/test/actions/runners/registration-token": &Handler{
|
|
Status: http.StatusCreated,
|
|
Body: fmt.Sprintf("{\"token\": \"%s\", \"expires_at\": \"%s\"}", RegistrationToken, time.Now().Add(time.Hour*1).Format(time.RFC3339)),
|
|
},
|
|
"/orgs/invalid/actions/runners/registration-token": &Handler{
|
|
Status: http.StatusOK,
|
|
Body: fmt.Sprintf("{\"token\": \"%s\", \"expires_at\": \"%s\"}", RegistrationToken, time.Now().Add(time.Hour*1).Format(time.RFC3339)),
|
|
},
|
|
"/orgs/error/actions/runners/registration-token": &Handler{
|
|
Status: http.StatusBadRequest,
|
|
Body: "",
|
|
},
|
|
"/enterprises/test/actions/runners/registration-token": &Handler{
|
|
Status: http.StatusCreated,
|
|
Body: fmt.Sprintf("{\"token\": \"%s\", \"expires_at\": \"%s\"}", RegistrationToken, time.Now().Add(time.Hour*1).Format(time.RFC3339)),
|
|
},
|
|
"/enterprises/invalid/actions/runners/registration-token": &Handler{
|
|
Status: http.StatusOK,
|
|
Body: fmt.Sprintf("{\"token\": \"%s\", \"expires_at\": \"%s\"}", RegistrationToken, time.Now().Add(time.Hour*1).Format(time.RFC3339)),
|
|
},
|
|
"/enterprises/error/actions/runners/registration-token": &Handler{
|
|
Status: http.StatusBadRequest,
|
|
Body: "",
|
|
},
|
|
|
|
// For ListRunners
|
|
"/repos/test/valid/actions/runners": config.FixedResponses.ListRunners,
|
|
"/repos/test/invalid/actions/runners": &Handler{
|
|
Status: http.StatusNoContent,
|
|
Body: "",
|
|
},
|
|
"/repos/test/error/actions/runners": &Handler{
|
|
Status: http.StatusBadRequest,
|
|
Body: "",
|
|
},
|
|
"/orgs/test/actions/runners": &Handler{
|
|
Status: http.StatusOK,
|
|
Body: RunnersListBody,
|
|
},
|
|
"/orgs/invalid/actions/runners": &Handler{
|
|
Status: http.StatusNoContent,
|
|
Body: "",
|
|
},
|
|
"/orgs/error/actions/runners": &Handler{
|
|
Status: http.StatusBadRequest,
|
|
Body: "",
|
|
},
|
|
"/enterprises/test/actions/runners": &Handler{
|
|
Status: http.StatusOK,
|
|
Body: RunnersListBody,
|
|
},
|
|
"/enterprises/invalid/actions/runners": &Handler{
|
|
Status: http.StatusNoContent,
|
|
Body: "",
|
|
},
|
|
"/enterprises/error/actions/runners": &Handler{
|
|
Status: http.StatusBadRequest,
|
|
Body: "",
|
|
},
|
|
|
|
// For RemoveRunner
|
|
"/repos/test/valid/actions/runners/0": &Handler{
|
|
Status: http.StatusNoContent,
|
|
Body: "",
|
|
},
|
|
"/repos/test/valid/actions/runners/1": &Handler{
|
|
Status: http.StatusNoContent,
|
|
Body: "",
|
|
},
|
|
"/repos/test/invalid/actions/runners/1": &Handler{
|
|
Status: http.StatusOK,
|
|
Body: "",
|
|
},
|
|
"/repos/test/error/actions/runners/1": &Handler{
|
|
Status: http.StatusBadRequest,
|
|
Body: "",
|
|
},
|
|
"/orgs/test/actions/runners/1": &Handler{
|
|
Status: http.StatusNoContent,
|
|
Body: "",
|
|
},
|
|
"/orgs/invalid/actions/runners/1": &Handler{
|
|
Status: http.StatusOK,
|
|
Body: "",
|
|
},
|
|
"/orgs/error/actions/runners/1": &Handler{
|
|
Status: http.StatusBadRequest,
|
|
Body: "",
|
|
},
|
|
"/enterprises/test/actions/runners/1": &Handler{
|
|
Status: http.StatusNoContent,
|
|
Body: "",
|
|
},
|
|
"/enterprises/invalid/actions/runners/1": &Handler{
|
|
Status: http.StatusOK,
|
|
Body: "",
|
|
},
|
|
"/enterprises/error/actions/runners/1": &Handler{
|
|
Status: http.StatusBadRequest,
|
|
Body: "",
|
|
},
|
|
|
|
// For auto-scaling based on the number of queued(pending) workflow runs
|
|
"/repos/test/valid/actions/runs": config.FixedResponses.ListRepositoryWorkflowRuns,
|
|
|
|
// For auto-scaling based on the number of queued(pending) workflow jobs
|
|
"/repos/test/valid/actions/runs/": config.FixedResponses.ListWorkflowJobs,
|
|
}
|
|
|
|
mux := http.NewServeMux()
|
|
for path, handler := range routes {
|
|
mux.Handle(path, handler)
|
|
}
|
|
|
|
return httptest.NewServer(mux)
|
|
}
|
|
|
|
func DefaultListRunnersHandler() *ListRunnersHandler {
|
|
return &ListRunnersHandler{
|
|
Status: http.StatusOK,
|
|
Body: RunnersListBody,
|
|
}
|
|
}
|