in src/main/java/com/amazonaws/services/neptune/cluster/NeptuneClusterMetadata.java [96:220]
public static NeptuneClusterMetadata createFromClusterId(String clusterId, Supplier<NeptuneClient> amazonNeptuneClientSupplier) {
NeptuneClient neptune = amazonNeptuneClientSupplier.get();
DescribeDbClustersResponse describeDbClustersResponse = neptune
.describeDBClusters(DescribeDbClustersRequest.builder().dbClusterIdentifier(clusterId).build());
if (describeDbClustersResponse.dbClusters().isEmpty()) {
throw new IllegalArgumentException(String.format("Unable to find cluster %s", clusterId));
}
DBCluster dbCluster = describeDbClustersResponse.dbClusters().get(0);
List<Tag> tags = neptune.listTagsForResource(
ListTagsForResourceRequest.builder().resourceName(dbCluster.dbClusterArn()).build()
).tagList();
Map<String, String> clusterTags = new HashMap<>();
tags.forEach(t -> clusterTags.put(t.key(), t.value()));
boolean isIAMDatabaseAuthenticationEnabled = dbCluster.iamDatabaseAuthenticationEnabled();
Integer port = dbCluster.port();
String dbClusterParameterGroup = dbCluster.dbClusterParameterGroup();
String engineVersion = dbCluster.engineVersion();
String dbParameterGroupFamily;
try {
DescribeDbClusterParameterGroupsResponse describeDbClusterParameterGroupsResponse = neptune.describeDBClusterParameterGroups(
DescribeDbClusterParameterGroupsRequest.builder()
.dbClusterParameterGroupName(dbClusterParameterGroup)
.build()
);
Optional<DBClusterParameterGroup> parameterGroup = describeDbClusterParameterGroupsResponse
.dbClusterParameterGroups().stream().findFirst();
dbParameterGroupFamily = parameterGroup.isPresent() ?
parameterGroup.get().dbParameterGroupFamily() :
"neptune1";
} catch (NeptuneException e) {
// Older deployments of Neptune Export service may not have requisite permissions to
// describe cluster parameter group, so we'll try and guess the group family.
if (StringUtils.isNotEmpty(engineVersion) && engineVersion.contains(".")) {
int v = Integer.parseInt(engineVersion.split("\\.")[1]);
if (v == 3) {
dbParameterGroupFamily = "neptune1.3";
} else {
dbParameterGroupFamily = v > 1 ? "neptune1.2" : "neptune1";
}
} else {
dbParameterGroupFamily = "neptune1";
}
}
DescribeDbClusterParametersResponse describeDbClusterParametersResponse = neptune.describeDBClusterParameters(
DescribeDbClusterParametersRequest.builder()
.dbClusterParameterGroupName(dbClusterParameterGroup)
.build()
);
Optional<Parameter> neptuneStreamsParameter = describeDbClusterParametersResponse.parameters().stream()
.filter(parameter -> parameter.parameterName().equals("neptune_streams"))
.findFirst();
boolean isStreamEnabled = neptuneStreamsParameter.isPresent() &&
neptuneStreamsParameter.get().parameterValue().equals("1");
String dbSubnetGroup = dbCluster.dbSubnetGroup();
List<VpcSecurityGroupMembership> vpcSecurityGroups = dbCluster.vpcSecurityGroups();
List<String> vpcSecurityGroupIds = vpcSecurityGroups.stream()
.map(VpcSecurityGroupMembership::vpcSecurityGroupId)
.collect(Collectors.toList());
List<DBClusterMember> dbClusterMembers = dbCluster.dbClusterMembers();
Optional<DBClusterMember> clusterWriter = dbClusterMembers.stream()
.filter(DBClusterMember::isClusterWriter)
.findFirst();
String primary = clusterWriter.map(DBClusterMember::dbInstanceIdentifier).orElse("");
List<String> replicas = dbClusterMembers.stream()
.filter(dbClusterMember -> !dbClusterMember.isClusterWriter())
.map(DBClusterMember::dbInstanceIdentifier)
.collect(Collectors.toList());
DescribeDbInstancesRequest describeDBInstancesRequest = DescribeDbInstancesRequest.builder()
.filters(Collections.singletonList(
Filter.builder()
.name("db-cluster-id")
.values(dbCluster.dbClusterIdentifier())
.build()
)).build();
DescribeDbInstancesResponse describeDbInstancesResponse = neptune
.describeDBInstances(describeDBInstancesRequest);
Map<String, NeptuneInstanceMetadata> instanceTypes = new HashMap<>();
describeDbInstancesResponse.dbInstances()
.forEach(c -> instanceTypes.put(
c.dbInstanceIdentifier(),
new NeptuneInstanceMetadata(
c.dbInstanceClass(),
c.dbParameterGroups().get(0).dbParameterGroupName(),
c.endpoint())
));
neptune.close();
return new NeptuneClusterMetadata(clusterId,
port,
engineVersion,
dbClusterParameterGroup,
dbParameterGroupFamily,
isIAMDatabaseAuthenticationEnabled,
isStreamEnabled,
dbSubnetGroup,
vpcSecurityGroupIds,
primary,
replicas,
instanceTypes,
clusterTags,
amazonNeptuneClientSupplier);
}