From 517c3df6fa0bdf55ee22762d2c83352d4ef253d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B4mulo=20Farias?= Date: Fri, 22 Mar 2024 11:23:55 +0100 Subject: [PATCH] Refactor provider injection --- internal/inventory/awsfetcher/awsfetchers.go | 18 +++++++++++++----- .../awsfetcher/fetcher_ec2_instance.go | 5 +---- .../awsfetcher/fetcher_ec2_instance_test.go | 9 +++------ .../inventory/awsfetcher/fetcher_iam_policy.go | 4 +--- .../awsfetcher/fetcher_iam_policy_test.go | 17 +++++++---------- .../inventory/awsfetcher/fetcher_iam_role.go | 4 +--- .../awsfetcher/fetcher_iam_role_test.go | 9 +++------ .../inventory/awsfetcher/fetcher_iam_user.go | 4 +--- .../awsfetcher/fetcher_iam_user_test.go | 9 +++------ .../inventory/awsfetcher/fetcher_s3_bucket.go | 4 +--- .../awsfetcher/fetcher_s3_bucket_test.go | 9 +++------ 11 files changed, 37 insertions(+), 55 deletions(-) diff --git a/internal/inventory/awsfetcher/awsfetchers.go b/internal/inventory/awsfetcher/awsfetchers.go index 266c7194c5..62a8d13eab 100644 --- a/internal/inventory/awsfetcher/awsfetchers.go +++ b/internal/inventory/awsfetcher/awsfetchers.go @@ -23,14 +23,22 @@ import ( "github.com/elastic/cloudbeat/internal/dataprovider/providers/cloud" "github.com/elastic/cloudbeat/internal/inventory" + "github.com/elastic/cloudbeat/internal/resources/providers/awslib" + "github.com/elastic/cloudbeat/internal/resources/providers/awslib/ec2" + "github.com/elastic/cloudbeat/internal/resources/providers/awslib/iam" + "github.com/elastic/cloudbeat/internal/resources/providers/awslib/s3" ) func New(logger *logp.Logger, identity *cloud.Identity, cfg aws.Config) []inventory.AssetFetcher { + iamProvider := iam.NewIAMProvider(logger, cfg, &awslib.MultiRegionClientFactory[iam.AccessAnalyzerClient]{}) + ec2Provider := ec2.NewEC2Provider(logger, identity.Account, cfg, &awslib.MultiRegionClientFactory[ec2.Client]{}) + s3Provider := s3.NewProvider(logger, cfg, &awslib.MultiRegionClientFactory[s3.Client]{}, identity.Account) + return []inventory.AssetFetcher{ - newEc2InstancesFetcher(logger, identity, cfg), - NewS3BucketFetcher(logger, identity, cfg), - newIamUserFetcher(logger, identity, cfg), - newIamRoleFetcher(logger, identity, cfg), - newIamPolicyFetcher(logger, identity, cfg), + newEc2InstancesFetcher(logger, identity, ec2Provider), + NewS3BucketFetcher(logger, identity, s3Provider), + newIamUserFetcher(logger, identity, iamProvider), + newIamRoleFetcher(logger, identity, iamProvider), + newIamPolicyFetcher(logger, identity, iamProvider), } } diff --git a/internal/inventory/awsfetcher/fetcher_ec2_instance.go b/internal/inventory/awsfetcher/fetcher_ec2_instance.go index cf7fa56b4e..5cc02370dd 100644 --- a/internal/inventory/awsfetcher/fetcher_ec2_instance.go +++ b/internal/inventory/awsfetcher/fetcher_ec2_instance.go @@ -20,12 +20,10 @@ package awsfetcher import ( "context" - "github.com/aws/aws-sdk-go-v2/aws" "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/cloudbeat/internal/dataprovider/providers/cloud" "github.com/elastic/cloudbeat/internal/inventory" - "github.com/elastic/cloudbeat/internal/resources/providers/awslib" "github.com/elastic/cloudbeat/internal/resources/providers/awslib/ec2" "github.com/elastic/cloudbeat/internal/resources/utils/pointers" ) @@ -48,8 +46,7 @@ var ec2InstanceClassification = inventory.AssetClassification{ SubType: inventory.SubTypeEC2, } -func newEc2InstancesFetcher(logger *logp.Logger, identity *cloud.Identity, cfg aws.Config) inventory.AssetFetcher { - provider := ec2.NewEC2Provider(logger, identity.Account, cfg, &awslib.MultiRegionClientFactory[ec2.Client]{}) +func newEc2InstancesFetcher(logger *logp.Logger, identity *cloud.Identity, provider ec2InstancesProvider) inventory.AssetFetcher { return &Ec2InstanceFetcher{ logger: logger, provider: provider, diff --git a/internal/inventory/awsfetcher/fetcher_ec2_instance_test.go b/internal/inventory/awsfetcher/fetcher_ec2_instance_test.go index 7d6a433025..cfe3f19daa 100644 --- a/internal/inventory/awsfetcher/fetcher_ec2_instance_test.go +++ b/internal/inventory/awsfetcher/fetcher_ec2_instance_test.go @@ -24,6 +24,7 @@ import ( "github.com/elastic/elastic-agent-libs/logp" "github.com/stretchr/testify/mock" + "github.com/elastic/cloudbeat/internal/dataprovider/providers/cloud" "github.com/elastic/cloudbeat/internal/inventory" ec2beat "github.com/elastic/cloudbeat/internal/resources/providers/awslib/ec2" "github.com/elastic/cloudbeat/internal/resources/utils/pointers" @@ -154,12 +155,8 @@ func TestEC2InstanceFetcher_Fetch(t *testing.T) { provider := newMockEc2InstancesProvider(t) provider.EXPECT().DescribeInstances(mock.Anything).Return(in, nil) - fetcher := &Ec2InstanceFetcher{ - logger: logger, - provider: provider, - AccountId: "123", - AccountName: "alias", - } + identity := &cloud.Identity{Account: "123", AccountAlias: "alias"} + fetcher := newEc2InstancesFetcher(logger, identity, provider) collectResourcesAndMatch(t, fetcher, expected) } diff --git a/internal/inventory/awsfetcher/fetcher_iam_policy.go b/internal/inventory/awsfetcher/fetcher_iam_policy.go index 890d1e9d13..8fc7000a67 100644 --- a/internal/inventory/awsfetcher/fetcher_iam_policy.go +++ b/internal/inventory/awsfetcher/fetcher_iam_policy.go @@ -20,7 +20,6 @@ package awsfetcher import ( "context" - "github.com/aws/aws-sdk-go-v2/aws" "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/cloudbeat/internal/dataprovider/providers/cloud" @@ -48,8 +47,7 @@ var iamPolicyClassification = inventory.AssetClassification{ SubType: inventory.SubTypeIAM, } -func newIamPolicyFetcher(logger *logp.Logger, identity *cloud.Identity, cfg aws.Config) inventory.AssetFetcher { - provider := iam.NewIAMProvider(logger, cfg, &awslib.MultiRegionClientFactory[iam.AccessAnalyzerClient]{}) +func newIamPolicyFetcher(logger *logp.Logger, identity *cloud.Identity, provider IamPolicyProvider) inventory.AssetFetcher { return &IamPolicyFetcher{ logger: logger, provider: provider, diff --git a/internal/inventory/awsfetcher/fetcher_iam_policy_test.go b/internal/inventory/awsfetcher/fetcher_iam_policy_test.go index 71725befa0..936fd0c84d 100644 --- a/internal/inventory/awsfetcher/fetcher_iam_policy_test.go +++ b/internal/inventory/awsfetcher/fetcher_iam_policy_test.go @@ -25,6 +25,7 @@ import ( "github.com/elastic/elastic-agent-libs/logp" "github.com/stretchr/testify/mock" + "github.com/elastic/cloudbeat/internal/dataprovider/providers/cloud" "github.com/elastic/cloudbeat/internal/inventory" "github.com/elastic/cloudbeat/internal/resources/providers/awslib" "github.com/elastic/cloudbeat/internal/resources/providers/awslib/iam" @@ -100,7 +101,7 @@ func TestIAMPolicyFetcher_Fetch(t *testing.T) { in := []awslib.AwsResource{policy1, nil, policy2, policy3} - cloud := inventory.AssetCloud{ + cloudField := inventory.AssetCloud{ Provider: inventory.AwsCloudProvider, Region: "global", Account: inventory.AssetCloudAccount{ @@ -118,7 +119,7 @@ func TestIAMPolicyFetcher_Fetch(t *testing.T) { "arn:aws:iam::0000:policy/policy-1", "policy-1", inventory.WithRawAsset(policy1), - inventory.WithCloud(cloud), + inventory.WithCloud(cloudField), inventory.WithTags(map[string]string{ "key-1": "value-1", "key-2": "value-2", @@ -141,7 +142,7 @@ func TestIAMPolicyFetcher_Fetch(t *testing.T) { "arn:aws:iam::0000:policy/policy-2", "policy-2", inventory.WithRawAsset(policy2), - inventory.WithCloud(cloud), + inventory.WithCloud(cloudField), inventory.WithTags(map[string]string{ "key-1": "value-1", }), @@ -158,7 +159,7 @@ func TestIAMPolicyFetcher_Fetch(t *testing.T) { "arn:aws:iam::0000:policy/policy-3", "policy-3", inventory.WithRawAsset(policy3), - inventory.WithCloud(cloud), + inventory.WithCloud(cloudField), ), } @@ -166,12 +167,8 @@ func TestIAMPolicyFetcher_Fetch(t *testing.T) { provider := NewMockIamPolicyProvider(t) provider.EXPECT().GetPolicies(mock.Anything).Return(in, nil) - fetcher := &IamPolicyFetcher{ - logger: logger, - provider: provider, - AccountId: "123", - AccountName: "alias", - } + identity := &cloud.Identity{Account: "123", AccountAlias: "alias"} + fetcher := newIamPolicyFetcher(logger, identity, provider) collectResourcesAndMatch(t, fetcher, expected) } diff --git a/internal/inventory/awsfetcher/fetcher_iam_role.go b/internal/inventory/awsfetcher/fetcher_iam_role.go index df1d6e5a56..c8b447d1df 100644 --- a/internal/inventory/awsfetcher/fetcher_iam_role.go +++ b/internal/inventory/awsfetcher/fetcher_iam_role.go @@ -20,7 +20,6 @@ package awsfetcher import ( "context" - "github.com/aws/aws-sdk-go-v2/aws" "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/cloudbeat/internal/dataprovider/providers/cloud" @@ -48,8 +47,7 @@ var iamRoleClassification = inventory.AssetClassification{ SubType: inventory.SubTypeIAM, } -func newIamRoleFetcher(logger *logp.Logger, identity *cloud.Identity, cfg aws.Config) inventory.AssetFetcher { - provider := iam.NewIAMProvider(logger, cfg, &awslib.MultiRegionClientFactory[iam.AccessAnalyzerClient]{}) +func newIamRoleFetcher(logger *logp.Logger, identity *cloud.Identity, provider IamRoleProvider) inventory.AssetFetcher { return &IamRoleFetcher{ logger: logger, provider: provider, diff --git a/internal/inventory/awsfetcher/fetcher_iam_role_test.go b/internal/inventory/awsfetcher/fetcher_iam_role_test.go index b2163708e1..9296831796 100644 --- a/internal/inventory/awsfetcher/fetcher_iam_role_test.go +++ b/internal/inventory/awsfetcher/fetcher_iam_role_test.go @@ -25,6 +25,7 @@ import ( "github.com/elastic/elastic-agent-libs/logp" "github.com/stretchr/testify/mock" + "github.com/elastic/cloudbeat/internal/dataprovider/providers/cloud" "github.com/elastic/cloudbeat/internal/inventory" "github.com/elastic/cloudbeat/internal/resources/providers/awslib/iam" "github.com/elastic/cloudbeat/internal/resources/utils/pointers" @@ -109,12 +110,8 @@ func TestIAMRoleFetcher_Fetch(t *testing.T) { provider := NewMockIamRoleProvider(t) provider.EXPECT().ListRoles(mock.Anything).Return(in, nil) - fetcher := &IamRoleFetcher{ - logger: logger, - provider: provider, - AccountId: "123", - AccountName: "alias", - } + identity := &cloud.Identity{Account: "123", AccountAlias: "alias"} + fetcher := newIamRoleFetcher(logger, identity, provider) collectResourcesAndMatch(t, fetcher, expected) } diff --git a/internal/inventory/awsfetcher/fetcher_iam_user.go b/internal/inventory/awsfetcher/fetcher_iam_user.go index c42f714368..98a11f405c 100644 --- a/internal/inventory/awsfetcher/fetcher_iam_user.go +++ b/internal/inventory/awsfetcher/fetcher_iam_user.go @@ -20,7 +20,6 @@ package awsfetcher import ( "context" - "github.com/aws/aws-sdk-go-v2/aws" "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/cloudbeat/internal/dataprovider/providers/cloud" @@ -47,8 +46,7 @@ var iamUserClassification = inventory.AssetClassification{ SubType: inventory.SubTypeIAM, } -func newIamUserFetcher(logger *logp.Logger, identity *cloud.Identity, cfg aws.Config) inventory.AssetFetcher { - provider := iam.NewIAMProvider(logger, cfg, &awslib.MultiRegionClientFactory[iam.AccessAnalyzerClient]{}) +func newIamUserFetcher(logger *logp.Logger, identity *cloud.Identity, provider IamUserProvider) inventory.AssetFetcher { return &IamUserFetcher{ logger: logger, provider: provider, diff --git a/internal/inventory/awsfetcher/fetcher_iam_user_test.go b/internal/inventory/awsfetcher/fetcher_iam_user_test.go index be4028d0e6..32a2755edc 100644 --- a/internal/inventory/awsfetcher/fetcher_iam_user_test.go +++ b/internal/inventory/awsfetcher/fetcher_iam_user_test.go @@ -25,6 +25,7 @@ import ( "github.com/elastic/elastic-agent-libs/logp" "github.com/stretchr/testify/mock" + "github.com/elastic/cloudbeat/internal/dataprovider/providers/cloud" "github.com/elastic/cloudbeat/internal/inventory" "github.com/elastic/cloudbeat/internal/resources/providers/awslib" "github.com/elastic/cloudbeat/internal/resources/providers/awslib/iam" @@ -123,12 +124,8 @@ func TestIAMUserFetcher_Fetch(t *testing.T) { provider := NewMockIamUserProvider(t) provider.EXPECT().GetUsers(mock.Anything).Return(in, nil) - fetcher := &IamUserFetcher{ - logger: logger, - provider: provider, - AccountId: "123", - AccountName: "alias", - } + identity := &cloud.Identity{Account: "123", AccountAlias: "alias"} + fetcher := newIamUserFetcher(logger, identity, provider) collectResourcesAndMatch(t, fetcher, expected) } diff --git a/internal/inventory/awsfetcher/fetcher_s3_bucket.go b/internal/inventory/awsfetcher/fetcher_s3_bucket.go index 8e1efc39fb..061dbfb9f7 100644 --- a/internal/inventory/awsfetcher/fetcher_s3_bucket.go +++ b/internal/inventory/awsfetcher/fetcher_s3_bucket.go @@ -20,7 +20,6 @@ package awsfetcher import ( "context" - "github.com/aws/aws-sdk-go-v2/aws" "github.com/elastic/elastic-agent-libs/logp" "github.com/samber/lo" @@ -48,8 +47,7 @@ type s3BucketProvider interface { DescribeBuckets(ctx context.Context) ([]awslib.AwsResource, error) } -func NewS3BucketFetcher(logger *logp.Logger, identity *cloud.Identity, cfg aws.Config) inventory.AssetFetcher { - provider := s3.NewProvider(logger, cfg, &awslib.MultiRegionClientFactory[s3.Client]{}, identity.Account) +func NewS3BucketFetcher(logger *logp.Logger, identity *cloud.Identity, provider s3BucketProvider) inventory.AssetFetcher { return &S3BucketFetcher{ logger: logger, provider: provider, diff --git a/internal/inventory/awsfetcher/fetcher_s3_bucket_test.go b/internal/inventory/awsfetcher/fetcher_s3_bucket_test.go index c9900b992f..bbfa929ea3 100644 --- a/internal/inventory/awsfetcher/fetcher_s3_bucket_test.go +++ b/internal/inventory/awsfetcher/fetcher_s3_bucket_test.go @@ -25,6 +25,7 @@ import ( "github.com/elastic/elastic-agent-libs/logp" "github.com/stretchr/testify/mock" + "github.com/elastic/cloudbeat/internal/dataprovider/providers/cloud" "github.com/elastic/cloudbeat/internal/inventory" "github.com/elastic/cloudbeat/internal/resources/providers/awslib" "github.com/elastic/cloudbeat/internal/resources/providers/awslib/s3" @@ -166,12 +167,8 @@ func TestS3BucketFetcher_Fetch(t *testing.T) { provider := newMockS3BucketProvider(t) provider.EXPECT().DescribeBuckets(mock.Anything).Return(in, nil) - fetcher := &S3BucketFetcher{ - logger: logger, - provider: provider, - AccountId: "123", - AccountName: "alias", - } + identity := &cloud.Identity{Account: "123", AccountAlias: "alias"} + fetcher := NewS3BucketFetcher(logger, identity, provider) collectResourcesAndMatch(t, fetcher, expected) }