Loading ansible/tests/unit/test_eurecom_lab.py +8 −1 Changes for ansible/tests/unit/test_eurecom_lab.py: 8 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -108,5 +108,12 @@ def test_failed_start_records_safe_states_before_cleanup_and_preserves_failure(t assert caught.value is failure states=lab.evidence['startup_failure'] assert states['ue-identity']=={'status':'exited','exit_code':1,'oom_killed':False, 'health':'unhealthy','redis_connection_error':True} 'health':'unhealthy','redis_connection_error':True,'upstream_resolution_error':False} assert 'PRIVATE-CONFIG' not in json.dumps(lab.evidence)+capsys.readouterr().out def test_ingress_waits_for_every_proxy_target_including_redis_delayed_monitoring(): actual=composition(original(),{'upstream:test':'example/nef@sha256:'+'a'*64},'k3d-owned','/owned','oop-ci-owned')['services'] assert actual['ingress-controller']['depends_on']=={ name:{'condition':'service_healthy'} for name in ('as-session-with-qos','traffic-influence','monitoring-event','ue-id','ue-address')} ci/eurecom_lab.py +7 −0 Changes for ci/eurecom_lab.py: 7 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -53,6 +53,12 @@ def composition(original, pins, network, directory, name): } for key in ('ue-identity', 'ue-profile', 'monitoring-event', 'core-network-service'): services[key].setdefault('depends_on', {})['redis'] = {'condition':'service_healthy'} # Nginx resolves every proxy target when it starts, including the monitoring # service delayed by Redis readiness. Wait for all configured upstreams. services['ingress-controller']['depends_on'] = { key:{'condition':'service_healthy'} for key in ( 'as-session-with-qos','traffic-influence','monitoring-event','ue-id','ue-address') } return {'services':services, 'networks':{'lab':{'external':True,'name':network}}} Loading Loading @@ -169,6 +175,7 @@ class EurecomLab: 'redis_connection_error':bool(re.search( r'(?i)(redis|:6379).*?(refused|timeout|no such host|failed|error)', logs.stdout + logs.stderr)), 'upstream_resolution_error':'host not found in upstream' in (logs.stdout + logs.stderr).lower(), } except (OSError, ValueError, KeyError, IndexError, subprocess.SubprocessError): failures[key] = {'diagnostic':'unavailable'} Loading ci/lab/README.md +4 −2 Changes for ci/lab/README.md: 4 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -396,5 +396,7 @@ GitLab runner or qualification of release-specific images. EURECOM middleware waits for a successful Redis PING before starting. The lab retains upstream health checks and the CoreSim dependency. A failed provider startup records only container state, exit code, OOM status, health and a Redis connection-error classification before cleanup; raw provider logs stay private. startup records only container state, exit code, OOM status, health and fixed Redis-connection/upstream-resolution error classifications before cleanup; raw provider logs stay private. Ingress waits for all five configured proxy targets to be healthy before Nginx resolves their names at startup. Loading
ansible/tests/unit/test_eurecom_lab.py +8 −1 Changes for ansible/tests/unit/test_eurecom_lab.py: 8 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -108,5 +108,12 @@ def test_failed_start_records_safe_states_before_cleanup_and_preserves_failure(t assert caught.value is failure states=lab.evidence['startup_failure'] assert states['ue-identity']=={'status':'exited','exit_code':1,'oom_killed':False, 'health':'unhealthy','redis_connection_error':True} 'health':'unhealthy','redis_connection_error':True,'upstream_resolution_error':False} assert 'PRIVATE-CONFIG' not in json.dumps(lab.evidence)+capsys.readouterr().out def test_ingress_waits_for_every_proxy_target_including_redis_delayed_monitoring(): actual=composition(original(),{'upstream:test':'example/nef@sha256:'+'a'*64},'k3d-owned','/owned','oop-ci-owned')['services'] assert actual['ingress-controller']['depends_on']=={ name:{'condition':'service_healthy'} for name in ('as-session-with-qos','traffic-influence','monitoring-event','ue-id','ue-address')}
ci/eurecom_lab.py +7 −0 Changes for ci/eurecom_lab.py: 7 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -53,6 +53,12 @@ def composition(original, pins, network, directory, name): } for key in ('ue-identity', 'ue-profile', 'monitoring-event', 'core-network-service'): services[key].setdefault('depends_on', {})['redis'] = {'condition':'service_healthy'} # Nginx resolves every proxy target when it starts, including the monitoring # service delayed by Redis readiness. Wait for all configured upstreams. services['ingress-controller']['depends_on'] = { key:{'condition':'service_healthy'} for key in ( 'as-session-with-qos','traffic-influence','monitoring-event','ue-id','ue-address') } return {'services':services, 'networks':{'lab':{'external':True,'name':network}}} Loading Loading @@ -169,6 +175,7 @@ class EurecomLab: 'redis_connection_error':bool(re.search( r'(?i)(redis|:6379).*?(refused|timeout|no such host|failed|error)', logs.stdout + logs.stderr)), 'upstream_resolution_error':'host not found in upstream' in (logs.stdout + logs.stderr).lower(), } except (OSError, ValueError, KeyError, IndexError, subprocess.SubprocessError): failures[key] = {'diagnostic':'unavailable'} Loading
ci/lab/README.md +4 −2 Changes for ci/lab/README.md: 4 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -396,5 +396,7 @@ GitLab runner or qualification of release-specific images. EURECOM middleware waits for a successful Redis PING before starting. The lab retains upstream health checks and the CoreSim dependency. A failed provider startup records only container state, exit code, OOM status, health and a Redis connection-error classification before cleanup; raw provider logs stay private. startup records only container state, exit code, OOM status, health and fixed Redis-connection/upstream-resolution error classifications before cleanup; raw provider logs stay private. Ingress waits for all five configured proxy targets to be healthy before Nginx resolves their names at startup.