Skip to content

Commit 4641827

Browse files
authored
FIX resources state migration should migrate empty array (#1126)
* FIX resources state migration should migrate empty array * Update deployment regression test to include empty limits block
1 parent 4676478 commit 4641827

File tree

3 files changed

+111
-11
lines changed

3 files changed

+111
-11
lines changed

kubernetes/resource_kubernetes_deployment_test.go

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -994,7 +994,6 @@ func TestAccKubernetesDeployment_with_host_aliases(t *testing.T) {
994994
func TestAccKubernetesDeployment_regression(t *testing.T) {
995995
var conf1, conf2 appsv1.Deployment
996996
name := fmt.Sprintf("tf-acc-test-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
997-
imageName := nginxImageVersion
998997

999998
resource.Test(t, resource.TestCase{
1000999
PreCheck: func() { testAccPreCheck(t) },
@@ -1004,13 +1003,13 @@ func TestAccKubernetesDeployment_regression(t *testing.T) {
10041003
CheckDestroy: testAccCheckKubernetesDeploymentDestroy,
10051004
Steps: []resource.TestStep{
10061005
{
1007-
Config: requiredProviders() + testAccKubernetesDeploymentConfig_beforeUpdate(name, imageName),
1006+
Config: requiredProviders() + testAccKubernetesDeploymentConfig_beforeUpdate(name, nginxImageVersion, busyboxImageVersion),
10081007
Check: resource.ComposeAggregateTestCheckFunc(
10091008
testAccCheckKubernetesDeploymentExists("kubernetes_deployment.test", &conf1),
10101009
),
10111010
},
10121011
{
1013-
Config: requiredProviders() + testAccKubernetesDeploymentConfig_afterUpdate(name, imageName),
1012+
Config: requiredProviders() + testAccKubernetesDeploymentConfig_afterUpdate(name, nginxImageVersion, busyboxImageVersion),
10141013
Check: resource.ComposeAggregateTestCheckFunc(
10151014
testAccCheckKubernetesDeploymentExists("kubernetes_deployment.test", &conf2),
10161015
testAccCheckKubernetesDeploymentForceNew(&conf1, &conf2, false),
@@ -2689,7 +2688,7 @@ func testAccKubernetesDeploymentConfigWithResourceFieldSelector(rcName, imageNam
26892688
`, rcName, imageName, resourceName, divisor)
26902689
}
26912690

2692-
func testAccKubernetesDeploymentConfig_beforeUpdate(name, imageName string) string {
2691+
func testAccKubernetesDeploymentConfig_beforeUpdate(name, nginxImage, busyboxImage string) string {
26932692
return fmt.Sprintf(`resource "kubernetes_deployment" "test" {
26942693
provider = kubernetes-released
26952694
metadata {
@@ -2715,11 +2714,27 @@ func testAccKubernetesDeploymentConfig_beforeUpdate(name, imageName string) stri
27152714
27162715
resources {
27172716
limits {
2718-
memory = "512M"
2717+
memory = "128Mi"
27192718
cpu = "1"
27202719
}
27212720
requests {
2722-
memory = "256M"
2721+
memory = "64Mi"
2722+
cpu = "50m"
2723+
}
2724+
}
2725+
}
2726+
container {
2727+
image = "%s"
2728+
name = "tf-acc-test-no-limits"
2729+
2730+
command = [
2731+
"sleep",
2732+
"infinity"
2733+
]
2734+
2735+
resources {
2736+
requests {
2737+
memory = "32Mi"
27232738
cpu = "50m"
27242739
}
27252740
}
@@ -2728,10 +2743,10 @@ func testAccKubernetesDeploymentConfig_beforeUpdate(name, imageName string) stri
27282743
}
27292744
}
27302745
}
2731-
`, name, imageName)
2746+
`, name, nginxImage, busyboxImage)
27322747
}
27332748

2734-
func testAccKubernetesDeploymentConfig_afterUpdate(name, imageName string) string {
2749+
func testAccKubernetesDeploymentConfig_afterUpdate(name, nginxImage, busyboxImage string) string {
27352750
return fmt.Sprintf(`resource "kubernetes_deployment" "test" {
27362751
provider = kubernetes-local
27372752
metadata {
@@ -2757,11 +2772,27 @@ func testAccKubernetesDeploymentConfig_afterUpdate(name, imageName string) strin
27572772
27582773
resources {
27592774
limits = {
2760-
memory = "512M"
2775+
memory = "128Mi"
27612776
cpu = "1"
27622777
}
27632778
requests = {
2764-
memory = "256M"
2779+
memory = "64Mi"
2780+
cpu = "50m"
2781+
}
2782+
}
2783+
}
2784+
container {
2785+
image = "%s"
2786+
name = "tf-acc-test-no-limits"
2787+
2788+
command = [
2789+
"sleep",
2790+
"infinity"
2791+
]
2792+
2793+
resources {
2794+
requests = {
2795+
memory = "32Mi"
27652796
cpu = "50m"
27662797
}
27672798
}
@@ -2770,5 +2801,5 @@ func testAccKubernetesDeploymentConfig_afterUpdate(name, imageName string) strin
27702801
}
27712802
}
27722803
}
2773-
`, name, imageName)
2804+
`, name, nginxImage, busyboxImage)
27742805
}

kubernetes/schema_resources_migrate.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package kubernetes
22

33
import (
44
"context"
5+
56
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
67
)
78

@@ -120,10 +121,15 @@ func upgradeContainers(rawState map[string]interface{}) map[string]interface{} {
120121
if req, ok := resources["requests"].([]interface{}); ok && len(req) > 0 {
121122
requests := req[0].(map[string]interface{})
122123
resources["requests"] = requests
124+
} else {
125+
resources["requests"] = map[string]interface{}{}
123126
}
127+
124128
if lim, ok := resources["limits"].([]interface{}); ok && len(lim) > 0 {
125129
limits := lim[0].(map[string]interface{})
126130
resources["limits"] = limits
131+
} else {
132+
resources["limits"] = map[string]interface{}{}
127133
}
128134
}
129135
}
@@ -136,10 +142,15 @@ func upgradeContainers(rawState map[string]interface{}) map[string]interface{} {
136142
if req, ok := resources["requests"].([]interface{}); ok && len(req) > 0 {
137143
requests := req[0].(map[string]interface{})
138144
resources["requests"] = requests
145+
} else {
146+
resources["requests"] = map[string]interface{}{}
139147
}
148+
140149
if lim, ok := resources["limits"].([]interface{}); ok && len(lim) > 0 {
141150
limits := lim[0].(map[string]interface{})
142151
resources["limits"] = limits
152+
} else {
153+
resources["limits"] = map[string]interface{}{}
143154
}
144155
}
145156
}

kubernetes/schema_resources_migrate_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,61 @@ func TestUpgradeTemplatePodSpecWithResourcesFieldV0(t *testing.T) {
135135
t.Fatalf("\n\nexpected:\n\n%#v\n\ngot:\n\n%#v\n\n", v1, actual)
136136
}
137137
}
138+
139+
func TestUpgradeTemplatePodSpecWithResourcesFieldV0_empty(t *testing.T) {
140+
v0 := map[string]interface{}{
141+
"spec": []interface{}{map[string]interface{}{
142+
"template": []interface{}{map[string]interface{}{
143+
"spec": []interface{}{map[string]interface{}{
144+
"init_container": []interface{}{
145+
map[string]interface{}{
146+
"resources": []interface{}{map[string]interface{}{
147+
"requests": []interface{}{},
148+
"limits": []interface{}{},
149+
}},
150+
},
151+
},
152+
"container": []interface{}{
153+
map[string]interface{}{
154+
"resources": []interface{}{map[string]interface{}{
155+
"requests": []interface{}{},
156+
"limits": []interface{}{},
157+
}},
158+
},
159+
},
160+
}},
161+
}},
162+
}},
163+
}
164+
165+
v1 := map[string]interface{}{
166+
"spec": []interface{}{map[string]interface{}{
167+
"template": []interface{}{map[string]interface{}{
168+
"spec": []interface{}{map[string]interface{}{
169+
"init_container": []interface{}{
170+
map[string]interface{}{
171+
"resources": []interface{}{map[string]interface{}{
172+
"requests": map[string]interface{}{},
173+
"limits": map[string]interface{}{},
174+
}},
175+
},
176+
},
177+
"container": []interface{}{
178+
map[string]interface{}{
179+
"resources": []interface{}{map[string]interface{}{
180+
"requests": map[string]interface{}{},
181+
"limits": map[string]interface{}{},
182+
}},
183+
},
184+
},
185+
}},
186+
}},
187+
}},
188+
}
189+
190+
actual, _ := upgradeTemplatePodSpecWithResourcesFieldV0(context.TODO(), v0, nil)
191+
192+
if !reflect.DeepEqual(v1, actual) {
193+
t.Fatalf("\n\nexpected:\n\n%#v\n\ngot:\n\n%#v\n\n", v1, actual)
194+
}
195+
}

0 commit comments

Comments
 (0)