113 lines
2.8 KiB
Go
113 lines
2.8 KiB
Go
|
package aws
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"regexp"
|
||
|
|
||
|
"github.com/aws/aws-sdk-go/service/ec2"
|
||
|
"github.com/hashicorp/terraform/helper/hashcode"
|
||
|
"github.com/hashicorp/terraform/helper/schema"
|
||
|
)
|
||
|
|
||
|
func dataSourceAwsAmiIds() *schema.Resource {
|
||
|
return &schema.Resource{
|
||
|
Read: dataSourceAwsAmiIdsRead,
|
||
|
|
||
|
Schema: map[string]*schema.Schema{
|
||
|
"filter": dataSourceFiltersSchema(),
|
||
|
"executable_users": {
|
||
|
Type: schema.TypeList,
|
||
|
Optional: true,
|
||
|
ForceNew: true,
|
||
|
Elem: &schema.Schema{Type: schema.TypeString},
|
||
|
},
|
||
|
"name_regex": {
|
||
|
Type: schema.TypeString,
|
||
|
Optional: true,
|
||
|
ForceNew: true,
|
||
|
ValidateFunc: validateNameRegex,
|
||
|
},
|
||
|
"owners": {
|
||
|
Type: schema.TypeList,
|
||
|
Optional: true,
|
||
|
ForceNew: true,
|
||
|
Elem: &schema.Schema{Type: schema.TypeString},
|
||
|
},
|
||
|
"tags": dataSourceTagsSchema(),
|
||
|
"ids": &schema.Schema{
|
||
|
Type: schema.TypeSet,
|
||
|
Computed: true,
|
||
|
Elem: &schema.Schema{Type: schema.TypeString},
|
||
|
Set: schema.HashString,
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func dataSourceAwsAmiIdsRead(d *schema.ResourceData, meta interface{}) error {
|
||
|
conn := meta.(*AWSClient).ec2conn
|
||
|
|
||
|
executableUsers, executableUsersOk := d.GetOk("executable_users")
|
||
|
filters, filtersOk := d.GetOk("filter")
|
||
|
nameRegex, nameRegexOk := d.GetOk("name_regex")
|
||
|
owners, ownersOk := d.GetOk("owners")
|
||
|
|
||
|
if executableUsersOk == false && filtersOk == false && nameRegexOk == false && ownersOk == false {
|
||
|
return fmt.Errorf("One of executable_users, filters, name_regex, or owners must be assigned")
|
||
|
}
|
||
|
|
||
|
params := &ec2.DescribeImagesInput{}
|
||
|
|
||
|
if executableUsersOk {
|
||
|
params.ExecutableUsers = expandStringList(executableUsers.([]interface{}))
|
||
|
}
|
||
|
if filtersOk {
|
||
|
params.Filters = buildAwsDataSourceFilters(filters.(*schema.Set))
|
||
|
}
|
||
|
if ownersOk {
|
||
|
o := expandStringList(owners.([]interface{}))
|
||
|
|
||
|
if len(o) > 0 {
|
||
|
params.Owners = o
|
||
|
}
|
||
|
}
|
||
|
|
||
|
resp, err := conn.DescribeImages(params)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
var filteredImages []*ec2.Image
|
||
|
imageIds := make([]string, 0)
|
||
|
|
||
|
if nameRegexOk {
|
||
|
r := regexp.MustCompile(nameRegex.(string))
|
||
|
for _, image := range resp.Images {
|
||
|
// Check for a very rare case where the response would include no
|
||
|
// image name. No name means nothing to attempt a match against,
|
||
|
// therefore we are skipping such image.
|
||
|
if image.Name == nil || *image.Name == "" {
|
||
|
log.Printf("[WARN] Unable to find AMI name to match against "+
|
||
|
"for image ID %q owned by %q, nothing to do.",
|
||
|
*image.ImageId, *image.OwnerId)
|
||
|
continue
|
||
|
}
|
||
|
if r.MatchString(*image.Name) {
|
||
|
filteredImages = append(filteredImages, image)
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
filteredImages = resp.Images[:]
|
||
|
}
|
||
|
|
||
|
for _, image := range filteredImages {
|
||
|
imageIds = append(imageIds, *image.ImageId)
|
||
|
}
|
||
|
|
||
|
d.SetId(fmt.Sprintf("%d", hashcode.String(params.String())))
|
||
|
d.Set("ids", imageIds)
|
||
|
|
||
|
return nil
|
||
|
}
|