Skip to content

Commit

Permalink
Merge pull request #23770 from roberth-k/f-aws_keyspaces_keyspace
Browse files Browse the repository at this point in the history
New Resource: aws_keyspaces_keyspace
  • Loading branch information
ewbankkit authored Mar 21, 2022
2 parents 8f64286 + 3fdb23e commit 5acbfc0
Show file tree
Hide file tree
Showing 12 changed files with 684 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .changelog/23770.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:new-resource
aws_keyspaces_keyspace
```
1 change: 1 addition & 0 deletions internal/generate/tags/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -1001,6 +1001,7 @@ func init() {
awsServiceNames["ivs"] = "IVS"
awsServiceNames["kafka"] = "Kafka"
awsServiceNames["kendra"] = "Kendra"
awsServiceNames["keyspaces"] = "Keyspaces"
awsServiceNames["kinesis"] = "Kinesis"
awsServiceNames["kinesisanalytics"] = "KinesisAnalytics"
awsServiceNames["kinesisanalyticsv2"] = "KinesisAnalyticsV2"
Expand Down
3 changes: 3 additions & 0 deletions internal/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ import (
"github.com/hashicorp/terraform-provider-aws/internal/service/iot"
"github.com/hashicorp/terraform-provider-aws/internal/service/kafka"
"github.com/hashicorp/terraform-provider-aws/internal/service/kafkaconnect"
"github.com/hashicorp/terraform-provider-aws/internal/service/keyspaces"
"github.com/hashicorp/terraform-provider-aws/internal/service/kinesis"
"github.com/hashicorp/terraform-provider-aws/internal/service/kinesisanalytics"
"github.com/hashicorp/terraform-provider-aws/internal/service/kinesisanalyticsv2"
Expand Down Expand Up @@ -1509,6 +1510,8 @@ func Provider() *schema.Provider {
"aws_mskconnect_custom_plugin": kafkaconnect.ResourceCustomPlugin(),
"aws_mskconnect_worker_configuration": kafkaconnect.ResourceWorkerConfiguration(),

"aws_keyspaces_keyspace": keyspaces.ResourceKeyspace(),

"aws_kinesis_stream": kinesis.ResourceStream(),
"aws_kinesis_stream_consumer": kinesis.ResourceStreamConsumer(),

Expand Down
36 changes: 36 additions & 0 deletions internal/service/keyspaces/find.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package keyspaces

import (
"context"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/keyspaces"
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
)

func FindKeyspaceByName(ctx context.Context, conn *keyspaces.Keyspaces, name string) (*keyspaces.GetKeyspaceOutput, error) {
input := keyspaces.GetKeyspaceInput{
KeyspaceName: aws.String(name),
}

output, err := conn.GetKeyspaceWithContext(ctx, &input)

if tfawserr.ErrCodeEquals(err, keyspaces.ErrCodeResourceNotFoundException) {
return nil, &resource.NotFoundError{
LastError: err,
LastRequest: input,
}
}

if err != nil {
return nil, err
}

if output == nil {
return nil, tfresource.NewEmptyResultError(input)
}

return output, nil
}
4 changes: 4 additions & 0 deletions internal/service/keyspaces/generate.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
//go:generate go run ../../generate/tags/main.go -ListTags -ServiceTagsSlice -UpdateTags -UntagInTagsElem=Tags -UntagInNeedTagType
// ONLY generate directives and package declaration! Do not add anything else to this file.

package keyspaces
162 changes: 162 additions & 0 deletions internal/service/keyspaces/keyspace.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
package keyspaces

import (
"context"
"log"
"regexp"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/keyspaces"
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
"github.com/hashicorp/terraform-provider-aws/internal/conns"
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
"github.com/hashicorp/terraform-provider-aws/internal/verify"
)

func ResourceKeyspace() *schema.Resource {
return &schema.Resource{
CreateWithoutTimeout: resourceKeyspaceCreate,
ReadWithoutTimeout: resourceKeyspaceRead,
UpdateWithoutTimeout: resourceKeyspaceUpdate,
DeleteWithoutTimeout: resourceKeyspaceDelete,

Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},

CustomizeDiff: verify.SetTagsDiff,

Schema: map[string]*schema.Schema{
"arn": {
Type: schema.TypeString,
Computed: true,
},
"name": {
Type: schema.TypeString,
ForceNew: true,
Required: true,
ValidateFunc: validation.All(
validation.StringLenBetween(1, 48),
validation.StringMatch(
regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9_]{1,47}$`),
"The name must consist of alphanumerics and underscores.",
),
),
},
"tags": tftags.TagsSchema(),
"tags_all": tftags.TagsSchemaComputed(),
},
}
}

func resourceKeyspaceCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).KeyspacesConn
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
tags := defaultTagsConfig.MergeTags(tftags.New(d.Get("tags").(map[string]interface{})))
name := d.Get("name").(string)

input := &keyspaces.CreateKeyspaceInput{
KeyspaceName: aws.String(name),
}

if tags := Tags(tags.IgnoreAWS()); len(tags) > 0 {
// The Keyspaces API requires that when Tags is set, it's non-empty.
input.Tags = tags
}

log.Printf("[DEBUG] Creating Keyspaces Keyspace: %s", input)
_, err := conn.CreateKeyspaceWithContext(ctx, input)

if err != nil {
return diag.Errorf("error creating Keyspaces Keyspace (%s): %s", name, err)
}

if err := waitKeyspaceExists(ctx, conn, name); err != nil {
return diag.Errorf("error waiting for Keyspaces Keyspace (%s) to exist: %s", name, err)
}

d.SetId(name)

return resourceKeyspaceRead(ctx, d, meta)
}

func resourceKeyspaceRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).KeyspacesConn
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig

keyspace, err := FindKeyspaceByName(ctx, conn, d.Id())

if !d.IsNewResource() && tfresource.NotFound(err) {
log.Printf("[WARN] Keyspaces Keyspace (%s) not found, removing from state", d.Id())
d.SetId("")
return nil
}

if err != nil {
return diag.Errorf("error reading Keyspaces Keyspace (%s): %s", d.Id(), err)
}

d.Set("arn", keyspace.ResourceArn)
d.Set("name", keyspace.KeyspaceName)

tags, err := ListTags(conn, d.Get("arn").(string))

if err != nil {
return diag.Errorf("error listing tags for Keyspaces Keyspace (%s): %s", d.Id(), err)
}

tags = tags.IgnoreAWS().IgnoreConfig(ignoreTagsConfig)

//lintignore:AWSR002
if err := d.Set("tags", tags.RemoveDefaultConfig(defaultTagsConfig).Map()); err != nil {
return diag.Errorf("error setting tags for Keyspaces Keyspace (%s): %s", d.Id(), err)
}

if err := d.Set("tags_all", tags.Map()); err != nil {
return diag.Errorf("error setting tags_all for Keyspaces Keyspace (%s): %s", d.Id(), err)
}

return nil
}

func resourceKeyspaceUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).KeyspacesConn

if d.HasChange("tags_all") {
o, n := d.GetChange("tags_all")

if err := UpdateTags(conn, d.Get("arn").(string), o, n); err != nil {
return diag.Errorf("error updating Keyspaces Keyspace (%s) tags: %s", d.Id(), err)
}
}

return resourceKeyspaceRead(ctx, d, meta)
}

func resourceKeyspaceDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).KeyspacesConn

log.Printf("[DEBUG] Deleting Keyspaces Keyspace: (%s)", d.Id())
_, err := conn.DeleteKeyspaceWithContext(ctx, &keyspaces.DeleteKeyspaceInput{
KeyspaceName: aws.String(d.Id()),
})

if tfawserr.ErrCodeEquals(err, keyspaces.ErrCodeResourceNotFoundException) {
return nil
}

if err != nil {
return diag.Errorf("error deleting Keyspaces Keyspace (%s): %s", d.Id(), err)
}

if err := waitKeyspaceDisappears(ctx, conn, d.Id()); err != nil {
return diag.Errorf("error waiting for Keyspaces Keyspace (%s) to disappear: %s", d.Id(), err)
}

return nil
}
Loading

0 comments on commit 5acbfc0

Please sign in to comment.