diff --git a/pkg/cluster/volumes.go b/pkg/cluster/volumes.go index 2a94f6435..381e1369f 100644 --- a/pkg/cluster/volumes.go +++ b/pkg/cluster/volumes.go @@ -532,20 +532,25 @@ func (c *Cluster) tagEBSVolumes() error { desiredTags[labelKey] = labelValue } + // Compute keys to delete once — keys in EBSTagsInheritLabels not present in desiredTags. + keysToDelete := make([]string, 0, len(c.OpConfig.EBSTagsInheritLabels)) + for _, labelKey := range c.OpConfig.EBSTagsInheritLabels { + if _, wanted := desiredTags[labelKey]; !wanted { + keysToDelete = append(keysToDelete, labelKey) + } + } + volumesToTag := make([]string, 0, len(c.EBSVolumes)) - volumesToUntag := make([]string, 0, len(c.EBSVolumes)) - staleKeys := make(map[string]bool) + volumesToUntag := make(map[string]bool) for volumeID, volumeProps := range c.EBSVolumes { if len(desiredTags) > 0 && c.tagsNeedUpdate(volumeProps.Tags, desiredTags) { volumesToTag = append(volumesToTag, volumeID) } - for _, labelKey := range c.OpConfig.EBSTagsInheritLabels { - if _, wanted := desiredTags[labelKey]; !wanted { - if _, exists := volumeProps.Tags[labelKey]; exists { - volumesToUntag = append(volumesToUntag, volumeID) - staleKeys[labelKey] = true - } + for _, labelKey := range keysToDelete { + if _, exists := volumeProps.Tags[labelKey]; exists { + volumesToUntag[volumeID] = true + break } } } @@ -574,14 +579,14 @@ func (c *Cluster) tagEBSVolumes() error { } if len(volumesToUntag) > 0 { - keysToDelete := make([]string, 0, len(staleKeys)) - for k := range staleKeys { - keysToDelete = append(keysToDelete, k) + untagIDs := make([]string, 0, len(volumesToUntag)) + for id := range volumesToUntag { + untagIDs = append(untagIDs, id) } - if err := c.VolumeResizer.UntagVolumes(volumesToUntag, keysToDelete); err != nil { + if err := c.VolumeResizer.UntagVolumes(untagIDs, keysToDelete); err != nil { c.logger.Warningf("could not remove stale EBS tags %v: %v", keysToDelete, err) } else { - c.logger.Infof("removed stale tags %v from %d EBS volumes", keysToDelete, len(volumesToUntag)) + c.logger.Infof("removed stale tags %v from %d EBS volumes", keysToDelete, len(untagIDs)) } } diff --git a/pkg/util/volumes/ebs.go b/pkg/util/volumes/ebs.go index a4723f1c1..a1b06fbdd 100644 --- a/pkg/util/volumes/ebs.go +++ b/pkg/util/volumes/ebs.go @@ -215,16 +215,16 @@ func (r *EBSVolumeResizer) ModifyVolume(volumeID string, newType *string, newSiz // TagVolumes tags the given EBS volumes with the provided tags. func (r *EBSVolumeResizer) TagVolumes(volumeIds []string, tags map[string]string) error { + if len(volumeIds) == 0 || len(tags) == 0 { + return nil + } + if !r.IsConnectedToProvider() { if err := r.ConnectToProvider(); err != nil { return err } } - if len(volumeIds) == 0 { - return nil - } - ec2Tags := make([]types.Tag, 0, len(tags)) for key, value := range tags { k, v := key, value