tools/scripts/codegen/smoke_tests_gen.py (67 lines of code) (raw):
#!/usr/bin/env python3
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0.
"""
This is a wrapper on top of Smithy smoke tests generator
"""
import json
import os
import shutil
import subprocess
from typing import List
SMITHY_GENERATOR_LOCATION = "tools/code-generation/smithy/codegen"
SMITHY_OUTPUT_DIR = "codegen_output"
SMITHY_TO_C2J_MAP_FILE = "tools/code-generation/smithy/codegen/smithy2c2j_service_map.json"
class SmokeTestsGen(object):
"""A wrapper for Smithy smoke tests generator for C++ SDK
"""
def __init__(self, debug: bool, **kwargs):
self.debug = debug
with open(os.path.abspath(SMITHY_TO_C2J_MAP_FILE), 'r') as file:
self.smithy_c2j_data = json.load(file)
self.c2j_smithy_data = {value: key for key, value in self.smithy_c2j_data.items()}
def generate(self, clients_to_build: set):
"""
Generate smoke tests for SDK clients
:param clients_to_build: a set of service client names to generate
:return:
"""
# get smithy names
smithy_services = [self.c2j_smithy_data.get(service, service) for service in clients_to_build]
print(f"Running code generator for smoke-tests for services:"+",".join(smithy_services))
if self._generate_smoke_tests(smithy_services, json.dumps(self.smithy_c2j_data)):
# move the output to generated folder
self._copy_cpp_codegen_contents(os.path.abspath("tools/code-generation/smithy/codegen"),
"cpp-codegen-smoke-tests-plugin",
os.path.abspath("generated/smoke-tests"))
return 0
else:
return -1
def _generate_smoke_tests(self, smithy_services: List[str], smithy_c2j_data: str):
smithy_codegen_command = [
"./gradlew",
"clean",
"build",
"-PoutputDirectory=" + SMITHY_OUTPUT_DIR,
"-PservicesFilter=" + ",".join(smithy_services),
"-Pc2jMap=" + smithy_c2j_data
]
original_dir = os.getcwd()
try:
if self.debug:
run_command_str = " ".join("%s" % item for item in smithy_codegen_command)
print(f"RUNNING COMMAND\n{run_command_str}\nfrom directory:\n{SMITHY_GENERATOR_LOCATION}")
process = subprocess.run(
smithy_codegen_command,
timeout=6*60, # Timeout after 6 minutes
check=True,
capture_output=True,
text=True,
cwd=SMITHY_GENERATOR_LOCATION
)
# If successful, print the command output
print("Smithy codegen command executed successfully!\n", process.stdout)
return True
except subprocess.CalledProcessError as e:
# Handle command failure and print error details
print(f"Command failed with return code {e.returncode}")
print(f"Error Output:\n{e.stderr}")
return False
def _copy_cpp_codegen_contents(self, top_level_dir: str, plugin_name: str, target_dir: str):
# check if the target directory exists, create it if it doesn't
os.makedirs(target_dir, exist_ok=True)
if self.debug:
print(f"_copy_cpp_codegen_contents: {target_dir}")
# Walk through the top-level directory and find all "cpp-codegen-smoke-tests-plugin" directories
for root, dirs, files in os.walk(top_level_dir):
if plugin_name in dirs:
source_dir = os.path.join(root, plugin_name)
# recursively copy all contents from the source to the target folder
for item in os.listdir(source_dir):
source_item = os.path.join(source_dir, item)
target_item = os.path.join(target_dir, item)
# Recursively copy directories and files
if os.path.isdir(source_item):
shutil.copytree(source_item, target_item, dirs_exist_ok=True)
else:
shutil.copy2(source_item, target_item)
print(f"Copied contents from '{source_dir}' to '{target_dir}'.")