github.com/ves/terraform@v0.8.0-beta2/builtin/providers/aws/resource_aws_api_gateway_domain_name.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"time"
     7  
     8  	"github.com/aws/aws-sdk-go/aws"
     9  	"github.com/aws/aws-sdk-go/aws/awserr"
    10  	"github.com/aws/aws-sdk-go/service/apigateway"
    11  	"github.com/hashicorp/terraform/helper/resource"
    12  	"github.com/hashicorp/terraform/helper/schema"
    13  )
    14  
    15  func resourceAwsApiGatewayDomainName() *schema.Resource {
    16  	return &schema.Resource{
    17  		Create: resourceAwsApiGatewayDomainNameCreate,
    18  		Read:   resourceAwsApiGatewayDomainNameRead,
    19  		Update: resourceAwsApiGatewayDomainNameUpdate,
    20  		Delete: resourceAwsApiGatewayDomainNameDelete,
    21  
    22  		Schema: map[string]*schema.Schema{
    23  
    24  			"certificate_body": &schema.Schema{
    25  				Type:     schema.TypeString,
    26  				Required: true,
    27  			},
    28  
    29  			"certificate_chain": &schema.Schema{
    30  				Type:     schema.TypeString,
    31  				Required: true,
    32  			},
    33  
    34  			"certificate_name": &schema.Schema{
    35  				Type:     schema.TypeString,
    36  				Required: true,
    37  			},
    38  
    39  			"certificate_private_key": &schema.Schema{
    40  				Type:     schema.TypeString,
    41  				Required: true,
    42  			},
    43  
    44  			"domain_name": &schema.Schema{
    45  				Type:     schema.TypeString,
    46  				Required: true,
    47  				ForceNew: true,
    48  			},
    49  
    50  			"cloudfront_domain_name": &schema.Schema{
    51  				Type:     schema.TypeString,
    52  				Computed: true,
    53  			},
    54  
    55  			"certificate_upload_date": &schema.Schema{
    56  				Type:     schema.TypeString,
    57  				Computed: true,
    58  			},
    59  
    60  			"cloudfront_zone_id": &schema.Schema{
    61  				Type:     schema.TypeString,
    62  				Computed: true,
    63  			},
    64  		},
    65  	}
    66  }
    67  
    68  func resourceAwsApiGatewayDomainNameCreate(d *schema.ResourceData, meta interface{}) error {
    69  	conn := meta.(*AWSClient).apigateway
    70  	log.Printf("[DEBUG] Creating API Gateway Domain Name")
    71  
    72  	domainName, err := conn.CreateDomainName(&apigateway.CreateDomainNameInput{
    73  		CertificateBody:       aws.String(d.Get("certificate_body").(string)),
    74  		CertificateChain:      aws.String(d.Get("certificate_chain").(string)),
    75  		CertificateName:       aws.String(d.Get("certificate_name").(string)),
    76  		CertificatePrivateKey: aws.String(d.Get("certificate_private_key").(string)),
    77  		DomainName:            aws.String(d.Get("domain_name").(string)),
    78  	})
    79  	if err != nil {
    80  		return fmt.Errorf("Error creating API Gateway Domain Name: %s", err)
    81  	}
    82  
    83  	d.SetId(*domainName.DomainName)
    84  	d.Set("cloudfront_domain_name", domainName.DistributionDomainName)
    85  	d.Set("cloudfront_zone_id", cloudFrontRoute53ZoneID)
    86  
    87  	return resourceAwsApiGatewayDomainNameRead(d, meta)
    88  }
    89  
    90  func resourceAwsApiGatewayDomainNameRead(d *schema.ResourceData, meta interface{}) error {
    91  	conn := meta.(*AWSClient).apigateway
    92  	log.Printf("[DEBUG] Reading API Gateway Domain Name %s", d.Id())
    93  
    94  	domainName, err := conn.GetDomainName(&apigateway.GetDomainNameInput{
    95  		DomainName: aws.String(d.Id()),
    96  	})
    97  	if err != nil {
    98  		if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NotFoundException" {
    99  			log.Printf("[WARN] API gateway domain name %s has vanished\n", d.Id())
   100  			d.SetId("")
   101  			return nil
   102  		}
   103  
   104  		return err
   105  	}
   106  
   107  	d.Set("certificate_name", domainName.CertificateName)
   108  	if err := d.Set("certificate_upload_date", domainName.CertificateUploadDate.Format(time.RFC3339)); err != nil {
   109  		log.Printf("[DEBUG] Error setting certificate_upload_date: %s", err)
   110  	}
   111  	d.Set("cloudfront_domain_name", domainName.DistributionDomainName)
   112  	d.Set("domain_name", domainName.DomainName)
   113  
   114  	return nil
   115  }
   116  
   117  func resourceAwsApiGatewayDomainNameUpdateOperations(d *schema.ResourceData) []*apigateway.PatchOperation {
   118  	operations := make([]*apigateway.PatchOperation, 0)
   119  
   120  	if d.HasChange("certificate_body") {
   121  		operations = append(operations, &apigateway.PatchOperation{
   122  			Op:    aws.String("replace"),
   123  			Path:  aws.String("/certificate_body"),
   124  			Value: aws.String(d.Get("certificate_body").(string)),
   125  		})
   126  	}
   127  
   128  	if d.HasChange("certificate_chain") {
   129  		operations = append(operations, &apigateway.PatchOperation{
   130  			Op:    aws.String("replace"),
   131  			Path:  aws.String("/certificate_chain"),
   132  			Value: aws.String(d.Get("certificate_chain").(string)),
   133  		})
   134  	}
   135  
   136  	if d.HasChange("certificate_name") {
   137  		operations = append(operations, &apigateway.PatchOperation{
   138  			Op:    aws.String("replace"),
   139  			Path:  aws.String("/certificate_name"),
   140  			Value: aws.String(d.Get("certificate_name").(string)),
   141  		})
   142  	}
   143  
   144  	if d.HasChange("certificate_private_key") {
   145  		operations = append(operations, &apigateway.PatchOperation{
   146  			Op:    aws.String("replace"),
   147  			Path:  aws.String("/certificate_private_key"),
   148  			Value: aws.String(d.Get("certificate_private_key").(string)),
   149  		})
   150  	}
   151  
   152  	return operations
   153  }
   154  
   155  func resourceAwsApiGatewayDomainNameUpdate(d *schema.ResourceData, meta interface{}) error {
   156  	conn := meta.(*AWSClient).apigateway
   157  	log.Printf("[DEBUG] Updating API Gateway Domain Name %s", d.Id())
   158  
   159  	_, err := conn.UpdateDomainName(&apigateway.UpdateDomainNameInput{
   160  		DomainName:      aws.String(d.Id()),
   161  		PatchOperations: resourceAwsApiGatewayDomainNameUpdateOperations(d),
   162  	})
   163  	if err != nil {
   164  		return err
   165  	}
   166  
   167  	return resourceAwsApiGatewayDomainNameRead(d, meta)
   168  }
   169  
   170  func resourceAwsApiGatewayDomainNameDelete(d *schema.ResourceData, meta interface{}) error {
   171  	conn := meta.(*AWSClient).apigateway
   172  	log.Printf("[DEBUG] Deleting API Gateway Domain Name: %s", d.Id())
   173  
   174  	return resource.Retry(5*time.Minute, func() *resource.RetryError {
   175  		_, err := conn.DeleteDomainName(&apigateway.DeleteDomainNameInput{
   176  			DomainName: aws.String(d.Id()),
   177  		})
   178  
   179  		if err == nil {
   180  			return nil
   181  		}
   182  
   183  		if apigatewayErr, ok := err.(awserr.Error); ok && apigatewayErr.Code() == "NotFoundException" {
   184  			return nil
   185  		}
   186  
   187  		return resource.NonRetryableError(err)
   188  	})
   189  }