Implemented returning correct health for stopped instances.

This commit is contained in:
acsbendi 2019-07-18 16:57:27 +02:00
parent 44e93c94e8
commit 9149852217
2 changed files with 15 additions and 4 deletions

View File

@ -35,12 +35,13 @@ from .exceptions import (
class FakeHealthStatus(BaseModel): class FakeHealthStatus(BaseModel):
def __init__(self, instance_id, port, health_port, status, reason=None): def __init__(self, instance_id, port, health_port, status, reason=None, description=None):
self.instance_id = instance_id self.instance_id = instance_id
self.port = port self.port = port
self.health_port = health_port self.health_port = health_port
self.status = status self.status = status
self.reason = reason self.reason = reason
self.description = description
class FakeTargetGroup(BaseModel): class FakeTargetGroup(BaseModel):
@ -69,7 +70,7 @@ class FakeTargetGroup(BaseModel):
self.protocol = protocol self.protocol = protocol
self.port = port self.port = port
self.healthcheck_protocol = healthcheck_protocol or 'HTTP' self.healthcheck_protocol = healthcheck_protocol or 'HTTP'
self.healthcheck_port = healthcheck_port or 'traffic-port' self.healthcheck_port = healthcheck_port or str(self.port)
self.healthcheck_path = healthcheck_path or '/' self.healthcheck_path = healthcheck_path or '/'
self.healthcheck_interval_seconds = healthcheck_interval_seconds or 30 self.healthcheck_interval_seconds = healthcheck_interval_seconds or 30
self.healthcheck_timeout_seconds = healthcheck_timeout_seconds or 5 self.healthcheck_timeout_seconds = healthcheck_timeout_seconds or 5
@ -112,10 +113,14 @@ class FakeTargetGroup(BaseModel):
raise TooManyTagsError() raise TooManyTagsError()
self.tags[key] = value self.tags[key] = value
def health_for(self, target): def health_for(self, target, ec2_backend):
t = self.targets.get(target['id']) t = self.targets.get(target['id'])
if t is None: if t is None:
raise InvalidTargetError() raise InvalidTargetError()
if t['id'].startswith("i-"): # EC2 instance ID
instance = ec2_backend.get_instance_by_id(t['id'])
if instance.state == "stopped":
return FakeHealthStatus(t['id'], t['port'], self.healthcheck_port, 'unused', 'Target.InvalidState', 'Target is in the stopped state')
return FakeHealthStatus(t['id'], t['port'], self.healthcheck_port, 'healthy') return FakeHealthStatus(t['id'], t['port'], self.healthcheck_port, 'healthy')
@classmethod @classmethod
@ -712,7 +717,7 @@ class ELBv2Backend(BaseBackend):
if not targets: if not targets:
targets = target_group.targets.values() targets = target_group.targets.values()
return [target_group.health_for(target) for target in targets] return [target_group.health_for(target, self.ec2_backend) for target in targets]
def set_rule_priorities(self, rule_priorities): def set_rule_priorities(self, rule_priorities):
# validate # validate

View File

@ -1208,6 +1208,12 @@ DESCRIBE_TARGET_HEALTH_TEMPLATE = """<DescribeTargetHealthResponse xmlns="http:/
<HealthCheckPort>{{ target_health.health_port }}</HealthCheckPort> <HealthCheckPort>{{ target_health.health_port }}</HealthCheckPort>
<TargetHealth> <TargetHealth>
<State>{{ target_health.status }}</State> <State>{{ target_health.status }}</State>
{% if target_health.reason %}
<Reason>{{ target_health.reason }}</Reason>
{% endif %}
{% if target_health.description %}
<Description>{{ target_health.description }}</Description>
{% endif %}
</TargetHealth> </TargetHealth>
<Target> <Target>
<Port>{{ target_health.port }}</Port> <Port>{{ target_health.port }}</Port>