Skip to content

Commit d90b903

Browse files
authored
Merge pull request #59 from Komalis/feat/add-jinja2-render-command
feat: big cleanup in templating ecs file
2 parents 4add1fe + ef4ebc2 commit d90b903

File tree

5 files changed

+36
-22
lines changed

5 files changed

+36
-22
lines changed

easyecs/cli.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
from easyecs.helpers.settings import (
3434
compute_hash_ecs_file,
3535
delete_hash,
36+
ecs_file_to_yaml,
3637
load_settings,
3738
read_ecs_file,
3839
save_hash,
@@ -394,5 +395,11 @@ def click_version() -> None:
394395
print(data["tool"]["poetry"]["version"])
395396

396397

398+
@entrypoint.command(name="render", help="Show a rendered ecs file")
399+
@options.file_name
400+
def click_render(file_name: str) -> None:
401+
print(ecs_file_to_yaml(file_name))
402+
403+
397404
if __name__ == "__main__":
398405
entrypoint()

easyecs/helpers/settings.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import hashlib
22
import json
33
import os
4+
import re
45
import yaml
56
from jinja2 import Environment, FileSystemLoader
67

@@ -15,13 +16,33 @@
1516
from easyecs.model.ecs import EcsFileModel
1617

1718

18-
def read_ecs_file(file_name: str) -> EcsFileModel:
19+
def backport_old_format_to_new_format(data: str) -> str:
20+
# This function will be deprecated in the future.
21+
old_format_pattern = r"{{ ?\.(\w+) ?}}"
22+
matches = re.findall(old_format_pattern, data)
23+
for match in matches:
24+
print(
25+
f"{Color.RED}Old template format has been found {{{{.{match}}}}}, please"
26+
f" update it to {{{{ {match} }}}}, it will be deprecated in a near"
27+
f" future.{Color.END}"
28+
)
29+
new_data = re.sub(old_format_pattern, r"{{ \1 }}", data)
30+
return new_data
31+
32+
33+
def ecs_file_to_yaml(file_name: str) -> str:
1934
env = Environment(loader=FileSystemLoader("."))
2035
with open(file_name) as f:
2136
data = f.read()
37+
data = backport_old_format_to_new_format(data)
2238
template = env.from_string(data)
2339
rendered_template = template.render(**os.environ)
24-
rendered_data = yaml.safe_load(rendered_template)
40+
return rendered_template
41+
42+
43+
def read_ecs_file(file_name: str) -> EcsFileModel:
44+
rendered_template = ecs_file_to_yaml(file_name)
45+
rendered_data = yaml.safe_load(rendered_template)
2546
return EcsFileModel(**rendered_data)
2647

2748

easyecs/model/ecs.py

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from pydantic import BaseModel, computed_field, field_validator, model_validator
55
from pathlib import Path
66

7-
from easyecs.helpers.common import template_with_env_var
87
from easyecs.helpers.exceptions import FileNotFoundException
98

109

@@ -28,11 +27,10 @@ class EcsFileRoleModel(BaseModel):
2827
@field_validator("arn")
2928
def set_arn(cls, arn):
3029
arn_pattern: str = r"^arn:aws:iam::\d{0,12}:role\/[\w\d_\/.-]*$"
31-
parsed_arn = template_with_env_var(arn)
3230
assert re.match(
33-
arn_pattern, parsed_arn
34-
), f"Role ARN does not respect arn pattern : {parsed_arn}"
35-
return parsed_arn
31+
arn_pattern, arn
32+
), f"Role ARN does not respect arn pattern : {arn}"
33+
return arn
3634

3735
@field_validator("statements")
3836
def validate_unique_sid(cls, statements):
@@ -80,11 +78,8 @@ class EcsFileVolumeModel(BaseModel):
8078

8179
@field_validator("id")
8280
def set_id(cls, id):
83-
parsed_id = template_with_env_var(id)
84-
assert parsed_id.startswith(
85-
"fs-"
86-
), f"EFS ID should start with fs- instead got {parsed_id}"
87-
return parsed_id
81+
assert id.startswith("fs-"), f"EFS ID should start with fs- instead got {id}"
82+
return id
8883

8984

9085
class EcsFileContainerHealthCheckModel(BaseModel):
@@ -126,10 +121,6 @@ def validate_volumes(cls, volumes):
126121
resolved_volumes.append(f"{resolved_from_dir}/{resolved_from_file}:{_to}")
127122
return resolved_volumes
128123

129-
@field_validator("image")
130-
def validate_image(cls, image):
131-
return template_with_env_var(image)
132-
133124

134125
class EcsTaskDefinitionModel(BaseModel):
135126
resources: EcsFileResourcesModel

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "easyecs"
3-
version = "0.16.0"
3+
version = "0.16.1"
44
description = ""
55
authors = ["BONVARLET Benjamin <benjaminbonvarlet96@gmail.com>"]
66
readme = "README.md"

tests/model/test_validation.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import os
21
from typing import Union
32
import pytest
43
from pydantic import ValidationError
@@ -87,10 +86,6 @@ def test_single_tty_validation():
8786
"arn:aws:iam::123456789012:role/S3Access",
8887
"arn:aws:iam::123456789012:role/S3Access",
8988
),
90-
(
91-
"arn:aws:iam::123456789012:role/{{.USER}}",
92-
"arn:aws:iam::123456789012:role/" + os.getenv("USER"),
93-
),
9489
],
9590
)
9691
def test_arn_validation(test_input: str, expected: Union[str, ValidationError]):

0 commit comments

Comments
 (0)