mirror of
https://github.com/jokob-sk/NetAlertX.git
synced 2026-04-15 06:31:44 -07:00
New mount test structure.
This commit is contained in:
@@ -159,8 +159,59 @@ def main():
|
|||||||
if result.performance_issue or result.dataloss_risk or result.error:
|
if result.performance_issue or result.dataloss_risk or result.error:
|
||||||
has_issues = True
|
has_issues = True
|
||||||
results.append(result)
|
results.append(result)
|
||||||
|
|
||||||
if has_issues:
|
# Exit immediately if write error detected
|
||||||
|
if result.write_error:
|
||||||
|
# Print table with results so far
|
||||||
|
headers = ["Path", "Writeable", "Mount", "RAMDisk", "Performance", "DataLoss"]
|
||||||
|
|
||||||
|
CHECK_SYMBOL = "✅"
|
||||||
|
CROSS_SYMBOL = "❌"
|
||||||
|
BLANK_SYMBOL = "➖"
|
||||||
|
|
||||||
|
def bool_to_check(val):
|
||||||
|
return CHECK_SYMBOL if val else CROSS_SYMBOL
|
||||||
|
|
||||||
|
print(" Mount Diagnostic Results", file=sys.stderr)
|
||||||
|
print("=" * 80, file=sys.stderr)
|
||||||
|
print("Issues detected! Container will exit.", file=sys.stderr)
|
||||||
|
print("", file=sys.stderr)
|
||||||
|
|
||||||
|
# Print table header
|
||||||
|
row_fmt = "{:<40} {:<10} {:<6} {:<8} {:<12} {:<9}"
|
||||||
|
print(row_fmt.format(*headers), file=sys.stderr)
|
||||||
|
print("-" * 85, file=sys.stderr)
|
||||||
|
|
||||||
|
# Print results
|
||||||
|
for r in results:
|
||||||
|
write_symbol = bool_to_check(r.is_writeable)
|
||||||
|
mount_symbol = bool_to_check(r.is_mounted)
|
||||||
|
|
||||||
|
if r.is_mounted:
|
||||||
|
ramdisk_symbol = CHECK_SYMBOL if r.is_ramdisk else CROSS_SYMBOL
|
||||||
|
else:
|
||||||
|
ramdisk_symbol = BLANK_SYMBOL
|
||||||
|
|
||||||
|
if is_persistent:
|
||||||
|
perf_symbol = BLANK_SYMBOL
|
||||||
|
else:
|
||||||
|
perf_symbol = bool_to_check(not r.performance_issue)
|
||||||
|
|
||||||
|
dataloss_symbol = bool_to_check(not r.dataloss_risk)
|
||||||
|
|
||||||
|
print(row_fmt.format(
|
||||||
|
r.path,
|
||||||
|
write_symbol,
|
||||||
|
mount_symbol,
|
||||||
|
ramdisk_symbol,
|
||||||
|
perf_symbol,
|
||||||
|
dataloss_symbol
|
||||||
|
), file=sys.stderr)
|
||||||
|
|
||||||
|
# Print warning and exit
|
||||||
|
print("\n", file=sys.stderr)
|
||||||
|
print_warning_message()
|
||||||
|
sys.exit(1)
|
||||||
# --- Print Table ---
|
# --- Print Table ---
|
||||||
headers = ["Path", "Writeable", "Mount", "RAMDisk", "Performance", "DataLoss"]
|
headers = ["Path", "Writeable", "Mount", "RAMDisk", "Performance", "DataLoss"]
|
||||||
|
|
||||||
|
|||||||
46
test/docker_tests/configurations/README.md
Normal file
46
test/docker_tests/configurations/README.md
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# NetAlertX Docker Test Configurations
|
||||||
|
|
||||||
|
This directory contains docker-compose configurations for different test scenarios.
|
||||||
|
|
||||||
|
## Available Configurations
|
||||||
|
|
||||||
|
### readonly
|
||||||
|
- **File**: `docker-compose.readonly.yml`
|
||||||
|
- **Description**: Tests with a read-only container filesystem
|
||||||
|
- **Use case**: Verify that the application works correctly when the container filesystem is read-only
|
||||||
|
|
||||||
|
### writable
|
||||||
|
- **File**: `docker-compose.writable.yml`
|
||||||
|
- **Description**: Tests with writable tmpfs mounts for performance
|
||||||
|
- **Use case**: Standard testing with optimized writable directories
|
||||||
|
|
||||||
|
## Mount Diagnostic Tests
|
||||||
|
|
||||||
|
The `mount-tests/` subdirectory contains 24 docker-compose configurations that test all possible mount scenarios for each path that NetAlertX monitors:
|
||||||
|
|
||||||
|
- **6 paths**: `/app/db`, `/app/config`, `/app/api`, `/app/log`, `/services/run`, `/services/config/nginx/conf.active`
|
||||||
|
- **4 scenarios per path**: `no-mount`, `ramdisk`, `mounted`, `unwritable`
|
||||||
|
- **Total**: 24 comprehensive test configurations
|
||||||
|
|
||||||
|
### Running Tests
|
||||||
|
|
||||||
|
Use pytest to run the mount diagnostic tests:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /workspaces/NetAlertX/test/docker_tests
|
||||||
|
pytest test_mount_diagnostics_pytest.py -v
|
||||||
|
```
|
||||||
|
|
||||||
|
Or run specific test scenarios:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pytest test_mount_diagnostics_pytest.py -k "db_ramdisk"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test Coverage
|
||||||
|
|
||||||
|
Each test validates that the mount diagnostic tool (`/entrypoint.d/10-mounts.py`) correctly identifies:
|
||||||
|
- **Good configurations**: No issues reported, exit code 0
|
||||||
|
- **Bad configurations**: Issues detected in table format, exit code 1
|
||||||
|
|
||||||
|
The tests ensure that persistent paths (db, config) require durable storage (volumes) while non-persistent paths (api, log, run) benefit from fast storage (tmpfs).
|
||||||
55
test/docker_tests/configurations/docker-compose.readonly.yml
Normal file
55
test/docker_tests/configurations/docker-compose.readonly.yml
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
# Read-only container configuration for testing
|
||||||
|
network_mode: ${NETALERTX_NETWORK_MODE:-host}
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-readonly
|
||||||
|
read_only: true
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
|
||||||
|
- type: bind
|
||||||
|
source: /etc/localtime
|
||||||
|
target: /etc/localtime
|
||||||
|
read_only: true
|
||||||
|
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: ${LISTEN_ADDR:-0.0.0.0}
|
||||||
|
PORT: ${PORT:-20211}
|
||||||
|
APP_CONF_OVERRIDE: ${GRAPHQL_PORT:-20212}
|
||||||
|
ALWAYS_FRESH_INSTALL: ${ALWAYS_FRESH_INSTALL:-false}
|
||||||
|
NETALERTX_DEBUG: ${NETALERTX_DEBUG:-0}
|
||||||
|
|
||||||
|
mem_limit: 2048m
|
||||||
|
mem_reservation: 1024m
|
||||||
|
cpu_shares: 512
|
||||||
|
pids_limit: 512
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
68
test/docker_tests/configurations/docker-compose.writable.yml
Normal file
68
test/docker_tests/configurations/docker-compose.writable.yml
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
# Writable container configuration with tmpfs mounts for performance testing
|
||||||
|
network_mode: ${NETALERTX_NETWORK_MODE:-host}
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-writable
|
||||||
|
read_only: false
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
|
||||||
|
- type: bind
|
||||||
|
source: /etc/localtime
|
||||||
|
target: /etc/localtime
|
||||||
|
read_only: true
|
||||||
|
|
||||||
|
# Tempfs mounts for writable directories in a read-only container and improve system performance
|
||||||
|
tmpfs:
|
||||||
|
# Speed up logging
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
# Speed up API access
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,sync,noatime,nodiratime"
|
||||||
|
# Required for customization of the nginx listen addr/port
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
# Required for nginx and php
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
# Required by php for session save
|
||||||
|
- "/tmp:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: ${LISTEN_ADDR:-0.0.0.0}
|
||||||
|
PORT: ${PORT:-20211}
|
||||||
|
APP_CONF_OVERRIDE: ${GRAPHQL_PORT:-20212}
|
||||||
|
ALWAYS_FRESH_INSTALL: ${ALWAYS_FRESH_INSTALL:-false}
|
||||||
|
NETALERTX_DEBUG: ${NETALERTX_DEBUG:-0}
|
||||||
|
|
||||||
|
mem_limit: 2048m
|
||||||
|
mem_reservation: 1024m
|
||||||
|
cpu_shares: 512
|
||||||
|
pids_limit: 512
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
45
test/docker_tests/configurations/mount-tests/README.md
Normal file
45
test/docker_tests/configurations/mount-tests/README.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# Mount Diagnostic Test Configurations
|
||||||
|
|
||||||
|
This directory contains docker-compose files for testing all possible mount configurations.
|
||||||
|
|
||||||
|
## Generated Files
|
||||||
|
|
||||||
|
- `docker-compose.mount-test.db_no-mount.yml`: No mount - use container filesystem for db_no-mount
|
||||||
|
- `docker-compose.mount-test.db_ramdisk.yml`: RAM disk (tmpfs) for db_ramdisk
|
||||||
|
- `docker-compose.mount-test.db_mounted.yml`: Proper mount (volume for persistent, none for non-persistent) for db_mounted
|
||||||
|
- `docker-compose.mount-test.db_unwritable.yml`: Read-only mount for db_unwritable
|
||||||
|
- `docker-compose.mount-test.config_no-mount.yml`: No mount - use container filesystem for config_no-mount
|
||||||
|
- `docker-compose.mount-test.config_ramdisk.yml`: RAM disk (tmpfs) for config_ramdisk
|
||||||
|
- `docker-compose.mount-test.config_mounted.yml`: Proper mount (volume for persistent, none for non-persistent) for config_mounted
|
||||||
|
- `docker-compose.mount-test.config_unwritable.yml`: Read-only mount for config_unwritable
|
||||||
|
- `docker-compose.mount-test.api_no-mount.yml`: No mount - use container filesystem for api_no-mount
|
||||||
|
- `docker-compose.mount-test.api_ramdisk.yml`: RAM disk (tmpfs) for api_ramdisk
|
||||||
|
- `docker-compose.mount-test.api_mounted.yml`: Proper mount (volume for persistent, none for non-persistent) for api_mounted
|
||||||
|
- `docker-compose.mount-test.api_unwritable.yml`: Read-only mount for api_unwritable
|
||||||
|
- `docker-compose.mount-test.log_no-mount.yml`: No mount - use container filesystem for log_no-mount
|
||||||
|
- `docker-compose.mount-test.log_ramdisk.yml`: RAM disk (tmpfs) for log_ramdisk
|
||||||
|
- `docker-compose.mount-test.log_mounted.yml`: Proper mount (volume for persistent, none for non-persistent) for log_mounted
|
||||||
|
- `docker-compose.mount-test.log_unwritable.yml`: Read-only mount for log_unwritable
|
||||||
|
- `docker-compose.mount-test.run_no-mount.yml`: No mount - use container filesystem for run_no-mount
|
||||||
|
- `docker-compose.mount-test.run_ramdisk.yml`: RAM disk (tmpfs) for run_ramdisk
|
||||||
|
- `docker-compose.mount-test.run_mounted.yml`: Proper mount (volume for persistent, none for non-persistent) for run_mounted
|
||||||
|
- `docker-compose.mount-test.run_unwritable.yml`: Read-only mount for run_unwritable
|
||||||
|
- `docker-compose.mount-test.active_config_no-mount.yml`: No mount - use container filesystem for active_config_no-mount
|
||||||
|
- `docker-compose.mount-test.active_config_ramdisk.yml`: RAM disk (tmpfs) for active_config_ramdisk
|
||||||
|
- `docker-compose.mount-test.active_config_mounted.yml`: Proper mount (volume for persistent, none for non-persistent) for active_config_mounted
|
||||||
|
- `docker-compose.mount-test.active_config_unwritable.yml`: Read-only mount for active_config_unwritable
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Run tests using pytest:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /workspaces/NetAlertX/test/docker_tests
|
||||||
|
pytest test_mount_diagnostics_pytest.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Or run specific scenarios:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pytest test_mount_diagnostics_pytest.py -k "db_ramdisk"
|
||||||
|
```
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-active_config_mounted
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
SYSTEM_SERVICES_ACTIVE_CONFIG: /services/config/nginx/conf.active
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: test_system_services_active_config
|
||||||
|
target: /services/config/nginx/conf.active
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-active_config_no-mount
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
SYSTEM_SERVICES_ACTIVE_CONFIG: /services/config/nginx/conf.active
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-active_config_ramdisk
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
SYSTEM_SERVICES_ACTIVE_CONFIG: /services/config/nginx/conf.active
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-active_config_unwritable
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
SYSTEM_SERVICES_ACTIVE_CONFIG: /services/config/nginx/conf.active
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: test_system_services_active_config
|
||||||
|
target: /services/config/nginx/conf.active
|
||||||
|
read_only: true
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-api_mounted
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_API: /app/api
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: test_netalertx_api
|
||||||
|
target: /app/api
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-api_no-mount
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_API: /app/api
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-api_ramdisk
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_API: /app/api
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-api_unwritable
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_API: /app/api
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: test_netalertx_api
|
||||||
|
target: /app/api
|
||||||
|
read_only: true
|
||||||
|
tmpfs:
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-config_mounted
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_CONFIG: /app/config
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: test_netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-config_no-mount
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_CONFIG: /app/config
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-config_ramdisk
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_CONFIG: /app/config
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/config:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-config_unwritable
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_CONFIG: /app/config
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: test_netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: true
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-db_mounted
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_DB: /app/db
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: test_netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-db_no-mount
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_DB: /app/db
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-db_ramdisk
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_DB: /app/db
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/db:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-db_unwritable
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_DB: /app/db
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: test_netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: true
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-log_mounted
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_LOG: /app/log
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: test_netalertx_log
|
||||||
|
target: /app/log
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-log_no-mount
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_LOG: /app/log
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-log_ramdisk
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_LOG: /app/log
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-log_unwritable
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
NETALERTX_LOG: /app/log
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: test_netalertx_log
|
||||||
|
target: /app/log
|
||||||
|
read_only: true
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-run_mounted
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
SYSTEM_SERVICES_RUN: /services/run
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: test_system_services_run
|
||||||
|
target: /services/run
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-run_no-mount
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
SYSTEM_SERVICES_RUN: /services/run
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-run_ramdisk
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
SYSTEM_SERVICES_RUN: /services/run
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/run:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
network_mode: host
|
||||||
|
build:
|
||||||
|
context: ../../../
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: netalertx-test
|
||||||
|
container_name: netalertx-test-mount-run_unwritable
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
- NET_BIND_SERVICE
|
||||||
|
environment:
|
||||||
|
LISTEN_ADDR: 0.0.0.0
|
||||||
|
PORT: 9999 # Use non-default port to test all paths
|
||||||
|
APP_CONF_OVERRIDE: 20212
|
||||||
|
ALWAYS_FRESH_INSTALL: true
|
||||||
|
NETALERTX_DEBUG: 0
|
||||||
|
SYSTEM_SERVICES_RUN: /services/run
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_db
|
||||||
|
target: /app/db
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: netalertx_config
|
||||||
|
target: /app/config
|
||||||
|
read_only: false
|
||||||
|
- type: volume
|
||||||
|
source: test_system_services_run
|
||||||
|
target: /services/run
|
||||||
|
read_only: true
|
||||||
|
tmpfs:
|
||||||
|
- "/app/api:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/app/log:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
- "/services/config/nginx/conf.active:uid=20211,gid=20211,mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
|
||||||
|
volumes:
|
||||||
|
netalertx_config:
|
||||||
|
netalertx_db:
|
||||||
|
test_netalertx_db:
|
||||||
|
test_netalertx_config:
|
||||||
|
test_netalertx_api:
|
||||||
|
test_netalertx_log:
|
||||||
|
test_system_services_run:
|
||||||
|
test_system_services_active_config:
|
||||||
383
test/docker_tests/test_mount_diagnostics_pytest.py
Normal file
383
test/docker_tests/test_mount_diagnostics_pytest.py
Normal file
@@ -0,0 +1,383 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Pytest-based Mount Diagnostic Tests for NetAlertX
|
||||||
|
|
||||||
|
Tests all possible mount configurations for each path to validate the diagnostic tool.
|
||||||
|
Uses pytest framework for proper test discovery and execution.
|
||||||
|
|
||||||
|
All tests use the mounts table. For reference, the mounts table looks like this:
|
||||||
|
|
||||||
|
Path | Writeable | Mount | RAMDisk | Performance | DataLoss
|
||||||
|
------------------------------------+-----------+-------+---------+-------------+----------
|
||||||
|
/app/db | ✅ | ❌ | ➖ | ➖ | ❌
|
||||||
|
/app/config | ✅ | ❌ | ➖ | ➖ | ❌
|
||||||
|
/app/api | ✅ | ❌ | ❌ | ❌ | ✅
|
||||||
|
/app/log | ✅ | ❌ | ❌ | ❌ | ✅
|
||||||
|
/services/run | ✅ | ❌ | ❌ | ❌ | ✅
|
||||||
|
/services/config/nginx/conf.active | ✅ | ❌ | ❌ | ❌ | ✅
|
||||||
|
|
||||||
|
Table Assertions:
|
||||||
|
- Use assert_table_row(output, path, writeable=True/False/None, mount=True/False/None, ...)
|
||||||
|
- Emojis are converted: ✅=True, ❌=False, ➖=None
|
||||||
|
- Example: assert_table_row(output, "/app/db", writeable=True, mount=False, dataloss=False)
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import pytest
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from typing import List, Optional, Tuple, Union
|
||||||
|
|
||||||
|
# Test configurations directory
|
||||||
|
CONFIG_DIR = Path(__file__).parent / "configurations"
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class MountTableRow:
|
||||||
|
"""Represents a parsed row from the mount diagnostic table."""
|
||||||
|
path: str
|
||||||
|
writeable: bool
|
||||||
|
mount: bool
|
||||||
|
ramdisk: Optional[bool] # None for ➖
|
||||||
|
performance: Optional[bool] # None for ➖
|
||||||
|
dataloss: bool
|
||||||
|
|
||||||
|
def parse_mount_table(output: str) -> List[MountTableRow]:
|
||||||
|
"""Parse the mount diagnostic table from stdout."""
|
||||||
|
rows = []
|
||||||
|
|
||||||
|
# Find the table in the output
|
||||||
|
lines = output.split('\n')
|
||||||
|
table_start = None
|
||||||
|
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
if line.startswith(' Path ') and '|' in line:
|
||||||
|
table_start = i
|
||||||
|
break
|
||||||
|
|
||||||
|
if table_start is None:
|
||||||
|
return rows
|
||||||
|
|
||||||
|
# Skip header and separator lines
|
||||||
|
data_lines = lines[table_start + 2:]
|
||||||
|
|
||||||
|
for line in data_lines:
|
||||||
|
if '|' not in line or line.strip() == '':
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Split by | and clean up
|
||||||
|
parts = [part.strip() for part in line.split('|')]
|
||||||
|
if len(parts) < 6:
|
||||||
|
continue
|
||||||
|
|
||||||
|
path = parts[0]
|
||||||
|
if not path:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Convert emojis to boolean/none
|
||||||
|
def emoji_to_bool(emoji: str) -> Optional[bool]:
|
||||||
|
emoji = emoji.strip()
|
||||||
|
if emoji == '✅':
|
||||||
|
return True
|
||||||
|
elif emoji == '❌':
|
||||||
|
return False
|
||||||
|
elif emoji == '➖':
|
||||||
|
return None
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
row = MountTableRow(
|
||||||
|
path=path,
|
||||||
|
writeable=emoji_to_bool(parts[1]),
|
||||||
|
mount=emoji_to_bool(parts[2]),
|
||||||
|
ramdisk=emoji_to_bool(parts[3]),
|
||||||
|
performance=emoji_to_bool(parts[4]),
|
||||||
|
dataloss=emoji_to_bool(parts[5])
|
||||||
|
)
|
||||||
|
rows.append(row)
|
||||||
|
except (IndexError, ValueError):
|
||||||
|
continue
|
||||||
|
|
||||||
|
return rows
|
||||||
|
|
||||||
|
def assert_table_row(output: str, expected_path: str,
|
||||||
|
writeable: Optional[bool] = None,
|
||||||
|
mount: Optional[bool] = None,
|
||||||
|
ramdisk: Optional[bool] = None,
|
||||||
|
performance: Optional[bool] = None,
|
||||||
|
dataloss: Optional[bool] = None) -> MountTableRow:
|
||||||
|
"""Assert that a specific table row matches expected values."""
|
||||||
|
|
||||||
|
rows = parse_mount_table(output)
|
||||||
|
|
||||||
|
# Find the row for the expected path
|
||||||
|
matching_row = None
|
||||||
|
for row in rows:
|
||||||
|
if row.path == expected_path:
|
||||||
|
matching_row = row
|
||||||
|
break
|
||||||
|
|
||||||
|
assert matching_row is not None, f"Path '{expected_path}' not found in table. Available paths: {[r.path for r in rows]}"
|
||||||
|
|
||||||
|
# Check each field if specified
|
||||||
|
if writeable is not None:
|
||||||
|
assert matching_row.writeable == writeable, f"Path '{expected_path}': expected writeable={writeable}, got {matching_row.writeable}"
|
||||||
|
|
||||||
|
if mount is not None:
|
||||||
|
assert matching_row.mount == mount, f"Path '{expected_path}': expected mount={mount}, got {matching_row.mount}"
|
||||||
|
|
||||||
|
if ramdisk is not None:
|
||||||
|
assert matching_row.ramdisk == ramdisk, f"Path '{expected_path}': expected ramdisk={ramdisk}, got {matching_row.ramdisk}"
|
||||||
|
|
||||||
|
if performance is not None:
|
||||||
|
assert matching_row.performance == performance, f"Path '{expected_path}': expected performance={performance}, got {matching_row.performance}"
|
||||||
|
|
||||||
|
if dataloss is not None:
|
||||||
|
assert matching_row.dataloss == dataloss, f"Path '{expected_path}': expected dataloss={dataloss}, got {matching_row.dataloss}"
|
||||||
|
|
||||||
|
return matching_row
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class TestScenario:
|
||||||
|
"""Represents a test scenario for a specific path configuration."""
|
||||||
|
__test__ = False # Prevent pytest from collecting this as a test class
|
||||||
|
name: str
|
||||||
|
path_var: str
|
||||||
|
container_path: str
|
||||||
|
is_persistent: bool
|
||||||
|
docker_compose: str
|
||||||
|
expected_issues: List[str] # List of expected issue types
|
||||||
|
|
||||||
|
@pytest.fixture(scope="session")
|
||||||
|
def netalertx_test_image():
|
||||||
|
"""Ensure the netalertx-test image exists."""
|
||||||
|
image_name = os.environ.get("NETALERTX_TEST_IMAGE", "netalertx-test")
|
||||||
|
|
||||||
|
# Check if image exists
|
||||||
|
result = subprocess.run(
|
||||||
|
["docker", "images", "-q", image_name],
|
||||||
|
capture_output=True,
|
||||||
|
text=True
|
||||||
|
)
|
||||||
|
|
||||||
|
if not result.stdout.strip():
|
||||||
|
pytest.skip(f"NetAlertX test image '{image_name}' not found. Build it first.")
|
||||||
|
|
||||||
|
return image_name
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def test_scenario(request):
|
||||||
|
"""Fixture that provides test scenarios."""
|
||||||
|
return request.param
|
||||||
|
|
||||||
|
def create_test_scenarios() -> List[TestScenario]:
|
||||||
|
"""Create all test scenarios."""
|
||||||
|
|
||||||
|
scenarios = []
|
||||||
|
|
||||||
|
# Define paths to test
|
||||||
|
paths = [
|
||||||
|
("db", "/app/db", True, "NETALERTX_DB"),
|
||||||
|
("config", "/app/config", True, "NETALERTX_CONFIG"),
|
||||||
|
("api", "/app/api", False, "NETALERTX_API"),
|
||||||
|
("log", "/app/log", False, "NETALERTX_LOG"),
|
||||||
|
("run", "/services/run", False, "SYSTEM_SERVICES_RUN"),
|
||||||
|
("active_config", "/services/config/nginx/conf.active", False, "SYSTEM_SERVICES_ACTIVE_CONFIG"),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Test scenarios for each path
|
||||||
|
test_scenarios = [
|
||||||
|
("no-mount", ["table_issues", "warning_message"]), # Always issues
|
||||||
|
("ramdisk", []), # Good for non-persistent, bad for persistent
|
||||||
|
("mounted", ["table_issues", "warning_message"]), # Bad for non-persistent, good for persistent
|
||||||
|
("unwritable", ["table_issues", "warning_message"]), # Always issues
|
||||||
|
]
|
||||||
|
|
||||||
|
for path_name, container_path, is_persistent, env_var in paths:
|
||||||
|
for scenario_name, base_expected_issues in test_scenarios:
|
||||||
|
# Adjust expected issues based on persistence and scenario
|
||||||
|
expected_issues = list(base_expected_issues) # Copy the list
|
||||||
|
|
||||||
|
if scenario_name == "ramdisk" and is_persistent:
|
||||||
|
# Ramdisk is bad for persistent paths
|
||||||
|
expected_issues = ["table_issues", "warning_message"]
|
||||||
|
elif scenario_name == "mounted" and is_persistent:
|
||||||
|
# Mounted is good for persistent paths
|
||||||
|
expected_issues = []
|
||||||
|
|
||||||
|
compose_file = f"docker-compose.mount-test.{path_name}_{scenario_name}.yml"
|
||||||
|
|
||||||
|
scenarios.append(TestScenario(
|
||||||
|
name=f"{path_name}_{scenario_name}",
|
||||||
|
path_var=env_var,
|
||||||
|
container_path=container_path,
|
||||||
|
is_persistent=is_persistent,
|
||||||
|
docker_compose=compose_file,
|
||||||
|
expected_issues=expected_issues
|
||||||
|
))
|
||||||
|
|
||||||
|
return scenarios
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("test_scenario", create_test_scenarios(), ids=lambda s: s.name)
|
||||||
|
@pytest.mark.docker
|
||||||
|
def test_mount_diagnostic(netalertx_test_image, test_scenario):
|
||||||
|
"""Test that the mount diagnostic tool correctly identifies issues for each configuration."""
|
||||||
|
|
||||||
|
# Use the pre-generated docker-compose file
|
||||||
|
compose_file = CONFIG_DIR / "mount-tests" / test_scenario.docker_compose
|
||||||
|
assert compose_file.exists(), f"Docker compose file not found: {compose_file}"
|
||||||
|
|
||||||
|
# Start container
|
||||||
|
project_name = f"mount-test-{test_scenario.name.replace('_', '-')}"
|
||||||
|
cmd_up = [
|
||||||
|
"docker-compose", "-f", str(compose_file),
|
||||||
|
"-p", project_name, "up", "-d"
|
||||||
|
]
|
||||||
|
|
||||||
|
result_up = subprocess.run(cmd_up, capture_output=True, text=True, timeout=60)
|
||||||
|
if result_up.returncode != 0:
|
||||||
|
pytest.fail(
|
||||||
|
f"Failed to start container: {result_up.stderr}\n"
|
||||||
|
f"STDOUT: {result_up.stdout}"
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Wait for container to be ready
|
||||||
|
import time
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
|
# Check if container is still running
|
||||||
|
container_name = f"netalertx-test-mount-{test_scenario.name}"
|
||||||
|
result_ps = subprocess.run(
|
||||||
|
["docker", "ps", "-q", "-f", f"name={container_name}"],
|
||||||
|
capture_output=True, text=True
|
||||||
|
)
|
||||||
|
|
||||||
|
if not result_ps.stdout.strip():
|
||||||
|
# Container exited - this is expected for configurations with issues
|
||||||
|
# Check the logs to see if it detected the expected issues
|
||||||
|
result_logs = subprocess.run(
|
||||||
|
["docker", "logs", container_name],
|
||||||
|
capture_output=True, text=True
|
||||||
|
)
|
||||||
|
|
||||||
|
logs = result_logs.stdout + result_logs.stderr
|
||||||
|
|
||||||
|
# For tests that expect issues, validate the table content
|
||||||
|
if test_scenario.expected_issues:
|
||||||
|
# Parse and validate the table for the specific path being tested
|
||||||
|
try:
|
||||||
|
if test_scenario.name.startswith('db_'):
|
||||||
|
if test_scenario.name == 'db_ramdisk':
|
||||||
|
# db on ramdisk: mount=True, ramdisk=False (detected), dataloss=False (risk)
|
||||||
|
assert_table_row(logs, '/app/db', mount=True, ramdisk=False, dataloss=False)
|
||||||
|
elif test_scenario.name == 'db_no-mount':
|
||||||
|
# db not mounted: mount=False, dataloss=False (risk)
|
||||||
|
assert_table_row(logs, '/app/db', mount=False, dataloss=False)
|
||||||
|
elif test_scenario.name == 'db_unwritable':
|
||||||
|
# db read-only: writeable=False
|
||||||
|
assert_table_row(logs, '/app/db', writeable=False)
|
||||||
|
|
||||||
|
elif test_scenario.name.startswith('config_'):
|
||||||
|
if test_scenario.name == 'config_ramdisk':
|
||||||
|
# config on ramdisk: mount=True, ramdisk=False (detected), dataloss=False (risk)
|
||||||
|
assert_table_row(logs, '/app/config', mount=True, ramdisk=False, dataloss=False)
|
||||||
|
elif test_scenario.name == 'config_no-mount':
|
||||||
|
# config not mounted: mount=False, dataloss=False (risk)
|
||||||
|
assert_table_row(logs, '/app/config', mount=False, dataloss=False)
|
||||||
|
elif test_scenario.name == 'config_unwritable':
|
||||||
|
# config read-only: writeable=False
|
||||||
|
assert_table_row(logs, '/app/config', writeable=False)
|
||||||
|
|
||||||
|
elif test_scenario.name.startswith('api_'):
|
||||||
|
if test_scenario.name == 'api_mounted':
|
||||||
|
# api with volume mount: mount=True, performance=False (not ramdisk)
|
||||||
|
assert_table_row(logs, '/app/api', mount=True, performance=False)
|
||||||
|
elif test_scenario.name == 'api_no-mount':
|
||||||
|
# api not mounted: mount=False, performance=False (not ramdisk)
|
||||||
|
assert_table_row(logs, '/app/api', mount=False, performance=False)
|
||||||
|
elif test_scenario.name == 'api_unwritable':
|
||||||
|
# api read-only: writeable=False
|
||||||
|
assert_table_row(logs, '/app/api', writeable=False)
|
||||||
|
|
||||||
|
elif test_scenario.name.startswith('log_'):
|
||||||
|
if test_scenario.name == 'log_mounted':
|
||||||
|
# log with volume mount: mount=True, performance=False (not ramdisk)
|
||||||
|
assert_table_row(logs, '/app/log', mount=True, performance=False)
|
||||||
|
elif test_scenario.name == 'log_no-mount':
|
||||||
|
# log not mounted: mount=False, performance=False (not ramdisk)
|
||||||
|
assert_table_row(logs, '/app/log', mount=False, performance=False)
|
||||||
|
elif test_scenario.name == 'log_unwritable':
|
||||||
|
# log read-only: writeable=False
|
||||||
|
assert_table_row(logs, '/app/log', writeable=False)
|
||||||
|
|
||||||
|
elif test_scenario.name.startswith('run_'):
|
||||||
|
if test_scenario.name == 'run_mounted':
|
||||||
|
# run with volume mount: mount=True, performance=False (not ramdisk)
|
||||||
|
assert_table_row(logs, '/services/run', mount=True, performance=False)
|
||||||
|
elif test_scenario.name == 'run_no-mount':
|
||||||
|
# run not mounted: mount=False, performance=False (not ramdisk)
|
||||||
|
assert_table_row(logs, '/services/run', mount=False, performance=False)
|
||||||
|
elif test_scenario.name == 'run_unwritable':
|
||||||
|
# run read-only: writeable=False
|
||||||
|
assert_table_row(logs, '/services/run', writeable=False)
|
||||||
|
|
||||||
|
elif test_scenario.name.startswith('active_config_'):
|
||||||
|
if test_scenario.name == 'active_config_mounted':
|
||||||
|
# active_config with volume mount: mount=True, performance=False (not ramdisk)
|
||||||
|
assert_table_row(logs, '/services/config/nginx/conf.active', mount=True, performance=False)
|
||||||
|
elif test_scenario.name == 'active_config_no-mount':
|
||||||
|
# active_config not mounted: mount=False, performance=False (not ramdisk)
|
||||||
|
assert_table_row(logs, '/services/config/nginx/conf.active', mount=False, performance=False)
|
||||||
|
elif test_scenario.name == 'active_config_unwritable':
|
||||||
|
# active_config read-only: but path doesn't exist, so parent dir check makes it writeable=True
|
||||||
|
# This is a bug in the diagnostic tool, but we test the current behavior
|
||||||
|
assert_table_row(logs, '/services/config/nginx/conf.active', writeable=True)
|
||||||
|
|
||||||
|
except AssertionError as e:
|
||||||
|
pytest.fail(f"Table validation failed for {test_scenario.name}: {e}")
|
||||||
|
|
||||||
|
return # Test passed - container correctly detected issues and exited
|
||||||
|
|
||||||
|
# Container is still running - run diagnostic tool
|
||||||
|
cmd_exec = [
|
||||||
|
"docker", "exec", container_name,
|
||||||
|
"python3", "/entrypoint.d/10-mounts.py"
|
||||||
|
]
|
||||||
|
|
||||||
|
result_exec = subprocess.run(cmd_exec, capture_output=True, text=True, timeout=30)
|
||||||
|
assert result_exec.returncode == 0, f"Diagnostic tool failed: {result_exec.stderr}"
|
||||||
|
|
||||||
|
# For good configurations (no issues expected), verify no output
|
||||||
|
if not test_scenario.expected_issues:
|
||||||
|
assert result_exec.stdout.strip() == "", f"Good config {test_scenario.name} should produce no stdout, got: {result_exec.stdout}"
|
||||||
|
assert result_exec.stderr.strip() == "", f"Good config {test_scenario.name} should produce no stderr, got: {result_exec.stderr}"
|
||||||
|
return # Test passed - good configuration correctly produces no issues
|
||||||
|
|
||||||
|
finally:
|
||||||
|
# Stop container
|
||||||
|
cmd_down = [
|
||||||
|
"docker-compose", "-f", str(compose_file),
|
||||||
|
"-p", project_name, "down", "-v"
|
||||||
|
]
|
||||||
|
subprocess.run(cmd_down, capture_output=True, timeout=30)
|
||||||
|
|
||||||
|
def test_table_parsing():
|
||||||
|
"""Test the table parsing and assertion functions."""
|
||||||
|
|
||||||
|
sample_output = """
|
||||||
|
Path | Writeable | Mount | RAMDisk | Performance | DataLoss
|
||||||
|
------------------------------------+-----------+-------+---------+-------------+----------
|
||||||
|
/app/db | ✅ | ❌ | ➖ | ➖ | ❌
|
||||||
|
/app/api | ✅ | ✅ | ✅ | ✅ | ✅
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Test parsing
|
||||||
|
rows = parse_mount_table(sample_output)
|
||||||
|
assert len(rows) == 2
|
||||||
|
|
||||||
|
# Test assertions
|
||||||
|
assert_table_row(sample_output, "/app/db", writeable=True, mount=False, ramdisk=None, performance=None, dataloss=False)
|
||||||
|
assert_table_row(sample_output, "/app/api", writeable=True, mount=True, ramdisk=True, performance=True, dataloss=True)
|
||||||
Reference in New Issue
Block a user