-
Notifications
You must be signed in to change notification settings - Fork 44
Expand file tree
/
Copy pathextension.py
More file actions
104 lines (80 loc) · 2.81 KB
/
extension.py
File metadata and controls
104 lines (80 loc) · 2.81 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
# -*- coding: utf-8 -*-
from typing import Optional, List
from chaoslib.exceptions import InvalidExperiment, ChaosException
from chaoslib.types import Experiment, Extension
__all__ = ["get_extension", "has_extension", "set_extension",
"merge_extension", "remove_extension", "validate_extensions"]
def validate_extensions(experiment: Experiment) -> List[ChaosException]:
"""
Validate that extensions respect the specification.
"""
extensions = experiment.get("extensions")
if not extensions:
return []
errors = []
for ext in extensions:
ext_name = ext.get('name')
if not ext_name or not ext_name.strip():
errors.append(
InvalidExperiment("All extensions require a non-empty name"))
return errors
def get_extension(experiment: Experiment, name: str) -> Optional[Extension]:
"""
Get an extension by its name.
If no extensions were defined, or the extension doesn't exist in this
experiment, return `None`.
"""
extensions = experiment.get("extensions")
if not extensions:
return None
for ext in extensions:
ext_name = ext.get("name")
if ext_name == name:
return ext
return None
def has_extension(experiment: Experiment, name: str) -> bool:
"""
Check if an extension is declared in this experiment.
"""
return get_extension(experiment, name) is not None
def set_extension(experiment: Experiment, extension: Extension):
"""
Set an extension in this experiment.
If the extension already exists, it is overriden by the new one.
"""
if "extensions" not in experiment:
experiment["extensions"] = []
name = extension.get("name")
for ext in experiment["extensions"]:
ext_name = ext.get("name")
if ext_name == name:
experiment["extensions"].remove(ext)
break
experiment["extensions"].append(extension)
def remove_extension(experiment: Experiment, name: str):
"""
Remove an extension from this experiment.
"""
if "extensions" not in experiment:
return None
for ext in experiment["extensions"]:
ext_name = ext.get("name")
if ext_name == name:
experiment["extensions"].remove(ext)
break
def merge_extension(experiment: Experiment, extension: Extension):
"""
Merge an extension in this experiment.
If the extension does not exist yet, it is added. The merge is at the
first level only.
"""
if "extensions" not in experiment:
experiment["extensions"] = []
name = extension.get("name")
for ext in experiment["extensions"]:
ext_name = ext.get("name")
if ext_name == name:
ext.update(extension)
break
else:
experiment["extensions"].append(extension)