Skip to content

Commit ae016bd

Browse files
committed
add cache
1 parent 9105243 commit ae016bd

File tree

2 files changed

+49
-12
lines changed

2 files changed

+49
-12
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.amazonq.profile
5+
6+
import software.amazon.awssdk.services.codewhispererruntime.CodeWhispererRuntimeClient
7+
import software.aws.toolkits.core.ClientConnectionSettings
8+
import software.aws.toolkits.jetbrains.core.AwsClientManager
9+
import software.aws.toolkits.jetbrains.core.region.AwsRegionProvider
10+
import software.aws.toolkits.jetbrains.core.Resource
11+
import java.time.Duration
12+
13+
/**
14+
* Save Amazon Q Profile Resource Cache
15+
*/
16+
object QProfileResources {
17+
/**
18+
* save available Q Profile list as cache with default duration 60 s。
19+
*/
20+
val LIST_REGION_PROFILES = object : Resource.Cached<List<QRegionProfile>>() {
21+
override val id: String = "amazonq.allProfiles"
22+
23+
override fun fetch(connectionSettings: ClientConnectionSettings<*>): List<QRegionProfile> {
24+
val mappedProfiles = QEndpoints.listRegionEndpoints().flatMap { (regionKey, _) ->
25+
val awsRegion = AwsRegionProvider.getInstance()[regionKey] ?: return@flatMap emptyList()
26+
val client = AwsClientManager
27+
.getInstance()
28+
.getClient(CodeWhispererRuntimeClient::class, connectionSettings.withRegion(awsRegion))
29+
30+
client.listAvailableProfilesPaginator {}
31+
.profiles()
32+
.map { p -> QRegionProfile(arn = p.arn(), profileName = p.profileName() ?: "<no name>") }
33+
}
34+
return mappedProfiles
35+
}
36+
37+
override fun expiry(): Duration = Duration.ofSeconds(60)
38+
}
39+
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/profile/QRegionProfileManager.kt

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,13 @@ import com.intellij.openapi.project.Project
1414
import com.intellij.util.xmlb.annotations.MapAnnotation
1515
import com.intellij.util.xmlb.annotations.Property
1616
import software.amazon.awssdk.core.SdkClient
17-
import software.amazon.awssdk.services.codewhispererruntime.CodeWhispererRuntimeClient
1817
import software.aws.toolkits.core.TokenConnectionSettings
1918
import software.aws.toolkits.core.utils.debug
2019
import software.aws.toolkits.core.utils.getLogger
2120
import software.aws.toolkits.core.utils.tryOrNull
2221
import software.aws.toolkits.core.utils.warn
2322
import software.aws.toolkits.jetbrains.core.AwsClientManager
24-
import software.aws.toolkits.jetbrains.core.awsClient
23+
import software.aws.toolkits.jetbrains.core.AwsResourceCache
2524
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
2625
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
2726
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
@@ -31,6 +30,7 @@ import software.aws.toolkits.jetbrains.utils.notifyInfo
3130
import software.aws.toolkits.resources.AmazonQBundle.message
3231
import software.aws.toolkits.telemetry.MetricResult
3332
import software.aws.toolkits.telemetry.Telemetry
33+
import java.time.Duration
3434
import java.util.Collections
3535
import kotlin.reflect.KClass
3636

@@ -66,16 +66,14 @@ class QRegionProfileManager : PersistentStateComponent<QProfileState>, Disposabl
6666
fun listRegionProfiles(project: Project): List<QRegionProfile>? {
6767
val connection = getIdcConnectionOrNull(project) ?: return null
6868
return try {
69-
val mappedProfiles = QEndpoints.listRegionEndpoints()
70-
.flatMap { (regionKey, _) ->
71-
val awsRegion = AwsRegionProvider.getInstance()[regionKey] ?: return@flatMap emptyList()
72-
connection.getConnectionSettings()
73-
.withRegion(awsRegion)
74-
.awsClient<CodeWhispererRuntimeClient>()
75-
.listAvailableProfilesPaginator {}
76-
.profiles()
77-
.map { p -> QRegionProfile(arn = p.arn(), profileName = p.profileName()?: "<no name>") }
78-
}
69+
val connectionSettings = connection.getConnectionSettings()
70+
val mappedProfiles = AwsResourceCache.getInstance().getResourceNow(
71+
resource = QProfileResources.LIST_REGION_PROFILES,
72+
connectionSettings = connectionSettings,
73+
timeout = Duration.ofSeconds(30),
74+
useStale = true,
75+
forceFetch = false
76+
)
7977
if (mappedProfiles.size == 1) {
8078
switchProfile(project, mappedProfiles.first(), intent = QProfileSwitchIntent.Update)
8179
}

0 commit comments

Comments
 (0)