From 376f2e99414bf31f2348c8f02284451f58275ffc Mon Sep 17 00:00:00 2001 From: Macdonald Date: Thu, 1 May 2025 11:02:01 -0400 Subject: [PATCH 01/19] add IoT Fleetwise Kotlin scenario --- kotlin/services/fleetwise/.gitignore | 42 ++ kotlin/services/fleetwise/build.gradle.kts | 55 ++ kotlin/services/fleetwise/settings.gradle.kts | 2 + .../fleetwise/scenario/FleetwiseScenario.kt | 709 ++++++++++++++++++ 4 files changed, 808 insertions(+) create mode 100644 kotlin/services/fleetwise/.gitignore create mode 100644 kotlin/services/fleetwise/build.gradle.kts create mode 100644 kotlin/services/fleetwise/settings.gradle.kts create mode 100644 kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt diff --git a/kotlin/services/fleetwise/.gitignore b/kotlin/services/fleetwise/.gitignore new file mode 100644 index 00000000000..b63da4551b2 --- /dev/null +++ b/kotlin/services/fleetwise/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/kotlin/services/fleetwise/build.gradle.kts b/kotlin/services/fleetwise/build.gradle.kts new file mode 100644 index 00000000000..7cf58043db5 --- /dev/null +++ b/kotlin/services/fleetwise/build.gradle.kts @@ -0,0 +1,55 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") version "1.9.0" + application +} + +group = "me.scmacdon" +version = "1.0-SNAPSHOT" + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +buildscript { + repositories { + maven("https://plugins.gradle.org/m2/") + } + dependencies { + classpath("org.jlleitschuh.gradle:ktlint-gradle:10.3.0") + } +} + +repositories { + mavenCentral() +} +apply(plugin = "org.jlleitschuh.gradle.ktlint") +dependencies { + implementation(platform("aws.sdk.kotlin:bom:1.3.112")) + implementation("aws.sdk.kotlin:iot") + implementation("aws.sdk.kotlin:iotfleetwise") + implementation("aws.sdk.kotlin:secretsmanager") + implementation("aws.smithy.kotlin:http-client-engine-okhttp") + implementation("aws.smithy.kotlin:http-client-engine-crt") + implementation("com.google.code.gson:gson:2.10") + testImplementation("org.junit.jupiter:junit-jupiter:5.9.2") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") + implementation("org.slf4j:slf4j-api:2.0.15") + implementation("org.slf4j:slf4j-simple:2.0.15") +} +tasks.withType { + kotlinOptions.jvmTarget = "17" +} + +tasks.test { + useJUnitPlatform() + testLogging { + events("passed", "skipped", "failed") + } + + // Define the test source set + testClassesDirs += files("build/classes/kotlin/test") + classpath += files("build/classes/kotlin/main", "build/resources/main") +} diff --git a/kotlin/services/fleetwise/settings.gradle.kts b/kotlin/services/fleetwise/settings.gradle.kts new file mode 100644 index 00000000000..95b19f62d88 --- /dev/null +++ b/kotlin/services/fleetwise/settings.gradle.kts @@ -0,0 +1,2 @@ +rootProject.name = "flkeetwise" + diff --git a/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt b/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt new file mode 100644 index 00000000000..9e4b08990c2 --- /dev/null +++ b/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt @@ -0,0 +1,709 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.fleetwise.scenario + +import aws.sdk.kotlin.services.iot.IotClient +import aws.sdk.kotlin.services.iot.model.CreateThingRequest +import aws.sdk.kotlin.services.iotfleetwise.IotFleetWiseClient +import aws.sdk.kotlin.services.iotfleetwise.model.Branch +import aws.sdk.kotlin.services.iotfleetwise.model.CanInterface +import aws.sdk.kotlin.services.iotfleetwise.model.CanSignal +import aws.sdk.kotlin.services.iotfleetwise.model.CreateDecoderManifestRequest +import aws.sdk.kotlin.services.iotfleetwise.model.CreateFleetRequest +import aws.sdk.kotlin.services.iotfleetwise.model.CreateModelManifestRequest +import aws.sdk.kotlin.services.iotfleetwise.model.CreateSignalCatalogRequest +import aws.sdk.kotlin.services.iotfleetwise.model.CreateVehicleRequest +import aws.sdk.kotlin.services.iotfleetwise.model.DeleteDecoderManifestRequest +import aws.sdk.kotlin.services.iotfleetwise.model.DeleteFleetRequest +import aws.sdk.kotlin.services.iotfleetwise.model.DeleteModelManifestRequest +import aws.sdk.kotlin.services.iotfleetwise.model.DeleteSignalCatalogRequest +import aws.sdk.kotlin.services.iotfleetwise.model.DeleteVehicleRequest +import aws.sdk.kotlin.services.iotfleetwise.model.GetDecoderManifestRequest +import aws.sdk.kotlin.services.iotfleetwise.model.GetModelManifestRequest +import aws.sdk.kotlin.services.iotfleetwise.model.GetVehicleRequest +import aws.sdk.kotlin.services.iotfleetwise.model.ListSignalCatalogNodesRequest +import aws.sdk.kotlin.services.iotfleetwise.model.ManifestStatus +import aws.sdk.kotlin.services.iotfleetwise.model.NetworkInterface +import aws.sdk.kotlin.services.iotfleetwise.model.NetworkInterfaceType +import aws.sdk.kotlin.services.iotfleetwise.model.Node +import aws.sdk.kotlin.services.iotfleetwise.model.NodeDataType +import aws.sdk.kotlin.services.iotfleetwise.model.Sensor +import aws.sdk.kotlin.services.iotfleetwise.model.SignalDecoder +import aws.sdk.kotlin.services.iotfleetwise.model.SignalDecoderType +import aws.sdk.kotlin.services.iotfleetwise.model.UpdateDecoderManifestRequest +import aws.sdk.kotlin.services.iotfleetwise.model.UpdateModelManifestRequest +import kotlinx.coroutines.delay +import java.util.Scanner + +var scanner = Scanner(System.`in`) +val DASHES = String(CharArray(80)).replace("\u0000", "-") +suspend fun main(args: Array) { + val usage = + """ + Usage: + + + Where: + signalCatalogName - The name of the Signal Catalog to create (eg, catalog30). + manifestName - The name of the Vehicle Model (Model Manifest) to create (eg, manifest30). + fleetId - The ID of the Fleet to create (eg, fleet30). + vecName - The name of the Vehicle to create (eg, vehicle30). + decName - The name of the Decoder Manifest to create (eg, decManifest30). + + """.trimIndent() + + // if (args.size != 5) { + // println(usage) + // return + // } + + val signalCatalogName = "catalog309"//args[0] + val manifestName = "manifest309" //args[1] + val fleetId = "fleet309" //args[2] + val vecName = "vehicle309" //args[3] + val decName = "decManifest309" //args[4] + + println( + """ + AWS IoT FleetWise is a managed service that simplifies the + process of collecting, organizing, and transmitting vehicle + data to the cloud in near real-time. Designed for automakers + and fleet operators, it allows you to define vehicle models, + specify the exact data you want to collect (such as engine + temperature, speed, or battery status), and send this data to + AWS for analysis. By using intelligent data collection + techniques, IoT FleetWise reduces the volume of data + transmitted by filtering and transforming it at the edge, + helping to minimize bandwidth usage and costs. + + At its core, AWS IoT FleetWise helps organizations build + scalable systems for vehicle data management and analytics, + supporting a wide variety of vehicles and sensor configurations. + You can define signal catalogs and decoder manifests that describe + how raw CAN bus signals are translated into readable data, making + the platform highly flexible and extensible. This allows + manufacturers to optimize vehicle performance, improve safety, + and reduce maintenance costs by gaining real-time visibility + into fleet operations. + + """.trimIndent(), + ) + waitForInputToContinue(scanner) + println(DASHES) + runScenario(signalCatalogName, fleetId, manifestName, decName, vecName) +} + +suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestName: String, decName:String, vecName:String) { + println(DASHES) + println("1. Creates a collection of standardized signals that can be reused to create vehicle models") + waitForInputToContinue(scanner) + val signalCatalogArn = createbranchVehicle(signalCatalogName) + println("The collection ARN is $signalCatalogArn") + waitForInputToContinue(scanner) + println(DASHES) + + println(DASHES) + println("2. Create a fleet that represents a group of vehicles") + println( + """ + Creating an IoT FleetWise fleet allows you to efficiently collect, + organize, and transfer vehicle data to the cloud, enabling real-time + insights into vehicle performance and health. + + It helps reduce data costs by allowing you to filter and prioritize + only the most relevant vehicle signals, supporting advanced analytics + and predictive maintenance use cases. + + """.trimIndent(), + ) + waitForInputToContinue(scanner) + val fleetid = createFleet(signalCatalogArn, fleetIdVal) + println("The fleet Id is $fleetid") + waitForInputToContinue(scanner) + val nodeList = listSignalCatalogNode(signalCatalogName) + println(DASHES) + + println(DASHES) + println("3. Create a model manifest") + println( + """ + An AWS IoT FleetWise manifest defines the structure and + relationships of vehicle data. The model manifest specifies + which signals to collect and how they relate to vehicle systems, + while the decoder manifest defines how to decode raw vehicle data + into meaningful signals. + + """.trimIndent(), + ) + waitForInputToContinue(scanner) + val nodes = listSignalCatalogNode(signalCatalogName); + val manifestArn = nodes?.let { createModelManifest(manifestName, signalCatalogArn, it) }; + println("The manifest ARN is $manifestArn") + println(DASHES) + + println(DASHES) + println("4. Create a decoder manifest") + println( + """ + A decoder manifest in AWS IoT FleetWise defines how raw vehicle + data (such as CAN signals) should be interpreted and decoded + into meaningful signals. It acts as a translation layer + that maps vehicle-specific protocols to standardized data formats + using decoding rules. This is crucial for extracting usable + data from different vehicle models, even when their data + formats vary. + + """.trimIndent(), + ) + waitForInputToContinue(scanner) + val decArn = createDecoderManifest(decName, manifestArn) + println("The decoder manifest ARN is $decArn") + waitForInputToContinue(scanner) + println(DASHES) + + println(DASHES) + println("5. Check the status of the model manifest") + println( + """ + The model manifest must be in an ACTIVE state before it can be used + to create or update a vehicle. + """.trimIndent(), + ) + waitForInputToContinue(scanner) + updateModelManifest(manifestName) + waitForModelManifestActive(manifestName) + waitForInputToContinue(scanner) + println(DASHES) + + println(DASHES) + println("6. Check the status of the decoder") + println( + """ + The decoder manifest must be in an ACTIVE state before it can be used + to create or update a vehicle. + """.trimIndent(), + ) + waitForInputToContinue(scanner) + updateDecoderManifest(decName) + waitForDecoderManifestActive(decName) + waitForInputToContinue(scanner) + println(DASHES) + + println(DASHES); + println("7. Create an IoT Thing"); + println( + """ + AWS IoT FleetWise expects an existing AWS IoT Thing with the same + name as the vehicle name you are passing to createVehicle method. + Before calling createVehicle(), you must create an AWS IoT Thing + with the same name using the AWS IoT Core service. + """.trimIndent(), + ) + waitForInputToContinue(scanner); + createThingIfNotExist(vecName) + println(DASHES); + + println(DASHES); + println("8. Create a vehicle"); + println( + """ + Creating a vehicle in AWS IoT FleetWise allows you to digitally + represent and manage a physical vehicle within the AWS ecosystem. + This enables efficient ingestion, transformation, and transmission + of vehicle telemetry data to the cloud for analysis. + """.trimIndent(), + ) + waitForInputToContinue(scanner); + createVehicle(vecName, manifestArn, decArn) + println(DASHES); + + println(DASHES); + println("9. Display vehicle details"); + waitForInputToContinue(scanner); + getVehicleDetails(vecName) + waitForInputToContinue(scanner); + println(DASHES); + + println(DASHES); + println("10. Delete the AWS IoT Fleetwise Assets"); + println("Would you like to delete the IoT Fleetwise Assets? (y/n)"); + val delAns = scanner.nextLine().trim(); + if (delAns.equals("y", ignoreCase = true)) { + deleteVehicle(vecName) + deleteDecoderManifest(decName) + deleteModelManifest(manifestName) + deleteFleet(fleetid) + deleteSignalCatalog(signalCatalogName) + } + + println(DASHES); + println( + """ + Thank you for checking out the AWS IoT Fleetwise Service Use demo. We hope you + learned something new, or got some inspiration for your own apps today. + For more AWS code examples, have a look at: + https://docs.aws.amazon.com/code-library/latest/ug/what-is-code-library.html + """.trimIndent(), + ) + println(DASHES); +} + +suspend fun deleteVehicle(vecName:String){ + val request = DeleteVehicleRequest { + vehicleName = vecName + } + + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + fleetwiseClient.deleteVehicle(request) + println("✅ Vehicle $vecName was deleted successfully.") + } +} + +suspend fun getVehicleDetails(vehicleNameVal:String) { + val request = GetVehicleRequest { + vehicleName = vehicleNameVal + } + + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + val response = fleetwiseClient.getVehicle(request) + val details = mapOf( + "vehicleName" to response.vehicleName, + "arn" to response.arn, + "modelManifestArn" to response.modelManifestArn, + "decoderManifestArn" to response.decoderManifestArn, + "attributes" to response.attributes.toString(), + "creationTime" to response.creationTime.toString(), + "lastModificationTime" to response.lastModificationTime.toString() + ) + + println("🚗 Vehicle Details:") + for ((key, value) in details) { + println("• %-20s : %s".format(key, value)) + } + } +} + +suspend fun createVehicle(vecName:String, manifestArn:String?, decArn:String){ + val request = CreateVehicleRequest { + vehicleName = vecName + modelManifestArn = manifestArn + decoderManifestArn = decArn + } + + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + fleetwiseClient.createVehicle(request) + println("✅ Vehicle $vecName was created successfully.") + } +} + +/** + * Creates an IoT Thing if it does not already exist. + * + * @param vecName the name of the IoT Thing to create + */ +suspend fun createThingIfNotExist(vecName: String){ + val request = CreateThingRequest { + thingName= vecName + } + + IotClient { region = "us-east-1" }.use { client -> + client.createThing(request) + println("The $vecName IoT Thing was successfully created") + } +} + +suspend fun updateDecoderManifest(nameVal:String) { + val request = UpdateDecoderManifestRequest { + name = nameVal + status = ManifestStatus.Active + } + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + fleetwiseClient.updateDecoderManifest(request) + println("$nameVal was successfully updated") + } +} + +/** +* Waits for the specified model manifest to become active. +* +* @param decNameVal the name of the model manifest to wait for +*/ +suspend fun waitForDecoderManifestActive(decNameVal: String) { + var elapsedSeconds = 0 + var lastStatus: ManifestStatus = ManifestStatus.Draft + + print("⏳ Elapsed: 0s | Status: DRAFT") + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + while (true) { + delay(1000) + elapsedSeconds++ + if (elapsedSeconds % 5 == 0) { + val request = GetDecoderManifestRequest { + name = decNameVal + } + + val response = fleetwiseClient.getDecoderManifest(request) + lastStatus = response.status ?: ManifestStatus.Draft + + when (lastStatus) { + ManifestStatus.Active -> { + print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: ACTIVE ✅\n") + return + } + + ManifestStatus.Invalid -> { + print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: INVALID ❌\n") + throw RuntimeException("Model manifest became INVALID. Cannot proceed.") + } + + else -> { + print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: $lastStatus") + } + } + } else { + print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: $lastStatus") + } + } + } +} + +// snippet-start:[iotfleetwise.kotlin.get.manifest.main] +/** + * Waits for the specified model manifest to become active. + * + * @param manifestName the name of the model manifest to wait for + */ +suspend fun waitForModelManifestActive(manifestNameVal: String) { + var elapsedSeconds = 0 + var lastStatus: ManifestStatus = ManifestStatus.Draft + + print("⏳ Elapsed: 0s | Status: DRAFT") + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + while (true) { + delay(1000) + elapsedSeconds++ + if (elapsedSeconds % 5 == 0) { + val request = GetModelManifestRequest { + name = manifestNameVal + } + + val response = fleetwiseClient.getModelManifest(request) + lastStatus = response.status ?: ManifestStatus.Draft + + when (lastStatus) { + ManifestStatus.Active -> { + print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: ACTIVE ✅\n") + return + } + + ManifestStatus.Invalid -> { + print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: INVALID ❌\n") + throw RuntimeException("Model manifest became INVALID. Cannot proceed.") + } + + else -> { + print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: $lastStatus") + } + } + } else { + print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: $lastStatus") + } + } + } +} +// snippet-end:[iotfleetwise.kotlin.get.manifest.main] + +// snippet-start:[iotfleetwise.kotlin.update.manifest.main] +/** + * Updates the model manifest. + * + * @param nameVal the name of the model manifest to update + */ +suspend fun updateModelManifest(nameVal:String) { + val request = UpdateModelManifestRequest { + name = nameVal + status = ManifestStatus.Active + } + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + fleetwiseClient.updateModelManifest(request) + println("$nameVal was successfully updated") + } +} +// snippet-end:[iotfleetwise.kotlin.update.manifest.main] + +suspend fun deleteDecoderManifest(nameVal:String) { + val request = DeleteDecoderManifestRequest{ + name = nameVal + } + + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + fleetwiseClient.deleteDecoderManifest(request) + println("✅ $nameVal was successfully deleted") + } +} + +// snippet-start:[iotfleetwise.kotlin.create.decoder.main] +/** + * Creates a new decoder manifest. + * + * @param decName the name of the decoder manifest + * @param modelManifestArnVal the ARN of the model manifest + * @return the ARN of the decoder manifest + */ +suspend fun createDecoderManifest(decName:String, modelManifestArnVal:String?):String { + val interfaceIdVal = "can0" + + val canInter = CanInterface { + name = "canInterface0" + protocolName = "CAN" + protocolVersion = "1.0" + } + + val networkInterface = NetworkInterface { + interfaceId = interfaceIdVal + type = NetworkInterfaceType.CanInterface + canInterface = canInter + } + + val carRpmSig = CanSignal { + messageId = 100 + isBigEndian = false + isSigned = false + startBit = 16 + length = 16 + factor = 1.0 + offset = 0.0 + } + + val carSpeedSig = CanSignal { + messageId = 101 + isBigEndian = false + isSigned = false + startBit = 0 + length = 16 + factor = 1.0 + offset = 0.0 + } + + val engineRpmDecoder = SignalDecoder { + fullyQualifiedName = "Vehicle.Powertrain.EngineRPM" + interfaceId = interfaceIdVal + type = SignalDecoderType.CanSignal + canSignal = carRpmSig + } + + val vehicleSpeedDecoder = SignalDecoder { + fullyQualifiedName = "Vehicle.Powertrain.VehicleSpeed" + interfaceId = interfaceIdVal + type = SignalDecoderType.CanSignal + canSignal = carSpeedSig + } + + val request = CreateDecoderManifestRequest { + name = decName + modelManifestArn = modelManifestArnVal + networkInterfaces = listOf(networkInterface) + signalDecoders = listOf(engineRpmDecoder, vehicleSpeedDecoder) + } + + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + val response = fleetwiseClient.createDecoderManifest(request) + return response.arn + } +} +// snippet-end:[iotfleetwise.kotlin.create.decoder.main] + +// snippet-start:[iotfleetwise.kotlin.delete.catalog.main] +/** + * Deletes a signal catalog. + * + * @param name the name of the signal catalog to delete + */ +suspend fun deleteSignalCatalog(catName: String) { + val request = DeleteSignalCatalogRequest { + name = catName + } + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + fleetwiseClient.deleteSignalCatalog(request) + println("✅ $catName was successfully deleted") + } +} +// snippet-end:[iotfleetwise.kotlin.delete.catalog.main] + +// snippet-start:[iotfleetwise.kotlin.delete.fleet.main] +/** + * Deletes a fleet based on the provided fleet ID. + * + * @param fleetId the ID of the fleet to be deleted + */ +suspend fun deleteFleet(fleetIdVal: String) { + val request = DeleteFleetRequest { + fleetId = fleetIdVal + } + + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + fleetwiseClient.deleteFleet(request) + println("✅ $fleetIdVal was successfully deleted") + } +} +// snippet-end:[iotfleetwise.kotlin.delete.fleet.main] + +// snippet-start:[iotfleetwise.koltin.delete.model.main] +/** + * Deletes a model manifest. + * + * @param nameVal the name of the model manifest to delete + */ +suspend fun deleteModelManifest(nameVal: String) { + val request = DeleteModelManifestRequest { + name = nameVal + } + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + fleetwiseClient.deleteModelManifest(request) + println("✅ $nameVal was successfully deleted") + } +} +// snippet-end:[iotfleetwise.koltin.delete.model.main] + +// snippet-start:[iotfleetwise.kotlin.create.model.main] +/** + * Creates a model manifest. + * + * @param name the name of the model manifest to create + * @param signalCatalogArn the Amazon Resource Name (ARN) of the signal catalog + * @param nodes a list of nodes to include in the model manifest + * @return a {@link CompletableFuture} that completes with the ARN of the created model manifest + */ +suspend fun createModelManifest(nameVal: String, signalCatalogArnVal: String, nodesList: List): String { + val fqnList: List = nodesList.map { node -> + when (node) { + is Node.Sensor -> node.asSensor().fullyQualifiedName + is Node.Branch -> node.asBranch().fullyQualifiedName + else -> throw RuntimeException("Unsupported node type") + } + } + + val request = CreateModelManifestRequest { + name = nameVal + signalCatalogArn = signalCatalogArnVal + nodes = fqnList + } + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + val response = fleetwiseClient.createModelManifest(request) + return response.arn + } +} +// snippet-end:[iotfleetwise.kotlin.create.model.main] + +// snippet-start:[iotfleetwise.kotlin.list.catalogs.main] +/** + * Lists the signal catalog nodes asynchronously. + * + * @param signalCatalogName the name of the signal catalog + * @return a CompletableFuture that, when completed, contains a list of nodes in the specified signal catalog + * @throws CompletionException if an exception occurs during the asynchronous operation + */ +suspend fun listSignalCatalogNode(signalCatalogName: String): List? { + val request = ListSignalCatalogNodesRequest { + name = signalCatalogName + } + + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + val response = fleetwiseClient.listSignalCatalogNodes(request) + return response.nodes + } +} +// snippet-end:[iotfleetwise.kotlin.list.catalogs.main] + +// snippet-start:[iotfleetwise.kotlin.create.fleet.main] +/** + * Creates a new fleet. + * + * @param catARN the Amazon Resource Name (ARN) of the signal catalog to associate with the fleet + * @param fleetId the unique identifier for the fleet + * @return the ID of the created fleet + */ +suspend fun createFleet(catARN: String, fleetIdVal: String): String { + val fleetRequest = CreateFleetRequest { + fleetId = fleetIdVal + signalCatalogArn = catARN + description = "Built using the AWS For Kotlin" + } + + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + val response = fleetwiseClient.createFleet(fleetRequest) + return response.id + } +} +// snippet-end:[iotfleetwise.kotlin.create.fleet.main] + +// snippet-start:[iotfleetwise.kotlin.create.catalog.main] +/** + * Creates a signal catalog. + * + * @param signalCatalogName the name of the signal catalog to create the branch vehicle in + * @return the ARN (Amazon Resource Name) of the created signal catalog + */ +suspend fun createbranchVehicle(signalCatalogName: String): String { + delay(2000) // Wait for 2 seconds + val branchVehicle = Branch { + fullyQualifiedName = "Vehicle" + description = "Root branch" + } + + val branchPowertrain = Branch { + fullyQualifiedName = "Vehicle.Powertrain" + description = "Powertrain branch" + } + + val sensorRPM = Sensor { + fullyQualifiedName = "Vehicle.Powertrain.EngineRPM" + description = "Engine RPM" + dataType = NodeDataType.Double + unit = "rpm" + } + + val sensorKM = Sensor { + fullyQualifiedName = "Vehicle.Powertrain.VehicleSpeed" + description = "Vehicle Speed" + dataType = NodeDataType.Double + unit = "km/h" + } + + // Wrap each specific node type (Branch and Sensor) into the sealed Node class + // so they can be included in the CreateSignalCatalogRequest. + val myNodes = listOf( + Node.Branch(branchVehicle), + Node.Branch(branchPowertrain), + Node.Sensor(sensorRPM), + Node.Sensor(sensorKM) + ) + + val request = CreateSignalCatalogRequest { + name = signalCatalogName + nodes = myNodes + } + + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + val response = fleetwiseClient.createSignalCatalog(request) + return response.arn + } +} +// snippet-end:[iotfleetwise.kotlin.create.catalog.main] + +private fun waitForInputToContinue(scanner: Scanner) { + while (true) { + println("") + println("Enter 'c' followed by to continue:") + val input = scanner.nextLine() + + if (input.trim { it <= ' ' }.equals("c", ignoreCase = true)) { + println("Continuing with the program...") + println("") + break + } else { + println("Invalid input. Please try again.") + } + } +} \ No newline at end of file From 2e1018f5159a6a8683c9db61a9470f5fad49758e Mon Sep 17 00:00:00 2001 From: Macdonald Date: Thu, 1 May 2025 13:41:18 -0400 Subject: [PATCH 02/19] updated YAML file to include kotlin tags --- .doc_gen/metadata/iot_fleetwise_metadata.yaml | 145 ++++++++++++++++++ .../com/example/fleetwise/HelloFleetwise.kt | 49 ++++++ .../fleetwise/scenario/FleetwiseScenario.kt | 11 +- 3 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 kotlin/services/fleetwise/src/main/java/com/example/fleetwise/HelloFleetwise.kt diff --git a/.doc_gen/metadata/iot_fleetwise_metadata.yaml b/.doc_gen/metadata/iot_fleetwise_metadata.yaml index 2c166ab1ee1..9d7dd3986a8 100644 --- a/.doc_gen/metadata/iot_fleetwise_metadata.yaml +++ b/.doc_gen/metadata/iot_fleetwise_metadata.yaml @@ -5,6 +5,14 @@ iotfleetwise_Hello: synopsis: get started using &FW;. category: Hello languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.hello.main Java: versions: - sdk_version: 2 @@ -18,6 +26,14 @@ iotfleetwise_Hello: iotfleetwise: {listSignalCatalogsPaginator} iotfleetwise_CreateSignalCatalog: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.create.catalog.main Java: versions: - sdk_version: 2 @@ -31,6 +47,14 @@ iotfleetwise_CreateSignalCatalog: iotfleetwise: {createSignalCatalog} iotfleetwise_CreateDecoderManifest: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.create.decoder.main Java: versions: - sdk_version: 2 @@ -44,6 +68,14 @@ iotfleetwise_CreateDecoderManifest: iotfleetwise: {createDecoderManifest} iotfleetwise_DeleteDecoderManifest: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.delete.decoder.main Java: versions: - sdk_version: 2 @@ -57,6 +89,14 @@ iotfleetwise_DeleteDecoderManifest: iotfleetwise: {deleteDecoderManifest} iotfleetwise_DeleteVehicle: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.delete.vehicle.main Java: versions: - sdk_version: 2 @@ -70,6 +110,14 @@ iotfleetwise_DeleteVehicle: iotfleetwise: {deleteVehicle} iotfleetwise_UpdateModelManifest: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.update.manifest.main Java: versions: - sdk_version: 2 @@ -83,6 +131,14 @@ iotfleetwise_UpdateModelManifest: iotfleetwise: {updateModelManifest} iotfleetwise_UpdateDecoderManifest: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.update.decoder.main Java: versions: - sdk_version: 2 @@ -96,6 +152,14 @@ iotfleetwise_UpdateDecoderManifest: iotfleetwise: {updateDecoderManifest} iotfleetwise_CreateVehicle: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.create.vehicle.main Java: versions: - sdk_version: 2 @@ -109,6 +173,14 @@ iotfleetwise_CreateVehicle: iotfleetwise: {createVehicle} iotfleetwise_GetDecoderManifest: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.decoder.active.main Java: versions: - sdk_version: 2 @@ -122,6 +194,14 @@ iotfleetwise_GetDecoderManifest: iotfleetwise: {getDecoderManifest} iotfleetwise_GetModelManifest: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.get.manifest.main Java: versions: - sdk_version: 2 @@ -135,6 +215,14 @@ iotfleetwise_GetModelManifest: iotfleetwise: {getModelManifest} iotfleetwise_GetVehicle: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.get.vehicle.main Java: versions: - sdk_version: 2 @@ -148,6 +236,14 @@ iotfleetwise_GetVehicle: iotfleetwise: {getVehicle} iotfleetwise_DeleteModelManifest: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.delete.model.main Java: versions: - sdk_version: 2 @@ -161,6 +257,14 @@ iotfleetwise_DeleteModelManifest: iotfleetwise: {deleteModelManifest} iotfleetwise_DeleteSignalCatalog: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.delete.catalog.main Java: versions: - sdk_version: 2 @@ -174,6 +278,14 @@ iotfleetwise_DeleteSignalCatalog: iotfleetwise: {deleteSignalCatalog} iotfleetwise_ListSignalCatalogNodes: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.list.catalogs.main Java: versions: - sdk_version: 2 @@ -187,6 +299,14 @@ iotfleetwise_ListSignalCatalogNodes: iotfleetwise: {listSignalCatalogNodes} iotfleetwise_CreateModelManifest: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.create.model.main Java: versions: - sdk_version: 2 @@ -200,6 +320,14 @@ iotfleetwise_CreateModelManifest: iotfleetwise: {createModelManifest} iotfleetwise_DeleteFleet: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.delete.fleet.main Java: versions: - sdk_version: 2 @@ -213,6 +341,14 @@ iotfleetwise_DeleteFleet: iotfleetwise: {deleteFleet} iotfleetwise_CreateFleet: languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - snippet_tags: + - iotfleetwise.kotlin.create.fleet.main Java: versions: - sdk_version: 2 @@ -238,6 +374,15 @@ iotfleetwise_Scenario: - Delete the &FW; Assets. category: Basics languages: + Kotlin: + versions: + - sdk_version: 1 + github: kotlin/services/fleetwise + sdkguide: + excerpts: + - description: Run an interactive scenario demonstrating &ITSW; features. + snippet_tags: + - iotfleetwise.kotlin.scenario.main Java: versions: - sdk_version: 2 diff --git a/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/HelloFleetwise.kt b/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/HelloFleetwise.kt new file mode 100644 index 00000000000..a9ec1bd1a16 --- /dev/null +++ b/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/HelloFleetwise.kt @@ -0,0 +1,49 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.fleetwise + +import aws.sdk.kotlin.services.iotfleetwise.IotFleetWiseClient +import aws.sdk.kotlin.services.iotfleetwise.model.ListSignalCatalogsRequest + + +// snippet-start:[iotfleetwise.kotlin.hello.main] +/** +Before running this Kotlin code example, set up your development environment, +including your credentials. + +For more information, see the following documentation topic: +https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/setup.html + */ +suspend fun main() { + ListSignalCatalogs() +} + +/** + * Lists the AWS FleetWise Signal Catalogs associated with the current AWS account. + */ +suspend fun ListSignalCatalogs() { + val request = ListSignalCatalogsRequest { + maxResults = 10 + } + + IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> + val response = fleetwiseClient.listSignalCatalogs(request) + val summaries = response.summaries + + if (summaries.isNullOrEmpty()) { + println("No AWS FleetWise Signal Catalogs were found.") + } else { + summaries.forEach { summary -> + with(summary) { + println("Catalog Name: $name") + println("ARN: $arn") + println("Created: $creationTime") + println("Last Modified: $lastModificationTime") + println("---------------") + } + } + } + } +} +// snippet-end:[iotfleetwise.kotlin.hello.main] diff --git a/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt b/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt index 9e4b08990c2..4743ba97d7a 100644 --- a/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt +++ b/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt @@ -36,6 +36,14 @@ import aws.sdk.kotlin.services.iotfleetwise.model.UpdateModelManifestRequest import kotlinx.coroutines.delay import java.util.Scanner +// snippet-start:[iotfleetwise.kotlin.scenario.main] +/** +Before running this Kotlin code example, set up your development environment, +including your credentials. + +For more information, see the following documentation topic: +https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/setup.html + */ var scanner = Scanner(System.`in`) val DASHES = String(CharArray(80)).replace("\u0000", "-") suspend fun main(args: Array) { @@ -706,4 +714,5 @@ private fun waitForInputToContinue(scanner: Scanner) { println("Invalid input. Please try again.") } } -} \ No newline at end of file +} +// snippet-end:[iotfleetwise.kotlin.scenario.main] \ No newline at end of file From e54b5ee911d59b000529f59716371b4e69820f1a Mon Sep 17 00:00:00 2001 From: Macdonald Date: Thu, 1 May 2025 14:23:09 -0400 Subject: [PATCH 03/19] updated YAML file to include kotlin tags --- .../fleetwise/scenario/FleetwiseScenario.kt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt b/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt index 4743ba97d7a..9e714232a5c 100644 --- a/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt +++ b/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt @@ -257,6 +257,7 @@ suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestN println(DASHES); } +// snippet-start:[iotfleetwise.kotlin.delete.vehicle.main] suspend fun deleteVehicle(vecName:String){ val request = DeleteVehicleRequest { vehicleName = vecName @@ -267,7 +268,9 @@ suspend fun deleteVehicle(vecName:String){ println("✅ Vehicle $vecName was deleted successfully.") } } +// snippet-end:[iotfleetwise.kotlin.delete.vehicle.main] +// snippet-start:[iotfleetwise.kotlin.get.vehicle.main] suspend fun getVehicleDetails(vehicleNameVal:String) { val request = GetVehicleRequest { vehicleName = vehicleNameVal @@ -291,7 +294,9 @@ suspend fun getVehicleDetails(vehicleNameVal:String) { } } } +// snippet-end:[iotfleetwise.kotlin.get.vehicle.main] +// snippet-start:[iotfleetwise.kotlin.create.vehicle.main] suspend fun createVehicle(vecName:String, manifestArn:String?, decArn:String){ val request = CreateVehicleRequest { vehicleName = vecName @@ -304,6 +309,7 @@ suspend fun createVehicle(vecName:String, manifestArn:String?, decArn:String){ println("✅ Vehicle $vecName was created successfully.") } } +// snippet-end:[iotfleetwise.kotlin.create.vehicle.main] /** * Creates an IoT Thing if it does not already exist. @@ -321,6 +327,7 @@ suspend fun createThingIfNotExist(vecName: String){ } } +// snippet-start:[iotfleetwise.kotlin.update.decoder.main] suspend fun updateDecoderManifest(nameVal:String) { val request = UpdateDecoderManifestRequest { name = nameVal @@ -331,7 +338,9 @@ suspend fun updateDecoderManifest(nameVal:String) { println("$nameVal was successfully updated") } } +// snippet-end:[iotfleetwise.kotlin.update.decoder.main] +// snippet-start:[iotfleetwise.kotlin.decoder.active.main] /** * Waits for the specified model manifest to become active. * @@ -375,6 +384,7 @@ suspend fun waitForDecoderManifestActive(decNameVal: String) { } } } +// snippet-end:[iotfleetwise.kotlin.decoder.active.main] // snippet-start:[iotfleetwise.kotlin.get.manifest.main] /** @@ -440,6 +450,8 @@ suspend fun updateModelManifest(nameVal:String) { } // snippet-end:[iotfleetwise.kotlin.update.manifest.main] + +// snippet-start:[iotfleetwise.kotlin.delete.decoder.main] suspend fun deleteDecoderManifest(nameVal:String) { val request = DeleteDecoderManifestRequest{ name = nameVal @@ -450,6 +462,7 @@ suspend fun deleteDecoderManifest(nameVal:String) { println("✅ $nameVal was successfully deleted") } } +// snippet-end:[iotfleetwise.kotlin.delete.decoder.main] // snippet-start:[iotfleetwise.kotlin.create.decoder.main] /** @@ -557,7 +570,7 @@ suspend fun deleteFleet(fleetIdVal: String) { } // snippet-end:[iotfleetwise.kotlin.delete.fleet.main] -// snippet-start:[iotfleetwise.koltin.delete.model.main] +// snippet-start:[iotfleetwise.kotlin.delete.model.main] /** * Deletes a model manifest. * @@ -572,7 +585,7 @@ suspend fun deleteModelManifest(nameVal: String) { println("✅ $nameVal was successfully deleted") } } -// snippet-end:[iotfleetwise.koltin.delete.model.main] +// snippet-end:[iotfleetwise.kotlin.delete.model.main] // snippet-start:[iotfleetwise.kotlin.create.model.main] /** From 2c25c629f42c34e1104d4881796d4eee70d30a69 Mon Sep 17 00:00:00 2001 From: Macdonald Date: Thu, 1 May 2025 14:36:50 -0400 Subject: [PATCH 04/19] added service level readme --- kotlin/services/fleetwise/.gitignore | 42 ------ kotlin/services/fleetwise/README.md | 128 ++++++++++++++++++ kotlin/services/fleetwise/settings.gradle.kts | 2 - 3 files changed, 128 insertions(+), 44 deletions(-) delete mode 100644 kotlin/services/fleetwise/.gitignore create mode 100644 kotlin/services/fleetwise/README.md delete mode 100644 kotlin/services/fleetwise/settings.gradle.kts diff --git a/kotlin/services/fleetwise/.gitignore b/kotlin/services/fleetwise/.gitignore deleted file mode 100644 index b63da4551b2..00000000000 --- a/kotlin/services/fleetwise/.gitignore +++ /dev/null @@ -1,42 +0,0 @@ -.gradle -build/ -!gradle/wrapper/gradle-wrapper.jar -!**/src/main/**/build/ -!**/src/test/**/build/ - -### IntelliJ IDEA ### -.idea/modules.xml -.idea/jarRepositories.xml -.idea/compiler.xml -.idea/libraries/ -*.iws -*.iml -*.ipr -out/ -!**/src/main/**/out/ -!**/src/test/**/out/ - -### Eclipse ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache -bin/ -!**/src/main/**/bin/ -!**/src/test/**/bin/ - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ - -### VS Code ### -.vscode/ - -### Mac OS ### -.DS_Store \ No newline at end of file diff --git a/kotlin/services/fleetwise/README.md b/kotlin/services/fleetwise/README.md new file mode 100644 index 00000000000..58a4fb91b24 --- /dev/null +++ b/kotlin/services/fleetwise/README.md @@ -0,0 +1,128 @@ +# AWS IoT code examples for the SDK for Kotlin + +## Overview + +Shows how to use the AWS SDK for Kotlin to work with AWS IoT. + + + + +_AWS IoT provides secure, bi-directional communication for Internet-connected devices (such as sensors, actuators, embedded devices, wireless devices, and smart appliances) to connect to the AWS Cloud over MQTT, HTTPS, and LoRaWAN._ + +## ⚠ Important + +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). +* Running the tests might result in charges to your AWS account. +* We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). +* This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). + + + + +## Code examples + +### Prerequisites + +For prerequisites, see the [README](../../README.md#Prerequisites) in the `kotlin` folder. + + + + + +### Get started + +- [Hello AWS IoT](src/main/kotlin/com/example/iot/HelloIoT.kt#L6) (`listThings`) + + +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/kotlin/com/example/iot/IotScenario.kt) + + +### Single actions + +Code excerpts that show you how to call individual service functions. + +- [AttachThingPrincipal](src/main/kotlin/com/example/iot/IotScenario.kt#L476) +- [CreateKeysAndCertificate](src/main/kotlin/com/example/iot/IotScenario.kt#L511) +- [CreateThing](src/main/kotlin/com/example/iot/IotScenario.kt#L528) +- [CreateTopicRule](src/main/kotlin/com/example/iot/IotScenario.kt#L331) +- [DeleteCertificate](src/main/kotlin/com/example/iot/IotScenario.kt#L257) +- [DeleteThing](src/main/kotlin/com/example/iot/IotScenario.kt#L243) +- [DescribeEndpoint](src/main/kotlin/com/example/iot/IotScenario.kt#L397) +- [DescribeThing](src/main/kotlin/com/example/iot/IotScenario.kt#L494) +- [DetachThingPrincipal](src/main/kotlin/com/example/iot/IotScenario.kt#L277) +- [ListCertificates](src/main/kotlin/com/example/iot/IotScenario.kt#L384) +- [SearchIndex](src/main/kotlin/com/example/iot/IotScenario.kt#L295) +- [UpdateThing](src/main/kotlin/com/example/iot/IotScenario.kt#L429) + + + + + +## Run the examples + +### Instructions + + + + + +#### Hello AWS IoT + +This example shows you how to get started using AWS IoT. + + +#### Learn the basics + +This example shows you how to do the following: + +- Create an AWS IoT Thing. +- Generate a device certificate. +- Update an AWS IoT Thing with Attributes. +- Return a unique endpoint. +- List your AWS IoT certificates. +- Create an AWS IoT shadow. +- Write out state information. +- Creates a rule. +- List your rules. +- Search things using the Thing name. +- Delete an AWS IoT Thing. + + + + + + + + + +### Tests + +⚠ Running tests might result in charges to your AWS account. + + +To find instructions for running these tests, see the [README](../../README.md#Tests) +in the `kotlin` folder. + + + + + + +## Additional resources + +- [AWS IoT Developer Guide](https://docs.aws.amazon.com/iot/latest/developerguide/what-is-aws-iot.html) +- [AWS IoT API Reference](https://docs.aws.amazon.com/iot/latest/apireference/Welcome.html) +- [SDK for Kotlin AWS IoT reference](https://sdk.amazonaws.com/kotlin/api/latest/iot/index.html) + + + + +--- + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 diff --git a/kotlin/services/fleetwise/settings.gradle.kts b/kotlin/services/fleetwise/settings.gradle.kts deleted file mode 100644 index 95b19f62d88..00000000000 --- a/kotlin/services/fleetwise/settings.gradle.kts +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = "flkeetwise" - From 68293f95756501450f951d89f45abdfda1ae4ec3 Mon Sep 17 00:00:00 2001 From: Macdonald Date: Thu, 1 May 2025 14:57:32 -0400 Subject: [PATCH 05/19] added service level readme --- kotlin/services/{fleetwise => iotfleetwise}/README.md | 0 kotlin/services/{fleetwise => iotfleetwise}/build.gradle.kts | 0 .../src/main/java/com/example/fleetwise/HelloFleetwise.kt | 0 .../java/com/example/fleetwise/scenario/FleetwiseScenario.kt | 0 kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt | 2 ++ 5 files changed, 2 insertions(+) rename kotlin/services/{fleetwise => iotfleetwise}/README.md (100%) rename kotlin/services/{fleetwise => iotfleetwise}/build.gradle.kts (100%) rename kotlin/services/{fleetwise => iotfleetwise}/src/main/java/com/example/fleetwise/HelloFleetwise.kt (100%) rename kotlin/services/{fleetwise => iotfleetwise}/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt (100%) create mode 100644 kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt diff --git a/kotlin/services/fleetwise/README.md b/kotlin/services/iotfleetwise/README.md similarity index 100% rename from kotlin/services/fleetwise/README.md rename to kotlin/services/iotfleetwise/README.md diff --git a/kotlin/services/fleetwise/build.gradle.kts b/kotlin/services/iotfleetwise/build.gradle.kts similarity index 100% rename from kotlin/services/fleetwise/build.gradle.kts rename to kotlin/services/iotfleetwise/build.gradle.kts diff --git a/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/HelloFleetwise.kt b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/HelloFleetwise.kt similarity index 100% rename from kotlin/services/fleetwise/src/main/java/com/example/fleetwise/HelloFleetwise.kt rename to kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/HelloFleetwise.kt diff --git a/kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt similarity index 100% rename from kotlin/services/fleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt rename to kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt diff --git a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt new file mode 100644 index 00000000000..57fac5f7592 --- /dev/null +++ b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt @@ -0,0 +1,2 @@ +class FleetwiseTest { +} \ No newline at end of file From 5942fdcb11b96e8a1460250ff1c453ef73f19554 Mon Sep 17 00:00:00 2001 From: Macdonald Date: Thu, 1 May 2025 15:02:25 -0400 Subject: [PATCH 06/19] added service level readme --- .doc_gen/metadata/iot_fleetwise_metadata.yaml | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.doc_gen/metadata/iot_fleetwise_metadata.yaml b/.doc_gen/metadata/iot_fleetwise_metadata.yaml index 9d7dd3986a8..5d4229c6e0c 100644 --- a/.doc_gen/metadata/iot_fleetwise_metadata.yaml +++ b/.doc_gen/metadata/iot_fleetwise_metadata.yaml @@ -8,7 +8,7 @@ iotfleetwise_Hello: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -29,7 +29,7 @@ iotfleetwise_CreateSignalCatalog: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -50,7 +50,7 @@ iotfleetwise_CreateDecoderManifest: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -71,7 +71,7 @@ iotfleetwise_DeleteDecoderManifest: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -92,7 +92,7 @@ iotfleetwise_DeleteVehicle: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -113,7 +113,7 @@ iotfleetwise_UpdateModelManifest: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -134,7 +134,7 @@ iotfleetwise_UpdateDecoderManifest: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -155,7 +155,7 @@ iotfleetwise_CreateVehicle: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -176,7 +176,7 @@ iotfleetwise_GetDecoderManifest: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -197,7 +197,7 @@ iotfleetwise_GetModelManifest: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -218,7 +218,7 @@ iotfleetwise_GetVehicle: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -239,7 +239,7 @@ iotfleetwise_DeleteModelManifest: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -260,7 +260,7 @@ iotfleetwise_DeleteSignalCatalog: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -281,7 +281,7 @@ iotfleetwise_ListSignalCatalogNodes: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -302,7 +302,7 @@ iotfleetwise_CreateModelManifest: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -323,7 +323,7 @@ iotfleetwise_DeleteFleet: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -344,7 +344,7 @@ iotfleetwise_CreateFleet: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - snippet_tags: @@ -377,7 +377,7 @@ iotfleetwise_Scenario: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/fleetwise + github: kotlin/services/iotfleetwise sdkguide: excerpts: - description: Run an interactive scenario demonstrating &ITSW; features. From f93a736e18d6884b205645b1e89530600b1043bd Mon Sep 17 00:00:00 2001 From: Macdonald Date: Thu, 1 May 2025 15:04:02 -0400 Subject: [PATCH 07/19] added service level readme --- kotlin/services/iotfleetwise/README.md | 77 +++++++++++++------------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/kotlin/services/iotfleetwise/README.md b/kotlin/services/iotfleetwise/README.md index 58a4fb91b24..0207d86e15f 100644 --- a/kotlin/services/iotfleetwise/README.md +++ b/kotlin/services/iotfleetwise/README.md @@ -1,13 +1,13 @@ -# AWS IoT code examples for the SDK for Kotlin +# AWS IoT FleetWise code examples for the SDK for Kotlin ## Overview -Shows how to use the AWS SDK for Kotlin to work with AWS IoT. +Shows how to use the AWS SDK for Kotlin to work with AWS IoT FleetWise. -_AWS IoT provides secure, bi-directional communication for Internet-connected devices (such as sensors, actuators, embedded devices, wireless devices, and smart appliances) to connect to the AWS Cloud over MQTT, HTTPS, and LoRaWAN._ +_AWS IoT FleetWise provides a secure and scalable platform for collecting, storing, and analyzing data from connected vehicles and fleets._ ## ⚠ Important @@ -31,32 +31,36 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `kotli ### Get started -- [Hello AWS IoT](src/main/kotlin/com/example/iot/HelloIoT.kt#L6) (`listThings`) +- [Hello AWS IoT FleetWise](src/main/java/com/example/fleetwise/HelloFleetwise.kt#L10) (`listSignalCatalogsPaginator`) ### Basics Code examples that show you how to perform the essential operations within a service. -- [Learn the basics](src/main/kotlin/com/example/iot/IotScenario.kt) +- [Learn the basics](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt) ### Single actions Code excerpts that show you how to call individual service functions. -- [AttachThingPrincipal](src/main/kotlin/com/example/iot/IotScenario.kt#L476) -- [CreateKeysAndCertificate](src/main/kotlin/com/example/iot/IotScenario.kt#L511) -- [CreateThing](src/main/kotlin/com/example/iot/IotScenario.kt#L528) -- [CreateTopicRule](src/main/kotlin/com/example/iot/IotScenario.kt#L331) -- [DeleteCertificate](src/main/kotlin/com/example/iot/IotScenario.kt#L257) -- [DeleteThing](src/main/kotlin/com/example/iot/IotScenario.kt#L243) -- [DescribeEndpoint](src/main/kotlin/com/example/iot/IotScenario.kt#L397) -- [DescribeThing](src/main/kotlin/com/example/iot/IotScenario.kt#L494) -- [DetachThingPrincipal](src/main/kotlin/com/example/iot/IotScenario.kt#L277) -- [ListCertificates](src/main/kotlin/com/example/iot/IotScenario.kt#L384) -- [SearchIndex](src/main/kotlin/com/example/iot/IotScenario.kt#L295) -- [UpdateThing](src/main/kotlin/com/example/iot/IotScenario.kt#L429) +- [createDecoderManifest](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L467) +- [createFleet](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L640) +- [createModelManifest](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L590) +- [createSignalCatalog](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L662) +- [createVehicle](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L299) +- [deleteDecoderManifest](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L454) +- [deleteFleet](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L555) +- [deleteModelManifest](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L573) +- [deleteSignalCatalog](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L538) +- [deleteVehicle](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L260) +- [getDecoderManifest](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L343) +- [getModelManifest](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L389) +- [getVehicle](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L273) +- [listSignalCatalogNodes](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L620) +- [updateDecoderManifest](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L330) +- [updateModelManifest](src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt#L435) @@ -70,33 +74,32 @@ Code excerpts that show you how to call individual service functions. -#### Hello AWS IoT +#### Hello AWS IoT FleetWise -This example shows you how to get started using AWS IoT. +This example shows you how to get started using AWS IoT FleetWise. #### Learn the basics This example shows you how to do the following: -- Create an AWS IoT Thing. -- Generate a device certificate. -- Update an AWS IoT Thing with Attributes. -- Return a unique endpoint. -- List your AWS IoT certificates. -- Create an AWS IoT shadow. -- Write out state information. -- Creates a rule. -- List your rules. -- Search things using the Thing name. -- Delete an AWS IoT Thing. +- Create a collection of standardized signals. +- Create a fleet that represents a group of vehicles. +- Create a model manifest. +- Create a decoder manifest. +- Check the status of the model manifest. +- Check the status of the decoder. +- Create an IoT Thing. +- Create a vehicle. +- Display vehicle details. +- Delete the AWS IoT FleetWise Assets. - - + + - - + + ### Tests @@ -114,9 +117,9 @@ in the `kotlin` folder. ## Additional resources -- [AWS IoT Developer Guide](https://docs.aws.amazon.com/iot/latest/developerguide/what-is-aws-iot.html) -- [AWS IoT API Reference](https://docs.aws.amazon.com/iot/latest/apireference/Welcome.html) -- [SDK for Kotlin AWS IoT reference](https://sdk.amazonaws.com/kotlin/api/latest/iot/index.html) +- [AWS IoT FleetWise Developer Guide](https://docs.aws.amazon.com/iot-fleetwise/latest/developerguide/what-is-fleetwise.html) +- [AWS IoT FleetWise API Reference](https://docs.aws.amazon.com/iot-fleetwise/latest/APIReference/Welcome.html) +- [SDK for Kotlin AWS IoT FleetWise reference](https://sdk.amazonaws.com/kotlin/api/latest/iot/index.html) From 231e1ffd501a511410eb70ddffd2a7c58deef18f Mon Sep 17 00:00:00 2001 From: Macdonald Date: Fri, 2 May 2025 11:45:50 -0400 Subject: [PATCH 08/19] added tests --- kotlin/services/iotfleetwise/build.gradle.kts | 1 + .../fleetwise/scenario/FleetwiseScenario.kt | 20 +- .../src/test/java/FleetwiseTest.kt | 226 +++++++++++++++++- 3 files changed, 236 insertions(+), 11 deletions(-) diff --git a/kotlin/services/iotfleetwise/build.gradle.kts b/kotlin/services/iotfleetwise/build.gradle.kts index 7cf58043db5..825c616983a 100644 --- a/kotlin/services/iotfleetwise/build.gradle.kts +++ b/kotlin/services/iotfleetwise/build.gradle.kts @@ -38,6 +38,7 @@ dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") implementation("org.slf4j:slf4j-api:2.0.15") implementation("org.slf4j:slf4j-simple:2.0.15") + testImplementation(kotlin("test")) } tasks.withType { kotlinOptions.jvmTarget = "17" diff --git a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt index 9e714232a5c..4d056a7d70f 100644 --- a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt +++ b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt @@ -61,16 +61,16 @@ suspend fun main(args: Array) { """.trimIndent() - // if (args.size != 5) { - // println(usage) - // return - // } - - val signalCatalogName = "catalog309"//args[0] - val manifestName = "manifest309" //args[1] - val fleetId = "fleet309" //args[2] - val vecName = "vehicle309" //args[3] - val decName = "decManifest309" //args[4] + if (args.size != 5) { + println(usage) + return + } + + val signalCatalogName = args[0] + val manifestName = args[1] + val fleetId = args[2] + val vecName = args[3] + val decName = args[4] println( """ diff --git a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt index 57fac5f7592..32e89ac792a 100644 --- a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt +++ b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt @@ -1,2 +1,226 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import kotlinx.coroutines.runBlocking +import org.junit.jupiter.api.MethodOrderer +import org.junit.jupiter.api.Order +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.TestInstance +import org.junit.jupiter.api.TestMethodOrder +import com.example.fleetwise.ListSignalCatalogs +import com.example.fleetwise.scenario.createDecoderManifest +import com.example.fleetwise.scenario.createFleet +import com.example.fleetwise.scenario.createModelManifest +import com.example.fleetwise.scenario.createThingIfNotExist +import com.example.fleetwise.scenario.createVehicle +import com.example.fleetwise.scenario.createbranchVehicle +import com.example.fleetwise.scenario.deleteDecoderManifest +import com.example.fleetwise.scenario.deleteFleet +import com.example.fleetwise.scenario.deleteModelManifest +import com.example.fleetwise.scenario.deleteSignalCatalog +import com.example.fleetwise.scenario.deleteVehicle +import com.example.fleetwise.scenario.getVehicleDetails +import com.example.fleetwise.scenario.listSignalCatalogNode +import com.example.fleetwise.scenario.updateDecoderManifest +import com.example.fleetwise.scenario.updateModelManifest +import com.example.fleetwise.scenario.waitForDecoderManifestActive +import com.example.fleetwise.scenario.waitForModelManifestActive +import org.junit.jupiter.api.Assertions.assertTrue + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@TestMethodOrder(MethodOrderer.OrderAnnotation::class) class FleetwiseTest { -} \ No newline at end of file + + private val signalCatalogName = "catalogTest10" + private val manifestName = "manifest10" + private val fleetName = "fleet10" + private val vecName = "vehicle10" + private val decName = "decManifest10" + private var signalCatalogArn = "" + private var fleetValue ="" + private var manifestArn = "" + private var decArn = "" + + @Test + @Order(1) + fun testHello() = runBlocking { + runCatching { + ListSignalCatalogs() + }.onSuccess { + println("Test 1 Passed Successfully!") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(2) + fun testCat() = runBlocking { + runCatching { + signalCatalogArn = createbranchVehicle(signalCatalogName) + }.onSuccess { + println("Test 2 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(3) + fun testFleet(): Unit = runBlocking { + runCatching { + fleetValue = createFleet(signalCatalogArn, fleetName) + }.onSuccess { + println("✅ Test 3 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(4) + fun testModelManifest(): Unit = runBlocking { + runCatching { + val nodes = listSignalCatalogNode(signalCatalogName); + manifestArn = nodes?.let { createModelManifest(manifestName, signalCatalogArn, it) }.toString(); + }.onSuccess { + println("✅ Test 4 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(5) + fun testDecodeManifest(): Unit = runBlocking { + runCatching { + decArn = createDecoderManifest(decName, manifestArn) + }.onSuccess { + println("✅ Test 5 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(6) + fun testManifestStatus(): Unit = runBlocking { + runCatching { + updateModelManifest(manifestName) + waitForModelManifestActive(manifestName) + }.onSuccess { + println("✅ Test 6 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(7) + fun testDecoderStatus(): Unit = runBlocking { + runCatching { + updateDecoderManifest(decName) + waitForDecoderManifestActive(decName) + }.onSuccess { + println("✅ Test 7 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(8) + fun testIoTThing(): Unit = runBlocking { + runCatching { + createThingIfNotExist(vecName) + }.onSuccess { + println("✅ Test 8 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(9) + fun testVehicle(): Unit = runBlocking { + runCatching { + createVehicle(vecName, manifestArn, decArn) + }.onSuccess { + println("✅ Test 9 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(10) + fun testGetVehicle(): Unit = runBlocking { + runCatching { + getVehicleDetails(vecName) + }.onSuccess { + println("✅ Test 10 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(11) + fun testDelVehicle() = runBlocking { + runCatching { + deleteVehicle(vecName) + }.onSuccess { + println("Test 11 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(12) + fun testDelDecoder() = runBlocking { + runCatching { + deleteDecoderManifest(decName) + }.onSuccess { + println("Test 12 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(13) + fun testDelMan() = runBlocking { + runCatching { + deleteModelManifest(manifestName) + }.onSuccess { + println("Test 13 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(14) + fun testDelFleet() = runBlocking { + runCatching { + deleteFleet(fleetName) + }.onSuccess { + println("Test 14 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } + + @Test + @Order(15) + fun testDelCat() = runBlocking { + runCatching { + deleteSignalCatalog(signalCatalogName) + }.onSuccess { + println("Test 15 Passed Successfully") + }.onFailure { + it.printStackTrace() + }.getOrThrow() + } +} From c80f54687b95d60ddfe3591d090d2f6447714488 Mon Sep 17 00:00:00 2001 From: Macdonald Date: Fri, 2 May 2025 12:24:10 -0400 Subject: [PATCH 09/19] updated the scenario --- .../fleetwise/scenario/FleetwiseScenario.kt | 31 +++++++++---------- .../src/test/java/FleetwiseTest.kt | 20 ++++++------ 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt index 4d056a7d70f..196a4e96d4c 100644 --- a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt +++ b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt @@ -265,7 +265,7 @@ suspend fun deleteVehicle(vecName:String){ IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> fleetwiseClient.deleteVehicle(request) - println("✅ Vehicle $vecName was deleted successfully.") + println("Vehicle $vecName was deleted successfully.") } } // snippet-end:[iotfleetwise.kotlin.delete.vehicle.main] @@ -288,7 +288,7 @@ suspend fun getVehicleDetails(vehicleNameVal:String) { "lastModificationTime" to response.lastModificationTime.toString() ) - println("🚗 Vehicle Details:") + println("Vehicle Details:") for ((key, value) in details) { println("• %-20s : %s".format(key, value)) } @@ -306,7 +306,7 @@ suspend fun createVehicle(vecName:String, manifestArn:String?, decArn:String){ IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> fleetwiseClient.createVehicle(request) - println("✅ Vehicle $vecName was created successfully.") + println("Vehicle $vecName was created successfully.") } } // snippet-end:[iotfleetwise.kotlin.create.vehicle.main] @@ -365,21 +365,21 @@ suspend fun waitForDecoderManifestActive(decNameVal: String) { when (lastStatus) { ManifestStatus.Active -> { - print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: ACTIVE ✅\n") + print("\rElapsed: ${elapsedSeconds}s | Status: ACTIVE ✅\n") return } ManifestStatus.Invalid -> { - print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: INVALID ❌\n") + print("\rElapsed: ${elapsedSeconds}s | Status: INVALID ❌\n") throw RuntimeException("Model manifest became INVALID. Cannot proceed.") } else -> { - print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: $lastStatus") + print("\r Elapsed: ${elapsedSeconds}s | Status: $lastStatus") } } } else { - print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: $lastStatus") + print("\r Elapsed: ${elapsedSeconds}s | Status: $lastStatus") } } } @@ -411,21 +411,21 @@ suspend fun waitForModelManifestActive(manifestNameVal: String) { when (lastStatus) { ManifestStatus.Active -> { - print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: ACTIVE ✅\n") + print("\r Elapsed: ${elapsedSeconds}s | Status: ACTIVE ✅\n") return } ManifestStatus.Invalid -> { - print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: INVALID ❌\n") + print("\r Elapsed: ${elapsedSeconds}s | Status: INVALID ❌\n") throw RuntimeException("Model manifest became INVALID. Cannot proceed.") } else -> { - print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: $lastStatus") + print("\r Elapsed: ${elapsedSeconds}s | Status: $lastStatus") } } } else { - print("\r⏱️ Elapsed: ${elapsedSeconds}s | Status: $lastStatus") + print("\r Elapsed: ${elapsedSeconds}s | Status: $lastStatus") } } } @@ -450,7 +450,6 @@ suspend fun updateModelManifest(nameVal:String) { } // snippet-end:[iotfleetwise.kotlin.update.manifest.main] - // snippet-start:[iotfleetwise.kotlin.delete.decoder.main] suspend fun deleteDecoderManifest(nameVal:String) { val request = DeleteDecoderManifestRequest{ @@ -459,7 +458,7 @@ suspend fun deleteDecoderManifest(nameVal:String) { IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> fleetwiseClient.deleteDecoderManifest(request) - println("✅ $nameVal was successfully deleted") + println("$nameVal was successfully deleted") } } // snippet-end:[iotfleetwise.kotlin.delete.decoder.main] @@ -547,7 +546,7 @@ suspend fun deleteSignalCatalog(catName: String) { } IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> fleetwiseClient.deleteSignalCatalog(request) - println("✅ $catName was successfully deleted") + println(" $catName was successfully deleted") } } // snippet-end:[iotfleetwise.kotlin.delete.catalog.main] @@ -565,7 +564,7 @@ suspend fun deleteFleet(fleetIdVal: String) { IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> fleetwiseClient.deleteFleet(request) - println("✅ $fleetIdVal was successfully deleted") + println(" $fleetIdVal was successfully deleted") } } // snippet-end:[iotfleetwise.kotlin.delete.fleet.main] @@ -582,7 +581,7 @@ suspend fun deleteModelManifest(nameVal: String) { } IotFleetWiseClient { region = "us-east-1" }.use { fleetwiseClient -> fleetwiseClient.deleteModelManifest(request) - println("✅ $nameVal was successfully deleted") + println(" $nameVal was successfully deleted") } } // snippet-end:[iotfleetwise.kotlin.delete.model.main] diff --git a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt index 32e89ac792a..87d773607ab 100644 --- a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt +++ b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt @@ -25,17 +25,15 @@ import com.example.fleetwise.scenario.updateDecoderManifest import com.example.fleetwise.scenario.updateModelManifest import com.example.fleetwise.scenario.waitForDecoderManifestActive import com.example.fleetwise.scenario.waitForModelManifestActive -import org.junit.jupiter.api.Assertions.assertTrue @TestInstance(TestInstance.Lifecycle.PER_CLASS) @TestMethodOrder(MethodOrderer.OrderAnnotation::class) class FleetwiseTest { - private val signalCatalogName = "catalogTest10" private val manifestName = "manifest10" private val fleetName = "fleet10" private val vecName = "vehicle10" - private val decName = "decManifest10" + private val decName = "decManifest10" private var signalCatalogArn = "" private var fleetValue ="" private var manifestArn = "" @@ -71,7 +69,7 @@ class FleetwiseTest { runCatching { fleetValue = createFleet(signalCatalogArn, fleetName) }.onSuccess { - println("✅ Test 3 Passed Successfully") + println("Test 3 Passed Successfully") }.onFailure { it.printStackTrace() }.getOrThrow() @@ -84,7 +82,7 @@ class FleetwiseTest { val nodes = listSignalCatalogNode(signalCatalogName); manifestArn = nodes?.let { createModelManifest(manifestName, signalCatalogArn, it) }.toString(); }.onSuccess { - println("✅ Test 4 Passed Successfully") + println("Test 4 Passed Successfully") }.onFailure { it.printStackTrace() }.getOrThrow() @@ -96,7 +94,7 @@ class FleetwiseTest { runCatching { decArn = createDecoderManifest(decName, manifestArn) }.onSuccess { - println("✅ Test 5 Passed Successfully") + println("Test 5 Passed Successfully") }.onFailure { it.printStackTrace() }.getOrThrow() @@ -109,7 +107,7 @@ class FleetwiseTest { updateModelManifest(manifestName) waitForModelManifestActive(manifestName) }.onSuccess { - println("✅ Test 6 Passed Successfully") + println("Test 6 Passed Successfully") }.onFailure { it.printStackTrace() }.getOrThrow() @@ -122,7 +120,7 @@ class FleetwiseTest { updateDecoderManifest(decName) waitForDecoderManifestActive(decName) }.onSuccess { - println("✅ Test 7 Passed Successfully") + println("Test 7 Passed Successfully") }.onFailure { it.printStackTrace() }.getOrThrow() @@ -134,7 +132,7 @@ class FleetwiseTest { runCatching { createThingIfNotExist(vecName) }.onSuccess { - println("✅ Test 8 Passed Successfully") + println("Test 8 Passed Successfully") }.onFailure { it.printStackTrace() }.getOrThrow() @@ -146,7 +144,7 @@ class FleetwiseTest { runCatching { createVehicle(vecName, manifestArn, decArn) }.onSuccess { - println("✅ Test 9 Passed Successfully") + println("Test 9 Passed Successfully") }.onFailure { it.printStackTrace() }.getOrThrow() @@ -158,7 +156,7 @@ class FleetwiseTest { runCatching { getVehicleDetails(vecName) }.onSuccess { - println("✅ Test 10 Passed Successfully") + println("Test 10 Passed Successfully") }.onFailure { it.printStackTrace() }.getOrThrow() From a75eb1bed101e35c921f6354274b03193f73bfa3 Mon Sep 17 00:00:00 2001 From: Macdonald Date: Fri, 2 May 2025 14:59:28 -0400 Subject: [PATCH 10/19] fixed linter issue --- .../fleetwise/scenario/FleetwiseScenario.kt | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt index 196a4e96d4c..1b278d6047d 100644 --- a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt +++ b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt @@ -94,15 +94,20 @@ suspend fun main(args: Array) { manufacturers to optimize vehicle performance, improve safety, and reduce maintenance costs by gaining real-time visibility into fleet operations. - - """.trimIndent(), + """.trimIndent(), ) waitForInputToContinue(scanner) println(DASHES) runScenario(signalCatalogName, fleetId, manifestName, decName, vecName) } -suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestName: String, decName:String, vecName:String) { +suspend fun runScenario( + signalCatalogName: String, + fleetIdVal: String, + manifestName: String, + decName: String, + vecName: String +) { println(DASHES) println("1. Creates a collection of standardized signals that can be reused to create vehicle models") waitForInputToContinue(scanner) @@ -122,7 +127,6 @@ suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestN It helps reduce data costs by allowing you to filter and prioritize only the most relevant vehicle signals, supporting advanced analytics and predictive maintenance use cases. - """.trimIndent(), ) waitForInputToContinue(scanner) @@ -141,7 +145,6 @@ suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestN which signals to collect and how they relate to vehicle systems, while the decoder manifest defines how to decode raw vehicle data into meaningful signals. - """.trimIndent(), ) waitForInputToContinue(scanner) @@ -161,7 +164,6 @@ suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestN using decoding rules. This is crucial for extracting usable data from different vehicle models, even when their data formats vary. - """.trimIndent(), ) waitForInputToContinue(scanner) @@ -258,8 +260,8 @@ suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestN } // snippet-start:[iotfleetwise.kotlin.delete.vehicle.main] -suspend fun deleteVehicle(vecName:String){ - val request = DeleteVehicleRequest { +suspend fun deleteVehicle(vecName: String) { + val request = DeleteVehicleRequest { vehicleName = vecName } @@ -271,7 +273,7 @@ suspend fun deleteVehicle(vecName:String){ // snippet-end:[iotfleetwise.kotlin.delete.vehicle.main] // snippet-start:[iotfleetwise.kotlin.get.vehicle.main] -suspend fun getVehicleDetails(vehicleNameVal:String) { +suspend fun getVehicleDetails(vehicleNameVal: String) { val request = GetVehicleRequest { vehicleName = vehicleNameVal } @@ -297,7 +299,7 @@ suspend fun getVehicleDetails(vehicleNameVal:String) { // snippet-end:[iotfleetwise.kotlin.get.vehicle.main] // snippet-start:[iotfleetwise.kotlin.create.vehicle.main] -suspend fun createVehicle(vecName:String, manifestArn:String?, decArn:String){ +suspend fun createVehicle(vecName: String, manifestArn: String?, decArn: String) { val request = CreateVehicleRequest { vehicleName = vecName modelManifestArn = manifestArn @@ -316,9 +318,9 @@ suspend fun createVehicle(vecName:String, manifestArn:String?, decArn:String){ * * @param vecName the name of the IoT Thing to create */ -suspend fun createThingIfNotExist(vecName: String){ +suspend fun createThingIfNotExist(vecName: String) { val request = CreateThingRequest { - thingName= vecName + thingName = vecName } IotClient { region = "us-east-1" }.use { client -> @@ -328,7 +330,7 @@ suspend fun createThingIfNotExist(vecName: String){ } // snippet-start:[iotfleetwise.kotlin.update.decoder.main] -suspend fun updateDecoderManifest(nameVal:String) { +suspend fun updateDecoderManifest(nameVal: String) { val request = UpdateDecoderManifestRequest { name = nameVal status = ManifestStatus.Active @@ -342,10 +344,10 @@ suspend fun updateDecoderManifest(nameVal:String) { // snippet-start:[iotfleetwise.kotlin.decoder.active.main] /** -* Waits for the specified model manifest to become active. -* -* @param decNameVal the name of the model manifest to wait for -*/ + * Waits for the specified model manifest to become active. + * + * @param decNameVal the name of the model manifest to wait for + */ suspend fun waitForDecoderManifestActive(decNameVal: String) { var elapsedSeconds = 0 var lastStatus: ManifestStatus = ManifestStatus.Draft @@ -438,7 +440,7 @@ suspend fun waitForModelManifestActive(manifestNameVal: String) { * * @param nameVal the name of the model manifest to update */ -suspend fun updateModelManifest(nameVal:String) { +suspend fun updateModelManifest(nameVal: String) { val request = UpdateModelManifestRequest { name = nameVal status = ManifestStatus.Active @@ -451,8 +453,8 @@ suspend fun updateModelManifest(nameVal:String) { // snippet-end:[iotfleetwise.kotlin.update.manifest.main] // snippet-start:[iotfleetwise.kotlin.delete.decoder.main] -suspend fun deleteDecoderManifest(nameVal:String) { - val request = DeleteDecoderManifestRequest{ +suspend fun deleteDecoderManifest(nameVal: String) { + val request = DeleteDecoderManifestRequest { name = nameVal } @@ -471,7 +473,7 @@ suspend fun deleteDecoderManifest(nameVal:String) { * @param modelManifestArnVal the ARN of the model manifest * @return the ARN of the decoder manifest */ -suspend fun createDecoderManifest(decName:String, modelManifestArnVal:String?):String { +suspend fun createDecoderManifest(decName: String, modelManifestArnVal: String?): String { val interfaceIdVal = "can0" val canInter = CanInterface { @@ -481,9 +483,9 @@ suspend fun createDecoderManifest(decName:String, modelManifestArnVal:String?):S } val networkInterface = NetworkInterface { - interfaceId = interfaceIdVal - type = NetworkInterfaceType.CanInterface - canInterface = canInter + interfaceId = interfaceIdVal + type = NetworkInterfaceType.CanInterface + canInterface = canInter } val carRpmSig = CanSignal { @@ -520,7 +522,7 @@ suspend fun createDecoderManifest(decName:String, modelManifestArnVal:String?):S canSignal = carSpeedSig } - val request = CreateDecoderManifestRequest { + val request = CreateDecoderManifestRequest { name = decName modelManifestArn = modelManifestArnVal networkInterfaces = listOf(networkInterface) From 85dde4fa672f2ac7bdf6d8611ee7e0c6cced2f6f Mon Sep 17 00:00:00 2001 From: Macdonald Date: Fri, 2 May 2025 15:02:45 -0400 Subject: [PATCH 11/19] fixed linter issue --- .../java/com/example/fleetwise/scenario/FleetwiseScenario.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt index 1b278d6047d..b42dee144c4 100644 --- a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt +++ b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt @@ -106,8 +106,7 @@ suspend fun runScenario( fleetIdVal: String, manifestName: String, decName: String, - vecName: String -) { + vecName: String){ println(DASHES) println("1. Creates a collection of standardized signals that can be reused to create vehicle models") waitForInputToContinue(scanner) From e8c87669857ddf4074cbb06a670e6124afcb6359 Mon Sep 17 00:00:00 2001 From: Macdonald Date: Fri, 2 May 2025 15:05:20 -0400 Subject: [PATCH 12/19] fixed linter issue --- .../com/example/fleetwise/scenario/FleetwiseScenario.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt index b42dee144c4..4f65c218302 100644 --- a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt +++ b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt @@ -101,12 +101,7 @@ suspend fun main(args: Array) { runScenario(signalCatalogName, fleetId, manifestName, decName, vecName) } -suspend fun runScenario( - signalCatalogName: String, - fleetIdVal: String, - manifestName: String, - decName: String, - vecName: String){ +suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestName: String, decName: String, vecName: String) { println(DASHES) println("1. Creates a collection of standardized signals that can be reused to create vehicle models") waitForInputToContinue(scanner) From a623b3b92d62bf829ac96203de9fea4ec4d94b4c Mon Sep 17 00:00:00 2001 From: Macdonald Date: Fri, 2 May 2025 15:10:22 -0400 Subject: [PATCH 13/19] fixed linter issue --- .../fleetwise/scenario/FleetwiseScenario.kt | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt index 4f65c218302..0a0d0b987fb 100644 --- a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt +++ b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt @@ -142,8 +142,8 @@ suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestN """.trimIndent(), ) waitForInputToContinue(scanner) - val nodes = listSignalCatalogNode(signalCatalogName); - val manifestArn = nodes?.let { createModelManifest(manifestName, signalCatalogArn, it) }; + val nodes = listSignalCatalogNode(signalCatalogName) + val manifestArn = nodes?.let { createModelManifest(manifestName, signalCatalogArn, it) } println("The manifest ARN is $manifestArn") println(DASHES) @@ -194,8 +194,8 @@ suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestN waitForInputToContinue(scanner) println(DASHES) - println(DASHES); - println("7. Create an IoT Thing"); + println(DASHES) + println("7. Create an IoT Thing") println( """ AWS IoT FleetWise expects an existing AWS IoT Thing with the same @@ -204,12 +204,12 @@ suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestN with the same name using the AWS IoT Core service. """.trimIndent(), ) - waitForInputToContinue(scanner); + waitForInputToContinue(scanner) createThingIfNotExist(vecName) - println(DASHES); + println(DASHES) - println(DASHES); - println("8. Create a vehicle"); + println(DASHES) + println("8. Create a vehicle") println( """ Creating a vehicle in AWS IoT FleetWise allows you to digitally @@ -218,21 +218,20 @@ suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestN of vehicle telemetry data to the cloud for analysis. """.trimIndent(), ) - waitForInputToContinue(scanner); + waitForInputToContinue(scanner) createVehicle(vecName, manifestArn, decArn) - println(DASHES); + println(DASHES) - println(DASHES); - println("9. Display vehicle details"); - waitForInputToContinue(scanner); + println(DASHES) + println("9. Display vehicle details") + waitForInputToContinue(scanner) getVehicleDetails(vecName) - waitForInputToContinue(scanner); - println(DASHES); - - println(DASHES); - println("10. Delete the AWS IoT Fleetwise Assets"); - println("Would you like to delete the IoT Fleetwise Assets? (y/n)"); - val delAns = scanner.nextLine().trim(); + waitForInputToContinue(scanner) + println(DASHES) + println(DASHES) + println("10. Delete the AWS IoT Fleetwise Assets") + println("Would you like to delete the IoT Fleetwise Assets? (y/n)") + val delAns = scanner.nextLine().trim() if (delAns.equals("y", ignoreCase = true)) { deleteVehicle(vecName) deleteDecoderManifest(decName) @@ -241,7 +240,7 @@ suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestN deleteSignalCatalog(signalCatalogName) } - println(DASHES); + println(DASHES) println( """ Thank you for checking out the AWS IoT Fleetwise Service Use demo. We hope you @@ -250,7 +249,7 @@ suspend fun runScenario(signalCatalogName: String, fleetIdVal: String, manifestN https://docs.aws.amazon.com/code-library/latest/ug/what-is-code-library.html """.trimIndent(), ) - println(DASHES); + println(DASHES) } // snippet-start:[iotfleetwise.kotlin.delete.vehicle.main] @@ -723,4 +722,4 @@ private fun waitForInputToContinue(scanner: Scanner) { } } } -// snippet-end:[iotfleetwise.kotlin.scenario.main] \ No newline at end of file +// snippet-end:[iotfleetwise.kotlin.scenario.main] From 377237cae3369b1eeb1ba055bef8c393b81534fc Mon Sep 17 00:00:00 2001 From: Macdonald Date: Fri, 2 May 2025 15:14:09 -0400 Subject: [PATCH 14/19] fixed linter issue --- .../src/main/java/com/example/fleetwise/HelloFleetwise.kt | 5 ++--- .../java/com/example/fleetwise/scenario/FleetwiseScenario.kt | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/HelloFleetwise.kt b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/HelloFleetwise.kt index a9ec1bd1a16..25732b84c39 100644 --- a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/HelloFleetwise.kt +++ b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/HelloFleetwise.kt @@ -6,7 +6,6 @@ package com.example.fleetwise import aws.sdk.kotlin.services.iotfleetwise.IotFleetWiseClient import aws.sdk.kotlin.services.iotfleetwise.model.ListSignalCatalogsRequest - // snippet-start:[iotfleetwise.kotlin.hello.main] /** Before running this Kotlin code example, set up your development environment, @@ -16,13 +15,13 @@ For more information, see the following documentation topic: https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/setup.html */ suspend fun main() { - ListSignalCatalogs() + listSignalCatalogs() } /** * Lists the AWS FleetWise Signal Catalogs associated with the current AWS account. */ -suspend fun ListSignalCatalogs() { +suspend fun listSignalCatalogs() { val request = ListSignalCatalogsRequest { maxResults = 10 } diff --git a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt index 0a0d0b987fb..43b69e1f949 100644 --- a/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt +++ b/kotlin/services/iotfleetwise/src/main/java/com/example/fleetwise/scenario/FleetwiseScenario.kt @@ -280,7 +280,7 @@ suspend fun getVehicleDetails(vehicleNameVal: String) { "decoderManifestArn" to response.decoderManifestArn, "attributes" to response.attributes.toString(), "creationTime" to response.creationTime.toString(), - "lastModificationTime" to response.lastModificationTime.toString() + "lastModificationTime" to response.lastModificationTime.toString(), ) println("Vehicle Details:") @@ -692,7 +692,7 @@ suspend fun createbranchVehicle(signalCatalogName: String): String { Node.Branch(branchVehicle), Node.Branch(branchPowertrain), Node.Sensor(sensorRPM), - Node.Sensor(sensorKM) + Node.Sensor(sensorKM), ) val request = CreateSignalCatalogRequest { From 5526c6f7f2b2be71e48fddee084ce895976577b4 Mon Sep 17 00:00:00 2001 From: Macdonald Date: Fri, 2 May 2025 15:17:29 -0400 Subject: [PATCH 15/19] fixed linter issue --- kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt index 87d773607ab..67c9b24f72d 100644 --- a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt +++ b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Order import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance import org.junit.jupiter.api.TestMethodOrder -import com.example.fleetwise.ListSignalCatalogs +import com.example.fleetwise.listSignalCatalogs import com.example.fleetwise.scenario.createDecoderManifest import com.example.fleetwise.scenario.createFleet import com.example.fleetwise.scenario.createModelManifest @@ -26,6 +26,7 @@ import com.example.fleetwise.scenario.updateModelManifest import com.example.fleetwise.scenario.waitForDecoderManifestActive import com.example.fleetwise.scenario.waitForModelManifestActive + @TestInstance(TestInstance.Lifecycle.PER_CLASS) @TestMethodOrder(MethodOrderer.OrderAnnotation::class) class FleetwiseTest { @@ -43,7 +44,7 @@ class FleetwiseTest { @Order(1) fun testHello() = runBlocking { runCatching { - ListSignalCatalogs() + listSignalCatalogs() }.onSuccess { println("Test 1 Passed Successfully!") }.onFailure { From 15d11d2b6e88403065ff9d30a6e9acd44420ef32 Mon Sep 17 00:00:00 2001 From: Macdonald Date: Fri, 2 May 2025 15:21:46 -0400 Subject: [PATCH 16/19] fixed linter issue --- kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt index 67c9b24f72d..d637172360b 100644 --- a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt +++ b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt @@ -26,7 +26,6 @@ import com.example.fleetwise.scenario.updateModelManifest import com.example.fleetwise.scenario.waitForDecoderManifestActive import com.example.fleetwise.scenario.waitForModelManifestActive - @TestInstance(TestInstance.Lifecycle.PER_CLASS) @TestMethodOrder(MethodOrderer.OrderAnnotation::class) class FleetwiseTest { From 011aba67d14af9ed1de3d50603e1be9c4a79768d Mon Sep 17 00:00:00 2001 From: Macdonald Date: Fri, 2 May 2025 15:25:07 -0400 Subject: [PATCH 17/19] fixed linter issue --- .../services/iotfleetwise/src/test/java/FleetwiseTest.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt index d637172360b..92732f6e9a5 100644 --- a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt +++ b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt @@ -35,7 +35,7 @@ class FleetwiseTest { private val vecName = "vehicle10" private val decName = "decManifest10" private var signalCatalogArn = "" - private var fleetValue ="" + private var fleetValue = "" private var manifestArn = "" private var decArn = "" @@ -61,7 +61,7 @@ class FleetwiseTest { }.onFailure { it.printStackTrace() }.getOrThrow() - } + } @Test @Order(3) @@ -79,8 +79,8 @@ class FleetwiseTest { @Order(4) fun testModelManifest(): Unit = runBlocking { runCatching { - val nodes = listSignalCatalogNode(signalCatalogName); - manifestArn = nodes?.let { createModelManifest(manifestName, signalCatalogArn, it) }.toString(); + val nodes = listSignalCatalogNode(signalCatalogName) + manifestArn = nodes?.let { createModelManifest(manifestName, signalCatalogArn, it) }.toString() }.onSuccess { println("Test 4 Passed Successfully") }.onFailure { From d440878a0fa568223a1c11e1324a928767fdd603 Mon Sep 17 00:00:00 2001 From: Macdonald Date: Fri, 2 May 2025 15:28:41 -0400 Subject: [PATCH 18/19] fixed linter issue --- .../iotfleetwise/src/test/java/FleetwiseTest.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt index 92732f6e9a5..9af13545a99 100644 --- a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt +++ b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt @@ -2,11 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 import kotlinx.coroutines.runBlocking -import org.junit.jupiter.api.MethodOrderer -import org.junit.jupiter.api.Order -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.TestInstance -import org.junit.jupiter.api.TestMethodOrder import com.example.fleetwise.listSignalCatalogs import com.example.fleetwise.scenario.createDecoderManifest import com.example.fleetwise.scenario.createFleet @@ -25,6 +20,11 @@ import com.example.fleetwise.scenario.updateDecoderManifest import com.example.fleetwise.scenario.updateModelManifest import com.example.fleetwise.scenario.waitForDecoderManifestActive import com.example.fleetwise.scenario.waitForModelManifestActive +import org.junit.jupiter.api.MethodOrderer +import org.junit.jupiter.api.Order +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.TestInstance +import org.junit.jupiter.api.TestMethodOrder @TestInstance(TestInstance.Lifecycle.PER_CLASS) @TestMethodOrder(MethodOrderer.OrderAnnotation::class) @@ -35,7 +35,7 @@ class FleetwiseTest { private val vecName = "vehicle10" private val decName = "decManifest10" private var signalCatalogArn = "" - private var fleetValue = "" + private var fleetValue = "" private var manifestArn = "" private var decArn = "" From 264488575abd3f784ff58eb9cd1fc5db9a254875 Mon Sep 17 00:00:00 2001 From: Macdonald Date: Fri, 2 May 2025 15:32:18 -0400 Subject: [PATCH 19/19] fixed linter issue --- kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt index 9af13545a99..6d2ac1aa067 100644 --- a/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt +++ b/kotlin/services/iotfleetwise/src/test/java/FleetwiseTest.kt @@ -1,7 +1,6 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import kotlinx.coroutines.runBlocking import com.example.fleetwise.listSignalCatalogs import com.example.fleetwise.scenario.createDecoderManifest import com.example.fleetwise.scenario.createFleet @@ -20,6 +19,7 @@ import com.example.fleetwise.scenario.updateDecoderManifest import com.example.fleetwise.scenario.updateModelManifest import com.example.fleetwise.scenario.waitForDecoderManifestActive import com.example.fleetwise.scenario.waitForModelManifestActive +import kotlinx.coroutines.runBlocking import org.junit.jupiter.api.MethodOrderer import org.junit.jupiter.api.Order import org.junit.jupiter.api.Test