github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/aws/data_source_aws_sns.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "regexp" 6 "time" 7 8 "github.com/aws/aws-sdk-go/service/sns" 9 "github.com/hashicorp/errwrap" 10 "github.com/hashicorp/terraform/helper/schema" 11 ) 12 13 func dataSourceAwsSnsTopic() *schema.Resource { 14 return &schema.Resource{ 15 Read: dataSourceAwsSnsTopicsRead, 16 Schema: map[string]*schema.Schema{ 17 "name": { 18 Type: schema.TypeString, 19 Required: true, 20 ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { 21 value := v.(string) 22 validNamePattern := "^[A-Za-z0-9_-]+$" 23 validName, nameMatchErr := regexp.MatchString(validNamePattern, value) 24 if !validName || nameMatchErr != nil { 25 errors = append(errors, fmt.Errorf( 26 "%q must match regex '%v'", k, validNamePattern)) 27 } 28 return 29 }, 30 }, 31 "arn": { 32 Type: schema.TypeString, 33 Computed: true, 34 }, 35 }, 36 } 37 } 38 39 func dataSourceAwsSnsTopicsRead(d *schema.ResourceData, meta interface{}) error { 40 conn := meta.(*AWSClient).snsconn 41 params := &sns.ListTopicsInput{} 42 43 target := d.Get("name") 44 var arns []string 45 err := conn.ListTopicsPages(params, func(page *sns.ListTopicsOutput, lastPage bool) bool { 46 for _, topic := range page.Topics { 47 topicPattern := fmt.Sprintf(".*:%v$", target) 48 matched, regexpErr := regexp.MatchString(topicPattern, *topic.TopicArn) 49 if matched && regexpErr == nil { 50 arns = append(arns, *topic.TopicArn) 51 } 52 } 53 54 return true 55 }) 56 if err != nil { 57 return errwrap.Wrapf("Error describing topics: {{err}}", err) 58 } 59 60 if len(arns) == 0 { 61 return fmt.Errorf("No topic with name %q found in this region.", target) 62 } 63 if len(arns) > 1 { 64 return fmt.Errorf("Multiple topics with name %q found in this region.", target) 65 } 66 67 d.SetId(time.Now().UTC().String()) 68 d.Set("arn", arns[0]) 69 70 return nil 71 }