Skip to content

Commit 4623ad4

Browse files
Alessandro De Mariaademariag
authored andcommitted
upgrade generators
1 parent 898686c commit 4623ad4

File tree

4 files changed

+286
-153
lines changed

4 files changed

+286
-153
lines changed

terraform/common.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from enum import StrEnum, auto
55

66
from kapitan.inputs.kadet import Dict, load_from_search_paths
7+
from kapitan.utils import prune_empty
78
from pydantic import field_validator
89

910
kgenlib = load_from_search_paths("kgenlib")
@@ -12,6 +13,10 @@
1213
TERRAFORM_DISALLOWED_CHARS_REGEX = r"[^a-zA-Z\.\-\_\@]"
1314

1415

16+
def tf_id(*id_chunks: str) -> str:
17+
return "_".join(cleanup_terraform_resource_id(i) for i in id_chunks if i.strip())
18+
19+
1520
def cleanup_terraform_resource_id(resource_id: str) -> str:
1621
"""
1722
Some characters can't be used inside of a terraform resource.
@@ -36,6 +41,15 @@ class TerraformBlockTypes(StrEnum):
3641
RESOURCE = auto()
3742
TERRAFORM = auto()
3843
VARIABLE = auto()
44+
MODULE = auto()
45+
46+
47+
def sortedDeep(d):
48+
if isinstance(d, list):
49+
return [sortedDeep(v) for v in d]
50+
if isinstance(d, (dict, Dict)):
51+
return {k: sortedDeep(d[k]) for k in sorted(d)}
52+
return d
3953

4054

4155
class TerraformStore(kgenlib.BaseStore):
@@ -50,10 +64,13 @@ def dump(self, output_filename=None):
5064
output_format = getattr(content, "filename", "output.tf.json")
5165

5266
filename = output_format.format(content=content)
67+
if content.prune:
68+
content.root = Dict(prune_empty(content.root))
5369
self.root.setdefault(filename, Dict()).merge_update(
5470
content.root, box_merge_lists="extend"
5571
)
5672

73+
self.root = Dict(sortedDeep(self.root))
5774
return super().dump(already_processed=True)
5875

5976

@@ -69,7 +86,7 @@ class TerraformBlock(kgenlib.BaseContent):
6986
def name_must_valid_terraform_id(cls, v):
7087
allowed = set(string.ascii_letters + string.digits + "_-")
7188
if not set(v) <= allowed:
72-
raise ValueError(f"Invalid character in terraform id: {v}")
89+
v = cleanup_terraform_resource_id(v)
7390
return v
7491

7592
def new(self):
@@ -152,12 +169,14 @@ def get_reference(
152169

153170
class TerraformResource(TerraformBlock):
154171
block_type: TerraformBlockTypes = TerraformBlockTypes.RESOURCE
172+
prune: bool = True
155173

156174
def body(self):
157175
# We pop/purge them because these are internal kapitan instructions
158176
self.moved_from(self.config.pop("moved_from", None))
159177
self.import_from(self.config.pop("import_from", None))
160-
178+
kapitan_metadata = self.config.pop("_kapitan_", {})
179+
self.prune = kapitan_metadata.get("prune", self.prune)
161180
super().body()
162181

163182
def import_from(self, import_id: str = None):
@@ -189,6 +208,15 @@ def body(self):
189208
self.set_local(name, value)
190209

191210

211+
class TerraformModule(TerraformBlock):
212+
block_type: TerraformBlockTypes = TerraformBlockTypes.MODULE
213+
214+
def body(self):
215+
config = self.config
216+
id = config.get("id", self.id)
217+
self.root.module.setdefault(id, config)
218+
219+
192220
class TerraformData(TerraformBlock):
193221
block_type: TerraformBlockTypes = TerraformBlockTypes.DATA
194222

terraform/github.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ def body(self):
1818
tag_protection_config = config.pop("tag_protection", {})
1919
deploy_keys_config = config.pop("deploy_keys", {})
2020
ruleset_config = config.pop("repository_ruleset", {})
21+
actions_config = config.pop("actions", {})
22+
access_permissions_config = config.pop("permissions", {})
23+
autolink_references_config = config.pop("autolink", {})
2124

2225
resource_name = self.name
2326
logger.debug(f"Processing github_repository {resource_name}")
@@ -43,6 +46,9 @@ def body(self):
4346
branch_protection.filename = "github_branch_protection.tf"
4447
branch_protection.set(branch_protection.config)
4548
branch_protection.add("repository_id", repository.get_reference("node_id"))
49+
branch_protection.set(
50+
{"pattern": branches_name}
51+
) # Ensures the pattern is unique to the branch name and doesn't default to `main`
4652
self.add(branch_protection)
4753

4854
for rule_name, tag_pattern in tag_protection_config.items():
@@ -84,3 +90,54 @@ def body(self):
8490
repository_ruleset.filename = "github_repository_ruleset.tf"
8591
repository_ruleset.set(repository_ruleset.config)
8692
self.add(repository_ruleset)
93+
94+
if actions_config.get("access_level") is not None:
95+
gha_actions_access = TerraformResource(
96+
id=f"{resource_id}_actions_access",
97+
type="github_actions_repository_access_level",
98+
config={
99+
"repository": repository.get_reference("name"),
100+
"access_level": actions_config.get("access_level"),
101+
},
102+
)
103+
gha_actions_access.filename = "github_repository_actions.tf"
104+
gha_actions_access.set(gha_actions_access.config)
105+
gha_actions_access.add("repository", repository.get_reference("name"))
106+
self.add(gha_actions_access)
107+
108+
for permission_type, permission_config in access_permissions_config.items():
109+
logger.debug(f"Processing permissions for {resource_name}")
110+
for entity, permission in permission_config.items():
111+
if permission_type == "team":
112+
config = {"team_id": f"{entity}", "permission": f"{permission}"}
113+
else:
114+
config = {"username": f"{entity}", "permission": f"{permission}"}
115+
repository_collaborators = TerraformResource(
116+
id=f"{resource_name}_access_permissions".replace(".", ""),
117+
type="github_repository_collaborators",
118+
config=config,
119+
)
120+
repository_collaborators.filename = "github_repository_collaborators.tf"
121+
repository_collaborators.add(
122+
"repository", repository.get_reference("name")
123+
)
124+
repository_collaborators.add(
125+
permission_type, [repository_collaborators.config]
126+
)
127+
self.add(repository_collaborators)
128+
129+
for key_prefix, target_url in autolink_references_config.items():
130+
logger.debug(f"Processing autolink referneces for {resource_name}")
131+
config = {
132+
"key_prefix": f"{key_prefix}-",
133+
"target_url_template": f"{target_url}",
134+
}
135+
autolink_references = TerraformResource(
136+
id=f"{key_prefix}".replace(".", ""),
137+
type="github_repository_autolink_reference",
138+
config=config,
139+
)
140+
autolink_references.filename = "github_repository_autolink_reference.tf"
141+
autolink_references.set(autolink_references.config)
142+
autolink_references.add("repository", repository.get_reference("name"))
143+
self.add(autolink_references)

0 commit comments

Comments
 (0)