github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/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": { 25 Type: schema.TypeString, 26 ForceNew: true, 27 Required: true, 28 }, 29 30 "certificate_chain": { 31 Type: schema.TypeString, 32 ForceNew: true, 33 Required: true, 34 }, 35 36 "certificate_name": { 37 Type: schema.TypeString, 38 Required: true, 39 }, 40 41 "certificate_private_key": { 42 Type: schema.TypeString, 43 ForceNew: true, 44 Required: true, 45 }, 46 47 "domain_name": { 48 Type: schema.TypeString, 49 Required: true, 50 ForceNew: true, 51 }, 52 53 "cloudfront_domain_name": { 54 Type: schema.TypeString, 55 Computed: true, 56 }, 57 58 "certificate_upload_date": { 59 Type: schema.TypeString, 60 Computed: true, 61 }, 62 63 "cloudfront_zone_id": { 64 Type: schema.TypeString, 65 Computed: true, 66 }, 67 }, 68 } 69 } 70 71 func resourceAwsApiGatewayDomainNameCreate(d *schema.ResourceData, meta interface{}) error { 72 conn := meta.(*AWSClient).apigateway 73 log.Printf("[DEBUG] Creating API Gateway Domain Name") 74 75 domainName, err := conn.CreateDomainName(&apigateway.CreateDomainNameInput{ 76 CertificateBody: aws.String(d.Get("certificate_body").(string)), 77 CertificateChain: aws.String(d.Get("certificate_chain").(string)), 78 CertificateName: aws.String(d.Get("certificate_name").(string)), 79 CertificatePrivateKey: aws.String(d.Get("certificate_private_key").(string)), 80 DomainName: aws.String(d.Get("domain_name").(string)), 81 }) 82 if err != nil { 83 return fmt.Errorf("Error creating API Gateway Domain Name: %s", err) 84 } 85 86 d.SetId(*domainName.DomainName) 87 d.Set("cloudfront_domain_name", domainName.DistributionDomainName) 88 d.Set("cloudfront_zone_id", cloudFrontRoute53ZoneID) 89 90 return resourceAwsApiGatewayDomainNameRead(d, meta) 91 } 92 93 func resourceAwsApiGatewayDomainNameRead(d *schema.ResourceData, meta interface{}) error { 94 conn := meta.(*AWSClient).apigateway 95 log.Printf("[DEBUG] Reading API Gateway Domain Name %s", d.Id()) 96 97 domainName, err := conn.GetDomainName(&apigateway.GetDomainNameInput{ 98 DomainName: aws.String(d.Id()), 99 }) 100 if err != nil { 101 if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NotFoundException" { 102 log.Printf("[WARN] API gateway domain name %s has vanished\n", d.Id()) 103 d.SetId("") 104 return nil 105 } 106 107 return err 108 } 109 110 d.Set("certificate_name", domainName.CertificateName) 111 if err := d.Set("certificate_upload_date", domainName.CertificateUploadDate.Format(time.RFC3339)); err != nil { 112 log.Printf("[DEBUG] Error setting certificate_upload_date: %s", err) 113 } 114 d.Set("cloudfront_domain_name", domainName.DistributionDomainName) 115 d.Set("domain_name", domainName.DomainName) 116 117 return nil 118 } 119 120 func resourceAwsApiGatewayDomainNameUpdateOperations(d *schema.ResourceData) []*apigateway.PatchOperation { 121 operations := make([]*apigateway.PatchOperation, 0) 122 123 if d.HasChange("certificate_name") { 124 operations = append(operations, &apigateway.PatchOperation{ 125 Op: aws.String("replace"), 126 Path: aws.String("/certificateName"), 127 Value: aws.String(d.Get("certificate_name").(string)), 128 }) 129 } 130 131 return operations 132 } 133 134 func resourceAwsApiGatewayDomainNameUpdate(d *schema.ResourceData, meta interface{}) error { 135 conn := meta.(*AWSClient).apigateway 136 log.Printf("[DEBUG] Updating API Gateway Domain Name %s", d.Id()) 137 138 _, err := conn.UpdateDomainName(&apigateway.UpdateDomainNameInput{ 139 DomainName: aws.String(d.Id()), 140 PatchOperations: resourceAwsApiGatewayDomainNameUpdateOperations(d), 141 }) 142 if err != nil { 143 return err 144 } 145 146 return resourceAwsApiGatewayDomainNameRead(d, meta) 147 } 148 149 func resourceAwsApiGatewayDomainNameDelete(d *schema.ResourceData, meta interface{}) error { 150 conn := meta.(*AWSClient).apigateway 151 log.Printf("[DEBUG] Deleting API Gateway Domain Name: %s", d.Id()) 152 153 return resource.Retry(5*time.Minute, func() *resource.RetryError { 154 _, err := conn.DeleteDomainName(&apigateway.DeleteDomainNameInput{ 155 DomainName: aws.String(d.Id()), 156 }) 157 158 if err == nil { 159 return nil 160 } 161 162 if apigatewayErr, ok := err.(awserr.Error); ok && apigatewayErr.Code() == "NotFoundException" { 163 return nil 164 } 165 166 return resource.NonRetryableError(err) 167 }) 168 }