terraform/builtin/providers/aws/data_source_aws_elasticache...

237 lines
5.5 KiB
Go

package aws
import (
"fmt"
"log"
"strings"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/elasticache"
"github.com/hashicorp/terraform/helper/schema"
)
func dataSourceAwsElastiCacheCluster() *schema.Resource {
return &schema.Resource{
Read: dataSourceAwsElastiCacheClusterRead,
Schema: map[string]*schema.Schema{
"cluster_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
StateFunc: func(v interface{}) string {
value := v.(string)
return strings.ToLower(value)
},
},
"node_type": {
Type: schema.TypeString,
Computed: true,
},
"num_cache_nodes": {
Type: schema.TypeInt,
Computed: true,
},
"subnet_group_name": {
Type: schema.TypeString,
Computed: true,
},
"engine": {
Type: schema.TypeString,
Computed: true,
},
"engine_version": {
Type: schema.TypeString,
Computed: true,
},
"parameter_group_name": {
Type: schema.TypeString,
Computed: true,
},
"replication_group_id": {
Type: schema.TypeString,
Computed: true,
},
"security_group_names": {
Type: schema.TypeSet,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
Set: schema.HashString,
},
"security_group_ids": {
Type: schema.TypeSet,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
Set: schema.HashString,
},
"maintenance_window": {
Type: schema.TypeString,
Computed: true,
},
"snapshot_window": {
Type: schema.TypeString,
Computed: true,
},
"snapshot_retention_limit": {
Type: schema.TypeInt,
Computed: true,
},
"availability_zone": {
Type: schema.TypeString,
Computed: true,
},
"notification_topic_arn": {
Type: schema.TypeString,
Computed: true,
},
"port": {
Type: schema.TypeInt,
Computed: true,
},
"configuration_endpoint": {
Type: schema.TypeString,
Computed: true,
},
"cluster_address": {
Type: schema.TypeString,
Computed: true,
},
"arn": {
Type: schema.TypeString,
Computed: true,
},
"cache_nodes": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeString,
Computed: true,
},
"address": {
Type: schema.TypeString,
Computed: true,
},
"port": {
Type: schema.TypeInt,
Computed: true,
},
"availability_zone": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"tags": tagsSchemaComputed(),
},
}
}
func dataSourceAwsElastiCacheClusterRead(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*AWSClient).elasticacheconn
req := &elasticache.DescribeCacheClustersInput{
CacheClusterId: aws.String(d.Get("cluster_id").(string)),
ShowCacheNodeInfo: aws.Bool(true),
}
resp, err := conn.DescribeCacheClusters(req)
if err != nil {
return err
}
if len(resp.CacheClusters) < 1 {
return fmt.Errorf("Your query returned no results. Please change your search criteria and try again.")
}
if len(resp.CacheClusters) > 1 {
return fmt.Errorf("Your query returned more than one result. Please try a more specific search criteria.")
}
cluster := resp.CacheClusters[0]
d.SetId(*cluster.CacheClusterId)
d.Set("cluster_id", cluster.CacheClusterId)
d.Set("node_type", cluster.CacheNodeType)
d.Set("num_cache_nodes", cluster.NumCacheNodes)
d.Set("subnet_group_name", cluster.CacheSubnetGroupName)
d.Set("engine", cluster.Engine)
d.Set("engine_version", cluster.EngineVersion)
d.Set("security_group_names", flattenElastiCacheSecurityGroupNames(cluster.CacheSecurityGroups))
d.Set("security_group_ids", flattenElastiCacheSecurityGroupIds(cluster.SecurityGroups))
if cluster.CacheParameterGroup != nil {
d.Set("parameter_group_name", cluster.CacheParameterGroup.CacheParameterGroupName)
}
if cluster.ReplicationGroupId != nil {
d.Set("replication_group_id", cluster.ReplicationGroupId)
}
d.Set("maintenance_window", cluster.PreferredMaintenanceWindow)
d.Set("snapshot_window", cluster.SnapshotWindow)
d.Set("snapshot_retention_limit", cluster.SnapshotRetentionLimit)
d.Set("availability_zone", cluster.PreferredAvailabilityZone)
if cluster.NotificationConfiguration != nil {
if *cluster.NotificationConfiguration.TopicStatus == "active" {
d.Set("notification_topic_arn", cluster.NotificationConfiguration.TopicArn)
}
}
if cluster.ConfigurationEndpoint != nil {
d.Set("port", cluster.ConfigurationEndpoint.Port)
d.Set("configuration_endpoint", aws.String(fmt.Sprintf("%s:%d", *cluster.ConfigurationEndpoint.Address, *cluster.ConfigurationEndpoint.Port)))
d.Set("cluster_address", aws.String(fmt.Sprintf("%s", *cluster.ConfigurationEndpoint.Address)))
}
if err := setCacheNodeData(d, cluster); err != nil {
return err
}
arn, err := buildECARN(d.Id(), meta.(*AWSClient).partition, meta.(*AWSClient).accountid, meta.(*AWSClient).region)
if err != nil {
log.Printf("[DEBUG] Error building ARN for ElastiCache Cluster %s", *cluster.CacheClusterId)
}
d.Set("arn", arn)
tagResp, err := conn.ListTagsForResource(&elasticache.ListTagsForResourceInput{
ResourceName: aws.String(arn),
})
if err != nil {
log.Printf("[DEBUG] Error retrieving tags for ARN: %s", arn)
}
var et []*elasticache.Tag
if len(tagResp.TagList) > 0 {
et = tagResp.TagList
}
d.Set("tags", tagsToMapEC(et))
return nil
}