1
+ package aws
2
+
3
+ import (
4
+ "fmt"
5
+ "log"
6
+ "strings"
7
+
8
+ "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
9
+ "github.com/hashicorp/terraform-plugin-sdk/helper/validation"
10
+
11
+ "github.com/aws/aws-sdk-go/aws"
12
+ "github.com/aws/aws-sdk-go/service/quicksight"
13
+ )
14
+
15
+ func resourceAwsQuickSightGroupMembership () * schema.Resource {
16
+ return & schema.Resource {
17
+ Create : resourceAwsQuickSightGroupMembershipCreate ,
18
+ Read : resourceAwsQuickSightGroupMembershipRead ,
19
+ Delete : resourceAwsQuickSightGroupMembershipDelete ,
20
+
21
+ Importer : & schema.ResourceImporter {
22
+ State : schema .ImportStatePassthrough ,
23
+ },
24
+
25
+ Schema : map [string ]* schema.Schema {
26
+ "arn" : {
27
+ Type : schema .TypeString ,
28
+ Computed : true ,
29
+ },
30
+
31
+ "aws_account_id" : {
32
+ Type : schema .TypeString ,
33
+ Optional : true ,
34
+ Computed : true ,
35
+ ForceNew : true ,
36
+ },
37
+
38
+ "member_name" : {
39
+ Type : schema .TypeString ,
40
+ Required : true ,
41
+ ForceNew : true ,
42
+ },
43
+
44
+ "group_name" : {
45
+ Type : schema .TypeString ,
46
+ Required : true ,
47
+ //Optional: true,
48
+ ForceNew : true ,
49
+ },
50
+
51
+ "namespace" : {
52
+ Type : schema .TypeString ,
53
+ Optional : true ,
54
+ ForceNew : true ,
55
+ Default : "default" ,
56
+ ValidateFunc : validation .StringInSlice ([]string {
57
+ "default" ,
58
+ }, false ),
59
+ },
60
+ },
61
+ }
62
+ }
63
+
64
+ func resourceAwsQuickSightGroupMembershipCreate (d * schema.ResourceData , meta interface {}) error {
65
+ conn := meta .(* AWSClient ).quicksightconn
66
+
67
+ awsAccountID := meta .(* AWSClient ).accountid
68
+ namespace := d .Get ("namespace" ).(string )
69
+ groupName := d .Get ("group_name" ).(string )
70
+
71
+ if v , ok := d .GetOk ("aws_account_id" ); ok {
72
+ awsAccountID = v .(string )
73
+ }
74
+
75
+ createOpts := & quicksight.CreateGroupMembershipInput {
76
+ AwsAccountId : aws .String (awsAccountID ),
77
+ GroupName : aws .String (groupName ),
78
+ MemberName : aws .String (d .Get ("member_name" ).(string )),
79
+ Namespace : aws .String (namespace ),
80
+ }
81
+
82
+ resp , err := conn .CreateGroupMembership (createOpts )
83
+ if err != nil {
84
+ return fmt .Errorf ("Error adding QuickSight user to group: %s" , err )
85
+ }
86
+
87
+ d .SetId (fmt .Sprintf ("%s/%s/%s/%s" , awsAccountID , namespace , groupName , aws .StringValue (resp .GroupMember .MemberName )))
88
+
89
+ return resourceAwsQuickSightGroupMembershipRead (d , meta )
90
+ }
91
+
92
+ func resourceAwsQuickSightGroupMembershipRead (d * schema.ResourceData , meta interface {}) error {
93
+ conn := meta .(* AWSClient ).quicksightconn
94
+
95
+ awsAccountID , namespace , groupName , userName , err := resourceAwsQuickSightGroupMembershipParseID (d .Id ())
96
+ if err != nil {
97
+ return err
98
+ }
99
+
100
+ listOpts := & quicksight.ListUserGroupsInput {
101
+ AwsAccountId : aws .String (awsAccountID ),
102
+ Namespace : aws .String (namespace ),
103
+ UserName : aws .String (userName ),
104
+ }
105
+
106
+ found := false
107
+
108
+ for {
109
+ resp , err := conn .ListUserGroups (listOpts )
110
+ if isAWSErr (err , quicksight .ErrCodeResourceNotFoundException , "" ) {
111
+ log .Printf ("[WARN] QuickSight User %s is not found" , d .Id ())
112
+ d .SetId ("" )
113
+ return nil
114
+ }
115
+ if err != nil {
116
+ return fmt .Errorf ("Error listing QuickSight User groups (%s): %s" , d .Id (), err )
117
+ }
118
+
119
+ for _ , group := range resp .GroupList {
120
+ if * group .GroupName == groupName {
121
+ found = true
122
+ break
123
+ }
124
+ }
125
+
126
+ if found || resp .NextToken == nil {
127
+ break
128
+ }
129
+
130
+ listOpts .NextToken = resp .NextToken
131
+ }
132
+
133
+ if found {
134
+ d .Set ("aws_account_id" , awsAccountID )
135
+ d .Set ("namespace" , namespace )
136
+ d .Set ("member_name" , userName )
137
+ d .Set ("group_name" , groupName )
138
+ } else {
139
+ log .Printf ("[WARN] QuickSight User-group membership %s is not found" , d .Id ())
140
+ d .SetId ("" )
141
+ }
142
+
143
+ return nil
144
+ }
145
+
146
+ func resourceAwsQuickSightGroupMembershipDelete (d * schema.ResourceData , meta interface {}) error {
147
+ conn := meta .(* AWSClient ).quicksightconn
148
+
149
+ awsAccountID , namespace , groupName , userName , err := resourceAwsQuickSightGroupMembershipParseID (d .Id ())
150
+ if err != nil {
151
+ return err
152
+ }
153
+
154
+ deleteOpts := & quicksight.DeleteGroupMembershipInput {
155
+ AwsAccountId : aws .String (awsAccountID ),
156
+ Namespace : aws .String (namespace ),
157
+ MemberName : aws .String (userName ),
158
+ GroupName : aws .String (groupName ),
159
+ }
160
+
161
+ if _ , err := conn .DeleteGroupMembership (deleteOpts ); err != nil {
162
+ if isAWSErr (err , quicksight .ErrCodeResourceNotFoundException , "" ) {
163
+ return nil
164
+ }
165
+ return fmt .Errorf ("Error deleting QuickSight User-group membership %s: %s" , d .Id (), err )
166
+ }
167
+
168
+ return nil
169
+ }
170
+
171
+ func resourceAwsQuickSightGroupMembershipParseID (id string ) (string , string , string , string , error ) {
172
+ parts := strings .SplitN (id , "/" , 4 )
173
+ if len (parts ) < 4 || parts [0 ] == "" || parts [1 ] == "" || parts [2 ] == "" || parts [3 ] == "" {
174
+ return "" , "" , "" , "" , fmt .Errorf ("unexpected format of ID (%s), expected AWS_ACCOUNT_ID/NAMESPACE/GROUP_NAME/USER_NAME" , id )
175
+ }
176
+ return parts [0 ], parts [1 ], parts [2 ], parts [3 ], nil
177
+ }
0 commit comments