Skip to content

Commit 8d6aede

Browse files
committed
chore: optimize review update
1 parent e724604 commit 8d6aede

File tree

1 file changed

+44
-17
lines changed

1 file changed

+44
-17
lines changed

provider/resource_review_config.go

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -136,18 +136,10 @@ func resourceReviewConfigUpsert(ctx context.Context, d *schema.ResourceData, m i
136136
reviewID := d.Get("resource_id").(string)
137137
reviewName := fmt.Sprintf("%s%s", internal.ReviewConfigNamePrefix, reviewID)
138138

139-
oldAttachedResources := []string{}
140139
if existedName != "" {
141140
if existedName != reviewName {
142141
return diag.Errorf("cannot change the resource id")
143142
}
144-
145-
existedReview, err := c.GetReviewConfig(ctx, existedName)
146-
if err != nil {
147-
tflog.Debug(ctx, fmt.Sprintf("get review config %s failed with error: %v", existedName, err))
148-
} else if existedReview != nil {
149-
oldAttachedResources = existedReview.Resources
150-
}
151143
}
152144

153145
rules, err := convertToV1RuleList(d)
@@ -170,13 +162,53 @@ func resourceReviewConfigUpsert(ctx context.Context, d *schema.ResourceData, m i
170162
return diag.FromErr(err)
171163
}
172164

173-
removeReviewConfigTag(ctx, c, oldAttachedResources)
174-
patchTagPolicy(ctx, c, d, review.Name)
165+
pendingDelete, pendingAdd := getResourceDiff(ctx, c, d)
166+
removeReviewConfigTag(ctx, c, pendingDelete)
167+
patchTagPolicy(ctx, c, review.Name, pendingAdd)
175168
d.SetId(review.Name)
176169

177170
return resourceReviewConfigRead(ctx, d, m)
178171
}
179172

173+
// getResourceDiff returns pending delete list and pending add list.
174+
func getResourceDiff(ctx context.Context, client api.Client, d *schema.ResourceData) ([]string, []string) {
175+
existedName := d.Id()
176+
oldAttachedResources := []string{}
177+
if existedName != "" {
178+
existedReview, err := client.GetReviewConfig(ctx, existedName)
179+
if err != nil {
180+
tflog.Debug(ctx, fmt.Sprintf("get review config %s failed with error: %v", existedName, err))
181+
} else if existedReview != nil {
182+
oldAttachedResources = existedReview.Resources
183+
}
184+
}
185+
186+
oldResourceMap := map[string]bool{}
187+
for _, resource := range oldAttachedResources {
188+
oldResourceMap[resource] = true
189+
}
190+
191+
newAttachedResources := getReviewConfigRelatedResources(d)
192+
newResourceMap := map[string]bool{}
193+
for _, resource := range newAttachedResources {
194+
newResourceMap[resource] = true
195+
}
196+
197+
pendingDelete := []string{}
198+
pendingAdd := []string{}
199+
for old := range oldResourceMap {
200+
if !newResourceMap[old] {
201+
pendingDelete = append(pendingDelete, old)
202+
}
203+
}
204+
for new := range newResourceMap {
205+
if !oldResourceMap[new] {
206+
pendingAdd = append(pendingAdd, new)
207+
}
208+
}
209+
return pendingDelete, pendingAdd
210+
}
211+
180212
func getReviewConfigRelatedResources(d *schema.ResourceData) []string {
181213
resources := []string{}
182214
rawSet, ok := d.Get("resources").(*schema.Set)
@@ -198,13 +230,8 @@ func removeReviewConfigTag(ctx context.Context, client api.Client, resources []s
198230
}
199231
}
200232

201-
func patchTagPolicy(ctx context.Context, client api.Client, d *schema.ResourceData, reviewName string) diag.Diagnostics {
202-
rawSet, ok := d.Get("resources").(*schema.Set)
203-
if !ok || rawSet.Len() == 0 {
204-
return nil
205-
}
206-
for _, raw := range rawSet.List() {
207-
resource := raw.(string)
233+
func patchTagPolicy(ctx context.Context, client api.Client, reviewName string, resources []string) diag.Diagnostics {
234+
for _, resource := range resources {
208235
if !strings.HasPrefix(resource, internal.ProjectNamePrefix) && !strings.HasPrefix(resource, internal.EnvironmentNamePrefix) {
209236
return diag.Errorf("invalid resource, only support projects/{id} or environments/{id}")
210237
}

0 commit comments

Comments
 (0)