diff --git a/cmd/controller_setup.go b/cmd/controller_setup.go index 118ef3518..e6e2d03bc 100644 --- a/cmd/controller_setup.go +++ b/cmd/controller_setup.go @@ -32,7 +32,7 @@ import ( "time" "github.com/avfs/avfs/vfs/osfs" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/nats-io/nats.go" "github.com/nats-io/nats.go/jetstream" natsclient "github.com/osapi-io/nats-client/pkg/client" diff --git a/go.mod b/go.mod index bf61e1974..f738c9472 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,8 @@ require ( github.com/go-playground/validator/v10 v10.30.4 github.com/golang-jwt/jwt/v4 v4.5.2 github.com/google/uuid v1.6.0 - github.com/labstack/echo/v4 v4.15.4 + github.com/labstack/echo-opentelemetry v0.0.3 + github.com/labstack/echo/v5 v5.3.1 github.com/lmittmann/tint v1.2.0 github.com/nats-io/nats-server/v2 v2.14.6 github.com/nats-io/nats.go v1.53.1 @@ -23,12 +24,10 @@ require ( github.com/prometheus-community/pro-bing v0.9.1 github.com/prometheus/client_golang v1.24.1 github.com/robfig/cron/v3 v3.0.1 - github.com/samber/slog-echo v1.23.0 github.com/shirou/gopsutil/v4 v4.26.8 github.com/spf13/cobra v1.10.2 github.com/spf13/viper v1.21.0 github.com/stretchr/testify v1.12.1 - go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho v0.69.0 go.opentelemetry.io/otel v1.46.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.46.0 @@ -45,28 +44,29 @@ require ( ) require ( - 4d63.com/gocheckcompilerdirectives v1.3.0 // indirect + 4d63.com/gocheckcompilerdirectives v1.4.0 // indirect 4d63.com/gochecknoglobals v0.2.2 // indirect - charm.land/lipgloss/v2 v2.0.3 // indirect + charm.land/lipgloss/v2 v2.0.6 // indirect codeberg.org/chavacava/garif v0.2.0 // indirect codeberg.org/polyfloyd/go-errorlint v1.9.0 // indirect dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect - dev.gaijin.team/go/golib v0.6.0 // indirect + dev.gaijin.team/go/exhaustruct/v5 v5.0.3 // indirect + dev.gaijin.team/go/golib v0.8.1 // indirect github.com/4meepo/tagalign v1.4.3 // indirect - github.com/Abirdcfly/dupword v0.1.7 // indirect + github.com/Abirdcfly/dupword v0.1.8 // indirect github.com/AdminBenni/iota-mixing v1.0.0 // indirect - github.com/AlwxSin/noinlineerr v1.0.5 // indirect - github.com/Antonboom/errname v1.1.1 // indirect - github.com/Antonboom/nilnil v1.1.1 // indirect + github.com/AlwxSin/noinlineerr v1.0.6 // indirect + github.com/Antonboom/errname v1.1.2 // indirect + github.com/Antonboom/nilnil v1.1.2 // indirect github.com/Antonboom/testifylint v1.6.4 // indirect github.com/BurntSushi/toml v1.6.0 // indirect - github.com/ClickHouse/clickhouse-go-linter v1.2.0 // indirect + github.com/ClickHouse/clickhouse-go-linter v1.2.1 // indirect github.com/Djarvur/go-err113 v0.1.1 // indirect github.com/Masterminds/semver/v3 v3.5.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/MirrexOne/unqueryvet v1.5.4 // indirect github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect - github.com/alecthomas/chroma/v2 v2.24.1 // indirect + github.com/alecthomas/chroma/v2 v2.27.0 // indirect github.com/alecthomas/go-check-sumtype v0.3.1 // indirect github.com/alecthomas/kingpin/v2 v2.4.0 // indirect github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect @@ -84,20 +84,20 @@ require ( github.com/bkielbasa/cyclop v1.2.3 // indirect github.com/blizzy78/varnamelen v0.8.0 // indirect github.com/bombsimon/wsl/v4 v4.7.0 // indirect - github.com/bombsimon/wsl/v5 v5.8.0 // indirect + github.com/bombsimon/wsl/v5 v5.9.0 // indirect github.com/boumenot/gocover-cobertura v1.5.0 // indirect github.com/breml/bidichk v0.3.3 // indirect github.com/breml/errchkjson v0.4.1 // indirect github.com/butuzov/ireturn v0.4.1 // indirect - github.com/butuzov/mirror v1.3.0 // indirect + github.com/butuzov/mirror v1.3.3 // indirect github.com/catenacyber/perfsprint v0.10.1 // indirect github.com/ccojocar/zxcvbn-go v1.0.4 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charithe/durationcheck v0.0.11 // indirect github.com/charmbracelet/colorprofile v0.4.3 // indirect - github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318 // indirect - github.com/charmbracelet/x/ansi v0.11.7 // indirect + github.com/charmbracelet/ultraviolet v0.0.0-20260811164956-006e29f97886 // indirect + github.com/charmbracelet/x/ansi v0.11.8 // indirect github.com/charmbracelet/x/cellbuf v0.0.15 // indirect github.com/charmbracelet/x/term v0.2.2 // indirect github.com/charmbracelet/x/termios v0.1.1 // indirect @@ -114,6 +114,7 @@ require ( github.com/denis-tingaikin/go-header v0.5.0 // indirect github.com/distribution/reference v0.6.0 // indirect github.com/dlclark/regexp2 v1.12.0 // indirect + github.com/dlclark/regexp2/v2 v2.2.1 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 // indirect github.com/ebitengine/purego v0.10.2 // indirect @@ -121,12 +122,12 @@ require ( github.com/fatih/color v1.19.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect - github.com/firefart/nonamedreturns v1.0.6 // indirect + github.com/firefart/nonamedreturns v1.0.8 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect github.com/gabriel-vasile/mimetype v1.4.15 // indirect - github.com/ghostiam/protogetter v0.3.20 // indirect - github.com/go-critic/go-critic v0.14.3 // indirect + github.com/ghostiam/protogetter v0.3.21 // indirect + github.com/go-critic/go-critic v0.14.4 // indirect github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect @@ -145,10 +146,11 @@ require ( github.com/godoc-lint/godoc-lint v0.11.2 // indirect github.com/gofrs/flock v0.13.0 // indirect github.com/golangci/asciicheck v0.5.0 // indirect + github.com/golangci/canonicalheader v0.0.0-20260827115959-a25c71c521f6 // indirect github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 // indirect github.com/golangci/go-printf-func-name v0.1.1 // indirect - github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect - github.com/golangci/golangci-lint/v2 v2.12.2 // indirect + github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792 // indirect + github.com/golangci/golangci-lint/v2 v2.13.2 // indirect github.com/golangci/golines v0.15.0 // indirect github.com/golangci/misspell v0.8.0 // indirect github.com/golangci/plugin-module-register v0.1.2 // indirect @@ -168,25 +170,25 @@ require ( github.com/hashicorp/go-version v1.9.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect - github.com/jgautheron/goconst v1.10.0 // indirect + github.com/jgautheron/goconst v1.11.0 // indirect github.com/jjti/go-spancheck v0.6.5 // indirect github.com/julz/importas v0.2.0 // indirect github.com/karamaru-alpha/copyloopvar v1.2.2 // indirect - github.com/kisielk/errcheck v1.10.0 // indirect + github.com/kisielk/errcheck v1.20.0 // indirect github.com/kkHAIKE/contextcheck v1.1.6 // indirect github.com/klauspost/compress v1.19.2 // indirect github.com/kulti/thelper v0.7.1 // indirect github.com/kunwardeep/paralleltest v1.0.15 // indirect github.com/lasiar/canonicalheader v1.1.2 // indirect github.com/ldez/exptostd v0.4.5 // indirect - github.com/ldez/gomoddirectives v0.8.0 // indirect + github.com/ldez/gomoddirectives v0.9.0 // indirect github.com/ldez/grignotin v0.10.1 // indirect github.com/ldez/structtags v0.6.1 // indirect github.com/ldez/tagliatelle v0.7.2 // indirect github.com/ldez/usetesting v0.5.0 // indirect github.com/leodido/go-urn v1.5.0 // indirect github.com/leonklingele/grouper v1.1.2 // indirect - github.com/lucasb-eyer/go-colorful v1.4.0 // indirect + github.com/lucasb-eyer/go-colorful v1.4.1 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/macabu/inamedparam v0.2.0 // indirect github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect @@ -194,7 +196,7 @@ require ( github.com/maratori/testableexamples v1.0.1 // indirect github.com/maratori/testpackage v1.1.2 // indirect github.com/matoous/godox v1.1.0 // indirect - github.com/mattn/go-runewidth v0.0.23 // indirect + github.com/mattn/go-runewidth v0.0.24 // indirect github.com/mgechev/revive v1.15.0 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/minio/highwayhash v1.0.4 // indirect @@ -213,12 +215,12 @@ require ( github.com/nats-io/nuid v1.0.1 // indirect github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nunnatsa/ginkgolinter v0.23.0 // indirect + github.com/nunnatsa/ginkgolinter v0.24.0 // indirect github.com/oapi-codegen/oapi-codegen/v2 v2.7.1 // indirect github.com/oasdiff/yaml v0.1.1 // indirect github.com/oasdiff/yaml3 v0.0.14 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/pelletier/go-toml/v2 v2.3.1 // indirect + github.com/pelletier/go-toml/v2 v2.4.3 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect @@ -231,27 +233,26 @@ require ( github.com/quasilyte/gogrep v0.5.0 // indirect github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect - github.com/raeperd/recvcheck v0.2.0 // indirect + github.com/raeperd/recvcheck v0.3.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.15.0 // indirect + github.com/rogpeppe/go-internal v1.16.0 // indirect github.com/ryancurrah/gomodguard v1.4.1 // indirect github.com/ryancurrah/gomodguard/v2 v2.1.3 // indirect github.com/ryanrolds/sqlclosecheck v0.6.0 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect - github.com/samber/lo v1.52.0 // indirect github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect - github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect + github.com/santhosh-tekuri/jsonschema/v6 v6.0.3 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect - github.com/securego/gosec/v2 v2.26.1 // indirect + github.com/securego/gosec/v2 v2.28.0 // indirect github.com/segmentio/golines v0.13.0 // indirect - github.com/sirupsen/logrus v1.9.4 // indirect + github.com/sirupsen/logrus v1.10.1 // indirect github.com/sivchari/containedctx v1.0.3 // indirect github.com/sonatard/noctx v0.5.1 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/sourcegraph/go-diff v0.8.0 // indirect github.com/speakeasy-api/jsonpath v0.6.3 // indirect - github.com/speakeasy-api/openapi v1.19.2 // indirect + github.com/speakeasy-api/openapi v1.24.0 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/spf13/cobra-cli v1.3.0 // indirect @@ -269,7 +270,7 @@ require ( github.com/ultraware/funlen v0.2.0 // indirect github.com/ultraware/whitespace v0.2.0 // indirect github.com/uudashr/gocognit v1.2.1 // indirect - github.com/uudashr/iface v1.4.2 // indirect + github.com/uudashr/iface v1.5.1 // indirect github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect github.com/xen0n/gosmopolitan v1.3.0 // indirect @@ -283,14 +284,15 @@ require ( go-simpler.org/musttag v0.14.0 // indirect go-simpler.org/sloglint v0.12.0 // indirect go.augendre.info/arangolint v0.4.0 // indirect - go.augendre.info/fatcontext v0.9.0 // indirect + go.augendre.info/fatcontext v0.10.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.44.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go.yaml.in/yaml/v3 v3.0.5 // indirect - golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 // indirect + golang.org/x/exp/typeparams v0.0.0-20260811152304-ee035b5b010f // indirect golang.org/x/sync v0.22.0 // indirect golang.org/x/time v0.15.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260819154853-08b0e4226688 // indirect @@ -298,9 +300,9 @@ require ( google.golang.org/grpc v1.83.2 // indirect google.golang.org/protobuf v1.36.12 // indirect gotest.tools/v3 v3.5.2 // indirect - honnef.co/go/tools v0.7.0 // indirect - mvdan.cc/gofumpt v0.11.0 // indirect - mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 // indirect + honnef.co/go/tools v0.8.1 // indirect + mvdan.cc/gofumpt v0.12.0 // indirect + mvdan.cc/unparam v0.0.0-20260823230713-2fa3d841b0c8 // indirect ) require ( @@ -308,18 +310,15 @@ require ( github.com/getkin/kin-openapi v0.144.0 // indirect github.com/go-openapi/jsonpointer v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/labstack/gommon v0.5.0 // indirect github.com/mattn/go-colorable v0.1.15 // indirect github.com/mattn/go-isatty v0.0.22 // indirect github.com/spf13/pflag v1.0.10 // indirect - github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasttemplate v1.2.2 // indirect golang.org/x/crypto v0.55.0 // indirect - golang.org/x/mod v0.38.0 // indirect + golang.org/x/mod v0.40.0 // indirect golang.org/x/net v0.58.0 // indirect golang.org/x/sys v0.47.0 // indirect golang.org/x/text v0.41.0 // indirect - golang.org/x/tools v0.48.0 // indirect + golang.org/x/tools v0.49.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 287741c8b..22a22c7a8 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,13 @@ 4d63.com/gocheckcompilerdirectives v1.3.0 h1:Ew5y5CtcAAQeTVKUVFrE7EwHMrTO6BggtEj8BZSjZ3A= 4d63.com/gocheckcompilerdirectives v1.3.0/go.mod h1:ofsJ4zx2QAuIP/NO/NAh1ig6R1Fb18/GI7RVMwz7kAY= +4d63.com/gocheckcompilerdirectives v1.4.0 h1:ZLq62rbGWVmQhiZ8kuNVIT/M09xCSTdJz9K3xOdT/CY= +4d63.com/gocheckcompilerdirectives v1.4.0/go.mod h1:9ZOAiMOjqC/nRwci2fcUXVHUNLG/cH6r6rhUh+jTFtQ= 4d63.com/gochecknoglobals v0.2.2 h1:H1vdnwnMaZdQW/N+NrkT1SZMTBmcwHe9Vq8lJcYYTtU= 4d63.com/gochecknoglobals v0.2.2/go.mod h1:lLxwTQjL5eIesRbvnzIP3jZtG140FnTdz+AlMa+ogt0= charm.land/lipgloss/v2 v2.0.3 h1:yM2zJ4Cf5Y51b7RHIwioil4ApI/aypFXXVHSwlM6RzU= charm.land/lipgloss/v2 v2.0.3/go.mod h1:7myLU9iG/3xluAWzpY/fSxYYHCgoKTie7laxk6ATwXA= +charm.land/lipgloss/v2 v2.0.6 h1:EaGKeuA8FvF+v2BT5VmZd2LoYLaMZJXA5n34th8nCIQ= +charm.land/lipgloss/v2 v2.0.6/go.mod h1:ipDDJNSGa1hlwDtSfW1s2/xR8Vdhbut4PXh2zEKZd0Q= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -57,21 +61,33 @@ codeberg.org/polyfloyd/go-errorlint v1.9.0 h1:VkdEEmA1VBpH6ecQoMR4LdphVI3fA4RrCh codeberg.org/polyfloyd/go-errorlint v1.9.0/go.mod h1:GPRRu2LzVijNn4YkrZYJfatQIdS+TrcK8rL5Xs24qw8= dev.gaijin.team/go/exhaustruct/v4 v4.0.0 h1:873r7aNneqoBB3IaFIzhvt2RFYTuHgmMjoKfwODoI1Y= dev.gaijin.team/go/exhaustruct/v4 v4.0.0/go.mod h1:aZ/k2o4Y05aMJtiux15x8iXaumE88YdiB0Ai4fXOzPI= +dev.gaijin.team/go/exhaustruct/v5 v5.0.3 h1:yOeA7DNjlT8y4yfmN6nWWYYggA13N523YAj9/TXbuTM= +dev.gaijin.team/go/exhaustruct/v5 v5.0.3/go.mod h1:KwtBsX8nHHH1YxhxkpiBq6bfsmw5WnazWpNvJPHgY9Y= dev.gaijin.team/go/golib v0.6.0 h1:v6nnznFTs4bppib/NyU1PQxobwDHwCXXl15P7DV5Zgo= dev.gaijin.team/go/golib v0.6.0/go.mod h1:uY1mShx8Z/aNHWDyAkZTkX+uCi5PdX7KsG1eDQa2AVE= +dev.gaijin.team/go/golib v0.8.1 h1:JYju4x9BSo+QD/AYeHULVDcvEhiFg8wOi6pT0IaZF5E= +dev.gaijin.team/go/golib v0.8.1/go.mod h1:c5fu7t1RSGMxSQgcUYO1sODbzsYnOCXJLmHeNG1Eb+0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/4meepo/tagalign v1.4.3 h1:Bnu7jGWwbfpAie2vyl63Zup5KuRv21olsPIha53BJr8= github.com/4meepo/tagalign v1.4.3/go.mod h1:00WwRjiuSbrRJnSVeGWPLp2epS5Q/l4UEy0apLLS37c= github.com/Abirdcfly/dupword v0.1.7 h1:2j8sInznrje4I0CMisSL6ipEBkeJUJAmK1/lfoNGWrQ= github.com/Abirdcfly/dupword v0.1.7/go.mod h1:K0DkBeOebJ4VyOICFdppB23Q0YMOgVafM0zYW0n9lF4= +github.com/Abirdcfly/dupword v0.1.8 h1:SrhcUuGsROBuChFxHALRYzyyPODWn9zwghmzPvD9Cd8= +github.com/Abirdcfly/dupword v0.1.8/go.mod h1:XZrhVnI7YGpsTiWZANSQaBJ4QpL/Tq5vIEdKJJAs9WI= github.com/AdminBenni/iota-mixing v1.0.0 h1:Os6lpjG2dp/AE5fYBPAA1zfa2qMdCAWwPMCgpwKq7wo= github.com/AdminBenni/iota-mixing v1.0.0/go.mod h1:i4+tpAaB+qMVIV9OK3m4/DAynOd5bQFaOu+2AhtBCNY= github.com/AlwxSin/noinlineerr v1.0.5 h1:RUjt63wk1AYWTXtVXbSqemlbVTb23JOSRiNsshj7TbY= github.com/AlwxSin/noinlineerr v1.0.5/go.mod h1:+QgkkoYrMH7RHvcdxdlI7vYYEdgeoFOVjU9sUhw/rQc= +github.com/AlwxSin/noinlineerr v1.0.6 h1:KAvuxunTe9QxvqrFB7nZTdb/7Wzas4AvifslTnG0Ld8= +github.com/AlwxSin/noinlineerr v1.0.6/go.mod h1:+QgkkoYrMH7RHvcdxdlI7vYYEdgeoFOVjU9sUhw/rQc= github.com/Antonboom/errname v1.1.1 h1:bllB7mlIbTVzO9jmSWVWLjxTEbGBVQ1Ff/ClQgtPw9Q= github.com/Antonboom/errname v1.1.1/go.mod h1:gjhe24xoxXp0ScLtHzjiXp0Exi1RFLKJb0bVBtWKCWQ= +github.com/Antonboom/errname v1.1.2 h1:dxwONZJua3VB8Xh/VaCjqAcqF645sWWv7xj26zy7tdQ= +github.com/Antonboom/errname v1.1.2/go.mod h1:YeZIpgLMxT+SNkruGgYkLhzq/9vs3fsolTZegKaKDZI= github.com/Antonboom/nilnil v1.1.1 h1:9Mdr6BYd8WHCDngQnNVV0b554xyisFioEKi30sksufQ= github.com/Antonboom/nilnil v1.1.1/go.mod h1:yCyAmSw3doopbOWhJlVci+HuyNRuHJKIv6V2oYQa8II= +github.com/Antonboom/nilnil v1.1.2 h1:aNlFuJhaEseXe4fHO3xbjXlSeEiQVYa2lEkWD2s2hAY= +github.com/Antonboom/nilnil v1.1.2/go.mod h1:0ynwvphOLmAuMwTNDyBnDZmSwZoDpcFXmUHmzoHH2WA= github.com/Antonboom/testifylint v1.6.4 h1:gs9fUEy+egzxkEbq9P4cpcMB6/G0DYdMeiFS87UiqmQ= github.com/Antonboom/testifylint v1.6.4/go.mod h1:YO33FROXX2OoUfwjz8g+gUxQXio5i9qpVy7nXGbxDD4= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= @@ -82,6 +98,8 @@ github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ClickHouse/clickhouse-go-linter v1.2.0 h1:zbm174up3hTKjp0wKZVnTzRiG7tSF5XZF0FJG/MuCBI= github.com/ClickHouse/clickhouse-go-linter v1.2.0/go.mod h1:pLorS7ffPTfuUV9M0SJgfHA/h/WQPQUk2FWG9x74cQ4= +github.com/ClickHouse/clickhouse-go-linter v1.2.1 h1:zGEKIyd5YL08ieWG/LOUmlau2DxbxPVOfAeo+4Jz3ck= +github.com/ClickHouse/clickhouse-go-linter v1.2.1/go.mod h1:pLorS7ffPTfuUV9M0SJgfHA/h/WQPQUk2FWG9x74cQ4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Djarvur/go-err113 v0.1.1 h1:eHfopDqXRwAi+YmCUas75ZE0+hoBHJ2GQNLYRSxao4g= github.com/Djarvur/go-err113 v0.1.1/go.mod h1:IaWJdYFLg76t2ihfflPZnM1LIQszWOsFDh2hhhAVF6k= @@ -99,6 +117,8 @@ github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8v github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= github.com/alecthomas/chroma/v2 v2.24.1 h1:m5ffpfZbIb++k8AqFEKy9uVgY12xIQtBsQlc6DfZJQM= github.com/alecthomas/chroma/v2 v2.24.1/go.mod h1:l+ohZ9xRXIbGe7cIW+YZgOGbvuVLjMps/FYN/CwuabI= +github.com/alecthomas/chroma/v2 v2.27.0 h1:FodwmyOBgJULFYmDqibcp9pvfDLWdtPRh9v/r5BXYZs= +github.com/alecthomas/chroma/v2 v2.27.0/go.mod h1:NjJ3ciIgrqBNeIkWZ4e46nseoLDslxU1LmfCoL+wcY8= github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU= github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E= github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= @@ -153,6 +173,8 @@ github.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+j github.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg= github.com/bombsimon/wsl/v5 v5.8.0 h1:JTkyfs4yl8SPejrCF2GdABXE+mO1WvM7iUYzRWlsxDs= github.com/bombsimon/wsl/v5 v5.8.0/go.mod h1:AbOLsulgkqP4ZnitHf9gwPtCOGlrzkk0jb0uNxRSY0o= +github.com/bombsimon/wsl/v5 v5.9.0 h1:WCrgZ7RQnZO5oEwbVTlYgBdU3wL294kR1BSWV8vTfsU= +github.com/bombsimon/wsl/v5 v5.9.0/go.mod h1:kjo4HiAV5FDkHC8/uzJq9mBffEEd6WT/nvN7DoMovDM= github.com/boumenot/gocover-cobertura v1.5.0 h1:S2eXZ5snlTl+IGLXiM0litlpy9gf8AU8NagMaxX3nZM= github.com/boumenot/gocover-cobertura v1.5.0/go.mod h1:iB1/+oDwfRlsDzABskkid0cNdQ1A+u3O91XUJZWqgtg= github.com/breml/bidichk v0.3.3 h1:WSM67ztRusf1sMoqH6/c4OBCUlRVTKq+CbSeo0R17sE= @@ -163,6 +185,8 @@ github.com/butuzov/ireturn v0.4.1 h1:vWb3NO4t77iku/sjCQ/2pHTQeOmxEhjIriJqRLg1Y+I github.com/butuzov/ireturn v0.4.1/go.mod h1:q+DXKzTDV5guNuXLnIab9fKXizTn2miZHLhxH7V/GB4= github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc= github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI= +github.com/butuzov/mirror v1.3.3 h1:v0RsWBhfFc1RQqE/f3sHpSttKDtodFn0gFmtYyD4/hA= +github.com/butuzov/mirror v1.3.3/go.mod h1:h9BzzwYnTiHO0GzgvaTqIg7VSsOUhdIv51cHFFBmX1w= github.com/caarlos0/go-version v0.2.2 h1:5r+nlrg4H2wOVwWjqRqRRIRbZ7ytRmjC9xoMIP0a5kQ= github.com/caarlos0/go-version v0.2.2/go.mod h1:X+rI5VAtJDpcjCjeEIXpxGa5+rTcgur1FK66wS0/944= github.com/catenacyber/perfsprint v0.10.1 h1:u7Riei30bk46XsG8nknMhKLXG9BcXz3+3tl/WpKm0PQ= @@ -186,8 +210,12 @@ github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoF github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318 h1:OqDqxQZliC7C8adA7KjelW3OjtAxREfeHkNcd66wpeI= github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318/go.mod h1:Y6kE2GzHfkyQQVCSL9r2hwokSrIlHGzZG+71+wDYSZI= +github.com/charmbracelet/ultraviolet v0.0.0-20260811164956-006e29f97886 h1:rdnVWKgJpTVXKuKuJyxDJ+NFJdUaUqGvyGy61OcvlbA= +github.com/charmbracelet/ultraviolet v0.0.0-20260811164956-006e29f97886/go.mod h1:nAw0d9PhFp1qdzi2xhQU5YOu5sVpDIHWlaW2Uz/bCro= github.com/charmbracelet/x/ansi v0.11.7 h1:kzv1kJvjg2S3r9KHo8hDdHFQLEqn4RBCb39dAYC84jI= github.com/charmbracelet/x/ansi v0.11.7/go.mod h1:9qGpnAVYz+8ACONkZBUWPtL7lulP9No6p1epAihUZwQ= +github.com/charmbracelet/x/ansi v0.11.8 h1:JMFwp0CgDC2+jcOB162HH5k7I3FVbgFSMMYg7dSPBQQ= +github.com/charmbracelet/x/ansi v0.11.8/go.mod h1:ZNN+3mXny/516oTQPLMPIBeSINvNJJQ8uQXDgbeJxY0= github.com/charmbracelet/x/cellbuf v0.0.15 h1:ur3pZy0o6z/R7EylET877CBxaiE1Sp1GMxoFPAIztPI= github.com/charmbracelet/x/cellbuf v0.0.15/go.mod h1:J1YVbR7MUuEGIFPCaaZ96KDl5NoS0DAWkskup+mOY+Q= github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk= @@ -244,6 +272,8 @@ github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5Qvfr github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dlclark/regexp2 v1.12.0 h1:0j4c5qQmnC6XOWNjP3PIXURXN2gWx76rd3KvgdPkCz8= github.com/dlclark/regexp2 v1.12.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dlclark/regexp2/v2 v2.2.1 h1:mf4KkFUj0gJuarK8P+LgiS+Lit7m9N1yAwEfPbee7R0= +github.com/dlclark/regexp2/v2 v2.2.1/go.mod h1:avUrQvPaLz2DrFNHJF0taWAFFX2C1GMSSoeiqFjcBmU= github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.8.1 h1:JibmG5hULs5qXSr/cp/w3Pw5fZuStt4MOHMUExb29/M= @@ -279,6 +309,8 @@ github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeO github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= github.com/firefart/nonamedreturns v1.0.6 h1:vmiBcKV/3EqKY3ZiPxCINmpS431OcE1S47AQUwhrg8E= github.com/firefart/nonamedreturns v1.0.6/go.mod h1:R8NisJnSIpvPWheCq0mNRXJok6D8h7fagJTF8EMEwCo= +github.com/firefart/nonamedreturns v1.0.8 h1:iB32Dl17zJl1zlVEj/WlUWgx0HiRyQ85OUw1WHa4/II= +github.com/firefart/nonamedreturns v1.0.8/go.mod h1:vxFNvm5AfP/8rgAKFzYmnqx0yp1HjrYsErZ9pHPTznA= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -297,8 +329,12 @@ github.com/ggwhite/go-masker/v2 v2.4.2/go.mod h1:Xky8hDSkBwV7pwCJvFsJaiFVwU9GCt0 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghostiam/protogetter v0.3.20 h1:oW7OPFit2FxZOpmMRPP9FffU4uUpfeE/rEdE1f+MzD0= github.com/ghostiam/protogetter v0.3.20/go.mod h1:FjIu5Yfs6FT391m+Fjp3fbAYJ6rkL/J6ySpZBfnODuI= +github.com/ghostiam/protogetter v0.3.21 h1:EeWTGvL/Eyosp653hiWb6Byx4b69iJC4/E+za7vQHoI= +github.com/ghostiam/protogetter v0.3.21/go.mod h1:iAKSpyoHwYzay+OpjoWgwzRtPFthEfuUvmlomTThck0= github.com/go-critic/go-critic v0.14.3 h1:5R1qH2iFeo4I/RJU8vTezdqs08Egi4u5p6vOESA0pog= github.com/go-critic/go-critic v0.14.3/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ= +github.com/go-critic/go-critic v0.14.4 h1:dSX4C3pWSeuMVxvQh6yG8U0ReSf3YOmKi4nwX5q7n/8= +github.com/go-critic/go-critic v0.14.4/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -403,14 +439,20 @@ github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/asciicheck v0.5.0 h1:jczN/BorERZwK8oiFBOGvlGPknhvq0bjnysTj4nUfo0= github.com/golangci/asciicheck v0.5.0/go.mod h1:5RMNAInbNFw2krqN6ibBxN/zfRFa9S6tA1nPdM0l8qQ= +github.com/golangci/canonicalheader v0.0.0-20260827115959-a25c71c521f6 h1:fVLolA3dG6s0brGetsiDAtcnpMSwVa2LqXJEw/9RJG4= +github.com/golangci/canonicalheader v0.0.0-20260827115959-a25c71c521f6/go.mod h1:1xo+NFW5S+bEf2DKXhaxuzvcDN5AR6o/KMwvqC5Mkpo= github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 h1:CbTB8KpqnViI6lIXxp03Oclc4VFHi3K4BWC1TacsZ+A= github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E= github.com/golangci/go-printf-func-name v0.1.1 h1:hIYTFJqAGp1iwoIfsNTpoq1xZAarogrvjO9AfiW3B4U= github.com/golangci/go-printf-func-name v0.1.1/go.mod h1:Es64MpWEZbh0UBtTAICOZiB+miW53w/K9Or/4QogJss= github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE= github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY= +github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792 h1:WL8YKrt3UbOBqSRU7GpP5BTtQTMWtVtj+mfPijgZeIg= +github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792/go.mod h1:te5hX0dW4C5r6YbXs+6ysNr8Q5UTmdIqGbb+mlFiYmA= github.com/golangci/golangci-lint/v2 v2.12.2 h1:7+d1uY0bq1MU2UV3R5pW5Q7QWdcoq4naMRXM+gsJKrs= github.com/golangci/golangci-lint/v2 v2.12.2/go.mod h1:opqHHuIcTG2R+4akzWMd4o1BnD9/1LcjICWOujr91U8= +github.com/golangci/golangci-lint/v2 v2.13.2 h1:bCyq3E4vo9qwzifjpzJqYndEt7Ncva80qkk8G2B4TXU= +github.com/golangci/golangci-lint/v2 v2.13.2/go.mod h1:5xaMd1kAxV7GSBPEyngw8gnnjoRocqW9UVKdBR6627w= github.com/golangci/golines v0.15.0 h1:Qnph25g8Y1c5fdo1X7GaRDGgnMHgnxh4Gk4VfPTtRx0= github.com/golangci/golines v0.15.0/go.mod h1:AZjXd23tbHMpowhtnGlj9KCNsysj72aeZVVHnVcZx10= github.com/golangci/misspell v0.8.0 h1:qvxQhiE2/5z+BVRo1kwYA8yGz+lOlu5Jfvtx2b04Jbg= @@ -466,6 +508,7 @@ github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc= github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= +github.com/google/pprof v0.0.0-20260709232956-b9395ee17fa0 h1:du0WGc8xSKq/++e0cglxhS/mXVqsR7+c7jLEi5Vqduw= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -542,6 +585,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jgautheron/goconst v1.10.0 h1:Ptt+OoE4NaEWKhLrWrrN3IpZdGLiqaf7WLnEX/iv4Jw= github.com/jgautheron/goconst v1.10.0/go.mod h1:0p+wv1lFOiUr0IlNNT1nrm6+8DB8u2sU6KHGzFRXHDc= +github.com/jgautheron/goconst v1.11.0 h1:KgN90z5qXt5f0Uzf3cWXev3hfMMFUyNeKdpkSBRvLDk= +github.com/jgautheron/goconst v1.11.0/go.mod h1:0p+wv1lFOiUr0IlNNT1nrm6+8DB8u2sU6KHGzFRXHDc= github.com/jjti/go-spancheck v0.6.5 h1:lmi7pKxa37oKYIMScialXUK6hP3iY5F1gu+mLBPgYB8= github.com/jjti/go-spancheck v0.6.5/go.mod h1:aEogkeatBrbYsyW6y5TgDfihCulDYciL1B7rG2vSsrU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -559,6 +604,8 @@ github.com/karamaru-alpha/copyloopvar v1.2.2/go.mod h1:oY4rGZqZ879JkJMtX3RRkcXRk github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.10.0 h1:Lvs/YAHP24YKg08LA8oDw2z9fJVme090RAXd90S+rrw= github.com/kisielk/errcheck v1.10.0/go.mod h1:kQxWMMVZgIkDq7U8xtG/n2juOjbLgZtedi0D+/VL/i8= +github.com/kisielk/errcheck v1.20.0 h1:9rwHBNKzd4wkDWcROy3DvFGNqEPlkxBg305rvk7HabI= +github.com/kisielk/errcheck v1.20.0/go.mod h1:O+f80MKNwX8Oor2jwgpeQ9An7uJm+hRSgT+h22knRJU= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkHAIKE/contextcheck v1.1.6 h1:7HIyRcnyzxL9Lz06NGhiKvenXq7Zw6Q0UQu/ttjfJCE= github.com/kkHAIKE/contextcheck v1.1.6/go.mod h1:3dDbMRNBFaq8HFXWC1JyvDSPm43CmE6IuHam8Wr0rkg= @@ -581,16 +628,18 @@ github.com/kunwardeep/paralleltest v1.0.15 h1:ZMk4Qt306tHIgKISHWFJAO1IDQJLc6uDyJ github.com/kunwardeep/paralleltest v1.0.15/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.15.4 h1:DL45vVYa+BWE+XuW+zZNd9H0YEdZ80UAWJGcTVW4EVs= -github.com/labstack/echo/v4 v4.15.4/go.mod h1:CuMetKIRwsuO/qlAgMq+KTAalwGoB/h4tC+yPdrTj1g= -github.com/labstack/gommon v0.5.0 h1:6VSQ2NOzsnEJ5W6+84E0RbcaDDmgB6NIAzWCczTEe6c= -github.com/labstack/gommon v0.5.0/go.mod h1:Rzlg7HHy1maLfzBYGg9NZcVuz1sA68HHhLjhcEllYE0= +github.com/labstack/echo-opentelemetry v0.0.3 h1:r4HAlV3PniSlUmsqpXQ+YwFxo9RNuEOm2bGU9hAOhUY= +github.com/labstack/echo-opentelemetry v0.0.3/go.mod h1:gGPMgJmQkDreqWyEzfPccPhaT8B3XLag2AByizhNoM4= +github.com/labstack/echo/v5 v5.3.1 h1:75maCxkQVGualckLc/5s/ihgpH1a1Dc6AuGWNVNs6bw= +github.com/labstack/echo/v5 v5.3.1/go.mod h1:4iEGNQiPPZnkfYpNR/L6fINd3NLiGWUD5+eBotFALas= github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4= github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI= github.com/ldez/exptostd v0.4.5 h1:kv2ZGUVI6VwRfp/+bcQ6Nbx0ghFWcGIKInkG/oFn1aQ= github.com/ldez/exptostd v0.4.5/go.mod h1:QRjHRMXJrCTIm9WxVNH6VW7oN7KrGSht69bIRwvdFsM= github.com/ldez/gomoddirectives v0.8.0 h1:JqIuTtgvFC2RdH1s357vrE23WJF2cpDCPFgA/TWDGpk= github.com/ldez/gomoddirectives v0.8.0/go.mod h1:jutzamvZR4XYJLr0d5Honycp4Gy6GEg2mS9+2YX3F1Q= +github.com/ldez/gomoddirectives v0.9.0 h1:2YV/EX7nVlWL4jySusYTzBKHuE3D2fgcRsQuMa3yIoo= +github.com/ldez/gomoddirectives v0.9.0/go.mod h1:DdZzfm9MdXCjn2/UGYXCFfo+tzrp2Ib4iD2Q0kIJkwE= github.com/ldez/grignotin v0.10.1 h1:keYi9rYsgbvqAZGI1liek5c+jv9UUjbvdj3Tbn5fn4o= github.com/ldez/grignotin v0.10.1/go.mod h1:UlDbXFCARrXbWGNGP3S5vsysNXAPhnSuBufpTEbwOas= github.com/ldez/structtags v0.6.1 h1:bUooFLbXx41tW8SvkfwfFkkjPYvFFs59AAMgVg6DUBk= @@ -607,6 +656,8 @@ github.com/lmittmann/tint v1.2.0 h1:AogHRHy8HUJUnNJBHJlYa+fR4YY8mko2cnCp67xn9JY= github.com/lmittmann/tint v1.2.0/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= github.com/lucasb-eyer/go-colorful v1.4.0 h1:UtrWVfLdarDgc44HcS7pYloGHJUjHV/4FwW4TvVgFr4= github.com/lucasb-eyer/go-colorful v1.4.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lucasb-eyer/go-colorful v1.4.1 h1:1EO+WB73+EH8EVbzlrG3KLAfEypQWVHIBqlTf+2hNss= +github.com/lucasb-eyer/go-colorful v1.4.1/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= @@ -642,6 +693,8 @@ github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/mattn/go-runewidth v0.0.23 h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw= github.com/mattn/go-runewidth v0.0.23/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/mattn/go-runewidth v0.0.24 h1:cpokDiIn0MGnhdHwuWnJBITySJ20QyNGnY2kR/ay2DU= +github.com/mattn/go-runewidth v0.0.24/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mgechev/revive v1.15.0 h1:vJ0HzSBzfNyPbHKolgiFjHxLek9KUijhqh42yGoqZ8Q= github.com/mgechev/revive v1.15.0/go.mod h1:LlAKO3QQe9OJ0pVZzI2GPa8CbXGZ/9lNpCGvK4T/a8A= @@ -701,6 +754,8 @@ github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/nunnatsa/ginkgolinter v0.23.0 h1:x3o4DGYOWbBMP/VdNQKgSj+25aJKx2Pe6lHr8gBcgf8= github.com/nunnatsa/ginkgolinter v0.23.0/go.mod h1:9qN1+0akwXEccwV1CAcCDfcoBlWXHB+ML9884pL4SZ4= +github.com/nunnatsa/ginkgolinter v0.24.0 h1:Mp0EagluLFP98JatP6nqp/gGEoljNG97uf9AcxcBVy8= +github.com/nunnatsa/ginkgolinter v0.24.0/go.mod h1:2ZMRuzX6+3XXyY6UZOwb6n+MCocVGbkIsDBC4vuWz5c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= @@ -724,6 +779,7 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042 github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.28.2 h1:DTrMfpqxiNUyQ3Y0zhn1n3cOO2euFgQPYIpkWwxVFps= github.com/onsi/ginkgo/v2 v2.28.2/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE= +github.com/onsi/ginkgo/v2 v2.32.0 h1:Hw7s2pVrQo/8Yz5N77qdnpHaoc+c6cC9WIV1Jce+J6E= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -731,6 +787,7 @@ github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAl github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= +github.com/onsi/gomega v1.42.1 h1:iN1rCUX+44NZ1Dc97MPoeFYbFR0vh8zxoxMFwKdyZ6I= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= @@ -751,6 +808,8 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.3.1 h1:MYEvvGnQjeNkRF1qUuGolNtNExTDwct51yp7olPtrEc= github.com/pelletier/go-toml/v2 v2.3.1/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pelletier/go-toml/v2 v2.4.3 h1:GTRvJQutkOSftxIFD5xw9aepkYNuPWmVJpffdDPYVpY= +github.com/pelletier/go-toml/v2 v2.4.3/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -799,6 +858,8 @@ github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4l github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/raeperd/recvcheck v0.2.0 h1:GnU+NsbiCqdC2XX5+vMZzP+jAJC5fht7rcVTAhX74UI= github.com/raeperd/recvcheck v0.2.0/go.mod h1:n04eYkwIR0JbgD73wT8wL4JjPC3wm0nFtzBnWNocnYU= +github.com/raeperd/recvcheck v0.3.0 h1:PM+XYvyxIj3bo+kobJfFTdTuU3Lmfu96mKDbyHDbRt8= +github.com/raeperd/recvcheck v0.3.0/go.mod h1:PZNwG+HztFYMH2ZPq0Hu3QgkV2yiA6VrtNz9c1fXWJo= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= @@ -807,6 +868,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc= github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= +github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= +github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryancurrah/gomodguard v1.4.1 h1:eWC8eUMNZ/wM/PWuZBv7JxxqT5fiIKSIyTvjb7Elr+g= github.com/ryancurrah/gomodguard v1.4.1/go.mod h1:qnMJwV1hX9m+YJseXEBhd2s90+1Xn6x9dLz11ualI1I= @@ -819,14 +882,12 @@ github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43 github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= -github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw= -github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= -github.com/samber/slog-echo v1.23.0 h1:jFzK9t9hLvEjic2tfIkgXt2r22Zz2UYaYrUyM/S0pks= -github.com/samber/slog-echo v1.23.0/go.mod h1:caG3zeXgrPRlGKaPVqyWG1MEc6nwrmtDjoLN/mc0PrM= github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0= github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4= github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.3 h1:1EYB5IzjZawrrnELUi78f9fPu57HuXjmddZPjrls/28= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.3/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= github.com/sashamelentyev/usestdlibvars v1.29.0 h1:8J0MoRrw4/NAXtjQqTHrbW9NN+3iMf7Knkq057v4XOQ= @@ -834,6 +895,8 @@ github.com/sashamelentyev/usestdlibvars v1.29.0/go.mod h1:8PpnjHMk5VdeWlVb4wCdrB github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/securego/gosec/v2 v2.26.1 h1:gdkttGhQFVehqRJ8grKH4DrpqM/QlPKNHBnl8QgcEC4= github.com/securego/gosec/v2 v2.26.1/go.mod h1:57UW4p0uoP3kxoTkhoo3axLdVAi+OWrLg/Ax/kdqtPE= +github.com/securego/gosec/v2 v2.28.0 h1:ZsSdiDb0AtTpLFVol5z91gbMei9ZiLEPG/pZjZujp7c= +github.com/securego/gosec/v2 v2.28.0/go.mod h1:lb4/9AHe+lJy/kjWmWRWWsEipvbwGKuxf+tY1Pmjdnk= github.com/segmentio/golines v0.13.0 h1:GfbpsxoF4eYuEZD3mxrlsN/XD30m6nOO4QLQj2JIa90= github.com/segmentio/golines v0.13.0/go.mod h1:MMEi38dnJiyxqFZqFOqN14QMzWHzj/i0+L9Q2MsVr64= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= @@ -845,6 +908,8 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= +github.com/sirupsen/logrus v1.10.1 h1:xi4336Zh11WpU14fXR6I67V3yaTPQYwRx2WEtHbRg4Q= +github.com/sirupsen/logrus v1.10.1/go.mod h1:vsQHnG7xzNsxk3NrwboUiWPnIC3dmbjcGPykD7+tiHk= github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= github.com/sonatard/noctx v0.5.1 h1:wklWg9c9ZYugOAk7qG4yP4PBrlQsmSLPTvW1K4PRQMs= @@ -856,8 +921,8 @@ github.com/sourcegraph/go-diff v0.8.0/go.mod h1:hWlcO7Al+UZStZAP8rBumHpCK5ZHQ5BX github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/speakeasy-api/jsonpath v0.6.3 h1:c+QPwzAOdrWvzycuc9HFsIZcxKIaWcNpC+xhOW9rJxU= github.com/speakeasy-api/jsonpath v0.6.3/go.mod h1:2cXloNuQ+RSXi5HTRaeBh7JEmjRXTiaKpFTdZiL7URI= -github.com/speakeasy-api/openapi v1.19.2 h1:md90tE71/M8jS3cuRlsuWP5Aed4xoG5PSRvXeZgCv/M= -github.com/speakeasy-api/openapi v1.19.2/go.mod h1:UfKa7FqE4jgexJZuj51MmdHAFGmDv0Zaw3+yOd81YKU= +github.com/speakeasy-api/openapi v1.24.0 h1:opoD27rupX7zBVPq1HkIGLeMOzNNA7JalhYP8q34i04= +github.com/speakeasy-api/openapi v1.24.0/go.mod h1:g3+dIMe0AYgbbGvnlQZqesmjAVWSm9BmsjLevnefQrg= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= @@ -933,10 +998,8 @@ github.com/uudashr/gocognit v1.2.1 h1:CSJynt5txTnORn/DkhiB4mZjwPuifyASC8/6Q0I/QS github.com/uudashr/gocognit v1.2.1/go.mod h1:acaubQc6xYlXFEMb9nWX2dYBzJ/bIjEkc1zzvyIZg5Q= github.com/uudashr/iface v1.4.2 h1:06Vq5RKVYThBsj0Bnw4oasMjD1r+7CE/bcKOA8dVSvg= github.com/uudashr/iface v1.4.2/go.mod h1:pbeBPlbuU2qkNDn0mmfrxP2X+wjPMIQAy+r1MBXSXtg= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= -github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/uudashr/iface v1.5.1 h1:BS3yrgaT55s3dAtJoxuTnsZNbsejq/mVuzp49YDyfBA= +github.com/uudashr/iface v1.5.1/go.mod h1:5UWoT6SvTdTww/KToRj6clO+n4Kg3/NrAQvgOB+5Ggw= github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= @@ -974,6 +1037,8 @@ go.augendre.info/arangolint v0.4.0 h1:xSCZjRoS93nXazBSg5d0OGCi9APPLNMmmLrC995tR5 go.augendre.info/arangolint v0.4.0/go.mod h1:l+f/b4plABuFISuKnTGD4RioXiCCgghv2xqst/xOvAA= go.augendre.info/fatcontext v0.9.0 h1:Gt5jGD4Zcj8CDMVzjOJITlSb9cEch54hjRRlN3qDojE= go.augendre.info/fatcontext v0.9.0/go.mod h1:L94brOAT1OOUNue6ph/2HnwxoNlds9aXDF2FcUntbNw= +go.augendre.info/fatcontext v0.10.0 h1:HhFopmivh8U1+AU7f0kuwUeg2eiIns7YsGQOMHwSJ90= +go.augendre.info/fatcontext v0.10.0/go.mod h1:pqpGvA9GlrXy+aXkp8L2dKz12Zp4g2FhzcAtwToU+2w= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= @@ -986,8 +1051,6 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho v0.69.0 h1:p2oor9jp8aT5uqVuN9p0GCntXn5VX8qXdOH098hgLu4= -go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho v0.69.0/go.mod h1:NOiuETZRg7aNSNFPWqf4dAszhyFMVdKYXW4V0/DtbNA= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 h1:LMuyCAyfalSjDyjdC65nK6N0zoTT63+E/u95X0JovZI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0/go.mod h1:085m8qbm4hgc8rZWGDEa4vmyyo2c3nPxUslYUKUIU04= go.opentelemetry.io/contrib/propagators/b3 v1.44.0 h1:1IFH4oFKK8KupzIelCl3u+bkxpGRps1oWRjQI2+TTWs= @@ -1062,6 +1125,8 @@ golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 h1:qWFG1Dj7TBjOjOvhEOkmyGPVoquqUKnIU0lEVLp8xyk= golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358/go.mod h1:4Mzdyp/6jzw9auFDJ3OMF5qksa7UvPnzKqTVGcb04ms= +golang.org/x/exp/typeparams v0.0.0-20260811152304-ee035b5b010f h1:+lI8cDJ4uceLipg2f1ODay7fEuLkk0BIHXd6PB8icxo= +golang.org/x/exp/typeparams v0.0.0-20260811152304-ee035b5b010f/go.mod h1:PqrXSW65cXDZH0k4IeUbhmg/bcAZDbzNz3byBpKCsXo= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1093,6 +1158,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk= golang.org/x/mod v0.38.0/go.mod h1:V6Xz0pq8TQ3dGqVQ1FVHuelZpAL0uNhSkk9ogYP3c40= +golang.org/x/mod v0.40.0 h1:hUv+3cXcdRHz08UmSiOob7sadHig73uo5bkXxQ/tvUs= +golang.org/x/mod v0.40.0/go.mod h1:0/weTWkPWGBikyTWAX3dkjVztMmBA5hM0DH6BElSupE= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1344,6 +1411,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE= golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk= +golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI= +golang.org/x/tools v0.49.0/go.mod h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= @@ -1542,12 +1611,18 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.7.0 h1:w6WUp1VbkqPEgLz4rkBzH/CSU6HkoqNLp6GstyTx3lU= honnef.co/go/tools v0.7.0/go.mod h1:pm29oPxeP3P82ISxZDgIYeOaf9ta6Pi0EWvCFoLG2vc= +honnef.co/go/tools v0.8.1 h1:+JKf3xJ1ni4CwrhVg4/pqsfPGP6vNAXcKbMXJodYx3w= +honnef.co/go/tools v0.8.1/go.mod h1:XA+OnlRA9EDh/ukGvXMNSZNKGwFQJ+5dER0ioUkOxks= k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 h1:jVkFFVfXdXP74B/zbO3hM3hpSFD0xvhQ5U686DPurkE= k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3/go.mod h1:M2s5JB1lIYP3jzZdorPLHXIPJzt9vv2muW5a6L9DtNM= mvdan.cc/gofumpt v0.11.0 h1:0H01XB95PnN2QgCSR9ELdZyTlJqNZ7181B0BTMh5VZc= mvdan.cc/gofumpt v0.11.0/go.mod h1:BeT5wCsOJt6J9zT2MZIOGszjUHzFkn1/l9g6xAzqsXo= +mvdan.cc/gofumpt v0.12.0 h1:1Lbudkz2kpM9Cjz2pL4M19u7q+GaEhCTNf7N9mfpcho= +mvdan.cc/gofumpt v0.12.0/go.mod h1:SmBHHrljiZu/uoypeKup3rFzP6eoC9UwCp2iH5E3jZA= mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 h1:ssMzja7PDPJV8FStj7hq9IKiuiKhgz9ErWw+m68e7DI= mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15/go.mod h1:4M5MMXl2kW6fivUT6yRGpLLPNfuGtU2Z0cPvFquGDYU= +mvdan.cc/unparam v0.0.0-20260823230713-2fa3d841b0c8 h1:Re1NRyLpiAt9kB+ImaaoapwWiQXrKwER4tY8fLOkDew= +mvdan.cc/unparam v0.0.0-20260823230713-2fa3d841b0c8/go.mod h1:MrS/+zJ1M2xvGXhKktiHbNQeQPyg3Qel+KkzT+f7/i4= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/internal/controller/api/agent/gen/agent.gen.go b/internal/controller/api/agent/gen/agent.gen.go index 74e9c38bd..b90f5cd60 100644 --- a/internal/controller/api/agent/gen/agent.gen.go +++ b/internal/controller/api/agent/gen/agent.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" "time" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for AgentInfoState. @@ -28,12 +28,40 @@ const ( AgentInfoStateReady AgentInfoState = "Ready" ) +// Valid indicates whether the value is a known member of the AgentInfoState enum. +func (e AgentInfoState) Valid() bool { + switch e { + case AgentInfoStateCordoned: + return true + case AgentInfoStateDraining: + return true + case AgentInfoStatePending: + return true + case AgentInfoStateReady: + return true + default: + return false + } +} + // Defines values for AgentInfoStatus. const ( AgentInfoStatusNotReady AgentInfoStatus = "NotReady" AgentInfoStatusReady AgentInfoStatus = "Ready" ) +// Valid indicates whether the value is a known member of the AgentInfoStatus enum. +func (e AgentInfoStatus) Valid() bool { + switch e { + case AgentInfoStatusNotReady: + return true + case AgentInfoStatusReady: + return true + default: + return false + } +} + // Defines values for NetworkInterfaceResponseFamily. const ( Dual NetworkInterfaceResponseFamily = "dual" @@ -41,6 +69,20 @@ const ( Inet6 NetworkInterfaceResponseFamily = "inet6" ) +// Valid indicates whether the value is a known member of the NetworkInterfaceResponseFamily enum. +func (e NetworkInterfaceResponseFamily) Valid() bool { + switch e { + case Dual: + return true + case Inet: + return true + case Inet6: + return true + default: + return false + } +} + // Defines values for NodeConditionType. const ( DiskPressure NodeConditionType = "DiskPressure" @@ -48,6 +90,20 @@ const ( MemoryPressure NodeConditionType = "MemoryPressure" ) +// Valid indicates whether the value is a known member of the NodeConditionType enum. +func (e NodeConditionType) Valid() bool { + switch e { + case DiskPressure: + return true + case HighLoad: + return true + case MemoryPressure: + return true + default: + return false + } +} + // AgentInfo defines model for AgentInfo. type AgentInfo struct { // Architecture CPU architecture. @@ -248,6 +304,9 @@ type TimelineEvent struct { Timestamp time.Time `json:"timestamp"` } +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // AcceptAgentParams defines parameters for AcceptAgent. type AcceptAgentParams struct { // Fingerprint Accept by fingerprint instead of hostname. @@ -258,25 +317,25 @@ type AcceptAgentParams struct { type ServerInterface interface { // List active agents // (GET /api/agent) - GetAgents(ctx echo.Context) error + GetAgents(ctx *echo.Context) error // List agents awaiting enrollment // (GET /api/agent/pending) - GetAgentsPending(ctx echo.Context) error + GetAgentsPending(ctx *echo.Context) error // Get agent details // (GET /api/agent/{hostname}) - GetAgentDetails(ctx echo.Context, hostname string) error + GetAgentDetails(ctx *echo.Context, hostname string) error // Accept a pending agent // (POST /api/agent/{hostname}/accept) - AcceptAgent(ctx echo.Context, hostname string, params AcceptAgentParams) error + AcceptAgent(ctx *echo.Context, hostname string, params AcceptAgentParams) error // Drain an agent // (POST /api/agent/{hostname}/drain) - DrainAgent(ctx echo.Context, hostname string) error + DrainAgent(ctx *echo.Context, hostname string) error // Reject a pending agent // (POST /api/agent/{hostname}/reject) - RejectAgent(ctx echo.Context, hostname string) error + RejectAgent(ctx *echo.Context, hostname string) error // Undrain an agent // (POST /api/agent/{hostname}/undrain) - UndrainAgent(ctx echo.Context, hostname string) error + UndrainAgent(ctx *echo.Context, hostname string) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -285,10 +344,10 @@ type ServerInterfaceWrapper struct { } // GetAgents converts echo context to params. -func (w *ServerInterfaceWrapper) GetAgents(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetAgents(ctx *echo.Context) error { var err error - ctx.Set(BearerAuthScopes, []string{"agent:read"}) + ctx.Set(string(BearerAuthScopes), []string{"agent:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetAgents(ctx) @@ -296,10 +355,10 @@ func (w *ServerInterfaceWrapper) GetAgents(ctx echo.Context) error { } // GetAgentsPending converts echo context to params. -func (w *ServerInterfaceWrapper) GetAgentsPending(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetAgentsPending(ctx *echo.Context) error { var err error - ctx.Set(BearerAuthScopes, []string{"agent:read"}) + ctx.Set(string(BearerAuthScopes), []string{"agent:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetAgentsPending(ctx) @@ -307,17 +366,17 @@ func (w *ServerInterfaceWrapper) GetAgentsPending(ctx echo.Context) error { } // GetAgentDetails converts echo context to params. -func (w *ServerInterfaceWrapper) GetAgentDetails(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetAgentDetails(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname string - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"agent:read"}) + ctx.Set(string(BearerAuthScopes), []string{"agent:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetAgentDetails(ctx, hostname) @@ -325,23 +384,23 @@ func (w *ServerInterfaceWrapper) GetAgentDetails(ctx echo.Context) error { } // AcceptAgent converts echo context to params. -func (w *ServerInterfaceWrapper) AcceptAgent(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) AcceptAgent(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname string - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"agent:write"}) + ctx.Set(string(BearerAuthScopes), []string{"agent:write"}) // Parameter object where we will unmarshal all parameters from the context var params AcceptAgentParams // ------------- Optional query parameter "fingerprint" ------------- - err = runtime.BindQueryParameter("form", true, false, "fingerprint", ctx.QueryParams(), ¶ms.Fingerprint) + err = runtime.BindQueryParameterWithOptions("form", true, false, "fingerprint", ctx.QueryParams(), ¶ms.Fingerprint, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter fingerprint: %s", err)) } @@ -352,17 +411,17 @@ func (w *ServerInterfaceWrapper) AcceptAgent(ctx echo.Context) error { } // DrainAgent converts echo context to params. -func (w *ServerInterfaceWrapper) DrainAgent(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DrainAgent(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname string - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"agent:write"}) + ctx.Set(string(BearerAuthScopes), []string{"agent:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DrainAgent(ctx, hostname) @@ -370,17 +429,17 @@ func (w *ServerInterfaceWrapper) DrainAgent(ctx echo.Context) error { } // RejectAgent converts echo context to params. -func (w *ServerInterfaceWrapper) RejectAgent(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) RejectAgent(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname string - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"agent:write"}) + ctx.Set(string(BearerAuthScopes), []string{"agent:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.RejectAgent(ctx, hostname) @@ -388,17 +447,17 @@ func (w *ServerInterfaceWrapper) RejectAgent(ctx echo.Context) error { } // UndrainAgent converts echo context to params. -func (w *ServerInterfaceWrapper) UndrainAgent(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) UndrainAgent(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname string - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"agent:write"}) + ctx.Set(string(BearerAuthScopes), []string{"agent:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.UndrainAgent(ctx, hostname) @@ -409,37 +468,56 @@ func (w *ServerInterfaceWrapper) UndrainAgent(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/agent", wrapper.GetAgents) - router.GET(baseURL+"/api/agent/pending", wrapper.GetAgentsPending) - router.GET(baseURL+"/api/agent/:hostname", wrapper.GetAgentDetails) - router.POST(baseURL+"/api/agent/:hostname/accept", wrapper.AcceptAgent) - router.POST(baseURL+"/api/agent/:hostname/drain", wrapper.DrainAgent) - router.POST(baseURL+"/api/agent/:hostname/reject", wrapper.RejectAgent) - router.POST(baseURL+"/api/agent/:hostname/undrain", wrapper.UndrainAgent) + router.GET(options.BaseURL+"/api/agent", wrapper.GetAgents, options.OperationMiddlewares["getAgents"]...) + router.GET(options.BaseURL+"/api/agent/pending", wrapper.GetAgentsPending, options.OperationMiddlewares["getAgentsPending"]...) + router.GET(options.BaseURL+"/api/agent/:hostname", wrapper.GetAgentDetails, options.OperationMiddlewares["getAgentDetails"]...) + router.POST(options.BaseURL+"/api/agent/:hostname/accept", wrapper.AcceptAgent, options.OperationMiddlewares["acceptAgent"]...) + router.POST(options.BaseURL+"/api/agent/:hostname/drain", wrapper.DrainAgent, options.OperationMiddlewares["drainAgent"]...) + router.POST(options.BaseURL+"/api/agent/:hostname/reject", wrapper.RejectAgent, options.OperationMiddlewares["rejectAgent"]...) + router.POST(options.BaseURL+"/api/agent/:hostname/undrain", wrapper.UndrainAgent, options.OperationMiddlewares["undrainAgent"]...) } @@ -453,37 +531,57 @@ type GetAgentsResponseObject interface { type GetAgents200JSONResponse ListAgentsResponse func (response GetAgents200JSONResponse) VisitGetAgentsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAgents401JSONResponse externalRef0.ErrorResponse func (response GetAgents401JSONResponse) VisitGetAgentsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAgents403JSONResponse externalRef0.ErrorResponse func (response GetAgents403JSONResponse) VisitGetAgentsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAgents500JSONResponse externalRef0.ErrorResponse func (response GetAgents500JSONResponse) VisitGetAgentsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAgentsPendingRequestObject struct { @@ -496,41 +594,61 @@ type GetAgentsPendingResponseObject interface { type GetAgentsPending200JSONResponse ListPendingAgentsResponse func (response GetAgentsPending200JSONResponse) VisitGetAgentsPendingResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAgentsPending401JSONResponse externalRef0.ErrorResponse func (response GetAgentsPending401JSONResponse) VisitGetAgentsPendingResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAgentsPending403JSONResponse externalRef0.ErrorResponse func (response GetAgentsPending403JSONResponse) VisitGetAgentsPendingResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAgentsPending500JSONResponse externalRef0.ErrorResponse func (response GetAgentsPending500JSONResponse) VisitGetAgentsPendingResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAgentDetailsRequestObject struct { - Hostname string `json:"hostname"` + Hostname string `json:"hostname" validate:"required,min=1,max=255"` } type GetAgentDetailsResponseObject interface { @@ -540,59 +658,89 @@ type GetAgentDetailsResponseObject interface { type GetAgentDetails200JSONResponse AgentInfo func (response GetAgentDetails200JSONResponse) VisitGetAgentDetailsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAgentDetails400JSONResponse externalRef0.ErrorResponse func (response GetAgentDetails400JSONResponse) VisitGetAgentDetailsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAgentDetails401JSONResponse externalRef0.ErrorResponse func (response GetAgentDetails401JSONResponse) VisitGetAgentDetailsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAgentDetails403JSONResponse externalRef0.ErrorResponse func (response GetAgentDetails403JSONResponse) VisitGetAgentDetailsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAgentDetails404JSONResponse externalRef0.ErrorResponse func (response GetAgentDetails404JSONResponse) VisitGetAgentDetailsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAgentDetails500JSONResponse externalRef0.ErrorResponse func (response GetAgentDetails500JSONResponse) VisitGetAgentDetailsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type AcceptAgentRequestObject struct { - Hostname string `json:"hostname"` + Hostname string `json:"hostname" validate:"required,min=1,max=255"` Params AcceptAgentParams } @@ -605,59 +753,89 @@ type AcceptAgent200JSONResponse struct { } func (response AcceptAgent200JSONResponse) VisitAcceptAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type AcceptAgent400JSONResponse externalRef0.ErrorResponse func (response AcceptAgent400JSONResponse) VisitAcceptAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type AcceptAgent401JSONResponse externalRef0.ErrorResponse func (response AcceptAgent401JSONResponse) VisitAcceptAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type AcceptAgent403JSONResponse externalRef0.ErrorResponse func (response AcceptAgent403JSONResponse) VisitAcceptAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type AcceptAgent404JSONResponse externalRef0.ErrorResponse func (response AcceptAgent404JSONResponse) VisitAcceptAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type AcceptAgent500JSONResponse externalRef0.ErrorResponse func (response AcceptAgent500JSONResponse) VisitAcceptAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DrainAgentRequestObject struct { - Hostname string `json:"hostname"` + Hostname string `json:"hostname" validate:"required,min=1,max=255"` } type DrainAgentResponseObject interface { @@ -669,59 +847,89 @@ type DrainAgent200JSONResponse struct { } func (response DrainAgent200JSONResponse) VisitDrainAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DrainAgent400JSONResponse externalRef0.ErrorResponse func (response DrainAgent400JSONResponse) VisitDrainAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DrainAgent401JSONResponse externalRef0.ErrorResponse func (response DrainAgent401JSONResponse) VisitDrainAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DrainAgent403JSONResponse externalRef0.ErrorResponse func (response DrainAgent403JSONResponse) VisitDrainAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DrainAgent404JSONResponse externalRef0.ErrorResponse func (response DrainAgent404JSONResponse) VisitDrainAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DrainAgent409JSONResponse externalRef0.ErrorResponse func (response DrainAgent409JSONResponse) VisitDrainAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(409) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type RejectAgentRequestObject struct { - Hostname string `json:"hostname"` + Hostname string `json:"hostname" validate:"required,min=1,max=255"` } type RejectAgentResponseObject interface { @@ -733,59 +941,89 @@ type RejectAgent200JSONResponse struct { } func (response RejectAgent200JSONResponse) VisitRejectAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type RejectAgent400JSONResponse externalRef0.ErrorResponse func (response RejectAgent400JSONResponse) VisitRejectAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type RejectAgent401JSONResponse externalRef0.ErrorResponse func (response RejectAgent401JSONResponse) VisitRejectAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type RejectAgent403JSONResponse externalRef0.ErrorResponse func (response RejectAgent403JSONResponse) VisitRejectAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type RejectAgent404JSONResponse externalRef0.ErrorResponse func (response RejectAgent404JSONResponse) VisitRejectAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type RejectAgent500JSONResponse externalRef0.ErrorResponse func (response RejectAgent500JSONResponse) VisitRejectAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type UndrainAgentRequestObject struct { - Hostname string `json:"hostname"` + Hostname string `json:"hostname" validate:"required,min=1,max=255"` } type UndrainAgentResponseObject interface { @@ -797,55 +1035,85 @@ type UndrainAgent200JSONResponse struct { } func (response UndrainAgent200JSONResponse) VisitUndrainAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type UndrainAgent400JSONResponse externalRef0.ErrorResponse func (response UndrainAgent400JSONResponse) VisitUndrainAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type UndrainAgent401JSONResponse externalRef0.ErrorResponse func (response UndrainAgent401JSONResponse) VisitUndrainAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type UndrainAgent403JSONResponse externalRef0.ErrorResponse func (response UndrainAgent403JSONResponse) VisitUndrainAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type UndrainAgent404JSONResponse externalRef0.ErrorResponse func (response UndrainAgent404JSONResponse) VisitUndrainAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type UndrainAgent409JSONResponse externalRef0.ErrorResponse func (response UndrainAgent409JSONResponse) VisitUndrainAgentResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(409) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -873,8 +1141,8 @@ type StrictServerInterface interface { UndrainAgent(ctx context.Context, request UndrainAgentRequestObject) (UndrainAgentResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -886,10 +1154,10 @@ type strictHandler struct { } // GetAgents operation middleware -func (sh *strictHandler) GetAgents(ctx echo.Context) error { +func (sh *strictHandler) GetAgents(ctx *echo.Context) error { var request GetAgentsRequestObject - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetAgents(ctx.Request().Context(), request.(GetAgentsRequestObject)) } for _, middleware := range sh.middlewares { @@ -909,10 +1177,10 @@ func (sh *strictHandler) GetAgents(ctx echo.Context) error { } // GetAgentsPending operation middleware -func (sh *strictHandler) GetAgentsPending(ctx echo.Context) error { +func (sh *strictHandler) GetAgentsPending(ctx *echo.Context) error { var request GetAgentsPendingRequestObject - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetAgentsPending(ctx.Request().Context(), request.(GetAgentsPendingRequestObject)) } for _, middleware := range sh.middlewares { @@ -932,12 +1200,12 @@ func (sh *strictHandler) GetAgentsPending(ctx echo.Context) error { } // GetAgentDetails operation middleware -func (sh *strictHandler) GetAgentDetails(ctx echo.Context, hostname string) error { +func (sh *strictHandler) GetAgentDetails(ctx *echo.Context, hostname string) error { var request GetAgentDetailsRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetAgentDetails(ctx.Request().Context(), request.(GetAgentDetailsRequestObject)) } for _, middleware := range sh.middlewares { @@ -957,13 +1225,13 @@ func (sh *strictHandler) GetAgentDetails(ctx echo.Context, hostname string) erro } // AcceptAgent operation middleware -func (sh *strictHandler) AcceptAgent(ctx echo.Context, hostname string, params AcceptAgentParams) error { +func (sh *strictHandler) AcceptAgent(ctx *echo.Context, hostname string, params AcceptAgentParams) error { var request AcceptAgentRequestObject request.Hostname = hostname request.Params = params - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.AcceptAgent(ctx.Request().Context(), request.(AcceptAgentRequestObject)) } for _, middleware := range sh.middlewares { @@ -983,12 +1251,12 @@ func (sh *strictHandler) AcceptAgent(ctx echo.Context, hostname string, params A } // DrainAgent operation middleware -func (sh *strictHandler) DrainAgent(ctx echo.Context, hostname string) error { +func (sh *strictHandler) DrainAgent(ctx *echo.Context, hostname string) error { var request DrainAgentRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DrainAgent(ctx.Request().Context(), request.(DrainAgentRequestObject)) } for _, middleware := range sh.middlewares { @@ -1008,12 +1276,12 @@ func (sh *strictHandler) DrainAgent(ctx echo.Context, hostname string) error { } // RejectAgent operation middleware -func (sh *strictHandler) RejectAgent(ctx echo.Context, hostname string) error { +func (sh *strictHandler) RejectAgent(ctx *echo.Context, hostname string) error { var request RejectAgentRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.RejectAgent(ctx.Request().Context(), request.(RejectAgentRequestObject)) } for _, middleware := range sh.middlewares { @@ -1033,12 +1301,12 @@ func (sh *strictHandler) RejectAgent(ctx echo.Context, hostname string) error { } // UndrainAgent operation middleware -func (sh *strictHandler) UndrainAgent(ctx echo.Context, hostname string) error { +func (sh *strictHandler) UndrainAgent(ctx *echo.Context, hostname string) error { var request UndrainAgentRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.UndrainAgent(ctx.Request().Context(), request.(UndrainAgentRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/agent/gen/cfg.yaml b/internal/controller/api/agent/gen/cfg.yaml index 4cede0e1c..1c52758af 100644 --- a/internal/controller/api/agent/gen/cfg.yaml +++ b/internal/controller/api/agent/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: agent.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/agent/handler.go b/internal/controller/api/agent/handler.go index 51abbd8af..263e54307 100644 --- a/internal/controller/api/agent/handler.go +++ b/internal/controller/api/agent/handler.go @@ -23,8 +23,7 @@ package agent import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -47,14 +46,14 @@ func Handler( strictHandler := gen.NewStrictHandler( agentHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/agent/handler_public_test.go b/internal/controller/api/agent/handler_public_test.go index 1b609d0a9..9267656ba 100644 --- a/internal/controller/api/agent/handler_public_test.go +++ b/internal/controller/api/agent/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/agent", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/audit/gen/audit.gen.go b/internal/controller/api/audit/gen/audit.gen.go index 6549b8ed8..c3693b45c 100644 --- a/internal/controller/api/audit/gen/audit.gen.go +++ b/internal/controller/api/audit/gen/audit.gen.go @@ -1,24 +1,24 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" "time" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // AuditEntry defines model for AuditEntry. @@ -74,6 +74,9 @@ type ListAuditResponse struct { TotalItems int `json:"total_items"` } +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // GetAuditLogsParams defines parameters for GetAuditLogs. type GetAuditLogsParams struct { // Limit Maximum number of entries to return. @@ -87,13 +90,13 @@ type GetAuditLogsParams struct { type ServerInterface interface { // List audit log entries // (GET /api/audit) - GetAuditLogs(ctx echo.Context, params GetAuditLogsParams) error + GetAuditLogs(ctx *echo.Context, params GetAuditLogsParams) error // Export all audit log entries // (GET /api/audit/export) - GetAuditExport(ctx echo.Context) error + GetAuditExport(ctx *echo.Context) error // Get a single audit log entry // (GET /api/audit/{id}) - GetAuditLogByID(ctx echo.Context, id openapi_types.UUID) error + GetAuditLogByID(ctx *echo.Context, id openapi_types.UUID) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -102,23 +105,23 @@ type ServerInterfaceWrapper struct { } // GetAuditLogs converts echo context to params. -func (w *ServerInterfaceWrapper) GetAuditLogs(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetAuditLogs(ctx *echo.Context) error { var err error - ctx.Set(BearerAuthScopes, []string{"audit:read"}) + ctx.Set(string(BearerAuthScopes), []string{"audit:read"}) // Parameter object where we will unmarshal all parameters from the context var params GetAuditLogsParams // ------------- Optional query parameter "limit" ------------- - err = runtime.BindQueryParameter("form", true, false, "limit", ctx.QueryParams(), ¶ms.Limit) + err = runtime.BindQueryParameterWithOptions("form", true, false, "limit", ctx.QueryParams(), ¶ms.Limit, runtime.BindQueryParameterOptions{Type: "integer", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter limit: %s", err)) } // ------------- Optional query parameter "offset" ------------- - err = runtime.BindQueryParameter("form", true, false, "offset", ctx.QueryParams(), ¶ms.Offset) + err = runtime.BindQueryParameterWithOptions("form", true, false, "offset", ctx.QueryParams(), ¶ms.Offset, runtime.BindQueryParameterOptions{Type: "integer", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter offset: %s", err)) } @@ -129,10 +132,10 @@ func (w *ServerInterfaceWrapper) GetAuditLogs(ctx echo.Context) error { } // GetAuditExport converts echo context to params. -func (w *ServerInterfaceWrapper) GetAuditExport(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetAuditExport(ctx *echo.Context) error { var err error - ctx.Set(BearerAuthScopes, []string{"audit:read"}) + ctx.Set(string(BearerAuthScopes), []string{"audit:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetAuditExport(ctx) @@ -140,17 +143,17 @@ func (w *ServerInterfaceWrapper) GetAuditExport(ctx echo.Context) error { } // GetAuditLogByID converts echo context to params. -func (w *ServerInterfaceWrapper) GetAuditLogByID(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetAuditLogByID(ctx *echo.Context) error { var err error // ------------- Path parameter "id" ------------- var id openapi_types.UUID - err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "uuid"}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"audit:read"}) + ctx.Set(string(BearerAuthScopes), []string{"audit:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetAuditLogByID(ctx, id) @@ -161,33 +164,52 @@ func (w *ServerInterfaceWrapper) GetAuditLogByID(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/audit", wrapper.GetAuditLogs) - router.GET(baseURL+"/api/audit/export", wrapper.GetAuditExport) - router.GET(baseURL+"/api/audit/:id", wrapper.GetAuditLogByID) + router.GET(options.BaseURL+"/api/audit", wrapper.GetAuditLogs, options.OperationMiddlewares["GetAuditLogs"]...) + router.GET(options.BaseURL+"/api/audit/export", wrapper.GetAuditExport, options.OperationMiddlewares["GetAuditExport"]...) + router.GET(options.BaseURL+"/api/audit/:id", wrapper.GetAuditLogByID, options.OperationMiddlewares["GetAuditLogByID"]...) } @@ -202,46 +224,71 @@ type GetAuditLogsResponseObject interface { type GetAuditLogs200JSONResponse ListAuditResponse func (response GetAuditLogs200JSONResponse) VisitGetAuditLogsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAuditLogs400JSONResponse externalRef0.ErrorResponse func (response GetAuditLogs400JSONResponse) VisitGetAuditLogsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAuditLogs401JSONResponse externalRef0.ErrorResponse func (response GetAuditLogs401JSONResponse) VisitGetAuditLogsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAuditLogs403JSONResponse externalRef0.ErrorResponse func (response GetAuditLogs403JSONResponse) VisitGetAuditLogsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAuditLogs500JSONResponse externalRef0.ErrorResponse func (response GetAuditLogs500JSONResponse) VisitGetAuditLogsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAuditExportRequestObject struct { @@ -254,37 +301,57 @@ type GetAuditExportResponseObject interface { type GetAuditExport200JSONResponse ListAuditResponse func (response GetAuditExport200JSONResponse) VisitGetAuditExportResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAuditExport401JSONResponse externalRef0.ErrorResponse func (response GetAuditExport401JSONResponse) VisitGetAuditExportResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAuditExport403JSONResponse externalRef0.ErrorResponse func (response GetAuditExport403JSONResponse) VisitGetAuditExportResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAuditExport500JSONResponse externalRef0.ErrorResponse func (response GetAuditExport500JSONResponse) VisitGetAuditExportResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAuditLogByIDRequestObject struct { @@ -298,46 +365,71 @@ type GetAuditLogByIDResponseObject interface { type GetAuditLogByID200JSONResponse AuditEntryResponse func (response GetAuditLogByID200JSONResponse) VisitGetAuditLogByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAuditLogByID401JSONResponse externalRef0.ErrorResponse func (response GetAuditLogByID401JSONResponse) VisitGetAuditLogByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAuditLogByID403JSONResponse externalRef0.ErrorResponse func (response GetAuditLogByID403JSONResponse) VisitGetAuditLogByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAuditLogByID404JSONResponse externalRef0.ErrorResponse func (response GetAuditLogByID404JSONResponse) VisitGetAuditLogByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetAuditLogByID500JSONResponse externalRef0.ErrorResponse func (response GetAuditLogByID500JSONResponse) VisitGetAuditLogByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -353,8 +445,8 @@ type StrictServerInterface interface { GetAuditLogByID(ctx context.Context, request GetAuditLogByIDRequestObject) (GetAuditLogByIDResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -366,12 +458,12 @@ type strictHandler struct { } // GetAuditLogs operation middleware -func (sh *strictHandler) GetAuditLogs(ctx echo.Context, params GetAuditLogsParams) error { +func (sh *strictHandler) GetAuditLogs(ctx *echo.Context, params GetAuditLogsParams) error { var request GetAuditLogsRequestObject request.Params = params - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetAuditLogs(ctx.Request().Context(), request.(GetAuditLogsRequestObject)) } for _, middleware := range sh.middlewares { @@ -391,10 +483,10 @@ func (sh *strictHandler) GetAuditLogs(ctx echo.Context, params GetAuditLogsParam } // GetAuditExport operation middleware -func (sh *strictHandler) GetAuditExport(ctx echo.Context) error { +func (sh *strictHandler) GetAuditExport(ctx *echo.Context) error { var request GetAuditExportRequestObject - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetAuditExport(ctx.Request().Context(), request.(GetAuditExportRequestObject)) } for _, middleware := range sh.middlewares { @@ -414,12 +506,12 @@ func (sh *strictHandler) GetAuditExport(ctx echo.Context) error { } // GetAuditLogByID operation middleware -func (sh *strictHandler) GetAuditLogByID(ctx echo.Context, id openapi_types.UUID) error { +func (sh *strictHandler) GetAuditLogByID(ctx *echo.Context, id openapi_types.UUID) error { var request GetAuditLogByIDRequestObject request.Id = id - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetAuditLogByID(ctx.Request().Context(), request.(GetAuditLogByIDRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/audit/gen/cfg.yaml b/internal/controller/api/audit/gen/cfg.yaml index 977d786a2..d37f8d43b 100644 --- a/internal/controller/api/audit/gen/cfg.yaml +++ b/internal/controller/api/audit/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: audit.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/audit/handler.go b/internal/controller/api/audit/handler.go index d6e51bba9..d0d025733 100644 --- a/internal/controller/api/audit/handler.go +++ b/internal/controller/api/audit/handler.go @@ -23,8 +23,7 @@ package audit import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" auditstore "github.com/osapi-io/osapi/internal/audit" "github.com/osapi-io/osapi/internal/authtoken" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( auditHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/audit/handler_public_test.go b/internal/controller/api/audit/handler_public_test.go index 3bbbb16d0..47d6fe337 100644 --- a/internal/controller/api/audit/handler_public_test.go +++ b/internal/controller/api/audit/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -56,7 +56,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/audit", nil) rec := httptest.NewRecorder() @@ -70,7 +70,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/audit/export", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/common/gen/common.gen.go b/internal/controller/api/common/gen/common.gen.go index 401b332b0..96f5cd868 100644 --- a/internal/controller/api/common/gen/common.gen.go +++ b/internal/controller/api/common/gen/common.gen.go @@ -1,6 +1,6 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen // ErrorResponse defines model for ErrorResponse. @@ -14,3 +14,6 @@ type ErrorResponse struct { // Error A description of the error that occurred. Error *string `json:"error,omitempty"` } + +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string diff --git a/internal/controller/api/export_test.go b/internal/controller/api/export_test.go index 2fb309d99..b9f9ba092 100644 --- a/internal/controller/api/export_test.go +++ b/internal/controller/api/export_test.go @@ -23,8 +23,7 @@ package api import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/audit" "github.com/osapi-io/osapi/internal/authtoken" @@ -40,11 +39,11 @@ func ExportAuditMiddleware( // ExportScopeMiddleware exposes ScopeMiddleware for testing. func ExportScopeMiddleware( - next strictecho.StrictEchoHandlerFunc, + next StrictHandlerFunc, tokenManager *authtoken.Token, signingKey string, contextKey string, customRoles map[string][]string, -) strictecho.StrictEchoHandlerFunc { +) StrictHandlerFunc { return ScopeMiddleware(next, tokenManager, signingKey, contextKey, customRoles) } diff --git a/internal/controller/api/facts/gen/cfg.yaml b/internal/controller/api/facts/gen/cfg.yaml index fa782302d..bd627ea15 100644 --- a/internal/controller/api/facts/gen/cfg.yaml +++ b/internal/controller/api/facts/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: facts.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/facts/gen/facts.gen.go b/internal/controller/api/facts/gen/facts.gen.go index 7986032a3..a732fd25f 100644 --- a/internal/controller/api/facts/gen/facts.gen.go +++ b/internal/controller/api/facts/gen/facts.gen.go @@ -1,21 +1,21 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // FactKeyEntry defines model for FactKeyEntry. @@ -36,11 +36,14 @@ type FactKeysResponse struct { Keys []FactKeyEntry `json:"keys"` } +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // ServerInterface represents all server handlers. type ServerInterface interface { // List available fact keys // (GET /api/facts/keys) - GetFactKeys(ctx echo.Context) error + GetFactKeys(ctx *echo.Context) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -49,10 +52,10 @@ type ServerInterfaceWrapper struct { } // GetFactKeys converts echo context to params. -func (w *ServerInterfaceWrapper) GetFactKeys(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetFactKeys(ctx *echo.Context) error { var err error - ctx.Set(BearerAuthScopes, []string{"agent:read"}) + ctx.Set(string(BearerAuthScopes), []string{"agent:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetFactKeys(ctx) @@ -63,31 +66,50 @@ func (w *ServerInterfaceWrapper) GetFactKeys(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/facts/keys", wrapper.GetFactKeys) + router.GET(options.BaseURL+"/api/facts/keys", wrapper.GetFactKeys, options.OperationMiddlewares["GetFactKeys"]...) } @@ -101,37 +123,57 @@ type GetFactKeysResponseObject interface { type GetFactKeys200JSONResponse FactKeysResponse func (response GetFactKeys200JSONResponse) VisitGetFactKeysResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFactKeys401JSONResponse externalRef0.ErrorResponse func (response GetFactKeys401JSONResponse) VisitGetFactKeysResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFactKeys403JSONResponse externalRef0.ErrorResponse func (response GetFactKeys403JSONResponse) VisitGetFactKeysResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFactKeys500JSONResponse externalRef0.ErrorResponse func (response GetFactKeys500JSONResponse) VisitGetFactKeysResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -141,8 +183,8 @@ type StrictServerInterface interface { GetFactKeys(ctx context.Context, request GetFactKeysRequestObject) (GetFactKeysResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -154,10 +196,10 @@ type strictHandler struct { } // GetFactKeys operation middleware -func (sh *strictHandler) GetFactKeys(ctx echo.Context) error { +func (sh *strictHandler) GetFactKeys(ctx *echo.Context) error { var request GetFactKeysRequestObject - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetFactKeys(ctx.Request().Context(), request.(GetFactKeysRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/facts/handler.go b/internal/controller/api/facts/handler.go index c1178060a..29a2e4d2c 100644 --- a/internal/controller/api/facts/handler.go +++ b/internal/controller/api/facts/handler.go @@ -23,8 +23,7 @@ package facts import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -44,14 +43,14 @@ func Handler( strictHandler := gen.NewStrictHandler( factsHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/facts/handler_public_test.go b/internal/controller/api/facts/handler_public_test.go index 6c8080bd8..adc64c92e 100644 --- a/internal/controller/api/facts/handler_public_test.go +++ b/internal/controller/api/facts/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "github.com/osapi-io/osapi/internal/controller/api/facts" @@ -54,7 +54,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/facts/keys", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/file/gen/cfg.yaml b/internal/controller/api/file/gen/cfg.yaml index b134d0d73..42509f427 100644 --- a/internal/controller/api/file/gen/cfg.yaml +++ b/internal/controller/api/file/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: file.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/file/gen/file.gen.go b/internal/controller/api/file/gen/file.gen.go index b28098f18..aafd960c6 100644 --- a/internal/controller/api/file/gen/file.gen.go +++ b/internal/controller/api/file/gen/file.gen.go @@ -1,24 +1,24 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "mime/multipart" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for PostFileMultipartBodyContentType. @@ -27,6 +27,18 @@ const ( Template PostFileMultipartBodyContentType = "template" ) +// Valid indicates whether the value is a known member of the PostFileMultipartBodyContentType enum. +func (e PostFileMultipartBodyContentType) Valid() bool { + switch e { + case Raw: + return true + case Template: + return true + default: + return false + } +} + // ErrorResponse defines model for ErrorResponse. type ErrorResponse = externalRef0.ErrorResponse @@ -134,6 +146,9 @@ type StaleDeploymentsResponse struct { // FileName defines model for FileName. type FileName = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PostFileMultipartBody defines parameters for PostFile. type PostFileMultipartBody struct { // ContentType How the file should be treated during deploy. "raw" writes bytes as-is; "template" renders with Go text/template and agent facts. @@ -162,19 +177,19 @@ type PostFileMultipartRequestBody PostFileMultipartBody type ServerInterface interface { // List stored files // (GET /api/file) - GetFiles(ctx echo.Context) error + GetFiles(ctx *echo.Context) error // Upload a file // (POST /api/file) - PostFile(ctx echo.Context, params PostFileParams) error + PostFile(ctx *echo.Context, params PostFileParams) error // List stale file deployments // (GET /api/file/stale) - GetFileStale(ctx echo.Context) error + GetFileStale(ctx *echo.Context) error // Delete a file // (DELETE /api/file/{name}) - DeleteFileByName(ctx echo.Context, name FileName) error + DeleteFileByName(ctx *echo.Context, name FileName) error // Get file metadata // (GET /api/file/{name}) - GetFileByName(ctx echo.Context, name FileName) error + GetFileByName(ctx *echo.Context, name FileName) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -183,10 +198,10 @@ type ServerInterfaceWrapper struct { } // GetFiles converts echo context to params. -func (w *ServerInterfaceWrapper) GetFiles(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetFiles(ctx *echo.Context) error { var err error - ctx.Set(BearerAuthScopes, []string{"file:read"}) + ctx.Set(string(BearerAuthScopes), []string{"file:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetFiles(ctx) @@ -194,16 +209,16 @@ func (w *ServerInterfaceWrapper) GetFiles(ctx echo.Context) error { } // PostFile converts echo context to params. -func (w *ServerInterfaceWrapper) PostFile(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostFile(ctx *echo.Context) error { var err error - ctx.Set(BearerAuthScopes, []string{"file:write"}) + ctx.Set(string(BearerAuthScopes), []string{"file:write"}) // Parameter object where we will unmarshal all parameters from the context var params PostFileParams // ------------- Optional query parameter "force" ------------- - err = runtime.BindQueryParameter("form", true, false, "force", ctx.QueryParams(), ¶ms.Force) + err = runtime.BindQueryParameterWithOptions("form", true, false, "force", ctx.QueryParams(), ¶ms.Force, runtime.BindQueryParameterOptions{Type: "boolean", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter force: %s", err)) } @@ -214,10 +229,10 @@ func (w *ServerInterfaceWrapper) PostFile(ctx echo.Context) error { } // GetFileStale converts echo context to params. -func (w *ServerInterfaceWrapper) GetFileStale(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetFileStale(ctx *echo.Context) error { var err error - ctx.Set(BearerAuthScopes, []string{"file:read"}) + ctx.Set(string(BearerAuthScopes), []string{"file:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetFileStale(ctx) @@ -225,17 +240,17 @@ func (w *ServerInterfaceWrapper) GetFileStale(ctx echo.Context) error { } // DeleteFileByName converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteFileByName(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteFileByName(ctx *echo.Context) error { var err error // ------------- Path parameter "name" ------------- var name FileName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"file:write"}) + ctx.Set(string(BearerAuthScopes), []string{"file:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteFileByName(ctx, name) @@ -243,17 +258,17 @@ func (w *ServerInterfaceWrapper) DeleteFileByName(ctx echo.Context) error { } // GetFileByName converts echo context to params. -func (w *ServerInterfaceWrapper) GetFileByName(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetFileByName(ctx *echo.Context) error { var err error // ------------- Path parameter "name" ------------- var name FileName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"file:read"}) + ctx.Set(string(BearerAuthScopes), []string{"file:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetFileByName(ctx, name) @@ -264,35 +279,54 @@ func (w *ServerInterfaceWrapper) GetFileByName(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/file", wrapper.GetFiles) - router.POST(baseURL+"/api/file", wrapper.PostFile) - router.GET(baseURL+"/api/file/stale", wrapper.GetFileStale) - router.DELETE(baseURL+"/api/file/:name", wrapper.DeleteFileByName) - router.GET(baseURL+"/api/file/:name", wrapper.GetFileByName) + router.GET(options.BaseURL+"/api/file", wrapper.GetFiles, options.OperationMiddlewares["GetFiles"]...) + router.POST(options.BaseURL+"/api/file", wrapper.PostFile, options.OperationMiddlewares["PostFile"]...) + router.GET(options.BaseURL+"/api/file/stale", wrapper.GetFileStale, options.OperationMiddlewares["GetFileStale"]...) + router.DELETE(options.BaseURL+"/api/file/:name", wrapper.DeleteFileByName, options.OperationMiddlewares["DeleteFileByName"]...) + router.GET(options.BaseURL+"/api/file/:name", wrapper.GetFileByName, options.OperationMiddlewares["GetFileByName"]...) } @@ -306,37 +340,57 @@ type GetFilesResponseObject interface { type GetFiles200JSONResponse FileListResponse func (response GetFiles200JSONResponse) VisitGetFilesResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFiles401JSONResponse externalRef0.ErrorResponse func (response GetFiles401JSONResponse) VisitGetFilesResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFiles403JSONResponse externalRef0.ErrorResponse func (response GetFiles403JSONResponse) VisitGetFilesResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFiles500JSONResponse externalRef0.ErrorResponse func (response GetFiles500JSONResponse) VisitGetFilesResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostFileRequestObject struct { @@ -351,55 +405,85 @@ type PostFileResponseObject interface { type PostFile201JSONResponse FileUploadResponse func (response PostFile201JSONResponse) VisitPostFileResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(201) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostFile400JSONResponse externalRef0.ErrorResponse func (response PostFile400JSONResponse) VisitPostFileResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostFile401JSONResponse externalRef0.ErrorResponse func (response PostFile401JSONResponse) VisitPostFileResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostFile403JSONResponse externalRef0.ErrorResponse func (response PostFile403JSONResponse) VisitPostFileResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostFile409JSONResponse externalRef0.ErrorResponse func (response PostFile409JSONResponse) VisitPostFileResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(409) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostFile500JSONResponse externalRef0.ErrorResponse func (response PostFile500JSONResponse) VisitPostFileResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFileStaleRequestObject struct { @@ -412,41 +496,61 @@ type GetFileStaleResponseObject interface { type GetFileStale200JSONResponse StaleDeploymentsResponse func (response GetFileStale200JSONResponse) VisitGetFileStaleResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFileStale401JSONResponse externalRef0.ErrorResponse func (response GetFileStale401JSONResponse) VisitGetFileStaleResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFileStale403JSONResponse externalRef0.ErrorResponse func (response GetFileStale403JSONResponse) VisitGetFileStaleResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFileStale500JSONResponse externalRef0.ErrorResponse func (response GetFileStale500JSONResponse) VisitGetFileStaleResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteFileByNameRequestObject struct { - Name FileName `json:"name"` + Name FileName `json:"name" validate:"required,min=1,max=255"` } type DeleteFileByNameResponseObject interface { @@ -456,59 +560,89 @@ type DeleteFileByNameResponseObject interface { type DeleteFileByName200JSONResponse FileDeleteResponse func (response DeleteFileByName200JSONResponse) VisitDeleteFileByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteFileByName400JSONResponse externalRef0.ErrorResponse func (response DeleteFileByName400JSONResponse) VisitDeleteFileByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteFileByName401JSONResponse externalRef0.ErrorResponse func (response DeleteFileByName401JSONResponse) VisitDeleteFileByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteFileByName403JSONResponse externalRef0.ErrorResponse func (response DeleteFileByName403JSONResponse) VisitDeleteFileByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteFileByName404JSONResponse externalRef0.ErrorResponse func (response DeleteFileByName404JSONResponse) VisitDeleteFileByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteFileByName500JSONResponse externalRef0.ErrorResponse func (response DeleteFileByName500JSONResponse) VisitDeleteFileByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFileByNameRequestObject struct { - Name FileName `json:"name"` + Name FileName `json:"name" validate:"required,min=1,max=255"` } type GetFileByNameResponseObject interface { @@ -518,55 +652,85 @@ type GetFileByNameResponseObject interface { type GetFileByName200JSONResponse FileInfoResponse func (response GetFileByName200JSONResponse) VisitGetFileByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFileByName400JSONResponse externalRef0.ErrorResponse func (response GetFileByName400JSONResponse) VisitGetFileByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFileByName401JSONResponse externalRef0.ErrorResponse func (response GetFileByName401JSONResponse) VisitGetFileByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFileByName403JSONResponse externalRef0.ErrorResponse func (response GetFileByName403JSONResponse) VisitGetFileByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFileByName404JSONResponse externalRef0.ErrorResponse func (response GetFileByName404JSONResponse) VisitGetFileByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetFileByName500JSONResponse externalRef0.ErrorResponse func (response GetFileByName500JSONResponse) VisitGetFileByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -588,8 +752,8 @@ type StrictServerInterface interface { GetFileByName(ctx context.Context, request GetFileByNameRequestObject) (GetFileByNameResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -601,10 +765,10 @@ type strictHandler struct { } // GetFiles operation middleware -func (sh *strictHandler) GetFiles(ctx echo.Context) error { +func (sh *strictHandler) GetFiles(ctx *echo.Context) error { var request GetFilesRequestObject - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetFiles(ctx.Request().Context(), request.(GetFilesRequestObject)) } for _, middleware := range sh.middlewares { @@ -624,7 +788,7 @@ func (sh *strictHandler) GetFiles(ctx echo.Context) error { } // PostFile operation middleware -func (sh *strictHandler) PostFile(ctx echo.Context, params PostFileParams) error { +func (sh *strictHandler) PostFile(ctx *echo.Context, params PostFileParams) error { var request PostFileRequestObject request.Params = params @@ -635,7 +799,7 @@ func (sh *strictHandler) PostFile(ctx echo.Context, params PostFileParams) error request.Body = reader } - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostFile(ctx.Request().Context(), request.(PostFileRequestObject)) } for _, middleware := range sh.middlewares { @@ -655,10 +819,10 @@ func (sh *strictHandler) PostFile(ctx echo.Context, params PostFileParams) error } // GetFileStale operation middleware -func (sh *strictHandler) GetFileStale(ctx echo.Context) error { +func (sh *strictHandler) GetFileStale(ctx *echo.Context) error { var request GetFileStaleRequestObject - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetFileStale(ctx.Request().Context(), request.(GetFileStaleRequestObject)) } for _, middleware := range sh.middlewares { @@ -678,12 +842,12 @@ func (sh *strictHandler) GetFileStale(ctx echo.Context) error { } // DeleteFileByName operation middleware -func (sh *strictHandler) DeleteFileByName(ctx echo.Context, name FileName) error { +func (sh *strictHandler) DeleteFileByName(ctx *echo.Context, name FileName) error { var request DeleteFileByNameRequestObject request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteFileByName(ctx.Request().Context(), request.(DeleteFileByNameRequestObject)) } for _, middleware := range sh.middlewares { @@ -703,12 +867,12 @@ func (sh *strictHandler) DeleteFileByName(ctx echo.Context, name FileName) error } // GetFileByName operation middleware -func (sh *strictHandler) GetFileByName(ctx echo.Context, name FileName) error { +func (sh *strictHandler) GetFileByName(ctx *echo.Context, name FileName) error { var request GetFileByNameRequestObject request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetFileByName(ctx.Request().Context(), request.(GetFileByNameRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/file/handler.go b/internal/controller/api/file/handler.go index e864d67e9..75a492f5d 100644 --- a/internal/controller/api/file/handler.go +++ b/internal/controller/api/file/handler.go @@ -23,8 +23,7 @@ package file import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( fileHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/file/handler_public_test.go b/internal/controller/api/file/handler_public_test.go index 208f835fa..dd1b5728f 100644 --- a/internal/controller/api/file/handler_public_test.go +++ b/internal/controller/api/file/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -56,7 +56,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/file", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/handler.go b/internal/controller/api/handler.go index b1ac8116b..ba59b21a9 100644 --- a/internal/controller/api/handler.go +++ b/internal/controller/api/handler.go @@ -22,7 +22,7 @@ package api import ( - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) // RegisterHandlers registers a list of handlers with the Echo instance. diff --git a/internal/controller/api/handler_public_test.go b/internal/controller/api/handler_public_test.go index a87e23d2f..bf99c5c03 100644 --- a/internal/controller/api/handler_public_test.go +++ b/internal/controller/api/handler_public_test.go @@ -25,7 +25,7 @@ import ( "testing" "time" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -112,9 +112,9 @@ func (s *HandlerPublicTestSuite) TestRegisterHandlers() { )..., ) - routesBefore := len(s.server.Echo.Routes()) + routesBefore := len(s.server.Echo.Router().Routes()) s.server.RegisterHandlers(handlers) - routesAfter := len(s.server.Echo.Routes()) + routesAfter := len(s.server.Echo.Router().Routes()) tt.validateFunc(routesAfter, routesBefore) }) } diff --git a/internal/controller/api/health/gen/cfg.yaml b/internal/controller/api/health/gen/cfg.yaml index 5aaf5dad4..69852f5c2 100644 --- a/internal/controller/api/health/gen/cfg.yaml +++ b/internal/controller/api/health/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: health.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/health/gen/health.gen.go b/internal/controller/api/health/gen/health.gen.go index dc3fbd449..d58d7ae07 100644 --- a/internal/controller/api/health/gen/health.gen.go +++ b/internal/controller/api/health/gen/health.gen.go @@ -1,21 +1,21 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // AgentDetail defines model for AgentDetail. @@ -218,17 +218,20 @@ type StreamInfo struct { Name string `json:"name"` } +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // ServerInterface represents all server handlers. type ServerInterface interface { // Liveness probe // (GET /api/health) - GetHealth(ctx echo.Context) error + GetHealth(ctx *echo.Context) error // Readiness probe // (GET /api/health/ready) - GetHealthReady(ctx echo.Context) error + GetHealthReady(ctx *echo.Context) error // System status and component health // (GET /api/health/status) - GetHealthStatus(ctx echo.Context) error + GetHealthStatus(ctx *echo.Context) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -237,7 +240,7 @@ type ServerInterfaceWrapper struct { } // GetHealth converts echo context to params. -func (w *ServerInterfaceWrapper) GetHealth(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetHealth(ctx *echo.Context) error { var err error // Invoke the callback with all the unmarshaled arguments @@ -246,7 +249,7 @@ func (w *ServerInterfaceWrapper) GetHealth(ctx echo.Context) error { } // GetHealthReady converts echo context to params. -func (w *ServerInterfaceWrapper) GetHealthReady(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetHealthReady(ctx *echo.Context) error { var err error // Invoke the callback with all the unmarshaled arguments @@ -255,10 +258,10 @@ func (w *ServerInterfaceWrapper) GetHealthReady(ctx echo.Context) error { } // GetHealthStatus converts echo context to params. -func (w *ServerInterfaceWrapper) GetHealthStatus(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetHealthStatus(ctx *echo.Context) error { var err error - ctx.Set(BearerAuthScopes, []string{"health:read"}) + ctx.Set(string(BearerAuthScopes), []string{"health:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetHealthStatus(ctx) @@ -269,33 +272,52 @@ func (w *ServerInterfaceWrapper) GetHealthStatus(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/health", wrapper.GetHealth) - router.GET(baseURL+"/api/health/ready", wrapper.GetHealthReady) - router.GET(baseURL+"/api/health/status", wrapper.GetHealthStatus) + router.GET(options.BaseURL+"/api/health", wrapper.GetHealth, options.OperationMiddlewares["GetHealth"]...) + router.GET(options.BaseURL+"/api/health/ready", wrapper.GetHealthReady, options.OperationMiddlewares["GetHealthReady"]...) + router.GET(options.BaseURL+"/api/health/status", wrapper.GetHealthStatus, options.OperationMiddlewares["GetHealthStatus"]...) } @@ -309,10 +331,15 @@ type GetHealthResponseObject interface { type GetHealth200JSONResponse HealthResponse func (response GetHealth200JSONResponse) VisitGetHealthResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetHealthReadyRequestObject struct { @@ -325,19 +352,29 @@ type GetHealthReadyResponseObject interface { type GetHealthReady200JSONResponse ReadyResponse func (response GetHealthReady200JSONResponse) VisitGetHealthReadyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetHealthReady503JSONResponse ReadyResponse func (response GetHealthReady503JSONResponse) VisitGetHealthReadyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(503) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetHealthStatusRequestObject struct { @@ -350,37 +387,57 @@ type GetHealthStatusResponseObject interface { type GetHealthStatus200JSONResponse StatusResponse func (response GetHealthStatus200JSONResponse) VisitGetHealthStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetHealthStatus401JSONResponse externalRef0.ErrorResponse func (response GetHealthStatus401JSONResponse) VisitGetHealthStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetHealthStatus403JSONResponse externalRef0.ErrorResponse func (response GetHealthStatus403JSONResponse) VisitGetHealthStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetHealthStatus503JSONResponse StatusResponse func (response GetHealthStatus503JSONResponse) VisitGetHealthStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(503) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -396,8 +453,8 @@ type StrictServerInterface interface { GetHealthStatus(ctx context.Context, request GetHealthStatusRequestObject) (GetHealthStatusResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -409,10 +466,10 @@ type strictHandler struct { } // GetHealth operation middleware -func (sh *strictHandler) GetHealth(ctx echo.Context) error { +func (sh *strictHandler) GetHealth(ctx *echo.Context) error { var request GetHealthRequestObject - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetHealth(ctx.Request().Context(), request.(GetHealthRequestObject)) } for _, middleware := range sh.middlewares { @@ -432,10 +489,10 @@ func (sh *strictHandler) GetHealth(ctx echo.Context) error { } // GetHealthReady operation middleware -func (sh *strictHandler) GetHealthReady(ctx echo.Context) error { +func (sh *strictHandler) GetHealthReady(ctx *echo.Context) error { var request GetHealthReadyRequestObject - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetHealthReady(ctx.Request().Context(), request.(GetHealthReadyRequestObject)) } for _, middleware := range sh.middlewares { @@ -455,10 +512,10 @@ func (sh *strictHandler) GetHealthReady(ctx echo.Context) error { } // GetHealthStatus operation middleware -func (sh *strictHandler) GetHealthStatus(ctx echo.Context) error { +func (sh *strictHandler) GetHealthStatus(ctx *echo.Context) error { var request GetHealthStatusRequestObject - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetHealthStatus(ctx.Request().Context(), request.(GetHealthStatusRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/health/handler.go b/internal/controller/api/health/handler.go index 4339d389f..2744f31f3 100644 --- a/internal/controller/api/health/handler.go +++ b/internal/controller/api/health/handler.go @@ -25,8 +25,7 @@ import ( "log/slog" "time" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -58,18 +57,18 @@ func Handler( strictHandler := gen.NewStrictHandler( healthHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, operationID string) strictecho.StrictEchoHandlerFunc { + func(handler gen.StrictHandlerFunc, operationID string) gen.StrictHandlerFunc { if unauthenticatedOperations[operationID] { return handler } - return api.ScopeMiddleware( - handler, + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/health/handler_public_test.go b/internal/controller/api/health/handler_public_test.go index 24ab165b8..d5f957658 100644 --- a/internal/controller/api/health/handler_public_test.go +++ b/internal/controller/api/health/handler_public_test.go @@ -27,7 +27,7 @@ import ( "testing" "time" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "github.com/osapi-io/osapi/internal/controller/api/health" @@ -55,7 +55,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/health", nil) rec := httptest.NewRecorder() @@ -69,7 +69,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/health/status", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/job/gen/cfg.yaml b/internal/controller/api/job/gen/cfg.yaml index 268cba413..41cc3b189 100644 --- a/internal/controller/api/job/gen/cfg.yaml +++ b/internal/controller/api/job/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: job.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/job/gen/job.gen.go b/internal/controller/api/job/gen/job.gen.go index 65bca3716..841eb45dc 100644 --- a/internal/controller/api/job/gen/job.gen.go +++ b/internal/controller/api/job/gen/job.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for GetJobsParamsStatus. @@ -29,6 +29,24 @@ const ( Submitted GetJobsParamsStatus = "submitted" ) +// Valid indicates whether the value is a known member of the GetJobsParamsStatus enum. +func (e GetJobsParamsStatus) Valid() bool { + switch e { + case Completed: + return true + case Failed: + return true + case PartialFailure: + return true + case Processing: + return true + case Submitted: + return true + default: + return false + } +} + // CreateJobResponse defines model for CreateJobResponse. type CreateJobResponse struct { // JobId Unique identifier for the created job. @@ -57,7 +75,7 @@ type JobDetailResponse struct { } `json:"agent_states,omitempty"` // Changed Whether the operation modified system state. Null for pending/failed jobs; true/false for completed jobs. - Changed *bool `json:"changed"` + Changed *bool `json:"changed,omitempty"` // Created Creation timestamp. Created *string `json:"created,omitempty"` @@ -76,7 +94,7 @@ type JobDetailResponse struct { // Responses Per-agent response data for broadcast jobs. Responses *map[string]struct { - Changed *bool `json:"changed"` + Changed *bool `json:"changed,omitempty"` // Data Agent result data. Data interface{} `json:"data,omitempty"` @@ -130,6 +148,9 @@ type RetryJobRequest struct { TargetHostname *string `json:"target_hostname,omitempty" validate:"omitempty,min=1,valid_target"` } +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // GetJobsParams defines parameters for GetJobs. type GetJobsParams struct { // Status Filter jobs by status. @@ -152,16 +173,16 @@ type RetryJobByIDJSONRequestBody = RetryJobRequest type ServerInterface interface { // List jobs // (GET /api/job) - GetJobs(ctx echo.Context, params GetJobsParams) error + GetJobs(ctx *echo.Context, params GetJobsParams) error // Delete a job // (DELETE /api/job/{id}) - DeleteJobByID(ctx echo.Context, id openapi_types.UUID) error + DeleteJobByID(ctx *echo.Context, id openapi_types.UUID) error // Get job detail // (GET /api/job/{id}) - GetJobByID(ctx echo.Context, id openapi_types.UUID) error + GetJobByID(ctx *echo.Context, id openapi_types.UUID) error // Retry a job // (POST /api/job/{id}/retry) - RetryJobByID(ctx echo.Context, id openapi_types.UUID) error + RetryJobByID(ctx *echo.Context, id openapi_types.UUID) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -170,30 +191,30 @@ type ServerInterfaceWrapper struct { } // GetJobs converts echo context to params. -func (w *ServerInterfaceWrapper) GetJobs(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetJobs(ctx *echo.Context) error { var err error - ctx.Set(BearerAuthScopes, []string{"job:read"}) + ctx.Set(string(BearerAuthScopes), []string{"job:read"}) // Parameter object where we will unmarshal all parameters from the context var params GetJobsParams // ------------- Optional query parameter "status" ------------- - err = runtime.BindQueryParameter("form", true, false, "status", ctx.QueryParams(), ¶ms.Status) + err = runtime.BindQueryParameterWithOptions("form", true, false, "status", ctx.QueryParams(), ¶ms.Status, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter status: %s", err)) } // ------------- Optional query parameter "limit" ------------- - err = runtime.BindQueryParameter("form", true, false, "limit", ctx.QueryParams(), ¶ms.Limit) + err = runtime.BindQueryParameterWithOptions("form", true, false, "limit", ctx.QueryParams(), ¶ms.Limit, runtime.BindQueryParameterOptions{Type: "integer", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter limit: %s", err)) } // ------------- Optional query parameter "offset" ------------- - err = runtime.BindQueryParameter("form", true, false, "offset", ctx.QueryParams(), ¶ms.Offset) + err = runtime.BindQueryParameterWithOptions("form", true, false, "offset", ctx.QueryParams(), ¶ms.Offset, runtime.BindQueryParameterOptions{Type: "integer", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter offset: %s", err)) } @@ -204,17 +225,17 @@ func (w *ServerInterfaceWrapper) GetJobs(ctx echo.Context) error { } // DeleteJobByID converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteJobByID(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteJobByID(ctx *echo.Context) error { var err error // ------------- Path parameter "id" ------------- var id openapi_types.UUID - err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "uuid"}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"job:write"}) + ctx.Set(string(BearerAuthScopes), []string{"job:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteJobByID(ctx, id) @@ -222,17 +243,17 @@ func (w *ServerInterfaceWrapper) DeleteJobByID(ctx echo.Context) error { } // GetJobByID converts echo context to params. -func (w *ServerInterfaceWrapper) GetJobByID(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetJobByID(ctx *echo.Context) error { var err error // ------------- Path parameter "id" ------------- var id openapi_types.UUID - err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "uuid"}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"job:read"}) + ctx.Set(string(BearerAuthScopes), []string{"job:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetJobByID(ctx, id) @@ -240,17 +261,17 @@ func (w *ServerInterfaceWrapper) GetJobByID(ctx echo.Context) error { } // RetryJobByID converts echo context to params. -func (w *ServerInterfaceWrapper) RetryJobByID(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) RetryJobByID(ctx *echo.Context) error { var err error // ------------- Path parameter "id" ------------- var id openapi_types.UUID - err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "uuid"}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"job:write"}) + ctx.Set(string(BearerAuthScopes), []string{"job:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.RetryJobByID(ctx, id) @@ -261,34 +282,53 @@ func (w *ServerInterfaceWrapper) RetryJobByID(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/job", wrapper.GetJobs) - router.DELETE(baseURL+"/api/job/:id", wrapper.DeleteJobByID) - router.GET(baseURL+"/api/job/:id", wrapper.GetJobByID) - router.POST(baseURL+"/api/job/:id/retry", wrapper.RetryJobByID) + router.GET(options.BaseURL+"/api/job", wrapper.GetJobs, options.OperationMiddlewares["getJobs"]...) + router.DELETE(options.BaseURL+"/api/job/:id", wrapper.DeleteJobByID, options.OperationMiddlewares["DeleteJobByID"]...) + router.GET(options.BaseURL+"/api/job/:id", wrapper.GetJobByID, options.OperationMiddlewares["GetJobByID"]...) + router.POST(options.BaseURL+"/api/job/:id/retry", wrapper.RetryJobByID, options.OperationMiddlewares["RetryJobByID"]...) } @@ -303,50 +343,75 @@ type GetJobsResponseObject interface { type GetJobs200JSONResponse ListJobsResponse func (response GetJobs200JSONResponse) VisitGetJobsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetJobs400JSONResponse externalRef0.ErrorResponse func (response GetJobs400JSONResponse) VisitGetJobsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetJobs401JSONResponse externalRef0.ErrorResponse func (response GetJobs401JSONResponse) VisitGetJobsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetJobs403JSONResponse externalRef0.ErrorResponse func (response GetJobs403JSONResponse) VisitGetJobsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetJobs500JSONResponse externalRef0.ErrorResponse func (response GetJobs500JSONResponse) VisitGetJobsResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteJobByIDRequestObject struct { - Id openapi_types.UUID `json:"id"` + Id openapi_types.UUID `json:"id" validate:"required,uuid"` } type DeleteJobByIDResponseObject interface { @@ -364,50 +429,75 @@ func (response DeleteJobByID204Response) VisitDeleteJobByIDResponse(w http.Respo type DeleteJobByID400JSONResponse externalRef0.ErrorResponse func (response DeleteJobByID400JSONResponse) VisitDeleteJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteJobByID401JSONResponse externalRef0.ErrorResponse func (response DeleteJobByID401JSONResponse) VisitDeleteJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteJobByID403JSONResponse externalRef0.ErrorResponse func (response DeleteJobByID403JSONResponse) VisitDeleteJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteJobByID404JSONResponse externalRef0.ErrorResponse func (response DeleteJobByID404JSONResponse) VisitDeleteJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteJobByID500JSONResponse externalRef0.ErrorResponse func (response DeleteJobByID500JSONResponse) VisitDeleteJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetJobByIDRequestObject struct { - Id openapi_types.UUID `json:"id"` + Id openapi_types.UUID `json:"id" validate:"required,uuid"` } type GetJobByIDResponseObject interface { @@ -417,59 +507,89 @@ type GetJobByIDResponseObject interface { type GetJobByID200JSONResponse JobDetailResponse func (response GetJobByID200JSONResponse) VisitGetJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetJobByID400JSONResponse externalRef0.ErrorResponse func (response GetJobByID400JSONResponse) VisitGetJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetJobByID401JSONResponse externalRef0.ErrorResponse func (response GetJobByID401JSONResponse) VisitGetJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetJobByID403JSONResponse externalRef0.ErrorResponse func (response GetJobByID403JSONResponse) VisitGetJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetJobByID404JSONResponse externalRef0.ErrorResponse func (response GetJobByID404JSONResponse) VisitGetJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetJobByID500JSONResponse externalRef0.ErrorResponse func (response GetJobByID500JSONResponse) VisitGetJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type RetryJobByIDRequestObject struct { - Id openapi_types.UUID `json:"id"` + Id openapi_types.UUID `json:"id" validate:"required,uuid"` Body *RetryJobByIDJSONRequestBody } @@ -480,55 +600,85 @@ type RetryJobByIDResponseObject interface { type RetryJobByID201JSONResponse CreateJobResponse func (response RetryJobByID201JSONResponse) VisitRetryJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(201) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type RetryJobByID400JSONResponse externalRef0.ErrorResponse func (response RetryJobByID400JSONResponse) VisitRetryJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type RetryJobByID401JSONResponse externalRef0.ErrorResponse func (response RetryJobByID401JSONResponse) VisitRetryJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type RetryJobByID403JSONResponse externalRef0.ErrorResponse func (response RetryJobByID403JSONResponse) VisitRetryJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type RetryJobByID404JSONResponse externalRef0.ErrorResponse func (response RetryJobByID404JSONResponse) VisitRetryJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type RetryJobByID500JSONResponse externalRef0.ErrorResponse func (response RetryJobByID500JSONResponse) VisitRetryJobByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -547,8 +697,8 @@ type StrictServerInterface interface { RetryJobByID(ctx context.Context, request RetryJobByIDRequestObject) (RetryJobByIDResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -560,12 +710,12 @@ type strictHandler struct { } // GetJobs operation middleware -func (sh *strictHandler) GetJobs(ctx echo.Context, params GetJobsParams) error { +func (sh *strictHandler) GetJobs(ctx *echo.Context, params GetJobsParams) error { var request GetJobsRequestObject request.Params = params - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetJobs(ctx.Request().Context(), request.(GetJobsRequestObject)) } for _, middleware := range sh.middlewares { @@ -585,12 +735,12 @@ func (sh *strictHandler) GetJobs(ctx echo.Context, params GetJobsParams) error { } // DeleteJobByID operation middleware -func (sh *strictHandler) DeleteJobByID(ctx echo.Context, id openapi_types.UUID) error { +func (sh *strictHandler) DeleteJobByID(ctx *echo.Context, id openapi_types.UUID) error { var request DeleteJobByIDRequestObject request.Id = id - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteJobByID(ctx.Request().Context(), request.(DeleteJobByIDRequestObject)) } for _, middleware := range sh.middlewares { @@ -610,12 +760,12 @@ func (sh *strictHandler) DeleteJobByID(ctx echo.Context, id openapi_types.UUID) } // GetJobByID operation middleware -func (sh *strictHandler) GetJobByID(ctx echo.Context, id openapi_types.UUID) error { +func (sh *strictHandler) GetJobByID(ctx *echo.Context, id openapi_types.UUID) error { var request GetJobByIDRequestObject request.Id = id - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetJobByID(ctx.Request().Context(), request.(GetJobByIDRequestObject)) } for _, middleware := range sh.middlewares { @@ -635,7 +785,7 @@ func (sh *strictHandler) GetJobByID(ctx echo.Context, id openapi_types.UUID) err } // RetryJobByID operation middleware -func (sh *strictHandler) RetryJobByID(ctx echo.Context, id openapi_types.UUID) error { +func (sh *strictHandler) RetryJobByID(ctx *echo.Context, id openapi_types.UUID) error { var request RetryJobByIDRequestObject request.Id = id @@ -646,7 +796,7 @@ func (sh *strictHandler) RetryJobByID(ctx echo.Context, id openapi_types.UUID) e } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.RetryJobByID(ctx.Request().Context(), request.(RetryJobByIDRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/job/handler.go b/internal/controller/api/job/handler.go index 63f869fcf..24dfb7bb2 100644 --- a/internal/controller/api/job/handler.go +++ b/internal/controller/api/job/handler.go @@ -23,8 +23,7 @@ package job import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( jobHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/job/handler_public_test.go b/internal/controller/api/job/handler_public_test.go index 8d82aabbd..a1af1e74f 100644 --- a/internal/controller/api/job/handler_public_test.go +++ b/internal/controller/api/job/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/job", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/job/job_get.go b/internal/controller/api/job/job_get.go index 8a5f3b71b..e96276721 100644 --- a/internal/controller/api/job/job_get.go +++ b/internal/controller/api/job/job_get.go @@ -87,7 +87,7 @@ func (j *Job) GetJobByID( // Expose per-agent responses for broadcast jobs. if len(qj.Responses) > 0 { respMap := make(map[string]struct { - Changed *bool `json:"changed"` + Changed *bool `json:"changed,omitempty"` Data interface{} `json:"data,omitempty"` Error *string `json:"error,omitempty"` Hostname *string `json:"hostname,omitempty"` @@ -95,7 +95,7 @@ func (j *Job) GetJobByID( }) for hostname, r := range qj.Responses { entry := struct { - Changed *bool `json:"changed"` + Changed *bool `json:"changed,omitempty"` Data interface{} `json:"data,omitempty"` Error *string `json:"error,omitempty"` Hostname *string `json:"hostname,omitempty"` diff --git a/internal/controller/api/middleware.go b/internal/controller/api/middleware.go index 5c7b8e8a4..6ef065d8a 100644 --- a/internal/controller/api/middleware.go +++ b/internal/controller/api/middleware.go @@ -25,8 +25,7 @@ import ( "net/http" "strings" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api/common/gen" @@ -48,14 +47,14 @@ type TokenValidator interface { // ScopeMiddleware validates JWT tokens and checks for required permissions. func ScopeMiddleware( - handler strictecho.StrictEchoHandlerFunc, + handler StrictHandlerFunc, tokenManager TokenValidator, signingKey string, contextKey string, customRoles map[string][]string, -) strictecho.StrictEchoHandlerFunc { - return strictecho.StrictEchoHandlerFunc( - func(ctx echo.Context, request interface{}) (response interface{}, err error) { +) StrictHandlerFunc { + return StrictHandlerFunc( + func(ctx *echo.Context, request interface{}) (response interface{}, err error) { authHeader := ctx.Request().Header.Get("Authorization") if authHeader == "" || !strings.HasPrefix(authHeader, "Bearer ") { errMsg := "Bearer token required" diff --git a/internal/controller/api/middleware_audit.go b/internal/controller/api/middleware_audit.go index 7bea2fe13..a4e5a2779 100644 --- a/internal/controller/api/middleware_audit.go +++ b/internal/controller/api/middleware_audit.go @@ -27,7 +27,7 @@ import ( "time" "github.com/google/uuid" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "go.opentelemetry.io/otel/trace" "github.com/osapi-io/osapi/internal/audit" @@ -46,7 +46,7 @@ func auditMiddleware( logger *slog.Logger, ) echo.MiddlewareFunc { return func(next echo.HandlerFunc) echo.HandlerFunc { - return func(c echo.Context) error { + return func(c *echo.Context) error { path := c.Request().URL.Path for _, prefix := range excludedAuditPaths { @@ -67,6 +67,14 @@ func auditMiddleware( roles, _ := c.Get(ContextKeyRoles).([]string) + // v5 returns the bare http.ResponseWriter from Response(). + // UnwrapResponse recovers Echo's wrapper, which is what + // records the status actually written. + responseCode := 0 + if resp, uerr := echo.UnwrapResponse(c.Response()); uerr == nil { + responseCode = resp.Status + } + entry := audit.Entry{ ID: uuid.New().String(), Timestamp: start, @@ -75,7 +83,7 @@ func auditMiddleware( Method: c.Request().Method, Path: path, SourceIP: c.RealIP(), - ResponseCode: c.Response().Status, + ResponseCode: responseCode, DurationMs: time.Since(start).Milliseconds(), } diff --git a/internal/controller/api/middleware_audit_public_test.go b/internal/controller/api/middleware_audit_public_test.go index 720c30c8e..4de2fa93f 100644 --- a/internal/controller/api/middleware_audit_public_test.go +++ b/internal/controller/api/middleware_audit_public_test.go @@ -28,7 +28,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.opentelemetry.io/otel/trace" @@ -153,7 +153,7 @@ func (s *AuditMiddlewarePublicTestSuite) TestAuditMiddleware() { e := echo.New() e.Use(api.ExportAuditMiddleware(store, logger)) - e.GET(tt.path, func(c echo.Context) error { + e.GET(tt.path, func(c *echo.Context) error { // Simulate scopeMiddleware setting context values. if tt.subject != "" { c.Set(api.ContextKeySubject, tt.subject) diff --git a/internal/controller/api/middleware_public_test.go b/internal/controller/api/middleware_public_test.go index 244fbeb80..88f28a9e3 100644 --- a/internal/controller/api/middleware_public_test.go +++ b/internal/controller/api/middleware_public_test.go @@ -26,8 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "github.com/osapi-io/osapi/internal/authtoken" @@ -157,8 +156,8 @@ func (s *MiddlewarePublicTestSuite) TestScopeMiddleware() { for _, tt := range tests { s.Run(tt.name, func() { handlerCalled := false - testHandler := strictecho.StrictEchoHandlerFunc( - func(_ echo.Context, _ interface{}) (interface{}, error) { + testHandler := api.StrictHandlerFunc( + func(_ *echo.Context, _ interface{}) (interface{}, error) { handlerCalled = true return "ok", nil }, @@ -241,8 +240,8 @@ func (s *MiddlewarePublicTestSuite) TestScopeMiddlewareCustomRoles() { for _, tt := range tests { s.Run(tt.name, func() { handlerCalled := false - testHandler := strictecho.StrictEchoHandlerFunc( - func(_ echo.Context, _ interface{}) (interface{}, error) { + testHandler := api.StrictHandlerFunc( + func(_ *echo.Context, _ interface{}) (interface{}, error) { handlerCalled = true return "ok", nil }, @@ -317,8 +316,8 @@ func (s *MiddlewarePublicTestSuite) TestScopeMiddlewareDirectPermissions() { for _, tt := range tests { s.Run(tt.name, func() { handlerCalled := false - testHandler := strictecho.StrictEchoHandlerFunc( - func(_ echo.Context, _ interface{}) (interface{}, error) { + testHandler := api.StrictHandlerFunc( + func(_ *echo.Context, _ interface{}) (interface{}, error) { handlerCalled = true return "ok", nil }, @@ -394,8 +393,8 @@ func (s *MiddlewarePublicTestSuite) TestScopeMiddlewareInjectsIdentity() { var capturedSubject string var capturedRoles []string - testHandler := strictecho.StrictEchoHandlerFunc( - func(ctx echo.Context, _ interface{}) (interface{}, error) { + testHandler := api.StrictHandlerFunc( + func(ctx *echo.Context, _ interface{}) (interface{}, error) { handlerCalled = true capturedSubject, _ = ctx.Get(api.ContextKeySubject).(string) capturedRoles, _ = ctx.Get(api.ContextKeyRoles).([]string) diff --git a/internal/controller/api/node/certificate/gen/certificate.gen.go b/internal/controller/api/node/certificate/gen/certificate.gen.go index 825c2ff54..698c47c95 100644 --- a/internal/controller/api/node/certificate/gen/certificate.gen.go +++ b/internal/controller/api/node/certificate/gen/certificate.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for CertificateCAEntryStatus. @@ -27,12 +27,38 @@ const ( CertificateCAEntryStatusSkipped CertificateCAEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the CertificateCAEntryStatus enum. +func (e CertificateCAEntryStatus) Valid() bool { + switch e { + case CertificateCAEntryStatusFailed: + return true + case CertificateCAEntryStatusOk: + return true + case CertificateCAEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for CertificateCAInfoSource. const ( Custom CertificateCAInfoSource = "custom" System CertificateCAInfoSource = "system" ) +// Valid indicates whether the value is a known member of the CertificateCAInfoSource enum. +func (e CertificateCAInfoSource) Valid() bool { + switch e { + case Custom: + return true + case System: + return true + default: + return false + } +} + // Defines values for CertificateCAMutationEntryStatus. const ( CertificateCAMutationEntryStatusFailed CertificateCAMutationEntryStatus = "failed" @@ -40,6 +66,20 @@ const ( CertificateCAMutationEntryStatusSkipped CertificateCAMutationEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the CertificateCAMutationEntryStatus enum. +func (e CertificateCAMutationEntryStatus) Valid() bool { + switch e { + case CertificateCAMutationEntryStatusFailed: + return true + case CertificateCAMutationEntryStatusOk: + return true + case CertificateCAMutationEntryStatusSkipped: + return true + default: + return false + } +} + // CertificateCACollectionResponse defines model for CertificateCACollectionResponse. type CertificateCACollectionResponse struct { // JobId The job ID used to process this request. @@ -132,6 +172,9 @@ type CertName = string // Hostname defines model for Hostname. type Hostname = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PostNodeCertificateCaJSONRequestBody defines body for PostNodeCertificateCa for application/json ContentType. type PostNodeCertificateCaJSONRequestBody = CertificateCACreateRequest @@ -142,16 +185,16 @@ type PutNodeCertificateCaJSONRequestBody = CertificateCAUpdateRequest type ServerInterface interface { // List all CA certificates // (GET /api/node/{hostname}/certificate/ca) - GetNodeCertificateCa(ctx echo.Context, hostname Hostname) error + GetNodeCertificateCa(ctx *echo.Context, hostname Hostname) error // Create a CA certificate // (POST /api/node/{hostname}/certificate/ca) - PostNodeCertificateCa(ctx echo.Context, hostname Hostname) error + PostNodeCertificateCa(ctx *echo.Context, hostname Hostname) error // Delete a CA certificate // (DELETE /api/node/{hostname}/certificate/ca/{name}) - DeleteNodeCertificateCa(ctx echo.Context, hostname Hostname, name CertName) error + DeleteNodeCertificateCa(ctx *echo.Context, hostname Hostname, name CertName) error // Update a CA certificate // (PUT /api/node/{hostname}/certificate/ca/{name}) - PutNodeCertificateCa(ctx echo.Context, hostname Hostname, name CertName) error + PutNodeCertificateCa(ctx *echo.Context, hostname Hostname, name CertName) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -160,17 +203,17 @@ type ServerInterfaceWrapper struct { } // GetNodeCertificateCa converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeCertificateCa(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeCertificateCa(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"certificate:read"}) + ctx.Set(string(BearerAuthScopes), []string{"certificate:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeCertificateCa(ctx, hostname) @@ -178,17 +221,17 @@ func (w *ServerInterfaceWrapper) GetNodeCertificateCa(ctx echo.Context) error { } // PostNodeCertificateCa converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeCertificateCa(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeCertificateCa(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"certificate:write"}) + ctx.Set(string(BearerAuthScopes), []string{"certificate:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeCertificateCa(ctx, hostname) @@ -196,12 +239,12 @@ func (w *ServerInterfaceWrapper) PostNodeCertificateCa(ctx echo.Context) error { } // DeleteNodeCertificateCa converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodeCertificateCa(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodeCertificateCa(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -209,12 +252,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeCertificateCa(ctx echo.Context) error // ------------- Path parameter "name" ------------- var name CertName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"certificate:write"}) + ctx.Set(string(BearerAuthScopes), []string{"certificate:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteNodeCertificateCa(ctx, hostname, name) @@ -222,12 +265,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeCertificateCa(ctx echo.Context) error } // PutNodeCertificateCa converts echo context to params. -func (w *ServerInterfaceWrapper) PutNodeCertificateCa(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PutNodeCertificateCa(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -235,12 +278,12 @@ func (w *ServerInterfaceWrapper) PutNodeCertificateCa(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name CertName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"certificate:write"}) + ctx.Set(string(BearerAuthScopes), []string{"certificate:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PutNodeCertificateCa(ctx, hostname, name) @@ -251,39 +294,58 @@ func (w *ServerInterfaceWrapper) PutNodeCertificateCa(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/node/:hostname/certificate/ca", wrapper.GetNodeCertificateCa) - router.POST(baseURL+"/api/node/:hostname/certificate/ca", wrapper.PostNodeCertificateCa) - router.DELETE(baseURL+"/api/node/:hostname/certificate/ca/:name", wrapper.DeleteNodeCertificateCa) - router.PUT(baseURL+"/api/node/:hostname/certificate/ca/:name", wrapper.PutNodeCertificateCa) + router.GET(options.BaseURL+"/api/node/:hostname/certificate/ca", wrapper.GetNodeCertificateCa, options.OperationMiddlewares["GetNodeCertificateCa"]...) + router.POST(options.BaseURL+"/api/node/:hostname/certificate/ca", wrapper.PostNodeCertificateCa, options.OperationMiddlewares["PostNodeCertificateCa"]...) + router.DELETE(options.BaseURL+"/api/node/:hostname/certificate/ca/:name", wrapper.DeleteNodeCertificateCa, options.OperationMiddlewares["DeleteNodeCertificateCa"]...) + router.PUT(options.BaseURL+"/api/node/:hostname/certificate/ca/:name", wrapper.PutNodeCertificateCa, options.OperationMiddlewares["PutNodeCertificateCa"]...) } type GetNodeCertificateCaRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeCertificateCaResponseObject interface { @@ -293,50 +355,75 @@ type GetNodeCertificateCaResponseObject interface { type GetNodeCertificateCa200JSONResponse CertificateCACollectionResponse func (response GetNodeCertificateCa200JSONResponse) VisitGetNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeCertificateCa400JSONResponse externalRef0.ErrorResponse func (response GetNodeCertificateCa400JSONResponse) VisitGetNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeCertificateCa401JSONResponse externalRef0.ErrorResponse func (response GetNodeCertificateCa401JSONResponse) VisitGetNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeCertificateCa403JSONResponse externalRef0.ErrorResponse func (response GetNodeCertificateCa403JSONResponse) VisitGetNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeCertificateCa500JSONResponse externalRef0.ErrorResponse func (response GetNodeCertificateCa500JSONResponse) VisitGetNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCertificateCaRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeCertificateCaJSONRequestBody } @@ -347,51 +434,76 @@ type PostNodeCertificateCaResponseObject interface { type PostNodeCertificateCa200JSONResponse CertificateCAMutationResponse func (response PostNodeCertificateCa200JSONResponse) VisitPostNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCertificateCa400JSONResponse externalRef0.ErrorResponse func (response PostNodeCertificateCa400JSONResponse) VisitPostNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCertificateCa401JSONResponse externalRef0.ErrorResponse func (response PostNodeCertificateCa401JSONResponse) VisitPostNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCertificateCa403JSONResponse externalRef0.ErrorResponse func (response PostNodeCertificateCa403JSONResponse) VisitPostNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCertificateCa500JSONResponse externalRef0.ErrorResponse func (response PostNodeCertificateCa500JSONResponse) VisitPostNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeCertificateCaRequestObject struct { - Hostname Hostname `json:"hostname"` - Name CertName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name CertName `json:"name" validate:"required,min=1"` } type DeleteNodeCertificateCaResponseObject interface { @@ -401,51 +513,76 @@ type DeleteNodeCertificateCaResponseObject interface { type DeleteNodeCertificateCa200JSONResponse CertificateCAMutationResponse func (response DeleteNodeCertificateCa200JSONResponse) VisitDeleteNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeCertificateCa400JSONResponse externalRef0.ErrorResponse func (response DeleteNodeCertificateCa400JSONResponse) VisitDeleteNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeCertificateCa401JSONResponse externalRef0.ErrorResponse func (response DeleteNodeCertificateCa401JSONResponse) VisitDeleteNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeCertificateCa403JSONResponse externalRef0.ErrorResponse func (response DeleteNodeCertificateCa403JSONResponse) VisitDeleteNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeCertificateCa500JSONResponse externalRef0.ErrorResponse func (response DeleteNodeCertificateCa500JSONResponse) VisitDeleteNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeCertificateCaRequestObject struct { - Hostname Hostname `json:"hostname"` - Name CertName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name CertName `json:"name" validate:"required,min=1"` Body *PutNodeCertificateCaJSONRequestBody } @@ -456,55 +593,85 @@ type PutNodeCertificateCaResponseObject interface { type PutNodeCertificateCa200JSONResponse CertificateCAMutationResponse func (response PutNodeCertificateCa200JSONResponse) VisitPutNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeCertificateCa400JSONResponse externalRef0.ErrorResponse func (response PutNodeCertificateCa400JSONResponse) VisitPutNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeCertificateCa401JSONResponse externalRef0.ErrorResponse func (response PutNodeCertificateCa401JSONResponse) VisitPutNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeCertificateCa403JSONResponse externalRef0.ErrorResponse func (response PutNodeCertificateCa403JSONResponse) VisitPutNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeCertificateCa404JSONResponse externalRef0.ErrorResponse func (response PutNodeCertificateCa404JSONResponse) VisitPutNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeCertificateCa500JSONResponse externalRef0.ErrorResponse func (response PutNodeCertificateCa500JSONResponse) VisitPutNodeCertificateCaResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -523,8 +690,8 @@ type StrictServerInterface interface { PutNodeCertificateCa(ctx context.Context, request PutNodeCertificateCaRequestObject) (PutNodeCertificateCaResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -536,12 +703,12 @@ type strictHandler struct { } // GetNodeCertificateCa operation middleware -func (sh *strictHandler) GetNodeCertificateCa(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeCertificateCa(ctx *echo.Context, hostname Hostname) error { var request GetNodeCertificateCaRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeCertificateCa(ctx.Request().Context(), request.(GetNodeCertificateCaRequestObject)) } for _, middleware := range sh.middlewares { @@ -561,7 +728,7 @@ func (sh *strictHandler) GetNodeCertificateCa(ctx echo.Context, hostname Hostnam } // PostNodeCertificateCa operation middleware -func (sh *strictHandler) PostNodeCertificateCa(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeCertificateCa(ctx *echo.Context, hostname Hostname) error { var request PostNodeCertificateCaRequestObject request.Hostname = hostname @@ -572,7 +739,7 @@ func (sh *strictHandler) PostNodeCertificateCa(ctx echo.Context, hostname Hostna } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeCertificateCa(ctx.Request().Context(), request.(PostNodeCertificateCaRequestObject)) } for _, middleware := range sh.middlewares { @@ -592,13 +759,13 @@ func (sh *strictHandler) PostNodeCertificateCa(ctx echo.Context, hostname Hostna } // DeleteNodeCertificateCa operation middleware -func (sh *strictHandler) DeleteNodeCertificateCa(ctx echo.Context, hostname Hostname, name CertName) error { +func (sh *strictHandler) DeleteNodeCertificateCa(ctx *echo.Context, hostname Hostname, name CertName) error { var request DeleteNodeCertificateCaRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodeCertificateCa(ctx.Request().Context(), request.(DeleteNodeCertificateCaRequestObject)) } for _, middleware := range sh.middlewares { @@ -618,7 +785,7 @@ func (sh *strictHandler) DeleteNodeCertificateCa(ctx echo.Context, hostname Host } // PutNodeCertificateCa operation middleware -func (sh *strictHandler) PutNodeCertificateCa(ctx echo.Context, hostname Hostname, name CertName) error { +func (sh *strictHandler) PutNodeCertificateCa(ctx *echo.Context, hostname Hostname, name CertName) error { var request PutNodeCertificateCaRequestObject request.Hostname = hostname @@ -630,7 +797,7 @@ func (sh *strictHandler) PutNodeCertificateCa(ctx echo.Context, hostname Hostnam } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PutNodeCertificateCa(ctx.Request().Context(), request.(PutNodeCertificateCaRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/certificate/gen/cfg.yaml b/internal/controller/api/node/certificate/gen/cfg.yaml index b432f3362..1c5b68901 100644 --- a/internal/controller/api/node/certificate/gen/cfg.yaml +++ b/internal/controller/api/node/certificate/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: certificate.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/certificate/handler.go b/internal/controller/api/node/certificate/handler.go index 3297f73b9..815dcde5a 100644 --- a/internal/controller/api/node/certificate/handler.go +++ b/internal/controller/api/node/certificate/handler.go @@ -23,8 +23,7 @@ package certificate import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( certificateHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/certificate/handler_public_test.go b/internal/controller/api/node/certificate/handler_public_test.go index 0f0f2cb47..b371b1877 100644 --- a/internal/controller/api/node/certificate/handler_public_test.go +++ b/internal/controller/api/node/certificate/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/node/hostname/certificate/ca", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/node/command/gen/cfg.yaml b/internal/controller/api/node/command/gen/cfg.yaml index 69cd536b1..fcb4d75ed 100644 --- a/internal/controller/api/node/command/gen/cfg.yaml +++ b/internal/controller/api/node/command/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: command.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/command/gen/command.gen.go b/internal/controller/api/node/command/gen/command.gen.go index 6fc4b755f..73be39405 100644 --- a/internal/controller/api/node/command/gen/command.gen.go +++ b/internal/controller/api/node/command/gen/command.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for CommandResultItemStatus. @@ -27,6 +27,20 @@ const ( Skipped CommandResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the CommandResultItemStatus enum. +func (e CommandResultItemStatus) Valid() bool { + switch e { + case Failed: + return true + case Ok: + return true + case Skipped: + return true + default: + return false + } +} + // CommandExecRequest defines model for CommandExecRequest. type CommandExecRequest struct { // Args Command arguments. @@ -97,6 +111,9 @@ type ErrorResponse = externalRef0.ErrorResponse // Hostname defines model for Hostname. type Hostname = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PostNodeCommandExecJSONRequestBody defines body for PostNodeCommandExec for application/json ContentType. type PostNodeCommandExecJSONRequestBody = CommandExecRequest @@ -107,10 +124,10 @@ type PostNodeCommandShellJSONRequestBody = CommandShellRequest type ServerInterface interface { // Execute a command // (POST /api/node/{hostname}/command/exec) - PostNodeCommandExec(ctx echo.Context, hostname Hostname) error + PostNodeCommandExec(ctx *echo.Context, hostname Hostname) error // Execute a shell command // (POST /api/node/{hostname}/command/shell) - PostNodeCommandShell(ctx echo.Context, hostname Hostname) error + PostNodeCommandShell(ctx *echo.Context, hostname Hostname) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -119,17 +136,17 @@ type ServerInterfaceWrapper struct { } // PostNodeCommandExec converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeCommandExec(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeCommandExec(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"command:execute"}) + ctx.Set(string(BearerAuthScopes), []string{"command:execute"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeCommandExec(ctx, hostname) @@ -137,17 +154,17 @@ func (w *ServerInterfaceWrapper) PostNodeCommandExec(ctx echo.Context) error { } // PostNodeCommandShell converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeCommandShell(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeCommandShell(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"command:execute"}) + ctx.Set(string(BearerAuthScopes), []string{"command:execute"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeCommandShell(ctx, hostname) @@ -158,37 +175,56 @@ func (w *ServerInterfaceWrapper) PostNodeCommandShell(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.POST(baseURL+"/api/node/:hostname/command/exec", wrapper.PostNodeCommandExec) - router.POST(baseURL+"/api/node/:hostname/command/shell", wrapper.PostNodeCommandShell) + router.POST(options.BaseURL+"/api/node/:hostname/command/exec", wrapper.PostNodeCommandExec, options.OperationMiddlewares["PostNodeCommandExec"]...) + router.POST(options.BaseURL+"/api/node/:hostname/command/shell", wrapper.PostNodeCommandShell, options.OperationMiddlewares["PostNodeCommandShell"]...) } type PostNodeCommandExecRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeCommandExecJSONRequestBody } @@ -199,50 +235,75 @@ type PostNodeCommandExecResponseObject interface { type PostNodeCommandExec202JSONResponse CommandResultCollectionResponse func (response PostNodeCommandExec202JSONResponse) VisitPostNodeCommandExecResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(202) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCommandExec400JSONResponse externalRef0.ErrorResponse func (response PostNodeCommandExec400JSONResponse) VisitPostNodeCommandExecResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCommandExec401JSONResponse externalRef0.ErrorResponse func (response PostNodeCommandExec401JSONResponse) VisitPostNodeCommandExecResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCommandExec403JSONResponse externalRef0.ErrorResponse func (response PostNodeCommandExec403JSONResponse) VisitPostNodeCommandExecResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCommandExec500JSONResponse externalRef0.ErrorResponse func (response PostNodeCommandExec500JSONResponse) VisitPostNodeCommandExecResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCommandShellRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeCommandShellJSONRequestBody } @@ -253,46 +314,71 @@ type PostNodeCommandShellResponseObject interface { type PostNodeCommandShell202JSONResponse CommandResultCollectionResponse func (response PostNodeCommandShell202JSONResponse) VisitPostNodeCommandShellResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(202) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCommandShell400JSONResponse externalRef0.ErrorResponse func (response PostNodeCommandShell400JSONResponse) VisitPostNodeCommandShellResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCommandShell401JSONResponse externalRef0.ErrorResponse func (response PostNodeCommandShell401JSONResponse) VisitPostNodeCommandShellResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCommandShell403JSONResponse externalRef0.ErrorResponse func (response PostNodeCommandShell403JSONResponse) VisitPostNodeCommandShellResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeCommandShell500JSONResponse externalRef0.ErrorResponse func (response PostNodeCommandShell500JSONResponse) VisitPostNodeCommandShellResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -305,8 +391,8 @@ type StrictServerInterface interface { PostNodeCommandShell(ctx context.Context, request PostNodeCommandShellRequestObject) (PostNodeCommandShellResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -318,7 +404,7 @@ type strictHandler struct { } // PostNodeCommandExec operation middleware -func (sh *strictHandler) PostNodeCommandExec(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeCommandExec(ctx *echo.Context, hostname Hostname) error { var request PostNodeCommandExecRequestObject request.Hostname = hostname @@ -329,7 +415,7 @@ func (sh *strictHandler) PostNodeCommandExec(ctx echo.Context, hostname Hostname } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeCommandExec(ctx.Request().Context(), request.(PostNodeCommandExecRequestObject)) } for _, middleware := range sh.middlewares { @@ -349,7 +435,7 @@ func (sh *strictHandler) PostNodeCommandExec(ctx echo.Context, hostname Hostname } // PostNodeCommandShell operation middleware -func (sh *strictHandler) PostNodeCommandShell(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeCommandShell(ctx *echo.Context, hostname Hostname) error { var request PostNodeCommandShellRequestObject request.Hostname = hostname @@ -360,7 +446,7 @@ func (sh *strictHandler) PostNodeCommandShell(ctx echo.Context, hostname Hostnam } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeCommandShell(ctx.Request().Context(), request.(PostNodeCommandShellRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/command/handler.go b/internal/controller/api/node/command/handler.go index 76b349863..85aa931bb 100644 --- a/internal/controller/api/node/command/handler.go +++ b/internal/controller/api/node/command/handler.go @@ -23,8 +23,7 @@ package command import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( commandHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/command/handler_public_test.go b/internal/controller/api/node/command/handler_public_test.go index b153fc4ca..7fc4866a7 100644 --- a/internal/controller/api/node/command/handler_public_test.go +++ b/internal/controller/api/node/command/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodPost, "/api/node/hostname/command/exec", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/node/docker/gen/cfg.yaml b/internal/controller/api/node/docker/gen/cfg.yaml index 2dcb5abe5..78355a9ba 100644 --- a/internal/controller/api/node/docker/gen/cfg.yaml +++ b/internal/controller/api/node/docker/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: docker.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/docker/gen/docker.gen.go b/internal/controller/api/node/docker/gen/docker.gen.go index 7cd8311b7..ea3352fad 100644 --- a/internal/controller/api/node/docker/gen/docker.gen.go +++ b/internal/controller/api/node/docker/gen/docker.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for DockerActionResultItemStatus. @@ -27,6 +27,20 @@ const ( DockerActionResultItemStatusSkipped DockerActionResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DockerActionResultItemStatus enum. +func (e DockerActionResultItemStatus) Valid() bool { + switch e { + case DockerActionResultItemStatusFailed: + return true + case DockerActionResultItemStatusOk: + return true + case DockerActionResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for DockerDetailResponseStatus. const ( DockerDetailResponseStatusFailed DockerDetailResponseStatus = "failed" @@ -34,6 +48,20 @@ const ( DockerDetailResponseStatusSkipped DockerDetailResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DockerDetailResponseStatus enum. +func (e DockerDetailResponseStatus) Valid() bool { + switch e { + case DockerDetailResponseStatusFailed: + return true + case DockerDetailResponseStatusOk: + return true + case DockerDetailResponseStatusSkipped: + return true + default: + return false + } +} + // Defines values for DockerExecResultItemStatus. const ( DockerExecResultItemStatusFailed DockerExecResultItemStatus = "failed" @@ -41,6 +69,20 @@ const ( DockerExecResultItemStatusSkipped DockerExecResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DockerExecResultItemStatus enum. +func (e DockerExecResultItemStatus) Valid() bool { + switch e { + case DockerExecResultItemStatusFailed: + return true + case DockerExecResultItemStatusOk: + return true + case DockerExecResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for DockerListItemStatus. const ( DockerListItemStatusFailed DockerListItemStatus = "failed" @@ -48,6 +90,20 @@ const ( DockerListItemStatusSkipped DockerListItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DockerListItemStatus enum. +func (e DockerListItemStatus) Valid() bool { + switch e { + case DockerListItemStatusFailed: + return true + case DockerListItemStatusOk: + return true + case DockerListItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for DockerPullResultItemStatus. const ( DockerPullResultItemStatusFailed DockerPullResultItemStatus = "failed" @@ -55,6 +111,20 @@ const ( DockerPullResultItemStatusSkipped DockerPullResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DockerPullResultItemStatus enum. +func (e DockerPullResultItemStatus) Valid() bool { + switch e { + case DockerPullResultItemStatusFailed: + return true + case DockerPullResultItemStatusOk: + return true + case DockerPullResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for DockerResponseStatus. const ( DockerResponseStatusFailed DockerResponseStatus = "failed" @@ -62,6 +132,20 @@ const ( DockerResponseStatusSkipped DockerResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DockerResponseStatus enum. +func (e DockerResponseStatus) Valid() bool { + switch e { + case DockerResponseStatusFailed: + return true + case DockerResponseStatusOk: + return true + case DockerResponseStatusSkipped: + return true + default: + return false + } +} + // Defines values for GetNodeContainerDockerParamsState. const ( All GetNodeContainerDockerParamsState = "all" @@ -69,6 +153,20 @@ const ( Stopped GetNodeContainerDockerParamsState = "stopped" ) +// Valid indicates whether the value is a known member of the GetNodeContainerDockerParamsState enum. +func (e GetNodeContainerDockerParamsState) Valid() bool { + switch e { + case All: + return true + case Running: + return true + case Stopped: + return true + default: + return false + } +} + // DockerActionCollectionResponse defines model for DockerActionCollectionResponse. type DockerActionCollectionResponse struct { // JobId The job ID used to process this request. @@ -372,6 +470,9 @@ type DockerId = string // Hostname defines model for Hostname. type Hostname = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // GetNodeContainerDockerParams defines parameters for GetNodeContainerDocker. type GetNodeContainerDockerParams struct { // State Filter containers by state. Defaults to "all". @@ -411,31 +512,31 @@ type PostNodeContainerDockerStopJSONRequestBody = DockerStopRequest type ServerInterface interface { // List containers // (GET /api/node/{hostname}/container/docker) - GetNodeContainerDocker(ctx echo.Context, hostname Hostname, params GetNodeContainerDockerParams) error + GetNodeContainerDocker(ctx *echo.Context, hostname Hostname, params GetNodeContainerDockerParams) error // Create a container // (POST /api/node/{hostname}/container/docker) - PostNodeContainerDocker(ctx echo.Context, hostname Hostname) error + PostNodeContainerDocker(ctx *echo.Context, hostname Hostname) error // Remove a container image // (DELETE /api/node/{hostname}/container/docker/image/{image}) - DeleteNodeContainerDockerImage(ctx echo.Context, hostname Hostname, image string, params DeleteNodeContainerDockerImageParams) error + DeleteNodeContainerDockerImage(ctx *echo.Context, hostname Hostname, image string, params DeleteNodeContainerDockerImageParams) error // Pull a container image // (POST /api/node/{hostname}/container/docker/pull) - PostNodeContainerDockerPull(ctx echo.Context, hostname Hostname) error + PostNodeContainerDockerPull(ctx *echo.Context, hostname Hostname) error // Remove a container // (DELETE /api/node/{hostname}/container/docker/{id}) - DeleteNodeContainerDockerByID(ctx echo.Context, hostname Hostname, id DockerId, params DeleteNodeContainerDockerByIDParams) error + DeleteNodeContainerDockerByID(ctx *echo.Context, hostname Hostname, id DockerId, params DeleteNodeContainerDockerByIDParams) error // Inspect a container // (GET /api/node/{hostname}/container/docker/{id}) - GetNodeContainerDockerByID(ctx echo.Context, hostname Hostname, id DockerId) error + GetNodeContainerDockerByID(ctx *echo.Context, hostname Hostname, id DockerId) error // Execute a command in a container // (POST /api/node/{hostname}/container/docker/{id}/exec) - PostNodeContainerDockerExec(ctx echo.Context, hostname Hostname, id DockerId) error + PostNodeContainerDockerExec(ctx *echo.Context, hostname Hostname, id DockerId) error // Start a container // (POST /api/node/{hostname}/container/docker/{id}/start) - PostNodeContainerDockerStart(ctx echo.Context, hostname Hostname, id DockerId) error + PostNodeContainerDockerStart(ctx *echo.Context, hostname Hostname, id DockerId) error // Stop a container // (POST /api/node/{hostname}/container/docker/{id}/stop) - PostNodeContainerDockerStop(ctx echo.Context, hostname Hostname, id DockerId) error + PostNodeContainerDockerStop(ctx *echo.Context, hostname Hostname, id DockerId) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -444,30 +545,30 @@ type ServerInterfaceWrapper struct { } // GetNodeContainerDocker converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeContainerDocker(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeContainerDocker(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"docker:read"}) + ctx.Set(string(BearerAuthScopes), []string{"docker:read"}) // Parameter object where we will unmarshal all parameters from the context var params GetNodeContainerDockerParams // ------------- Optional query parameter "state" ------------- - err = runtime.BindQueryParameter("form", true, false, "state", ctx.QueryParams(), ¶ms.State) + err = runtime.BindQueryParameterWithOptions("form", true, false, "state", ctx.QueryParams(), ¶ms.State, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter state: %s", err)) } // ------------- Optional query parameter "limit" ------------- - err = runtime.BindQueryParameter("form", true, false, "limit", ctx.QueryParams(), ¶ms.Limit) + err = runtime.BindQueryParameterWithOptions("form", true, false, "limit", ctx.QueryParams(), ¶ms.Limit, runtime.BindQueryParameterOptions{Type: "integer", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter limit: %s", err)) } @@ -478,17 +579,17 @@ func (w *ServerInterfaceWrapper) GetNodeContainerDocker(ctx echo.Context) error } // PostNodeContainerDocker converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeContainerDocker(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeContainerDocker(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"docker:write"}) + ctx.Set(string(BearerAuthScopes), []string{"docker:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeContainerDocker(ctx, hostname) @@ -496,12 +597,12 @@ func (w *ServerInterfaceWrapper) PostNodeContainerDocker(ctx echo.Context) error } // DeleteNodeContainerDockerImage converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodeContainerDockerImage(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodeContainerDockerImage(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -509,18 +610,18 @@ func (w *ServerInterfaceWrapper) DeleteNodeContainerDockerImage(ctx echo.Context // ------------- Path parameter "image" ------------- var image string - err = runtime.BindStyledParameterWithOptions("simple", "image", ctx.Param("image"), &image, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "image", ctx.Param("image"), &image, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter image: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"docker:write"}) + ctx.Set(string(BearerAuthScopes), []string{"docker:write"}) // Parameter object where we will unmarshal all parameters from the context var params DeleteNodeContainerDockerImageParams // ------------- Optional query parameter "force" ------------- - err = runtime.BindQueryParameter("form", true, false, "force", ctx.QueryParams(), ¶ms.Force) + err = runtime.BindQueryParameterWithOptions("form", true, false, "force", ctx.QueryParams(), ¶ms.Force, runtime.BindQueryParameterOptions{Type: "boolean", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter force: %s", err)) } @@ -531,17 +632,17 @@ func (w *ServerInterfaceWrapper) DeleteNodeContainerDockerImage(ctx echo.Context } // PostNodeContainerDockerPull converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeContainerDockerPull(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeContainerDockerPull(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"docker:write"}) + ctx.Set(string(BearerAuthScopes), []string{"docker:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeContainerDockerPull(ctx, hostname) @@ -549,12 +650,12 @@ func (w *ServerInterfaceWrapper) PostNodeContainerDockerPull(ctx echo.Context) e } // DeleteNodeContainerDockerByID converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodeContainerDockerByID(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodeContainerDockerByID(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -562,18 +663,18 @@ func (w *ServerInterfaceWrapper) DeleteNodeContainerDockerByID(ctx echo.Context) // ------------- Path parameter "id" ------------- var id DockerId - err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"docker:write"}) + ctx.Set(string(BearerAuthScopes), []string{"docker:write"}) // Parameter object where we will unmarshal all parameters from the context var params DeleteNodeContainerDockerByIDParams // ------------- Optional query parameter "force" ------------- - err = runtime.BindQueryParameter("form", true, false, "force", ctx.QueryParams(), ¶ms.Force) + err = runtime.BindQueryParameterWithOptions("form", true, false, "force", ctx.QueryParams(), ¶ms.Force, runtime.BindQueryParameterOptions{Type: "boolean", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter force: %s", err)) } @@ -584,12 +685,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeContainerDockerByID(ctx echo.Context) } // GetNodeContainerDockerByID converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeContainerDockerByID(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeContainerDockerByID(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -597,12 +698,12 @@ func (w *ServerInterfaceWrapper) GetNodeContainerDockerByID(ctx echo.Context) er // ------------- Path parameter "id" ------------- var id DockerId - err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"docker:read"}) + ctx.Set(string(BearerAuthScopes), []string{"docker:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeContainerDockerByID(ctx, hostname, id) @@ -610,12 +711,12 @@ func (w *ServerInterfaceWrapper) GetNodeContainerDockerByID(ctx echo.Context) er } // PostNodeContainerDockerExec converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeContainerDockerExec(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeContainerDockerExec(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -623,12 +724,12 @@ func (w *ServerInterfaceWrapper) PostNodeContainerDockerExec(ctx echo.Context) e // ------------- Path parameter "id" ------------- var id DockerId - err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"docker:execute"}) + ctx.Set(string(BearerAuthScopes), []string{"docker:execute"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeContainerDockerExec(ctx, hostname, id) @@ -636,12 +737,12 @@ func (w *ServerInterfaceWrapper) PostNodeContainerDockerExec(ctx echo.Context) e } // PostNodeContainerDockerStart converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeContainerDockerStart(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeContainerDockerStart(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -649,12 +750,12 @@ func (w *ServerInterfaceWrapper) PostNodeContainerDockerStart(ctx echo.Context) // ------------- Path parameter "id" ------------- var id DockerId - err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"docker:write"}) + ctx.Set(string(BearerAuthScopes), []string{"docker:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeContainerDockerStart(ctx, hostname, id) @@ -662,12 +763,12 @@ func (w *ServerInterfaceWrapper) PostNodeContainerDockerStart(ctx echo.Context) } // PostNodeContainerDockerStop converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeContainerDockerStop(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeContainerDockerStop(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -675,12 +776,12 @@ func (w *ServerInterfaceWrapper) PostNodeContainerDockerStop(ctx echo.Context) e // ------------- Path parameter "id" ------------- var id DockerId - err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"docker:write"}) + ctx.Set(string(BearerAuthScopes), []string{"docker:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeContainerDockerStop(ctx, hostname, id) @@ -691,44 +792,63 @@ func (w *ServerInterfaceWrapper) PostNodeContainerDockerStop(ctx echo.Context) e // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/node/:hostname/container/docker", wrapper.GetNodeContainerDocker) - router.POST(baseURL+"/api/node/:hostname/container/docker", wrapper.PostNodeContainerDocker) - router.DELETE(baseURL+"/api/node/:hostname/container/docker/image/:image", wrapper.DeleteNodeContainerDockerImage) - router.POST(baseURL+"/api/node/:hostname/container/docker/pull", wrapper.PostNodeContainerDockerPull) - router.DELETE(baseURL+"/api/node/:hostname/container/docker/:id", wrapper.DeleteNodeContainerDockerByID) - router.GET(baseURL+"/api/node/:hostname/container/docker/:id", wrapper.GetNodeContainerDockerByID) - router.POST(baseURL+"/api/node/:hostname/container/docker/:id/exec", wrapper.PostNodeContainerDockerExec) - router.POST(baseURL+"/api/node/:hostname/container/docker/:id/start", wrapper.PostNodeContainerDockerStart) - router.POST(baseURL+"/api/node/:hostname/container/docker/:id/stop", wrapper.PostNodeContainerDockerStop) + router.GET(options.BaseURL+"/api/node/:hostname/container/docker", wrapper.GetNodeContainerDocker, options.OperationMiddlewares["GetNodeContainerDocker"]...) + router.POST(options.BaseURL+"/api/node/:hostname/container/docker", wrapper.PostNodeContainerDocker, options.OperationMiddlewares["PostNodeContainerDocker"]...) + router.DELETE(options.BaseURL+"/api/node/:hostname/container/docker/image/:image", wrapper.DeleteNodeContainerDockerImage, options.OperationMiddlewares["DeleteNodeContainerDockerImage"]...) + router.POST(options.BaseURL+"/api/node/:hostname/container/docker/pull", wrapper.PostNodeContainerDockerPull, options.OperationMiddlewares["PostNodeContainerDockerPull"]...) + router.DELETE(options.BaseURL+"/api/node/:hostname/container/docker/:id", wrapper.DeleteNodeContainerDockerByID, options.OperationMiddlewares["DeleteNodeContainerDockerByID"]...) + router.GET(options.BaseURL+"/api/node/:hostname/container/docker/:id", wrapper.GetNodeContainerDockerByID, options.OperationMiddlewares["GetNodeContainerDockerByID"]...) + router.POST(options.BaseURL+"/api/node/:hostname/container/docker/:id/exec", wrapper.PostNodeContainerDockerExec, options.OperationMiddlewares["PostNodeContainerDockerExec"]...) + router.POST(options.BaseURL+"/api/node/:hostname/container/docker/:id/start", wrapper.PostNodeContainerDockerStart, options.OperationMiddlewares["PostNodeContainerDockerStart"]...) + router.POST(options.BaseURL+"/api/node/:hostname/container/docker/:id/stop", wrapper.PostNodeContainerDockerStop, options.OperationMiddlewares["PostNodeContainerDockerStop"]...) } type GetNodeContainerDockerRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Params GetNodeContainerDockerParams } @@ -739,50 +859,75 @@ type GetNodeContainerDockerResponseObject interface { type GetNodeContainerDocker200JSONResponse DockerListCollectionResponse func (response GetNodeContainerDocker200JSONResponse) VisitGetNodeContainerDockerResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeContainerDocker400JSONResponse externalRef0.ErrorResponse func (response GetNodeContainerDocker400JSONResponse) VisitGetNodeContainerDockerResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeContainerDocker401JSONResponse externalRef0.ErrorResponse func (response GetNodeContainerDocker401JSONResponse) VisitGetNodeContainerDockerResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeContainerDocker403JSONResponse externalRef0.ErrorResponse func (response GetNodeContainerDocker403JSONResponse) VisitGetNodeContainerDockerResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeContainerDocker500JSONResponse externalRef0.ErrorResponse func (response GetNodeContainerDocker500JSONResponse) VisitGetNodeContainerDockerResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeContainerDockerJSONRequestBody } @@ -793,51 +938,76 @@ type PostNodeContainerDockerResponseObject interface { type PostNodeContainerDocker202JSONResponse DockerResultCollectionResponse func (response PostNodeContainerDocker202JSONResponse) VisitPostNodeContainerDockerResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(202) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDocker400JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDocker400JSONResponse) VisitPostNodeContainerDockerResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDocker401JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDocker401JSONResponse) VisitPostNodeContainerDockerResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDocker403JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDocker403JSONResponse) VisitPostNodeContainerDockerResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDocker500JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDocker500JSONResponse) VisitPostNodeContainerDockerResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeContainerDockerImageRequestObject struct { - Hostname Hostname `json:"hostname"` - Image string `json:"image"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Image string `json:"image" validate:"required,min=1"` Params DeleteNodeContainerDockerImageParams } @@ -848,50 +1018,75 @@ type DeleteNodeContainerDockerImageResponseObject interface { type DeleteNodeContainerDockerImage202JSONResponse DockerActionCollectionResponse func (response DeleteNodeContainerDockerImage202JSONResponse) VisitDeleteNodeContainerDockerImageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(202) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeContainerDockerImage400JSONResponse externalRef0.ErrorResponse func (response DeleteNodeContainerDockerImage400JSONResponse) VisitDeleteNodeContainerDockerImageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeContainerDockerImage401JSONResponse externalRef0.ErrorResponse func (response DeleteNodeContainerDockerImage401JSONResponse) VisitDeleteNodeContainerDockerImageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeContainerDockerImage403JSONResponse externalRef0.ErrorResponse func (response DeleteNodeContainerDockerImage403JSONResponse) VisitDeleteNodeContainerDockerImageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeContainerDockerImage500JSONResponse externalRef0.ErrorResponse func (response DeleteNodeContainerDockerImage500JSONResponse) VisitDeleteNodeContainerDockerImageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerPullRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeContainerDockerPullJSONRequestBody } @@ -902,51 +1097,76 @@ type PostNodeContainerDockerPullResponseObject interface { type PostNodeContainerDockerPull202JSONResponse DockerPullCollectionResponse func (response PostNodeContainerDockerPull202JSONResponse) VisitPostNodeContainerDockerPullResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(202) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerPull400JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerPull400JSONResponse) VisitPostNodeContainerDockerPullResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerPull401JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerPull401JSONResponse) VisitPostNodeContainerDockerPullResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerPull403JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerPull403JSONResponse) VisitPostNodeContainerDockerPullResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerPull500JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerPull500JSONResponse) VisitPostNodeContainerDockerPullResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeContainerDockerByIDRequestObject struct { - Hostname Hostname `json:"hostname"` - Id DockerId `json:"id"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Id DockerId `json:"id" validate:"required,min=1"` Params DeleteNodeContainerDockerByIDParams } @@ -957,60 +1177,90 @@ type DeleteNodeContainerDockerByIDResponseObject interface { type DeleteNodeContainerDockerByID202JSONResponse DockerActionCollectionResponse func (response DeleteNodeContainerDockerByID202JSONResponse) VisitDeleteNodeContainerDockerByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(202) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeContainerDockerByID400JSONResponse externalRef0.ErrorResponse func (response DeleteNodeContainerDockerByID400JSONResponse) VisitDeleteNodeContainerDockerByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeContainerDockerByID401JSONResponse externalRef0.ErrorResponse func (response DeleteNodeContainerDockerByID401JSONResponse) VisitDeleteNodeContainerDockerByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeContainerDockerByID403JSONResponse externalRef0.ErrorResponse func (response DeleteNodeContainerDockerByID403JSONResponse) VisitDeleteNodeContainerDockerByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeContainerDockerByID404JSONResponse externalRef0.ErrorResponse func (response DeleteNodeContainerDockerByID404JSONResponse) VisitDeleteNodeContainerDockerByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeContainerDockerByID500JSONResponse externalRef0.ErrorResponse func (response DeleteNodeContainerDockerByID500JSONResponse) VisitDeleteNodeContainerDockerByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeContainerDockerByIDRequestObject struct { - Hostname Hostname `json:"hostname"` - Id DockerId `json:"id"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Id DockerId `json:"id" validate:"required,min=1"` } type GetNodeContainerDockerByIDResponseObject interface { @@ -1020,60 +1270,90 @@ type GetNodeContainerDockerByIDResponseObject interface { type GetNodeContainerDockerByID200JSONResponse DockerDetailCollectionResponse func (response GetNodeContainerDockerByID200JSONResponse) VisitGetNodeContainerDockerByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeContainerDockerByID400JSONResponse externalRef0.ErrorResponse func (response GetNodeContainerDockerByID400JSONResponse) VisitGetNodeContainerDockerByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeContainerDockerByID401JSONResponse externalRef0.ErrorResponse func (response GetNodeContainerDockerByID401JSONResponse) VisitGetNodeContainerDockerByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeContainerDockerByID403JSONResponse externalRef0.ErrorResponse func (response GetNodeContainerDockerByID403JSONResponse) VisitGetNodeContainerDockerByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeContainerDockerByID404JSONResponse externalRef0.ErrorResponse func (response GetNodeContainerDockerByID404JSONResponse) VisitGetNodeContainerDockerByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeContainerDockerByID500JSONResponse externalRef0.ErrorResponse func (response GetNodeContainerDockerByID500JSONResponse) VisitGetNodeContainerDockerByIDResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerExecRequestObject struct { - Hostname Hostname `json:"hostname"` - Id DockerId `json:"id"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Id DockerId `json:"id" validate:"required,min=1"` Body *PostNodeContainerDockerExecJSONRequestBody } @@ -1084,60 +1364,90 @@ type PostNodeContainerDockerExecResponseObject interface { type PostNodeContainerDockerExec202JSONResponse DockerExecCollectionResponse func (response PostNodeContainerDockerExec202JSONResponse) VisitPostNodeContainerDockerExecResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(202) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerExec400JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerExec400JSONResponse) VisitPostNodeContainerDockerExecResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerExec401JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerExec401JSONResponse) VisitPostNodeContainerDockerExecResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerExec403JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerExec403JSONResponse) VisitPostNodeContainerDockerExecResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerExec404JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerExec404JSONResponse) VisitPostNodeContainerDockerExecResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerExec500JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerExec500JSONResponse) VisitPostNodeContainerDockerExecResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerStartRequestObject struct { - Hostname Hostname `json:"hostname"` - Id DockerId `json:"id"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Id DockerId `json:"id" validate:"required,min=1"` } type PostNodeContainerDockerStartResponseObject interface { @@ -1147,60 +1457,90 @@ type PostNodeContainerDockerStartResponseObject interface { type PostNodeContainerDockerStart202JSONResponse DockerActionCollectionResponse func (response PostNodeContainerDockerStart202JSONResponse) VisitPostNodeContainerDockerStartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(202) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerStart400JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerStart400JSONResponse) VisitPostNodeContainerDockerStartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerStart401JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerStart401JSONResponse) VisitPostNodeContainerDockerStartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerStart403JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerStart403JSONResponse) VisitPostNodeContainerDockerStartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerStart404JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerStart404JSONResponse) VisitPostNodeContainerDockerStartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerStart500JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerStart500JSONResponse) VisitPostNodeContainerDockerStartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerStopRequestObject struct { - Hostname Hostname `json:"hostname"` - Id DockerId `json:"id"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Id DockerId `json:"id" validate:"required,min=1"` Body *PostNodeContainerDockerStopJSONRequestBody } @@ -1211,55 +1551,85 @@ type PostNodeContainerDockerStopResponseObject interface { type PostNodeContainerDockerStop202JSONResponse DockerActionCollectionResponse func (response PostNodeContainerDockerStop202JSONResponse) VisitPostNodeContainerDockerStopResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(202) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerStop400JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerStop400JSONResponse) VisitPostNodeContainerDockerStopResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerStop401JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerStop401JSONResponse) VisitPostNodeContainerDockerStopResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerStop403JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerStop403JSONResponse) VisitPostNodeContainerDockerStopResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerStop404JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerStop404JSONResponse) VisitPostNodeContainerDockerStopResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeContainerDockerStop500JSONResponse externalRef0.ErrorResponse func (response PostNodeContainerDockerStop500JSONResponse) VisitPostNodeContainerDockerStopResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -1293,8 +1663,8 @@ type StrictServerInterface interface { PostNodeContainerDockerStop(ctx context.Context, request PostNodeContainerDockerStopRequestObject) (PostNodeContainerDockerStopResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -1306,13 +1676,13 @@ type strictHandler struct { } // GetNodeContainerDocker operation middleware -func (sh *strictHandler) GetNodeContainerDocker(ctx echo.Context, hostname Hostname, params GetNodeContainerDockerParams) error { +func (sh *strictHandler) GetNodeContainerDocker(ctx *echo.Context, hostname Hostname, params GetNodeContainerDockerParams) error { var request GetNodeContainerDockerRequestObject request.Hostname = hostname request.Params = params - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeContainerDocker(ctx.Request().Context(), request.(GetNodeContainerDockerRequestObject)) } for _, middleware := range sh.middlewares { @@ -1332,7 +1702,7 @@ func (sh *strictHandler) GetNodeContainerDocker(ctx echo.Context, hostname Hostn } // PostNodeContainerDocker operation middleware -func (sh *strictHandler) PostNodeContainerDocker(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeContainerDocker(ctx *echo.Context, hostname Hostname) error { var request PostNodeContainerDockerRequestObject request.Hostname = hostname @@ -1343,7 +1713,7 @@ func (sh *strictHandler) PostNodeContainerDocker(ctx echo.Context, hostname Host } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeContainerDocker(ctx.Request().Context(), request.(PostNodeContainerDockerRequestObject)) } for _, middleware := range sh.middlewares { @@ -1363,14 +1733,14 @@ func (sh *strictHandler) PostNodeContainerDocker(ctx echo.Context, hostname Host } // DeleteNodeContainerDockerImage operation middleware -func (sh *strictHandler) DeleteNodeContainerDockerImage(ctx echo.Context, hostname Hostname, image string, params DeleteNodeContainerDockerImageParams) error { +func (sh *strictHandler) DeleteNodeContainerDockerImage(ctx *echo.Context, hostname Hostname, image string, params DeleteNodeContainerDockerImageParams) error { var request DeleteNodeContainerDockerImageRequestObject request.Hostname = hostname request.Image = image request.Params = params - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodeContainerDockerImage(ctx.Request().Context(), request.(DeleteNodeContainerDockerImageRequestObject)) } for _, middleware := range sh.middlewares { @@ -1390,7 +1760,7 @@ func (sh *strictHandler) DeleteNodeContainerDockerImage(ctx echo.Context, hostna } // PostNodeContainerDockerPull operation middleware -func (sh *strictHandler) PostNodeContainerDockerPull(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeContainerDockerPull(ctx *echo.Context, hostname Hostname) error { var request PostNodeContainerDockerPullRequestObject request.Hostname = hostname @@ -1401,7 +1771,7 @@ func (sh *strictHandler) PostNodeContainerDockerPull(ctx echo.Context, hostname } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeContainerDockerPull(ctx.Request().Context(), request.(PostNodeContainerDockerPullRequestObject)) } for _, middleware := range sh.middlewares { @@ -1421,14 +1791,14 @@ func (sh *strictHandler) PostNodeContainerDockerPull(ctx echo.Context, hostname } // DeleteNodeContainerDockerByID operation middleware -func (sh *strictHandler) DeleteNodeContainerDockerByID(ctx echo.Context, hostname Hostname, id DockerId, params DeleteNodeContainerDockerByIDParams) error { +func (sh *strictHandler) DeleteNodeContainerDockerByID(ctx *echo.Context, hostname Hostname, id DockerId, params DeleteNodeContainerDockerByIDParams) error { var request DeleteNodeContainerDockerByIDRequestObject request.Hostname = hostname request.Id = id request.Params = params - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodeContainerDockerByID(ctx.Request().Context(), request.(DeleteNodeContainerDockerByIDRequestObject)) } for _, middleware := range sh.middlewares { @@ -1448,13 +1818,13 @@ func (sh *strictHandler) DeleteNodeContainerDockerByID(ctx echo.Context, hostnam } // GetNodeContainerDockerByID operation middleware -func (sh *strictHandler) GetNodeContainerDockerByID(ctx echo.Context, hostname Hostname, id DockerId) error { +func (sh *strictHandler) GetNodeContainerDockerByID(ctx *echo.Context, hostname Hostname, id DockerId) error { var request GetNodeContainerDockerByIDRequestObject request.Hostname = hostname request.Id = id - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeContainerDockerByID(ctx.Request().Context(), request.(GetNodeContainerDockerByIDRequestObject)) } for _, middleware := range sh.middlewares { @@ -1474,7 +1844,7 @@ func (sh *strictHandler) GetNodeContainerDockerByID(ctx echo.Context, hostname H } // PostNodeContainerDockerExec operation middleware -func (sh *strictHandler) PostNodeContainerDockerExec(ctx echo.Context, hostname Hostname, id DockerId) error { +func (sh *strictHandler) PostNodeContainerDockerExec(ctx *echo.Context, hostname Hostname, id DockerId) error { var request PostNodeContainerDockerExecRequestObject request.Hostname = hostname @@ -1486,7 +1856,7 @@ func (sh *strictHandler) PostNodeContainerDockerExec(ctx echo.Context, hostname } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeContainerDockerExec(ctx.Request().Context(), request.(PostNodeContainerDockerExecRequestObject)) } for _, middleware := range sh.middlewares { @@ -1506,13 +1876,13 @@ func (sh *strictHandler) PostNodeContainerDockerExec(ctx echo.Context, hostname } // PostNodeContainerDockerStart operation middleware -func (sh *strictHandler) PostNodeContainerDockerStart(ctx echo.Context, hostname Hostname, id DockerId) error { +func (sh *strictHandler) PostNodeContainerDockerStart(ctx *echo.Context, hostname Hostname, id DockerId) error { var request PostNodeContainerDockerStartRequestObject request.Hostname = hostname request.Id = id - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeContainerDockerStart(ctx.Request().Context(), request.(PostNodeContainerDockerStartRequestObject)) } for _, middleware := range sh.middlewares { @@ -1532,7 +1902,7 @@ func (sh *strictHandler) PostNodeContainerDockerStart(ctx echo.Context, hostname } // PostNodeContainerDockerStop operation middleware -func (sh *strictHandler) PostNodeContainerDockerStop(ctx echo.Context, hostname Hostname, id DockerId) error { +func (sh *strictHandler) PostNodeContainerDockerStop(ctx *echo.Context, hostname Hostname, id DockerId) error { var request PostNodeContainerDockerStopRequestObject request.Hostname = hostname @@ -1544,7 +1914,7 @@ func (sh *strictHandler) PostNodeContainerDockerStop(ctx echo.Context, hostname } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeContainerDockerStop(ctx.Request().Context(), request.(PostNodeContainerDockerStopRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/docker/handler.go b/internal/controller/api/node/docker/handler.go index 9036cb093..0494996d6 100644 --- a/internal/controller/api/node/docker/handler.go +++ b/internal/controller/api/node/docker/handler.go @@ -23,8 +23,7 @@ package container import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( dockerHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/docker/handler_public_test.go b/internal/controller/api/node/docker/handler_public_test.go index 1aa39b98b..d61b79fc8 100644 --- a/internal/controller/api/node/docker/handler_public_test.go +++ b/internal/controller/api/node/docker/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest( http.MethodGet, diff --git a/internal/controller/api/node/file/gen/cfg.yaml b/internal/controller/api/node/file/gen/cfg.yaml index beccbd543..9b82a62a7 100644 --- a/internal/controller/api/node/file/gen/cfg.yaml +++ b/internal/controller/api/node/file/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: file.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/file/gen/file.gen.go b/internal/controller/api/node/file/gen/file.gen.go index e923fe76c..9523dc146 100644 --- a/internal/controller/api/node/file/gen/file.gen.go +++ b/internal/controller/api/node/file/gen/file.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for FileDeployRequestContentType. @@ -26,6 +26,18 @@ const ( Template FileDeployRequestContentType = "template" ) +// Valid indicates whether the value is a known member of the FileDeployRequestContentType enum. +func (e FileDeployRequestContentType) Valid() bool { + switch e { + case Raw: + return true + case Template: + return true + default: + return false + } +} + // Defines values for FileDeployResultStatus. const ( FileDeployResultStatusFailed FileDeployResultStatus = "failed" @@ -33,6 +45,20 @@ const ( FileDeployResultStatusSkipped FileDeployResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the FileDeployResultStatus enum. +func (e FileDeployResultStatus) Valid() bool { + switch e { + case FileDeployResultStatusFailed: + return true + case FileDeployResultStatusOk: + return true + case FileDeployResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for FileUndeployResultStatus. const ( FileUndeployResultStatusFailed FileUndeployResultStatus = "failed" @@ -40,6 +66,20 @@ const ( FileUndeployResultStatusSkipped FileUndeployResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the FileUndeployResultStatus enum. +func (e FileUndeployResultStatus) Valid() bool { + switch e { + case FileUndeployResultStatusFailed: + return true + case FileUndeployResultStatusOk: + return true + case FileUndeployResultStatusSkipped: + return true + default: + return false + } +} + // ErrorResponse defines model for ErrorResponse. type ErrorResponse = externalRef0.ErrorResponse @@ -163,6 +203,9 @@ type FileUndeployResultStatus string // Hostname defines model for Hostname. type Hostname = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PostNodeFileDeployJSONRequestBody defines body for PostNodeFileDeploy for application/json ContentType. type PostNodeFileDeployJSONRequestBody = FileDeployRequest @@ -176,13 +219,13 @@ type PostNodeFileUndeployJSONRequestBody = FileUndeployRequest type ServerInterface interface { // Deploy a file from Object Store to the host // (POST /api/node/{hostname}/file/deploy) - PostNodeFileDeploy(ctx echo.Context, hostname Hostname) error + PostNodeFileDeploy(ctx *echo.Context, hostname Hostname) error // Check deployment status of a file on the host // (POST /api/node/{hostname}/file/status) - PostNodeFileStatus(ctx echo.Context, hostname Hostname) error + PostNodeFileStatus(ctx *echo.Context, hostname Hostname) error // Remove a deployed file from the host filesystem // (POST /api/node/{hostname}/file/undeploy) - PostNodeFileUndeploy(ctx echo.Context, hostname Hostname) error + PostNodeFileUndeploy(ctx *echo.Context, hostname Hostname) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -191,17 +234,17 @@ type ServerInterfaceWrapper struct { } // PostNodeFileDeploy converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeFileDeploy(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeFileDeploy(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"file:write"}) + ctx.Set(string(BearerAuthScopes), []string{"file:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeFileDeploy(ctx, hostname) @@ -209,17 +252,17 @@ func (w *ServerInterfaceWrapper) PostNodeFileDeploy(ctx echo.Context) error { } // PostNodeFileStatus converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeFileStatus(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeFileStatus(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"file:read"}) + ctx.Set(string(BearerAuthScopes), []string{"file:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeFileStatus(ctx, hostname) @@ -227,17 +270,17 @@ func (w *ServerInterfaceWrapper) PostNodeFileStatus(ctx echo.Context) error { } // PostNodeFileUndeploy converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeFileUndeploy(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeFileUndeploy(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"file:write"}) + ctx.Set(string(BearerAuthScopes), []string{"file:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeFileUndeploy(ctx, hostname) @@ -248,38 +291,57 @@ func (w *ServerInterfaceWrapper) PostNodeFileUndeploy(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.POST(baseURL+"/api/node/:hostname/file/deploy", wrapper.PostNodeFileDeploy) - router.POST(baseURL+"/api/node/:hostname/file/status", wrapper.PostNodeFileStatus) - router.POST(baseURL+"/api/node/:hostname/file/undeploy", wrapper.PostNodeFileUndeploy) + router.POST(options.BaseURL+"/api/node/:hostname/file/deploy", wrapper.PostNodeFileDeploy, options.OperationMiddlewares["PostNodeFileDeploy"]...) + router.POST(options.BaseURL+"/api/node/:hostname/file/status", wrapper.PostNodeFileStatus, options.OperationMiddlewares["PostNodeFileStatus"]...) + router.POST(options.BaseURL+"/api/node/:hostname/file/undeploy", wrapper.PostNodeFileUndeploy, options.OperationMiddlewares["PostNodeFileUndeploy"]...) } type PostNodeFileDeployRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeFileDeployJSONRequestBody } @@ -290,50 +352,75 @@ type PostNodeFileDeployResponseObject interface { type PostNodeFileDeploy202JSONResponse FileDeployCollectionResponse func (response PostNodeFileDeploy202JSONResponse) VisitPostNodeFileDeployResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(202) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileDeploy400JSONResponse externalRef0.ErrorResponse func (response PostNodeFileDeploy400JSONResponse) VisitPostNodeFileDeployResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileDeploy401JSONResponse externalRef0.ErrorResponse func (response PostNodeFileDeploy401JSONResponse) VisitPostNodeFileDeployResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileDeploy403JSONResponse externalRef0.ErrorResponse func (response PostNodeFileDeploy403JSONResponse) VisitPostNodeFileDeployResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileDeploy500JSONResponse externalRef0.ErrorResponse func (response PostNodeFileDeploy500JSONResponse) VisitPostNodeFileDeployResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileStatusRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeFileStatusJSONRequestBody } @@ -344,50 +431,75 @@ type PostNodeFileStatusResponseObject interface { type PostNodeFileStatus200JSONResponse FileStatusCollectionResponse func (response PostNodeFileStatus200JSONResponse) VisitPostNodeFileStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileStatus400JSONResponse externalRef0.ErrorResponse func (response PostNodeFileStatus400JSONResponse) VisitPostNodeFileStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileStatus401JSONResponse externalRef0.ErrorResponse func (response PostNodeFileStatus401JSONResponse) VisitPostNodeFileStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileStatus403JSONResponse externalRef0.ErrorResponse func (response PostNodeFileStatus403JSONResponse) VisitPostNodeFileStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileStatus500JSONResponse externalRef0.ErrorResponse func (response PostNodeFileStatus500JSONResponse) VisitPostNodeFileStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileUndeployRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeFileUndeployJSONRequestBody } @@ -398,46 +510,71 @@ type PostNodeFileUndeployResponseObject interface { type PostNodeFileUndeploy202JSONResponse FileUndeployCollectionResponse func (response PostNodeFileUndeploy202JSONResponse) VisitPostNodeFileUndeployResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(202) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileUndeploy400JSONResponse externalRef0.ErrorResponse func (response PostNodeFileUndeploy400JSONResponse) VisitPostNodeFileUndeployResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileUndeploy401JSONResponse externalRef0.ErrorResponse func (response PostNodeFileUndeploy401JSONResponse) VisitPostNodeFileUndeployResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileUndeploy403JSONResponse externalRef0.ErrorResponse func (response PostNodeFileUndeploy403JSONResponse) VisitPostNodeFileUndeployResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeFileUndeploy500JSONResponse externalRef0.ErrorResponse func (response PostNodeFileUndeploy500JSONResponse) VisitPostNodeFileUndeployResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -453,8 +590,8 @@ type StrictServerInterface interface { PostNodeFileUndeploy(ctx context.Context, request PostNodeFileUndeployRequestObject) (PostNodeFileUndeployResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -466,7 +603,7 @@ type strictHandler struct { } // PostNodeFileDeploy operation middleware -func (sh *strictHandler) PostNodeFileDeploy(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeFileDeploy(ctx *echo.Context, hostname Hostname) error { var request PostNodeFileDeployRequestObject request.Hostname = hostname @@ -477,7 +614,7 @@ func (sh *strictHandler) PostNodeFileDeploy(ctx echo.Context, hostname Hostname) } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeFileDeploy(ctx.Request().Context(), request.(PostNodeFileDeployRequestObject)) } for _, middleware := range sh.middlewares { @@ -497,7 +634,7 @@ func (sh *strictHandler) PostNodeFileDeploy(ctx echo.Context, hostname Hostname) } // PostNodeFileStatus operation middleware -func (sh *strictHandler) PostNodeFileStatus(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeFileStatus(ctx *echo.Context, hostname Hostname) error { var request PostNodeFileStatusRequestObject request.Hostname = hostname @@ -508,7 +645,7 @@ func (sh *strictHandler) PostNodeFileStatus(ctx echo.Context, hostname Hostname) } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeFileStatus(ctx.Request().Context(), request.(PostNodeFileStatusRequestObject)) } for _, middleware := range sh.middlewares { @@ -528,7 +665,7 @@ func (sh *strictHandler) PostNodeFileStatus(ctx echo.Context, hostname Hostname) } // PostNodeFileUndeploy operation middleware -func (sh *strictHandler) PostNodeFileUndeploy(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeFileUndeploy(ctx *echo.Context, hostname Hostname) error { var request PostNodeFileUndeployRequestObject request.Hostname = hostname @@ -539,7 +676,7 @@ func (sh *strictHandler) PostNodeFileUndeploy(ctx echo.Context, hostname Hostnam } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeFileUndeploy(ctx.Request().Context(), request.(PostNodeFileUndeployRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/file/handler.go b/internal/controller/api/node/file/handler.go index 1f41b8be0..9c1b55bd3 100644 --- a/internal/controller/api/node/file/handler.go +++ b/internal/controller/api/node/file/handler.go @@ -23,8 +23,7 @@ package file import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( fileHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/file/handler_public_test.go b/internal/controller/api/node/file/handler_public_test.go index ac054e745..33d55018f 100644 --- a/internal/controller/api/node/file/handler_public_test.go +++ b/internal/controller/api/node/file/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodPost, "/api/node/hostname/file/deploy", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/node/gen/cfg.yaml b/internal/controller/api/node/gen/cfg.yaml index 38683c407..7020ce74b 100644 --- a/internal/controller/api/node/gen/cfg.yaml +++ b/internal/controller/api/node/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: node.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/gen/node.gen.go b/internal/controller/api/node/gen/node.gen.go index c4e85354d..70ec575aa 100644 --- a/internal/controller/api/node/gen/node.gen.go +++ b/internal/controller/api/node/gen/node.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for DiskResultItemStatus. @@ -27,6 +27,20 @@ const ( DiskResultItemStatusSkipped DiskResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DiskResultItemStatus enum. +func (e DiskResultItemStatus) Valid() bool { + switch e { + case DiskResultItemStatusFailed: + return true + case DiskResultItemStatusOk: + return true + case DiskResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for LoadResultItemStatus. const ( LoadResultItemStatusFailed LoadResultItemStatus = "failed" @@ -34,6 +48,20 @@ const ( LoadResultItemStatusSkipped LoadResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the LoadResultItemStatus enum. +func (e LoadResultItemStatus) Valid() bool { + switch e { + case LoadResultItemStatusFailed: + return true + case LoadResultItemStatusOk: + return true + case LoadResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for MemoryResultItemStatus. const ( MemoryResultItemStatusFailed MemoryResultItemStatus = "failed" @@ -41,6 +69,20 @@ const ( MemoryResultItemStatusSkipped MemoryResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the MemoryResultItemStatus enum. +func (e MemoryResultItemStatus) Valid() bool { + switch e { + case MemoryResultItemStatusFailed: + return true + case MemoryResultItemStatusOk: + return true + case MemoryResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for NodeStatusResponseStatus. const ( NodeStatusResponseStatusFailed NodeStatusResponseStatus = "failed" @@ -48,6 +90,20 @@ const ( NodeStatusResponseStatusSkipped NodeStatusResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the NodeStatusResponseStatus enum. +func (e NodeStatusResponseStatus) Valid() bool { + switch e { + case NodeStatusResponseStatusFailed: + return true + case NodeStatusResponseStatusOk: + return true + case NodeStatusResponseStatusSkipped: + return true + default: + return false + } +} + // Defines values for OSInfoResultItemStatus. const ( OSInfoResultItemStatusFailed OSInfoResultItemStatus = "failed" @@ -55,6 +111,20 @@ const ( OSInfoResultItemStatusSkipped OSInfoResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the OSInfoResultItemStatus enum. +func (e OSInfoResultItemStatus) Valid() bool { + switch e { + case OSInfoResultItemStatusFailed: + return true + case OSInfoResultItemStatusOk: + return true + case OSInfoResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for UptimeResponseStatus. const ( UptimeResponseStatusFailed UptimeResponseStatus = "failed" @@ -62,6 +132,20 @@ const ( UptimeResponseStatusSkipped UptimeResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the UptimeResponseStatus enum. +func (e UptimeResponseStatus) Valid() bool { + switch e { + case UptimeResponseStatusFailed: + return true + case UptimeResponseStatusOk: + return true + case UptimeResponseStatusSkipped: + return true + default: + return false + } +} + // DiskCollectionResponse defines model for DiskCollectionResponse. type DiskCollectionResponse struct { // JobId The job ID used to process this request. @@ -299,26 +383,29 @@ type UptimeResponseStatus string // Hostname defines model for Hostname. type Hostname = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // ServerInterface represents all server handlers. type ServerInterface interface { // Retrieve node status // (GET /api/node/{hostname}) - GetNodeStatus(ctx echo.Context, hostname Hostname) error + GetNodeStatus(ctx *echo.Context, hostname Hostname) error // Retrieve disk usage // (GET /api/node/{hostname}/disk) - GetNodeDisk(ctx echo.Context, hostname Hostname) error + GetNodeDisk(ctx *echo.Context, hostname Hostname) error // Retrieve load averages // (GET /api/node/{hostname}/load) - GetNodeLoad(ctx echo.Context, hostname Hostname) error + GetNodeLoad(ctx *echo.Context, hostname Hostname) error // Retrieve memory stats // (GET /api/node/{hostname}/memory) - GetNodeMemory(ctx echo.Context, hostname Hostname) error + GetNodeMemory(ctx *echo.Context, hostname Hostname) error // Retrieve OS info // (GET /api/node/{hostname}/os) - GetNodeOS(ctx echo.Context, hostname Hostname) error + GetNodeOS(ctx *echo.Context, hostname Hostname) error // Retrieve uptime // (GET /api/node/{hostname}/uptime) - GetNodeUptime(ctx echo.Context, hostname Hostname) error + GetNodeUptime(ctx *echo.Context, hostname Hostname) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -327,17 +414,17 @@ type ServerInterfaceWrapper struct { } // GetNodeStatus converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeStatus(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeStatus(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"node:read"}) + ctx.Set(string(BearerAuthScopes), []string{"node:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeStatus(ctx, hostname) @@ -345,17 +432,17 @@ func (w *ServerInterfaceWrapper) GetNodeStatus(ctx echo.Context) error { } // GetNodeDisk converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeDisk(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeDisk(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"node:read"}) + ctx.Set(string(BearerAuthScopes), []string{"node:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeDisk(ctx, hostname) @@ -363,17 +450,17 @@ func (w *ServerInterfaceWrapper) GetNodeDisk(ctx echo.Context) error { } // GetNodeLoad converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeLoad(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeLoad(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"node:read"}) + ctx.Set(string(BearerAuthScopes), []string{"node:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeLoad(ctx, hostname) @@ -381,17 +468,17 @@ func (w *ServerInterfaceWrapper) GetNodeLoad(ctx echo.Context) error { } // GetNodeMemory converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeMemory(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeMemory(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"node:read"}) + ctx.Set(string(BearerAuthScopes), []string{"node:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeMemory(ctx, hostname) @@ -399,17 +486,17 @@ func (w *ServerInterfaceWrapper) GetNodeMemory(ctx echo.Context) error { } // GetNodeOS converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeOS(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeOS(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"node:read"}) + ctx.Set(string(BearerAuthScopes), []string{"node:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeOS(ctx, hostname) @@ -417,17 +504,17 @@ func (w *ServerInterfaceWrapper) GetNodeOS(ctx echo.Context) error { } // GetNodeUptime converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeUptime(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeUptime(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"node:read"}) + ctx.Set(string(BearerAuthScopes), []string{"node:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeUptime(ctx, hostname) @@ -438,41 +525,60 @@ func (w *ServerInterfaceWrapper) GetNodeUptime(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/node/:hostname", wrapper.GetNodeStatus) - router.GET(baseURL+"/api/node/:hostname/disk", wrapper.GetNodeDisk) - router.GET(baseURL+"/api/node/:hostname/load", wrapper.GetNodeLoad) - router.GET(baseURL+"/api/node/:hostname/memory", wrapper.GetNodeMemory) - router.GET(baseURL+"/api/node/:hostname/os", wrapper.GetNodeOS) - router.GET(baseURL+"/api/node/:hostname/uptime", wrapper.GetNodeUptime) + router.GET(options.BaseURL+"/api/node/:hostname", wrapper.GetNodeStatus, options.OperationMiddlewares["GetNodeStatus"]...) + router.GET(options.BaseURL+"/api/node/:hostname/disk", wrapper.GetNodeDisk, options.OperationMiddlewares["GetNodeDisk"]...) + router.GET(options.BaseURL+"/api/node/:hostname/load", wrapper.GetNodeLoad, options.OperationMiddlewares["GetNodeLoad"]...) + router.GET(options.BaseURL+"/api/node/:hostname/memory", wrapper.GetNodeMemory, options.OperationMiddlewares["GetNodeMemory"]...) + router.GET(options.BaseURL+"/api/node/:hostname/os", wrapper.GetNodeOS, options.OperationMiddlewares["GetNodeOS"]...) + router.GET(options.BaseURL+"/api/node/:hostname/uptime", wrapper.GetNodeUptime, options.OperationMiddlewares["GetNodeUptime"]...) } type GetNodeStatusRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeStatusResponseObject interface { @@ -482,50 +588,75 @@ type GetNodeStatusResponseObject interface { type GetNodeStatus200JSONResponse NodeStatusCollectionResponse func (response GetNodeStatus200JSONResponse) VisitGetNodeStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeStatus400JSONResponse externalRef0.ErrorResponse func (response GetNodeStatus400JSONResponse) VisitGetNodeStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeStatus401JSONResponse externalRef0.ErrorResponse func (response GetNodeStatus401JSONResponse) VisitGetNodeStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeStatus403JSONResponse externalRef0.ErrorResponse func (response GetNodeStatus403JSONResponse) VisitGetNodeStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeStatus500JSONResponse externalRef0.ErrorResponse func (response GetNodeStatus500JSONResponse) VisitGetNodeStatusResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeDiskRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeDiskResponseObject interface { @@ -535,50 +666,75 @@ type GetNodeDiskResponseObject interface { type GetNodeDisk200JSONResponse DiskCollectionResponse func (response GetNodeDisk200JSONResponse) VisitGetNodeDiskResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeDisk400JSONResponse externalRef0.ErrorResponse func (response GetNodeDisk400JSONResponse) VisitGetNodeDiskResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeDisk401JSONResponse externalRef0.ErrorResponse func (response GetNodeDisk401JSONResponse) VisitGetNodeDiskResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeDisk403JSONResponse externalRef0.ErrorResponse func (response GetNodeDisk403JSONResponse) VisitGetNodeDiskResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeDisk500JSONResponse externalRef0.ErrorResponse func (response GetNodeDisk500JSONResponse) VisitGetNodeDiskResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLoadRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeLoadResponseObject interface { @@ -588,50 +744,75 @@ type GetNodeLoadResponseObject interface { type GetNodeLoad200JSONResponse LoadCollectionResponse func (response GetNodeLoad200JSONResponse) VisitGetNodeLoadResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLoad400JSONResponse externalRef0.ErrorResponse func (response GetNodeLoad400JSONResponse) VisitGetNodeLoadResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLoad401JSONResponse externalRef0.ErrorResponse func (response GetNodeLoad401JSONResponse) VisitGetNodeLoadResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLoad403JSONResponse externalRef0.ErrorResponse func (response GetNodeLoad403JSONResponse) VisitGetNodeLoadResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLoad500JSONResponse externalRef0.ErrorResponse func (response GetNodeLoad500JSONResponse) VisitGetNodeLoadResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeMemoryRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeMemoryResponseObject interface { @@ -641,50 +822,75 @@ type GetNodeMemoryResponseObject interface { type GetNodeMemory200JSONResponse MemoryCollectionResponse func (response GetNodeMemory200JSONResponse) VisitGetNodeMemoryResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeMemory400JSONResponse externalRef0.ErrorResponse func (response GetNodeMemory400JSONResponse) VisitGetNodeMemoryResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeMemory401JSONResponse externalRef0.ErrorResponse func (response GetNodeMemory401JSONResponse) VisitGetNodeMemoryResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeMemory403JSONResponse externalRef0.ErrorResponse func (response GetNodeMemory403JSONResponse) VisitGetNodeMemoryResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeMemory500JSONResponse externalRef0.ErrorResponse func (response GetNodeMemory500JSONResponse) VisitGetNodeMemoryResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeOSRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeOSResponseObject interface { @@ -694,50 +900,75 @@ type GetNodeOSResponseObject interface { type GetNodeOS200JSONResponse OSInfoCollectionResponse func (response GetNodeOS200JSONResponse) VisitGetNodeOSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeOS400JSONResponse externalRef0.ErrorResponse func (response GetNodeOS400JSONResponse) VisitGetNodeOSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeOS401JSONResponse externalRef0.ErrorResponse func (response GetNodeOS401JSONResponse) VisitGetNodeOSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeOS403JSONResponse externalRef0.ErrorResponse func (response GetNodeOS403JSONResponse) VisitGetNodeOSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeOS500JSONResponse externalRef0.ErrorResponse func (response GetNodeOS500JSONResponse) VisitGetNodeOSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUptimeRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeUptimeResponseObject interface { @@ -747,46 +978,71 @@ type GetNodeUptimeResponseObject interface { type GetNodeUptime200JSONResponse UptimeCollectionResponse func (response GetNodeUptime200JSONResponse) VisitGetNodeUptimeResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUptime400JSONResponse externalRef0.ErrorResponse func (response GetNodeUptime400JSONResponse) VisitGetNodeUptimeResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUptime401JSONResponse externalRef0.ErrorResponse func (response GetNodeUptime401JSONResponse) VisitGetNodeUptimeResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUptime403JSONResponse externalRef0.ErrorResponse func (response GetNodeUptime403JSONResponse) VisitGetNodeUptimeResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUptime500JSONResponse externalRef0.ErrorResponse func (response GetNodeUptime500JSONResponse) VisitGetNodeUptimeResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -811,8 +1067,8 @@ type StrictServerInterface interface { GetNodeUptime(ctx context.Context, request GetNodeUptimeRequestObject) (GetNodeUptimeResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -824,12 +1080,12 @@ type strictHandler struct { } // GetNodeStatus operation middleware -func (sh *strictHandler) GetNodeStatus(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeStatus(ctx *echo.Context, hostname Hostname) error { var request GetNodeStatusRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeStatus(ctx.Request().Context(), request.(GetNodeStatusRequestObject)) } for _, middleware := range sh.middlewares { @@ -849,12 +1105,12 @@ func (sh *strictHandler) GetNodeStatus(ctx echo.Context, hostname Hostname) erro } // GetNodeDisk operation middleware -func (sh *strictHandler) GetNodeDisk(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeDisk(ctx *echo.Context, hostname Hostname) error { var request GetNodeDiskRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeDisk(ctx.Request().Context(), request.(GetNodeDiskRequestObject)) } for _, middleware := range sh.middlewares { @@ -874,12 +1130,12 @@ func (sh *strictHandler) GetNodeDisk(ctx echo.Context, hostname Hostname) error } // GetNodeLoad operation middleware -func (sh *strictHandler) GetNodeLoad(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeLoad(ctx *echo.Context, hostname Hostname) error { var request GetNodeLoadRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeLoad(ctx.Request().Context(), request.(GetNodeLoadRequestObject)) } for _, middleware := range sh.middlewares { @@ -899,12 +1155,12 @@ func (sh *strictHandler) GetNodeLoad(ctx echo.Context, hostname Hostname) error } // GetNodeMemory operation middleware -func (sh *strictHandler) GetNodeMemory(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeMemory(ctx *echo.Context, hostname Hostname) error { var request GetNodeMemoryRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeMemory(ctx.Request().Context(), request.(GetNodeMemoryRequestObject)) } for _, middleware := range sh.middlewares { @@ -924,12 +1180,12 @@ func (sh *strictHandler) GetNodeMemory(ctx echo.Context, hostname Hostname) erro } // GetNodeOS operation middleware -func (sh *strictHandler) GetNodeOS(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeOS(ctx *echo.Context, hostname Hostname) error { var request GetNodeOSRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeOS(ctx.Request().Context(), request.(GetNodeOSRequestObject)) } for _, middleware := range sh.middlewares { @@ -949,12 +1205,12 @@ func (sh *strictHandler) GetNodeOS(ctx echo.Context, hostname Hostname) error { } // GetNodeUptime operation middleware -func (sh *strictHandler) GetNodeUptime(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeUptime(ctx *echo.Context, hostname Hostname) error { var request GetNodeUptimeRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeUptime(ctx.Request().Context(), request.(GetNodeUptimeRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/handler.go b/internal/controller/api/node/handler.go index 85682ec2a..2898ff88e 100644 --- a/internal/controller/api/node/handler.go +++ b/internal/controller/api/node/handler.go @@ -23,8 +23,7 @@ package node import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( nodeHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/handler_public_test.go b/internal/controller/api/node/handler_public_test.go index 98eb814e9..5d4cfe15b 100644 --- a/internal/controller/api/node/handler_public_test.go +++ b/internal/controller/api/node/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/node/hostname", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/node/hostname/gen/cfg.yaml b/internal/controller/api/node/hostname/gen/cfg.yaml index a3194824f..54af6d305 100644 --- a/internal/controller/api/node/hostname/gen/cfg.yaml +++ b/internal/controller/api/node/hostname/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: hostname.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/hostname/gen/hostname.gen.go b/internal/controller/api/node/hostname/gen/hostname.gen.go index 5bab34571..4871a06d7 100644 --- a/internal/controller/api/node/hostname/gen/hostname.gen.go +++ b/internal/controller/api/node/hostname/gen/hostname.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for HostnameResponseStatus. @@ -27,6 +27,20 @@ const ( HostnameResponseStatusSkipped HostnameResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the HostnameResponseStatus enum. +func (e HostnameResponseStatus) Valid() bool { + switch e { + case HostnameResponseStatusFailed: + return true + case HostnameResponseStatusOk: + return true + case HostnameResponseStatusSkipped: + return true + default: + return false + } +} + // Defines values for HostnameUpdateResultItemStatus. const ( HostnameUpdateResultItemStatusFailed HostnameUpdateResultItemStatus = "failed" @@ -34,6 +48,20 @@ const ( HostnameUpdateResultItemStatusSkipped HostnameUpdateResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the HostnameUpdateResultItemStatus enum. +func (e HostnameUpdateResultItemStatus) Valid() bool { + switch e { + case HostnameUpdateResultItemStatusFailed: + return true + case HostnameUpdateResultItemStatusOk: + return true + case HostnameUpdateResultItemStatusSkipped: + return true + default: + return false + } +} + // ErrorResponse defines model for ErrorResponse. type ErrorResponse = externalRef0.ErrorResponse @@ -95,6 +123,9 @@ type HostnameUpdateResultItemStatus string // Hostname defines model for Hostname. type Hostname = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PutNodeHostnameJSONRequestBody defines body for PutNodeHostname for application/json ContentType. type PutNodeHostnameJSONRequestBody = HostnameUpdateRequest @@ -102,10 +133,10 @@ type PutNodeHostnameJSONRequestBody = HostnameUpdateRequest type ServerInterface interface { // Retrieve node hostname // (GET /api/node/{hostname}/hostname) - GetNodeHostname(ctx echo.Context, hostname Hostname) error + GetNodeHostname(ctx *echo.Context, hostname Hostname) error // Update node hostname // (PUT /api/node/{hostname}/hostname) - PutNodeHostname(ctx echo.Context, hostname Hostname) error + PutNodeHostname(ctx *echo.Context, hostname Hostname) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -114,17 +145,17 @@ type ServerInterfaceWrapper struct { } // GetNodeHostname converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeHostname(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeHostname(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"node:read"}) + ctx.Set(string(BearerAuthScopes), []string{"node:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeHostname(ctx, hostname) @@ -132,17 +163,17 @@ func (w *ServerInterfaceWrapper) GetNodeHostname(ctx echo.Context) error { } // PutNodeHostname converts echo context to params. -func (w *ServerInterfaceWrapper) PutNodeHostname(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PutNodeHostname(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"node:write"}) + ctx.Set(string(BearerAuthScopes), []string{"node:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PutNodeHostname(ctx, hostname) @@ -153,37 +184,56 @@ func (w *ServerInterfaceWrapper) PutNodeHostname(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/node/:hostname/hostname", wrapper.GetNodeHostname) - router.PUT(baseURL+"/api/node/:hostname/hostname", wrapper.PutNodeHostname) + router.GET(options.BaseURL+"/api/node/:hostname/hostname", wrapper.GetNodeHostname, options.OperationMiddlewares["GetNodeHostname"]...) + router.PUT(options.BaseURL+"/api/node/:hostname/hostname", wrapper.PutNodeHostname, options.OperationMiddlewares["PutNodeHostname"]...) } type GetNodeHostnameRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeHostnameResponseObject interface { @@ -193,50 +243,75 @@ type GetNodeHostnameResponseObject interface { type GetNodeHostname200JSONResponse HostnameCollectionResponse func (response GetNodeHostname200JSONResponse) VisitGetNodeHostnameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeHostname400JSONResponse externalRef0.ErrorResponse func (response GetNodeHostname400JSONResponse) VisitGetNodeHostnameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeHostname401JSONResponse externalRef0.ErrorResponse func (response GetNodeHostname401JSONResponse) VisitGetNodeHostnameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeHostname403JSONResponse externalRef0.ErrorResponse func (response GetNodeHostname403JSONResponse) VisitGetNodeHostnameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeHostname500JSONResponse externalRef0.ErrorResponse func (response GetNodeHostname500JSONResponse) VisitGetNodeHostnameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeHostnameRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PutNodeHostnameJSONRequestBody } @@ -247,46 +322,71 @@ type PutNodeHostnameResponseObject interface { type PutNodeHostname202JSONResponse HostnameUpdateCollectionResponse func (response PutNodeHostname202JSONResponse) VisitPutNodeHostnameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(202) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeHostname400JSONResponse externalRef0.ErrorResponse func (response PutNodeHostname400JSONResponse) VisitPutNodeHostnameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeHostname401JSONResponse externalRef0.ErrorResponse func (response PutNodeHostname401JSONResponse) VisitPutNodeHostnameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeHostname403JSONResponse externalRef0.ErrorResponse func (response PutNodeHostname403JSONResponse) VisitPutNodeHostnameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeHostname500JSONResponse externalRef0.ErrorResponse func (response PutNodeHostname500JSONResponse) VisitPutNodeHostnameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -299,8 +399,8 @@ type StrictServerInterface interface { PutNodeHostname(ctx context.Context, request PutNodeHostnameRequestObject) (PutNodeHostnameResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -312,12 +412,12 @@ type strictHandler struct { } // GetNodeHostname operation middleware -func (sh *strictHandler) GetNodeHostname(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeHostname(ctx *echo.Context, hostname Hostname) error { var request GetNodeHostnameRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeHostname(ctx.Request().Context(), request.(GetNodeHostnameRequestObject)) } for _, middleware := range sh.middlewares { @@ -337,7 +437,7 @@ func (sh *strictHandler) GetNodeHostname(ctx echo.Context, hostname Hostname) er } // PutNodeHostname operation middleware -func (sh *strictHandler) PutNodeHostname(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PutNodeHostname(ctx *echo.Context, hostname Hostname) error { var request PutNodeHostnameRequestObject request.Hostname = hostname @@ -348,7 +448,7 @@ func (sh *strictHandler) PutNodeHostname(ctx echo.Context, hostname Hostname) er } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PutNodeHostname(ctx.Request().Context(), request.(PutNodeHostnameRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/hostname/handler.go b/internal/controller/api/node/hostname/handler.go index 1c4e160b0..5084b4eeb 100644 --- a/internal/controller/api/node/hostname/handler.go +++ b/internal/controller/api/node/hostname/handler.go @@ -23,8 +23,7 @@ package hostname import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( hostnameHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/hostname/handler_public_test.go b/internal/controller/api/node/hostname/handler_public_test.go index db5540205..e83de2958 100644 --- a/internal/controller/api/node/hostname/handler_public_test.go +++ b/internal/controller/api/node/hostname/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/node/hostname/hostname", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/node/log/gen/cfg.yaml b/internal/controller/api/node/log/gen/cfg.yaml index 0c15ecc4b..439307481 100644 --- a/internal/controller/api/node/log/gen/cfg.yaml +++ b/internal/controller/api/node/log/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: log.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/log/gen/log.gen.go b/internal/controller/api/node/log/gen/log.gen.go index 57e351bef..5f654e50b 100644 --- a/internal/controller/api/node/log/gen/log.gen.go +++ b/internal/controller/api/node/log/gen/log.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for LogResultEntryStatus. @@ -27,6 +27,20 @@ const ( LogResultEntryStatusSkipped LogResultEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the LogResultEntryStatus enum. +func (e LogResultEntryStatus) Valid() bool { + switch e { + case LogResultEntryStatusFailed: + return true + case LogResultEntryStatusOk: + return true + case LogResultEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for LogSourceEntryStatus. const ( LogSourceEntryStatusFailed LogSourceEntryStatus = "failed" @@ -34,6 +48,20 @@ const ( LogSourceEntryStatusSkipped LogSourceEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the LogSourceEntryStatus enum. +func (e LogSourceEntryStatus) Valid() bool { + switch e { + case LogSourceEntryStatusFailed: + return true + case LogSourceEntryStatusOk: + return true + case LogSourceEntryStatusSkipped: + return true + default: + return false + } +} + // ErrorResponse defines model for ErrorResponse. type ErrorResponse = externalRef0.ErrorResponse @@ -114,6 +142,9 @@ type Hostname = string // UnitName defines model for UnitName. type UnitName = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // GetNodeLogParams defines parameters for GetNodeLog. type GetNodeLogParams struct { // Lines Maximum number of log lines to return. @@ -142,13 +173,13 @@ type GetNodeLogUnitParams struct { type ServerInterface interface { // Get system log entries // (GET /api/node/{hostname}/log) - GetNodeLog(ctx echo.Context, hostname Hostname, params GetNodeLogParams) error + GetNodeLog(ctx *echo.Context, hostname Hostname, params GetNodeLogParams) error // List log sources // (GET /api/node/{hostname}/log/source) - GetNodeLogSource(ctx echo.Context, hostname Hostname) error + GetNodeLogSource(ctx *echo.Context, hostname Hostname) error // Get log entries for a systemd unit // (GET /api/node/{hostname}/log/unit/{name}) - GetNodeLogUnit(ctx echo.Context, hostname Hostname, name UnitName, params GetNodeLogUnitParams) error + GetNodeLogUnit(ctx *echo.Context, hostname Hostname, name UnitName, params GetNodeLogUnitParams) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -157,37 +188,37 @@ type ServerInterfaceWrapper struct { } // GetNodeLog converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeLog(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeLog(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"log:read"}) + ctx.Set(string(BearerAuthScopes), []string{"log:read"}) // Parameter object where we will unmarshal all parameters from the context var params GetNodeLogParams // ------------- Optional query parameter "lines" ------------- - err = runtime.BindQueryParameter("form", true, false, "lines", ctx.QueryParams(), ¶ms.Lines) + err = runtime.BindQueryParameterWithOptions("form", true, false, "lines", ctx.QueryParams(), ¶ms.Lines, runtime.BindQueryParameterOptions{Type: "integer", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter lines: %s", err)) } // ------------- Optional query parameter "since" ------------- - err = runtime.BindQueryParameter("form", true, false, "since", ctx.QueryParams(), ¶ms.Since) + err = runtime.BindQueryParameterWithOptions("form", true, false, "since", ctx.QueryParams(), ¶ms.Since, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter since: %s", err)) } // ------------- Optional query parameter "priority" ------------- - err = runtime.BindQueryParameter("form", true, false, "priority", ctx.QueryParams(), ¶ms.Priority) + err = runtime.BindQueryParameterWithOptions("form", true, false, "priority", ctx.QueryParams(), ¶ms.Priority, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter priority: %s", err)) } @@ -198,17 +229,17 @@ func (w *ServerInterfaceWrapper) GetNodeLog(ctx echo.Context) error { } // GetNodeLogSource converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeLogSource(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeLogSource(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"log:read"}) + ctx.Set(string(BearerAuthScopes), []string{"log:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeLogSource(ctx, hostname) @@ -216,12 +247,12 @@ func (w *ServerInterfaceWrapper) GetNodeLogSource(ctx echo.Context) error { } // GetNodeLogUnit converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeLogUnit(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeLogUnit(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -229,32 +260,32 @@ func (w *ServerInterfaceWrapper) GetNodeLogUnit(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name UnitName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"log:read"}) + ctx.Set(string(BearerAuthScopes), []string{"log:read"}) // Parameter object where we will unmarshal all parameters from the context var params GetNodeLogUnitParams // ------------- Optional query parameter "lines" ------------- - err = runtime.BindQueryParameter("form", true, false, "lines", ctx.QueryParams(), ¶ms.Lines) + err = runtime.BindQueryParameterWithOptions("form", true, false, "lines", ctx.QueryParams(), ¶ms.Lines, runtime.BindQueryParameterOptions{Type: "integer", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter lines: %s", err)) } // ------------- Optional query parameter "since" ------------- - err = runtime.BindQueryParameter("form", true, false, "since", ctx.QueryParams(), ¶ms.Since) + err = runtime.BindQueryParameterWithOptions("form", true, false, "since", ctx.QueryParams(), ¶ms.Since, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter since: %s", err)) } // ------------- Optional query parameter "priority" ------------- - err = runtime.BindQueryParameter("form", true, false, "priority", ctx.QueryParams(), ¶ms.Priority) + err = runtime.BindQueryParameterWithOptions("form", true, false, "priority", ctx.QueryParams(), ¶ms.Priority, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter priority: %s", err)) } @@ -268,38 +299,57 @@ func (w *ServerInterfaceWrapper) GetNodeLogUnit(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/node/:hostname/log", wrapper.GetNodeLog) - router.GET(baseURL+"/api/node/:hostname/log/source", wrapper.GetNodeLogSource) - router.GET(baseURL+"/api/node/:hostname/log/unit/:name", wrapper.GetNodeLogUnit) + router.GET(options.BaseURL+"/api/node/:hostname/log", wrapper.GetNodeLog, options.OperationMiddlewares["GetNodeLog"]...) + router.GET(options.BaseURL+"/api/node/:hostname/log/source", wrapper.GetNodeLogSource, options.OperationMiddlewares["GetNodeLogSource"]...) + router.GET(options.BaseURL+"/api/node/:hostname/log/unit/:name", wrapper.GetNodeLogUnit, options.OperationMiddlewares["GetNodeLogUnit"]...) } type GetNodeLogRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Params GetNodeLogParams } @@ -310,50 +360,75 @@ type GetNodeLogResponseObject interface { type GetNodeLog200JSONResponse LogCollectionResponse func (response GetNodeLog200JSONResponse) VisitGetNodeLogResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLog400JSONResponse externalRef0.ErrorResponse func (response GetNodeLog400JSONResponse) VisitGetNodeLogResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLog401JSONResponse externalRef0.ErrorResponse func (response GetNodeLog401JSONResponse) VisitGetNodeLogResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLog403JSONResponse externalRef0.ErrorResponse func (response GetNodeLog403JSONResponse) VisitGetNodeLogResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLog500JSONResponse externalRef0.ErrorResponse func (response GetNodeLog500JSONResponse) VisitGetNodeLogResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLogSourceRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeLogSourceResponseObject interface { @@ -363,51 +438,76 @@ type GetNodeLogSourceResponseObject interface { type GetNodeLogSource200JSONResponse LogSourceCollectionResponse func (response GetNodeLogSource200JSONResponse) VisitGetNodeLogSourceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLogSource400JSONResponse externalRef0.ErrorResponse func (response GetNodeLogSource400JSONResponse) VisitGetNodeLogSourceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLogSource401JSONResponse externalRef0.ErrorResponse func (response GetNodeLogSource401JSONResponse) VisitGetNodeLogSourceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLogSource403JSONResponse externalRef0.ErrorResponse func (response GetNodeLogSource403JSONResponse) VisitGetNodeLogSourceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLogSource500JSONResponse externalRef0.ErrorResponse func (response GetNodeLogSource500JSONResponse) VisitGetNodeLogSourceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLogUnitRequestObject struct { - Hostname Hostname `json:"hostname"` - Name UnitName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name UnitName `json:"name" validate:"required,min=1"` Params GetNodeLogUnitParams } @@ -418,46 +518,71 @@ type GetNodeLogUnitResponseObject interface { type GetNodeLogUnit200JSONResponse LogCollectionResponse func (response GetNodeLogUnit200JSONResponse) VisitGetNodeLogUnitResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLogUnit400JSONResponse externalRef0.ErrorResponse func (response GetNodeLogUnit400JSONResponse) VisitGetNodeLogUnitResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLogUnit401JSONResponse externalRef0.ErrorResponse func (response GetNodeLogUnit401JSONResponse) VisitGetNodeLogUnitResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLogUnit403JSONResponse externalRef0.ErrorResponse func (response GetNodeLogUnit403JSONResponse) VisitGetNodeLogUnitResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeLogUnit500JSONResponse externalRef0.ErrorResponse func (response GetNodeLogUnit500JSONResponse) VisitGetNodeLogUnitResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -473,8 +598,8 @@ type StrictServerInterface interface { GetNodeLogUnit(ctx context.Context, request GetNodeLogUnitRequestObject) (GetNodeLogUnitResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -486,13 +611,13 @@ type strictHandler struct { } // GetNodeLog operation middleware -func (sh *strictHandler) GetNodeLog(ctx echo.Context, hostname Hostname, params GetNodeLogParams) error { +func (sh *strictHandler) GetNodeLog(ctx *echo.Context, hostname Hostname, params GetNodeLogParams) error { var request GetNodeLogRequestObject request.Hostname = hostname request.Params = params - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeLog(ctx.Request().Context(), request.(GetNodeLogRequestObject)) } for _, middleware := range sh.middlewares { @@ -512,12 +637,12 @@ func (sh *strictHandler) GetNodeLog(ctx echo.Context, hostname Hostname, params } // GetNodeLogSource operation middleware -func (sh *strictHandler) GetNodeLogSource(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeLogSource(ctx *echo.Context, hostname Hostname) error { var request GetNodeLogSourceRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeLogSource(ctx.Request().Context(), request.(GetNodeLogSourceRequestObject)) } for _, middleware := range sh.middlewares { @@ -537,14 +662,14 @@ func (sh *strictHandler) GetNodeLogSource(ctx echo.Context, hostname Hostname) e } // GetNodeLogUnit operation middleware -func (sh *strictHandler) GetNodeLogUnit(ctx echo.Context, hostname Hostname, name UnitName, params GetNodeLogUnitParams) error { +func (sh *strictHandler) GetNodeLogUnit(ctx *echo.Context, hostname Hostname, name UnitName, params GetNodeLogUnitParams) error { var request GetNodeLogUnitRequestObject request.Hostname = hostname request.Name = name request.Params = params - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeLogUnit(ctx.Request().Context(), request.(GetNodeLogUnitRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/log/handler.go b/internal/controller/api/node/log/handler.go index 59bc5bc7b..33e390c35 100644 --- a/internal/controller/api/node/log/handler.go +++ b/internal/controller/api/node/log/handler.go @@ -23,8 +23,7 @@ package log import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( logHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/log/handler_public_test.go b/internal/controller/api/node/log/handler_public_test.go index e8762183f..d961b76dc 100644 --- a/internal/controller/api/node/log/handler_public_test.go +++ b/internal/controller/api/node/log/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *LogHandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/node/hostname/log", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/node/network/gen/cfg.yaml b/internal/controller/api/node/network/gen/cfg.yaml index e5579f202..b6d96cc35 100644 --- a/internal/controller/api/node/network/gen/cfg.yaml +++ b/internal/controller/api/node/network/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: network.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/network/gen/network.gen.go b/internal/controller/api/node/network/gen/network.gen.go index db4b7e3eb..c92117768 100644 --- a/internal/controller/api/node/network/gen/network.gen.go +++ b/internal/controller/api/node/network/gen/network.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for DNSConfigResponseStatus. @@ -27,6 +27,20 @@ const ( DNSConfigResponseStatusSkipped DNSConfigResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DNSConfigResponseStatus enum. +func (e DNSConfigResponseStatus) Valid() bool { + switch e { + case DNSConfigResponseStatusFailed: + return true + case DNSConfigResponseStatusOk: + return true + case DNSConfigResponseStatusSkipped: + return true + default: + return false + } +} + // Defines values for DNSDeleteResultItemStatus. const ( DNSDeleteResultItemStatusFailed DNSDeleteResultItemStatus = "failed" @@ -34,6 +48,20 @@ const ( DNSDeleteResultItemStatusSkipped DNSDeleteResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DNSDeleteResultItemStatus enum. +func (e DNSDeleteResultItemStatus) Valid() bool { + switch e { + case DNSDeleteResultItemStatusFailed: + return true + case DNSDeleteResultItemStatusOk: + return true + case DNSDeleteResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for DNSUpdateResultItemStatus. const ( DNSUpdateResultItemStatusFailed DNSUpdateResultItemStatus = "failed" @@ -41,6 +69,20 @@ const ( DNSUpdateResultItemStatusSkipped DNSUpdateResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DNSUpdateResultItemStatus enum. +func (e DNSUpdateResultItemStatus) Valid() bool { + switch e { + case DNSUpdateResultItemStatusFailed: + return true + case DNSUpdateResultItemStatusOk: + return true + case DNSUpdateResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for InterfaceGetEntryStatus. const ( InterfaceGetEntryStatusFailed InterfaceGetEntryStatus = "failed" @@ -48,6 +90,20 @@ const ( InterfaceGetEntryStatusSkipped InterfaceGetEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the InterfaceGetEntryStatus enum. +func (e InterfaceGetEntryStatus) Valid() bool { + switch e { + case InterfaceGetEntryStatusFailed: + return true + case InterfaceGetEntryStatusOk: + return true + case InterfaceGetEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for InterfaceListEntryStatus. const ( InterfaceListEntryStatusFailed InterfaceListEntryStatus = "failed" @@ -55,6 +111,20 @@ const ( InterfaceListEntryStatusSkipped InterfaceListEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the InterfaceListEntryStatus enum. +func (e InterfaceListEntryStatus) Valid() bool { + switch e { + case InterfaceListEntryStatusFailed: + return true + case InterfaceListEntryStatusOk: + return true + case InterfaceListEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for InterfaceMutationEntryStatus. const ( InterfaceMutationEntryStatusFailed InterfaceMutationEntryStatus = "failed" @@ -62,6 +132,20 @@ const ( InterfaceMutationEntryStatusSkipped InterfaceMutationEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the InterfaceMutationEntryStatus enum. +func (e InterfaceMutationEntryStatus) Valid() bool { + switch e { + case InterfaceMutationEntryStatusFailed: + return true + case InterfaceMutationEntryStatusOk: + return true + case InterfaceMutationEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for PingResponseStatus. const ( PingResponseStatusFailed PingResponseStatus = "failed" @@ -69,6 +153,20 @@ const ( PingResponseStatusSkipped PingResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the PingResponseStatus enum. +func (e PingResponseStatus) Valid() bool { + switch e { + case PingResponseStatusFailed: + return true + case PingResponseStatusOk: + return true + case PingResponseStatusSkipped: + return true + default: + return false + } +} + // Defines values for RouteGetEntryStatus. const ( RouteGetEntryStatusFailed RouteGetEntryStatus = "failed" @@ -76,6 +174,20 @@ const ( RouteGetEntryStatusSkipped RouteGetEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the RouteGetEntryStatus enum. +func (e RouteGetEntryStatus) Valid() bool { + switch e { + case RouteGetEntryStatusFailed: + return true + case RouteGetEntryStatusOk: + return true + case RouteGetEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for RouteListEntryStatus. const ( RouteListEntryStatusFailed RouteListEntryStatus = "failed" @@ -83,6 +195,20 @@ const ( RouteListEntryStatusSkipped RouteListEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the RouteListEntryStatus enum. +func (e RouteListEntryStatus) Valid() bool { + switch e { + case RouteListEntryStatusFailed: + return true + case RouteListEntryStatusOk: + return true + case RouteListEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for RouteMutationEntryStatus. const ( RouteMutationEntryStatusFailed RouteMutationEntryStatus = "failed" @@ -90,6 +216,20 @@ const ( RouteMutationEntryStatusSkipped RouteMutationEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the RouteMutationEntryStatus enum. +func (e RouteMutationEntryStatus) Valid() bool { + switch e { + case RouteMutationEntryStatusFailed: + return true + case RouteMutationEntryStatusOk: + return true + case RouteMutationEntryStatusSkipped: + return true + default: + return false + } +} + // DNSConfigCollectionResponse defines model for DNSConfigCollectionResponse. type DNSConfigCollectionResponse struct { // JobId The job ID used to process this request. @@ -487,6 +627,9 @@ type InterfaceName = string // RouteInterfaceName defines model for RouteInterfaceName. type RouteInterfaceName = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PostNodeNetworkPingJSONBody defines parameters for PostNodeNetworkPing. type PostNodeNetworkPingJSONBody struct { // Address The IP address of the server to ping. Supports both IPv4 and IPv6. Also accepts @fact. references that are resolved agent-side. @@ -518,46 +661,46 @@ type PutNodeNetworkRouteJSONRequestBody = RouteConfigRequest type ServerInterface interface { // Delete DNS configuration // (DELETE /api/node/{hostname}/network/dns) - DeleteNodeNetworkDNS(ctx echo.Context, hostname Hostname) error + DeleteNodeNetworkDNS(ctx *echo.Context, hostname Hostname) error // Update DNS servers // (PUT /api/node/{hostname}/network/dns) - PutNodeNetworkDNS(ctx echo.Context, hostname Hostname) error + PutNodeNetworkDNS(ctx *echo.Context, hostname Hostname) error // List DNS servers // (GET /api/node/{hostname}/network/dns/{interfaceName}) - GetNodeNetworkDNSByInterface(ctx echo.Context, hostname Hostname, interfaceName string) error + GetNodeNetworkDNSByInterface(ctx *echo.Context, hostname Hostname, interfaceName string) error // List network interfaces // (GET /api/node/{hostname}/network/interface) - GetNodeNetworkInterface(ctx echo.Context, hostname Hostname) error + GetNodeNetworkInterface(ctx *echo.Context, hostname Hostname) error // Delete interface configuration // (DELETE /api/node/{hostname}/network/interface/{name}) - DeleteNodeNetworkInterface(ctx echo.Context, hostname Hostname, name InterfaceName) error + DeleteNodeNetworkInterface(ctx *echo.Context, hostname Hostname, name InterfaceName) error // Get network interface details // (GET /api/node/{hostname}/network/interface/{name}) - GetNodeNetworkInterfaceByName(ctx echo.Context, hostname Hostname, name InterfaceName) error + GetNodeNetworkInterfaceByName(ctx *echo.Context, hostname Hostname, name InterfaceName) error // Create interface configuration // (POST /api/node/{hostname}/network/interface/{name}) - PostNodeNetworkInterface(ctx echo.Context, hostname Hostname, name InterfaceName) error + PostNodeNetworkInterface(ctx *echo.Context, hostname Hostname, name InterfaceName) error // Update interface configuration // (PUT /api/node/{hostname}/network/interface/{name}) - PutNodeNetworkInterface(ctx echo.Context, hostname Hostname, name InterfaceName) error + PutNodeNetworkInterface(ctx *echo.Context, hostname Hostname, name InterfaceName) error // Ping a remote server // (POST /api/node/{hostname}/network/ping) - PostNodeNetworkPing(ctx echo.Context, hostname Hostname) error + PostNodeNetworkPing(ctx *echo.Context, hostname Hostname) error // List network routes // (GET /api/node/{hostname}/network/route) - GetNodeNetworkRoute(ctx echo.Context, hostname Hostname) error + GetNodeNetworkRoute(ctx *echo.Context, hostname Hostname) error // Delete routes for an interface // (DELETE /api/node/{hostname}/network/route/{interfaceName}) - DeleteNodeNetworkRoute(ctx echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error + DeleteNodeNetworkRoute(ctx *echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error // Get routes for an interface // (GET /api/node/{hostname}/network/route/{interfaceName}) - GetNodeNetworkRouteByInterface(ctx echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error + GetNodeNetworkRouteByInterface(ctx *echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error // Create routes for an interface // (POST /api/node/{hostname}/network/route/{interfaceName}) - PostNodeNetworkRoute(ctx echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error + PostNodeNetworkRoute(ctx *echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error // Update routes for an interface // (PUT /api/node/{hostname}/network/route/{interfaceName}) - PutNodeNetworkRoute(ctx echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error + PutNodeNetworkRoute(ctx *echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -566,17 +709,17 @@ type ServerInterfaceWrapper struct { } // DeleteNodeNetworkDNS converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodeNetworkDNS(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodeNetworkDNS(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:write"}) + ctx.Set(string(BearerAuthScopes), []string{"network:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteNodeNetworkDNS(ctx, hostname) @@ -584,17 +727,17 @@ func (w *ServerInterfaceWrapper) DeleteNodeNetworkDNS(ctx echo.Context) error { } // PutNodeNetworkDNS converts echo context to params. -func (w *ServerInterfaceWrapper) PutNodeNetworkDNS(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PutNodeNetworkDNS(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:write"}) + ctx.Set(string(BearerAuthScopes), []string{"network:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PutNodeNetworkDNS(ctx, hostname) @@ -602,12 +745,12 @@ func (w *ServerInterfaceWrapper) PutNodeNetworkDNS(ctx echo.Context) error { } // GetNodeNetworkDNSByInterface converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeNetworkDNSByInterface(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeNetworkDNSByInterface(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -615,12 +758,12 @@ func (w *ServerInterfaceWrapper) GetNodeNetworkDNSByInterface(ctx echo.Context) // ------------- Path parameter "interfaceName" ------------- var interfaceName string - err = runtime.BindStyledParameterWithOptions("simple", "interfaceName", ctx.Param("interfaceName"), &interfaceName, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "interfaceName", ctx.Param("interfaceName"), &interfaceName, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter interfaceName: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:read"}) + ctx.Set(string(BearerAuthScopes), []string{"network:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeNetworkDNSByInterface(ctx, hostname, interfaceName) @@ -628,17 +771,17 @@ func (w *ServerInterfaceWrapper) GetNodeNetworkDNSByInterface(ctx echo.Context) } // GetNodeNetworkInterface converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeNetworkInterface(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeNetworkInterface(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:read"}) + ctx.Set(string(BearerAuthScopes), []string{"network:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeNetworkInterface(ctx, hostname) @@ -646,12 +789,12 @@ func (w *ServerInterfaceWrapper) GetNodeNetworkInterface(ctx echo.Context) error } // DeleteNodeNetworkInterface converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodeNetworkInterface(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodeNetworkInterface(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -659,12 +802,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeNetworkInterface(ctx echo.Context) er // ------------- Path parameter "name" ------------- var name InterfaceName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:write"}) + ctx.Set(string(BearerAuthScopes), []string{"network:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteNodeNetworkInterface(ctx, hostname, name) @@ -672,12 +815,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeNetworkInterface(ctx echo.Context) er } // GetNodeNetworkInterfaceByName converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeNetworkInterfaceByName(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeNetworkInterfaceByName(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -685,12 +828,12 @@ func (w *ServerInterfaceWrapper) GetNodeNetworkInterfaceByName(ctx echo.Context) // ------------- Path parameter "name" ------------- var name InterfaceName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:read"}) + ctx.Set(string(BearerAuthScopes), []string{"network:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeNetworkInterfaceByName(ctx, hostname, name) @@ -698,12 +841,12 @@ func (w *ServerInterfaceWrapper) GetNodeNetworkInterfaceByName(ctx echo.Context) } // PostNodeNetworkInterface converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeNetworkInterface(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeNetworkInterface(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -711,12 +854,12 @@ func (w *ServerInterfaceWrapper) PostNodeNetworkInterface(ctx echo.Context) erro // ------------- Path parameter "name" ------------- var name InterfaceName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:write"}) + ctx.Set(string(BearerAuthScopes), []string{"network:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeNetworkInterface(ctx, hostname, name) @@ -724,12 +867,12 @@ func (w *ServerInterfaceWrapper) PostNodeNetworkInterface(ctx echo.Context) erro } // PutNodeNetworkInterface converts echo context to params. -func (w *ServerInterfaceWrapper) PutNodeNetworkInterface(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PutNodeNetworkInterface(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -737,12 +880,12 @@ func (w *ServerInterfaceWrapper) PutNodeNetworkInterface(ctx echo.Context) error // ------------- Path parameter "name" ------------- var name InterfaceName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:write"}) + ctx.Set(string(BearerAuthScopes), []string{"network:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PutNodeNetworkInterface(ctx, hostname, name) @@ -750,17 +893,17 @@ func (w *ServerInterfaceWrapper) PutNodeNetworkInterface(ctx echo.Context) error } // PostNodeNetworkPing converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeNetworkPing(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeNetworkPing(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:write"}) + ctx.Set(string(BearerAuthScopes), []string{"network:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeNetworkPing(ctx, hostname) @@ -768,17 +911,17 @@ func (w *ServerInterfaceWrapper) PostNodeNetworkPing(ctx echo.Context) error { } // GetNodeNetworkRoute converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeNetworkRoute(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeNetworkRoute(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:read"}) + ctx.Set(string(BearerAuthScopes), []string{"network:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeNetworkRoute(ctx, hostname) @@ -786,12 +929,12 @@ func (w *ServerInterfaceWrapper) GetNodeNetworkRoute(ctx echo.Context) error { } // DeleteNodeNetworkRoute converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodeNetworkRoute(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodeNetworkRoute(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -799,12 +942,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeNetworkRoute(ctx echo.Context) error // ------------- Path parameter "interfaceName" ------------- var interfaceName RouteInterfaceName - err = runtime.BindStyledParameterWithOptions("simple", "interfaceName", ctx.Param("interfaceName"), &interfaceName, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "interfaceName", ctx.Param("interfaceName"), &interfaceName, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter interfaceName: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:write"}) + ctx.Set(string(BearerAuthScopes), []string{"network:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteNodeNetworkRoute(ctx, hostname, interfaceName) @@ -812,12 +955,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeNetworkRoute(ctx echo.Context) error } // GetNodeNetworkRouteByInterface converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeNetworkRouteByInterface(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeNetworkRouteByInterface(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -825,12 +968,12 @@ func (w *ServerInterfaceWrapper) GetNodeNetworkRouteByInterface(ctx echo.Context // ------------- Path parameter "interfaceName" ------------- var interfaceName RouteInterfaceName - err = runtime.BindStyledParameterWithOptions("simple", "interfaceName", ctx.Param("interfaceName"), &interfaceName, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "interfaceName", ctx.Param("interfaceName"), &interfaceName, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter interfaceName: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:read"}) + ctx.Set(string(BearerAuthScopes), []string{"network:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeNetworkRouteByInterface(ctx, hostname, interfaceName) @@ -838,12 +981,12 @@ func (w *ServerInterfaceWrapper) GetNodeNetworkRouteByInterface(ctx echo.Context } // PostNodeNetworkRoute converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeNetworkRoute(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeNetworkRoute(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -851,12 +994,12 @@ func (w *ServerInterfaceWrapper) PostNodeNetworkRoute(ctx echo.Context) error { // ------------- Path parameter "interfaceName" ------------- var interfaceName RouteInterfaceName - err = runtime.BindStyledParameterWithOptions("simple", "interfaceName", ctx.Param("interfaceName"), &interfaceName, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "interfaceName", ctx.Param("interfaceName"), &interfaceName, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter interfaceName: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:write"}) + ctx.Set(string(BearerAuthScopes), []string{"network:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeNetworkRoute(ctx, hostname, interfaceName) @@ -864,12 +1007,12 @@ func (w *ServerInterfaceWrapper) PostNodeNetworkRoute(ctx echo.Context) error { } // PutNodeNetworkRoute converts echo context to params. -func (w *ServerInterfaceWrapper) PutNodeNetworkRoute(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PutNodeNetworkRoute(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -877,12 +1020,12 @@ func (w *ServerInterfaceWrapper) PutNodeNetworkRoute(ctx echo.Context) error { // ------------- Path parameter "interfaceName" ------------- var interfaceName RouteInterfaceName - err = runtime.BindStyledParameterWithOptions("simple", "interfaceName", ctx.Param("interfaceName"), &interfaceName, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "interfaceName", ctx.Param("interfaceName"), &interfaceName, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter interfaceName: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"network:write"}) + ctx.Set(string(BearerAuthScopes), []string{"network:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PutNodeNetworkRoute(ctx, hostname, interfaceName) @@ -893,49 +1036,68 @@ func (w *ServerInterfaceWrapper) PutNodeNetworkRoute(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.DELETE(baseURL+"/api/node/:hostname/network/dns", wrapper.DeleteNodeNetworkDNS) - router.PUT(baseURL+"/api/node/:hostname/network/dns", wrapper.PutNodeNetworkDNS) - router.GET(baseURL+"/api/node/:hostname/network/dns/:interfaceName", wrapper.GetNodeNetworkDNSByInterface) - router.GET(baseURL+"/api/node/:hostname/network/interface", wrapper.GetNodeNetworkInterface) - router.DELETE(baseURL+"/api/node/:hostname/network/interface/:name", wrapper.DeleteNodeNetworkInterface) - router.GET(baseURL+"/api/node/:hostname/network/interface/:name", wrapper.GetNodeNetworkInterfaceByName) - router.POST(baseURL+"/api/node/:hostname/network/interface/:name", wrapper.PostNodeNetworkInterface) - router.PUT(baseURL+"/api/node/:hostname/network/interface/:name", wrapper.PutNodeNetworkInterface) - router.POST(baseURL+"/api/node/:hostname/network/ping", wrapper.PostNodeNetworkPing) - router.GET(baseURL+"/api/node/:hostname/network/route", wrapper.GetNodeNetworkRoute) - router.DELETE(baseURL+"/api/node/:hostname/network/route/:interfaceName", wrapper.DeleteNodeNetworkRoute) - router.GET(baseURL+"/api/node/:hostname/network/route/:interfaceName", wrapper.GetNodeNetworkRouteByInterface) - router.POST(baseURL+"/api/node/:hostname/network/route/:interfaceName", wrapper.PostNodeNetworkRoute) - router.PUT(baseURL+"/api/node/:hostname/network/route/:interfaceName", wrapper.PutNodeNetworkRoute) + router.DELETE(options.BaseURL+"/api/node/:hostname/network/dns", wrapper.DeleteNodeNetworkDNS, options.OperationMiddlewares["DeleteNodeNetworkDNS"]...) + router.PUT(options.BaseURL+"/api/node/:hostname/network/dns", wrapper.PutNodeNetworkDNS, options.OperationMiddlewares["PutNodeNetworkDNS"]...) + router.GET(options.BaseURL+"/api/node/:hostname/network/dns/:interfaceName", wrapper.GetNodeNetworkDNSByInterface, options.OperationMiddlewares["GetNodeNetworkDNSByInterface"]...) + router.GET(options.BaseURL+"/api/node/:hostname/network/interface", wrapper.GetNodeNetworkInterface, options.OperationMiddlewares["GetNodeNetworkInterface"]...) + router.DELETE(options.BaseURL+"/api/node/:hostname/network/interface/:name", wrapper.DeleteNodeNetworkInterface, options.OperationMiddlewares["DeleteNodeNetworkInterface"]...) + router.GET(options.BaseURL+"/api/node/:hostname/network/interface/:name", wrapper.GetNodeNetworkInterfaceByName, options.OperationMiddlewares["GetNodeNetworkInterfaceByName"]...) + router.POST(options.BaseURL+"/api/node/:hostname/network/interface/:name", wrapper.PostNodeNetworkInterface, options.OperationMiddlewares["PostNodeNetworkInterface"]...) + router.PUT(options.BaseURL+"/api/node/:hostname/network/interface/:name", wrapper.PutNodeNetworkInterface, options.OperationMiddlewares["PutNodeNetworkInterface"]...) + router.POST(options.BaseURL+"/api/node/:hostname/network/ping", wrapper.PostNodeNetworkPing, options.OperationMiddlewares["PostNodeNetworkPing"]...) + router.GET(options.BaseURL+"/api/node/:hostname/network/route", wrapper.GetNodeNetworkRoute, options.OperationMiddlewares["GetNodeNetworkRoute"]...) + router.DELETE(options.BaseURL+"/api/node/:hostname/network/route/:interfaceName", wrapper.DeleteNodeNetworkRoute, options.OperationMiddlewares["DeleteNodeNetworkRoute"]...) + router.GET(options.BaseURL+"/api/node/:hostname/network/route/:interfaceName", wrapper.GetNodeNetworkRouteByInterface, options.OperationMiddlewares["GetNodeNetworkRouteByInterface"]...) + router.POST(options.BaseURL+"/api/node/:hostname/network/route/:interfaceName", wrapper.PostNodeNetworkRoute, options.OperationMiddlewares["PostNodeNetworkRoute"]...) + router.PUT(options.BaseURL+"/api/node/:hostname/network/route/:interfaceName", wrapper.PutNodeNetworkRoute, options.OperationMiddlewares["PutNodeNetworkRoute"]...) } type DeleteNodeNetworkDNSRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *DeleteNodeNetworkDNSJSONRequestBody } @@ -946,50 +1108,75 @@ type DeleteNodeNetworkDNSResponseObject interface { type DeleteNodeNetworkDNS200JSONResponse DNSDeleteCollectionResponse func (response DeleteNodeNetworkDNS200JSONResponse) VisitDeleteNodeNetworkDNSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkDNS400JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNetworkDNS400JSONResponse) VisitDeleteNodeNetworkDNSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkDNS401JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNetworkDNS401JSONResponse) VisitDeleteNodeNetworkDNSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkDNS403JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNetworkDNS403JSONResponse) VisitDeleteNodeNetworkDNSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkDNS500JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNetworkDNS500JSONResponse) VisitDeleteNodeNetworkDNSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkDNSRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PutNodeNetworkDNSJSONRequestBody } @@ -1000,51 +1187,76 @@ type PutNodeNetworkDNSResponseObject interface { type PutNodeNetworkDNS202JSONResponse DNSUpdateCollectionResponse func (response PutNodeNetworkDNS202JSONResponse) VisitPutNodeNetworkDNSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(202) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkDNS400JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkDNS400JSONResponse) VisitPutNodeNetworkDNSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkDNS401JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkDNS401JSONResponse) VisitPutNodeNetworkDNSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkDNS403JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkDNS403JSONResponse) VisitPutNodeNetworkDNSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkDNS500JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkDNS500JSONResponse) VisitPutNodeNetworkDNSResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkDNSByInterfaceRequestObject struct { - Hostname Hostname `json:"hostname"` - InterfaceName string `json:"interfaceName"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + InterfaceName string `json:"interfaceName" validate:"required,alphanum_or_fact"` } type GetNodeNetworkDNSByInterfaceResponseObject interface { @@ -1054,50 +1266,75 @@ type GetNodeNetworkDNSByInterfaceResponseObject interface { type GetNodeNetworkDNSByInterface200JSONResponse DNSConfigCollectionResponse func (response GetNodeNetworkDNSByInterface200JSONResponse) VisitGetNodeNetworkDNSByInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkDNSByInterface400JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkDNSByInterface400JSONResponse) VisitGetNodeNetworkDNSByInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkDNSByInterface401JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkDNSByInterface401JSONResponse) VisitGetNodeNetworkDNSByInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkDNSByInterface403JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkDNSByInterface403JSONResponse) VisitGetNodeNetworkDNSByInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkDNSByInterface500JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkDNSByInterface500JSONResponse) VisitGetNodeNetworkDNSByInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkInterfaceRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeNetworkInterfaceResponseObject interface { @@ -1107,51 +1344,76 @@ type GetNodeNetworkInterfaceResponseObject interface { type GetNodeNetworkInterface200JSONResponse InterfaceListResponse func (response GetNodeNetworkInterface200JSONResponse) VisitGetNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkInterface400JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkInterface400JSONResponse) VisitGetNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkInterface401JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkInterface401JSONResponse) VisitGetNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkInterface403JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkInterface403JSONResponse) VisitGetNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkInterface500JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkInterface500JSONResponse) VisitGetNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkInterfaceRequestObject struct { - Hostname Hostname `json:"hostname"` - Name InterfaceName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name InterfaceName `json:"name" validate:"required,min=1"` } type DeleteNodeNetworkInterfaceResponseObject interface { @@ -1161,51 +1423,76 @@ type DeleteNodeNetworkInterfaceResponseObject interface { type DeleteNodeNetworkInterface200JSONResponse InterfaceMutationResponse func (response DeleteNodeNetworkInterface200JSONResponse) VisitDeleteNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkInterface400JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNetworkInterface400JSONResponse) VisitDeleteNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkInterface401JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNetworkInterface401JSONResponse) VisitDeleteNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkInterface403JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNetworkInterface403JSONResponse) VisitDeleteNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkInterface500JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNetworkInterface500JSONResponse) VisitDeleteNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkInterfaceByNameRequestObject struct { - Hostname Hostname `json:"hostname"` - Name InterfaceName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name InterfaceName `json:"name" validate:"required,min=1"` } type GetNodeNetworkInterfaceByNameResponseObject interface { @@ -1215,60 +1502,90 @@ type GetNodeNetworkInterfaceByNameResponseObject interface { type GetNodeNetworkInterfaceByName200JSONResponse InterfaceGetResponse func (response GetNodeNetworkInterfaceByName200JSONResponse) VisitGetNodeNetworkInterfaceByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkInterfaceByName400JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkInterfaceByName400JSONResponse) VisitGetNodeNetworkInterfaceByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkInterfaceByName401JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkInterfaceByName401JSONResponse) VisitGetNodeNetworkInterfaceByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkInterfaceByName403JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkInterfaceByName403JSONResponse) VisitGetNodeNetworkInterfaceByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkInterfaceByName404JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkInterfaceByName404JSONResponse) VisitGetNodeNetworkInterfaceByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkInterfaceByName500JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkInterfaceByName500JSONResponse) VisitGetNodeNetworkInterfaceByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkInterfaceRequestObject struct { - Hostname Hostname `json:"hostname"` - Name InterfaceName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name InterfaceName `json:"name" validate:"required,min=1"` Body *PostNodeNetworkInterfaceJSONRequestBody } @@ -1279,51 +1596,76 @@ type PostNodeNetworkInterfaceResponseObject interface { type PostNodeNetworkInterface200JSONResponse InterfaceMutationResponse func (response PostNodeNetworkInterface200JSONResponse) VisitPostNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkInterface400JSONResponse externalRef0.ErrorResponse func (response PostNodeNetworkInterface400JSONResponse) VisitPostNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkInterface401JSONResponse externalRef0.ErrorResponse func (response PostNodeNetworkInterface401JSONResponse) VisitPostNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkInterface403JSONResponse externalRef0.ErrorResponse func (response PostNodeNetworkInterface403JSONResponse) VisitPostNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkInterface500JSONResponse externalRef0.ErrorResponse func (response PostNodeNetworkInterface500JSONResponse) VisitPostNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkInterfaceRequestObject struct { - Hostname Hostname `json:"hostname"` - Name InterfaceName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name InterfaceName `json:"name" validate:"required,min=1"` Body *PutNodeNetworkInterfaceJSONRequestBody } @@ -1334,59 +1676,89 @@ type PutNodeNetworkInterfaceResponseObject interface { type PutNodeNetworkInterface200JSONResponse InterfaceMutationResponse func (response PutNodeNetworkInterface200JSONResponse) VisitPutNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkInterface400JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkInterface400JSONResponse) VisitPutNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkInterface401JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkInterface401JSONResponse) VisitPutNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkInterface403JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkInterface403JSONResponse) VisitPutNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkInterface404JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkInterface404JSONResponse) VisitPutNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkInterface500JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkInterface500JSONResponse) VisitPutNodeNetworkInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkPingRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeNetworkPingJSONRequestBody } @@ -1397,50 +1769,75 @@ type PostNodeNetworkPingResponseObject interface { type PostNodeNetworkPing200JSONResponse PingCollectionResponse func (response PostNodeNetworkPing200JSONResponse) VisitPostNodeNetworkPingResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkPing400JSONResponse externalRef0.ErrorResponse func (response PostNodeNetworkPing400JSONResponse) VisitPostNodeNetworkPingResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkPing401JSONResponse externalRef0.ErrorResponse func (response PostNodeNetworkPing401JSONResponse) VisitPostNodeNetworkPingResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkPing403JSONResponse externalRef0.ErrorResponse func (response PostNodeNetworkPing403JSONResponse) VisitPostNodeNetworkPingResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkPing500JSONResponse externalRef0.ErrorResponse func (response PostNodeNetworkPing500JSONResponse) VisitPostNodeNetworkPingResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkRouteRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeNetworkRouteResponseObject interface { @@ -1450,51 +1847,76 @@ type GetNodeNetworkRouteResponseObject interface { type GetNodeNetworkRoute200JSONResponse RouteListResponse func (response GetNodeNetworkRoute200JSONResponse) VisitGetNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkRoute400JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkRoute400JSONResponse) VisitGetNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkRoute401JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkRoute401JSONResponse) VisitGetNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkRoute403JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkRoute403JSONResponse) VisitGetNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkRoute500JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkRoute500JSONResponse) VisitGetNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkRouteRequestObject struct { - Hostname Hostname `json:"hostname"` - InterfaceName RouteInterfaceName `json:"interfaceName"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + InterfaceName RouteInterfaceName `json:"interfaceName" validate:"required,min=1"` } type DeleteNodeNetworkRouteResponseObject interface { @@ -1504,51 +1926,76 @@ type DeleteNodeNetworkRouteResponseObject interface { type DeleteNodeNetworkRoute200JSONResponse RouteMutationResponse func (response DeleteNodeNetworkRoute200JSONResponse) VisitDeleteNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkRoute400JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNetworkRoute400JSONResponse) VisitDeleteNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkRoute401JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNetworkRoute401JSONResponse) VisitDeleteNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkRoute403JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNetworkRoute403JSONResponse) VisitDeleteNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNetworkRoute500JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNetworkRoute500JSONResponse) VisitDeleteNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkRouteByInterfaceRequestObject struct { - Hostname Hostname `json:"hostname"` - InterfaceName RouteInterfaceName `json:"interfaceName"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + InterfaceName RouteInterfaceName `json:"interfaceName" validate:"required,min=1"` } type GetNodeNetworkRouteByInterfaceResponseObject interface { @@ -1558,60 +2005,90 @@ type GetNodeNetworkRouteByInterfaceResponseObject interface { type GetNodeNetworkRouteByInterface200JSONResponse RouteGetResponse func (response GetNodeNetworkRouteByInterface200JSONResponse) VisitGetNodeNetworkRouteByInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkRouteByInterface400JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkRouteByInterface400JSONResponse) VisitGetNodeNetworkRouteByInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkRouteByInterface401JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkRouteByInterface401JSONResponse) VisitGetNodeNetworkRouteByInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkRouteByInterface403JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkRouteByInterface403JSONResponse) VisitGetNodeNetworkRouteByInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkRouteByInterface404JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkRouteByInterface404JSONResponse) VisitGetNodeNetworkRouteByInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNetworkRouteByInterface500JSONResponse externalRef0.ErrorResponse func (response GetNodeNetworkRouteByInterface500JSONResponse) VisitGetNodeNetworkRouteByInterfaceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkRouteRequestObject struct { - Hostname Hostname `json:"hostname"` - InterfaceName RouteInterfaceName `json:"interfaceName"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + InterfaceName RouteInterfaceName `json:"interfaceName" validate:"required,min=1"` Body *PostNodeNetworkRouteJSONRequestBody } @@ -1622,51 +2099,76 @@ type PostNodeNetworkRouteResponseObject interface { type PostNodeNetworkRoute200JSONResponse RouteMutationResponse func (response PostNodeNetworkRoute200JSONResponse) VisitPostNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkRoute400JSONResponse externalRef0.ErrorResponse func (response PostNodeNetworkRoute400JSONResponse) VisitPostNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkRoute401JSONResponse externalRef0.ErrorResponse func (response PostNodeNetworkRoute401JSONResponse) VisitPostNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkRoute403JSONResponse externalRef0.ErrorResponse func (response PostNodeNetworkRoute403JSONResponse) VisitPostNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNetworkRoute500JSONResponse externalRef0.ErrorResponse func (response PostNodeNetworkRoute500JSONResponse) VisitPostNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkRouteRequestObject struct { - Hostname Hostname `json:"hostname"` - InterfaceName RouteInterfaceName `json:"interfaceName"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + InterfaceName RouteInterfaceName `json:"interfaceName" validate:"required,min=1"` Body *PutNodeNetworkRouteJSONRequestBody } @@ -1677,55 +2179,85 @@ type PutNodeNetworkRouteResponseObject interface { type PutNodeNetworkRoute200JSONResponse RouteMutationResponse func (response PutNodeNetworkRoute200JSONResponse) VisitPutNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkRoute400JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkRoute400JSONResponse) VisitPutNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkRoute401JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkRoute401JSONResponse) VisitPutNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkRoute403JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkRoute403JSONResponse) VisitPutNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkRoute404JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkRoute404JSONResponse) VisitPutNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNetworkRoute500JSONResponse externalRef0.ErrorResponse func (response PutNodeNetworkRoute500JSONResponse) VisitPutNodeNetworkRouteResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -1774,8 +2306,8 @@ type StrictServerInterface interface { PutNodeNetworkRoute(ctx context.Context, request PutNodeNetworkRouteRequestObject) (PutNodeNetworkRouteResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -1787,7 +2319,7 @@ type strictHandler struct { } // DeleteNodeNetworkDNS operation middleware -func (sh *strictHandler) DeleteNodeNetworkDNS(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) DeleteNodeNetworkDNS(ctx *echo.Context, hostname Hostname) error { var request DeleteNodeNetworkDNSRequestObject request.Hostname = hostname @@ -1798,7 +2330,7 @@ func (sh *strictHandler) DeleteNodeNetworkDNS(ctx echo.Context, hostname Hostnam } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodeNetworkDNS(ctx.Request().Context(), request.(DeleteNodeNetworkDNSRequestObject)) } for _, middleware := range sh.middlewares { @@ -1818,7 +2350,7 @@ func (sh *strictHandler) DeleteNodeNetworkDNS(ctx echo.Context, hostname Hostnam } // PutNodeNetworkDNS operation middleware -func (sh *strictHandler) PutNodeNetworkDNS(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PutNodeNetworkDNS(ctx *echo.Context, hostname Hostname) error { var request PutNodeNetworkDNSRequestObject request.Hostname = hostname @@ -1829,7 +2361,7 @@ func (sh *strictHandler) PutNodeNetworkDNS(ctx echo.Context, hostname Hostname) } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PutNodeNetworkDNS(ctx.Request().Context(), request.(PutNodeNetworkDNSRequestObject)) } for _, middleware := range sh.middlewares { @@ -1849,13 +2381,13 @@ func (sh *strictHandler) PutNodeNetworkDNS(ctx echo.Context, hostname Hostname) } // GetNodeNetworkDNSByInterface operation middleware -func (sh *strictHandler) GetNodeNetworkDNSByInterface(ctx echo.Context, hostname Hostname, interfaceName string) error { +func (sh *strictHandler) GetNodeNetworkDNSByInterface(ctx *echo.Context, hostname Hostname, interfaceName string) error { var request GetNodeNetworkDNSByInterfaceRequestObject request.Hostname = hostname request.InterfaceName = interfaceName - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeNetworkDNSByInterface(ctx.Request().Context(), request.(GetNodeNetworkDNSByInterfaceRequestObject)) } for _, middleware := range sh.middlewares { @@ -1875,12 +2407,12 @@ func (sh *strictHandler) GetNodeNetworkDNSByInterface(ctx echo.Context, hostname } // GetNodeNetworkInterface operation middleware -func (sh *strictHandler) GetNodeNetworkInterface(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeNetworkInterface(ctx *echo.Context, hostname Hostname) error { var request GetNodeNetworkInterfaceRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeNetworkInterface(ctx.Request().Context(), request.(GetNodeNetworkInterfaceRequestObject)) } for _, middleware := range sh.middlewares { @@ -1900,13 +2432,13 @@ func (sh *strictHandler) GetNodeNetworkInterface(ctx echo.Context, hostname Host } // DeleteNodeNetworkInterface operation middleware -func (sh *strictHandler) DeleteNodeNetworkInterface(ctx echo.Context, hostname Hostname, name InterfaceName) error { +func (sh *strictHandler) DeleteNodeNetworkInterface(ctx *echo.Context, hostname Hostname, name InterfaceName) error { var request DeleteNodeNetworkInterfaceRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodeNetworkInterface(ctx.Request().Context(), request.(DeleteNodeNetworkInterfaceRequestObject)) } for _, middleware := range sh.middlewares { @@ -1926,13 +2458,13 @@ func (sh *strictHandler) DeleteNodeNetworkInterface(ctx echo.Context, hostname H } // GetNodeNetworkInterfaceByName operation middleware -func (sh *strictHandler) GetNodeNetworkInterfaceByName(ctx echo.Context, hostname Hostname, name InterfaceName) error { +func (sh *strictHandler) GetNodeNetworkInterfaceByName(ctx *echo.Context, hostname Hostname, name InterfaceName) error { var request GetNodeNetworkInterfaceByNameRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeNetworkInterfaceByName(ctx.Request().Context(), request.(GetNodeNetworkInterfaceByNameRequestObject)) } for _, middleware := range sh.middlewares { @@ -1952,7 +2484,7 @@ func (sh *strictHandler) GetNodeNetworkInterfaceByName(ctx echo.Context, hostnam } // PostNodeNetworkInterface operation middleware -func (sh *strictHandler) PostNodeNetworkInterface(ctx echo.Context, hostname Hostname, name InterfaceName) error { +func (sh *strictHandler) PostNodeNetworkInterface(ctx *echo.Context, hostname Hostname, name InterfaceName) error { var request PostNodeNetworkInterfaceRequestObject request.Hostname = hostname @@ -1964,7 +2496,7 @@ func (sh *strictHandler) PostNodeNetworkInterface(ctx echo.Context, hostname Hos } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeNetworkInterface(ctx.Request().Context(), request.(PostNodeNetworkInterfaceRequestObject)) } for _, middleware := range sh.middlewares { @@ -1984,7 +2516,7 @@ func (sh *strictHandler) PostNodeNetworkInterface(ctx echo.Context, hostname Hos } // PutNodeNetworkInterface operation middleware -func (sh *strictHandler) PutNodeNetworkInterface(ctx echo.Context, hostname Hostname, name InterfaceName) error { +func (sh *strictHandler) PutNodeNetworkInterface(ctx *echo.Context, hostname Hostname, name InterfaceName) error { var request PutNodeNetworkInterfaceRequestObject request.Hostname = hostname @@ -1996,7 +2528,7 @@ func (sh *strictHandler) PutNodeNetworkInterface(ctx echo.Context, hostname Host } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PutNodeNetworkInterface(ctx.Request().Context(), request.(PutNodeNetworkInterfaceRequestObject)) } for _, middleware := range sh.middlewares { @@ -2016,7 +2548,7 @@ func (sh *strictHandler) PutNodeNetworkInterface(ctx echo.Context, hostname Host } // PostNodeNetworkPing operation middleware -func (sh *strictHandler) PostNodeNetworkPing(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeNetworkPing(ctx *echo.Context, hostname Hostname) error { var request PostNodeNetworkPingRequestObject request.Hostname = hostname @@ -2027,7 +2559,7 @@ func (sh *strictHandler) PostNodeNetworkPing(ctx echo.Context, hostname Hostname } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeNetworkPing(ctx.Request().Context(), request.(PostNodeNetworkPingRequestObject)) } for _, middleware := range sh.middlewares { @@ -2047,12 +2579,12 @@ func (sh *strictHandler) PostNodeNetworkPing(ctx echo.Context, hostname Hostname } // GetNodeNetworkRoute operation middleware -func (sh *strictHandler) GetNodeNetworkRoute(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeNetworkRoute(ctx *echo.Context, hostname Hostname) error { var request GetNodeNetworkRouteRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeNetworkRoute(ctx.Request().Context(), request.(GetNodeNetworkRouteRequestObject)) } for _, middleware := range sh.middlewares { @@ -2072,13 +2604,13 @@ func (sh *strictHandler) GetNodeNetworkRoute(ctx echo.Context, hostname Hostname } // DeleteNodeNetworkRoute operation middleware -func (sh *strictHandler) DeleteNodeNetworkRoute(ctx echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error { +func (sh *strictHandler) DeleteNodeNetworkRoute(ctx *echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error { var request DeleteNodeNetworkRouteRequestObject request.Hostname = hostname request.InterfaceName = interfaceName - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodeNetworkRoute(ctx.Request().Context(), request.(DeleteNodeNetworkRouteRequestObject)) } for _, middleware := range sh.middlewares { @@ -2098,13 +2630,13 @@ func (sh *strictHandler) DeleteNodeNetworkRoute(ctx echo.Context, hostname Hostn } // GetNodeNetworkRouteByInterface operation middleware -func (sh *strictHandler) GetNodeNetworkRouteByInterface(ctx echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error { +func (sh *strictHandler) GetNodeNetworkRouteByInterface(ctx *echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error { var request GetNodeNetworkRouteByInterfaceRequestObject request.Hostname = hostname request.InterfaceName = interfaceName - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeNetworkRouteByInterface(ctx.Request().Context(), request.(GetNodeNetworkRouteByInterfaceRequestObject)) } for _, middleware := range sh.middlewares { @@ -2124,7 +2656,7 @@ func (sh *strictHandler) GetNodeNetworkRouteByInterface(ctx echo.Context, hostna } // PostNodeNetworkRoute operation middleware -func (sh *strictHandler) PostNodeNetworkRoute(ctx echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error { +func (sh *strictHandler) PostNodeNetworkRoute(ctx *echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error { var request PostNodeNetworkRouteRequestObject request.Hostname = hostname @@ -2136,7 +2668,7 @@ func (sh *strictHandler) PostNodeNetworkRoute(ctx echo.Context, hostname Hostnam } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeNetworkRoute(ctx.Request().Context(), request.(PostNodeNetworkRouteRequestObject)) } for _, middleware := range sh.middlewares { @@ -2156,7 +2688,7 @@ func (sh *strictHandler) PostNodeNetworkRoute(ctx echo.Context, hostname Hostnam } // PutNodeNetworkRoute operation middleware -func (sh *strictHandler) PutNodeNetworkRoute(ctx echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error { +func (sh *strictHandler) PutNodeNetworkRoute(ctx *echo.Context, hostname Hostname, interfaceName RouteInterfaceName) error { var request PutNodeNetworkRouteRequestObject request.Hostname = hostname @@ -2168,7 +2700,7 @@ func (sh *strictHandler) PutNodeNetworkRoute(ctx echo.Context, hostname Hostname } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PutNodeNetworkRoute(ctx.Request().Context(), request.(PutNodeNetworkRouteRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/network/handler.go b/internal/controller/api/node/network/handler.go index decee26d0..4188ac1da 100644 --- a/internal/controller/api/node/network/handler.go +++ b/internal/controller/api/node/network/handler.go @@ -23,8 +23,7 @@ package network import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( networkHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/network/handler_public_test.go b/internal/controller/api/node/network/handler_public_test.go index 82d9df36e..ec294e30a 100644 --- a/internal/controller/api/node/network/handler_public_test.go +++ b/internal/controller/api/node/network/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest( http.MethodGet, diff --git a/internal/controller/api/node/ntp/gen/cfg.yaml b/internal/controller/api/node/ntp/gen/cfg.yaml index 6f2b4c711..186ab0185 100644 --- a/internal/controller/api/node/ntp/gen/cfg.yaml +++ b/internal/controller/api/node/ntp/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: ntp.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/ntp/gen/ntp.gen.go b/internal/controller/api/node/ntp/gen/ntp.gen.go index 8ab119696..4557da6e3 100644 --- a/internal/controller/api/node/ntp/gen/ntp.gen.go +++ b/internal/controller/api/node/ntp/gen/ntp.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for NtpMutationResultStatus. @@ -27,6 +27,20 @@ const ( NtpMutationResultStatusSkipped NtpMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the NtpMutationResultStatus enum. +func (e NtpMutationResultStatus) Valid() bool { + switch e { + case NtpMutationResultStatusFailed: + return true + case NtpMutationResultStatusOk: + return true + case NtpMutationResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for NtpStatusEntryStatus. const ( NtpStatusEntryStatusFailed NtpStatusEntryStatus = "failed" @@ -34,6 +48,20 @@ const ( NtpStatusEntryStatusSkipped NtpStatusEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the NtpStatusEntryStatus enum. +func (e NtpStatusEntryStatus) Valid() bool { + switch e { + case NtpStatusEntryStatusFailed: + return true + case NtpStatusEntryStatusOk: + return true + case NtpStatusEntryStatusSkipped: + return true + default: + return false + } +} + // ErrorResponse defines model for ErrorResponse. type ErrorResponse = externalRef0.ErrorResponse @@ -128,6 +156,9 @@ type NtpUpdateResponse struct { // Hostname defines model for Hostname. type Hostname = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PostNodeNtpJSONRequestBody defines body for PostNodeNtp for application/json ContentType. type PostNodeNtpJSONRequestBody = NtpCreateRequest @@ -138,16 +169,16 @@ type PutNodeNtpJSONRequestBody = NtpUpdateRequest type ServerInterface interface { // Delete NTP configuration // (DELETE /api/node/{hostname}/ntp) - DeleteNodeNtp(ctx echo.Context, hostname Hostname) error + DeleteNodeNtp(ctx *echo.Context, hostname Hostname) error // Get NTP status // (GET /api/node/{hostname}/ntp) - GetNodeNtp(ctx echo.Context, hostname Hostname) error + GetNodeNtp(ctx *echo.Context, hostname Hostname) error // Create NTP configuration // (POST /api/node/{hostname}/ntp) - PostNodeNtp(ctx echo.Context, hostname Hostname) error + PostNodeNtp(ctx *echo.Context, hostname Hostname) error // Update NTP configuration // (PUT /api/node/{hostname}/ntp) - PutNodeNtp(ctx echo.Context, hostname Hostname) error + PutNodeNtp(ctx *echo.Context, hostname Hostname) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -156,17 +187,17 @@ type ServerInterfaceWrapper struct { } // DeleteNodeNtp converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodeNtp(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodeNtp(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"ntp:write"}) + ctx.Set(string(BearerAuthScopes), []string{"ntp:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteNodeNtp(ctx, hostname) @@ -174,17 +205,17 @@ func (w *ServerInterfaceWrapper) DeleteNodeNtp(ctx echo.Context) error { } // GetNodeNtp converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeNtp(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeNtp(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"ntp:read"}) + ctx.Set(string(BearerAuthScopes), []string{"ntp:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeNtp(ctx, hostname) @@ -192,17 +223,17 @@ func (w *ServerInterfaceWrapper) GetNodeNtp(ctx echo.Context) error { } // PostNodeNtp converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeNtp(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeNtp(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"ntp:write"}) + ctx.Set(string(BearerAuthScopes), []string{"ntp:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeNtp(ctx, hostname) @@ -210,17 +241,17 @@ func (w *ServerInterfaceWrapper) PostNodeNtp(ctx echo.Context) error { } // PutNodeNtp converts echo context to params. -func (w *ServerInterfaceWrapper) PutNodeNtp(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PutNodeNtp(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"ntp:write"}) + ctx.Set(string(BearerAuthScopes), []string{"ntp:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PutNodeNtp(ctx, hostname) @@ -231,39 +262,58 @@ func (w *ServerInterfaceWrapper) PutNodeNtp(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.DELETE(baseURL+"/api/node/:hostname/ntp", wrapper.DeleteNodeNtp) - router.GET(baseURL+"/api/node/:hostname/ntp", wrapper.GetNodeNtp) - router.POST(baseURL+"/api/node/:hostname/ntp", wrapper.PostNodeNtp) - router.PUT(baseURL+"/api/node/:hostname/ntp", wrapper.PutNodeNtp) + router.DELETE(options.BaseURL+"/api/node/:hostname/ntp", wrapper.DeleteNodeNtp, options.OperationMiddlewares["DeleteNodeNtp"]...) + router.GET(options.BaseURL+"/api/node/:hostname/ntp", wrapper.GetNodeNtp, options.OperationMiddlewares["GetNodeNtp"]...) + router.POST(options.BaseURL+"/api/node/:hostname/ntp", wrapper.PostNodeNtp, options.OperationMiddlewares["PostNodeNtp"]...) + router.PUT(options.BaseURL+"/api/node/:hostname/ntp", wrapper.PutNodeNtp, options.OperationMiddlewares["PutNodeNtp"]...) } type DeleteNodeNtpRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type DeleteNodeNtpResponseObject interface { @@ -273,59 +323,89 @@ type DeleteNodeNtpResponseObject interface { type DeleteNodeNtp200JSONResponse NtpDeleteResponse func (response DeleteNodeNtp200JSONResponse) VisitDeleteNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNtp400JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNtp400JSONResponse) VisitDeleteNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNtp401JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNtp401JSONResponse) VisitDeleteNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNtp403JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNtp403JSONResponse) VisitDeleteNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNtp404JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNtp404JSONResponse) VisitDeleteNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeNtp500JSONResponse externalRef0.ErrorResponse func (response DeleteNodeNtp500JSONResponse) VisitDeleteNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNtpRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeNtpResponseObject interface { @@ -335,50 +415,75 @@ type GetNodeNtpResponseObject interface { type GetNodeNtp200JSONResponse NtpCollectionResponse func (response GetNodeNtp200JSONResponse) VisitGetNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNtp400JSONResponse externalRef0.ErrorResponse func (response GetNodeNtp400JSONResponse) VisitGetNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNtp401JSONResponse externalRef0.ErrorResponse func (response GetNodeNtp401JSONResponse) VisitGetNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNtp403JSONResponse externalRef0.ErrorResponse func (response GetNodeNtp403JSONResponse) VisitGetNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeNtp500JSONResponse externalRef0.ErrorResponse func (response GetNodeNtp500JSONResponse) VisitGetNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNtpRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeNtpJSONRequestBody } @@ -389,50 +494,75 @@ type PostNodeNtpResponseObject interface { type PostNodeNtp200JSONResponse NtpCreateResponse func (response PostNodeNtp200JSONResponse) VisitPostNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNtp400JSONResponse externalRef0.ErrorResponse func (response PostNodeNtp400JSONResponse) VisitPostNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNtp401JSONResponse externalRef0.ErrorResponse func (response PostNodeNtp401JSONResponse) VisitPostNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNtp403JSONResponse externalRef0.ErrorResponse func (response PostNodeNtp403JSONResponse) VisitPostNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeNtp500JSONResponse externalRef0.ErrorResponse func (response PostNodeNtp500JSONResponse) VisitPostNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNtpRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PutNodeNtpJSONRequestBody } @@ -443,55 +573,85 @@ type PutNodeNtpResponseObject interface { type PutNodeNtp200JSONResponse NtpUpdateResponse func (response PutNodeNtp200JSONResponse) VisitPutNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNtp400JSONResponse externalRef0.ErrorResponse func (response PutNodeNtp400JSONResponse) VisitPutNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNtp401JSONResponse externalRef0.ErrorResponse func (response PutNodeNtp401JSONResponse) VisitPutNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNtp403JSONResponse externalRef0.ErrorResponse func (response PutNodeNtp403JSONResponse) VisitPutNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNtp404JSONResponse externalRef0.ErrorResponse func (response PutNodeNtp404JSONResponse) VisitPutNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeNtp500JSONResponse externalRef0.ErrorResponse func (response PutNodeNtp500JSONResponse) VisitPutNodeNtpResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -510,8 +670,8 @@ type StrictServerInterface interface { PutNodeNtp(ctx context.Context, request PutNodeNtpRequestObject) (PutNodeNtpResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -523,12 +683,12 @@ type strictHandler struct { } // DeleteNodeNtp operation middleware -func (sh *strictHandler) DeleteNodeNtp(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) DeleteNodeNtp(ctx *echo.Context, hostname Hostname) error { var request DeleteNodeNtpRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodeNtp(ctx.Request().Context(), request.(DeleteNodeNtpRequestObject)) } for _, middleware := range sh.middlewares { @@ -548,12 +708,12 @@ func (sh *strictHandler) DeleteNodeNtp(ctx echo.Context, hostname Hostname) erro } // GetNodeNtp operation middleware -func (sh *strictHandler) GetNodeNtp(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeNtp(ctx *echo.Context, hostname Hostname) error { var request GetNodeNtpRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeNtp(ctx.Request().Context(), request.(GetNodeNtpRequestObject)) } for _, middleware := range sh.middlewares { @@ -573,7 +733,7 @@ func (sh *strictHandler) GetNodeNtp(ctx echo.Context, hostname Hostname) error { } // PostNodeNtp operation middleware -func (sh *strictHandler) PostNodeNtp(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeNtp(ctx *echo.Context, hostname Hostname) error { var request PostNodeNtpRequestObject request.Hostname = hostname @@ -584,7 +744,7 @@ func (sh *strictHandler) PostNodeNtp(ctx echo.Context, hostname Hostname) error } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeNtp(ctx.Request().Context(), request.(PostNodeNtpRequestObject)) } for _, middleware := range sh.middlewares { @@ -604,7 +764,7 @@ func (sh *strictHandler) PostNodeNtp(ctx echo.Context, hostname Hostname) error } // PutNodeNtp operation middleware -func (sh *strictHandler) PutNodeNtp(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PutNodeNtp(ctx *echo.Context, hostname Hostname) error { var request PutNodeNtpRequestObject request.Hostname = hostname @@ -615,7 +775,7 @@ func (sh *strictHandler) PutNodeNtp(ctx echo.Context, hostname Hostname) error { } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PutNodeNtp(ctx.Request().Context(), request.(PutNodeNtpRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/ntp/handler.go b/internal/controller/api/node/ntp/handler.go index adde775a0..77d8dcb89 100644 --- a/internal/controller/api/node/ntp/handler.go +++ b/internal/controller/api/node/ntp/handler.go @@ -23,8 +23,7 @@ package ntp import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( ntpHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/package/gen/cfg.yaml b/internal/controller/api/node/package/gen/cfg.yaml index 7b4be7343..97f9dcb68 100644 --- a/internal/controller/api/node/package/gen/cfg.yaml +++ b/internal/controller/api/node/package/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: package.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/package/gen/package.gen.go b/internal/controller/api/node/package/gen/package.gen.go index 9e13e3baf..c399f75c6 100644 --- a/internal/controller/api/node/package/gen/package.gen.go +++ b/internal/controller/api/node/package/gen/package.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for PackageEntryStatus. @@ -27,6 +27,20 @@ const ( PackageEntryStatusSkipped PackageEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the PackageEntryStatus enum. +func (e PackageEntryStatus) Valid() bool { + switch e { + case PackageEntryStatusFailed: + return true + case PackageEntryStatusOk: + return true + case PackageEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for PackageMutationResultStatus. const ( PackageMutationResultStatusFailed PackageMutationResultStatus = "failed" @@ -34,6 +48,20 @@ const ( PackageMutationResultStatusSkipped PackageMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the PackageMutationResultStatus enum. +func (e PackageMutationResultStatus) Valid() bool { + switch e { + case PackageMutationResultStatusFailed: + return true + case PackageMutationResultStatusOk: + return true + case PackageMutationResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for UpdateEntryStatus. const ( Failed UpdateEntryStatus = "failed" @@ -41,6 +69,20 @@ const ( Skipped UpdateEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the UpdateEntryStatus enum. +func (e UpdateEntryStatus) Valid() bool { + switch e { + case Failed: + return true + case Ok: + return true + case Skipped: + return true + default: + return false + } +} + // ErrorResponse defines model for ErrorResponse. type ErrorResponse = externalRef0.ErrorResponse @@ -164,6 +206,9 @@ type Hostname = string // PackageName defines model for PackageName. type PackageName = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PostNodePackageJSONRequestBody defines body for PostNodePackage for application/json ContentType. type PostNodePackageJSONRequestBody = PackageInstallRequest @@ -171,22 +216,22 @@ type PostNodePackageJSONRequestBody = PackageInstallRequest type ServerInterface interface { // List installed packages // (GET /api/node/{hostname}/package) - GetNodePackage(ctx echo.Context, hostname Hostname) error + GetNodePackage(ctx *echo.Context, hostname Hostname) error // Install a package // (POST /api/node/{hostname}/package) - PostNodePackage(ctx echo.Context, hostname Hostname) error + PostNodePackage(ctx *echo.Context, hostname Hostname) error // List available updates // (GET /api/node/{hostname}/package/update) - GetNodePackageUpdate(ctx echo.Context, hostname Hostname) error + GetNodePackageUpdate(ctx *echo.Context, hostname Hostname) error // Update package sources // (POST /api/node/{hostname}/package/update) - PostNodePackageUpdate(ctx echo.Context, hostname Hostname) error + PostNodePackageUpdate(ctx *echo.Context, hostname Hostname) error // Remove a package // (DELETE /api/node/{hostname}/package/{name}) - DeleteNodePackage(ctx echo.Context, hostname Hostname, name PackageName) error + DeleteNodePackage(ctx *echo.Context, hostname Hostname, name PackageName) error // Get a package // (GET /api/node/{hostname}/package/{name}) - GetNodePackageByName(ctx echo.Context, hostname Hostname, name PackageName) error + GetNodePackageByName(ctx *echo.Context, hostname Hostname, name PackageName) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -195,17 +240,17 @@ type ServerInterfaceWrapper struct { } // GetNodePackage converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodePackage(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodePackage(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"package:read"}) + ctx.Set(string(BearerAuthScopes), []string{"package:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodePackage(ctx, hostname) @@ -213,17 +258,17 @@ func (w *ServerInterfaceWrapper) GetNodePackage(ctx echo.Context) error { } // PostNodePackage converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodePackage(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodePackage(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"package:write"}) + ctx.Set(string(BearerAuthScopes), []string{"package:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodePackage(ctx, hostname) @@ -231,17 +276,17 @@ func (w *ServerInterfaceWrapper) PostNodePackage(ctx echo.Context) error { } // GetNodePackageUpdate converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodePackageUpdate(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodePackageUpdate(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"package:read"}) + ctx.Set(string(BearerAuthScopes), []string{"package:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodePackageUpdate(ctx, hostname) @@ -249,17 +294,17 @@ func (w *ServerInterfaceWrapper) GetNodePackageUpdate(ctx echo.Context) error { } // PostNodePackageUpdate converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodePackageUpdate(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodePackageUpdate(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"package:write"}) + ctx.Set(string(BearerAuthScopes), []string{"package:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodePackageUpdate(ctx, hostname) @@ -267,12 +312,12 @@ func (w *ServerInterfaceWrapper) PostNodePackageUpdate(ctx echo.Context) error { } // DeleteNodePackage converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodePackage(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodePackage(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -280,12 +325,12 @@ func (w *ServerInterfaceWrapper) DeleteNodePackage(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name PackageName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"package:write"}) + ctx.Set(string(BearerAuthScopes), []string{"package:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteNodePackage(ctx, hostname, name) @@ -293,12 +338,12 @@ func (w *ServerInterfaceWrapper) DeleteNodePackage(ctx echo.Context) error { } // GetNodePackageByName converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodePackageByName(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodePackageByName(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -306,12 +351,12 @@ func (w *ServerInterfaceWrapper) GetNodePackageByName(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name PackageName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"package:read"}) + ctx.Set(string(BearerAuthScopes), []string{"package:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodePackageByName(ctx, hostname, name) @@ -322,41 +367,60 @@ func (w *ServerInterfaceWrapper) GetNodePackageByName(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/node/:hostname/package", wrapper.GetNodePackage) - router.POST(baseURL+"/api/node/:hostname/package", wrapper.PostNodePackage) - router.GET(baseURL+"/api/node/:hostname/package/update", wrapper.GetNodePackageUpdate) - router.POST(baseURL+"/api/node/:hostname/package/update", wrapper.PostNodePackageUpdate) - router.DELETE(baseURL+"/api/node/:hostname/package/:name", wrapper.DeleteNodePackage) - router.GET(baseURL+"/api/node/:hostname/package/:name", wrapper.GetNodePackageByName) + router.GET(options.BaseURL+"/api/node/:hostname/package", wrapper.GetNodePackage, options.OperationMiddlewares["GetNodePackage"]...) + router.POST(options.BaseURL+"/api/node/:hostname/package", wrapper.PostNodePackage, options.OperationMiddlewares["PostNodePackage"]...) + router.GET(options.BaseURL+"/api/node/:hostname/package/update", wrapper.GetNodePackageUpdate, options.OperationMiddlewares["GetNodePackageUpdate"]...) + router.POST(options.BaseURL+"/api/node/:hostname/package/update", wrapper.PostNodePackageUpdate, options.OperationMiddlewares["PostNodePackageUpdate"]...) + router.DELETE(options.BaseURL+"/api/node/:hostname/package/:name", wrapper.DeleteNodePackage, options.OperationMiddlewares["DeleteNodePackage"]...) + router.GET(options.BaseURL+"/api/node/:hostname/package/:name", wrapper.GetNodePackageByName, options.OperationMiddlewares["GetNodePackageByName"]...) } type GetNodePackageRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodePackageResponseObject interface { @@ -366,50 +430,75 @@ type GetNodePackageResponseObject interface { type GetNodePackage200JSONResponse PackageCollectionResponse func (response GetNodePackage200JSONResponse) VisitGetNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackage400JSONResponse externalRef0.ErrorResponse func (response GetNodePackage400JSONResponse) VisitGetNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackage401JSONResponse externalRef0.ErrorResponse func (response GetNodePackage401JSONResponse) VisitGetNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackage403JSONResponse externalRef0.ErrorResponse func (response GetNodePackage403JSONResponse) VisitGetNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackage500JSONResponse externalRef0.ErrorResponse func (response GetNodePackage500JSONResponse) VisitGetNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePackageRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodePackageJSONRequestBody } @@ -420,50 +509,75 @@ type PostNodePackageResponseObject interface { type PostNodePackage200JSONResponse PackageMutationResponse func (response PostNodePackage200JSONResponse) VisitPostNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePackage400JSONResponse externalRef0.ErrorResponse func (response PostNodePackage400JSONResponse) VisitPostNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePackage401JSONResponse externalRef0.ErrorResponse func (response PostNodePackage401JSONResponse) VisitPostNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePackage403JSONResponse externalRef0.ErrorResponse func (response PostNodePackage403JSONResponse) VisitPostNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePackage500JSONResponse externalRef0.ErrorResponse func (response PostNodePackage500JSONResponse) VisitPostNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackageUpdateRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodePackageUpdateResponseObject interface { @@ -473,50 +587,75 @@ type GetNodePackageUpdateResponseObject interface { type GetNodePackageUpdate200JSONResponse UpdateCollectionResponse func (response GetNodePackageUpdate200JSONResponse) VisitGetNodePackageUpdateResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackageUpdate400JSONResponse externalRef0.ErrorResponse func (response GetNodePackageUpdate400JSONResponse) VisitGetNodePackageUpdateResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackageUpdate401JSONResponse externalRef0.ErrorResponse func (response GetNodePackageUpdate401JSONResponse) VisitGetNodePackageUpdateResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackageUpdate403JSONResponse externalRef0.ErrorResponse func (response GetNodePackageUpdate403JSONResponse) VisitGetNodePackageUpdateResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackageUpdate500JSONResponse externalRef0.ErrorResponse func (response GetNodePackageUpdate500JSONResponse) VisitGetNodePackageUpdateResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePackageUpdateRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type PostNodePackageUpdateResponseObject interface { @@ -526,51 +665,76 @@ type PostNodePackageUpdateResponseObject interface { type PostNodePackageUpdate200JSONResponse PackageMutationResponse func (response PostNodePackageUpdate200JSONResponse) VisitPostNodePackageUpdateResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePackageUpdate400JSONResponse externalRef0.ErrorResponse func (response PostNodePackageUpdate400JSONResponse) VisitPostNodePackageUpdateResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePackageUpdate401JSONResponse externalRef0.ErrorResponse func (response PostNodePackageUpdate401JSONResponse) VisitPostNodePackageUpdateResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePackageUpdate403JSONResponse externalRef0.ErrorResponse func (response PostNodePackageUpdate403JSONResponse) VisitPostNodePackageUpdateResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePackageUpdate500JSONResponse externalRef0.ErrorResponse func (response PostNodePackageUpdate500JSONResponse) VisitPostNodePackageUpdateResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodePackageRequestObject struct { - Hostname Hostname `json:"hostname"` - Name PackageName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name PackageName `json:"name" validate:"required,min=1"` } type DeleteNodePackageResponseObject interface { @@ -580,60 +744,90 @@ type DeleteNodePackageResponseObject interface { type DeleteNodePackage200JSONResponse PackageMutationResponse func (response DeleteNodePackage200JSONResponse) VisitDeleteNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodePackage400JSONResponse externalRef0.ErrorResponse func (response DeleteNodePackage400JSONResponse) VisitDeleteNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodePackage401JSONResponse externalRef0.ErrorResponse func (response DeleteNodePackage401JSONResponse) VisitDeleteNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodePackage403JSONResponse externalRef0.ErrorResponse func (response DeleteNodePackage403JSONResponse) VisitDeleteNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodePackage404JSONResponse externalRef0.ErrorResponse func (response DeleteNodePackage404JSONResponse) VisitDeleteNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodePackage500JSONResponse externalRef0.ErrorResponse func (response DeleteNodePackage500JSONResponse) VisitDeleteNodePackageResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackageByNameRequestObject struct { - Hostname Hostname `json:"hostname"` - Name PackageName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name PackageName `json:"name" validate:"required,min=1"` } type GetNodePackageByNameResponseObject interface { @@ -643,55 +837,85 @@ type GetNodePackageByNameResponseObject interface { type GetNodePackageByName200JSONResponse PackageCollectionResponse func (response GetNodePackageByName200JSONResponse) VisitGetNodePackageByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackageByName400JSONResponse externalRef0.ErrorResponse func (response GetNodePackageByName400JSONResponse) VisitGetNodePackageByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackageByName401JSONResponse externalRef0.ErrorResponse func (response GetNodePackageByName401JSONResponse) VisitGetNodePackageByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackageByName403JSONResponse externalRef0.ErrorResponse func (response GetNodePackageByName403JSONResponse) VisitGetNodePackageByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackageByName404JSONResponse externalRef0.ErrorResponse func (response GetNodePackageByName404JSONResponse) VisitGetNodePackageByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodePackageByName500JSONResponse externalRef0.ErrorResponse func (response GetNodePackageByName500JSONResponse) VisitGetNodePackageByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -716,8 +940,8 @@ type StrictServerInterface interface { GetNodePackageByName(ctx context.Context, request GetNodePackageByNameRequestObject) (GetNodePackageByNameResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -729,12 +953,12 @@ type strictHandler struct { } // GetNodePackage operation middleware -func (sh *strictHandler) GetNodePackage(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodePackage(ctx *echo.Context, hostname Hostname) error { var request GetNodePackageRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodePackage(ctx.Request().Context(), request.(GetNodePackageRequestObject)) } for _, middleware := range sh.middlewares { @@ -754,7 +978,7 @@ func (sh *strictHandler) GetNodePackage(ctx echo.Context, hostname Hostname) err } // PostNodePackage operation middleware -func (sh *strictHandler) PostNodePackage(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodePackage(ctx *echo.Context, hostname Hostname) error { var request PostNodePackageRequestObject request.Hostname = hostname @@ -765,7 +989,7 @@ func (sh *strictHandler) PostNodePackage(ctx echo.Context, hostname Hostname) er } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodePackage(ctx.Request().Context(), request.(PostNodePackageRequestObject)) } for _, middleware := range sh.middlewares { @@ -785,12 +1009,12 @@ func (sh *strictHandler) PostNodePackage(ctx echo.Context, hostname Hostname) er } // GetNodePackageUpdate operation middleware -func (sh *strictHandler) GetNodePackageUpdate(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodePackageUpdate(ctx *echo.Context, hostname Hostname) error { var request GetNodePackageUpdateRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodePackageUpdate(ctx.Request().Context(), request.(GetNodePackageUpdateRequestObject)) } for _, middleware := range sh.middlewares { @@ -810,12 +1034,12 @@ func (sh *strictHandler) GetNodePackageUpdate(ctx echo.Context, hostname Hostnam } // PostNodePackageUpdate operation middleware -func (sh *strictHandler) PostNodePackageUpdate(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodePackageUpdate(ctx *echo.Context, hostname Hostname) error { var request PostNodePackageUpdateRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodePackageUpdate(ctx.Request().Context(), request.(PostNodePackageUpdateRequestObject)) } for _, middleware := range sh.middlewares { @@ -835,13 +1059,13 @@ func (sh *strictHandler) PostNodePackageUpdate(ctx echo.Context, hostname Hostna } // DeleteNodePackage operation middleware -func (sh *strictHandler) DeleteNodePackage(ctx echo.Context, hostname Hostname, name PackageName) error { +func (sh *strictHandler) DeleteNodePackage(ctx *echo.Context, hostname Hostname, name PackageName) error { var request DeleteNodePackageRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodePackage(ctx.Request().Context(), request.(DeleteNodePackageRequestObject)) } for _, middleware := range sh.middlewares { @@ -861,13 +1085,13 @@ func (sh *strictHandler) DeleteNodePackage(ctx echo.Context, hostname Hostname, } // GetNodePackageByName operation middleware -func (sh *strictHandler) GetNodePackageByName(ctx echo.Context, hostname Hostname, name PackageName) error { +func (sh *strictHandler) GetNodePackageByName(ctx *echo.Context, hostname Hostname, name PackageName) error { var request GetNodePackageByNameRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodePackageByName(ctx.Request().Context(), request.(GetNodePackageByNameRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/package/handler.go b/internal/controller/api/node/package/handler.go index 3c60f2cd8..bf3585961 100644 --- a/internal/controller/api/node/package/handler.go +++ b/internal/controller/api/node/package/handler.go @@ -23,8 +23,7 @@ package packageapi import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( packageHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/package/handler_public_test.go b/internal/controller/api/node/package/handler_public_test.go index 6d50bb62e..a34ced562 100644 --- a/internal/controller/api/node/package/handler_public_test.go +++ b/internal/controller/api/node/package/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/node/hostname/package", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/node/power/gen/cfg.yaml b/internal/controller/api/node/power/gen/cfg.yaml index 562c8a712..999401b61 100644 --- a/internal/controller/api/node/power/gen/cfg.yaml +++ b/internal/controller/api/node/power/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: power.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/power/gen/power.gen.go b/internal/controller/api/node/power/gen/power.gen.go index 73e489c59..42a39c92e 100644 --- a/internal/controller/api/node/power/gen/power.gen.go +++ b/internal/controller/api/node/power/gen/power.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for PowerResultStatus. @@ -27,6 +27,20 @@ const ( Skipped PowerResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the PowerResultStatus enum. +func (e PowerResultStatus) Valid() bool { + switch e { + case Failed: + return true + case Ok: + return true + case Skipped: + return true + default: + return false + } +} + // ErrorResponse defines model for ErrorResponse. type ErrorResponse = externalRef0.ErrorResponse @@ -80,6 +94,9 @@ type PowerShutdownResponse struct { // Hostname defines model for Hostname. type Hostname = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PostNodePowerRebootJSONRequestBody defines body for PostNodePowerReboot for application/json ContentType. type PostNodePowerRebootJSONRequestBody = PowerRequest @@ -90,10 +107,10 @@ type PostNodePowerShutdownJSONRequestBody = PowerRequest type ServerInterface interface { // Reboot node // (POST /api/node/{hostname}/power/reboot) - PostNodePowerReboot(ctx echo.Context, hostname Hostname) error + PostNodePowerReboot(ctx *echo.Context, hostname Hostname) error // Shutdown node // (POST /api/node/{hostname}/power/shutdown) - PostNodePowerShutdown(ctx echo.Context, hostname Hostname) error + PostNodePowerShutdown(ctx *echo.Context, hostname Hostname) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -102,17 +119,17 @@ type ServerInterfaceWrapper struct { } // PostNodePowerReboot converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodePowerReboot(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodePowerReboot(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"power:execute"}) + ctx.Set(string(BearerAuthScopes), []string{"power:execute"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodePowerReboot(ctx, hostname) @@ -120,17 +137,17 @@ func (w *ServerInterfaceWrapper) PostNodePowerReboot(ctx echo.Context) error { } // PostNodePowerShutdown converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodePowerShutdown(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodePowerShutdown(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"power:execute"}) + ctx.Set(string(BearerAuthScopes), []string{"power:execute"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodePowerShutdown(ctx, hostname) @@ -141,37 +158,56 @@ func (w *ServerInterfaceWrapper) PostNodePowerShutdown(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.POST(baseURL+"/api/node/:hostname/power/reboot", wrapper.PostNodePowerReboot) - router.POST(baseURL+"/api/node/:hostname/power/shutdown", wrapper.PostNodePowerShutdown) + router.POST(options.BaseURL+"/api/node/:hostname/power/reboot", wrapper.PostNodePowerReboot, options.OperationMiddlewares["PostNodePowerReboot"]...) + router.POST(options.BaseURL+"/api/node/:hostname/power/shutdown", wrapper.PostNodePowerShutdown, options.OperationMiddlewares["PostNodePowerShutdown"]...) } type PostNodePowerRebootRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodePowerRebootJSONRequestBody } @@ -182,50 +218,75 @@ type PostNodePowerRebootResponseObject interface { type PostNodePowerReboot200JSONResponse PowerRebootResponse func (response PostNodePowerReboot200JSONResponse) VisitPostNodePowerRebootResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePowerReboot400JSONResponse externalRef0.ErrorResponse func (response PostNodePowerReboot400JSONResponse) VisitPostNodePowerRebootResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePowerReboot401JSONResponse externalRef0.ErrorResponse func (response PostNodePowerReboot401JSONResponse) VisitPostNodePowerRebootResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePowerReboot403JSONResponse externalRef0.ErrorResponse func (response PostNodePowerReboot403JSONResponse) VisitPostNodePowerRebootResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePowerReboot500JSONResponse externalRef0.ErrorResponse func (response PostNodePowerReboot500JSONResponse) VisitPostNodePowerRebootResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePowerShutdownRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodePowerShutdownJSONRequestBody } @@ -236,46 +297,71 @@ type PostNodePowerShutdownResponseObject interface { type PostNodePowerShutdown200JSONResponse PowerShutdownResponse func (response PostNodePowerShutdown200JSONResponse) VisitPostNodePowerShutdownResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePowerShutdown400JSONResponse externalRef0.ErrorResponse func (response PostNodePowerShutdown400JSONResponse) VisitPostNodePowerShutdownResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePowerShutdown401JSONResponse externalRef0.ErrorResponse func (response PostNodePowerShutdown401JSONResponse) VisitPostNodePowerShutdownResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePowerShutdown403JSONResponse externalRef0.ErrorResponse func (response PostNodePowerShutdown403JSONResponse) VisitPostNodePowerShutdownResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodePowerShutdown500JSONResponse externalRef0.ErrorResponse func (response PostNodePowerShutdown500JSONResponse) VisitPostNodePowerShutdownResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -288,8 +374,8 @@ type StrictServerInterface interface { PostNodePowerShutdown(ctx context.Context, request PostNodePowerShutdownRequestObject) (PostNodePowerShutdownResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -301,7 +387,7 @@ type strictHandler struct { } // PostNodePowerReboot operation middleware -func (sh *strictHandler) PostNodePowerReboot(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodePowerReboot(ctx *echo.Context, hostname Hostname) error { var request PostNodePowerRebootRequestObject request.Hostname = hostname @@ -312,7 +398,7 @@ func (sh *strictHandler) PostNodePowerReboot(ctx echo.Context, hostname Hostname } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodePowerReboot(ctx.Request().Context(), request.(PostNodePowerRebootRequestObject)) } for _, middleware := range sh.middlewares { @@ -332,7 +418,7 @@ func (sh *strictHandler) PostNodePowerReboot(ctx echo.Context, hostname Hostname } // PostNodePowerShutdown operation middleware -func (sh *strictHandler) PostNodePowerShutdown(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodePowerShutdown(ctx *echo.Context, hostname Hostname) error { var request PostNodePowerShutdownRequestObject request.Hostname = hostname @@ -343,7 +429,7 @@ func (sh *strictHandler) PostNodePowerShutdown(ctx echo.Context, hostname Hostna } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodePowerShutdown(ctx.Request().Context(), request.(PostNodePowerShutdownRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/power/handler.go b/internal/controller/api/node/power/handler.go index 53a0ff5f7..0c97a71d4 100644 --- a/internal/controller/api/node/power/handler.go +++ b/internal/controller/api/node/power/handler.go @@ -23,8 +23,7 @@ package power import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( powerHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/process/gen/cfg.yaml b/internal/controller/api/node/process/gen/cfg.yaml index 654c6fb8c..45ddc9824 100644 --- a/internal/controller/api/node/process/gen/cfg.yaml +++ b/internal/controller/api/node/process/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: process.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/process/gen/process.gen.go b/internal/controller/api/node/process/gen/process.gen.go index b8529c8da..d3fac776d 100644 --- a/internal/controller/api/node/process/gen/process.gen.go +++ b/internal/controller/api/node/process/gen/process.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for ProcessEntryStatus. @@ -27,6 +27,20 @@ const ( ProcessEntryStatusSkipped ProcessEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the ProcessEntryStatus enum. +func (e ProcessEntryStatus) Valid() bool { + switch e { + case ProcessEntryStatusFailed: + return true + case ProcessEntryStatusOk: + return true + case ProcessEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for ProcessGetEntryStatus. const ( ProcessGetEntryStatusFailed ProcessGetEntryStatus = "failed" @@ -34,6 +48,20 @@ const ( ProcessGetEntryStatusSkipped ProcessGetEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the ProcessGetEntryStatus enum. +func (e ProcessGetEntryStatus) Valid() bool { + switch e { + case ProcessGetEntryStatusFailed: + return true + case ProcessGetEntryStatusOk: + return true + case ProcessGetEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for ProcessSignalRequestSignal. const ( HUP ProcessSignalRequestSignal = "HUP" @@ -44,6 +72,26 @@ const ( USR2 ProcessSignalRequestSignal = "USR2" ) +// Valid indicates whether the value is a known member of the ProcessSignalRequestSignal enum. +func (e ProcessSignalRequestSignal) Valid() bool { + switch e { + case HUP: + return true + case INT: + return true + case KILL: + return true + case TERM: + return true + case USR1: + return true + case USR2: + return true + default: + return false + } +} + // Defines values for ProcessSignalResultStatus. const ( Failed ProcessSignalResultStatus = "failed" @@ -51,6 +99,20 @@ const ( Skipped ProcessSignalResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the ProcessSignalResultStatus enum. +func (e ProcessSignalResultStatus) Valid() bool { + switch e { + case Failed: + return true + case Ok: + return true + case Skipped: + return true + default: + return false + } +} + // ErrorResponse defines model for ErrorResponse. type ErrorResponse = externalRef0.ErrorResponse @@ -180,6 +242,9 @@ type Hostname = string // Pid defines model for Pid. type Pid = int +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PostNodeProcessSignalJSONRequestBody defines body for PostNodeProcessSignal for application/json ContentType. type PostNodeProcessSignalJSONRequestBody = ProcessSignalRequest @@ -187,13 +252,13 @@ type PostNodeProcessSignalJSONRequestBody = ProcessSignalRequest type ServerInterface interface { // List processes // (GET /api/node/{hostname}/process) - GetNodeProcess(ctx echo.Context, hostname Hostname) error + GetNodeProcess(ctx *echo.Context, hostname Hostname) error // Get process by PID // (GET /api/node/{hostname}/process/{pid}) - GetNodeProcessByPid(ctx echo.Context, hostname Hostname, pid Pid) error + GetNodeProcessByPid(ctx *echo.Context, hostname Hostname, pid Pid) error // Send signal to process // (POST /api/node/{hostname}/process/{pid}/signal) - PostNodeProcessSignal(ctx echo.Context, hostname Hostname, pid Pid) error + PostNodeProcessSignal(ctx *echo.Context, hostname Hostname, pid Pid) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -202,17 +267,17 @@ type ServerInterfaceWrapper struct { } // GetNodeProcess converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeProcess(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeProcess(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"process:read"}) + ctx.Set(string(BearerAuthScopes), []string{"process:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeProcess(ctx, hostname) @@ -220,12 +285,12 @@ func (w *ServerInterfaceWrapper) GetNodeProcess(ctx echo.Context) error { } // GetNodeProcessByPid converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeProcessByPid(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeProcessByPid(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -233,12 +298,12 @@ func (w *ServerInterfaceWrapper) GetNodeProcessByPid(ctx echo.Context) error { // ------------- Path parameter "pid" ------------- var pid Pid - err = runtime.BindStyledParameterWithOptions("simple", "pid", ctx.Param("pid"), &pid, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "pid", ctx.Param("pid"), &pid, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "integer", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter pid: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"process:read"}) + ctx.Set(string(BearerAuthScopes), []string{"process:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeProcessByPid(ctx, hostname, pid) @@ -246,12 +311,12 @@ func (w *ServerInterfaceWrapper) GetNodeProcessByPid(ctx echo.Context) error { } // PostNodeProcessSignal converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeProcessSignal(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeProcessSignal(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -259,12 +324,12 @@ func (w *ServerInterfaceWrapper) PostNodeProcessSignal(ctx echo.Context) error { // ------------- Path parameter "pid" ------------- var pid Pid - err = runtime.BindStyledParameterWithOptions("simple", "pid", ctx.Param("pid"), &pid, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "pid", ctx.Param("pid"), &pid, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "integer", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter pid: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"process:execute"}) + ctx.Set(string(BearerAuthScopes), []string{"process:execute"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeProcessSignal(ctx, hostname, pid) @@ -275,38 +340,57 @@ func (w *ServerInterfaceWrapper) PostNodeProcessSignal(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/node/:hostname/process", wrapper.GetNodeProcess) - router.GET(baseURL+"/api/node/:hostname/process/:pid", wrapper.GetNodeProcessByPid) - router.POST(baseURL+"/api/node/:hostname/process/:pid/signal", wrapper.PostNodeProcessSignal) + router.GET(options.BaseURL+"/api/node/:hostname/process", wrapper.GetNodeProcess, options.OperationMiddlewares["GetNodeProcess"]...) + router.GET(options.BaseURL+"/api/node/:hostname/process/:pid", wrapper.GetNodeProcessByPid, options.OperationMiddlewares["GetNodeProcessByPid"]...) + router.POST(options.BaseURL+"/api/node/:hostname/process/:pid/signal", wrapper.PostNodeProcessSignal, options.OperationMiddlewares["PostNodeProcessSignal"]...) } type GetNodeProcessRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeProcessResponseObject interface { @@ -316,51 +400,76 @@ type GetNodeProcessResponseObject interface { type GetNodeProcess200JSONResponse ProcessCollectionResponse func (response GetNodeProcess200JSONResponse) VisitGetNodeProcessResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeProcess400JSONResponse externalRef0.ErrorResponse func (response GetNodeProcess400JSONResponse) VisitGetNodeProcessResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeProcess401JSONResponse externalRef0.ErrorResponse func (response GetNodeProcess401JSONResponse) VisitGetNodeProcessResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeProcess403JSONResponse externalRef0.ErrorResponse func (response GetNodeProcess403JSONResponse) VisitGetNodeProcessResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeProcess500JSONResponse externalRef0.ErrorResponse func (response GetNodeProcess500JSONResponse) VisitGetNodeProcessResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeProcessByPidRequestObject struct { - Hostname Hostname `json:"hostname"` - Pid Pid `json:"pid"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Pid Pid `json:"pid" validate:"required,min=1"` } type GetNodeProcessByPidResponseObject interface { @@ -370,60 +479,90 @@ type GetNodeProcessByPidResponseObject interface { type GetNodeProcessByPid200JSONResponse ProcessGetResponse func (response GetNodeProcessByPid200JSONResponse) VisitGetNodeProcessByPidResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeProcessByPid400JSONResponse externalRef0.ErrorResponse func (response GetNodeProcessByPid400JSONResponse) VisitGetNodeProcessByPidResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeProcessByPid401JSONResponse externalRef0.ErrorResponse func (response GetNodeProcessByPid401JSONResponse) VisitGetNodeProcessByPidResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeProcessByPid403JSONResponse externalRef0.ErrorResponse func (response GetNodeProcessByPid403JSONResponse) VisitGetNodeProcessByPidResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeProcessByPid404JSONResponse externalRef0.ErrorResponse func (response GetNodeProcessByPid404JSONResponse) VisitGetNodeProcessByPidResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeProcessByPid500JSONResponse externalRef0.ErrorResponse func (response GetNodeProcessByPid500JSONResponse) VisitGetNodeProcessByPidResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeProcessSignalRequestObject struct { - Hostname Hostname `json:"hostname"` - Pid Pid `json:"pid"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Pid Pid `json:"pid" validate:"required,min=1"` Body *PostNodeProcessSignalJSONRequestBody } @@ -434,55 +573,85 @@ type PostNodeProcessSignalResponseObject interface { type PostNodeProcessSignal200JSONResponse ProcessSignalResponse func (response PostNodeProcessSignal200JSONResponse) VisitPostNodeProcessSignalResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeProcessSignal400JSONResponse externalRef0.ErrorResponse func (response PostNodeProcessSignal400JSONResponse) VisitPostNodeProcessSignalResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeProcessSignal401JSONResponse externalRef0.ErrorResponse func (response PostNodeProcessSignal401JSONResponse) VisitPostNodeProcessSignalResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeProcessSignal403JSONResponse externalRef0.ErrorResponse func (response PostNodeProcessSignal403JSONResponse) VisitPostNodeProcessSignalResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeProcessSignal404JSONResponse externalRef0.ErrorResponse func (response PostNodeProcessSignal404JSONResponse) VisitPostNodeProcessSignalResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeProcessSignal500JSONResponse externalRef0.ErrorResponse func (response PostNodeProcessSignal500JSONResponse) VisitPostNodeProcessSignalResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -498,8 +667,8 @@ type StrictServerInterface interface { PostNodeProcessSignal(ctx context.Context, request PostNodeProcessSignalRequestObject) (PostNodeProcessSignalResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -511,12 +680,12 @@ type strictHandler struct { } // GetNodeProcess operation middleware -func (sh *strictHandler) GetNodeProcess(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeProcess(ctx *echo.Context, hostname Hostname) error { var request GetNodeProcessRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeProcess(ctx.Request().Context(), request.(GetNodeProcessRequestObject)) } for _, middleware := range sh.middlewares { @@ -536,13 +705,13 @@ func (sh *strictHandler) GetNodeProcess(ctx echo.Context, hostname Hostname) err } // GetNodeProcessByPid operation middleware -func (sh *strictHandler) GetNodeProcessByPid(ctx echo.Context, hostname Hostname, pid Pid) error { +func (sh *strictHandler) GetNodeProcessByPid(ctx *echo.Context, hostname Hostname, pid Pid) error { var request GetNodeProcessByPidRequestObject request.Hostname = hostname request.Pid = pid - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeProcessByPid(ctx.Request().Context(), request.(GetNodeProcessByPidRequestObject)) } for _, middleware := range sh.middlewares { @@ -562,7 +731,7 @@ func (sh *strictHandler) GetNodeProcessByPid(ctx echo.Context, hostname Hostname } // PostNodeProcessSignal operation middleware -func (sh *strictHandler) PostNodeProcessSignal(ctx echo.Context, hostname Hostname, pid Pid) error { +func (sh *strictHandler) PostNodeProcessSignal(ctx *echo.Context, hostname Hostname, pid Pid) error { var request PostNodeProcessSignalRequestObject request.Hostname = hostname @@ -574,7 +743,7 @@ func (sh *strictHandler) PostNodeProcessSignal(ctx echo.Context, hostname Hostna } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeProcessSignal(ctx.Request().Context(), request.(PostNodeProcessSignalRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/process/handler.go b/internal/controller/api/node/process/handler.go index 0708c631b..be5253f9d 100644 --- a/internal/controller/api/node/process/handler.go +++ b/internal/controller/api/node/process/handler.go @@ -23,8 +23,7 @@ package process import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( processHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/process/handler_public_test.go b/internal/controller/api/node/process/handler_public_test.go index 1b986f4d1..dae20fc4f 100644 --- a/internal/controller/api/node/process/handler_public_test.go +++ b/internal/controller/api/node/process/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/node/hostname/process", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/node/schedule/gen/cfg.yaml b/internal/controller/api/node/schedule/gen/cfg.yaml index 8acaa344b..08ef430a6 100644 --- a/internal/controller/api/node/schedule/gen/cfg.yaml +++ b/internal/controller/api/node/schedule/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: schedule.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/schedule/gen/schedule.gen.go b/internal/controller/api/node/schedule/gen/schedule.gen.go index 06538fc0c..6a74974c9 100644 --- a/internal/controller/api/node/schedule/gen/schedule.gen.go +++ b/internal/controller/api/node/schedule/gen/schedule.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for CronCreateRequestContentType. @@ -26,6 +26,18 @@ const ( CronCreateRequestContentTypeTemplate CronCreateRequestContentType = "template" ) +// Valid indicates whether the value is a known member of the CronCreateRequestContentType enum. +func (e CronCreateRequestContentType) Valid() bool { + switch e { + case CronCreateRequestContentTypeRaw: + return true + case CronCreateRequestContentTypeTemplate: + return true + default: + return false + } +} + // Defines values for CronCreateRequestInterval. const ( CronCreateRequestIntervalDaily CronCreateRequestInterval = "daily" @@ -34,6 +46,22 @@ const ( CronCreateRequestIntervalWeekly CronCreateRequestInterval = "weekly" ) +// Valid indicates whether the value is a known member of the CronCreateRequestInterval enum. +func (e CronCreateRequestInterval) Valid() bool { + switch e { + case CronCreateRequestIntervalDaily: + return true + case CronCreateRequestIntervalHourly: + return true + case CronCreateRequestIntervalMonthly: + return true + case CronCreateRequestIntervalWeekly: + return true + default: + return false + } +} + // Defines values for CronEntryInterval. const ( CronEntryIntervalDaily CronEntryInterval = "daily" @@ -42,6 +70,22 @@ const ( CronEntryIntervalWeekly CronEntryInterval = "weekly" ) +// Valid indicates whether the value is a known member of the CronEntryInterval enum. +func (e CronEntryInterval) Valid() bool { + switch e { + case CronEntryIntervalDaily: + return true + case CronEntryIntervalHourly: + return true + case CronEntryIntervalMonthly: + return true + case CronEntryIntervalWeekly: + return true + default: + return false + } +} + // Defines values for CronEntryStatus. const ( CronEntryStatusFailed CronEntryStatus = "failed" @@ -49,6 +93,20 @@ const ( CronEntryStatusSkipped CronEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the CronEntryStatus enum. +func (e CronEntryStatus) Valid() bool { + switch e { + case CronEntryStatusFailed: + return true + case CronEntryStatusOk: + return true + case CronEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for CronMutationResultStatus. const ( CronMutationResultStatusFailed CronMutationResultStatus = "failed" @@ -56,12 +114,38 @@ const ( CronMutationResultStatusSkipped CronMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the CronMutationResultStatus enum. +func (e CronMutationResultStatus) Valid() bool { + switch e { + case CronMutationResultStatusFailed: + return true + case CronMutationResultStatusOk: + return true + case CronMutationResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for CronUpdateRequestContentType. const ( CronUpdateRequestContentTypeRaw CronUpdateRequestContentType = "raw" CronUpdateRequestContentTypeTemplate CronUpdateRequestContentType = "template" ) +// Valid indicates whether the value is a known member of the CronUpdateRequestContentType enum. +func (e CronUpdateRequestContentType) Valid() bool { + switch e { + case CronUpdateRequestContentTypeRaw: + return true + case CronUpdateRequestContentTypeTemplate: + return true + default: + return false + } +} + // CronCollectionResponse defines model for CronCollectionResponse. type CronCollectionResponse struct { // JobId The job ID used to process this request. @@ -214,6 +298,9 @@ type CronName = string // Hostname defines model for Hostname. type Hostname = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PostNodeScheduleCronJSONRequestBody defines body for PostNodeScheduleCron for application/json ContentType. type PostNodeScheduleCronJSONRequestBody = CronCreateRequest @@ -224,19 +311,19 @@ type PutNodeScheduleCronJSONRequestBody = CronUpdateRequest type ServerInterface interface { // List all cron entries // (GET /api/node/{hostname}/schedule/cron) - GetNodeScheduleCron(ctx echo.Context, hostname Hostname) error + GetNodeScheduleCron(ctx *echo.Context, hostname Hostname) error // Create a cron entry // (POST /api/node/{hostname}/schedule/cron) - PostNodeScheduleCron(ctx echo.Context, hostname Hostname) error + PostNodeScheduleCron(ctx *echo.Context, hostname Hostname) error // Delete a cron entry // (DELETE /api/node/{hostname}/schedule/cron/{name}) - DeleteNodeScheduleCron(ctx echo.Context, hostname Hostname, name CronName) error + DeleteNodeScheduleCron(ctx *echo.Context, hostname Hostname, name CronName) error // Get a cron entry // (GET /api/node/{hostname}/schedule/cron/{name}) - GetNodeScheduleCronByName(ctx echo.Context, hostname Hostname, name CronName) error + GetNodeScheduleCronByName(ctx *echo.Context, hostname Hostname, name CronName) error // Update a cron entry // (PUT /api/node/{hostname}/schedule/cron/{name}) - PutNodeScheduleCron(ctx echo.Context, hostname Hostname, name CronName) error + PutNodeScheduleCron(ctx *echo.Context, hostname Hostname, name CronName) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -245,17 +332,17 @@ type ServerInterfaceWrapper struct { } // GetNodeScheduleCron converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeScheduleCron(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeScheduleCron(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"cron:read"}) + ctx.Set(string(BearerAuthScopes), []string{"cron:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeScheduleCron(ctx, hostname) @@ -263,17 +350,17 @@ func (w *ServerInterfaceWrapper) GetNodeScheduleCron(ctx echo.Context) error { } // PostNodeScheduleCron converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeScheduleCron(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeScheduleCron(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"cron:write"}) + ctx.Set(string(BearerAuthScopes), []string{"cron:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeScheduleCron(ctx, hostname) @@ -281,12 +368,12 @@ func (w *ServerInterfaceWrapper) PostNodeScheduleCron(ctx echo.Context) error { } // DeleteNodeScheduleCron converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodeScheduleCron(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodeScheduleCron(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -294,12 +381,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeScheduleCron(ctx echo.Context) error // ------------- Path parameter "name" ------------- var name CronName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"cron:write"}) + ctx.Set(string(BearerAuthScopes), []string{"cron:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteNodeScheduleCron(ctx, hostname, name) @@ -307,12 +394,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeScheduleCron(ctx echo.Context) error } // GetNodeScheduleCronByName converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeScheduleCronByName(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeScheduleCronByName(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -320,12 +407,12 @@ func (w *ServerInterfaceWrapper) GetNodeScheduleCronByName(ctx echo.Context) err // ------------- Path parameter "name" ------------- var name CronName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"cron:read"}) + ctx.Set(string(BearerAuthScopes), []string{"cron:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeScheduleCronByName(ctx, hostname, name) @@ -333,12 +420,12 @@ func (w *ServerInterfaceWrapper) GetNodeScheduleCronByName(ctx echo.Context) err } // PutNodeScheduleCron converts echo context to params. -func (w *ServerInterfaceWrapper) PutNodeScheduleCron(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PutNodeScheduleCron(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -346,12 +433,12 @@ func (w *ServerInterfaceWrapper) PutNodeScheduleCron(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name CronName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"cron:write"}) + ctx.Set(string(BearerAuthScopes), []string{"cron:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PutNodeScheduleCron(ctx, hostname, name) @@ -362,40 +449,59 @@ func (w *ServerInterfaceWrapper) PutNodeScheduleCron(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/node/:hostname/schedule/cron", wrapper.GetNodeScheduleCron) - router.POST(baseURL+"/api/node/:hostname/schedule/cron", wrapper.PostNodeScheduleCron) - router.DELETE(baseURL+"/api/node/:hostname/schedule/cron/:name", wrapper.DeleteNodeScheduleCron) - router.GET(baseURL+"/api/node/:hostname/schedule/cron/:name", wrapper.GetNodeScheduleCronByName) - router.PUT(baseURL+"/api/node/:hostname/schedule/cron/:name", wrapper.PutNodeScheduleCron) + router.GET(options.BaseURL+"/api/node/:hostname/schedule/cron", wrapper.GetNodeScheduleCron, options.OperationMiddlewares["GetNodeScheduleCron"]...) + router.POST(options.BaseURL+"/api/node/:hostname/schedule/cron", wrapper.PostNodeScheduleCron, options.OperationMiddlewares["PostNodeScheduleCron"]...) + router.DELETE(options.BaseURL+"/api/node/:hostname/schedule/cron/:name", wrapper.DeleteNodeScheduleCron, options.OperationMiddlewares["DeleteNodeScheduleCron"]...) + router.GET(options.BaseURL+"/api/node/:hostname/schedule/cron/:name", wrapper.GetNodeScheduleCronByName, options.OperationMiddlewares["GetNodeScheduleCronByName"]...) + router.PUT(options.BaseURL+"/api/node/:hostname/schedule/cron/:name", wrapper.PutNodeScheduleCron, options.OperationMiddlewares["PutNodeScheduleCron"]...) } type GetNodeScheduleCronRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeScheduleCronResponseObject interface { @@ -405,50 +511,75 @@ type GetNodeScheduleCronResponseObject interface { type GetNodeScheduleCron200JSONResponse CronCollectionResponse func (response GetNodeScheduleCron200JSONResponse) VisitGetNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeScheduleCron400JSONResponse externalRef0.ErrorResponse func (response GetNodeScheduleCron400JSONResponse) VisitGetNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeScheduleCron401JSONResponse externalRef0.ErrorResponse func (response GetNodeScheduleCron401JSONResponse) VisitGetNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeScheduleCron403JSONResponse externalRef0.ErrorResponse func (response GetNodeScheduleCron403JSONResponse) VisitGetNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeScheduleCron500JSONResponse externalRef0.ErrorResponse func (response GetNodeScheduleCron500JSONResponse) VisitGetNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeScheduleCronRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeScheduleCronJSONRequestBody } @@ -459,51 +590,76 @@ type PostNodeScheduleCronResponseObject interface { type PostNodeScheduleCron200JSONResponse CronCreateResponse func (response PostNodeScheduleCron200JSONResponse) VisitPostNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeScheduleCron400JSONResponse externalRef0.ErrorResponse func (response PostNodeScheduleCron400JSONResponse) VisitPostNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeScheduleCron401JSONResponse externalRef0.ErrorResponse func (response PostNodeScheduleCron401JSONResponse) VisitPostNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeScheduleCron403JSONResponse externalRef0.ErrorResponse func (response PostNodeScheduleCron403JSONResponse) VisitPostNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeScheduleCron500JSONResponse externalRef0.ErrorResponse func (response PostNodeScheduleCron500JSONResponse) VisitPostNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeScheduleCronRequestObject struct { - Hostname Hostname `json:"hostname"` - Name CronName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name CronName `json:"name" validate:"required,min=1"` } type DeleteNodeScheduleCronResponseObject interface { @@ -513,60 +669,90 @@ type DeleteNodeScheduleCronResponseObject interface { type DeleteNodeScheduleCron200JSONResponse CronDeleteResponse func (response DeleteNodeScheduleCron200JSONResponse) VisitDeleteNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeScheduleCron400JSONResponse externalRef0.ErrorResponse func (response DeleteNodeScheduleCron400JSONResponse) VisitDeleteNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeScheduleCron401JSONResponse externalRef0.ErrorResponse func (response DeleteNodeScheduleCron401JSONResponse) VisitDeleteNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeScheduleCron403JSONResponse externalRef0.ErrorResponse func (response DeleteNodeScheduleCron403JSONResponse) VisitDeleteNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeScheduleCron404JSONResponse externalRef0.ErrorResponse func (response DeleteNodeScheduleCron404JSONResponse) VisitDeleteNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeScheduleCron500JSONResponse externalRef0.ErrorResponse func (response DeleteNodeScheduleCron500JSONResponse) VisitDeleteNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeScheduleCronByNameRequestObject struct { - Hostname Hostname `json:"hostname"` - Name CronName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name CronName `json:"name" validate:"required,min=1"` } type GetNodeScheduleCronByNameResponseObject interface { @@ -576,60 +762,90 @@ type GetNodeScheduleCronByNameResponseObject interface { type GetNodeScheduleCronByName200JSONResponse CronGetResponse func (response GetNodeScheduleCronByName200JSONResponse) VisitGetNodeScheduleCronByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeScheduleCronByName400JSONResponse externalRef0.ErrorResponse func (response GetNodeScheduleCronByName400JSONResponse) VisitGetNodeScheduleCronByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeScheduleCronByName401JSONResponse externalRef0.ErrorResponse func (response GetNodeScheduleCronByName401JSONResponse) VisitGetNodeScheduleCronByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeScheduleCronByName403JSONResponse externalRef0.ErrorResponse func (response GetNodeScheduleCronByName403JSONResponse) VisitGetNodeScheduleCronByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeScheduleCronByName404JSONResponse externalRef0.ErrorResponse func (response GetNodeScheduleCronByName404JSONResponse) VisitGetNodeScheduleCronByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeScheduleCronByName500JSONResponse externalRef0.ErrorResponse func (response GetNodeScheduleCronByName500JSONResponse) VisitGetNodeScheduleCronByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeScheduleCronRequestObject struct { - Hostname Hostname `json:"hostname"` - Name CronName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name CronName `json:"name" validate:"required,min=1"` Body *PutNodeScheduleCronJSONRequestBody } @@ -640,55 +856,85 @@ type PutNodeScheduleCronResponseObject interface { type PutNodeScheduleCron200JSONResponse CronUpdateResponse func (response PutNodeScheduleCron200JSONResponse) VisitPutNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeScheduleCron400JSONResponse externalRef0.ErrorResponse func (response PutNodeScheduleCron400JSONResponse) VisitPutNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeScheduleCron401JSONResponse externalRef0.ErrorResponse func (response PutNodeScheduleCron401JSONResponse) VisitPutNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeScheduleCron403JSONResponse externalRef0.ErrorResponse func (response PutNodeScheduleCron403JSONResponse) VisitPutNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeScheduleCron404JSONResponse externalRef0.ErrorResponse func (response PutNodeScheduleCron404JSONResponse) VisitPutNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeScheduleCron500JSONResponse externalRef0.ErrorResponse func (response PutNodeScheduleCron500JSONResponse) VisitPutNodeScheduleCronResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -710,8 +956,8 @@ type StrictServerInterface interface { PutNodeScheduleCron(ctx context.Context, request PutNodeScheduleCronRequestObject) (PutNodeScheduleCronResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -723,12 +969,12 @@ type strictHandler struct { } // GetNodeScheduleCron operation middleware -func (sh *strictHandler) GetNodeScheduleCron(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeScheduleCron(ctx *echo.Context, hostname Hostname) error { var request GetNodeScheduleCronRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeScheduleCron(ctx.Request().Context(), request.(GetNodeScheduleCronRequestObject)) } for _, middleware := range sh.middlewares { @@ -748,7 +994,7 @@ func (sh *strictHandler) GetNodeScheduleCron(ctx echo.Context, hostname Hostname } // PostNodeScheduleCron operation middleware -func (sh *strictHandler) PostNodeScheduleCron(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeScheduleCron(ctx *echo.Context, hostname Hostname) error { var request PostNodeScheduleCronRequestObject request.Hostname = hostname @@ -759,7 +1005,7 @@ func (sh *strictHandler) PostNodeScheduleCron(ctx echo.Context, hostname Hostnam } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeScheduleCron(ctx.Request().Context(), request.(PostNodeScheduleCronRequestObject)) } for _, middleware := range sh.middlewares { @@ -779,13 +1025,13 @@ func (sh *strictHandler) PostNodeScheduleCron(ctx echo.Context, hostname Hostnam } // DeleteNodeScheduleCron operation middleware -func (sh *strictHandler) DeleteNodeScheduleCron(ctx echo.Context, hostname Hostname, name CronName) error { +func (sh *strictHandler) DeleteNodeScheduleCron(ctx *echo.Context, hostname Hostname, name CronName) error { var request DeleteNodeScheduleCronRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodeScheduleCron(ctx.Request().Context(), request.(DeleteNodeScheduleCronRequestObject)) } for _, middleware := range sh.middlewares { @@ -805,13 +1051,13 @@ func (sh *strictHandler) DeleteNodeScheduleCron(ctx echo.Context, hostname Hostn } // GetNodeScheduleCronByName operation middleware -func (sh *strictHandler) GetNodeScheduleCronByName(ctx echo.Context, hostname Hostname, name CronName) error { +func (sh *strictHandler) GetNodeScheduleCronByName(ctx *echo.Context, hostname Hostname, name CronName) error { var request GetNodeScheduleCronByNameRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeScheduleCronByName(ctx.Request().Context(), request.(GetNodeScheduleCronByNameRequestObject)) } for _, middleware := range sh.middlewares { @@ -831,7 +1077,7 @@ func (sh *strictHandler) GetNodeScheduleCronByName(ctx echo.Context, hostname Ho } // PutNodeScheduleCron operation middleware -func (sh *strictHandler) PutNodeScheduleCron(ctx echo.Context, hostname Hostname, name CronName) error { +func (sh *strictHandler) PutNodeScheduleCron(ctx *echo.Context, hostname Hostname, name CronName) error { var request PutNodeScheduleCronRequestObject request.Hostname = hostname @@ -843,7 +1089,7 @@ func (sh *strictHandler) PutNodeScheduleCron(ctx echo.Context, hostname Hostname } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PutNodeScheduleCron(ctx.Request().Context(), request.(PutNodeScheduleCronRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/schedule/handler.go b/internal/controller/api/node/schedule/handler.go index 4532361f0..371a95318 100644 --- a/internal/controller/api/node/schedule/handler.go +++ b/internal/controller/api/node/schedule/handler.go @@ -23,8 +23,7 @@ package schedule import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( scheduleHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/schedule/handler_public_test.go b/internal/controller/api/node/schedule/handler_public_test.go index 4d89538e4..d38944103 100644 --- a/internal/controller/api/node/schedule/handler_public_test.go +++ b/internal/controller/api/node/schedule/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/node/hostname/schedule/cron", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/node/service/gen/cfg.yaml b/internal/controller/api/node/service/gen/cfg.yaml index 2cff974f9..4da16c7d6 100644 --- a/internal/controller/api/node/service/gen/cfg.yaml +++ b/internal/controller/api/node/service/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: service.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/service/gen/service.gen.go b/internal/controller/api/node/service/gen/service.gen.go index b876110d5..79c3b967f 100644 --- a/internal/controller/api/node/service/gen/service.gen.go +++ b/internal/controller/api/node/service/gen/service.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for ServiceGetEntryStatus. @@ -27,6 +27,20 @@ const ( ServiceGetEntryStatusSkipped ServiceGetEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the ServiceGetEntryStatus enum. +func (e ServiceGetEntryStatus) Valid() bool { + switch e { + case ServiceGetEntryStatusFailed: + return true + case ServiceGetEntryStatusOk: + return true + case ServiceGetEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for ServiceListEntryStatus. const ( ServiceListEntryStatusFailed ServiceListEntryStatus = "failed" @@ -34,6 +48,20 @@ const ( ServiceListEntryStatusSkipped ServiceListEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the ServiceListEntryStatus enum. +func (e ServiceListEntryStatus) Valid() bool { + switch e { + case ServiceListEntryStatusFailed: + return true + case ServiceListEntryStatusOk: + return true + case ServiceListEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for ServiceMutationEntryStatus. const ( Failed ServiceMutationEntryStatus = "failed" @@ -41,6 +69,20 @@ const ( Skipped ServiceMutationEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the ServiceMutationEntryStatus enum. +func (e ServiceMutationEntryStatus) Valid() bool { + switch e { + case Failed: + return true + case Ok: + return true + case Skipped: + return true + default: + return false + } +} + // ErrorResponse defines model for ErrorResponse. type ErrorResponse = externalRef0.ErrorResponse @@ -161,6 +203,9 @@ type Hostname = string // ServiceName defines model for ServiceName. type ServiceName = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PostNodeServiceJSONRequestBody defines body for PostNodeService for application/json ContentType. type PostNodeServiceJSONRequestBody = ServiceCreateRequest @@ -171,34 +216,34 @@ type PutNodeServiceJSONRequestBody = ServiceUpdateRequest type ServerInterface interface { // List all services // (GET /api/node/{hostname}/service) - GetNodeService(ctx echo.Context, hostname Hostname) error + GetNodeService(ctx *echo.Context, hostname Hostname) error // Create a service unit file // (POST /api/node/{hostname}/service) - PostNodeService(ctx echo.Context, hostname Hostname) error + PostNodeService(ctx *echo.Context, hostname Hostname) error // Delete a service unit file // (DELETE /api/node/{hostname}/service/{name}) - DeleteNodeService(ctx echo.Context, hostname Hostname, name ServiceName) error + DeleteNodeService(ctx *echo.Context, hostname Hostname, name ServiceName) error // Get service details // (GET /api/node/{hostname}/service/{name}) - GetNodeServiceByName(ctx echo.Context, hostname Hostname, name ServiceName) error + GetNodeServiceByName(ctx *echo.Context, hostname Hostname, name ServiceName) error // Update a service unit file // (PUT /api/node/{hostname}/service/{name}) - PutNodeService(ctx echo.Context, hostname Hostname, name ServiceName) error + PutNodeService(ctx *echo.Context, hostname Hostname, name ServiceName) error // Disable a service // (POST /api/node/{hostname}/service/{name}/disable) - PostNodeServiceDisable(ctx echo.Context, hostname Hostname, name ServiceName) error + PostNodeServiceDisable(ctx *echo.Context, hostname Hostname, name ServiceName) error // Enable a service // (POST /api/node/{hostname}/service/{name}/enable) - PostNodeServiceEnable(ctx echo.Context, hostname Hostname, name ServiceName) error + PostNodeServiceEnable(ctx *echo.Context, hostname Hostname, name ServiceName) error // Restart a service // (POST /api/node/{hostname}/service/{name}/restart) - PostNodeServiceRestart(ctx echo.Context, hostname Hostname, name ServiceName) error + PostNodeServiceRestart(ctx *echo.Context, hostname Hostname, name ServiceName) error // Start a service // (POST /api/node/{hostname}/service/{name}/start) - PostNodeServiceStart(ctx echo.Context, hostname Hostname, name ServiceName) error + PostNodeServiceStart(ctx *echo.Context, hostname Hostname, name ServiceName) error // Stop a service // (POST /api/node/{hostname}/service/{name}/stop) - PostNodeServiceStop(ctx echo.Context, hostname Hostname, name ServiceName) error + PostNodeServiceStop(ctx *echo.Context, hostname Hostname, name ServiceName) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -207,17 +252,17 @@ type ServerInterfaceWrapper struct { } // GetNodeService converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeService(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeService(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"service:read"}) + ctx.Set(string(BearerAuthScopes), []string{"service:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeService(ctx, hostname) @@ -225,17 +270,17 @@ func (w *ServerInterfaceWrapper) GetNodeService(ctx echo.Context) error { } // PostNodeService converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeService(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeService(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"service:write"}) + ctx.Set(string(BearerAuthScopes), []string{"service:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeService(ctx, hostname) @@ -243,12 +288,12 @@ func (w *ServerInterfaceWrapper) PostNodeService(ctx echo.Context) error { } // DeleteNodeService converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodeService(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodeService(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -256,12 +301,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeService(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name ServiceName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"service:write"}) + ctx.Set(string(BearerAuthScopes), []string{"service:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteNodeService(ctx, hostname, name) @@ -269,12 +314,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeService(ctx echo.Context) error { } // GetNodeServiceByName converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeServiceByName(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeServiceByName(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -282,12 +327,12 @@ func (w *ServerInterfaceWrapper) GetNodeServiceByName(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name ServiceName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"service:read"}) + ctx.Set(string(BearerAuthScopes), []string{"service:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeServiceByName(ctx, hostname, name) @@ -295,12 +340,12 @@ func (w *ServerInterfaceWrapper) GetNodeServiceByName(ctx echo.Context) error { } // PutNodeService converts echo context to params. -func (w *ServerInterfaceWrapper) PutNodeService(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PutNodeService(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -308,12 +353,12 @@ func (w *ServerInterfaceWrapper) PutNodeService(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name ServiceName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"service:write"}) + ctx.Set(string(BearerAuthScopes), []string{"service:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PutNodeService(ctx, hostname, name) @@ -321,12 +366,12 @@ func (w *ServerInterfaceWrapper) PutNodeService(ctx echo.Context) error { } // PostNodeServiceDisable converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeServiceDisable(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeServiceDisable(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -334,12 +379,12 @@ func (w *ServerInterfaceWrapper) PostNodeServiceDisable(ctx echo.Context) error // ------------- Path parameter "name" ------------- var name ServiceName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"service:write"}) + ctx.Set(string(BearerAuthScopes), []string{"service:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeServiceDisable(ctx, hostname, name) @@ -347,12 +392,12 @@ func (w *ServerInterfaceWrapper) PostNodeServiceDisable(ctx echo.Context) error } // PostNodeServiceEnable converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeServiceEnable(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeServiceEnable(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -360,12 +405,12 @@ func (w *ServerInterfaceWrapper) PostNodeServiceEnable(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name ServiceName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"service:write"}) + ctx.Set(string(BearerAuthScopes), []string{"service:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeServiceEnable(ctx, hostname, name) @@ -373,12 +418,12 @@ func (w *ServerInterfaceWrapper) PostNodeServiceEnable(ctx echo.Context) error { } // PostNodeServiceRestart converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeServiceRestart(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeServiceRestart(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -386,12 +431,12 @@ func (w *ServerInterfaceWrapper) PostNodeServiceRestart(ctx echo.Context) error // ------------- Path parameter "name" ------------- var name ServiceName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"service:write"}) + ctx.Set(string(BearerAuthScopes), []string{"service:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeServiceRestart(ctx, hostname, name) @@ -399,12 +444,12 @@ func (w *ServerInterfaceWrapper) PostNodeServiceRestart(ctx echo.Context) error } // PostNodeServiceStart converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeServiceStart(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeServiceStart(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -412,12 +457,12 @@ func (w *ServerInterfaceWrapper) PostNodeServiceStart(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name ServiceName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"service:write"}) + ctx.Set(string(BearerAuthScopes), []string{"service:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeServiceStart(ctx, hostname, name) @@ -425,12 +470,12 @@ func (w *ServerInterfaceWrapper) PostNodeServiceStart(ctx echo.Context) error { } // PostNodeServiceStop converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeServiceStop(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeServiceStop(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -438,12 +483,12 @@ func (w *ServerInterfaceWrapper) PostNodeServiceStop(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name ServiceName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"service:write"}) + ctx.Set(string(BearerAuthScopes), []string{"service:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeServiceStop(ctx, hostname, name) @@ -454,45 +499,64 @@ func (w *ServerInterfaceWrapper) PostNodeServiceStop(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/node/:hostname/service", wrapper.GetNodeService) - router.POST(baseURL+"/api/node/:hostname/service", wrapper.PostNodeService) - router.DELETE(baseURL+"/api/node/:hostname/service/:name", wrapper.DeleteNodeService) - router.GET(baseURL+"/api/node/:hostname/service/:name", wrapper.GetNodeServiceByName) - router.PUT(baseURL+"/api/node/:hostname/service/:name", wrapper.PutNodeService) - router.POST(baseURL+"/api/node/:hostname/service/:name/disable", wrapper.PostNodeServiceDisable) - router.POST(baseURL+"/api/node/:hostname/service/:name/enable", wrapper.PostNodeServiceEnable) - router.POST(baseURL+"/api/node/:hostname/service/:name/restart", wrapper.PostNodeServiceRestart) - router.POST(baseURL+"/api/node/:hostname/service/:name/start", wrapper.PostNodeServiceStart) - router.POST(baseURL+"/api/node/:hostname/service/:name/stop", wrapper.PostNodeServiceStop) + router.GET(options.BaseURL+"/api/node/:hostname/service", wrapper.GetNodeService, options.OperationMiddlewares["GetNodeService"]...) + router.POST(options.BaseURL+"/api/node/:hostname/service", wrapper.PostNodeService, options.OperationMiddlewares["PostNodeService"]...) + router.DELETE(options.BaseURL+"/api/node/:hostname/service/:name", wrapper.DeleteNodeService, options.OperationMiddlewares["DeleteNodeService"]...) + router.GET(options.BaseURL+"/api/node/:hostname/service/:name", wrapper.GetNodeServiceByName, options.OperationMiddlewares["GetNodeServiceByName"]...) + router.PUT(options.BaseURL+"/api/node/:hostname/service/:name", wrapper.PutNodeService, options.OperationMiddlewares["PutNodeService"]...) + router.POST(options.BaseURL+"/api/node/:hostname/service/:name/disable", wrapper.PostNodeServiceDisable, options.OperationMiddlewares["PostNodeServiceDisable"]...) + router.POST(options.BaseURL+"/api/node/:hostname/service/:name/enable", wrapper.PostNodeServiceEnable, options.OperationMiddlewares["PostNodeServiceEnable"]...) + router.POST(options.BaseURL+"/api/node/:hostname/service/:name/restart", wrapper.PostNodeServiceRestart, options.OperationMiddlewares["PostNodeServiceRestart"]...) + router.POST(options.BaseURL+"/api/node/:hostname/service/:name/start", wrapper.PostNodeServiceStart, options.OperationMiddlewares["PostNodeServiceStart"]...) + router.POST(options.BaseURL+"/api/node/:hostname/service/:name/stop", wrapper.PostNodeServiceStop, options.OperationMiddlewares["PostNodeServiceStop"]...) } type GetNodeServiceRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeServiceResponseObject interface { @@ -502,50 +566,75 @@ type GetNodeServiceResponseObject interface { type GetNodeService200JSONResponse ServiceListResponse func (response GetNodeService200JSONResponse) VisitGetNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeService400JSONResponse externalRef0.ErrorResponse func (response GetNodeService400JSONResponse) VisitGetNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeService401JSONResponse externalRef0.ErrorResponse func (response GetNodeService401JSONResponse) VisitGetNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeService403JSONResponse externalRef0.ErrorResponse func (response GetNodeService403JSONResponse) VisitGetNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeService500JSONResponse externalRef0.ErrorResponse func (response GetNodeService500JSONResponse) VisitGetNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeServiceJSONRequestBody } @@ -556,51 +645,76 @@ type PostNodeServiceResponseObject interface { type PostNodeService200JSONResponse ServiceMutationResponse func (response PostNodeService200JSONResponse) VisitPostNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeService400JSONResponse externalRef0.ErrorResponse func (response PostNodeService400JSONResponse) VisitPostNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeService401JSONResponse externalRef0.ErrorResponse func (response PostNodeService401JSONResponse) VisitPostNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeService403JSONResponse externalRef0.ErrorResponse func (response PostNodeService403JSONResponse) VisitPostNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeService500JSONResponse externalRef0.ErrorResponse func (response PostNodeService500JSONResponse) VisitPostNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeServiceRequestObject struct { - Hostname Hostname `json:"hostname"` - Name ServiceName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name ServiceName `json:"name" validate:"required,min=1"` } type DeleteNodeServiceResponseObject interface { @@ -610,51 +724,76 @@ type DeleteNodeServiceResponseObject interface { type DeleteNodeService200JSONResponse ServiceMutationResponse func (response DeleteNodeService200JSONResponse) VisitDeleteNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeService400JSONResponse externalRef0.ErrorResponse func (response DeleteNodeService400JSONResponse) VisitDeleteNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeService401JSONResponse externalRef0.ErrorResponse func (response DeleteNodeService401JSONResponse) VisitDeleteNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeService403JSONResponse externalRef0.ErrorResponse func (response DeleteNodeService403JSONResponse) VisitDeleteNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeService500JSONResponse externalRef0.ErrorResponse func (response DeleteNodeService500JSONResponse) VisitDeleteNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeServiceByNameRequestObject struct { - Hostname Hostname `json:"hostname"` - Name ServiceName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name ServiceName `json:"name" validate:"required,min=1"` } type GetNodeServiceByNameResponseObject interface { @@ -664,60 +803,90 @@ type GetNodeServiceByNameResponseObject interface { type GetNodeServiceByName200JSONResponse ServiceGetResponse func (response GetNodeServiceByName200JSONResponse) VisitGetNodeServiceByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeServiceByName400JSONResponse externalRef0.ErrorResponse func (response GetNodeServiceByName400JSONResponse) VisitGetNodeServiceByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeServiceByName401JSONResponse externalRef0.ErrorResponse func (response GetNodeServiceByName401JSONResponse) VisitGetNodeServiceByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeServiceByName403JSONResponse externalRef0.ErrorResponse func (response GetNodeServiceByName403JSONResponse) VisitGetNodeServiceByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeServiceByName404JSONResponse externalRef0.ErrorResponse func (response GetNodeServiceByName404JSONResponse) VisitGetNodeServiceByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeServiceByName500JSONResponse externalRef0.ErrorResponse func (response GetNodeServiceByName500JSONResponse) VisitGetNodeServiceByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeServiceRequestObject struct { - Hostname Hostname `json:"hostname"` - Name ServiceName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name ServiceName `json:"name" validate:"required,min=1"` Body *PutNodeServiceJSONRequestBody } @@ -728,60 +897,90 @@ type PutNodeServiceResponseObject interface { type PutNodeService200JSONResponse ServiceMutationResponse func (response PutNodeService200JSONResponse) VisitPutNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeService400JSONResponse externalRef0.ErrorResponse func (response PutNodeService400JSONResponse) VisitPutNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeService401JSONResponse externalRef0.ErrorResponse func (response PutNodeService401JSONResponse) VisitPutNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeService403JSONResponse externalRef0.ErrorResponse func (response PutNodeService403JSONResponse) VisitPutNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeService404JSONResponse externalRef0.ErrorResponse func (response PutNodeService404JSONResponse) VisitPutNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeService500JSONResponse externalRef0.ErrorResponse func (response PutNodeService500JSONResponse) VisitPutNodeServiceResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceDisableRequestObject struct { - Hostname Hostname `json:"hostname"` - Name ServiceName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name ServiceName `json:"name" validate:"required,min=1"` } type PostNodeServiceDisableResponseObject interface { @@ -791,51 +990,76 @@ type PostNodeServiceDisableResponseObject interface { type PostNodeServiceDisable200JSONResponse ServiceMutationResponse func (response PostNodeServiceDisable200JSONResponse) VisitPostNodeServiceDisableResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceDisable400JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceDisable400JSONResponse) VisitPostNodeServiceDisableResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceDisable401JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceDisable401JSONResponse) VisitPostNodeServiceDisableResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceDisable403JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceDisable403JSONResponse) VisitPostNodeServiceDisableResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceDisable500JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceDisable500JSONResponse) VisitPostNodeServiceDisableResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceEnableRequestObject struct { - Hostname Hostname `json:"hostname"` - Name ServiceName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name ServiceName `json:"name" validate:"required,min=1"` } type PostNodeServiceEnableResponseObject interface { @@ -845,51 +1069,76 @@ type PostNodeServiceEnableResponseObject interface { type PostNodeServiceEnable200JSONResponse ServiceMutationResponse func (response PostNodeServiceEnable200JSONResponse) VisitPostNodeServiceEnableResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceEnable400JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceEnable400JSONResponse) VisitPostNodeServiceEnableResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceEnable401JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceEnable401JSONResponse) VisitPostNodeServiceEnableResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceEnable403JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceEnable403JSONResponse) VisitPostNodeServiceEnableResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceEnable500JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceEnable500JSONResponse) VisitPostNodeServiceEnableResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceRestartRequestObject struct { - Hostname Hostname `json:"hostname"` - Name ServiceName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name ServiceName `json:"name" validate:"required,min=1"` } type PostNodeServiceRestartResponseObject interface { @@ -899,51 +1148,76 @@ type PostNodeServiceRestartResponseObject interface { type PostNodeServiceRestart200JSONResponse ServiceMutationResponse func (response PostNodeServiceRestart200JSONResponse) VisitPostNodeServiceRestartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceRestart400JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceRestart400JSONResponse) VisitPostNodeServiceRestartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceRestart401JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceRestart401JSONResponse) VisitPostNodeServiceRestartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceRestart403JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceRestart403JSONResponse) VisitPostNodeServiceRestartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceRestart500JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceRestart500JSONResponse) VisitPostNodeServiceRestartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceStartRequestObject struct { - Hostname Hostname `json:"hostname"` - Name ServiceName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name ServiceName `json:"name" validate:"required,min=1"` } type PostNodeServiceStartResponseObject interface { @@ -953,51 +1227,76 @@ type PostNodeServiceStartResponseObject interface { type PostNodeServiceStart200JSONResponse ServiceMutationResponse func (response PostNodeServiceStart200JSONResponse) VisitPostNodeServiceStartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceStart400JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceStart400JSONResponse) VisitPostNodeServiceStartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceStart401JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceStart401JSONResponse) VisitPostNodeServiceStartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceStart403JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceStart403JSONResponse) VisitPostNodeServiceStartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceStart500JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceStart500JSONResponse) VisitPostNodeServiceStartResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceStopRequestObject struct { - Hostname Hostname `json:"hostname"` - Name ServiceName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name ServiceName `json:"name" validate:"required,min=1"` } type PostNodeServiceStopResponseObject interface { @@ -1007,46 +1306,71 @@ type PostNodeServiceStopResponseObject interface { type PostNodeServiceStop200JSONResponse ServiceMutationResponse func (response PostNodeServiceStop200JSONResponse) VisitPostNodeServiceStopResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceStop400JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceStop400JSONResponse) VisitPostNodeServiceStopResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceStop401JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceStop401JSONResponse) VisitPostNodeServiceStopResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceStop403JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceStop403JSONResponse) VisitPostNodeServiceStopResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeServiceStop500JSONResponse externalRef0.ErrorResponse func (response PostNodeServiceStop500JSONResponse) VisitPostNodeServiceStopResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -1083,8 +1407,8 @@ type StrictServerInterface interface { PostNodeServiceStop(ctx context.Context, request PostNodeServiceStopRequestObject) (PostNodeServiceStopResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -1096,12 +1420,12 @@ type strictHandler struct { } // GetNodeService operation middleware -func (sh *strictHandler) GetNodeService(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeService(ctx *echo.Context, hostname Hostname) error { var request GetNodeServiceRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeService(ctx.Request().Context(), request.(GetNodeServiceRequestObject)) } for _, middleware := range sh.middlewares { @@ -1121,7 +1445,7 @@ func (sh *strictHandler) GetNodeService(ctx echo.Context, hostname Hostname) err } // PostNodeService operation middleware -func (sh *strictHandler) PostNodeService(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeService(ctx *echo.Context, hostname Hostname) error { var request PostNodeServiceRequestObject request.Hostname = hostname @@ -1132,7 +1456,7 @@ func (sh *strictHandler) PostNodeService(ctx echo.Context, hostname Hostname) er } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeService(ctx.Request().Context(), request.(PostNodeServiceRequestObject)) } for _, middleware := range sh.middlewares { @@ -1152,13 +1476,13 @@ func (sh *strictHandler) PostNodeService(ctx echo.Context, hostname Hostname) er } // DeleteNodeService operation middleware -func (sh *strictHandler) DeleteNodeService(ctx echo.Context, hostname Hostname, name ServiceName) error { +func (sh *strictHandler) DeleteNodeService(ctx *echo.Context, hostname Hostname, name ServiceName) error { var request DeleteNodeServiceRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodeService(ctx.Request().Context(), request.(DeleteNodeServiceRequestObject)) } for _, middleware := range sh.middlewares { @@ -1178,13 +1502,13 @@ func (sh *strictHandler) DeleteNodeService(ctx echo.Context, hostname Hostname, } // GetNodeServiceByName operation middleware -func (sh *strictHandler) GetNodeServiceByName(ctx echo.Context, hostname Hostname, name ServiceName) error { +func (sh *strictHandler) GetNodeServiceByName(ctx *echo.Context, hostname Hostname, name ServiceName) error { var request GetNodeServiceByNameRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeServiceByName(ctx.Request().Context(), request.(GetNodeServiceByNameRequestObject)) } for _, middleware := range sh.middlewares { @@ -1204,7 +1528,7 @@ func (sh *strictHandler) GetNodeServiceByName(ctx echo.Context, hostname Hostnam } // PutNodeService operation middleware -func (sh *strictHandler) PutNodeService(ctx echo.Context, hostname Hostname, name ServiceName) error { +func (sh *strictHandler) PutNodeService(ctx *echo.Context, hostname Hostname, name ServiceName) error { var request PutNodeServiceRequestObject request.Hostname = hostname @@ -1216,7 +1540,7 @@ func (sh *strictHandler) PutNodeService(ctx echo.Context, hostname Hostname, nam } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PutNodeService(ctx.Request().Context(), request.(PutNodeServiceRequestObject)) } for _, middleware := range sh.middlewares { @@ -1236,13 +1560,13 @@ func (sh *strictHandler) PutNodeService(ctx echo.Context, hostname Hostname, nam } // PostNodeServiceDisable operation middleware -func (sh *strictHandler) PostNodeServiceDisable(ctx echo.Context, hostname Hostname, name ServiceName) error { +func (sh *strictHandler) PostNodeServiceDisable(ctx *echo.Context, hostname Hostname, name ServiceName) error { var request PostNodeServiceDisableRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeServiceDisable(ctx.Request().Context(), request.(PostNodeServiceDisableRequestObject)) } for _, middleware := range sh.middlewares { @@ -1262,13 +1586,13 @@ func (sh *strictHandler) PostNodeServiceDisable(ctx echo.Context, hostname Hostn } // PostNodeServiceEnable operation middleware -func (sh *strictHandler) PostNodeServiceEnable(ctx echo.Context, hostname Hostname, name ServiceName) error { +func (sh *strictHandler) PostNodeServiceEnable(ctx *echo.Context, hostname Hostname, name ServiceName) error { var request PostNodeServiceEnableRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeServiceEnable(ctx.Request().Context(), request.(PostNodeServiceEnableRequestObject)) } for _, middleware := range sh.middlewares { @@ -1288,13 +1612,13 @@ func (sh *strictHandler) PostNodeServiceEnable(ctx echo.Context, hostname Hostna } // PostNodeServiceRestart operation middleware -func (sh *strictHandler) PostNodeServiceRestart(ctx echo.Context, hostname Hostname, name ServiceName) error { +func (sh *strictHandler) PostNodeServiceRestart(ctx *echo.Context, hostname Hostname, name ServiceName) error { var request PostNodeServiceRestartRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeServiceRestart(ctx.Request().Context(), request.(PostNodeServiceRestartRequestObject)) } for _, middleware := range sh.middlewares { @@ -1314,13 +1638,13 @@ func (sh *strictHandler) PostNodeServiceRestart(ctx echo.Context, hostname Hostn } // PostNodeServiceStart operation middleware -func (sh *strictHandler) PostNodeServiceStart(ctx echo.Context, hostname Hostname, name ServiceName) error { +func (sh *strictHandler) PostNodeServiceStart(ctx *echo.Context, hostname Hostname, name ServiceName) error { var request PostNodeServiceStartRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeServiceStart(ctx.Request().Context(), request.(PostNodeServiceStartRequestObject)) } for _, middleware := range sh.middlewares { @@ -1340,13 +1664,13 @@ func (sh *strictHandler) PostNodeServiceStart(ctx echo.Context, hostname Hostnam } // PostNodeServiceStop operation middleware -func (sh *strictHandler) PostNodeServiceStop(ctx echo.Context, hostname Hostname, name ServiceName) error { +func (sh *strictHandler) PostNodeServiceStop(ctx *echo.Context, hostname Hostname, name ServiceName) error { var request PostNodeServiceStopRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeServiceStop(ctx.Request().Context(), request.(PostNodeServiceStopRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/service/handler.go b/internal/controller/api/node/service/handler.go index 0a9c8756f..33fbe41af 100644 --- a/internal/controller/api/node/service/handler.go +++ b/internal/controller/api/node/service/handler.go @@ -23,8 +23,7 @@ package service import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( serviceHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/service/handler_public_test.go b/internal/controller/api/node/service/handler_public_test.go index 74ad77375..6af2941f9 100644 --- a/internal/controller/api/node/service/handler_public_test.go +++ b/internal/controller/api/node/service/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/node/hostname/service", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/node/sysctl/gen/cfg.yaml b/internal/controller/api/node/sysctl/gen/cfg.yaml index 1aff3c4e0..ae0ef12ec 100644 --- a/internal/controller/api/node/sysctl/gen/cfg.yaml +++ b/internal/controller/api/node/sysctl/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: sysctl.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/sysctl/gen/sysctl.gen.go b/internal/controller/api/node/sysctl/gen/sysctl.gen.go index fe4e0f5bc..7d6768c8f 100644 --- a/internal/controller/api/node/sysctl/gen/sysctl.gen.go +++ b/internal/controller/api/node/sysctl/gen/sysctl.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for SysctlEntryStatus. @@ -27,6 +27,20 @@ const ( SysctlEntryStatusSkipped SysctlEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the SysctlEntryStatus enum. +func (e SysctlEntryStatus) Valid() bool { + switch e { + case SysctlEntryStatusFailed: + return true + case SysctlEntryStatusOk: + return true + case SysctlEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for SysctlMutationResultStatus. const ( SysctlMutationResultStatusFailed SysctlMutationResultStatus = "failed" @@ -34,6 +48,20 @@ const ( SysctlMutationResultStatusSkipped SysctlMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the SysctlMutationResultStatus enum. +func (e SysctlMutationResultStatus) Valid() bool { + switch e { + case SysctlMutationResultStatusFailed: + return true + case SysctlMutationResultStatusOk: + return true + case SysctlMutationResultStatusSkipped: + return true + default: + return false + } +} + // ErrorResponse defines model for ErrorResponse. type ErrorResponse = externalRef0.ErrorResponse @@ -135,6 +163,9 @@ type Hostname = string // SysctlKey defines model for SysctlKey. type SysctlKey = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PostNodeSysctlJSONRequestBody defines body for PostNodeSysctl for application/json ContentType. type PostNodeSysctlJSONRequestBody = SysctlCreateRequest @@ -145,19 +176,19 @@ type PutNodeSysctlJSONRequestBody = SysctlUpdateRequest type ServerInterface interface { // List all managed sysctl entries // (GET /api/node/{hostname}/sysctl) - GetNodeSysctl(ctx echo.Context, hostname Hostname) error + GetNodeSysctl(ctx *echo.Context, hostname Hostname) error // Create a sysctl parameter // (POST /api/node/{hostname}/sysctl) - PostNodeSysctl(ctx echo.Context, hostname Hostname) error + PostNodeSysctl(ctx *echo.Context, hostname Hostname) error // Delete a managed sysctl entry // (DELETE /api/node/{hostname}/sysctl/{key}) - DeleteNodeSysctl(ctx echo.Context, hostname Hostname, key SysctlKey) error + DeleteNodeSysctl(ctx *echo.Context, hostname Hostname, key SysctlKey) error // Get a sysctl entry // (GET /api/node/{hostname}/sysctl/{key}) - GetNodeSysctlByKey(ctx echo.Context, hostname Hostname, key SysctlKey) error + GetNodeSysctlByKey(ctx *echo.Context, hostname Hostname, key SysctlKey) error // Update a sysctl parameter // (PUT /api/node/{hostname}/sysctl/{key}) - PutNodeSysctl(ctx echo.Context, hostname Hostname, key SysctlKey) error + PutNodeSysctl(ctx *echo.Context, hostname Hostname, key SysctlKey) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -166,17 +197,17 @@ type ServerInterfaceWrapper struct { } // GetNodeSysctl converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeSysctl(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeSysctl(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"sysctl:read"}) + ctx.Set(string(BearerAuthScopes), []string{"sysctl:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeSysctl(ctx, hostname) @@ -184,17 +215,17 @@ func (w *ServerInterfaceWrapper) GetNodeSysctl(ctx echo.Context) error { } // PostNodeSysctl converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeSysctl(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeSysctl(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"sysctl:write"}) + ctx.Set(string(BearerAuthScopes), []string{"sysctl:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeSysctl(ctx, hostname) @@ -202,12 +233,12 @@ func (w *ServerInterfaceWrapper) PostNodeSysctl(ctx echo.Context) error { } // DeleteNodeSysctl converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodeSysctl(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodeSysctl(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -215,12 +246,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeSysctl(ctx echo.Context) error { // ------------- Path parameter "key" ------------- var key SysctlKey - err = runtime.BindStyledParameterWithOptions("simple", "key", ctx.Param("key"), &key, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "key", ctx.Param("key"), &key, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter key: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"sysctl:write"}) + ctx.Set(string(BearerAuthScopes), []string{"sysctl:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteNodeSysctl(ctx, hostname, key) @@ -228,12 +259,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeSysctl(ctx echo.Context) error { } // GetNodeSysctlByKey converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeSysctlByKey(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeSysctlByKey(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -241,12 +272,12 @@ func (w *ServerInterfaceWrapper) GetNodeSysctlByKey(ctx echo.Context) error { // ------------- Path parameter "key" ------------- var key SysctlKey - err = runtime.BindStyledParameterWithOptions("simple", "key", ctx.Param("key"), &key, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "key", ctx.Param("key"), &key, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter key: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"sysctl:read"}) + ctx.Set(string(BearerAuthScopes), []string{"sysctl:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeSysctlByKey(ctx, hostname, key) @@ -254,12 +285,12 @@ func (w *ServerInterfaceWrapper) GetNodeSysctlByKey(ctx echo.Context) error { } // PutNodeSysctl converts echo context to params. -func (w *ServerInterfaceWrapper) PutNodeSysctl(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PutNodeSysctl(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -267,12 +298,12 @@ func (w *ServerInterfaceWrapper) PutNodeSysctl(ctx echo.Context) error { // ------------- Path parameter "key" ------------- var key SysctlKey - err = runtime.BindStyledParameterWithOptions("simple", "key", ctx.Param("key"), &key, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "key", ctx.Param("key"), &key, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter key: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"sysctl:write"}) + ctx.Set(string(BearerAuthScopes), []string{"sysctl:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PutNodeSysctl(ctx, hostname, key) @@ -283,40 +314,59 @@ func (w *ServerInterfaceWrapper) PutNodeSysctl(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/node/:hostname/sysctl", wrapper.GetNodeSysctl) - router.POST(baseURL+"/api/node/:hostname/sysctl", wrapper.PostNodeSysctl) - router.DELETE(baseURL+"/api/node/:hostname/sysctl/:key", wrapper.DeleteNodeSysctl) - router.GET(baseURL+"/api/node/:hostname/sysctl/:key", wrapper.GetNodeSysctlByKey) - router.PUT(baseURL+"/api/node/:hostname/sysctl/:key", wrapper.PutNodeSysctl) + router.GET(options.BaseURL+"/api/node/:hostname/sysctl", wrapper.GetNodeSysctl, options.OperationMiddlewares["GetNodeSysctl"]...) + router.POST(options.BaseURL+"/api/node/:hostname/sysctl", wrapper.PostNodeSysctl, options.OperationMiddlewares["PostNodeSysctl"]...) + router.DELETE(options.BaseURL+"/api/node/:hostname/sysctl/:key", wrapper.DeleteNodeSysctl, options.OperationMiddlewares["DeleteNodeSysctl"]...) + router.GET(options.BaseURL+"/api/node/:hostname/sysctl/:key", wrapper.GetNodeSysctlByKey, options.OperationMiddlewares["GetNodeSysctlByKey"]...) + router.PUT(options.BaseURL+"/api/node/:hostname/sysctl/:key", wrapper.PutNodeSysctl, options.OperationMiddlewares["PutNodeSysctl"]...) } type GetNodeSysctlRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeSysctlResponseObject interface { @@ -326,50 +376,75 @@ type GetNodeSysctlResponseObject interface { type GetNodeSysctl200JSONResponse SysctlCollectionResponse func (response GetNodeSysctl200JSONResponse) VisitGetNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeSysctl400JSONResponse externalRef0.ErrorResponse func (response GetNodeSysctl400JSONResponse) VisitGetNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeSysctl401JSONResponse externalRef0.ErrorResponse func (response GetNodeSysctl401JSONResponse) VisitGetNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeSysctl403JSONResponse externalRef0.ErrorResponse func (response GetNodeSysctl403JSONResponse) VisitGetNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeSysctl500JSONResponse externalRef0.ErrorResponse func (response GetNodeSysctl500JSONResponse) VisitGetNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeSysctlRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeSysctlJSONRequestBody } @@ -380,51 +455,76 @@ type PostNodeSysctlResponseObject interface { type PostNodeSysctl200JSONResponse SysctlCreateResponse func (response PostNodeSysctl200JSONResponse) VisitPostNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeSysctl400JSONResponse externalRef0.ErrorResponse func (response PostNodeSysctl400JSONResponse) VisitPostNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeSysctl401JSONResponse externalRef0.ErrorResponse func (response PostNodeSysctl401JSONResponse) VisitPostNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeSysctl403JSONResponse externalRef0.ErrorResponse func (response PostNodeSysctl403JSONResponse) VisitPostNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeSysctl500JSONResponse externalRef0.ErrorResponse func (response PostNodeSysctl500JSONResponse) VisitPostNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeSysctlRequestObject struct { - Hostname Hostname `json:"hostname"` - Key SysctlKey `json:"key"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Key SysctlKey `json:"key" validate:"required,min=1"` } type DeleteNodeSysctlResponseObject interface { @@ -434,60 +534,90 @@ type DeleteNodeSysctlResponseObject interface { type DeleteNodeSysctl200JSONResponse SysctlDeleteResponse func (response DeleteNodeSysctl200JSONResponse) VisitDeleteNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeSysctl400JSONResponse externalRef0.ErrorResponse func (response DeleteNodeSysctl400JSONResponse) VisitDeleteNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeSysctl401JSONResponse externalRef0.ErrorResponse func (response DeleteNodeSysctl401JSONResponse) VisitDeleteNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeSysctl403JSONResponse externalRef0.ErrorResponse func (response DeleteNodeSysctl403JSONResponse) VisitDeleteNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeSysctl404JSONResponse externalRef0.ErrorResponse func (response DeleteNodeSysctl404JSONResponse) VisitDeleteNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeSysctl500JSONResponse externalRef0.ErrorResponse func (response DeleteNodeSysctl500JSONResponse) VisitDeleteNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeSysctlByKeyRequestObject struct { - Hostname Hostname `json:"hostname"` - Key SysctlKey `json:"key"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Key SysctlKey `json:"key" validate:"required,min=1"` } type GetNodeSysctlByKeyResponseObject interface { @@ -497,60 +627,90 @@ type GetNodeSysctlByKeyResponseObject interface { type GetNodeSysctlByKey200JSONResponse SysctlGetResponse func (response GetNodeSysctlByKey200JSONResponse) VisitGetNodeSysctlByKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeSysctlByKey400JSONResponse externalRef0.ErrorResponse func (response GetNodeSysctlByKey400JSONResponse) VisitGetNodeSysctlByKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeSysctlByKey401JSONResponse externalRef0.ErrorResponse func (response GetNodeSysctlByKey401JSONResponse) VisitGetNodeSysctlByKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeSysctlByKey403JSONResponse externalRef0.ErrorResponse func (response GetNodeSysctlByKey403JSONResponse) VisitGetNodeSysctlByKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeSysctlByKey404JSONResponse externalRef0.ErrorResponse func (response GetNodeSysctlByKey404JSONResponse) VisitGetNodeSysctlByKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeSysctlByKey500JSONResponse externalRef0.ErrorResponse func (response GetNodeSysctlByKey500JSONResponse) VisitGetNodeSysctlByKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeSysctlRequestObject struct { - Hostname Hostname `json:"hostname"` - Key SysctlKey `json:"key"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Key SysctlKey `json:"key" validate:"required,min=1"` Body *PutNodeSysctlJSONRequestBody } @@ -561,55 +721,85 @@ type PutNodeSysctlResponseObject interface { type PutNodeSysctl200JSONResponse SysctlUpdateResponse func (response PutNodeSysctl200JSONResponse) VisitPutNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeSysctl400JSONResponse externalRef0.ErrorResponse func (response PutNodeSysctl400JSONResponse) VisitPutNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeSysctl401JSONResponse externalRef0.ErrorResponse func (response PutNodeSysctl401JSONResponse) VisitPutNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeSysctl403JSONResponse externalRef0.ErrorResponse func (response PutNodeSysctl403JSONResponse) VisitPutNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeSysctl404JSONResponse externalRef0.ErrorResponse func (response PutNodeSysctl404JSONResponse) VisitPutNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeSysctl500JSONResponse externalRef0.ErrorResponse func (response PutNodeSysctl500JSONResponse) VisitPutNodeSysctlResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -631,8 +821,8 @@ type StrictServerInterface interface { PutNodeSysctl(ctx context.Context, request PutNodeSysctlRequestObject) (PutNodeSysctlResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -644,12 +834,12 @@ type strictHandler struct { } // GetNodeSysctl operation middleware -func (sh *strictHandler) GetNodeSysctl(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeSysctl(ctx *echo.Context, hostname Hostname) error { var request GetNodeSysctlRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeSysctl(ctx.Request().Context(), request.(GetNodeSysctlRequestObject)) } for _, middleware := range sh.middlewares { @@ -669,7 +859,7 @@ func (sh *strictHandler) GetNodeSysctl(ctx echo.Context, hostname Hostname) erro } // PostNodeSysctl operation middleware -func (sh *strictHandler) PostNodeSysctl(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeSysctl(ctx *echo.Context, hostname Hostname) error { var request PostNodeSysctlRequestObject request.Hostname = hostname @@ -680,7 +870,7 @@ func (sh *strictHandler) PostNodeSysctl(ctx echo.Context, hostname Hostname) err } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeSysctl(ctx.Request().Context(), request.(PostNodeSysctlRequestObject)) } for _, middleware := range sh.middlewares { @@ -700,13 +890,13 @@ func (sh *strictHandler) PostNodeSysctl(ctx echo.Context, hostname Hostname) err } // DeleteNodeSysctl operation middleware -func (sh *strictHandler) DeleteNodeSysctl(ctx echo.Context, hostname Hostname, key SysctlKey) error { +func (sh *strictHandler) DeleteNodeSysctl(ctx *echo.Context, hostname Hostname, key SysctlKey) error { var request DeleteNodeSysctlRequestObject request.Hostname = hostname request.Key = key - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodeSysctl(ctx.Request().Context(), request.(DeleteNodeSysctlRequestObject)) } for _, middleware := range sh.middlewares { @@ -726,13 +916,13 @@ func (sh *strictHandler) DeleteNodeSysctl(ctx echo.Context, hostname Hostname, k } // GetNodeSysctlByKey operation middleware -func (sh *strictHandler) GetNodeSysctlByKey(ctx echo.Context, hostname Hostname, key SysctlKey) error { +func (sh *strictHandler) GetNodeSysctlByKey(ctx *echo.Context, hostname Hostname, key SysctlKey) error { var request GetNodeSysctlByKeyRequestObject request.Hostname = hostname request.Key = key - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeSysctlByKey(ctx.Request().Context(), request.(GetNodeSysctlByKeyRequestObject)) } for _, middleware := range sh.middlewares { @@ -752,7 +942,7 @@ func (sh *strictHandler) GetNodeSysctlByKey(ctx echo.Context, hostname Hostname, } // PutNodeSysctl operation middleware -func (sh *strictHandler) PutNodeSysctl(ctx echo.Context, hostname Hostname, key SysctlKey) error { +func (sh *strictHandler) PutNodeSysctl(ctx *echo.Context, hostname Hostname, key SysctlKey) error { var request PutNodeSysctlRequestObject request.Hostname = hostname @@ -764,7 +954,7 @@ func (sh *strictHandler) PutNodeSysctl(ctx echo.Context, hostname Hostname, key } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PutNodeSysctl(ctx.Request().Context(), request.(PutNodeSysctlRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/sysctl/handler.go b/internal/controller/api/node/sysctl/handler.go index 50e47aa37..adbb7672b 100644 --- a/internal/controller/api/node/sysctl/handler.go +++ b/internal/controller/api/node/sysctl/handler.go @@ -23,8 +23,7 @@ package sysctl import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( sysctlHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/sysctl/handler_public_test.go b/internal/controller/api/node/sysctl/handler_public_test.go index d688b1285..56cd186b2 100644 --- a/internal/controller/api/node/sysctl/handler_public_test.go +++ b/internal/controller/api/node/sysctl/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/node/hostname/sysctl", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/node/timezone/gen/cfg.yaml b/internal/controller/api/node/timezone/gen/cfg.yaml index ce3085505..c01357629 100644 --- a/internal/controller/api/node/timezone/gen/cfg.yaml +++ b/internal/controller/api/node/timezone/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: timezone.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/timezone/gen/timezone.gen.go b/internal/controller/api/node/timezone/gen/timezone.gen.go index a20fed1b9..bae7d0c0d 100644 --- a/internal/controller/api/node/timezone/gen/timezone.gen.go +++ b/internal/controller/api/node/timezone/gen/timezone.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for TimezoneEntryStatus. @@ -27,6 +27,20 @@ const ( TimezoneEntryStatusSkipped TimezoneEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the TimezoneEntryStatus enum. +func (e TimezoneEntryStatus) Valid() bool { + switch e { + case TimezoneEntryStatusFailed: + return true + case TimezoneEntryStatusOk: + return true + case TimezoneEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for TimezoneMutationResultStatus. const ( TimezoneMutationResultStatusFailed TimezoneMutationResultStatus = "failed" @@ -34,6 +48,20 @@ const ( TimezoneMutationResultStatusSkipped TimezoneMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the TimezoneMutationResultStatus enum. +func (e TimezoneMutationResultStatus) Valid() bool { + switch e { + case TimezoneMutationResultStatusFailed: + return true + case TimezoneMutationResultStatusOk: + return true + case TimezoneMutationResultStatusSkipped: + return true + default: + return false + } +} + // ErrorResponse defines model for ErrorResponse. type ErrorResponse = externalRef0.ErrorResponse @@ -102,6 +130,9 @@ type TimezoneUpdateResponse struct { // Hostname defines model for Hostname. type Hostname = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PutNodeTimezoneJSONRequestBody defines body for PutNodeTimezone for application/json ContentType. type PutNodeTimezoneJSONRequestBody = TimezoneUpdateRequest @@ -109,10 +140,10 @@ type PutNodeTimezoneJSONRequestBody = TimezoneUpdateRequest type ServerInterface interface { // Get system timezone // (GET /api/node/{hostname}/timezone) - GetNodeTimezone(ctx echo.Context, hostname Hostname) error + GetNodeTimezone(ctx *echo.Context, hostname Hostname) error // Update system timezone // (PUT /api/node/{hostname}/timezone) - PutNodeTimezone(ctx echo.Context, hostname Hostname) error + PutNodeTimezone(ctx *echo.Context, hostname Hostname) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -121,17 +152,17 @@ type ServerInterfaceWrapper struct { } // GetNodeTimezone converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeTimezone(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeTimezone(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"timezone:read"}) + ctx.Set(string(BearerAuthScopes), []string{"timezone:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeTimezone(ctx, hostname) @@ -139,17 +170,17 @@ func (w *ServerInterfaceWrapper) GetNodeTimezone(ctx echo.Context) error { } // PutNodeTimezone converts echo context to params. -func (w *ServerInterfaceWrapper) PutNodeTimezone(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PutNodeTimezone(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"timezone:write"}) + ctx.Set(string(BearerAuthScopes), []string{"timezone:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PutNodeTimezone(ctx, hostname) @@ -160,37 +191,56 @@ func (w *ServerInterfaceWrapper) PutNodeTimezone(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/node/:hostname/timezone", wrapper.GetNodeTimezone) - router.PUT(baseURL+"/api/node/:hostname/timezone", wrapper.PutNodeTimezone) + router.GET(options.BaseURL+"/api/node/:hostname/timezone", wrapper.GetNodeTimezone, options.OperationMiddlewares["GetNodeTimezone"]...) + router.PUT(options.BaseURL+"/api/node/:hostname/timezone", wrapper.PutNodeTimezone, options.OperationMiddlewares["PutNodeTimezone"]...) } type GetNodeTimezoneRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeTimezoneResponseObject interface { @@ -200,50 +250,75 @@ type GetNodeTimezoneResponseObject interface { type GetNodeTimezone200JSONResponse TimezoneCollectionResponse func (response GetNodeTimezone200JSONResponse) VisitGetNodeTimezoneResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeTimezone400JSONResponse externalRef0.ErrorResponse func (response GetNodeTimezone400JSONResponse) VisitGetNodeTimezoneResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeTimezone401JSONResponse externalRef0.ErrorResponse func (response GetNodeTimezone401JSONResponse) VisitGetNodeTimezoneResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeTimezone403JSONResponse externalRef0.ErrorResponse func (response GetNodeTimezone403JSONResponse) VisitGetNodeTimezoneResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeTimezone500JSONResponse externalRef0.ErrorResponse func (response GetNodeTimezone500JSONResponse) VisitGetNodeTimezoneResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeTimezoneRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PutNodeTimezoneJSONRequestBody } @@ -254,46 +329,71 @@ type PutNodeTimezoneResponseObject interface { type PutNodeTimezone200JSONResponse TimezoneUpdateResponse func (response PutNodeTimezone200JSONResponse) VisitPutNodeTimezoneResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeTimezone400JSONResponse externalRef0.ErrorResponse func (response PutNodeTimezone400JSONResponse) VisitPutNodeTimezoneResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeTimezone401JSONResponse externalRef0.ErrorResponse func (response PutNodeTimezone401JSONResponse) VisitPutNodeTimezoneResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeTimezone403JSONResponse externalRef0.ErrorResponse func (response PutNodeTimezone403JSONResponse) VisitPutNodeTimezoneResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeTimezone500JSONResponse externalRef0.ErrorResponse func (response PutNodeTimezone500JSONResponse) VisitPutNodeTimezoneResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -306,8 +406,8 @@ type StrictServerInterface interface { PutNodeTimezone(ctx context.Context, request PutNodeTimezoneRequestObject) (PutNodeTimezoneResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -319,12 +419,12 @@ type strictHandler struct { } // GetNodeTimezone operation middleware -func (sh *strictHandler) GetNodeTimezone(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeTimezone(ctx *echo.Context, hostname Hostname) error { var request GetNodeTimezoneRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeTimezone(ctx.Request().Context(), request.(GetNodeTimezoneRequestObject)) } for _, middleware := range sh.middlewares { @@ -344,7 +444,7 @@ func (sh *strictHandler) GetNodeTimezone(ctx echo.Context, hostname Hostname) er } // PutNodeTimezone operation middleware -func (sh *strictHandler) PutNodeTimezone(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PutNodeTimezone(ctx *echo.Context, hostname Hostname) error { var request PutNodeTimezoneRequestObject request.Hostname = hostname @@ -355,7 +455,7 @@ func (sh *strictHandler) PutNodeTimezone(ctx echo.Context, hostname Hostname) er } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PutNodeTimezone(ctx.Request().Context(), request.(PutNodeTimezoneRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/timezone/handler.go b/internal/controller/api/node/timezone/handler.go index 2f99bca38..91248bafd 100644 --- a/internal/controller/api/node/timezone/handler.go +++ b/internal/controller/api/node/timezone/handler.go @@ -23,8 +23,7 @@ package timezone import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( timezoneHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/user/gen/cfg.yaml b/internal/controller/api/node/user/gen/cfg.yaml index 46a1f4063..2d77f7ffc 100644 --- a/internal/controller/api/node/user/gen/cfg.yaml +++ b/internal/controller/api/node/user/gen/cfg.yaml @@ -23,7 +23,7 @@ package: gen output: user.gen.go generate: models: true - echo-server: true + echo5-server: true strict-server: true import-mapping: ../../../common/gen/api.yaml: github.com/osapi-io/osapi/internal/controller/api/common/gen diff --git a/internal/controller/api/node/user/gen/user.gen.go b/internal/controller/api/node/user/gen/user.gen.go index 561bddd12..e11322b42 100644 --- a/internal/controller/api/node/user/gen/user.gen.go +++ b/internal/controller/api/node/user/gen/user.gen.go @@ -1,23 +1,23 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( + "bytes" "context" "encoding/json" "fmt" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" openapi_types "github.com/oapi-codegen/runtime/types" externalRef0 "github.com/osapi-io/osapi/internal/controller/api/common/gen" ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for GroupEntryStatus. @@ -27,6 +27,20 @@ const ( GroupEntryStatusSkipped GroupEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the GroupEntryStatus enum. +func (e GroupEntryStatus) Valid() bool { + switch e { + case GroupEntryStatusFailed: + return true + case GroupEntryStatusOk: + return true + case GroupEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for GroupMutationResultStatus. const ( GroupMutationResultStatusFailed GroupMutationResultStatus = "failed" @@ -34,6 +48,20 @@ const ( GroupMutationResultStatusSkipped GroupMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the GroupMutationResultStatus enum. +func (e GroupMutationResultStatus) Valid() bool { + switch e { + case GroupMutationResultStatusFailed: + return true + case GroupMutationResultStatusOk: + return true + case GroupMutationResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for SSHKeyEntryStatus. const ( SSHKeyEntryStatusFailed SSHKeyEntryStatus = "failed" @@ -41,6 +69,20 @@ const ( SSHKeyEntryStatusSkipped SSHKeyEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the SSHKeyEntryStatus enum. +func (e SSHKeyEntryStatus) Valid() bool { + switch e { + case SSHKeyEntryStatusFailed: + return true + case SSHKeyEntryStatusOk: + return true + case SSHKeyEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for SSHKeyMutationEntryStatus. const ( SSHKeyMutationEntryStatusFailed SSHKeyMutationEntryStatus = "failed" @@ -48,6 +90,20 @@ const ( SSHKeyMutationEntryStatusSkipped SSHKeyMutationEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the SSHKeyMutationEntryStatus enum. +func (e SSHKeyMutationEntryStatus) Valid() bool { + switch e { + case SSHKeyMutationEntryStatusFailed: + return true + case SSHKeyMutationEntryStatusOk: + return true + case SSHKeyMutationEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for UserEntryStatus. const ( UserEntryStatusFailed UserEntryStatus = "failed" @@ -55,6 +111,20 @@ const ( UserEntryStatusSkipped UserEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the UserEntryStatus enum. +func (e UserEntryStatus) Valid() bool { + switch e { + case UserEntryStatusFailed: + return true + case UserEntryStatusOk: + return true + case UserEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for UserMutationResultStatus. const ( UserMutationResultStatusFailed UserMutationResultStatus = "failed" @@ -62,6 +132,20 @@ const ( UserMutationResultStatusSkipped UserMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the UserMutationResultStatus enum. +func (e UserMutationResultStatus) Valid() bool { + switch e { + case UserMutationResultStatusFailed: + return true + case UserMutationResultStatusOk: + return true + case UserMutationResultStatusSkipped: + return true + default: + return false + } +} + // ErrorResponse defines model for ErrorResponse. type ErrorResponse = externalRef0.ErrorResponse @@ -353,6 +437,9 @@ type SSHKeyFingerprint = string // UserName defines model for UserName. type UserName = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // PostNodeGroupJSONRequestBody defines body for PostNodeGroup for application/json ContentType. type PostNodeGroupJSONRequestBody = GroupCreateRequest @@ -375,46 +462,46 @@ type PostNodeUserSSHKeyJSONRequestBody = SSHKeyAddRequest type ServerInterface interface { // List all groups // (GET /api/node/{hostname}/group) - GetNodeGroup(ctx echo.Context, hostname Hostname) error + GetNodeGroup(ctx *echo.Context, hostname Hostname) error // Create a group // (POST /api/node/{hostname}/group) - PostNodeGroup(ctx echo.Context, hostname Hostname) error + PostNodeGroup(ctx *echo.Context, hostname Hostname) error // Delete a group // (DELETE /api/node/{hostname}/group/{name}) - DeleteNodeGroup(ctx echo.Context, hostname Hostname, name GroupName) error + DeleteNodeGroup(ctx *echo.Context, hostname Hostname, name GroupName) error // Get a group // (GET /api/node/{hostname}/group/{name}) - GetNodeGroupByName(ctx echo.Context, hostname Hostname, name GroupName) error + GetNodeGroupByName(ctx *echo.Context, hostname Hostname, name GroupName) error // Update a group // (PUT /api/node/{hostname}/group/{name}) - PutNodeGroup(ctx echo.Context, hostname Hostname, name GroupName) error + PutNodeGroup(ctx *echo.Context, hostname Hostname, name GroupName) error // List all users // (GET /api/node/{hostname}/user) - GetNodeUser(ctx echo.Context, hostname Hostname) error + GetNodeUser(ctx *echo.Context, hostname Hostname) error // Create a user // (POST /api/node/{hostname}/user) - PostNodeUser(ctx echo.Context, hostname Hostname) error + PostNodeUser(ctx *echo.Context, hostname Hostname) error // Delete a user // (DELETE /api/node/{hostname}/user/{name}) - DeleteNodeUser(ctx echo.Context, hostname Hostname, name UserName) error + DeleteNodeUser(ctx *echo.Context, hostname Hostname, name UserName) error // Get a user // (GET /api/node/{hostname}/user/{name}) - GetNodeUserByName(ctx echo.Context, hostname Hostname, name UserName) error + GetNodeUserByName(ctx *echo.Context, hostname Hostname, name UserName) error // Update a user // (PUT /api/node/{hostname}/user/{name}) - PutNodeUser(ctx echo.Context, hostname Hostname, name UserName) error + PutNodeUser(ctx *echo.Context, hostname Hostname, name UserName) error // Change user password // (POST /api/node/{hostname}/user/{name}/password) - PostNodeUserPassword(ctx echo.Context, hostname Hostname, name UserName) error + PostNodeUserPassword(ctx *echo.Context, hostname Hostname, name UserName) error // List SSH authorized keys // (GET /api/node/{hostname}/user/{name}/ssh-key) - GetNodeUserSSHKey(ctx echo.Context, hostname Hostname, name UserName) error + GetNodeUserSSHKey(ctx *echo.Context, hostname Hostname, name UserName) error // Add SSH authorized key // (POST /api/node/{hostname}/user/{name}/ssh-key) - PostNodeUserSSHKey(ctx echo.Context, hostname Hostname, name UserName) error + PostNodeUserSSHKey(ctx *echo.Context, hostname Hostname, name UserName) error // Remove SSH authorized key // (DELETE /api/node/{hostname}/user/{name}/ssh-key/{fingerprint}) - DeleteNodeUserSSHKey(ctx echo.Context, hostname Hostname, name UserName, fingerprint SSHKeyFingerprint) error + DeleteNodeUserSSHKey(ctx *echo.Context, hostname Hostname, name UserName, fingerprint SSHKeyFingerprint) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -423,17 +510,17 @@ type ServerInterfaceWrapper struct { } // GetNodeGroup converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeGroup(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeGroup(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:read"}) + ctx.Set(string(BearerAuthScopes), []string{"user:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeGroup(ctx, hostname) @@ -441,17 +528,17 @@ func (w *ServerInterfaceWrapper) GetNodeGroup(ctx echo.Context) error { } // PostNodeGroup converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeGroup(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeGroup(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:write"}) + ctx.Set(string(BearerAuthScopes), []string{"user:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeGroup(ctx, hostname) @@ -459,12 +546,12 @@ func (w *ServerInterfaceWrapper) PostNodeGroup(ctx echo.Context) error { } // DeleteNodeGroup converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodeGroup(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodeGroup(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -472,12 +559,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeGroup(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name GroupName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:write"}) + ctx.Set(string(BearerAuthScopes), []string{"user:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteNodeGroup(ctx, hostname, name) @@ -485,12 +572,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeGroup(ctx echo.Context) error { } // GetNodeGroupByName converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeGroupByName(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeGroupByName(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -498,12 +585,12 @@ func (w *ServerInterfaceWrapper) GetNodeGroupByName(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name GroupName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:read"}) + ctx.Set(string(BearerAuthScopes), []string{"user:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeGroupByName(ctx, hostname, name) @@ -511,12 +598,12 @@ func (w *ServerInterfaceWrapper) GetNodeGroupByName(ctx echo.Context) error { } // PutNodeGroup converts echo context to params. -func (w *ServerInterfaceWrapper) PutNodeGroup(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PutNodeGroup(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -524,12 +611,12 @@ func (w *ServerInterfaceWrapper) PutNodeGroup(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name GroupName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:write"}) + ctx.Set(string(BearerAuthScopes), []string{"user:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PutNodeGroup(ctx, hostname, name) @@ -537,17 +624,17 @@ func (w *ServerInterfaceWrapper) PutNodeGroup(ctx echo.Context) error { } // GetNodeUser converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeUser(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeUser(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:read"}) + ctx.Set(string(BearerAuthScopes), []string{"user:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeUser(ctx, hostname) @@ -555,17 +642,17 @@ func (w *ServerInterfaceWrapper) GetNodeUser(ctx echo.Context) error { } // PostNodeUser converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeUser(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeUser(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:write"}) + ctx.Set(string(BearerAuthScopes), []string{"user:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeUser(ctx, hostname) @@ -573,12 +660,12 @@ func (w *ServerInterfaceWrapper) PostNodeUser(ctx echo.Context) error { } // DeleteNodeUser converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodeUser(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodeUser(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -586,12 +673,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeUser(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name UserName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:write"}) + ctx.Set(string(BearerAuthScopes), []string{"user:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteNodeUser(ctx, hostname, name) @@ -599,12 +686,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeUser(ctx echo.Context) error { } // GetNodeUserByName converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeUserByName(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeUserByName(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -612,12 +699,12 @@ func (w *ServerInterfaceWrapper) GetNodeUserByName(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name UserName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:read"}) + ctx.Set(string(BearerAuthScopes), []string{"user:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeUserByName(ctx, hostname, name) @@ -625,12 +712,12 @@ func (w *ServerInterfaceWrapper) GetNodeUserByName(ctx echo.Context) error { } // PutNodeUser converts echo context to params. -func (w *ServerInterfaceWrapper) PutNodeUser(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PutNodeUser(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -638,12 +725,12 @@ func (w *ServerInterfaceWrapper) PutNodeUser(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name UserName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:write"}) + ctx.Set(string(BearerAuthScopes), []string{"user:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PutNodeUser(ctx, hostname, name) @@ -651,12 +738,12 @@ func (w *ServerInterfaceWrapper) PutNodeUser(ctx echo.Context) error { } // PostNodeUserPassword converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeUserPassword(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeUserPassword(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -664,12 +751,12 @@ func (w *ServerInterfaceWrapper) PostNodeUserPassword(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name UserName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:write"}) + ctx.Set(string(BearerAuthScopes), []string{"user:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeUserPassword(ctx, hostname, name) @@ -677,12 +764,12 @@ func (w *ServerInterfaceWrapper) PostNodeUserPassword(ctx echo.Context) error { } // GetNodeUserSSHKey converts echo context to params. -func (w *ServerInterfaceWrapper) GetNodeUserSSHKey(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) GetNodeUserSSHKey(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -690,12 +777,12 @@ func (w *ServerInterfaceWrapper) GetNodeUserSSHKey(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name UserName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:read"}) + ctx.Set(string(BearerAuthScopes), []string{"user:read"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetNodeUserSSHKey(ctx, hostname, name) @@ -703,12 +790,12 @@ func (w *ServerInterfaceWrapper) GetNodeUserSSHKey(ctx echo.Context) error { } // PostNodeUserSSHKey converts echo context to params. -func (w *ServerInterfaceWrapper) PostNodeUserSSHKey(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) PostNodeUserSSHKey(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -716,12 +803,12 @@ func (w *ServerInterfaceWrapper) PostNodeUserSSHKey(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name UserName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:write"}) + ctx.Set(string(BearerAuthScopes), []string{"user:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.PostNodeUserSSHKey(ctx, hostname, name) @@ -729,12 +816,12 @@ func (w *ServerInterfaceWrapper) PostNodeUserSSHKey(ctx echo.Context) error { } // DeleteNodeUserSSHKey converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteNodeUserSSHKey(ctx echo.Context) error { +func (w *ServerInterfaceWrapper) DeleteNodeUserSSHKey(ctx *echo.Context) error { var err error // ------------- Path parameter "hostname" ------------- var hostname Hostname - err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "hostname", ctx.Param("hostname"), &hostname, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hostname: %s", err)) } @@ -742,7 +829,7 @@ func (w *ServerInterfaceWrapper) DeleteNodeUserSSHKey(ctx echo.Context) error { // ------------- Path parameter "name" ------------- var name UserName - err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", ctx.Param("name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } @@ -750,12 +837,12 @@ func (w *ServerInterfaceWrapper) DeleteNodeUserSSHKey(ctx echo.Context) error { // ------------- Path parameter "fingerprint" ------------- var fingerprint SSHKeyFingerprint - err = runtime.BindStyledParameterWithOptions("simple", "fingerprint", ctx.Param("fingerprint"), &fingerprint, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "fingerprint", ctx.Param("fingerprint"), &fingerprint, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter fingerprint: %s", err)) } - ctx.Set(BearerAuthScopes, []string{"user:write"}) + ctx.Set(string(BearerAuthScopes), []string{"user:write"}) // Invoke the callback with all the unmarshaled arguments err = w.Handler.DeleteNodeUserSSHKey(ctx, hostname, name, fingerprint) @@ -766,49 +853,68 @@ func (w *ServerInterfaceWrapper) DeleteNodeUserSSHKey(ctx echo.Context) error { // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) echo.RouteInfo +} + +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc } // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/api/node/:hostname/group", wrapper.GetNodeGroup) - router.POST(baseURL+"/api/node/:hostname/group", wrapper.PostNodeGroup) - router.DELETE(baseURL+"/api/node/:hostname/group/:name", wrapper.DeleteNodeGroup) - router.GET(baseURL+"/api/node/:hostname/group/:name", wrapper.GetNodeGroupByName) - router.PUT(baseURL+"/api/node/:hostname/group/:name", wrapper.PutNodeGroup) - router.GET(baseURL+"/api/node/:hostname/user", wrapper.GetNodeUser) - router.POST(baseURL+"/api/node/:hostname/user", wrapper.PostNodeUser) - router.DELETE(baseURL+"/api/node/:hostname/user/:name", wrapper.DeleteNodeUser) - router.GET(baseURL+"/api/node/:hostname/user/:name", wrapper.GetNodeUserByName) - router.PUT(baseURL+"/api/node/:hostname/user/:name", wrapper.PutNodeUser) - router.POST(baseURL+"/api/node/:hostname/user/:name/password", wrapper.PostNodeUserPassword) - router.GET(baseURL+"/api/node/:hostname/user/:name/ssh-key", wrapper.GetNodeUserSSHKey) - router.POST(baseURL+"/api/node/:hostname/user/:name/ssh-key", wrapper.PostNodeUserSSHKey) - router.DELETE(baseURL+"/api/node/:hostname/user/:name/ssh-key/:fingerprint", wrapper.DeleteNodeUserSSHKey) + router.GET(options.BaseURL+"/api/node/:hostname/group", wrapper.GetNodeGroup, options.OperationMiddlewares["GetNodeGroup"]...) + router.POST(options.BaseURL+"/api/node/:hostname/group", wrapper.PostNodeGroup, options.OperationMiddlewares["PostNodeGroup"]...) + router.DELETE(options.BaseURL+"/api/node/:hostname/group/:name", wrapper.DeleteNodeGroup, options.OperationMiddlewares["DeleteNodeGroup"]...) + router.GET(options.BaseURL+"/api/node/:hostname/group/:name", wrapper.GetNodeGroupByName, options.OperationMiddlewares["GetNodeGroupByName"]...) + router.PUT(options.BaseURL+"/api/node/:hostname/group/:name", wrapper.PutNodeGroup, options.OperationMiddlewares["PutNodeGroup"]...) + router.GET(options.BaseURL+"/api/node/:hostname/user", wrapper.GetNodeUser, options.OperationMiddlewares["GetNodeUser"]...) + router.POST(options.BaseURL+"/api/node/:hostname/user", wrapper.PostNodeUser, options.OperationMiddlewares["PostNodeUser"]...) + router.DELETE(options.BaseURL+"/api/node/:hostname/user/:name", wrapper.DeleteNodeUser, options.OperationMiddlewares["DeleteNodeUser"]...) + router.GET(options.BaseURL+"/api/node/:hostname/user/:name", wrapper.GetNodeUserByName, options.OperationMiddlewares["GetNodeUserByName"]...) + router.PUT(options.BaseURL+"/api/node/:hostname/user/:name", wrapper.PutNodeUser, options.OperationMiddlewares["PutNodeUser"]...) + router.POST(options.BaseURL+"/api/node/:hostname/user/:name/password", wrapper.PostNodeUserPassword, options.OperationMiddlewares["PostNodeUserPassword"]...) + router.GET(options.BaseURL+"/api/node/:hostname/user/:name/ssh-key", wrapper.GetNodeUserSSHKey, options.OperationMiddlewares["GetNodeUserSSHKey"]...) + router.POST(options.BaseURL+"/api/node/:hostname/user/:name/ssh-key", wrapper.PostNodeUserSSHKey, options.OperationMiddlewares["PostNodeUserSSHKey"]...) + router.DELETE(options.BaseURL+"/api/node/:hostname/user/:name/ssh-key/:fingerprint", wrapper.DeleteNodeUserSSHKey, options.OperationMiddlewares["DeleteNodeUserSSHKey"]...) } type GetNodeGroupRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeGroupResponseObject interface { @@ -818,50 +924,75 @@ type GetNodeGroupResponseObject interface { type GetNodeGroup200JSONResponse GroupCollectionResponse func (response GetNodeGroup200JSONResponse) VisitGetNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeGroup400JSONResponse externalRef0.ErrorResponse func (response GetNodeGroup400JSONResponse) VisitGetNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeGroup401JSONResponse externalRef0.ErrorResponse func (response GetNodeGroup401JSONResponse) VisitGetNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeGroup403JSONResponse externalRef0.ErrorResponse func (response GetNodeGroup403JSONResponse) VisitGetNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeGroup500JSONResponse externalRef0.ErrorResponse func (response GetNodeGroup500JSONResponse) VisitGetNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeGroupRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeGroupJSONRequestBody } @@ -872,51 +1003,76 @@ type PostNodeGroupResponseObject interface { type PostNodeGroup200JSONResponse GroupMutationResponse func (response PostNodeGroup200JSONResponse) VisitPostNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeGroup400JSONResponse externalRef0.ErrorResponse func (response PostNodeGroup400JSONResponse) VisitPostNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeGroup401JSONResponse externalRef0.ErrorResponse func (response PostNodeGroup401JSONResponse) VisitPostNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeGroup403JSONResponse externalRef0.ErrorResponse func (response PostNodeGroup403JSONResponse) VisitPostNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeGroup500JSONResponse externalRef0.ErrorResponse func (response PostNodeGroup500JSONResponse) VisitPostNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeGroupRequestObject struct { - Hostname Hostname `json:"hostname"` - Name GroupName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name GroupName `json:"name" validate:"required,min=1"` } type DeleteNodeGroupResponseObject interface { @@ -926,60 +1082,90 @@ type DeleteNodeGroupResponseObject interface { type DeleteNodeGroup200JSONResponse GroupMutationResponse func (response DeleteNodeGroup200JSONResponse) VisitDeleteNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeGroup400JSONResponse externalRef0.ErrorResponse func (response DeleteNodeGroup400JSONResponse) VisitDeleteNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeGroup401JSONResponse externalRef0.ErrorResponse func (response DeleteNodeGroup401JSONResponse) VisitDeleteNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeGroup403JSONResponse externalRef0.ErrorResponse func (response DeleteNodeGroup403JSONResponse) VisitDeleteNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeGroup404JSONResponse externalRef0.ErrorResponse func (response DeleteNodeGroup404JSONResponse) VisitDeleteNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeGroup500JSONResponse externalRef0.ErrorResponse func (response DeleteNodeGroup500JSONResponse) VisitDeleteNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeGroupByNameRequestObject struct { - Hostname Hostname `json:"hostname"` - Name GroupName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name GroupName `json:"name" validate:"required,min=1"` } type GetNodeGroupByNameResponseObject interface { @@ -989,60 +1175,90 @@ type GetNodeGroupByNameResponseObject interface { type GetNodeGroupByName200JSONResponse GroupCollectionResponse func (response GetNodeGroupByName200JSONResponse) VisitGetNodeGroupByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeGroupByName400JSONResponse externalRef0.ErrorResponse func (response GetNodeGroupByName400JSONResponse) VisitGetNodeGroupByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeGroupByName401JSONResponse externalRef0.ErrorResponse func (response GetNodeGroupByName401JSONResponse) VisitGetNodeGroupByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeGroupByName403JSONResponse externalRef0.ErrorResponse func (response GetNodeGroupByName403JSONResponse) VisitGetNodeGroupByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeGroupByName404JSONResponse externalRef0.ErrorResponse func (response GetNodeGroupByName404JSONResponse) VisitGetNodeGroupByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeGroupByName500JSONResponse externalRef0.ErrorResponse func (response GetNodeGroupByName500JSONResponse) VisitGetNodeGroupByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeGroupRequestObject struct { - Hostname Hostname `json:"hostname"` - Name GroupName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name GroupName `json:"name" validate:"required,min=1"` Body *PutNodeGroupJSONRequestBody } @@ -1053,59 +1269,89 @@ type PutNodeGroupResponseObject interface { type PutNodeGroup200JSONResponse GroupMutationResponse func (response PutNodeGroup200JSONResponse) VisitPutNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeGroup400JSONResponse externalRef0.ErrorResponse func (response PutNodeGroup400JSONResponse) VisitPutNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeGroup401JSONResponse externalRef0.ErrorResponse func (response PutNodeGroup401JSONResponse) VisitPutNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeGroup403JSONResponse externalRef0.ErrorResponse func (response PutNodeGroup403JSONResponse) VisitPutNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeGroup404JSONResponse externalRef0.ErrorResponse func (response PutNodeGroup404JSONResponse) VisitPutNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeGroup500JSONResponse externalRef0.ErrorResponse func (response PutNodeGroup500JSONResponse) VisitPutNodeGroupResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUserRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` } type GetNodeUserResponseObject interface { @@ -1115,50 +1361,75 @@ type GetNodeUserResponseObject interface { type GetNodeUser200JSONResponse UserCollectionResponse func (response GetNodeUser200JSONResponse) VisitGetNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUser400JSONResponse externalRef0.ErrorResponse func (response GetNodeUser400JSONResponse) VisitGetNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUser401JSONResponse externalRef0.ErrorResponse func (response GetNodeUser401JSONResponse) VisitGetNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUser403JSONResponse externalRef0.ErrorResponse func (response GetNodeUser403JSONResponse) VisitGetNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUser500JSONResponse externalRef0.ErrorResponse func (response GetNodeUser500JSONResponse) VisitGetNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUserRequestObject struct { - Hostname Hostname `json:"hostname"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` Body *PostNodeUserJSONRequestBody } @@ -1169,51 +1440,76 @@ type PostNodeUserResponseObject interface { type PostNodeUser200JSONResponse UserMutationResponse func (response PostNodeUser200JSONResponse) VisitPostNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUser400JSONResponse externalRef0.ErrorResponse func (response PostNodeUser400JSONResponse) VisitPostNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUser401JSONResponse externalRef0.ErrorResponse func (response PostNodeUser401JSONResponse) VisitPostNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUser403JSONResponse externalRef0.ErrorResponse func (response PostNodeUser403JSONResponse) VisitPostNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUser500JSONResponse externalRef0.ErrorResponse func (response PostNodeUser500JSONResponse) VisitPostNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeUserRequestObject struct { - Hostname Hostname `json:"hostname"` - Name UserName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name UserName `json:"name" validate:"required,min=1"` } type DeleteNodeUserResponseObject interface { @@ -1223,60 +1519,90 @@ type DeleteNodeUserResponseObject interface { type DeleteNodeUser200JSONResponse UserMutationResponse func (response DeleteNodeUser200JSONResponse) VisitDeleteNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeUser400JSONResponse externalRef0.ErrorResponse func (response DeleteNodeUser400JSONResponse) VisitDeleteNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeUser401JSONResponse externalRef0.ErrorResponse func (response DeleteNodeUser401JSONResponse) VisitDeleteNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeUser403JSONResponse externalRef0.ErrorResponse func (response DeleteNodeUser403JSONResponse) VisitDeleteNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeUser404JSONResponse externalRef0.ErrorResponse func (response DeleteNodeUser404JSONResponse) VisitDeleteNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeUser500JSONResponse externalRef0.ErrorResponse func (response DeleteNodeUser500JSONResponse) VisitDeleteNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUserByNameRequestObject struct { - Hostname Hostname `json:"hostname"` - Name UserName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name UserName `json:"name" validate:"required,min=1"` } type GetNodeUserByNameResponseObject interface { @@ -1286,60 +1612,90 @@ type GetNodeUserByNameResponseObject interface { type GetNodeUserByName200JSONResponse UserCollectionResponse func (response GetNodeUserByName200JSONResponse) VisitGetNodeUserByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUserByName400JSONResponse externalRef0.ErrorResponse func (response GetNodeUserByName400JSONResponse) VisitGetNodeUserByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUserByName401JSONResponse externalRef0.ErrorResponse func (response GetNodeUserByName401JSONResponse) VisitGetNodeUserByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUserByName403JSONResponse externalRef0.ErrorResponse func (response GetNodeUserByName403JSONResponse) VisitGetNodeUserByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUserByName404JSONResponse externalRef0.ErrorResponse func (response GetNodeUserByName404JSONResponse) VisitGetNodeUserByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUserByName500JSONResponse externalRef0.ErrorResponse func (response GetNodeUserByName500JSONResponse) VisitGetNodeUserByNameResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeUserRequestObject struct { - Hostname Hostname `json:"hostname"` - Name UserName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name UserName `json:"name" validate:"required,min=1"` Body *PutNodeUserJSONRequestBody } @@ -1350,60 +1706,90 @@ type PutNodeUserResponseObject interface { type PutNodeUser200JSONResponse UserMutationResponse func (response PutNodeUser200JSONResponse) VisitPutNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeUser400JSONResponse externalRef0.ErrorResponse func (response PutNodeUser400JSONResponse) VisitPutNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeUser401JSONResponse externalRef0.ErrorResponse func (response PutNodeUser401JSONResponse) VisitPutNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeUser403JSONResponse externalRef0.ErrorResponse func (response PutNodeUser403JSONResponse) VisitPutNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeUser404JSONResponse externalRef0.ErrorResponse func (response PutNodeUser404JSONResponse) VisitPutNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PutNodeUser500JSONResponse externalRef0.ErrorResponse func (response PutNodeUser500JSONResponse) VisitPutNodeUserResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUserPasswordRequestObject struct { - Hostname Hostname `json:"hostname"` - Name UserName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name UserName `json:"name" validate:"required,min=1"` Body *PostNodeUserPasswordJSONRequestBody } @@ -1414,60 +1800,90 @@ type PostNodeUserPasswordResponseObject interface { type PostNodeUserPassword200JSONResponse UserMutationResponse func (response PostNodeUserPassword200JSONResponse) VisitPostNodeUserPasswordResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUserPassword400JSONResponse externalRef0.ErrorResponse func (response PostNodeUserPassword400JSONResponse) VisitPostNodeUserPasswordResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUserPassword401JSONResponse externalRef0.ErrorResponse func (response PostNodeUserPassword401JSONResponse) VisitPostNodeUserPasswordResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUserPassword403JSONResponse externalRef0.ErrorResponse func (response PostNodeUserPassword403JSONResponse) VisitPostNodeUserPasswordResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUserPassword404JSONResponse externalRef0.ErrorResponse func (response PostNodeUserPassword404JSONResponse) VisitPostNodeUserPasswordResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUserPassword500JSONResponse externalRef0.ErrorResponse func (response PostNodeUserPassword500JSONResponse) VisitPostNodeUserPasswordResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUserSSHKeyRequestObject struct { - Hostname Hostname `json:"hostname"` - Name UserName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name UserName `json:"name" validate:"required,min=1"` } type GetNodeUserSSHKeyResponseObject interface { @@ -1477,51 +1893,76 @@ type GetNodeUserSSHKeyResponseObject interface { type GetNodeUserSSHKey200JSONResponse SSHKeyCollectionResponse func (response GetNodeUserSSHKey200JSONResponse) VisitGetNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUserSSHKey400JSONResponse externalRef0.ErrorResponse func (response GetNodeUserSSHKey400JSONResponse) VisitGetNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUserSSHKey401JSONResponse externalRef0.ErrorResponse func (response GetNodeUserSSHKey401JSONResponse) VisitGetNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUserSSHKey403JSONResponse externalRef0.ErrorResponse func (response GetNodeUserSSHKey403JSONResponse) VisitGetNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetNodeUserSSHKey500JSONResponse externalRef0.ErrorResponse func (response GetNodeUserSSHKey500JSONResponse) VisitGetNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUserSSHKeyRequestObject struct { - Hostname Hostname `json:"hostname"` - Name UserName `json:"name"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name UserName `json:"name" validate:"required,min=1"` Body *PostNodeUserSSHKeyJSONRequestBody } @@ -1532,52 +1973,77 @@ type PostNodeUserSSHKeyResponseObject interface { type PostNodeUserSSHKey200JSONResponse SSHKeyMutationResponse func (response PostNodeUserSSHKey200JSONResponse) VisitPostNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUserSSHKey400JSONResponse externalRef0.ErrorResponse func (response PostNodeUserSSHKey400JSONResponse) VisitPostNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUserSSHKey401JSONResponse externalRef0.ErrorResponse func (response PostNodeUserSSHKey401JSONResponse) VisitPostNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUserSSHKey403JSONResponse externalRef0.ErrorResponse func (response PostNodeUserSSHKey403JSONResponse) VisitPostNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostNodeUserSSHKey500JSONResponse externalRef0.ErrorResponse func (response PostNodeUserSSHKey500JSONResponse) VisitPostNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeUserSSHKeyRequestObject struct { - Hostname Hostname `json:"hostname"` - Name UserName `json:"name"` - Fingerprint SSHKeyFingerprint `json:"fingerprint"` + Hostname Hostname `json:"hostname" validate:"required,min=1,valid_target"` + Name UserName `json:"name" validate:"required,min=1"` + Fingerprint SSHKeyFingerprint `json:"fingerprint" validate:"required,min=1"` } type DeleteNodeUserSSHKeyResponseObject interface { @@ -1587,46 +2053,71 @@ type DeleteNodeUserSSHKeyResponseObject interface { type DeleteNodeUserSSHKey200JSONResponse SSHKeyMutationResponse func (response DeleteNodeUserSSHKey200JSONResponse) VisitDeleteNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeUserSSHKey400JSONResponse externalRef0.ErrorResponse func (response DeleteNodeUserSSHKey400JSONResponse) VisitDeleteNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeUserSSHKey401JSONResponse externalRef0.ErrorResponse func (response DeleteNodeUserSSHKey401JSONResponse) VisitDeleteNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(401) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeUserSSHKey403JSONResponse externalRef0.ErrorResponse func (response DeleteNodeUserSSHKey403JSONResponse) VisitDeleteNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(403) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type DeleteNodeUserSSHKey500JSONResponse externalRef0.ErrorResponse func (response DeleteNodeUserSSHKey500JSONResponse) VisitDeleteNodeUserSSHKeyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/json") w.WriteHeader(500) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } // StrictServerInterface represents all server handlers. @@ -1675,8 +2166,8 @@ type StrictServerInterface interface { DeleteNodeUserSSHKey(ctx context.Context, request DeleteNodeUserSSHKeyRequestObject) (DeleteNodeUserSSHKeyResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -1688,12 +2179,12 @@ type strictHandler struct { } // GetNodeGroup operation middleware -func (sh *strictHandler) GetNodeGroup(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeGroup(ctx *echo.Context, hostname Hostname) error { var request GetNodeGroupRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeGroup(ctx.Request().Context(), request.(GetNodeGroupRequestObject)) } for _, middleware := range sh.middlewares { @@ -1713,7 +2204,7 @@ func (sh *strictHandler) GetNodeGroup(ctx echo.Context, hostname Hostname) error } // PostNodeGroup operation middleware -func (sh *strictHandler) PostNodeGroup(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeGroup(ctx *echo.Context, hostname Hostname) error { var request PostNodeGroupRequestObject request.Hostname = hostname @@ -1724,7 +2215,7 @@ func (sh *strictHandler) PostNodeGroup(ctx echo.Context, hostname Hostname) erro } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeGroup(ctx.Request().Context(), request.(PostNodeGroupRequestObject)) } for _, middleware := range sh.middlewares { @@ -1744,13 +2235,13 @@ func (sh *strictHandler) PostNodeGroup(ctx echo.Context, hostname Hostname) erro } // DeleteNodeGroup operation middleware -func (sh *strictHandler) DeleteNodeGroup(ctx echo.Context, hostname Hostname, name GroupName) error { +func (sh *strictHandler) DeleteNodeGroup(ctx *echo.Context, hostname Hostname, name GroupName) error { var request DeleteNodeGroupRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodeGroup(ctx.Request().Context(), request.(DeleteNodeGroupRequestObject)) } for _, middleware := range sh.middlewares { @@ -1770,13 +2261,13 @@ func (sh *strictHandler) DeleteNodeGroup(ctx echo.Context, hostname Hostname, na } // GetNodeGroupByName operation middleware -func (sh *strictHandler) GetNodeGroupByName(ctx echo.Context, hostname Hostname, name GroupName) error { +func (sh *strictHandler) GetNodeGroupByName(ctx *echo.Context, hostname Hostname, name GroupName) error { var request GetNodeGroupByNameRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeGroupByName(ctx.Request().Context(), request.(GetNodeGroupByNameRequestObject)) } for _, middleware := range sh.middlewares { @@ -1796,7 +2287,7 @@ func (sh *strictHandler) GetNodeGroupByName(ctx echo.Context, hostname Hostname, } // PutNodeGroup operation middleware -func (sh *strictHandler) PutNodeGroup(ctx echo.Context, hostname Hostname, name GroupName) error { +func (sh *strictHandler) PutNodeGroup(ctx *echo.Context, hostname Hostname, name GroupName) error { var request PutNodeGroupRequestObject request.Hostname = hostname @@ -1808,7 +2299,7 @@ func (sh *strictHandler) PutNodeGroup(ctx echo.Context, hostname Hostname, name } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PutNodeGroup(ctx.Request().Context(), request.(PutNodeGroupRequestObject)) } for _, middleware := range sh.middlewares { @@ -1828,12 +2319,12 @@ func (sh *strictHandler) PutNodeGroup(ctx echo.Context, hostname Hostname, name } // GetNodeUser operation middleware -func (sh *strictHandler) GetNodeUser(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) GetNodeUser(ctx *echo.Context, hostname Hostname) error { var request GetNodeUserRequestObject request.Hostname = hostname - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeUser(ctx.Request().Context(), request.(GetNodeUserRequestObject)) } for _, middleware := range sh.middlewares { @@ -1853,7 +2344,7 @@ func (sh *strictHandler) GetNodeUser(ctx echo.Context, hostname Hostname) error } // PostNodeUser operation middleware -func (sh *strictHandler) PostNodeUser(ctx echo.Context, hostname Hostname) error { +func (sh *strictHandler) PostNodeUser(ctx *echo.Context, hostname Hostname) error { var request PostNodeUserRequestObject request.Hostname = hostname @@ -1864,7 +2355,7 @@ func (sh *strictHandler) PostNodeUser(ctx echo.Context, hostname Hostname) error } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeUser(ctx.Request().Context(), request.(PostNodeUserRequestObject)) } for _, middleware := range sh.middlewares { @@ -1884,13 +2375,13 @@ func (sh *strictHandler) PostNodeUser(ctx echo.Context, hostname Hostname) error } // DeleteNodeUser operation middleware -func (sh *strictHandler) DeleteNodeUser(ctx echo.Context, hostname Hostname, name UserName) error { +func (sh *strictHandler) DeleteNodeUser(ctx *echo.Context, hostname Hostname, name UserName) error { var request DeleteNodeUserRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodeUser(ctx.Request().Context(), request.(DeleteNodeUserRequestObject)) } for _, middleware := range sh.middlewares { @@ -1910,13 +2401,13 @@ func (sh *strictHandler) DeleteNodeUser(ctx echo.Context, hostname Hostname, nam } // GetNodeUserByName operation middleware -func (sh *strictHandler) GetNodeUserByName(ctx echo.Context, hostname Hostname, name UserName) error { +func (sh *strictHandler) GetNodeUserByName(ctx *echo.Context, hostname Hostname, name UserName) error { var request GetNodeUserByNameRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeUserByName(ctx.Request().Context(), request.(GetNodeUserByNameRequestObject)) } for _, middleware := range sh.middlewares { @@ -1936,7 +2427,7 @@ func (sh *strictHandler) GetNodeUserByName(ctx echo.Context, hostname Hostname, } // PutNodeUser operation middleware -func (sh *strictHandler) PutNodeUser(ctx echo.Context, hostname Hostname, name UserName) error { +func (sh *strictHandler) PutNodeUser(ctx *echo.Context, hostname Hostname, name UserName) error { var request PutNodeUserRequestObject request.Hostname = hostname @@ -1948,7 +2439,7 @@ func (sh *strictHandler) PutNodeUser(ctx echo.Context, hostname Hostname, name U } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PutNodeUser(ctx.Request().Context(), request.(PutNodeUserRequestObject)) } for _, middleware := range sh.middlewares { @@ -1968,7 +2459,7 @@ func (sh *strictHandler) PutNodeUser(ctx echo.Context, hostname Hostname, name U } // PostNodeUserPassword operation middleware -func (sh *strictHandler) PostNodeUserPassword(ctx echo.Context, hostname Hostname, name UserName) error { +func (sh *strictHandler) PostNodeUserPassword(ctx *echo.Context, hostname Hostname, name UserName) error { var request PostNodeUserPasswordRequestObject request.Hostname = hostname @@ -1980,7 +2471,7 @@ func (sh *strictHandler) PostNodeUserPassword(ctx echo.Context, hostname Hostnam } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeUserPassword(ctx.Request().Context(), request.(PostNodeUserPasswordRequestObject)) } for _, middleware := range sh.middlewares { @@ -2000,13 +2491,13 @@ func (sh *strictHandler) PostNodeUserPassword(ctx echo.Context, hostname Hostnam } // GetNodeUserSSHKey operation middleware -func (sh *strictHandler) GetNodeUserSSHKey(ctx echo.Context, hostname Hostname, name UserName) error { +func (sh *strictHandler) GetNodeUserSSHKey(ctx *echo.Context, hostname Hostname, name UserName) error { var request GetNodeUserSSHKeyRequestObject request.Hostname = hostname request.Name = name - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.GetNodeUserSSHKey(ctx.Request().Context(), request.(GetNodeUserSSHKeyRequestObject)) } for _, middleware := range sh.middlewares { @@ -2026,7 +2517,7 @@ func (sh *strictHandler) GetNodeUserSSHKey(ctx echo.Context, hostname Hostname, } // PostNodeUserSSHKey operation middleware -func (sh *strictHandler) PostNodeUserSSHKey(ctx echo.Context, hostname Hostname, name UserName) error { +func (sh *strictHandler) PostNodeUserSSHKey(ctx *echo.Context, hostname Hostname, name UserName) error { var request PostNodeUserSSHKeyRequestObject request.Hostname = hostname @@ -2038,7 +2529,7 @@ func (sh *strictHandler) PostNodeUserSSHKey(ctx echo.Context, hostname Hostname, } request.Body = &body - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostNodeUserSSHKey(ctx.Request().Context(), request.(PostNodeUserSSHKeyRequestObject)) } for _, middleware := range sh.middlewares { @@ -2058,14 +2549,14 @@ func (sh *strictHandler) PostNodeUserSSHKey(ctx echo.Context, hostname Hostname, } // DeleteNodeUserSSHKey operation middleware -func (sh *strictHandler) DeleteNodeUserSSHKey(ctx echo.Context, hostname Hostname, name UserName, fingerprint SSHKeyFingerprint) error { +func (sh *strictHandler) DeleteNodeUserSSHKey(ctx *echo.Context, hostname Hostname, name UserName, fingerprint SSHKeyFingerprint) error { var request DeleteNodeUserSSHKeyRequestObject request.Hostname = hostname request.Name = name request.Fingerprint = fingerprint - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + handler := func(ctx *echo.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteNodeUserSSHKey(ctx.Request().Context(), request.(DeleteNodeUserSSHKeyRequestObject)) } for _, middleware := range sh.middlewares { diff --git a/internal/controller/api/node/user/handler.go b/internal/controller/api/node/user/handler.go index 43ed620ec..462396bd8 100644 --- a/internal/controller/api/node/user/handler.go +++ b/internal/controller/api/node/user/handler.go @@ -23,8 +23,7 @@ package user import ( "log/slog" - "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" + "github.com/labstack/echo/v5" "github.com/osapi-io/osapi/internal/authtoken" "github.com/osapi-io/osapi/internal/controller/api" @@ -46,14 +45,14 @@ func Handler( strictHandler := gen.NewStrictHandler( userHandler, []gen.StrictMiddlewareFunc{ - func(handler strictecho.StrictEchoHandlerFunc, _ string) strictecho.StrictEchoHandlerFunc { - return api.ScopeMiddleware( - handler, + func(handler gen.StrictHandlerFunc, _ string) gen.StrictHandlerFunc { + return gen.StrictHandlerFunc(api.ScopeMiddleware( + api.StrictHandlerFunc(handler), tokenManager, signingKey, - gen.BearerAuthScopes, + string(gen.BearerAuthScopes), customRoles, - ) + )) }, }, ) diff --git a/internal/controller/api/node/user/handler_public_test.go b/internal/controller/api/node/user/handler_public_test.go index bf020c5ba..2fe38458b 100644 --- a/internal/controller/api/node/user/handler_public_test.go +++ b/internal/controller/api/node/user/handler_public_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" @@ -68,7 +68,7 @@ func (s *HandlerPublicTestSuite) TestHandler() { for _, h := range handlers { h(e) } - s.NotEmpty(e.Routes()) + s.NotEmpty(e.Router().Routes()) req := httptest.NewRequest(http.MethodGet, "/api/node/hostname/user", nil) rec := httptest.NewRecorder() diff --git a/internal/controller/api/server.go b/internal/controller/api/server.go index a5a250434..d87e90dfd 100644 --- a/internal/controller/api/server.go +++ b/internal/controller/api/server.go @@ -22,19 +22,24 @@ package api import ( "context" + "errors" "fmt" "log/slog" "net/http" + "time" - "github.com/labstack/echo/v4" - "github.com/labstack/echo/v4/middleware" - slogecho "github.com/samber/slog-echo" - "go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho" + echootel "github.com/labstack/echo-opentelemetry" + "github.com/labstack/echo/v5" + "github.com/labstack/echo/v5/middleware" "go.opentelemetry.io/otel" "github.com/osapi-io/osapi/internal/config" + "github.com/osapi-io/osapi/internal/telemetry/httplog" ) +// shutdownGracePeriod bounds how long Stop waits for in-flight requests. +const shutdownGracePeriod = 10 * time.Second + // New initialize a new Server and configure an Echo server. func New( appConfig config.Config, @@ -42,15 +47,8 @@ func New( opts ...Option, ) *Server { e := echo.New() - e.HideBanner = true - - // Initialize CORS configuration - corsConfig := middleware.CORSConfig{} allowOrigins := appConfig.Controller.API.Security.CORS.AllowOrigins - if len(allowOrigins) > 0 { - corsConfig.AllowOrigins = allowOrigins - } s := &Server{ Echo: e, @@ -63,21 +61,45 @@ func New( } // Register middleware after options so MeterProvider is available. - otelOpts := []otelecho.Option{ - otelecho.WithTracerProvider(otel.GetTracerProvider()), + otelConfig := echootel.Config{ + ServerName: "osapi-api", + TracerProvider: otel.GetTracerProvider(), } if s.meterProvider != nil { - otelOpts = append( - otelOpts, - otelecho.WithMeterProvider(s.meterProvider), - ) + otelConfig.MeterProvider = s.meterProvider } - e.Use(otelecho.Middleware("osapi-api", otelOpts...)) - e.Use(slogecho.New(logger)) + e.Use(echootel.NewMiddlewareWithConfig(otelConfig)) + e.Use(httplog.New(logger)) e.Use(middleware.Recover()) e.Use(middleware.RequestID()) - e.Use(middleware.CORSWithConfig(corsConfig)) + // CORS is registered only when origins are configured. + // + // v4 defaulted an empty AllowOrigins to "*", which sends + // Access-Control-Allow-Origin: * from an authenticated API without anyone + // choosing it. v5 panics instead, and this package does not panic, so + // leaving the middleware off is the remaining option. No header means the + // browser applies same-origin policy, which is what an operator who has + // not configured CORS should get. + if len(allowOrigins) > 0 { + e.Use(middleware.CORSWithConfig(middleware.CORSConfig{ + AllowOrigins: allowOrigins, + })) + s.logger.Info( + "CORS enabled", + slog.Any("allow_origins", allowOrigins), + ) + } else { + // Say so rather than leaving the operator to infer it from a browser + // error with no server-side counterpart. + s.logger.Info( + "CORS not configured, cross-origin browser requests will be refused", + slog.String( + "configure", + "controller.api.security.cors.allow_origins", + ), + ) + } // Register audit middleware if an audit store is configured. if s.auditStore != nil { @@ -89,10 +111,21 @@ func New( // Start starts the Echo server with the configured port. func (s *Server) Start() { + // v5 drives the listener from a context rather than a Shutdown method, + // so Stop cancels this one. + ctx, cancel := context.WithCancel(context.Background()) + s.stop = cancel + go func() { s.logger.Info("starting server") - listenAddr := fmt.Sprintf(":%d", s.appConfig.Controller.API.Port) - if err := s.Echo.Start(listenAddr); err != nil && err != http.ErrServerClosed { + + sc := echo.StartConfig{ + Address: fmt.Sprintf(":%d", s.appConfig.Controller.API.Port), + HideBanner: true, + GracefulTimeout: shutdownGracePeriod, + } + if err := sc.Start(ctx, s.Echo); err != nil && + !errors.Is(err, http.ErrServerClosed) { s.logger.Error( "failed to start server", slog.String("error", err.Error()), @@ -103,16 +136,19 @@ func (s *Server) Start() { // Stop gracefully shuts down the Echo server. func (s *Server) Stop( - ctx context.Context, + _ context.Context, ) { s.logger.Info("stopping server") - if err := s.Echo.Shutdown(ctx); err != nil { - s.logger.Error( - "server shutdown failed", - slog.String("error", err.Error()), - ) - } else { + if s.stop == nil { s.logger.Info("server stopped gracefully") + + return } + + // Cancelling is what asks v5 to drain. StartConfig.GracefulTimeout bounds + // how long it waits, and the goroutine in Start reports any error. + s.stop() + s.stop = nil + s.logger.Info("server stopped gracefully") } diff --git a/internal/controller/api/server_public_test.go b/internal/controller/api/server_public_test.go index f50475766..949a2e7b3 100644 --- a/internal/controller/api/server_public_test.go +++ b/internal/controller/api/server_public_test.go @@ -26,10 +26,11 @@ import ( "log/slog" "net" "net/http" + "net/http/httptest" "testing" "time" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.uber.org/mock/gomock" @@ -154,7 +155,35 @@ func (s *ServerPublicTestSuite) TestNew() { }, validateFunc: func(server *api.Server) { s.NotNil(server) - s.NotNil(server.Echo) + s.Equal( + "http://localhost:3000", + s.corsHeaderFor(server), + "a configured origin is answered", + ) + }, + }, + { + // The v4 default was "*", which this package no longer inherits: + // v5 panics on an empty AllowOrigins and nothing here panics, so + // the middleware is left off and the browser applies same-origin + // policy. Statement coverage cannot see this, because the branch + // that is skipped has no statements. + name: "sends no CORS header when no origins are configured", + appConfig: config.Config{ + Controller: config.Controller{ + API: config.APIServer{ + Security: config.ServerSecurity{ + SigningKey: "test-key", + }, + }, + }, + }, + validateFunc: func(server *api.Server) { + s.NotNil(server) + s.Empty( + s.corsHeaderFor(server), + "an unconfigured server allows no origin", + ) }, }, } @@ -166,12 +195,41 @@ func (s *ServerPublicTestSuite) TestNew() { } } +// corsHeaderFor issues a cross-origin GET through the server and returns the +// Access-Control-Allow-Origin header it answered with, empty when absent. +func (s *ServerPublicTestSuite) corsHeaderFor( + server *api.Server, +) string { + s.T().Helper() + + server.Echo.GET("/cors-probe", func(c *echo.Context) error { + return c.NoContent(http.StatusNoContent) + }) + + req := httptest.NewRequest(http.MethodGet, "/cors-probe", nil) + req.Header.Set("Origin", "http://localhost:3000") + + rec := httptest.NewRecorder() + server.Echo.ServeHTTP(rec, req) + + return rec.Header().Get("Access-Control-Allow-Origin") +} + func (s *ServerPublicTestSuite) TestStartAndStop() { tests := []struct { - name string + name string + start bool }{ { - name: "starts and stops gracefully", + name: "starts and stops gracefully", + start: true, + }, + { + // Stop is reachable without Start when startup fails earlier in + // the boot sequence. v5 cancels a context to shut down, so there + // is nothing to cancel here and Stop must not panic. + name: "stops without having started", + start: false, }, } @@ -189,14 +247,20 @@ func (s *ServerPublicTestSuite) TestStartAndStop() { } server := api.New(appConfig, slog.Default()) - server.Start() - time.Sleep(50 * time.Millisecond) + if tt.start { + server.Start() + time.Sleep(50 * time.Millisecond) + } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - server.Stop(ctx) + s.NotPanics(func() { server.Stop(ctx) }) + + // Stopping twice is idempotent: the second call takes the + // nil-stop path the first one left behind. + s.NotPanics(func() { server.Stop(ctx) }) }) } } @@ -266,7 +330,7 @@ func (s *ServerPublicTestSuite) TestStopErrorPath() { server := api.New(appConfig, slog.Default()) - server.Echo.GET("/slow", func(c echo.Context) error { + server.Echo.GET("/slow", func(c *echo.Context) error { time.Sleep(10 * time.Second) return c.String(http.StatusOK, "done") }) diff --git a/internal/controller/api/types.go b/internal/controller/api/types.go index 08150bb4f..00faf43ab 100644 --- a/internal/controller/api/types.go +++ b/internal/controller/api/types.go @@ -21,9 +21,10 @@ package api import ( + "context" "log/slog" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "github.com/osapi-io/osapi/internal/audit" @@ -37,7 +38,20 @@ type Server struct { appConfig config.Config auditStore audit.Store meterProvider *sdkmetric.MeterProvider + + // stop cancels the context StartConfig.Start is listening on. v5 has no + // Shutdown method: cancelling the context is how the server is asked to + // drain. + stop context.CancelFunc } +// StrictHandlerFunc is the shape oapi-codegen's strict handlers take under +// Echo v5. Each generated package declares its own identical type, so a helper +// shared across packages cannot name any one of them. Declaring it once here +// gives the shared middleware a type to sit on; call sites convert to and from +// their own package's version, which Go permits because the underlying +// signatures match. +type StrictHandlerFunc func(ctx *echo.Context, request any) (any, error) + // Option is a functional option for configuring the Server. type Option func(*Server) diff --git a/internal/controller/api/ui/handler.go b/internal/controller/api/ui/handler.go index fe7d803ac..fa1d38879 100644 --- a/internal/controller/api/ui/handler.go +++ b/internal/controller/api/ui/handler.go @@ -26,7 +26,7 @@ import ( "net/http" "strings" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) // Handler returns registration functions for the embedded UI. It follows diff --git a/internal/controller/api/ui/handler_public_test.go b/internal/controller/api/ui/handler_public_test.go index 3a31f2cc2..122ca41c0 100644 --- a/internal/controller/api/ui/handler_public_test.go +++ b/internal/controller/api/ui/handler_public_test.go @@ -27,7 +27,7 @@ import ( "testing" "testing/fstest" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" uihandler "github.com/osapi-io/osapi/internal/controller/api/ui" @@ -163,7 +163,7 @@ func (s *HandlerPublicTestSuite) TestRegister() { name: "does not intercept API routes registered before the handler", distFS: populatedFS(), setupRoute: func(e *echo.Echo) { - e.GET("/api/health", func(c echo.Context) error { + e.GET("/api/health", func(c *echo.Context) error { return c.String(http.StatusOK, "healthy") }) }, diff --git a/internal/provider/network/ping/mocks/types.gen.go b/internal/provider/network/ping/mocks/types.gen.go index 82cd6e3bb..b28063d35 100644 --- a/internal/provider/network/ping/mocks/types.gen.go +++ b/internal/provider/network/ping/mocks/types.gen.go @@ -12,8 +12,8 @@ package mocks import ( reflect "reflect" - probing "github.com/prometheus-community/pro-bing" ping "github.com/osapi-io/osapi/internal/provider/network/ping" + probing "github.com/prometheus-community/pro-bing" gomock "go.uber.org/mock/gomock" ) diff --git a/internal/telemetry/httplog/httplog.go b/internal/telemetry/httplog/httplog.go new file mode 100644 index 000000000..af1fe46af --- /dev/null +++ b/internal/telemetry/httplog/httplog.go @@ -0,0 +1,103 @@ +// Copyright (c) 2026 John Dewey + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +// Package httplog logs one line per HTTP request through the application's +// slog.Logger. +// +// It replaces github.com/samber/slog-echo, which is unusable on Echo v5: it +// tests for a routing error with err.(*echo.HTTPError), and v5 returns the +// unexported *echo.httpError, so every 404 was reported and logged as a 500. +// Echo's own RequestLogger resolves the status through the error handler +// instead, which is the only thing that knows it. +package httplog + +import ( + "log/slog" + + "github.com/labstack/echo/v5" + "github.com/labstack/echo/v5/middleware" +) + +// New returns middleware logging each request to logger. Field names follow +// what slog-echo emitted, so anything reading these logs keeps working. +func New( + logger *slog.Logger, +) echo.MiddlewareFunc { + return middleware.RequestLoggerWithConfig(middleware.RequestLoggerConfig{ + LogLatency: true, + LogProtocol: true, + LogRemoteIP: true, + LogHost: true, + LogMethod: true, + LogURI: true, + LogURIPath: true, + LogRoutePath: true, + LogRequestID: true, + LogReferer: true, + LogUserAgent: true, + LogStatus: true, + LogResponseSize: true, + LogContentLength: true, + + // Without this the middleware reports the status written so far + // rather than the one the error handler settles on, which is how + // slog-echo turned every 404 into a 500. + HandleError: true, + + LogValuesFunc: func( + c *echo.Context, + v middleware.RequestLoggerValues, + ) error { + attrs := []slog.Attr{ + slog.Group("request", + slog.String("method", v.Method), + slog.String("host", v.Host), + slog.String("path", v.URIPath), + slog.String("route", v.RoutePath), + slog.String("ip", v.RemoteIP), + slog.String("referer", v.Referer), + slog.String("id", v.RequestID), + ), + slog.Group("response", + slog.Int("status", v.Status), + slog.Duration("latency", v.Latency), + slog.Int64("length", v.ResponseSize), + ), + } + + level := slog.LevelInfo + msg := "incoming request" + + switch { + case v.Error != nil: + level = slog.LevelError + msg = v.Error.Error() + case v.Status >= 500: + level = slog.LevelError + case v.Status >= 400: + level = slog.LevelWarn + } + + logger.LogAttrs(c.Request().Context(), level, msg, attrs...) + + return nil + }, + }) +} diff --git a/internal/telemetry/httplog/httplog_public_test.go b/internal/telemetry/httplog/httplog_public_test.go new file mode 100644 index 000000000..09ee72e5e --- /dev/null +++ b/internal/telemetry/httplog/httplog_public_test.go @@ -0,0 +1,180 @@ +// Copyright (c) 2026 John Dewey + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +package httplog_test + +import ( + "bytes" + "encoding/json" + "log/slog" + "net/http" + "net/http/httptest" + "testing" + + "github.com/labstack/echo/v5" + "github.com/stretchr/testify/suite" + + "github.com/osapi-io/osapi/internal/telemetry/httplog" +) + +type NewPublicTestSuite struct { + suite.Suite + + buf *bytes.Buffer + logger *slog.Logger +} + +func (s *NewPublicTestSuite) SetupTest() { + s.buf = &bytes.Buffer{} + s.logger = slog.New(slog.NewJSONHandler(s.buf, &slog.HandlerOptions{ + Level: slog.LevelDebug, + })) +} + +// record returns the single log line the middleware emitted for one request. +func (s *NewPublicTestSuite) record() map[string]any { + s.T().Helper() + + var entry map[string]any + s.Require().NoError(json.Unmarshal(s.buf.Bytes(), &entry)) + + return entry +} + +func (s *NewPublicTestSuite) TestNew() { + tests := []struct { + name string + register func(e *echo.Echo) + requestPath string + wantHTTP int + wantLevel string + validateFunc func(entry map[string]any) + }{ + { + name: "logs a successful request at info", + register: func(e *echo.Echo) { + e.GET("/ok", func(c *echo.Context) error { + return c.String(http.StatusOK, "ok") + }) + }, + requestPath: "/ok", + wantHTTP: http.StatusOK, + wantLevel: "INFO", + validateFunc: func(entry map[string]any) { + req, ok := entry["request"].(map[string]any) + s.Require().True(ok, "request group is present") + s.Equal(http.MethodGet, req["method"]) + s.Equal("/ok", req["path"]) + + resp, ok := entry["response"].(map[string]any) + s.Require().True(ok, "response group is present") + s.Equal(float64(http.StatusOK), resp["status"]) + s.Contains(resp, "latency") + s.Contains(resp, "length") + }, + }, + { + // The reason this package exists. slog-echo tested for a routing + // error with err.(*echo.HTTPError), but Echo v5 returns the + // unexported *echo.httpError, so every 404 was reported as a 500. + name: "reports an unmatched route as 404, not 500", + register: func(_ *echo.Echo) {}, + requestPath: "/nope", + wantHTTP: http.StatusNotFound, + wantLevel: "ERROR", + validateFunc: func(entry map[string]any) { + resp := entry["response"].(map[string]any) + s.Equal(float64(http.StatusNotFound), resp["status"]) + }, + }, + { + name: "logs a client error at warn", + register: func(e *echo.Echo) { + e.GET("/bad", func(c *echo.Context) error { + return c.String(http.StatusBadRequest, "bad") + }) + }, + requestPath: "/bad", + wantHTTP: http.StatusBadRequest, + wantLevel: "WARN", + validateFunc: func(entry map[string]any) { + resp := entry["response"].(map[string]any) + s.Equal(float64(http.StatusBadRequest), resp["status"]) + }, + }, + { + name: "logs a server error at error", + register: func(e *echo.Echo) { + e.GET("/boom", func(c *echo.Context) error { + return c.String(http.StatusInternalServerError, "boom") + }) + }, + requestPath: "/boom", + wantHTTP: http.StatusInternalServerError, + wantLevel: "ERROR", + validateFunc: func(entry map[string]any) { + resp := entry["response"].(map[string]any) + s.Equal(float64(http.StatusInternalServerError), resp["status"]) + }, + }, + { + name: "logs a handler error with its message", + register: func(e *echo.Echo) { + e.GET("/err", func(_ *echo.Context) error { + return echo.NewHTTPError(http.StatusTeapot, "short and stout") + }) + }, + requestPath: "/err", + wantHTTP: http.StatusTeapot, + wantLevel: "ERROR", + validateFunc: func(entry map[string]any) { + s.Contains(entry["msg"], "short and stout") + }, + }, + } + + for _, tt := range tests { + s.Run(tt.name, func() { + s.SetupTest() + + e := echo.New() + e.Use(httplog.New(s.logger)) + tt.register(e) + + rec := httptest.NewRecorder() + e.ServeHTTP( + rec, + httptest.NewRequest(http.MethodGet, tt.requestPath, nil), + ) + + s.Equal(tt.wantHTTP, rec.Code, "HTTP status") + + entry := s.record() + s.Equal(tt.wantLevel, entry["level"], "log level") + tt.validateFunc(entry) + }) + } +} + +func TestNewPublicTestSuite( + t *testing.T, +) { + suite.Run(t, new(NewPublicTestSuite)) +} diff --git a/internal/telemetry/metrics/export_test.go b/internal/telemetry/metrics/export_test.go index cec52620f..fe8824929 100644 --- a/internal/telemetry/metrics/export_test.go +++ b/internal/telemetry/metrics/export_test.go @@ -23,7 +23,7 @@ package metrics import ( - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" prometheusExporter "go.opentelemetry.io/otel/exporters/prometheus" ) diff --git a/internal/telemetry/metrics/health.go b/internal/telemetry/metrics/health.go index 034d0aafa..b7ce0e9e7 100644 --- a/internal/telemetry/metrics/health.go +++ b/internal/telemetry/metrics/health.go @@ -23,12 +23,12 @@ package metrics import ( "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) // handleHealth handles GET /health and always returns 200 with {"status":"ok"}. func (s *Server) handleHealth( - c echo.Context, + c *echo.Context, ) error { return c.JSON(http.StatusOK, map[string]string{ "status": "ok", @@ -39,7 +39,7 @@ func (s *Server) handleHealth( // func is configured or the readiness func returns an error, and 200 when // the readiness func returns nil. func (s *Server) handleReady( - c echo.Context, + c *echo.Context, ) error { if s.readinessFunc == nil { return c.JSON(http.StatusServiceUnavailable, map[string]string{ diff --git a/internal/telemetry/metrics/server.go b/internal/telemetry/metrics/server.go index 83c47d82b..b8983e0c1 100644 --- a/internal/telemetry/metrics/server.go +++ b/internal/telemetry/metrics/server.go @@ -24,21 +24,23 @@ package metrics import ( "context" + "errors" "fmt" "log/slog" "net/http" "time" - "github.com/labstack/echo/v4" - "github.com/labstack/echo/v4/middleware" + "github.com/labstack/echo/v5" + "github.com/labstack/echo/v5/middleware" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" - slogecho "github.com/samber/slog-echo" "go.opentelemetry.io/otel/attribute" prometheusExporter "go.opentelemetry.io/otel/exporters/prometheus" "go.opentelemetry.io/otel/metric" sdkmetric "go.opentelemetry.io/otel/sdk/metric" + + "github.com/osapi-io/osapi/internal/telemetry/httplog" ) // prometheusNewFn is injectable for testing the exporter creation error path. @@ -98,8 +100,7 @@ func New( ) e := echo.New() - e.HideBanner = true - e.Use(slogecho.New(logger)) + e.Use(httplog.New(logger)) e.Use(middleware.Recover()) e.GET("/metrics", echo.WrapHandler( @@ -183,16 +184,29 @@ func (s *Server) MeterProvider() *sdkmetric.MeterProvider { return s.meterProvider } +// shutdownGracePeriod bounds how long Stop waits for in-flight requests. +const shutdownGracePeriod = 10 * time.Second + // Start starts the HTTP server in a background goroutine. func (s *Server) Start() { + // v5 drives the listener from a context rather than a Shutdown method, + // so Stop cancels this one. + ctx, cancel := context.WithCancel(context.Background()) + s.stop = cancel + go func() { s.logger.Info( "metrics server started", slog.String("addr", s.addr), ) - if err := s.echo.Start(s.addr); err != nil && - err != http.ErrServerClosed { + sc := echo.StartConfig{ + Address: s.addr, + HideBanner: true, + GracefulTimeout: shutdownGracePeriod, + } + if err := sc.Start(ctx, s.echo); err != nil && + !errors.Is(err, http.ErrServerClosed) { s.logger.Error( "metrics server error", slog.String("error", err.Error()), @@ -212,11 +226,11 @@ func (s *Server) Stop( ) } - if err := s.echo.Shutdown(ctx); err != nil { - s.logger.Error( - "metrics server shutdown error", - slog.String("error", err.Error()), - ) + // Cancelling is what asks v5 to drain. StartConfig.GracefulTimeout bounds + // how long it waits, and the goroutine in Start reports any error. + if s.stop != nil { + s.stop() + s.stop = nil } s.logger.Info("metrics server stopped") diff --git a/internal/telemetry/metrics/server_public_test.go b/internal/telemetry/metrics/server_public_test.go index 745ca0e45..ebcca9fd5 100644 --- a/internal/telemetry/metrics/server_public_test.go +++ b/internal/telemetry/metrics/server_public_test.go @@ -31,7 +31,7 @@ import ( "testing" "time" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/suite" prometheusExporter "go.opentelemetry.io/otel/exporters/prometheus" @@ -432,9 +432,14 @@ func (s *ServerPublicTestSuite) TestStopErrors() { metrics.ExportServerAddRoute( srv, "/slow", - func(c echo.Context) error { + func(c *echo.Context) error { c.Response().WriteHeader(http.StatusOK) - c.Response().Flush() + // v5's Response() is a bare http.ResponseWriter, so + // Flush comes from the interface rather than a method + // on Echo's wrapper. + if f, ok := c.Response().(http.Flusher); ok { + f.Flush() + } time.Sleep(5 * time.Second) diff --git a/internal/telemetry/metrics/types.go b/internal/telemetry/metrics/types.go index 3b0ad621e..9c80303b6 100644 --- a/internal/telemetry/metrics/types.go +++ b/internal/telemetry/metrics/types.go @@ -21,9 +21,10 @@ package metrics import ( + "context" "log/slog" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/prometheus/client_golang/prometheus" sdkmetric "go.opentelemetry.io/otel/sdk/metric" ) @@ -37,4 +38,9 @@ type Server struct { registry *prometheus.Registry meterProvider *sdkmetric.MeterProvider readinessFunc func() error + + // stop cancels the context StartConfig.Start is listening on. v5 has no + // Shutdown method: cancelling the context is how the server is asked to + // drain. + stop context.CancelFunc } diff --git a/pkg/sdk/client/gen/client.gen.go b/pkg/sdk/client/gen/client.gen.go index f617d0580..2f947171a 100644 --- a/pkg/sdk/client/gen/client.gen.go +++ b/pkg/sdk/client/gen/client.gen.go @@ -1,6 +1,6 @@ // Package gen provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT. package gen import ( @@ -19,7 +19,7 @@ import ( ) const ( - BearerAuthScopes = "BearerAuth.Scopes" + BearerAuthScopes bearerAuthContextKey = "BearerAuth.Scopes" ) // Defines values for AgentInfoState. @@ -30,12 +30,40 @@ const ( AgentInfoStateReady AgentInfoState = "Ready" ) +// Valid indicates whether the value is a known member of the AgentInfoState enum. +func (e AgentInfoState) Valid() bool { + switch e { + case AgentInfoStateCordoned: + return true + case AgentInfoStateDraining: + return true + case AgentInfoStatePending: + return true + case AgentInfoStateReady: + return true + default: + return false + } +} + // Defines values for AgentInfoStatus. const ( AgentInfoStatusNotReady AgentInfoStatus = "NotReady" AgentInfoStatusReady AgentInfoStatus = "Ready" ) +// Valid indicates whether the value is a known member of the AgentInfoStatus enum. +func (e AgentInfoStatus) Valid() bool { + switch e { + case AgentInfoStatusNotReady: + return true + case AgentInfoStatusReady: + return true + default: + return false + } +} + // Defines values for CertificateCAEntryStatus. const ( CertificateCAEntryStatusFailed CertificateCAEntryStatus = "failed" @@ -43,12 +71,38 @@ const ( CertificateCAEntryStatusSkipped CertificateCAEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the CertificateCAEntryStatus enum. +func (e CertificateCAEntryStatus) Valid() bool { + switch e { + case CertificateCAEntryStatusFailed: + return true + case CertificateCAEntryStatusOk: + return true + case CertificateCAEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for CertificateCAInfoSource. const ( Custom CertificateCAInfoSource = "custom" System CertificateCAInfoSource = "system" ) +// Valid indicates whether the value is a known member of the CertificateCAInfoSource enum. +func (e CertificateCAInfoSource) Valid() bool { + switch e { + case Custom: + return true + case System: + return true + default: + return false + } +} + // Defines values for CertificateCAMutationEntryStatus. const ( CertificateCAMutationEntryStatusFailed CertificateCAMutationEntryStatus = "failed" @@ -56,6 +110,20 @@ const ( CertificateCAMutationEntryStatusSkipped CertificateCAMutationEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the CertificateCAMutationEntryStatus enum. +func (e CertificateCAMutationEntryStatus) Valid() bool { + switch e { + case CertificateCAMutationEntryStatusFailed: + return true + case CertificateCAMutationEntryStatusOk: + return true + case CertificateCAMutationEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for CommandResultItemStatus. const ( CommandResultItemStatusFailed CommandResultItemStatus = "failed" @@ -63,12 +131,38 @@ const ( CommandResultItemStatusSkipped CommandResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the CommandResultItemStatus enum. +func (e CommandResultItemStatus) Valid() bool { + switch e { + case CommandResultItemStatusFailed: + return true + case CommandResultItemStatusOk: + return true + case CommandResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for CronCreateRequestContentType. const ( CronCreateRequestContentTypeRaw CronCreateRequestContentType = "raw" CronCreateRequestContentTypeTemplate CronCreateRequestContentType = "template" ) +// Valid indicates whether the value is a known member of the CronCreateRequestContentType enum. +func (e CronCreateRequestContentType) Valid() bool { + switch e { + case CronCreateRequestContentTypeRaw: + return true + case CronCreateRequestContentTypeTemplate: + return true + default: + return false + } +} + // Defines values for CronCreateRequestInterval. const ( CronCreateRequestIntervalDaily CronCreateRequestInterval = "daily" @@ -77,6 +171,22 @@ const ( CronCreateRequestIntervalWeekly CronCreateRequestInterval = "weekly" ) +// Valid indicates whether the value is a known member of the CronCreateRequestInterval enum. +func (e CronCreateRequestInterval) Valid() bool { + switch e { + case CronCreateRequestIntervalDaily: + return true + case CronCreateRequestIntervalHourly: + return true + case CronCreateRequestIntervalMonthly: + return true + case CronCreateRequestIntervalWeekly: + return true + default: + return false + } +} + // Defines values for CronEntryInterval. const ( CronEntryIntervalDaily CronEntryInterval = "daily" @@ -85,6 +195,22 @@ const ( CronEntryIntervalWeekly CronEntryInterval = "weekly" ) +// Valid indicates whether the value is a known member of the CronEntryInterval enum. +func (e CronEntryInterval) Valid() bool { + switch e { + case CronEntryIntervalDaily: + return true + case CronEntryIntervalHourly: + return true + case CronEntryIntervalMonthly: + return true + case CronEntryIntervalWeekly: + return true + default: + return false + } +} + // Defines values for CronEntryStatus. const ( CronEntryStatusFailed CronEntryStatus = "failed" @@ -92,6 +218,20 @@ const ( CronEntryStatusSkipped CronEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the CronEntryStatus enum. +func (e CronEntryStatus) Valid() bool { + switch e { + case CronEntryStatusFailed: + return true + case CronEntryStatusOk: + return true + case CronEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for CronMutationResultStatus. const ( CronMutationResultStatusFailed CronMutationResultStatus = "failed" @@ -99,12 +239,38 @@ const ( CronMutationResultStatusSkipped CronMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the CronMutationResultStatus enum. +func (e CronMutationResultStatus) Valid() bool { + switch e { + case CronMutationResultStatusFailed: + return true + case CronMutationResultStatusOk: + return true + case CronMutationResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for CronUpdateRequestContentType. const ( CronUpdateRequestContentTypeRaw CronUpdateRequestContentType = "raw" CronUpdateRequestContentTypeTemplate CronUpdateRequestContentType = "template" ) +// Valid indicates whether the value is a known member of the CronUpdateRequestContentType enum. +func (e CronUpdateRequestContentType) Valid() bool { + switch e { + case CronUpdateRequestContentTypeRaw: + return true + case CronUpdateRequestContentTypeTemplate: + return true + default: + return false + } +} + // Defines values for DNSConfigResponseStatus. const ( DNSConfigResponseStatusFailed DNSConfigResponseStatus = "failed" @@ -112,6 +278,20 @@ const ( DNSConfigResponseStatusSkipped DNSConfigResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DNSConfigResponseStatus enum. +func (e DNSConfigResponseStatus) Valid() bool { + switch e { + case DNSConfigResponseStatusFailed: + return true + case DNSConfigResponseStatusOk: + return true + case DNSConfigResponseStatusSkipped: + return true + default: + return false + } +} + // Defines values for DNSDeleteResultItemStatus. const ( DNSDeleteResultItemStatusFailed DNSDeleteResultItemStatus = "failed" @@ -119,6 +299,20 @@ const ( DNSDeleteResultItemStatusSkipped DNSDeleteResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DNSDeleteResultItemStatus enum. +func (e DNSDeleteResultItemStatus) Valid() bool { + switch e { + case DNSDeleteResultItemStatusFailed: + return true + case DNSDeleteResultItemStatusOk: + return true + case DNSDeleteResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for DNSUpdateResultItemStatus. const ( DNSUpdateResultItemStatusFailed DNSUpdateResultItemStatus = "failed" @@ -126,6 +320,20 @@ const ( DNSUpdateResultItemStatusSkipped DNSUpdateResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DNSUpdateResultItemStatus enum. +func (e DNSUpdateResultItemStatus) Valid() bool { + switch e { + case DNSUpdateResultItemStatusFailed: + return true + case DNSUpdateResultItemStatusOk: + return true + case DNSUpdateResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for DiskResultItemStatus. const ( DiskResultItemStatusFailed DiskResultItemStatus = "failed" @@ -133,6 +341,20 @@ const ( DiskResultItemStatusSkipped DiskResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DiskResultItemStatus enum. +func (e DiskResultItemStatus) Valid() bool { + switch e { + case DiskResultItemStatusFailed: + return true + case DiskResultItemStatusOk: + return true + case DiskResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for DockerActionResultItemStatus. const ( DockerActionResultItemStatusFailed DockerActionResultItemStatus = "failed" @@ -140,6 +362,20 @@ const ( DockerActionResultItemStatusSkipped DockerActionResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DockerActionResultItemStatus enum. +func (e DockerActionResultItemStatus) Valid() bool { + switch e { + case DockerActionResultItemStatusFailed: + return true + case DockerActionResultItemStatusOk: + return true + case DockerActionResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for DockerDetailResponseStatus. const ( DockerDetailResponseStatusFailed DockerDetailResponseStatus = "failed" @@ -147,6 +383,20 @@ const ( DockerDetailResponseStatusSkipped DockerDetailResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DockerDetailResponseStatus enum. +func (e DockerDetailResponseStatus) Valid() bool { + switch e { + case DockerDetailResponseStatusFailed: + return true + case DockerDetailResponseStatusOk: + return true + case DockerDetailResponseStatusSkipped: + return true + default: + return false + } +} + // Defines values for DockerExecResultItemStatus. const ( DockerExecResultItemStatusFailed DockerExecResultItemStatus = "failed" @@ -154,6 +404,20 @@ const ( DockerExecResultItemStatusSkipped DockerExecResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DockerExecResultItemStatus enum. +func (e DockerExecResultItemStatus) Valid() bool { + switch e { + case DockerExecResultItemStatusFailed: + return true + case DockerExecResultItemStatusOk: + return true + case DockerExecResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for DockerListItemStatus. const ( DockerListItemStatusFailed DockerListItemStatus = "failed" @@ -161,6 +425,20 @@ const ( DockerListItemStatusSkipped DockerListItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DockerListItemStatus enum. +func (e DockerListItemStatus) Valid() bool { + switch e { + case DockerListItemStatusFailed: + return true + case DockerListItemStatusOk: + return true + case DockerListItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for DockerPullResultItemStatus. const ( DockerPullResultItemStatusFailed DockerPullResultItemStatus = "failed" @@ -168,6 +446,20 @@ const ( DockerPullResultItemStatusSkipped DockerPullResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DockerPullResultItemStatus enum. +func (e DockerPullResultItemStatus) Valid() bool { + switch e { + case DockerPullResultItemStatusFailed: + return true + case DockerPullResultItemStatusOk: + return true + case DockerPullResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for DockerResponseStatus. const ( DockerResponseStatusFailed DockerResponseStatus = "failed" @@ -175,12 +467,38 @@ const ( DockerResponseStatusSkipped DockerResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the DockerResponseStatus enum. +func (e DockerResponseStatus) Valid() bool { + switch e { + case DockerResponseStatusFailed: + return true + case DockerResponseStatusOk: + return true + case DockerResponseStatusSkipped: + return true + default: + return false + } +} + // Defines values for FileDeployRequestContentType. const ( FileDeployRequestContentTypeRaw FileDeployRequestContentType = "raw" FileDeployRequestContentTypeTemplate FileDeployRequestContentType = "template" ) +// Valid indicates whether the value is a known member of the FileDeployRequestContentType enum. +func (e FileDeployRequestContentType) Valid() bool { + switch e { + case FileDeployRequestContentTypeRaw: + return true + case FileDeployRequestContentTypeTemplate: + return true + default: + return false + } +} + // Defines values for FileDeployResultStatus. const ( FileDeployResultStatusFailed FileDeployResultStatus = "failed" @@ -188,6 +506,20 @@ const ( FileDeployResultStatusSkipped FileDeployResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the FileDeployResultStatus enum. +func (e FileDeployResultStatus) Valid() bool { + switch e { + case FileDeployResultStatusFailed: + return true + case FileDeployResultStatusOk: + return true + case FileDeployResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for FileUndeployResultStatus. const ( FileUndeployResultStatusFailed FileUndeployResultStatus = "failed" @@ -195,6 +527,20 @@ const ( FileUndeployResultStatusSkipped FileUndeployResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the FileUndeployResultStatus enum. +func (e FileUndeployResultStatus) Valid() bool { + switch e { + case FileUndeployResultStatusFailed: + return true + case FileUndeployResultStatusOk: + return true + case FileUndeployResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for GroupEntryStatus. const ( GroupEntryStatusFailed GroupEntryStatus = "failed" @@ -202,6 +548,20 @@ const ( GroupEntryStatusSkipped GroupEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the GroupEntryStatus enum. +func (e GroupEntryStatus) Valid() bool { + switch e { + case GroupEntryStatusFailed: + return true + case GroupEntryStatusOk: + return true + case GroupEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for GroupMutationResultStatus. const ( GroupMutationResultStatusFailed GroupMutationResultStatus = "failed" @@ -209,6 +569,20 @@ const ( GroupMutationResultStatusSkipped GroupMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the GroupMutationResultStatus enum. +func (e GroupMutationResultStatus) Valid() bool { + switch e { + case GroupMutationResultStatusFailed: + return true + case GroupMutationResultStatusOk: + return true + case GroupMutationResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for HostnameResponseStatus. const ( HostnameResponseStatusFailed HostnameResponseStatus = "failed" @@ -216,6 +590,20 @@ const ( HostnameResponseStatusSkipped HostnameResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the HostnameResponseStatus enum. +func (e HostnameResponseStatus) Valid() bool { + switch e { + case HostnameResponseStatusFailed: + return true + case HostnameResponseStatusOk: + return true + case HostnameResponseStatusSkipped: + return true + default: + return false + } +} + // Defines values for HostnameUpdateResultItemStatus. const ( HostnameUpdateResultItemStatusFailed HostnameUpdateResultItemStatus = "failed" @@ -223,6 +611,20 @@ const ( HostnameUpdateResultItemStatusSkipped HostnameUpdateResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the HostnameUpdateResultItemStatus enum. +func (e HostnameUpdateResultItemStatus) Valid() bool { + switch e { + case HostnameUpdateResultItemStatusFailed: + return true + case HostnameUpdateResultItemStatusOk: + return true + case HostnameUpdateResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for InterfaceGetEntryStatus. const ( InterfaceGetEntryStatusFailed InterfaceGetEntryStatus = "failed" @@ -230,6 +632,20 @@ const ( InterfaceGetEntryStatusSkipped InterfaceGetEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the InterfaceGetEntryStatus enum. +func (e InterfaceGetEntryStatus) Valid() bool { + switch e { + case InterfaceGetEntryStatusFailed: + return true + case InterfaceGetEntryStatusOk: + return true + case InterfaceGetEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for InterfaceListEntryStatus. const ( InterfaceListEntryStatusFailed InterfaceListEntryStatus = "failed" @@ -237,6 +653,20 @@ const ( InterfaceListEntryStatusSkipped InterfaceListEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the InterfaceListEntryStatus enum. +func (e InterfaceListEntryStatus) Valid() bool { + switch e { + case InterfaceListEntryStatusFailed: + return true + case InterfaceListEntryStatusOk: + return true + case InterfaceListEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for InterfaceMutationEntryStatus. const ( InterfaceMutationEntryStatusFailed InterfaceMutationEntryStatus = "failed" @@ -244,6 +674,20 @@ const ( InterfaceMutationEntryStatusSkipped InterfaceMutationEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the InterfaceMutationEntryStatus enum. +func (e InterfaceMutationEntryStatus) Valid() bool { + switch e { + case InterfaceMutationEntryStatusFailed: + return true + case InterfaceMutationEntryStatusOk: + return true + case InterfaceMutationEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for LoadResultItemStatus. const ( LoadResultItemStatusFailed LoadResultItemStatus = "failed" @@ -251,6 +695,20 @@ const ( LoadResultItemStatusSkipped LoadResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the LoadResultItemStatus enum. +func (e LoadResultItemStatus) Valid() bool { + switch e { + case LoadResultItemStatusFailed: + return true + case LoadResultItemStatusOk: + return true + case LoadResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for LogResultEntryStatus. const ( LogResultEntryStatusFailed LogResultEntryStatus = "failed" @@ -258,6 +716,20 @@ const ( LogResultEntryStatusSkipped LogResultEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the LogResultEntryStatus enum. +func (e LogResultEntryStatus) Valid() bool { + switch e { + case LogResultEntryStatusFailed: + return true + case LogResultEntryStatusOk: + return true + case LogResultEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for LogSourceEntryStatus. const ( LogSourceEntryStatusFailed LogSourceEntryStatus = "failed" @@ -265,6 +737,20 @@ const ( LogSourceEntryStatusSkipped LogSourceEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the LogSourceEntryStatus enum. +func (e LogSourceEntryStatus) Valid() bool { + switch e { + case LogSourceEntryStatusFailed: + return true + case LogSourceEntryStatusOk: + return true + case LogSourceEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for MemoryResultItemStatus. const ( MemoryResultItemStatusFailed MemoryResultItemStatus = "failed" @@ -272,6 +758,20 @@ const ( MemoryResultItemStatusSkipped MemoryResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the MemoryResultItemStatus enum. +func (e MemoryResultItemStatus) Valid() bool { + switch e { + case MemoryResultItemStatusFailed: + return true + case MemoryResultItemStatusOk: + return true + case MemoryResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for NetworkInterfaceResponseFamily. const ( Dual NetworkInterfaceResponseFamily = "dual" @@ -279,6 +779,20 @@ const ( Inet6 NetworkInterfaceResponseFamily = "inet6" ) +// Valid indicates whether the value is a known member of the NetworkInterfaceResponseFamily enum. +func (e NetworkInterfaceResponseFamily) Valid() bool { + switch e { + case Dual: + return true + case Inet: + return true + case Inet6: + return true + default: + return false + } +} + // Defines values for NodeConditionType. const ( DiskPressure NodeConditionType = "DiskPressure" @@ -286,6 +800,20 @@ const ( MemoryPressure NodeConditionType = "MemoryPressure" ) +// Valid indicates whether the value is a known member of the NodeConditionType enum. +func (e NodeConditionType) Valid() bool { + switch e { + case DiskPressure: + return true + case HighLoad: + return true + case MemoryPressure: + return true + default: + return false + } +} + // Defines values for NodeStatusResponseStatus. const ( NodeStatusResponseStatusFailed NodeStatusResponseStatus = "failed" @@ -293,6 +821,20 @@ const ( NodeStatusResponseStatusSkipped NodeStatusResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the NodeStatusResponseStatus enum. +func (e NodeStatusResponseStatus) Valid() bool { + switch e { + case NodeStatusResponseStatusFailed: + return true + case NodeStatusResponseStatusOk: + return true + case NodeStatusResponseStatusSkipped: + return true + default: + return false + } +} + // Defines values for NtpMutationResultStatus. const ( NtpMutationResultStatusFailed NtpMutationResultStatus = "failed" @@ -300,6 +842,20 @@ const ( NtpMutationResultStatusSkipped NtpMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the NtpMutationResultStatus enum. +func (e NtpMutationResultStatus) Valid() bool { + switch e { + case NtpMutationResultStatusFailed: + return true + case NtpMutationResultStatusOk: + return true + case NtpMutationResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for NtpStatusEntryStatus. const ( NtpStatusEntryStatusFailed NtpStatusEntryStatus = "failed" @@ -307,6 +863,20 @@ const ( NtpStatusEntryStatusSkipped NtpStatusEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the NtpStatusEntryStatus enum. +func (e NtpStatusEntryStatus) Valid() bool { + switch e { + case NtpStatusEntryStatusFailed: + return true + case NtpStatusEntryStatusOk: + return true + case NtpStatusEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for OSInfoResultItemStatus. const ( OSInfoResultItemStatusFailed OSInfoResultItemStatus = "failed" @@ -314,6 +884,20 @@ const ( OSInfoResultItemStatusSkipped OSInfoResultItemStatus = "skipped" ) +// Valid indicates whether the value is a known member of the OSInfoResultItemStatus enum. +func (e OSInfoResultItemStatus) Valid() bool { + switch e { + case OSInfoResultItemStatusFailed: + return true + case OSInfoResultItemStatusOk: + return true + case OSInfoResultItemStatusSkipped: + return true + default: + return false + } +} + // Defines values for PackageEntryStatus. const ( PackageEntryStatusFailed PackageEntryStatus = "failed" @@ -321,6 +905,20 @@ const ( PackageEntryStatusSkipped PackageEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the PackageEntryStatus enum. +func (e PackageEntryStatus) Valid() bool { + switch e { + case PackageEntryStatusFailed: + return true + case PackageEntryStatusOk: + return true + case PackageEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for PackageMutationResultStatus. const ( PackageMutationResultStatusFailed PackageMutationResultStatus = "failed" @@ -328,6 +926,20 @@ const ( PackageMutationResultStatusSkipped PackageMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the PackageMutationResultStatus enum. +func (e PackageMutationResultStatus) Valid() bool { + switch e { + case PackageMutationResultStatusFailed: + return true + case PackageMutationResultStatusOk: + return true + case PackageMutationResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for PingResponseStatus. const ( PingResponseStatusFailed PingResponseStatus = "failed" @@ -335,6 +947,20 @@ const ( PingResponseStatusSkipped PingResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the PingResponseStatus enum. +func (e PingResponseStatus) Valid() bool { + switch e { + case PingResponseStatusFailed: + return true + case PingResponseStatusOk: + return true + case PingResponseStatusSkipped: + return true + default: + return false + } +} + // Defines values for PowerResultStatus. const ( PowerResultStatusFailed PowerResultStatus = "failed" @@ -342,6 +968,20 @@ const ( PowerResultStatusSkipped PowerResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the PowerResultStatus enum. +func (e PowerResultStatus) Valid() bool { + switch e { + case PowerResultStatusFailed: + return true + case PowerResultStatusOk: + return true + case PowerResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for ProcessEntryStatus. const ( ProcessEntryStatusFailed ProcessEntryStatus = "failed" @@ -349,6 +989,20 @@ const ( ProcessEntryStatusSkipped ProcessEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the ProcessEntryStatus enum. +func (e ProcessEntryStatus) Valid() bool { + switch e { + case ProcessEntryStatusFailed: + return true + case ProcessEntryStatusOk: + return true + case ProcessEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for ProcessGetEntryStatus. const ( ProcessGetEntryStatusFailed ProcessGetEntryStatus = "failed" @@ -356,6 +1010,20 @@ const ( ProcessGetEntryStatusSkipped ProcessGetEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the ProcessGetEntryStatus enum. +func (e ProcessGetEntryStatus) Valid() bool { + switch e { + case ProcessGetEntryStatusFailed: + return true + case ProcessGetEntryStatusOk: + return true + case ProcessGetEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for ProcessSignalRequestSignal. const ( HUP ProcessSignalRequestSignal = "HUP" @@ -366,6 +1034,26 @@ const ( USR2 ProcessSignalRequestSignal = "USR2" ) +// Valid indicates whether the value is a known member of the ProcessSignalRequestSignal enum. +func (e ProcessSignalRequestSignal) Valid() bool { + switch e { + case HUP: + return true + case INT: + return true + case KILL: + return true + case TERM: + return true + case USR1: + return true + case USR2: + return true + default: + return false + } +} + // Defines values for ProcessSignalResultStatus. const ( ProcessSignalResultStatusFailed ProcessSignalResultStatus = "failed" @@ -373,6 +1061,20 @@ const ( ProcessSignalResultStatusSkipped ProcessSignalResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the ProcessSignalResultStatus enum. +func (e ProcessSignalResultStatus) Valid() bool { + switch e { + case ProcessSignalResultStatusFailed: + return true + case ProcessSignalResultStatusOk: + return true + case ProcessSignalResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for RouteGetEntryStatus. const ( RouteGetEntryStatusFailed RouteGetEntryStatus = "failed" @@ -380,6 +1082,20 @@ const ( RouteGetEntryStatusSkipped RouteGetEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the RouteGetEntryStatus enum. +func (e RouteGetEntryStatus) Valid() bool { + switch e { + case RouteGetEntryStatusFailed: + return true + case RouteGetEntryStatusOk: + return true + case RouteGetEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for RouteListEntryStatus. const ( RouteListEntryStatusFailed RouteListEntryStatus = "failed" @@ -387,6 +1103,20 @@ const ( RouteListEntryStatusSkipped RouteListEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the RouteListEntryStatus enum. +func (e RouteListEntryStatus) Valid() bool { + switch e { + case RouteListEntryStatusFailed: + return true + case RouteListEntryStatusOk: + return true + case RouteListEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for RouteMutationEntryStatus. const ( RouteMutationEntryStatusFailed RouteMutationEntryStatus = "failed" @@ -394,6 +1124,20 @@ const ( RouteMutationEntryStatusSkipped RouteMutationEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the RouteMutationEntryStatus enum. +func (e RouteMutationEntryStatus) Valid() bool { + switch e { + case RouteMutationEntryStatusFailed: + return true + case RouteMutationEntryStatusOk: + return true + case RouteMutationEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for SSHKeyEntryStatus. const ( SSHKeyEntryStatusFailed SSHKeyEntryStatus = "failed" @@ -401,6 +1145,20 @@ const ( SSHKeyEntryStatusSkipped SSHKeyEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the SSHKeyEntryStatus enum. +func (e SSHKeyEntryStatus) Valid() bool { + switch e { + case SSHKeyEntryStatusFailed: + return true + case SSHKeyEntryStatusOk: + return true + case SSHKeyEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for SSHKeyMutationEntryStatus. const ( SSHKeyMutationEntryStatusFailed SSHKeyMutationEntryStatus = "failed" @@ -408,6 +1166,20 @@ const ( SSHKeyMutationEntryStatusSkipped SSHKeyMutationEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the SSHKeyMutationEntryStatus enum. +func (e SSHKeyMutationEntryStatus) Valid() bool { + switch e { + case SSHKeyMutationEntryStatusFailed: + return true + case SSHKeyMutationEntryStatusOk: + return true + case SSHKeyMutationEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for ServiceGetEntryStatus. const ( ServiceGetEntryStatusFailed ServiceGetEntryStatus = "failed" @@ -415,6 +1187,20 @@ const ( ServiceGetEntryStatusSkipped ServiceGetEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the ServiceGetEntryStatus enum. +func (e ServiceGetEntryStatus) Valid() bool { + switch e { + case ServiceGetEntryStatusFailed: + return true + case ServiceGetEntryStatusOk: + return true + case ServiceGetEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for ServiceListEntryStatus. const ( ServiceListEntryStatusFailed ServiceListEntryStatus = "failed" @@ -422,6 +1208,20 @@ const ( ServiceListEntryStatusSkipped ServiceListEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the ServiceListEntryStatus enum. +func (e ServiceListEntryStatus) Valid() bool { + switch e { + case ServiceListEntryStatusFailed: + return true + case ServiceListEntryStatusOk: + return true + case ServiceListEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for ServiceMutationEntryStatus. const ( ServiceMutationEntryStatusFailed ServiceMutationEntryStatus = "failed" @@ -429,6 +1229,20 @@ const ( ServiceMutationEntryStatusSkipped ServiceMutationEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the ServiceMutationEntryStatus enum. +func (e ServiceMutationEntryStatus) Valid() bool { + switch e { + case ServiceMutationEntryStatusFailed: + return true + case ServiceMutationEntryStatusOk: + return true + case ServiceMutationEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for SysctlEntryStatus. const ( SysctlEntryStatusFailed SysctlEntryStatus = "failed" @@ -436,6 +1250,20 @@ const ( SysctlEntryStatusSkipped SysctlEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the SysctlEntryStatus enum. +func (e SysctlEntryStatus) Valid() bool { + switch e { + case SysctlEntryStatusFailed: + return true + case SysctlEntryStatusOk: + return true + case SysctlEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for SysctlMutationResultStatus. const ( SysctlMutationResultStatusFailed SysctlMutationResultStatus = "failed" @@ -443,6 +1271,20 @@ const ( SysctlMutationResultStatusSkipped SysctlMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the SysctlMutationResultStatus enum. +func (e SysctlMutationResultStatus) Valid() bool { + switch e { + case SysctlMutationResultStatusFailed: + return true + case SysctlMutationResultStatusOk: + return true + case SysctlMutationResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for TimezoneEntryStatus. const ( TimezoneEntryStatusFailed TimezoneEntryStatus = "failed" @@ -450,6 +1292,20 @@ const ( TimezoneEntryStatusSkipped TimezoneEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the TimezoneEntryStatus enum. +func (e TimezoneEntryStatus) Valid() bool { + switch e { + case TimezoneEntryStatusFailed: + return true + case TimezoneEntryStatusOk: + return true + case TimezoneEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for TimezoneMutationResultStatus. const ( TimezoneMutationResultStatusFailed TimezoneMutationResultStatus = "failed" @@ -457,6 +1313,20 @@ const ( TimezoneMutationResultStatusSkipped TimezoneMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the TimezoneMutationResultStatus enum. +func (e TimezoneMutationResultStatus) Valid() bool { + switch e { + case TimezoneMutationResultStatusFailed: + return true + case TimezoneMutationResultStatusOk: + return true + case TimezoneMutationResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for UpdateEntryStatus. const ( UpdateEntryStatusFailed UpdateEntryStatus = "failed" @@ -464,6 +1334,20 @@ const ( UpdateEntryStatusSkipped UpdateEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the UpdateEntryStatus enum. +func (e UpdateEntryStatus) Valid() bool { + switch e { + case UpdateEntryStatusFailed: + return true + case UpdateEntryStatusOk: + return true + case UpdateEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for UptimeResponseStatus. const ( UptimeResponseStatusFailed UptimeResponseStatus = "failed" @@ -471,6 +1355,20 @@ const ( UptimeResponseStatusSkipped UptimeResponseStatus = "skipped" ) +// Valid indicates whether the value is a known member of the UptimeResponseStatus enum. +func (e UptimeResponseStatus) Valid() bool { + switch e { + case UptimeResponseStatusFailed: + return true + case UptimeResponseStatusOk: + return true + case UptimeResponseStatusSkipped: + return true + default: + return false + } +} + // Defines values for UserEntryStatus. const ( UserEntryStatusFailed UserEntryStatus = "failed" @@ -478,6 +1376,20 @@ const ( UserEntryStatusSkipped UserEntryStatus = "skipped" ) +// Valid indicates whether the value is a known member of the UserEntryStatus enum. +func (e UserEntryStatus) Valid() bool { + switch e { + case UserEntryStatusFailed: + return true + case UserEntryStatusOk: + return true + case UserEntryStatusSkipped: + return true + default: + return false + } +} + // Defines values for UserMutationResultStatus. const ( UserMutationResultStatusFailed UserMutationResultStatus = "failed" @@ -485,12 +1397,38 @@ const ( UserMutationResultStatusSkipped UserMutationResultStatus = "skipped" ) +// Valid indicates whether the value is a known member of the UserMutationResultStatus enum. +func (e UserMutationResultStatus) Valid() bool { + switch e { + case UserMutationResultStatusFailed: + return true + case UserMutationResultStatusOk: + return true + case UserMutationResultStatusSkipped: + return true + default: + return false + } +} + // Defines values for PostFileMultipartBodyContentType. const ( PostFileMultipartBodyContentTypeRaw PostFileMultipartBodyContentType = "raw" PostFileMultipartBodyContentTypeTemplate PostFileMultipartBodyContentType = "template" ) +// Valid indicates whether the value is a known member of the PostFileMultipartBodyContentType enum. +func (e PostFileMultipartBodyContentType) Valid() bool { + switch e { + case PostFileMultipartBodyContentTypeRaw: + return true + case PostFileMultipartBodyContentTypeTemplate: + return true + default: + return false + } +} + // Defines values for GetJobsParamsStatus. const ( GetJobsParamsStatusCompleted GetJobsParamsStatus = "completed" @@ -500,6 +1438,24 @@ const ( GetJobsParamsStatusSubmitted GetJobsParamsStatus = "submitted" ) +// Valid indicates whether the value is a known member of the GetJobsParamsStatus enum. +func (e GetJobsParamsStatus) Valid() bool { + switch e { + case GetJobsParamsStatusCompleted: + return true + case GetJobsParamsStatusFailed: + return true + case GetJobsParamsStatusPartialFailure: + return true + case GetJobsParamsStatusProcessing: + return true + case GetJobsParamsStatusSubmitted: + return true + default: + return false + } +} + // Defines values for GetNodeContainerDockerParamsState. const ( All GetNodeContainerDockerParamsState = "all" @@ -507,6 +1463,20 @@ const ( Stopped GetNodeContainerDockerParamsState = "stopped" ) +// Valid indicates whether the value is a known member of the GetNodeContainerDockerParamsState enum. +func (e GetNodeContainerDockerParamsState) Valid() bool { + switch e { + case All: + return true + case Running: + return true + case Stopped: + return true + default: + return false + } +} + // AgentDetail defines model for AgentDetail. type AgentDetail struct { // Hostname Agent hostname. @@ -1960,7 +2930,7 @@ type JobDetailResponse struct { } `json:"agent_states,omitempty"` // Changed Whether the operation modified system state. Null for pending/failed jobs; true/false for completed jobs. - Changed *bool `json:"changed"` + Changed *bool `json:"changed,omitempty"` // Created Creation timestamp. Created *string `json:"created,omitempty"` @@ -1979,7 +2949,7 @@ type JobDetailResponse struct { // Responses Per-agent response data for broadcast jobs. Responses *map[string]struct { - Changed *bool `json:"changed"` + Changed *bool `json:"changed,omitempty"` // Data Agent result data. Data interface{} `json:"data,omitempty"` @@ -3545,6 +4515,9 @@ type UnitName = string // UserName defines model for UserName. type UserName = string +// bearerAuthContextKey is the context key for BearerAuth security scheme +type bearerAuthContextKey string + // AcceptAgentParams defines parameters for AcceptAgent. type AcceptAgentParams struct { // Fingerprint Accept by fingerprint instead of hostname. @@ -6178,7 +7151,7 @@ func NewGetAgentsRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6205,7 +7178,7 @@ func NewGetAgentsPendingRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6219,7 +7192,7 @@ func NewGetAgentDetailsRequest(server string, hostname string) (*http.Request, e var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -6239,7 +7212,7 @@ func NewGetAgentDetailsRequest(server string, hostname string) (*http.Request, e return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6253,7 +7226,7 @@ func NewAcceptAgentRequest(server string, hostname string, params *AcceptAgentPa var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -6274,28 +7247,33 @@ func NewAcceptAgentRequest(server string, hostname string, params *AcceptAgentPa } if params != nil { + // queryValues collects non-styled parameters (passthrough, JSON) + // that are safe to round-trip through url.Values.Encode(). queryValues := queryURL.Query() + // rawQueryFragments collects pre-encoded query fragments from + // styled parameters, preserving literal commas as delimiters + // per the OpenAPI spec (e.g. "color=blue,black,brown"). + var rawQueryFragments []string if params.Fingerprint != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "fingerprint", runtime.ParamLocationQuery, *params.Fingerprint); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "fingerprint", *params.Fingerprint, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } } - queryURL.RawQuery = queryValues.Encode() + if encoded := queryValues.Encode(); encoded != "" { + rawQueryFragments = append(rawQueryFragments, encoded) + } + queryURL.RawQuery = strings.Join(rawQueryFragments, "&") } - req, err := http.NewRequest("POST", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), nil) if err != nil { return nil, err } @@ -6309,7 +7287,7 @@ func NewDrainAgentRequest(server string, hostname string) (*http.Request, error) var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -6329,7 +7307,7 @@ func NewDrainAgentRequest(server string, hostname string) (*http.Request, error) return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), nil) if err != nil { return nil, err } @@ -6343,7 +7321,7 @@ func NewRejectAgentRequest(server string, hostname string) (*http.Request, error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -6363,7 +7341,7 @@ func NewRejectAgentRequest(server string, hostname string) (*http.Request, error return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), nil) if err != nil { return nil, err } @@ -6377,7 +7355,7 @@ func NewUndrainAgentRequest(server string, hostname string) (*http.Request, erro var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -6397,7 +7375,7 @@ func NewUndrainAgentRequest(server string, hostname string) (*http.Request, erro return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), nil) if err != nil { return nil, err } @@ -6425,19 +7403,21 @@ func NewGetAuditLogsRequest(server string, params *GetAuditLogsParams) (*http.Re } if params != nil { + // queryValues collects non-styled parameters (passthrough, JSON) + // that are safe to round-trip through url.Values.Encode(). queryValues := queryURL.Query() + // rawQueryFragments collects pre-encoded query fragments from + // styled parameters, preserving literal commas as delimiters + // per the OpenAPI spec (e.g. "color=blue,black,brown"). + var rawQueryFragments []string if params.Limit != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "limit", runtime.ParamLocationQuery, *params.Limit); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "limit", *params.Limit, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "integer", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } @@ -6445,24 +7425,23 @@ func NewGetAuditLogsRequest(server string, params *GetAuditLogsParams) (*http.Re if params.Offset != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "offset", runtime.ParamLocationQuery, *params.Offset); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "offset", *params.Offset, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "integer", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } } - queryURL.RawQuery = queryValues.Encode() + if encoded := queryValues.Encode(); encoded != "" { + rawQueryFragments = append(rawQueryFragments, encoded) + } + queryURL.RawQuery = strings.Join(rawQueryFragments, "&") } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6489,7 +7468,7 @@ func NewGetAuditExportRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6503,7 +7482,7 @@ func NewGetAuditLogByIDRequest(server string, id openapi_types.UUID) (*http.Requ var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: "uuid"}) if err != nil { return nil, err } @@ -6523,7 +7502,7 @@ func NewGetAuditLogByIDRequest(server string, id openapi_types.UUID) (*http.Requ return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6550,7 +7529,7 @@ func NewGetFactKeysRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6577,7 +7556,7 @@ func NewGetFilesRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6605,28 +7584,33 @@ func NewPostFileRequestWithBody(server string, params *PostFileParams, contentTy } if params != nil { + // queryValues collects non-styled parameters (passthrough, JSON) + // that are safe to round-trip through url.Values.Encode(). queryValues := queryURL.Query() + // rawQueryFragments collects pre-encoded query fragments from + // styled parameters, preserving literal commas as delimiters + // per the OpenAPI spec (e.g. "color=blue,black,brown"). + var rawQueryFragments []string if params.Force != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "force", runtime.ParamLocationQuery, *params.Force); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "force", *params.Force, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "boolean", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } } - queryURL.RawQuery = queryValues.Encode() + if encoded := queryValues.Encode(); encoded != "" { + rawQueryFragments = append(rawQueryFragments, encoded) + } + queryURL.RawQuery = strings.Join(rawQueryFragments, "&") } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -6655,7 +7639,7 @@ func NewGetFileStaleRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6669,7 +7653,7 @@ func NewDeleteFileByNameRequest(server string, name FileName) (*http.Request, er var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -6689,7 +7673,7 @@ func NewDeleteFileByNameRequest(server string, name FileName) (*http.Request, er return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -6703,7 +7687,7 @@ func NewGetFileByNameRequest(server string, name FileName) (*http.Request, error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -6723,7 +7707,7 @@ func NewGetFileByNameRequest(server string, name FileName) (*http.Request, error return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6750,7 +7734,7 @@ func NewGetHealthRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6777,7 +7761,7 @@ func NewGetHealthReadyRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6804,7 +7788,7 @@ func NewGetHealthStatusRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6832,19 +7816,21 @@ func NewGetJobsRequest(server string, params *GetJobsParams) (*http.Request, err } if params != nil { + // queryValues collects non-styled parameters (passthrough, JSON) + // that are safe to round-trip through url.Values.Encode(). queryValues := queryURL.Query() + // rawQueryFragments collects pre-encoded query fragments from + // styled parameters, preserving literal commas as delimiters + // per the OpenAPI spec (e.g. "color=blue,black,brown"). + var rawQueryFragments []string if params.Status != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "status", runtime.ParamLocationQuery, *params.Status); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "status", *params.Status, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } @@ -6852,15 +7838,11 @@ func NewGetJobsRequest(server string, params *GetJobsParams) (*http.Request, err if params.Limit != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "limit", runtime.ParamLocationQuery, *params.Limit); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "limit", *params.Limit, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "integer", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } @@ -6868,24 +7850,23 @@ func NewGetJobsRequest(server string, params *GetJobsParams) (*http.Request, err if params.Offset != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "offset", runtime.ParamLocationQuery, *params.Offset); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "offset", *params.Offset, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "integer", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } } - queryURL.RawQuery = queryValues.Encode() + if encoded := queryValues.Encode(); encoded != "" { + rawQueryFragments = append(rawQueryFragments, encoded) + } + queryURL.RawQuery = strings.Join(rawQueryFragments, "&") } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6899,7 +7880,7 @@ func NewDeleteJobByIDRequest(server string, id openapi_types.UUID) (*http.Reques var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: "uuid"}) if err != nil { return nil, err } @@ -6919,7 +7900,7 @@ func NewDeleteJobByIDRequest(server string, id openapi_types.UUID) (*http.Reques return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -6933,7 +7914,7 @@ func NewGetJobByIDRequest(server string, id openapi_types.UUID) (*http.Request, var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: "uuid"}) if err != nil { return nil, err } @@ -6953,7 +7934,7 @@ func NewGetJobByIDRequest(server string, id openapi_types.UUID) (*http.Request, return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -6978,7 +7959,7 @@ func NewRetryJobByIDRequestWithBody(server string, id openapi_types.UUID, conten var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: "uuid"}) if err != nil { return nil, err } @@ -6998,7 +7979,7 @@ func NewRetryJobByIDRequestWithBody(server string, id openapi_types.UUID, conten return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -7014,7 +7995,7 @@ func NewGetNodeStatusRequest(server string, hostname Hostname) (*http.Request, e var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7034,7 +8015,7 @@ func NewGetNodeStatusRequest(server string, hostname Hostname) (*http.Request, e return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -7048,7 +8029,7 @@ func NewGetNodeCertificateCaRequest(server string, hostname Hostname) (*http.Req var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7068,7 +8049,7 @@ func NewGetNodeCertificateCaRequest(server string, hostname Hostname) (*http.Req return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -7093,7 +8074,7 @@ func NewPostNodeCertificateCaRequestWithBody(server string, hostname Hostname, c var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7113,7 +8094,7 @@ func NewPostNodeCertificateCaRequestWithBody(server string, hostname Hostname, c return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -7129,14 +8110,14 @@ func NewDeleteNodeCertificateCaRequest(server string, hostname Hostname, name Ce var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7156,7 +8137,7 @@ func NewDeleteNodeCertificateCaRequest(server string, hostname Hostname, name Ce return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -7181,14 +8162,14 @@ func NewPutNodeCertificateCaRequestWithBody(server string, hostname Hostname, na var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7208,7 +8189,7 @@ func NewPutNodeCertificateCaRequestWithBody(server string, hostname Hostname, na return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPut, queryURL.String(), body) if err != nil { return nil, err } @@ -7235,7 +8216,7 @@ func NewPostNodeCommandExecRequestWithBody(server string, hostname Hostname, con var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7255,7 +8236,7 @@ func NewPostNodeCommandExecRequestWithBody(server string, hostname Hostname, con return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -7282,7 +8263,7 @@ func NewPostNodeCommandShellRequestWithBody(server string, hostname Hostname, co var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7302,7 +8283,7 @@ func NewPostNodeCommandShellRequestWithBody(server string, hostname Hostname, co return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -7318,7 +8299,7 @@ func NewGetNodeContainerDockerRequest(server string, hostname Hostname, params * var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7339,19 +8320,21 @@ func NewGetNodeContainerDockerRequest(server string, hostname Hostname, params * } if params != nil { + // queryValues collects non-styled parameters (passthrough, JSON) + // that are safe to round-trip through url.Values.Encode(). queryValues := queryURL.Query() + // rawQueryFragments collects pre-encoded query fragments from + // styled parameters, preserving literal commas as delimiters + // per the OpenAPI spec (e.g. "color=blue,black,brown"). + var rawQueryFragments []string if params.State != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "state", runtime.ParamLocationQuery, *params.State); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "state", *params.State, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } @@ -7359,24 +8342,23 @@ func NewGetNodeContainerDockerRequest(server string, hostname Hostname, params * if params.Limit != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "limit", runtime.ParamLocationQuery, *params.Limit); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "limit", *params.Limit, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "integer", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } } - queryURL.RawQuery = queryValues.Encode() + if encoded := queryValues.Encode(); encoded != "" { + rawQueryFragments = append(rawQueryFragments, encoded) + } + queryURL.RawQuery = strings.Join(rawQueryFragments, "&") } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -7401,7 +8383,7 @@ func NewPostNodeContainerDockerRequestWithBody(server string, hostname Hostname, var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7421,7 +8403,7 @@ func NewPostNodeContainerDockerRequestWithBody(server string, hostname Hostname, return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -7437,14 +8419,14 @@ func NewDeleteNodeContainerDockerImageRequest(server string, hostname Hostname, var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "image", runtime.ParamLocationPath, image) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "image", image, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7465,28 +8447,33 @@ func NewDeleteNodeContainerDockerImageRequest(server string, hostname Hostname, } if params != nil { + // queryValues collects non-styled parameters (passthrough, JSON) + // that are safe to round-trip through url.Values.Encode(). queryValues := queryURL.Query() + // rawQueryFragments collects pre-encoded query fragments from + // styled parameters, preserving literal commas as delimiters + // per the OpenAPI spec (e.g. "color=blue,black,brown"). + var rawQueryFragments []string if params.Force != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "force", runtime.ParamLocationQuery, *params.Force); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "force", *params.Force, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "boolean", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } } - queryURL.RawQuery = queryValues.Encode() + if encoded := queryValues.Encode(); encoded != "" { + rawQueryFragments = append(rawQueryFragments, encoded) + } + queryURL.RawQuery = strings.Join(rawQueryFragments, "&") } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -7511,7 +8498,7 @@ func NewPostNodeContainerDockerPullRequestWithBody(server string, hostname Hostn var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7531,7 +8518,7 @@ func NewPostNodeContainerDockerPullRequestWithBody(server string, hostname Hostn return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -7547,14 +8534,14 @@ func NewDeleteNodeContainerDockerByIDRequest(server string, hostname Hostname, i var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7575,28 +8562,33 @@ func NewDeleteNodeContainerDockerByIDRequest(server string, hostname Hostname, i } if params != nil { + // queryValues collects non-styled parameters (passthrough, JSON) + // that are safe to round-trip through url.Values.Encode(). queryValues := queryURL.Query() + // rawQueryFragments collects pre-encoded query fragments from + // styled parameters, preserving literal commas as delimiters + // per the OpenAPI spec (e.g. "color=blue,black,brown"). + var rawQueryFragments []string if params.Force != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "force", runtime.ParamLocationQuery, *params.Force); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "force", *params.Force, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "boolean", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } } - queryURL.RawQuery = queryValues.Encode() + if encoded := queryValues.Encode(); encoded != "" { + rawQueryFragments = append(rawQueryFragments, encoded) + } + queryURL.RawQuery = strings.Join(rawQueryFragments, "&") } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -7610,14 +8602,14 @@ func NewGetNodeContainerDockerByIDRequest(server string, hostname Hostname, id D var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7637,7 +8629,7 @@ func NewGetNodeContainerDockerByIDRequest(server string, hostname Hostname, id D return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -7662,14 +8654,14 @@ func NewPostNodeContainerDockerExecRequestWithBody(server string, hostname Hostn var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7689,7 +8681,7 @@ func NewPostNodeContainerDockerExecRequestWithBody(server string, hostname Hostn return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -7705,14 +8697,14 @@ func NewPostNodeContainerDockerStartRequest(server string, hostname Hostname, id var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7732,7 +8724,7 @@ func NewPostNodeContainerDockerStartRequest(server string, hostname Hostname, id return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), nil) if err != nil { return nil, err } @@ -7757,14 +8749,14 @@ func NewPostNodeContainerDockerStopRequestWithBody(server string, hostname Hostn var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7784,7 +8776,7 @@ func NewPostNodeContainerDockerStopRequestWithBody(server string, hostname Hostn return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -7800,7 +8792,7 @@ func NewGetNodeDiskRequest(server string, hostname Hostname) (*http.Request, err var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7820,7 +8812,7 @@ func NewGetNodeDiskRequest(server string, hostname Hostname) (*http.Request, err return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -7845,7 +8837,7 @@ func NewPostNodeFileDeployRequestWithBody(server string, hostname Hostname, cont var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7865,7 +8857,7 @@ func NewPostNodeFileDeployRequestWithBody(server string, hostname Hostname, cont return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -7892,7 +8884,7 @@ func NewPostNodeFileStatusRequestWithBody(server string, hostname Hostname, cont var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7912,7 +8904,7 @@ func NewPostNodeFileStatusRequestWithBody(server string, hostname Hostname, cont return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -7939,7 +8931,7 @@ func NewPostNodeFileUndeployRequestWithBody(server string, hostname Hostname, co var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7959,7 +8951,7 @@ func NewPostNodeFileUndeployRequestWithBody(server string, hostname Hostname, co return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -7975,7 +8967,7 @@ func NewGetNodeGroupRequest(server string, hostname Hostname) (*http.Request, er var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -7995,7 +8987,7 @@ func NewGetNodeGroupRequest(server string, hostname Hostname) (*http.Request, er return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -8020,7 +9012,7 @@ func NewPostNodeGroupRequestWithBody(server string, hostname Hostname, contentTy var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8040,7 +9032,7 @@ func NewPostNodeGroupRequestWithBody(server string, hostname Hostname, contentTy return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -8056,14 +9048,14 @@ func NewDeleteNodeGroupRequest(server string, hostname Hostname, name GroupName) var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8083,7 +9075,7 @@ func NewDeleteNodeGroupRequest(server string, hostname Hostname, name GroupName) return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -8097,14 +9089,14 @@ func NewGetNodeGroupByNameRequest(server string, hostname Hostname, name GroupNa var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8124,7 +9116,7 @@ func NewGetNodeGroupByNameRequest(server string, hostname Hostname, name GroupNa return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -8149,14 +9141,14 @@ func NewPutNodeGroupRequestWithBody(server string, hostname Hostname, name Group var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8176,7 +9168,7 @@ func NewPutNodeGroupRequestWithBody(server string, hostname Hostname, name Group return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPut, queryURL.String(), body) if err != nil { return nil, err } @@ -8192,7 +9184,7 @@ func NewGetNodeHostnameRequest(server string, hostname Hostname) (*http.Request, var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8212,7 +9204,7 @@ func NewGetNodeHostnameRequest(server string, hostname Hostname) (*http.Request, return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -8237,7 +9229,7 @@ func NewPutNodeHostnameRequestWithBody(server string, hostname Hostname, content var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8257,7 +9249,7 @@ func NewPutNodeHostnameRequestWithBody(server string, hostname Hostname, content return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPut, queryURL.String(), body) if err != nil { return nil, err } @@ -8273,7 +9265,7 @@ func NewGetNodeLoadRequest(server string, hostname Hostname) (*http.Request, err var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8293,7 +9285,7 @@ func NewGetNodeLoadRequest(server string, hostname Hostname) (*http.Request, err return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -8307,7 +9299,7 @@ func NewGetNodeLogRequest(server string, hostname Hostname, params *GetNodeLogPa var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8328,19 +9320,21 @@ func NewGetNodeLogRequest(server string, hostname Hostname, params *GetNodeLogPa } if params != nil { + // queryValues collects non-styled parameters (passthrough, JSON) + // that are safe to round-trip through url.Values.Encode(). queryValues := queryURL.Query() + // rawQueryFragments collects pre-encoded query fragments from + // styled parameters, preserving literal commas as delimiters + // per the OpenAPI spec (e.g. "color=blue,black,brown"). + var rawQueryFragments []string if params.Lines != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "lines", runtime.ParamLocationQuery, *params.Lines); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "lines", *params.Lines, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "integer", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } @@ -8348,15 +9342,11 @@ func NewGetNodeLogRequest(server string, hostname Hostname, params *GetNodeLogPa if params.Since != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "since", runtime.ParamLocationQuery, *params.Since); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "since", *params.Since, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } @@ -8364,24 +9354,23 @@ func NewGetNodeLogRequest(server string, hostname Hostname, params *GetNodeLogPa if params.Priority != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "priority", runtime.ParamLocationQuery, *params.Priority); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "priority", *params.Priority, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } } - queryURL.RawQuery = queryValues.Encode() + if encoded := queryValues.Encode(); encoded != "" { + rawQueryFragments = append(rawQueryFragments, encoded) + } + queryURL.RawQuery = strings.Join(rawQueryFragments, "&") } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -8395,7 +9384,7 @@ func NewGetNodeLogSourceRequest(server string, hostname Hostname) (*http.Request var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8415,7 +9404,7 @@ func NewGetNodeLogSourceRequest(server string, hostname Hostname) (*http.Request return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -8429,14 +9418,14 @@ func NewGetNodeLogUnitRequest(server string, hostname Hostname, name UnitName, p var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8457,19 +9446,21 @@ func NewGetNodeLogUnitRequest(server string, hostname Hostname, name UnitName, p } if params != nil { + // queryValues collects non-styled parameters (passthrough, JSON) + // that are safe to round-trip through url.Values.Encode(). queryValues := queryURL.Query() + // rawQueryFragments collects pre-encoded query fragments from + // styled parameters, preserving literal commas as delimiters + // per the OpenAPI spec (e.g. "color=blue,black,brown"). + var rawQueryFragments []string if params.Lines != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "lines", runtime.ParamLocationQuery, *params.Lines); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "lines", *params.Lines, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "integer", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } @@ -8477,15 +9468,11 @@ func NewGetNodeLogUnitRequest(server string, hostname Hostname, name UnitName, p if params.Since != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "since", runtime.ParamLocationQuery, *params.Since); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "since", *params.Since, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } @@ -8493,24 +9480,23 @@ func NewGetNodeLogUnitRequest(server string, hostname Hostname, name UnitName, p if params.Priority != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "priority", runtime.ParamLocationQuery, *params.Priority); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "priority", *params.Priority, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } + for _, qp := range strings.Split(queryFrag, "&") { + rawQueryFragments = append(rawQueryFragments, qp) } } } - queryURL.RawQuery = queryValues.Encode() + if encoded := queryValues.Encode(); encoded != "" { + rawQueryFragments = append(rawQueryFragments, encoded) + } + queryURL.RawQuery = strings.Join(rawQueryFragments, "&") } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -8524,7 +9510,7 @@ func NewGetNodeMemoryRequest(server string, hostname Hostname) (*http.Request, e var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8544,7 +9530,7 @@ func NewGetNodeMemoryRequest(server string, hostname Hostname) (*http.Request, e return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -8569,7 +9555,7 @@ func NewDeleteNodeNetworkDNSRequestWithBody(server string, hostname Hostname, co var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8589,7 +9575,7 @@ func NewDeleteNodeNetworkDNSRequestWithBody(server string, hostname Hostname, co return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), body) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), body) if err != nil { return nil, err } @@ -8616,7 +9602,7 @@ func NewPutNodeNetworkDNSRequestWithBody(server string, hostname Hostname, conte var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8636,7 +9622,7 @@ func NewPutNodeNetworkDNSRequestWithBody(server string, hostname Hostname, conte return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPut, queryURL.String(), body) if err != nil { return nil, err } @@ -8652,14 +9638,14 @@ func NewGetNodeNetworkDNSByInterfaceRequest(server string, hostname Hostname, in var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "interfaceName", runtime.ParamLocationPath, interfaceName) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "interfaceName", interfaceName, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8679,7 +9665,7 @@ func NewGetNodeNetworkDNSByInterfaceRequest(server string, hostname Hostname, in return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -8693,7 +9679,7 @@ func NewGetNodeNetworkInterfaceRequest(server string, hostname Hostname) (*http. var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8713,7 +9699,7 @@ func NewGetNodeNetworkInterfaceRequest(server string, hostname Hostname) (*http. return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -8727,14 +9713,14 @@ func NewDeleteNodeNetworkInterfaceRequest(server string, hostname Hostname, name var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8754,7 +9740,7 @@ func NewDeleteNodeNetworkInterfaceRequest(server string, hostname Hostname, name return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -8768,14 +9754,14 @@ func NewGetNodeNetworkInterfaceByNameRequest(server string, hostname Hostname, n var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8795,7 +9781,7 @@ func NewGetNodeNetworkInterfaceByNameRequest(server string, hostname Hostname, n return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -8820,14 +9806,14 @@ func NewPostNodeNetworkInterfaceRequestWithBody(server string, hostname Hostname var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8847,7 +9833,7 @@ func NewPostNodeNetworkInterfaceRequestWithBody(server string, hostname Hostname return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -8874,14 +9860,14 @@ func NewPutNodeNetworkInterfaceRequestWithBody(server string, hostname Hostname, var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8901,7 +9887,7 @@ func NewPutNodeNetworkInterfaceRequestWithBody(server string, hostname Hostname, return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPut, queryURL.String(), body) if err != nil { return nil, err } @@ -8928,7 +9914,7 @@ func NewPostNodeNetworkPingRequestWithBody(server string, hostname Hostname, con var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8948,7 +9934,7 @@ func NewPostNodeNetworkPingRequestWithBody(server string, hostname Hostname, con return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -8964,7 +9950,7 @@ func NewGetNodeNetworkRouteRequest(server string, hostname Hostname) (*http.Requ var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -8984,7 +9970,7 @@ func NewGetNodeNetworkRouteRequest(server string, hostname Hostname) (*http.Requ return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -8998,14 +9984,14 @@ func NewDeleteNodeNetworkRouteRequest(server string, hostname Hostname, interfac var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "interfaceName", runtime.ParamLocationPath, interfaceName) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "interfaceName", interfaceName, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9025,7 +10011,7 @@ func NewDeleteNodeNetworkRouteRequest(server string, hostname Hostname, interfac return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -9039,14 +10025,14 @@ func NewGetNodeNetworkRouteByInterfaceRequest(server string, hostname Hostname, var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "interfaceName", runtime.ParamLocationPath, interfaceName) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "interfaceName", interfaceName, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9066,7 +10052,7 @@ func NewGetNodeNetworkRouteByInterfaceRequest(server string, hostname Hostname, return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -9091,14 +10077,14 @@ func NewPostNodeNetworkRouteRequestWithBody(server string, hostname Hostname, in var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "interfaceName", runtime.ParamLocationPath, interfaceName) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "interfaceName", interfaceName, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9118,7 +10104,7 @@ func NewPostNodeNetworkRouteRequestWithBody(server string, hostname Hostname, in return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -9145,14 +10131,14 @@ func NewPutNodeNetworkRouteRequestWithBody(server string, hostname Hostname, int var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "interfaceName", runtime.ParamLocationPath, interfaceName) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "interfaceName", interfaceName, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9172,7 +10158,7 @@ func NewPutNodeNetworkRouteRequestWithBody(server string, hostname Hostname, int return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPut, queryURL.String(), body) if err != nil { return nil, err } @@ -9188,7 +10174,7 @@ func NewDeleteNodeNtpRequest(server string, hostname Hostname) (*http.Request, e var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9208,7 +10194,7 @@ func NewDeleteNodeNtpRequest(server string, hostname Hostname) (*http.Request, e return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -9222,7 +10208,7 @@ func NewGetNodeNtpRequest(server string, hostname Hostname) (*http.Request, erro var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9242,7 +10228,7 @@ func NewGetNodeNtpRequest(server string, hostname Hostname) (*http.Request, erro return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -9267,7 +10253,7 @@ func NewPostNodeNtpRequestWithBody(server string, hostname Hostname, contentType var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9287,7 +10273,7 @@ func NewPostNodeNtpRequestWithBody(server string, hostname Hostname, contentType return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -9314,7 +10300,7 @@ func NewPutNodeNtpRequestWithBody(server string, hostname Hostname, contentType var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9334,7 +10320,7 @@ func NewPutNodeNtpRequestWithBody(server string, hostname Hostname, contentType return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPut, queryURL.String(), body) if err != nil { return nil, err } @@ -9350,7 +10336,7 @@ func NewGetNodeOSRequest(server string, hostname Hostname) (*http.Request, error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9370,7 +10356,7 @@ func NewGetNodeOSRequest(server string, hostname Hostname) (*http.Request, error return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -9384,7 +10370,7 @@ func NewGetNodePackageRequest(server string, hostname Hostname) (*http.Request, var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9404,7 +10390,7 @@ func NewGetNodePackageRequest(server string, hostname Hostname) (*http.Request, return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -9429,7 +10415,7 @@ func NewPostNodePackageRequestWithBody(server string, hostname Hostname, content var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9449,7 +10435,7 @@ func NewPostNodePackageRequestWithBody(server string, hostname Hostname, content return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -9465,7 +10451,7 @@ func NewGetNodePackageUpdateRequest(server string, hostname Hostname) (*http.Req var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9485,7 +10471,7 @@ func NewGetNodePackageUpdateRequest(server string, hostname Hostname) (*http.Req return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -9499,7 +10485,7 @@ func NewPostNodePackageUpdateRequest(server string, hostname Hostname) (*http.Re var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9519,7 +10505,7 @@ func NewPostNodePackageUpdateRequest(server string, hostname Hostname) (*http.Re return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), nil) if err != nil { return nil, err } @@ -9533,14 +10519,14 @@ func NewDeleteNodePackageRequest(server string, hostname Hostname, name PackageN var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9560,7 +10546,7 @@ func NewDeleteNodePackageRequest(server string, hostname Hostname, name PackageN return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -9574,14 +10560,14 @@ func NewGetNodePackageByNameRequest(server string, hostname Hostname, name Packa var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9601,7 +10587,7 @@ func NewGetNodePackageByNameRequest(server string, hostname Hostname, name Packa return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -9626,7 +10612,7 @@ func NewPostNodePowerRebootRequestWithBody(server string, hostname Hostname, con var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9646,7 +10632,7 @@ func NewPostNodePowerRebootRequestWithBody(server string, hostname Hostname, con return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -9673,7 +10659,7 @@ func NewPostNodePowerShutdownRequestWithBody(server string, hostname Hostname, c var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9693,7 +10679,7 @@ func NewPostNodePowerShutdownRequestWithBody(server string, hostname Hostname, c return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -9709,7 +10695,7 @@ func NewGetNodeProcessRequest(server string, hostname Hostname) (*http.Request, var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9729,7 +10715,7 @@ func NewGetNodeProcessRequest(server string, hostname Hostname) (*http.Request, return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -9743,14 +10729,14 @@ func NewGetNodeProcessByPidRequest(server string, hostname Hostname, pid Pid) (* var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "pid", runtime.ParamLocationPath, pid) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "pid", pid, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "integer", Format: ""}) if err != nil { return nil, err } @@ -9770,7 +10756,7 @@ func NewGetNodeProcessByPidRequest(server string, hostname Hostname, pid Pid) (* return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -9795,14 +10781,14 @@ func NewPostNodeProcessSignalRequestWithBody(server string, hostname Hostname, p var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "pid", runtime.ParamLocationPath, pid) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "pid", pid, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "integer", Format: ""}) if err != nil { return nil, err } @@ -9822,7 +10808,7 @@ func NewPostNodeProcessSignalRequestWithBody(server string, hostname Hostname, p return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -9838,7 +10824,7 @@ func NewGetNodeScheduleCronRequest(server string, hostname Hostname) (*http.Requ var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9858,7 +10844,7 @@ func NewGetNodeScheduleCronRequest(server string, hostname Hostname) (*http.Requ return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -9883,7 +10869,7 @@ func NewPostNodeScheduleCronRequestWithBody(server string, hostname Hostname, co var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9903,7 +10889,7 @@ func NewPostNodeScheduleCronRequestWithBody(server string, hostname Hostname, co return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -9919,14 +10905,14 @@ func NewDeleteNodeScheduleCronRequest(server string, hostname Hostname, name Cro var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9946,7 +10932,7 @@ func NewDeleteNodeScheduleCronRequest(server string, hostname Hostname, name Cro return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -9960,14 +10946,14 @@ func NewGetNodeScheduleCronByNameRequest(server string, hostname Hostname, name var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -9987,7 +10973,7 @@ func NewGetNodeScheduleCronByNameRequest(server string, hostname Hostname, name return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -10012,14 +10998,14 @@ func NewPutNodeScheduleCronRequestWithBody(server string, hostname Hostname, nam var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10039,7 +11025,7 @@ func NewPutNodeScheduleCronRequestWithBody(server string, hostname Hostname, nam return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPut, queryURL.String(), body) if err != nil { return nil, err } @@ -10055,7 +11041,7 @@ func NewGetNodeServiceRequest(server string, hostname Hostname) (*http.Request, var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10075,7 +11061,7 @@ func NewGetNodeServiceRequest(server string, hostname Hostname) (*http.Request, return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -10100,7 +11086,7 @@ func NewPostNodeServiceRequestWithBody(server string, hostname Hostname, content var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10120,7 +11106,7 @@ func NewPostNodeServiceRequestWithBody(server string, hostname Hostname, content return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -10136,14 +11122,14 @@ func NewDeleteNodeServiceRequest(server string, hostname Hostname, name ServiceN var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10163,7 +11149,7 @@ func NewDeleteNodeServiceRequest(server string, hostname Hostname, name ServiceN return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -10177,14 +11163,14 @@ func NewGetNodeServiceByNameRequest(server string, hostname Hostname, name Servi var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10204,7 +11190,7 @@ func NewGetNodeServiceByNameRequest(server string, hostname Hostname, name Servi return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -10229,14 +11215,14 @@ func NewPutNodeServiceRequestWithBody(server string, hostname Hostname, name Ser var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10256,7 +11242,7 @@ func NewPutNodeServiceRequestWithBody(server string, hostname Hostname, name Ser return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPut, queryURL.String(), body) if err != nil { return nil, err } @@ -10272,14 +11258,14 @@ func NewPostNodeServiceDisableRequest(server string, hostname Hostname, name Ser var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10299,7 +11285,7 @@ func NewPostNodeServiceDisableRequest(server string, hostname Hostname, name Ser return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), nil) if err != nil { return nil, err } @@ -10313,14 +11299,14 @@ func NewPostNodeServiceEnableRequest(server string, hostname Hostname, name Serv var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10340,7 +11326,7 @@ func NewPostNodeServiceEnableRequest(server string, hostname Hostname, name Serv return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), nil) if err != nil { return nil, err } @@ -10354,14 +11340,14 @@ func NewPostNodeServiceRestartRequest(server string, hostname Hostname, name Ser var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10381,7 +11367,7 @@ func NewPostNodeServiceRestartRequest(server string, hostname Hostname, name Ser return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), nil) if err != nil { return nil, err } @@ -10395,14 +11381,14 @@ func NewPostNodeServiceStartRequest(server string, hostname Hostname, name Servi var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10422,7 +11408,7 @@ func NewPostNodeServiceStartRequest(server string, hostname Hostname, name Servi return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), nil) if err != nil { return nil, err } @@ -10436,14 +11422,14 @@ func NewPostNodeServiceStopRequest(server string, hostname Hostname, name Servic var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10463,7 +11449,7 @@ func NewPostNodeServiceStopRequest(server string, hostname Hostname, name Servic return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), nil) if err != nil { return nil, err } @@ -10477,7 +11463,7 @@ func NewGetNodeSysctlRequest(server string, hostname Hostname) (*http.Request, e var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10497,7 +11483,7 @@ func NewGetNodeSysctlRequest(server string, hostname Hostname) (*http.Request, e return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -10522,7 +11508,7 @@ func NewPostNodeSysctlRequestWithBody(server string, hostname Hostname, contentT var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10542,7 +11528,7 @@ func NewPostNodeSysctlRequestWithBody(server string, hostname Hostname, contentT return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -10558,14 +11544,14 @@ func NewDeleteNodeSysctlRequest(server string, hostname Hostname, key SysctlKey) var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "key", runtime.ParamLocationPath, key) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "key", key, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10585,7 +11571,7 @@ func NewDeleteNodeSysctlRequest(server string, hostname Hostname, key SysctlKey) return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -10599,14 +11585,14 @@ func NewGetNodeSysctlByKeyRequest(server string, hostname Hostname, key SysctlKe var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "key", runtime.ParamLocationPath, key) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "key", key, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10626,7 +11612,7 @@ func NewGetNodeSysctlByKeyRequest(server string, hostname Hostname, key SysctlKe return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -10651,14 +11637,14 @@ func NewPutNodeSysctlRequestWithBody(server string, hostname Hostname, key Sysct var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "key", runtime.ParamLocationPath, key) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "key", key, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10678,7 +11664,7 @@ func NewPutNodeSysctlRequestWithBody(server string, hostname Hostname, key Sysct return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPut, queryURL.String(), body) if err != nil { return nil, err } @@ -10694,7 +11680,7 @@ func NewGetNodeTimezoneRequest(server string, hostname Hostname) (*http.Request, var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10714,7 +11700,7 @@ func NewGetNodeTimezoneRequest(server string, hostname Hostname) (*http.Request, return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -10739,7 +11725,7 @@ func NewPutNodeTimezoneRequestWithBody(server string, hostname Hostname, content var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10759,7 +11745,7 @@ func NewPutNodeTimezoneRequestWithBody(server string, hostname Hostname, content return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPut, queryURL.String(), body) if err != nil { return nil, err } @@ -10775,7 +11761,7 @@ func NewGetNodeUptimeRequest(server string, hostname Hostname) (*http.Request, e var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10795,7 +11781,7 @@ func NewGetNodeUptimeRequest(server string, hostname Hostname) (*http.Request, e return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -10809,7 +11795,7 @@ func NewGetNodeUserRequest(server string, hostname Hostname) (*http.Request, err var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10829,7 +11815,7 @@ func NewGetNodeUserRequest(server string, hostname Hostname) (*http.Request, err return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -10854,7 +11840,7 @@ func NewPostNodeUserRequestWithBody(server string, hostname Hostname, contentTyp var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10874,7 +11860,7 @@ func NewPostNodeUserRequestWithBody(server string, hostname Hostname, contentTyp return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -10890,14 +11876,14 @@ func NewDeleteNodeUserRequest(server string, hostname Hostname, name UserName) ( var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10917,7 +11903,7 @@ func NewDeleteNodeUserRequest(server string, hostname Hostname, name UserName) ( return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -10931,14 +11917,14 @@ func NewGetNodeUserByNameRequest(server string, hostname Hostname, name UserName var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -10958,7 +11944,7 @@ func NewGetNodeUserByNameRequest(server string, hostname Hostname, name UserName return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -10983,14 +11969,14 @@ func NewPutNodeUserRequestWithBody(server string, hostname Hostname, name UserNa var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -11010,7 +11996,7 @@ func NewPutNodeUserRequestWithBody(server string, hostname Hostname, name UserNa return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPut, queryURL.String(), body) if err != nil { return nil, err } @@ -11037,14 +12023,14 @@ func NewPostNodeUserPasswordRequestWithBody(server string, hostname Hostname, na var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -11064,7 +12050,7 @@ func NewPostNodeUserPasswordRequestWithBody(server string, hostname Hostname, na return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -11080,14 +12066,14 @@ func NewGetNodeUserSSHKeyRequest(server string, hostname Hostname, name UserName var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -11107,7 +12093,7 @@ func NewGetNodeUserSSHKeyRequest(server string, hostname Hostname, name UserName return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -11132,14 +12118,14 @@ func NewPostNodeUserSSHKeyRequestWithBody(server string, hostname Hostname, name var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -11159,7 +12145,7 @@ func NewPostNodeUserSSHKeyRequestWithBody(server string, hostname Hostname, name return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -11175,21 +12161,21 @@ func NewDeleteNodeUserSSHKeyRequest(server string, hostname Hostname, name UserN var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "hostname", runtime.ParamLocationPath, hostname) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "hostname", hostname, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam2 string - pathParam2, err = runtime.StyleParamWithLocation("simple", false, "fingerprint", runtime.ParamLocationPath, fingerprint) + pathParam2, err = runtime.StyleParamWithOptions("simple", false, "fingerprint", fingerprint, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -11209,7 +12195,7 @@ func NewDeleteNodeUserSSHKeyRequest(server string, hostname Hostname, name UserN return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodDelete, queryURL.String(), nil) if err != nil { return nil, err } @@ -11236,7 +12222,7 @@ func NewGetApiVersionRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -11745,6 +12731,14 @@ func (r GetAgentsResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetAgentsResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetAgentsPendingResponse struct { Body []byte HTTPResponse *http.Response @@ -11770,6 +12764,14 @@ func (r GetAgentsPendingResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetAgentsPendingResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetAgentDetailsResponse struct { Body []byte HTTPResponse *http.Response @@ -11797,6 +12799,14 @@ func (r GetAgentDetailsResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetAgentDetailsResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type AcceptAgentResponse struct { Body []byte HTTPResponse *http.Response @@ -11826,6 +12836,14 @@ func (r AcceptAgentResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r AcceptAgentResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DrainAgentResponse struct { Body []byte HTTPResponse *http.Response @@ -11855,6 +12873,14 @@ func (r DrainAgentResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DrainAgentResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type RejectAgentResponse struct { Body []byte HTTPResponse *http.Response @@ -11884,7 +12910,15 @@ func (r RejectAgentResponse) StatusCode() int { return 0 } -type UndrainAgentResponse struct { +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r RejectAgentResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + +type UndrainAgentResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { @@ -11913,6 +12947,14 @@ func (r UndrainAgentResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r UndrainAgentResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetAuditLogsResponse struct { Body []byte HTTPResponse *http.Response @@ -11939,6 +12981,14 @@ func (r GetAuditLogsResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetAuditLogsResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetAuditExportResponse struct { Body []byte HTTPResponse *http.Response @@ -11964,6 +13014,14 @@ func (r GetAuditExportResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetAuditExportResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetAuditLogByIDResponse struct { Body []byte HTTPResponse *http.Response @@ -11990,6 +13048,14 @@ func (r GetAuditLogByIDResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetAuditLogByIDResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetFactKeysResponse struct { Body []byte HTTPResponse *http.Response @@ -12015,6 +13081,14 @@ func (r GetFactKeysResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetFactKeysResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetFilesResponse struct { Body []byte HTTPResponse *http.Response @@ -12040,6 +13114,14 @@ func (r GetFilesResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetFilesResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostFileResponse struct { Body []byte HTTPResponse *http.Response @@ -12067,6 +13149,14 @@ func (r PostFileResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostFileResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetFileStaleResponse struct { Body []byte HTTPResponse *http.Response @@ -12092,6 +13182,14 @@ func (r GetFileStaleResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetFileStaleResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteFileByNameResponse struct { Body []byte HTTPResponse *http.Response @@ -12119,6 +13217,14 @@ func (r DeleteFileByNameResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteFileByNameResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetFileByNameResponse struct { Body []byte HTTPResponse *http.Response @@ -12146,6 +13252,14 @@ func (r GetFileByNameResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetFileByNameResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetHealthResponse struct { Body []byte HTTPResponse *http.Response @@ -12168,6 +13282,14 @@ func (r GetHealthResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetHealthResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetHealthReadyResponse struct { Body []byte HTTPResponse *http.Response @@ -12191,6 +13313,14 @@ func (r GetHealthReadyResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetHealthReadyResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetHealthStatusResponse struct { Body []byte HTTPResponse *http.Response @@ -12216,6 +13346,14 @@ func (r GetHealthStatusResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetHealthStatusResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetJobsResponse struct { Body []byte HTTPResponse *http.Response @@ -12242,6 +13380,14 @@ func (r GetJobsResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetJobsResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteJobByIDResponse struct { Body []byte HTTPResponse *http.Response @@ -12268,6 +13414,14 @@ func (r DeleteJobByIDResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteJobByIDResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetJobByIDResponse struct { Body []byte HTTPResponse *http.Response @@ -12295,6 +13449,14 @@ func (r GetJobByIDResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetJobByIDResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type RetryJobByIDResponse struct { Body []byte HTTPResponse *http.Response @@ -12322,6 +13484,14 @@ func (r RetryJobByIDResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r RetryJobByIDResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeStatusResponse struct { Body []byte HTTPResponse *http.Response @@ -12348,6 +13518,14 @@ func (r GetNodeStatusResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeStatusResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeCertificateCaResponse struct { Body []byte HTTPResponse *http.Response @@ -12374,6 +13552,14 @@ func (r GetNodeCertificateCaResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeCertificateCaResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeCertificateCaResponse struct { Body []byte HTTPResponse *http.Response @@ -12400,6 +13586,14 @@ func (r PostNodeCertificateCaResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeCertificateCaResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodeCertificateCaResponse struct { Body []byte HTTPResponse *http.Response @@ -12426,6 +13620,14 @@ func (r DeleteNodeCertificateCaResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodeCertificateCaResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PutNodeCertificateCaResponse struct { Body []byte HTTPResponse *http.Response @@ -12453,6 +13655,14 @@ func (r PutNodeCertificateCaResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PutNodeCertificateCaResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeCommandExecResponse struct { Body []byte HTTPResponse *http.Response @@ -12479,6 +13689,14 @@ func (r PostNodeCommandExecResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeCommandExecResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeCommandShellResponse struct { Body []byte HTTPResponse *http.Response @@ -12505,6 +13723,14 @@ func (r PostNodeCommandShellResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeCommandShellResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeContainerDockerResponse struct { Body []byte HTTPResponse *http.Response @@ -12531,6 +13757,14 @@ func (r GetNodeContainerDockerResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeContainerDockerResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeContainerDockerResponse struct { Body []byte HTTPResponse *http.Response @@ -12557,6 +13791,14 @@ func (r PostNodeContainerDockerResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeContainerDockerResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodeContainerDockerImageResponse struct { Body []byte HTTPResponse *http.Response @@ -12583,6 +13825,14 @@ func (r DeleteNodeContainerDockerImageResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodeContainerDockerImageResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeContainerDockerPullResponse struct { Body []byte HTTPResponse *http.Response @@ -12609,6 +13859,14 @@ func (r PostNodeContainerDockerPullResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeContainerDockerPullResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodeContainerDockerByIDResponse struct { Body []byte HTTPResponse *http.Response @@ -12636,6 +13894,14 @@ func (r DeleteNodeContainerDockerByIDResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodeContainerDockerByIDResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeContainerDockerByIDResponse struct { Body []byte HTTPResponse *http.Response @@ -12663,6 +13929,14 @@ func (r GetNodeContainerDockerByIDResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeContainerDockerByIDResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeContainerDockerExecResponse struct { Body []byte HTTPResponse *http.Response @@ -12690,6 +13964,14 @@ func (r PostNodeContainerDockerExecResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeContainerDockerExecResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeContainerDockerStartResponse struct { Body []byte HTTPResponse *http.Response @@ -12717,6 +13999,14 @@ func (r PostNodeContainerDockerStartResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeContainerDockerStartResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeContainerDockerStopResponse struct { Body []byte HTTPResponse *http.Response @@ -12744,6 +14034,14 @@ func (r PostNodeContainerDockerStopResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeContainerDockerStopResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeDiskResponse struct { Body []byte HTTPResponse *http.Response @@ -12770,6 +14068,14 @@ func (r GetNodeDiskResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeDiskResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeFileDeployResponse struct { Body []byte HTTPResponse *http.Response @@ -12796,6 +14102,14 @@ func (r PostNodeFileDeployResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeFileDeployResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeFileStatusResponse struct { Body []byte HTTPResponse *http.Response @@ -12822,6 +14136,14 @@ func (r PostNodeFileStatusResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeFileStatusResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeFileUndeployResponse struct { Body []byte HTTPResponse *http.Response @@ -12848,6 +14170,14 @@ func (r PostNodeFileUndeployResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeFileUndeployResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeGroupResponse struct { Body []byte HTTPResponse *http.Response @@ -12874,6 +14204,14 @@ func (r GetNodeGroupResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeGroupResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeGroupResponse struct { Body []byte HTTPResponse *http.Response @@ -12900,6 +14238,14 @@ func (r PostNodeGroupResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeGroupResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodeGroupResponse struct { Body []byte HTTPResponse *http.Response @@ -12927,6 +14273,14 @@ func (r DeleteNodeGroupResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodeGroupResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeGroupByNameResponse struct { Body []byte HTTPResponse *http.Response @@ -12954,6 +14308,14 @@ func (r GetNodeGroupByNameResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeGroupByNameResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PutNodeGroupResponse struct { Body []byte HTTPResponse *http.Response @@ -12981,6 +14343,14 @@ func (r PutNodeGroupResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PutNodeGroupResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeHostnameResponse struct { Body []byte HTTPResponse *http.Response @@ -13007,6 +14377,14 @@ func (r GetNodeHostnameResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeHostnameResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PutNodeHostnameResponse struct { Body []byte HTTPResponse *http.Response @@ -13033,6 +14411,14 @@ func (r PutNodeHostnameResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PutNodeHostnameResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeLoadResponse struct { Body []byte HTTPResponse *http.Response @@ -13059,6 +14445,14 @@ func (r GetNodeLoadResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeLoadResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeLogResponse struct { Body []byte HTTPResponse *http.Response @@ -13085,6 +14479,14 @@ func (r GetNodeLogResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeLogResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeLogSourceResponse struct { Body []byte HTTPResponse *http.Response @@ -13111,6 +14513,14 @@ func (r GetNodeLogSourceResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeLogSourceResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeLogUnitResponse struct { Body []byte HTTPResponse *http.Response @@ -13137,6 +14547,14 @@ func (r GetNodeLogUnitResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeLogUnitResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeMemoryResponse struct { Body []byte HTTPResponse *http.Response @@ -13163,6 +14581,14 @@ func (r GetNodeMemoryResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeMemoryResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodeNetworkDNSResponse struct { Body []byte HTTPResponse *http.Response @@ -13189,6 +14615,14 @@ func (r DeleteNodeNetworkDNSResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodeNetworkDNSResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PutNodeNetworkDNSResponse struct { Body []byte HTTPResponse *http.Response @@ -13215,6 +14649,14 @@ func (r PutNodeNetworkDNSResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PutNodeNetworkDNSResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeNetworkDNSByInterfaceResponse struct { Body []byte HTTPResponse *http.Response @@ -13241,6 +14683,14 @@ func (r GetNodeNetworkDNSByInterfaceResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeNetworkDNSByInterfaceResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeNetworkInterfaceResponse struct { Body []byte HTTPResponse *http.Response @@ -13267,6 +14717,14 @@ func (r GetNodeNetworkInterfaceResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeNetworkInterfaceResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodeNetworkInterfaceResponse struct { Body []byte HTTPResponse *http.Response @@ -13293,6 +14751,14 @@ func (r DeleteNodeNetworkInterfaceResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodeNetworkInterfaceResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeNetworkInterfaceByNameResponse struct { Body []byte HTTPResponse *http.Response @@ -13320,6 +14786,14 @@ func (r GetNodeNetworkInterfaceByNameResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeNetworkInterfaceByNameResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeNetworkInterfaceResponse struct { Body []byte HTTPResponse *http.Response @@ -13346,6 +14820,14 @@ func (r PostNodeNetworkInterfaceResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeNetworkInterfaceResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PutNodeNetworkInterfaceResponse struct { Body []byte HTTPResponse *http.Response @@ -13373,6 +14855,14 @@ func (r PutNodeNetworkInterfaceResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PutNodeNetworkInterfaceResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeNetworkPingResponse struct { Body []byte HTTPResponse *http.Response @@ -13399,6 +14889,14 @@ func (r PostNodeNetworkPingResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeNetworkPingResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeNetworkRouteResponse struct { Body []byte HTTPResponse *http.Response @@ -13425,6 +14923,14 @@ func (r GetNodeNetworkRouteResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeNetworkRouteResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodeNetworkRouteResponse struct { Body []byte HTTPResponse *http.Response @@ -13451,6 +14957,14 @@ func (r DeleteNodeNetworkRouteResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodeNetworkRouteResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeNetworkRouteByInterfaceResponse struct { Body []byte HTTPResponse *http.Response @@ -13478,6 +14992,14 @@ func (r GetNodeNetworkRouteByInterfaceResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeNetworkRouteByInterfaceResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeNetworkRouteResponse struct { Body []byte HTTPResponse *http.Response @@ -13504,6 +15026,14 @@ func (r PostNodeNetworkRouteResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeNetworkRouteResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PutNodeNetworkRouteResponse struct { Body []byte HTTPResponse *http.Response @@ -13531,6 +15061,14 @@ func (r PutNodeNetworkRouteResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PutNodeNetworkRouteResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodeNtpResponse struct { Body []byte HTTPResponse *http.Response @@ -13558,6 +15096,14 @@ func (r DeleteNodeNtpResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodeNtpResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeNtpResponse struct { Body []byte HTTPResponse *http.Response @@ -13584,6 +15130,14 @@ func (r GetNodeNtpResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeNtpResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeNtpResponse struct { Body []byte HTTPResponse *http.Response @@ -13610,6 +15164,14 @@ func (r PostNodeNtpResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeNtpResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PutNodeNtpResponse struct { Body []byte HTTPResponse *http.Response @@ -13637,6 +15199,14 @@ func (r PutNodeNtpResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PutNodeNtpResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeOSResponse struct { Body []byte HTTPResponse *http.Response @@ -13663,6 +15233,14 @@ func (r GetNodeOSResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeOSResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodePackageResponse struct { Body []byte HTTPResponse *http.Response @@ -13689,6 +15267,14 @@ func (r GetNodePackageResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodePackageResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodePackageResponse struct { Body []byte HTTPResponse *http.Response @@ -13715,6 +15301,14 @@ func (r PostNodePackageResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodePackageResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodePackageUpdateResponse struct { Body []byte HTTPResponse *http.Response @@ -13741,6 +15335,14 @@ func (r GetNodePackageUpdateResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodePackageUpdateResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodePackageUpdateResponse struct { Body []byte HTTPResponse *http.Response @@ -13767,6 +15369,14 @@ func (r PostNodePackageUpdateResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodePackageUpdateResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodePackageResponse struct { Body []byte HTTPResponse *http.Response @@ -13794,6 +15404,14 @@ func (r DeleteNodePackageResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodePackageResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodePackageByNameResponse struct { Body []byte HTTPResponse *http.Response @@ -13821,6 +15439,14 @@ func (r GetNodePackageByNameResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodePackageByNameResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodePowerRebootResponse struct { Body []byte HTTPResponse *http.Response @@ -13847,6 +15473,14 @@ func (r PostNodePowerRebootResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodePowerRebootResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodePowerShutdownResponse struct { Body []byte HTTPResponse *http.Response @@ -13873,6 +15507,14 @@ func (r PostNodePowerShutdownResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodePowerShutdownResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeProcessResponse struct { Body []byte HTTPResponse *http.Response @@ -13899,6 +15541,14 @@ func (r GetNodeProcessResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeProcessResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeProcessByPidResponse struct { Body []byte HTTPResponse *http.Response @@ -13926,6 +15576,14 @@ func (r GetNodeProcessByPidResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeProcessByPidResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeProcessSignalResponse struct { Body []byte HTTPResponse *http.Response @@ -13953,6 +15611,14 @@ func (r PostNodeProcessSignalResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeProcessSignalResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeScheduleCronResponse struct { Body []byte HTTPResponse *http.Response @@ -13979,6 +15645,14 @@ func (r GetNodeScheduleCronResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeScheduleCronResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeScheduleCronResponse struct { Body []byte HTTPResponse *http.Response @@ -14005,6 +15679,14 @@ func (r PostNodeScheduleCronResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeScheduleCronResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodeScheduleCronResponse struct { Body []byte HTTPResponse *http.Response @@ -14032,6 +15714,14 @@ func (r DeleteNodeScheduleCronResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodeScheduleCronResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeScheduleCronByNameResponse struct { Body []byte HTTPResponse *http.Response @@ -14059,6 +15749,14 @@ func (r GetNodeScheduleCronByNameResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeScheduleCronByNameResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PutNodeScheduleCronResponse struct { Body []byte HTTPResponse *http.Response @@ -14086,6 +15784,14 @@ func (r PutNodeScheduleCronResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PutNodeScheduleCronResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeServiceResponse struct { Body []byte HTTPResponse *http.Response @@ -14112,6 +15818,14 @@ func (r GetNodeServiceResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeServiceResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeServiceResponse struct { Body []byte HTTPResponse *http.Response @@ -14138,6 +15852,14 @@ func (r PostNodeServiceResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeServiceResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodeServiceResponse struct { Body []byte HTTPResponse *http.Response @@ -14164,6 +15886,14 @@ func (r DeleteNodeServiceResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodeServiceResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeServiceByNameResponse struct { Body []byte HTTPResponse *http.Response @@ -14191,6 +15921,14 @@ func (r GetNodeServiceByNameResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeServiceByNameResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PutNodeServiceResponse struct { Body []byte HTTPResponse *http.Response @@ -14218,6 +15956,14 @@ func (r PutNodeServiceResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PutNodeServiceResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeServiceDisableResponse struct { Body []byte HTTPResponse *http.Response @@ -14244,6 +15990,14 @@ func (r PostNodeServiceDisableResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeServiceDisableResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeServiceEnableResponse struct { Body []byte HTTPResponse *http.Response @@ -14270,6 +16024,14 @@ func (r PostNodeServiceEnableResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeServiceEnableResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeServiceRestartResponse struct { Body []byte HTTPResponse *http.Response @@ -14296,6 +16058,14 @@ func (r PostNodeServiceRestartResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeServiceRestartResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeServiceStartResponse struct { Body []byte HTTPResponse *http.Response @@ -14322,6 +16092,14 @@ func (r PostNodeServiceStartResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeServiceStartResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeServiceStopResponse struct { Body []byte HTTPResponse *http.Response @@ -14348,6 +16126,14 @@ func (r PostNodeServiceStopResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeServiceStopResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeSysctlResponse struct { Body []byte HTTPResponse *http.Response @@ -14374,6 +16160,14 @@ func (r GetNodeSysctlResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeSysctlResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeSysctlResponse struct { Body []byte HTTPResponse *http.Response @@ -14400,6 +16194,14 @@ func (r PostNodeSysctlResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeSysctlResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodeSysctlResponse struct { Body []byte HTTPResponse *http.Response @@ -14427,6 +16229,14 @@ func (r DeleteNodeSysctlResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodeSysctlResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeSysctlByKeyResponse struct { Body []byte HTTPResponse *http.Response @@ -14454,6 +16264,14 @@ func (r GetNodeSysctlByKeyResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeSysctlByKeyResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PutNodeSysctlResponse struct { Body []byte HTTPResponse *http.Response @@ -14481,6 +16299,14 @@ func (r PutNodeSysctlResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PutNodeSysctlResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeTimezoneResponse struct { Body []byte HTTPResponse *http.Response @@ -14507,6 +16333,14 @@ func (r GetNodeTimezoneResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeTimezoneResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PutNodeTimezoneResponse struct { Body []byte HTTPResponse *http.Response @@ -14533,6 +16367,14 @@ func (r PutNodeTimezoneResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PutNodeTimezoneResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeUptimeResponse struct { Body []byte HTTPResponse *http.Response @@ -14559,6 +16401,14 @@ func (r GetNodeUptimeResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeUptimeResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeUserResponse struct { Body []byte HTTPResponse *http.Response @@ -14585,6 +16435,14 @@ func (r GetNodeUserResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeUserResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeUserResponse struct { Body []byte HTTPResponse *http.Response @@ -14611,6 +16469,14 @@ func (r PostNodeUserResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeUserResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodeUserResponse struct { Body []byte HTTPResponse *http.Response @@ -14638,6 +16504,14 @@ func (r DeleteNodeUserResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodeUserResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeUserByNameResponse struct { Body []byte HTTPResponse *http.Response @@ -14665,6 +16539,14 @@ func (r GetNodeUserByNameResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeUserByNameResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PutNodeUserResponse struct { Body []byte HTTPResponse *http.Response @@ -14692,6 +16574,14 @@ func (r PutNodeUserResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PutNodeUserResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeUserPasswordResponse struct { Body []byte HTTPResponse *http.Response @@ -14719,6 +16609,14 @@ func (r PostNodeUserPasswordResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeUserPasswordResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetNodeUserSSHKeyResponse struct { Body []byte HTTPResponse *http.Response @@ -14745,6 +16643,14 @@ func (r GetNodeUserSSHKeyResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetNodeUserSSHKeyResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostNodeUserSSHKeyResponse struct { Body []byte HTTPResponse *http.Response @@ -14771,6 +16677,14 @@ func (r PostNodeUserSSHKeyResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostNodeUserSSHKeyResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type DeleteNodeUserSSHKeyResponse struct { Body []byte HTTPResponse *http.Response @@ -14797,6 +16711,14 @@ func (r DeleteNodeUserSSHKeyResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r DeleteNodeUserSSHKeyResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetApiVersionResponse struct { Body []byte HTTPResponse *http.Response @@ -14819,6 +16741,14 @@ func (r GetApiVersionResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetApiVersionResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + // GetAgentsWithResponse request returning *GetAgentsResponse func (c *ClientWithResponses) GetAgentsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetAgentsResponse, error) { rsp, err := c.GetAgents(ctx, reqEditors...) diff --git a/pkg/sdk/client/job_types_public_test.go b/pkg/sdk/client/job_types_public_test.go index 5a5cb25e4..59e838148 100644 --- a/pkg/sdk/client/job_types_public_test.go +++ b/pkg/sdk/client/job_types_public_test.go @@ -125,7 +125,7 @@ func (suite *JobTypesPublicTestSuite) TestJobDetailFromGen() { respChanged := true respData := map[string]interface{}{"hostname": "web-01"} responses := map[string]struct { - Changed *bool `json:"changed"` + Changed *bool `json:"changed,omitempty"` Data interface{} `json:"data,omitempty"` Error *string `json:"error,omitempty"` Hostname *string `json:"hostname,omitempty"`