Skip to content

Commit 6898407

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

File tree

6 files changed

+100
-1
lines changed

6 files changed

+100
-1
lines changed

kustomize/resource_kustomization.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"os"
78
"strings"
89
"time"
910

@@ -14,7 +15,7 @@ import (
1415
k8smeta "k8s.io/apimachinery/pkg/api/meta"
1516
k8smetav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1617
k8sschema "k8s.io/apimachinery/pkg/runtime/schema"
17-
"k8s.io/apimachinery/pkg/util/validation/field"
18+
"k8s.io/apimachinery/pkg/util/validation/field"
1819
)
1920

2021
func kustomizationResource() *schema.Resource {
@@ -272,6 +273,14 @@ func kustomizationResourceDiff(ctx context.Context, d *schema.ResourceDiff, m in
272273
return nil
273274
}
274275

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

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)