infrahub-testcontainers 1.2.10__py3-none-any.whl → 1.2.12__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.
- infrahub_testcontainers/container.py +239 -64
- infrahub_testcontainers/docker-compose-cluster.test.yml +321 -0
- infrahub_testcontainers/docker-compose.test.yml +1 -0
- infrahub_testcontainers/helpers.py +15 -1
- infrahub_testcontainers/plugin.py +9 -0
- {infrahub_testcontainers-1.2.10.dist-info → infrahub_testcontainers-1.2.12.dist-info}/METADATA +4 -4
- infrahub_testcontainers-1.2.12.dist-info/RECORD +17 -0
- {infrahub_testcontainers-1.2.10.dist-info → infrahub_testcontainers-1.2.12.dist-info}/WHEEL +1 -1
- infrahub_testcontainers-1.2.10.dist-info/RECORD +0 -16
- {infrahub_testcontainers-1.2.10.dist-info → infrahub_testcontainers-1.2.12.dist-info}/entry_points.txt +0 -0
|
@@ -67,9 +67,12 @@ PROJECT_ENV_VARIABLES: dict[str, str] = {
|
|
|
67
67
|
class InfrahubDockerCompose(DockerCompose):
|
|
68
68
|
project_name: str | None = None
|
|
69
69
|
env_vars: dict[str, str] = field(default_factory=dict)
|
|
70
|
+
deployment_type: str | None = None
|
|
70
71
|
|
|
71
72
|
@classmethod
|
|
72
|
-
def init(
|
|
73
|
+
def init(
|
|
74
|
+
cls, directory: Path | None = None, version: str | None = None, deployment_type: str | None = None
|
|
75
|
+
) -> Self:
|
|
73
76
|
if not directory:
|
|
74
77
|
directory = Path.cwd()
|
|
75
78
|
|
|
@@ -80,7 +83,7 @@ class InfrahubDockerCompose(DockerCompose):
|
|
|
80
83
|
if version == "local" and infrahub_image_version:
|
|
81
84
|
version = infrahub_image_version
|
|
82
85
|
|
|
83
|
-
compose = cls(project_name=cls.generate_project_name(), context=directory)
|
|
86
|
+
compose = cls(project_name=cls.generate_project_name(), context=directory, deployment_type=deployment_type)
|
|
84
87
|
compose.create_docker_file(directory=directory)
|
|
85
88
|
compose.create_env_file(directory=directory, version=version)
|
|
86
89
|
|
|
@@ -112,7 +115,10 @@ class InfrahubDockerCompose(DockerCompose):
|
|
|
112
115
|
|
|
113
116
|
def create_docker_file(self, directory: Path) -> Path:
|
|
114
117
|
current_directory = Path(__file__).resolve().parent
|
|
115
|
-
|
|
118
|
+
compose_file_name = (
|
|
119
|
+
"docker-compose-cluster.test.yml" if self.deployment_type == "cluster" else "docker-compose.test.yml"
|
|
120
|
+
)
|
|
121
|
+
compose_file = current_directory / compose_file_name
|
|
116
122
|
|
|
117
123
|
test_compose_file = directory / "docker-compose.yml"
|
|
118
124
|
test_compose_file.write_bytes(compose_file.read_bytes())
|
|
@@ -161,7 +167,7 @@ class InfrahubDockerCompose(DockerCompose):
|
|
|
161
167
|
cmd.extend(self.services)
|
|
162
168
|
self._run_command(cmd=cmd)
|
|
163
169
|
|
|
164
|
-
def start_container(self, service_name: str) -> None:
|
|
170
|
+
def start_container(self, service_name: str | list[str]) -> None:
|
|
165
171
|
"""
|
|
166
172
|
Starts a specific service of the docker compose environment.
|
|
167
173
|
|
|
@@ -171,7 +177,11 @@ class InfrahubDockerCompose(DockerCompose):
|
|
|
171
177
|
|
|
172
178
|
# pull means running a separate command before starting
|
|
173
179
|
if self.pull:
|
|
174
|
-
pull_cmd = [*base_cmd, "pull"
|
|
180
|
+
pull_cmd = [*base_cmd, "pull"]
|
|
181
|
+
if isinstance(service_name, list):
|
|
182
|
+
pull_cmd.extend(service_name)
|
|
183
|
+
else:
|
|
184
|
+
pull_cmd.append(service_name)
|
|
175
185
|
self._run_command(cmd=pull_cmd)
|
|
176
186
|
|
|
177
187
|
up_cmd = [*base_cmd, "up"]
|
|
@@ -186,7 +196,10 @@ class InfrahubDockerCompose(DockerCompose):
|
|
|
186
196
|
# we run in detached mode instead of blocking
|
|
187
197
|
up_cmd.append("--detach")
|
|
188
198
|
|
|
189
|
-
|
|
199
|
+
if isinstance(service_name, list):
|
|
200
|
+
up_cmd.extend(service_name)
|
|
201
|
+
else:
|
|
202
|
+
up_cmd.append(service_name)
|
|
190
203
|
self._run_command(cmd=up_cmd)
|
|
191
204
|
|
|
192
205
|
# TODO would be good to the support for project_name upstream
|
|
@@ -234,7 +247,7 @@ class InfrahubDockerCompose(DockerCompose):
|
|
|
234
247
|
dest_dir / backup_name,
|
|
235
248
|
)
|
|
236
249
|
|
|
237
|
-
def database_restore_backup(self, backup_file: Path) -> None:
|
|
250
|
+
def database_restore_backup(self, backup_file: Path) -> None: # noqa: PLR0915
|
|
238
251
|
assert self.use_neo4j_enterprise
|
|
239
252
|
|
|
240
253
|
shutil.copy(
|
|
@@ -243,52 +256,35 @@ class InfrahubDockerCompose(DockerCompose):
|
|
|
243
256
|
)
|
|
244
257
|
service_name = "database"
|
|
245
258
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
self.exec_in_container(
|
|
253
|
-
command=["cypher-shell", "-u", "neo4j", "-p", "admin", "STOP DATABASE neo4j;"],
|
|
254
|
-
service_name=service_name,
|
|
255
|
-
)
|
|
259
|
+
if self.deployment_type != "cluster": # noqa: PLR1702
|
|
260
|
+
try:
|
|
261
|
+
self.get_container(service_name=service_name)
|
|
262
|
+
except ContainerIsNotRunning:
|
|
263
|
+
self.start_container(service_name=service_name)
|
|
256
264
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
"restore",
|
|
262
|
-
"--overwrite-destination",
|
|
263
|
-
"--from-path",
|
|
264
|
-
str(self.internal_backup_dir / backup_file.name),
|
|
265
|
-
],
|
|
266
|
-
service_name=service_name,
|
|
267
|
-
)
|
|
265
|
+
self.exec_in_container(
|
|
266
|
+
command=["cypher-shell", "-u", "neo4j", "-p", "admin", "STOP DATABASE neo4j;"],
|
|
267
|
+
service_name=service_name,
|
|
268
|
+
)
|
|
268
269
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
270
|
+
self.exec_in_container(
|
|
271
|
+
command=[
|
|
272
|
+
"neo4j-admin",
|
|
273
|
+
"database",
|
|
274
|
+
"restore",
|
|
275
|
+
"--overwrite-destination",
|
|
276
|
+
"--from-path",
|
|
277
|
+
str(self.internal_backup_dir / backup_file.name),
|
|
278
|
+
],
|
|
279
|
+
service_name=service_name,
|
|
280
|
+
)
|
|
273
281
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
"plain",
|
|
279
|
-
"-d",
|
|
280
|
-
"system",
|
|
281
|
-
"-u",
|
|
282
|
-
"neo4j",
|
|
283
|
-
"-p",
|
|
284
|
-
"admin",
|
|
285
|
-
"START DATABASE neo4j;",
|
|
286
|
-
],
|
|
287
|
-
service_name=service_name,
|
|
288
|
-
)
|
|
282
|
+
self.exec_in_container(
|
|
283
|
+
command=["chown", "-R", "neo4j:neo4j", "/data"],
|
|
284
|
+
service_name=service_name,
|
|
285
|
+
)
|
|
289
286
|
|
|
290
|
-
|
|
291
|
-
(stdout, _, _) = self.exec_in_container(
|
|
287
|
+
(restore_output, _, _) = self.exec_in_container(
|
|
292
288
|
command=[
|
|
293
289
|
"cypher-shell",
|
|
294
290
|
"--format",
|
|
@@ -299,26 +295,205 @@ class InfrahubDockerCompose(DockerCompose):
|
|
|
299
295
|
"neo4j",
|
|
300
296
|
"-p",
|
|
301
297
|
"admin",
|
|
302
|
-
"
|
|
298
|
+
"START DATABASE neo4j;",
|
|
303
299
|
],
|
|
304
300
|
service_name=service_name,
|
|
305
301
|
)
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
302
|
+
|
|
303
|
+
for _ in range(3):
|
|
304
|
+
(stdout, _, _) = self.exec_in_container(
|
|
305
|
+
command=[
|
|
306
|
+
"cypher-shell",
|
|
307
|
+
"--format",
|
|
308
|
+
"plain",
|
|
309
|
+
"-d",
|
|
310
|
+
"system",
|
|
311
|
+
"-u",
|
|
312
|
+
"neo4j",
|
|
313
|
+
"-p",
|
|
314
|
+
"admin",
|
|
315
|
+
"SHOW DATABASES WHERE name = 'neo4j' AND currentStatus = 'online';",
|
|
316
|
+
],
|
|
317
|
+
service_name=service_name,
|
|
318
|
+
)
|
|
319
|
+
if stdout:
|
|
320
|
+
break
|
|
321
|
+
time.sleep(5)
|
|
322
|
+
else:
|
|
323
|
+
(debug_logs, _, _) = self.exec_in_container(
|
|
324
|
+
command=["cat", "logs/debug.log"],
|
|
325
|
+
service_name=service_name,
|
|
326
|
+
)
|
|
327
|
+
raise Exception(f"Failed to restore database:\n{restore_output}\nDebug logs:\n{debug_logs}")
|
|
328
|
+
|
|
329
|
+
old_services = self.services
|
|
330
|
+
self.services = ["infrahub-server", "task-worker"]
|
|
331
|
+
self.stop(down=False)
|
|
332
|
+
try:
|
|
333
|
+
self.start()
|
|
334
|
+
except Exception as exc:
|
|
335
|
+
stdout, stderr = self.get_logs()
|
|
336
|
+
raise Exception(f"Failed to start docker compose:\nStdout:\n{stdout}\nStderr:\n{stderr}") from exc
|
|
337
|
+
self.services = old_services
|
|
309
338
|
else:
|
|
310
|
-
(
|
|
311
|
-
|
|
339
|
+
print("Cluster mode detected")
|
|
340
|
+
try:
|
|
341
|
+
self.get_container(service_name=service_name)
|
|
342
|
+
self.get_container(service_name="database-core2")
|
|
343
|
+
self.get_container(service_name="database-core3")
|
|
344
|
+
except ContainerIsNotRunning:
|
|
345
|
+
self.start_container("database", "database-core2", "database-core3")
|
|
346
|
+
|
|
347
|
+
# Waiting for cluster to stabilize...
|
|
348
|
+
time.sleep(10)
|
|
349
|
+
|
|
350
|
+
self.exec_in_container(
|
|
351
|
+
command=["cypher-shell", "-u", "neo4j", "-p", "admin", "DROP DATABASE neo4j;"],
|
|
352
|
+
service_name=service_name,
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
self.exec_in_container(
|
|
356
|
+
command=["rm", "-rf", "/data/databases/neo4j"],
|
|
357
|
+
service_name=service_name,
|
|
358
|
+
)
|
|
359
|
+
self.exec_in_container(
|
|
360
|
+
command=["rm", "-rf", "/data/transactions/neo4j"],
|
|
361
|
+
service_name=service_name,
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
self.exec_in_container(
|
|
365
|
+
command=[
|
|
366
|
+
"neo4j-admin",
|
|
367
|
+
"database",
|
|
368
|
+
"restore",
|
|
369
|
+
"--from-path",
|
|
370
|
+
str(self.internal_backup_dir / backup_file.name),
|
|
371
|
+
"neo4j",
|
|
372
|
+
],
|
|
312
373
|
service_name=service_name,
|
|
313
374
|
)
|
|
314
|
-
raise Exception(f"Failed to restore database:\n{restore_output}\nDebug logs:\n{debug_logs}")
|
|
315
375
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
376
|
+
cmd = self.compose_command_property[:]
|
|
377
|
+
cmd += ["restart", "database"]
|
|
378
|
+
self._run_command(cmd=cmd)
|
|
379
|
+
|
|
380
|
+
main_node = service_name
|
|
381
|
+
cluster_nodes = ["database", "database-core2", "database-core3"]
|
|
382
|
+
|
|
383
|
+
for attempt in range(3):
|
|
384
|
+
try:
|
|
385
|
+
(stdout, _, _) = self.exec_in_container(
|
|
386
|
+
command=[
|
|
387
|
+
"cypher-shell",
|
|
388
|
+
"--format",
|
|
389
|
+
"plain",
|
|
390
|
+
"-d",
|
|
391
|
+
"system",
|
|
392
|
+
"-u",
|
|
393
|
+
"neo4j",
|
|
394
|
+
"-p",
|
|
395
|
+
"admin",
|
|
396
|
+
"SHOW DATABASES YIELD name, address, currentStatus WHERE name = 'system' RETURN address, currentStatus",
|
|
397
|
+
],
|
|
398
|
+
service_name=main_node,
|
|
399
|
+
)
|
|
400
|
+
except Exception:
|
|
401
|
+
time.sleep(10)
|
|
402
|
+
continue
|
|
403
|
+
|
|
404
|
+
raw_output = stdout
|
|
405
|
+
nodes_status = dict.fromkeys(cluster_nodes, False)
|
|
406
|
+
online_count = 0
|
|
407
|
+
total_entries = 0
|
|
408
|
+
|
|
409
|
+
try:
|
|
410
|
+
for line_raw in stdout.splitlines():
|
|
411
|
+
line = line_raw.strip()
|
|
412
|
+
if not line or line.startswith("address"):
|
|
413
|
+
continue
|
|
414
|
+
|
|
415
|
+
total_entries += 1
|
|
416
|
+
if "online" in line:
|
|
417
|
+
online_count += 1
|
|
418
|
+
for node in cluster_nodes:
|
|
419
|
+
node_pattern = f'"{node}:'
|
|
420
|
+
if node_pattern in line:
|
|
421
|
+
nodes_status[node] = True
|
|
422
|
+
break
|
|
423
|
+
if all(nodes_status.values()) and online_count == len(cluster_nodes):
|
|
424
|
+
break
|
|
425
|
+
except Exception as e:
|
|
426
|
+
print(f"Error parsing database status on attempt {attempt + 1}: {e}")
|
|
427
|
+
|
|
428
|
+
print(f"Waiting for all nodes to be online. Current status: {nodes_status}")
|
|
429
|
+
time.sleep(5)
|
|
430
|
+
else:
|
|
431
|
+
debug_logs = {}
|
|
432
|
+
for node in cluster_nodes:
|
|
433
|
+
try:
|
|
434
|
+
(logs, _, _) = self.exec_in_container(
|
|
435
|
+
command=["cat", "logs/debug.log"],
|
|
436
|
+
service_name=node,
|
|
437
|
+
)
|
|
438
|
+
debug_logs[node] = logs
|
|
439
|
+
except Exception as e:
|
|
440
|
+
debug_logs[node] = f"Could not retrieve logs: {str(e)}"
|
|
441
|
+
|
|
442
|
+
debug_info = f"Raw output from SHOW DATABASES command:\n{raw_output}\n\n"
|
|
443
|
+
debug_info += f"Final node status: {nodes_status}\n\n"
|
|
444
|
+
|
|
445
|
+
status_str = ", ".join(
|
|
446
|
+
[f"{node}: {'online' if status else 'offline'}" for node, status in nodes_status.items()]
|
|
447
|
+
)
|
|
448
|
+
logs_str = debug_info + "\n\n".join(
|
|
449
|
+
[f"--- {node} logs ---\n{logs}" for node, logs in debug_logs.items()]
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
raise Exception(
|
|
453
|
+
f"Failed to restore database cluster. Node status: {status_str}\nDebug logs:\n{logs_str}"
|
|
454
|
+
)
|
|
455
|
+
|
|
456
|
+
server_id = None
|
|
457
|
+
try:
|
|
458
|
+
stdout, _, _ = self.exec_in_container(
|
|
459
|
+
command=[
|
|
460
|
+
"cypher-shell",
|
|
461
|
+
"--format",
|
|
462
|
+
"plain",
|
|
463
|
+
"-d",
|
|
464
|
+
"system",
|
|
465
|
+
"-u",
|
|
466
|
+
"neo4j",
|
|
467
|
+
"-p",
|
|
468
|
+
"admin",
|
|
469
|
+
'SHOW SERVERS YIELD name, address WHERE address = "database:7687" RETURN name;',
|
|
470
|
+
],
|
|
471
|
+
service_name=service_name,
|
|
472
|
+
)
|
|
473
|
+
|
|
474
|
+
lines = stdout.splitlines()
|
|
475
|
+
for line_raw in lines:
|
|
476
|
+
line = line_raw.strip()
|
|
477
|
+
if not line or line == "name" or line.startswith("+"):
|
|
478
|
+
continue
|
|
479
|
+
server_id = line.strip('"')
|
|
480
|
+
break
|
|
481
|
+
except Exception as e:
|
|
482
|
+
print(f"Error retrieving server ID with direct query: {e}")
|
|
483
|
+
|
|
484
|
+
if server_id:
|
|
485
|
+
self.exec_in_container(
|
|
486
|
+
command=[
|
|
487
|
+
"cypher-shell",
|
|
488
|
+
"-d",
|
|
489
|
+
"system",
|
|
490
|
+
"-u",
|
|
491
|
+
"neo4j",
|
|
492
|
+
"-p",
|
|
493
|
+
"admin",
|
|
494
|
+
f"CREATE DATABASE neo4j TOPOLOGY 3 PRIMARIES OPTIONS {{ existingData: 'use', existingDataSeedInstance: '{server_id}' }};",
|
|
495
|
+
],
|
|
496
|
+
service_name=service_name,
|
|
497
|
+
)
|
|
320
498
|
self.start()
|
|
321
|
-
|
|
322
|
-
stdout, stderr = self.get_logs()
|
|
323
|
-
raise Exception(f"Failed to start docker compose:\nStdout:\n{stdout}\nStderr:\n{stderr}") from exc
|
|
324
|
-
self.services = old_services
|
|
499
|
+
print("Database restored successfully")
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
---
|
|
2
|
+
# yamllint disable rule:line-length
|
|
3
|
+
# The following environment variables are part of the Infrahub configuration options.
|
|
4
|
+
# For detailed information on these configuration options, please refer to the Infrahub documentation:
|
|
5
|
+
# https://docs.infrahub.app/reference/configuration
|
|
6
|
+
x-neo4j-config-common: &neo4j-config-common
|
|
7
|
+
NEO4J_AUTH: neo4j/admin
|
|
8
|
+
NEO4J_dbms_security_procedures_unrestricted: apoc.*
|
|
9
|
+
NEO4J_dbms_security_auth__minimum__password__length: 4
|
|
10
|
+
NEO4J_ACCEPT_LICENSE_AGREEMENT: 'yes'
|
|
11
|
+
NEO4J_server_backup_enabled: true
|
|
12
|
+
NEO4J_metrics_prometheus_enabled: true
|
|
13
|
+
NEO4J_server_metrics_filter: '*'
|
|
14
|
+
NEO4J_server_cluster_system__database__mode: PRIMARY
|
|
15
|
+
NEO4J_initial_server_mode__constraint: PRIMARY
|
|
16
|
+
NEO4J_dbms_cluster_discovery_endpoints: database:5000,database-core2:5000,database-core3:5000
|
|
17
|
+
NEO4J_initial_dbms_default__primaries__count: 3
|
|
18
|
+
NEO4J_dbms_memory_heap_initial__size: ${INFRAHUB_TESTING_DB_HEAP_INITIAL_SIZE}
|
|
19
|
+
NEO4J_dbms_memory_heap_max__size: ${INFRAHUB_TESTING_DB_HEAP_MAX_SIZE}
|
|
20
|
+
NEO4J_server_memory_pagecache_size: ${INFRAHUB_TESTING_DB_PAGECACHE_SIZE}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
services:
|
|
24
|
+
message-queue:
|
|
25
|
+
image: ${MESSAGE_QUEUE_DOCKER_IMAGE:-rabbitmq:3.13.7-management}
|
|
26
|
+
restart: unless-stopped
|
|
27
|
+
environment:
|
|
28
|
+
RABBITMQ_DEFAULT_USER: infrahub
|
|
29
|
+
RABBITMQ_DEFAULT_PASS: infrahub
|
|
30
|
+
healthcheck:
|
|
31
|
+
test: rabbitmq-diagnostics -q check_port_connectivity
|
|
32
|
+
interval: 5s
|
|
33
|
+
timeout: 30s
|
|
34
|
+
retries: 10
|
|
35
|
+
start_period: 3s
|
|
36
|
+
ports:
|
|
37
|
+
- ${INFRAHUB_TESTING_MESSAGE_QUEUE_PORT:-0}:15692
|
|
38
|
+
|
|
39
|
+
cache:
|
|
40
|
+
image: ${CACHE_DOCKER_IMAGE:-redis:7.2.4}
|
|
41
|
+
restart: unless-stopped
|
|
42
|
+
healthcheck:
|
|
43
|
+
test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
|
|
44
|
+
interval: 5s
|
|
45
|
+
timeout: 5s
|
|
46
|
+
retries: 3
|
|
47
|
+
|
|
48
|
+
infrahub-server-lb:
|
|
49
|
+
image: haproxy:3.1-alpine
|
|
50
|
+
volumes:
|
|
51
|
+
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
|
|
52
|
+
depends_on:
|
|
53
|
+
infrahub-server:
|
|
54
|
+
condition: service_started
|
|
55
|
+
healthcheck:
|
|
56
|
+
test: wget -O /dev/null http://127.0.0.1:8000/api/config || exit 1
|
|
57
|
+
interval: 5s
|
|
58
|
+
timeout: 5s
|
|
59
|
+
retries: 20
|
|
60
|
+
start_period: 10s
|
|
61
|
+
ports:
|
|
62
|
+
- ${INFRAHUB_TESTING_SERVER_PORT:-0}:8000
|
|
63
|
+
|
|
64
|
+
database:
|
|
65
|
+
deploy:
|
|
66
|
+
resources:
|
|
67
|
+
limits:
|
|
68
|
+
cpus: ${INFRAHUB_TESTING_DB_CPU_LIMIT}
|
|
69
|
+
memory: ${INFRAHUB_TESTING_DB_MEMORY_LIMIT}
|
|
70
|
+
image: "${DATABASE_DOCKER_IMAGE:-neo4j:5.20.0-enterprise}"
|
|
71
|
+
restart: unless-stopped
|
|
72
|
+
environment:
|
|
73
|
+
<<: *neo4j-config-common
|
|
74
|
+
NEO4J_metrics_prometheus_endpoint: 0.0.0.0:2004
|
|
75
|
+
NEO4J_server_backup_listen__address: 0.0.0.0:6362
|
|
76
|
+
NEO4J_server_discovery_advertised__address: database:5000
|
|
77
|
+
NEO4J_server_cluster_advertised__address: database:6000
|
|
78
|
+
NEO4J_server_cluster_raft_advertised__address: database:7000
|
|
79
|
+
NEO4J_server_bolt_advertised__address: database:7687
|
|
80
|
+
NEO4J_server_http_advertised__address: database:7474
|
|
81
|
+
NEO4J_server_https_advertised__address: database:7473
|
|
82
|
+
volumes:
|
|
83
|
+
- "database_data:/data"
|
|
84
|
+
- "database_logs:/logs"
|
|
85
|
+
- "./${INFRAHUB_TESTING_LOCAL_DB_BACKUP_DIRECTORY}:${INFRAHUB_TESTING_INTERNAL_DB_BACKUP_DIRECTORY}"
|
|
86
|
+
healthcheck:
|
|
87
|
+
test: wget http://localhost:7474 || exit 1
|
|
88
|
+
interval: 2s
|
|
89
|
+
timeout: 10s
|
|
90
|
+
retries: 20
|
|
91
|
+
start_period: 3s
|
|
92
|
+
ports:
|
|
93
|
+
- ${INFRAHUB_TESTING_DATABASE_PORT:-0}:6362
|
|
94
|
+
- ${INFRAHUB_TESTING_DATABASE_UI_PORT:-0}:7474
|
|
95
|
+
|
|
96
|
+
database-core2:
|
|
97
|
+
deploy:
|
|
98
|
+
resources:
|
|
99
|
+
limits:
|
|
100
|
+
cpus: ${INFRAHUB_TESTING_DB_CPU_LIMIT}
|
|
101
|
+
memory: ${INFRAHUB_TESTING_DB_MEMORY_LIMIT}
|
|
102
|
+
image: "${DATABASE_DOCKER_IMAGE:-neo4j:5.20.0-enterprise}"
|
|
103
|
+
environment:
|
|
104
|
+
<<: *neo4j-config-common
|
|
105
|
+
NEO4J_metrics_prometheus_endpoint: 0.0.0.0:2005
|
|
106
|
+
NEO4J_server_backup_listen__address: 0.0.0.0:6363
|
|
107
|
+
NEO4J_server_discovery_advertised__address: database-core2:5000
|
|
108
|
+
NEO4J_server_cluster_advertised__address: database-core2:6000
|
|
109
|
+
NEO4J_server_cluster_raft_advertised__address: database-core2:7000
|
|
110
|
+
NEO4J_server_bolt_advertised__address: database-core2:7687
|
|
111
|
+
NEO4J_server_http_advertised__address: database-core2:7474
|
|
112
|
+
NEO4J_server_https_advertised__address: database-core2:7473
|
|
113
|
+
volumes:
|
|
114
|
+
- "./plugins:/plugins"
|
|
115
|
+
- "database_data_core2:/data"
|
|
116
|
+
- "database_logs_core2:/logs"
|
|
117
|
+
healthcheck:
|
|
118
|
+
test: wget http://localhost:7474 || exit 1
|
|
119
|
+
interval: 5s
|
|
120
|
+
timeout: 10s
|
|
121
|
+
retries: 40
|
|
122
|
+
start_period: 30s
|
|
123
|
+
labels:
|
|
124
|
+
infrahub_role: "database"
|
|
125
|
+
com.github.run_id: "${GITHUB_RUN_ID:-unknown}"
|
|
126
|
+
com.github.job: "${JOB_NAME:-unknown}"
|
|
127
|
+
ports:
|
|
128
|
+
- "${INFRAHUB_TESTING_DATABASE_PORT:-0}:6363"
|
|
129
|
+
|
|
130
|
+
database-core3:
|
|
131
|
+
deploy:
|
|
132
|
+
resources:
|
|
133
|
+
limits:
|
|
134
|
+
cpus: ${INFRAHUB_TESTING_DB_CPU_LIMIT}
|
|
135
|
+
memory: ${INFRAHUB_TESTING_DB_MEMORY_LIMIT}
|
|
136
|
+
image: "${DATABASE_DOCKER_IMAGE:-neo4j:5.20.0-enterprise}"
|
|
137
|
+
environment:
|
|
138
|
+
<<: *neo4j-config-common
|
|
139
|
+
NEO4J_metrics_prometheus_endpoint: 0.0.0.0:2006
|
|
140
|
+
NEO4J_server_backup_listen__address: 0.0.0.0:6364
|
|
141
|
+
NEO4J_server_discovery_advertised__address: database-core3:5000
|
|
142
|
+
NEO4J_server_cluster_advertised__address: database-core3:6000
|
|
143
|
+
NEO4J_server_cluster_raft_advertised__address: database-core3:7000
|
|
144
|
+
NEO4J_server_bolt_advertised__address: database-core3:7687
|
|
145
|
+
NEO4J_server_http_advertised__address: database-core3:7474
|
|
146
|
+
NEO4J_server_https_advertised__address: database-core3:7473
|
|
147
|
+
volumes:
|
|
148
|
+
- "./plugins:/plugins"
|
|
149
|
+
- "database_data_core3:/data"
|
|
150
|
+
- "database_logs_core3:/logs"
|
|
151
|
+
healthcheck:
|
|
152
|
+
test: wget http://localhost:7474 || exit 1
|
|
153
|
+
interval: 5s
|
|
154
|
+
timeout: 10s
|
|
155
|
+
retries: 40
|
|
156
|
+
start_period: 30s
|
|
157
|
+
labels:
|
|
158
|
+
infrahub_role: "database"
|
|
159
|
+
com.github.run_id: "${GITHUB_RUN_ID:-unknown}"
|
|
160
|
+
com.github.job: "${JOB_NAME:-unknown}"
|
|
161
|
+
ports:
|
|
162
|
+
- "${INFRAHUB_TESTING_DATABASE_PORT:-0}:6364"
|
|
163
|
+
|
|
164
|
+
task-manager:
|
|
165
|
+
image: "${INFRAHUB_TESTING_DOCKER_IMAGE}:${INFRAHUB_TESTING_IMAGE_VERSION}"
|
|
166
|
+
command: uvicorn --host 0.0.0.0 --port 4200 --factory infrahub.prefect_server.app:create_infrahub_prefect
|
|
167
|
+
depends_on:
|
|
168
|
+
task-manager-db:
|
|
169
|
+
condition: service_healthy
|
|
170
|
+
environment:
|
|
171
|
+
PREFECT_UI_ENABLED: "${INFRAHUB_TESTING_PREFECT_UI_ENABLED}" # enabling UI requires permissions, run container as root to enable UI
|
|
172
|
+
PREFECT_API_DATABASE_CONNECTION_URL: postgresql+asyncpg://postgres:postgres@task-manager-db:5432/prefect
|
|
173
|
+
healthcheck:
|
|
174
|
+
test: /usr/local/bin/httpx http://localhost:4200/api/health || exit 1
|
|
175
|
+
interval: 5s
|
|
176
|
+
timeout: 5s
|
|
177
|
+
retries: 20
|
|
178
|
+
start_period: 10s
|
|
179
|
+
ports:
|
|
180
|
+
- ${INFRAHUB_TESTING_TASK_MANAGER_PORT:-0}:4200
|
|
181
|
+
|
|
182
|
+
task-manager-db:
|
|
183
|
+
image: "${POSTGRES_DOCKER_IMAGE:-postgres:16-alpine}"
|
|
184
|
+
environment:
|
|
185
|
+
- POSTGRES_USER=postgres
|
|
186
|
+
- POSTGRES_PASSWORD=postgres
|
|
187
|
+
- POSTGRES_DB=prefect
|
|
188
|
+
volumes:
|
|
189
|
+
- workflow_db:/var/lib/postgresql/data
|
|
190
|
+
healthcheck:
|
|
191
|
+
test: ["CMD-SHELL", "pg_isready"]
|
|
192
|
+
interval: 10s
|
|
193
|
+
timeout: 5s
|
|
194
|
+
retries: 5
|
|
195
|
+
|
|
196
|
+
infrahub-server:
|
|
197
|
+
deploy:
|
|
198
|
+
mode: replicated
|
|
199
|
+
replicas: ${INFRAHUB_TESTING_API_SERVER_COUNT}
|
|
200
|
+
image: "${INFRAHUB_TESTING_DOCKER_IMAGE}:${INFRAHUB_TESTING_IMAGE_VERSION}"
|
|
201
|
+
command: ${INFRAHUB_TESTING_DOCKER_ENTRYPOINT}
|
|
202
|
+
environment:
|
|
203
|
+
INFRAHUB_PRODUCTION: ${INFRAHUB_TESTING_PRODUCTION}
|
|
204
|
+
INFRAHUB_LOG_LEVEL: ${INFRAHUB_TESTING_LOG_LEVEL:-INFO}
|
|
205
|
+
INFRAHUB_BROKER_ADDRESS: ${INFRAHUB_TESTING_BROKER_ADDRESS}
|
|
206
|
+
INFRAHUB_CACHE_ADDRESS: ${INFRAHUB_TESTING_CACHE_ADDRESS}
|
|
207
|
+
INFRAHUB_DB_ADDRESS: ${INFRAHUB_TESTING_DB_ADDRESS}
|
|
208
|
+
INFRAHUB_DB_PROTOCOL: ${INFRAHUB_TESTING_DB_PROTOCOL:-neo4j}
|
|
209
|
+
INFRAHUB_WORKFLOW_ADDRESS: ${INFRAHUB_TESTING_WORKFLOW_ADDRESS}
|
|
210
|
+
INFRAHUB_WORKFLOW_DEFAULT_WORKER_TYPE: ${INFRAHUB_TESTING_WORKFLOW_DEFAULT_WORKER_TYPE}
|
|
211
|
+
INFRAHUB_INITIAL_ADMIN_TOKEN: ${INFRAHUB_TESTING_INITIAL_ADMIN_TOKEN}
|
|
212
|
+
INFRAHUB_INITIAL_AGENT_TOKEN: ${INFRAHUB_TESTING_INITIAL_AGENT_TOKEN}
|
|
213
|
+
INFRAHUB_SECURITY_SECRET_KEY: ${INFRAHUB_TESTING_SECURITY_SECRET_KEY}
|
|
214
|
+
PREFECT_API_URL: ${INFRAHUB_TESTING_PREFECT_API}
|
|
215
|
+
# Tracing
|
|
216
|
+
INFRAHUB_TRACE_ENABLE: ${INFRAHUB_TRACE_ENABLE:-false}
|
|
217
|
+
INFRAHUB_TRACE_EXPORTER_ENDPOINT:
|
|
218
|
+
INFRAHUB_TRACE_EXPORTER_PROTOCOL: ${INFRAHUB_TRACE_EXPORTER_PROTOCOL:-grpc}
|
|
219
|
+
INFRAHUB_TRACE_EXPORTER_TYPE: ${INFRAHUB_TRACE_EXPORTER_TYPE:-console}
|
|
220
|
+
INFRAHUB_TRACE_INSECURE: ${INFRAHUB_TRACE_INSECURE:-true}
|
|
221
|
+
OTEL_RESOURCE_ATTRIBUTES:
|
|
222
|
+
depends_on:
|
|
223
|
+
database:
|
|
224
|
+
condition: service_healthy
|
|
225
|
+
database-core2:
|
|
226
|
+
condition: service_healthy
|
|
227
|
+
database-core3:
|
|
228
|
+
condition: service_healthy
|
|
229
|
+
message-queue:
|
|
230
|
+
condition: service_healthy
|
|
231
|
+
cache:
|
|
232
|
+
condition: service_healthy
|
|
233
|
+
task-manager:
|
|
234
|
+
condition: service_healthy
|
|
235
|
+
volumes:
|
|
236
|
+
- "storage_data:/opt/infrahub/storage"
|
|
237
|
+
tty: true
|
|
238
|
+
healthcheck:
|
|
239
|
+
test: curl -s -f -o /dev/null http://localhost:8000/api/config || exit 1
|
|
240
|
+
interval: 5s
|
|
241
|
+
timeout: 5s
|
|
242
|
+
retries: 20
|
|
243
|
+
start_period: 10s
|
|
244
|
+
|
|
245
|
+
task-worker:
|
|
246
|
+
deploy:
|
|
247
|
+
mode: replicated
|
|
248
|
+
replicas: ${INFRAHUB_TESTING_TASK_WORKER_COUNT}
|
|
249
|
+
image: "${INFRAHUB_TESTING_DOCKER_IMAGE}:${INFRAHUB_TESTING_IMAGE_VERSION}"
|
|
250
|
+
command: prefect worker start --type ${INFRAHUB_TESTING_WORKFLOW_DEFAULT_WORKER_TYPE} --pool infrahub-worker --with-healthcheck
|
|
251
|
+
environment:
|
|
252
|
+
INFRAHUB_PRODUCTION: ${INFRAHUB_TESTING_PRODUCTION}
|
|
253
|
+
INFRAHUB_LOG_LEVEL: ${INFRAHUB_TESTING_LOG_LEVEL}
|
|
254
|
+
INFRAHUB_GIT_REPOSITORIES_DIRECTORY: ${INFRAHUB_TESTING_GIT_REPOSITORIES_DIRECTORY}
|
|
255
|
+
INFRAHUB_API_TOKEN: ${INFRAHUB_TESTING_INITIAL_AGENT_TOKEN}
|
|
256
|
+
INFRAHUB_SECURITY_SECRET_KEY: ${INFRAHUB_TESTING_SECURITY_SECRET_KEY}
|
|
257
|
+
INFRAHUB_ADDRESS: ${INFRAHUB_TESTING_ADDRESS}
|
|
258
|
+
INFRAHUB_INTERNAL_ADDRESS: ${INFRAHUB_TESTING_INTERNAL_ADDRESS}
|
|
259
|
+
INFRAHUB_BROKER_ADDRESS: ${INFRAHUB_TESTING_BROKER_ADDRESS}
|
|
260
|
+
INFRAHUB_CACHE_ADDRESS: ${INFRAHUB_TESTING_CACHE_ADDRESS}
|
|
261
|
+
INFRAHUB_DB_ADDRESS: ${INFRAHUB_TESTING_DB_ADDRESS:-database}
|
|
262
|
+
INFRAHUB_DB_PROTOCOL: ${INFRAHUB_TESTING_DB_PROTOCOL:-neo4j}
|
|
263
|
+
INFRAHUB_WORKFLOW_ADDRESS: ${INFRAHUB_TESTING_WORKFLOW_ADDRESS}
|
|
264
|
+
INFRAHUB_TIMEOUT: ${INFRAHUB_TESTING_TIMEOUT}
|
|
265
|
+
PREFECT_API_URL: ${INFRAHUB_TESTING_PREFECT_API}
|
|
266
|
+
# Tracing
|
|
267
|
+
INFRAHUB_TRACE_ENABLE: ${INFRAHUB_TRACE_ENABLE:-false}
|
|
268
|
+
INFRAHUB_TRACE_EXPORTER_ENDPOINT:
|
|
269
|
+
INFRAHUB_TRACE_EXPORTER_PROTOCOL: ${INFRAHUB_TRACE_EXPORTER_PROTOCOL:-grpc}
|
|
270
|
+
INFRAHUB_TRACE_EXPORTER_TYPE: ${INFRAHUB_TRACE_EXPORTER_TYPE:-console}
|
|
271
|
+
INFRAHUB_TRACE_INSECURE: ${INFRAHUB_TRACE_INSECURE:-true}
|
|
272
|
+
OTEL_RESOURCE_ATTRIBUTES:
|
|
273
|
+
depends_on:
|
|
274
|
+
- infrahub-server
|
|
275
|
+
volumes:
|
|
276
|
+
- "./${INFRAHUB_TESTING_LOCAL_REMOTE_GIT_DIRECTORY}:${INFRAHUB_TESTING_INTERNAL_REMOTE_GIT_DIRECTORY}"
|
|
277
|
+
tty: true
|
|
278
|
+
|
|
279
|
+
cadvisor:
|
|
280
|
+
image: "${CADVISOR_DOCKER_IMAGE:-gcr.io/cadvisor/cadvisor:v0.51.0}"
|
|
281
|
+
command:
|
|
282
|
+
- -disable_root_cgroup_stats=true
|
|
283
|
+
- -docker_only=true
|
|
284
|
+
- -store_container_labels=false
|
|
285
|
+
- -whitelisted_container_labels=com.docker.compose.project
|
|
286
|
+
privileged: true
|
|
287
|
+
volumes:
|
|
288
|
+
- /:/rootfs:ro
|
|
289
|
+
- /var/run:/var/run:ro
|
|
290
|
+
- /sys:/sys:ro
|
|
291
|
+
- /var/lib/docker:/var/lib/docker:ro
|
|
292
|
+
- /dev/disk/:/dev/disk:ro
|
|
293
|
+
ports:
|
|
294
|
+
- "${INFRAHUB_TESTING_CADVISOR_PORT:-0}:8080"
|
|
295
|
+
|
|
296
|
+
scraper:
|
|
297
|
+
image: "${SCRAPER_DOCKER_IMAGE:-victoriametrics/victoria-metrics:v1.110.0}"
|
|
298
|
+
volumes:
|
|
299
|
+
- vmdata:/victoria-metrics-data
|
|
300
|
+
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
|
|
301
|
+
command:
|
|
302
|
+
- "--promscrape.config=/etc/prometheus/prometheus.yml"
|
|
303
|
+
ports:
|
|
304
|
+
- ${INFRAHUB_TESTING_SCRAPER_PORT:-0}:8428
|
|
305
|
+
healthcheck:
|
|
306
|
+
test: wget -qO- http://127.0.0.1:8428/-/healthy
|
|
307
|
+
start_period: 10s
|
|
308
|
+
interval: 5s
|
|
309
|
+
timeout: 5s
|
|
310
|
+
retries: 10
|
|
311
|
+
|
|
312
|
+
volumes:
|
|
313
|
+
database_data:
|
|
314
|
+
database_logs:
|
|
315
|
+
database_data_core2:
|
|
316
|
+
database_logs_core2:
|
|
317
|
+
database_data_core3:
|
|
318
|
+
database_logs_core3:
|
|
319
|
+
storage_data:
|
|
320
|
+
workflow_db:
|
|
321
|
+
vmdata:
|
|
@@ -59,6 +59,7 @@ services:
|
|
|
59
59
|
NEO4J_ACCEPT_LICENSE_AGREEMENT: "yes"
|
|
60
60
|
NEO4J_server_memory_heap_initial__size: ${INFRAHUB_TESTING_DB_HEAP_INITIAL_SIZE}
|
|
61
61
|
NEO4J_server_memory_heap_max__size: ${INFRAHUB_TESTING_DB_HEAP_MAX_SIZE}
|
|
62
|
+
NEO4J_server_memory_pagecache_size: ${INFRAHUB_TESTING_DB_PAGECACHE_SIZE}
|
|
62
63
|
volumes:
|
|
63
64
|
- "database_data:/data"
|
|
64
65
|
- "database_logs:/logs"
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import subprocess # noqa: S404
|
|
3
|
+
import warnings
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
|
|
5
6
|
import pytest
|
|
@@ -59,6 +60,10 @@ class TestInfrahubDocker:
|
|
|
59
60
|
def default_branch(self) -> str:
|
|
60
61
|
return "main"
|
|
61
62
|
|
|
63
|
+
@pytest.fixture(scope="class")
|
|
64
|
+
def deployment_type(self, request: pytest.FixtureRequest) -> str | None:
|
|
65
|
+
return request.config.getoption(name="infrahub_deployment_type", default=None)
|
|
66
|
+
|
|
62
67
|
@pytest.fixture(scope="class")
|
|
63
68
|
def infrahub_compose(
|
|
64
69
|
self,
|
|
@@ -66,12 +71,21 @@ class TestInfrahubDocker:
|
|
|
66
71
|
remote_repos_dir: Path, # initialize repository before running docker compose to fix permissions issues # noqa: ARG002
|
|
67
72
|
remote_backups_dir: Path, # noqa: ARG002
|
|
68
73
|
infrahub_version: str,
|
|
74
|
+
deployment_type: str | None,
|
|
69
75
|
) -> InfrahubDockerCompose:
|
|
70
|
-
return InfrahubDockerCompose.init(
|
|
76
|
+
return InfrahubDockerCompose.init(
|
|
77
|
+
directory=tmp_directory, version=infrahub_version, deployment_type=deployment_type
|
|
78
|
+
)
|
|
71
79
|
|
|
72
80
|
@pytest.fixture(scope="class")
|
|
73
81
|
def infrahub_app(self, request: pytest.FixtureRequest, infrahub_compose: InfrahubDockerCompose) -> dict[str, int]:
|
|
82
|
+
tests_failed_before_class = request.session.testsfailed
|
|
83
|
+
|
|
74
84
|
def cleanup() -> None:
|
|
85
|
+
tests_failed_during_class = request.session.testsfailed - tests_failed_before_class
|
|
86
|
+
if tests_failed_during_class > 0:
|
|
87
|
+
stdout, stderr = infrahub_compose.get_logs("infrahub-server", "task-worker")
|
|
88
|
+
warnings.warn(f"Container logs:\nStdout:\n{stdout}\nStderr:\n{stderr}", stacklevel=2)
|
|
75
89
|
infrahub_compose.stop()
|
|
76
90
|
|
|
77
91
|
request.addfinalizer(cleanup)
|
|
@@ -13,6 +13,15 @@ if TYPE_CHECKING:
|
|
|
13
13
|
def pytest_addoption(parser: pytest.Parser) -> None:
|
|
14
14
|
group = parser.getgroup("infrahub-performance-test")
|
|
15
15
|
|
|
16
|
+
group.addoption(
|
|
17
|
+
"--deployment-type",
|
|
18
|
+
action="store",
|
|
19
|
+
dest="infrahub_deployment_type",
|
|
20
|
+
default=None,
|
|
21
|
+
metavar="INFRAHUB_DEPLOYMENT_TYPE",
|
|
22
|
+
help="Type of deployment to use (default: None, options: cluster)",
|
|
23
|
+
)
|
|
24
|
+
|
|
16
25
|
group.addoption(
|
|
17
26
|
"--performance-result-address",
|
|
18
27
|
action="store",
|
{infrahub_testcontainers-1.2.10.dist-info → infrahub_testcontainers-1.2.12.dist-info}/METADATA
RENAMED
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: infrahub-testcontainers
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.12
|
|
4
4
|
Summary: Testcontainers instance for Infrahub to easily build integration tests
|
|
5
|
-
Home-page: https://opsmill.com
|
|
6
5
|
License: Apache-2.0
|
|
7
6
|
Author: OpsMill
|
|
8
7
|
Author-email: info@opsmill.com
|
|
9
|
-
Requires-Python: >=3.9
|
|
8
|
+
Requires-Python: >=3.9
|
|
10
9
|
Classifier: Intended Audience :: Developers
|
|
11
10
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
12
11
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -20,6 +19,7 @@ Requires-Dist: psutil
|
|
|
20
19
|
Requires-Dist: pydantic (>=2.10.6,<3.0.0)
|
|
21
20
|
Requires-Dist: pytest
|
|
22
21
|
Requires-Dist: testcontainers (>=4.8,<4.9)
|
|
22
|
+
Project-URL: Homepage, https://opsmill.com
|
|
23
23
|
Project-URL: Repository, https://github.com/opsmill/infrahub
|
|
24
24
|
Description-Content-Type: text/markdown
|
|
25
25
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
infrahub_testcontainers/__init__.py,sha256=oPpmesGgYBSdKTg1L37FGwYBeao1EHury5SJGul-CT8,216
|
|
2
|
+
infrahub_testcontainers/constants.py,sha256=mZ4hLvcf4rKk9wC7EId4MQxAY0sk4V99deB04N0J2bg,85
|
|
3
|
+
infrahub_testcontainers/container.py,sha256=CpRLoCQjN37Iv9DpMQX2WHgsDObT7_iNfE6OTWL90OE,19559
|
|
4
|
+
infrahub_testcontainers/docker-compose-cluster.test.yml,sha256=noKd7NLr6GQOn1X4qukvpsRvg15unGS7BfPDG4xkKdM,12057
|
|
5
|
+
infrahub_testcontainers/docker-compose.test.yml,sha256=NgQF0un3LNUWhY0-uKb56Ky9ZmCJP0dRssUPx4qZp-o,8562
|
|
6
|
+
infrahub_testcontainers/haproxy.cfg,sha256=QUkG2Xu-hKoknPOeYKAkBT_xJH6U9CfIS0DTMFZJsnk,1305
|
|
7
|
+
infrahub_testcontainers/helpers.py,sha256=a6qRHjeFZetkq0zQj5pgz021AI7XhArMG3ze7ZQuEHk,4288
|
|
8
|
+
infrahub_testcontainers/host.py,sha256=Z4_gGoGKKeM_HGVS7SdYL1FTNGyLBk8wzicdSKHpfmM,1486
|
|
9
|
+
infrahub_testcontainers/measurements.py,sha256=gR-uTasSIFCXrwvnNpIpfsQIopKftT7pBiarCgIShaQ,2214
|
|
10
|
+
infrahub_testcontainers/models.py,sha256=ASYyvl7d_WQz_i7y8-3iab9hwwmCl3OCJavqVbe8nXU,954
|
|
11
|
+
infrahub_testcontainers/performance_test.py,sha256=hvwiy6tc_lWniYqGkqfOXVGAmA_IV15VOZqbiD9ezno,6149
|
|
12
|
+
infrahub_testcontainers/plugin.py,sha256=I3RuZQ0dARyKHuqCf0y1Yj731P2Mwf3BJUehRJKeWrs,5645
|
|
13
|
+
infrahub_testcontainers/prometheus.yml,sha256=610xQEyj3xuVJMzPkC4m1fRnCrjGpiRBrXA2ytCLa54,599
|
|
14
|
+
infrahub_testcontainers-1.2.12.dist-info/METADATA,sha256=V2j6SjILtiss4iTlTwfXbz7wA-QUUzt0VfRRG9hcgKc,989
|
|
15
|
+
infrahub_testcontainers-1.2.12.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
16
|
+
infrahub_testcontainers-1.2.12.dist-info/entry_points.txt,sha256=gHOERdtVE0P8dYz6FHkn2KplpbXvCDJQnuWg_IP0-qQ,76
|
|
17
|
+
infrahub_testcontainers-1.2.12.dist-info/RECORD,,
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
infrahub_testcontainers/__init__.py,sha256=oPpmesGgYBSdKTg1L37FGwYBeao1EHury5SJGul-CT8,216
|
|
2
|
-
infrahub_testcontainers/constants.py,sha256=mZ4hLvcf4rKk9wC7EId4MQxAY0sk4V99deB04N0J2bg,85
|
|
3
|
-
infrahub_testcontainers/container.py,sha256=-NccmHKJw8rnGY4nSgqIJdGBrX8eObi9kq7q7mQz1zs,12308
|
|
4
|
-
infrahub_testcontainers/docker-compose.test.yml,sha256=dePNK3r5DWVysrFr-t838-9LercZQOIJ8ZYOBWv7Mok,8482
|
|
5
|
-
infrahub_testcontainers/haproxy.cfg,sha256=QUkG2Xu-hKoknPOeYKAkBT_xJH6U9CfIS0DTMFZJsnk,1305
|
|
6
|
-
infrahub_testcontainers/helpers.py,sha256=zsvBOql5qM2OX1ybPcklqF-nzWYHkZI3Gk3KZhxWOtU,3578
|
|
7
|
-
infrahub_testcontainers/host.py,sha256=Z4_gGoGKKeM_HGVS7SdYL1FTNGyLBk8wzicdSKHpfmM,1486
|
|
8
|
-
infrahub_testcontainers/measurements.py,sha256=gR-uTasSIFCXrwvnNpIpfsQIopKftT7pBiarCgIShaQ,2214
|
|
9
|
-
infrahub_testcontainers/models.py,sha256=ASYyvl7d_WQz_i7y8-3iab9hwwmCl3OCJavqVbe8nXU,954
|
|
10
|
-
infrahub_testcontainers/performance_test.py,sha256=hvwiy6tc_lWniYqGkqfOXVGAmA_IV15VOZqbiD9ezno,6149
|
|
11
|
-
infrahub_testcontainers/plugin.py,sha256=g24SMg4EAqVe2N8i9F66EV34cNqIdDU4mRP7OeOJO1w,5381
|
|
12
|
-
infrahub_testcontainers/prometheus.yml,sha256=610xQEyj3xuVJMzPkC4m1fRnCrjGpiRBrXA2ytCLa54,599
|
|
13
|
-
infrahub_testcontainers-1.2.10.dist-info/METADATA,sha256=9GFk7L3cUdT_QKESOM3EsBe9EwgvtRsCadJtOFNA9Zg,982
|
|
14
|
-
infrahub_testcontainers-1.2.10.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
15
|
-
infrahub_testcontainers-1.2.10.dist-info/entry_points.txt,sha256=gHOERdtVE0P8dYz6FHkn2KplpbXvCDJQnuWg_IP0-qQ,76
|
|
16
|
-
infrahub_testcontainers-1.2.10.dist-info/RECORD,,
|
|
File without changes
|