func volumeAttachmentStateRefreshFunc(conn *ec2.EC2, volumeID, instanceID string) resource.StateRefreshFunc { return func() (interface{}, string, error) { request := &ec2.DescribeVolumesInput{ VolumeIds: []*string{aws.String(volumeID)}, Filters: []*ec2.Filter{ &ec2.Filter{ Name: aws.String("attachment.instance-id"), Values: []*string{aws.String(instanceID)}, }, }, } resp, err := conn.DescribeVolumes(request) if err != nil { if awsErr, ok := err.(awserr.Error); ok { return nil, "failed", fmt.Errorf("code: %s, message: %s", awsErr.Code(), awsErr.Message()) } return nil, "failed", err } if len(resp.Volumes) > 0 { v := resp.Volumes[0] for _, a := range v.Attachments { if a.InstanceId != nil && *a.InstanceId == instanceID { return a, *a.State, nil } } } // assume detached if volume count is 0 return 42, "detached", nil } }
func GetBackupVolumes(svc *ec2.EC2) ([]*ec2.Volume, error) { dvi := ec2.DescribeVolumesInput{} for _, tag := range tags { filter := &ec2.Filter{} filterName := "tag:" + *tag filter.Name = &filterName value := "true" filter.Values = []*string{&value} dvi.Filters = append(dvi.Filters, filter) } dvo, err := svc.DescribeVolumes(&dvi) if err != nil { return nil, fmt.Errorf("describeVolumes error, %s", err) } return dvo.Volumes, nil }
// volumeStateRefreshFunc returns a resource.StateRefreshFunc that is used to watch // a the state of a Volume. Returns successfully when volume is available func volumeStateRefreshFunc(conn *ec2.EC2, volumeID string) resource.StateRefreshFunc { return func() (interface{}, string, error) { resp, err := conn.DescribeVolumes(&ec2.DescribeVolumesInput{ VolumeIds: []*string{aws.String(volumeID)}, }) if err != nil { if ec2err, ok := err.(awserr.Error); ok { // Set this to nil as if we didn't find anything. log.Printf("Error on Volume State Refresh: message: \"%s\", code:\"%s\"", ec2err.Message(), ec2err.Code()) resp = nil return nil, "", err } else { log.Printf("Error on Volume State Refresh: %s", err) return nil, "", err } } v := resp.Volumes[0] return v, *v.State, nil } }
func readBlockDevicesFromInstance(instance *ec2.Instance, conn *ec2.EC2) (map[string]interface{}, error) { blockDevices := make(map[string]interface{}) blockDevices["ebs"] = make([]map[string]interface{}, 0) blockDevices["root"] = nil instanceBlockDevices := make(map[string]*ec2.InstanceBlockDeviceMapping) for _, bd := range instance.BlockDeviceMappings { if bd.Ebs != nil { instanceBlockDevices[*bd.Ebs.VolumeId] = bd } } if len(instanceBlockDevices) == 0 { return nil, nil } volIDs := make([]*string, 0, len(instanceBlockDevices)) for volID := range instanceBlockDevices { volIDs = append(volIDs, aws.String(volID)) } // Need to call DescribeVolumes to get volume_size and volume_type for each // EBS block device volResp, err := conn.DescribeVolumes(&ec2.DescribeVolumesInput{ VolumeIds: volIDs, }) if err != nil { return nil, err } for _, vol := range volResp.Volumes { instanceBd := instanceBlockDevices[*vol.VolumeId] bd := make(map[string]interface{}) if instanceBd.Ebs != nil && instanceBd.Ebs.DeleteOnTermination != nil { bd["delete_on_termination"] = *instanceBd.Ebs.DeleteOnTermination } if vol.Size != nil { bd["volume_size"] = *vol.Size } if vol.VolumeType != nil { bd["volume_type"] = *vol.VolumeType } if vol.Iops != nil { bd["iops"] = *vol.Iops } if blockDeviceIsRoot(instanceBd, instance) { blockDevices["root"] = bd } else { if instanceBd.DeviceName != nil { bd["device_name"] = *instanceBd.DeviceName } if vol.Encrypted != nil { bd["encrypted"] = *vol.Encrypted } if vol.SnapshotId != nil { bd["snapshot_id"] = *vol.SnapshotId } blockDevices["ebs"] = append(blockDevices["ebs"].([]map[string]interface{}), bd) } } return blockDevices, nil }