Skip to content

Commit f10ee74

Browse files
authored
fix(amazonq): validate yaml file for required keys (#5951)
1 parent ac877d7 commit f10ee74

File tree

6 files changed

+42
-16
lines changed

6 files changed

+42
-16
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "/transform: validate YAML dependency file for required fields"
4+
}

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,9 +419,9 @@ fun buildSQLMetadataValidationErrorChatContent(errorReason: String) = CodeTransf
419419
message = errorReason,
420420
)
421421

422-
fun buildCustomDependencyVersionsFileInvalidChatContent() = CodeTransformChatMessageContent(
422+
fun buildCustomDependencyVersionsFileInvalidChatContent(missingKey: String) = CodeTransformChatMessageContent(
423423
type = CodeTransformChatMessageType.FinalizedAnswer,
424-
message = message("codemodernizer.chat.message.custom_dependency_upgrades_invalid"),
424+
message = message("codemodernizer.chat.message.custom_dependency_upgrades_invalid", missingKey),
425425
)
426426

427427
fun buildUserCancelledChatContent() = CodeTransformChatMessageContent(

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -432,9 +432,9 @@ class CodeTransformChatController(
432432
val descriptor = FileChooserDescriptorFactory.createSingleFileDescriptor()
433433
.withDescription("Select .yaml file")
434434
val selectedFile = FileChooser.chooseFile(descriptor, null, null) ?: return@withContext
435-
val isValid = validateCustomVersionsFile(selectedFile)
436-
if (!isValid) {
437-
codeTransformChatHelper.updateLastPendingMessage(buildCustomDependencyVersionsFileInvalidChatContent())
435+
val missingKey = validateCustomVersionsFile(selectedFile)
436+
if (missingKey != null) {
437+
codeTransformChatHelper.updateLastPendingMessage(buildCustomDependencyVersionsFileInvalidChatContent(missingKey))
438438
codeTransformChatHelper.addNewMessage(buildStartNewTransformFollowup())
439439
return@withContext
440440
}

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformFileUtils.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -196,21 +196,22 @@ fun parseXmlDependenciesReport(pathToXmlDependency: Path): DependencyUpdatesRepo
196196
return report
197197
}
198198

199-
fun validateCustomVersionsFile(file: VirtualFile): Boolean {
199+
// return the first missing key in the custom versions file, or null if all required keys are present
200+
fun validateCustomVersionsFile(file: VirtualFile): String? {
200201
val validFileEndings = listOf("yaml", "yml")
201202
if (!validFileEndings.any { file.name.lowercase().endsWith(it) }) {
202203
getLogger<CodeTransformChatController>().error { "Custom versions file is not a YAML file: ${file.name}" }
203-
return false
204+
return message("codemodernizer.chat.message.custom_dependency_upgrades_invalid_not_yaml")
204205
}
205206
val fileContents = file.readText()
206-
val requiredKeys = listOf("dependencyManagement:", "identifier:", "targetVersion:")
207+
val requiredKeys = listOf("dependencyManagement", "identifier", "targetVersion", "originType")
207208
for (key in requiredKeys) {
208209
if (!fileContents.contains(key)) {
209210
getLogger<CodeTransformChatController>().error { "Missing yaml key: $key" }
210-
return false
211+
return key
211212
}
212213
}
213-
return true
214+
return null
214215
}
215216

216217
fun validateSctMetadata(sctFile: File?): SqlMetadataValidationResult {

plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -411,8 +411,8 @@ dependencyManagement:
411411
""".trimIndent()
412412

413413
val virtualFile = LightVirtualFile("test-valid.yaml", YAMLFileType.YML, sampleFileContents)
414-
val isValidFile = validateCustomVersionsFile(virtualFile)
415-
assertThat(isValidFile).isTrue()
414+
val missingKey = validateCustomVersionsFile(virtualFile)
415+
assertThat(missingKey).isNull()
416416
}
417417

418418
@Test
@@ -432,8 +432,8 @@ invalidKey:
432432
""".trimIndent()
433433

434434
val virtualFile = LightVirtualFile("test-invalid.yaml", YAMLFileType.YML, sampleFileContents)
435-
val isValidFile = validateCustomVersionsFile(virtualFile)
436-
assertThat(isValidFile).isFalse()
435+
val missingKey = validateCustomVersionsFile(virtualFile)
436+
assertThat(missingKey).isEqualTo("dependencyManagement")
437437
}
438438

439439
@Test
@@ -454,7 +454,27 @@ dependencyManagement:
454454

455455
val virtualFile = LightVirtualFile("test-invalid-file-type.txt", sampleFileContents)
456456
val isValidFile = validateCustomVersionsFile(virtualFile)
457-
assertThat(isValidFile).isFalse()
457+
assertThat(isValidFile).isEqualTo(message("codemodernizer.chat.message.custom_dependency_upgrades_invalid_not_yaml"))
458+
}
459+
460+
@Test
461+
fun `WHEN validateCustomVersionsFile on yaml file missing originType THEN fails validation`() {
462+
val sampleFileContents = """name: "dependency-upgrade"
463+
description: "Custom dependency version management for Java migration from JDK 8/11/17 to JDK 17/21"
464+
dependencyManagement:
465+
dependencies:
466+
- identifier: "com.example:library1"
467+
targetVersion: "2.1.0"
468+
versionProperty: "library1.version"
469+
plugins:
470+
- identifier: "com.example:plugin"
471+
targetVersion: "1.2.0"
472+
versionProperty: "plugin.version"
473+
""".trimIndent()
474+
475+
val virtualFile = LightVirtualFile("sample.yaml", sampleFileContents)
476+
val missingKey = validateCustomVersionsFile(virtualFile)
477+
assertThat(missingKey).isEqualTo("originType")
458478
}
459479

460480
@Test

plugins/core/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,8 @@ codemodernizer.chat.message.changes_applied=I applied the changes to your projec
647647
codemodernizer.chat.message.choose_objective=I can help you with the following tasks:\n- Upgrade your Java 8, Java 11, and Java 17 codebases to Java 17 or Java 21.\n- Upgrade Java 17 or Java 21 code with up-to-date libraries and other dependencies.\n- Convert embedded SQL code for Oracle to PostgreSQL database migrations in AWS DMS.\n\nWhat would you like to do? You can enter "language upgrade" or "sql conversion".
648648
codemodernizer.chat.message.choose_objective_placeholder=Enter "language upgrade" or "sql conversion"
649649
codemodernizer.chat.message.custom_dependency_upgrades_continue=Ok, I will continue the transformation without additional dependency upgrade information.
650-
codemodernizer.chat.message.custom_dependency_upgrades_invalid=I wasn't able to parse the dependency upgrade file. Check that it's configured properly and try again. For an example of the required dependency upgrade file format, see the [documentation](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/code-transformation.html#dependency-upgrade-file).
650+
codemodernizer.chat.message.custom_dependency_upgrades_invalid=The dependency upgrade file provided is missing required field `{0}`. Check that it is configured properly and try again. For an example of the required dependency upgrade file format, see the [documentation](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/code-transformation.html#dependency-upgrade-file).
651+
codemodernizer.chat.message.custom_dependency_upgrades_invalid_not_yaml=Provided file is not a YAML/YML file
651652
codemodernizer.chat.message.custom_dependency_upgrades_prompt_jdk_upgrade=Would you like to provide a dependency upgrade file? You can specify first party dependencies and their versions in a YAML file, and I will upgrade them during the JDK upgrade transformation. For an example dependency upgrade file, see the [documentation](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/code-transformation.html#dependency-upgrade-file).
652653
codemodernizer.chat.message.custom_dependency_upgrades_prompt_library_upgrade=Would you like to provide a dependency upgrade file? You can specify third party dependencies and their versions in a YAML file, and I will only upgrade these dependencies during the library upgrade transformation. For an example dependency upgrade file, see the [documentation](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/code-transformation.html#dependency-upgrade-file).
653654
codemodernizer.chat.message.custom_dependency_upgrades_valid=The dependency upgrade file looks good. I will use this information to upgrade the dependencies you specified.

0 commit comments

Comments
 (0)