Skip to content

Commit 27e1ec6

Browse files
iberryfulib-steffen
authored andcommitted
Fix #230 (#234)
* fix dependency in validate json * add circular dependency detect * add tests for circular dependency. * fix dependency test
1 parent be3b50d commit 27e1ec6

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

src/pyinfrabox/infrabox/__init__.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,8 @@ def validate_json(d):
508508
return True
509509

510510
jobs = {}
511+
all_job_names = set([j['name'] for j in d['jobs']])
512+
all_deps = {}
511513
for i in range(0, len(d['jobs'])):
512514
job = d['jobs'][i]
513515
job_name = job['name']
@@ -537,12 +539,23 @@ def validate_json(d):
537539
if job_name == parent_name:
538540
raise ValidationError(path, "Job '%s' may not depend on itself" % parent_name)
539541

540-
if parent_name not in jobs:
542+
if parent_name not in all_job_names:
541543
raise ValidationError(path + ".depends_on", "Job '%s' not found" % parent_name)
542544

543545
if parent_name in deps:
544546
raise ValidationError(path + ".depends_on", "'%s' duplicate dependencies" % parent_name)
545547

546548
deps[parent_name] = True
547549

550+
if deps:
551+
all_deps[job_name] = deps
552+
553+
for job_name, deps in all_deps.items():
554+
queue = list(deps.keys())
555+
for dep_job in queue:
556+
if dep_job == job_name:
557+
raise ValidationError("Jobs", "Circular dependency detected.")
558+
if dep_job in all_deps:
559+
queue.extend(all_deps[dep_job].keys())
560+
548561
return True

src/pyinfrabox/tests/test_json.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,36 @@ def test_dep_defined_later(self):
4343
}]
4444
}
4545

46-
self.raises_expect(d, "#jobs[0].depends_on: Job 'compile' not found")
46+
validate_json(d)
47+
48+
def test_dep_detect_circular_dependency(self):
49+
d = {
50+
"version": 1,
51+
"jobs": [{
52+
"type": "docker",
53+
"name": "a",
54+
"docker_file": "Dockerfile",
55+
"resources": {"limits": {"cpu": 1, "memory": 1024}},
56+
"build_only": False,
57+
"depends_on": ["b"]
58+
}, {
59+
"type": "docker",
60+
"name": "b",
61+
"docker_file": "Dockerfile",
62+
"build_only": False,
63+
"depends_on": ["c"],
64+
"resources": {"limits": {"cpu": 1, "memory": 1024}},
65+
}, {
66+
"type": "docker",
67+
"name": "c",
68+
"docker_file": "Dockerfile",
69+
"build_only": False,
70+
"depends_on": ["a"],
71+
"resources": {"limits": {"cpu": 1, "memory": 1024}},
72+
}]
73+
}
74+
75+
self.raises_expect(d, "Jobs: Circular dependency detected.")
4776

4877
def test_dep_not_found(self):
4978
d = {

0 commit comments

Comments
 (0)