Skip to content

Commit

Permalink
Improve resource cloud66_ssl_certificate
Browse files Browse the repository at this point in the history
  • Loading branch information
itsmechlark committed Mar 7, 2022
1 parent 47e973f commit c1e9030
Show file tree
Hide file tree
Showing 4 changed files with 139 additions and 47 deletions.
106 changes: 86 additions & 20 deletions cloud66/provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,59 +131,125 @@ func testAccCloud66Stack(uid string, name string) {
}

func testAccCloud66SslCertificateLetsEncrypt(stackID string, uid string) {
data := fmt.Sprintf(`
sslData := fmt.Sprintf(`
{
"uuid": "ssl-%[1]s",
"name": "my-serv-new",
"server_group_id": null,
"server_names": "example.com",
"sha256_fingerprint": "UXXsUuBNZQhNBBsPjaEATCA8t06O2RvgxuMC16q1XLCCHkIitBvMcDqoUpNO16oK",
"ca_name": "Let's Encrypt",
"type": "lets_encrypt",
"ssl_termination": true,
"has_intermediate_cert": true,
"status": 3,
"created_at": "2019-10-23T14:15:53Z",
"updated_at": "2020-03-04T12:48:25Z",
"expires_at": "2020-06-02T11:48:04Z",
"certificate": null,
"key": null,
"intermediate_certificate": null
}`, uid)

listSslResponse := fmt.Sprintf(`
{
"response": [%[1]s],
"count": 1,
"pagination": {
"previous": null,
"next": null,
"current": 1,
"per_page": 30,
"count": 1,
"pages": 1
}
}`, sslData)
deleteSslResponse := fmt.Sprintf(`{"response": %[1]s}`, sslData)
createSslResponse := fmt.Sprintf(`
{
"response": {
"uuid": "ssl-%[1]s",
"name": "my-serv-new",
"uuid": null,
"name": null,
"server_group_id": null,
"server_names": "example.com",
"sha256_fingerprint": "UXXsUuBNZQhNBBsPjaEATCA8t06O2RvgxuMC16q1XLCCHkIitBvMcDqoUpNO16oK",
"ca_name": "Let's Encrypt",
"type": "lets_encrypt",
"ssl_termination": true,
"has_intermediate_cert": true,
"status": 3,
"status": 1,
"created_at": "2019-10-23T14:15:53Z",
"updated_at": "2020-03-04T12:48:25Z",
"expires_at": "2020-06-02T11:48:04Z",
"expires_at": null,
"certificate": null,
"key": null,
"intermediate_certificate": null
}
}
`, uid)
}`)

httpmock.RegisterResponder("POST", "https://app.cloud66.com/api/3/stacks/"+stackID+"/ssl_certificates.json", httpmock.NewStringResponder(200, data))
httpmock.RegisterResponder("GET", "https://app.cloud66.com/api/3/stacks/"+stackID+"/ssl_certificates/ssl-"+uid+".json", httpmock.NewStringResponder(200, data))
httpmock.RegisterResponder("DELETE", "https://app.cloud66.com/api/3/stacks/"+stackID+"/ssl_certificates/ssl-"+uid+".json", httpmock.NewStringResponder(200, data))
httpmock.RegisterResponder("POST", "https://app.cloud66.com/api/3/stacks/"+stackID+"/ssl_certificates.json", httpmock.NewStringResponder(200, createSslResponse))
httpmock.RegisterResponder("GET", "https://app.cloud66.com/api/3/stacks/"+stackID+"/ssl_certificates.json", httpmock.NewStringResponder(200, listSslResponse))
httpmock.RegisterResponder("DELETE", "https://app.cloud66.com/api/3/stacks/"+stackID+"/ssl_certificates/ssl-"+uid+".json", httpmock.NewStringResponder(200, deleteSslResponse))
}

func testAccCloud66SslCertificateManual(stackID string, uid string) {
data := fmt.Sprintf(`
sslData := fmt.Sprintf(`
{
"uuid": "ssl-%[1]s",
"name": "my-serv-new",
"server_group_id": null,
"server_names": "example.com",
"sha256_fingerprint": "f33832c92a78e776c15fed3f9d1f6fb4b7f0f2ce7f126c2495ea62618ef8e195",
"ca_name": null,
"type": "manual",
"ssl_termination": true,
"has_intermediate_cert": false,
"status": 3,
"created_at": "2019-10-23T14:15:53Z",
"updated_at": "2020-03-04T12:48:25Z",
"expires_at": "2020-06-02T11:48:04Z",
"certificate": null,
"key": null,
"intermediate_certificate": null
}`, uid)

listSslResponse := fmt.Sprintf(`
{
"response": [%[1]s],
"count": 1,
"pagination": {
"previous": null,
"next": null,
"current": 1,
"per_page": 30,
"count": 1,
"pages": 1
}
}`, sslData)
deleteSslResponse := fmt.Sprintf(`{"response": %[1]s}`, sslData)
createSslResponse := fmt.Sprintf(`
{
"response": {
"uuid": "ssl-%[1]s",
"name": "my-serv-new",
"uuid": null,
"name": null,
"server_group_id": null,
"server_names": "example.com",
"sha256_fingerprint": "f33832c92a78e776c15fed3f9d1f6fb4b7f0f2ce7f126c2495ea62618ef8e195",
"ca_name": null,
"type": "manual",
"ssl_termination": true,
"has_intermediate_cert": false,
"status": 3,
"status": 1,
"created_at": "2019-10-23T14:15:53Z",
"updated_at": "2020-03-04T12:48:25Z",
"expires_at": "2020-06-02T11:48:04Z",
"expires_at": null,
"certificate": null,
"key": null,
"intermediate_certificate": null
}
}
`, uid)
}`)

httpmock.RegisterResponder("POST", "https://app.cloud66.com/api/3/stacks/"+stackID+"/ssl_certificates.json", httpmock.NewStringResponder(200, data))
httpmock.RegisterResponder("GET", "https://app.cloud66.com/api/3/stacks/"+stackID+"/ssl_certificates/ssl-"+uid+".json", httpmock.NewStringResponder(200, data))
httpmock.RegisterResponder("DELETE", "https://app.cloud66.com/api/3/stacks/"+stackID+"/ssl_certificates/ssl-"+uid+".json", httpmock.NewStringResponder(200, data))
httpmock.RegisterResponder("POST", "https://app.cloud66.com/api/3/stacks/"+stackID+"/ssl_certificates.json", httpmock.NewStringResponder(200, createSslResponse))
httpmock.RegisterResponder("GET", "https://app.cloud66.com/api/3/stacks/"+stackID+"/ssl_certificates.json", httpmock.NewStringResponder(200, listSslResponse))
httpmock.RegisterResponder("DELETE", "https://app.cloud66.com/api/3/stacks/"+stackID+"/ssl_certificates/ssl-"+uid+".json", httpmock.NewStringResponder(200, deleteSslResponse))
}
56 changes: 38 additions & 18 deletions cloud66/resource_cloud66_ssl_certificate.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,14 +77,19 @@ func resourceCloud66SslCertificateRead(d *schema.ResourceData, meta interface{})
providerConfig := meta.(ProviderConfig)
client := providerConfig.client

stackID := d.Get("stack_id").(string)
sslID := d.Id()

record, err := client.GetSslCertificate(stackID, sslID)
if record != nil {
setCloud66SslCertificateData(d, record)
stackID := d.Id()

records, err := client.ListSslCertificates(stackID)
if records != nil {
for _, record := range records {
sha256Fingerprint := *record.SHA256Fingerprint
if sha256Fingerprint == d.Get("sha256_fingerprint").(string) {
setCloud66SslCertificateData(d, &record)
break
}
}
} else {
return fmt.Errorf("error reading SSL Certificate %q: %s", sslID, err)
return fmt.Errorf("error reading SSL Certificate %q: %s", stackID, err)
}

return nil
Expand All @@ -94,8 +99,8 @@ func resourceCloud66SslCertificateUpdate(d *schema.ResourceData, meta interface{
providerConfig := meta.(ProviderConfig)
client := providerConfig.client

stackID := d.Get("stack_id").(string)
sslID := d.Id()
stackID := d.Id()
sslID := d.Get("uuid").(string)

servernames := []string{}
servernamesRaw := d.Get("server_names").(*schema.Set)
Expand Down Expand Up @@ -139,14 +144,25 @@ func resourceCloud66SslCertificateDelete(d *schema.ResourceData, meta interface{
providerConfig := meta.(ProviderConfig)
client := providerConfig.client

stackID := d.Get("stack_id").(string)
sslID := d.Id()

log.Printf("[DEBUG] Deleting SSL Cert %s for stack %s", sslID, stackID)

record, err := client.DestroySslCertificate(stackID, sslID)
if record == nil {
return fmt.Errorf("error deleting SSL Certificate %q: %s", stackID, err)
stackID := d.Id()
sslID := d.Get("uuid").(string)

records, err := client.ListSslCertificates(stackID)
if records != nil {
for _, record := range records {
sha256Fingerprint := *record.SHA256Fingerprint
if sha256Fingerprint == d.Get("sha256_fingerprint").(string) || (sslID != "" && sslID == record.Uuid) {
log.Printf("[DEBUG] Deleting SSL Cert %s for stack %s", sslID, stackID)
record, err := client.DestroySslCertificate(stackID, sslID)

if record == nil {
return fmt.Errorf("error deleting SSL Certificate %q: %s", stackID, err)
}
break
}
}
} else {
return fmt.Errorf("error reading SSL Certificate %q: %s", stackID, err)
}

return nil
Expand All @@ -172,13 +188,17 @@ func resourceCloud66SslCertificateImport(d *schema.ResourceData, meta interface{
}

func setCloud66SslCertificateData(d *schema.ResourceData, ssl *api.SslCertificate) {
d.SetId(ssl.Uuid)
stackID := d.Get("stack_id").(string)

d.SetId(stackID)
d.Set("uuid", ssl.Uuid)
d.Set("name", ssl.Name)
d.Set("ca_name", ssl.CAName)
d.Set("type", ssl.Type)
d.Set("ssl_termination", ssl.SSLTermination)
d.Set("server_group_id", ssl.ServerGroupID)
d.Set("has_intermediate_cert", ssl.HasIntermediateCert)
d.Set("sha256_fingerprint", ssl.SHA256Fingerprint)
d.Set("status", ssl.Status())

servernames := schema.NewSet(schema.HashString, []interface{}{})
Expand Down
11 changes: 4 additions & 7 deletions cloud66/resource_cloud66_ssl_certificate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
"github.com/jarcoal/httpmock"
)

func TestAccCloud66SslCertificate_LetsEncrypt(t *testing.T) {
Expand All @@ -29,20 +28,17 @@ func TestAccCloud66SslCertificate_LetsEncrypt(t *testing.T) {
Config: testAccCloud66SslCertificate_LetsEncrypt(stackID, rnd),
Check: resource.ComposeTestCheckFunc(
testAccCloud66SslCertificateAttributes(stackID, &ssl),
resource.TestCheckResourceAttr(resourceName, "stack_id", stackID),
resource.TestCheckResourceAttr(resourceName, "name", "my-serv-new"),
resource.TestCheckResourceAttr(resourceName, "ca_name", "Let's Encrypt"),
resource.TestCheckResourceAttr(resourceName, "type", "lets_encrypt"),
resource.TestCheckResourceAttr(resourceName, "ssl_termination", "true"),
resource.TestCheckResourceAttr(resourceName, "server_group_id", "0"),
resource.TestCheckResourceAttr(resourceName, "server_names.#", "1"),
resource.TestCheckResourceAttr(resourceName, "has_intermediate_cert", "true"),
resource.TestCheckResourceAttr(resourceName, "sha256_fingerprint", "UXXsUuBNZQhNBBsPjaEATCA8t06O2RvgxuMC16q1XLCCHkIitBvMcDqoUpNO16oK"),
),
},
},
})

httpmock.GetTotalCallCount()
}

func testAccCloud66SslCertificate_LetsEncrypt(stactID string, rnd string) string {
Expand All @@ -62,6 +58,7 @@ resource "cloud66_ssl_certificate" "%[3]s" {
func TestAccCloud66SslCertificate_Manual(t *testing.T) {
t.Parallel()

var ssl api.SslCertificate
rnd := generateRandomResourceName()
stackID := generateRandomUid()
uid := generateRandomUid()
Expand All @@ -75,14 +72,14 @@ func TestAccCloud66SslCertificate_Manual(t *testing.T) {
{
Config: testAccCloud66SslCertificate_Manual(stackID, rnd),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "stack_id", stackID),
resource.TestCheckResourceAttr(resourceName, "name", "my-serv-new"),
testAccCloud66SslCertificateAttributes(stackID, &ssl),
resource.TestCheckResourceAttr(resourceName, "ca_name", ""),
resource.TestCheckResourceAttr(resourceName, "type", "manual"),
resource.TestCheckResourceAttr(resourceName, "ssl_termination", "true"),
resource.TestCheckResourceAttr(resourceName, "server_group_id", "0"),
resource.TestCheckResourceAttr(resourceName, "server_names.#", "1"),
resource.TestCheckResourceAttr(resourceName, "has_intermediate_cert", "false"),
resource.TestCheckResourceAttr(resourceName, "sha256_fingerprint", "f33832c92a78e776c15fed3f9d1f6fb4b7f0f2ce7f126c2495ea62618ef8e195"),
),
},
},
Expand Down
13 changes: 11 additions & 2 deletions cloud66/schema_cloud66_ssl_certificate.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,14 @@ import (

func resourceCloud66SslCertificateSchema() map[string]*schema.Schema {
return map[string]*schema.Schema{
"uuid": {
Type: schema.TypeString,
Computed: true,
Optional: true,
},
"stack_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Optional: true,
},
"name": {
Type: schema.TypeString,
Expand Down Expand Up @@ -62,6 +66,11 @@ func resourceCloud66SslCertificateSchema() map[string]*schema.Schema {
Computed: true,
Optional: true,
},
"sha256_fingerprint": {
Type: schema.TypeString,
Computed: true,
Optional: true,
},
"status": {
Type: schema.TypeString,
Computed: true,
Expand Down

0 comments on commit c1e9030

Please sign in to comment.