From 6a3e3c3a717a64df13f5d73af01d71b156eccde5 Mon Sep 17 00:00:00 2001 From: Jingfang Liu Date: Thu, 23 Aug 2018 12:23:55 -0700 Subject: [PATCH] Add JSONPatch to kustomization --- pkg/app/application.go | 11 +++++++++-- pkg/types/jsonpatch.go | 39 ++++++++++++++++++++++++++++++++++++++ pkg/types/kustomization.go | 11 +++++++++-- 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 pkg/types/jsonpatch.go diff --git a/pkg/app/application.go b/pkg/app/application.go index 32e7d052d..5a2145b85 100644 --- a/pkg/app/application.go +++ b/pkg/app/application.go @@ -22,6 +22,7 @@ import ( "bytes" "encoding/json" "fmt" + "log" "github.com/ghodss/yaml" "github.com/golang/glog" @@ -61,7 +62,12 @@ func NewApplication(ldr loader.Loader, fSys fs.FileSystem) (*Application, error) if err != nil { return nil, err } - + if m.PatchesJson6902 != nil { + log.Printf("field patchesJson6902 ignored; no implementation yet.") + } + if m.Patches != nil { + log.Println("field patches will be deprecated, please change it to patchesStategicMerge") + } return &Application{kustomization: &m, ldr: ldr, fSys: fSys}, nil } @@ -150,7 +156,8 @@ func (a *Application) loadCustomizedResMap() (resmap.ResMap, error) { return nil, err } - patches, err := resmap.NewResourceSliceFromPatches(a.ldr, a.kustomization.Patches) + a.kustomization.PatchesStrategicMerge = append(a.kustomization.PatchesStrategicMerge, a.kustomization.Patches...) + patches, err := resmap.NewResourceSliceFromPatches(a.ldr, a.kustomization.PatchesStrategicMerge) if err != nil { errs.Append(errors.Wrap(err, "NewResourceSliceFromPatches")) } diff --git a/pkg/types/jsonpatch.go b/pkg/types/jsonpatch.go new file mode 100644 index 000000000..81efbbf91 --- /dev/null +++ b/pkg/types/jsonpatch.go @@ -0,0 +1,39 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package types + +// JSONPatch represents a json patch for an object +type JSONPatch struct { + // Relative file path within the kustomization for a json patch file. + Path string `json:"path" yaml:"path"` + + // Target refers to a Kubernetes object that the json patch will be + // applied to. It must refer to a Kubernetes resource under the + // purview of this kustomization. Target should use the + // raw name of the object (the name specified in its YAML, + // before addition of a namePrefix). + Target PatchTarget `json:"target" yaml:"target"` +} + +// PatchTarget represents the kubernetes object that the patch is applied to +type PatchTarget struct { + Group string `json:"group,omitempty" yaml:"group,omitempty"` + Version string `json:"version,omitempty" yaml:"version,omitempty"` + Kind string `json:"kind,omitempty" yaml:"kind,omitempty"` + Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` + Name string `json:"name" yaml:"name"` +} diff --git a/pkg/types/kustomization.go b/pkg/types/kustomization.go index 3a5807eda..beb6920eb 100644 --- a/pkg/types/kustomization.go +++ b/pkg/types/kustomization.go @@ -56,8 +56,15 @@ type Kustomization struct { // An Patch entry is very similar to an Resource entry. // It specifies the relative paths for patch files within the package. - // URLs and globs are not supported - Patches []string `json:"patches,omitempty" yaml:"patches,omitempty"` + // URLs and globs are not supported. + // The patch files should be Stategic Merge Patch, the default patching behavior for kubectl. + // https://github.com/kubernetes/community/blob/master/contributors/devel/strategic-merge-patch.md + Patches []string `json:"patches,omitempty" yaml:"patches,omitempty"` + PatchesStrategicMerge []string `json:"patchesSrategicMerge,omitempty" yaml:"patchesStategicMerge,omitempty"` + + // JSONPatches is a list of JSONPatch for applying JSON patch. + // The JSON patch is documented at http://jsonpatch.com/. + PatchesJson6902 []JSONPatch `json:"patchesJson6902,omitempty" yaml:"patchesJson6902,omitempty"` // List of configmaps to generate from configuration sources. // Base/overlay concept doesn't apply to this field.