override fun fetchInstances()

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
    }