Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@ open class CodeWhispererCodeScanException(override val message: String?) : Runti

open class CodeWhispererCodeFixException(override val message: String?) : RuntimeException()

open class CodeWhispererCodeScanServerException(override val message: String?) : RuntimeException()
open class CodeWhispererCodeScanServerException(
override val message: String?,
val requestId: String?,
val requestServiceType: String?,
val httpStatusCode: String?,
) : RuntimeException()

internal fun noFileOpenError(): Nothing =
throw CodeWhispererCodeScanException(message("codewhisperer.codescan.no_file_open"))
Expand All @@ -29,8 +34,12 @@ internal fun fileFormatNotSupported(format: String): Nothing =
internal fun fileTooLarge(): Nothing =
throw CodeWhispererCodeScanException(message("codewhisperer.codescan.file_too_large"))

internal fun codeScanServerException(errorMessage: String): Nothing =
throw CodeWhispererCodeScanServerException(errorMessage)
internal fun codeScanServerException(
errorMessage: String,
requestId: String? = null,
requestServiceType: String? = null,
httpStatusCode: String? = null,
): Nothing = throw CodeWhispererCodeScanServerException(errorMessage, requestId, requestServiceType, httpStatusCode)

internal fun invalidSourceZipError(): Nothing =
throw CodeWhispererCodeScanException(message("codewhisperer.codescan.invalid_source_zip_telemetry"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,10 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
val artifactsUploadStartTime = now()
val codeScanName = UUID.randomUUID().toString()

val taskType = if (sessionContext.codeAnalysisScope == CodeWhispererConstants.CodeAnalysisScope.PROJECT) {
CodeWhispererConstants.UploadTaskType.SCAN_PROJECT
} else {
val taskType = if (isAutoScan()) {
CodeWhispererConstants.UploadTaskType.SCAN_FILE
} else {
CodeWhispererConstants.UploadTaskType.SCAN_PROJECT
}

val sourceZipUploadResponse =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.intellij.openapi.project.Project
import com.intellij.util.io.HttpRequests
import org.apache.commons.codec.digest.DigestUtils
import software.amazon.awssdk.awscore.exception.AwsServiceException
import software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisUploadContext
import software.amazon.awssdk.services.codewhispererruntime.model.CodeFixUploadContext
import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUrlRequest
Expand All @@ -21,6 +22,7 @@
import software.aws.toolkits.core.utils.getLogger
import software.aws.toolkits.jetbrains.core.AwsClientManager
import software.aws.toolkits.jetbrains.services.amazonq.RetryableOperation
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeWhispererCodeScanServerException
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeWhispererCodeScanSession.Companion.APPLICATION_ZIP
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeWhispererCodeScanSession.Companion.AWS_KMS
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeWhispererCodeScanSession.Companion.CONTENT_MD5
Expand All @@ -32,7 +34,11 @@
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.invalidSourceZipError
import software.aws.toolkits.jetbrains.services.codewhisperer.codetest.CodeTestException
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.getStartUrl
import software.aws.toolkits.resources.message
import software.aws.toolkits.telemetry.AmazonqTelemetry

Check warning on line 39 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererZipUploadManager.kt

View workflow job for this annotation

GitHub Actions / qodana

Usage of redundant or deprecated syntax or deprecated symbols

Remove deprecated symbol import

Check warning on line 39 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererZipUploadManager.kt

View workflow job for this annotation

GitHub Actions / qodana

Usage of redundant or deprecated syntax or deprecated symbols

'AmazonqTelemetry' is deprecated. Use type-safe metric builders

Check warning

Code scanning / QDJVMC

Usage of redundant or deprecated syntax or deprecated symbols Warning

Remove deprecated symbol import

Check warning

Code scanning / QDJVMC

Usage of redundant or deprecated syntax or deprecated symbols Warning

'AmazonqTelemetry' is deprecated. Use type-safe metric builders
import software.aws.toolkits.telemetry.AmazonqUploadIntent
import software.aws.toolkits.telemetry.MetricResult
import java.io.File
import java.io.FileInputStream
import java.io.IOException
Expand All @@ -50,29 +56,67 @@
taskName: String,
featureUseCase: CodeWhispererConstants.FeatureName,
): CreateUploadUrlResponse {
// Throw error if zipFile is invalid.
if (!zipFile.exists()) {
when (featureUseCase) {
CodeWhispererConstants.FeatureName.CODE_REVIEW -> invalidSourceZipError()
CodeWhispererConstants.FeatureName.TEST_GENERATION -> testGenerationInvalidSourceZipError()
else -> throw IllegalArgumentException("Unsupported feature case: $featureUseCase") // Adding else for safety check
val startTime = System.currentTimeMillis()
var result: MetricResult = MetricResult.Succeeded
var failureReason: String? = null
var failureReasonDesc: String? = null
var requestId: String? = null
var requestServiceType: String? = null
var httpStatusCode: String? = null
try {
// Throw error if zipFile is invalid.
if (!zipFile.exists()) {
when (featureUseCase) {
CodeWhispererConstants.FeatureName.CODE_REVIEW -> invalidSourceZipError()
CodeWhispererConstants.FeatureName.TEST_GENERATION -> testGenerationInvalidSourceZipError()
else -> throw IllegalArgumentException("Unsupported feature case: $featureUseCase") // Adding else for safety check
}
}
}
val fileMd5: String = Base64.getEncoder().encodeToString(DigestUtils.md5(FileInputStream(zipFile)))
val createUploadUrlResponse = createUploadUrl(fileMd5, artifactType, taskType, taskName, featureUseCase)
val url = createUploadUrlResponse.uploadUrl()
LOG.debug { "$featureUseCase: Uploading $artifactType using the presigned URL." }
val fileMd5: String = Base64.getEncoder().encodeToString(DigestUtils.md5(FileInputStream(zipFile)))
val createUploadUrlResponse = createUploadUrl(fileMd5, artifactType, taskType, taskName, featureUseCase)
val url = createUploadUrlResponse.uploadUrl()
LOG.debug { "$featureUseCase: Uploading $artifactType using the presigned URL." }

uploadArtifactToS3(
url,
createUploadUrlResponse.uploadId(),
zipFile,
fileMd5,
createUploadUrlResponse.kmsKeyArn(),
createUploadUrlResponse.requestHeaders(),
featureUseCase
)
return createUploadUrlResponse
uploadArtifactToS3(
url,
createUploadUrlResponse.uploadId(),
zipFile,
fileMd5,
createUploadUrlResponse.kmsKeyArn(),
createUploadUrlResponse.requestHeaders(),
featureUseCase
)
return createUploadUrlResponse
} catch (e: Exception) {
result = MetricResult.Failed
failureReason = e.javaClass.simpleName
failureReasonDesc = e.message
if (e is CodeWhispererCodeScanServerException) {
requestId = e.requestId
requestServiceType = e.requestServiceType
httpStatusCode = e.httpStatusCode
}
throw e
} finally {
if (featureUseCase == CodeWhispererConstants.FeatureName.CODE_REVIEW) {
AmazonqTelemetry.createUpload(

Check warning on line 102 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererZipUploadManager.kt

View workflow job for this annotation

GitHub Actions / qodana

Usage of redundant or deprecated syntax or deprecated symbols

'AmazonqTelemetry' is deprecated. Use type-safe metric builders

Check warning

Code scanning / QDJVMC

Usage of redundant or deprecated syntax or deprecated symbols Warning

'AmazonqTelemetry' is deprecated. Use type-safe metric builders
amazonqConversationId = "",
amazonqUploadIntent = if (taskType == CodeWhispererConstants.UploadTaskType.SCAN_PROJECT) {
AmazonqUploadIntent.FULLPROJECTSECURITYSCAN
} else {
AmazonqUploadIntent.AUTOMATICFILESECURITYSCAN
},
result = result,
reason = failureReason,
reasonDesc = failureReasonDesc,
duration = (System.currentTimeMillis() - startTime).toDouble(),
credentialStartUrl = getStartUrl(project),
requestId = requestId,
requestServiceType = requestServiceType,
httpStatusCode = httpStatusCode
)
}
}
}

@Throws(IOException::class)
Expand All @@ -85,6 +129,7 @@
requestHeaders: Map<String, String>?,
featureUseCase: CodeWhispererConstants.FeatureName,
) {
var connection: HttpURLConnection? = null
RetryableOperation<Unit>().execute(
operation = {
val uploadIdJson = """{"uploadId":"$uploadId"}"""
Expand All @@ -103,9 +148,9 @@
}
}
}.connect {
val connection = it.connection as HttpURLConnection
connection.setFixedLengthStreamingMode(fileToUpload.length())
IoUtils.copy(fileToUpload.inputStream(), connection.outputStream)
connection = it.connection as HttpURLConnection
connection?.setFixedLengthStreamingMode(fileToUpload.length())
IoUtils.copy(fileToUpload.inputStream(), connection?.outputStream)
}
},
isRetryable = { e ->
Expand All @@ -118,7 +163,12 @@
val errorMessage = getTelemetryErrorMessage(e, featureUseCase)
when (featureUseCase) {
CodeWhispererConstants.FeatureName.CODE_REVIEW ->
codeScanServerException("CreateUploadUrlException: $errorMessage")
codeScanServerException(
"CreateUploadUrlException: $errorMessage",
connection?.getHeaderField("x-amz-request-id"),
"s3",
(e as? HttpRequests.HttpStatusException)?.statusCode.toString()
)
CodeWhispererConstants.FeatureName.TEST_GENERATION ->
throw CodeTestException(
"UploadTestArtifactToS3Error: $errorMessage",
Expand Down Expand Up @@ -162,7 +212,11 @@
val errorMessage = getTelemetryErrorMessage(e, featureUseCase)
when (featureUseCase) {
CodeWhispererConstants.FeatureName.CODE_REVIEW ->
codeScanServerException("CreateUploadUrlException after $attempts attempts: $errorMessage")
codeScanServerException(
"CreateUploadUrlException after $attempts attempts: $errorMessage",
requestId = (e as? AwsServiceException)?.requestId(),
httpStatusCode = (e as? AwsServiceException)?.statusCode().toString()
)

CodeWhispererConstants.FeatureName.TEST_GENERATION ->
throw CodeTestException(
Expand Down
Loading