@@ -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+ 
180212func  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