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()
}