Skip to content

Commit 2536f83

Browse files
feat(amazonq): implement aws/credentials/getConnectionMetadata for lsp (#5472)
* implement getConnectionMetadata * tests * in case of failure, default as builderID start URL
1 parent 9f76c93 commit 2536f83

File tree

4 files changed

+64
-8
lines changed

4 files changed

+64
-8
lines changed

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@
44
package software.aws.toolkits.jetbrains.services.amazonq.lsp
55

66
import com.intellij.notification.NotificationType
7+
import com.intellij.openapi.project.Project
78
import org.eclipse.lsp4j.ConfigurationParams
89
import org.eclipse.lsp4j.MessageActionItem
910
import org.eclipse.lsp4j.MessageParams
1011
import org.eclipse.lsp4j.MessageType
1112
import org.eclipse.lsp4j.PublishDiagnosticsParams
1213
import org.eclipse.lsp4j.ShowMessageRequestParams
14+
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
15+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
16+
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
1317
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata
1418
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.SsoProfileData
1519
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
@@ -18,7 +22,7 @@ import java.util.concurrent.CompletableFuture
1822
/**
1923
* Concrete implementation of [AmazonQLanguageClient] to handle messages sent from server
2024
*/
21-
class AmazonQLanguageClientImpl : AmazonQLanguageClient {
25+
class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageClient {
2226
override fun telemetryEvent(`object`: Any) {
2327
println(`object`)
2428
}
@@ -46,11 +50,25 @@ class AmazonQLanguageClientImpl : AmazonQLanguageClient {
4650
showMessage(message)
4751
}
4852

49-
override fun getConnectionMetadata() = CompletableFuture.completedFuture(
50-
ConnectionMetadata(
51-
SsoProfileData("TODO")
52-
)
53-
)
53+
override fun getConnectionMetadata(): CompletableFuture<ConnectionMetadata> =
54+
CompletableFuture.supplyAsync {
55+
val connection = ToolkitConnectionManager.getInstance(project)
56+
.activeConnectionForFeature(QConnection.getInstance())
57+
58+
when (connection) {
59+
is AwsBearerTokenConnection -> {
60+
ConnectionMetadata(
61+
SsoProfileData(connection.startUrl)
62+
)
63+
}
64+
else -> {
65+
// If no connection or not a bearer token connection return default builderID start url
66+
ConnectionMetadata(
67+
SsoProfileData(AmazonQLspConstants.AWS_BUILDER_ID_URL)
68+
)
69+
}
70+
}
71+
}
5472

5573
override fun configuration(params: ConfigurationParams): CompletableFuture<List<Any>> {
5674
if (params.items.isEmpty()) {

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspConstants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp
66
object AmazonQLspConstants {
77
const val LSP_CW_CONFIGURATION_KEY = "aws.codeWhisperer"
88
const val LSP_CW_OPT_OUT_KEY = "shareCodeWhispererContentWithAWS"
9+
const val AWS_BUILDER_ID_URL = "https://view.awsapps.com/start"
910
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ private class AmazonQServerInstance(private val project: Project, private val cs
264264
launcherHandler.startNotify()
265265

266266
launcher = LSPLauncher.Builder<AmazonQLanguageServer>()
267-
.setLocalService(AmazonQLanguageClientImpl())
267+
.setLocalService(AmazonQLanguageClientImpl(project))
268268
.setRemoteInterface(AmazonQLanguageServer::class.java)
269269
.configureGson {
270270
// TODO: maybe need adapter for initialize:

plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImplTest.kt

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,54 @@
55
package software.aws.toolkits.jetbrains.services.amazonq.lsp
66

77
import com.google.gson.Gson
8+
import com.intellij.openapi.components.service
9+
import com.intellij.openapi.project.Project
810
import com.intellij.testFramework.ApplicationExtension
11+
import io.mockk.every
12+
import io.mockk.mockk
913
import org.assertj.core.api.Assertions.assertThat
1014
import org.eclipse.lsp4j.ConfigurationItem
1115
import org.eclipse.lsp4j.ConfigurationParams
1216
import org.junit.jupiter.api.Test
1317
import org.junit.jupiter.api.extension.ExtendWith
18+
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
19+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
20+
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
21+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata
22+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.SsoProfileData
1423
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
1524

1625
@ExtendWith(ApplicationExtension::class)
1726
class AmazonQLanguageClientImplTest {
18-
private val sut = AmazonQLanguageClientImpl()
27+
private val project: Project = mockk(relaxed = true)
28+
private val sut = AmazonQLanguageClientImpl(project)
29+
30+
@Test
31+
fun `getConnectionMetadata returns connection metadata with start URL for bearer token connection`() {
32+
val mockConnectionManager = mockk<ToolkitConnectionManager>()
33+
every { project.service<ToolkitConnectionManager>() } returns mockConnectionManager
34+
35+
val expectedStartUrl = "https://test.aws.com"
36+
val mockConnection = mockk<AwsBearerTokenConnection> {
37+
every { startUrl } returns expectedStartUrl
38+
}
39+
40+
every { mockConnectionManager.activeConnectionForFeature(QConnection.getInstance()) } returns mockConnection
41+
42+
assertThat(sut.getConnectionMetadata().get())
43+
.isEqualTo(ConnectionMetadata(SsoProfileData(expectedStartUrl)))
44+
}
45+
46+
@Test
47+
fun `getConnectionMetadata returns empty start URL when no active connection`() {
48+
val mockConnectionManager = mockk<ToolkitConnectionManager>()
49+
every { project.service<ToolkitConnectionManager>() } returns mockConnectionManager
50+
51+
every { mockConnectionManager.activeConnectionForFeature(QConnection.getInstance()) } returns null
52+
53+
assertThat(sut.getConnectionMetadata().get())
54+
.isEqualTo(ConnectionMetadata(SsoProfileData(AmazonQLspConstants.AWS_BUILDER_ID_URL)))
55+
}
1956

2057
@Test
2158
fun `configuration null if no attributes requested`() {

0 commit comments

Comments
 (0)