Skip to content

Commit 01cc965

Browse files
support expire_at and import for group membership, refactor
1 parent ee9072e commit 01cc965

File tree

2 files changed

+123
-97
lines changed

2 files changed

+123
-97
lines changed

gitlab/resource_gitlab_group_membership.go

Lines changed: 68 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package gitlab
33
import (
44
"fmt"
55
"log"
6+
"strconv"
67
"strings"
78

89
"github.com/hashicorp/terraform/helper/schema"
@@ -34,82 +35,96 @@ func resourceGitlabGroupMembership() *schema.Resource {
3435
Type: schema.TypeString,
3536
Required: true,
3637
},
37-
// "expires_at": {
38-
// Type: schema.TypeString, // Format YYYY-MM-DD
39-
// ForceNew: true,
40-
// Required: false,
41-
// Optional: true,
42-
// },
38+
"expires_at": {
39+
Type: schema.TypeString, // Format YYYY-MM-DD
40+
Optional: true,
41+
},
4342
},
4443
}
4544
}
4645

4746
func resourceGitlabGroupMembershipCreate(d *schema.ResourceData, meta interface{}) error {
4847
client := meta.(*gitlab.Client)
4948

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]
49+
userId := d.Get("user_id").(int)
50+
groupId := d.Get("group_id").(string)
51+
expiresAt := d.Get("expires_at").(string)
52+
accessLevel := strings.ToLower(d.Get("access_level").(string))
53+
accessLevelId, ok := accessLevelID[accessLevel]
54+
5355
if !ok {
54-
return fmt.Errorf("Invalid access level '%s'", access_level)
56+
return fmt.Errorf("Invalid access level '%s'", accessLevel)
5557
}
56-
user_id := d.Get("user_id").(int)
5758
options := &gitlab.AddGroupMemberOptions{
58-
UserID: &user_id,
59-
AccessLevel: &access_level_id,
59+
UserID: &userId,
60+
AccessLevel: &accessLevelId,
61+
ExpiresAt: &expiresAt,
6062
}
61-
log.Printf("[DEBUG] create gitlab group membership for %d in %s", options.UserID, group_id)
63+
log.Printf("[DEBUG] create gitlab group groupMember for %d in %s", options.UserID, groupId)
6264

63-
membership, _, err := client.GroupMembers.AddGroupMember(group_id, options)
65+
groupMember, _, err := client.GroupMembers.AddGroupMember(groupId, options)
6466
if err != nil {
6567
return err
6668
}
67-
d.SetId(fmt.Sprintf("%d", membership.ID))
68-
69+
userIdString := strconv.Itoa(groupMember.ID)
70+
d.SetId(buildTwoPartID(&groupId, &userIdString))
6971
return resourceGitlabGroupMembershipRead(d, meta)
7072
}
7173

7274
func resourceGitlabGroupMembershipRead(d *schema.ResourceData, meta interface{}) error {
7375
client := meta.(*gitlab.Client)
74-
log.Printf("[DEBUG] read gitlab group membership %s", d.Id())
76+
id := d.Id()
77+
log.Printf("[DEBUG] read gitlab group groupMember %s", id)
7578

76-
group_id := d.Get("group_id").(string)
77-
user_id := d.Get("user_id").(int)
79+
groupId, userId, e := groupIdAndUserIdFromId(id)
80+
if e != nil {
81+
return e
82+
}
7883

79-
membership, resp, err := client.GroupMembers.GetGroupMember(group_id, user_id)
84+
groupMember, resp, err := client.GroupMembers.GetGroupMember(groupId, userId)
8085
if err != nil {
8186
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)
87+
log.Printf("[WARN] removing group groupMember %v for %s from state because it no longer exists in gitlab", userId, groupId)
8388
d.SetId("")
8489
return nil
8590
}
8691
return err
8792
}
8893

89-
resourceGitlabGroupMembershipSetToState(d, membership)
94+
resourceGitlabGroupMembershipSetToState(d, groupMember, &groupId)
9095
return nil
9196
}
9297

93-
func resourceGitlabGroupMembershipUpdate(d *schema.ResourceData, meta interface{}) error {
94-
if !d.HasChange("access_level") {
95-
return nil
98+
func groupIdAndUserIdFromId(id string) (string, int, error) {
99+
groupId, userIdString, err := parseTwoPartID(id)
100+
userId, e := strconv.Atoi(userIdString)
101+
if err != nil {
102+
e = err
103+
}
104+
if e != nil {
105+
log.Printf("[WARN] cannot get group member id from input: %v", id)
96106
}
107+
return groupId, userId, e
108+
}
97109

110+
func resourceGitlabGroupMembershipUpdate(d *schema.ResourceData, meta interface{}) error {
98111
client := meta.(*gitlab.Client)
99112

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]
113+
userId := d.Get("user_id").(int)
114+
groupId := d.Get("group_id").(string)
115+
expiresAt := d.Get("expires_at").(string)
116+
accessLevel := strings.ToLower(d.Get("access_level").(string))
117+
accessLevelId, ok := accessLevelID[accessLevel]
104118
if !ok {
105-
return fmt.Errorf("Invalid access level '%s'", access_level)
119+
return fmt.Errorf("Invalid access level '%s'", accessLevel)
106120
}
107121
options := gitlab.EditGroupMemberOptions{
108-
AccessLevel: &access_level_id,
122+
AccessLevel: &accessLevelId,
123+
ExpiresAt: &expiresAt,
109124
}
110-
log.Printf("[DEBUG] update gitlab group membership %s for %s", d.Id(), group_id)
125+
log.Printf("[DEBUG] update gitlab group membership %v for %s", userId, groupId)
111126

112-
_, _, err := client.GroupMembers.EditGroupMember(group_id, user_id, &options)
127+
_, _, err := client.GroupMembers.EditGroupMember(groupId, userId, &options)
113128
if err != nil {
114129
return err
115130
}
@@ -119,19 +134,27 @@ func resourceGitlabGroupMembershipUpdate(d *schema.ResourceData, meta interface{
119134

120135
func resourceGitlabGroupMembershipDelete(d *schema.ResourceData, meta interface{}) error {
121136
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)
125137

126-
_, err := client.GroupMembers.RemoveGroupMember(group_id, user_id)
138+
id := d.Id()
139+
groupId, userId, e := groupIdAndUserIdFromId(id)
140+
if e != nil {
141+
return e
142+
}
143+
144+
log.Printf("[DEBUG] Delete gitlab group membership %v for %s", userId, groupId)
145+
146+
_, err := client.GroupMembers.RemoveGroupMember(groupId, userId)
127147
return err
128148
}
129149

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)
150+
func resourceGitlabGroupMembershipSetToState(d *schema.ResourceData, groupMember *gitlab.GroupMember, group_id *string) {
151+
d.Set("username", groupMember.Username)
152+
d.Set("email", groupMember.Email)
153+
d.Set("Name", groupMember.Name)
154+
d.Set("State", groupMember.State)
155+
d.Set("AccessLevel", groupMember.AccessLevel)
156+
d.Set("ExpiresAt", groupMember.ExpiresAt)
157+
158+
userId := strconv.Itoa(groupMember.ID)
159+
d.SetId(buildTwoPartID(group_id, &userId))
137160
}

gitlab/resource_gitlab_group_membership_test.go

Lines changed: 55 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
)
1313

1414
func TestAccGitlabGroupMembership_basic(t *testing.T) {
15-
var membership gitlab.GroupMember
15+
var groupMember gitlab.GroupMember
1616
rInt := acctest.RandInt()
1717

1818
resource.Test(t, resource.TestCase{PreCheck: func() { testAccPreCheck(t) },
@@ -23,24 +23,25 @@ func TestAccGitlabGroupMembership_basic(t *testing.T) {
2323
// Assign member to the group as a developer
2424
{
2525
Config: testAccGitlabGroupMembershipConfig(rInt),
26-
Check: resource.ComposeTestCheckFunc(testAccCheckGitlabGroupMembershipExists("gitlab_group_membership.foo", &membership), testAccCheckGitlabGroupMembershipAttributes(&membership, &testAccGitlabGroupMembershipExpectedAttributes{
27-
access_level: fmt.Sprintf("developer"),
26+
Check: resource.ComposeTestCheckFunc(testAccCheckGitlabGroupMembershipExists("gitlab_group_membership.foo", &groupMember), testAccCheckGitlabGroupMembershipAttributes(&groupMember, &testAccGitlabGroupMembershipExpectedAttributes{
27+
accessLevel: fmt.Sprintf("developer"),
2828
})),
2929
},
3030

31-
// Update the group member to change the access level (use testAccGitlabGroupMembershipUpdateConfig for Config)
31+
//Update the group member to change the access level (use testAccGitlabGroupMembershipUpdateConfig for Config)
3232
{
3333
Config: testAccGitlabGroupMembershipUpdateConfig(rInt),
34-
Check: resource.ComposeTestCheckFunc(testAccCheckGitlabGroupMembershipExists("gitlab_group_membership.foo", &membership), testAccCheckGitlabGroupMembershipAttributes(&membership, &testAccGitlabGroupMembershipExpectedAttributes{
35-
access_level: fmt.Sprintf("guest"),
34+
Check: resource.ComposeTestCheckFunc(testAccCheckGitlabGroupMembershipExists("gitlab_group_membership.foo", &groupMember), testAccCheckGitlabGroupMembershipAttributes(&groupMember, &testAccGitlabGroupMembershipExpectedAttributes{
35+
accessLevel: fmt.Sprintf("guest"),
36+
expiresAt: fmt.Sprintf("2099-01-01"),
3637
})),
3738
},
3839

3940
// Update the group member to change the access level back
4041
{
4142
Config: testAccGitlabGroupMembershipConfig(rInt),
42-
Check: resource.ComposeTestCheckFunc(testAccCheckGitlabGroupMembershipExists("gitlab_group_membership.foo", &membership), testAccCheckGitlabGroupMembershipAttributes(&membership, &testAccGitlabGroupMembershipExpectedAttributes{
43-
access_level: fmt.Sprintf("developer"),
43+
Check: resource.ComposeTestCheckFunc(testAccCheckGitlabGroupMembershipExists("gitlab_group_membership.foo", &groupMember), testAccCheckGitlabGroupMembershipAttributes(&groupMember, &testAccGitlabGroupMembershipExpectedAttributes{
44+
accessLevel: fmt.Sprintf("developer"),
4445
})),
4546
},
4647
},
@@ -55,18 +56,18 @@ func testAccCheckGitlabGroupMembershipExists(n string, membership *gitlab.GroupM
5556
return fmt.Errorf("Not found: %s", n)
5657
}
5758

58-
groupID := rs.Primary.Attributes["group_id"]
59-
if groupID == "" {
59+
groupId := rs.Primary.Attributes["group_id"]
60+
if groupId == "" {
6061
return fmt.Errorf("No group ID is set")
6162
}
6263

63-
userID := rs.Primary.Attributes["user_id"]
64-
id, _ := strconv.Atoi(userID)
65-
if userID == "" {
66-
return fmt.Errorf("No user id is set")
64+
userIdString := rs.Primary.Attributes["user_id"]
65+
userId, _ := strconv.Atoi(userIdString)
66+
if userIdString == "" {
67+
return fmt.Errorf("No user userId is set")
6768
}
6869

69-
gotGroupMembership, _, err := conn.GroupMembers.GetGroupMember(groupID, id)
70+
gotGroupMembership, _, err := conn.GroupMembers.GetGroupMember(groupId, userId)
7071
if err != nil {
7172
return err
7273
}
@@ -77,18 +78,19 @@ func testAccCheckGitlabGroupMembershipExists(n string, membership *gitlab.GroupM
7778
}
7879

7980
type testAccGitlabGroupMembershipExpectedAttributes struct {
80-
access_level string
81+
accessLevel string
82+
expiresAt string
8183
}
8284

8385
func testAccCheckGitlabGroupMembershipAttributes(membership *gitlab.GroupMember, want *testAccGitlabGroupMembershipExpectedAttributes) resource.TestCheckFunc {
8486
return func(s *terraform.State) error {
8587

86-
access_level_id, ok := accessLevel[membership.AccessLevel]
88+
accessLevelId, ok := accessLevel[membership.AccessLevel]
8789
if !ok {
88-
return fmt.Errorf("Invalid access level '%s'", access_level_id)
90+
return fmt.Errorf("Invalid access level '%s'", accessLevelId)
8991
}
90-
if access_level_id != want.access_level {
91-
return fmt.Errorf("got access level %s; want %s", access_level_id, want.access_level)
92+
if accessLevelId != want.accessLevel {
93+
return fmt.Errorf("got access level %s; want %s", accessLevelId, want.accessLevel)
9294
}
9395
return nil
9496
}
@@ -102,14 +104,14 @@ func testAccCheckGitlabGroupMembershipDestroy(s *terraform.State) error {
102104
continue
103105
}
104106

105-
groupID := rs.Primary.Attributes["group_id"]
106-
userID := rs.Primary.Attributes["user_id"]
107+
groupId := rs.Primary.Attributes["group_id"]
108+
userIdString := rs.Primary.Attributes["user_id"]
107109

108-
// GetGroupMember needs int type for userID
109-
userIDI, err := strconv.Atoi(userID)
110-
gotMembership, resp, err := conn.GroupMembers.GetGroupMember(groupID, userIDI)
110+
// GetGroupMember needs int type for userIdString
111+
userId, err := strconv.Atoi(userIdString)
112+
groupMember, resp, err := conn.GroupMembers.GetGroupMember(groupId, userId)
111113
if err != nil {
112-
if gotMembership != nil && fmt.Sprintf("%d", gotMembership.AccessLevel) == rs.Primary.Attributes["access_level"] {
114+
if groupMember != nil && fmt.Sprintf("%d", groupMember.AccessLevel) == rs.Primary.Attributes["accessLevel"] {
113115
return fmt.Errorf("Group still has member.")
114116
}
115117
return nil
@@ -124,43 +126,44 @@ func testAccCheckGitlabGroupMembershipDestroy(s *terraform.State) error {
124126
}
125127

126128
func testAccGitlabGroupMembershipConfig(rInt int) string {
127-
return fmt.Sprintf(`resource "gitlab_group_membership" "foo" {
128-
group_id = "${gitlab_group.foo.id}"
129-
user_id = "${gitlab_user.test.id}"
130-
access_level = "developer"
131-
}
132-
129+
return fmt.Sprintf(`
133130
resource "gitlab_group" "foo" {
134-
name = "foo%d"
135-
path = "foo%d"
131+
name = "foo%d"
132+
path = "foo%d"
136133
}
137134
138135
resource "gitlab_user" "test" {
139-
name = "foo%d"
140-
username = "listest%d"
141-
password = "test%dtt"
142-
email = "listest%[email protected]"
143-
}
144-
`, rInt, rInt, rInt, rInt, rInt, rInt)
136+
name = "foo%d"
137+
username = "listest%d"
138+
password = "test%dtt"
139+
email = "listest%[email protected]"
145140
}
146141
147-
func testAccGitlabGroupMembershipUpdateConfig(rInt int) string {
148-
return fmt.Sprintf(`resource "gitlab_group_membership" "foo" {
149-
group_id = "${gitlab_group.foo.id}"
150-
user_id = "${gitlab_user.test.id}"
151-
access_level = "guest"
142+
resource "gitlab_group_membership" "foo" {
143+
group_id = "${gitlab_group.foo.id}"
144+
user_id = "${gitlab_user.test.id}"
145+
access_level = "developer"
146+
}`, rInt, rInt, rInt, rInt, rInt, rInt)
152147
}
153148

149+
func testAccGitlabGroupMembershipUpdateConfig(rInt int) string {
150+
return fmt.Sprintf(`
154151
resource "gitlab_group" "foo" {
155-
name = "foo%d"
156-
path = "foo%d"
152+
name = "foo%d"
153+
path = "foo%d"
157154
}
158155
159156
resource "gitlab_user" "test" {
160-
name = "foo%d"
161-
username = "listest%d"
162-
password = "test%dtt"
163-
email = "listest%[email protected]"
157+
name = "foo%d"
158+
username = "listest%d"
159+
password = "test%dtt"
160+
email = "listest%[email protected]"
164161
}
165-
`, rInt, rInt, rInt, rInt, rInt, rInt)
162+
163+
resource "gitlab_group_membership" "foo" {
164+
group_id = "${gitlab_group.foo.id}"
165+
user_id = "${gitlab_user.test.id}"
166+
expires_at = "2099-01-01"
167+
access_level = "guest"
168+
}`, rInt, rInt, rInt, rInt, rInt, rInt)
166169
}

0 commit comments

Comments
 (0)