Skip to content

Commit 5afa080

Browse files
authored
Convert ClientManager to app service (#2114)
1 parent b3a683d commit 5afa080

File tree

57 files changed

+184
-195
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+184
-195
lines changed

core/src/software/aws/toolkits/core/ToolkitClientManager.kt

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -41,46 +41,33 @@ abstract class ToolkitClientManager {
4141
protected abstract val userAgent: String
4242

4343
inline fun <reified T : SdkClient> getClient(
44-
credentialsProviderOverride: ToolkitCredentialsProvider? = null,
45-
regionOverride: AwsRegion? = null
46-
): T = this.getClient(T::class, credentialsProviderOverride, regionOverride)
44+
credProvider: ToolkitCredentialsProvider,
45+
region: AwsRegion
46+
): T = this.getClient(T::class, credProvider, region)
4747

4848
@Suppress("UNCHECKED_CAST")
4949
open fun <T : SdkClient> getClient(
50-
clz: KClass<T>,
51-
credentialsProviderOverride: ToolkitCredentialsProvider? = null,
52-
regionOverride: AwsRegion? = null
50+
sdkClass: KClass<T>,
51+
credProvider: ToolkitCredentialsProvider,
52+
region: AwsRegion
5353
): T {
54-
val credProvider = credentialsProviderOverride ?: getCredentialsProvider()
55-
val region = regionOverride ?: getRegion()
56-
5754
val key = AwsClientKey(
5855
credentialProviderId = credProvider.id,
5956
region = region,
60-
serviceClass = clz
57+
serviceClass = sdkClass
6158
)
6259

6360
val serviceId = key.serviceClass.java.getField("SERVICE_NAME").get(null) as String
6461
if (serviceId !in GLOBAL_SERVICE_DENY_LIST && getRegionProvider().isServiceGlobal(region, serviceId)) {
6562
val globalRegion = getRegionProvider().getGlobalRegionForService(region, serviceId)
66-
return cachedClients.computeIfAbsent(key.copy(region = globalRegion)) { createNewClient(it, globalRegion, credProvider) } as T
63+
return cachedClients.computeIfAbsent(key.copy(region = globalRegion)) { createNewClient(sdkClass, globalRegion, credProvider) } as T
6764
}
6865

69-
return cachedClients.computeIfAbsent(key) { createNewClient(it, region, credProvider) } as T
66+
return cachedClients.computeIfAbsent(key) { createNewClient(sdkClass, region, credProvider) } as T
7067
}
7168

72-
/**
73-
* Get the current active credential provider for the toolkit
74-
*/
75-
protected abstract fun getCredentialsProvider(): ToolkitCredentialsProvider
76-
7769
protected abstract fun getRegionProvider(): ToolkitRegionProvider
7870

79-
/**
80-
* Get the current active region for the toolkit
81-
*/
82-
protected abstract fun getRegion(): AwsRegion
83-
8471
/**
8572
* Calls [AutoCloseable.close] if client implements [AutoCloseable] and clears the cache
8673
*/
@@ -106,13 +93,10 @@ abstract class ToolkitClientManager {
10693
*/
10794
@Suppress("UNCHECKED_CAST")
10895
protected open fun <T : SdkClient> createNewClient(
109-
key: AwsClientKey,
110-
region: AwsRegion = key.region,
111-
credProvider: ToolkitCredentialsProvider = getCredentialsProvider()
112-
): T {
113-
val sdkClass = key.serviceClass as KClass<T>
114-
return createNewClient(sdkClass, sdkHttpClient, Region.of(region.id), credProvider, userAgent)
115-
}
96+
sdkClass: KClass<T>,
97+
region: AwsRegion,
98+
credProvider: ToolkitCredentialsProvider
99+
): T = createNewClient(sdkClass, sdkHttpClient, Region.of(region.id), credProvider, userAgent)
116100

117101
companion object {
118102
private val GLOBAL_SERVICE_DENY_LIST = setOf(

core/tst/software/aws/toolkits/core/region/AwsRegionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ fun anAwsRegion(id: String = aRegionId(), name: String = aString(), partitionId:
4646

4747
fun aRegionId(): String {
4848
val prefix = arrayOf("af", "us", "ca", "eu", "ap", "me", "cn").random()
49-
val compass = arrayOf("north", "south", "east", "west", "central")
49+
val compass = arrayOf("north", "south", "east", "west", "central").random()
5050
val count = Random.nextInt(1, 10)
5151
return "$prefix-$compass-$count"
5252
}

jetbrains-core/resources/META-INF/plugin.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177
serviceImplementation="software.aws.toolkits.jetbrains.core.executables.DefaultExecutableManager"/>
178178
<applicationService serviceInterface="software.aws.toolkits.jetbrains.core.notification.NoticeManager"
179179
serviceImplementation="software.aws.toolkits.jetbrains.core.notification.DefaultNoticeManager"/>
180-
<projectService serviceInterface="software.aws.toolkits.core.ToolkitClientManager"
180+
<applicationService serviceInterface="software.aws.toolkits.core.ToolkitClientManager"
181181
serviceImplementation="software.aws.toolkits.jetbrains.core.AwsClientManager"
182182
testServiceImplementation="software.aws.toolkits.jetbrains.core.MockClientManager"/>
183183
<projectService serviceImplementation="software.aws.toolkits.jetbrains.core.explorer.ExplorerToolWindow"/>

jetbrains-core/src/software/aws/toolkits/jetbrains/core/AwsClientManager.kt

Lines changed: 9 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,21 @@ import com.intellij.openapi.Disposable
77
import com.intellij.openapi.application.ApplicationManager
88
import com.intellij.openapi.application.ApplicationNamesInfo
99
import com.intellij.openapi.application.ex.ApplicationInfoEx
10-
import com.intellij.openapi.components.ServiceManager
11-
import com.intellij.openapi.progress.ProcessCanceledException
10+
import com.intellij.openapi.components.service
1211
import com.intellij.openapi.project.Project
1312
import software.amazon.awssdk.core.SdkClient
1413
import software.amazon.awssdk.http.SdkHttpClient
1514
import software.aws.toolkits.core.ToolkitClientManager
1615
import software.aws.toolkits.core.credentials.CredentialIdentifier
17-
import software.aws.toolkits.core.credentials.CredentialProviderNotFoundException
1816
import software.aws.toolkits.core.credentials.ToolkitCredentialsChangeListener
19-
import software.aws.toolkits.core.credentials.ToolkitCredentialsProvider
20-
import software.aws.toolkits.core.region.AwsRegion
2117
import software.aws.toolkits.core.region.ToolkitRegionProvider
2218
import software.aws.toolkits.core.utils.tryOrNull
2319
import software.aws.toolkits.jetbrains.AwsToolkit
2420
import software.aws.toolkits.jetbrains.core.credentials.AwsConnectionManager
25-
import software.aws.toolkits.jetbrains.core.credentials.ConnectionSettings
2621
import software.aws.toolkits.jetbrains.core.credentials.CredentialManager
2722
import software.aws.toolkits.jetbrains.core.region.AwsRegionProvider
2823

29-
open class AwsClientManager(project: Project) : ToolkitClientManager(), Disposable {
30-
31-
private val accountSettingsManager = AwsConnectionManager.getInstance(project)
24+
open class AwsClientManager : ToolkitClientManager(), Disposable {
3225
private val regionProvider = AwsRegionProvider.getInstance()
3326

3427
init {
@@ -52,24 +45,11 @@ open class AwsClientManager(project: Project) : ToolkitClientManager(), Disposab
5245

5346
override val userAgent = AwsClientManager.userAgent
5447

55-
override fun getCredentialsProvider(): ToolkitCredentialsProvider {
56-
try {
57-
return accountSettingsManager.activeCredentialProvider
58-
} catch (e: CredentialProviderNotFoundException) {
59-
// TODO: Notify user
60-
61-
// Throw canceled exception to stop any task relying on this call
62-
throw ProcessCanceledException(e)
63-
}
64-
}
65-
66-
override fun getRegion(): AwsRegion = accountSettingsManager.activeRegion
67-
6848
override fun getRegionProvider(): ToolkitRegionProvider = regionProvider
6949

7050
companion object {
7151
@JvmStatic
72-
fun getInstance(project: Project): ToolkitClientManager = ServiceManager.getService(project, ToolkitClientManager::class.java)
52+
fun getInstance(): ToolkitClientManager = service()
7353

7454
val userAgent: String by lazy {
7555
val platformName = tryOrNull { ApplicationNamesInfo.getInstance().fullProductNameWithEdition.replace(' ', '-') }
@@ -79,13 +59,10 @@ open class AwsClientManager(project: Project) : ToolkitClientManager(), Disposab
7959
}
8060
}
8161

82-
inline fun <reified T : SdkClient> Project.awsClient(
83-
credentialsProviderOverride: ToolkitCredentialsProvider? = null,
84-
regionOverride: AwsRegion? = null
85-
): T = AwsClientManager
86-
.getInstance(this)
87-
.getClient(credentialsProviderOverride = credentialsProviderOverride, regionOverride = regionOverride)
62+
inline fun <reified T : SdkClient> Project.awsClient(): T {
63+
val accountSettingsManager = AwsConnectionManager.getInstance(this)
8864

89-
inline fun <reified T : SdkClient> Project.awsClient(connectionSettings: ConnectionSettings): T = AwsClientManager
90-
.getInstance(this)
91-
.getClient(connectionSettings.credentials, connectionSettings.region)
65+
return AwsClientManager
66+
.getInstance()
67+
.getClient(accountSettingsManager.activeCredentialProvider, accountSettingsManager.activeRegion)
68+
}

jetbrains-core/src/software/aws/toolkits/jetbrains/core/AwsResourceCache.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ class ClientBackedCachedResource<ReturnType, ClientType : SdkClient>(
179179
constructor(sdkClientClass: KClass<ClientType>, id: String, fetchCall: ClientType.() -> ReturnType) : this(sdkClientClass, id, null, fetchCall)
180180

181181
override fun fetch(project: Project, region: AwsRegion, credentials: ToolkitCredentialsProvider): ReturnType {
182-
val client = AwsClientManager.getInstance(project).getClient(sdkClientClass, credentials, region)
182+
val client = AwsClientManager.getInstance().getClient(sdkClientClass, credentials, region)
183183
return fetchCall(client)
184184
}
185185

jetbrains-core/src/software/aws/toolkits/jetbrains/services/clouddebug/actions/InstrumentDialog.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import software.amazon.awssdk.services.iam.IamClient
1515
import software.amazon.awssdk.services.iam.model.PolicyEvaluationDecisionType
1616
import software.aws.toolkits.core.utils.getLogger
1717
import software.aws.toolkits.core.utils.warn
18-
import software.aws.toolkits.jetbrains.core.AwsClientManager
1918
import software.aws.toolkits.jetbrains.core.awsClient
2019
import software.aws.toolkits.jetbrains.core.credentials.AwsConnectionManager
2120
import software.aws.toolkits.jetbrains.core.help.HelpIds
@@ -128,7 +127,7 @@ class InstrumentDialog(private val project: Project, val clusterArn: String, val
128127
// Auto-select task-role (if it exists in the task-definition). Runs on a background thread.
129128
private fun attemptSelectRole() =
130129
try {
131-
val client: EcsClient = AwsClientManager.getInstance(project).getClient()
130+
val client: EcsClient = project.awsClient()
132131
val service = client.describeServices {
133132
it.cluster(clusterArn)
134133
it.services(serviceArn)

jetbrains-core/src/software/aws/toolkits/jetbrains/services/cloudformation/actions/DeleteStackAction.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ package software.aws.toolkits.jetbrains.services.cloudformation.actions
55

66
import com.intellij.openapi.application.runInEdt
77
import software.amazon.awssdk.services.cloudformation.CloudFormationClient
8-
import software.aws.toolkits.jetbrains.core.AwsClientManager
8+
import software.aws.toolkits.jetbrains.core.awsClient
99
import software.aws.toolkits.jetbrains.core.explorer.actions.DeleteResourceAction
1010
import software.aws.toolkits.jetbrains.core.explorer.refreshAwsTree
1111
import software.aws.toolkits.jetbrains.services.cloudformation.CloudFormationStackNode
@@ -20,7 +20,7 @@ class DeleteStackAction : DeleteResourceAction<CloudFormationStackNode>(
2020
TaggingResourceType.CLOUDFORMATION_STACK
2121
) {
2222
override fun performDelete(selected: CloudFormationStackNode) {
23-
val client: CloudFormationClient = AwsClientManager.getInstance(selected.nodeProject).getClient()
23+
val client: CloudFormationClient = selected.nodeProject.awsClient()
2424
client.deleteStack { it.stackName(selected.stackName) }
2525
runInEdt {
2626
StackWindowManager.getInstance(selected.nodeProject).openStack(selected.stackName, selected.stackId)

jetbrains-core/src/software/aws/toolkits/jetbrains/services/cloudformation/stack/Stack.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import com.intellij.uiDesigner.core.GridLayoutManager
1717
import com.intellij.util.ui.JBUI
1818
import icons.AwsIcons
1919
import software.amazon.awssdk.services.cloudformation.model.StackStatus
20-
import software.aws.toolkits.jetbrains.core.AwsClientManager
20+
import software.aws.toolkits.jetbrains.core.awsClient
2121
import software.aws.toolkits.jetbrains.core.explorer.actions.SingleResourceNodeAction
2222
import software.aws.toolkits.jetbrains.core.toolwindow.ToolkitToolWindow
2323
import software.aws.toolkits.jetbrains.core.toolwindow.ToolkitToolWindowManager
@@ -136,7 +136,7 @@ private class StackUI(private val project: Project, private val stackName: Strin
136136
stackName = stackName,
137137
updateEveryMs = UPDATE_STACK_STATUS_INTERVAL,
138138
listener = this,
139-
client = AwsClientManager.getInstance(project).getClient(),
139+
client = project.awsClient(),
140140
setPagesAvailable = pageButtons::setPagesAvailable
141141
)
142142

jetbrains-core/src/software/aws/toolkits/jetbrains/services/cloudwatch/logs/actions/DeleteGroupAction.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
package software.aws.toolkits.jetbrains.services.cloudwatch.logs.actions
55

66
import software.amazon.awssdk.services.cloudwatchlogs.CloudWatchLogsClient
7-
import software.aws.toolkits.jetbrains.core.AwsClientManager
7+
import software.aws.toolkits.jetbrains.core.awsClient
88
import software.aws.toolkits.jetbrains.core.explorer.actions.DeleteResourceAction
99
import software.aws.toolkits.jetbrains.core.explorer.refreshAwsTree
1010
import software.aws.toolkits.jetbrains.services.cloudwatch.logs.CloudWatchLogWindow
@@ -15,7 +15,7 @@ import software.aws.toolkits.resources.message
1515

1616
class DeleteGroupAction : DeleteResourceAction<CloudWatchLogsNode>(message("cloudwatch.logs.delete_log_group"), TaggingResourceType.CLOUDWATCHLOGS_GROUP) {
1717
override fun performDelete(selected: CloudWatchLogsNode) {
18-
val client: CloudWatchLogsClient = AwsClientManager.getInstance(selected.nodeProject).getClient()
18+
val client: CloudWatchLogsClient = selected.nodeProject.awsClient()
1919

2020
CloudWatchLogWindow.getInstance(selected.nodeProject)?.closeLogGroup(selected.logGroupName)
2121

jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/actions/DeleteFunctionAction.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
package software.aws.toolkits.jetbrains.services.lambda.actions
55

66
import software.amazon.awssdk.services.lambda.LambdaClient
7-
import software.aws.toolkits.jetbrains.core.AwsClientManager
7+
import software.aws.toolkits.jetbrains.core.awsClient
88
import software.aws.toolkits.jetbrains.core.explorer.actions.DeleteResourceAction
99
import software.aws.toolkits.jetbrains.core.explorer.refreshAwsTree
1010
import software.aws.toolkits.jetbrains.services.lambda.LambdaFunctionNode
@@ -15,8 +15,9 @@ import software.aws.toolkits.resources.message
1515
class DeleteFunctionAction : DeleteResourceAction<LambdaFunctionNode>(message("lambda.function.delete.action"), TaggingResourceType.LAMBDA_FUNCTION) {
1616
override fun performDelete(selected: LambdaFunctionNode) {
1717
val project = selected.nodeProject
18-
val client: LambdaClient = AwsClientManager.getInstance(project).getClient()
18+
19+
val client: LambdaClient = project.awsClient()
1920
client.deleteFunction { it.functionName(selected.functionName()) }
20-
selected.nodeProject.refreshAwsTree(LambdaResources.LIST_FUNCTIONS)
21+
project.refreshAwsTree(LambdaResources.LIST_FUNCTIONS)
2122
}
2223
}

0 commit comments

Comments
 (0)