Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions tools/terraform_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
# ---------------------------------------------------------------------------
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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({
Expand Down