diff --git a/internal/cmd/loadbalancer/list.go b/internal/cmd/loadbalancer/list.go index b49bfe55..47b9a371 100644 --- a/internal/cmd/loadbalancer/list.go +++ b/internal/cmd/loadbalancer/list.go @@ -178,55 +178,21 @@ func loadBalancerHealth(l *hcloud.LoadBalancer) string { unknownCount := 0 for _, lbTarget := range l.Targets { - switch loadBalancerTargetHealth(&lbTarget) { - case string(hcloud.LoadBalancerTargetHealthStatusStatusHealthy): - healthyCount++ + for _, svcHealth := range lbTarget.HealthStatus { + switch svcHealth.Status { + case hcloud.LoadBalancerTargetHealthStatusStatusHealthy: + healthyCount++ - case string(hcloud.LoadBalancerTargetHealthStatusStatusUnhealthy): - unhealthyCount++ + case hcloud.LoadBalancerTargetHealthStatusStatusUnhealthy: + unhealthyCount++ - case "mixed": - return "mixed" - - default: - unknownCount++ - } - } - - switch len(l.Targets) { - case healthyCount: - return string(hcloud.LoadBalancerTargetHealthStatusStatusHealthy) - - case unhealthyCount: - return string(hcloud.LoadBalancerTargetHealthStatusStatusUnhealthy) - - case unknownCount: - return string(hcloud.LoadBalancerTargetHealthStatusStatusUnknown) - - default: - return "mixed" - } -} - -func loadBalancerTargetHealth(t *hcloud.LoadBalancerTarget) string { - healthyCount := 0 - unhealthyCount := 0 - unknownCount := 0 - - for _, targetHealth := range t.HealthStatus { - switch targetHealth.Status { - case hcloud.LoadBalancerTargetHealthStatusStatusHealthy: - healthyCount++ - - case hcloud.LoadBalancerTargetHealthStatusStatusUnhealthy: - unhealthyCount++ - - default: - unknownCount++ + default: + unknownCount++ + } } } - switch len(t.HealthStatus) { + switch len(l.Targets) * len(l.Services) { case healthyCount: return string(hcloud.LoadBalancerTargetHealthStatusStatusHealthy) diff --git a/internal/cmd/loadbalancer/list_test.go b/internal/cmd/loadbalancer/list_test.go new file mode 100644 index 00000000..54a14931 --- /dev/null +++ b/internal/cmd/loadbalancer/list_test.go @@ -0,0 +1,202 @@ +package loadbalancer + +import ( + "testing" + + "github.com/hetznercloud/hcloud-go/v2/hcloud" + "github.com/stretchr/testify/assert" +) + +func TestLoadBalancerHealth(t *testing.T) { + tests := []struct { + name string + lb *hcloud.LoadBalancer + expected string + }{ + { + name: "healthy", + lb: &hcloud.LoadBalancer{ + Name: "foobar", + Services: make([]hcloud.LoadBalancerService, 1), + Targets: []hcloud.LoadBalancerTarget{ + { + HealthStatus: []hcloud.LoadBalancerTargetHealthStatus{ + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusHealthy, + }, + }, + }, + }, + }, + expected: string(hcloud.LoadBalancerTargetHealthStatusStatusHealthy), + }, + { + name: "unhealthy", + lb: &hcloud.LoadBalancer{ + Name: "foobar", + Services: make([]hcloud.LoadBalancerService, 1), + Targets: []hcloud.LoadBalancerTarget{ + { + HealthStatus: []hcloud.LoadBalancerTargetHealthStatus{ + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnhealthy, + }, + }, + }, + }, + }, + expected: string(hcloud.LoadBalancerTargetHealthStatusStatusUnhealthy), + }, + { + name: "unknown", + lb: &hcloud.LoadBalancer{ + Name: "foobar", + Services: make([]hcloud.LoadBalancerService, 1), + Targets: []hcloud.LoadBalancerTarget{ + { + HealthStatus: []hcloud.LoadBalancerTargetHealthStatus{ + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnknown, + }, + }, + }, + }, + }, + expected: string(hcloud.LoadBalancerTargetHealthStatusStatusUnknown), + }, + { + name: "mixed", + lb: &hcloud.LoadBalancer{ + Name: "foobar", + Services: make([]hcloud.LoadBalancerService, 1), + Targets: []hcloud.LoadBalancerTarget{ + { + HealthStatus: []hcloud.LoadBalancerTargetHealthStatus{ + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusHealthy, + }, + }, + }, + { + HealthStatus: []hcloud.LoadBalancerTargetHealthStatus{ + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnhealthy, + }, + }, + }, + { + HealthStatus: []hcloud.LoadBalancerTargetHealthStatus{ + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnknown, + }, + }, + }, + }, + }, + expected: "mixed", + }, + { + name: "mixed_many_services_grouped_by_target", + lb: &hcloud.LoadBalancer{ + Name: "foobar", + Services: make([]hcloud.LoadBalancerService, 3), + Targets: []hcloud.LoadBalancerTarget{ + { + HealthStatus: []hcloud.LoadBalancerTargetHealthStatus{ + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusHealthy, + }, + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusHealthy, + }, + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusHealthy, + }, + }, + }, + { + HealthStatus: []hcloud.LoadBalancerTargetHealthStatus{ + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnhealthy, + }, + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnhealthy, + }, + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnhealthy, + }, + }, + }, + { + HealthStatus: []hcloud.LoadBalancerTargetHealthStatus{ + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnknown, + }, + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnknown, + }, + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnknown, + }, + }, + }, + }, + }, + expected: "mixed", + }, + { + name: "mixed_many_services_mixed", + lb: &hcloud.LoadBalancer{ + Name: "foobar", + Services: make([]hcloud.LoadBalancerService, 3), + Targets: []hcloud.LoadBalancerTarget{ + { + HealthStatus: []hcloud.LoadBalancerTargetHealthStatus{ + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusHealthy, + }, + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnhealthy, + }, + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnknown, + }, + }, + }, + { + HealthStatus: []hcloud.LoadBalancerTargetHealthStatus{ + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusHealthy, + }, + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnhealthy, + }, + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnknown, + }, + }, + }, + { + HealthStatus: []hcloud.LoadBalancerTargetHealthStatus{ + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusHealthy, + }, + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnhealthy, + }, + { + Status: hcloud.LoadBalancerTargetHealthStatusStatusUnknown, + }, + }, + }, + }, + }, + expected: "mixed", + }, + } + + for _, test := range tests { + res := loadBalancerHealth(test.lb) + assert.Equal(t, test.expected, res, test.name) + } +}