Skip to content

Commit d8c97a0

Browse files
authored
Merge pull request #950 from timofurrer/feature/approval-rule-get
resource/gitlab_project_approval_rule: fix potential accidental destroy of resource if not in first page
2 parents 720cb4f + b991b9d commit d8c97a0

File tree

4 files changed

+15
-41
lines changed

4 files changed

+15
-41
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ require (
88
github.com/hashicorp/terraform-plugin-sdk/v2 v2.11.0
99
github.com/mitchellh/hashstructure v1.1.0
1010
github.com/onsi/gomega v1.18.1
11-
github.com/xanzy/go-gitlab v0.59.0
11+
github.com/xanzy/go-gitlab v0.60.0
1212
golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect
1313
golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect
1414
golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a // indirect

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,8 @@ github.com/vmihailenco/msgpack/v4 v4.3.12 h1:07s4sz9IReOgdikxLTKNbBdqDMLsjPKXwvC
310310
github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
311311
github.com/vmihailenco/tagparser v0.1.1 h1:quXMXlA39OCbd2wAdTsGDlK9RkOk6Wuw+x37wVyIuWY=
312312
github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
313-
github.com/xanzy/go-gitlab v0.59.0 h1:fAr6rT/YIdfmBavYgI42+Op7yAAex2Y4xOfvbjN9hxQ=
314-
github.com/xanzy/go-gitlab v0.59.0/go.mod h1:F0QEXwmqiBUxCgJm8fE9S+1veX4XC9Z4cfaAbqwk4YM=
313+
github.com/xanzy/go-gitlab v0.60.0 h1:HaIlc14k4t9eJjAhY0Gmq2fBHgKd1MthBn3+vzDtsbA=
314+
github.com/xanzy/go-gitlab v0.60.0/go.mod h1:F0QEXwmqiBUxCgJm8fE9S+1veX4XC9Z4cfaAbqwk4YM=
315315
github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI=
316316
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
317317
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=

internal/provider/data_source_gitlab_project_issues.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ func dataSourceGitlabProjectIssuesRead(ctx context.Context, d *schema.ResourceDa
267267
}
268268

269269
if v, ok := d.GetOk("assignee_id"); ok {
270-
options.AssigneeID = gitlab.Int(v.(int))
270+
options.AssigneeID = gitlab.AssigneeID(v.(int))
271271
}
272272

273273
if v, ok := d.GetOk("not_assignee_id"); ok {

internal/provider/resource_gitlab_project_approval_rule.go

Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package provider
22

33
import (
44
"context"
5-
"errors"
65
"fmt"
76
"log"
87
"strconv"
@@ -13,9 +12,6 @@ import (
1312
gitlab "github.com/xanzy/go-gitlab"
1413
)
1514

16-
// https://docs.gitlab.com/ee/api/merge_request_approvals.html#create-project-level-rule
17-
var errApprovalRuleNotFound = errors.New("approval rule not found")
18-
1915
var _ = registerResource("gitlab_project_approval_rule", func() *schema.Resource {
2016
var validRuleTypeValues = []string{
2117
"regular",
@@ -119,21 +115,28 @@ func resourceGitlabProjectApprovalRuleCreate(ctx context.Context, d *schema.Reso
119115
func resourceGitlabProjectApprovalRuleRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
120116
log.Printf("[DEBUG] read gitlab project-level rule %s", d.Id())
121117

122-
projectID, _, err := parseTwoPartID(d.Id())
118+
projectID, parsedRuleID, err := parseTwoPartID(d.Id())
123119
if err != nil {
124120
return diag.FromErr(err)
125121
}
126-
d.Set("project", projectID)
122+
ruleID, err := strconv.Atoi(parsedRuleID)
123+
if err != nil {
124+
return diag.FromErr(err)
125+
}
126+
127+
client := meta.(*gitlab.Client)
127128

128-
rule, err := getApprovalRuleByID(ctx, meta.(*gitlab.Client), d.Id())
129+
rule, _, err := client.Projects.GetProjectApprovalRule(projectID, ruleID, gitlab.WithContext(ctx))
129130
if err != nil {
130-
if errors.Is(err, errApprovalRuleNotFound) {
131+
if is404(err) {
132+
log.Printf("[DEBUG] no project-level rule %s found, removing from state", d.Id())
131133
d.SetId("")
132134
return nil
133135
}
134136
return diag.FromErr(err)
135137
}
136138

139+
d.Set("project", projectID)
137140
d.Set("name", rule.Name)
138141
d.Set("approvals_required", rule.ApprovalsRequired)
139142
d.Set("rule_type", rule.RuleType)
@@ -207,35 +210,6 @@ func resourceGitlabProjectApprovalRuleDelete(ctx context.Context, d *schema.Reso
207210
return nil
208211
}
209212

210-
// getApprovalRuleByID checks the list of rules and finds the one that matches our rule ID.
211-
func getApprovalRuleByID(ctx context.Context, client *gitlab.Client, id string) (*gitlab.ProjectApprovalRule, error) {
212-
projectID, ruleID, err := parseTwoPartID(id)
213-
if err != nil {
214-
return nil, err
215-
}
216-
217-
ruleIDInt, err := strconv.Atoi(ruleID)
218-
if err != nil {
219-
return nil, err
220-
}
221-
222-
log.Printf("[DEBUG] read approval rules for project %s", projectID)
223-
224-
rules, _, err := client.Projects.GetProjectApprovalRules(projectID, gitlab.WithContext(ctx))
225-
if err != nil {
226-
return nil, err
227-
}
228-
229-
for _, r := range rules {
230-
if r.ID == ruleIDInt {
231-
log.Printf("[DEBUG] found project-level rule %+v", r)
232-
return r, nil
233-
}
234-
}
235-
236-
return nil, errApprovalRuleNotFound
237-
}
238-
239213
// flattenApprovalRuleUserIDs flattens a list of approval user ids into a list
240214
// of ints for storage in state.
241215
func flattenApprovalRuleUserIDs(users []*gitlab.BasicUser) []int {

0 commit comments

Comments
 (0)