Skip to content

Commit 0993d1b

Browse files
Resource_container_cluster : check node_version and min_master_version on create (#9602) (#6763)
* 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 eed0cef commit 0993d1b

File tree

4 files changed

+172
-0
lines changed

4 files changed

+172
-0
lines changed

.changelog/9602.txt

Lines changed: 3 additions & 0 deletions
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-beta/services/container/resource_container_cluster.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ func ResourceContainerCluster() *schema.Resource {
195195
containerClusterNetworkPolicyEmptyCustomizeDiff,
196196
containerClusterSurgeSettingsCustomizeDiff,
197197
containerClusterEnableK8sBetaApisCustomizeDiff,
198+
containerClusterNodeVersionCustomizeDiff,
198199
),
199200

200201
Timeouts: &schema.ResourceTimeout{
@@ -6410,3 +6411,32 @@ func containerClusterEnableK8sBetaApisCustomizeDiffFunc(d tpgresource.TerraformR
64106411

64116412
return nil
64126413
}
6414+
6415+
func containerClusterNodeVersionCustomizeDiff(_ context.Context, diff *schema.ResourceDiff, meta interface{}) error {
6416+
// separate func to allow unit testing
6417+
return containerClusterNodeVersionCustomizeDiffFunc(diff)
6418+
}
6419+
6420+
func containerClusterNodeVersionCustomizeDiffFunc(diff tpgresource.TerraformResourceDiff) error {
6421+
oldValueName, _ := diff.GetChange("name")
6422+
if oldValueName != "" {
6423+
return nil
6424+
}
6425+
6426+
_, newValueNode := diff.GetChange("node_version")
6427+
_, newValueMaster := diff.GetChange("min_master_version")
6428+
6429+
if newValueNode == "" || newValueMaster == "" {
6430+
return nil
6431+
}
6432+
6433+
//ignore -gke.X suffix for now. If it becomes a problem later, we can fix it
6434+
masterVersion := strings.Split(newValueMaster.(string), "-")[0]
6435+
nodeVersion := strings.Split(newValueNode.(string), "-")[0]
6436+
6437+
if masterVersion != nodeVersion {
6438+
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)
6439+
}
6440+
6441+
return nil
6442+
}

google-beta/services/container/resource_container_cluster_internal_test.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,3 +184,109 @@ func TestContainerClusterEnableK8sBetaApisCustomizeDiff(t *testing.T) {
184184
}
185185
}
186186
}
187+
188+
func TestContainerCluster_NodeVersionCustomizeDiff(t *testing.T) {
189+
t.Parallel()
190+
191+
cases := map[string]struct {
192+
BeforeName string
193+
AfterName string
194+
MasterVersion string
195+
NodeVersion string
196+
ExpectError bool
197+
}{
198+
"Master version and node version are exactly the same": {
199+
BeforeName: "",
200+
AfterName: "test",
201+
MasterVersion: "1.10.9-gke.5",
202+
NodeVersion: "1.10.9-gke.5",
203+
ExpectError: false,
204+
},
205+
"Master version and node version have the same Kubernetes patch version but not the same gke-N suffix ": {
206+
BeforeName: "",
207+
AfterName: "test",
208+
MasterVersion: "1.10.9-gke.5",
209+
NodeVersion: "1.10.9-gke.9",
210+
ExpectError: false,
211+
},
212+
"Master version and node version have different minor versions": {
213+
BeforeName: "",
214+
AfterName: "test",
215+
MasterVersion: "1.10.9-gke.5",
216+
NodeVersion: "1.11.6-gke.11",
217+
ExpectError: true,
218+
},
219+
"Master version and node version have different Kubernetes Patch Versions": {
220+
BeforeName: "",
221+
AfterName: "test",
222+
MasterVersion: "1.10.9-gke.5",
223+
NodeVersion: "1.10.6-gke.11",
224+
ExpectError: true,
225+
},
226+
"Master version is not set, but node version is": {
227+
BeforeName: "",
228+
AfterName: "test",
229+
MasterVersion: "",
230+
NodeVersion: "1.10.6-gke.11",
231+
ExpectError: false,
232+
},
233+
"Node version is not set, but master version is": {
234+
BeforeName: "",
235+
AfterName: "test",
236+
MasterVersion: "1.10.6-gke.11",
237+
NodeVersion: "",
238+
ExpectError: false,
239+
},
240+
"Node version and master version match, both do not have -gke.X suffix": {
241+
BeforeName: "",
242+
AfterName: "test",
243+
MasterVersion: "1.10.6",
244+
NodeVersion: "1.10.6",
245+
ExpectError: false,
246+
},
247+
"Node version and master version do not match, both do not have -gke.X suffix": {
248+
BeforeName: "",
249+
AfterName: "test",
250+
MasterVersion: "1.10.6",
251+
NodeVersion: "1.11.6",
252+
ExpectError: true,
253+
},
254+
"Node version and master version do not match, node version has -gke.X suffix but master version doesn't": {
255+
BeforeName: "",
256+
AfterName: "test",
257+
MasterVersion: "1.11.6",
258+
NodeVersion: "1.10.6-gke.11",
259+
ExpectError: true,
260+
},
261+
"Diff is executed in non-create scenario, master version and node version do not match": {
262+
BeforeName: "test",
263+
AfterName: "test-1",
264+
MasterVersion: "1.11.6-gke.11",
265+
NodeVersion: "1.10.6-gke.11",
266+
ExpectError: false,
267+
},
268+
}
269+
270+
for tn, tc := range cases {
271+
d := &tpgresource.ResourceDiffMock{
272+
Before: map[string]interface{}{
273+
"name": tc.BeforeName,
274+
"min_master_version": "",
275+
"node_version": "",
276+
},
277+
After: map[string]interface{}{
278+
"name": tc.AfterName,
279+
"min_master_version": tc.MasterVersion,
280+
"node_version": tc.NodeVersion,
281+
},
282+
}
283+
err := containerClusterNodeVersionCustomizeDiffFunc(d)
284+
285+
if tc.ExpectError && err == nil {
286+
t.Errorf("%s failed, expected error but was none", tn)
287+
}
288+
if !tc.ExpectError && err != nil {
289+
t.Errorf("%s failed, found unexpected error: %s", tn, err)
290+
}
291+
}
292+
}

google-beta/services/container/resource_container_cluster_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4058,6 +4058,25 @@ func TestAccContainerCluster_withEnableKubernetesBetaAPIsOnExistingCluster(t *te
40584058
})
40594059
}
40604060

4061+
func TestAccContainerCluster_withIncompatibleMasterVersionNodeVersion(t *testing.T) {
4062+
t.Parallel()
4063+
4064+
clusterName := fmt.Sprintf("tf-test-cluster-%s", acctest.RandString(t, 10))
4065+
4066+
acctest.VcrTest(t, resource.TestCase{
4067+
PreCheck: func() { acctest.AccTestPreCheck(t) },
4068+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
4069+
CheckDestroy: testAccCheckContainerClusterDestroyProducer(t),
4070+
Steps: []resource.TestStep{
4071+
{
4072+
Config: testAccContainerCluster_withIncompatibleMasterVersionNodeVersion(clusterName),
4073+
PlanOnly: true,
4074+
ExpectError: regexp.MustCompile(`Resource argument node_version`),
4075+
},
4076+
},
4077+
})
4078+
}
4079+
40614080
func TestAccContainerCluster_withIPv4Error(t *testing.T) {
40624081
t.Parallel()
40634082

@@ -4348,6 +4367,20 @@ resource "google_container_cluster" "primary" {
43484367
`, resource_name)
43494368
}
43504369

4370+
func testAccContainerCluster_withIncompatibleMasterVersionNodeVersion(name string) string {
4371+
return fmt.Sprintf(`
4372+
resource "google_container_cluster" "gke_cluster" {
4373+
name = "%s"
4374+
location = "us-central1"
4375+
4376+
min_master_version = "1.10.9-gke.5"
4377+
node_version = "1.10.6-gke.11"
4378+
initial_node_count = 1
4379+
4380+
}
4381+
`, name)
4382+
}
4383+
43514384
func testAccContainerCluster_SetSecurityPostureToStandard(resource_name, networkName, subnetworkName string) string {
43524385
return fmt.Sprintf(`
43534386
resource "google_container_cluster" "with_security_posture_config" {

0 commit comments

Comments
 (0)