@@ -38,6 +38,7 @@ import (
3838 policyv1 "k8s.io/api/policy/v1"
3939 apierrors "k8s.io/apimachinery/pkg/api/errors"
4040 "k8s.io/apimachinery/pkg/api/meta"
41+ "k8s.io/apimachinery/pkg/api/validation"
4142 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
4243 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
4344 "k8s.io/apimachinery/pkg/runtime"
@@ -1101,6 +1102,26 @@ U5wwSivyi7vmegHKmblOzNVKA5qPO8zWzqBC
11011102 Expect (secret .Data ).To (BeComparableTo (data ))
11021103 Expect (secret .Data ).To (BeComparableTo (secretApplyConfiguration .Data ))
11031104 })
1105+
1106+ It ("should propagate a typed error" , func (ctx SpecContext ) {
1107+ cl , err := client .New (cfg , client.Options {})
1108+ Expect (err ).NotTo (HaveOccurred ())
1109+ Expect (cl ).NotTo (BeNil ())
1110+
1111+ obj := corev1applyconfigurations .
1112+ Secret ("typed-secret" , "default" ).
1113+ WithType (corev1 .SecretTypeDockercfg ).
1114+ WithStringData (map [string ]string {".dockercfg" : "{}" })
1115+
1116+ err = cl .Apply (ctx , obj , & client.ApplyOptions {FieldManager : "test-manager" })
1117+ Expect (err ).ToNot (HaveOccurred ())
1118+
1119+ obj = corev1applyconfigurations .
1120+ Secret (* obj .Name , * obj .Namespace ).
1121+ WithType (corev1 .SecretTypeOpaque )
1122+ err = cl .Apply (ctx , obj , & client.ApplyOptions {FieldManager : "test-manager" })
1123+ Expect (isImmutableError (err )).To (BeTrue ())
1124+ })
11041125 })
11051126 })
11061127
@@ -4433,3 +4454,8 @@ func toUnstructured(o client.Object) (*unstructured.Unstructured, error) {
44334454 u := & unstructured.Unstructured {}
44344455 return u , json .Unmarshal (serialized , u )
44354456}
4457+
4458+ func isImmutableError (err error ) bool {
4459+ return apierrors .IsInvalid (err ) &&
4460+ strings .Contains (err .Error (), validation .FieldImmutableErrorMsg )
4461+ }
0 commit comments