diff --git a/go.mod b/go.mod index 04bcdc8..8c28f53 100644 --- a/go.mod +++ b/go.mod @@ -5,16 +5,8 @@ go 1.26 toolchain go1.26.4 require ( - connectrpc.com/connect v1.20.0 - github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12 + github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12.0.20260714200341-93604e5012d4 github.com/roadrunner-server/endure/v2 v2.6.2 ) -require ( - golang.org/x/net v0.56.0 // indirect - golang.org/x/sys v0.46.0 // indirect - golang.org/x/text v0.38.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 // indirect - google.golang.org/grpc v1.82.0 // indirect - google.golang.org/protobuf v1.36.11 // indirect -) +require google.golang.org/protobuf v1.36.11 // indirect diff --git a/go.sum b/go.sum index b5bf20b..9d2d67a 100644 --- a/go.sum +++ b/go.sum @@ -1,44 +1,8 @@ -connectrpc.com/connect v1.20.0 h1:6TNDAB+WeNd2uolWNlYczB5E0KNNaVMNUEx8JEUsPmQ= -connectrpc.com/connect v1.20.0/go.mod h1:A2ygJrukXwWy32vkCAAHNVguZrqZ+jeZ9rGRnGR4dN4= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12 h1:FcRcCvW9OfQvH45SFsI21VoHpOOov56OvOSnO4UKvXs= -github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12/go.mod h1:prGWJ2GoF5YD5PIG7Tb6VKulU3bWoFwr9DCwgxheb80= +github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12.0.20260714200341-93604e5012d4 h1:G5RlEP+rKKdarSw/ZcpWlpyrCne1AbuSZB8p9TagU3I= +github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12.0.20260714200341-93604e5012d4/go.mod h1:Y4rsabWjr4Y10Jg6H8J5NDitQqlnXmGhCdgR+zyLYkI= github.com/roadrunner-server/endure/v2 v2.6.2 h1:sIB4kTyE7gtT3fDhuYWUYn6Vt/dcPtiA6FoNS1eS+84= github.com/roadrunner-server/endure/v2 v2.6.2/go.mod h1:t/2+xpNYgGBwhzn83y2MDhvhZ19UVq1REcvqn7j7RB8= -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/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= -go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= -go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= -go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= -go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= -go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= -go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= -go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= -go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= -golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= -golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= -golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= -golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= -golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= -gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= -gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 h1:eM/YSd5bBFagF51o1E745Ta7RwzpW0h+z+QDNZOgmQ8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.82.0 h1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU= -google.golang.org/grpc v1.82.0/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= diff --git a/plugin.go b/plugin.go index 1734329..d00cf1a 100644 --- a/plugin.go +++ b/plugin.go @@ -1,9 +1,6 @@ package resetter import ( - "net/http" - - "github.com/roadrunner-server/api-go/v6/resetter/v1/resetterV1connect" "github.com/roadrunner-server/endure/v2/dep" ) @@ -41,7 +38,7 @@ func (p *Plugin) Name() string { return PluginName } -// RPC returns the Connect-RPC handler mount for the resetter service. -func (p *Plugin) RPC() (string, http.Handler) { - return resetterV1connect.NewResetterServiceHandler(&rpc{srv: p}) +// RPC returns the net/rpc service served over goridge. +func (p *Plugin) RPC() any { + return &rpc{srv: p} } diff --git a/rpc.go b/rpc.go index ffe00ea..af1d25f 100644 --- a/rpc.go +++ b/rpc.go @@ -1,13 +1,11 @@ package resetter import ( - "context" "errors" "fmt" "maps" "slices" - "connectrpc.com/connect" resetterV1 "github.com/roadrunner-server/api-go/v6/resetter/v1" ) @@ -17,19 +15,20 @@ type rpc struct { srv *Plugin } -func (r *rpc) ListPlugins(_ context.Context, _ *connect.Request[resetterV1.ListPluginsRequest]) (*connect.Response[resetterV1.PluginsList], error) { - plugins := slices.Collect(maps.Keys(r.srv.registry)) - return connect.NewResponse(&resetterV1.PluginsList{Plugins: plugins}), nil +func (r *rpc) ListPlugins(_ *resetterV1.ListPluginsRequest, out *resetterV1.PluginsList) error { + out.Plugins = slices.Collect(maps.Keys(r.srv.registry)) + return nil } -func (r *rpc) Reset(_ context.Context, req *connect.Request[resetterV1.ResetRequest]) (*connect.Response[resetterV1.Response], error) { - name := req.Msg.GetPlugin() +func (r *rpc) Reset(in *resetterV1.ResetRequest, out *resetterV1.Response) error { + name := in.GetPlugin() svc, ok := r.srv.registry[name] if !ok { - return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("%w: %s", errNoSuchPlugin, name)) + return fmt.Errorf("%w: %s", errNoSuchPlugin, name) } if err := svc.Reset(); err != nil { - return nil, connect.NewError(connect.CodeInternal, err) + return err } - return connect.NewResponse(&resetterV1.Response{Ok: true}), nil + out.Ok = true + return nil } diff --git a/tests/.rr-resetter-api.yaml b/tests/.rr-resetter-api.yaml deleted file mode 100644 index 0894e77..0000000 --- a/tests/.rr-resetter-api.yaml +++ /dev/null @@ -1,13 +0,0 @@ -version: '3' - -rpc: - listen: tcp://127.0.0.1:6001 - -server: - command: "php php_test_files/psr-worker-echo.php" - relay: "pipes" - relay_timeout: "20s" - -logs: - mode: development - level: error diff --git a/tests/go.mod b/tests/go.mod index 8a0a27b..f848e96 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -5,25 +5,20 @@ go 1.26 toolchain go1.26.4 require ( - connectrpc.com/connect v1.20.0 - github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12 + github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12.0.20260714200341-93604e5012d4 github.com/roadrunner-server/config/v6 v6.0.0-beta.3 github.com/roadrunner-server/endure/v2 v2.6.2 - github.com/roadrunner-server/logger/v6 v6.0.0-beta.3 + github.com/roadrunner-server/goridge/v4 v4.0.0-beta.2.0.20260714195909-75e9ece43063 github.com/roadrunner-server/pool/v2 v2.0.0-beta.1 github.com/roadrunner-server/resetter/v6 v6.0.0 - github.com/roadrunner-server/rpc/v6 v6.0.0-beta.4 + github.com/roadrunner-server/rpc/v6 v6.0.0-beta.4.0.20260714200548-15b82bc47898 github.com/roadrunner-server/server/v6 v6.0.0-beta.6 github.com/stretchr/testify v1.11.1 - golang.org/x/net v0.56.0 - google.golang.org/grpc v1.82.0 - google.golang.org/protobuf v1.36.11 ) replace github.com/roadrunner-server/resetter/v6 => ../ require ( - connectrpc.com/grpcreflect v1.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/fatih/color v1.19.0 // indirect github.com/fsnotify/fsnotify v1.10.1 // indirect @@ -37,7 +32,6 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/roadrunner-server/errors v1.5.0 // indirect github.com/roadrunner-server/events v1.0.1 // indirect - github.com/roadrunner-server/goridge/v4 v4.0.0-beta.2 // indirect github.com/roadrunner-server/tcplisten v1.5.2 // indirect github.com/sagikazarmark/locafero v0.12.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect @@ -55,6 +49,6 @@ require ( golang.org/x/sync v0.21.0 // indirect golang.org/x/sys v0.46.0 // indirect golang.org/x/text v0.38.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 // indirect + google.golang.org/protobuf v1.36.11 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/tests/go.sum b/tests/go.sum index 9d8fe28..349f1b0 100644 --- a/tests/go.sum +++ b/tests/go.sum @@ -1,9 +1,3 @@ -connectrpc.com/connect v1.20.0 h1:6TNDAB+WeNd2uolWNlYczB5E0KNNaVMNUEx8JEUsPmQ= -connectrpc.com/connect v1.20.0/go.mod h1:A2ygJrukXwWy32vkCAAHNVguZrqZ+jeZ9rGRnGR4dN4= -connectrpc.com/grpcreflect v1.3.0 h1:Y4V+ACf8/vOb1XOc251Qun7jMB75gCUNw6llvB9csXc= -connectrpc.com/grpcreflect v1.3.0/go.mod h1:nfloOtCS8VUQOQ1+GTdFzVg2CJo4ZGaat8JIovCtDYs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= @@ -12,17 +6,11 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho= github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -41,8 +29,8 @@ github.com/pelletier/go-toml/v2 v2.4.2 h1:M2fKKbmyvI+hGId/D0W64qDBMVhJnNR10O5gIb github.com/pelletier/go-toml/v2 v2.4.2/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12 h1:FcRcCvW9OfQvH45SFsI21VoHpOOov56OvOSnO4UKvXs= -github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12/go.mod h1:prGWJ2GoF5YD5PIG7Tb6VKulU3bWoFwr9DCwgxheb80= +github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12.0.20260714200341-93604e5012d4 h1:G5RlEP+rKKdarSw/ZcpWlpyrCne1AbuSZB8p9TagU3I= +github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12.0.20260714200341-93604e5012d4/go.mod h1:Y4rsabWjr4Y10Jg6H8J5NDitQqlnXmGhCdgR+zyLYkI= github.com/roadrunner-server/config/v6 v6.0.0-beta.3 h1:G0EUzJ6Yw4UnleM6BhnOBbYPXKDHRmCJiGhC3nXDBwI= github.com/roadrunner-server/config/v6 v6.0.0-beta.3/go.mod h1:eIB+c29njpcKokXrxe483FbQOBSTNGvU3hhC6W/qYSU= github.com/roadrunner-server/endure/v2 v2.6.2 h1:sIB4kTyE7gtT3fDhuYWUYn6Vt/dcPtiA6FoNS1eS+84= @@ -51,14 +39,12 @@ github.com/roadrunner-server/errors v1.5.0 h1:unG7LKIZrSzkCCF3YLRLA5VyqE0KKomofX github.com/roadrunner-server/errors v1.5.0/go.mod h1:g9fo/T2C13cWRDR9PW1r0ZAOSQfNhWAZawyfkGiaHuI= github.com/roadrunner-server/events v1.0.1 h1:waCkKhxhzdK3VcI1xG22l+h+0J+Nfdpxjhyy01Un+kI= github.com/roadrunner-server/events v1.0.1/go.mod h1:WZRqoEVaFm209t52EuoT7ISUtvX6BrCi6bI/7pjkVC0= -github.com/roadrunner-server/goridge/v4 v4.0.0-beta.2 h1:MgH6oiSgcl+vphsQ6JpyedkXQ/DPf8zVpn0z7rdBp10= -github.com/roadrunner-server/goridge/v4 v4.0.0-beta.2/go.mod h1:Wv9CBO9VIU92e5iZIuehLHKakXgMkOzxoT4/oHDjIUA= -github.com/roadrunner-server/logger/v6 v6.0.0-beta.3 h1:eoJKXAUSyykDfVX6eTUhmAn6Y8pS/LyI5fDP4H+G5rQ= -github.com/roadrunner-server/logger/v6 v6.0.0-beta.3/go.mod h1:MwHb3AbltHYtu7nRpml5NeYu7O+W8rCpDBeNTTEoE1M= +github.com/roadrunner-server/goridge/v4 v4.0.0-beta.2.0.20260714195909-75e9ece43063 h1:0mNGmXgYR2/hUhPQde+GJFzj/UQ6vqrLAHcwa5C5rqA= +github.com/roadrunner-server/goridge/v4 v4.0.0-beta.2.0.20260714195909-75e9ece43063/go.mod h1:1aHppV68y/VqRED/AsfNg59sft9aQOhqgr5Z5n49jbM= github.com/roadrunner-server/pool/v2 v2.0.0-beta.1 h1:jpYXFtdD6QGAdAGPgMxrNi3j1CegCRpb2y+A+3GnXFA= github.com/roadrunner-server/pool/v2 v2.0.0-beta.1/go.mod h1:Bo1wT7RtL3eyQHXBUohNhtj/yAmRt6Rq8smuBg5pWkY= -github.com/roadrunner-server/rpc/v6 v6.0.0-beta.4 h1:Qj2nrHIWOHE9Tys+FBG2IdoPtzgIUh6juQ5wXLGGDMw= -github.com/roadrunner-server/rpc/v6 v6.0.0-beta.4/go.mod h1:k5KT3fpnJVd27m0HbGGBiTPXlWI6eJdd6C+ohp5IE0U= +github.com/roadrunner-server/rpc/v6 v6.0.0-beta.4.0.20260714200548-15b82bc47898 h1:nc1MwAAG02mwOm76TO7sZZLt6ToKlkIz98shqAsxGoA= +github.com/roadrunner-server/rpc/v6 v6.0.0-beta.4.0.20260714200548-15b82bc47898/go.mod h1:pC636ll86dk1PJ2LoYbvurKMUARbF8Ckn4WBGvPXO8A= github.com/roadrunner-server/server/v6 v6.0.0-beta.6 h1:CPtH4eIYkeRKi5cPXxb0+J+LI824cqhIGXAfcH+nkjA= github.com/roadrunner-server/server/v6 v6.0.0-beta.6/go.mod h1:SbODuCzC2gcbFhAmJDWvjf34pPrUWP5NxxVsTRQDuZ4= github.com/roadrunner-server/tcplisten v1.5.2 h1:nn8yXYrhRDkfQ9AAu4V075uT4fZRmOnpxkawgE+bWPA= @@ -87,18 +73,6 @@ github.com/tklauser/numcpus v0.12.0 h1:NR85qdvHA9pFse3x3weVZ0r0ST8R6l5RHbZrlRaqo github.com/tklauser/numcpus v0.12.0/go.mod h1:ABHeXzJnr/qqwguhClkZKT1/8VABcYrsyUiUGobwWJg= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -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/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= -go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= -go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= -go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= -go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= -go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= -go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= -go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= -go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -107,8 +81,6 @@ go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= -golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -117,12 +89,6 @@ golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= -gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= -gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 h1:eM/YSd5bBFagF51o1E745Ta7RwzpW0h+z+QDNZOgmQ8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.82.0 h1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU= -google.golang.org/grpc v1.82.0/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/tests/resetter_api_test.go b/tests/resetter_api_test.go deleted file mode 100644 index 4c15f31..0000000 --- a/tests/resetter_api_test.go +++ /dev/null @@ -1,220 +0,0 @@ -package resetter - -import ( - "bytes" - "context" - "crypto/tls" - "encoding/base64" - "io" - "log/slog" - "net" - "net/http" - "net/url" - "sync" - "testing" - "time" - - "connectrpc.com/connect" - resetterV1 "github.com/roadrunner-server/api-go/v6/resetter/v1" - "github.com/roadrunner-server/api-go/v6/resetter/v1/resetterV1connect" - "github.com/roadrunner-server/config/v6" - "github.com/roadrunner-server/endure/v2" - "github.com/roadrunner-server/logger/v6" - "github.com/roadrunner-server/resetter/v6" - rpcPlugin "github.com/roadrunner-server/rpc/v6" - "github.com/roadrunner-server/server/v6" - "github.com/stretchr/testify/require" - "golang.org/x/net/http2" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - "google.golang.org/protobuf/encoding/protojson" - "google.golang.org/protobuf/proto" -) - -const resetterAPIAddr = "127.0.0.1:6001" - -// startResetterAPIContainer brings up rpc + server + logger + resetter + -// Plugin1 so the wire-surface tests below have a real resettable plugin -// registered. Plugin1.Name() returns "resetter.plugin1" — that's the only -// name visible via ListPlugins / Reset in this container. -func startResetterAPIContainer(t *testing.T) func() { - t.Helper() - - cont := endure.New(slog.LevelError) - cfg := &config.Plugin{ - Version: "2024.2.0", - Path: ".rr-resetter-api.yaml", - } - - require.NoError(t, cont.RegisterAll( - cfg, - &logger.Plugin{}, - &server.Plugin{}, - &rpcPlugin.Plugin{}, - &resetter.Plugin{}, - &Plugin1{}, - )) - require.NoError(t, cont.Init()) - - ch, err := cont.Serve() - require.NoError(t, err) - - wg := &sync.WaitGroup{} - stop := make(chan struct{}) - wg.Go(func() { - select { - case e := <-ch: - t.Errorf("container reported error: %v", e.Error) - case <-stop: - } - }) - - time.Sleep(500 * time.Millisecond) - - return func() { - close(stop) - require.NoError(t, cont.Stop()) - wg.Wait() - } -} - -func TestResetterConnectAPI(t *testing.T) { - stop := startResetterAPIContainer(t) - defer stop() - - httpc := &http.Client{ - Timeout: 30 * time.Second, - Transport: &http2.Transport{ - AllowHTTP: true, - DialTLSContext: func(ctx context.Context, network, addr string, _ *tls.Config) (net.Conn, error) { - return (&net.Dialer{Timeout: 30 * time.Second}).DialContext(ctx, network, addr) - }, - }, - } - client := resetterV1connect.NewResetterServiceClient(httpc, "http://"+resetterAPIAddr) - ctx, cancel := context.WithTimeout(t.Context(), 30*time.Second) - defer cancel() - - listResp, err := client.ListPlugins(ctx, connect.NewRequest(&resetterV1.ListPluginsRequest{})) - require.NoError(t, err) - require.Contains(t, listResp.Msg.GetPlugins(), "resetter.plugin1") - - resetResp, err := client.Reset(ctx, connect.NewRequest(&resetterV1.ResetRequest{Plugin: "resetter.plugin1"})) - require.NoError(t, err) - require.True(t, resetResp.Msg.GetOk()) - - // negative path: unknown plugin name must surface as CodeNotFound - // (not the default CodeInternal) so clients can distinguish bad input - // from real server faults. - _, err = client.Reset(ctx, connect.NewRequest(&resetterV1.ResetRequest{Plugin: "does-not-exist"})) - require.Error(t, err) - require.Equal(t, connect.CodeNotFound, connect.CodeOf(err)) -} - -// TestResetterHTTPApi exercises both RPCs through plain HTTP/1.1 with a -// protojson body — the shape any non-Connect HTTP client uses against this -// handler. -func TestResetterHTTPApi(t *testing.T) { - stop := startResetterAPIContainer(t) - defer stop() - - httpc := &http.Client{Timeout: 30 * time.Second} - ctx := t.Context() - - call := func(method string, in proto.Message, out proto.Message) { - body, err := protojson.Marshal(in) - require.NoError(t, err) - - req, err := http.NewRequestWithContext(ctx, http.MethodPost, - "http://"+resetterAPIAddr+"/resetter.v1.ResetterService/"+method, bytes.NewReader(body)) - require.NoError(t, err) - req.Header.Set("Content-Type", "application/json") - - resp, err := httpc.Do(req) - require.NoError(t, err) - defer func() { _ = resp.Body.Close() }() - - respBody, err := io.ReadAll(resp.Body) - require.NoError(t, err) - require.Equalf(t, http.StatusOK, resp.StatusCode, "method=%s body=%s", method, respBody) - require.NoError(t, protojson.Unmarshal(respBody, out)) - } - - var listResp resetterV1.PluginsList - call("ListPlugins", &resetterV1.ListPluginsRequest{}, &listResp) - require.Contains(t, listResp.GetPlugins(), "resetter.plugin1") - - var resetResp resetterV1.Response - call("Reset", &resetterV1.ResetRequest{Plugin: "resetter.plugin1"}, &resetResp) - require.True(t, resetResp.GetOk()) -} - -// TestResetterGRPCApi exercises both RPCs through a regular gRPC client. The -// same Connect handler serves gRPC framing off the same port. -func TestResetterGRPCApi(t *testing.T) { - stop := startResetterAPIContainer(t) - defer stop() - - conn, err := grpc.NewClient(resetterAPIAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) - require.NoError(t, err) - defer func() { _ = conn.Close() }() - - client := resetterV1.NewResetterServiceClient(conn) - ctx, cancel := context.WithTimeout(t.Context(), 30*time.Second) - defer cancel() - - listResp, err := client.ListPlugins(ctx, &resetterV1.ListPluginsRequest{}) - require.NoError(t, err) - require.Contains(t, listResp.GetPlugins(), "resetter.plugin1") - - resetResp, err := client.Reset(ctx, &resetterV1.ResetRequest{Plugin: "resetter.plugin1"}) - require.NoError(t, err) - require.True(t, resetResp.GetOk()) -} - -// TestResetterHTTPGetIdempotency verifies that ListPlugins (marked -// NO_SIDE_EFFECTS) accepts HTTP GET, while Reset (mutating) returns 405. -func TestResetterHTTPGetIdempotency(t *testing.T) { - stop := startResetterAPIContainer(t) - defer stop() - - body, err := protojson.Marshal(&resetterV1.ResetRequest{Plugin: "probe"}) - require.NoError(t, err) - - q := url.Values{} - q.Set("encoding", "json") - q.Set("base64", "1") - q.Set("message", base64.URLEncoding.EncodeToString(body)) - - cases := []struct { - method string - expectAllow bool - }{ - {"ListPlugins", true}, - {"Reset", false}, - } - - httpc := &http.Client{Timeout: 30 * time.Second} - for _, c := range cases { - t.Run(c.method, func(t *testing.T) { - req, err := http.NewRequestWithContext(t.Context(), http.MethodGet, - "http://"+resetterAPIAddr+"/resetter.v1.ResetterService/"+c.method+"?"+q.Encode(), nil) - require.NoError(t, err) - - resp, err := httpc.Do(req) - require.NoError(t, err) - defer func() { _ = resp.Body.Close() }() - - respBody, err := io.ReadAll(resp.Body) - require.NoError(t, err) - - if c.expectAllow { - require.NotEqualf(t, http.StatusMethodNotAllowed, resp.StatusCode, - "%s via GET should be allowed; got 405\n%s", c.method, respBody) - return - } - require.Equalf(t, http.StatusMethodNotAllowed, resp.StatusCode, - "%s via GET should be rejected; got %s\n%s", c.method, resp.Status, respBody) - }) - } -} diff --git a/tests/resetter_test.go b/tests/resetter_test.go index 77bf4ed..f9fb8c5 100644 --- a/tests/resetter_test.go +++ b/tests/resetter_test.go @@ -1,11 +1,9 @@ package resetter import ( - "context" - "crypto/tls" "log/slog" "net" - "net/http" + "net/rpc" "os" "os/signal" "sync" @@ -15,17 +13,15 @@ import ( mocklogger "tests/mock" - "connectrpc.com/connect" resetterV1 "github.com/roadrunner-server/api-go/v6/resetter/v1" - "github.com/roadrunner-server/api-go/v6/resetter/v1/resetterV1connect" "github.com/roadrunner-server/config/v6" "github.com/roadrunner-server/endure/v2" + goridgeRpc "github.com/roadrunner-server/goridge/v4/pkg/rpc" "github.com/roadrunner-server/resetter/v6" rpcPlugin "github.com/roadrunner-server/rpc/v6" "github.com/roadrunner-server/server/v6" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "golang.org/x/net/http2" ) func TestResetterInit(t *testing.T) { @@ -98,23 +94,24 @@ func TestResetterInit(t *testing.T) { } func resetterRPCTest(t *testing.T) { - httpc := &http.Client{ - Timeout: 30 * time.Second, - Transport: &http2.Transport{ - AllowHTTP: true, - DialTLSContext: func(ctx context.Context, network, addr string, _ *tls.Config) (net.Conn, error) { - return (&net.Dialer{Timeout: 30 * time.Second}).DialContext(ctx, network, addr) - }, - }, - } - client := resetterV1connect.NewResetterServiceClient(httpc, "http://127.0.0.1:6001") - ctx := t.Context() + conn, err := (&net.Dialer{}).DialContext(t.Context(), "tcp", "127.0.0.1:6001") + require.NoError(t, err) + client := rpc.NewClientWithCodec(goridgeRpc.NewClientCodec(conn)) + defer func() { _ = client.Close() }() - resetResp, err := client.Reset(ctx, connect.NewRequest(&resetterV1.ResetRequest{Plugin: "resetter.plugin1"})) + var resetResp resetterV1.Response + err = client.Call("resetter.Reset", &resetterV1.ResetRequest{Plugin: "resetter.plugin1"}, &resetResp) assert.NoError(t, err) - assert.True(t, resetResp.Msg.GetOk()) + assert.True(t, resetResp.GetOk()) + + // negative path: unknown plugin name must surface as an error over goridge net/rpc + var missingResp resetterV1.Response + err = client.Call("resetter.Reset", &resetterV1.ResetRequest{Plugin: "resetter.unknown"}, &missingResp) + require.ErrorContains(t, err, "no such plugin") + assert.False(t, missingResp.GetOk()) - listResp, err := client.ListPlugins(ctx, connect.NewRequest(&resetterV1.ListPluginsRequest{})) + var listResp resetterV1.PluginsList + err = client.Call("resetter.ListPlugins", &resetterV1.ListPluginsRequest{}, &listResp) assert.NoError(t, err) - require.Contains(t, listResp.Msg.GetPlugins(), "resetter.plugin1") + require.Contains(t, listResp.GetPlugins(), "resetter.plugin1") }