Skip to content

Commit 1b4aac2

Browse files
authored
Merge pull request #126 from Nkmol/handle-http-errors
fix: handle http errors of api client
2 parents 8eb3389 + c443cd1 commit 1b4aac2

18 files changed

+137
-249
lines changed

bitbucket/data_current_user.go

+3-12
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"encoding/json"
66
"io"
77
"log"
8-
"net/http"
98

109
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1110
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -70,17 +69,9 @@ func dataReadCurrentUser(ctx context.Context, d *schema.ResourceData, m interfac
7069
httpClient := m.(Clients).httpClient
7170
usersApi := c.ApiClient.UsersApi
7271

73-
curUser, curUserRes, err := usersApi.UserGet(c.AuthContext)
74-
if err != nil {
75-
return diag.Errorf("error reading current user: %s", err)
76-
}
77-
78-
if curUserRes.StatusCode == http.StatusNotFound {
79-
return diag.Errorf("user not found")
80-
}
81-
82-
if curUserRes.StatusCode >= http.StatusInternalServerError {
83-
return diag.Errorf("internal server error fetching user")
72+
curUser, _, err := usersApi.UserGet(c.AuthContext)
73+
if err := handleClientError(err); err != nil {
74+
return diag.FromErr(err)
8475
}
8576

8677
log.Printf("[DEBUG] Current User: %#v", curUser)

bitbucket/data_hook_types.go

+2-11
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package bitbucket
33
import (
44
"context"
55
"log"
6-
"net/http"
76

87
"github.com/DrFaust92/bitbucket-go-client"
98
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@@ -52,19 +51,11 @@ func dataReadHookTypes(ctx context.Context, d *schema.ResourceData, m interface{
5251
webhooksApi := c.ApiClient.WebhooksApi
5352

5453
subjectType := d.Get("subject_type").(string)
55-
hookTypes, res, err := webhooksApi.HookEventsSubjectTypeGet(c.AuthContext, subjectType)
56-
if err != nil {
54+
hookTypes, _, err := webhooksApi.HookEventsSubjectTypeGet(c.AuthContext, subjectType)
55+
if err := handleClientError(err); err != nil {
5756
return diag.FromErr(err)
5857
}
5958

60-
if res.StatusCode == http.StatusNotFound {
61-
return diag.Errorf("user not found")
62-
}
63-
64-
if res.StatusCode >= http.StatusInternalServerError {
65-
return diag.Errorf("internal server error fetching hook types")
66-
}
67-
6859
d.SetId(subjectType)
6960
d.Set("hook_types", flattenHookTypes(hookTypes.Values))
7061

bitbucket/data_user.go

+3-12
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package bitbucket
33
import (
44
"context"
55
"log"
6-
"net/http"
76

87
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
98
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -41,17 +40,9 @@ func dataReadUser(ctx context.Context, d *schema.ResourceData, m interface{}) di
4140
selectedUser = v.(string)
4241
}
4342

44-
user, userRes, err := usersApi.UsersSelectedUserGet(c.AuthContext, selectedUser)
45-
if err != nil {
46-
return diag.Errorf("error reading User (%s): %s", selectedUser, err)
47-
}
48-
49-
if userRes.StatusCode == http.StatusNotFound {
50-
return diag.Errorf("user not found")
51-
}
52-
53-
if userRes.StatusCode >= http.StatusInternalServerError {
54-
return diag.Errorf("internal server error fetching user")
43+
user, _, err := usersApi.UsersSelectedUserGet(c.AuthContext, selectedUser)
44+
if err := handleClientError(err); err != nil {
45+
return diag.FromErr(err)
5546
}
5647

5748
log.Printf("[DEBUG] User: %#v", user)

bitbucket/data_workspace.go

+2-11
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package bitbucket
22

33
import (
44
"context"
5-
"net/http"
65

76
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
87
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -39,19 +38,11 @@ func dataReadWorkspace(ctx context.Context, d *schema.ResourceData, m interface{
3938
workspaceApi := c.ApiClient.WorkspacesApi
4039

4140
workspace := d.Get("workspace").(string)
42-
workspaceReq, res, err := workspaceApi.WorkspacesWorkspaceGet(c.AuthContext, workspace)
43-
if err != nil {
41+
workspaceReq, _, err := workspaceApi.WorkspacesWorkspaceGet(c.AuthContext, workspace)
42+
if err := handleClientError(err); err != nil {
4443
return diag.FromErr(err)
4544
}
4645

47-
if res.StatusCode == http.StatusNotFound {
48-
return diag.Errorf("workspace not found")
49-
}
50-
51-
if res.StatusCode >= http.StatusInternalServerError {
52-
return diag.Errorf("internal server error fetching workspace")
53-
}
54-
5546
d.SetId(workspaceReq.Uuid)
5647
d.Set("workspace", workspace)
5748
d.Set("name", workspaceReq.Name)

bitbucket/error.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,24 @@ package bitbucket
22

33
import (
44
"encoding/json"
5+
"fmt"
56

67
"github.com/DrFaust92/bitbucket-go-client"
7-
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
88
)
99

10-
func handleClientError(err error) diag.Diagnostics {
10+
func handleClientError(err error) error {
1111
httpErr, ok := err.(bitbucket.GenericSwaggerError)
1212
if ok {
1313
var httpError bitbucket.ModelError
1414
if err := json.Unmarshal(httpErr.Body(), &httpError); err != nil {
15-
return diag.Errorf(string(httpErr.Body()))
15+
return fmt.Errorf(string(httpErr.Body()))
1616
}
1717

18-
return diag.Errorf("%s: %s", httpErr.Error(), httpError.Error_.Message)
18+
return fmt.Errorf("%s: %s", httpErr.Error(), httpError.Error_.Message)
1919
}
2020

2121
if err != nil {
22-
return diag.FromErr(err)
22+
return err
2323
}
2424

2525
return nil

bitbucket/resource_branch_restriction.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,8 @@ func resourceBranchRestrictionsCreate(ctx context.Context, d *schema.ResourceDat
196196
workspace := d.Get("owner").(string)
197197
branchRestrictionReq, _, err := brApi.RepositoriesWorkspaceRepoSlugBranchRestrictionsPost(c.AuthContext, *branchRestriction, repo, workspace)
198198

199-
if diag := handleClientError(err); diag != nil {
200-
return diag
199+
if err := handleClientError(err); err != nil {
200+
return diag.FromErr(err)
201201
}
202202

203203
d.SetId(string(fmt.Sprintf("%v", branchRestrictionReq.Id)))
@@ -218,8 +218,8 @@ func resourceBranchRestrictionsRead(ctx context.Context, d *schema.ResourceData,
218218
return nil
219219
}
220220

221-
if diag := handleClientError(err); diag != nil {
222-
return diag
221+
if err := handleClientError(err); err != nil {
222+
return diag.FromErr(err)
223223
}
224224

225225
d.SetId(string(fmt.Sprintf("%v", brRes.Id)))
@@ -243,8 +243,8 @@ func resourceBranchRestrictionsUpdate(ctx context.Context, d *schema.ResourceDat
243243
*branchRestriction, url.PathEscape(d.Id()),
244244
d.Get("repository").(string), d.Get("owner").(string))
245245

246-
if diag := handleClientError(err); diag != nil {
247-
return diag
246+
if err := handleClientError(err); err != nil {
247+
return diag.FromErr(err)
248248
}
249249

250250
return resourceBranchRestrictionsRead(ctx, d, m)
@@ -262,8 +262,8 @@ func resourceBranchRestrictionsDelete(ctx context.Context, d *schema.ResourceDat
262262
return nil
263263
}
264264

265-
if diag := handleClientError(err); diag != nil {
266-
return diag
265+
if err := handleClientError(err); err != nil {
266+
return diag.FromErr(err)
267267
}
268268

269269
return nil

bitbucket/resource_default_reviewers.go

+8-33
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,11 @@ func resourceDefaultReviewersCreate(ctx context.Context, d *schema.ResourceData,
6565
workspace := d.Get("owner").(string)
6666
for _, user := range d.Get("reviewers").(*schema.Set).List() {
6767
userName := user.(string)
68-
_, reviewerResp, err := prApi.RepositoriesWorkspaceRepoSlugDefaultReviewersTargetUsernamePut(c.AuthContext, repo, userName, workspace)
6968

70-
if err != nil {
69+
_, _, err := prApi.RepositoriesWorkspaceRepoSlugDefaultReviewersTargetUsernamePut(c.AuthContext, repo, userName, workspace)
70+
if err := handleClientError(err); err != nil {
7171
return diag.FromErr(err)
7272
}
73-
74-
if reviewerResp.StatusCode != 200 {
75-
return diag.Errorf("failed to create reviewer %s got code %d", userName, reviewerResp.StatusCode)
76-
}
7773
}
7874

7975
d.SetId(fmt.Sprintf("%s/%s/reviewers", workspace, repo))
@@ -150,31 +146,18 @@ func resourceDefaultReviewersUpdate(ctx context.Context, d *schema.ResourceData,
150146

151147
for _, user := range add.List() {
152148
userName := user.(string)
153-
_, reviewerResp, err := prApi.RepositoriesWorkspaceRepoSlugDefaultReviewersTargetUsernamePut(c.AuthContext, repo, userName, workspace)
154-
155-
if err != nil {
149+
_, _, err := prApi.RepositoriesWorkspaceRepoSlugDefaultReviewersTargetUsernamePut(c.AuthContext, repo, userName, workspace)
150+
if err := handleClientError(err); err != nil {
156151
return diag.FromErr(err)
157152
}
158-
159-
if reviewerResp.StatusCode != 200 {
160-
return diag.Errorf("failed to create reviewer %s got code %d", userName, reviewerResp.StatusCode)
161-
}
162153
}
163154

164155
for _, user := range remove.List() {
165156
userName := user.(string)
166-
reviewerResp, err := prApi.RepositoriesWorkspaceRepoSlugDefaultReviewersTargetUsernameDelete(c.AuthContext, repo, userName, workspace)
167-
168-
if err != nil {
157+
_, err := prApi.RepositoriesWorkspaceRepoSlugDefaultReviewersTargetUsernameDelete(c.AuthContext, repo, userName, workspace)
158+
if err := handleClientError(err); err != nil {
169159
return diag.FromErr(err)
170160
}
171-
172-
if reviewerResp.StatusCode != 204 {
173-
return diag.Errorf("[%d] Could not delete %s from default reviewers",
174-
reviewerResp.StatusCode,
175-
userName,
176-
)
177-
}
178161
}
179162

180163
return resourceDefaultReviewersRead(ctx, d, m)
@@ -188,18 +171,10 @@ func resourceDefaultReviewersDelete(ctx context.Context, d *schema.ResourceData,
188171
workspace := d.Get("owner").(string)
189172
for _, user := range d.Get("reviewers").(*schema.Set).List() {
190173
userName := user.(string)
191-
reviewerResp, err := prApi.RepositoriesWorkspaceRepoSlugDefaultReviewersTargetUsernameDelete(c.AuthContext, repo, userName, workspace)
192-
193-
if err != nil {
174+
_, err := prApi.RepositoriesWorkspaceRepoSlugDefaultReviewersTargetUsernameDelete(c.AuthContext, repo, userName, workspace)
175+
if err := handleClientError(err); err != nil {
194176
return diag.FromErr(err)
195177
}
196-
197-
if reviewerResp.StatusCode != 204 {
198-
return diag.Errorf("[%d] Could not delete %s from default reviewer",
199-
reviewerResp.StatusCode,
200-
userName,
201-
)
202-
}
203178
}
204179
return nil
205180
}

bitbucket/resource_deploy_key.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,17 @@ func resourceDeployKeysRead(ctx context.Context, d *schema.ResourceData, m inter
106106
}
107107

108108
deployKey, deployKeyRes, err := deployApi.RepositoriesWorkspaceRepoSlugDeployKeysKeyIdGet(c.AuthContext, keyId, repo, workspace)
109-
if err != nil {
110-
return diag.Errorf("error reading Deploy Key (%s): %s", d.Id(), err)
111-
}
112109

113110
if deployKeyRes.StatusCode == http.StatusNotFound {
114111
log.Printf("[WARN] Deploy Key (%s) not found, removing from state", d.Id())
115112
d.SetId("")
116113
return nil
117114
}
118115

116+
if err := handleClientError(err); err != nil {
117+
return diag.FromErr(err)
118+
}
119+
119120
log.Printf("[DEBUG] Deploy Key Response: %#v", deployKey)
120121

121122
d.Set("repository", repo)
@@ -164,8 +165,8 @@ func resourceDeployKeysDelete(ctx context.Context, d *schema.ResourceData, m int
164165
}
165166

166167
_, err = deployApi.RepositoriesWorkspaceRepoSlugDeployKeysKeyIdDelete(c.AuthContext, keyId, repo, workspace)
167-
if err != nil {
168-
return diag.Errorf("error deleting Deploy Key (%s): %s", d.Id(), err)
168+
if err := handleClientError(err); err != nil {
169+
return diag.FromErr(err)
169170
}
170171

171172
return diag.FromErr(err)

bitbucket/resource_deployment_variable.go

+10-11
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,8 @@ func resourceDeploymentVariableCreate(ctx context.Context, d *schema.ResourceDat
8484
}
8585

8686
rvRes, _, err := pipeApi.CreateDeploymentVariable(c.AuthContext, *rvcr, workspace, repoSlug, deployment)
87-
88-
if err != nil {
89-
return diag.Errorf("error creating Deployment Variable (%s): %s", d.Get("deployment").(string), err)
87+
if err := handleClientError(err); err != nil {
88+
return diag.FromErr(err)
9089
}
9190

9291
d.Set("uuid", rvRes.Uuid)
@@ -107,16 +106,17 @@ func resourceDeploymentVariableRead(ctx context.Context, d *schema.ResourceData,
107106
}
108107

109108
rvRes, res, err := pipeApi.GetDeploymentVariables(c.AuthContext, workspace, repoSlug, deployment)
110-
if err != nil {
111-
return diag.Errorf("error reading Deployment Variable (%s): %s", d.Id(), err)
112-
}
113109

114110
if res.StatusCode == http.StatusNotFound {
115111
log.Printf("[WARN] Deployment Variable (%s) not found, removing from state", d.Id())
116112
d.SetId("")
117113
return nil
118114
}
119115

116+
if err := handleClientError(err); err != nil {
117+
return diag.FromErr(err)
118+
}
119+
120120
if rvRes.Size < 1 {
121121
log.Printf("[WARN] Deployment Variable (%s) not found, removing from state", d.Id())
122122
d.SetId("")
@@ -163,9 +163,8 @@ func resourceDeploymentVariableUpdate(ctx context.Context, d *schema.ResourceDat
163163
}
164164

165165
_, _, err = pipeApi.UpdateDeploymentVariable(c.AuthContext, *rvcr, workspace, repoSlug, deployment, d.Get("uuid").(string))
166-
167-
if err != nil {
168-
return diag.Errorf("error updating Deployment Variable (%s): %s", d.Get("deployment").(string), err)
166+
if err := handleClientError(err); err != nil {
167+
return diag.FromErr(err)
169168
}
170169

171170
return resourceDeploymentVariableRead(ctx, d, m)
@@ -182,8 +181,8 @@ func resourceDeploymentVariableDelete(ctx context.Context, d *schema.ResourceDat
182181
}
183182

184183
_, err = pipeApi.DeleteDeploymentVariable(c.AuthContext, workspace, repoSlug, deployment, d.Get("uuid").(string))
185-
if err != nil {
186-
return diag.Errorf("error deleting Deployment Variable (%s): %s", d.Id(), err)
184+
if err := handleClientError(err); err != nil {
185+
return diag.FromErr(err)
187186
}
188187

189188
return nil

0 commit comments

Comments
 (0)