Skip to content

Commit 28c19f9

Browse files
authored
Merge pull request #791 from timofurrer/feature/context-and-diag
Use context-aware CRUD functions and use it in gitlab API calls
2 parents 3bc959d + a26d149 commit 28c19f9

File tree

45 files changed

+967
-792
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+967
-792
lines changed

gitlab/data_source_gitlab_group.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
package gitlab
22

33
import (
4+
"context"
45
"fmt"
56
"log"
67

8+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
79
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
810
"github.com/xanzy/go-gitlab"
911
)
1012

1113
func dataSourceGitlabGroup() *schema.Resource {
1214
return &schema.Resource{
13-
Read: dataSourceGitlabGroupRead,
15+
ReadContext: dataSourceGitlabGroupRead,
1416
Schema: map[string]*schema.Schema{
1517
"group_id": {
1618
Type: schema.TypeInt,
@@ -77,7 +79,7 @@ func dataSourceGitlabGroup() *schema.Resource {
7779
}
7880
}
7981

80-
func dataSourceGitlabGroupRead(d *schema.ResourceData, meta interface{}) error {
82+
func dataSourceGitlabGroupRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
8183
client := meta.(*gitlab.Client)
8284

8385
var group *gitlab.Group
@@ -90,18 +92,18 @@ func dataSourceGitlabGroupRead(d *schema.ResourceData, meta interface{}) error {
9092

9193
if groupIDOk {
9294
// Get group by id
93-
group, _, err = client.Groups.GetGroup(groupIDData.(int), nil)
95+
group, _, err = client.Groups.GetGroup(groupIDData.(int), nil, gitlab.WithContext(ctx))
9496
if err != nil {
95-
return err
97+
return diag.FromErr(err)
9698
}
9799
} else if fullPathOk {
98100
// Get group by full path
99-
group, _, err = client.Groups.GetGroup(fullPathData.(string), nil)
101+
group, _, err = client.Groups.GetGroup(fullPathData.(string), nil, gitlab.WithContext(ctx))
100102
if err != nil {
101-
return err
103+
return diag.FromErr(err)
102104
}
103105
} else {
104-
return fmt.Errorf("one and only one of group_id or full_path must be set")
106+
return diag.Errorf("one and only one of group_id or full_path must be set")
105107
}
106108

107109
d.Set("group_id", group.ID)

gitlab/data_source_gitlab_group_membership.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package gitlab
22

33
import (
4+
"context"
45
"fmt"
56
"log"
67
"strconv"
78
"strings"
89

10+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
911
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1012
"github.com/xanzy/go-gitlab"
1113
)
@@ -16,7 +18,7 @@ func dataSourceGitlabGroupMembership() *schema.Resource {
1618
acceptedAccessLevels = append(acceptedAccessLevels, k)
1719
}
1820
return &schema.Resource{
19-
Read: dataSourceGitlabGroupMembershipRead,
21+
ReadContext: dataSourceGitlabGroupMembershipRead,
2022
Schema: map[string]*schema.Schema{
2123
"group_id": {
2224
Type: schema.TypeInt,
@@ -84,7 +86,7 @@ func dataSourceGitlabGroupMembership() *schema.Resource {
8486
}
8587
}
8688

87-
func dataSourceGitlabGroupMembershipRead(d *schema.ResourceData, meta interface{}) error {
89+
func dataSourceGitlabGroupMembershipRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
8890
client := meta.(*gitlab.Client)
8991

9092
var gm []*gitlab.GroupMember
@@ -98,26 +100,26 @@ func dataSourceGitlabGroupMembershipRead(d *schema.ResourceData, meta interface{
98100

99101
if groupIDOk {
100102
// Get group by id
101-
group, _, err = client.Groups.GetGroup(groupIDData.(int), nil)
103+
group, _, err = client.Groups.GetGroup(groupIDData.(int), nil, gitlab.WithContext(ctx))
102104
if err != nil {
103-
return err
105+
return diag.FromErr(err)
104106
}
105107
} else if fullPathOk {
106108
// Get group by full path
107109
group, _, err = client.Groups.GetGroup(fullPathData.(string), nil)
108110
if err != nil {
109-
return err
111+
return diag.FromErr(err)
110112
}
111113
} else {
112-
return fmt.Errorf("one and only one of group_id or full_path must be set")
114+
return diag.Errorf("one and only one of group_id or full_path must be set")
113115
}
114116

115117
log.Printf("[INFO] Reading Gitlab group memberships")
116118

117119
// Get group memberships
118-
gm, _, err = client.Groups.ListGroupMembers(group.ID, &gitlab.ListGroupMembersOptions{})
120+
gm, _, err = client.Groups.ListGroupMembers(group.ID, &gitlab.ListGroupMembersOptions{}, gitlab.WithContext(ctx))
119121
if err != nil {
120-
return err
122+
return diag.FromErr(err)
121123
}
122124

123125
d.Set("group_id", group.ID)

gitlab/data_source_gitlab_project.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
package gitlab
22

33
import (
4+
"context"
45
"errors"
56
"fmt"
67
"log"
78
"net/http"
89

10+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
911
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1012
"github.com/xanzy/go-gitlab"
1113
)
1214

1315
func dataSourceGitlabProject() *schema.Resource {
1416
return &schema.Resource{
15-
Read: dataSourceGitlabProjectRead,
17+
ReadContext: dataSourceGitlabProjectRead,
1618

1719
Schema: map[string]*schema.Schema{
1820
"id": {
@@ -156,16 +158,16 @@ func dataSourceGitlabProject() *schema.Resource {
156158
}
157159
}
158160

159-
func dataSourceGitlabProjectRead(d *schema.ResourceData, meta interface{}) error {
161+
func dataSourceGitlabProjectRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
160162
client := meta.(*gitlab.Client)
161163

162164
log.Printf("[INFO] Reading Gitlab project")
163165

164166
v, _ := d.GetOk("id")
165167

166-
found, _, err := client.Projects.GetProject(v, nil)
168+
found, _, err := client.Projects.GetProject(v, nil, gitlab.WithContext(ctx))
167169
if err != nil {
168-
return err
170+
return diag.FromErr(err)
169171
}
170172

171173
d.SetId(fmt.Sprintf("%d", found.ID))
@@ -191,12 +193,12 @@ func dataSourceGitlabProjectRead(d *schema.ResourceData, meta interface{}) error
191193

192194
log.Printf("[DEBUG] Reading Gitlab project %q push rules", d.Id())
193195

194-
pushRules, _, err := client.Projects.GetProjectPushRules(d.Id())
196+
pushRules, _, err := client.Projects.GetProjectPushRules(d.Id(), gitlab.WithContext(ctx))
195197
var httpError *gitlab.ErrorResponse
196198
if errors.As(err, &httpError) && httpError.Response.StatusCode == http.StatusNotFound {
197199
log.Printf("[DEBUG] Failed to get push rules for project %q: %v", d.Id(), err)
198200
} else if err != nil {
199-
return fmt.Errorf("Failed to get push rules for project %q: %w", d.Id(), err)
201+
return diag.Errorf("Failed to get push rules for project %q: %v", d.Id(), err)
200202
}
201203

202204
d.Set("push_rules", flattenProjectPushRules(pushRules)) // lintignore: XR004 // TODO: Resolve this tfproviderlint issue

gitlab/data_source_gitlab_project_protected_branch.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package gitlab
22

33
import (
4+
"context"
45
"fmt"
56
"log"
67

8+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
79
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
810
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
911
"github.com/xanzy/go-gitlab"
1012
)
1113

1214
func dataSourceGitlabProjectProtectedBranch() *schema.Resource {
1315
return &schema.Resource{
14-
Read: dataSourceGitlabProjectProtectedBranchRead,
16+
ReadContext: dataSourceGitlabProjectProtectedBranchRead,
1517
Schema: map[string]*schema.Schema{
1618
"project_id": {
1719
Type: schema.TypeString,
@@ -70,7 +72,7 @@ func dataSourceGitlabProjectProtectedBranchSchemaAccessLevels() *schema.Schema {
7072
}
7173
}
7274

73-
func dataSourceGitlabProjectProtectedBranchRead(d *schema.ResourceData, meta interface{}) error {
75+
func dataSourceGitlabProjectProtectedBranchRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
7476
client := meta.(*gitlab.Client)
7577

7678
log.Printf("[INFO] Reading Gitlab protected branch")
@@ -79,24 +81,24 @@ func dataSourceGitlabProjectProtectedBranchRead(d *schema.ResourceData, meta int
7981
name := d.Get("name").(string)
8082

8183
// Get protected branch by project ID/path and branch name
82-
pb, _, err := client.ProtectedBranches.GetProtectedBranch(project, name)
84+
pb, _, err := client.ProtectedBranches.GetProtectedBranch(project, name, gitlab.WithContext(ctx))
8385
if err != nil {
84-
return fmt.Errorf("error getting protected branch (Project: %v / Name %v): %v", project, name, err)
86+
return diag.Errorf("error getting protected branch (Project: %v / Name %v): %v", project, name, err)
8587
}
8688

8789
// lintignore:R004 // TODO: Resolve this tfproviderlint issue
8890
if err := d.Set("push_access_levels", convertBranchAccessDescriptionsToStateBranchAccessDescriptions(pb.PushAccessLevels)); err != nil {
89-
return err
91+
return diag.FromErr(err)
9092
}
9193
// lintignore:R004 // TODO: Resolve this tfproviderlint issue
9294
if err := d.Set("merge_access_levels", convertBranchAccessDescriptionsToStateBranchAccessDescriptions(pb.MergeAccessLevels)); err != nil {
93-
return err
95+
return diag.FromErr(err)
9496
}
9597
if err := d.Set("allow_force_push", pb.AllowForcePush); err != nil {
96-
return err
98+
return diag.FromErr(err)
9799
}
98100
if err := d.Set("code_owner_approval_required", pb.CodeOwnerApprovalRequired); err != nil {
99-
return err
101+
return diag.FromErr(err)
100102
}
101103

102104
d.SetId(fmt.Sprintf("%d", pb.ID))

gitlab/data_source_gitlab_project_protected_branches.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package gitlab
22

33
import (
4+
"context"
45
"fmt"
56
"log"
67

8+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
79
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
810
"github.com/mitchellh/hashstructure"
911
"github.com/xanzy/go-gitlab"
1012
)
1113

1214
func dataSourceGitlabProjectProtectedBranches() *schema.Resource {
1315
return &schema.Resource{
14-
Read: dataSourceGitlabProjectProtectedBranchesRead,
16+
ReadContext: dataSourceGitlabProjectProtectedBranchesRead,
1517
Schema: map[string]*schema.Schema{
1618
"project_id": {
1719
Type: schema.TypeString,
@@ -58,26 +60,26 @@ type stateProtectedBranch struct {
5860
CodeOwnerApprovalRequired bool `json:"code_owner_approval_required,omitempty" mapstructure:"code_owner_approval_required,omitempty"`
5961
}
6062

61-
func dataSourceGitlabProjectProtectedBranchesRead(d *schema.ResourceData, meta interface{}) error {
63+
func dataSourceGitlabProjectProtectedBranchesRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
6264
client := meta.(*gitlab.Client)
6365

6466
log.Printf("[INFO] Reading Gitlab protected branch")
6567

6668
project := d.Get("project_id")
6769

68-
projectObject, _, err := client.Projects.GetProject(project, &gitlab.GetProjectOptions{})
70+
projectObject, _, err := client.Projects.GetProject(project, &gitlab.GetProjectOptions{}, gitlab.WithContext(ctx))
6971
if err != nil {
70-
return err
72+
return diag.FromErr(err)
7173
}
7274

7375
allProtectedBranches := make([]stateProtectedBranch, 0)
7476
totalPages := -1
7577
opts := &gitlab.ListProtectedBranchesOptions{}
7678
for opts.Page = 0; opts.Page != totalPages; opts.Page++ {
7779
// Get protected branch by project ID/path and branch name
78-
pbs, resp, err := client.ProtectedBranches.ListProtectedBranches(project, opts)
80+
pbs, resp, err := client.ProtectedBranches.ListProtectedBranches(project, opts, gitlab.WithContext(ctx))
7981
if err != nil {
80-
return err
82+
return diag.FromErr(err)
8183
}
8284
totalPages = resp.TotalPages
8385
for _, pb := range pbs {
@@ -94,12 +96,12 @@ func dataSourceGitlabProjectProtectedBranchesRead(d *schema.ResourceData, meta i
9496

9597
// lintignore:R004 // TODO: Resolve this tfproviderlint issue
9698
if err := d.Set("protected_branches", allProtectedBranches); err != nil {
97-
return err
99+
return diag.FromErr(err)
98100
}
99101

100102
h, err := hashstructure.Hash(*opts, nil)
101103
if err != nil {
102-
return err
104+
return diag.FromErr(err)
103105
}
104106

105107
d.SetId(fmt.Sprintf("%d-%d", projectObject.ID, h))

gitlab/data_source_gitlab_projects.go

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
package gitlab
44

55
import (
6+
"context"
67
"fmt"
78
"log"
89

10+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
911
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1012
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1113
"github.com/mitchellh/hashstructure"
@@ -172,7 +174,7 @@ func flattenProjects(projects []*gitlab.Project) (values []map[string]interface{
172174
func dataSourceGitlabProjects() *schema.Resource {
173175
// lintignore: S024 // TODO: Resolve this tfproviderlint issue
174176
return &schema.Resource{
175-
Read: dataSourceGitlabProjectsRead,
177+
ReadContext: dataSourceGitlabProjectsRead,
176178

177179
// lintignore: S006 // TODO: Resolve this tfproviderlint issue
178180
Schema: map[string]*schema.Schema{
@@ -673,7 +675,7 @@ func dataSourceGitlabProjects() *schema.Resource {
673675

674676
// CRUD methods
675677

676-
func dataSourceGitlabProjectsRead(d *schema.ResourceData, meta interface{}) (err error) {
678+
func dataSourceGitlabProjectsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
677679
client := meta.(*gitlab.Client)
678680
var projectList []*gitlab.Project
679681

@@ -797,9 +799,9 @@ func dataSourceGitlabProjectsRead(d *schema.ResourceData, meta interface{}) (err
797799
}
798800

799801
for {
800-
projects, response, err := client.Groups.ListGroupProjects(groupId.(int), opts, nil)
802+
projects, response, err := client.Groups.ListGroupProjects(groupId.(int), opts, gitlab.WithContext(ctx))
801803
if err != nil {
802-
return err
804+
return diag.FromErr(err)
803805
}
804806
projectList = append(projectList, projects...)
805807
opts.ListOptions.Page++
@@ -811,11 +813,11 @@ func dataSourceGitlabProjectsRead(d *schema.ResourceData, meta interface{}) (err
811813
}
812814
h, err := hashstructure.Hash(*opts, nil)
813815
if err != nil {
814-
return err
816+
return diag.FromErr(err)
815817
}
816818
d.SetId(fmt.Sprintf("%d-%d", groupId.(int), h))
817819
if err := d.Set("projects", flattenProjects(projectList)); err != nil {
818-
return err
820+
return diag.FromErr(err)
819821
}
820822

821823
// Project case
@@ -843,9 +845,9 @@ func dataSourceGitlabProjectsRead(d *schema.ResourceData, meta interface{}) (err
843845
}
844846

845847
for {
846-
projects, response, err := client.Projects.ListProjects(opts, nil)
848+
projects, response, err := client.Projects.ListProjects(opts, nil, gitlab.WithContext(ctx))
847849
if err != nil {
848-
return err
850+
return diag.FromErr(err)
849851
}
850852
projectList = append(projectList, projects...)
851853
opts.ListOptions.Page++
@@ -857,14 +859,15 @@ func dataSourceGitlabProjectsRead(d *schema.ResourceData, meta interface{}) (err
857859
}
858860
h, err := hashstructure.Hash(*opts, nil)
859861
if err != nil {
860-
return err
862+
return diag.FromErr(err)
861863
}
862864
d.SetId(fmt.Sprintf("%d", h))
863865
if err := d.Set("projects", flattenProjects(projectList)); err != nil {
864-
return err
866+
return diag.FromErr(err)
865867
}
866868
}
867-
return err
869+
870+
return nil
868871
}
869872

870873
func flattenSharedWithGroupsOptions(project *gitlab.Project) []interface{} {

0 commit comments

Comments
 (0)