diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanManager.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanManager.kt index 109a691100..674bcdf950 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanManager.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanManager.kt @@ -52,7 +52,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.time.withTimeout import kotlinx.coroutines.withContext import org.jetbrains.annotations.TestOnly -import software.amazon.awssdk.services.codewhisperer.model.CodeWhispererException import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException import software.amazon.awssdk.services.codewhispererruntime.model.ThrottlingException import software.aws.toolkits.core.utils.WaiterTimeoutException @@ -592,7 +591,7 @@ class CodeWhispererCodeScanManager(val project: Project) { } fun handleException(coroutineContext: CoroutineContext, e: Exception, scope: CodeWhispererConstants.CodeAnalysisScope): String { val errorMessage = when (e) { - is CodeWhispererException -> e.awsErrorDetails().errorMessage() ?: message("codewhisperer.codescan.run_scan_error") + is CodeWhispererRuntimeException -> e.awsErrorDetails().errorMessage() ?: message("codewhisperer.codescan.run_scan_error") is CodeWhispererCodeScanException -> getCodeScanExceptionMessage(e) is CodeWhispererCodeScanServerException -> getCodeScanServerExceptionMessage(e) is WaiterTimeoutException, is TimeoutCancellationException -> message("codewhisperer.codescan.scan_timed_out") @@ -601,8 +600,8 @@ class CodeWhispererCodeScanManager(val project: Project) { else -> null } ?: message("codewhisperer.codescan.run_scan_error") - val errorCode = (e as? CodeWhispererException)?.awsErrorDetails()?.errorCode() - val requestId = if (e is CodeWhispererException) e.requestId() else null + val errorCode = (e as? CodeWhispererRuntimeException)?.awsErrorDetails()?.errorCode() + val requestId = if (e is CodeWhispererRuntimeException) e.requestId() else null if (!coroutineContext.isActive) { codeScanResultsPanel.setDefaultUI() @@ -627,7 +626,7 @@ class CodeWhispererCodeScanManager(val project: Project) { } val telemetryErrorMessage = when (e) { - is CodeWhispererException -> e.awsErrorDetails().errorMessage() ?: message("codewhisperer.codescan.run_scan_error_telemetry") + is CodeWhispererRuntimeException -> e.awsErrorDetails().errorMessage() ?: message("codewhisperer.codescan.run_scan_error_telemetry") is CodeWhispererCodeScanException -> when (e.message) { message("codewhisperer.codescan.no_file_open") -> message("codewhisperer.codescan.no_file_open_telemetry") message("codewhisperer.codescan.unsupported_language_error") -> message("codewhisperer.codescan.unsupported_language_error_telemetry") diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanSession.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanSession.kt index 4d11a82c1d..c0f9c2b01e 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanSession.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanSession.kt @@ -17,18 +17,18 @@ import kotlinx.coroutines.ensureActive import kotlinx.coroutines.isActive import kotlinx.coroutines.time.withTimeout import kotlinx.coroutines.withContext -import software.amazon.awssdk.services.codewhisperer.model.ArtifactType -import software.amazon.awssdk.services.codewhisperer.model.CodeScanFindingsSchema -import software.amazon.awssdk.services.codewhisperer.model.CodeScanStatus -import software.amazon.awssdk.services.codewhisperer.model.CodeWhispererException -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanRequest -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanResponse -import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanRequest -import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanResponse -import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsRequest -import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsResponse +import software.amazon.awssdk.services.codewhispererruntime.model.ArtifactType +import software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisFindingsSchema +import software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisStatus +import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUrlResponse +import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeAnalysisRequest +import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeAnalysisResponse +import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsRequest +import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsResponse import software.amazon.awssdk.services.codewhispererruntime.model.Reference +import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisRequest +import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisResponse import software.aws.toolkits.core.utils.Waiters.waitUntil import software.aws.toolkits.core.utils.debug import software.aws.toolkits.core.utils.getLogger @@ -145,7 +145,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) { } } var codeScanStatus = createCodeScanResponse.status() - if (codeScanStatus == CodeScanStatus.FAILED) { + if (codeScanStatus == CodeAnalysisStatus.FAILED) { if (isProjectScope()) { LOG.debug { "CodeWhisperer service error occurred. Something went wrong when creating a code review: $createCodeScanResponse " + @@ -165,7 +165,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) { // 5. Keep polling the API GetCodeScan to wait for results for a given timeout period. waitUntil( - succeedOn = { codeScanStatus == CodeScanStatus.COMPLETED }, + succeedOn = { codeScanStatus == CodeAnalysisStatus.COMPLETED }, maxDuration = Duration.ofSeconds(sessionContext.sessionConfig.overallJobTimeoutInSeconds()) ) { currentCoroutineContext.ensureActive() @@ -182,7 +182,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) { } } delay(CODE_SCAN_POLLING_INTERVAL_IN_SECONDS * TOTAL_MILLIS_IN_SECOND) - if (codeScanStatus == CodeScanStatus.FAILED) { + if (codeScanStatus == CodeAnalysisStatus.FAILED) { if (isProjectScope()) { LOG.debug { "CodeWhisperer service error occurred. Something went wrong fetching results for code review: $getCodeScanResponse " + @@ -205,12 +205,12 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) { ) val documents = mutableListOf() - documents.add(listCodeScanFindingsResponse.codeScanFindings()) + documents.add(listCodeScanFindingsResponse.codeAnalysisFindings()) // coroutineContext helps to actively cancel the bigger projects quickly withContext(currentCoroutineContext) { while (listCodeScanFindingsResponse.nextToken() != null && currentCoroutineContext.isActive) { listCodeScanFindingsResponse = listCodeScanFindings(jobId, listCodeScanFindingsResponse.nextToken()) - documents.add(listCodeScanFindingsResponse.codeScanFindings()) + documents.add(listCodeScanFindingsResponse.codeAnalysisFindings()) } } @@ -224,7 +224,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) { codeScanResponseContext = codeScanResponseContext.copy(reason = "Succeeded") return CodeScanResponse.Success(issues, codeScanResponseContext) } catch (e: Exception) { - val exception = e as? CodeWhispererException + val exception = e as? CodeWhispererRuntimeException val awsError = exception?.awsErrorDetails() if (awsError != null) { @@ -248,7 +248,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) { } } - fun createCodeScan(language: String, codeScanName: String): CreateCodeScanResponse { + fun createCodeScan(language: String, codeScanName: String): StartCodeAnalysisResponse { val artifactsMap = mapOf( ArtifactType.SOURCE_CODE to urlResponse[ArtifactType.SOURCE_CODE]?.uploadId(), ArtifactType.BUILT_JARS to urlResponse[ArtifactType.BUILT_JARS]?.uploadId() @@ -262,7 +262,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) { try { return clientAdaptor.createCodeScan( - CreateCodeScanRequest.builder() + StartCodeAnalysisRequest.builder() .clientToken(clientToken.toString()) .programmingLanguage { it.languageName(language) } .artifacts(artifactsMap) @@ -277,9 +277,9 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) { } } - fun getCodeScan(jobId: String): GetCodeScanResponse = try { + fun getCodeScan(jobId: String): GetCodeAnalysisResponse = try { clientAdaptor.getCodeScan( - GetCodeScanRequest.builder() + GetCodeAnalysisRequest.builder() .jobId(jobId) .build() ) @@ -289,11 +289,11 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) { throw codeScanServerException("GetCodeReviewException: $errorMessage") } - fun listCodeScanFindings(jobId: String, nextToken: String?): ListCodeScanFindingsResponse = try { + fun listCodeScanFindings(jobId: String, nextToken: String?): ListCodeAnalysisFindingsResponse = try { clientAdaptor.listCodeScanFindings( - ListCodeScanFindingsRequest.builder() + ListCodeAnalysisFindingsRequest.builder() .jobId(jobId) - .codeScanFindingsSchema(CodeScanFindingsSchema.CODESCAN_FINDINGS_1_0) + .codeAnalysisFindingsSchema(CodeAnalysisFindingsSchema.CODEANALYSIS_FINDINGS_1_0) .nextToken(nextToken) .build() ) diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt index e2e55b8643..17cc419e1a 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt @@ -8,14 +8,6 @@ import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.components.service import com.intellij.openapi.project.Project import com.intellij.util.text.nullize -import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider -import software.amazon.awssdk.services.codewhisperer.CodeWhispererClient -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanRequest -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanResponse -import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanRequest -import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanResponse -import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsRequest -import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsResponse import software.amazon.awssdk.services.codewhispererruntime.CodeWhispererRuntimeClient import software.amazon.awssdk.services.codewhispererruntime.model.ChatInteractWithMessageEvent import software.amazon.awssdk.services.codewhispererruntime.model.ChatMessageInteractionType @@ -25,14 +17,20 @@ import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUr import software.amazon.awssdk.services.codewhispererruntime.model.Dimension import software.amazon.awssdk.services.codewhispererruntime.model.GenerateCompletionsRequest import software.amazon.awssdk.services.codewhispererruntime.model.GenerateCompletionsResponse +import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeAnalysisRequest +import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeAnalysisResponse import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeFixJobRequest import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeFixJobResponse import software.amazon.awssdk.services.codewhispererruntime.model.GetTestGenerationResponse import software.amazon.awssdk.services.codewhispererruntime.model.IdeCategory import software.amazon.awssdk.services.codewhispererruntime.model.InlineChatUserDecision import software.amazon.awssdk.services.codewhispererruntime.model.ListAvailableCustomizationsRequest +import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsRequest +import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsResponse import software.amazon.awssdk.services.codewhispererruntime.model.ListFeatureEvaluationsResponse import software.amazon.awssdk.services.codewhispererruntime.model.SendTelemetryEventResponse +import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisRequest +import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisResponse import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeFixJobRequest import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeFixJobResponse import software.amazon.awssdk.services.codewhispererruntime.model.StartTestGenerationResponse @@ -51,7 +49,6 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.core.credentials.pinning.CodeWhispererConnection import software.aws.toolkits.jetbrains.services.amazonq.codeWhispererUserContext import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization -import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage import software.aws.toolkits.jetbrains.services.codewhisperer.model.SessionContextNew import software.aws.toolkits.jetbrains.services.codewhisperer.service.RequestContext @@ -59,15 +56,11 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.service.RequestCon import software.aws.toolkits.jetbrains.services.codewhisperer.service.ResponseContext import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.getTelemetryOptOutPreference -import software.aws.toolkits.jetbrains.services.codewhisperer.util.transform import software.aws.toolkits.telemetry.CodewhispererCompletionType import software.aws.toolkits.telemetry.CodewhispererSuggestionState import java.time.Instant import java.util.concurrent.TimeUnit -import kotlin.reflect.KProperty0 -import kotlin.reflect.jvm.isAccessible -// TODO: move this file to package "/client" // As the connection is project-level, we need to make this project-level too @Deprecated("Methods can throw a NullPointerException if callee does not check if connection is valid") interface CodeWhispererClientAdaptor : Disposable { @@ -81,20 +74,11 @@ interface CodeWhispererClientAdaptor : Disposable { request: CreateUploadUrlRequest, ): CreateUploadUrlResponse - fun createCodeScan( - request: CreateCodeScanRequest, - isSigv4: Boolean = shouldUseSigv4Client(project), - ): CreateCodeScanResponse + fun createCodeScan(request: StartCodeAnalysisRequest): StartCodeAnalysisResponse - fun getCodeScan( - request: GetCodeScanRequest, - isSigv4: Boolean = shouldUseSigv4Client(project), - ): GetCodeScanResponse + fun getCodeScan(request: GetCodeAnalysisRequest): GetCodeAnalysisResponse - fun listCodeScanFindings( - request: ListCodeScanFindingsRequest, - isSigv4: Boolean = shouldUseSigv4Client(project), - ): ListCodeScanFindingsResponse + fun listCodeScanFindings(request: ListCodeAnalysisFindingsRequest): ListCodeAnalysisFindingsResponse fun startCodeFixJob(request: StartCodeFixJobRequest): StartCodeFixJobResponse @@ -272,26 +256,15 @@ interface CodeWhispererClientAdaptor : Disposable { companion object { fun getInstance(project: Project): CodeWhispererClientAdaptor = project.service() - private fun shouldUseSigv4Client(project: Project) = - CodeWhispererExplorerActionManager.getInstance().checkActiveCodeWhispererConnectionType(project) == CodeWhispererLoginType.Accountless - const val INVALID_CODESCANJOBID = "Invalid_CodeScanJobID" const val INVALID_CODEFIXJOBID = "Invalid_CodeFixJobID" } } open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeWhispererClientAdaptor { - private val mySigv4Client by lazy { createUnmanagedSigv4Client() } - @Volatile private var myBearerClient: CodeWhispererRuntimeClient? = null - private val KProperty0<*>.isLazyInitialized: Boolean - get() { - isAccessible = true - return (getDelegate() as Lazy<*>).isInitialized() - } - init { initClientUpdateListener() } @@ -327,26 +300,12 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW override fun createUploadUrl(request: CreateUploadUrlRequest): CreateUploadUrlResponse = bearerClient().createUploadUrl(request) - override fun createCodeScan(request: CreateCodeScanRequest, isSigv4: Boolean): CreateCodeScanResponse = - if (isSigv4) { - mySigv4Client.createCodeScan(request) - } else { - bearerClient().startCodeAnalysis(request.transform()).transform() - } + override fun createCodeScan(request: StartCodeAnalysisRequest): StartCodeAnalysisResponse = bearerClient().startCodeAnalysis(request) - override fun getCodeScan(request: GetCodeScanRequest, isSigv4: Boolean): GetCodeScanResponse = - if (isSigv4) { - mySigv4Client.getCodeScan(request) - } else { - bearerClient().getCodeAnalysis(request.transform()).transform() - } + override fun getCodeScan(request: GetCodeAnalysisRequest): GetCodeAnalysisResponse = bearerClient().getCodeAnalysis(request) - override fun listCodeScanFindings(request: ListCodeScanFindingsRequest, isSigv4: Boolean): ListCodeScanFindingsResponse = - if (isSigv4) { - mySigv4Client.listCodeScanFindings(request) - } else { - bearerClient().listCodeAnalysisFindings(request.transform()).transform() - } + override fun listCodeScanFindings(request: ListCodeAnalysisFindingsRequest): ListCodeAnalysisFindingsResponse = + bearerClient().listCodeAnalysisFindings(request) override fun startCodeFixJob(request: StartCodeFixJobRequest): StartCodeFixJobResponse = bearerClient().startCodeFixJob(request) @@ -851,9 +810,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW } override fun dispose() { - if (this::mySigv4Client.isLazyInitialized) { - mySigv4Client.close() - } myBearerClient?.close() } @@ -880,11 +836,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW companion object { private val LOG = getLogger() - private fun createUnmanagedSigv4Client(): CodeWhispererClient = AwsClientManager.getInstance().createUnmanagedClient( - AnonymousCredentialsProvider.create(), - CodeWhispererConstants.Config.Sigv4ClientRegion, - CodeWhispererConstants.Config.CODEWHISPERER_ENDPOINT - ) } } diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt index faad851920..111ccdc509 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt @@ -31,7 +31,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import software.amazon.awssdk.core.exception.SdkServiceException import software.amazon.awssdk.core.util.DefaultSdkAutoConstructList -import software.amazon.awssdk.services.codewhisperer.model.CodeWhispererException import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException import software.amazon.awssdk.services.codewhispererruntime.model.Completion import software.amazon.awssdk.services.codewhispererruntime.model.FileContext @@ -377,11 +376,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable { ) } return@launch - } else if (e is CodeWhispererException) { - requestId = e.requestId() ?: "" - sessionId = e.awsErrorDetails().sdkHttpResponse().headers().getOrDefault(KET_SESSION_ID, listOf(requestId))[0] - displayMessage = e.awsErrorDetails().errorMessage() ?: message("codewhisperer.trigger.error.server_side") - } else if (e is software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException) { + } else if (e is CodeWhispererRuntimeException) { requestId = e.requestId() ?: "" sessionId = e.awsErrorDetails().sdkHttpResponse().headers().getOrDefault(KET_SESSION_ID, listOf(requestId))[0] displayMessage = e.awsErrorDetails().errorMessage() ?: message("codewhisperer.trigger.error.server_side") diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererServiceNew.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererServiceNew.kt index 7f43e3d088..c79ff7c012 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererServiceNew.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererServiceNew.kt @@ -33,7 +33,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import software.amazon.awssdk.core.exception.SdkServiceException import software.amazon.awssdk.core.util.DefaultSdkAutoConstructList -import software.amazon.awssdk.services.codewhisperer.model.CodeWhispererException import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException import software.amazon.awssdk.services.codewhispererruntime.model.Completion import software.amazon.awssdk.services.codewhispererruntime.model.FileContext @@ -409,10 +408,6 @@ class CodeWhispererServiceNew(private val cs: CoroutineScope) : Disposable { latencyContext ) return - } else if (e is CodeWhispererException) { - requestId = e.requestId().orEmpty() - sessionId = e.awsErrorDetails().sdkHttpResponse().headers().getOrDefault(KET_SESSION_ID, listOf(requestId))[0] - displayMessage = e.awsErrorDetails().errorMessage() ?: message("codewhisperer.trigger.error.server_side") } else if (e is CodeWhispererRuntimeException) { requestId = e.requestId().orEmpty() sessionId = e.awsErrorDetails().sdkHttpResponse().headers().getOrDefault(KET_SESSION_ID, listOf(requestId))[0] diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererEndpointCustomizer.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererEndpointCustomizer.kt index acb94f8a37..004181a6ec 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererEndpointCustomizer.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererEndpointCustomizer.kt @@ -3,11 +3,9 @@ package software.aws.toolkits.jetbrains.services.codewhisperer.util -import com.intellij.openapi.application.ApplicationManager import com.intellij.util.net.HttpConfigurable import com.intellij.util.net.ssl.CertificateManager import com.intellij.util.proxy.CommonProxy -import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder @@ -19,14 +17,9 @@ import software.amazon.awssdk.core.retry.RetryPolicy import software.amazon.awssdk.http.SdkHttpRequest import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient import software.amazon.awssdk.http.nio.netty.ProxyConfiguration -import software.amazon.awssdk.services.codewhisperer.CodeWhispererClientBuilder import software.amazon.awssdk.services.codewhispererruntime.CodeWhispererRuntimeClientBuilder import software.amazon.awssdk.services.codewhispererstreaming.CodeWhispererStreamingAsyncClientBuilder -import software.amazon.awssdk.services.cognitoidentity.CognitoIdentityClient import software.aws.toolkits.core.ToolkitClientCustomizer -import software.aws.toolkits.jetbrains.core.AwsSdkClient -import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager -import software.aws.toolkits.jetbrains.services.telemetry.AwsCognitoCredentialsProvider import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings import java.net.Proxy import java.net.URI @@ -102,44 +95,6 @@ class CodeWhispererEndpointCustomizer : ToolkitClientCustomizer { .tlsTrustManagersProvider { arrayOf(CertificateManager.getInstance().trustManager) } ) } - } else if (builder is CodeWhispererClientBuilder) { - clientOverrideConfiguration.addExecutionInterceptor( - object : ExecutionInterceptor { - override fun modifyHttpRequest(context: Context.ModifyHttpRequest, executionAttributes: ExecutionAttributes): SdkHttpRequest { - val requestBuilder = context.httpRequest().toBuilder() - executionAttributes.attributes.forEach { (k, v) -> - if (k.toString() != "OperationName") return@forEach - if (v == "GetAccessToken") return requestBuilder.build() - val token = CodeWhispererExplorerActionManager.getInstance().resolveAccessToken() ?: return requestBuilder.build() - requestBuilder.putHeader(TOKEN_KEY_NAME, token) - - val isMetricOptIn = CodeWhispererSettings.getInstance().isMetricOptIn() - if (v == "ListRecommendations") { - requestBuilder.putHeader(OPTOUT_KEY_NAME, (!isMetricOptIn).toString()) - } - return requestBuilder.build() - } - return context.httpRequest() - } - } - ) - - builder - .region(CodeWhispererConstants.Config.Sigv4ClientRegion) - - if (!ApplicationManager.getApplication().isUnitTestMode) { - builder - .credentialsProvider( - AwsCognitoCredentialsProvider( - CodeWhispererConstants.Config.CODEWHISPERER_IDPOOL_ID, - CognitoIdentityClient.builder() - .credentialsProvider(AnonymousCredentialsProvider.create()) - .region(CodeWhispererConstants.Config.Sigv4ClientRegion) - .httpClient(AwsSdkClient.getInstance().sharedSdkClient()) - .build() - ) - ) - } } } diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererSdkMapperUtil.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererSdkMapperUtil.kt deleted file mode 100644 index f1c7269b5e..0000000000 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererSdkMapperUtil.kt +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package software.aws.toolkits.jetbrains.services.codewhisperer.util - -import software.amazon.awssdk.services.codewhisperer.model.ArtifactType -import software.amazon.awssdk.services.codewhisperer.model.CodeAnalysisUploadContext -import software.amazon.awssdk.services.codewhisperer.model.CodeScanFindingsSchema -import software.amazon.awssdk.services.codewhisperer.model.CodeScanStatus -import software.amazon.awssdk.services.codewhisperer.model.CodeWhispererResponseMetadata -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanRequest -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanResponse -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanUploadUrlRequest -import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanRequest -import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanResponse -import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsRequest -import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsResponse -import software.amazon.awssdk.services.codewhisperer.model.ProgrammingLanguage -import software.amazon.awssdk.services.codewhisperer.model.TaskAssistPlanningUploadContext -import software.amazon.awssdk.services.codewhisperer.model.TransformationUploadContext -import software.amazon.awssdk.services.codewhisperer.model.UploadContext -import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUrlRequest -import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeAnalysisRequest -import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeAnalysisResponse -import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsRequest -import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsResponse -import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisRequest -import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisResponse - -// TODO: rename to be a more imformative name -private fun ProgrammingLanguage.transform(): software.amazon.awssdk.services.codewhispererruntime.model.ProgrammingLanguage = - software.amazon.awssdk.services.codewhispererruntime.model.ProgrammingLanguage.builder() - .languageName(this.languageName()) - .build() - -private fun ArtifactType.transform(): software.amazon.awssdk.services.codewhispererruntime.model.ArtifactType = - software.amazon.awssdk.services.codewhispererruntime.model.ArtifactType.fromValue(this.toString()) - -private fun CodeScanFindingsSchema.transform(): software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisFindingsSchema = - software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisFindingsSchema.fromValue( - this.toString().replace("scan", "analysis") - ) - -private fun UploadContext.transform(): software.amazon.awssdk.services.codewhispererruntime.model.UploadContext = - software.amazon.awssdk.services.codewhispererruntime.model.UploadContext.builder() - .taskAssistPlanningUploadContext(this.taskAssistPlanningUploadContext().transform()) - .transformationUploadContext(this.transformationUploadContext().transform()) - .codeAnalysisUploadContext(this.codeAnalysisUploadContext().transform()) - .build() - -private fun TaskAssistPlanningUploadContext.transform(): software.amazon.awssdk.services.codewhispererruntime.model.TaskAssistPlanningUploadContext = - software.amazon.awssdk.services.codewhispererruntime.model.TaskAssistPlanningUploadContext.builder() - .conversationId(this.conversationId()) - .build() - -private fun TransformationUploadContext.transform(): software.amazon.awssdk.services.codewhispererruntime.model.TransformationUploadContext = - software.amazon.awssdk.services.codewhispererruntime.model.TransformationUploadContext.builder() - .jobId(this.jobId()) - .uploadArtifactType(this.uploadArtifactTypeAsString()) - .build() - -private fun CodeAnalysisUploadContext.transform(): software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisUploadContext = - software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisUploadContext.builder() - .codeScanName(this.codeScanName()) - .build() - -private fun software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisStatus.transform(): CodeScanStatus = - CodeScanStatus.fromValue(this.toString()) - -fun CreateCodeScanUploadUrlRequest.transform(): CreateUploadUrlRequest = - CreateUploadUrlRequest.builder() - .contentMd5(this.contentMd5()) - .artifactType(this.artifactType().transform()) - .uploadIntent(this.uploadIntent().toString()) - .uploadContext(this.uploadContext().transform()) - .build() - -fun CreateCodeScanRequest.transform(): StartCodeAnalysisRequest = - StartCodeAnalysisRequest.builder() - .artifacts(this.artifacts().entries.map { it.key.transform() to it.value }.toMap()) - .programmingLanguage(this.programmingLanguage().transform()) - .clientToken(this.clientToken()) - .scope(this.scopeAsString()) - .codeScanName(this.codeScanName()) - .build() - -fun StartCodeAnalysisResponse.transform(): CreateCodeScanResponse = - CreateCodeScanResponse.builder() - .jobId(this.jobId()) - .status(this.status().transform()) - .errorMessage(this.errorMessage()) - .responseMetadata(CodeWhispererResponseMetadata.create(this.responseMetadata())) - .sdkHttpResponse(this.sdkHttpResponse()) - .build() as CreateCodeScanResponse - -fun GetCodeScanRequest.transform(): GetCodeAnalysisRequest = - GetCodeAnalysisRequest.builder() - .jobId(this.jobId()) - .build() - -fun GetCodeAnalysisResponse.transform(): GetCodeScanResponse = - GetCodeScanResponse.builder() - .status(this.status().transform()) - .errorMessage(this.errorMessage()) - .responseMetadata(CodeWhispererResponseMetadata.create(this.responseMetadata())) - .sdkHttpResponse(this.sdkHttpResponse()) - .build() as GetCodeScanResponse - -fun ListCodeScanFindingsRequest.transform(): ListCodeAnalysisFindingsRequest = - ListCodeAnalysisFindingsRequest.builder() - .jobId(this.jobId()) - .nextToken(this.nextToken()) - .codeAnalysisFindingsSchema(this.codeScanFindingsSchema().transform()) - .build() - -fun ListCodeAnalysisFindingsResponse.transform(): ListCodeScanFindingsResponse = ListCodeScanFindingsResponse - .builder() - .codeScanFindings(this.codeAnalysisFindings()) - .nextToken(this.nextToken()) - .responseMetadata(CodeWhispererResponseMetadata.create(this.responseMetadata())) - .sdkHttpResponse(this.sdkHttpResponse()) - .build() as ListCodeScanFindingsResponse diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererClientAdaptorTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererClientAdaptorTest.kt index 86ef92f8cc..268caa2ab6 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererClientAdaptorTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererClientAdaptorTest.kt @@ -24,21 +24,10 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.stub import org.mockito.kotlin.times import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyNoInteractions import org.mockito.kotlin.whenever -import software.amazon.awssdk.services.codewhisperer.CodeWhispererClient -import software.amazon.awssdk.services.codewhisperer.model.ArtifactType -import software.amazon.awssdk.services.codewhisperer.model.CodeScanFindingsSchema -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanRequest -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanResponse -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanUploadUrlRequest -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanUploadUrlResponse -import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanRequest -import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanResponse -import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsRequest -import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsResponse -import software.amazon.awssdk.services.codewhisperer.model.ProgrammingLanguage import software.amazon.awssdk.services.codewhispererruntime.CodeWhispererRuntimeClient +import software.amazon.awssdk.services.codewhispererruntime.model.ArtifactType +import software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisFindingsSchema import software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisStatus import software.amazon.awssdk.services.codewhispererruntime.model.CompletionType import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUrlRequest @@ -56,6 +45,7 @@ import software.amazon.awssdk.services.codewhispererruntime.model.ListFeatureEva import software.amazon.awssdk.services.codewhispererruntime.model.ListFeatureEvaluationsResponse import software.amazon.awssdk.services.codewhispererruntime.model.OperatingSystem import software.amazon.awssdk.services.codewhispererruntime.model.OptOutPreference +import software.amazon.awssdk.services.codewhispererruntime.model.ProgrammingLanguage import software.amazon.awssdk.services.codewhispererruntime.model.SendTelemetryEventRequest import software.amazon.awssdk.services.codewhispererruntime.model.SendTelemetryEventResponse import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisRequest @@ -105,7 +95,6 @@ class CodeWhispererClientAdaptorTest { @JvmField val ruleChain = RuleChain(projectRule, mockCredentialRule, mockClientManagerRule, disposableRule) - private lateinit var sigv4Client: CodeWhispererClient private lateinit var bearerClient: CodeWhispererRuntimeClient private lateinit var ssoClient: SsoOidcClient @@ -118,13 +107,6 @@ class CodeWhispererClientAdaptorTest { sut = CodeWhispererClientAdaptorImpl(projectRule.project) ssoClient = mockClientManagerRule.create() - sigv4Client = mockClientManagerRule.create().stub { - on { createCodeScanUploadUrl(any()) } doReturn createCodeScanUploadUrlResponse - on { createCodeScan(any()) } doReturn createCodeScanResponse - on { getCodeScan(any()) } doReturn getCodeScanResponse - on { listCodeScanFindings(any()) } doReturn listCodeScanFindingsResponse - } - bearerClient = mockClientManagerRule.create().stub { on { generateCompletionsPaginator(any()) } doReturn generateCompletionsPaginatorResponse on { createUploadUrl(any()) } doReturn createUploadUrlResponse @@ -229,7 +211,6 @@ class CodeWhispererClientAdaptorTest { } } verify(bearerClient, times(3)).generateCompletions(capture()) - verifyNoInteractions(sigv4Client) assertThat(this.firstValue.nextToken()).isEqualTo("") assertThat(this.secondValue.nextToken()).isEqualTo("first") assertThat(this.thirdValue.nextToken()).isEqualTo("second") @@ -287,7 +268,6 @@ class CodeWhispererClientAdaptorTest { argumentCaptor().apply { verify(bearerClient).createUploadUrl(capture()) - verifyNoInteractions(sigv4Client) assertThat(actual).isInstanceOf(CreateUploadUrlResponse::class.java) assertThat(actual).usingRecursiveComparison() .comparingOnlyFields("uploadUrl", "uploadId") @@ -295,79 +275,40 @@ class CodeWhispererClientAdaptorTest { } } - @Test - fun `createCodeScan - sigv4`() { - val actual = sut.createCodeScan(createCodeScanRequest, true) - - argumentCaptor().apply { - verify(sigv4Client).createCodeScan(capture()) - verifyNoInteractions(bearerClient) - assertThat(firstValue).isSameAs(createCodeScanRequest) - assertThat(actual).isSameAs(createCodeScanResponse) - } - } - @Test fun `createCodeScan - bearer`() { - val actual = sut.createCodeScan(createCodeScanRequest, false) + val actual = sut.createCodeScan(createCodeScanRequest) argumentCaptor().apply { verify(bearerClient).startCodeAnalysis(capture()) - verifyNoInteractions(sigv4Client) - assertThat(actual).isInstanceOf(CreateCodeScanResponse::class.java) + assertThat(actual).isInstanceOf(StartCodeAnalysisResponse::class.java) assertThat(actual).usingRecursiveComparison() .comparingOnlyFields("jobId", "status", "errorMessage") .isEqualTo(startCodeAnalysisResponse) } } - @Test - fun `getCodeScan - sigv4`() { - val actual = sut.getCodeScan(getCodeScanRequest, true) - - argumentCaptor().apply { - verify(sigv4Client).getCodeScan(capture()) - verifyNoInteractions(bearerClient) - assertThat(firstValue).isSameAs(getCodeScanRequest) - assertThat(actual).isSameAs(getCodeScanResponse) - } - } - @Test fun `getCodeScan - bearer`() { - val actual = sut.getCodeScan(getCodeScanRequest, false) + val actual = sut.getCodeScan(getCodeScanRequest) argumentCaptor().apply { verify(bearerClient).getCodeAnalysis(capture()) - verifyNoInteractions(sigv4Client) - assertThat(actual).isInstanceOf(GetCodeScanResponse::class.java) + assertThat(actual).isInstanceOf(GetCodeAnalysisResponse::class.java) assertThat(actual).usingRecursiveComparison() .comparingOnlyFields("status", "errorMessage") .isEqualTo(getCodeAnalysisResponse) } } - @Test - fun `listCodeScanFindings - sigv4`() { - val actual = sut.listCodeScanFindings(listCodeScanFindingsRequest, true) - - argumentCaptor().apply { - verify(sigv4Client).listCodeScanFindings(capture()) - verifyNoInteractions(bearerClient) - assertThat(firstValue).isSameAs(listCodeScanFindingsRequest) - assertThat(actual).isSameAs(listCodeScanFindingsResponse) - } - } - @Test fun `listCodeScanFindings - bearer`() { - val actual = sut.listCodeScanFindings(listCodeScanFindingsRequest, false) + val actual = sut.listCodeScanFindings(listCodeScanFindingsRequest) argumentCaptor().apply { verify(bearerClient).listCodeAnalysisFindings(capture()) - verifyNoInteractions(sigv4Client) - assertThat(actual).isInstanceOf(ListCodeScanFindingsResponse::class.java) - assertThat(actual.codeScanFindings()).isEqualTo(listCodeAnalysisFindingsResponse.codeAnalysisFindings()) + assertThat(actual).isInstanceOf(ListCodeAnalysisFindingsResponse::class.java) + assertThat(actual.codeAnalysisFindings()).isEqualTo(listCodeAnalysisFindingsResponse.codeAnalysisFindings()) assertThat(actual.nextToken()).isEqualTo(listCodeAnalysisFindingsResponse.nextToken()) } } @@ -441,7 +382,7 @@ class CodeWhispererClientAdaptorTest { } private companion object { - val createCodeScanRequest = CreateCodeScanRequest.builder() + val createCodeScanRequest = StartCodeAnalysisRequest.builder() .artifacts(mapOf(ArtifactType.SOURCE_CODE to "foo")) .clientToken("token") .programmingLanguage( @@ -456,12 +397,12 @@ class CodeWhispererClientAdaptorTest { .artifactType(software.amazon.awssdk.services.codewhispererruntime.model.ArtifactType.SOURCE_CODE) .build() - val getCodeScanRequest = GetCodeScanRequest.builder() + val getCodeScanRequest = GetCodeAnalysisRequest.builder() .jobId("jobid") .build() - val listCodeScanFindingsRequest = ListCodeScanFindingsRequest.builder() - .codeScanFindingsSchema(CodeScanFindingsSchema.CODESCAN_FINDINGS_1_0) + val listCodeScanFindingsRequest = ListCodeAnalysisFindingsRequest.builder() + .codeAnalysisFindingsSchema(CodeAnalysisFindingsSchema.CODEANALYSIS_FINDINGS_1_0) .jobId("listCodeScanFindings - JobId") .nextToken("nextToken") .build() @@ -500,13 +441,5 @@ class CodeWhispererClientAdaptorTest { val listFeatureEvaluationsResponse = ListFeatureEvaluationsResponse.builder().build() private val generateCompletionsPaginatorResponse: GenerateCompletionsIterable = mock() - - private val createCodeScanUploadUrlResponse: CreateCodeScanUploadUrlResponse = mock() - - private val createCodeScanResponse: CreateCodeScanResponse = mock() - - private val getCodeScanResponse: GetCodeScanResponse = mock() - - private val listCodeScanFindingsResponse: ListCodeScanFindingsResponse = mock() } } diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererClientTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererClientTest.kt deleted file mode 100644 index c680883b7c..0000000000 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererClientTest.kt +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package software.aws.toolkits.jetbrains.services.codewhisperer - -import com.github.tomakehurst.wiremock.client.WireMock -import com.github.tomakehurst.wiremock.client.WireMock.matching -import com.github.tomakehurst.wiremock.client.WireMock.post -import com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor -import com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo -import com.github.tomakehurst.wiremock.client.WireMock.verify -import com.github.tomakehurst.wiremock.core.WireMockConfiguration -import com.github.tomakehurst.wiremock.junit.WireMockRule -import com.intellij.openapi.application.ApplicationManager -import com.intellij.testFramework.ApplicationRule -import com.intellij.testFramework.DisposableRule -import com.intellij.testFramework.RuleChain -import com.intellij.testFramework.replaceService -import org.junit.After -import org.junit.Before -import org.junit.Rule -import org.junit.Test -import org.mockito.kotlin.mock -import org.mockito.kotlin.whenever -import software.amazon.awssdk.http.SdkHttpClient -import software.amazon.awssdk.regions.Region -import software.amazon.awssdk.services.codewhisperer.CodeWhispererClient -import software.aws.toolkits.core.utils.tryOrNull -import software.aws.toolkits.jetbrains.core.AwsClientManager -import software.aws.toolkits.jetbrains.core.MockClientManager -import software.aws.toolkits.jetbrains.core.MockClientManagerRule -import software.aws.toolkits.jetbrains.core.credentials.MockCredentialManagerRule -import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager -import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererEndpointCustomizer -import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings - -/** - * If this test class failed, highly likely because the endpoint is overwritten by [CodeWhispererEndpointCustomizer] - */ -class CodeWhispererClientTest { - val applicationRule = ApplicationRule() - val mockCredentialManager = MockCredentialManagerRule() - val mockClientManagerRule = MockClientManagerRule() - - @Rule - @JvmField - val ruleChain = RuleChain(applicationRule, mockClientManagerRule, mockCredentialManager) - - @Rule - @JvmField - val wireMock = WireMockRule(WireMockConfiguration.wireMockConfig().dynamicPort()) - - @Rule - @JvmField - val disposable = DisposableRule() - - private lateinit var httpClient: SdkHttpClient - private lateinit var mockExplorerActionManager: CodeWhispererExplorerActionManager - private lateinit var mockClient: CodeWhispererClient - - @Before - fun setUp() { - MockClientManager.useRealImplementations(disposable.disposable) - - // Endpoint will be override by CodeWhispererEndpointCustomizer if there is one, i.e. will call real one instead of localhost - mockClient = AwsClientManager.getInstance().createUnmanagedClient( - mockCredentialManager.createCredentialProvider(), - Region.US_WEST_2, - "http://127.0.0.1:${wireMock.port()}" - ) - wireMock.stubFor( - post("/") - .willReturn( - WireMock.aResponse().withStatus(200) - ) - ) - - mockExplorerActionManager = mock() - whenever(mockExplorerActionManager.resolveAccessToken()).thenReturn(CodeWhispererTestUtil.testValidAccessToken) - ApplicationManager.getApplication().replaceService(CodeWhispererExplorerActionManager::class.java, mockExplorerActionManager, disposable.disposable) - } - - @After - fun tearDown() { - tryOrNull { httpClient.close() } - } - - @Test - fun `check GetAccessToken request header`() { - mockClient.getAccessToken {} - verify( - postRequestedFor(urlEqualTo("/")) - .withoutHeader(CodeWhispererEndpointCustomizer.OPTOUT_KEY_NAME) - .withoutHeader(CodeWhispererEndpointCustomizer.OPTOUT_KEY_NAME) - ) - } - - @Test - fun `check ListRecommendation request header`() { - mockClient.listRecommendations {} - // default is opt-in (thus opt-out = false) - verify( - postRequestedFor(urlEqualTo("/")) - .withHeader(CodeWhispererEndpointCustomizer.TOKEN_KEY_NAME, matching(CodeWhispererTestUtil.testValidAccessToken)) - .withHeader(CodeWhispererEndpointCustomizer.OPTOUT_KEY_NAME, matching("false")) - ) - - CodeWhispererSettings.getInstance().toggleMetricOptIn(false) - mockClient.listRecommendations {} - verify( - postRequestedFor(urlEqualTo("/")) - .withHeader(CodeWhispererEndpointCustomizer.TOKEN_KEY_NAME, matching(CodeWhispererTestUtil.testValidAccessToken)) - .withHeader(CodeWhispererEndpointCustomizer.OPTOUT_KEY_NAME, matching("true")) - ) - } - - @Test - fun `check createCodeScan request header`() { - mockClient.createCodeScan {} - verify( - postRequestedFor(urlEqualTo("/")) - .withHeader(CodeWhispererEndpointCustomizer.TOKEN_KEY_NAME, matching(CodeWhispererTestUtil.testValidAccessToken)) - .withoutHeader(CodeWhispererEndpointCustomizer.OPTOUT_KEY_NAME) - - ) - } - - @Test - fun `check createUploadUrl request header`() { - mockClient.createCodeScanUploadUrl {} - verify( - postRequestedFor(urlEqualTo("/")) - .withHeader(CodeWhispererEndpointCustomizer.TOKEN_KEY_NAME, matching(CodeWhispererTestUtil.testValidAccessToken)) - .withoutHeader(CodeWhispererEndpointCustomizer.OPTOUT_KEY_NAME) - ) - } - - @Test - fun `check listCodeScanFindings request header`() { - mockClient.listCodeScanFindings {} - verify( - postRequestedFor(urlEqualTo("/")) - .withHeader(CodeWhispererEndpointCustomizer.TOKEN_KEY_NAME, matching(CodeWhispererTestUtil.testValidAccessToken)) - .withoutHeader(CodeWhispererEndpointCustomizer.OPTOUT_KEY_NAME) - ) - } -} diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererSdkMapperUtilTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererSdkMapperUtilTest.kt deleted file mode 100644 index 864170cafb..0000000000 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererSdkMapperUtilTest.kt +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package software.aws.toolkits.jetbrains.services.codewhisperer - -import org.assertj.core.api.Assertions.assertThat -import org.junit.Test -import software.amazon.awssdk.services.codewhisperer.model.ArtifactType -import software.amazon.awssdk.services.codewhisperer.model.CodeScanFindingsSchema -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanRequest -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanResponse -import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanRequest -import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanResponse -import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsRequest -import software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisFindingsSchema -import software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisStatus -import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeAnalysisRequest -import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeAnalysisResponse -import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsResponse -import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisRequest -import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisResponse -import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.metadata -import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.sdkHttpResponse -import software.aws.toolkits.jetbrains.services.codewhisperer.util.transform -import java.util.UUID - -class CodeWhispererSdkMapperUtilTest { - // TODO: revisit these test cases since if we miss one field, they don't capture - - @Test - fun `CreateCodeScanRequest`() { - val expected = CreateCodeScanRequest.builder() - .programmingLanguage { it.languageName("python") } - .artifacts(mapOf(ArtifactType.SOURCE_CODE to "1", ArtifactType.BUILT_JARS to "2")) - .clientToken("token") - .scope("PROJECT") - .codeScanName(UUID.randomUUID().toString().replace("-", "").take(16)) - .build() - - val actual = expected.transform() - assertThat(actual) - .isNotNull - .isInstanceOf(StartCodeAnalysisRequest::class.java) - .usingRecursiveComparison() - .isEqualTo(expected) - } - - @Test - fun `StartCodeAnalysisResponse`() { - val expected = StartCodeAnalysisResponse.builder() - .jobId("jobid") - .status(CodeAnalysisStatus.PENDING) - .errorMessage("msg") - .responseMetadata(metadata) - .sdkHttpResponse(sdkHttpResponse) - .build() as StartCodeAnalysisResponse - - val actual = expected.transform() - assertThat(actual) - .isNotNull - .isInstanceOf(CreateCodeScanResponse::class.java) - .usingRecursiveComparison() - .isEqualTo(expected) - } - - @Test - fun `GetCodeScanRequest`() { - val expected = GetCodeScanRequest.builder() - .jobId("123") - .build() - - val actual = expected.transform() - assertThat(actual) - .isNotNull - .isInstanceOf(GetCodeAnalysisRequest::class.java) - .usingRecursiveComparison() - .isEqualTo(expected) - } - - @Test - fun `GetCodeAnalysisResponse`() { - val expected = GetCodeAnalysisResponse.builder() - .status(CodeAnalysisStatus.COMPLETED) - .errorMessage("msg") - .responseMetadata(metadata) - .sdkHttpResponse(sdkHttpResponse) - .build() as GetCodeAnalysisResponse - - val actual = expected.transform() - assertThat(actual) - .isNotNull - .isInstanceOf(GetCodeScanResponse::class.java) - .usingRecursiveComparison() - .isEqualTo(expected) - } - - @Test - fun `ListCodeScanFindingsRequest`() { - val expected = ListCodeScanFindingsRequest.builder() - .codeScanFindingsSchema(CodeScanFindingsSchema.CODESCAN_FINDINGS_1_0) - .jobId("id") - .nextToken("123") - .build() - - val actual = expected.transform() - assertThat(actual.jobId()).isEqualTo(expected.jobId()) - assertThat(actual.nextToken()).isEqualTo(expected.nextToken()) - assertThat(actual.codeAnalysisFindingsSchema()).isEqualTo(CodeAnalysisFindingsSchema.CODEANALYSIS_FINDINGS_1_0) - } - - @Test - fun `ListCodeAnalysisFindingsResponse`() { - val expected = ListCodeAnalysisFindingsResponse.builder() - .codeAnalysisFindings(CodeScanFindingsSchema.UNKNOWN_TO_SDK_VERSION.toString()) // the model provided only has builder.codeScanFindings(String) - .nextToken("token") - .responseMetadata(metadata) - .sdkHttpResponse(sdkHttpResponse) - .build() as ListCodeAnalysisFindingsResponse - - val actual = expected.transform() - assertThat(actual.nextToken()) - .isNotNull - .isInstanceOf(String::class.java) - .isEqualTo(expected.nextToken()) - assertThat(actual.codeScanFindings()) - .isNotNull - .isInstanceOf(String::class.java) - .isEqualTo(expected.codeAnalysisFindings()) - } -} diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeFileScanTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeFileScanTest.kt index 524b9c1689..af25dca9c3 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeFileScanTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeFileScanTest.kt @@ -24,7 +24,7 @@ import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import software.amazon.awssdk.awscore.exception.AwsErrorDetails -import software.amazon.awssdk.services.codewhisperer.model.CodeWhispererException +import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUrlRequest import software.aws.toolkits.core.utils.WaiterTimeoutException import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.sessionconfig.CodeScanSessionConfig @@ -118,9 +118,9 @@ class CodeWhispererCodeFileScanTest : CodeWhispererCodeScanTestBase(PythonCodeIn mockClient.stub { // setupResponse dynamically modifies these fake responses so this is very hard to follow and makes me question if we even need this onGeneric { createUploadUrl(any()) }.thenAnswer { fakeCreateUploadUrlResponse } - onGeneric { createCodeScan(any(), any()) }.thenAnswer { fakeCreateCodeScanResponse } - onGeneric { getCodeScan(any(), any()) }.thenAnswer { fakeGetCodeScanResponse } - onGeneric { listCodeScanFindings(any(), any()) }.thenAnswer { fakeListCodeScanFindingsResponse } + onGeneric { createCodeScan(any()) }.thenAnswer { fakeCreateCodeScanResponse } + onGeneric { getCodeScan(any()) }.thenAnswer { fakeGetCodeScanResponse } + onGeneric { listCodeScanFindings(any()) }.thenAnswer { fakeListCodeScanFindingsResponse } } } @@ -282,7 +282,7 @@ class CodeWhispererCodeFileScanTest : CodeWhispererCodeScanTestBase(PythonCodeIn @Test fun `test mapToCodeScanIssues`() { val recommendations = listOf( - fakeListCodeScanFindingsResponse.codeScanFindings(), + fakeListCodeScanFindingsResponse.codeAnalysisFindings(), getFakeRecommendationsOnNonExistentFile() ) val res = codeScanSessionSpy.mapToCodeScanIssues(recommendations, project, "jobId") @@ -365,7 +365,7 @@ class CodeWhispererCodeFileScanTest : CodeWhispererCodeScanTestBase(PythonCodeIn mockClient.stub { onGeneric { zipUploadManagerSpy.createUploadUrlAndUpload(any(), any(), any(), any(), any()) }.thenThrow( - CodeWhispererException.builder() + CodeWhispererRuntimeException.builder() .message("File Scan Monthly Exceeded") .requestId("abc123") .statusCode(400) @@ -384,7 +384,7 @@ class CodeWhispererCodeFileScanTest : CodeWhispererCodeScanTestBase(PythonCodeIn val codeScanResponse = codeScanSessionSpy.run() assertThat(codeScanResponse).isInstanceOf() if (codeScanResponse is CodeScanResponse.Failure) { - assertThat(codeScanResponse.failureReason).isInstanceOf() + assertThat(codeScanResponse.failureReason).isInstanceOf() assertThat(codeScanResponse.failureReason.toString()).contains("File Scan Monthly Exceeded") assertThat(codeScanResponse.failureReason.cause.toString()).contains("java.lang.RuntimeException: Something went wrong") } @@ -393,7 +393,7 @@ class CodeWhispererCodeFileScanTest : CodeWhispererCodeScanTestBase(PythonCodeIn @Test fun `test run() - createCodeScan failed`() = runTest { mockClient.stub { - onGeneric { createCodeScan(any(), any()) }.thenReturn(fakeCreateCodeScanResponseFailed) + onGeneric { createCodeScan(any()) }.thenReturn(fakeCreateCodeScanResponseFailed) } val codeScanResponse = codeScanSessionSpy.run() @@ -405,7 +405,7 @@ class CodeWhispererCodeFileScanTest : CodeWhispererCodeScanTestBase(PythonCodeIn @Test fun `test run() - createCodeScan error`() = runTest { mockClient.stub { - onGeneric { createCodeScan(any(), any()) }.thenThrow(CodeWhispererCodeScanServerException::class.java) + onGeneric { createCodeScan(any()) }.thenThrow(CodeWhispererCodeScanServerException::class.java) } val codeScanResponse = codeScanSessionSpy.run() @@ -417,7 +417,7 @@ class CodeWhispererCodeFileScanTest : CodeWhispererCodeScanTestBase(PythonCodeIn @Test fun `test run() - getCodeScan failed`() = runTest { mockClient.stub { - onGeneric { getCodeScan(any(), any()) }.thenReturn(fakeGetCodeScanResponseFailed) + onGeneric { getCodeScan(any()) }.thenReturn(fakeGetCodeScanResponseFailed) } val codeScanResponse = codeScanSessionSpy.run() @@ -432,7 +432,7 @@ class CodeWhispererCodeFileScanTest : CodeWhispererCodeScanTestBase(PythonCodeIn onGeneric { overallJobTimeoutInSeconds() }.thenReturn(5) } mockClient.stub { - onGeneric { getCodeScan(any(), any()) }.thenAnswer { + onGeneric { getCodeScan(any()) }.thenAnswer { Thread.sleep(TIMEOUT) fakeGetCodeScanResponsePending } @@ -447,7 +447,7 @@ class CodeWhispererCodeFileScanTest : CodeWhispererCodeScanTestBase(PythonCodeIn @Test fun `test run() - getCodeScan error`() = runTest { mockClient.stub { - onGeneric { getCodeScan(any(), any()) }.thenThrow(CodeWhispererCodeScanServerException::class.java) + onGeneric { getCodeScan(any()) }.thenThrow(CodeWhispererCodeScanServerException::class.java) } val codeScanResponse = codeScanSessionSpy.run() @@ -459,7 +459,7 @@ class CodeWhispererCodeFileScanTest : CodeWhispererCodeScanTestBase(PythonCodeIn @Test fun `test run() - listCodeScanFindings error`() = runTest { mockClient.stub { - onGeneric { listCodeScanFindings(any(), any()) }.thenThrow(CodeWhispererCodeScanServerException::class.java) + onGeneric { listCodeScanFindings(any()) }.thenThrow(CodeWhispererCodeScanServerException::class.java) } val codeScanResponse = codeScanSessionSpy.run() diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanTest.kt index ea9b5c3058..2cfd994223 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanTest.kt @@ -21,7 +21,7 @@ import org.mockito.kotlin.stub import org.mockito.kotlin.times import org.mockito.kotlin.verify import software.amazon.awssdk.awscore.exception.AwsErrorDetails -import software.amazon.awssdk.services.codewhisperer.model.CodeWhispererException +import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUrlRequest import software.aws.toolkits.core.utils.WaiterTimeoutException import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.sessionconfig.CodeScanSessionConfig @@ -85,9 +85,9 @@ class CodeWhispererCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsigh mockClient.stub { onGeneric { createUploadUrl(any()) }.thenReturn(fakeCreateUploadUrlResponse) - onGeneric { createCodeScan(any(), any()) }.thenReturn(fakeCreateCodeScanResponse) - onGeneric { getCodeScan(any(), any()) }.thenReturn(fakeGetCodeScanResponse) - onGeneric { listCodeScanFindings(any(), any()) }.thenReturn(fakeListCodeScanFindingsResponse) + onGeneric { createCodeScan(any()) }.thenReturn(fakeCreateCodeScanResponse) + onGeneric { getCodeScan(any()) }.thenReturn(fakeGetCodeScanResponse) + onGeneric { listCodeScanFindings(any()) }.thenReturn(fakeListCodeScanFindingsResponse) } } @@ -157,7 +157,7 @@ class CodeWhispererCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsigh @Test fun `test mapToCodeScanIssues`() { val recommendations = listOf( - fakeListCodeScanFindingsResponse.codeScanFindings(), + fakeListCodeScanFindingsResponse.codeAnalysisFindings(), getFakeRecommendationsOnNonExistentFile() ) val res = codeScanSessionSpy.mapToCodeScanIssues(recommendations, project, "jobId") @@ -167,7 +167,7 @@ class CodeWhispererCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsigh @Test fun `test mapToCodeScanIssues - handles index out of bounds`() { val recommendations = listOf( - fakeListCodeScanFindingsOutOfBoundsIndexResponse.codeScanFindings(), + fakeListCodeScanFindingsOutOfBoundsIndexResponse.codeAnalysisFindings(), ) val res = codeScanSessionSpy.mapToCodeScanIssues(recommendations, project, "jobId") assertThat(res).hasSize(1) @@ -226,7 +226,7 @@ class CodeWhispererCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsigh mockClient.stub { onGeneric { zipUploadManagerSpy.createUploadUrlAndUpload(any(), any(), any(), any(), any()) }.thenThrow( - CodeWhispererException.builder() + CodeWhispererRuntimeException.builder() .message("Project Review Monthly Exceeded") .requestId("abc123") .statusCode(400) @@ -246,7 +246,7 @@ class CodeWhispererCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsigh val codeScanResponse = codeScanSessionSpy.run() assertThat(codeScanResponse).isInstanceOf() if (codeScanResponse is CodeScanResponse.Failure) { - assertThat(codeScanResponse.failureReason).isInstanceOf() + assertThat(codeScanResponse.failureReason).isInstanceOf() assertThat(codeScanResponse.failureReason.toString()).contains("Project Review Monthly Exceeded") assertThat(codeScanResponse.failureReason.cause.toString()).contains("java.lang.RuntimeException: Something went wrong") } @@ -255,7 +255,7 @@ class CodeWhispererCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsigh @Test fun `test run() - createCodeScan failed`() = runTest { mockClient.stub { - onGeneric { createCodeScan(any(), any()) }.thenReturn(fakeCreateCodeScanResponseFailed) + onGeneric { createCodeScan(any()) }.thenReturn(fakeCreateCodeScanResponseFailed) } val codeScanResponse = codeScanSessionSpy.run() @@ -267,7 +267,7 @@ class CodeWhispererCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsigh @Test fun `test run() - createCodeScan error`() = runTest { mockClient.stub { - onGeneric { createCodeScan(any(), any()) }.thenThrow(CodeWhispererCodeScanServerException::class.java) + onGeneric { createCodeScan(any()) }.thenThrow(CodeWhispererCodeScanServerException::class.java) } val codeScanResponse = codeScanSessionSpy.run() @@ -279,7 +279,7 @@ class CodeWhispererCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsigh @Test fun `test run() - getCodeScan failed`() = runTest { mockClient.stub { - onGeneric { getCodeScan(any(), any()) }.thenReturn(fakeGetCodeScanResponseFailed) + onGeneric { getCodeScan(any()) }.thenReturn(fakeGetCodeScanResponseFailed) } val codeScanResponse = codeScanSessionSpy.run() @@ -294,7 +294,7 @@ class CodeWhispererCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsigh onGeneric { overallJobTimeoutInSeconds() }.thenReturn(5) } mockClient.stub { - onGeneric { getCodeScan(any(), any()) }.thenAnswer { + onGeneric { getCodeScan(any()) }.thenAnswer { Thread.sleep(TIMEOUT) fakeGetCodeScanResponsePending } @@ -309,7 +309,7 @@ class CodeWhispererCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsigh @Test fun `test run() - getCodeScan error`() = runTest { mockClient.stub { - onGeneric { getCodeScan(any(), any()) }.thenThrow(CodeWhispererCodeScanServerException::class.java) + onGeneric { getCodeScan(any()) }.thenThrow(CodeWhispererCodeScanServerException::class.java) } val codeScanResponse = codeScanSessionSpy.run() @@ -321,7 +321,7 @@ class CodeWhispererCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsigh @Test fun `test run() - listCodeScanFindings error`() = runTest { mockClient.stub { - onGeneric { listCodeScanFindings(any(), any()) }.thenThrow(CodeWhispererCodeScanServerException::class.java) + onGeneric { listCodeScanFindings(any()) }.thenThrow(CodeWhispererCodeScanServerException::class.java) } val codeScanResponse = codeScanSessionSpy.run() diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanTestBase.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanTestBase.kt index e53bcf18b2..c3e72939bd 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanTestBase.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanTestBase.kt @@ -30,15 +30,15 @@ import org.mockito.kotlin.stub import org.mockito.kotlin.whenever import software.amazon.awssdk.awscore.DefaultAwsResponseMetadata import software.amazon.awssdk.awscore.util.AwsHeader -import software.amazon.awssdk.services.codewhisperer.model.CodeScanStatus -import software.amazon.awssdk.services.codewhisperer.model.CreateCodeScanResponse -import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanResponse -import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsResponse +import software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisStatus import software.amazon.awssdk.services.codewhispererruntime.model.CodeFixJobStatus import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUrlResponse +import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeAnalysisResponse import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeFixJobResponse +import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsResponse import software.amazon.awssdk.services.codewhispererruntime.model.Reference import software.amazon.awssdk.services.codewhispererruntime.model.Span +import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisResponse import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeFixJobResponse import software.aws.toolkits.jetbrains.core.MockClientManagerRule import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil @@ -79,15 +79,15 @@ open class CodeWhispererCodeScanTestBase(projectRule: CodeInsightTestFixtureRule internal lateinit var s3endpoint: String internal lateinit var fakeCreateUploadUrlResponse: CreateUploadUrlResponse - internal lateinit var fakeCreateCodeScanResponse: CreateCodeScanResponse - internal lateinit var fakeCreateCodeScanResponseFailed: CreateCodeScanResponse - internal lateinit var fakeCreateCodeScanResponsePending: CreateCodeScanResponse - internal lateinit var fakeListCodeScanFindingsResponse: ListCodeScanFindingsResponse - internal lateinit var fakeListCodeScanFindingsResponseE2E: ListCodeScanFindingsResponse - internal lateinit var fakeListCodeScanFindingsOutOfBoundsIndexResponse: ListCodeScanFindingsResponse - internal lateinit var fakeGetCodeScanResponse: GetCodeScanResponse - internal lateinit var fakeGetCodeScanResponsePending: GetCodeScanResponse - internal lateinit var fakeGetCodeScanResponseFailed: GetCodeScanResponse + internal lateinit var fakeCreateCodeScanResponse: StartCodeAnalysisResponse + internal lateinit var fakeCreateCodeScanResponseFailed: StartCodeAnalysisResponse + internal lateinit var fakeCreateCodeScanResponsePending: StartCodeAnalysisResponse + internal lateinit var fakeListCodeScanFindingsResponse: ListCodeAnalysisFindingsResponse + internal lateinit var fakeListCodeScanFindingsResponseE2E: ListCodeAnalysisFindingsResponse + internal lateinit var fakeListCodeScanFindingsOutOfBoundsIndexResponse: ListCodeAnalysisFindingsResponse + internal lateinit var fakeGetCodeScanResponse: GetCodeAnalysisResponse + internal lateinit var fakeGetCodeScanResponsePending: GetCodeAnalysisResponse + internal lateinit var fakeGetCodeScanResponseFailed: GetCodeAnalysisResponse internal lateinit var fakeGetCodeFixJobResponse: GetCodeFixJobResponse internal lateinit var fakeStartCodeFixJobResponse: StartCodeFixJobResponse @@ -257,53 +257,53 @@ open class CodeWhispererCodeScanTestBase(projectRule: CodeInsightTestFixtureRule .responseMetadata(metadata) .build() as StartCodeFixJobResponse - fakeCreateCodeScanResponse = CreateCodeScanResponse.builder() - .status(CodeScanStatus.COMPLETED) + fakeCreateCodeScanResponse = StartCodeAnalysisResponse.builder() + .status(CodeAnalysisStatus.COMPLETED) .jobId(JOB_ID) .responseMetadata(metadata) - .build() as CreateCodeScanResponse + .build() as StartCodeAnalysisResponse - fakeCreateCodeScanResponseFailed = CreateCodeScanResponse.builder() - .status(CodeScanStatus.FAILED) + fakeCreateCodeScanResponseFailed = StartCodeAnalysisResponse.builder() + .status(CodeAnalysisStatus.FAILED) .jobId(JOB_ID) .responseMetadata(metadata) - .build() as CreateCodeScanResponse + .build() as StartCodeAnalysisResponse - fakeCreateCodeScanResponsePending = CreateCodeScanResponse.builder() - .status(CodeScanStatus.PENDING) + fakeCreateCodeScanResponsePending = StartCodeAnalysisResponse.builder() + .status(CodeAnalysisStatus.PENDING) .jobId(JOB_ID) .responseMetadata(metadata) - .build() as CreateCodeScanResponse + .build() as StartCodeAnalysisResponse - fakeListCodeScanFindingsResponse = ListCodeScanFindingsResponse.builder() - .codeScanFindings(setupCodeScanFindings(filePath)) + fakeListCodeScanFindingsResponse = ListCodeAnalysisFindingsResponse.builder() + .codeAnalysisFindings(setupCodeScanFindings(filePath)) .responseMetadata(metadata) - .build() as ListCodeScanFindingsResponse + .build() as ListCodeAnalysisFindingsResponse - fakeListCodeScanFindingsResponseE2E = ListCodeScanFindingsResponse.builder() - .codeScanFindings(setupCodeScanFindingsE2E(filePath)) + fakeListCodeScanFindingsResponseE2E = ListCodeAnalysisFindingsResponse.builder() + .codeAnalysisFindings(setupCodeScanFindingsE2E(filePath)) .responseMetadata(metadata) - .build() as ListCodeScanFindingsResponse + .build() as ListCodeAnalysisFindingsResponse - fakeListCodeScanFindingsOutOfBoundsIndexResponse = ListCodeScanFindingsResponse.builder() - .codeScanFindings(setupCodeScanFindingsOutOfBounds(filePath)) + fakeListCodeScanFindingsOutOfBoundsIndexResponse = ListCodeAnalysisFindingsResponse.builder() + .codeAnalysisFindings(setupCodeScanFindingsOutOfBounds(filePath)) .responseMetadata(metadata) - .build() as ListCodeScanFindingsResponse + .build() as ListCodeAnalysisFindingsResponse - fakeGetCodeScanResponse = GetCodeScanResponse.builder() - .status(CodeScanStatus.COMPLETED) + fakeGetCodeScanResponse = GetCodeAnalysisResponse.builder() + .status(CodeAnalysisStatus.COMPLETED) .responseMetadata(metadata) - .build() as GetCodeScanResponse + .build() as GetCodeAnalysisResponse - fakeGetCodeScanResponsePending = GetCodeScanResponse.builder() - .status(CodeScanStatus.PENDING) + fakeGetCodeScanResponsePending = GetCodeAnalysisResponse.builder() + .status(CodeAnalysisStatus.PENDING) .responseMetadata(metadata) - .build() as GetCodeScanResponse + .build() as GetCodeAnalysisResponse - fakeGetCodeScanResponseFailed = GetCodeScanResponse.builder() - .status(CodeScanStatus.FAILED) + fakeGetCodeScanResponseFailed = GetCodeAnalysisResponse.builder() + .status(CodeAnalysisStatus.FAILED) .responseMetadata(metadata) - .build() as GetCodeScanResponse + .build() as GetCodeAnalysisResponse } protected fun getFakeRecommendationsOnNonExistentFile() = """ diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererProjectCodeScanTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererProjectCodeScanTest.kt index ea1f0f2bd2..9cf64c1fa1 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererProjectCodeScanTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererProjectCodeScanTest.kt @@ -55,9 +55,9 @@ class CodeWhispererProjectCodeScanTest : CodeWhispererCodeScanTestBase(PythonCod mockClient.stub { onGeneric { createUploadUrl(any()) }.thenReturn(fakeCreateUploadUrlResponse) - onGeneric { createCodeScan(any(), any()) }.thenReturn(fakeCreateCodeScanResponse) - onGeneric { getCodeScan(any(), any()) }.thenReturn(fakeGetCodeScanResponse) - onGeneric { listCodeScanFindings(any(), any()) }.thenReturn(fakeListCodeScanFindingsResponseE2E) + onGeneric { createCodeScan(any()) }.thenReturn(fakeCreateCodeScanResponse) + onGeneric { getCodeScan(any()) }.thenReturn(fakeGetCodeScanResponse) + onGeneric { listCodeScanFindings(any()) }.thenReturn(fakeListCodeScanFindingsResponseE2E) } } diff --git a/plugins/core/sdk-codegen/codegen-resources/codewhisperer/paginators-1.json b/plugins/core/sdk-codegen/codegen-resources/codewhisperer/paginators-1.json deleted file mode 100644 index d911d5d9fa..0000000000 --- a/plugins/core/sdk-codegen/codegen-resources/codewhisperer/paginators-1.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "pagination": { - "ListCodeScanFindings": { - "input_token": "nextToken", - "output_token": "nextToken" - }, - "ListRecommendations": { - "input_token": "nextToken", - "output_token": "nextToken", - "limit_key": "maxResults" - } - } -} diff --git a/plugins/core/sdk-codegen/codegen-resources/codewhisperer/service-2.json b/plugins/core/sdk-codegen/codegen-resources/codewhisperer/service-2.json deleted file mode 100644 index d98a07b555..0000000000 --- a/plugins/core/sdk-codegen/codegen-resources/codewhisperer/service-2.json +++ /dev/null @@ -1,682 +0,0 @@ -{ - "version":"2.0", - "metadata":{ - "apiVersion":"2022-06-15", - "endpointPrefix":"codewhisperer", - "jsonVersion":"1.0", - "protocol":"json", - "serviceFullName":"AWS CodeWhisperer", - "serviceId":"CodeWhisperer", - "signatureVersion":"v4", - "signingName":"codewhisperer", - "targetPrefix":"AWSCodeWhispererService", - "uid":"codewhisperer-2022-06-15" - }, - "operations":{ - "CreateCodeScan":{ - "name":"CreateCodeScan", - "http":{ - "method":"POST", - "requestUri":"/" - }, - "input":{"shape":"CreateCodeScanRequest"}, - "output":{"shape":"CreateCodeScanResponse"}, - "errors":[ - {"shape":"ThrottlingException"}, - {"shape":"ConflictException"}, - {"shape":"ResourceNotFoundException"}, - {"shape":"InternalServerException"}, - {"shape":"ValidationException"}, - {"shape":"AccessDeniedException"} - ], - "idempotent":true - }, - "CreateCodeScanUploadUrl":{ - "name":"CreateCodeScanUploadUrl", - "http":{ - "method":"POST", - "requestUri":"/" - }, - "input":{"shape":"CreateUploadUrlRequest"}, - "output":{"shape":"CreateUploadUrlResponse"}, - "errors":[ - {"shape":"ThrottlingException"}, - {"shape":"InternalServerException"}, - {"shape":"ValidationException"}, - {"shape":"AccessDeniedException"} - ], - "idempotent":true - }, - "GenerateRecommendations":{ - "name":"GenerateRecommendations", - "http":{ - "method":"POST", - "requestUri":"/" - }, - "input":{"shape":"GenerateRecommendationsRequest"}, - "output":{"shape":"GenerateRecommendationsResponse"}, - "errors":[ - {"shape":"ThrottlingException"}, - {"shape":"InternalServerException"}, - {"shape":"ValidationException"}, - {"shape":"AccessDeniedException"} - ] - }, - "GetAccessToken":{ - "name":"GetAccessToken", - "http":{ - "method":"POST", - "requestUri":"/" - }, - "input":{"shape":"GetAccessTokenRequest"}, - "output":{"shape":"GetAccessTokenResponse"}, - "errors":[ - {"shape":"InternalServerException"}, - {"shape":"ValidationException"}, - {"shape":"AccessDeniedException"} - ] - }, - "GetCodeScan":{ - "name":"GetCodeScan", - "http":{ - "method":"POST", - "requestUri":"/" - }, - "input":{"shape":"GetCodeScanRequest"}, - "output":{"shape":"GetCodeScanResponse"}, - "errors":[ - {"shape":"ThrottlingException"}, - {"shape":"ResourceNotFoundException"}, - {"shape":"InternalServerException"}, - {"shape":"ValidationException"}, - {"shape":"AccessDeniedException"} - ] - }, - "ListCodeScanFindings":{ - "name":"ListCodeScanFindings", - "http":{ - "method":"POST", - "requestUri":"/" - }, - "input":{"shape":"ListCodeScanFindingsRequest"}, - "output":{"shape":"ListCodeScanFindingsResponse"}, - "errors":[ - {"shape":"ThrottlingException"}, - {"shape":"ResourceNotFoundException"}, - {"shape":"InternalServerException"}, - {"shape":"ValidationException"}, - {"shape":"AccessDeniedException"} - ] - }, - "ListRecommendations":{ - "name":"ListRecommendations", - "http":{ - "method":"POST", - "requestUri":"/" - }, - "input":{"shape":"ListRecommendationsRequest"}, - "output":{"shape":"ListRecommendationsResponse"}, - "errors":[ - {"shape":"ThrottlingException"}, - {"shape":"InternalServerException"}, - {"shape":"ValidationException"}, - {"shape":"AccessDeniedException"} - ] - } - }, - "shapes":{ - "AccessDeniedException":{ - "type":"structure", - "required":["message"], - "members":{ - "message":{"shape":"String"} - }, - "exception":true - }, - "ArtifactMap":{ - "type":"map", - "key":{"shape":"ArtifactType"}, - "value":{"shape":"UploadId"}, - "max":64, - "min":1 - }, - "ArtifactType":{ - "type":"string", - "enum":[ - "SourceCode", - "BuiltJars" - ] - }, - "CodeAnalysisScope":{ - "type":"string", - "enum":[ - "FILE", - "PROJECT" - ] - }, - "CodeAnalysisUploadContext": { - "type": "structure", - "required": ["codeScanName"], - "members": { - "codeScanName": { "shape": "CodeScanName" } - } - }, - "CodeScanFindingsSchema":{ - "type":"string", - "enum":["codescan/findings/1.0"] - }, - "CodeScanName":{ - "type": "string", - "documentation": "

Code analysis scan name

", - "max":128, - "min":1 - }, - "CodeScanStatus":{ - "type":"string", - "enum":[ - "Completed", - "Pending", - "Failed" - ] - }, - "ConflictException":{ - "type":"structure", - "required":["message"], - "members":{ - "message":{"shape":"String"} - }, - "exception":true - }, - "ContentChecksumType":{ - "type":"string", - "enum":["SHA_256"] - }, - "ConversationId":{ - "type":"string", - "max":128, - "min":1 - }, - "CreateCodeScanRequest":{ - "type":"structure", - "required":[ - "artifacts", - "programmingLanguage" - ], - "members":{ - "artifacts":{"shape":"ArtifactMap"}, - "programmingLanguage":{"shape":"ProgrammingLanguage"}, - "clientToken":{ - "shape":"CreateCodeScanRequestClientTokenString", - "idempotencyToken":true - }, - "scope":{"shape": "CodeAnalysisScope"}, - "codeScanName": {"shape": "CodeScanName"} - } - }, - "CreateCodeScanRequestClientTokenString":{ - "type":"string", - "max":256, - "min":1 - }, - "CreateCodeScanResponse":{ - "type":"structure", - "required":[ - "jobId", - "status" - ], - "members":{ - "jobId":{"shape":"CreateCodeScanResponseJobIdString"}, - "status":{"shape":"CodeScanStatus"}, - "errorMessage":{"shape":"String"} - } - }, - "CreateCodeScanResponseJobIdString":{ - "type":"string", - "max":256, - "min":1 - }, - "CreateUploadUrlRequest":{ - "type":"structure", - "required":["contentMd5"], - "members":{ - "contentMd5":{"shape":"CreateUploadUrlRequestContentMd5String"}, - "contentChecksum":{"shape":"CreateUploadUrlRequestContentChecksumString"}, - "artifactType":{"shape":"ArtifactType"}, - "contentChecksumType":{"shape":"ContentChecksumType"}, - "contentLength":{"shape":"CreateUploadUrlRequestContentLengthLong"}, - "uploadIntent":{"shape":"UploadIntent"}, - "uploadContext":{"shape":"UploadContext"} - } - }, - "CreateUploadUrlRequestContentChecksumString":{ - "type":"string", - "max":512, - "min":1, - "sensitive":true - }, - "CreateUploadUrlRequestContentMd5String":{ - "type":"string", - "max":128, - "min":1 - }, - "CreateUploadUrlRequestContentLengthLong":{ - "type":"long", - "box":true, - "min":1 - }, - "CreateUploadUrlResponse":{ - "type":"structure", - "required":[ - "uploadId", - "uploadUrl" - ], - "members":{ - "uploadId":{"shape":"UploadId"}, - "uploadUrl":{"shape":"PreSignedUrl"}, - "kmsKeyArn":{"shape":"ResourceArn"}, - "requestHeaders":{"shape":"RequestHeaders"} - } - }, - "FileContext":{ - "type":"structure", - "required":[ - "leftFileContent", - "rightFileContent", - "filename", - "programmingLanguage" - ], - "members":{ - "leftFileContent":{"shape":"FileContextLeftFileContentString"}, - "rightFileContent":{"shape":"FileContextRightFileContentString"}, - "filename":{"shape":"FileContextFilenameString"}, - "programmingLanguage":{"shape":"ProgrammingLanguage"} - } - }, - "FileContextFilenameString":{ - "type":"string", - "max":1024, - "min":1 - }, - "FileContextLeftFileContentString":{ - "type":"string", - "max":10240, - "min":0, - "sensitive":true - }, - "FileContextRightFileContentString":{ - "type":"string", - "max":10240, - "min":0, - "sensitive":true - }, - "SupplementalContext": { - "type": "structure", - "required": ["filePath", "content"], - "members": { - "filePath": { - "shape": "SupplementalContextFilePathString" - }, - "content": { - "shape": "SupplementalContextContentString" - } - } - }, - "SupplementalContextFilePathString": { - "type": "string", - "max": 1024, - "min": 1, - "sensitive": true - }, - "SupplementalContextContentString": { - "type": "string", - "max": 5120, - "min": 0, - "sensitive": true - }, - "SupplementalContextList": { - "type": "list", - "member": { - "shape": "SupplementalContext" - }, - "max": 10, - "min": 0 - }, - "GenerateRecommendationsRequest":{ - "type":"structure", - "required":["fileContext"], - "members":{ - "fileContext":{"shape":"FileContext"}, - "supplementalContexts": {"shape": "SupplementalContextList"}, - "maxResults":{ - "shape":"GenerateRecommendationsRequestMaxResultsInteger", - "box":true - }, - "referenceTrackerConfiguration":{"shape":"ReferenceTrackerConfiguration"} - } - }, - "GenerateRecommendationsRequestMaxResultsInteger":{ - "type":"integer", - "max":10, - "min":1 - }, - "GenerateRecommendationsResponse":{ - "type":"structure", - "members":{ - "recommendations":{"shape":"RecommendationsList"} - } - }, - "GetAccessTokenRequest":{ - "type":"structure", - "required":["identityToken"], - "members":{ - "identityToken":{"shape":"GetAccessTokenRequestIdentityTokenString"} - } - }, - "GetAccessTokenRequestIdentityTokenString":{ - "type":"string", - "max":1024, - "min":0, - "sensitive":true - }, - "GetAccessTokenResponse":{ - "type":"structure", - "members":{ - "accessToken":{"shape":"SensitiveString"} - } - }, - "GetCodeScanRequest":{ - "type":"structure", - "required":["jobId"], - "members":{ - "jobId":{"shape":"GetCodeScanRequestJobIdString"} - } - }, - "GetCodeScanRequestJobIdString":{ - "type":"string", - "max":256, - "min":1 - }, - "GetCodeScanResponse":{ - "type":"structure", - "required":["status"], - "members":{ - "status":{"shape":"CodeScanStatus"}, - "errorMessage":{"shape":"String"} - } - }, - "InternalServerException":{ - "type":"structure", - "required":["message"], - "members":{ - "message":{"shape":"String"} - }, - "exception":true, - "fault":true, - "retryable":{"throttling":false} - }, - "ListCodeScanFindingsRequest":{ - "type":"structure", - "required":[ - "jobId", - "codeScanFindingsSchema" - ], - "members":{ - "jobId":{"shape":"ListCodeScanFindingsRequestJobIdString"}, - "nextToken":{"shape":"PaginationToken"}, - "codeScanFindingsSchema":{"shape":"CodeScanFindingsSchema"} - } - }, - "ListCodeScanFindingsRequestJobIdString":{ - "type":"string", - "max":256, - "min":1 - }, - "ListCodeScanFindingsResponse":{ - "type":"structure", - "required":["codeScanFindings"], - "members":{ - "nextToken":{"shape":"PaginationToken"}, - "codeScanFindings":{"shape":"String"} - } - }, - "ListRecommendationsRequest":{ - "type":"structure", - "required":["fileContext"], - "members":{ - "fileContext":{"shape":"FileContext"}, - "maxResults":{ - "shape":"ListRecommendationsRequestMaxResultsInteger", - "box":true - }, - "nextToken":{"shape":"ListRecommendationsRequestNextTokenString"}, - "referenceTrackerConfiguration":{"shape":"ReferenceTrackerConfiguration"} - } - }, - "ListRecommendationsRequestMaxResultsInteger":{ - "type":"integer", - "max":10, - "min":1 - }, - "ListRecommendationsRequestNextTokenString":{ - "type":"string", - "max":2048, - "min":0, - "pattern":"(?:[A-Za-z0-9\\+/]{4})*(?:[A-Za-z0-9\\+/]{2}\\=\\=|[A-Za-z0-9\\+/]{3}\\=)?" - }, - "ListRecommendationsResponse":{ - "type":"structure", - "members":{ - "recommendations":{"shape":"RecommendationsList"}, - "nextToken":{"shape":"String"} - } - }, - "PaginationToken":{ - "type":"string", - "max":2048, - "min":1, - "pattern":"\\S+" - }, - "PreSignedUrl":{ - "type":"string", - "max":2048, - "min":1 - }, - "ProgrammingLanguage":{ - "type":"structure", - "required":["languageName"], - "members":{ - "languageName":{"shape":"ProgrammingLanguageLanguageNameString"} - } - }, - "ProgrammingLanguageLanguageNameString":{ - "type":"string", - "max":128, - "min":1, - "pattern":"(python|javascript|java|csharp|typescript)" - }, - "Recommendation":{ - "type":"structure", - "required":["content"], - "members":{ - "content":{"shape":"RecommendationContentString"}, - "references":{"shape":"References"} - } - }, - "RecommendationContentString":{ - "type":"string", - "max":5120, - "min":1, - "sensitive":true - }, - "RecommendationsList":{ - "type":"list", - "member":{"shape":"Recommendation"}, - "max":10, - "min":0 - }, - "RecommendationsWithReferencesPreference":{ - "type":"string", - "enum":[ - "BLOCK", - "ALLOW" - ] - }, - "Reference":{ - "type":"structure", - "members":{ - "licenseName":{"shape":"ReferenceLicenseNameString"}, - "repository":{"shape":"ReferenceRepositoryString"}, - "url":{"shape":"ReferenceUrlString"}, - "recommendationContentSpan":{"shape":"Span"} - } - }, - "ReferenceLicenseNameString":{ - "type":"string", - "max":1024, - "min":1 - }, - "ReferenceRepositoryString":{ - "type":"string", - "max":1024, - "min":1 - }, - "ReferenceTrackerConfiguration":{ - "type":"structure", - "required":["recommendationsWithReferences"], - "members":{ - "recommendationsWithReferences":{"shape":"RecommendationsWithReferencesPreference"} - } - }, - "ReferenceUrlString":{ - "type":"string", - "max":1024, - "min":1 - }, - "References":{ - "type":"list", - "member":{"shape":"Reference"}, - "max":10, - "min":0 - }, - "RequestHeaderKey": { - "type":"string", - "max":64, - "min":1 - }, - "RequestHeaders": { - "type":"map", - "key":{"shape":"RequestHeaderKey"}, - "value":{"shape":"RequestHeaderValue"}, - "max":16, - "min":1 - }, - "RequestHeaderValue": { - "type": "string", - "max": 256, - "min": 1 - }, - "ResourceArn":{ - "type":"string", - "max":1224, - "min":0 - }, - "ResourceNotFoundException":{ - "type":"structure", - "required":["message"], - "members":{ - "message":{"shape":"String"} - }, - "exception":true - }, - "SensitiveString":{ - "type":"string", - "sensitive":true - }, - "Span":{ - "type":"structure", - "members":{ - "start":{ - "shape":"SpanStartInteger", - "box":true - }, - "end":{ - "shape":"SpanEndInteger", - "box":true - } - } - }, - "SpanEndInteger":{ - "type":"integer", - "min":0 - }, - "SpanStartInteger":{ - "type":"integer", - "min":0 - }, - "String":{"type":"string"}, - "ThrottlingException":{ - "type":"structure", - "required":["message"], - "members":{ - "message":{"shape":"String"} - }, - "exception":true, - "retryable":{"throttling":false} - }, - "TaskAssistPlanningUploadContext": { - "type": "structure", - "required": ["conversationId"], - "members": { - "conversationId": { "shape": "ConversationId" } - } - }, - "TransformationUploadArtifactType": { - "type": "string", - "enum": ["Dependencies"] - }, - "TransformationJobId":{ - "type":"string", - "max":128, - "min":1 - }, - "TransformationUploadContext": { - "type": "structure", - "required": ["jobId", "uploadArtifactType"], - "members": { - "jobId": { "shape": "TransformationJobId" }, - "uploadArtifactType": { "shape": "TransformationUploadArtifactType" } - } - }, - "UploadContext":{ - "type":"structure", - "members":{ - "taskAssistPlanningUploadContext": {"shape": "TaskAssistPlanningUploadContext"}, - "transformationUploadContext": {"shape": "TransformationUploadContext"}, - "codeAnalysisUploadContext": {"shape": "CodeAnalysisUploadContext"} - }, - "union":true - }, - "UploadId":{ - "type":"string", - "max":128, - "min":1 - }, - "UploadIntent":{ - "type":"string", - "enum":[ - "TRANSFORMATION", - "TASK_ASSIST_PLANNING", - "AUTOMATIC_FILE_SECURITY_SCAN", - "FULL_PROJECT_SECURITY_SCAN" - ] - }, - "ValidationException":{ - "type":"structure", - "required":["message"], - "members":{ - "message":{"shape":"String"} - }, - "exception":true - } - } -}