401 lines
14 KiB
YAML
401 lines
14 KiB
YAML
|
|
---
|
||
|
|
# Comprehensive smoke tests for Veza V5 Ultra deployment
|
||
|
|
# Validates all services and endpoints
|
||
|
|
|
||
|
|
- name: Run smoke tests for Veza V5 Ultra
|
||
|
|
hosts: edge
|
||
|
|
become: false
|
||
|
|
gather_facts: true
|
||
|
|
|
||
|
|
vars:
|
||
|
|
domain: "{{ domain | default('veza.talas.fr') }}"
|
||
|
|
haproxy_container: "veza-haproxy"
|
||
|
|
backend_container: "veza-backend"
|
||
|
|
chat_container: "veza-chat"
|
||
|
|
stream_container: "veza-stream"
|
||
|
|
web_container: "veza-web"
|
||
|
|
|
||
|
|
tasks:
|
||
|
|
- name: Test container connectivity
|
||
|
|
block:
|
||
|
|
- name: Check if containers are running
|
||
|
|
command: incus list --format=json
|
||
|
|
register: containers_status
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display container status
|
||
|
|
debug:
|
||
|
|
msg: "Container {{ item.name }}: {{ 'Running' if item.status == 'Running' else item.status }}"
|
||
|
|
loop: "{{ containers_status.stdout | from_json }}"
|
||
|
|
|
||
|
|
- name: Verify all required containers are running
|
||
|
|
assert:
|
||
|
|
that:
|
||
|
|
- containers_status.stdout | from_json | selectattr('name', 'in', [haproxy_container, backend_container, chat_container, stream_container, web_container]) | selectattr('status', 'equalto', 'Running') | list | length == 5
|
||
|
|
fail_msg: "Not all required containers are running"
|
||
|
|
success_msg: "All required containers are running"
|
||
|
|
|
||
|
|
rescue:
|
||
|
|
- name: Container connectivity test failed
|
||
|
|
debug:
|
||
|
|
msg: "Container connectivity test failed, continuing with other tests"
|
||
|
|
|
||
|
|
- name: Test HAProxy service
|
||
|
|
block:
|
||
|
|
- name: Check HAProxy service status
|
||
|
|
command: |
|
||
|
|
incus exec {{ haproxy_container }} -- systemctl is-active haproxy
|
||
|
|
register: haproxy_active
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display HAProxy status
|
||
|
|
debug:
|
||
|
|
msg: "HAProxy service: {{ haproxy_active.stdout }}"
|
||
|
|
|
||
|
|
- name: Test HAProxy configuration
|
||
|
|
command: |
|
||
|
|
incus exec {{ haproxy_container }} -- haproxy -c -f /etc/haproxy/haproxy.cfg
|
||
|
|
register: haproxy_config_test
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display HAProxy config test
|
||
|
|
debug:
|
||
|
|
var: haproxy_config_test.stdout_lines
|
||
|
|
|
||
|
|
- name: Check HAProxy statistics
|
||
|
|
command: |
|
||
|
|
incus exec {{ haproxy_container }} -- curl -s http://localhost:8404/stats | head -10
|
||
|
|
register: haproxy_stats
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display HAProxy statistics
|
||
|
|
debug:
|
||
|
|
var: haproxy_stats.stdout_lines
|
||
|
|
|
||
|
|
rescue:
|
||
|
|
- name: HAProxy test failed
|
||
|
|
debug:
|
||
|
|
msg: "HAProxy test failed, continuing with other tests"
|
||
|
|
|
||
|
|
- name: Test Backend API service
|
||
|
|
block:
|
||
|
|
- name: Check backend service status
|
||
|
|
command: |
|
||
|
|
incus exec {{ backend_container }} -- systemctl is-active veza-backend
|
||
|
|
register: backend_active
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display backend status
|
||
|
|
debug:
|
||
|
|
msg: "Backend service: {{ backend_active.stdout }}"
|
||
|
|
|
||
|
|
- name: Test backend health endpoint
|
||
|
|
command: |
|
||
|
|
incus exec {{ backend_container }} -- curl -s http://localhost:8080/api/health
|
||
|
|
register: backend_health
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display backend health response
|
||
|
|
debug:
|
||
|
|
var: backend_health.stdout_lines
|
||
|
|
|
||
|
|
- name: Test backend API endpoint
|
||
|
|
command: |
|
||
|
|
incus exec {{ backend_container }} -- curl -s http://localhost:8080/api/
|
||
|
|
register: backend_api
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display backend API response
|
||
|
|
debug:
|
||
|
|
var: backend_api.stdout_lines
|
||
|
|
|
||
|
|
- name: Verify backend responses
|
||
|
|
assert:
|
||
|
|
that:
|
||
|
|
- backend_health.stdout | from_json | selectattr('status', 'equalto', 'ok') | list | length > 0
|
||
|
|
- backend_api.stdout | from_json | selectattr('message', 'defined') | list | length > 0
|
||
|
|
fail_msg: "Backend API responses are invalid"
|
||
|
|
success_msg: "Backend API is responding correctly"
|
||
|
|
|
||
|
|
rescue:
|
||
|
|
- name: Backend test failed
|
||
|
|
debug:
|
||
|
|
msg: "Backend test failed, continuing with other tests"
|
||
|
|
|
||
|
|
- name: Test Chat WebSocket service
|
||
|
|
block:
|
||
|
|
- name: Check chat service status
|
||
|
|
command: |
|
||
|
|
incus exec {{ chat_container }} -- systemctl is-active veza-chat
|
||
|
|
register: chat_active
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display chat status
|
||
|
|
debug:
|
||
|
|
msg: "Chat service: {{ chat_active.stdout }}"
|
||
|
|
|
||
|
|
- name: Test chat health endpoint
|
||
|
|
command: |
|
||
|
|
incus exec {{ chat_container }} -- curl -s http://localhost:8081/health
|
||
|
|
register: chat_health
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display chat health response
|
||
|
|
debug:
|
||
|
|
var: chat_health.stdout_lines
|
||
|
|
|
||
|
|
- name: Test WebSocket connection (basic)
|
||
|
|
command: |
|
||
|
|
incus exec {{ chat_container }} -- timeout 5 bash -c 'echo "test message" | nc localhost 8081' || true
|
||
|
|
register: websocket_test
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display WebSocket test result
|
||
|
|
debug:
|
||
|
|
var: websocket_test.stdout_lines
|
||
|
|
|
||
|
|
rescue:
|
||
|
|
- name: Chat test failed
|
||
|
|
debug:
|
||
|
|
msg: "Chat test failed, continuing with other tests"
|
||
|
|
|
||
|
|
- name: Test Stream HLS service
|
||
|
|
block:
|
||
|
|
- name: Check stream service status
|
||
|
|
command: |
|
||
|
|
incus exec {{ stream_container }} -- systemctl is-active veza-stream
|
||
|
|
register: stream_active
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display stream status
|
||
|
|
debug:
|
||
|
|
msg: "Stream service: {{ stream_active.stdout }}"
|
||
|
|
|
||
|
|
- name: Test stream health endpoint
|
||
|
|
command: |
|
||
|
|
incus exec {{ stream_container }} -- curl -s http://localhost:8082/stream/health
|
||
|
|
register: stream_health
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display stream health response
|
||
|
|
debug:
|
||
|
|
var: stream_health.stdout_lines
|
||
|
|
|
||
|
|
- name: Test HLS endpoint
|
||
|
|
command: |
|
||
|
|
incus exec {{ stream_container }} -- curl -s http://localhost:8082/stream/test.m3u8
|
||
|
|
register: hls_test
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display HLS test response
|
||
|
|
debug:
|
||
|
|
var: hls_test.stdout_lines
|
||
|
|
|
||
|
|
- name: Verify HLS response
|
||
|
|
assert:
|
||
|
|
that:
|
||
|
|
- hls_test.stdout is search('EXTM3U')
|
||
|
|
fail_msg: "HLS endpoint is not returning valid M3U8 content"
|
||
|
|
success_msg: "HLS endpoint is working correctly"
|
||
|
|
|
||
|
|
rescue:
|
||
|
|
- name: Stream test failed
|
||
|
|
debug:
|
||
|
|
msg: "Stream test failed, continuing with other tests"
|
||
|
|
|
||
|
|
- name: Test Web application
|
||
|
|
block:
|
||
|
|
- name: Check web service status
|
||
|
|
command: |
|
||
|
|
incus exec {{ web_container }} -- systemctl is-active veza-web
|
||
|
|
register: web_active
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display web status
|
||
|
|
debug:
|
||
|
|
msg: "Web service: {{ web_active.stdout }}"
|
||
|
|
|
||
|
|
- name: Test web application
|
||
|
|
command: |
|
||
|
|
incus exec {{ web_container }} -- curl -s http://localhost:3000/
|
||
|
|
register: web_test
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display web test response
|
||
|
|
debug:
|
||
|
|
msg: "Web response length: {{ web_test.stdout | length }} characters"
|
||
|
|
|
||
|
|
- name: Verify web response
|
||
|
|
assert:
|
||
|
|
that:
|
||
|
|
- web_test.stdout is search('Veza V5 Ultra')
|
||
|
|
fail_msg: "Web application is not returning expected content"
|
||
|
|
success_msg: "Web application is working correctly"
|
||
|
|
|
||
|
|
rescue:
|
||
|
|
- name: Web test failed
|
||
|
|
debug:
|
||
|
|
msg: "Web test failed, continuing with other tests"
|
||
|
|
|
||
|
|
- name: Test external access through HAProxy
|
||
|
|
block:
|
||
|
|
- name: Test HTTP redirect
|
||
|
|
uri:
|
||
|
|
url: "http://{{ domain }}"
|
||
|
|
method: GET
|
||
|
|
follow_redirects: none
|
||
|
|
status_code: 301
|
||
|
|
register: http_redirect
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display HTTP redirect result
|
||
|
|
debug:
|
||
|
|
msg: "HTTP redirect: {{ 'Working' if http_redirect.status == 301 else 'Failed' }}"
|
||
|
|
|
||
|
|
- name: Test HTTPS access (if certificate available)
|
||
|
|
uri:
|
||
|
|
url: "https://{{ domain }}"
|
||
|
|
method: GET
|
||
|
|
validate_certs: false
|
||
|
|
status_code: 200
|
||
|
|
register: https_test
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display HTTPS test result
|
||
|
|
debug:
|
||
|
|
msg: "HTTPS access: {{ 'Working' if https_test.status == 200 else 'Failed or certificate not available' }}"
|
||
|
|
|
||
|
|
- name: Test API through HAProxy
|
||
|
|
uri:
|
||
|
|
url: "https://{{ domain }}/api/health"
|
||
|
|
method: GET
|
||
|
|
validate_certs: false
|
||
|
|
status_code: 200
|
||
|
|
register: api_proxy_test
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display API proxy test result
|
||
|
|
debug:
|
||
|
|
msg: "API through HAProxy: {{ 'Working' if api_proxy_test.status == 200 else 'Failed' }}"
|
||
|
|
|
||
|
|
rescue:
|
||
|
|
- name: External access test failed
|
||
|
|
debug:
|
||
|
|
msg: "External access test failed (expected if DNS not configured)"
|
||
|
|
|
||
|
|
- name: Test network connectivity between containers
|
||
|
|
block:
|
||
|
|
- name: Test backend connectivity from web container
|
||
|
|
command: |
|
||
|
|
incus exec {{ web_container }} -- curl -s http://10.10.0.101:8080/api/health
|
||
|
|
register: backend_connectivity
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display backend connectivity
|
||
|
|
debug:
|
||
|
|
msg: "Backend connectivity from web: {{ 'Working' if backend_connectivity.rc == 0 else 'Failed' }}"
|
||
|
|
|
||
|
|
- name: Test chat connectivity from web container
|
||
|
|
command: |
|
||
|
|
incus exec {{ web_container }} -- curl -s http://10.10.0.102:8081/health
|
||
|
|
register: chat_connectivity
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display chat connectivity
|
||
|
|
debug:
|
||
|
|
msg: "Chat connectivity from web: {{ 'Working' if chat_connectivity.rc == 0 else 'Failed' }}"
|
||
|
|
|
||
|
|
- name: Test stream connectivity from web container
|
||
|
|
command: |
|
||
|
|
incus exec {{ web_container }} -- curl -s http://10.10.0.103:8082/stream/health
|
||
|
|
register: stream_connectivity
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display stream connectivity
|
||
|
|
debug:
|
||
|
|
msg: "Stream connectivity from web: {{ 'Working' if stream_connectivity.rc == 0 else 'Failed' }}"
|
||
|
|
|
||
|
|
rescue:
|
||
|
|
- name: Network connectivity test failed
|
||
|
|
debug:
|
||
|
|
msg: "Network connectivity test failed"
|
||
|
|
|
||
|
|
- name: Performance and resource checks
|
||
|
|
block:
|
||
|
|
- name: Check container resource usage
|
||
|
|
command: |
|
||
|
|
incus exec {{ haproxy_container }} -- free -h
|
||
|
|
incus exec {{ backend_container }} -- free -h
|
||
|
|
incus exec {{ chat_container }} -- free -h
|
||
|
|
incus exec {{ stream_container }} -- free -h
|
||
|
|
incus exec {{ web_container }} -- free -h
|
||
|
|
register: resource_usage
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display resource usage
|
||
|
|
debug:
|
||
|
|
var: resource_usage.stdout_lines
|
||
|
|
|
||
|
|
- name: Check disk usage
|
||
|
|
command: |
|
||
|
|
incus exec {{ haproxy_container }} -- df -h
|
||
|
|
incus exec {{ backend_container }} -- df -h
|
||
|
|
incus exec {{ chat_container }} -- df -h
|
||
|
|
incus exec {{ stream_container }} -- df -h
|
||
|
|
incus exec {{ web_container }} -- df -h
|
||
|
|
register: disk_usage
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display disk usage
|
||
|
|
debug:
|
||
|
|
var: disk_usage.stdout_lines
|
||
|
|
|
||
|
|
rescue:
|
||
|
|
- name: Performance check failed
|
||
|
|
debug:
|
||
|
|
msg: "Performance check failed"
|
||
|
|
|
||
|
|
post_tasks:
|
||
|
|
- name: Generate smoke test summary
|
||
|
|
debug:
|
||
|
|
msg: |
|
||
|
|
========================================
|
||
|
|
Veza V5 Ultra Smoke Test Summary
|
||
|
|
========================================
|
||
|
|
|
||
|
|
Tests completed:
|
||
|
|
- Container connectivity: {{ 'PASS' if containers_status is defined and containers_status.rc == 0 else 'FAIL' }}
|
||
|
|
- HAProxy service: {{ 'PASS' if haproxy_active is defined and haproxy_active.stdout == 'active' else 'FAIL' }}
|
||
|
|
- Backend API: {{ 'PASS' if backend_health is defined and backend_health.rc == 0 else 'FAIL' }}
|
||
|
|
- Chat WebSocket: {{ 'PASS' if chat_health is defined and chat_health.rc == 0 else 'FAIL' }}
|
||
|
|
- Stream HLS: {{ 'PASS' if stream_health is defined and stream_health.rc == 0 else 'FAIL' }}
|
||
|
|
- Web application: {{ 'PASS' if web_test is defined and web_test.rc == 0 else 'FAIL' }}
|
||
|
|
- External access: {{ 'PASS' if https_test is defined and https_test.status == 200 else 'FAIL (expected if DNS not configured)' }}
|
||
|
|
|
||
|
|
Next steps:
|
||
|
|
1. Configure DNS A record for {{ domain }} to point to this host
|
||
|
|
2. Re-run HAProxy playbook to get Let's Encrypt certificate
|
||
|
|
3. Re-run smoke tests to verify HTTPS access
|
||
|
|
4. Monitor application logs for any issues
|
||
|
|
|
||
|
|
========================================
|
||
|
|
|
||
|
|
- name: Show container logs (last 10 lines each)
|
||
|
|
command: |
|
||
|
|
echo "=== HAProxy Logs ==="
|
||
|
|
incus exec {{ haproxy_container }} -- journalctl -u haproxy --no-pager -n 10 || true
|
||
|
|
echo "=== Backend Logs ==="
|
||
|
|
incus exec {{ backend_container }} -- journalctl -u veza-backend --no-pager -n 10 || true
|
||
|
|
echo "=== Chat Logs ==="
|
||
|
|
incus exec {{ chat_container }} -- journalctl -u veza-chat --no-pager -n 10 || true
|
||
|
|
echo "=== Stream Logs ==="
|
||
|
|
incus exec {{ stream_container }} -- journalctl -u veza-stream --no-pager -n 10 || true
|
||
|
|
echo "=== Web Logs ==="
|
||
|
|
incus exec {{ web_container }} -- journalctl -u veza-web --no-pager -n 10 || true
|
||
|
|
register: container_logs
|
||
|
|
failed_when: false
|
||
|
|
|
||
|
|
- name: Display container logs
|
||
|
|
debug:
|
||
|
|
var: container_logs.stdout_lines
|