diff --git a/pkg/remote/aws/iam_policy_supplier.go b/pkg/remote/aws/iam_policy_supplier.go index c28dbe64..905422c8 100644 --- a/pkg/remote/aws/iam_policy_supplier.go +++ b/pkg/remote/aws/iam_policy_supplier.go @@ -1,9 +1,9 @@ package aws import ( - "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/iam" - "github.com/aws/aws-sdk-go/service/iam/iamiface" + + "github.com/cloudskiff/driftctl/pkg/remote/aws/repository" remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error" "github.com/cloudskiff/driftctl/pkg/resource" @@ -18,7 +18,7 @@ import ( type IamPolicySupplier struct { reader terraform.ResourceReader deserializer *resource.Deserializer - client iamiface.IAMAPI + client repository.IAMRepository runner *terraform.ParallelResourceReader } @@ -26,13 +26,13 @@ func NewIamPolicySupplier(provider *AWSTerraformProvider, deserializer *resource return &IamPolicySupplier{ provider, deserializer, - iam.New(provider.session), + repository.NewIAMClient(provider.session), terraform.NewParallelResourceReader(provider.Runner().SubRunner()), } } func (s *IamPolicySupplier) Resources() ([]resource.Resource, error) { - policies, err := listIamPolicies(s.client) + policies, err := s.client.ListAllPolicies() if err != nil { return nil, remoteerror.NewResourceEnumerationError(err, resourceaws.AwsIamPolicyResourceType) } @@ -41,7 +41,7 @@ func (s *IamPolicySupplier) Resources() ([]resource.Resource, error) { for _, policy := range policies { u := *policy s.runner.Run(func() (cty.Value, error) { - return s.readRes(&u) + return s.readPolicy(&u) }) } results, err = s.runner.Wait() @@ -52,7 +52,7 @@ func (s *IamPolicySupplier) Resources() ([]resource.Resource, error) { return s.deserializer.Deserialize(resourceaws.AwsIamPolicyResourceType, results) } -func (s *IamPolicySupplier) readRes(resource *iam.Policy) (cty.Value, error) { +func (s *IamPolicySupplier) readPolicy(resource *iam.Policy) (cty.Value, error) { res, err := s.reader.ReadResource( terraform.ReadResourceArgs{ Ty: resourceaws.AwsIamPolicyResourceType, @@ -66,18 +66,3 @@ func (s *IamPolicySupplier) readRes(resource *iam.Policy) (cty.Value, error) { return *res, nil } - -func listIamPolicies(client iamiface.IAMAPI) ([]*iam.Policy, error) { - var resources []*iam.Policy - input := &iam.ListPoliciesInput{ - Scope: aws.String(iam.PolicyScopeTypeLocal), - } - err := client.ListPoliciesPages(input, func(res *iam.ListPoliciesOutput, lastPage bool) bool { - resources = append(resources, res.Policies...) - return !lastPage - }) - if err != nil { - return nil, err - } - return resources, nil -} diff --git a/pkg/remote/aws/iam_policy_supplier_test.go b/pkg/remote/aws/iam_policy_supplier_test.go index 3d18d1db..f51d7f35 100644 --- a/pkg/remote/aws/iam_policy_supplier_test.go +++ b/pkg/remote/aws/iam_policy_supplier_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/cloudskiff/driftctl/pkg/remote/aws/repository" remoteerror "github.com/cloudskiff/driftctl/pkg/remote/error" awstest "github.com/cloudskiff/driftctl/test/aws" testresource "github.com/cloudskiff/driftctl/test/resource" @@ -18,10 +19,11 @@ import ( "github.com/aws/aws-sdk-go/service/iam" - mocks2 "github.com/cloudskiff/driftctl/test/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + mocks2 "github.com/cloudskiff/driftctl/test/mocks" + "github.com/cloudskiff/driftctl/pkg/resource" "github.com/cloudskiff/driftctl/pkg/terraform" "github.com/cloudskiff/driftctl/test" @@ -33,55 +35,40 @@ func TestIamPolicySupplier_Resources(t *testing.T) { cases := []struct { test string dirName string - mocks func(client *awstest.MockFakeIAM) + mocks func(repo *repository.MockIAMRepository) err error }{ { test: "no iam custom policies", dirName: "iam_policy_empty", - mocks: func(client *awstest.MockFakeIAM) { - client.On( - "ListPoliciesPages", - &iam.ListPoliciesInput{Scope: aws.String("Local")}, - mock.Anything, - ).Once().Return(nil) + mocks: func(repo *repository.MockIAMRepository) { + repo.On("ListAllPolicies").Once().Return([]*iam.Policy{}, nil) }, err: nil, }, { test: "iam multiples custom policies", dirName: "iam_policy_multiple", - mocks: func(client *awstest.MockFakeIAM) { - client.On("ListPoliciesPages", - &iam.ListPoliciesInput{Scope: aws.String(iam.PolicyScopeTypeLocal)}, - mock.MatchedBy(func(callback func(res *iam.ListPoliciesOutput, lastPage bool) bool) bool { - callback(&iam.ListPoliciesOutput{Policies: []*iam.Policy{ - { - Arn: aws.String("arn:aws:iam::929327065333:policy/policy-0"), - }, - { - Arn: aws.String("arn:aws:iam::929327065333:policy/policy-1"), - }, - }}, false) - callback(&iam.ListPoliciesOutput{Policies: []*iam.Policy{ - { - Arn: aws.String("arn:aws:iam::929327065333:policy/policy-2"), - }, - }}, true) - return true - })).Once().Return(nil) + mocks: func(repo *repository.MockIAMRepository) { + repo.On("ListAllPolicies").Once().Return([]*iam.Policy{ + { + Arn: aws.String("arn:aws:iam::929327065333:policy/policy-0"), + }, + { + Arn: aws.String("arn:aws:iam::929327065333:policy/policy-1"), + }, + { + Arn: aws.String("arn:aws:iam::929327065333:policy/policy-2"), + }, + }, nil) }, err: nil, }, { test: "cannot list iam custom policies", dirName: "iam_policy_empty", - mocks: func(client *awstest.MockFakeIAM) { - client.On( - "ListPoliciesPages", - &iam.ListPoliciesInput{Scope: aws.String("Local")}, - mock.Anything, - ).Once().Return(awserr.NewRequestFailure(nil, 403, "")) + mocks: func(repo *repository.MockIAMRepository) { + repo.On("ListAllPolicies").Once().Return(nil, awserr.NewRequestFailure(nil, 403, "")) }, err: remoteerror.NewResourceEnumerationError(awserr.NewRequestFailure(nil, 403, ""), resourceaws.AwsIamPolicyResourceType), }, @@ -106,7 +93,7 @@ func TestIamPolicySupplier_Resources(t *testing.T) { } t.Run(c.test, func(tt *testing.T) { - fakeIam := awstest.MockFakeIAM{} + fakeIam := repository.MockIAMRepository{} c.mocks(&fakeIam) provider := mocks2.NewMockedGoldenTFProvider(c.dirName, providerLibrary.Provider(terraform.AWS), shouldUpdate)