Skip to content

Commit b1151a9

Browse files
committed
Initial project membership resource
1 parent e29efed commit b1151a9

File tree

2 files changed

+152
-6
lines changed

2 files changed

+152
-6
lines changed

gitlab/provider.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,13 @@ func Provider() terraform.ResourceProvider {
4141
},
4242
},
4343
ResourcesMap: map[string]*schema.Resource{
44-
"gitlab_group": resourceGitlabGroup(),
45-
"gitlab_project": resourceGitlabProject(),
46-
"gitlab_label": resourceGitlabLabel(),
47-
"gitlab_project_hook": resourceGitlabProjectHook(),
48-
"gitlab_deploy_key": resourceGitlabDeployKey(),
49-
"gitlab_user": resourceGitlabUser(),
44+
"gitlab_group": resourceGitlabGroup(),
45+
"gitlab_project": resourceGitlabProject(),
46+
"gitlab_label": resourceGitlabLabel(),
47+
"gitlab_project_hook": resourceGitlabProjectHook(),
48+
"gitlab_deploy_key": resourceGitlabDeployKey(),
49+
"gitlab_user": resourceGitlabUser(),
50+
"gitlab_project_membership": resourceGitlabProjectMembership(),
5051
},
5152

5253
ConfigureFunc: providerConfigure,
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
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 resourceGitlabProjectMembership() *schema.Resource {
13+
return &schema.Resource{
14+
Create: resourceGitlabProjectMembershipCreate,
15+
Read: resourceGitlabProjectMembershipRead,
16+
Update: resourceGitlabProjectMembershipUpdate,
17+
Delete: resourceGitlabProjectMembershipDelete,
18+
Importer: &schema.ResourceImporter{
19+
State: schema.ImportStatePassthrough,
20+
},
21+
22+
Schema: map[string]*schema.Schema{
23+
"project_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+
var accessLevelID = map[string]gitlab.AccessLevelValue{
48+
"guest": gitlab.GuestPermissions,
49+
"reporter": gitlab.ReporterPermissions,
50+
"developer": gitlab.DeveloperPermissions,
51+
"master": gitlab.MasterPermissions,
52+
"owner": gitlab.OwnerPermission,
53+
}
54+
55+
func resourceGitlabProjectMembershipCreate(d *schema.ResourceData, meta interface{}) error {
56+
client := meta.(*gitlab.Client)
57+
58+
project_id := d.Get("project_id").(string)
59+
access_level := strings.ToLower(d.Get("access_level").(string))
60+
access_level_id, ok := accessLevelID[access_level]
61+
if !ok {
62+
return fmt.Errorf("Invalid access level '%s'", access_level)
63+
}
64+
user_id := d.Get("user_id").(int)
65+
options := &gitlab.AddProjectMemberOptions{
66+
UserID: &user_id,
67+
AccessLevel: &access_level_id,
68+
}
69+
log.Printf("[DEBUG] create gitlab project membership for %d in %s", options.UserID, project_id)
70+
71+
membership, _, err := client.ProjectMembers.AddProjectMember(project_id, options)
72+
if err != nil {
73+
return err
74+
}
75+
d.SetId(fmt.Sprintf("%d", membership.ID))
76+
77+
return resourceGitlabProjectMembershipRead(d, meta)
78+
}
79+
80+
func resourceGitlabProjectMembershipRead(d *schema.ResourceData, meta interface{}) error {
81+
client := meta.(*gitlab.Client)
82+
log.Printf("[DEBUG] read gitlab project membership %s", d.Id())
83+
84+
project_id := d.Get("project_id").(string)
85+
user_id := d.Get("user_id").(int)
86+
87+
membership, resp, err := client.ProjectMembers.GetProjectMember(project_id, user_id)
88+
if err != nil {
89+
if resp.StatusCode == 404 {
90+
log.Printf("[WARN] removing project membership %s for %s from state because it no longer exists in gitlab", d.Id(), project_id)
91+
d.SetId("")
92+
return nil
93+
}
94+
return err
95+
}
96+
97+
resourceGitlabProjectMembershipSetToState(d, membership)
98+
return nil
99+
}
100+
101+
func resourceGitlabProjectMembershipUpdate(d *schema.ResourceData, meta interface{}) error {
102+
if !d.HasChange("access_level") {
103+
return nil
104+
}
105+
106+
client := meta.(*gitlab.Client)
107+
108+
project_id := d.Get("project_id").(string)
109+
user_id := d.Get("user_id").(int)
110+
access_level := strings.ToLower(d.Get("access_level").(string))
111+
access_level_id, ok := accessLevelID[access_level]
112+
if !ok {
113+
return fmt.Errorf("Invalid access level '%s'", access_level)
114+
}
115+
options := gitlab.EditProjectMemberOptions{
116+
AccessLevel: &access_level_id,
117+
}
118+
log.Printf("[DEBUG] update gitlab project membership %s for %s", d.Id(), project_id)
119+
120+
_, _, err := client.ProjectMembers.EditProjectMember(project_id, user_id, &options)
121+
if err != nil {
122+
return err
123+
}
124+
125+
return resourceGitlabProjectMembershipRead(d, meta)
126+
}
127+
128+
func resourceGitlabProjectMembershipDelete(d *schema.ResourceData, meta interface{}) error {
129+
client := meta.(*gitlab.Client)
130+
project_id := d.Get("project_id").(string)
131+
user_id := d.Get("user_id").(int)
132+
log.Printf("[DEBUG] Delete gitlab project membership %s for %s", d.Id(), project_id)
133+
134+
_, err := client.ProjectMembers.DeleteProjectMember(project_id, user_id)
135+
return err
136+
}
137+
138+
func resourceGitlabProjectMembershipSetToState(d *schema.ResourceData, membership *gitlab.ProjectMember) {
139+
d.SetId(fmt.Sprintf("%d", membership.ID))
140+
d.Set("username", membership.Username)
141+
d.Set("email", membership.Email)
142+
d.Set("Name", membership.Name)
143+
d.Set("State", membership.State)
144+
d.Set("AccessLevel", membership.AccessLevel)
145+
}

0 commit comments

Comments
 (0)