Skip to content

Commit 7d81ca1

Browse files
committed
Handle storage class immutable fields with force new plan fix #194
1 parent d8f6811 commit 7d81ca1

File tree

6 files changed

+99
-1
lines changed

6 files changed

+99
-1
lines changed

kustomize/resource_kustomization.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
k8smeta "k8s.io/apimachinery/pkg/api/meta"
1515
k8smetav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1616
k8sschema "k8s.io/apimachinery/pkg/runtime/schema"
17-
"k8s.io/apimachinery/pkg/util/validation/field"
17+
"k8s.io/apimachinery/pkg/util/validation/field"
1818
)
1919

2020
func kustomizationResource() *schema.Resource {
@@ -272,6 +272,14 @@ func kustomizationResourceDiff(ctx context.Context, d *schema.ResourceDiff, m in
272272
return nil
273273
}
274274

275+
// if cause is updates to storage class provisioner or parameters are forbidden force a delete and re-create plan
276+
if k8serrors.HasStatusCause(err, k8smetav1.CauseType(field.ErrorTypeForbidden)) {
277+
if strings.HasSuffix(msg, ": updates to provisioner are forbidden.") || strings.HasPrefix(msg, "Forbidden: updates to parameters are forbidden") {
278+
d.ForceNew("manifest")
279+
return nil
280+
}
281+
}
282+
275283
}
276284
}
277285

kustomize/resource_kustomization_test.go

+45
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,51 @@ resource "kustomization_resource" "rb" {
445445
`
446446
}
447447

448+
//
449+
//
450+
// Update_Recreate_StorageClass Test
451+
func TestAccResourceKustomization_updateRecreateStorageClass(t *testing.T) {
452+
453+
resource.Test(t, resource.TestCase{
454+
Providers: testAccProviders,
455+
Steps: []resource.TestStep{
456+
//
457+
//
458+
// Applying initial storage class
459+
{
460+
Config: testAccResourceKustomizationConfig_updateRecreateStorageClassProvisioner("test_kustomizations/update_recreate_storage_class/initial"),
461+
Check: resource.ComposeAggregateTestCheckFunc(
462+
resource.TestCheckResourceAttrSet("kustomization_resource.scparam", "id"),
463+
resource.TestCheckResourceAttrSet("kustomization_resource.scprov", "id"),
464+
),
465+
},
466+
//
467+
//
468+
// Applying changed storage class
469+
{
470+
Config: testAccResourceKustomizationConfig_updateRecreateStorageClassProvisioner("test_kustomizations/update_recreate_storage_class/modified"),
471+
Check: resource.ComposeAggregateTestCheckFunc(
472+
resource.TestCheckResourceAttrSet("kustomization_resource.scparam", "id"),
473+
resource.TestCheckResourceAttrSet("kustomization_resource.scprov", "id"),
474+
),
475+
},
476+
},
477+
})
478+
}
479+
480+
func testAccResourceKustomizationConfig_updateRecreateStorageClassProvisioner(path string) string {
481+
return testAccDataSourceKustomizationConfig_basic(path) + `
482+
resource "kustomization_resource" "scparam" {
483+
manifest = data.kustomization_build.test.manifests["storage.k8s.io/StorageClass/_/local-storage-parameters"]
484+
}
485+
486+
resource "kustomization_resource" "scprov" {
487+
manifest = data.kustomization_build.test.manifests["storage.k8s.io/StorageClass/_/local-storage-provisioner"]
488+
}
489+
490+
`
491+
}
492+
448493
//
449494
//
450495
// Upgrade_API_Version Test
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
apiVersion: kustomize.config.k8s.io/v1beta1
2+
kind: Kustomization
3+
4+
resources:
5+
- storage-class-parameters.yaml
6+
- storage-class-provisioner.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
apiVersion: storage.k8s.io/v1
2+
kind: StorageClass
3+
metadata:
4+
name: local-storage-parameters
5+
provisioner: kubernetes.io/no-provisioner
6+
volumeBindingMode: WaitForFirstConsumer
7+
parameters:
8+
test: test
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
apiVersion: storage.k8s.io/v1
2+
kind: StorageClass
3+
metadata:
4+
name: local-storage-provisioner
5+
provisioner: kubernetes.io/no-provisioner
6+
volumeBindingMode: WaitForFirstConsumer
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
apiVersion: kustomize.config.k8s.io/v1beta1
2+
kind: Kustomization
3+
4+
resources:
5+
- ../initial
6+
7+
patches:
8+
- patch: |
9+
- op: replace
10+
path: /parameters/test
11+
value: test2
12+
target:
13+
group: "storage.k8s.io"
14+
version: v1
15+
kind: StorageClass
16+
name: local-storage-parameters
17+
- patch: |
18+
- op: replace
19+
path: /provisioner
20+
value: example.com/external-nfs
21+
target:
22+
group: "storage.k8s.io"
23+
version: v1
24+
kind: StorageClass
25+
name: local-storage-provisioner

0 commit comments

Comments
 (0)