Skip to content

Commit e3d5787

Browse files
committed
resource/gitlab_group_hook: New Resource
Closes: #680
1 parent 00a121b commit e3d5787

File tree

6 files changed

+551
-0
lines changed

6 files changed

+551
-0
lines changed

docs/resources/group_hook.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "gitlab_group_hook Resource - terraform-provider-gitlab"
4+
subcategory: ""
5+
description: |-
6+
The gitlab_group_hook resource allows to manage the lifecycle of a group hook.
7+
Upstream API: GitLab REST API docs https://docs.gitlab.com/ee/api/groups.html#hooks
8+
---
9+
10+
# gitlab_group_hook (Resource)
11+
12+
The `gitlab_group_hook` resource allows to manage the lifecycle of a group hook.
13+
14+
**Upstream API**: [GitLab REST API docs](https://docs.gitlab.com/ee/api/groups.html#hooks)
15+
16+
## Example Usage
17+
18+
```terraform
19+
resource "gitlab_group_hook" "example" {
20+
group = "example/hooked"
21+
url = "https://example.com/hook/example"
22+
merge_requests_events = true
23+
}
24+
25+
# Setting all attributes
26+
resource "gitlab_group_hook" "all_attributes" {
27+
group = 1
28+
url = "http://example.com"
29+
token = "supersecret"
30+
enable_ssl_verification = false
31+
push_events = true
32+
push_events_branch_filter = "devel"
33+
issues_events = false
34+
confidential_issues_events = false
35+
merge_requests_events = true
36+
tag_push_events = true
37+
note_events = true
38+
confidential_note_events = true
39+
job_events = true
40+
pipeline_events = true
41+
wiki_page_events = true
42+
deployment_events = true
43+
releases_events = true
44+
subgroup_events = true
45+
}
46+
```
47+
48+
<!-- schema generated by tfplugindocs -->
49+
## Schema
50+
51+
### Required
52+
53+
- `group` (String) The ID or full path of the group.
54+
- `url` (String) The url of the hook to invoke.
55+
56+
### Optional
57+
58+
- `confidential_issues_events` (Boolean) Invoke the hook for confidential issues events.
59+
- `confidential_note_events` (Boolean) Invoke the hook for confidential notes events.
60+
- `deployment_events` (Boolean) Invoke the hook for deployment events.
61+
- `enable_ssl_verification` (Boolean) Enable ssl verification when invoking the hook.
62+
- `issues_events` (Boolean) Invoke the hook for issues events.
63+
- `job_events` (Boolean) Invoke the hook for job events.
64+
- `merge_requests_events` (Boolean) Invoke the hook for merge requests.
65+
- `note_events` (Boolean) Invoke the hook for notes events.
66+
- `pipeline_events` (Boolean) Invoke the hook for pipeline events.
67+
- `push_events` (Boolean) Invoke the hook for push events.
68+
- `push_events_branch_filter` (String) Invoke the hook for push events on matching branches only.
69+
- `releases_events` (Boolean) Invoke the hook for releases events.
70+
- `subgroup_events` (Boolean) Invoke the hook for subgroup events.
71+
- `tag_push_events` (Boolean) Invoke the hook for tag push events.
72+
- `token` (String, Sensitive) A token to present when invoking the hook. The token is not available for imported resources.
73+
- `wiki_page_events` (Boolean) Invoke the hook for wiki page events.
74+
75+
### Read-Only
76+
77+
- `group_id` (Number) The id of the group for the hook.
78+
- `hook_id` (Number) The id of the group hook.
79+
- `id` (String) The ID of this resource.
80+
81+
## Import
82+
83+
Import is supported using the following syntax:
84+
85+
```shell
86+
# A GitLab Group Hook can be imported using a key composed of `<group-id>:<hook-id>`, e.g.
87+
terraform import gitlab_group_hook.example "12345:1"
88+
89+
# NOTE: the `token` resource attribute is not available for imported resources as this information cannot be read from the GitLab API.
90+
```
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# A GitLab Group Hook can be imported using a key composed of `<group-id>:<hook-id>`, e.g.
2+
terraform import gitlab_group_hook.example "12345:1"
3+
4+
# NOTE: the `token` resource attribute is not available for imported resources as this information cannot be read from the GitLab API.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
resource "gitlab_group_hook" "example" {
2+
group = "example/hooked"
3+
url = "https://example.com/hook/example"
4+
merge_requests_events = true
5+
}
6+
7+
# Setting all attributes
8+
resource "gitlab_group_hook" "all_attributes" {
9+
group = 1
10+
url = "http://example.com"
11+
token = "supersecret"
12+
enable_ssl_verification = false
13+
push_events = true
14+
push_events_branch_filter = "devel"
15+
issues_events = false
16+
confidential_issues_events = false
17+
merge_requests_events = true
18+
tag_push_events = true
19+
note_events = true
20+
confidential_note_events = true
21+
job_events = true
22+
pipeline_events = true
23+
wiki_page_events = true
24+
deployment_events = true
25+
releases_events = true
26+
subgroup_events = true
27+
}
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package provider
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"strconv"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
11+
gitlab "github.com/xanzy/go-gitlab"
12+
)
13+
14+
var _ = registerResource("gitlab_group_hook", func() *schema.Resource {
15+
return &schema.Resource{
16+
Description: `The ` + "`" + `gitlab_group_hook` + "`" + ` resource allows to manage the lifecycle of a group hook.
17+
18+
**Upstream API**: [GitLab REST API docs](https://docs.gitlab.com/ee/api/groups.html#hooks)`,
19+
20+
CreateContext: resourceGitlabGroupHookCreate,
21+
ReadContext: resourceGitlabGroupHookRead,
22+
UpdateContext: resourceGitlabGroupHookUpdate,
23+
DeleteContext: resourceGitlabGroupHookDelete,
24+
Importer: &schema.ResourceImporter{
25+
StateContext: schema.ImportStatePassthroughContext,
26+
},
27+
Schema: gitlabGroupHookSchema(),
28+
}
29+
})
30+
31+
func resourceGitlabGroupHookCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
32+
client := meta.(*gitlab.Client)
33+
group := d.Get("group").(string)
34+
options := &gitlab.AddGroupHookOptions{
35+
URL: gitlab.String(d.Get("url").(string)),
36+
PushEvents: gitlab.Bool(d.Get("push_events").(bool)),
37+
PushEventsBranchFilter: gitlab.String(d.Get("push_events_branch_filter").(string)),
38+
IssuesEvents: gitlab.Bool(d.Get("issues_events").(bool)),
39+
ConfidentialIssuesEvents: gitlab.Bool(d.Get("confidential_issues_events").(bool)),
40+
MergeRequestsEvents: gitlab.Bool(d.Get("merge_requests_events").(bool)),
41+
TagPushEvents: gitlab.Bool(d.Get("tag_push_events").(bool)),
42+
NoteEvents: gitlab.Bool(d.Get("note_events").(bool)),
43+
ConfidentialNoteEvents: gitlab.Bool(d.Get("confidential_note_events").(bool)),
44+
JobEvents: gitlab.Bool(d.Get("job_events").(bool)),
45+
PipelineEvents: gitlab.Bool(d.Get("pipeline_events").(bool)),
46+
WikiPageEvents: gitlab.Bool(d.Get("wiki_page_events").(bool)),
47+
DeploymentEvents: gitlab.Bool(d.Get("deployment_events").(bool)),
48+
ReleasesEvents: gitlab.Bool(d.Get("releases_events").(bool)),
49+
SubGroupEvents: gitlab.Bool(d.Get("subgroup_events").(bool)),
50+
EnableSSLVerification: gitlab.Bool(d.Get("enable_ssl_verification").(bool)),
51+
}
52+
53+
if v, ok := d.GetOk("token"); ok {
54+
options.Token = gitlab.String(v.(string))
55+
}
56+
57+
log.Printf("[DEBUG] create gitlab group hook %q", *options.URL)
58+
59+
hook, _, err := client.Groups.AddGroupHook(group, options, gitlab.WithContext(ctx))
60+
if err != nil {
61+
return diag.FromErr(err)
62+
}
63+
64+
d.SetId(resourceGitlabGroupHookBuildID(group, hook.ID))
65+
d.Set("token", options.Token)
66+
67+
return resourceGitlabGroupHookRead(ctx, d, meta)
68+
}
69+
70+
func resourceGitlabGroupHookRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
71+
group, hookID, err := resourceGitlabGroupHookParseID(d.Id())
72+
if err != nil {
73+
return diag.FromErr(err)
74+
}
75+
log.Printf("[DEBUG] read gitlab group hook %s/%d", group, hookID)
76+
77+
client := meta.(*gitlab.Client)
78+
hook, _, err := client.Groups.GetGroupHook(group, hookID, gitlab.WithContext(ctx))
79+
if err != nil {
80+
if is404(err) {
81+
log.Printf("[DEBUG] gitlab group hook not found %s/%d, removing from state", group, hookID)
82+
d.SetId("")
83+
return nil
84+
}
85+
return diag.FromErr(err)
86+
}
87+
88+
stateMap := gitlabGroupHookToStateMap(group, hook)
89+
if err = setStateMapInResourceData(stateMap, d); err != nil {
90+
return diag.FromErr(err)
91+
}
92+
return nil
93+
}
94+
95+
func resourceGitlabGroupHookUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
96+
group, hookID, err := resourceGitlabGroupHookParseID(d.Id())
97+
if err != nil {
98+
return diag.FromErr(err)
99+
}
100+
101+
client := meta.(*gitlab.Client)
102+
options := &gitlab.EditGroupHookOptions{
103+
URL: gitlab.String(d.Get("url").(string)),
104+
PushEvents: gitlab.Bool(d.Get("push_events").(bool)),
105+
PushEventsBranchFilter: gitlab.String(d.Get("push_events_branch_filter").(string)),
106+
IssuesEvents: gitlab.Bool(d.Get("issues_events").(bool)),
107+
ConfidentialIssuesEvents: gitlab.Bool(d.Get("confidential_issues_events").(bool)),
108+
MergeRequestsEvents: gitlab.Bool(d.Get("merge_requests_events").(bool)),
109+
TagPushEvents: gitlab.Bool(d.Get("tag_push_events").(bool)),
110+
NoteEvents: gitlab.Bool(d.Get("note_events").(bool)),
111+
ConfidentialNoteEvents: gitlab.Bool(d.Get("confidential_note_events").(bool)),
112+
JobEvents: gitlab.Bool(d.Get("job_events").(bool)),
113+
PipelineEvents: gitlab.Bool(d.Get("pipeline_events").(bool)),
114+
WikiPageEvents: gitlab.Bool(d.Get("wiki_page_events").(bool)),
115+
DeploymentEvents: gitlab.Bool(d.Get("deployment_events").(bool)),
116+
ReleasesEvents: gitlab.Bool(d.Get("releases_events").(bool)),
117+
SubGroupEvents: gitlab.Bool(d.Get("subgroup_events").(bool)),
118+
EnableSSLVerification: gitlab.Bool(d.Get("enable_ssl_verification").(bool)),
119+
}
120+
121+
if d.HasChange("token") {
122+
options.Token = gitlab.String(d.Get("token").(string))
123+
}
124+
125+
log.Printf("[DEBUG] update gitlab group hook %s", d.Id())
126+
127+
_, _, err = client.Groups.EditGroupHook(group, hookID, options, gitlab.WithContext(ctx))
128+
if err != nil {
129+
return diag.FromErr(err)
130+
}
131+
132+
return resourceGitlabGroupHookRead(ctx, d, meta)
133+
}
134+
135+
func resourceGitlabGroupHookDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
136+
group, hookID, err := resourceGitlabGroupHookParseID(d.Id())
137+
if err != nil {
138+
return diag.FromErr(err)
139+
}
140+
log.Printf("[DEBUG] Delete gitlab group hook %s/%d", group, hookID)
141+
142+
client := meta.(*gitlab.Client)
143+
_, err = client.Groups.DeleteGroupHook(group, hookID, gitlab.WithContext(ctx))
144+
if err != nil {
145+
return diag.FromErr(err)
146+
}
147+
148+
return nil
149+
}
150+
151+
func resourceGitlabGroupHookBuildID(group string, agentID int) string {
152+
return fmt.Sprintf("%s:%d", group, agentID)
153+
}
154+
155+
func resourceGitlabGroupHookParseID(id string) (string, int, error) {
156+
groupID, rawHookID, err := parseTwoPartID(id)
157+
if err != nil {
158+
return "", 0, err
159+
}
160+
161+
hookID, err := strconv.Atoi(rawHookID)
162+
if err != nil {
163+
return "", 0, err
164+
}
165+
166+
return groupID, hookID, nil
167+
}

0 commit comments

Comments
 (0)