Skip to content

Commit 42c8799

Browse files
authored
Merge pull request #22836 from GlennChia/f-aws_connect_user_hierarchy_structure
r/aws_connect_user_hierarchy_structure
2 parents 9e07041 + 250b596 commit 42c8799

File tree

5 files changed

+776
-1
lines changed

5 files changed

+776
-1
lines changed

.changelog/22836.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-resource
2+
aws_connect_user_hierarchy_structure
3+
```

internal/provider/provider.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -1091,8 +1091,9 @@ func Provider() *schema.Provider {
10911091
"aws_connect_lambda_function_association": connect.ResourceLambdaFunctionAssociation(),
10921092
"aws_connect_queue": connect.ResourceQueue(),
10931093
"aws_connect_quick_connect": connect.ResourceQuickConnect(),
1094-
"aws_connect_security_profile": connect.ResourceSecurityProfile(),
10951094
"aws_connect_routing_profile": connect.ResourceRoutingProfile(),
1095+
"aws_connect_security_profile": connect.ResourceSecurityProfile(),
1096+
"aws_connect_user_hierarchy_structure": connect.ResourceUserHierarchyStructure(),
10961097

10971098
"aws_cur_report_definition": cur.ResourceReportDefinition(),
10981099

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,264 @@
1+
package connect
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
8+
"github.com/aws/aws-sdk-go/aws"
9+
"github.com/aws/aws-sdk-go/service/connect"
10+
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
13+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
14+
"github.com/hashicorp/terraform-provider-aws/internal/conns"
15+
)
16+
17+
func ResourceUserHierarchyStructure() *schema.Resource {
18+
return &schema.Resource{
19+
CreateContext: resourceUserHierarchyStructureCreate,
20+
ReadContext: resourceUserHierarchyStructureRead,
21+
UpdateContext: resourceUserHierarchyStructureUpdate,
22+
DeleteContext: resourceUserHierarchyStructureDelete,
23+
Importer: &schema.ResourceImporter{
24+
StateContext: schema.ImportStatePassthroughContext,
25+
},
26+
Schema: map[string]*schema.Schema{
27+
"hierarchy_structure": {
28+
Type: schema.TypeList,
29+
Required: true,
30+
MaxItems: 1,
31+
Elem: &schema.Resource{
32+
Schema: map[string]*schema.Schema{
33+
"level_one": func() *schema.Schema {
34+
schema := connectUserHierarchyLevelSchema()
35+
return schema
36+
}(),
37+
"level_two": func() *schema.Schema {
38+
schema := connectUserHierarchyLevelSchema()
39+
return schema
40+
}(),
41+
"level_three": func() *schema.Schema {
42+
schema := connectUserHierarchyLevelSchema()
43+
return schema
44+
}(),
45+
"level_four": func() *schema.Schema {
46+
schema := connectUserHierarchyLevelSchema()
47+
return schema
48+
}(),
49+
"level_five": func() *schema.Schema {
50+
schema := connectUserHierarchyLevelSchema()
51+
return schema
52+
}(),
53+
},
54+
},
55+
},
56+
"instance_id": {
57+
Type: schema.TypeString,
58+
Required: true,
59+
ValidateFunc: validation.StringLenBetween(1, 100),
60+
},
61+
},
62+
}
63+
}
64+
65+
// Each level shares the same schema
66+
func connectUserHierarchyLevelSchema() *schema.Schema {
67+
return &schema.Schema{
68+
Type: schema.TypeList,
69+
Optional: true,
70+
Computed: true,
71+
MaxItems: 1,
72+
Elem: &schema.Resource{
73+
Schema: map[string]*schema.Schema{
74+
"arn": {
75+
Type: schema.TypeString,
76+
Computed: true,
77+
},
78+
"id": {
79+
Type: schema.TypeString,
80+
Computed: true,
81+
},
82+
"name": {
83+
Type: schema.TypeString,
84+
Required: true,
85+
ValidateFunc: validation.StringLenBetween(1, 50),
86+
},
87+
},
88+
},
89+
}
90+
}
91+
92+
func resourceUserHierarchyStructureCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
93+
conn := meta.(*conns.AWSClient).ConnectConn
94+
95+
instanceID := d.Get("instance_id").(string)
96+
97+
input := &connect.UpdateUserHierarchyStructureInput{
98+
HierarchyStructure: expandUserHierarchyStructure(d.Get("hierarchy_structure").([]interface{})),
99+
InstanceId: aws.String(instanceID),
100+
}
101+
102+
log.Printf("[DEBUG] Creating Connect User Hierarchy Structure %s", input)
103+
_, err := conn.UpdateUserHierarchyStructureWithContext(ctx, input)
104+
105+
if err != nil {
106+
return diag.FromErr(fmt.Errorf("error creating Connect User Hierarchy Structure for Connect Instance (%s): %w", instanceID, err))
107+
}
108+
109+
d.SetId(instanceID)
110+
111+
return resourceUserHierarchyStructureRead(ctx, d, meta)
112+
}
113+
114+
func resourceUserHierarchyStructureRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
115+
conn := meta.(*conns.AWSClient).ConnectConn
116+
117+
instanceID := d.Id()
118+
119+
resp, err := conn.DescribeUserHierarchyStructureWithContext(ctx, &connect.DescribeUserHierarchyStructureInput{
120+
InstanceId: aws.String(instanceID),
121+
})
122+
123+
if !d.IsNewResource() && tfawserr.ErrCodeEquals(err, connect.ErrCodeResourceNotFoundException) {
124+
log.Printf("[WARN] Connect User Hierarchy Structure (%s) not found, removing from state", d.Id())
125+
d.SetId("")
126+
return nil
127+
}
128+
129+
if err != nil {
130+
return diag.FromErr(fmt.Errorf("error getting Connect User Hierarchy Structure (%s): %w", d.Id(), err))
131+
}
132+
133+
if resp == nil || resp.HierarchyStructure == nil {
134+
return diag.FromErr(fmt.Errorf("error getting Connect User Hierarchy Structure (%s): empty response", d.Id()))
135+
}
136+
137+
if err := d.Set("hierarchy_structure", flattenUserHierarchyStructure(resp.HierarchyStructure)); err != nil {
138+
return diag.FromErr(fmt.Errorf("error setting Connect User Hierarchy Structure hierarchy_structure for Connect instance: (%s)", d.Id()))
139+
}
140+
141+
d.Set("instance_id", instanceID)
142+
143+
return nil
144+
}
145+
146+
func resourceUserHierarchyStructureUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
147+
conn := meta.(*conns.AWSClient).ConnectConn
148+
149+
instanceID := d.Id()
150+
151+
if d.HasChange("hierarchy_structure") {
152+
_, err := conn.UpdateUserHierarchyStructureWithContext(ctx, &connect.UpdateUserHierarchyStructureInput{
153+
HierarchyStructure: expandUserHierarchyStructure(d.Get("hierarchy_structure").([]interface{})),
154+
InstanceId: aws.String(instanceID),
155+
})
156+
157+
if err != nil {
158+
return diag.FromErr(fmt.Errorf("error updating UserHierarchyStructure Name (%s): %w", d.Id(), err))
159+
}
160+
}
161+
162+
return resourceUserHierarchyStructureRead(ctx, d, meta)
163+
}
164+
165+
func resourceUserHierarchyStructureDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
166+
conn := meta.(*conns.AWSClient).ConnectConn
167+
168+
instanceID := d.Id()
169+
170+
_, err := conn.UpdateUserHierarchyStructureWithContext(ctx, &connect.UpdateUserHierarchyStructureInput{
171+
HierarchyStructure: &connect.HierarchyStructureUpdate{},
172+
InstanceId: aws.String(instanceID),
173+
})
174+
175+
if err != nil {
176+
return diag.FromErr(fmt.Errorf("error deleting UserHierarchyStructure (%s): %w", d.Id(), err))
177+
}
178+
179+
return nil
180+
}
181+
182+
func expandUserHierarchyStructure(userHierarchyStructure []interface{}) *connect.HierarchyStructureUpdate {
183+
if len(userHierarchyStructure) == 0 {
184+
return &connect.HierarchyStructureUpdate{}
185+
}
186+
187+
tfMap, ok := userHierarchyStructure[0].(map[string]interface{})
188+
189+
if !ok {
190+
return nil
191+
}
192+
193+
result := &connect.HierarchyStructureUpdate{
194+
LevelOne: expandUserHierarchyStructureLevel(tfMap["level_one"].([]interface{})),
195+
LevelTwo: expandUserHierarchyStructureLevel(tfMap["level_two"].([]interface{})),
196+
LevelThree: expandUserHierarchyStructureLevel(tfMap["level_three"].([]interface{})),
197+
LevelFour: expandUserHierarchyStructureLevel(tfMap["level_four"].([]interface{})),
198+
LevelFive: expandUserHierarchyStructureLevel(tfMap["level_five"].([]interface{})),
199+
}
200+
201+
return result
202+
}
203+
204+
func expandUserHierarchyStructureLevel(userHierarchyStructureLevel []interface{}) *connect.HierarchyLevelUpdate {
205+
if len(userHierarchyStructureLevel) == 0 {
206+
return nil
207+
}
208+
209+
tfMap, ok := userHierarchyStructureLevel[0].(map[string]interface{})
210+
211+
if !ok {
212+
return nil
213+
}
214+
215+
result := &connect.HierarchyLevelUpdate{
216+
Name: aws.String(tfMap["name"].(string)),
217+
}
218+
219+
return result
220+
}
221+
222+
func flattenUserHierarchyStructure(userHierarchyStructure *connect.HierarchyStructure) []interface{} {
223+
if userHierarchyStructure == nil {
224+
return []interface{}{}
225+
}
226+
227+
values := map[string]interface{}{}
228+
229+
if userHierarchyStructure.LevelOne != nil {
230+
values["level_one"] = flattenUserHierarchyStructureLevel(userHierarchyStructure.LevelOne)
231+
}
232+
233+
if userHierarchyStructure.LevelTwo != nil {
234+
values["level_two"] = flattenUserHierarchyStructureLevel(userHierarchyStructure.LevelTwo)
235+
}
236+
237+
if userHierarchyStructure.LevelThree != nil {
238+
values["level_three"] = flattenUserHierarchyStructureLevel(userHierarchyStructure.LevelThree)
239+
}
240+
241+
if userHierarchyStructure.LevelFour != nil {
242+
values["level_four"] = flattenUserHierarchyStructureLevel(userHierarchyStructure.LevelFour)
243+
}
244+
245+
if userHierarchyStructure.LevelFive != nil {
246+
values["level_five"] = flattenUserHierarchyStructureLevel(userHierarchyStructure.LevelFive)
247+
}
248+
249+
return []interface{}{values}
250+
}
251+
252+
func flattenUserHierarchyStructureLevel(userHierarchyStructureLevel *connect.HierarchyLevel) []interface{} {
253+
if userHierarchyStructureLevel == nil {
254+
return []interface{}{}
255+
}
256+
257+
level := map[string]interface{}{
258+
"arn": aws.StringValue(userHierarchyStructureLevel.Arn),
259+
"id": aws.StringValue(userHierarchyStructureLevel.Id),
260+
"name": aws.StringValue(userHierarchyStructureLevel.Name),
261+
}
262+
263+
return []interface{}{level}
264+
}

0 commit comments

Comments
 (0)