Skip to content

Commit f27d1ce

Browse files
committed
Migrate to server-side applies by default
1 parent adf37d2 commit f27d1ce

File tree

5 files changed

+206
-55
lines changed

5 files changed

+206
-55
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ terraform.d
44
crash.log
55
dist/
66
kustomize/test_kustomizations/helm/remote/
7+
.vscode/

kustomize/manifest.go

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ import (
1313
k8serrors "k8s.io/apimachinery/pkg/api/errors"
1414
k8smeta "k8s.io/apimachinery/pkg/api/meta"
1515
k8smetav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16-
1716
k8sunstructured "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1817
k8sruntime "k8s.io/apimachinery/pkg/runtime"
1918
k8sschema "k8s.io/apimachinery/pkg/runtime/schema"
2019
k8stypes "k8s.io/apimachinery/pkg/types"
20+
k8smetav1ac "k8s.io/client-go/applyconfigurations/meta/v1"
2121
k8sdynamic "k8s.io/client-go/dynamic"
2222
"k8s.io/client-go/restmapper"
2323
)
@@ -85,16 +85,18 @@ func emptyToUnderscore(value string) string {
8585
}
8686

8787
type kManifest struct {
88-
resource *k8sunstructured.Unstructured
89-
mapper *restmapper.DeferredDiscoveryRESTMapper
90-
client k8sdynamic.Interface
91-
json []byte
88+
resource *k8sunstructured.Unstructured
89+
mapper *restmapper.DeferredDiscoveryRESTMapper
90+
extractor k8smetav1ac.UnstructuredExtractor
91+
client k8sdynamic.Interface
92+
json []byte
9293
}
9394

94-
func newKManifest(mapper *restmapper.DeferredDiscoveryRESTMapper, client k8sdynamic.Interface) *kManifest {
95+
func newKManifest(m *restmapper.DeferredDiscoveryRESTMapper, c k8sdynamic.Interface, e k8smetav1ac.UnstructuredExtractor) *kManifest {
9596
return &kManifest{
96-
mapper: mapper,
97-
client: client,
97+
mapper: m,
98+
client: c,
99+
extractor: e,
98100
}
99101
}
100102

@@ -204,6 +206,15 @@ func (km *kManifest) apiDelete(opts k8smetav1.DeleteOptions) (err error) {
204206
return api.Delete(context.TODO(), km.name(), opts)
205207
}
206208

209+
func (km *kManifest) apiApply(opts k8smetav1.ApplyOptions) (resp *k8sunstructured.Unstructured, err error) {
210+
api, err := km.api()
211+
if err != nil {
212+
return resp, km.fmtErr(fmt.Errorf("create failed: %s", err))
213+
}
214+
215+
return api.Apply(context.TODO(), km.name(), km.resource, opts)
216+
}
217+
207218
func (km *kManifest) apiPreparePatch(kmo *kManifest, currAllowNotFound bool) (pt k8stypes.PatchType, p []byte, err error) {
208219
original := kmo.json
209220
modified := km.json
@@ -253,7 +264,7 @@ func (km *kManifest) getNamespaceManifest() (kns *kManifest, namespaced bool) {
253264
return kns, false
254265
}
255266

256-
kns = newKManifest(km.mapper, km.client)
267+
kns = newKManifest(km.mapper, km.client, km.extractor)
257268

258269
kns.resource = kns.resource.NewEmptyInstance().(*k8sunstructured.Unstructured)
259270

kustomize/provider.go

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
99

10+
metav1ac "k8s.io/client-go/applyconfigurations/meta/v1"
1011
"k8s.io/client-go/discovery"
1112
"k8s.io/client-go/discovery/cached/memory"
1213
"k8s.io/client-go/dynamic"
@@ -22,8 +23,11 @@ import (
2223
type Config struct {
2324
Client dynamic.Interface
2425
Mapper *restmapper.DeferredDiscoveryRESTMapper
26+
Extractor metav1ac.UnstructuredExtractor
2527
Mutex *sync.Mutex
2628
GzipLastAppliedConfig bool
29+
ServerSideApply bool
30+
ServerSideApplyForce bool
2731
}
2832

2933
// Provider ...
@@ -75,6 +79,18 @@ func Provider() *schema.Provider {
7579
Default: true,
7680
Description: "When 'true' compress the lastAppliedConfig annotation for resources that otherwise would exceed K8s' max annotation size. All other resources use the regular uncompressed annotation. Set to 'false' to disable compression entirely.",
7781
},
82+
"server_side_apply": {
83+
Type: schema.TypeBool,
84+
Optional: true,
85+
Default: true,
86+
Description: "When 'true' use server-side apply.",
87+
},
88+
"server_side_apply_force": {
89+
Type: schema.TypeBool,
90+
Optional: true,
91+
Default: true,
92+
Description: "When 'true' the server-side apply will overwrite any managed fields that another owner has claimed.",
93+
},
7894
},
7995
}
8096

@@ -134,16 +150,33 @@ func Provider() *schema.Provider {
134150
return nil, fmt.Errorf("provider kustomization: %s", err)
135151
}
136152

137-
mapper := restmapper.NewDeferredDiscoveryRESTMapper(memory.NewMemCacheClient(dc))
153+
cDc := memory.NewMemCacheClient(dc)
154+
155+
mapper := restmapper.NewDeferredDiscoveryRESTMapper(cDc)
156+
157+
extractor, err := metav1ac.NewUnstructuredExtractor(cDc)
158+
if err != nil {
159+
return nil, fmt.Errorf("provider kustomization: %s", err)
160+
}
138161

139162
// Mutex to prevent parallel Kustomizer runs
140163
// temp workaround for upstream bug
141164
// https://github.com/kubernetes-sigs/kustomize/issues/3659
142165
mu := &sync.Mutex{}
143166

144167
gzipLastAppliedConfig := d.Get("gzip_last_applied_config").(bool)
145-
146-
return &Config{client, mapper, mu, gzipLastAppliedConfig}, nil
168+
serverSideApply := d.Get("server_side_apply").(bool)
169+
serverSideApplyForce := d.Get("server_side_apply_force").(bool)
170+
171+
return &Config{
172+
Client: client,
173+
Mapper: mapper,
174+
Extractor: extractor,
175+
Mutex: mu,
176+
GzipLastAppliedConfig: gzipLastAppliedConfig,
177+
ServerSideApply: serverSideApply,
178+
ServerSideApplyForce: serverSideApplyForce,
179+
}, nil
147180
}
148181

149182
return p

0 commit comments

Comments
 (0)