parent
d1878c9e97
commit
aff2b077c0
|
@ -7,9 +7,11 @@ import (
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.dwysokinski.me/twhelp/corev3/internal/chislog"
|
"gitea.dwysokinski.me/twhelp/corev3/internal/chislog"
|
||||||
|
"gitea.dwysokinski.me/twhelp/corev3/internal/health"
|
||||||
"gitea.dwysokinski.me/twhelp/corev3/internal/port"
|
"gitea.dwysokinski.me/twhelp/corev3/internal/port"
|
||||||
"github.com/go-chi/chi/v5"
|
"github.com/go-chi/chi/v5"
|
||||||
"github.com/go-chi/chi/v5/middleware"
|
"github.com/go-chi/chi/v5/middleware"
|
||||||
|
@ -73,7 +75,10 @@ var (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
const apiBasePath = "/api"
|
const (
|
||||||
|
apiBasePath = "/api"
|
||||||
|
metaBasePath = "/_meta"
|
||||||
|
)
|
||||||
|
|
||||||
var cmdServe = &cli.Command{
|
var cmdServe = &cli.Command{
|
||||||
Name: "serve",
|
Name: "serve",
|
||||||
|
@ -95,6 +100,8 @@ var cmdServe = &cli.Command{
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
h := health.New()
|
||||||
|
|
||||||
server, err := newHTTPServer(
|
server, err := newHTTPServer(
|
||||||
httpServerConfig{
|
httpServerConfig{
|
||||||
port: c.Uint(apiServerPortFlag.Name),
|
port: c.Uint(apiServerPortFlag.Name),
|
||||||
|
@ -104,17 +111,16 @@ var cmdServe = &cli.Command{
|
||||||
idleTimeout: c.Duration(apiServerIdleTimeoutFlag.Name),
|
idleTimeout: c.Duration(apiServerIdleTimeoutFlag.Name),
|
||||||
},
|
},
|
||||||
func(r chi.Router) error {
|
func(r chi.Router) error {
|
||||||
r.Use(newAPIMiddlewares(logger)...)
|
|
||||||
|
|
||||||
oapiCfg, oapiCfgErr := newOpenAPIConfigFromFlags(c)
|
oapiCfg, oapiCfgErr := newOpenAPIConfigFromFlags(c)
|
||||||
if oapiCfgErr != nil {
|
if oapiCfgErr != nil {
|
||||||
return oapiCfgErr
|
return oapiCfgErr
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Mount(
|
r.Use(newAPIMiddlewares(logger)...)
|
||||||
apiBasePath,
|
|
||||||
port.NewAPIHTTPHandler(port.WithOpenAPIConfig(oapiCfg)),
|
r.Mount(metaBasePath, port.NewMetaHTTPHandler(h))
|
||||||
)
|
|
||||||
|
r.Mount(apiBasePath, port.NewAPIHTTPHandler(port.WithOpenAPIConfig(oapiCfg)))
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
@ -177,7 +183,9 @@ func newOpenAPIConfigFromFlags(c *cli.Context) (port.OpenAPIConfig, error) {
|
||||||
|
|
||||||
func newAPIMiddlewares(logger *slog.Logger) chi.Middlewares {
|
func newAPIMiddlewares(logger *slog.Logger) chi.Middlewares {
|
||||||
return chi.Middlewares{
|
return chi.Middlewares{
|
||||||
chislog.Logger(logger),
|
chislog.Logger(logger, chislog.WithFilter(func(r *http.Request) bool {
|
||||||
|
return !strings.HasPrefix(r.URL.Path, metaBasePath)
|
||||||
|
})),
|
||||||
middleware.Recoverer,
|
middleware.Recoverer,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,6 +92,7 @@ func TestOpenAPI(t *testing.T) {
|
||||||
defer require.NoError(t, resp.Body.Close())
|
defer require.NoError(t, resp.Body.Close())
|
||||||
assert.Equal(t, http.StatusOK, resp.StatusCode)
|
assert.Equal(t, http.StatusOK, resp.StatusCode)
|
||||||
assert.Equal(t, tt.expectedContentType, resp.Header.Get("Content-Type"))
|
assert.Equal(t, tt.expectedContentType, resp.Header.Get("Content-Type"))
|
||||||
|
_, _ = io.Copy(io.Discard, resp.Body)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
package port
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"gitea.dwysokinski.me/twhelp/corev3/internal/health"
|
||||||
|
"gitea.dwysokinski.me/twhelp/corev3/internal/health/healthhttp"
|
||||||
|
"github.com/go-chi/chi/v5"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewMetaHTTPHandler(h *health.Health) http.Handler {
|
||||||
|
r := chi.NewRouter()
|
||||||
|
|
||||||
|
r.Get("/livez", healthhttp.LiveHandler(h).ServeHTTP)
|
||||||
|
r.Get("/readyz", healthhttp.ReadyHandler(h).ServeHTTP)
|
||||||
|
|
||||||
|
return r
|
||||||
|
}
|
|
@ -15,6 +15,9 @@ spec:
|
||||||
- name: twhelp-api-v2
|
- name: twhelp-api-v2
|
||||||
image: twhelp
|
image: twhelp
|
||||||
args: [serve]
|
args: [serve]
|
||||||
|
ports:
|
||||||
|
- name: container-port
|
||||||
|
containerPort: 9234
|
||||||
env:
|
env:
|
||||||
- name: APP_MODE
|
- name: APP_MODE
|
||||||
value: development
|
value: development
|
||||||
|
@ -37,6 +40,18 @@ spec:
|
||||||
limits:
|
limits:
|
||||||
cpu: 200m
|
cpu: 200m
|
||||||
memory: 300Mi
|
memory: 300Mi
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /_meta/livez
|
||||||
|
port: container-port
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /_meta/readyz
|
||||||
|
port: container-port
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
---
|
---
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
|
|
Loading…
Reference in New Issue