ELBv2: describe-target-health: return unavailable target (#6195)
This commit is contained in:
parent
b999d658e3
commit
bdcc6f3335
@ -152,7 +152,17 @@ class FakeTargetGroup(CloudFormationModel):
|
|||||||
def health_for(self, target: Dict[str, Any], ec2_backend: Any) -> FakeHealthStatus:
|
def health_for(self, target: Dict[str, Any], ec2_backend: Any) -> FakeHealthStatus:
|
||||||
t = self.targets.get(target["id"])
|
t = self.targets.get(target["id"])
|
||||||
if t is None:
|
if t is None:
|
||||||
raise InvalidTargetError()
|
port = self.port
|
||||||
|
if "port" in target:
|
||||||
|
port = target["port"]
|
||||||
|
return FakeHealthStatus(
|
||||||
|
target["id"],
|
||||||
|
port,
|
||||||
|
self.healthcheck_port,
|
||||||
|
"unavailable",
|
||||||
|
"Target.NotRegistered",
|
||||||
|
"Target is not registered",
|
||||||
|
)
|
||||||
if t["id"].startswith("i-"): # EC2 instance ID
|
if t["id"].startswith("i-"): # EC2 instance ID
|
||||||
instance = ec2_backend.get_instance_by_id(t["id"])
|
instance = ec2_backend.get_instance_by_id(t["id"])
|
||||||
if instance.state == "stopped":
|
if instance.state == "stopped":
|
||||||
@ -385,7 +395,6 @@ class FakeListenerRule(CloudFormationModel):
|
|||||||
account_id: str,
|
account_id: str,
|
||||||
region_name: str,
|
region_name: str,
|
||||||
) -> "FakeListenerRule":
|
) -> "FakeListenerRule":
|
||||||
|
|
||||||
properties = cloudformation_json["Properties"]
|
properties = cloudformation_json["Properties"]
|
||||||
|
|
||||||
elbv2_backend = elbv2_backends[account_id][region_name]
|
elbv2_backend = elbv2_backends[account_id][region_name]
|
||||||
@ -765,7 +774,6 @@ class ELBv2Backend(BaseBackend):
|
|||||||
def convert_and_validate_action_properties(
|
def convert_and_validate_action_properties(
|
||||||
self, properties: Dict[str, Any]
|
self, properties: Dict[str, Any]
|
||||||
) -> List[Dict[str, Any]]:
|
) -> List[Dict[str, Any]]:
|
||||||
|
|
||||||
# transform Actions to confirm with the rest of the code and XML templates
|
# transform Actions to confirm with the rest of the code and XML templates
|
||||||
default_actions = []
|
default_actions = []
|
||||||
for i, action in enumerate(properties["Actions"]):
|
for i, action in enumerate(properties["Actions"]):
|
||||||
@ -1094,7 +1102,6 @@ Member must satisfy regular expression pattern: {expression}"
|
|||||||
def convert_and_validate_certificates(
|
def convert_and_validate_certificates(
|
||||||
self, certificates: List[Dict[str, Any]]
|
self, certificates: List[Dict[str, Any]]
|
||||||
) -> List[Dict[str, Any]]:
|
) -> List[Dict[str, Any]]:
|
||||||
|
|
||||||
# transform default certificate to conform with the rest of the code and XML templates
|
# transform default certificate to conform with the rest of the code and XML templates
|
||||||
for cert in certificates or []:
|
for cert in certificates or []:
|
||||||
cert["certificate_arn"] = cert["CertificateArn"]
|
cert["certificate_arn"] = cert["CertificateArn"]
|
||||||
@ -1104,7 +1111,6 @@ Member must satisfy regular expression pattern: {expression}"
|
|||||||
def convert_and_validate_properties(
|
def convert_and_validate_properties(
|
||||||
self, properties: Dict[str, Any]
|
self, properties: Dict[str, Any]
|
||||||
) -> List[Dict[str, Any]]:
|
) -> List[Dict[str, Any]]:
|
||||||
|
|
||||||
# transform default actions to confirm with the rest of the code and XML templates
|
# transform default actions to confirm with the rest of the code and XML templates
|
||||||
# Caller: CF create/update for type "AWS::ElasticLoadBalancingV2::Listener"
|
# Caller: CF create/update for type "AWS::ElasticLoadBalancingV2::Listener"
|
||||||
default_actions = []
|
default_actions = []
|
||||||
|
@ -501,6 +501,36 @@ def test_register_targets():
|
|||||||
)
|
)
|
||||||
response.get("TargetHealthDescriptions").should.have.length_of(1)
|
response.get("TargetHealthDescriptions").should.have.length_of(1)
|
||||||
|
|
||||||
|
def get_target_by_instance_id(instance_id):
|
||||||
|
for target in response.get("TargetHealthDescriptions"):
|
||||||
|
if target.get("Target").get("Id") == instance_id:
|
||||||
|
return target
|
||||||
|
return None
|
||||||
|
|
||||||
|
def assert_target_not_registered(target):
|
||||||
|
assert target.get("TargetHealth").get("State") == "unavailable"
|
||||||
|
assert target.get("TargetHealth").get("Reason") == "Target.NotRegistered"
|
||||||
|
|
||||||
|
response = conn.describe_target_health(
|
||||||
|
TargetGroupArn=target_group.get("TargetGroupArn"),
|
||||||
|
Targets=[{"Id": instance_id2}],
|
||||||
|
)
|
||||||
|
response.get("TargetHealthDescriptions").should.have.length_of(1)
|
||||||
|
target_default_port = get_target_by_instance_id(instance_id2)
|
||||||
|
assert target_default_port is not None
|
||||||
|
assert target_default_port.get("Target").get("Port") == 8080
|
||||||
|
assert_target_not_registered(target_default_port)
|
||||||
|
|
||||||
|
response = conn.describe_target_health(
|
||||||
|
TargetGroupArn=target_group.get("TargetGroupArn"),
|
||||||
|
Targets=[{"Id": instance_id2, "Port": 4030}],
|
||||||
|
)
|
||||||
|
response.get("TargetHealthDescriptions").should.have.length_of(1)
|
||||||
|
target_custom_port = get_target_by_instance_id(instance_id2)
|
||||||
|
assert target_custom_port is not None
|
||||||
|
assert target_custom_port.get("Target").get("Port") == 4030
|
||||||
|
assert_target_not_registered(target_custom_port)
|
||||||
|
|
||||||
|
|
||||||
@mock_ec2
|
@mock_ec2
|
||||||
@mock_elbv2
|
@mock_elbv2
|
||||||
|
Loading…
Reference in New Issue
Block a user