in gremlin-client/src/main/java/software/amazon/neptune/cluster/GetEndpointsFromNeptuneManagementApiV1.java [91:195]
public NeptuneClusterMetadata refreshClusterMetadata() {
try {
AmazonNeptuneClientBuilder builder = AmazonNeptuneClientBuilder.standard();
if (clientConfiguration != null){
builder = builder.withClientConfiguration(clientConfiguration);
}
if (StringUtils.isNotEmpty(region)) {
builder = builder.withRegion(region);
}
if (credentials != null) {
builder = builder.withCredentials(credentials);
} else if (!iamProfile.equals(IamAuthConfig.DEFAULT_PROFILE)) {
builder = builder.withCredentials(new ProfileCredentialsProvider(iamProfile));
}
AmazonNeptune neptune = builder.build();
DescribeDBClustersResult describeDBClustersResult = neptune
.describeDBClusters(new DescribeDBClustersRequest().withDBClusterIdentifier(clusterId));
if (describeDBClustersResult.getDBClusters().isEmpty()) {
throw new IllegalStateException(String.format("Unable to find cluster %s", clusterId));
}
DBCluster dbCluster = describeDBClustersResult.getDBClusters().get(0);
String clusterEndpoint = dbCluster.getEndpoint();
String readerEndpoint = dbCluster.getReaderEndpoint();
List<DBClusterMember> dbClusterMembers = dbCluster.getDBClusterMembers();
Optional<DBClusterMember> clusterWriter = dbClusterMembers.stream()
.filter(DBClusterMember::isClusterWriter)
.findFirst();
String primary = clusterWriter.map(DBClusterMember::getDBInstanceIdentifier).orElse("");
List<String> replicas = dbClusterMembers.stream()
.filter(dbClusterMember -> !dbClusterMember.isClusterWriter())
.map(DBClusterMember::getDBInstanceIdentifier)
.collect(Collectors.toList());
DescribeDBInstancesRequest describeDBInstancesRequest = new DescribeDBInstancesRequest()
.withFilters(Collections.singletonList(
new Filter()
.withName("db-cluster-id")
.withValues(dbCluster.getDBClusterIdentifier())));
DescribeDBInstancesResult describeDBInstancesResult = neptune
.describeDBInstances(describeDBInstancesRequest);
Collection<NeptuneInstanceMetadata> instances = new ArrayList<>();
describeDBInstancesResult.getDBInstances()
.forEach(c -> {
String role = "unknown";
if (primary.equals(c.getDBInstanceIdentifier())) {
role = "writer";
}
if (replicas.contains(c.getDBInstanceIdentifier())) {
role = "reader";
}
String address = c.getEndpoint() == null ? null : c.getEndpoint().getAddress();
Map<String, String> tags = getTags(c.getDBInstanceArn(), neptune);
Map<String, String> annotations = getAnnotations(tags);
instances.add(
new NeptuneInstanceMetadata()
.withInstanceId(c.getDBInstanceIdentifier())
.withRole(role)
.withAddress(address)
.withStatus(c.getDBInstanceStatus())
.withAvailabilityZone(c.getAvailabilityZone())
.withInstanceType(c.getDBInstanceClass())
.withTags(tags)
.withAnnotations(annotations));
}
);
neptune.shutdown();
NeptuneClusterMetadata clusterMetadata = new NeptuneClusterMetadata()
.withInstances(instances)
.withClusterEndpoint(clusterEndpoint)
.withReaderEndpoint(readerEndpoint);
cachedClusterMetadata.set(clusterMetadata);
return clusterMetadata;
} catch (AmazonNeptuneException e) {
if (e.getErrorCode().equals("Throttling")) {
logger.warn("Calls to the Neptune Management API are being throttled. Reduce the refresh rate and stagger refresh agent requests, or use a NeptuneEndpointsInfoLambda proxy.");
NeptuneClusterMetadata clusterMetadata = cachedClusterMetadata.get();
if (clusterMetadata != null) {
logger.warn("Returning cached cluster metadata");
return clusterMetadata;
} else {
throw e;
}
} else {
throw e;
}
}
}