Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions commands/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ After creating a cluster, a configuration context is added to kubectl and made a
AddBoolFlag(cmdKubeClusterCreate, doctl.ArgSurgeUpgrade, "", true,
"Enables surge-upgrade for the cluster")
AddBoolFlag(cmdKubeClusterCreate, doctl.ArgHA, "", false,
"Creates the cluster with a highly-available control plane. Defaults to false. To enable the HA control plane, supply --ha=true.")
"Creates the cluster with a highly-available control plane. When omitted, API applies version-specific default (true for 1.36.0+; false for older). Use --ha to enable, --ha=false to disable.")
AddBoolFlag(cmdKubeClusterCreate, doctl.ArgEnableControlPlaneFirewall, "", false,
"Creates the cluster with control plane firewall enabled. Defaults to false. To enable the control plane firewall, supply --enable-control-plane-firewall=true.")
AddStringSliceFlag(cmdKubeClusterCreate, doctl.ArgControlPlaneFirewallAllowedAddresses, "", nil,
Expand Down Expand Up @@ -1706,7 +1706,7 @@ func buildClusterCreateRequestFromArgs(c *CmdConfig, r *godo.KubernetesClusterCr
}
r.SurgeUpgrade = surgeUpgrade

ha, err := c.Doit.GetBool(c.NS, doctl.ArgHA)
ha, err := c.Doit.GetBoolPtr(c.NS, doctl.ArgHA)
if err != nil {
return err
}
Expand Down
41 changes: 39 additions & 2 deletions commands/kubernetes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,7 @@ func TestKubernetesCreate(t *testing.T) {
Day: godo.KubernetesMaintenanceDayAny,
},
AutoUpgrade: true,
HA: true,
HA: boolPtr(true),
ControlPlaneFirewall: &godo.KubernetesControlPlaneFirewall{
Enabled: boolPtr(true),
AllowedAddresses: []string{
Expand Down Expand Up @@ -571,7 +571,7 @@ func TestKubernetesCreate(t *testing.T) {
),
})
config.Doit.Set(config.NS, doctl.ArgAutoUpgrade, testCluster.AutoUpgrade)
config.Doit.Set(config.NS, doctl.ArgHA, testCluster.HA)
config.Doit.Set(config.NS, doctl.ArgHA, true)

config.Doit.Set(config.NS, doctl.ArgEnableControlPlaneFirewall, testCluster.ControlPlaneFirewall.Enabled)
config.Doit.Set(config.NS, doctl.ArgControlPlaneFirewallAllowedAddresses, testCluster.ControlPlaneFirewall.AllowedAddresses)
Expand Down Expand Up @@ -617,6 +617,43 @@ func TestKubernetesCreate(t *testing.T) {
err = testK8sCmdService().RunKubernetesClusterCreate("c-8", 3)(config)
assert.NoError(t, err)
})

// Test HA omitted: when ArgHA is not set, the create request has HA: nil (API applies version-specific default).
withTestClient(t, func(config *CmdConfig, tm *tcMocks) {
clusterName := "ha-omit-cluster"
r := godo.KubernetesClusterCreateRequest{
Name: clusterName,
RegionSlug: "sfo2",
VersionSlug: "1.13.0",
NodePools: []*godo.KubernetesNodePoolCreateRequest{
{
Name: clusterName + "-default-pool",
Size: "s-1vcpu-2gb",
Count: 3,
},
},
MaintenancePolicy: &godo.KubernetesMaintenancePolicy{
StartTime: "00:00",
Day: godo.KubernetesMaintenanceDayAny,
},
AutoUpgrade: false,
SurgeUpgrade: true,
HA: nil, // omitted when --ha not passed
}
tm.kubernetes.EXPECT().Create(&r).Return(&testCluster, nil)

config.Args = append(config.Args, clusterName)
config.Doit.Set(config.NS, doctl.ArgRegionSlug, "sfo2")
config.Doit.Set(config.NS, doctl.ArgClusterVersionSlug, "1.13.0")
config.Doit.Set(config.NS, doctl.ArgSizeSlug, "s-1vcpu-2gb")
config.Doit.Set(config.NS, doctl.ArgNodePoolCount, 3)
config.Doit.Set(config.NS, doctl.ArgMaintenanceWindow, "any=00:00")
config.Doit.Set(config.NS, doctl.ArgSurgeUpgrade, true)
// Do NOT set ArgHA - simulates user omitting --ha

err := testK8sCmdService().RunKubernetesClusterCreate("s-1vcpu-2gb", 3)(config)
assert.NoError(t, err)
})
}

func TestKubernetesUpdate(t *testing.T) {
Expand Down
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -132,3 +132,6 @@ require (
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
)

// Use local godo for development (e.g. when testing HA *bool changes)
replace github.com/digitalocean/godo => ../godo
105 changes: 105 additions & 0 deletions integration/kubernetes_clusters_create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ var _ = suite("kubernetes/clusters/create", func(t *testing.T, when spec.G, it s
if strings.Contains(string(reqBody), "some-node-pool-cluster") {
matchedRequest = kubeNodePoolCreateJSONReq
}
if strings.Contains(string(reqBody), "some-non-ha-cluster") {
matchedRequest = kubeClustersCreateNonHAJSONReq
}
// When --ha is omitted, request has no "ha" field; API applies version-specific default
if strings.Contains(string(reqBody), "some-cluster-name") && !strings.Contains(string(reqBody), `"ha"`) {
matchedRequest = kubeClustersCreateJSONReqOmitHA
}

expect.JSONEq(string(reqBody), matchedRequest)

Expand Down Expand Up @@ -116,6 +123,61 @@ var _ = suite("kubernetes/clusters/create", func(t *testing.T, when spec.G, it s
expect.NoError(err, fmt.Sprintf("received error output: %s", output))
expect.Equal(strings.TrimSpace(fmt.Sprintf(kubeClustersCreateOutput, f.Name())), strings.TrimSpace(string(output)))
})

it("creates a kube cluster with HA defaulting to true when --ha is omitted", func() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do these integration tests actually create clusters? If so, then let's remove the extra integration tests before merging this PR - we can't afford to e2e or integration test for every combination of cluster fields.

f, err := os.CreateTemp(t.TempDir(), "fake-kube-config")
expect.NoError(err)

err = f.Close()
expect.NoError(err)

cmd := exec.Command(builtBinaryPath,
"-t", "some-magic-token",
"-u", server.URL,
"kubernetes",
"clusters",
"create",
"some-cluster-name",
"--region", "mars",
"--version", "some-kube-version",
"--1-clicks", "slug1",
)

cmd.Env = append(os.Environ(),
fmt.Sprintf("KUBECONFIG=%s", f.Name()),
)

output, err := cmd.CombinedOutput()
expect.NoError(err, fmt.Sprintf("received error output: %s", output))
expect.Equal(strings.TrimSpace(fmt.Sprintf(kubeClustersCreateOutput, f.Name())), strings.TrimSpace(string(output)))
})

it("creates a kube cluster with HA disabled when --ha=false", func() {
f, err := os.CreateTemp(t.TempDir(), "fake-kube-config")
expect.NoError(err)

err = f.Close()
expect.NoError(err)

cmd := exec.Command(builtBinaryPath,
"-t", "some-magic-token",
"-u", server.URL,
"kubernetes",
"clusters",
"create",
"some-non-ha-cluster",
"--region", "mars",
"--version", "some-kube-version",
"--ha=false",
)

cmd.Env = append(os.Environ(),
fmt.Sprintf("KUBECONFIG=%s", f.Name()),
)

output, err := cmd.CombinedOutput()
expect.NoError(err, fmt.Sprintf("received error output: %s", output))
})
})

when("using node-pool", func() {
Expand Down Expand Up @@ -239,6 +301,49 @@ some-cluster-id some-cluster-name mars some-kube-version false
}
]
}
`
kubeClustersCreateJSONReqOmitHA = `
{
"name": "some-cluster-name",
"region": "mars",
"version": "some-kube-version",
"auto_upgrade": false,
"surge_upgrade": true,
"maintenance_policy": {
"day": "any",
"duration": "",
"start_time": "00:00"
},
"node_pools": [
{
"size": "s-1vcpu-2gb-intel",
"count": 3,
"name": "some-cluster-name-default-pool"
}
]
}
`
kubeClustersCreateNonHAJSONReq = `
{
"name": "some-non-ha-cluster",
"region": "mars",
"version": "some-kube-version",
"auto_upgrade": false,
"surge_upgrade": true,
"ha": false,
"maintenance_policy": {
"day": "any",
"duration": "",
"start_time": "00:00"
},
"node_pools": [
{
"size": "s-1vcpu-2gb-intel",
"count": 3,
"name": "some-non-ha-cluster-default-pool"
}
]
}
`
kubeNodePoolCreateJSONReq = `
{
Expand Down
9 changes: 9 additions & 0 deletions vendor/github.com/digitalocean/godo/CHANGELOG.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

49 changes: 49 additions & 0 deletions vendor/github.com/digitalocean/godo/apps.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading