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 }