Skip to content

Commit 092dc15

Browse files
authored
Add tags support for SAM deploy (#2703)
1 parent 63b5722 commit 092dc15

File tree

18 files changed

+264
-155
lines changed

18 files changed

+264
-155
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "Add support for updating tags during SAM deployment"
4+
}

jetbrains-core/it/software/aws/toolkits/jetbrains/services/lambda/deploy/SamDeployTest.kt

+66-10
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import org.junit.Test
1313
import software.amazon.awssdk.regions.Region
1414
import software.amazon.awssdk.services.cloudformation.CloudFormationClient
1515
import software.amazon.awssdk.services.cloudformation.model.Parameter
16+
import software.amazon.awssdk.services.cloudformation.model.Tag
1617
import software.amazon.awssdk.services.ecr.EcrClient
1718
import software.amazon.awssdk.services.s3.S3Client
1819
import software.aws.toolkits.core.region.AwsRegion
@@ -102,7 +103,7 @@ class SamDeployTest {
102103
val stackName = "SamDeployTest-${UUID.randomUUID()}"
103104
val templateFile = setUpProject(largeTemplateLocation)
104105
runAssertsAndClean(stackName) {
105-
val changeSetArn = createChangeSet(templateFile, stackName, mapOf("InstanceType" to "t2.small"), false)
106+
val changeSetArn = createChangeSet(templateFile, stackName, hasImage = false, parameters = mapOf("InstanceType" to "t2.small"))
106107

107108
assertThat(changeSetArn).isNotNull()
108109

@@ -126,7 +127,7 @@ class SamDeployTest {
126127
val stackName = "SamDeployTest-${UUID.randomUUID()}"
127128
val templateFile = setUpProject()
128129
runAssertsAndClean(stackName) {
129-
val changeSetArn = createChangeSet(templateFile, stackName, mapOf("TestParameter" to "FooBar"), false)
130+
val changeSetArn = createChangeSet(templateFile, stackName, hasImage = false, parameters = mapOf("TestParameter" to "FooBar"))
130131

131132
assertThat(changeSetArn).isNotNull()
132133

@@ -169,6 +170,51 @@ class SamDeployTest {
169170
}
170171
}
171172

173+
@Test
174+
fun deployAppUsingSamWithTags() {
175+
val stackName = "SamDeployTest-${UUID.randomUUID()}"
176+
val templateFile = setUpProject()
177+
runAssertsAndClean(stackName) {
178+
val changeSetArn = createChangeSet(
179+
templateFile, stackName, hasImage = false,
180+
tags = mapOf(
181+
"TestTag" to "FooBar",
182+
"some:gross" to "tag name and value",
183+
// SAM test cases https://github.com/aws/aws-sam-cli/pull/1798/files
184+
"a+-=._:/@" to "b+-=._:/@",
185+
"--c=" to "=d/"
186+
)
187+
)
188+
189+
assertThat(changeSetArn).isNotNull()
190+
191+
val describeChangeSetResponse = cfnClient.describeChangeSet {
192+
it.stackName(stackName)
193+
it.changeSetName(changeSetArn)
194+
}
195+
196+
assertThat(describeChangeSetResponse).isNotNull
197+
assertThat(describeChangeSetResponse.tags()).containsExactlyInAnyOrder(
198+
Tag.builder()
199+
.key("TestTag")
200+
.value("FooBar")
201+
.build(),
202+
Tag.builder()
203+
.key("some:gross")
204+
.value("tag name and value")
205+
.build(),
206+
Tag.builder()
207+
.key("a+-=._:/@")
208+
.value("b+-=._:/@")
209+
.build(),
210+
Tag.builder()
211+
.key("--c=")
212+
.value("=d/")
213+
.build()
214+
)
215+
}
216+
}
217+
172218
private fun setUpProject(templateFilePath: String? = null): VirtualFile {
173219
projectRule.fixture.addFileToProject(
174220
"hello_world/app.py",
@@ -202,7 +248,7 @@ class SamDeployTest {
202248
Properties:
203249
Handler: hello_world/app.lambda_handler
204250
CodeUri: .
205-
Runtime: python2.7
251+
Runtime: python3.8
206252
Timeout: 900
207253
""".trimIndent()
208254
).virtualFile
@@ -211,7 +257,13 @@ class SamDeployTest {
211257
}
212258
}
213259

214-
private fun createChangeSet(templateFile: VirtualFile, stackName: String, parameters: Map<String, String> = emptyMap(), hasImage: Boolean): String? =
260+
private fun createChangeSet(
261+
templateFile: VirtualFile,
262+
stackName: String,
263+
hasImage: Boolean,
264+
parameters: Map<String, String> = emptyMap(),
265+
tags: Map<String, String> = emptyMap()
266+
): String? =
215267
runUnderRealCredentials(projectRule.project) {
216268
var changeSetArn: String? = null
217269
val deployDialog = runInEdtAndGet {
@@ -220,13 +272,17 @@ class SamDeployTest {
220272
message("serverless.application.deploy_in_progress.title", stackName),
221273
createDeployWorkflow(
222274
projectRule.project,
223-
stackName,
224275
templateFile,
225-
bucketRule.createBucket(stackName),
226-
if (hasImage) repositoryRule.createRepository(stackName).repositoryUri() else null,
227-
true,
228-
parameters,
229-
CreateCapabilities.values().toList()
276+
DeployServerlessApplicationSettings(
277+
stackName = stackName,
278+
bucket = bucketRule.createBucket(stackName),
279+
ecrRepo = if (hasImage) repositoryRule.createRepository(stackName).repositoryUri() else null,
280+
autoExecute = true,
281+
parameters = parameters,
282+
tags = tags,
283+
useContainer = false,
284+
capabilities = CreateCapabilities.values().toList()
285+
)
230286
),
231287
stackName
232288
)

jetbrains-core/src/software/aws/toolkits/jetbrains/services/apprunner/ui/CreationPanel.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import software.aws.toolkits.jetbrains.services.apprunner.resources.AppRunnerRes
2121
import software.aws.toolkits.jetbrains.services.iam.CreateIamServiceRoleDialog
2222
import software.aws.toolkits.jetbrains.services.iam.IamResources
2323
import software.aws.toolkits.jetbrains.services.iam.IamRole
24-
import software.aws.toolkits.jetbrains.ui.EnvironmentVariablesTextField
24+
import software.aws.toolkits.jetbrains.ui.KeyValueTextField
2525
import software.aws.toolkits.jetbrains.ui.ResourceSelector
2626
import software.aws.toolkits.jetbrains.utils.toHumanReadable
2727
import software.aws.toolkits.jetbrains.utils.ui.contextualHelp
@@ -38,7 +38,7 @@ class CreationPanel(private val project: Project, ecrUri: String? = null) {
3838
val cpuValues = listOf("1 vCPU", "2 vCPU")
3939
}
4040

41-
val environmentVariables = EnvironmentVariablesTextField()
41+
val environmentVariables = KeyValueTextField()
4242
lateinit var connection: ResourceSelector<ConnectionSummary>
4343
private set
4444
lateinit var ecrPolicy: ResourceSelector<IamRole>

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

+4-9
Original file line numberDiff line numberDiff line change
@@ -119,25 +119,20 @@ class DeployServerlessApplicationAction : AnAction(
119119
val settings = stackDialog.settings()
120120
saveSettings(project, templateFile, settings)
121121

122-
val stackName = settings.stackName
123-
continueDeployment(project, stackName, templateFile, settings)
122+
continueDeployment(project, templateFile, settings)
124123
}
125124
}
126125
}
127126

128-
private fun continueDeployment(project: Project, stackName: String, templateFile: VirtualFile, settings: DeployServerlessApplicationSettings) {
127+
private fun continueDeployment(project: Project, templateFile: VirtualFile, settings: DeployServerlessApplicationSettings) {
128+
val stackName = settings.stackName
129129
val workflow = StepExecutor(
130130
project,
131131
message("serverless.application.deploy_in_progress.title", stackName),
132132
createDeployWorkflow(
133133
project,
134-
stackName,
135134
templateFile,
136-
settings.bucket,
137-
settings.ecrRepo,
138-
settings.useContainer,
139-
settings.parameters,
140-
settings.capabilities
135+
settings
141136
),
142137
stackName
143138
)

0 commit comments

Comments
 (0)