github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/aws/data_source_aws_ebs_snapshot.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/aws/aws-sdk-go/service/ec2" 8 "github.com/hashicorp/terraform/helper/schema" 9 ) 10 11 func dataSourceAwsEbsSnapshot() *schema.Resource { 12 return &schema.Resource{ 13 Read: dataSourceAwsEbsSnapshotRead, 14 15 Schema: map[string]*schema.Schema{ 16 //selection criteria 17 "filter": dataSourceFiltersSchema(), 18 "most_recent": { 19 Type: schema.TypeBool, 20 Optional: true, 21 Default: false, 22 ForceNew: true, 23 }, 24 "owners": { 25 Type: schema.TypeList, 26 Optional: true, 27 ForceNew: true, 28 Elem: &schema.Schema{Type: schema.TypeString}, 29 }, 30 "snapshot_ids": { 31 Type: schema.TypeList, 32 Optional: true, 33 ForceNew: true, 34 Elem: &schema.Schema{Type: schema.TypeString}, 35 }, 36 "restorable_by_user_ids": { 37 Type: schema.TypeList, 38 Optional: true, 39 ForceNew: true, 40 Elem: &schema.Schema{Type: schema.TypeString}, 41 }, 42 //Computed values returned 43 "snapshot_id": { 44 Type: schema.TypeString, 45 Computed: true, 46 }, 47 "volume_id": { 48 Type: schema.TypeString, 49 Computed: true, 50 }, 51 "state": { 52 Type: schema.TypeString, 53 Computed: true, 54 }, 55 "owner_id": { 56 Type: schema.TypeString, 57 Computed: true, 58 }, 59 "owner_alias": { 60 Type: schema.TypeString, 61 Computed: true, 62 }, 63 "encrypted": { 64 Type: schema.TypeBool, 65 Computed: true, 66 }, 67 "description": { 68 Type: schema.TypeString, 69 Computed: true, 70 }, 71 "volume_size": { 72 Type: schema.TypeInt, 73 Computed: true, 74 }, 75 "kms_key_id": { 76 Type: schema.TypeString, 77 Computed: true, 78 }, 79 "data_encryption_key_id": { 80 Type: schema.TypeString, 81 Computed: true, 82 }, 83 "tags": dataSourceTagsSchema(), 84 }, 85 } 86 } 87 88 func dataSourceAwsEbsSnapshotRead(d *schema.ResourceData, meta interface{}) error { 89 conn := meta.(*AWSClient).ec2conn 90 91 restorableUsers, restorableUsersOk := d.GetOk("restorable_by_user_ids") 92 filters, filtersOk := d.GetOk("filter") 93 snapshotIds, snapshotIdsOk := d.GetOk("snapshot_ids") 94 owners, ownersOk := d.GetOk("owners") 95 96 if restorableUsers == false && filtersOk == false && snapshotIds == false && ownersOk == false { 97 return fmt.Errorf("One of snapshot_ids, filters, restorable_by_user_ids, or owners must be assigned") 98 } 99 100 params := &ec2.DescribeSnapshotsInput{} 101 if restorableUsersOk { 102 params.RestorableByUserIds = expandStringList(restorableUsers.([]interface{})) 103 } 104 if filtersOk { 105 params.Filters = buildAwsDataSourceFilters(filters.(*schema.Set)) 106 } 107 if ownersOk { 108 params.OwnerIds = expandStringList(owners.([]interface{})) 109 } 110 if snapshotIdsOk { 111 params.SnapshotIds = expandStringList(snapshotIds.([]interface{})) 112 } 113 114 resp, err := conn.DescribeSnapshots(params) 115 if err != nil { 116 return err 117 } 118 119 var snapshot *ec2.Snapshot 120 if len(resp.Snapshots) < 1 { 121 return fmt.Errorf("Your query returned no results. Please change your search criteria and try again.") 122 } 123 124 if len(resp.Snapshots) > 1 { 125 recent := d.Get("most_recent").(bool) 126 log.Printf("[DEBUG] aws_ebs_snapshot - multiple results found and `most_recent` is set to: %t", recent) 127 if recent { 128 snapshot = mostRecentSnapshot(resp.Snapshots) 129 } else { 130 return fmt.Errorf("Your query returned more than one result. Please try a more specific search criteria.") 131 } 132 } else { 133 snapshot = resp.Snapshots[0] 134 } 135 136 //Single Snapshot found so set to state 137 return snapshotDescriptionAttributes(d, snapshot) 138 } 139 140 func mostRecentSnapshot(snapshots []*ec2.Snapshot) *ec2.Snapshot { 141 return sortSnapshots(snapshots)[0] 142 } 143 144 func snapshotDescriptionAttributes(d *schema.ResourceData, snapshot *ec2.Snapshot) error { 145 d.SetId(*snapshot.SnapshotId) 146 d.Set("snapshot_id", snapshot.SnapshotId) 147 d.Set("volume_id", snapshot.VolumeId) 148 d.Set("data_encryption_key_id", snapshot.DataEncryptionKeyId) 149 d.Set("description", snapshot.Description) 150 d.Set("encrypted", snapshot.Encrypted) 151 d.Set("kms_key_id", snapshot.KmsKeyId) 152 d.Set("volume_size", snapshot.VolumeSize) 153 d.Set("state", snapshot.State) 154 d.Set("owner_id", snapshot.OwnerId) 155 d.Set("owner_alias", snapshot.OwnerAlias) 156 157 if err := d.Set("tags", dataSourceTags(snapshot.Tags)); err != nil { 158 return err 159 } 160 161 return nil 162 }