github.com/i0n/terraform@v0.4.3-0.20150506151324-010a39a58ec1/builtin/providers/aws/resource_aws_iam_user_policy.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"net/url"
     6  	"strings"
     7  
     8  	"github.com/awslabs/aws-sdk-go/aws"
     9  	"github.com/awslabs/aws-sdk-go/service/iam"
    10  
    11  	"github.com/hashicorp/terraform/helper/schema"
    12  )
    13  
    14  func resourceAwsIamUserPolicy() *schema.Resource {
    15  	return &schema.Resource{
    16  		// PutUserPolicy API is idempotent, so these can be the same.
    17  		Create: resourceAwsIamUserPolicyPut,
    18  		Update: resourceAwsIamUserPolicyPut,
    19  
    20  		Read:   resourceAwsIamUserPolicyRead,
    21  		Delete: resourceAwsIamUserPolicyDelete,
    22  
    23  		Schema: map[string]*schema.Schema{
    24  			"policy": &schema.Schema{
    25  				Type:     schema.TypeString,
    26  				Required: true,
    27  			},
    28  			"name": &schema.Schema{
    29  				Type:     schema.TypeString,
    30  				Required: true,
    31  				ForceNew: true,
    32  			},
    33  			"user": &schema.Schema{
    34  				Type:     schema.TypeString,
    35  				Required: true,
    36  				ForceNew: true,
    37  			},
    38  		},
    39  	}
    40  }
    41  
    42  func resourceAwsIamUserPolicyPut(d *schema.ResourceData, meta interface{}) error {
    43  	iamconn := meta.(*AWSClient).iamconn
    44  
    45  	request := &iam.PutUserPolicyInput{
    46  		UserName:       aws.String(d.Get("user").(string)),
    47  		PolicyName:     aws.String(d.Get("name").(string)),
    48  		PolicyDocument: aws.String(d.Get("policy").(string)),
    49  	}
    50  
    51  	if _, err := iamconn.PutUserPolicy(request); err != nil {
    52  		return fmt.Errorf("Error putting IAM user policy %s: %s", *request.PolicyName, err)
    53  	}
    54  
    55  	d.SetId(fmt.Sprintf("%s:%s", *request.UserName, *request.PolicyName))
    56  	return nil
    57  }
    58  
    59  func resourceAwsIamUserPolicyRead(d *schema.ResourceData, meta interface{}) error {
    60  	iamconn := meta.(*AWSClient).iamconn
    61  
    62  	user, name := resourceAwsIamUserPolicyParseId(d.Id())
    63  
    64  	request := &iam.GetUserPolicyInput{
    65  		PolicyName: aws.String(name),
    66  		UserName:   aws.String(user),
    67  	}
    68  
    69  	getResp, err := iamconn.GetUserPolicy(request)
    70  	if err != nil {
    71  		if iamerr, ok := err.(aws.APIError); ok && iamerr.Code == "NoSuchEntity" { // XXX test me
    72  			d.SetId("")
    73  			return nil
    74  		}
    75  		return fmt.Errorf("Error reading IAM policy %s from user %s: %s", name, user, err)
    76  	}
    77  
    78  	if getResp.PolicyDocument == nil {
    79  		return fmt.Errorf("GetUserPolicy returned a nil policy document")
    80  	}
    81  
    82  	policy, err := url.QueryUnescape(*getResp.PolicyDocument)
    83  	if err != nil {
    84  		return err
    85  	}
    86  	return d.Set("policy", policy)
    87  }
    88  
    89  func resourceAwsIamUserPolicyDelete(d *schema.ResourceData, meta interface{}) error {
    90  	iamconn := meta.(*AWSClient).iamconn
    91  
    92  	user, name := resourceAwsIamUserPolicyParseId(d.Id())
    93  
    94  	request := &iam.DeleteUserPolicyInput{
    95  		PolicyName: aws.String(name),
    96  		UserName:   aws.String(user),
    97  	}
    98  
    99  	if _, err := iamconn.DeleteUserPolicy(request); err != nil {
   100  		return fmt.Errorf("Error deleting IAM user policy %s: %s", d.Id(), err)
   101  	}
   102  	return nil
   103  }
   104  
   105  func resourceAwsIamUserPolicyParseId(id string) (userName, policyName string) {
   106  	parts := strings.SplitN(id, ":", 2)
   107  	userName = parts[0]
   108  	policyName = parts[1]
   109  	return
   110  }