Skip to content

Commit

Permalink
Merge branch 'main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewyuq committed Jun 6, 2024
2 parents 19d9fdb + 7fc1aa1 commit 5d0290b
Show file tree
Hide file tree
Showing 23 changed files with 137 additions and 61 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"type" : "feature",
"description" : "feat(featureDev): generated plan being shown from top"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"type" : "feature",
"description" : "Amazon Q Code Transform: Communicate download failure in transform chat, and improve download failure notification"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"type" : "feature",
"description" : "CodeTransformation: increase project upload limit to 2GB"
}
2 changes: 1 addition & 1 deletion buildspec/linuxTests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ phases:
fi
- chmod +x gradlew
- su codebuild-user -c "./gradlew -PideProfileName=$ALTERNATIVE_IDE_PROFILE_NAME check coverageReport --info --stacktrace --console plain --continue"
- su codebuild-user -c "./gradlew -PideProfileName=$ALTERNATIVE_IDE_PROFILE_NAME check coverageReport --info --console plain --continue"
- ./gradlew -PideProfileName=$ALTERNATIVE_IDE_PROFILE_NAME :plugin-toolkit:intellij-standalone:buildPlugin :plugin-core:buildPlugin :plugin-amazonq:buildPlugin
- VCS_COMMIT_ID="${CODEBUILD_RESOLVED_SOURCE_VERSION}"
- CI_BUILD_URL=$(echo $CODEBUILD_BUILD_URL | sed 's/#/%23/g') # Encode `#` in the URL because otherwise the url is clipped in the Codecov.io site
Expand Down
18 changes: 6 additions & 12 deletions buildspec/windowsTests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,22 +50,16 @@ phases:
$script:TEST_ARTIFACTS=Join-Path $env:TEMP testArtifacts
$script:TEST_REPORTS=Join-Path $script:TEST_ARTIFACTS test-reports
function copyFolder($basedir, $subdir, $destdir) {
$src = Join-Path "." -ChildPath $basedir | Join-Path -ChildPath $subdir
$dest = Join-Path $destdir -ChildPath $basedir | Join-Path -ChildPath $subDir
if( (Get-ChildItem $src -ErrorAction SilentlyContinue | Measure-Object).Count -ne 0) {
Copy-Item $src $dest -Recurse -Force -ErrorAction SilentlyContinue
function copyArtifacts($filter, $destdir) {
Get-ChildItem -Recurse -Directory -ErrorAction SilentlyContinue | Where-Object { $_.FullName -Like "$filter" } | ForEach-Object {
Copy-Item -Path $_.FullName -Destination "$destdir/$(Resolve-Path -Relative $_.FullName)" -Recurse -Container
}
}
function copyArtifacts($root) {
copyFolder $root "build/reports/" $script:TEST_ARTIFACTS
copyFolder $root "build/idea-sandbox/system-test/log/" $script:TEST_ARTIFACTS
copyFolder $root "build/test-results/test/" $script:TEST_REPORTS
}
copyArtifacts "*\build\idea-sandbox\system*\log" $script:TEST_ARTIFACTS
copyArtifacts "*\build\reports" $script:TEST_ARTIFACTS
copyArtifacts "."
Get-ChildItem -Directory | ForEach-Object { copyArtifacts $_.Name }
copyArtifacts "*\test-results" $script:TEST_REPORTS
if(-Not($Env:CODEBUILD_BUILD_SUCCEEDING -eq "0" -Or $Env:CODE_COV_TOKEN -eq $null)) {
$env:VCS_COMMIT_ID=$Env:CODEBUILD_RESOLVED_SOURCE_VERSION;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -531,7 +531,7 @@ class FeatureDevController(
val interactions = session.send(message)
messenger.sendUpdatePlaceholder(tabId, message("amazonqFeatureDev.placeholder.iterate_plan"))

messenger.sendAnswer(tabId = tabId, message = interactions.content, messageType = FeatureDevMessageType.Answer, canBeVoted = true)
messenger.sendAnswer(tabId = tabId, message = interactions.content, messageType = FeatureDevMessageType.Answer, canBeVoted = true, snapToTop = true)

if (interactions.interactionSucceeded) {
messenger.sendAnswer(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ data class FeatureDevMessage(
val message: String? = null,
val followUps: List<FollowUp>? = null,
val canBeVoted: Boolean,
val snapToTop: Boolean

) : UiMessage(
tabId = tabId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ suspend fun MessagePublisher.sendAnswer(
messageType: FeatureDevMessageType,
followUp: List<FollowUp>? = null,
canBeVoted: Boolean? = false,
snapToTop: Boolean? = false,
) {
val chatMessage =
FeatureDevMessage(
Expand All @@ -29,7 +30,8 @@ suspend fun MessagePublisher.sendAnswer(
messageType = messageType,
message = message,
followUps = followUp,
canBeVoted = canBeVoted ?: false
canBeVoted = canBeVoted ?: false,
snapToTop = snapToTop ?: false
)
this.publish(chatMessage)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -154,17 +155,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)
}
Expand Down Expand Up @@ -200,23 +202,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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -54,14 +55,19 @@ 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"
const val UPLOAD_ZIP_MANIFEST_VERSION = 1.0F
const val MAX_ZIP_SIZE = 1000000000 // 1GB
const val MAX_ZIP_SIZE = 2000000000 // 2GB
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,
Expand Down Expand Up @@ -156,6 +162,8 @@ class CodeModernizerSession(

telemetry.jobCreateZipEndTime(payloadSize, startTime)

LOG.info { "Uploading zip file with size: $payloadSize bytes" }

if (payloadSize > MAX_ZIP_SIZE) {
return CodeModernizerStartJobResult.CancelledZipTooLarge
}
Expand Down Expand Up @@ -185,6 +193,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
Expand All @@ -204,6 +216,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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ 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(
val command: CodeTransformCommand,
val mavenBuildResult: MavenCopyCommandsResult? = null,
val transformResult: CodeModernizerJobCompletedResult? = null,
val hilDownloadArtifact: CodeTransformHilDownloadArtifact? = null,
val downloadFailure: DownloadFailureReason? = null,
) : AmazonQMessage
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ enum class CodeTransformCommand {
UploadComplete,
TransformComplete,
TransformResuming,
DownloadFailed,
AuthRestored,
StartHil,
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
}
Expand Down Expand Up @@ -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
},
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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))
}
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
Loading

0 comments on commit 5d0290b

Please sign in to comment.