Skip to content

Commit 81ca350

Browse files
cdn: Handle certificate name updates. (#579)
* cdn: Add testcase for creating and updating with custom domain/cert. * cdn: Handle certificate name updates.
1 parent 425cf32 commit 81ca350

2 files changed

Lines changed: 121 additions & 3 deletions

File tree

digitalocean/resource_digitalocean_cdn.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,19 @@ func resourceDigitalOceanCDNUpdate(ctx context.Context, d *schema.ResourceData,
232232
log.Printf("[INFO] Updated TTL on CDN")
233233
}
234234

235-
if d.HasChange("certificate_id") || d.HasChange("custom_domain") {
235+
if d.HasChange("certificate_id") || d.HasChange("custom_domain") || d.HasChange("certificate_name") {
236236
cdnUpdateRequest := &godo.CDNUpdateCustomDomainRequest{
237-
CustomDomain: d.Get("custom_domain").(string),
238-
CertificateID: d.Get("certificate_id").(string),
237+
CustomDomain: d.Get("custom_domain").(string),
238+
}
239+
240+
certName := d.Get("certificate_name").(string)
241+
if certName != "" {
242+
cert, err := findCertificateByName(client, certName)
243+
if err != nil {
244+
return diag.FromErr(err)
245+
}
246+
247+
cdnUpdateRequest.CertificateID = cert.ID
239248
}
240249

241250
_, _, err := client.CDNs.UpdateCustomDomain(context.Background(), d.Id(), cdnUpdateRequest)

digitalocean/resource_digitalocean_cdn_test.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,49 @@ func TestAccDigitalOceanCDN_Create_and_Update(t *testing.T) {
103103
})
104104
}
105105

106+
func TestAccDigitalOceanCDN_CustomDomain(t *testing.T) {
107+
spaceName := generateBucketName()
108+
certName := randomTestName()
109+
updatedCertName := generateBucketName()
110+
domain := randomTestName() + ".com"
111+
config := testAccCheckDigitalOceanCDNConfig_CustomDomain(domain, spaceName, certName)
112+
updatedConfig := testAccCheckDigitalOceanCDNConfig_CustomDomain(domain, spaceName, updatedCertName)
113+
114+
resource.ParallelTest(t, resource.TestCase{
115+
PreCheck: func() { testAccPreCheck(t) },
116+
ProviderFactories: testAccProviderFactories,
117+
CheckDestroy: testAccCheckDigitalOceanCDNDestroy,
118+
ExternalProviders: map[string]resource.ExternalProvider{
119+
"tls": {
120+
Source: "hashicorp/tls",
121+
VersionConstraint: "3.0.0",
122+
},
123+
},
124+
Steps: []resource.TestStep{
125+
{
126+
Config: config,
127+
Check: resource.ComposeTestCheckFunc(
128+
testAccCheckDigitalOceanCDNExists("digitalocean_cdn.space_cdn"),
129+
resource.TestCheckResourceAttr(
130+
"digitalocean_cdn.space_cdn", "certificate_name", certName),
131+
resource.TestCheckResourceAttr(
132+
"digitalocean_cdn.space_cdn", "custom_domain", "foo."+domain),
133+
),
134+
},
135+
{
136+
Config: updatedConfig,
137+
Check: resource.ComposeTestCheckFunc(
138+
testAccCheckDigitalOceanCDNExists("digitalocean_cdn.space_cdn"),
139+
resource.TestCheckResourceAttr(
140+
"digitalocean_cdn.space_cdn", "certificate_name", updatedCertName),
141+
resource.TestCheckResourceAttr(
142+
"digitalocean_cdn.space_cdn", "custom_domain", "foo."+domain),
143+
),
144+
},
145+
},
146+
})
147+
}
148+
106149
func testAccCheckDigitalOceanCDNDestroy(s *terraform.State) error {
107150
client := testAccProvider.Meta().(*CombinedConfig).godoClient()
108151

@@ -175,3 +218,69 @@ resource "digitalocean_cdn" "foobar" {
175218
origin = "${digitalocean_spaces_bucket.bucket.bucket_domain_name}"
176219
ttl = %d
177220
}`
221+
222+
func testAccCheckDigitalOceanCDNConfig_CustomDomain(domain string, spaceName string, certName string) string {
223+
return fmt.Sprintf(`
224+
resource "tls_private_key" "example" {
225+
algorithm = "ECDSA"
226+
ecdsa_curve = "P384"
227+
}
228+
229+
resource "tls_self_signed_cert" "example" {
230+
key_algorithm = "ECDSA"
231+
private_key_pem = tls_private_key.example.private_key_pem
232+
dns_names = ["foo.%s"]
233+
subject {
234+
common_name = "foo.%s"
235+
organization = "%s"
236+
}
237+
238+
validity_period_hours = 24
239+
240+
allowed_uses = [
241+
"key_encipherment",
242+
"digital_signature",
243+
"server_auth",
244+
]
245+
}
246+
247+
resource "digitalocean_spaces_bucket" "space" {
248+
name = "%s"
249+
region = "sfo3"
250+
}
251+
252+
resource "digitalocean_certificate" "spaces_cert" {
253+
name = "%s"
254+
type = "custom"
255+
private_key = tls_private_key.example.private_key_pem
256+
leaf_certificate = tls_self_signed_cert.example.cert_pem
257+
258+
lifecycle {
259+
create_before_destroy = true
260+
}
261+
}
262+
263+
resource digitalocean_domain "domain" {
264+
name = "%s"
265+
}
266+
267+
resource digitalocean_record "record" {
268+
domain = digitalocean_domain.domain.name
269+
type = "CNAME"
270+
name = "foo"
271+
value = "${digitalocean_spaces_bucket.space.bucket_domain_name}."
272+
}
273+
274+
resource "digitalocean_cdn" "space_cdn" {
275+
depends_on = [
276+
digitalocean_spaces_bucket.space,
277+
digitalocean_certificate.spaces_cert,
278+
digitalocean_record.record
279+
]
280+
281+
origin = digitalocean_spaces_bucket.space.bucket_domain_name
282+
ttl = 2400
283+
certificate_name = digitalocean_certificate.spaces_cert.name
284+
custom_domain = "foo.%s"
285+
}`, domain, domain, certName, spaceName, certName, domain, domain)
286+
}

0 commit comments

Comments
 (0)