Skip to content

Commit b43b0fd

Browse files
authoredNov 16, 2023
Implement fleet provisioning test (#501)
1 parent e705cc7 commit b43b0fd

File tree

17 files changed

+835
-12
lines changed

17 files changed

+835
-12
lines changed
 

‎.github/workflows/ci.yml

+26-1
Original file line numberDiff line numberDiff line change
@@ -465,12 +465,37 @@ jobs:
465465
run: |
466466
java -version
467467
mvn install -Dmaven.test.skip
468-
- name: Running samples in CI setup
468+
- name: Running samples and service client tests in CI setup
469469
run: |
470470
python3 -m pip install boto3
471471
sudo apt-get update -y
472472
sudo apt-get install softhsm -y
473473
softhsm2-util --version
474+
- name: configure AWS credentials (Fleet provisioning)
475+
uses: aws-actions/configure-aws-credentials@v2
476+
with:
477+
role-to-assume: ${{ env.CI_FLEET_PROVISIONING_ROLE }}
478+
aws-region: ${{ env.AWS_DEFAULT_REGION }}
479+
- name: run Fleet Provisioning service client test for MQTT311
480+
working-directory: ./servicetests
481+
run: |
482+
export PYTHONPATH=${{ github.workspace }}/utils
483+
python3 ./test_cases/test_fleet_provisioning.py --thing-name-prefix Fleet_Thing_ --mqtt-version 3
484+
- name: run Fleet Provisioning service client test for MQTT5
485+
working-directory: ./servicetests
486+
run: |
487+
export PYTHONPATH=${{ github.workspace }}/utils
488+
python3 ./test_cases/test_fleet_provisioning.py --thing-name-prefix Fleet_Thing_ --mqtt-version 5
489+
- name: run Fleet Provisioning with CSR service client test for MQTT311
490+
working-directory: ./servicetests
491+
run: |
492+
export PYTHONPATH=${{ github.workspace }}/utils
493+
python3 ./test_cases/test_fleet_provisioning.py --thing-name-prefix Fleet_Thing_ --mqtt-version 3 --use-csr
494+
- name: run Fleet Provisioning with CSR service client test for MQTT5
495+
working-directory: ./servicetests
496+
run: |
497+
export PYTHONPATH=${{ github.workspace }}/utils
498+
python3 ./test_cases/test_fleet_provisioning.py --thing-name-prefix Fleet_Thing_ --mqtt-version 5 --use-csr
474499
- name: configure AWS credentials (Connect and PubSub)
475500
uses: aws-actions/configure-aws-credentials@v2
476501
with:

‎.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -185,3 +185,6 @@ bin/
185185

186186
# docs are updated automatically by .github/workflows/docs.yml
187187
docs/
188+
189+
# Python cache
190+
__pycache__

‎samples/Utils/CommandLineUtils/utils/commandlineutils/CommandLineUtils.java

+7
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,10 @@ private void parseCommonLoggingCommands(SampleCommandLineData returnData){
234234
}
235235
}
236236

237+
private void parseMqttVersion(SampleCommandLineData returnData) {
238+
returnData.input_mqtt_version = Integer.parseInt(getCommandOrDefault(m_cmd_mqtt_version, "3"));
239+
}
240+
237241
private void parseCommonMQTTCommands(SampleCommandLineData returnData) {
238242
returnData.input_endpoint = getCommandRequired(m_cmd_endpoint);
239243
returnData.input_ca = getCommandOrDefault(m_cmd_ca_file, "");
@@ -290,6 +294,7 @@ public class SampleCommandLineData
290294
public String input_ca;
291295
public String input_clientId;
292296
public int input_port;
297+
public int input_mqtt_version;
293298
// Proxy
294299
public String input_proxyHost;
295300
public int input_proxyPort;
@@ -458,6 +463,7 @@ public SampleCommandLineData parseSampleInputFleetProvisioning(String [] args)
458463
sendArguments(args);
459464

460465
SampleCommandLineData returnData = new SampleCommandLineData();
466+
parseMqttVersion(returnData);
461467
parseCommonLoggingCommands(returnData);
462468
parseCommonMQTTCommands(returnData);
463469
parseKeyAndCertCommands(returnData);
@@ -749,6 +755,7 @@ public static SampleCommandLineData getInputForIoTSample(String sampleName, Stri
749755
/**
750756
* Constants for commonly used/needed commands
751757
*/
758+
private static final String m_cmd_mqtt_version = "mqtt_version";
752759
private static final String m_cmd_log_destination = "log_destination";
753760
private static final String m_cmd_log_file_name = "log_file_name";
754761
private static final String m_cmd_verbosity = "verbosity";

‎servicetests/pom.xml

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<groupId>software.amazon.awssdk.iotdevicesdk</groupId>
5+
<artifactId>ServiceClientTests</artifactId>
6+
<packaging>pom</packaging>
7+
<version>1.0-SNAPSHOT</version>
8+
9+
<dependencies>
10+
<dependency>
11+
<groupId>software.amazon.awssdk.iotdevicesdk</groupId>
12+
<artifactId>aws-iot-device-sdk</artifactId>
13+
<version>1.0.0-SNAPSHOT</version>
14+
</dependency>
15+
</dependencies>
16+
<modules>
17+
<module>tests/FleetProvisioning</module>
18+
</modules>
19+
20+
<build>
21+
<plugins>
22+
<plugin>
23+
<groupId>org.codehaus.mojo</groupId>
24+
<artifactId>versions-maven-plugin</artifactId>
25+
<version>2.7</version>
26+
</plugin>
27+
</plugins>
28+
</build>
29+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"language": "Java",
3+
"runnable_file": "tests/FleetProvisioning",
4+
"runnable_region": "us-east-1",
5+
"runnable_main_class": "fleetProvisioning.FleetProvisioning",
6+
"arguments": [
7+
{
8+
"name": "--mqtt_version",
9+
"data": 3
10+
},
11+
{
12+
"name": "--endpoint",
13+
"secret": "ci/endpoint"
14+
},
15+
{
16+
"name": "--cert",
17+
"secret": "ci/FleetProvisioning/cert",
18+
"filename": "tmp_certificate.pem"
19+
},
20+
{
21+
"name": "--key",
22+
"secret": "ci/FleetProvisioning/key",
23+
"filename": "tmp_key.pem"
24+
},
25+
{
26+
"name": "--template_name",
27+
"data": "CI_FleetProvisioning_Template"
28+
},
29+
{
30+
"name": "--template_parameters",
31+
"data": "{SerialNumber:$INPUT_UUID}"
32+
}
33+
]
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{
2+
"language": "Java",
3+
"runnable_file": "tests/FleetProvisioning",
4+
"runnable_region": "us-east-1",
5+
"runnable_main_class": "fleetProvisioning.FleetProvisioning",
6+
"arguments": [
7+
{
8+
"name": "--mqtt_version",
9+
"data": 3
10+
},
11+
{
12+
"name": "--endpoint",
13+
"secret": "ci/endpoint"
14+
},
15+
{
16+
"name": "--cert",
17+
"secret": "ci/FleetProvisioning/cert",
18+
"filename": "tmp_certificate.pem"
19+
},
20+
{
21+
"name": "--key",
22+
"secret": "ci/FleetProvisioning/key",
23+
"filename": "tmp_key.pem"
24+
},
25+
{
26+
"name": "--csr",
27+
"secret": "ci/FleetProvisioning/csr",
28+
"filename": "tmp_csr.pem"
29+
},
30+
{
31+
"name": "--template_name",
32+
"data": "CI_FleetProvisioning_Template"
33+
},
34+
{
35+
"name": "--template_parameters",
36+
"data": "{SerialNumber:$INPUT_UUID}"
37+
}
38+
]
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"language": "Java",
3+
"runnable_file": "tests/FleetProvisioning",
4+
"runnable_region": "us-east-1",
5+
"runnable_main_class": "fleetProvisioning.FleetProvisioning",
6+
"arguments": [
7+
{
8+
"name": "--mqtt_version",
9+
"data": 5
10+
},
11+
{
12+
"name": "--endpoint",
13+
"secret": "ci/endpoint"
14+
},
15+
{
16+
"name": "--cert",
17+
"secret": "ci/FleetProvisioning/cert",
18+
"filename": "tmp_certificate.pem"
19+
},
20+
{
21+
"name": "--key",
22+
"secret": "ci/FleetProvisioning/key",
23+
"filename": "tmp_key.pem"
24+
},
25+
{
26+
"name": "--template_name",
27+
"data": "CI_FleetProvisioning_Template"
28+
},
29+
{
30+
"name": "--template_parameters",
31+
"data": "{SerialNumber:$INPUT_UUID}"
32+
}
33+
]
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{
2+
"language": "Java",
3+
"runnable_file": "tests/FleetProvisioning",
4+
"runnable_region": "us-east-1",
5+
"runnable_main_class": "fleetProvisioning.FleetProvisioning",
6+
"arguments": [
7+
{
8+
"name": "--mqtt_version",
9+
"data": 5
10+
},
11+
{
12+
"name": "--endpoint",
13+
"secret": "ci/endpoint"
14+
},
15+
{
16+
"name": "--cert",
17+
"secret": "ci/FleetProvisioning/cert",
18+
"filename": "tmp_certificate.pem"
19+
},
20+
{
21+
"name": "--key",
22+
"secret": "ci/FleetProvisioning/key",
23+
"filename": "tmp_key.pem"
24+
},
25+
{
26+
"name": "--csr",
27+
"secret": "ci/FleetProvisioning/csr",
28+
"filename": "tmp_csr.pem"
29+
},
30+
{
31+
"name": "--template_name",
32+
"data": "CI_FleetProvisioning_Template"
33+
},
34+
{
35+
"name": "--template_parameters",
36+
"data": "{SerialNumber:$INPUT_UUID}"
37+
}
38+
]
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
# SPDX-License-Identifier: Apache-2.0.
3+
4+
import argparse
5+
import uuid
6+
import os
7+
import sys
8+
import run_in_ci
9+
import ci_iot_thing
10+
11+
12+
def main():
13+
argument_parser = argparse.ArgumentParser(
14+
description="Run Fleet Provisioning test in CI")
15+
argument_parser.add_argument(
16+
"--input-uuid", required=False, help="UUID for thing name. UUID will be generated if this option is omit")
17+
argument_parser.add_argument(
18+
"--thing-name-prefix", required=False, default="",
19+
help="Prefix for a thing name, should be the same that Fleet Provisioning template uses")
20+
argument_parser.add_argument(
21+
"--region", required=False, default="us-east-1", help="The name of the region to use")
22+
argument_parser.add_argument(
23+
"--mqtt-version", required=True, choices=[3, 5], type=int, help="MQTT protocol version to use")
24+
argument_parser.add_argument(
25+
"--use-csr", required=False, default=False, action='store_true', help="Create certificate from CSR")
26+
parsed_commands = argument_parser.parse_args()
27+
28+
current_path = os.path.dirname(os.path.realpath(__file__))
29+
cfg_file_mqtt_version = "mqtt3_" if parsed_commands.mqtt_version == 3 else "mqtt5_"
30+
cfg_file_csr = "with_csr_" if parsed_commands.use_csr else ""
31+
cfg_file = os.path.join(current_path, cfg_file_mqtt_version + "fleet_provisioning_" + cfg_file_csr + "cfg.json")
32+
input_uuid = parsed_commands.input_uuid if parsed_commands.input_uuid else str(uuid.uuid4())
33+
34+
# Perform fleet provisioning. If it's successful, a newly created thing should appear.
35+
test_result = run_in_ci.setup_and_launch(cfg_file, input_uuid)
36+
37+
# Delete a thing created by fleet provisioning. If this fails, we assume that's because fleet provisioning failed to
38+
# create a thing.
39+
# NOTE We want to try to delete thing even if test was unsuccessful.
40+
thing_name = parsed_commands.thing_name_prefix + input_uuid
41+
try:
42+
delete_result = ci_iot_thing.delete_iot_thing(thing_name, parsed_commands.region)
43+
except Exception as e:
44+
print(f"ERROR: Failed to delete thing: {e}")
45+
test_result = -1
46+
47+
if test_result != 0:
48+
sys.exit(-1)
49+
50+
51+
if __name__ == "__main__":
52+
main()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<groupId>software.amazon.awssdk.iotdevicesdk</groupId>
5+
<artifactId>FleetProvisioningServiceTest</artifactId>
6+
<packaging>jar</packaging>
7+
<version>1.0-SNAPSHOT</version>
8+
<name>${project.groupId}:${project.artifactId}</name>
9+
<description>Java bindings for the AWS IoT Core Service</description>
10+
<url>https://github.com/awslabs/aws-iot-device-sdk-java-v2</url>
11+
<properties>
12+
<maven.compiler.source>1.8</maven.compiler.source>
13+
<maven.compiler.target>1.8</maven.compiler.target>
14+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15+
</properties>
16+
<dependencies>
17+
<dependency>
18+
<groupId>software.amazon.awssdk.iotdevicesdk</groupId>
19+
<artifactId>aws-iot-device-sdk</artifactId>
20+
<version>1.0.0-SNAPSHOT</version>
21+
</dependency>
22+
</dependencies>
23+
<build>
24+
<plugins>
25+
<plugin>
26+
<groupId>org.codehaus.mojo</groupId>
27+
<artifactId>build-helper-maven-plugin</artifactId>
28+
<version>3.2.0</version>
29+
<executions>
30+
<execution>
31+
<id>add-source</id>
32+
<phase>generate-sources</phase>
33+
<goals>
34+
<goal>add-source</goal>
35+
</goals>
36+
<configuration>
37+
<sources>
38+
<source>../../../samples/Utils/CommandLineUtils</source>
39+
<source>../Utils/MqttClientConnectionWrapper</source>
40+
<source>../ServiceTestLifecycleEvents</source>
41+
</sources>
42+
</configuration>
43+
</execution>
44+
</executions>
45+
</plugin>
46+
</plugins>
47+
</build>
48+
</project>

0 commit comments

Comments
 (0)
Please sign in to comment.