Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ terraform.d
crash.log
dist/
kustomize/test_kustomizations/helm/remote/
.vscode/
4 changes: 2 additions & 2 deletions kustomize/data_source_kustomization_build_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ func TestAccDataSourceKustomization_helmChart(t *testing.T) {
resource.TestCheckResourceAttr("data.kustomization_build.test", "ids.#", "5"),
resource.TestCheckResourceAttr("data.kustomization_build.test", "ids_prio.#", "3"),
resource.TestCheckResourceAttr("data.kustomization_build.test", "manifests.%", "5"),
resource.TestCheckOutput("service", "{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"creationTimestamp\":null,\"labels\":{\"app\":\"nginx\"},\"name\":\"nginx\",\"namespace\":\"test-basic\"},\"spec\":{\"ports\":[{\"name\":\"http\",\"port\":80,\"protocol\":\"TCP\",\"targetPort\":80}],\"selector\":{\"app\":\"nginx\"},\"type\":\"ClusterIP\"},\"status\":{\"loadBalancer\":{}}}"),
resource.TestCheckOutput("deployment", "{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\":{\"creationTimestamp\":null,\"labels\":{\"app\":\"nginx\"},\"name\":\"nginx\",\"namespace\":\"test-basic\"},\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"app\":\"nginx\"}},\"strategy\":{},\"template\":{\"metadata\":{\"creationTimestamp\":null,\"labels\":{\"app\":\"nginx\"}},\"spec\":{\"containers\":[{\"image\":\"nginx:6.0.10\",\"name\":\"test-basic\",\"resources\":{}}]}}},\"status\":{}}"),
resource.TestCheckOutput("service", "{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"labels\":{\"app\":\"nginx\"},\"name\":\"nginx\",\"namespace\":\"test-basic\"},\"spec\":{\"ports\":[{\"name\":\"http\",\"port\":80,\"protocol\":\"TCP\",\"targetPort\":80}],\"selector\":{\"app\":\"nginx\"},\"type\":\"ClusterIP\"}}"),
resource.TestCheckOutput("deployment", "{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\":{\"labels\":{\"app\":\"nginx\"},\"name\":\"nginx\",\"namespace\":\"test-basic\"},\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"app\":\"nginx\"}},\"template\":{\"metadata\":{\"labels\":{\"app\":\"nginx\"}},\"spec\":{\"containers\":[{\"image\":\"nginx:6.0.10\",\"name\":\"test-basic\"}]}}}}"),
),
},
},
Expand Down
52 changes: 26 additions & 26 deletions kustomize/data_source_kustomization_overlay_test.go

Large diffs are not rendered by default.

29 changes: 20 additions & 9 deletions kustomize/manifest.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ import (
k8serrors "k8s.io/apimachinery/pkg/api/errors"
k8smeta "k8s.io/apimachinery/pkg/api/meta"
k8smetav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

k8sunstructured "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
k8sruntime "k8s.io/apimachinery/pkg/runtime"
k8sschema "k8s.io/apimachinery/pkg/runtime/schema"
k8stypes "k8s.io/apimachinery/pkg/types"
k8smetav1ac "k8s.io/client-go/applyconfigurations/meta/v1"
k8sdynamic "k8s.io/client-go/dynamic"
"k8s.io/client-go/restmapper"
)
Expand Down Expand Up @@ -85,16 +85,18 @@ func emptyToUnderscore(value string) string {
}

type kManifest struct {
resource *k8sunstructured.Unstructured
mapper *restmapper.DeferredDiscoveryRESTMapper
client k8sdynamic.Interface
json []byte
resource *k8sunstructured.Unstructured
mapper *restmapper.DeferredDiscoveryRESTMapper
extractor k8smetav1ac.UnstructuredExtractor
client k8sdynamic.Interface
json []byte
}

func newKManifest(mapper *restmapper.DeferredDiscoveryRESTMapper, client k8sdynamic.Interface) *kManifest {
func newKManifest(m *restmapper.DeferredDiscoveryRESTMapper, c k8sdynamic.Interface, e k8smetav1ac.UnstructuredExtractor) *kManifest {
return &kManifest{
mapper: mapper,
client: client,
mapper: m,
client: c,
extractor: e,
}
}

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

func (km *kManifest) apiApply(opts k8smetav1.ApplyOptions) (resp *k8sunstructured.Unstructured, err error) {
api, err := km.api()
if err != nil {
return resp, km.fmtErr(fmt.Errorf("create failed: %s", err))
}

return api.Apply(context.TODO(), km.name(), km.resource, opts)
}

func (km *kManifest) apiPreparePatch(kmo *kManifest, currAllowNotFound bool) (pt k8stypes.PatchType, p []byte, err error) {
original := kmo.json
modified := km.json
Expand Down Expand Up @@ -253,7 +264,7 @@ func (km *kManifest) getNamespaceManifest() (kns *kManifest, namespaced bool) {
return kns, false
}

kns = newKManifest(km.mapper, km.client)
kns = newKManifest(km.mapper, km.client, km.extractor)

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

Expand Down
39 changes: 36 additions & 3 deletions kustomize/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

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

metav1ac "k8s.io/client-go/applyconfigurations/meta/v1"
"k8s.io/client-go/discovery"
"k8s.io/client-go/discovery/cached/memory"
"k8s.io/client-go/dynamic"
Expand All @@ -22,8 +23,11 @@ import (
type Config struct {
Client dynamic.Interface
Mapper *restmapper.DeferredDiscoveryRESTMapper
Extractor metav1ac.UnstructuredExtractor
Mutex *sync.Mutex
GzipLastAppliedConfig bool
ServerSideApply bool
ServerSideApplyForce bool
}

// Provider ...
Expand Down Expand Up @@ -75,6 +79,18 @@ func Provider() *schema.Provider {
Default: true,
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.",
},
"server_side_apply": {
Type: schema.TypeBool,
Optional: true,
Default: true,
Description: "When 'true' use server-side apply.",
},
"server_side_apply_force": {
Type: schema.TypeBool,
Optional: true,
Default: true,
Description: "When 'true' the server-side apply will overwrite any managed fields that another owner has claimed.",
},
},
}

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

mapper := restmapper.NewDeferredDiscoveryRESTMapper(memory.NewMemCacheClient(dc))
cDc := memory.NewMemCacheClient(dc)

mapper := restmapper.NewDeferredDiscoveryRESTMapper(cDc)

extractor, err := metav1ac.NewUnstructuredExtractor(cDc)
if err != nil {
return nil, fmt.Errorf("provider kustomization: %s", err)
}

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

gzipLastAppliedConfig := d.Get("gzip_last_applied_config").(bool)

return &Config{client, mapper, mu, gzipLastAppliedConfig}, nil
serverSideApply := d.Get("server_side_apply").(bool)
serverSideApplyForce := d.Get("server_side_apply_force").(bool)

return &Config{
Client: client,
Mapper: mapper,
Extractor: extractor,
Mutex: mu,
GzipLastAppliedConfig: gzipLastAppliedConfig,
ServerSideApply: serverSideApply,
ServerSideApplyForce: serverSideApplyForce,
}, nil
}

return p
Expand Down
Loading
Loading