in gcpdiag/runbook/lb/unhealthy_backends.py [0:0]
def execute(self):
"""Checks the health of a specified load balancer's backends."""
proj = crm.get_project(self.project_id)
if not apis.is_enabled(self.project_id, 'compute'):
op.add_skipped(proj, reason='Compute API is not enabled')
return # Early exit if Compute API is disabled
try:
op.info(f'name: {self.backend_service_name}, region:'
f' {self.region}')
backend_service = lb.get_backend_service(
self.project_id,
self.backend_service_name,
self.region,
)
except googleapiclient.errors.HttpError:
op.add_skipped(
proj,
reason=(f'Backend service {self.backend_service_name} does not'
f' exist in scope {self.region} or project'
f' {self.project_id}'),
)
return # Early exit if load balancer doesn't exist
backend_health_statuses = lb.get_backend_service_health(
self.project_id,
self.backend_service_name,
self.region,
)
if not backend_health_statuses:
op.add_skipped(
proj,
reason=(f'Backend service {self.backend_service_name} does not'
f' have any backends in scope {self.region} or'
f' project {self.project_id}'),
)
return # Early exit if load balancer doesn't have any backends
unhealthy_backends = [
backend for backend in backend_health_statuses
if backend.health_state == 'UNHEALTHY'
]
backend_health_statuses_per_group = {
k: list(v)
for k, v in groupby(backend_health_statuses, key=lambda x: x.group)
}
if unhealthy_backends:
detailed_reason = ''
for group, backends_in_group in backend_health_statuses_per_group.items():
unhealthy_count = sum(
1 for x in backends_in_group if x.health_state == 'UNHEALTHY')
detailed_reason += (
f'Group {group} has {unhealthy_count}/{len(backends_in_group)} '
'unhealthy backends\n')
op.add_failed(
resource=backend_service,
reason=op.prep_msg(
op.FAILURE_REASON,
name=self.backend_service_name,
region=self.region,
detailed_reason=detailed_reason,
),
remediation='',
)
else:
op.add_ok(
resource=backend_service,
reason=op.prep_msg(
op.SUCCESS_REASON,
name=self.backend_service_name,
region=self.region,
),
)