Skip to content

Commit 424ad4d

Browse files
Resource_container_cluster : check node_version and min_master_version on create (#9602) (#16817)
* added verification for min_master_version == node_version when creating a cluster when running terraform plan * Added unit test, refactored function * Added more extensive unit tests * Added more test cases to the unit tests [upstream:c1b0db390ba4ee0fa37c330a46dc8a5d05df48a1] Signed-off-by: Modular Magician <[email protected]>
1 parent d4f084a commit 424ad4d

File tree

4 files changed

+172
-0
lines changed

4 files changed

+172
-0
lines changed

.changelog/9602.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
container: added check that node_version and min_master_version are the same on create, when running terraform plan
3+
```

google/services/container/resource_container_cluster.go

+30
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ func ResourceContainerCluster() *schema.Resource {
191191
containerClusterNetworkPolicyEmptyCustomizeDiff,
192192
containerClusterSurgeSettingsCustomizeDiff,
193193
containerClusterEnableK8sBetaApisCustomizeDiff,
194+
containerClusterNodeVersionCustomizeDiff,
194195
),
195196

196197
Timeouts: &schema.ResourceTimeout{
@@ -5883,3 +5884,32 @@ func containerClusterEnableK8sBetaApisCustomizeDiffFunc(d tpgresource.TerraformR
58835884

58845885
return nil
58855886
}
5887+
5888+
func containerClusterNodeVersionCustomizeDiff(_ context.Context, diff *schema.ResourceDiff, meta interface{}) error {
5889+
// separate func to allow unit testing
5890+
return containerClusterNodeVersionCustomizeDiffFunc(diff)
5891+
}
5892+
5893+
func containerClusterNodeVersionCustomizeDiffFunc(diff tpgresource.TerraformResourceDiff) error {
5894+
oldValueName, _ := diff.GetChange("name")
5895+
if oldValueName != "" {
5896+
return nil
5897+
}
5898+
5899+
_, newValueNode := diff.GetChange("node_version")
5900+
_, newValueMaster := diff.GetChange("min_master_version")
5901+
5902+
if newValueNode == "" || newValueMaster == "" {
5903+
return nil
5904+
}
5905+
5906+
//ignore -gke.X suffix for now. If it becomes a problem later, we can fix it
5907+
masterVersion := strings.Split(newValueMaster.(string), "-")[0]
5908+
nodeVersion := strings.Split(newValueNode.(string), "-")[0]
5909+
5910+
if masterVersion != nodeVersion {
5911+
return fmt.Errorf("Resource argument node_version (value: %s) must either be unset or set to the same value as min_master_version (value: %s) on create.", newValueNode, newValueMaster)
5912+
}
5913+
5914+
return nil
5915+
}

google/services/container/resource_container_cluster_internal_test.go

+106
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,109 @@ func TestContainerClusterEnableK8sBetaApisCustomizeDiff(t *testing.T) {
102102
}
103103
}
104104
}
105+
106+
func TestContainerCluster_NodeVersionCustomizeDiff(t *testing.T) {
107+
t.Parallel()
108+
109+
cases := map[string]struct {
110+
BeforeName string
111+
AfterName string
112+
MasterVersion string
113+
NodeVersion string
114+
ExpectError bool
115+
}{
116+
"Master version and node version are exactly the same": {
117+
BeforeName: "",
118+
AfterName: "test",
119+
MasterVersion: "1.10.9-gke.5",
120+
NodeVersion: "1.10.9-gke.5",
121+
ExpectError: false,
122+
},
123+
"Master version and node version have the same Kubernetes patch version but not the same gke-N suffix ": {
124+
BeforeName: "",
125+
AfterName: "test",
126+
MasterVersion: "1.10.9-gke.5",
127+
NodeVersion: "1.10.9-gke.9",
128+
ExpectError: false,
129+
},
130+
"Master version and node version have different minor versions": {
131+
BeforeName: "",
132+
AfterName: "test",
133+
MasterVersion: "1.10.9-gke.5",
134+
NodeVersion: "1.11.6-gke.11",
135+
ExpectError: true,
136+
},
137+
"Master version and node version have different Kubernetes Patch Versions": {
138+
BeforeName: "",
139+
AfterName: "test",
140+
MasterVersion: "1.10.9-gke.5",
141+
NodeVersion: "1.10.6-gke.11",
142+
ExpectError: true,
143+
},
144+
"Master version is not set, but node version is": {
145+
BeforeName: "",
146+
AfterName: "test",
147+
MasterVersion: "",
148+
NodeVersion: "1.10.6-gke.11",
149+
ExpectError: false,
150+
},
151+
"Node version is not set, but master version is": {
152+
BeforeName: "",
153+
AfterName: "test",
154+
MasterVersion: "1.10.6-gke.11",
155+
NodeVersion: "",
156+
ExpectError: false,
157+
},
158+
"Node version and master version match, both do not have -gke.X suffix": {
159+
BeforeName: "",
160+
AfterName: "test",
161+
MasterVersion: "1.10.6",
162+
NodeVersion: "1.10.6",
163+
ExpectError: false,
164+
},
165+
"Node version and master version do not match, both do not have -gke.X suffix": {
166+
BeforeName: "",
167+
AfterName: "test",
168+
MasterVersion: "1.10.6",
169+
NodeVersion: "1.11.6",
170+
ExpectError: true,
171+
},
172+
"Node version and master version do not match, node version has -gke.X suffix but master version doesn't": {
173+
BeforeName: "",
174+
AfterName: "test",
175+
MasterVersion: "1.11.6",
176+
NodeVersion: "1.10.6-gke.11",
177+
ExpectError: true,
178+
},
179+
"Diff is executed in non-create scenario, master version and node version do not match": {
180+
BeforeName: "test",
181+
AfterName: "test-1",
182+
MasterVersion: "1.11.6-gke.11",
183+
NodeVersion: "1.10.6-gke.11",
184+
ExpectError: false,
185+
},
186+
}
187+
188+
for tn, tc := range cases {
189+
d := &tpgresource.ResourceDiffMock{
190+
Before: map[string]interface{}{
191+
"name": tc.BeforeName,
192+
"min_master_version": "",
193+
"node_version": "",
194+
},
195+
After: map[string]interface{}{
196+
"name": tc.AfterName,
197+
"min_master_version": tc.MasterVersion,
198+
"node_version": tc.NodeVersion,
199+
},
200+
}
201+
err := containerClusterNodeVersionCustomizeDiffFunc(d)
202+
203+
if tc.ExpectError && err == nil {
204+
t.Errorf("%s failed, expected error but was none", tn)
205+
}
206+
if !tc.ExpectError && err != nil {
207+
t.Errorf("%s failed, found unexpected error: %s", tn, err)
208+
}
209+
}
210+
}

google/services/container/resource_container_cluster_test.go

+33
Original file line numberDiff line numberDiff line change
@@ -3545,6 +3545,25 @@ func TestAccContainerCluster_withEnableKubernetesBetaAPIsOnExistingCluster(t *te
35453545
})
35463546
}
35473547

3548+
func TestAccContainerCluster_withIncompatibleMasterVersionNodeVersion(t *testing.T) {
3549+
t.Parallel()
3550+
3551+
clusterName := fmt.Sprintf("tf-test-cluster-%s", acctest.RandString(t, 10))
3552+
3553+
acctest.VcrTest(t, resource.TestCase{
3554+
PreCheck: func() { acctest.AccTestPreCheck(t) },
3555+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
3556+
CheckDestroy: testAccCheckContainerClusterDestroyProducer(t),
3557+
Steps: []resource.TestStep{
3558+
{
3559+
Config: testAccContainerCluster_withIncompatibleMasterVersionNodeVersion(clusterName),
3560+
PlanOnly: true,
3561+
ExpectError: regexp.MustCompile(`Resource argument node_version`),
3562+
},
3563+
},
3564+
})
3565+
}
3566+
35483567
func TestAccContainerCluster_withIPv4Error(t *testing.T) {
35493568
t.Parallel()
35503569

@@ -3739,6 +3758,20 @@ resource "google_container_cluster" "primary" {
37393758
`, resource_name)
37403759
}
37413760

3761+
func testAccContainerCluster_withIncompatibleMasterVersionNodeVersion(name string) string {
3762+
return fmt.Sprintf(`
3763+
resource "google_container_cluster" "gke_cluster" {
3764+
name = "%s"
3765+
location = "us-central1"
3766+
3767+
min_master_version = "1.10.9-gke.5"
3768+
node_version = "1.10.6-gke.11"
3769+
initial_node_count = 1
3770+
3771+
}
3772+
`, name)
3773+
}
3774+
37423775
func testAccContainerCluster_SetSecurityPostureToStandard(resource_name, networkName, subnetworkName string) string {
37433776
return fmt.Sprintf(`
37443777
resource "google_container_cluster" "with_security_posture_config" {

0 commit comments

Comments
 (0)