From e94f622c98f465d9781c67b4e0ac400ca14fb127 Mon Sep 17 00:00:00 2001 From: liujin11112 <3189403538@qq.com> Date: Tue, 23 Jun 2026 03:12:47 +0800 Subject: [PATCH 1/4] [$40] Add Terraform resource name validation --- tools/terraform_import.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/tools/terraform_import.py b/tools/terraform_import.py index 9241ef31..313cdd14 100644 --- a/tools/terraform_import.py +++ b/tools/terraform_import.py @@ -121,7 +121,28 @@ class ImportResult: # --------------------------------------------------------------------------- class TerraformImporter: - def __init__(self, state_dir: str = ".", terraform_binary: str = "terraform"): + +# Added: Terraform resource name validation + +import re + +_VALID_RESOURCE_RE = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*$") + +def validate_resource_name(name: str) -> tuple: + """Validate a Terraform resource name. + Returns (is_valid, error_message). + Resource names must match: [a-zA-Z_][a-zA-Z0-9_]* + Hyphens can corrupt Terraform state. + """ + if not name: + return False, "Resource name cannot be empty" + if "-" in name: + return False, f"Resource name '{name}' contains hyphens, which can corrupt Terraform state" + if not _VALID_RESOURCE_RE.match(name): + return False, f"Resource name '{name}' is not a valid Terraform identifier" + return True, "" + +def __init__(self, state_dir: str = ".", terraform_binary: str = "terraform"): self.state_dir = Path(state_dir) self.terraform_binary = terraform_binary self.results: List[Dict[str, Any]] = [] From b069763c072176ba7b3dc0828399264e0016886c Mon Sep 17 00:00:00 2001 From: liujin11112 <3189403538@qq.com> Date: Tue, 23 Jun 2026 03:12:49 +0800 Subject: [PATCH 2/4] [$40] Add tests dir --- tests/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/__init__.py diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b From b910bd3b53d535b96782597117d8adda5d33c212 Mon Sep 17 00:00:00 2001 From: liujin11112 <3189403538@qq.com> Date: Tue, 23 Jun 2026 03:12:52 +0800 Subject: [PATCH 3/4] [$40] Add Terraform import validation tests --- tests/test_terraform_import.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/test_terraform_import.py diff --git a/tests/test_terraform_import.py b/tests/test_terraform_import.py new file mode 100644 index 00000000..a99935d2 --- /dev/null +++ b/tests/test_terraform_import.py @@ -0,0 +1,20 @@ +"""Tests for Terraform resource name validation""" +import sys, os, unittest +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "tools")) +from terraform_import import validate_resource_name + +class TestValidateResourceName(unittest.TestCase): + def test_valid_standard(self): + for n in ["my_resource", "MyResource", "resource_1", "test"]: + v, m = validate_resource_name(n) + self.assertTrue(v, f"{n}: {m}") + def test_hyphen_rejected(self): + v, m = validate_resource_name("my-resource") + self.assertFalse(v); self.assertIn("hyphen", m.lower()) + def test_empty_rejected(self): + v, m = validate_resource_name(""); self.assertFalse(v) + def test_invalid_chars(self): + for n in ["123abc", "my.resource", "my resource"]: + self.assertFalse(validate_resource_name(n)[0]) +if __name__ == "__main__": + unittest.main() From b78167ec30aadbc329d46b1cf18be389ccfd63c5 Mon Sep 17 00:00:00 2001 From: liujin11112 <3189403538@qq.com> Date: Tue, 23 Jun 2026 03:18:49 +0800 Subject: [PATCH 4/4] [$40] Add Terraform resource name validation --- tools/terraform_import.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/tools/terraform_import.py b/tools/terraform_import.py index 313cdd14..1c1c88db 100644 --- a/tools/terraform_import.py +++ b/tools/terraform_import.py @@ -120,29 +120,25 @@ class ImportResult: # IMPORTER # --------------------------------------------------------------------------- -class TerraformImporter: - -# Added: Terraform resource name validation import re -_VALID_RESOURCE_RE = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*$") - -def validate_resource_name(name: str) -> tuple: - """Validate a Terraform resource name. - Returns (is_valid, error_message). - Resource names must match: [a-zA-Z_][a-zA-Z0-9_]* - Hyphens can corrupt Terraform state. +def validate_resource_name(name): + """Validate a Terraform resource name. Returns (is_valid, error_message). + Resource names must match: [a-zA-Z_][a-zA-Z0-9_]*. + Hyphens are not allowed in Terraform resource names. """ if not name: return False, "Resource name cannot be empty" if "-" in name: return False, f"Resource name '{name}' contains hyphens, which can corrupt Terraform state" - if not _VALID_RESOURCE_RE.match(name): + if not re.match(r"^[a-zA-Z_][a-zA-Z0-9_]*$", name): return False, f"Resource name '{name}' is not a valid Terraform identifier" return True, "" -def __init__(self, state_dir: str = ".", terraform_binary: str = "terraform"): + +class TerraformImporter: + def __init__(self, state_dir: str = ".", terraform_binary: str = "terraform"): self.state_dir = Path(state_dir) self.terraform_binary = terraform_binary self.results: List[Dict[str, Any]] = []