1919import java .util .List ;
2020import java .util .Objects ;
2121import java .util .StringJoiner ;
22+ import java .util .concurrent .CompletableFuture ;
23+ import java .util .concurrent .TimeUnit ;
2224import java .util .function .Function ;
2325import java .util .function .Supplier ;
2426import org .slf4j .Logger ;
@@ -37,14 +39,16 @@ public class VaultServiceRolesInstaller {
3739 new ObjectMapper (new YAMLFactory ()).setVisibility (PropertyAccessor .FIELD , Visibility .ANY );
3840
3941 private final String vaultAddress ;
40- private final Supplier <String > vaultTokenSupplier ;
42+ private final CompletableFuture <String > vaultTokenSupplier ;
4143 private final Supplier <String > keyNameSupplier ;
4244 private final Function <String , String > roleNameBuilder ;
4345 private final List <Supplier <ServiceRoles >> serviceRolesSources ;
4446 private final String keyAlgorithm ;
4547 private final String keyRotationPeriod ;
4648 private final String keyVerificationTtl ;
4749 private final String roleTtl ;
50+ private final long timeout ;
51+ private final TimeUnit timeUnit ;
4852
4953 private VaultServiceRolesInstaller (Builder builder ) {
5054 this .vaultAddress = builder .vaultAddress ;
@@ -56,6 +60,8 @@ private VaultServiceRolesInstaller(Builder builder) {
5660 this .keyRotationPeriod = builder .keyRotationPeriod ;
5761 this .keyVerificationTtl = builder .keyVerificationTtl ;
5862 this .roleTtl = builder .roleTtl ;
63+ this .timeout = builder .timeout ;
64+ this .timeUnit = builder .timeUnit ;
5965 }
6066
6167 /**
@@ -74,19 +80,30 @@ public void install() {
7480 return ;
7581 }
7682
77- final String token = vaultTokenSupplier .get ();
78- final Rest rest = new Rest ().header (VAULT_TOKEN_HEADER , token );
79-
80- final String keyName = keyNameSupplier .get ();
81- createVaultIdentityKey (rest .url (buildVaultIdentityKeyUri (keyName )), keyName );
82-
83- for (Role role : serviceRoles .roles ) {
84- String roleName = roleNameBuilder .apply (role .role );
85- createVaultIdentityRole (
86- rest .url (buildVaultIdentityRoleUri (roleName )), keyName , roleName , role .permissions );
83+ try {
84+ vaultTokenSupplier
85+ .thenAcceptAsync (
86+ token -> {
87+ final var rest = new Rest ().header (VAULT_TOKEN_HEADER , token );
88+ final var keyName = keyNameSupplier .get ();
89+
90+ createVaultIdentityKey (rest .url (buildVaultIdentityKeyUri (keyName )), keyName );
91+
92+ for (var role : serviceRoles .roles ) {
93+ String roleName = roleNameBuilder .apply (role .role );
94+ createVaultIdentityRole (
95+ rest .url (buildVaultIdentityRoleUri (roleName )),
96+ keyName ,
97+ roleName ,
98+ role .permissions );
99+ }
100+
101+ LOGGER .debug ("Installed serviceRoles ({})" , serviceRoles );
102+ })
103+ .get (timeout , timeUnit );
104+ } catch (Exception e ) {
105+ throw new RuntimeException (e );
87106 }
88-
89- LOGGER .debug ("Installed serviceRoles ({})" , serviceRoles );
90107 }
91108
92109 private ServiceRoles loadServiceRoles () {
@@ -338,14 +355,16 @@ public String toString() {
338355 public static class Builder {
339356
340357 private String vaultAddress ;
341- private Supplier <String > vaultTokenSupplier ;
358+ private CompletableFuture <String > vaultTokenSupplier ;
342359 private Supplier <String > keyNameSupplier ;
343360 private Function <String , String > roleNameBuilder ;
344361 private List <Supplier <ServiceRoles >> serviceRolesSources = DEFAULT_SERVICE_ROLES_SOURCES ;
345362 private String keyAlgorithm = "RS256" ;
346363 private String keyRotationPeriod = "1h" ;
347364 private String keyVerificationTtl = "1h" ;
348365 private String roleTtl = "1m" ;
366+ private long timeout = 10 ;
367+ private TimeUnit timeUnit = TimeUnit .SECONDS ;
349368
350369 public Builder () {}
351370
@@ -354,7 +373,7 @@ public Builder vaultAddress(String vaultAddress) {
354373 return this ;
355374 }
356375
357- public Builder vaultTokenSupplier (Supplier <String > vaultTokenSupplier ) {
376+ public Builder vaultTokenSupplier (CompletableFuture <String > vaultTokenSupplier ) {
358377 this .vaultTokenSupplier = vaultTokenSupplier ;
359378 return this ;
360379 }
@@ -399,6 +418,12 @@ public Builder roleTtl(String roleTtl) {
399418 return this ;
400419 }
401420
421+ public Builder timeout (long timeout , TimeUnit timeUnit ) {
422+ this .timeout = timeout ;
423+ this .timeUnit = timeUnit ;
424+ return this ;
425+ }
426+
402427 public VaultServiceRolesInstaller build () {
403428 return new VaultServiceRolesInstaller (this );
404429 }
0 commit comments