Skip to content

Commit 8da110a

Browse files
Make project membership support import by two part id, refactoring
1 parent 11ac5ac commit 8da110a

File tree

2 files changed

+90
-75
lines changed

2 files changed

+90
-75
lines changed
Lines changed: 66 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
package gitlab
22

33
import (
4-
"fmt"
54
"log"
5+
"strconv"
66
"strings"
77

88
"github.com/hashicorp/terraform/helper/schema"
9-
gitlab "github.com/xanzy/go-gitlab"
9+
"github.com/xanzy/go-gitlab"
1010
)
1111

1212
func resourceGitlabProjectMembership() *schema.Resource {
13+
acceptedAccessLevels := make([]string, 0, len(accessLevelID))
14+
for k := range accessLevelID {
15+
if k != "owner" {
16+
acceptedAccessLevels = append(acceptedAccessLevels, k)
17+
}
18+
}
1319
return &schema.Resource{
1420
Create: resourceGitlabProjectMembershipCreate,
1521
Read: resourceGitlabProjectMembershipRead,
@@ -31,85 +37,85 @@ func resourceGitlabProjectMembership() *schema.Resource {
3137
Required: true,
3238
},
3339
"access_level": {
34-
Type: schema.TypeString,
35-
Required: true,
40+
Type: schema.TypeString,
41+
ValidateFunc: validateValueFunc(acceptedAccessLevels),
42+
Required: true,
3643
},
37-
// "expires_at": {
38-
// Type: schema.TypeString, // Format YYYY-MM-DD
39-
// ForceNew: true,
40-
// Required: false,
41-
// Optional: true,
42-
// },
4344
},
4445
}
4546
}
4647

4748
func resourceGitlabProjectMembershipCreate(d *schema.ResourceData, meta interface{}) error {
4849
client := meta.(*gitlab.Client)
4950

50-
project_id := d.Get("project_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)
51+
userId := d.Get("user_id").(int)
52+
projectId := d.Get("project_id").(string)
53+
accessLevelId := accessLevelID[d.Get("access_level").(string)]
54+
5755
options := &gitlab.AddProjectMemberOptions{
58-
UserID: &user_id,
59-
AccessLevel: &access_level_id,
56+
UserID: &userId,
57+
AccessLevel: &accessLevelId,
6058
}
61-
log.Printf("[DEBUG] create gitlab project membership for %d in %s", options.UserID, project_id)
59+
log.Printf("[DEBUG] create gitlab project membership for %d in %s", options.UserID, projectId)
6260

63-
membership, _, err := client.ProjectMembers.AddProjectMember(project_id, options)
61+
projectMember, _, err := client.ProjectMembers.AddProjectMember(projectId, options)
6462
if err != nil {
6563
return err
6664
}
67-
d.SetId(fmt.Sprintf("%d", membership.ID))
68-
65+
userIdString := strconv.Itoa(projectMember.ID)
66+
d.SetId(buildTwoPartID(&projectId, &userIdString))
6967
return resourceGitlabProjectMembershipRead(d, meta)
7068
}
7169

7270
func resourceGitlabProjectMembershipRead(d *schema.ResourceData, meta interface{}) error {
7371
client := meta.(*gitlab.Client)
74-
log.Printf("[DEBUG] read gitlab project membership %s", d.Id())
72+
id := d.Id()
73+
log.Printf("[DEBUG] read gitlab project projectMember %s", id)
7574

76-
project_id := d.Get("project_id").(string)
77-
user_id := d.Get("user_id").(int)
75+
projectId, userId, e := projectIdAndUserIdFromId(id)
76+
if e != nil {
77+
return e
78+
}
7879

79-
membership, resp, err := client.ProjectMembers.GetProjectMember(project_id, user_id)
80+
projectMember, resp, err := client.ProjectMembers.GetProjectMember(projectId, userId)
8081
if err != nil {
8182
if resp.StatusCode == 404 {
82-
log.Printf("[WARN] removing project membership %s for %s from state because it no longer exists in gitlab", d.Id(), project_id)
83+
log.Printf("[WARN] removing project projectMember %v for %s from state because it no longer exists in gitlab", userId, projectId)
8384
d.SetId("")
8485
return nil
8586
}
8687
return err
8788
}
8889

89-
resourceGitlabProjectMembershipSetToState(d, membership)
90+
resourceGitlabProjectMembershipSetToState(d, projectMember, &projectId)
9091
return nil
9192
}
9293

93-
func resourceGitlabProjectMembershipUpdate(d *schema.ResourceData, meta interface{}) error {
94-
if !d.HasChange("access_level") {
95-
return nil
94+
func projectIdAndUserIdFromId(id string) (string, int, error) {
95+
projectId, userIdString, err := parseTwoPartID(id)
96+
userId, e := strconv.Atoi(userIdString)
97+
if err != nil {
98+
e = err
9699
}
100+
if e != nil {
101+
log.Printf("[WARN] cannot get project member id from input: %v", id)
102+
}
103+
return projectId, userId, e
104+
}
97105

106+
func resourceGitlabProjectMembershipUpdate(d *schema.ResourceData, meta interface{}) error {
98107
client := meta.(*gitlab.Client)
99108

100-
project_id := d.Get("project_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-
}
109+
userId := d.Get("user_id").(int)
110+
projectId := d.Get("project_id").(string)
111+
accessLevelId := accessLevelID[strings.ToLower(d.Get("access_level").(string))]
112+
107113
options := gitlab.EditProjectMemberOptions{
108-
AccessLevel: &access_level_id,
114+
AccessLevel: &accessLevelId,
109115
}
110-
log.Printf("[DEBUG] update gitlab project membership %s for %s", d.Id(), project_id)
116+
log.Printf("[DEBUG] update gitlab project membership %v for %s", userId, projectId)
111117

112-
_, _, err := client.ProjectMembers.EditProjectMember(project_id, user_id, &options)
118+
_, _, err := client.ProjectMembers.EditProjectMember(projectId, userId, &options)
113119
if err != nil {
114120
return err
115121
}
@@ -119,19 +125,26 @@ func resourceGitlabProjectMembershipUpdate(d *schema.ResourceData, meta interfac
119125

120126
func resourceGitlabProjectMembershipDelete(d *schema.ResourceData, meta interface{}) error {
121127
client := meta.(*gitlab.Client)
122-
project_id := d.Get("project_id").(string)
123-
user_id := d.Get("user_id").(int)
124-
log.Printf("[DEBUG] Delete gitlab project membership %s for %s", d.Id(), project_id)
125128

126-
_, err := client.ProjectMembers.DeleteProjectMember(project_id, user_id)
129+
id := d.Id()
130+
projectId, userId, e := projectIdAndUserIdFromId(id)
131+
if e != nil {
132+
return e
133+
}
134+
135+
log.Printf("[DEBUG] Delete gitlab project membership %v for %s", userId, projectId)
136+
137+
_, err := client.ProjectMembers.DeleteProjectMember(projectId, userId)
127138
return err
128139
}
129140

130-
func resourceGitlabProjectMembershipSetToState(d *schema.ResourceData, membership *gitlab.ProjectMember) {
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)
141+
func resourceGitlabProjectMembershipSetToState(d *schema.ResourceData, projectMember *gitlab.ProjectMember, project_id *string) {
142+
d.Set("username", projectMember.Username)
143+
d.Set("email", projectMember.Email)
144+
d.Set("Name", projectMember.Name)
145+
d.Set("State", projectMember.State)
146+
d.Set("AccessLevel", projectMember.AccessLevel)
147+
148+
userId := strconv.Itoa(projectMember.ID)
149+
d.SetId(buildTwoPartID(project_id, &userId))
137150
}

gitlab/resource_gitlab_project_membership_test.go

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -132,45 +132,47 @@ func testAccCheckGitlabProjectMembershipDestroy(s *terraform.State) error {
132132
}
133133

134134
func testAccGitlabProjectMembershipConfig(rInt int) string {
135-
return fmt.Sprintf(`resource "gitlab_project_membership" "foo" {
136-
project_id = "${gitlab_project.foo.id}"
137-
user_id = "${gitlab_user.test.id}"
138-
access_level = "developer"
135+
return fmt.Sprintf(`
136+
resource "gitlab_project_membership" "foo" {
137+
project_id = "${gitlab_project.foo.id}"
138+
user_id = "${gitlab_user.test.id}"
139+
access_level = "developer"
139140
}
140141
141142
resource "gitlab_project" "foo" {
142-
name = "foo%d"
143-
description = "Terraform acceptance tests"
144-
visibility_level ="public"
143+
name = "foo%d"
144+
description = "Terraform acceptance tests"
145+
visibility_level ="public"
145146
}
146147
147148
resource "gitlab_user" "test" {
148-
name = "foo%d"
149-
username = "listest%d"
150-
password = "test%dtt"
151-
email = "listest%[email protected]"
149+
name = "foo%d"
150+
username = "listest%d"
151+
password = "test%dtt"
152+
email = "listest%[email protected]"
152153
}
153154
`, rInt, rInt, rInt, rInt, rInt)
154155
}
155156

156157
func testAccGitlabProjectMembershipUpdateConfig(rInt int) string {
157-
return fmt.Sprintf(`resource "gitlab_project_membership" "foo" {
158-
project_id = "${gitlab_project.foo.id}"
159-
user_id = "${gitlab_user.test.id}"
160-
access_level = "guest"
158+
return fmt.Sprintf(`
159+
resource "gitlab_project_membership" "foo" {
160+
project_id = "${gitlab_project.foo.id}"
161+
user_id = "${gitlab_user.test.id}"
162+
access_level = "guest"
161163
}
162164
163165
resource "gitlab_project" "foo" {
164-
name = "foo%d"
165-
description = "Terraform acceptance tests"
166-
visibility_level ="public"
166+
name = "foo%d"
167+
description = "Terraform acceptance tests"
168+
visibility_level ="public"
167169
}
168170
169171
resource "gitlab_user" "test" {
170-
name = "foo%d"
171-
username = "listest%d"
172-
password = "test%dtt"
173-
email = "listest%[email protected]"
172+
name = "foo%d"
173+
username = "listest%d"
174+
password = "test%dtt"
175+
email = "listest%[email protected]"
174176
}
175177
`, rInt, rInt, rInt, rInt, rInt)
176178
}

0 commit comments

Comments
 (0)