Skip to content

Commit ccee330

Browse files
authored
Fix IllegalStateException when using connected execution experiement is enabled (#3007)
1 parent 9c2727b commit ccee330

File tree

4 files changed

+57
-22
lines changed

4 files changed

+57
-22
lines changed

jetbrains-core/src/software/aws/toolkits/jetbrains/core/execution/AwsConnectionExtension.kt

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import software.aws.toolkits.core.utils.getLogger
1616
import software.aws.toolkits.core.utils.tryOrNull
1717
import software.aws.toolkits.jetbrains.core.credentials.AwsConnectionManager
1818
import software.aws.toolkits.jetbrains.core.credentials.CredentialManager
19+
import software.aws.toolkits.jetbrains.core.execution.AwsCredentialInjectionOptions.Companion.DEFAULT_OPTIONS
1920
import software.aws.toolkits.jetbrains.core.region.AwsRegionProvider
2021
import software.aws.toolkits.resources.message
2122
import software.aws.toolkits.telemetry.AwsTelemetry
@@ -24,26 +25,11 @@ import software.aws.toolkits.telemetry.Result.Succeeded
2425

2526
class AwsConnectionRunConfigurationExtension<T : RunConfigurationBase<*>> {
2627
fun addEnvironmentVariables(configuration: T, environment: MutableMap<String, String>, runtimeString: () -> String? = { null }) {
27-
val regionProvider = AwsRegionProvider.getInstance()
28-
val credentialManager = CredentialManager.getInstance()
29-
val credentialConfiguration = configuration.getCopyableUserData(AWS_CONNECTION_RUN_CONFIGURATION_KEY) ?: return
30-
3128
try {
32-
val connection = if (credentialConfiguration.useCurrentConnection) {
33-
AwsConnectionManager.getInstance(configuration.project).connectionSettings() ?: throw RuntimeException(message("configure.toolkit"))
34-
} else {
35-
val region = credentialConfiguration.region?.let {
36-
regionProvider.allRegions()[it]
37-
} ?: throw IllegalStateException(message("configure.validate.no_region_specified"))
38-
39-
val credentialProviderId = credentialConfiguration.credential ?: throw IllegalStateException(message("aws.notification.credentials_missing"))
40-
41-
val credentialProvider = credentialManager.getCredentialIdentifierById(credentialProviderId)?.let {
42-
credentialManager.getAwsCredentialProvider(it, region)
43-
} ?: throw RuntimeException(message("aws.notification.credentials_missing"))
29+
val credentialConfiguration = credentialConfiguration(configuration) ?: return
30+
if (credentialConfiguration == DEFAULT_OPTIONS) return
4431

45-
ConnectionSettings(credentialProvider, region)
46-
}
32+
val connection = getConnection(configuration, credentialConfiguration)
4733
connection.region.mergeWithExistingEnvironmentVariables(environment)
4834
connection.credentials.resolveCredentials().mergeWithExistingEnvironmentVariables(environment)
4935
AwsTelemetry.injectCredentials(configuration.project, result = Succeeded, runtimeString = tryOrNull { runtimeString() })
@@ -53,6 +39,13 @@ class AwsConnectionRunConfigurationExtension<T : RunConfigurationBase<*>> {
5339
}
5440
}
5541

42+
fun validateConfiguration(runConfiguration: T, isExecution: Boolean) {
43+
val credentialConfiguration = runConfiguration.getCopyableUserData(AWS_CONNECTION_RUN_CONFIGURATION_KEY) ?: return
44+
if (credentialConfiguration == DEFAULT_OPTIONS) return
45+
46+
getConnection(runConfiguration, credentialConfiguration)
47+
}
48+
5649
fun readExternal(runConfiguration: T, element: Element) {
5750
runConfiguration.putCopyableUserData(
5851
AWS_CONNECTION_RUN_CONFIGURATION_KEY,
@@ -69,6 +62,29 @@ class AwsConnectionRunConfigurationExtension<T : RunConfigurationBase<*>> {
6962
}
7063
}
7164

65+
private fun credentialConfiguration(configuration: T) = configuration.getCopyableUserData(AWS_CONNECTION_RUN_CONFIGURATION_KEY)
66+
67+
private fun getConnection(configuration: T, credentialConfiguration: AwsCredentialInjectionOptions): ConnectionSettings {
68+
val regionProvider = AwsRegionProvider.getInstance()
69+
val credentialManager = CredentialManager.getInstance()
70+
71+
return if (credentialConfiguration.useCurrentConnection) {
72+
AwsConnectionManager.getInstance(configuration.project).connectionSettings() ?: throw RuntimeException(message("configure.toolkit"))
73+
} else {
74+
val region = credentialConfiguration.region?.let {
75+
regionProvider.allRegions()[it]
76+
} ?: throw IllegalStateException(message("configure.validate.no_region_specified"))
77+
78+
val credentialProviderId = credentialConfiguration.credential ?: throw IllegalStateException(message("aws.notification.credentials_missing"))
79+
80+
val credentialProvider = credentialManager.getCredentialIdentifierById(credentialProviderId)?.let {
81+
credentialManager.getAwsCredentialProvider(it, region)
82+
} ?: throw RuntimeException(message("aws.notification.credentials_missing"))
83+
84+
ConnectionSettings(credentialProvider, region)
85+
}
86+
}
87+
7288
private companion object {
7389
val LOG = getLogger<AwsConnectionRunConfigurationExtension<*>>()
7490
}
@@ -88,12 +104,13 @@ val AWS_CONNECTION_RUN_CONFIGURATION_KEY =
88104
"aws.toolkit.runConfigurationConnection"
89105
)
90106

91-
class AwsCredentialInjectionOptions {
92-
var useCurrentConnection: Boolean = false
93-
var region: String? = null
107+
data class AwsCredentialInjectionOptions(
108+
var useCurrentConnection: Boolean = false,
109+
var region: String? = null,
94110
var credential: String? = null
95-
111+
) {
96112
companion object {
97113
operator fun invoke(block: AwsCredentialInjectionOptions.() -> Unit) = AwsCredentialInjectionOptions().apply(block)
114+
val DEFAULT_OPTIONS by lazy { AwsCredentialInjectionOptions() }
98115
}
99116
}

jetbrains-core/src/software/aws/toolkits/jetbrains/core/execution/JavaAwsConnectionExtension.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ class JavaAwsConnectionExtension : RunConfigurationExtension() {
4141

4242
override fun <T : RunConfigurationBase<*>?> createEditor(configuration: T): SettingsEditor<T>? = connectionSettingsEditor(configuration)
4343

44+
override fun validateConfiguration(configuration: RunConfigurationBase<*>, isExecution: Boolean) {
45+
delegate.validateConfiguration(configuration, isExecution)
46+
}
47+
4448
override fun readExternal(runConfiguration: RunConfigurationBase<*>, element: Element) = delegate.readExternal(runConfiguration, element)
4549

4650
override fun writeExternal(runConfiguration: RunConfigurationBase<*>, element: Element) = delegate.writeExternal(runConfiguration, element)

jetbrains-core/src/software/aws/toolkits/jetbrains/core/execution/PythonAwsConnectionExtension.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ class PythonAwsConnectionExtension : PythonRunConfigurationExtension() {
4141
configuration
4242
)
4343

44+
override fun validateConfiguration(configuration: AbstractPythonRunConfiguration<*>, isExecution: Boolean) {
45+
delegate.validateConfiguration(configuration, isExecution)
46+
}
47+
4448
private fun isEnabled() = PythonAwsConnectionExperiment.isEnabled()
4549
}
4650

jetbrains-core/tst/software/aws/toolkits/jetbrains/core/execution/JavaAwsConnectionExtensionTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,16 @@ class JavaAwsConnectionExtensionTest {
9191
assertThat(configuration.getCopyableUserData(AWS_CONNECTION_RUN_CONFIGURATION_KEY)).isNull()
9292
}
9393

94+
@Test
95+
fun `Does not throw on default options`() {
96+
val runManager = RunManager.getInstance(projectRule.project)
97+
val configuration = runManager.createConfiguration("test", ApplicationConfigurationType::class.java).configuration as ApplicationConfiguration
98+
configuration.putCopyableUserData(AWS_CONNECTION_RUN_CONFIGURATION_KEY, AwsCredentialInjectionOptions.DEFAULT_OPTIONS)
99+
val extension = JavaAwsConnectionExtension()
100+
val map = mutableMapOf<String, String>()
101+
extension.updateJavaParameters(configuration, mock { on { env } doAnswer { map } }, null)
102+
}
103+
94104
@Test
95105
fun `Inject injects environment variables`() {
96106
val runManager = RunManager.getInstance(projectRule.project)

0 commit comments

Comments
 (0)