Skip to content

Commit ffe4afe

Browse files
committed
r/aws_msk_serverless_cluster: Skeleton.
1 parent 83cea95 commit ffe4afe

File tree

2 files changed

+190
-0
lines changed

2 files changed

+190
-0
lines changed

internal/provider/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -1620,6 +1620,7 @@ func New(_ context.Context) (*schema.Provider, error) {
16201620
"aws_msk_cluster": kafka.ResourceCluster(),
16211621
"aws_msk_configuration": kafka.ResourceConfiguration(),
16221622
"aws_msk_scram_secret_association": kafka.ResourceScramSecretAssociation(),
1623+
"aws_msk_serverless_cluster": kafka.ResourceServerlessCluster(),
16231624

16241625
"aws_mskconnect_connector": kafkaconnect.ResourceConnector(),
16251626
"aws_mskconnect_custom_plugin": kafkaconnect.ResourceCustomPlugin(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
package kafka
2+
3+
import (
4+
"context"
5+
"log"
6+
"time"
7+
8+
"github.com/aws/aws-sdk-go/aws"
9+
"github.com/aws/aws-sdk-go/service/kafka"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
13+
"github.com/hashicorp/terraform-provider-aws/internal/conns"
14+
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
15+
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
16+
"github.com/hashicorp/terraform-provider-aws/internal/verify"
17+
)
18+
19+
func ResourceServerlessCluster() *schema.Resource {
20+
return &schema.Resource{
21+
CreateWithoutTimeout: resourceServerlessClusterCreate,
22+
ReadWithoutTimeout: resourceServerlessClusterRead,
23+
UpdateWithoutTimeout: resourceServerlessClusterUpdate,
24+
DeleteWithoutTimeout: resourceClusterDelete,
25+
26+
Importer: &schema.ResourceImporter{
27+
State: schema.ImportStatePassthrough,
28+
},
29+
30+
Timeouts: &schema.ResourceTimeout{
31+
Create: schema.DefaultTimeout(10 * time.Minute),
32+
Update: schema.DefaultTimeout(10 * time.Minute),
33+
Delete: schema.DefaultTimeout(10 * time.Minute),
34+
},
35+
36+
CustomizeDiff: verify.SetTagsDiff,
37+
38+
Schema: map[string]*schema.Schema{
39+
"arn": {
40+
Type: schema.TypeString,
41+
Computed: true,
42+
},
43+
"client_authentication": {
44+
Type: schema.TypeList,
45+
Required: true,
46+
ForceNew: true,
47+
MaxItems: 1,
48+
Elem: &schema.Resource{
49+
Schema: map[string]*schema.Schema{
50+
"sasl": {
51+
Type: schema.TypeList,
52+
Required: true,
53+
ForceNew: true,
54+
MaxItems: 1,
55+
Elem: &schema.Resource{
56+
Schema: map[string]*schema.Schema{
57+
"iam": {
58+
Type: schema.TypeList,
59+
Required: true,
60+
ForceNew: true,
61+
MaxItems: 1,
62+
Elem: &schema.Resource{
63+
Schema: map[string]*schema.Schema{
64+
"enabled": {
65+
Type: schema.TypeBool,
66+
Required: true,
67+
ForceNew: true,
68+
},
69+
},
70+
},
71+
},
72+
},
73+
},
74+
},
75+
},
76+
},
77+
},
78+
"cluster_name": {
79+
Type: schema.TypeString,
80+
Required: true,
81+
ForceNew: true,
82+
ValidateFunc: validation.StringLenBetween(1, 64),
83+
},
84+
"tags": tftags.TagsSchema(),
85+
"tags_all": tftags.TagsSchemaComputed(),
86+
"vpc_config": {
87+
Type: schema.TypeList,
88+
Required: true,
89+
ForceNew: true,
90+
Elem: &schema.Resource{
91+
Schema: map[string]*schema.Schema{
92+
"security_group_ids": {
93+
Type: schema.TypeSet,
94+
Required: true,
95+
ForceNew: true,
96+
Elem: &schema.Schema{
97+
Type: schema.TypeString,
98+
},
99+
},
100+
"subnet_ids": {
101+
Type: schema.TypeSet,
102+
Required: true,
103+
ForceNew: true,
104+
Elem: &schema.Schema{
105+
Type: schema.TypeString,
106+
},
107+
},
108+
},
109+
},
110+
},
111+
},
112+
}
113+
}
114+
115+
func resourceServerlessClusterCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
116+
conn := meta.(*conns.AWSClient).KafkaConn
117+
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
118+
tags := defaultTagsConfig.MergeTags(tftags.New(d.Get("tags").(map[string]interface{})))
119+
120+
name := d.Get("cluster_name").(string)
121+
input := &kafka.CreateClusterV2Input{
122+
ClusterName: aws.String(name),
123+
Tags: Tags(tags.IgnoreAWS()),
124+
}
125+
126+
output, err := conn.CreateClusterV2WithContext(ctx, input)
127+
128+
if err != nil {
129+
return diag.Errorf("creating MSK Serverless Cluster (%s): %s", name, err)
130+
}
131+
132+
d.SetId(aws.StringValue(output.ClusterArn))
133+
134+
_, err = waitClusterCreated(ctx, conn, d.Id(), d.Timeout(schema.TimeoutCreate))
135+
136+
if err != nil {
137+
return diag.Errorf("waiting for MSK Serverless Cluster (%s) create: %s", d.Id(), err)
138+
}
139+
140+
return resourceServerlessClusterRead(ctx, d, meta)
141+
}
142+
143+
func resourceServerlessClusterRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
144+
conn := meta.(*conns.AWSClient).KafkaConn
145+
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
146+
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig
147+
148+
cluster, err := FindServerlessClusterByARN(ctx, conn, d.Id())
149+
150+
if !d.IsNewResource() && tfresource.NotFound(err) {
151+
log.Printf("[WARN] MSK Serverless Cluster (%s) not found, removing from state", d.Id())
152+
d.SetId("")
153+
return nil
154+
}
155+
156+
if err != nil {
157+
return diag.Errorf("reading MSK Serverless Cluster (%s): %s", d.Id(), err)
158+
}
159+
160+
d.Set("arn", cluster.ClusterArn)
161+
d.Set("cluster_name", cluster.ClusterName)
162+
163+
tags := KeyValueTags(cluster.Tags).IgnoreAWS().IgnoreConfig(ignoreTagsConfig)
164+
165+
//lintignore:AWSR002
166+
if err := d.Set("tags", tags.RemoveDefaultConfig(defaultTagsConfig).Map()); err != nil {
167+
return diag.Errorf("setting tags: %s", err)
168+
}
169+
170+
if err := d.Set("tags_all", tags.Map()); err != nil {
171+
return diag.Errorf("setting tags_all: %s", err)
172+
}
173+
174+
return nil
175+
}
176+
177+
func resourceServerlessClusterUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
178+
conn := meta.(*conns.AWSClient).KafkaConn
179+
180+
if d.HasChange("tags_all") {
181+
o, n := d.GetChange("tags_all")
182+
183+
if err := UpdateTagsWithContext(ctx, conn, d.Id(), o, n); err != nil {
184+
return diag.Errorf("updating MSK Serverless Cluster (%s) tags: %s", d.Id(), err)
185+
}
186+
}
187+
188+
return resourceServerlessClusterRead(ctx, d, meta)
189+
}

0 commit comments

Comments
 (0)