Skip to content

Commit

Permalink
Create test passing
Browse files Browse the repository at this point in the history
  • Loading branch information
nicholasjackson committed Nov 17, 2018
1 parent 3f8519f commit 6350b6d
Show file tree
Hide file tree
Showing 5 changed files with 177 additions and 13 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ website/node_modules
*.iml
*.test
*.iml
.vscode/

website/vendor

Expand Down
1 change: 1 addition & 0 deletions digitalocean/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ func Provider() terraform.ResourceProvider {
"digitalocean_domain": resourceDigitalOceanDomain(),
"digitalocean_droplet": resourceDigitalOceanDroplet(),
"digitalocean_droplet_snapshot": resourceDigitalOceanDropletSnapshot(),
"digitalocean_kubernetes_cluster": resourceDigitalOceanKubernetes(),
"digitalocean_firewall": resourceDigitalOceanFirewall(),
"digitalocean_floating_ip": resourceDigitalOceanFloatingIp(),
"digitalocean_floating_ip_assignment": resourceDigitalOceanFloatingIpAssignment(),
Expand Down
66 changes: 54 additions & 12 deletions digitalocean/resource_digitalocean_kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ func resourceDigitalOceanKubernetes() *schema.Resource {
return &schema.Resource{
Create: resourceDigitalOceanKubernetesCreate,
Read: resourceDigitalOceanKubernetesRead,
Update: resourceDigitalOceanKubernetesUpdate,
Delete: resourceDigitalOceanKubernetesDelete,
SchemaVersion: 1,

Schema: map[string]*schema.Schema{
Expand Down Expand Up @@ -62,7 +64,7 @@ func resourceDigitalOceanKubernetes() *schema.Resource {

"tags": tagsSchema(),

"node_pools": nodePoolSchema(),
"node_pool": nodePoolSchema(),

"status": {
Type: schema.TypeString,
Expand All @@ -87,7 +89,7 @@ func resourceDigitalOceanKubernetes() *schema.Resource {
func nodePoolSchema() *schema.Schema {
return &schema.Schema{
Type: schema.TypeSet,
Optional: false,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Expand All @@ -104,8 +106,7 @@ func nodePoolSchema() *schema.Schema {

"count": {
Type: schema.TypeInt,
Required: false,
Default: 1,
Required: true,
},

"tags": tagsSchema(),
Expand All @@ -119,13 +120,12 @@ func nodePoolSchema() *schema.Schema {
func nodeSchema() *schema.Schema {
return &schema.Schema{
Type: schema.TypeSet,
Optional: false,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.NoZeroValues,
Type: schema.TypeString,
Computed: true,
},

"status": {
Expand All @@ -150,7 +150,7 @@ func nodeSchema() *schema.Schema {
func kubernetesConfig() *schema.Schema {
return &schema.Schema{
Type: schema.TypeSet,
Optional: false,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"raw_config": {
Expand Down Expand Up @@ -196,9 +196,11 @@ func resourceDigitalOceanKubernetesCreate(d *schema.ResourceData, meta interface
client := meta.(*godo.Client)

opts := &godo.KubernetesClusterCreateRequest{
Name: d.Get("name").(string),
RegionSlug: d.Get("region").(string),
Tags: d.Get("tags").([]string),
Name: d.Get("name").(string),
RegionSlug: d.Get("region").(string),
VersionSlug: d.Get("version").(string),
Tags: expandTags(d.Get("tags").(*schema.Set).List()),
NodePools: expandNodePools(d.Get("node_pool").(*schema.Set).List()),
}

cluster, _, err := client.Kubernetes.Create(context.Background(), opts)
Expand All @@ -211,6 +213,24 @@ func resourceDigitalOceanKubernetesCreate(d *schema.ResourceData, meta interface
return resourceDigitalOceanKubernetesRead(d, meta)
}

func expandNodePools(nodePools []interface{}) []*godo.KubernetesNodePoolCreateRequest {
expandedNodePools := make([]*godo.KubernetesNodePoolCreateRequest, 0, len(nodePools))
for _, rawPool := range nodePools {

pool := rawPool.(map[string]interface{})
cr := &godo.KubernetesNodePoolCreateRequest{
Name: pool["name"].(string),
Size: pool["size"].(string),
Count: pool["count"].(int),
Tags: expandTags(pool["tags"].(*schema.Set).List()),
}

expandedNodePools = append(expandedNodePools, cr)
}

return expandedNodePools
}

func resourceDigitalOceanKubernetesRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*godo.Client)

Expand All @@ -228,3 +248,25 @@ func resourceDigitalOceanKubernetesRead(d *schema.ResourceData, meta interface{}

return nil
}

func resourceDigitalOceanKubernetesUpdate(d *schema.ResourceData, meta interface{}) error {
return nil
}

func resourceDigitalOceanKubernetesDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*godo.Client)

resp, err := client.Kubernetes.Delete(context.Background(), d.Id())
if err != nil {
if resp.StatusCode == 404 {
d.SetId("")
return nil
}

return fmt.Errorf("Unable to delete cluster: %s", err)
}

d.SetId("")

return nil
}
99 changes: 99 additions & 0 deletions digitalocean/resource_digitialocean_kubernetes_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package digitalocean

import (
"context"
"fmt"
"testing"

"github.com/digitalocean/godo"
"github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
)

func TestAccDigitalOceanKubernetes_Basic(t *testing.T) {
rName := acctest.RandString(10)
var k8s godo.KubernetesCluster

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckDigitalOceanKubernetesDestroy,
Steps: []resource.TestStep{
{
Config: testAccDigitalOceanKubernetesConfigBasic(rName),
Check: resource.ComposeAggregateTestCheckFunc(
testAccCheckDigitalOceanKubernetesExists("digitalocean_kubernetes_cluster.foobar", &k8s),
resource.TestCheckResourceAttr("digitalocean_kubernetes_cluster.foobar", "node_pool.#", "1"),
),
},
},
})
}

func testAccDigitalOceanKubernetesConfigBasic(rName string) string {
return fmt.Sprintf(`
resource "digitalocean_kubernetes_cluster" "foobar" {
name = "%s"
region = "lon1"
version = "1.12.1-do.2"
tags = ["foo","bar"]
node_pool {
name = "default"
size = "s-1vcpu-2gb"
count = 3
tags = ["one","two"]
}
}
`, rName)
}

func testAccCheckDigitalOceanKubernetesDestroy(s *terraform.State) error {
client := testAccProvider.Meta().(*godo.Client)

for _, rs := range s.RootModule().Resources {
if rs.Type != "digitalocean_kubernetes_cluster" {
continue
}

// Try to find the firewall
_, _, err := client.Kubernetes.Get(context.Background(), rs.Primary.ID)

if err == nil {
return fmt.Errorf("K8s Cluster still exists")
}
}

return nil
}

func testAccCheckDigitalOceanKubernetesExists(n string, cluster *godo.KubernetesCluster) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]

if !ok {
return fmt.Errorf("Not found: %s", n)
}

if rs.Primary.ID == "" {
return fmt.Errorf("No Record ID is set")
}

client := testAccProvider.Meta().(*godo.Client)

foundCluster, _, err := client.Kubernetes.Get(context.Background(), rs.Primary.ID)

if err != nil {
return err
}

if foundCluster.ID != rs.Primary.ID {
return fmt.Errorf("Record not found")
}

*cluster = *foundCluster

return nil
}
}
23 changes: 22 additions & 1 deletion examples/kubernetes/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,30 @@ type KubernetesNodePool struct {
Nodes []*KubernetesNode `json:"nodes,omitempty"`
}
type KubernetesNode struct {
ID string `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Status *KubernetesNodeStatus `json:"status,omitempty"`
CreatedAt time.Time `json:"created_at,omitempty"`
UpdatedAt time.Time `json:"updated_at,omitempty"`
}
client_key - Base64 encoded private key used by clients to authenticate to the Kubernetes cluster.
client_certificate - Base64 encoded public certificate used by clients to authenticate to the Kubernetes cluster.
cluster_ca_certificate - Base64 encoded public CA certificate used as the root of trust for the Kubernetes cluster.
host - The Kubernetes cluster server host.
username - A username used to authenticate to the Kubernetes cluster.
password - A password or token used to authenticate to the Kubernetes cluster.
*/

resource "digitalocean_kubernetes" "k8s" {
resource "digitalocean_kubernetes_cluster" "k8s" {
name = "example"
region = "lon1"

Expand Down

0 comments on commit 6350b6d

Please sign in to comment.