-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathtest_dockerfile_manager_regeneration.py
More file actions
155 lines (127 loc) · 5.02 KB
/
test_dockerfile_manager_regeneration.py
File metadata and controls
155 lines (127 loc) · 5.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
from pathlib import Path
from agentkit.toolkit.docker.dockerfile.manager import DockerfileManager
from agentkit.toolkit.docker.dockerfile.metadata import MetadataExtractor
def test_python_template_default_base_image_domain() -> None:
template_path = (
Path(__file__).resolve().parents[3]
/ "agentkit"
/ "toolkit"
/ "resources"
/ "templates"
/ "python"
/ "Dockerfile.j2"
)
content = template_path.read_text(encoding="utf-8")
assert (
"FROM agentkit-prod-public-cn-beijing.cr.volces.com/base/py-simple:python{{ language_version }}-bookworm-slim-latest"
in content
)
def test_managed_dockerfile_regenerates_when_template_hash_changes(
tmp_path: Path,
) -> None:
manager = DockerfileManager(tmp_path)
config_hash_dict_v1 = {
"language": "Python",
"language_version": "3.12",
"entry_point": "agent.py",
"dependencies_file": "requirements.txt",
"dockerfile_template": "Dockerfile.j2",
"dockerfile_template_hash": "hash_v1",
"docker_build": {"base_image": None, "build_script": None},
}
def content_generator() -> str:
return "FROM python:3.12-slim\n"
generated_1, dockerfile_path_1 = manager.prepare_dockerfile(
config_hash_dict=config_hash_dict_v1,
content_generator=content_generator,
force_regenerate=False,
)
assert generated_1 is True
assert dockerfile_path_1 == str(tmp_path / "Dockerfile")
dockerfile_content_1 = (tmp_path / "Dockerfile").read_text(encoding="utf-8")
metadata_1 = MetadataExtractor.extract(dockerfile_content_1)
assert metadata_1.is_managed is True
assert metadata_1.config_hash == MetadataExtractor.calculate_config_hash(
config_hash_dict_v1
)
config_hash_dict_v2 = dict(config_hash_dict_v1)
config_hash_dict_v2["dockerfile_template_hash"] = "hash_v2"
generated_2, dockerfile_path_2 = manager.prepare_dockerfile(
config_hash_dict=config_hash_dict_v2,
content_generator=content_generator,
force_regenerate=False,
)
assert generated_2 is True
assert dockerfile_path_2 == str(tmp_path / "Dockerfile")
backup_dir = tmp_path / ".agentkit" / "dockerfile_backups"
backups = list(backup_dir.glob("Dockerfile.backup.*"))
assert len(backups) == 1
dockerfile_content_2 = (tmp_path / "Dockerfile").read_text(encoding="utf-8")
metadata_2 = MetadataExtractor.extract(dockerfile_content_2)
assert metadata_2.is_managed is True
assert metadata_2.config_hash == MetadataExtractor.calculate_config_hash(
config_hash_dict_v2
)
def test_managed_dockerfile_not_regenerated_when_config_hash_unchanged(
tmp_path: Path,
) -> None:
manager = DockerfileManager(tmp_path)
config_hash_dict_v1 = {
"language": "Python",
"language_version": "3.12",
"entry_point": "agent.py",
"dependencies_file": "requirements.txt",
"dockerfile_template": "Dockerfile.j2",
"dockerfile_template_hash": "hash_v1",
"docker_build": {"base_image": None, "build_script": None},
}
def content_generator() -> str:
return "FROM python:3.12-slim\n"
generated_1, _ = manager.prepare_dockerfile(
config_hash_dict=config_hash_dict_v1,
content_generator=content_generator,
force_regenerate=False,
)
assert generated_1 is True
generated_2, _ = manager.prepare_dockerfile(
config_hash_dict=config_hash_dict_v1,
content_generator=content_generator,
force_regenerate=False,
)
assert generated_2 is False
backup_dir = tmp_path / ".agentkit" / "dockerfile_backups"
assert list(backup_dir.glob("Dockerfile.backup.*")) == []
def test_managed_dockerfile_not_overwritten_when_user_modified_and_config_changes(
tmp_path: Path,
) -> None:
manager = DockerfileManager(tmp_path)
config_hash_dict_v1 = {
"language": "Python",
"language_version": "3.12",
"entry_point": "agent.py",
"dependencies_file": "requirements.txt",
"dockerfile_template": "Dockerfile.j2",
"dockerfile_template_hash": "hash_v1",
"docker_build": {"base_image": None, "build_script": None},
}
def content_generator() -> str:
return "FROM python:3.12-slim\n"
manager.prepare_dockerfile(
config_hash_dict=config_hash_dict_v1,
content_generator=content_generator,
force_regenerate=False,
)
dockerfile_path = tmp_path / "Dockerfile"
dockerfile_path.write_text(
dockerfile_path.read_text(encoding="utf-8") + "\nRUN echo user-modified\n",
encoding="utf-8",
)
config_hash_dict_v2 = dict(config_hash_dict_v1)
config_hash_dict_v2["dockerfile_template_hash"] = "hash_v2"
generated, _ = manager.prepare_dockerfile(
config_hash_dict=config_hash_dict_v2,
content_generator=content_generator,
force_regenerate=False,
)
assert generated is False
assert "RUN echo user-modified" in dockerfile_path.read_text(encoding="utf-8")