diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 6fb1650afe..9bfe75c586 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -2910,9 +2910,14 @@ type SGuestSyncResult struct { } func IsNeedSkipSync(ext cloudprovider.ICloudResource) (bool, string) { - if len(options.Options.SkipServerBySysTagKeys) == 0 && len(options.Options.SkipServerByUserTagKeys) == 0 && len(options.Options.SkipServerByUserTagValues) == 0 { + if len(options.Options.SkipServerBySysTagKeys) == 0 && + len(options.Options.SkipServerByUserTagKeys) == 0 && + len(options.Options.SkipServerByUserTagValues) == 0 && + len(options.Options.RetentionServerByUserTagKeys) == 0 && + len(options.Options.RetentionServerByUserTagValues) == 0 { return false, "" } + tags, _ := ext.GetTags() if keys := strings.Split(options.Options.SkipServerBySysTagKeys, ","); len(keys) > 0 { for key := range ext.GetSysTags() { key = strings.Trim(key, "") @@ -2922,7 +2927,6 @@ func IsNeedSkipSync(ext cloudprovider.ICloudResource) (bool, string) { } } if userKeys := strings.Split(options.Options.SkipServerByUserTagKeys, ","); len(userKeys) > 0 { - tags, _ := ext.GetTags() for key := range tags { key = strings.Trim(key, "") if len(key) > 0 && utils.IsInStringArray(key, userKeys) { @@ -2931,7 +2935,6 @@ func IsNeedSkipSync(ext cloudprovider.ICloudResource) (bool, string) { } } if len(options.Options.SkipServerByUserTagValues) > 0 { - tags, _ := ext.GetTags() for _, value := range tags { value = strings.Trim(value, "") if len(value) > 0 && utils.IsInStringArray(value, options.Options.SkipServerByUserTagValues) { @@ -2939,6 +2942,37 @@ func IsNeedSkipSync(ext cloudprovider.ICloudResource) (bool, string) { } } } + keys, values := []string{}, []string{} + for key, value := range tags { + key = strings.Trim(key, "") + keys = append(keys, key) + values = append(values, value) + } + + if len(options.Options.RetentionServerByUserTagKeys) > 0 { + skip, tagKey := true, "" + for _, key := range options.Options.RetentionServerByUserTagKeys { + key = strings.Trim(key, "") + if len(key) > 0 && utils.IsInStringArray(key, keys) { + skip, tagKey = false, key + break + } + } + return skip, tagKey + } + + if len(options.Options.RetentionServerByUserTagValues) > 0 { + skip, tagValue := true, "" + for _, value := range options.Options.RetentionServerByUserTagValues { + value = strings.Trim(value, "") + if len(value) > 0 && utils.IsInStringArray(value, values) { + skip, tagValue = false, value + break + } + } + return skip, tagValue + } + return false, "" } diff --git a/pkg/compute/options/options.go b/pkg/compute/options/options.go index 28d3a831a1..b93bcd47f9 100644 --- a/pkg/compute/options/options.go +++ b/pkg/compute/options/options.go @@ -197,9 +197,11 @@ type ComputeOptions struct { KeepDeletedSnapshotDays int `help:"The day of cleanup snapshot" default:"30"` // 弹性伸缩中的ecs一般会有特殊的系统标签,通过指定这些标签可以忽略这部分ecs的同步, 指定多个key需要以 ',' 分隔 - SkipServerBySysTagKeys string `help:"skip server,disk sync and create with system tags" default:""` - SkipServerByUserTagKeys string `help:"skip server,disk sync and create with user tags" default:""` - SkipServerByUserTagValues []string `help:"skip server,disk sync and create with user tag values"` + SkipServerBySysTagKeys string `help:"skip server,disk sync and create with system tags" default:""` + SkipServerByUserTagKeys string `help:"skip server,disk sync and create with user tags" default:""` + SkipServerByUserTagValues []string `help:"skip server,disk sync and create with user tag values"` + RetentionServerByUserTagKeys []string `help:"retain server,disk with user tags" default:""` + RetentionServerByUserTagValues []string `help:"retain server,disk with user tag values" default:""` // 修改标签时不再同步至云上, 云账号同步资源时不会冲掉本地打的标签(key相同的会覆盖), 云账号开启只读同步和此参数效果相同,且仅影响开启只读同步的账号 KeepTagLocalization bool `help:"keep tag localization, not synchronized to the cloud" default:"false"`