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  }