github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imagepublishers/amipublisher/iterators.go (about) 1 package amipublisher 2 3 import ( 4 "github.com/Cloud-Foundations/Dominator/lib/awsutil" 5 "github.com/Cloud-Foundations/Dominator/lib/log" 6 "github.com/Cloud-Foundations/Dominator/lib/log/prefixlogger" 7 "github.com/aws/aws-sdk-go/aws/session" 8 "github.com/aws/aws-sdk-go/service/ec2" 9 ) 10 11 func forEachResource(resources []Resource, stopOnError bool, 12 resourceFunc func(*session.Session, *ec2.EC2, Resource, log.Logger) error, 13 logger log.Logger) error { 14 sessions := make(map[string]*session.Session) 15 awsServices := make(map[awsutil.Target]*ec2.EC2) 16 var firstError error 17 for _, resource := range resources { 18 session := sessions[resource.AccountName] 19 if session == nil { 20 var err error 21 if session, err = awsutil.CreateSession( 22 resource.AccountName); err != nil { 23 if stopOnError { 24 return err 25 } 26 if firstError == nil { 27 firstError = err 28 } 29 continue 30 } 31 sessions[resource.AccountName] = session 32 } 33 target := awsutil.Target{resource.AccountName, resource.Region} 34 awsService := awsServices[target] 35 if awsService == nil { 36 awsService = awsutil.CreateService(session, resource.Region) 37 awsServices[target] = awsService 38 } 39 err := resourceFunc(session, awsService, resource, 40 prefixlogger.New(resource.AccountName+": "+resource.Region+": ", 41 logger)) 42 if err != nil { 43 if stopOnError { 44 return err 45 } 46 if firstError == nil { 47 firstError = err 48 } 49 } 50 } 51 return firstError 52 }