1
1
package gitlab
2
2
3
3
import (
4
- "fmt"
5
4
"log"
5
+ "strconv"
6
6
"strings"
7
7
8
8
"github.com/hashicorp/terraform/helper/schema"
9
- gitlab "github.com/xanzy/go-gitlab"
9
+ "github.com/xanzy/go-gitlab"
10
10
)
11
11
12
12
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
+ }
13
19
return & schema.Resource {
14
20
Create : resourceGitlabProjectMembershipCreate ,
15
21
Read : resourceGitlabProjectMembershipRead ,
@@ -31,85 +37,85 @@ func resourceGitlabProjectMembership() *schema.Resource {
31
37
Required : true ,
32
38
},
33
39
"access_level" : {
34
- Type : schema .TypeString ,
35
- Required : true ,
40
+ Type : schema .TypeString ,
41
+ ValidateFunc : validateValueFunc (acceptedAccessLevels ),
42
+ Required : true ,
36
43
},
37
- // "expires_at": {
38
- // Type: schema.TypeString, // Format YYYY-MM-DD
39
- // ForceNew: true,
40
- // Required: false,
41
- // Optional: true,
42
- // },
43
44
},
44
45
}
45
46
}
46
47
47
48
func resourceGitlabProjectMembershipCreate (d * schema.ResourceData , meta interface {}) error {
48
49
client := meta .(* gitlab.Client )
49
50
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
+
57
55
options := & gitlab.AddProjectMemberOptions {
58
- UserID : & user_id ,
59
- AccessLevel : & access_level_id ,
56
+ UserID : & userId ,
57
+ AccessLevel : & accessLevelId ,
60
58
}
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 )
62
60
63
- membership , _ , err := client .ProjectMembers .AddProjectMember (project_id , options )
61
+ projectMember , _ , err := client .ProjectMembers .AddProjectMember (projectId , options )
64
62
if err != nil {
65
63
return err
66
64
}
67
- d . SetId ( fmt . Sprintf ( "%d" , membership . ID ) )
68
-
65
+ userIdString := strconv . Itoa ( projectMember . ID )
66
+ d . SetId ( buildTwoPartID ( & projectId , & userIdString ))
69
67
return resourceGitlabProjectMembershipRead (d , meta )
70
68
}
71
69
72
70
func resourceGitlabProjectMembershipRead (d * schema.ResourceData , meta interface {}) error {
73
71
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 )
75
74
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
+ }
78
79
79
- membership , resp , err := client .ProjectMembers .GetProjectMember (project_id , user_id )
80
+ projectMember , resp , err := client .ProjectMembers .GetProjectMember (projectId , userId )
80
81
if err != nil {
81
82
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 )
83
84
d .SetId ("" )
84
85
return nil
85
86
}
86
87
return err
87
88
}
88
89
89
- resourceGitlabProjectMembershipSetToState (d , membership )
90
+ resourceGitlabProjectMembershipSetToState (d , projectMember , & projectId )
90
91
return nil
91
92
}
92
93
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
96
99
}
100
+ if e != nil {
101
+ log .Printf ("[WARN] cannot get project member id from input: %v" , id )
102
+ }
103
+ return projectId , userId , e
104
+ }
97
105
106
+ func resourceGitlabProjectMembershipUpdate (d * schema.ResourceData , meta interface {}) error {
98
107
client := meta .(* gitlab.Client )
99
108
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
+
107
113
options := gitlab.EditProjectMemberOptions {
108
- AccessLevel : & access_level_id ,
114
+ AccessLevel : & accessLevelId ,
109
115
}
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 )
111
117
112
- _ , _ , err := client .ProjectMembers .EditProjectMember (project_id , user_id , & options )
118
+ _ , _ , err := client .ProjectMembers .EditProjectMember (projectId , userId , & options )
113
119
if err != nil {
114
120
return err
115
121
}
@@ -119,19 +125,26 @@ func resourceGitlabProjectMembershipUpdate(d *schema.ResourceData, meta interfac
119
125
120
126
func resourceGitlabProjectMembershipDelete (d * schema.ResourceData , meta interface {}) error {
121
127
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 )
125
128
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 )
127
138
return err
128
139
}
129
140
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 ))
137
150
}
0 commit comments