Skip to content

Commit

Permalink
fix remove_default_node_pool import, add docs
Browse files Browse the repository at this point in the history
  • Loading branch information
emilymye committed Feb 28, 2019
1 parent 748c0a1 commit 03a2f5d
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 31 deletions.
80 changes: 55 additions & 25 deletions third_party/terraform/resources/resource_container_cluster.go.erb
Original file line number Diff line number Diff line change
Expand Up @@ -671,11 +671,6 @@ func resourceContainerCluster() *schema.Resource {
}
}

func cidrOrSizeDiffSuppress(k, old, new string, d *schema.ResourceData) bool {
// If the user specified a size and the API returned a full cidr block, suppress.
return strings.HasPrefix(new, "/") && strings.HasSuffix(old, new)
}

func resourceContainerClusterCreate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)

Expand Down Expand Up @@ -1497,11 +1492,15 @@ func resourceContainerClusterUpdate(d *schema.ResourceData, meta interface{}) er
name := fmt.Sprintf("%s/nodePools/%s", containerClusterFullName(project, location, clusterName), "default-pool")
op, err := config.clientContainerBeta.Projects.Locations.Clusters.NodePools.Delete(name).Do()
if err != nil {
return errwrap.Wrapf("Error deleting default node pool: {{err}}", err)
}
err = containerOperationWait(config, op, project, location, "removing default node pool", timeoutInMinutes)
if err != nil {
return errwrap.Wrapf("Error deleting default node pool: {{err}}", err)
if !isGoogleApiErrorWithCode(err, 404) {
return errwrap.Wrapf("Error deleting default node pool: {{err}}", err)
}
log.Printf("[WARN] Container cluster %q default node pool already removed, no change", d.Id())
} else {
err = containerOperationWait(config, op, project, location, "removing default node pool", timeoutInMinutes)
if err != nil {
return errwrap.Wrapf("Error deleting default node pool: {{err}}", err)
}
}
}

Expand Down Expand Up @@ -2108,29 +2107,55 @@ func flattenPodSecurityPolicyConfig(c *containerBeta.PodSecurityPolicyConfig) []
<% end -%>

func resourceContainerClusterStateImporter(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
parts := strings.Split(d.Id(), "/")
config := meta.(*Config)

parts := strings.Split(d.Id(), "/")
var project, location, clusterName string
switch len(parts) {
case 2:
if loc := parts[0]; isZone(loc) {
d.Set("zone", loc)
} else {
d.Set("region", loc)
}
d.Set("name", parts[1])
location = parts[0]
clusterName = parts[1]
case 3:
d.Set("project", parts[0])
if loc := parts[1]; isZone(loc) {
d.Set("zone", loc)
} else {
d.Set("region", loc)
}
d.Set("name", parts[2])
project = parts[0]
location = parts[1]
clusterName = parts[2]
default:
return nil, fmt.Errorf("Invalid container cluster specifier. Expecting {zone}/{name} or {project}/{zone}/{name}")
}

d.SetId(parts[len(parts)-1])
if len(project) > 0 {
d.Set("project", project)
} else {
var err error
project, err = getProject(d, config)
if err != nil {
return nil, err
}
}

if isZone(location) {
d.Set("zone", location)
} else {
d.Set("region", location)
}

d.Set("name", clusterName)
d.SetId(clusterName)

// Try to determine remove_default_node_pool from presence of default
// node pool; if still present and user has it set to true, the pool
// will get removed on next apply.
nodePool := fmt.Sprintf("%s/nodePools/%s", containerClusterFullName(project, location, clusterName), "default-pool")
_, err := config.clientContainerBeta.Projects.Locations.Clusters.NodePools.Get(nodePool).Do()
if err != nil && isGoogleApiErrorWithCode(err, 404) {
d.Set("remove_default_node_pool", true)
} else {
d.Set("remove_default_node_pool", false)
if err != nil {
log.Printf("[WARN] Unable to import value for remove_default_node_pool, got error while trying to get default node pool: %s", err)
}
}

return []*schema.ResourceData{d}, nil
}

Expand Down Expand Up @@ -2160,6 +2185,11 @@ func extractNodePoolInformationFromCluster(d *schema.ResourceData, config *Confi
}, nil
}

func cidrOrSizeDiffSuppress(k, old, new string, d *schema.ResourceData) bool {
// If the user specified a size and the API returned a full cidr block, suppress.
return strings.HasPrefix(new, "/") && strings.HasSuffix(old, new)
}

// We want to suppress diffs for empty or default client certificate configs, i.e:
// [{ "issue_client_certificate": true}] --> []
// [] -> [{ "issue_client_certificate": true}]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"bytes"
"fmt"
"testing"

"regexp"
"strconv"

"github.com/hashicorp/terraform/helper/acctest"
Expand Down Expand Up @@ -276,7 +276,6 @@ func TestAccContainerCluster_withNetworkPolicyEnabled(t *testing.T) {
ImportStateIdPrefix: "us-central1-a/",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"remove_default_node_pool"},
},
{
Config: testAccContainerCluster_removeNetworkPolicy(clusterName),
Expand All @@ -290,7 +289,6 @@ func TestAccContainerCluster_withNetworkPolicyEnabled(t *testing.T) {
ImportStateIdPrefix: "us-central1-a/",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"remove_default_node_pool"},
},
{
Config: testAccContainerCluster_withNetworkPolicyDisabled(clusterName),
Expand All @@ -304,7 +302,6 @@ func TestAccContainerCluster_withNetworkPolicyEnabled(t *testing.T) {
ImportStateIdPrefix: "us-central1-a/",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"remove_default_node_pool"},
},
{
Config: testAccContainerCluster_withNetworkPolicyConfigDisabled(clusterName),
Expand All @@ -318,7 +315,6 @@ func TestAccContainerCluster_withNetworkPolicyEnabled(t *testing.T) {
ImportStateIdPrefix: "us-central1-a/",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"remove_default_node_pool"},
},
{
Config: testAccContainerCluster_withNetworkPolicyConfigDisabled(clusterName),
Expand Down Expand Up @@ -1214,7 +1210,6 @@ func TestAccContainerCluster_withDefaultNodePoolRemoved(t *testing.T) {
ImportStateIdPrefix: "us-central1-a/",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"remove_default_node_pool"},
},
},
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -577,3 +577,8 @@ $ terraform import google_container_cluster.mycluster my-gcp-project/us-east1-a/
$ terraform import google_container_cluster.mycluster us-east1-a/my-cluster
```

~> **Note:** This resource has several convenience fields that are state-only or used on creation and are not persisted by the API. If you have these fields set in config and import a cluster, you may see diffs that may or may not require actual operations against the resource. Example behavior:

- `min_master_version` will not be set on import and will show a no-op diff if set in config.
- `remove_default_node_pool`: If the default node pool exists at import, this value will be set to false in state (or true if non-existant). If set to true in config but the node pool exists, a follow-up diff/apply will delete the default node pool.

0 comments on commit 03a2f5d

Please sign in to comment.