Skip to content

Commit cffcd18

Browse files
authored
Handle Lambda states on function update (#3139)
1 parent 8c5c919 commit cffcd18

File tree

6 files changed

+25
-2
lines changed

6 files changed

+25
-2
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" : "Handle Lambda pending states while updating function (#2984)"
4+
}

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

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

66
import com.intellij.util.text.SemVer
7+
import software.amazon.awssdk.services.lambda.LambdaClient
78
import software.aws.toolkits.core.lambda.LambdaArchitecture
89
import software.aws.toolkits.core.lambda.LambdaRuntime
910
import software.aws.toolkits.jetbrains.services.lambda.sam.SamExecutable
11+
import software.aws.toolkits.jetbrains.utils.assertIsNonDispatchThread
1012

1113
fun LambdaRuntime.minSamDebuggingVersion(): SemVer =
1214
minSamDebugging?.let { SemVer.parseFromText(it) ?: throw IllegalStateException("$this has bad minSamDebuggingVersion! It should be a semver string!") }
@@ -19,3 +21,10 @@ fun LambdaRuntime.minSamInitVersion(): SemVer =
1921
fun LambdaArchitecture.minSamVersion(): SemVer =
2022
minSam?.let { SemVer.parseFromText(it) ?: throw IllegalStateException("$this has bad minSamInitVersion! It should be a semver string!") }
2123
?: SamExecutable.minVersion
24+
25+
fun LambdaClient.waitForUpdatableState(functionName: String) {
26+
assertIsNonDispatchThread()
27+
// wait until function is both active and not being updated
28+
waiter().waitUntilFunctionActive { it.functionName(functionName) }
29+
waiter().waitUntilFunctionUpdated { it.functionName(functionName) }
30+
}

jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/steps/UpdateLambdaCode.kt

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

66
import software.amazon.awssdk.services.lambda.LambdaClient
77
import software.aws.toolkits.jetbrains.services.lambda.steps.PackageLambda.Companion.UPLOADED_CODE_LOCATION
8+
import software.aws.toolkits.jetbrains.services.lambda.waitForUpdatableState
89
import software.aws.toolkits.jetbrains.utils.execution.steps.Context
910
import software.aws.toolkits.jetbrains.utils.execution.steps.Step
1011
import software.aws.toolkits.jetbrains.utils.execution.steps.StepEmitter
@@ -13,7 +14,9 @@ import software.aws.toolkits.resources.message
1314
class UpdateLambdaCode(private val lambdaClient: LambdaClient, private val functionName: String, private val updatedHandler: String?) : Step() {
1415
override val stepName = message("lambda.create.step.update_lambda")
1516

16-
override fun execute(context: Context, messageEmitter: StepEmitter, ignoreCancellation: Boolean) {
17+
override fun execute(context: Context, stepEmitter: StepEmitter, ignoreCancellation: Boolean) {
18+
stepEmitter.emitMessageLine(message("lambda.workflow.update_code.wait_for_updatable"), isError = false)
19+
lambdaClient.waitForUpdatableState(functionName)
1720
lambdaClient.updateFunctionCode {
1821
it.functionName(functionName)
1922

@@ -30,13 +33,15 @@ class UpdateLambdaCode(private val lambdaClient: LambdaClient, private val funct
3033
}
3134

3235
updatedHandler?.let { _ ->
36+
stepEmitter.emitMessageLine(message("lambda.workflow.update_code.wait_for_updatable"), isError = false)
37+
lambdaClient.waitForUpdatableState(functionName)
3338
lambdaClient.updateFunctionConfiguration {
3439
it.functionName(functionName)
3540
it.handler(updatedHandler)
3641
}
3742
}
3843

39-
messageEmitter.emitMessage(message("lambda.workflow.update_code.wait_for_stable"), isError = false)
44+
stepEmitter.emitMessageLine(message("lambda.workflow.update_code.wait_for_stable"), isError = false)
4045
lambdaClient.waiter().waitUntilFunctionUpdated { it.functionName(functionName) }
4146
}
4247
}

jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/upload/UpdateFunctionConfigDialog.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import software.amazon.awssdk.services.lambda.model.Runtime
1616
import software.aws.toolkits.jetbrains.core.awsClient
1717
import software.aws.toolkits.jetbrains.core.help.HelpIds
1818
import software.aws.toolkits.jetbrains.services.lambda.LambdaFunction
19+
import software.aws.toolkits.jetbrains.services.lambda.waitForUpdatableState
1920
import software.aws.toolkits.jetbrains.utils.notifyInfo
2021
import software.aws.toolkits.resources.message
2122
import software.aws.toolkits.telemetry.LambdaPackageType
@@ -82,6 +83,7 @@ class UpdateFunctionConfigDialog(private val project: Project, private val initi
8283

8384
ApplicationManager.getApplication().executeOnPooledThread {
8485
try {
86+
lambdaClient.waitForUpdatableState(functionDetails.name)
8587
lambdaClient.updateFunctionConfiguration(functionDetails)
8688

8789
notifyInfo(

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/lambda/steps/UpdateLambdaCodeTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import software.amazon.awssdk.services.lambda.LambdaClient
1717
import software.amazon.awssdk.services.lambda.model.GetFunctionConfigurationRequest
1818
import software.amazon.awssdk.services.lambda.model.GetFunctionConfigurationResponse
1919
import software.amazon.awssdk.services.lambda.model.LastUpdateStatus
20+
import software.amazon.awssdk.services.lambda.model.State
2021
import software.amazon.awssdk.services.lambda.model.UpdateFunctionCodeRequest
2122
import software.amazon.awssdk.services.lambda.model.UpdateFunctionCodeResponse
2223
import software.amazon.awssdk.services.lambda.model.UpdateFunctionConfigurationRequest
@@ -85,6 +86,7 @@ class UpdateLambdaCodeTest {
8586
on { updateFunctionCode(codeRequestCaptor.capture()) } doReturn UpdateFunctionCodeResponse.builder().build()
8687
on { updateFunctionConfiguration(configRequestCaptor.capture()) } doReturn UpdateFunctionConfigurationResponse.builder().build()
8788
on { getFunctionConfiguration(any<GetFunctionConfigurationRequest>()) } doReturn GetFunctionConfigurationResponse.builder()
89+
.state(State.ACTIVE)
8890
.lastUpdateStatus(LastUpdateStatus.SUCCESSFUL)
8991
.build()
9092
}

resources/resources/software/aws/toolkits/resources/MessagesBundle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -809,6 +809,7 @@ lambda.workflow.create_new.name=Create new Lambda
809809
lambda.workflow.create_new.wait_for_stable=Waiting for function to be created
810810
lambda.workflow.update_code.name=Update Lambda code
811811
lambda.workflow.update_code.wait_for_stable=Waiting for function to stabilize
812+
lambda.workflow.update_code.wait_for_updatable=Waiting for function to transition to an updatable state
812813
loading_resource.failed=Failed loading resources
813814
loading_resource.loading=Loading...
814815
loading_resource.still_loading=Resources are still loading

0 commit comments

Comments
 (0)