Skip to content

Commit b9b5207

Browse files
Add resource_group_membership
1 parent 596e2da commit b9b5207

File tree

2 files changed

+138
-0
lines changed

2 files changed

+138
-0
lines changed

gitlab/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ func Provider() terraform.ResourceProvider {
5454
"gitlab_deploy_key": resourceGitlabDeployKey(),
5555
"gitlab_user": resourceGitlabUser(),
5656
"gitlab_project_membership": resourceGitlabProjectMembership(),
57+
"gitlab_group_membership": resourceGitlabGroupMembership(),
5758
},
5859

5960
ConfigureFunc: providerConfigure,
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package gitlab
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"strings"
7+
8+
"github.com/hashicorp/terraform/helper/schema"
9+
gitlab "github.com/xanzy/go-gitlab"
10+
)
11+
12+
func resourceGitlabGroupMembership() *schema.Resource {
13+
return &schema.Resource{
14+
Create: resourceGitlabGroupMembershipCreate,
15+
Read: resourceGitlabGroupMembershipRead,
16+
Update: resourceGitlabGroupMembershipUpdate,
17+
Delete: resourceGitlabGroupMembershipDelete,
18+
Importer: &schema.ResourceImporter{
19+
State: schema.ImportStatePassthrough,
20+
},
21+
22+
Schema: map[string]*schema.Schema{
23+
"group_id": {
24+
Type: schema.TypeString,
25+
ForceNew: true,
26+
Required: true,
27+
},
28+
"user_id": {
29+
Type: schema.TypeInt,
30+
ForceNew: true,
31+
Required: true,
32+
},
33+
"access_level": {
34+
Type: schema.TypeString,
35+
Required: true,
36+
},
37+
// "expires_at": {
38+
// Type: schema.TypeString, // Format YYYY-MM-DD
39+
// ForceNew: true,
40+
// Required: false,
41+
// Optional: true,
42+
// },
43+
},
44+
}
45+
}
46+
47+
func resourceGitlabGroupMembershipCreate(d *schema.ResourceData, meta interface{}) error {
48+
client := meta.(*gitlab.Client)
49+
50+
group_id := d.Get("group_id").(string)
51+
access_level := strings.ToLower(d.Get("access_level").(string))
52+
access_level_id, ok := accessLevelID[access_level]
53+
if !ok {
54+
return fmt.Errorf("Invalid access level '%s'", access_level)
55+
}
56+
user_id := d.Get("user_id").(int)
57+
options := &gitlab.AddGroupMemberOptions{
58+
UserID: &user_id,
59+
AccessLevel: &access_level_id,
60+
}
61+
log.Printf("[DEBUG] create gitlab group membership for %d in %s", options.UserID, group_id)
62+
63+
membership, _, err := client.GroupMembers.AddGroupMember(group_id, options)
64+
if err != nil {
65+
return err
66+
}
67+
d.SetId(fmt.Sprintf("%d", membership.ID))
68+
69+
return resourceGitlabGroupMembershipRead(d, meta)
70+
}
71+
72+
func resourceGitlabGroupMembershipRead(d *schema.ResourceData, meta interface{}) error {
73+
client := meta.(*gitlab.Client)
74+
log.Printf("[DEBUG] read gitlab group membership %s", d.Id())
75+
76+
group_id := d.Get("group_id").(string)
77+
user_id := d.Get("user_id").(int)
78+
79+
membership, resp, err := client.GroupMembers.GetGroupMember(group_id, user_id)
80+
if err != nil {
81+
if resp.StatusCode == 404 {
82+
log.Printf("[WARN] removing group membership %s for %s from state because it no longer exists in gitlab", d.Id(), group_id)
83+
d.SetId("")
84+
return nil
85+
}
86+
return err
87+
}
88+
89+
resourceGitlabGroupMembershipSetToState(d, membership)
90+
return nil
91+
}
92+
93+
func resourceGitlabGroupMembershipUpdate(d *schema.ResourceData, meta interface{}) error {
94+
if !d.HasChange("access_level") {
95+
return nil
96+
}
97+
98+
client := meta.(*gitlab.Client)
99+
100+
group_id := d.Get("group_id").(string)
101+
user_id := d.Get("user_id").(int)
102+
access_level := strings.ToLower(d.Get("access_level").(string))
103+
access_level_id, ok := accessLevelID[access_level]
104+
if !ok {
105+
return fmt.Errorf("Invalid access level '%s'", access_level)
106+
}
107+
options := gitlab.EditGroupMemberOptions{
108+
AccessLevel: &access_level_id,
109+
}
110+
log.Printf("[DEBUG] update gitlab group membership %s for %s", d.Id(), group_id)
111+
112+
_, _, err := client.GroupMembers.EditGroupMember(group_id, user_id, &options)
113+
if err != nil {
114+
return err
115+
}
116+
117+
return resourceGitlabGroupMembershipRead(d, meta)
118+
}
119+
120+
func resourceGitlabGroupMembershipDelete(d *schema.ResourceData, meta interface{}) error {
121+
client := meta.(*gitlab.Client)
122+
group_id := d.Get("group_id").(string)
123+
user_id := d.Get("user_id").(int)
124+
log.Printf("[DEBUG] Delete gitlab group membership %s for %s", d.Id(), group_id)
125+
126+
_, err := client.GroupMembers.RemoveGroupMember(group_id, user_id)
127+
return err
128+
}
129+
130+
func resourceGitlabGroupMembershipSetToState(d *schema.ResourceData, membership *gitlab.GroupMember) {
131+
d.SetId(fmt.Sprintf("%d", membership.ID))
132+
d.Set("username", membership.Username)
133+
d.Set("email", membership.Email)
134+
d.Set("Name", membership.Name)
135+
d.Set("State", membership.State)
136+
d.Set("AccessLevel", membership.AccessLevel)
137+
}

0 commit comments

Comments
 (0)