Skip to content

Commit 01ce9f5

Browse files
committed
Update CI for leader renew CA test using Vault
1 parent 4fc0f6d commit 01ce9f5

File tree

6 files changed

+42
-39
lines changed

6 files changed

+42
-39
lines changed

GNUmakefile

+2
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,8 @@ test-connect-ca-providers:
357357
ifeq ("$(CIRCLECI)","true")
358358
# Run in CI
359359
gotestsum --format=short-verbose --junitfile "$(TEST_RESULTS_DIR)/gotestsum-report.xml" -- -cover -coverprofile=coverage.txt ./agent/connect/ca
360+
# Run leader tests that require Vault
361+
gotestsum --format=short-verbose --junitfile "$(TEST_RESULTS_DIR)/gotestsum-report-leader.xml" -- -cover -coverprofile=coverage-leader.txt -run TestLeader_Vault_ ./agent/consul
360362
else
361363
# Run locally
362364
@echo "Running /agent/connect/ca tests in verbose mode"

agent/connect/ca/provider.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ var ErrRateLimited = errors.New("operation rate limited by CA provider")
2020
// intermediate cert in the primary datacenter as well as the secondary. This is used
2121
// when determining whether to run the intermediate renewal routine in the primary.
2222
var PrimaryIntermediateProviders = map[string]struct{}{
23-
"vault": struct{}{},
23+
"vault": {},
2424
}
2525

2626
// ProviderConfig encapsulates all the data Consul passes to `Configure` on a

agent/connect/ca/provider_vault.go

+11-10
Original file line numberDiff line numberDiff line change
@@ -93,47 +93,48 @@ func (v *VaultProvider) Configure(cfg ProviderConfig) error {
9393

9494
// Set up a renewer to renew the token automatically, if supported.
9595
if token.Renewable {
96-
renewer, err := client.NewRenewer(&vaultapi.RenewerInput{
96+
lifetimeWatcher, err := client.NewLifetimeWatcher(&vaultapi.LifetimeWatcherInput{
9797
Secret: &vaultapi.Secret{
9898
Auth: &vaultapi.SecretAuth{
9999
ClientToken: config.Token,
100100
Renewable: token.Renewable,
101101
LeaseDuration: secret.LeaseDuration,
102102
},
103103
},
104-
Increment: token.TTL,
104+
Increment: token.TTL,
105+
RenewBehavior: vaultapi.RenewBehaviorIgnoreErrors,
105106
})
106107
if err != nil {
107108
return fmt.Errorf("Error beginning Vault provider token renewal: %v", err)
108109
}
109110

110111
ctx, cancel := context.WithCancel(context.TODO())
111112
v.shutdown = cancel
112-
go v.renewToken(ctx, renewer)
113+
go v.renewToken(ctx, lifetimeWatcher)
113114
}
114115

115116
return nil
116117
}
117118

118119
// renewToken uses a vaultapi.Renewer to repeatedly renew our token's lease.
119-
func (v *VaultProvider) renewToken(ctx context.Context, renewer *vaultapi.Renewer) {
120-
go renewer.Renew()
121-
defer renewer.Stop()
120+
func (v *VaultProvider) renewToken(ctx context.Context, watcher *vaultapi.LifetimeWatcher) {
121+
go watcher.Start()
122+
defer watcher.Stop()
122123

123124
for {
124125
select {
125126
case <-ctx.Done():
126127
return
127128

128-
case err := <-renewer.DoneCh():
129+
case err := <-watcher.DoneCh():
129130
if err != nil {
130131
v.logger.Error("Error renewing token for Vault provider", "error", err)
131132
}
132133

133-
// Renewer routine has finished, so start it again.
134-
go renewer.Renew()
134+
// Watcher routine has finished, so start it again.
135+
go watcher.Start()
135136

136-
case <-renewer.RenewCh():
137+
case <-watcher.RenewCh():
137138
v.logger.Error("Successfully renewed token for Vault provider")
138139
}
139140
}

agent/connect/ca/provider_vault_test.go

+7-25
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import (
55
"encoding/json"
66
"fmt"
77
"io/ioutil"
8-
"os"
9-
"os/exec"
108
"testing"
119
"time"
1210

@@ -40,7 +38,7 @@ func TestVaultCAProvider_VaultTLSConfig(t *testing.T) {
4038
func TestVaultCAProvider_SecondaryActiveIntermediate(t *testing.T) {
4139
t.Parallel()
4240

43-
skipIfVaultNotPresent(t)
41+
SkipIfVaultNotPresent(t)
4442

4543
provider, testVault := testVaultProviderWithConfig(t, false, nil)
4644
defer testVault.Stop()
@@ -53,7 +51,7 @@ func TestVaultCAProvider_SecondaryActiveIntermediate(t *testing.T) {
5351

5452
func TestVaultCAProvider_RenewToken(t *testing.T) {
5553
t.Parallel()
56-
skipIfVaultNotPresent(t)
54+
SkipIfVaultNotPresent(t)
5755

5856
testVault, err := runTestVault(t)
5957
require.NoError(t, err)
@@ -90,7 +88,7 @@ func TestVaultCAProvider_RenewToken(t *testing.T) {
9088
func TestVaultCAProvider_Bootstrap(t *testing.T) {
9189
t.Parallel()
9290

93-
skipIfVaultNotPresent(t)
91+
SkipIfVaultNotPresent(t)
9492

9593
provider, testVault := testVaultProvider(t)
9694
defer testVault.Stop()
@@ -151,7 +149,7 @@ func assertCorrectKeyType(t *testing.T, want, certPEM string) {
151149
func TestVaultCAProvider_SignLeaf(t *testing.T) {
152150
t.Parallel()
153151

154-
skipIfVaultNotPresent(t)
152+
SkipIfVaultNotPresent(t)
155153

156154
for _, tc := range KeyTestCases {
157155
tc := tc
@@ -235,7 +233,7 @@ func TestVaultCAProvider_SignLeaf(t *testing.T) {
235233
func TestVaultCAProvider_CrossSignCA(t *testing.T) {
236234
t.Parallel()
237235

238-
skipIfVaultNotPresent(t)
236+
SkipIfVaultNotPresent(t)
239237

240238
tests := CASigningKeyTypeCases()
241239

@@ -290,7 +288,7 @@ func TestVaultCAProvider_CrossSignCA(t *testing.T) {
290288
func TestVaultProvider_SignIntermediate(t *testing.T) {
291289
t.Parallel()
292290

293-
skipIfVaultNotPresent(t)
291+
SkipIfVaultNotPresent(t)
294292

295293
tests := CASigningKeyTypeCases()
296294

@@ -319,7 +317,7 @@ func TestVaultProvider_SignIntermediate(t *testing.T) {
319317
func TestVaultProvider_SignIntermediateConsul(t *testing.T) {
320318
t.Parallel()
321319

322-
skipIfVaultNotPresent(t)
320+
SkipIfVaultNotPresent(t)
323321

324322
// primary = Vault, secondary = Consul
325323
t.Run("pri=vault,sec=consul", func(t *testing.T) {
@@ -441,19 +439,3 @@ func createVaultProvider(t *testing.T, isPrimary bool, addr, token string, rawCo
441439

442440
return provider, nil
443441
}
444-
445-
// skipIfVaultNotPresent skips the test if the vault binary is not in PATH.
446-
//
447-
// These tests may be skipped in CI. They are run as part of a separate
448-
// integration test suite.
449-
func skipIfVaultNotPresent(t *testing.T) {
450-
vaultBinaryName := os.Getenv("VAULT_BINARY_NAME")
451-
if vaultBinaryName == "" {
452-
vaultBinaryName = "vault"
453-
}
454-
455-
path, err := exec.LookPath(vaultBinaryName)
456-
if err != nil || path == "" {
457-
t.Skipf("%q not found on $PATH - download and install to run this test", vaultBinaryName)
458-
}
459-
}

agent/connect/ca/testing.go

+16
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,22 @@ func TestConsulProvider(t testing.T, d ConsulProviderStateDelegate) *ConsulProvi
8383
return provider
8484
}
8585

86+
// SkipIfVaultNotPresent skips the test if the vault binary is not in PATH.
87+
//
88+
// These tests may be skipped in CI. They are run as part of a separate
89+
// integration test suite.
90+
func SkipIfVaultNotPresent(t testing.T) {
91+
vaultBinaryName := os.Getenv("VAULT_BINARY_NAME")
92+
if vaultBinaryName == "" {
93+
vaultBinaryName = "vault"
94+
}
95+
96+
path, err := exec.LookPath(vaultBinaryName)
97+
if err != nil || path == "" {
98+
t.Skipf("%q not found on $PATH - download and install to run this test", vaultBinaryName)
99+
}
100+
}
101+
86102
func NewTestVaultServer(t testing.T) *TestVaultServer {
87103
testVault, err := runTestVault(t)
88104
if err != nil {

agent/consul/leader_connect_test.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,9 @@ func getCAProviderWithLock(s *Server) (ca.Provider, *structs.CARoot) {
180180
return s.getCAProvider()
181181
}
182182

183-
func TestLeader_PrimaryCA_IntermediateRenew(t *testing.T) {
183+
func TestLeader_Vault_PrimaryCA_IntermediateRenew(t *testing.T) {
184+
ca.SkipIfVaultNotPresent(t)
185+
184186
// no parallel execution because we change globals
185187
origInterval := structs.IntermediateCertRenewInterval
186188
origMinTTL := structs.MinLeafCertTTL
@@ -240,7 +242,7 @@ func TestLeader_PrimaryCA_IntermediateRenew(t *testing.T) {
240242
provider, _ := getCAProviderWithLock(s1)
241243
intermediatePEM, err := provider.ActiveIntermediate()
242244
require.NoError(err)
243-
cert, err := connect.ParseCert(intermediatePEM)
245+
_, err = connect.ParseCert(intermediatePEM)
244246
require.NoError(err)
245247

246248
// Wait for dc1's intermediate to be refreshed.
@@ -277,7 +279,7 @@ func TestLeader_PrimaryCA_IntermediateRenew(t *testing.T) {
277279
leafPEM, err := provider.Sign(leafCsr)
278280
require.NoError(err)
279281

280-
cert, err = connect.ParseCert(leafPEM)
282+
cert, err := connect.ParseCert(leafPEM)
281283
require.NoError(err)
282284

283285
// Check that the leaf signed by the new intermediate can be verified using the

0 commit comments

Comments
 (0)