Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

deprecate(Q): remove sigv4 sdk #5332

Open
wants to merge 15 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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")
Expand All @@ -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()
Expand All @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 " +
Expand All @@ -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()
Expand All @@ -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 " +
Expand All @@ -205,12 +205,12 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
)

val documents = mutableListOf<String>()
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())
}
}

Expand All @@ -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) {
Expand All @@ -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()
Expand All @@ -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)
Expand All @@ -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()
)
Expand All @@ -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()
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -51,23 +49,18 @@ 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
import software.aws.toolkits.jetbrains.services.codewhisperer.service.RequestContextNew
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 {
Expand All @@ -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

Expand Down Expand Up @@ -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()
}
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -851,9 +810,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW
}

override fun dispose() {
if (this::mySigv4Client.isLazyInitialized) {
mySigv4Client.close()
}
myBearerClient?.close()
}

Expand All @@ -880,11 +836,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW

companion object {
private val LOG = getLogger<CodeWhispererClientAdaptorImpl>()
private fun createUnmanagedSigv4Client(): CodeWhispererClient = AwsClientManager.getInstance().createUnmanagedClient(
AnonymousCredentialsProvider.create(),
CodeWhispererConstants.Config.Sigv4ClientRegion,
CodeWhispererConstants.Config.CODEWHISPERER_ENDPOINT
)
}
}

Expand Down
Loading
Loading