Skip to content

Commit 29e37ad

Browse files
committed
Add expiration date for gitlab_project_membership
1 parent f701a6b commit 29e37ad

File tree

4 files changed

+25
-2
lines changed

4 files changed

+25
-2
lines changed

docs/resources/project_membership.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ resource "gitlab_project_membership" "example" {
2929
project_id = "67890"
3030
user_id = 1234
3131
access_level = "guest"
32+
expires_at = "2022-12-31"
3233
}
3334
```
3435

@@ -41,6 +42,10 @@ resource "gitlab_project_membership" "example" {
4142
- `project_id` (String) The id of the project.
4243
- `user_id` (Number) The id of the user.
4344

45+
### Optional
46+
47+
- `expires_at` (String) Expiration date for the project membership. Format: `YYYY-MM-DD`
48+
4449
### Read-Only
4550

4651
- `id` (String) The ID of this resource.

examples/resources/gitlab_project_membership/resource.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ resource "gitlab_project_membership" "example" {
88
project_id = "67890"
99
user_id = 1234
1010
access_level = "guest"
11+
expires_at = "2022-12-31"
1112
}

internal/provider/resource_gitlab_project_membership.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ var _ = registerResource("gitlab_project_membership", func() *schema.Resource {
4848
ValidateDiagFunc: validation.ToDiagFunc(validation.StringInSlice(validProjectAccessLevelNames, false)),
4949
Required: true,
5050
},
51+
"expires_at": {
52+
Description: "Expiration date for the project membership. Format: `YYYY-MM-DD`",
53+
Type: schema.TypeString,
54+
ValidateFunc: validateDateFunc,
55+
Optional: true,
56+
},
5157
},
5258
}
5359
})
@@ -57,11 +63,13 @@ func resourceGitlabProjectMembershipCreate(ctx context.Context, d *schema.Resour
5763

5864
userId := d.Get("user_id").(int)
5965
projectId := d.Get("project_id").(string)
66+
expiresAt := d.Get("expires_at").(string)
6067
accessLevelId := accessLevelNameToValue[d.Get("access_level").(string)]
6168

6269
options := &gitlab.AddProjectMemberOptions{
6370
UserID: &userId,
6471
AccessLevel: &accessLevelId,
72+
ExpiresAt: &expiresAt,
6573
}
6674
log.Printf("[DEBUG] create gitlab project membership for %d in %s", options.UserID, projectId)
6775

@@ -115,10 +123,12 @@ func resourceGitlabProjectMembershipUpdate(ctx context.Context, d *schema.Resour
115123

116124
userId := d.Get("user_id").(int)
117125
projectId := d.Get("project_id").(string)
126+
expiresAt := d.Get("expires_at").(string)
118127
accessLevelId := accessLevelNameToValue[strings.ToLower(d.Get("access_level").(string))]
119128

120129
options := gitlab.EditProjectMemberOptions{
121130
AccessLevel: &accessLevelId,
131+
ExpiresAt: &expiresAt,
122132
}
123133
log.Printf("[DEBUG] update gitlab project membership %v for %s", userId, projectId)
124134

@@ -153,7 +163,11 @@ func resourceGitlabProjectMembershipSetToState(d *schema.ResourceData, projectMe
153163
d.Set("project_id", projectId)
154164
d.Set("user_id", projectMember.ID)
155165
d.Set("access_level", accessLevelValueToName[projectMember.AccessLevel])
156-
166+
if projectMember.ExpiresAt != nil {
167+
d.Set("expires_at", projectMember.ExpiresAt.String())
168+
} else {
169+
d.Set("expires_at", "")
170+
}
157171
userId := strconv.Itoa(projectMember.ID)
158172
d.SetId(buildTwoPartID(projectId, &userId))
159173
}

internal/provider/resource_gitlab_project_membership_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ func TestAccGitlabProjectMembership_basic(t *testing.T) {
3535
{
3636
Config: testAccGitlabProjectMembershipUpdateConfig(rInt),
3737
Check: resource.ComposeTestCheckFunc(testAccCheckGitlabProjectMembershipExists("gitlab_project_membership.foo", &membership), testAccCheckGitlabProjectMembershipAttributes(&membership, &testAccGitlabProjectMembershipExpectedAttributes{
38-
access_level: fmt.Sprintf("guest"), // nolint // TODO: Resolve this golangci-lint issue: S1039: unnecessary use of fmt.Sprintf (gosimple)
38+
access_level: "guest",
39+
expiresAt: "2099-01-01",
3940
})),
4041
},
4142

@@ -80,6 +81,7 @@ func testAccCheckGitlabProjectMembershipExists(n string, membership *gitlab.Proj
8081

8182
type testAccGitlabProjectMembershipExpectedAttributes struct {
8283
access_level string
84+
expiresAt string
8385
}
8486

8587
func testAccCheckGitlabProjectMembershipAttributes(membership *gitlab.ProjectMember, want *testAccGitlabProjectMembershipExpectedAttributes) resource.TestCheckFunc {
@@ -151,6 +153,7 @@ func testAccGitlabProjectMembershipUpdateConfig(rInt int) string {
151153
resource "gitlab_project_membership" "foo" {
152154
project_id = "${gitlab_project.foo.id}"
153155
user_id = "${gitlab_user.test.id}"
156+
expires_at = "2099-01-01"
154157
access_level = "guest"
155158
}
156159

0 commit comments

Comments
 (0)