ceph-devstack 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. ceph_devstack/Dockerfile.selinux +20 -0
  2. ceph_devstack/__init__.py +187 -0
  3. ceph_devstack/ceph_devstack.pp +0 -0
  4. ceph_devstack/ceph_devstack.te +127 -0
  5. ceph_devstack/cli.py +64 -0
  6. ceph_devstack/config.toml +24 -0
  7. ceph_devstack/exec.py +93 -0
  8. ceph_devstack/host.py +154 -0
  9. ceph_devstack/logging.conf +30 -0
  10. ceph_devstack/py.typed +0 -0
  11. ceph_devstack/requirements.py +277 -0
  12. ceph_devstack/resources/__init__.py +115 -0
  13. ceph_devstack/resources/ceph/__init__.py +266 -0
  14. ceph_devstack/resources/ceph/containers.py +419 -0
  15. ceph_devstack/resources/ceph/exceptions.py +3 -0
  16. ceph_devstack/resources/ceph/requirements.py +90 -0
  17. ceph_devstack/resources/ceph/utils.py +45 -0
  18. ceph_devstack/resources/container.py +171 -0
  19. ceph_devstack/resources/misc.py +15 -0
  20. ceph_devstack-0.1.0.dist-info/METADATA +222 -0
  21. ceph_devstack-0.1.0.dist-info/RECORD +44 -0
  22. ceph_devstack-0.1.0.dist-info/WHEEL +5 -0
  23. ceph_devstack-0.1.0.dist-info/entry_points.txt +2 -0
  24. ceph_devstack-0.1.0.dist-info/licenses/LICENSE +21 -0
  25. ceph_devstack-0.1.0.dist-info/top_level.txt +2 -0
  26. tests/__init__.py +0 -0
  27. tests/conftest.py +9 -0
  28. tests/resources/__init__.py +0 -0
  29. tests/resources/ceph/__init__.py +0 -0
  30. tests/resources/ceph/fixtures/__init__.py +0 -0
  31. tests/resources/ceph/fixtures/testnode-config.toml +2 -0
  32. tests/resources/ceph/test_cephdevstack_core.py +459 -0
  33. tests/resources/ceph/test_devstack.py +182 -0
  34. tests/resources/ceph/test_env_vars.py +110 -0
  35. tests/resources/ceph/test_requirements_ceph.py +262 -0
  36. tests/resources/ceph/test_ssh_keypair.py +109 -0
  37. tests/resources/ceph/test_testnode.py +36 -0
  38. tests/resources/test_container.py +247 -0
  39. tests/resources/test_misc.py +46 -0
  40. tests/resources/test_podmanresource.py +59 -0
  41. tests/test_config.py +120 -0
  42. tests/test_deep_merge.py +71 -0
  43. tests/test_parse_args.py +228 -0
  44. tests/test_requirements_core.py +495 -0
@@ -0,0 +1,228 @@
1
+ import pytest
2
+
3
+ from ceph_devstack import parse_args
4
+
5
+ from pathlib import Path
6
+
7
+
8
+ class TestParseArgs:
9
+ def test_parse_args_no_args(self):
10
+ args = parse_args([])
11
+ assert args.command is None
12
+ assert args.verbose is False
13
+ assert args.dry_run is False
14
+
15
+ def test_parse_args_verbose(self):
16
+ args = parse_args(["-v"])
17
+ assert args.verbose is True
18
+
19
+ def test_parse_args_dry_run(self):
20
+ args = parse_args(["--dry-run"])
21
+ assert args.dry_run is True
22
+
23
+ def test_parse_args_config_file(self):
24
+ args = parse_args(["-c", "/custom/path.toml"])
25
+ assert args.config_file == Path("/custom/path.toml")
26
+
27
+ def test_parse_args_config_dump(self):
28
+ args = parse_args(["config", "dump"])
29
+ assert args.command == "config"
30
+ assert args.config_op == "dump"
31
+
32
+ def test_parse_args_config_get(self):
33
+ args = parse_args(["config", "get", "data_dir"])
34
+ assert args.command == "config"
35
+ assert args.config_op == "get"
36
+ assert args.name == "data_dir"
37
+
38
+ def test_parse_args_config_set(self):
39
+ args = parse_args(["config", "set", "data_dir", "/custom/path"])
40
+ assert args.command == "config"
41
+ assert args.config_op == "set"
42
+ assert args.name == "data_dir"
43
+ assert args.value == "/custom/path"
44
+
45
+ def test_parse_args_doctor(self):
46
+ args = parse_args(["doctor"])
47
+ assert args.command == "doctor"
48
+
49
+ def test_parse_args_doctor_fix(self):
50
+ args = parse_args(["doctor", "--fix"])
51
+ assert args.command == "doctor"
52
+ assert args.fix is True
53
+
54
+ def test_parse_args_pull(self):
55
+ args = parse_args(["pull"])
56
+ assert args.command == "pull"
57
+
58
+ def test_parse_args_pull_with_images(self):
59
+ args = parse_args(["pull", "image1", "image2"])
60
+ assert args.command == "pull"
61
+ assert "image1" in args.image
62
+ assert "image2" in args.image
63
+
64
+ def test_parse_args_build(self):
65
+ args = parse_args(["build"])
66
+ assert args.command == "build"
67
+
68
+ def test_parse_args_build_with_images(self):
69
+ args = parse_args(["build", "image1"])
70
+ assert args.command == "build"
71
+ assert "image1" in args.image
72
+
73
+ def test_parse_args_create(self):
74
+ args = parse_args(["create"])
75
+ assert args.command == "create"
76
+
77
+ def test_parse_args_create_with_build(self):
78
+ args = parse_args(["create", "-b"])
79
+ assert args.command == "create"
80
+ assert args.build is True
81
+
82
+ def test_parse_args_create_with_wait(self):
83
+ args = parse_args(["create", "-w"])
84
+ assert args.command == "create"
85
+ assert args.wait is True
86
+
87
+ def test_parse_args_remove(self):
88
+ args = parse_args(["remove"])
89
+ assert args.command == "remove"
90
+
91
+ def test_parse_args_start(self):
92
+ args = parse_args(["start"])
93
+ assert args.command == "start"
94
+
95
+ def test_parse_args_stop(self):
96
+ args = parse_args(["stop"])
97
+ assert args.command == "stop"
98
+
99
+ def test_parse_args_watch(self):
100
+ args = parse_args(["watch"])
101
+ assert args.command == "watch"
102
+
103
+ def test_parse_args_wait(self):
104
+ args = parse_args(["wait", "teuthology"])
105
+ assert args.command == "wait"
106
+ assert args.container == "teuthology"
107
+
108
+ def test_parse_args_logs(self):
109
+ args = parse_args(["logs"])
110
+ assert args.command == "logs"
111
+
112
+ def test_parse_args_logs_with_run_name(self):
113
+ args = parse_args(["logs", "-r", "my-run"])
114
+ assert args.command == "logs"
115
+ assert args.run_name == "my-run"
116
+
117
+ def test_parse_args_logs_with_job_id(self):
118
+ args = parse_args(["logs", "-j", "42"])
119
+ assert args.command == "logs"
120
+ assert args.job_id == "42"
121
+
122
+ def test_parse_args_logs_with_locate(self):
123
+ args = parse_args(["logs", "--locate"])
124
+ assert args.command == "logs"
125
+ assert args.locate is True
126
+
127
+ def test_parse_args_logs_with_no_locate(self):
128
+ args = parse_args(["logs", "--no-locate"])
129
+ assert args.command == "logs"
130
+ assert args.locate is False
131
+
132
+ def test_parse_args_logs_with_all_options(self):
133
+ args = parse_args(["logs", "-r", "my-run", "-j", "42", "--locate"])
134
+ assert args.command == "logs"
135
+ assert args.run_name == "my-run"
136
+ assert args.job_id == "42"
137
+ assert args.locate is True
138
+
139
+
140
+ class TestParseArgsDefaults:
141
+ def test_parse_args_default_verbose_false(self):
142
+ args = parse_args([])
143
+ assert args.verbose is False
144
+
145
+ def test_parse_args_default_dry_run_false(self):
146
+ args = parse_args([])
147
+ assert args.dry_run is False
148
+
149
+ def test_parse_args_default_config_path(self):
150
+ args = parse_args([])
151
+ assert args.config_file == Path("~/.config/ceph-devstack/config.toml")
152
+
153
+ def test_parse_args_default_command_is_none(self):
154
+ args = parse_args([])
155
+ assert args.command is None
156
+
157
+ def test_parse_args_default_config_op_is_none(self):
158
+ args = parse_args(["doctor"])
159
+ assert not hasattr(args, "config_op") or args.config_op is None
160
+
161
+ def test_parse_args_create_default_build_false(self):
162
+ args = parse_args(["create"])
163
+ assert args.build is False
164
+
165
+ def test_parse_args_create_default_wait_false(self):
166
+ args = parse_args(["create"])
167
+ assert args.wait is False
168
+
169
+ def test_parse_args_doctor_default_fix_false(self):
170
+ args = parse_args(["doctor"])
171
+ assert args.fix is False
172
+
173
+ def test_parse_args_logs_default_run_name_none(self):
174
+ args = parse_args(["logs"])
175
+ assert args.run_name is None
176
+
177
+ def test_parse_args_logs_default_job_id_none(self):
178
+ args = parse_args(["logs"])
179
+ assert args.job_id is None
180
+
181
+
182
+ class TestParseArgsEdgeCases:
183
+ def test_parse_args_with_help(self):
184
+ with pytest.raises(SystemExit):
185
+ parse_args(["--help"])
186
+
187
+ def test_parse_args_with_subcommand_help(self):
188
+ with pytest.raises(SystemExit):
189
+ parse_args(["config", "--help"])
190
+
191
+ def test_parse_args_with_invalid_flag(self):
192
+ with pytest.raises(SystemExit):
193
+ parse_args(["--invalid-flag"])
194
+
195
+ def test_parse_args_config_dump_requires_no_args(self):
196
+ args = parse_args(["config", "dump"])
197
+ assert args.config_op == "dump"
198
+
199
+ def test_parse_args_config_get_requires_name(self):
200
+ args = parse_args(["config", "get", "test_name"])
201
+ assert args.config_op == "get"
202
+ assert args.name == "test_name"
203
+
204
+ def test_parse_args_config_set_requires_name_and_value(self):
205
+ args = parse_args(["config", "set", "test_name", "test_value"])
206
+ assert args.config_op == "set"
207
+ assert args.name == "test_name"
208
+ assert args.value == "test_value"
209
+
210
+ def test_parse_args_wait_requires_container_name(self):
211
+ args = parse_args(["wait", "teuthology"])
212
+ assert args.command == "wait"
213
+ assert args.container == "teuthology"
214
+
215
+ def test_parse_args_pull_accepts_multiple_images(self):
216
+ args = parse_args(["pull", "img1", "img2", "img3"])
217
+ assert args.command == "pull"
218
+ assert len(args.image) == 3
219
+ assert "img1" in args.image
220
+ assert "img2" in args.image
221
+ assert "img3" in args.image
222
+
223
+ def test_parse_args_build_accepts_multiple_images(self):
224
+ args = parse_args(["build", "img1", "img2"])
225
+ assert args.command == "build"
226
+ assert len(args.image) == 2
227
+ assert "img1" in args.image
228
+ assert "img2" in args.image