override fun createQuery()

in plugin-azure-server/src/main/kotlin/jetbrains/buildServer/clouds/azure/arm/connector/tasks/FetchCustomImagesTaskImpl.kt [34:181]


    override fun createQuery(api: AzureApi, taskContext: AzureTaskContext, parameter: Unit): Single<List<CustomImageTaskImageDescriptor>> {
        if (TeamCityProperties.getBoolean(TEAMCITY_CLOUDS_AZURE_TASKS_FETCHCUSTOMIMAGES_RESOURCEGRAPH_DISABLE)) {
            return api
                .virtualMachineCustomImages()
                .listAsync()
                .map {
                    CustomImageTaskImageDescriptor(
                        it.id(),
                        it.name(),
                        it.regionName(),
                        it.osDiskImage()?.osState(),
                        it.osDiskImage()?.osType(),
                        null
                    )
                }
                .mergeWith(
                    api
                        .galleries()
                        .listAsync()
                        .flatMap { gallery -> gallery.listImagesAsync().map { image -> gallery to image } }
                        .flatMap { (gallery, image) -> image.listVersionsAsync().toList().map { versionList -> Triple(gallery, image, versionList) } }
                        .flatMap { (gallery, image, versions) ->
                            if (versions.isEmpty()) return@flatMap Observable.empty<CustomImageTaskImageDescriptor>()

                            val galleryName = AzureParsingHelper.getValueFromIdByName(image.id(), "galleries")
                            var imageName = galleryName + '/' + image.name()

                            Observable.from(
                                versions.map {
                                    val name = imageName + '/' + it.name()
                                    CustomImageTaskImageDescriptor(
                                        it.id(),
                                        name,
                                        image.location(),
                                        image.osState(),
                                        image.osType(),
                                        GalleryImageDescriptor(
                                            gallery.id(),
                                            gallery.name(),
                                            image.id(),
                                            image.name(),
                                            it.id(),
                                            it.name()
                                        )
                                    )
                                }).concatWith(
                                Observable.just(
                                    CustomImageTaskImageDescriptor(
                                        image.id(),
                                        imageName + "/latest",
                                        image.location(),
                                        image.osState(),
                                        image.osType(),
                                        GalleryImageDescriptor(
                                            gallery.id(),
                                            gallery.name(),
                                            image.id(),
                                            image.name(),
                                            null,
                                            "latest"
                                        )
                                    )
                                )
                            )
                        }
                )
                .toList()
                .last()
                .toSingle()
        }
        return api
            .resourceGraph()
            .resources()
            .poolResourcesAsync(QueryRequest(QUERY))
            .flatMapIterable { table ->
                val result = mutableListOf<CustomImageTaskImageDescriptor>()
                var previousImageId : String? = null
                table.rows.forEach {
                    val galleryId = it.getStringValue("galleryId")
                    val imageId = it.getStringValue("imageId", true)!!
                    val imageName = it.getStringValue("imageName", true)!!
                    val imageLocation = it.getStringValue("imageLocation", true)!!
                    val imageOsType = it.getStringValue("imageOsType")?.let { OperatingSystemTypes.fromString(it) }
                    val imageOsState = it.getStringValue("imageOsState").let { OperatingSystemStateTypes.fromString(it) }

                    if (galleryId != null) {
                        val galleryName = it.getStringValue("galleryName", true)!!
                        val versionId = it.getStringValue("versionId", true)!!
                        val versionName = it.getStringValue("versionName", true)!!
                        val name = galleryName + "/" + imageName

                        result.add(
                            CustomImageTaskImageDescriptor(
                                versionId,
                                name + "/" + versionName,
                                imageLocation,
                                imageOsState,
                                imageOsType,
                                GalleryImageDescriptor(
                                    galleryId,
                                    galleryName,
                                    imageId,
                                    imageName,
                                    versionId,
                                    versionName
                                )
                            )
                        )

                        if (previousImageId != imageId) {
                            result.add(
                                CustomImageTaskImageDescriptor(
                                    imageId,
                                    name + "/latest",
                                    imageLocation,
                                    imageOsState,
                                    imageOsType,
                                    GalleryImageDescriptor(
                                        galleryId,
                                        galleryName,
                                        imageId,
                                        imageName,
                                        null,
                                        "latest"
                                    )
                                )
                            )
                        }
                    } else {
                        result.add(
                            CustomImageTaskImageDescriptor(
                                imageId,
                                imageName,
                                imageLocation,
                                imageOsState,
                                imageOsType,
                                null
                            )
                        );
                    }

                    previousImageId = imageId
                }
                result.toList()
            }
            .toList()
            .toSingle()
    }