github.com/peterbale/terraform@v0.9.0-beta2.0.20170315142748-5723acd55547/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  			//According to AWS Documentation, ACM will be the only way to add certificates
    25  			//to ApiGateway DomainNames. When this happens, we will be deprecating all certificate methods
    26  			//except certificate_arn. We are not quite sure when this will happen.
    27  			"certificate_body": {
    28  				Type:          schema.TypeString,
    29  				ForceNew:      true,
    30  				Optional:      true,
    31  				ConflictsWith: []string{"certificate_arn"},
    32  			},
    33  
    34  			"certificate_chain": {
    35  				Type:          schema.TypeString,
    36  				ForceNew:      true,
    37  				Optional:      true,
    38  				ConflictsWith: []string{"certificate_arn"},
    39  			},
    40  
    41  			"certificate_name": {
    42  				Type:          schema.TypeString,
    43  				Optional:      true,
    44  				ConflictsWith: []string{"certificate_arn"},
    45  			},
    46  
    47  			"certificate_private_key": {
    48  				Type:          schema.TypeString,
    49  				ForceNew:      true,
    50  				Optional:      true,
    51  				ConflictsWith: []string{"certificate_arn"},
    52  			},
    53  
    54  			"domain_name": {
    55  				Type:     schema.TypeString,
    56  				Required: true,
    57  				ForceNew: true,
    58  			},
    59  
    60  			"certificate_arn": {
    61  				Type:          schema.TypeString,
    62  				Optional:      true,
    63  				ConflictsWith: []string{"certificate_body", "certificate_chain", "certificate_name", "certificate_private_key"},
    64  			},
    65  
    66  			"cloudfront_domain_name": {
    67  				Type:     schema.TypeString,
    68  				Computed: true,
    69  			},
    70  
    71  			"certificate_upload_date": {
    72  				Type:     schema.TypeString,
    73  				Computed: true,
    74  			},
    75  
    76  			"cloudfront_zone_id": {
    77  				Type:     schema.TypeString,
    78  				Computed: true,
    79  			},
    80  		},
    81  	}
    82  }
    83  
    84  func resourceAwsApiGatewayDomainNameCreate(d *schema.ResourceData, meta interface{}) error {
    85  	conn := meta.(*AWSClient).apigateway
    86  	log.Printf("[DEBUG] Creating API Gateway Domain Name")
    87  
    88  	params := &apigateway.CreateDomainNameInput{
    89  		DomainName: aws.String(d.Get("domain_name").(string)),
    90  	}
    91  
    92  	if v, ok := d.GetOk("certificate_arn"); ok {
    93  		params.CertificateArn = aws.String(v.(string))
    94  	}
    95  
    96  	if v, ok := d.GetOk("certificate_name"); ok {
    97  		params.CertificateName = aws.String(v.(string))
    98  	}
    99  
   100  	if v, ok := d.GetOk("certificate_body"); ok {
   101  		params.CertificateBody = aws.String(v.(string))
   102  	}
   103  
   104  	if v, ok := d.GetOk("certificate_chain"); ok {
   105  		params.CertificateChain = aws.String(v.(string))
   106  	}
   107  
   108  	if v, ok := d.GetOk("certificate_private_key"); ok {
   109  		params.CertificatePrivateKey = aws.String(v.(string))
   110  	}
   111  
   112  	domainName, err := conn.CreateDomainName(params)
   113  	if err != nil {
   114  		return fmt.Errorf("Error creating API Gateway Domain Name: %s", err)
   115  	}
   116  
   117  	d.SetId(*domainName.DomainName)
   118  	d.Set("cloudfront_domain_name", domainName.DistributionDomainName)
   119  	d.Set("cloudfront_zone_id", cloudFrontRoute53ZoneID)
   120  
   121  	return resourceAwsApiGatewayDomainNameRead(d, meta)
   122  }
   123  
   124  func resourceAwsApiGatewayDomainNameRead(d *schema.ResourceData, meta interface{}) error {
   125  	conn := meta.(*AWSClient).apigateway
   126  	log.Printf("[DEBUG] Reading API Gateway Domain Name %s", d.Id())
   127  
   128  	domainName, err := conn.GetDomainName(&apigateway.GetDomainNameInput{
   129  		DomainName: aws.String(d.Id()),
   130  	})
   131  	if err != nil {
   132  		if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NotFoundException" {
   133  			log.Printf("[WARN] API gateway domain name %s has vanished\n", d.Id())
   134  			d.SetId("")
   135  			return nil
   136  		}
   137  
   138  		return err
   139  	}
   140  
   141  	d.Set("certificate_name", domainName.CertificateName)
   142  	if err := d.Set("certificate_upload_date", domainName.CertificateUploadDate.Format(time.RFC3339)); err != nil {
   143  		log.Printf("[DEBUG] Error setting certificate_upload_date: %s", err)
   144  	}
   145  	d.Set("cloudfront_domain_name", domainName.DistributionDomainName)
   146  	d.Set("domain_name", domainName.DomainName)
   147  	d.Set("certificate_arn", domainName.CertificateArn)
   148  
   149  	return nil
   150  }
   151  
   152  func resourceAwsApiGatewayDomainNameUpdateOperations(d *schema.ResourceData) []*apigateway.PatchOperation {
   153  	operations := make([]*apigateway.PatchOperation, 0)
   154  
   155  	if d.HasChange("certificate_name") {
   156  		operations = append(operations, &apigateway.PatchOperation{
   157  			Op:    aws.String("replace"),
   158  			Path:  aws.String("/certificateName"),
   159  			Value: aws.String(d.Get("certificate_name").(string)),
   160  		})
   161  	}
   162  
   163  	if d.HasChange("certificate_arn") {
   164  		operations = append(operations, &apigateway.PatchOperation{
   165  			Op:    aws.String("replace"),
   166  			Path:  aws.String("/certificateArn"),
   167  			Value: aws.String(d.Get("certificate_arn").(string)),
   168  		})
   169  	}
   170  
   171  	return operations
   172  }
   173  
   174  func resourceAwsApiGatewayDomainNameUpdate(d *schema.ResourceData, meta interface{}) error {
   175  	conn := meta.(*AWSClient).apigateway
   176  	log.Printf("[DEBUG] Updating API Gateway Domain Name %s", d.Id())
   177  
   178  	_, err := conn.UpdateDomainName(&apigateway.UpdateDomainNameInput{
   179  		DomainName:      aws.String(d.Id()),
   180  		PatchOperations: resourceAwsApiGatewayDomainNameUpdateOperations(d),
   181  	})
   182  
   183  	if err != nil {
   184  		return err
   185  	}
   186  
   187  	return resourceAwsApiGatewayDomainNameRead(d, meta)
   188  }
   189  
   190  func resourceAwsApiGatewayDomainNameDelete(d *schema.ResourceData, meta interface{}) error {
   191  	conn := meta.(*AWSClient).apigateway
   192  	log.Printf("[DEBUG] Deleting API Gateway Domain Name: %s", d.Id())
   193  
   194  	return resource.Retry(5*time.Minute, func() *resource.RetryError {
   195  		_, err := conn.DeleteDomainName(&apigateway.DeleteDomainNameInput{
   196  			DomainName: aws.String(d.Id()),
   197  		})
   198  
   199  		if err == nil {
   200  			return nil
   201  		}
   202  
   203  		if apigatewayErr, ok := err.(awserr.Error); ok && apigatewayErr.Code() == "NotFoundException" {
   204  			return nil
   205  		}
   206  
   207  		return resource.NonRetryableError(err)
   208  	})
   209  }