github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imagepublishers/amipublisher/setExclusiveTags.go (about)

     1  package amipublisher
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/Cloud-Foundations/Dominator/lib/log"
     7  	libtags "github.com/Cloud-Foundations/Dominator/lib/tags"
     8  	"github.com/aws/aws-sdk-go/aws"
     9  	"github.com/aws/aws-sdk-go/aws/session"
    10  	"github.com/aws/aws-sdk-go/service/ec2"
    11  )
    12  
    13  func setExclusiveTags(resources []Resource, tagKey string, tagValue string,
    14  	logger log.Logger) error {
    15  	return forEachResource(resources, true,
    16  		func(session *session.Session, awsService *ec2.EC2, resource Resource,
    17  			logger log.Logger) error {
    18  			return setExclusiveTagsForTarget(awsService, resource.AmiId,
    19  				tagKey, tagValue, logger)
    20  		},
    21  		logger)
    22  }
    23  
    24  func setExclusiveTagsForTarget(awsService *ec2.EC2, amiId string,
    25  	tagKey string, tagValue string, logger log.Logger) error {
    26  	if amiId == "" {
    27  		return nil
    28  	}
    29  	// First extract the value of the Name tag which is common to this stream.
    30  	out, err := awsService.DescribeImages(&ec2.DescribeImagesInput{
    31  		ImageIds: aws.StringSlice([]string{amiId}),
    32  	})
    33  	if err != nil {
    34  		return err
    35  	}
    36  	if len(out.Images) < 1 {
    37  		return fmt.Errorf("AMI: %s does not exist", amiId)
    38  	}
    39  	var nameTag string
    40  	for _, tag := range out.Images[0].Tags {
    41  		if aws.StringValue(tag.Key) == "Name" {
    42  			nameTag = aws.StringValue(tag.Value)
    43  			break
    44  		}
    45  	}
    46  	if nameTag == "" {
    47  		err := fmt.Errorf("no \"Name\" tag for: %s", amiId)
    48  		logger.Println(err)
    49  		return err
    50  	}
    51  	images, err := getImages(awsService, "",
    52  		libtags.Tags{"Name": nameTag, tagKey: ""})
    53  	if err != nil {
    54  		logger.Println(err)
    55  		return err
    56  	}
    57  	tagKeysToStrip := []string{tagKey, "Name"}
    58  	tagAlreadyPresent := false
    59  	for _, image := range images {
    60  		imageId := aws.StringValue(image.ImageId)
    61  		if imageId == amiId {
    62  			for _, tag := range image.Tags {
    63  				if aws.StringValue(tag.Key) != tagKey {
    64  					continue
    65  				}
    66  				if aws.StringValue(tag.Value) == tagValue {
    67  					tagAlreadyPresent = true
    68  				}
    69  				break
    70  			}
    71  			continue
    72  		}
    73  		err := deleteTagsFromResources(awsService, tagKeysToStrip, imageId)
    74  		if err != nil {
    75  			logger.Println(err)
    76  			return err
    77  		}
    78  		logger.Printf("deleted \"%s\" tag from: %s\n", tagKey, imageId)
    79  	}
    80  	if tagAlreadyPresent {
    81  		return nil
    82  	}
    83  	tags := make(map[string]string)
    84  	tags[tagKey] = tagValue
    85  	logger.Printf("adding \"%s\" tag to: %s\n", tagKey, amiId)
    86  	return createTags(awsService, amiId, tags)
    87  }