open-vault/http/forwarding_bench_test.go
Christopher Swenson 0affe226ad
Update deps for consul-template 0.29.0 (#15293)
This requires bumping https://github.com/mitchellh/go-testing-interface.
For this new version, we have to create a wrapper to convert
the stdlib `testing.TB` interface to the
`mitchellh/go-testing-interface` `T` interface, since it uses
`Parallel()` now, which is not supported by `testing.TB`. This had to be
added to a new package, `benchhelpers`, to avoid a circular dependency
in `testhelpers`.

We also have to *unbump* https://github.com/armon/go-metrics since
updating it breaks our usage of
https://github.com/google/go-metrics-stackdriver

I verified that the new `pkiCert` template function works with agent
injection using annotations like:

```yaml
vault.hashicorp.com/agent-inject-secret-sample.crt: "pki/issue/example-dot-com"
vault.hashicorp.com/agent-inject-template-sample.crt: |
  {{ pkiCert "pki/issue/example-dot-com" "common_name=foo.example.com" "ttl=1h" }}
```
2022-05-05 10:30:40 -07:00

104 lines
2.6 KiB
Go

package http
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"net/http"
"strings"
"testing"
log "github.com/hashicorp/go-hclog"
"github.com/hashicorp/vault/builtin/logical/transit"
"github.com/hashicorp/vault/helper/benchhelpers"
"github.com/hashicorp/vault/helper/forwarding"
"github.com/hashicorp/vault/sdk/helper/consts"
"github.com/hashicorp/vault/sdk/helper/logging"
"github.com/hashicorp/vault/sdk/logical"
"github.com/hashicorp/vault/vault"
"golang.org/x/net/http2"
)
func BenchmarkHTTP_Forwarding_Stress(b *testing.B) {
testPlaintextB64 := "dGhlIHF1aWNrIGJyb3duIGZveA=="
coreConfig := &vault.CoreConfig{
LogicalBackends: map[string]logical.Factory{
"transit": transit.Factory,
},
}
cluster := vault.NewTestCluster(benchhelpers.TBtoT(b), coreConfig, &vault.TestClusterOptions{
HandlerFunc: Handler,
Logger: logging.NewVaultLoggerWithWriter(ioutil.Discard, log.Error),
})
cluster.Start()
defer cluster.Cleanup()
cores := cluster.Cores
// make it easy to get access to the active
core := cores[0].Core
vault.TestWaitActive(benchhelpers.TBtoT(b), core)
handler := cores[0].Handler
host := fmt.Sprintf("https://127.0.0.1:%d/v1/transit/", cores[0].Listeners[0].Address.Port)
transport := &http.Transport{
TLSClientConfig: cores[0].TLSConfig,
}
if err := http2.ConfigureTransport(transport); err != nil {
b.Fatal(err)
}
client := &http.Client{
Transport: transport,
}
req, err := http.NewRequest("POST", fmt.Sprintf("https://127.0.0.1:%d/v1/sys/mounts/transit", cores[0].Listeners[0].Address.Port),
bytes.NewBuffer([]byte("{\"type\": \"transit\"}")))
if err != nil {
b.Fatal(err)
}
req.Header.Set(consts.AuthHeaderName, cluster.RootToken)
_, err = client.Do(req)
if err != nil {
b.Fatal(err)
}
var numOps uint32
doReq := func(b *testing.B, method, url string, body io.Reader) {
req, err := http.NewRequest(method, url, body)
if err != nil {
b.Fatal(err)
}
req.Header.Set(consts.AuthHeaderName, cluster.RootToken)
w := forwarding.NewRPCResponseWriter()
handler.ServeHTTP(w, req)
switch w.StatusCode() {
case 200:
case 204:
if !strings.Contains(url, "keys") {
b.Fatal("got 204")
}
default:
b.Fatalf("bad status code: %d, resp: %s", w.StatusCode(), w.Body().String())
}
// b.Log(w.Body().String())
numOps++
}
doReq(b, "POST", host+"keys/test1", bytes.NewBuffer([]byte("{}")))
keyUrl := host + "encrypt/test1"
reqBuf := []byte(fmt.Sprintf("{\"plaintext\": \"%s\"}", testPlaintextB64))
b.Run("doreq", func(b *testing.B) {
for i := 0; i < b.N; i++ {
doReq(b, "POST", keyUrl, bytes.NewReader(reqBuf))
}
})
b.Logf("total ops: %d", numOps)
}