Skip to content

Commit 3536aed

Browse files
committed
Add AWS QuickSight Group Membership
Cribbed from prior art implementation here: hashicorp/terraform-provider-aws#11160
1 parent d3543d7 commit 3536aed

File tree

2 files changed

+178
-0
lines changed

2 files changed

+178
-0
lines changed

aws/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ func Provider() terraform.ResourceProvider {
172172
"aws_iam_role_policy": resourceAwsIamRolePolicy(),
173173
"aws_iam_role_policy_attachment": resourceAwsIamRolePolicyAttachment(),
174174
"aws_quicksight_data_source": resourceAwsQuickSightDataSource(),
175+
"aws_quicksight_group_membership": resourceAwsQuickSightGroupMembership(),
175176
"aws_internet_gateway_detach": resourceAwsInternetGatewayDetach(),
176177
"aws_internet_gateway_delete": resourceAwsInternetGatewayDelete(),
177178
},
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
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

Comments
 (0)