Skip to content

Commit 004734a

Browse files
dhasani23David Hasani
authored andcommitted
feat(amazonq): enable client-side build (aws#7226)
## Problem Instead of running `mvn dependency:copy-dependencies` and `mvn clean install`, we have a JAR that we can execute which will gather all of the project dependencies as well as some important metadata stored in a `compilations.json` file which our service will use to improve the quality of transformations. ## Solution Remove Maven shell commands; add custom JAR execution. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: David Hasani <davhasan@amazon.com>
1 parent 2818dc0 commit 004734a

File tree

17 files changed

+210
-327
lines changed

17 files changed

+210
-327
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Feature",
3+
"description": "/transform: run all builds client-side"
4+
}

packages/amazonq/test/e2e/amazonq/transformByQ.test.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,6 @@ describe('Amazon Q Code Transformation', function () {
129129
waitIntervalInMs: 1000,
130130
})
131131

132-
// TO-DO: add this back when releasing CSB
133-
/*
134132
const customDependencyVersionPrompt = tab.getChatItems().pop()
135133
assert.strictEqual(
136134
customDependencyVersionPrompt?.body?.includes('You can optionally upload a YAML file'),
@@ -139,19 +137,18 @@ describe('Amazon Q Code Transformation', function () {
139137
tab.clickCustomFormButton({ id: 'gumbyTransformFormContinue' })
140138

141139
// 2 additional chat messages get sent after Continue button clicked; wait for both of them
142-
await tab.waitForEvent(() => tab.getChatItems().length > 13, {
140+
await tab.waitForEvent(() => tab.getChatItems().length > 10, {
143141
waitTimeoutInMs: 5000,
144142
waitIntervalInMs: 1000,
145143
})
146-
*/
147144

148145
const sourceJdkPathPrompt = tab.getChatItems().pop()
149146
assert.strictEqual(sourceJdkPathPrompt?.body?.includes('Enter the path to JDK 8'), true)
150147

151148
tab.addChatMessage({ prompt: '/dummy/path/to/jdk8' })
152149

153150
// 2 additional chat messages get sent after JDK path submitted; wait for both of them
154-
await tab.waitForEvent(() => tab.getChatItems().length > 10, {
151+
await tab.waitForEvent(() => tab.getChatItems().length > 12, {
155152
waitTimeoutInMs: 5000,
156153
waitIntervalInMs: 1000,
157154
})
@@ -173,7 +170,7 @@ describe('Amazon Q Code Transformation', function () {
173170
text: 'View summary',
174171
})
175172

176-
await tab.waitForEvent(() => tab.getChatItems().length > 11, {
173+
await tab.waitForEvent(() => tab.getChatItems().length > 13, {
177174
waitTimeoutInMs: 5000,
178175
waitIntervalInMs: 1000,
179176
})
Binary file not shown.

packages/core/src/amazonqGumby/chat/controller/controller.ts

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,9 @@ import {
4141
} from '../../errors'
4242
import * as CodeWhispererConstants from '../../../codewhisperer/models/constants'
4343
import MessengerUtils, { ButtonActions, GumbyCommands } from './messenger/messengerUtils'
44-
import { CancelActionPositions, JDKToTelemetryValue, telemetryUndefined } from '../../telemetry/codeTransformTelemetry'
44+
import { CancelActionPositions } from '../../telemetry/codeTransformTelemetry'
4545
import { openUrl } from '../../../shared/utilities/vsCodeUtils'
46-
import {
47-
telemetry,
48-
CodeTransformJavaTargetVersionsAllowed,
49-
CodeTransformJavaSourceVersionsAllowed,
50-
} from '../../../shared/telemetry/telemetry'
46+
import { telemetry } from '../../../shared/telemetry/telemetry'
5147
import { CodeTransformTelemetryState } from '../../telemetry/codeTransformTelemetryState'
5248
import DependencyVersions from '../../models/dependencies'
5349
import { getStringHash } from '../../../shared/utilities/textUtilities'
@@ -308,7 +304,6 @@ export class GumbyController {
308304
}
309305

310306
private async validateLanguageUpgradeProjects(message: any) {
311-
let telemetryJavaVersion = JDKToTelemetryValue(JDKVersion.UNSUPPORTED) as CodeTransformJavaSourceVersionsAllowed
312307
try {
313308
const validProjects = await telemetry.codeTransform_validateProject.run(async () => {
314309
telemetry.record({
@@ -317,12 +312,6 @@ export class GumbyController {
317312
})
318313

319314
const validProjects = await getValidLanguageUpgradeCandidateProjects()
320-
if (validProjects.length > 0) {
321-
// validProjects[0].JDKVersion will be undefined if javap errors out or no .class files found, so call it UNSUPPORTED
322-
const javaVersion = validProjects[0].JDKVersion ?? JDKVersion.UNSUPPORTED
323-
telemetryJavaVersion = JDKToTelemetryValue(javaVersion) as CodeTransformJavaSourceVersionsAllowed
324-
}
325-
telemetry.record({ codeTransformLocalJavaVersion: telemetryJavaVersion })
326315
return validProjects
327316
})
328317
return validProjects
@@ -384,7 +373,7 @@ export class GumbyController {
384373
break
385374
case ButtonActions.CONTINUE_TRANSFORMATION_FORM:
386375
this.messenger.sendMessage(
387-
CodeWhispererConstants.continueWithoutYamlMessage,
376+
CodeWhispererConstants.continueWithoutConfigFileMessage,
388377
message.tabID,
389378
'ai-prompt'
390379
)
@@ -437,9 +426,7 @@ export class GumbyController {
437426
userChoice: skipTestsSelection,
438427
})
439428
this.messenger.sendSkipTestsSelectionMessage(skipTestsSelection, message.tabID)
440-
this.promptJavaHome('source', message.tabID)
441-
// TO-DO: delete line above and uncomment line below when releasing CSB
442-
// await this.messenger.sendCustomDependencyVersionMessage(message.tabID)
429+
await this.messenger.sendCustomDependencyVersionMessage(message.tabID)
443430
})
444431
}
445432

@@ -465,16 +452,9 @@ export class GumbyController {
465452
const fromJDKVersion: JDKVersion = message.formSelectedValues['GumbyTransformJdkFromForm']
466453

467454
telemetry.record({
468-
// TODO: remove JavaSource/TargetVersionsAllowed when BI is updated to use source/target
469-
codeTransformJavaSourceVersionsAllowed: JDKToTelemetryValue(
470-
fromJDKVersion
471-
) as CodeTransformJavaSourceVersionsAllowed,
472-
codeTransformJavaTargetVersionsAllowed: JDKToTelemetryValue(
473-
toJDKVersion
474-
) as CodeTransformJavaTargetVersionsAllowed,
475455
source: fromJDKVersion,
476456
target: toJDKVersion,
477-
codeTransformProjectId: pathToProject === undefined ? telemetryUndefined : getStringHash(pathToProject),
457+
codeTransformProjectId: pathToProject === undefined ? undefined : getStringHash(pathToProject),
478458
userChoice: 'Confirm-Java',
479459
})
480460

@@ -503,7 +483,7 @@ export class GumbyController {
503483
const schema: string = message.formSelectedValues['GumbyTransformSQLSchemaForm']
504484

505485
telemetry.record({
506-
codeTransformProjectId: pathToProject === undefined ? telemetryUndefined : getStringHash(pathToProject),
486+
codeTransformProjectId: pathToProject === undefined ? undefined : getStringHash(pathToProject),
507487
source: transformByQState.getSourceDB(),
508488
target: transformByQState.getTargetDB(),
509489
userChoice: 'Confirm-SQL',
@@ -563,7 +543,7 @@ export class GumbyController {
563543
canSelectMany: false,
564544
openLabel: 'Select',
565545
filters: {
566-
'YAML file': ['yaml'], // restrict user to only pick a .yaml file
546+
File: ['yaml', 'yml'], // restrict user to only pick a .yaml file
567547
},
568548
})
569549
if (!fileUri || fileUri.length === 0) {
@@ -576,7 +556,7 @@ export class GumbyController {
576556
this.messenger.sendUnrecoverableErrorResponse('invalid-custom-versions-file', message.tabID)
577557
return
578558
}
579-
this.messenger.sendMessage('Received custom dependency version YAML file.', message.tabID, 'ai-prompt')
559+
this.messenger.sendMessage(CodeWhispererConstants.receivedValidConfigFileMessage, message.tabID, 'ai-prompt')
580560
transformByQState.setCustomDependencyVersionFilePath(fileUri[0].fsPath)
581561
this.promptJavaHome('source', message.tabID)
582562
}
@@ -660,17 +640,13 @@ export class GumbyController {
660640
const pathToJavaHome = extractPath(data.message)
661641
if (pathToJavaHome) {
662642
transformByQState.setSourceJavaHome(pathToJavaHome)
663-
// TO-DO: delete line below and uncomment the block below when releasing CSB
664-
await this.prepareLanguageUpgradeProject(data.tabID)
665643
// if source and target JDK versions are the same, just re-use the source JAVA_HOME and start the build
666-
/*
667644
if (transformByQState.getTargetJDKVersion() === transformByQState.getSourceJDKVersion()) {
668645
transformByQState.setTargetJavaHome(pathToJavaHome)
669646
await this.prepareLanguageUpgradeProject(data.tabID)
670647
} else {
671648
this.promptJavaHome('target', data.tabID)
672649
}
673-
*/
674650
} else {
675651
this.messenger.sendUnrecoverableErrorResponse('invalid-java-home', data.tabID)
676652
}

packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ export class Messenger {
410410
message = CodeWhispererConstants.noPomXmlFoundChatMessage
411411
break
412412
case 'could-not-compile-project':
413-
message = CodeWhispererConstants.cleanInstallErrorChatMessage
413+
message = CodeWhispererConstants.cleanTestCompileErrorChatMessage
414414
break
415415
case 'invalid-java-home':
416416
message = CodeWhispererConstants.noJavaHomeFoundChatMessage
@@ -704,7 +704,7 @@ ${codeSnippet}
704704
}
705705

706706
public async sendCustomDependencyVersionMessage(tabID: string) {
707-
const message = CodeWhispererConstants.chooseYamlMessage
707+
const message = CodeWhispererConstants.chooseConfigFileMessage
708708
const buttons: ChatItemButton[] = []
709709

710710
buttons.push({
@@ -731,7 +731,7 @@ ${codeSnippet}
731731
tabID
732732
)
733733
)
734-
const sampleYAML = `name: "custom-dependency-management"
734+
const sampleYAML = `name: "dependency-upgrade"
735735
description: "Custom dependency version management for Java migration from JDK 8/11/17 to JDK 17/21"
736736
737737
dependencyManagement:
@@ -744,7 +744,7 @@ dependencyManagement:
744744
targetVersion: "3.0.0"
745745
originType: "THIRD_PARTY"
746746
plugins:
747-
- identifier: "com.example.plugin"
747+
- identifier: "com.example:plugin"
748748
targetVersion: "1.2.0"
749749
versionProperty: "plugin.version" # Optional`
750750

packages/core/src/amazonqGumby/errors.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,6 @@ export class NoMavenJavaProjectsFoundError extends ToolkitError {
3030
}
3131
}
3232

33-
export class ZipExceedsSizeLimitError extends ToolkitError {
34-
constructor() {
35-
super('Zip file exceeds size limit', { code: 'ZipFileExceedsSizeLimit' })
36-
}
37-
}
38-
3933
export class AlternateDependencyVersionsNotFoundError extends Error {
4034
constructor() {
4135
super('No available versions for dependency update')

packages/core/src/codewhisperer/client/codewhisperer.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ export class DefaultCodeWhispererClient {
262262
/**
263263
* @description Use this function to get the status of the code transformation. We should
264264
* be polling this function periodically to get updated results. When this function
265-
* returns COMPLETED we know the transformation is done.
265+
* returns PARTIALLY_COMPLETED or COMPLETED we know the transformation is done.
266266
*/
267267
public async codeModernizerGetCodeTransformation(
268268
request: CodeWhispererUserClient.GetTransformationRequest
@@ -272,15 +272,15 @@ export class DefaultCodeWhispererClient {
272272
}
273273

274274
/**
275-
* @description After the job has been PAUSED we need to get user intervention. Once that user
276-
* intervention has been handled we can resume the transformation job.
275+
* @description During client-side build, or after the job has been PAUSED we need to get user intervention.
276+
* Once that user action has been handled we can resume the transformation job.
277277
* @params transformationJobId - String id returned from StartCodeTransformationResponse
278278
* @params userActionStatus - String to determine what action the user took, if any.
279279
*/
280280
public async codeModernizerResumeTransformation(
281281
request: CodeWhispererUserClient.ResumeTransformationRequest
282282
): Promise<PromiseResult<CodeWhispererUserClient.ResumeTransformationResponse, AWSError>> {
283-
return (await this.createUserSdkClient()).resumeTransformation(request).promise()
283+
return (await this.createUserSdkClient(8)).resumeTransformation(request).promise()
284284
}
285285

286286
/**

0 commit comments

Comments
 (0)