@@ -3,10 +3,10 @@ package internal
33import (
44 "errors"
55 "fmt"
6+ rabbitmqv1beta1 "github.com/rabbitmq/cluster-operator/api/v1beta1"
67 "os"
78 "sync"
8-
9- rabbitmqv1beta1 "github.com/rabbitmq/cluster-operator/api/v1beta1"
9+ "time"
1010
1111 ctrl "sigs.k8s.io/controller-runtime"
1212
@@ -41,13 +41,19 @@ type VaultClient struct {
4141 Reader SecretReader
4242}
4343
44- var ReadServiceAccountTokenFunc = ReadServiceAccountToken
45- var ReadVaultClientSecretFunc = ReadVaultClientSecret
46- var LoginToVaultFunc = LoginToVault
44+ // Created - and exported from package - for testing purposes
45+ var (
46+ ReadServiceAccountTokenFunc = ReadServiceAccountToken
47+ ReadVaultClientSecretFunc = ReadVaultClientSecret
48+ LoginToVaultFunc = LoginToVault
49+ FirstLoginAttemptResultCh = make (chan error , 1 )
50+ )
4751
48- var createSecretStoreClientOnce sync.Once
49- var SecretClient SecretStoreClient
50- var SecretClientCreationError error
52+ var (
53+ createSecretStoreClientOnce sync.Once
54+ SecretClient SecretStoreClient
55+ SecretClientCreationError error
56+ )
5157
5258func GetSecretStoreClient (vaultSpec * rabbitmqv1beta1.VaultSpec ) (SecretStoreClient , error ) {
5359 createSecretStoreClientOnce .Do (InitializeClient (vaultSpec ))
@@ -64,7 +70,8 @@ func InitializeClient(vaultSpec *rabbitmqv1beta1.VaultSpec) func() {
6470 return
6571 }
6672
67- _ , err = login (vaultClient , vaultSpec )
73+ go renewToken (vaultClient , vaultSpec , FirstLoginAttemptResultCh )
74+ err = <- FirstLoginAttemptResultCh
6875 if err != nil {
6976 SecretClientCreationError = fmt .Errorf ("unable to login to Vault: %w" , err )
7077 return
@@ -73,8 +80,6 @@ func InitializeClient(vaultSpec *rabbitmqv1beta1.VaultSpec) func() {
7380 SecretClient = VaultClient {
7481 Reader : & VaultSecretReader {client : vaultClient },
7582 }
76-
77- go renewToken (vaultClient , vaultSpec )
7883 }
7984}
8085
@@ -187,19 +192,34 @@ func login(vaultClient *vault.Client, vaultSpec *rabbitmqv1beta1.VaultSpec) (*va
187192 return vaultSecret , nil
188193}
189194
190- func renewToken (client * vault.Client , vaultSpec * rabbitmqv1beta1.VaultSpec ) {
195+ func renewToken (client * vault.Client , vaultSpec * rabbitmqv1beta1.VaultSpec , initialLoginErrorCh chan <- error ) {
191196 logger := ctrl .LoggerFrom (nil )
197+ sentFirstLoginAttemptErr := false
192198
193199 for {
194200 vaultLoginResp , err := login (client , vaultSpec )
195201 if err != nil {
196202 logger .Error (err , "unable to authenticate to Vault server" )
197203 }
198204
205+ if ! sentFirstLoginAttemptErr {
206+ initialLoginErrorCh <- err
207+ sentFirstLoginAttemptErr = true
208+ if err != nil {
209+ // Initial login attempt failed so fail fast and don't try to manage (non-existent) token lifecycle
210+ logger .Info ("Lifecycle management of Vault token will not be carried out" )
211+ return
212+ }
213+ logger .Info ("Initiating lifecycle management of Vault token" )
214+ }
215+
199216 err = manageTokenLifecycle (client , vaultLoginResp )
200217 if err != nil {
201218 logger .Error (err , "unable to start managing the Vault token lifecycle" )
202219 }
220+
221+ // Reduce load on Vault server in a problem situation where repeated login attempts may be made
222+ time .Sleep (2 * time .Second )
203223 }
204224}
205225
0 commit comments