Skip to content

Commit d74610e

Browse files
Test vault client create key function (spiffe#5058)
1 parent 489d493 commit d74610e

File tree

3 files changed

+77
-3
lines changed

3 files changed

+77
-3
lines changed

pkg/server/plugin/keymanager/hashicorpvault/vault_client.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -372,9 +372,12 @@ func (c *Client) CreateKey(ctx context.Context, spireKeyID string, keyType Trans
372372
"exportable": "false", // TODO: Maybe make this configurable
373373
}
374374

375-
// TODO: Handle errors here such as key already exists
376375
_, err := c.vaultClient.Logical().WriteWithContext(ctx, fmt.Sprintf("/%s/keys/%s", c.clientParams.TransitEnginePath, spireKeyID), arguments)
377-
return err
376+
if err != nil {
377+
return status.Errorf(codes.Internal, "failed to create transit engine key: %v", err)
378+
}
379+
380+
return nil
378381
}
379382

380383
// GetKey gets the transit engine key with the specified spire key id.

pkg/server/plugin/keymanager/hashicorpvault/vault_client_test.go

+64-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package hashicorpvault
22

33
import (
4+
"context"
45
"crypto/tls"
56
"crypto/x509"
67
"fmt"
@@ -607,7 +608,69 @@ func TestConfigureTLSRequireClientCertAndKey(t *testing.T) {
607608
spiretest.RequireGRPCStatus(t, err, codes.InvalidArgument, "both client cert and client key are required")
608609
}
609610

610-
// TODO: Test CreateKey
611+
func TestCreateKey(t *testing.T) {
612+
fakeVaultServer := newFakeVaultServer()
613+
fakeVaultServer.CertAuthResponseCode = 200
614+
fakeVaultServer.CertAuthResponse = []byte(testCertAuthResponse)
615+
fakeVaultServer.CreateKeyResponseCode = 204
616+
617+
s, addr, err := fakeVaultServer.NewTLSServer()
618+
require.NoError(t, err)
619+
620+
s.Start()
621+
defer s.Close()
622+
623+
cp := &ClientParams{
624+
VaultAddr: fmt.Sprintf("https://%v/", addr),
625+
CACertPath: testRootCert,
626+
ClientCertPath: testClientCert,
627+
ClientKeyPath: testClientKey,
628+
}
629+
630+
cc, err := NewClientConfig(cp, hclog.Default())
631+
require.NoError(t, err)
632+
633+
renewCh := make(chan struct{})
634+
client, err := cc.NewAuthenticatedClient(CERT, renewCh)
635+
require.NoError(t, err)
636+
637+
err = client.CreateKey(context.Background(), "x509-CA-A", TransitKeyTypeRSA2048)
638+
require.NoError(t, err)
639+
}
640+
641+
func TestCreateKeyErrorFromEndpoint(t *testing.T) {
642+
fakeVaultServer := newFakeVaultServer()
643+
fakeVaultServer.CertAuthResponseCode = 200
644+
fakeVaultServer.CertAuthResponse = []byte(testCertAuthResponse)
645+
fakeVaultServer.CreateKeyResponseCode = 500
646+
fakeVaultServer.CreateKeyResponse = []byte("test error")
647+
648+
s, addr, err := fakeVaultServer.NewTLSServer()
649+
require.NoError(t, err)
650+
651+
s.Start()
652+
defer s.Close()
653+
654+
retry := 0 // Disable retry
655+
cp := &ClientParams{
656+
MaxRetries: &retry,
657+
VaultAddr: fmt.Sprintf("https://%v/", addr),
658+
CACertPath: testRootCert,
659+
ClientCertPath: testClientCert,
660+
ClientKeyPath: testClientKey,
661+
}
662+
663+
cc, err := NewClientConfig(cp, hclog.Default())
664+
require.NoError(t, err)
665+
666+
renewCh := make(chan struct{})
667+
client, err := cc.NewAuthenticatedClient(CERT, renewCh)
668+
require.NoError(t, err)
669+
670+
err = client.CreateKey(context.Background(), "x509-CA-A", TransitKeyTypeRSA2048)
671+
spiretest.RequireGRPCStatusHasPrefix(t, err, codes.Internal, "failed to create transit engine key: Error making API request.")
672+
}
673+
611674
// TODO: Test GetKey
612675
// TODO: Test SignData
613676

pkg/server/plugin/keymanager/hashicorpvault/vault_fake_test.go

+8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const (
1313
defaultK8sAuthEndpoint = "/v1/auth/kubernetes/login"
1414
defaultRenewEndpoint = "/v1/auth/token/renew-self"
1515
defaultLookupSelfEndpoint = "/v1/auth/token/lookup-self"
16+
defaultCreateKeyEndpoint = "/v1/transit/keys/x509-CA-A"
1617

1718
listenAddr = "127.0.0.1:0"
1819
)
@@ -292,6 +293,10 @@ type FakeVaultServerConfig struct {
292293
LookupSelfReqHandler func(code int, resp []byte) func(w http.ResponseWriter, r *http.Request)
293294
LookupSelfResponseCode int
294295
LookupSelfResponse []byte
296+
CreateKeyReqEndpoint string
297+
CreateKeyReqHandler func(code int, resp []byte) func(http.ResponseWriter, *http.Request)
298+
CreateKeyResponseCode int
299+
CreateKeyResponse []byte
295300
}
296301

297302
// NewFakeVaultServerConfig returns VaultServerConfig with default values
@@ -308,6 +313,8 @@ func NewFakeVaultServerConfig() *FakeVaultServerConfig {
308313
RenewReqHandler: defaultReqHandler,
309314
LookupSelfReqEndpoint: defaultLookupSelfEndpoint,
310315
LookupSelfReqHandler: defaultReqHandler,
316+
CreateKeyReqEndpoint: defaultCreateKeyEndpoint,
317+
CreateKeyReqHandler: defaultReqHandler,
311318
}
312319
}
313320

@@ -339,6 +346,7 @@ func (v *FakeVaultServerConfig) NewTLSServer() (srv *httptest.Server, addr strin
339346
mux.HandleFunc(v.K8sAuthReqEndpoint, v.AppRoleAuthReqHandler(v.K8sAuthResponseCode, v.K8sAuthResponse))
340347
mux.HandleFunc(v.RenewReqEndpoint, v.RenewReqHandler(v.RenewResponseCode, v.RenewResponse))
341348
mux.HandleFunc(v.LookupSelfReqEndpoint, v.LookupSelfReqHandler(v.LookupSelfResponseCode, v.LookupSelfResponse))
349+
mux.HandleFunc(v.CreateKeyReqEndpoint, v.CreateKeyReqHandler(v.CreateKeyResponseCode, v.CreateKeyResponse))
342350

343351
srv = httptest.NewUnstartedServer(mux)
344352
srv.Listener = l

0 commit comments

Comments
 (0)