in google-cloud-server/src/main/kotlin/jetbrains/buildServer/clouds/google/connector/GoogleApiConnectorImpl.kt [500:548]
override fun <R : AbstractInstance?> fetchInstances(images: MutableCollection<GoogleCloudImage>)
: MutableMap<GoogleCloudImage, MutableMap<String, R>> {
val map = mutableMapOf<String, MutableList<Instance>>()
instanceClient.aggregatedListInstances(ProjectName.of(myProjectId))
.iterateAll()
.flatMap { it.instancesList ?: emptyList() }
.forEach {
val metadata = it.metadata.itemsList?.associateBy(
{ items -> items.key },
{ items -> items.value })
?: emptyMap()
if (metadata[GoogleConstants.TAG_SERVER] != myServerId) return@forEach
if (metadata[GoogleConstants.TAG_PROFILE] != myProfileId) return@forEach
if (metadata[GoogleConstants.TAG_DATA].isNullOrEmpty()) return@forEach
metadata[GoogleConstants.TAG_SOURCE]?.let { sourceId ->
val list = map.getOrPut(sourceId) { mutableListOf() }
list.add(it)
}
}
val result = hashMapOf<GoogleCloudImage, MutableMap<String, R>>()
for (image in images) {
val instances = hashMapOf<String, R>()
map[image.imageDetails.sourceId]?.let { foundInstances ->
foundInstances.forEach {
val name = it.name
val zone = ProjectZoneName.parse(it.zone).zone
@Suppress("UNCHECKED_CAST")
instances[name] = GoogleInstance(it, zone) as R
if ("TERMINATED" == it.status) {
GlobalScope.launch(image.coroutineContext) {
try {
LOG.info("Removing terminated instance $name")
deleteVm(GoogleCloudInstance(image, it.name, zone))
} catch (e: Exception) {
LOG.infoAndDebugDetails("Failed to remove instance $name", e)
}
}
}
}
}
result[image] = instances
}
return result
}