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 }