From e20be5a5b76013049e2b9b43f4959104be38e166 Mon Sep 17 00:00:00 2001 From: Ting Cheng Date: Thu, 30 May 2024 10:48:43 -0700 Subject: [PATCH 1/4] Amazon Q Code Transform: Improve download error ux --- ...-751c6024-4e83-46c2-bbd3-d6222d39afe8.json | 4 +++ .../codemodernizer/ArtifactHandler.kt | 33 +++++-------------- .../codemodernizer/CodeModernizerSession.kt | 21 ++++++++++++ .../commands/CodeTransformActionMessage.kt | 2 ++ .../commands/CodeTransformCommand.kt | 1 + .../commands/CodeTransformMessageListener.kt | 5 +++ .../constants/CodeTransformChatItems.kt | 29 ++++++++++++++++ .../controller/CodeTransformChatController.kt | 13 ++++++++ .../model/DownloadFailureReason.kt | 2 +- .../model/UploadFailureReason.kt | 1 + .../CodeWhispererCodeModernizerTest.kt | 10 ++---- .../resources/MessagesBundle.properties | 10 ++++-- 12 files changed, 95 insertions(+), 36 deletions(-) create mode 100644 .changes/next-release/feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json diff --git a/.changes/next-release/feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json b/.changes/next-release/feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json new file mode 100644 index 00000000000..b5216bb8dd0 --- /dev/null +++ b/.changes/next-release/feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json @@ -0,0 +1,4 @@ +{ + "type" : "feature", + "description" : "Amazon Q Code Transform: Improve download failure ux" +} \ No newline at end of file diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ArtifactHandler.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ArtifactHandler.kt index b30dfef04e9..7382cc88cd7 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ArtifactHandler.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ArtifactHandler.kt @@ -24,6 +24,7 @@ import software.aws.toolkits.jetbrains.core.coroutines.getCoroutineBgContext import software.aws.toolkits.jetbrains.core.coroutines.projectCoroutineScope import software.aws.toolkits.jetbrains.services.amazonq.CODE_TRANSFORM_TROUBLESHOOT_DOC_ARTIFACT import software.aws.toolkits.jetbrains.services.codemodernizer.client.GumbyClient +import software.aws.toolkits.jetbrains.services.codemodernizer.commands.CodeTransformMessageListener import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerArtifact import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformHilDownloadArtifact import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadFailureReason @@ -162,17 +163,18 @@ class ArtifactHandler(private val project: Project, private val clientAdaptor: G ) } } catch (e: Exception) { + var errorMessage: String = e.message.orEmpty() // SdkClientException will be thrown, masking actual issues like SSLHandshakeException underneath if (e.message.toString().contains(DOWNLOAD_PROXY_WILDCARD_ERROR)) { - notifyUnableToDownload( - DownloadFailureReason.PROXY_WILDCARD_ERROR, - ) + errorMessage = message("codemodernizer.notification.warn.download_failed_wildcard.content") + CodeTransformMessageListener.instance.onDownloadFailure(DownloadFailureReason.PROXY_WILDCARD_ERROR) } else if (e.message.toString().contains(DOWNLOAD_SSL_HANDSHAKE_ERROR)) { - notifyUnableToDownload( - DownloadFailureReason.SSL_HANDSHAKE_ERROR, - ) + errorMessage = message("codemodernizer.notification.warn.download_failed_ssl.content") + CodeTransformMessageListener.instance.onDownloadFailure(DownloadFailureReason.SSL_HANDSHAKE_ERROR) + } else { + CodeTransformMessageListener.instance.onDownloadFailure(DownloadFailureReason.OTHER(e.message.toString())) } - return DownloadArtifactResult(null, "", e.message.orEmpty()) + return DownloadArtifactResult(null, "", errorMessage) } finally { isCurrentlyDownloading.set(false) } @@ -208,23 +210,6 @@ class ArtifactHandler(private val project: Project, private val clientAdaptor: G } } - fun notifyUnableToDownload(error: DownloadFailureReason) { - LOG.error { "Unable to download artifact: $error" } - if (error == DownloadFailureReason.PROXY_WILDCARD_ERROR) { - notifyStickyWarn( - message("codemodernizer.notification.warn.view_diff_failed.title"), - message("codemodernizer.notification.warn.download_failed_wildcard.content", error), - project, - ) - } else if (error == DownloadFailureReason.SSL_HANDSHAKE_ERROR) { - notifyStickyWarn( - message("codemodernizer.notification.warn.view_diff_failed.title"), - message("codemodernizer.notification.warn.download_failed_ssl.content", error), - project, - ) - } - } - fun notifyUnableToApplyPatch(patchPath: String, errorMessage: String) { LOG.error { "Unable to find patch for file: $patchPath" } notifyStickyWarn( diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt index c112081abd8..8344e7c70af 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt @@ -9,6 +9,7 @@ import com.intellij.serviceContainer.AlreadyDisposedException import com.intellij.util.io.HttpRequests import kotlinx.coroutines.delay import org.apache.commons.codec.digest.DigestUtils +import software.amazon.awssdk.core.exception.SdkClientException import software.amazon.awssdk.services.codewhispererruntime.model.ResumeTransformationResponse import software.amazon.awssdk.services.codewhispererruntime.model.StartTransformationResponse import software.amazon.awssdk.services.codewhispererruntime.model.TransformationJob @@ -54,6 +55,7 @@ import java.time.Instant import java.util.Base64 import java.util.concurrent.CancellationException import java.util.concurrent.atomic.AtomicBoolean +import javax.net.ssl.SSLHandshakeException const val ZIP_SOURCES_PATH = "sources" const val BUILD_LOG_PATH = "build-logs.txt" @@ -62,6 +64,10 @@ const val MAX_ZIP_SIZE = 1000000000 // 1GB const val HIL_1P_UPGRADE_CAPABILITY = "HIL_1pDependency_VersionUpgrade" const val EXPLAINABILITY_V1 = "EXPLAINABILITY_V1" +// constants for handling SDKClientException +const val CONNECTION_REFUSED_ERROR: String = "Connection refused" +const val SSL_HANDSHAKE_ERROR: String = "Unable to execute HTTP request: PKIX path building failed" + class CodeModernizerSession( val sessionContext: CodeModernizerSessionContext, private val initialPollingSleepDurationMillis: Long = 2000, @@ -185,6 +191,10 @@ class CodeModernizerSession( state.putJobHistory(sessionContext, TransformationStatus.FAILED) state.currentJobStatus = TransformationStatus.FAILED return CodeModernizerStartJobResult.ZipUploadFailed(UploadFailureReason.CONNECTION_REFUSED) + } catch (e: SSLHandshakeException) { + state.putJobHistory(sessionContext, TransformationStatus.FAILED) + state.currentJobStatus = TransformationStatus.FAILED + return CodeModernizerStartJobResult.ZipUploadFailed(UploadFailureReason.SSL_HANDSHAKE_ERROR) } catch (e: HttpRequests.HttpStatusException) { state.putJobHistory(sessionContext, TransformationStatus.FAILED) state.currentJobStatus = TransformationStatus.FAILED @@ -204,6 +214,17 @@ class CodeModernizerSession( state.currentJobStatus = TransformationStatus.FAILED return CodeModernizerStartJobResult.ZipUploadFailed(UploadFailureReason.OTHER(e.localizedMessage.toString())) } + } catch (e: SdkClientException) { + // Errors from code whisperer client will always be thrown as SdkClientException + state.putJobHistory(sessionContext, TransformationStatus.FAILED) + state.currentJobStatus = TransformationStatus.FAILED + return if (e.message.toString().contains(CONNECTION_REFUSED_ERROR)) { + CodeModernizerStartJobResult.ZipUploadFailed(UploadFailureReason.CONNECTION_REFUSED) + } else if (e.message.toString().contains(SSL_HANDSHAKE_ERROR)) { + CodeModernizerStartJobResult.ZipUploadFailed(UploadFailureReason.SSL_HANDSHAKE_ERROR) + } else { + CodeModernizerStartJobResult.ZipUploadFailed(UploadFailureReason.OTHER(e.localizedMessage.toString())) + } } catch (e: Exception) { state.putJobHistory(sessionContext, TransformationStatus.FAILED) state.currentJobStatus = TransformationStatus.FAILED diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/commands/CodeTransformActionMessage.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/commands/CodeTransformActionMessage.kt index 565e1a0ed26..58f30e4257b 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/commands/CodeTransformActionMessage.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/commands/CodeTransformActionMessage.kt @@ -6,6 +6,7 @@ package software.aws.toolkits.jetbrains.services.codemodernizer.commands import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerJobCompletedResult import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformHilDownloadArtifact +import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadFailureReason import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenCopyCommandsResult data class CodeTransformActionMessage( @@ -13,4 +14,5 @@ data class CodeTransformActionMessage( val mavenBuildResult: MavenCopyCommandsResult? = null, val transformResult: CodeModernizerJobCompletedResult? = null, val hilDownloadArtifact: CodeTransformHilDownloadArtifact? = null, + val downloadFailure: DownloadFailureReason? = null, ) : AmazonQMessage diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/commands/CodeTransformCommand.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/commands/CodeTransformCommand.kt index a8f3ea1f1b0..f3a70577291 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/commands/CodeTransformCommand.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/commands/CodeTransformCommand.kt @@ -10,6 +10,7 @@ enum class CodeTransformCommand { UploadComplete, TransformComplete, TransformResuming, + DownloadFailed, AuthRestored, StartHil, } diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/commands/CodeTransformMessageListener.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/commands/CodeTransformMessageListener.kt index 2bc21f80b80..faa8e837545 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/commands/CodeTransformMessageListener.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/commands/CodeTransformMessageListener.kt @@ -6,6 +6,7 @@ package software.aws.toolkits.jetbrains.services.codemodernizer.commands import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerJobCompletedResult +import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadFailureReason import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenCopyCommandsResult class CodeTransformMessageListener { @@ -41,6 +42,10 @@ class CodeTransformMessageListener { _messages.tryEmit(CodeTransformActionMessage(CodeTransformCommand.TransformResuming)) } + fun onDownloadFailure(failure: DownloadFailureReason) { + _messages.tryEmit(CodeTransformActionMessage(CodeTransformCommand.DownloadFailed, downloadFailure = failure)) + } + fun onAuthRestored() { _messages.tryEmit(CodeTransformActionMessage(CodeTransformCommand.AuthRestored)) } diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt index 7e8c8442364..ee87889f4e3 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt @@ -18,6 +18,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.messages.FormItem import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerJobCompletedResult import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformHilDownloadArtifact import software.aws.toolkits.jetbrains.services.codemodernizer.model.Dependency +import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadFailureReason import software.aws.toolkits.jetbrains.services.codemodernizer.model.UploadFailureReason import software.aws.toolkits.jetbrains.services.codemodernizer.model.ValidationResult import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getModuleOrProjectNameForFile @@ -241,6 +242,9 @@ fun buildZipUploadFailedChatMessage(failureReason: UploadFailureReason): String is UploadFailureReason.CONNECTION_REFUSED -> { message("codemodernizer.chat.message.upload_failed_connection_refused") } + is UploadFailureReason.SSL_HANDSHAKE_ERROR -> { + message("codemodernizer.chat.message.upload_failed_ssl_error") + } is UploadFailureReason.OTHER -> { message("codemodernizer.chat.message.upload_failed_other", failureReason.errorMessage) } @@ -433,3 +437,28 @@ fun buildHilCannotResumeContent() = CodeTransformChatMessageContent( startNewTransformFollowUp ), ) + +fun buildDownloadFailureChatContent(downloadFailureReason: DownloadFailureReason): CodeTransformChatMessageContent { + val reason = when (downloadFailureReason) { + is DownloadFailureReason.SSL_HANDSHAKE_ERROR -> { + message("codemodernizer.chat.message.download_failed_ssl") + } + is DownloadFailureReason.PROXY_WILDCARD_ERROR -> { + message("codemodernizer.chat.message.download_failed_wildcard") + } + is DownloadFailureReason.OTHER -> { + message("codemodernizer.chat.message.download_failed_other", downloadFailureReason.errorMessage) + } + } + + // DownloadFailureReason.OTHER might be retryable, so including buttons to allow retry. + return CodeTransformChatMessageContent( + type = CodeTransformChatMessageType.FinalizedAnswer, + message = reason, + buttons = if (downloadFailureReason is DownloadFailureReason.SSL_HANDSHAKE_ERROR || downloadFailureReason is DownloadFailureReason.OTHER) { + listOf(viewDiffButton, viewSummaryButton) + } else { + null + }, + ) +} diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt index 69b4de7119d..d429d752699 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt @@ -29,6 +29,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildCo import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildCompileLocalFailedChatContent import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildCompileLocalInProgressChatContent import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildCompileLocalSuccessChatContent +import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildDownloadFailureChatContent import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildHilCannotResumeContent import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildHilErrorContent import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildHilInitialContent @@ -59,6 +60,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.messages.Incoming import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerJobCompletedResult import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformHilDownloadArtifact import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection +import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadFailureReason import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenCopyCommandsResult import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenDependencyReportCommandsResult @@ -308,6 +310,12 @@ class CodeTransformChatController( CodeTransformCommand.StartHil -> { handleHil() } + CodeTransformCommand.DownloadFailed -> { + val result = message.downloadFailure + if (result != null) { + handleDownloadFailed(message.downloadFailure) + } + } else -> { processTransformQuickAction(IncomingCodeTransformMessage.Transform(tabId = activeTabId)) } @@ -457,6 +465,11 @@ class CodeTransformChatController( } } + private suspend fun handleDownloadFailed(failureReason: DownloadFailureReason) { + codeTransformChatHelper.addNewMessage(buildDownloadFailureChatContent(failureReason)) + codeTransformChatHelper.addNewMessage(buildStartNewTransformFollowup()) + } + // Remove open file button after pom.xml is deleted private suspend fun updatePomPreviewItem() { val hilPomItemId = codeTransformChatHelper.getHilPomItemId() ?: return diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/DownloadFailureReason.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/DownloadFailureReason.kt index 0d9597d67a1..5afc890cebf 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/DownloadFailureReason.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/DownloadFailureReason.kt @@ -6,5 +6,5 @@ package software.aws.toolkits.jetbrains.services.codemodernizer.model sealed class DownloadFailureReason { object SSL_HANDSHAKE_ERROR : DownloadFailureReason() object PROXY_WILDCARD_ERROR : DownloadFailureReason() - object OTHER : DownloadFailureReason() + data class OTHER(val errorMessage: String) : DownloadFailureReason() } diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/UploadFailureReason.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/UploadFailureReason.kt index cfe195d83af..178fc6b7fc4 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/UploadFailureReason.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/UploadFailureReason.kt @@ -7,5 +7,6 @@ sealed class UploadFailureReason { data class HTTP_ERROR(val statusCode: Int) : UploadFailureReason() object PRESIGNED_URL_EXPIRED : UploadFailureReason() object CONNECTION_REFUSED : UploadFailureReason() + object SSL_HANDSHAKE_ERROR : UploadFailureReason() data class OTHER(val errorMessage: String) : UploadFailureReason() } diff --git a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerTest.kt b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerTest.kt index f305ccd27fb..07d377a19ba 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerTest.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerTest.kt @@ -14,13 +14,11 @@ import org.mockito.kotlin.any import org.mockito.kotlin.doNothing import org.mockito.kotlin.doReturn import org.mockito.kotlin.doThrow -import org.mockito.kotlin.eq import org.mockito.kotlin.spy import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerArtifact -import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadFailureReason import software.aws.toolkits.jetbrains.services.codemodernizer.model.InvalidTelemetryReason import software.aws.toolkits.jetbrains.services.codemodernizer.model.ValidationResult import software.aws.toolkits.jetbrains.services.codemodernizer.utils.filterOnlyParentFiles @@ -53,11 +51,9 @@ class CodeWhispererCodeModernizerTest : CodeWhispererCodeModernizerTestBase() { fun `ArtifactHandler notifies proxy wildcard error`() = runBlocking { val handler = spy(ArtifactHandler(project, clientAdaptorSpy)) doThrow(RuntimeException("Dangling meta character '*' near index 0")).whenever(clientAdaptorSpy).downloadExportResultArchive(jobId) - doNothing().whenever(handler).notifyUnableToDownload(eq(DownloadFailureReason.PROXY_WILDCARD_ERROR)) - val expectedResult = DownloadArtifactResult(null, "", "Dangling meta character '*' near index 0") + val expectedResult = DownloadArtifactResult(null, "", message("codemodernizer.notification.warn.download_failed_wildcard.content")) val result = handler.downloadArtifact(jobId) verify(clientAdaptorSpy, times(1)).downloadExportResultArchive(jobId) - verify(handler, times(1)).notifyUnableToDownload(DownloadFailureReason.PROXY_WILDCARD_ERROR) assertEquals(expectedResult, result) } @@ -66,15 +62,13 @@ class CodeWhispererCodeModernizerTest : CodeWhispererCodeModernizerTestBase() { val handler = spy(ArtifactHandler(project, clientAdaptorSpy)) doThrow(RuntimeException("Unable to execute HTTP request: javax.net.ssl.SSLHandshakeException: PKIX path building failed")) .whenever(clientAdaptorSpy).downloadExportResultArchive(jobId) - doNothing().whenever(handler).notifyUnableToDownload(eq(DownloadFailureReason.SSL_HANDSHAKE_ERROR)) val expectedResult = DownloadArtifactResult( null, "", - "Unable to execute HTTP request: javax.net.ssl.SSLHandshakeException: PKIX path building failed" + message("codemodernizer.notification.warn.download_failed_ssl.content") ) val result = handler.downloadArtifact(jobId) verify(clientAdaptorSpy, times(1)).downloadExportResultArchive(jobId) - verify(handler, times(1)).notifyUnableToDownload(DownloadFailureReason.SSL_HANDSHAKE_ERROR) assertEquals(expectedResult, result) } diff --git a/plugins/toolkit/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties b/plugins/toolkit/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties index eec86d0d04f..4deb5a7a002 100644 --- a/plugins/toolkit/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties +++ b/plugins/toolkit/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties @@ -557,6 +557,9 @@ codemodernizer.chat.message.button.stop_transform=Stop transformation codemodernizer.chat.message.button.view_build=View build progress codemodernizer.chat.message.button.view_diff=View diff codemodernizer.chat.message.button.view_summary=View summary +codemodernizer.chat.message.download_failed_other=Sorry, I ran into an issue while trying to download your upgraded code. Please try again. {0} +codemodernizer.chat.message.download_failed_ssl=Sorry, I could not download your upgraded code because of an issue with your certificate. Please make sure all your certificates for your proxy client have been set up correctly for your IDE. +codemodernizer.chat.message.download_failed_wildcard=Sorry, I could not download your upgraded code because of an issue with your proxy client. Please check your IDE proxy settings and remove any wildcard (*) references, then restart your IDE. codemodernizer.chat.message.error_request=Request failed codemodernizer.chat.message.follow_up.new_transformation=Start a new transformation codemodernizer.chat.message.hil.cannot_resume=I ran into an issue trying to resume your transformation. @@ -594,6 +597,7 @@ codemodernizer.chat.message.transform_stopping=I'm stopping your transformation. codemodernizer.chat.message.upload_failed_connection_refused=Sorry, I couldn't upload your project to begin the transformation. Please check your network connectivity or firewall configuration, and then try again. codemodernizer.chat.message.upload_failed_http_error=Sorry, I could not upload your project to start the transformation. You can investigate the issue with the HTTP Status Code: {0} codemodernizer.chat.message.upload_failed_other=Sorry, I was unable to upload your project due to an unexpected failure. {0} +codemodernizer.chat.message.upload_failed_ssl_error=Sorry, I was unable to upload your project. This might have been caused by your IDE not trusting the certificate of your HTTP proxy. Ensure all certificates for your proxy client have been configured in your IDE, and then retry transformation. codemodernizer.chat.message.upload_failed_url_expired=Sorry, I couldn't upload your project to begin the transformation. The Amazon S3 pre-signed URL used to upload your code expired after 30 minutes. This might have been caused by delays introduced by intermediate services in your network infrastructure.\n\nCheck your network configuration for services that might be causing delays. If the issue persists, you might need to allow list the following Amazon S3 bucket: 'amazonq-code-transformation-us-east-1-c6160f047e0.s3.amazonaws.com'. codemodernizer.chat.message.validation.check_eligible_projects=I'm checking for open projects that are eligible for Code Transformation. codemodernizer.chat.message.validation.check_passed=I can upgrade your Java {0} module. To start the transformation, I need some information from you. Choose the module you want to upgrade and the target code version to upgrade to. Then, choose **Confirm**.\n\nIf you do not see the module you want to transform, you might need to configure your project so I can find it. Go to **File** and then **Project Structure** and make sure the correct JDK is selected in the SDK field. @@ -668,8 +672,8 @@ codemodernizer.notification.info.transformation_start_stopping.title=Transformat codemodernizer.notification.info.transformation_stop.content=You cancelled the transformation. To start a new transformation, return to the Q - Transform chat tab. codemodernizer.notification.info.transformation_stop.title=Transformation cancelled codemodernizer.notification.info.view_troubleshooting_guide=View troubleshooting guide -codemodernizer.notification.warn.download_failed_ssl.content=Amazon Q couldn't download your upgraded code. This might have been caused by your IDE's JRE not trusting the certificate of your HTTP proxy. Ensure all public key certificates for your proxy client have been set up in the cacerts keystore of your IDE's JRE, and then try viewing the diff again. -codemodernizer.notification.warn.download_failed_wildcard.content=Amazon Q couldn't download your upgraded code because of an issue with your proxy client. Check your IDE proxy settings and remove any wildcard (*) references, and then try viewing the diff again. +codemodernizer.notification.warn.download_failed_ssl.content=This might have been caused by your IDE's JRE not trusting the certificate of your HTTP proxy. Ensure all public key certificates for your proxy client have been set up in the cacerts keystore of your IDE's JRE, and then try viewing the diff again. +codemodernizer.notification.warn.download_failed_wildcard.content=Check your IDE proxy settings and remove any wildcard (*) references, and then try viewing the diff again. codemodernizer.notification.warn.invalid_project.description.reason.invalid_jdk_versions=None of your open modules are supported by Amazon Q Code Transformation. Currently, Amazon Q can only upgrade Java 8 or Java 11 projects built on Maven. codemodernizer.notification.warn.invalid_project.description.reason.missing_content_roots=None of your open modules are supported by Amazon Q Code Transformation. Currently, Amazon Q can only upgrade Java 8 or Java 11 projects built on Maven. codemodernizer.notification.warn.invalid_project.description.reason.no_valid_files=None of your open modules are supported by Amazon Q Code Transformation. Amazon Q could not find a pom.xml file in any of your open modules. Currently, Amazon Q can only upgrade Java 8 or Java 11 projects built on Maven. @@ -684,7 +688,7 @@ codemodernizer.notification.warn.unable_to_start_job=Amazon Q could not begin th codemodernizer.notification.warn.unknown_start_failure=Amazon Q could not begin the transformation. Try starting the transformation again. codemodernizer.notification.warn.unknown_status_response=Amazon Q could not complete the transformation. Try starting the transformation again. codemodernizer.notification.warn.upload_failed=Amazon Q could not upload your project. Try starting the transformation again. {0} -codemodernizer.notification.warn.view_diff_failed.content=Amazon Q could not download and parse the diff with your upgraded code. Try downloading it again. {0} +codemodernizer.notification.warn.view_diff_failed.content=Amazon Q could not download and parse the diff with your upgraded code. {0} codemodernizer.notification.warn.view_diff_failed.title=Amazon Q Developer Agent for code transformation: Failed to download and parse code diff codemodernizer.notification.warn.view_summary_failed.content=Unable to display the transformation summary due to an error. codemodernizer.notification.warn.view_summary_failed.title=Unable to display transformation summary From ad8d5319f44a42b9a8d068e4f2609e23aec85863 Mon Sep 17 00:00:00 2001 From: Ting Cheng Date: Thu, 30 May 2024 10:55:44 -0700 Subject: [PATCH 2/4] Update notification --- .../software/aws/toolkits/resources/MessagesBundle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/toolkit/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties b/plugins/toolkit/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties index 4deb5a7a002..98e15a3816f 100644 --- a/plugins/toolkit/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties +++ b/plugins/toolkit/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties @@ -672,7 +672,7 @@ codemodernizer.notification.info.transformation_start_stopping.title=Transformat codemodernizer.notification.info.transformation_stop.content=You cancelled the transformation. To start a new transformation, return to the Q - Transform chat tab. codemodernizer.notification.info.transformation_stop.title=Transformation cancelled codemodernizer.notification.info.view_troubleshooting_guide=View troubleshooting guide -codemodernizer.notification.warn.download_failed_ssl.content=This might have been caused by your IDE's JRE not trusting the certificate of your HTTP proxy. Ensure all public key certificates for your proxy client have been set up in the cacerts keystore of your IDE's JRE, and then try viewing the diff again. +codemodernizer.notification.warn.download_failed_ssl.content=Please make sure all your certificates for your proxy client have been set up correctly for your IDE. codemodernizer.notification.warn.download_failed_wildcard.content=Check your IDE proxy settings and remove any wildcard (*) references, and then try viewing the diff again. codemodernizer.notification.warn.invalid_project.description.reason.invalid_jdk_versions=None of your open modules are supported by Amazon Q Code Transformation. Currently, Amazon Q can only upgrade Java 8 or Java 11 projects built on Maven. codemodernizer.notification.warn.invalid_project.description.reason.missing_content_roots=None of your open modules are supported by Amazon Q Code Transformation. Currently, Amazon Q can only upgrade Java 8 or Java 11 projects built on Maven. @@ -689,7 +689,7 @@ codemodernizer.notification.warn.unknown_start_failure=Amazon Q could not begin codemodernizer.notification.warn.unknown_status_response=Amazon Q could not complete the transformation. Try starting the transformation again. codemodernizer.notification.warn.upload_failed=Amazon Q could not upload your project. Try starting the transformation again. {0} codemodernizer.notification.warn.view_diff_failed.content=Amazon Q could not download and parse the diff with your upgraded code. {0} -codemodernizer.notification.warn.view_diff_failed.title=Amazon Q Developer Agent for code transformation: Failed to download and parse code diff +codemodernizer.notification.warn.view_diff_failed.title=Failed to download upgraded code codemodernizer.notification.warn.view_summary_failed.content=Unable to display the transformation summary due to an error. codemodernizer.notification.warn.view_summary_failed.title=Unable to display transformation summary codemodernizer.notification.warn.zip_creation_failed=Amazon Q could not zip the selected module and begin the transformation. Try starting the transformation again. {0} From fbecf2a6566c7a48424e8ebc6774db176e1c8df4 Mon Sep 17 00:00:00 2001 From: Ting Cheng <36546476+tincheng@users.noreply.github.com> Date: Mon, 3 Jun 2024 10:51:30 -0700 Subject: [PATCH 3/4] Update feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json --- .../feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changes/next-release/feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json b/.changes/next-release/feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json index b5216bb8dd0..cefd12ca0c0 100644 --- a/.changes/next-release/feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json +++ b/.changes/next-release/feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json @@ -1,4 +1,4 @@ { "type" : "feature", - "description" : "Amazon Q Code Transform: Improve download failure ux" -} \ No newline at end of file + "description" : "Amazon Q Code Transform: Communite download failure in transform chat, and improve download failure notification" +} From bcda261997512a43f79d1b30f2bac7b8a2c81d64 Mon Sep 17 00:00:00 2001 From: Ting Cheng <36546476+tincheng@users.noreply.github.com> Date: Mon, 3 Jun 2024 15:32:44 -0700 Subject: [PATCH 4/4] Update feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json --- .../feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changes/next-release/feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json b/.changes/next-release/feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json index cefd12ca0c0..76402842e70 100644 --- a/.changes/next-release/feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json +++ b/.changes/next-release/feature-751c6024-4e83-46c2-bbd3-d6222d39afe8.json @@ -1,4 +1,4 @@ { "type" : "feature", - "description" : "Amazon Q Code Transform: Communite download failure in transform chat, and improve download failure notification" + "description" : "Amazon Q Code Transform: Communicate download failure in transform chat, and improve download failure notification" }