From 7c6574d30f1ec073a8aa3935c659e9b3c7098a6c Mon Sep 17 00:00:00 2001 From: Anas <144552979+AnasBabari@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:33:08 +0100 Subject: [PATCH] Fix: validate Terraform resource names before import, dry-run, and script output --- tools/terraform_import.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tools/terraform_import.py b/tools/terraform_import.py index 9241ef31..47ce7df1 100644 --- a/tools/terraform_import.py +++ b/tools/terraform_import.py @@ -94,6 +94,21 @@ REQUIRED_TERRAFORM_VERSION = ">= 1.0.0" +# Terraform resource names must be valid identifiers: start with a letter or +# underscore, followed by letters, digits, or underscores. Hyphens are invalid. +TERRAFORM_NAME_PATTERN = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*$") + + +def validate_resource_name(resource_type: str, resource_name: str) -> None: + """Validate a Terraform resource name and raise ValueError if invalid.""" + if not TERRAFORM_NAME_PATTERN.match(resource_name): + raise ValueError( + f"Invalid Terraform resource name '{resource_name}' for type " + f"'{resource_type}'. Resource names must start with a letter or " + f"underscore and contain only letters, digits, and underscores " + f"(no hyphens)." + ) + # --------------------------------------------------------------------------- # DATA MODELS # --------------------------------------------------------------------------- @@ -142,6 +157,7 @@ def check_terraform_version(self) -> bool: return False def import_resource(self, resource: ResourceToImport) -> bool: + validate_resource_name(resource.resource_type, resource.resource_name) address = f"{resource.resource_type}.{resource.resource_name}" cmd = [ self.terraform_binary, "import", @@ -208,6 +224,7 @@ def import_batch( if dry_run: logger.info("DRY RUN - No resources will be imported") for resource in resources: + validate_resource_name(resource.resource_type, resource.resource_name) address = f"{resource.resource_type}.{resource.resource_name}" logger.info(f" Would import: {address} (ID: {resource.resource_id})") import_result.results.append({