11package com .redis .enterprise ;
22
33import java .io .IOException ;
4+ import java .net .InetSocketAddress ;
5+ import java .net .SocketAddress ;
46import java .net .URI ;
57import java .net .URISyntaxException ;
68import java .security .GeneralSecurityException ;
79import java .security .KeyManagementException ;
810import java .security .KeyStoreException ;
911import java .security .NoSuchAlgorithmException ;
1012import java .time .Duration ;
13+ import java .util .Arrays ;
1114import java .util .Collection ;
1215import java .util .List ;
1316import java .util .Optional ;
17+ import java .util .concurrent .atomic .AtomicBoolean ;
1418import java .util .stream .Stream ;
1519
1620import javax .net .ssl .SSLContext ;
3943import org .apache .hc .core5 .http .io .entity .StringEntity ;
4044import org .apache .hc .core5 .ssl .SSLContexts ;
4145import org .awaitility .Awaitility ;
46+ import org .awaitility .core .ConditionFactory ;
4247
4348import com .fasterxml .jackson .databind .DeserializationFeature ;
4449import com .fasterxml .jackson .databind .JavaType ;
4550import com .fasterxml .jackson .databind .ObjectMapper ;
4651import com .fasterxml .jackson .databind .type .SimpleType ;
4752import com .redis .enterprise .Database .ModuleConfig ;
53+ import com .redis .enterprise .Database .Type ;
4854import com .redis .enterprise .rest .Bootstrap ;
4955import com .redis .enterprise .rest .CommandResponse ;
5056import com .redis .enterprise .rest .InstalledModule ;
5157
58+ import net .spy .memcached .ConnectionObserver ;
59+ import net .spy .memcached .DefaultConnectionFactory ;
60+ import net .spy .memcached .MemcachedConnection ;
61+
5262public class Admin implements AutoCloseable {
5363
5464 public static final String DEFAULT_USER_NAME = "admin@redis.com" ;
@@ -57,13 +67,16 @@ public class Admin implements AutoCloseable {
5767 public static final String DEFAULT_HOST = "localhost" ;
5868 public static final int DEFAULT_PORT = 9443 ;
5969
70+ private static final Command PING = Command .name ("PING" ).build ();
6071 private static final String BOOTSTRAP = "bootstrap" ;
6172 private static final String MODULES = "modules" ;
6273 private static final String BDBS = "bdbs" ;
6374 private static final String COMMAND = "command" ;
6475 private static final String CONTENT_TYPE_JSON = "application/json" ;
6576 private static final String V1 = "/v1/" ;
6677 private static final CharSequence PATH_SEPARATOR = "/" ;
78+ private static final Duration DEFAULT_DATABASE_CREATION_TIMEOUT = Duration .ofSeconds (10 );
79+ private static final Duration DEFAULT_DATABASE_CREATION_POLL_INTERVAL = Duration .ofSeconds (1 );
6780
6881 private final ObjectMapper objectMapper = new ObjectMapper ()
6982 .configure (DeserializationFeature .FAIL_ON_UNKNOWN_PROPERTIES , false );
@@ -73,6 +86,8 @@ public class Admin implements AutoCloseable {
7386 private String protocol = DEFAULT_PROTOCOL ;
7487 private String host = DEFAULT_HOST ;
7588 private int port = DEFAULT_PORT ;
89+ private Duration databaseCreationTimeout = DEFAULT_DATABASE_CREATION_TIMEOUT ;
90+ private Duration databaseCreationPollInterval = DEFAULT_DATABASE_CREATION_POLL_INTERVAL ;
7691
7792 public void close () throws IOException {
7893 if (client != null ) {
@@ -111,6 +126,16 @@ public Admin withProtocol(String protocol) {
111126 return this ;
112127 }
113128
129+ public Admin withDatabaseCreationPollInterval (Duration interval ) {
130+ this .databaseCreationPollInterval = interval ;
131+ return this ;
132+ }
133+
134+ public Admin withDatabaseCreationTimeout (Duration timeout ) {
135+ this .databaseCreationTimeout = timeout ;
136+ return this ;
137+ }
138+
114139 public Admin withPort (int port ) {
115140 this .port = port ;
116141 return this ;
@@ -228,9 +253,33 @@ public Database createDatabase(Database database) throws IOException, GeneralSec
228253 }
229254 }
230255 Database response = post (v1 (BDBS ), database , Database .class );
231- long uid = response .getUid ();
232- Awaitility .await ().pollInterval (Duration .ofSeconds (1 )).ignoreExceptions ()
233- .until (() -> executeCommand (uid , new Command ("PING" )).getResponse ().asBoolean ());
256+ ConditionFactory await = Awaitility .await ().pollInterval (databaseCreationPollInterval )
257+ .timeout (databaseCreationTimeout ).ignoreExceptions ();
258+ if (response .getType () == Type .REDIS ) {
259+ await .until (() -> executeCommand (response .getUid (), PING ).getResponse ().asBoolean ());
260+ } else {
261+ DefaultConnectionFactory connectionFactory = new DefaultConnectionFactory ();
262+ MemcachedConnection connection = connectionFactory
263+ .createConnection (Arrays .asList (new InetSocketAddress (host , response .getPort ())));
264+ AtomicBoolean connectionEstablished = new AtomicBoolean ();
265+ try {
266+ connection .addObserver (new ConnectionObserver () {
267+
268+ @ Override
269+ public void connectionLost (SocketAddress sa ) {
270+ // do nothing
271+ }
272+
273+ @ Override
274+ public void connectionEstablished (SocketAddress sa , int reconnectCount ) {
275+ connectionEstablished .set (true );
276+ }
277+ });
278+ await .until (connectionEstablished ::get );
279+ } finally {
280+ connection .shutdown ();
281+ }
282+ }
234283 return response ;
235284 }
236285
0 commit comments