Skip to content

Commit 1dc6677

Browse files
committed
apply review remarks
1 parent cd730b9 commit 1dc6677

4 files changed

Lines changed: 55 additions & 33 deletions

File tree

internal/inventory/awsfetcher/fetcher_elb_test.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ import (
3737
)
3838

3939
func TestELBv1Fetcher_Fetch(t *testing.T) {
40-
asset := elb.ElasticLoadBalancerInfo{
41-
LoadBalancer: types.LoadBalancerDescription{
40+
asset := elb.NewElasticLoadBalancerInfo(
41+
types.LoadBalancerDescription{
4242
AvailabilityZones: []string{"us-east-1a"},
4343
CanonicalHostedZoneName: pointers.Ref("HZ-NAME"),
4444
CanonicalHostedZoneNameID: pointers.Ref("HZ-ID"),
@@ -64,7 +64,11 @@ func TestELBv1Fetcher_Fetch(t *testing.T) {
6464
Subnets: []string{"subnet-123"},
6565
VPCId: pointers.Ref("vpc-id"),
6666
},
67-
}
67+
"", // awsAccount
68+
"", // region
69+
nil,
70+
[]string{"203.0.113.1", "203.0.113.2"}, // DNS-resolved by the provider in real code
71+
)
6872
in := []awslib.AwsResource{asset}
6973

7074
expected := []inventory.AssetEvent{
@@ -85,6 +89,7 @@ func TestELBv1Fetcher_Fetch(t *testing.T) {
8589
"AccountID": "123",
8690
"LoadBalancerType": "classic",
8791
"State": "active",
92+
"IPAddresses": []string{"203.0.113.1", "203.0.113.2"},
8893
}),
8994
inventory.WithCreatedAt(asset.GetCreatedAt()),
9095
),

internal/resources/providers/awslib/elb/load_balancer.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ type ElasticLoadBalancerInfo struct {
3636
ipAddresses []string
3737
}
3838

39+
// NewElasticLoadBalancerInfo constructs a classic load balancer wrapper. ipAddresses are the
40+
// addresses resolved from the load balancer's DNS name (classic ELBs expose no IPs via the API).
41+
func NewElasticLoadBalancerInfo(lb types.LoadBalancerDescription, awsAccount, region string, tags map[string]string, ipAddresses []string) *ElasticLoadBalancerInfo {
42+
return &ElasticLoadBalancerInfo{
43+
LoadBalancer: lb,
44+
awsAccount: awsAccount,
45+
region: region,
46+
tags: tags,
47+
ipAddresses: ipAddresses,
48+
}
49+
}
50+
3951
func (v ElasticLoadBalancerInfo) GetResourceArn() string {
4052
id := pointers.Deref(v.LoadBalancer.LoadBalancerName)
4153
if id == "" {

internal/resources/providers/awslib/elb/provider.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,21 +79,22 @@ func (p *Provider) DescribeAllLoadBalancers(ctx context.Context) ([]awslib.AwsRe
7979

8080
var result []awslib.AwsResource
8181
for _, item := range all {
82-
info := &ElasticLoadBalancerInfo{
83-
LoadBalancer: item,
84-
awsAccount: p.awsAccountID,
85-
region: region,
86-
tags: tagsByName[pointers.Deref(item.LoadBalancerName)],
87-
}
82+
var ipAddresses []string
8883
if dnsName := pointers.Deref(item.DNSName); dnsName != "" {
8984
if ips, err := p.resolver.LookupHost(ctx, dnsName); err != nil {
9085
p.log.Debugf("Could not resolve IPs for classic ELB %q: %v", dnsName, err)
9186
} else {
9287
sort.Strings(ips)
93-
info.ipAddresses = ips
88+
ipAddresses = ips
9489
}
9590
}
96-
result = append(result, info)
91+
result = append(result, NewElasticLoadBalancerInfo(
92+
item,
93+
p.awsAccountID,
94+
region,
95+
tagsByName[pointers.Deref(item.LoadBalancerName)],
96+
ipAddresses,
97+
))
9798
}
9899
return result, nil
99100
})

internal/resources/providers/awslib/elb/provider_test.go

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
package elb
1919

2020
import (
21-
"context"
2221
"errors"
2322
"testing"
2423
"time"
@@ -34,16 +33,6 @@ import (
3433
"github.com/elastic/cloudbeat/internal/resources/utils/testhelper"
3534
)
3635

37-
// fakeResolver is a test double for hostResolver that never touches the network.
38-
type fakeResolver struct {
39-
ips []string
40-
err error
41-
}
42-
43-
func (r *fakeResolver) LookupHost(_ context.Context, _ string) ([]string, error) {
44-
return r.ips, r.err
45-
}
46-
4736
var onlyDefaultRegion = []string{awslib.DefaultRegion}
4837

4938
func TestProvider_DescribeLoadBalancers(t *testing.T) {
@@ -182,7 +171,7 @@ func TestProvider_DescribeAllLoadBalancers(t *testing.T) {
182171
tests := []struct {
183172
name string
184173
client func() Client
185-
resolver hostResolver
174+
resolver func(t *testing.T) hostResolver
186175
expectedResults int
187176
wantErr bool
188177
regions []string
@@ -195,14 +184,24 @@ func TestProvider_DescribeAllLoadBalancers(t *testing.T) {
195184
m.On("DescribeLoadBalancers", mock.Anything, mock.Anything).Return(nil, errors.New("failed"))
196185
return m
197186
},
198-
resolver: &fakeResolver{},
199-
wantErr: true,
200-
regions: onlyDefaultRegion,
187+
resolver: func(t *testing.T) hostResolver {
188+
t.Helper()
189+
// LookupHost is never reached: DescribeLoadBalancers fails first.
190+
return newMockHostResolver(t)
191+
},
192+
wantErr: true,
193+
regions: onlyDefaultRegion,
201194
},
202195
{
203-
name: "with resources and DNS IPs",
204-
client: elbV1ClientWithResources,
205-
resolver: &fakeResolver{ips: []string{"10.0.0.2", "10.0.0.1"}}, // unsorted: expect sorted output
196+
name: "with resources and DNS IPs",
197+
client: elbV1ClientWithResources,
198+
resolver: func(t *testing.T) hostResolver {
199+
t.Helper()
200+
m := newMockHostResolver(t)
201+
// unsorted on purpose: the provider is expected to sort the IPs
202+
m.EXPECT().LookupHost(mock.Anything, mock.Anything).Return([]string{"10.0.0.2", "10.0.0.1"}, nil)
203+
return m
204+
},
206205
regions: onlyDefaultRegion,
207206
expectedResults: 1,
208207
checkResult: func(t *testing.T, got []awslib.AwsResource) {
@@ -214,9 +213,14 @@ func TestProvider_DescribeAllLoadBalancers(t *testing.T) {
214213
},
215214
},
216215
{
217-
name: "with resolver error (soft-fail)",
218-
client: elbV1ClientWithResources,
219-
resolver: &fakeResolver{err: errors.New("dns timeout")},
216+
name: "with resolver error (soft-fail)",
217+
client: elbV1ClientWithResources,
218+
resolver: func(t *testing.T) hostResolver {
219+
t.Helper()
220+
m := newMockHostResolver(t)
221+
m.EXPECT().LookupHost(mock.Anything, mock.Anything).Return(nil, errors.New("dns timeout"))
222+
return m
223+
},
220224
regions: onlyDefaultRegion,
221225
expectedResults: 1,
222226
checkResult: func(t *testing.T, got []awslib.AwsResource) {
@@ -240,7 +244,7 @@ func TestProvider_DescribeAllLoadBalancers(t *testing.T) {
240244
log: testhelper.NewLogger(t),
241245
clients: clients,
242246
client: client,
243-
resolver: tt.resolver,
247+
resolver: tt.resolver(t),
244248
}
245249
got, err := p.DescribeAllLoadBalancers(t.Context())
246250
if tt.wantErr {

0 commit comments

Comments
 (0)