Skip to content

Commit 4453921

Browse files
committed
Add getClusterDescription method to com.mongodb.client.MongoClient
JAVA-3307
1 parent 57a7b4b commit 4453921

File tree

3 files changed

+54
-1
lines changed

3 files changed

+54
-1
lines changed

driver-sync/src/main/com/mongodb/client/MongoClient.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
import com.mongodb.ClientSessionOptions;
2020
import com.mongodb.MongoNamespace;
2121
import com.mongodb.annotations.Immutable;
22+
import com.mongodb.connection.ClusterDescription;
23+
import com.mongodb.connection.ClusterSettings;
24+
import com.mongodb.event.ClusterListener;
2225
import org.bson.Document;
2326
import org.bson.conversions.Bson;
2427

@@ -230,4 +233,20 @@ public interface MongoClient extends Closeable {
230233
*/
231234
<TResult> ChangeStreamIterable<TResult> watch(ClientSession clientSession, List<? extends Bson> pipeline, Class<TResult> resultClass);
232235

236+
/**
237+
* Gets the current cluster description.
238+
*
239+
* <p>
240+
* This method will not block, meaning that it may return a {@link ClusterDescription} whose {@code clusterType} is unknown
241+
* and whose {@link com.mongodb.connection.ServerDescription}s are all in the connecting state. If the application requires
242+
* notifications after the driver has connected to a member of the cluster, it should register a {@link ClusterListener} via
243+
* the {@link ClusterSettings} in {@link com.mongodb.MongoClientSettings}.
244+
* </p>
245+
*
246+
* @return the current cluster description
247+
* @see ClusterSettings.Builder#addClusterListener(ClusterListener)
248+
* @see com.mongodb.MongoClientSettings.Builder#applyToClusterSettings(com.mongodb.Block)
249+
* @since 3.11
250+
*/
251+
ClusterDescription getClusterDescription();
233252
}

driver-sync/src/main/com/mongodb/client/internal/MongoClientImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.mongodb.client.MongoIterable;
3434
import com.mongodb.client.model.changestream.ChangeStreamLevel;
3535
import com.mongodb.connection.Cluster;
36+
import com.mongodb.connection.ClusterDescription;
3637
import com.mongodb.connection.DefaultClusterFactory;
3738
import com.mongodb.connection.SocketSettings;
3839
import com.mongodb.connection.SocketStreamFactory;
@@ -175,6 +176,11 @@ public <TResult> ChangeStreamIterable<TResult> watch(final ClientSession clientS
175176
return createChangeStreamIterable(clientSession, pipeline, resultClass);
176177
}
177178

179+
@Override
180+
public ClusterDescription getClusterDescription() {
181+
return delegate.getCluster().getCurrentDescription();
182+
}
183+
178184
private <TResult> ChangeStreamIterable<TResult> createChangeStreamIterable(@Nullable final ClientSession clientSession,
179185
final List<? extends Bson> pipeline,
180186
final Class<TResult> resultClass) {

driver-sync/src/test/unit/com/mongodb/client/MongoClientSpecification.groovy

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,21 @@ package com.mongodb.client
1919
import com.mongodb.MongoClientSettings
2020
import com.mongodb.MongoNamespace
2121
import com.mongodb.ReadConcern
22+
import com.mongodb.ServerAddress
2223
import com.mongodb.WriteConcern
23-
import com.mongodb.client.internal.ListDatabasesIterableImpl
2424
import com.mongodb.client.internal.MongoClientImpl
2525
import com.mongodb.client.internal.MongoDatabaseImpl
2626
import com.mongodb.client.internal.MongoIterables
2727
import com.mongodb.client.internal.TestOperationExecutor
2828
import com.mongodb.client.model.changestream.ChangeStreamLevel
2929
import com.mongodb.connection.Cluster
30+
import com.mongodb.connection.ClusterConnectionMode
31+
import com.mongodb.connection.ClusterDescription
32+
import com.mongodb.connection.ClusterType
33+
import com.mongodb.connection.ServerConnectionState
34+
import com.mongodb.connection.ServerDescription
35+
import com.mongodb.connection.ServerType
36+
import com.mongodb.connection.ServerVersion
3037
import org.bson.BsonDocument
3138
import org.bson.Document
3239
import spock.lang.Specification
@@ -154,4 +161,25 @@ class MongoClientSpecification extends Specification {
154161
then:
155162
thrown(IllegalArgumentException)
156163
}
164+
165+
def 'should get the cluster description'() {
166+
given:
167+
def clusterDescription = new ClusterDescription(ClusterConnectionMode.SINGLE, ClusterType.STANDALONE,
168+
[ServerDescription.builder()
169+
.address(new ServerAddress())
170+
.type(ServerType.UNKNOWN)
171+
.state(ServerConnectionState.CONNECTING)
172+
.version(new ServerVersion())
173+
.build()])
174+
def cluster = Mock(Cluster) {
175+
1 * getCurrentDescription() >> {
176+
clusterDescription
177+
}
178+
}
179+
def settings = MongoClientSettings.builder().build()
180+
def client = new MongoClientImpl(cluster, settings, new TestOperationExecutor([]))
181+
182+
expect:
183+
client.getClusterDescription() == clusterDescription
184+
}
157185
}

0 commit comments

Comments
 (0)