Skip to content

Commit 2d4edaa

Browse files
authored
Fix resource selectors assuming every region has every service (#2441)
Fixes issue #2435
1 parent fa00d75 commit 2d4edaa

File tree

14 files changed

+112
-9
lines changed

14 files changed

+112
-9
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Fix resource selectors assuming every region has every service (#2435)"
4+
}

core/src/software/aws/toolkits/core/region/ToolkitRegionProvider.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ abstract class ToolkitRegionProvider {
2020
*/
2121
fun allRegions(): Map<String, AwsRegion> = partitionData().flatMap { it.value.regions.asIterable() }.associate { it.key to it.value }
2222

23+
/**
24+
* Returns a map of region ID([AwsRegion.id]) to [AwsRegion], filtering by if the service is supported
25+
*/
26+
fun allRegionsForService(serviceId: String): Map<String, AwsRegion> = allRegions().filter { isServiceSupported(it.value, serviceId) }
27+
2328
/**
2429
* Returns a map of region ID([AwsRegion.id]) to [AwsRegion] for the specified partition
2530
*/

jetbrains-core/src/software/aws/toolkits/jetbrains/services/ecs/execution/EcsCloudDebugRunConfiguration.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.intellij.openapi.options.SettingsEditor
1616
import com.intellij.openapi.options.SettingsEditorGroup
1717
import com.intellij.openapi.project.Project
1818
import org.jdom.Element
19+
import software.amazon.awssdk.services.ecs.EcsClient
1920
import software.aws.toolkits.core.utils.error
2021
import software.aws.toolkits.core.utils.getLogger
2122
import software.aws.toolkits.jetbrains.core.AwsResourceCache
@@ -57,7 +58,7 @@ class EcsCloudDebugRunConfiguration(project: Project, private val configFactory:
5758

5859
val editor = EcsCloudDebugSettingsEditor(project)
5960
group.addEditor(ExecutionBundle.message("run.configuration.configuration.tab.title"), editor)
60-
group.addAwsConnectionEditor(AwsConnectionSettingsEditor(project, editor::awsConnectionUpdated))
61+
group.addAwsConnectionEditor(AwsConnectionSettingsEditor(project, EcsClient.SERVICE_NAME, editor::awsConnectionUpdated))
6162

6263
return group
6364
}

jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/execution/local/LocalLambdaRunConfiguration.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.intellij.refactoring.listeners.RefactoringElementListener
2222
import com.intellij.util.PathMappingSettings.PathMapping
2323
import com.intellij.util.text.SemVer
2424
import org.jetbrains.concurrency.isPending
25+
import software.amazon.awssdk.services.lambda.LambdaClient
2526
import software.amazon.awssdk.services.lambda.model.Runtime
2627
import software.aws.toolkits.core.lambda.LambdaRuntime
2728
import software.aws.toolkits.core.lambda.validOrNull
@@ -74,7 +75,7 @@ class LocalLambdaRunConfiguration(project: Project, factory: ConfigurationFactor
7475
val group = SettingsEditorGroup<LocalLambdaRunConfiguration>()
7576
group.addEditor(ExecutionBundle.message("run.configuration.configuration.tab.title"), LocalLambdaRunSettingsEditor(project))
7677
group.addEditor(message("lambda.run_configuration.sam"), SamSettingsEditor())
77-
group.addAwsConnectionEditor(AwsConnectionSettingsEditor(project))
78+
group.addAwsConnectionEditor(AwsConnectionSettingsEditor(project, LambdaClient.SERVICE_NAME))
7879
return group
7980
}
8081

jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/execution/remote/RemoteLambdaRunConfiguration.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.intellij.execution.configurations.RuntimeConfigurationError
1111
import com.intellij.execution.runners.ExecutionEnvironment
1212
import com.intellij.openapi.options.SettingsEditorGroup
1313
import com.intellij.openapi.project.Project
14+
import software.amazon.awssdk.services.lambda.LambdaClient
1415
import software.aws.toolkits.core.credentials.ToolkitCredentialsProvider
1516
import software.aws.toolkits.core.region.AwsRegion
1617
import software.aws.toolkits.jetbrains.services.lambda.execution.LambdaRunConfigurationBase
@@ -34,7 +35,7 @@ class RemoteLambdaRunConfiguration(project: Project, factory: ConfigurationFacto
3435
val group = SettingsEditorGroup<RemoteLambdaRunConfiguration>()
3536
val remoteLambdaSettings = RemoteLambdaRunSettingsEditor(project)
3637
group.addEditor(ExecutionBundle.message("run.configuration.configuration.tab.title"), remoteLambdaSettings)
37-
group.addAwsConnectionEditor(AwsConnectionSettingsEditor(project, remoteLambdaSettings::updateFunctions))
38+
group.addAwsConnectionEditor(AwsConnectionSettingsEditor(project, LambdaClient.SERVICE_NAME, remoteLambdaSettings::updateFunctions))
3839
return group
3940
}
4041

jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/wizard/SchemaSelectionPanel.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.intellij.openapi.ui.TextFieldWithBrowseButton
99
import com.intellij.openapi.ui.ValidationInfo
1010
import com.intellij.openapi.vfs.VfsUtil
1111
import com.intellij.ui.layout.panel
12+
import software.amazon.awssdk.services.schemas.SchemasClient
1213
import software.aws.toolkits.core.lambda.LambdaRuntime
1314
import software.aws.toolkits.jetbrains.services.lambda.BuiltInRuntimeGroups
1415
import software.aws.toolkits.jetbrains.services.lambda.RuntimeGroup
@@ -27,7 +28,8 @@ class SchemaSelectionPanel : WizardFragment {
2728
private val schemaSelector by lazy { SchemaResourceSelector() }
2829
private val awsConnectionSelector by lazy {
2930
AwsConnectionSettingsSelector(
30-
null
31+
project = null,
32+
serviceId = SchemasClient.SERVICE_NAME
3133
) {
3234
val prev = schemaSelector.awsConnection
3335
schemaSelector.awsConnection = it

jetbrains-core/src/software/aws/toolkits/jetbrains/ui/RegionSelector.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ class RegionSelector : ComboBox<AwsRegion>() {
3737
var selectedRegion: AwsRegion?
3838
get() = selected()
3939
set(value) {
40-
selectedItem = value
40+
selectedItem = if (comboBoxModel.items.contains(value)) {
41+
value
42+
} else {
43+
null
44+
}
4145
}
4246

4347
private companion object {

jetbrains-core/src/software/aws/toolkits/jetbrains/ui/connection/AwsConnectionSettingsEditor.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,19 @@ import software.aws.toolkits.jetbrains.core.region.AwsRegionProvider
1919
import software.aws.toolkits.resources.message
2020
import javax.swing.JComponent
2121

22+
/**
23+
* AWS settings for run configurations. Settings will be serialized with the rest of the run configuration.
24+
* @param project The active project
25+
* @param serviceName The ID of the service (accessed through <AWS client>.SERVICE_NAME in the JAVA SDK v2)
26+
* used to filter out regions based on what regions a service is available in.
27+
* @param settingsChangedListener A callback for when settings are changed
28+
*/
2229
class AwsConnectionSettingsEditor<T : AwsConnectionsRunConfigurationBase<*>>(
2330
project: Project,
31+
serviceName: String? = null,
2432
settingsChangedListener: (AwsRegion?, String?) -> Unit = { _, _ -> }
2533
) : SettingsEditor<T>() {
26-
private val awsConnectionSelector = AwsConnectionSettingsSelector(project) {
34+
private val awsConnectionSelector = AwsConnectionSettingsSelector(project, serviceName) {
2735
// TODO: Undo this unwrapping
2836
settingsChangedListener.invoke(it?.region, it?.credentials?.id)
2937
}

jetbrains-core/src/software/aws/toolkits/jetbrains/ui/connection/AwsConnectionSettingsSelector.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,20 @@ import javax.swing.event.PopupMenuEvent
1616

1717
class AwsConnectionSettingsSelector(
1818
project: Project?,
19-
private val settingsChangedListener: (ConnectionSettings?) -> Unit = { _ -> }
19+
serviceId: String? = null,
20+
private val settingsChangedListener: (ConnectionSettings?) -> Unit = { _ -> },
2021
) {
2122
private val regionProvider = AwsRegionProvider.getInstance()
2223
private val credentialManager = CredentialManager.getInstance()
2324
val view = AwsConnectionSettings()
2425

2526
init {
26-
view.region.setRegions(regionProvider.allRegions().values.toMutableList())
27+
val regions = if (serviceId != null) {
28+
regionProvider.allRegionsForService(serviceId).values.toMutableList()
29+
} else {
30+
regionProvider.allRegions().values.toMutableList()
31+
}
32+
view.region.setRegions(regions)
2733
view.credentialProvider.setCredentialsProviders(credentialManager.getCredentialIdentifiers())
2834

2935
// nullable; unfortunately we can't rely on connection manager instance being retrievable from the default project

jetbrains-core/tst/software/aws/toolkits/jetbrains/core/region/AwsRegionProviderTest.kt

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,64 @@ class AwsRegionProviderTest {
151151
.containsKey("us-west-2")
152152
}
153153

154+
@Test
155+
fun allRegionsForServiceWorks() {
156+
createRegionDataProvider(
157+
"""
158+
{
159+
"partitions": [
160+
{
161+
"defaults": {
162+
"hostname": "{service}.{region}.{dnsSuffix}",
163+
"protocols": ["https"],
164+
"signatureVersions": ["v4"]
165+
},
166+
"dnsSuffix": "amazonaws.com",
167+
"partition": "aws",
168+
"partitionName": "AWS Standard",
169+
"regionRegex": "^(us|eu|ap|sa|ca|me)\\-\\w+\\-\\d+$",
170+
"regions": {
171+
"us-west-2": {
172+
"description": "US West (Oregon)"
173+
}
174+
},
175+
"services": {
176+
"a4b" : {
177+
"endpoints" : {
178+
"us-west-2" : { }
179+
}
180+
}
181+
}
182+
},
183+
{
184+
"defaults": {
185+
"hostname": "{service}.{region}.{dnsSuffix}",
186+
"protocols": ["https"],
187+
"signatureVersions": ["v4"]
188+
},
189+
"dnsSuffix": "amazonaws.com.cn",
190+
"partition": "aws-cn",
191+
"partitionName": "AWS China",
192+
"regionRegex": "^cn\\-\\w+\\-\\d+$",
193+
"regions": {
194+
"cn-north-1": {
195+
"description": "China (Beijing)"
196+
}
197+
},
198+
"services": {}
199+
}
200+
],
201+
"version": 3
202+
}
203+
""".trimIndent()
204+
)
205+
206+
val awsRegionProvider = AwsRegionProvider()
207+
assertThat(awsRegionProvider.allRegionsForService("a4b"))
208+
.doesNotContainKey("cn-north-1")
209+
.containsKey("us-west-2")
210+
}
211+
154212
@Test
155213
fun noDefaultRegionFallsBackToUsEast1() {
156214
createRegionDataProvider(

0 commit comments

Comments
 (0)