From 1a5c46a1acb81c951a734c4f440911cbab5f5876 Mon Sep 17 00:00:00 2001 From: Andrew Starr-Bochicchio Date: Mon, 25 Jun 2018 19:38:10 -0400 Subject: [PATCH] Add importability for Load Balancers and Certificate. (#104) * Added importability for load balancer * Added importability, go fmt'ed * Added importability for DNS records * added importability for certificates * Added import notes for DNS records and load balancers * Added import tests * Added random int for test configs * Added certificates for the test to import * Fixed docs, added certificate importability on docs * Make TestAccDigitalOceanCertificate_importBasic pass by reusing certificate generation from resource_digitalocean_certificate_test.go * Fix importablity of Load Balancer Droplet droplet_ids. * Revert "Added importability for DNS records" This reverts commit 94b1f69fe756c862125d0b899d49eca74f7bd591. * Remove mention of record imports in docs. * Remove digitalocean/import_digitalocean_record_test.go --- .../import_digitalocean_certificate_test.go | 35 +++++++++++++++++++ .../import_digitalocean_loadbalancer_test.go | 30 ++++++++++++++++ digitalocean/loadbalancer.go | 8 +++-- .../resource_digitalocean_certificate.go | 3 ++ .../resource_digitalocean_certificate_test.go | 24 ++++++++----- .../resource_digitalocean_loadbalancer.go | 8 ++++- website/docs/r/certificate.html.markdown | 10 ++++++ website/docs/r/loadbalancer.html.markdown | 8 +++++ 8 files changed, 113 insertions(+), 13 deletions(-) create mode 100644 digitalocean/import_digitalocean_certificate_test.go create mode 100644 digitalocean/import_digitalocean_loadbalancer_test.go diff --git a/digitalocean/import_digitalocean_certificate_test.go b/digitalocean/import_digitalocean_certificate_test.go new file mode 100644 index 00000000..2533d9f7 --- /dev/null +++ b/digitalocean/import_digitalocean_certificate_test.go @@ -0,0 +1,35 @@ +package digitalocean + +import ( + "testing" + + "github.com/hashicorp/terraform/helper/acctest" + "github.com/hashicorp/terraform/helper/resource" +) + +func TestAccDigitalOceanCertificate_importBasic(t *testing.T) { + resourceName := "digitalocean_certificate.foobar" + rInt := acctest.RandInt() + + privateKeyMaterial, leafCertMaterial, certChainMaterial := generateTestCertMaterial(t) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckDigitalOceanCertificateDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckDigitalOceanCertificateConfig_basic(rInt, privateKeyMaterial, leafCertMaterial, certChainMaterial), + }, + + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{ + "certificate_chain", "leaf_certificate", "private_key"}, // We ignore these as they are not returned by the API + + }, + }, + }) +} diff --git a/digitalocean/import_digitalocean_loadbalancer_test.go b/digitalocean/import_digitalocean_loadbalancer_test.go new file mode 100644 index 00000000..38e1bdf9 --- /dev/null +++ b/digitalocean/import_digitalocean_loadbalancer_test.go @@ -0,0 +1,30 @@ +package digitalocean + +import ( + "testing" + + "github.com/hashicorp/terraform/helper/acctest" + "github.com/hashicorp/terraform/helper/resource" +) + +func TestAccDigitalOceanLoadBalancer_importBasic(t *testing.T) { + resourceName := "digitalocean_loadbalancer.foobar" + rInt := acctest.RandInt() + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckDigitalOceanLoadbalancerConfig_basic(rInt), + }, + + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} diff --git a/digitalocean/loadbalancer.go b/digitalocean/loadbalancer.go index efacf7ae..2e5f1213 100644 --- a/digitalocean/loadbalancer.go +++ b/digitalocean/loadbalancer.go @@ -3,6 +3,7 @@ package digitalocean import ( "context" "fmt" + "strconv" "github.com/digitalocean/godo" "github.com/hashicorp/terraform/helper/resource" @@ -82,11 +83,12 @@ func expandForwardingRules(config []interface{}) []godo.ForwardingRule { } func flattenDropletIds(list []int) []interface{} { - vs := make([]interface{}, 0, len(list)) + flatList := make([]interface{}, 0, len(list)) for _, v := range list { - vs = append(vs, v) + vStr := strconv.Itoa(v) + flatList = append(flatList, vStr) } - return vs + return flatList } func flattenHealthChecks(health *godo.HealthCheck) []map[string]interface{} { diff --git a/digitalocean/resource_digitalocean_certificate.go b/digitalocean/resource_digitalocean_certificate.go index 264ab529..a23c108e 100644 --- a/digitalocean/resource_digitalocean_certificate.go +++ b/digitalocean/resource_digitalocean_certificate.go @@ -14,6 +14,9 @@ func resourceDigitalOceanCertificate() *schema.Resource { Create: resourceDigitalOceanCertificateCreate, Read: resourceDigitalOceanCertificateRead, Delete: resourceDigitalOceanCertificateDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, Schema: map[string]*schema.Schema{ "name": { diff --git a/digitalocean/resource_digitalocean_certificate_test.go b/digitalocean/resource_digitalocean_certificate_test.go index 270d01a2..97c9243d 100644 --- a/digitalocean/resource_digitalocean_certificate_test.go +++ b/digitalocean/resource_digitalocean_certificate_test.go @@ -15,15 +15,7 @@ import ( func TestAccDigitalOceanCertificate_Basic(t *testing.T) { var cert godo.Certificate rInt := acctest.RandInt() - leafCertMaterial, privateKeyMaterial, err := acctest.RandTLSCert("Acme Co") - if err != nil { - t.Fatalf("Cannot generate test TLS certificate: %s", err) - } - rootCertMaterial, _, err := acctest.RandTLSCert("Acme Go") - if err != nil { - t.Fatalf("Cannot generate test TLS certificate: %s", err) - } - certChainMaterial := fmt.Sprintf("%s\n%s", strings.TrimSpace(rootCertMaterial), leafCertMaterial) + privateKeyMaterial, leafCertMaterial, certChainMaterial := generateTestCertMaterial(t) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -97,6 +89,20 @@ func testAccCheckDigitalOceanCertificateExists(n string, cert *godo.Certificate) } } +func generateTestCertMaterial(t *testing.T) (string, string, string) { + leafCertMaterial, privateKeyMaterial, err := acctest.RandTLSCert("Acme Co") + if err != nil { + t.Fatalf("Cannot generate test TLS certificate: %s", err) + } + rootCertMaterial, _, err := acctest.RandTLSCert("Acme Go") + if err != nil { + t.Fatalf("Cannot generate test TLS certificate: %s", err) + } + certChainMaterial := fmt.Sprintf("%s\n%s", strings.TrimSpace(rootCertMaterial), leafCertMaterial) + + return privateKeyMaterial, leafCertMaterial, certChainMaterial +} + func testAccCheckDigitalOceanCertificateConfig_basic(rInt int, privateKeyMaterial, leafCert, certChain string) string { return fmt.Sprintf(` resource "digitalocean_certificate" "foobar" { diff --git a/digitalocean/resource_digitalocean_loadbalancer.go b/digitalocean/resource_digitalocean_loadbalancer.go index f6ff03a6..2ca7ea0b 100644 --- a/digitalocean/resource_digitalocean_loadbalancer.go +++ b/digitalocean/resource_digitalocean_loadbalancer.go @@ -18,6 +18,9 @@ func resourceDigitalOceanLoadbalancer() *schema.Resource { Read: resourceDigitalOceanLoadbalancerRead, Update: resourceDigitalOceanLoadbalancerUpdate, Delete: resourceDigitalOceanLoadbalancerDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, Schema: map[string]*schema.Schema{ "name": { @@ -252,9 +255,12 @@ func resourceDigitalOceanLoadbalancerRead(d *schema.ResourceData, meta interface d.Set("algorithm", loadbalancer.Algorithm) d.Set("region", loadbalancer.Region.Slug) d.Set("redirect_http_to_https", loadbalancer.RedirectHttpToHttps) - d.Set("droplet_ids", flattenDropletIds(loadbalancer.DropletIDs)) d.Set("droplet_tag", loadbalancer.Tag) + if err := d.Set("droplet_ids", flattenDropletIds(loadbalancer.DropletIDs)); err != nil { + return fmt.Errorf("[DEBUG] Error setting Load Balancer droplet_ids - error: %#v", err) + } + if err := d.Set("sticky_sessions", flattenStickySessions(loadbalancer.StickySessions)); err != nil { return fmt.Errorf("[DEBUG] Error setting Load Balancer sticky_sessions - error: %#v", err) } diff --git a/website/docs/r/certificate.html.markdown b/website/docs/r/certificate.html.markdown index a1d8ba0d..563e52a8 100644 --- a/website/docs/r/certificate.html.markdown +++ b/website/docs/r/certificate.html.markdown @@ -63,3 +63,13 @@ The following attributes are exported: * `name` - The name of the certificate * `not_after` - The expiration date of the certificate * `sha1_fingerprint` - The SHA-1 fingerprint of the certificate + + + +## Import + +Certificates can be imported using the certificate `id`, e.g. + +``` +terraform import digitalocean_certificate.mycertificate 892071a0-bb95-49bc-8021-3afd67a210bf +``` diff --git a/website/docs/r/loadbalancer.html.markdown b/website/docs/r/loadbalancer.html.markdown index c7259cc7..6e2a4988 100644 --- a/website/docs/r/loadbalancer.html.markdown +++ b/website/docs/r/loadbalancer.html.markdown @@ -96,3 +96,11 @@ The following attributes are exported: * `id` - The ID of the Load Balancer * `ip`- The ip of the Load Balancer + +## Import + +Load Balancers can be imported using the `id`, e.g. + +``` +terraform import digitalocean_loadbalancer.myloadbalancer 4de7ac8b-495b-4884-9a69-1050c6793cd6 +```