mirror of https://github.com/k3s-io/k3s
commit
9eebfe7a04
|
@ -4343,113 +4343,113 @@
|
|||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/commands/build",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/constants",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/expansion",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/factory",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/fs",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/git",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/gvk",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/ifc",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/ifc/transformer",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/image",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/internal/error",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/loader",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/patch",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/patch/transformer",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/resid",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/resmap",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/resource",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/target",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/transformers",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/transformers/config",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/types",
|
||||
"Comment": "v2.0.1",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Comment": "v2.0.3",
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/structured-merge-diff/fieldpath",
|
||||
|
|
|
@ -716,91 +716,91 @@
|
|||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/commands/build",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/constants",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/expansion",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/factory",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/fs",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/git",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/gvk",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/ifc",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/ifc/transformer",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/image",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/internal/error",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/loader",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/patch",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/patch/transformer",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/resid",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/resmap",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/resource",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/target",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/transformers",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/transformers/config",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/types",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/yaml",
|
||||
|
|
|
@ -666,7 +666,7 @@ func TestKustomizeDirectoryBuilder(t *testing.T) {
|
|||
{
|
||||
directory: "../../../artifacts/guestbook",
|
||||
expectErr: true,
|
||||
errMsg: "No kustomization file found",
|
||||
errMsg: "unable to find one of 'kustomization.yaml', 'kustomization.yml' or 'Kustomization'",
|
||||
},
|
||||
{
|
||||
directory: dir,
|
||||
|
|
|
@ -81,8 +81,8 @@ func (f *ConfigMapFactory) MakeConfigMap(
|
|||
}
|
||||
all = append(all, pairs...)
|
||||
|
||||
for _, kv := range all {
|
||||
err = addKvToConfigMap(cm, kv.Key, kv.Value)
|
||||
for _, p := range all {
|
||||
err = addKvToConfigMap(cm, p.Key, p.Value)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
@ -80,8 +80,8 @@ func (f *SecretFactory) MakeSecret(args *types.SecretArgs, options *types.Genera
|
|||
}
|
||||
all = append(all, pairs...)
|
||||
|
||||
for _, kv := range all {
|
||||
err = addKvToSecret(s, kv.Key, kv.Value)
|
||||
for _, p := range all {
|
||||
err = addKvToSecret(s, p.Key, p.Value)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
@ -108,7 +108,7 @@ func (kf *KunstructuredFactoryImpl) validate(u unstructured.Unstructured) error
|
|||
kind := u.GetKind()
|
||||
if kind == "" {
|
||||
return fmt.Errorf("missing kind in object %v", u)
|
||||
} else if kind == "List" {
|
||||
} else if strings.HasSuffix(kind, "List") {
|
||||
return nil
|
||||
}
|
||||
if u.GetName() == "" {
|
||||
|
|
|
@ -42,6 +42,15 @@ func TestSliceFromBytes(t *testing.T) {
|
|||
testConfigMap.Map(),
|
||||
},
|
||||
})
|
||||
testConfigMapList := factory.FromMap(
|
||||
map[string]interface{}{
|
||||
"apiVersion": "v1",
|
||||
"kind": "ConfigMapList",
|
||||
"items": []interface{}{
|
||||
testConfigMap.Map(),
|
||||
testConfigMap.Map(),
|
||||
},
|
||||
})
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
|
@ -151,6 +160,24 @@ items:
|
|||
expectedOut: []ifc.Kunstructured{testList},
|
||||
expectedErr: false,
|
||||
},
|
||||
{
|
||||
name: "ConfigMapList",
|
||||
input: []byte(`
|
||||
apiVersion: v1
|
||||
kind: ConfigMapList
|
||||
items:
|
||||
- apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: winnie
|
||||
- apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: winnie
|
||||
`),
|
||||
expectedOut: []ifc.Kunstructured{testConfigMapList},
|
||||
expectedErr: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
|
|
|
@ -60,7 +60,7 @@ func (pt *patchTransformer) Transform(baseResourceMap resmap.ResMap) error {
|
|||
for _, patch := range patches {
|
||||
// Merge patches with base resource.
|
||||
id := patch.Id()
|
||||
matchedIds := baseResourceMap.FindByGVKN(id)
|
||||
matchedIds := baseResourceMap.GetMatchingIds(id.GvknEquals)
|
||||
if len(matchedIds) == 0 {
|
||||
return fmt.Errorf("failed to find an object with %s to apply the patch", id.GvknString())
|
||||
}
|
||||
|
|
|
@ -740,91 +740,91 @@
|
|||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/commands/build",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/constants",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/expansion",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/factory",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/fs",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/git",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/gvk",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/ifc",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/ifc/transformer",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/image",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/internal/error",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/loader",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/patch",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/patch/transformer",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/resid",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/resmap",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/resource",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/target",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/transformers",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/transformers/config",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/kustomize/pkg/types",
|
||||
"Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3"
|
||||
"Rev": "a6f65144121d1955266b0cd836ce954c04122dc8"
|
||||
},
|
||||
{
|
||||
"ImportPath": "sigs.k8s.io/yaml",
|
||||
|
|
|
@ -108,7 +108,7 @@ func (o *Options) RunBuild(
|
|||
return err
|
||||
}
|
||||
defer ldr.Cleanup()
|
||||
kt, err := target.NewKustTarget(ldr, fSys, rf, ptf)
|
||||
kt, err := target.NewKustTarget(ldr, rf, ptf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -36,15 +36,17 @@ func syntaxWrap(input string) string {
|
|||
// implements the expansion semantics defined in the expansion spec; it
|
||||
// returns the input string wrapped in the expansion syntax if no mapping
|
||||
// for the input is found.
|
||||
func MappingFuncFor(context ...map[string]string) func(string) string {
|
||||
func MappingFuncFor(
|
||||
counts map[string]int,
|
||||
context ...map[string]string) func(string) string {
|
||||
return func(input string) string {
|
||||
for _, vars := range context {
|
||||
val, ok := vars[input]
|
||||
if ok {
|
||||
counts[input]++
|
||||
return val
|
||||
}
|
||||
}
|
||||
|
||||
return syntaxWrap(input)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ import (
|
|||
// that was confirmed to point to an existing directory.
|
||||
type ConfirmedDir string
|
||||
|
||||
// Return a temporary dir, else error.
|
||||
// NewTmpConfirmedDir returns a temporary dir, else error.
|
||||
// The directory is cleaned, no symlinks, etc. so its
|
||||
// returned as a ConfirmedDir.
|
||||
func NewTmpConfirmedDir() (ConfirmedDir, error) {
|
||||
|
@ -34,7 +34,15 @@ func NewTmpConfirmedDir() (ConfirmedDir, error) {
|
|||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return ConfirmedDir(n), nil
|
||||
|
||||
// In MacOs `ioutil.TempDir` creates a directory
|
||||
// with root in the `/var` folder, which is in turn a symlinked path
|
||||
// to `/private/var`.
|
||||
// Function `filepath.EvalSymlinks`is used to
|
||||
// resolve the real absolute path.
|
||||
deLinked, err := filepath.EvalSymlinks(n)
|
||||
return ConfirmedDir(deLinked), err
|
||||
|
||||
}
|
||||
|
||||
// HasPrefix returns true if the directory argument
|
||||
|
|
|
@ -24,6 +24,13 @@ import (
|
|||
"sigs.k8s.io/kustomize/pkg/fs"
|
||||
)
|
||||
|
||||
// Used as a temporary non-empty occupant of the cloneDir
|
||||
// field, as something distinguishable from the empty string
|
||||
// in various outputs (especially tests). Not using an
|
||||
// actual directory name here, as that's a temporary directory
|
||||
// with a unique name that isn't created until clone time.
|
||||
const notCloned = fs.ConfirmedDir("/notCloned")
|
||||
|
||||
// RepoSpec specifies a git repository and a branch and path therein.
|
||||
type RepoSpec struct {
|
||||
// Raw, original spec, used to look for cycles.
|
||||
|
@ -88,7 +95,7 @@ func NewRepoSpecFromUrl(n string) (*RepoSpec, error) {
|
|||
}
|
||||
return &RepoSpec{
|
||||
raw: n, host: host, orgRepo: orgRepo,
|
||||
path: path, ref: gitRef}, nil
|
||||
cloneDir: notCloned, path: path, ref: gitRef}, nil
|
||||
}
|
||||
|
||||
const (
|
||||
|
|
|
@ -73,6 +73,8 @@ var order = []string{
|
|||
"Namespace",
|
||||
"StorageClass",
|
||||
"CustomResourceDefinition",
|
||||
"MutatingWebhookConfiguration",
|
||||
"ValidatingWebhookConfiguration",
|
||||
"ServiceAccount",
|
||||
"Role",
|
||||
"ClusterRole",
|
||||
|
|
|
@ -5,7 +5,6 @@ go_library(
|
|||
srcs = [
|
||||
"factory.go",
|
||||
"patchjson6902json.go",
|
||||
"util.go",
|
||||
],
|
||||
importmap = "k8s.io/kubernetes/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer",
|
||||
importpath = "sigs.k8s.io/kustomize/pkg/patch/transformer",
|
||||
|
@ -13,6 +12,7 @@ go_library(
|
|||
deps = [
|
||||
"//vendor/github.com/evanphx/json-patch:go_default_library",
|
||||
"//vendor/github.com/ghodss/yaml:go_default_library",
|
||||
"//vendor/github.com/pkg/errors:go_default_library",
|
||||
"//vendor/sigs.k8s.io/kustomize/pkg/gvk:go_default_library",
|
||||
"//vendor/sigs.k8s.io/kustomize/pkg/ifc:go_default_library",
|
||||
"//vendor/sigs.k8s.io/kustomize/pkg/patch:go_default_library",
|
||||
|
|
|
@ -21,8 +21,6 @@ import (
|
|||
"sigs.k8s.io/kustomize/pkg/ifc"
|
||||
"sigs.k8s.io/kustomize/pkg/resid"
|
||||
|
||||
"github.com/evanphx/json-patch"
|
||||
"github.com/ghodss/yaml"
|
||||
"sigs.k8s.io/kustomize/pkg/gvk"
|
||||
"sigs.k8s.io/kustomize/pkg/patch"
|
||||
"sigs.k8s.io/kustomize/pkg/transformers"
|
||||
|
@ -77,19 +75,7 @@ func (f PatchJson6902Factory) makeOnePatchJson6902Transformer(p patch.Json6902)
|
|||
return nil, err
|
||||
}
|
||||
|
||||
if !isJsonFormat(rawOp) {
|
||||
// if it isn't JSON, try to parse it as YAML
|
||||
rawOp, err = yaml.YAMLToJSON(rawOp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
decodedPatch, err := jsonpatch.DecodePatch(rawOp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return newPatchJson6902JSONTransformer(targetId, decodedPatch)
|
||||
return newPatchJson6902JSONTransformer(targetId, rawOp)
|
||||
}
|
||||
|
||||
func isJsonFormat(data []byte) bool {
|
||||
|
|
|
@ -17,9 +17,14 @@ limitations under the License.
|
|||
package transformer
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/evanphx/json-patch"
|
||||
"github.com/ghodss/yaml"
|
||||
"github.com/pkg/errors"
|
||||
"sigs.k8s.io/kustomize/pkg/resid"
|
||||
"sigs.k8s.io/kustomize/pkg/resmap"
|
||||
"sigs.k8s.io/kustomize/pkg/resource"
|
||||
"sigs.k8s.io/kustomize/pkg/transformers"
|
||||
)
|
||||
|
||||
|
@ -27,22 +32,37 @@ import (
|
|||
type patchJson6902JSONTransformer struct {
|
||||
target resid.ResId
|
||||
patch jsonpatch.Patch
|
||||
rawOp []byte
|
||||
}
|
||||
|
||||
var _ transformers.Transformer = &patchJson6902JSONTransformer{}
|
||||
|
||||
// newPatchJson6902JSONTransformer constructs a PatchJson6902 transformer.
|
||||
func newPatchJson6902JSONTransformer(t resid.ResId, p jsonpatch.Patch) (transformers.Transformer, error) {
|
||||
if len(p) == 0 {
|
||||
func newPatchJson6902JSONTransformer(
|
||||
id resid.ResId, rawOp []byte) (transformers.Transformer, error) {
|
||||
op := rawOp
|
||||
var err error
|
||||
if !isJsonFormat(op) {
|
||||
// if it isn't JSON, try to parse it as YAML
|
||||
op, err = yaml.YAMLToJSON(rawOp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
decodedPatch, err := jsonpatch.DecodePatch(op)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(decodedPatch) == 0 {
|
||||
return transformers.NewNoOpTransformer(), nil
|
||||
}
|
||||
return &patchJson6902JSONTransformer{target: t, patch: p}, nil
|
||||
return &patchJson6902JSONTransformer{target: id, patch: decodedPatch, rawOp: rawOp}, nil
|
||||
}
|
||||
|
||||
// Transform apply the json patches on top of the base resources.
|
||||
func (t *patchJson6902JSONTransformer) Transform(baseResourceMap resmap.ResMap) error {
|
||||
obj, err := findTargetObj(baseResourceMap, t.target)
|
||||
if obj == nil {
|
||||
func (t *patchJson6902JSONTransformer) Transform(m resmap.ResMap) error {
|
||||
obj, err := t.findTargetObj(m)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
rawObj, err := obj.MarshalJSON()
|
||||
|
@ -51,7 +71,7 @@ func (t *patchJson6902JSONTransformer) Transform(baseResourceMap resmap.ResMap)
|
|||
}
|
||||
modifiedObj, err := t.patch.Apply(rawObj)
|
||||
if err != nil {
|
||||
return err
|
||||
return errors.Wrapf(err, "failed to apply json patch '%s'", string(t.rawOp))
|
||||
}
|
||||
err = obj.UnmarshalJSON(modifiedObj)
|
||||
if err != nil {
|
||||
|
@ -59,3 +79,30 @@ func (t *patchJson6902JSONTransformer) Transform(baseResourceMap resmap.ResMap)
|
|||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *patchJson6902JSONTransformer) findTargetObj(
|
||||
m resmap.ResMap) (*resource.Resource, error) {
|
||||
var matched []resid.ResId
|
||||
// TODO(monopole): namespace bug in json patch?
|
||||
// Since introduction in PR #300
|
||||
// (see pkg/patch/transformer/util.go),
|
||||
// this code has treated an empty namespace like a wildcard
|
||||
// rather than like an additional restriction to match
|
||||
// only the empty namespace. No test coverage to confirm.
|
||||
// Not sure if desired, keeping it for now.
|
||||
if t.target.Namespace() != "" {
|
||||
matched = m.GetMatchingIds(t.target.NsGvknEquals)
|
||||
} else {
|
||||
matched = m.GetMatchingIds(t.target.GvknEquals)
|
||||
}
|
||||
if len(matched) == 0 {
|
||||
return nil, fmt.Errorf(
|
||||
"couldn't find target %v for json patch", t.target)
|
||||
}
|
||||
if len(matched) > 1 {
|
||||
return nil, fmt.Errorf(
|
||||
"found multiple targets %v matching %v for json patch",
|
||||
matched, t.target)
|
||||
}
|
||||
return m[matched[0]], nil
|
||||
}
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
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 transformer
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"sigs.k8s.io/kustomize/pkg/resid"
|
||||
"sigs.k8s.io/kustomize/pkg/resmap"
|
||||
"sigs.k8s.io/kustomize/pkg/resource"
|
||||
)
|
||||
|
||||
func findTargetObj(m resmap.ResMap, targetId resid.ResId) (*resource.Resource, error) {
|
||||
matchedIds := m.FindByGVKN(targetId)
|
||||
if targetId.Namespace() != "" {
|
||||
var ids []resid.ResId
|
||||
for _, id := range matchedIds {
|
||||
if id.Namespace() == targetId.Namespace() {
|
||||
ids = append(ids, id)
|
||||
}
|
||||
}
|
||||
matchedIds = ids
|
||||
}
|
||||
|
||||
if len(matchedIds) == 0 {
|
||||
return nil, fmt.Errorf("couldn't find any object to apply the json patch %v", targetId)
|
||||
}
|
||||
if len(matchedIds) > 1 {
|
||||
return nil, fmt.Errorf("found multiple objects that the patch can apply %v", matchedIds)
|
||||
}
|
||||
return m[matchedIds[0]], nil
|
||||
}
|
|
@ -22,23 +22,30 @@ import (
|
|||
"sigs.k8s.io/kustomize/pkg/gvk"
|
||||
)
|
||||
|
||||
// ResId conflates GroupVersionKind with a textual name to uniquely identify a kubernetes resource (object).
|
||||
// ResId is an immutable identifier of a k8s resource object.
|
||||
type ResId struct {
|
||||
// Gvk of the resource.
|
||||
gvKind gvk.Gvk
|
||||
// original name of the resource before transformation.
|
||||
|
||||
// name of the resource before transformation.
|
||||
name string
|
||||
// namePrefix of the resource
|
||||
// an untransformed resource has no prefix, fully transformed resource has an arbitrary number of prefixes
|
||||
// concatenated together.
|
||||
|
||||
// namePrefix of the resource.
|
||||
// An untransformed resource has no prefix.
|
||||
// A fully transformed resource has an arbitrary
|
||||
// number of prefixes concatenated together.
|
||||
prefix string
|
||||
// nameSuffix of the resource
|
||||
// an untransformed resource has no suffix, fully transformed resource has an arbitrary number of suffixes
|
||||
// concatenated together.
|
||||
|
||||
// nameSuffix of the resource.
|
||||
// An untransformed resource has no suffix.
|
||||
// A fully transformed resource has an arbitrary
|
||||
// number of suffixes concatenated together.
|
||||
suffix string
|
||||
// namespace the resource belongs to
|
||||
// an untransformed resource has no namespace, fully transformed resource has the namespace from
|
||||
// the top most overlay
|
||||
|
||||
// Namespace the resource belongs to.
|
||||
// An untransformed resource has no namespace.
|
||||
// A fully transformed resource has the namespace
|
||||
// from the top most overlay.
|
||||
namespace string
|
||||
}
|
||||
|
||||
|
@ -108,10 +115,16 @@ func (n ResId) GvknString() string {
|
|||
return n.gvKind.String() + separator + n.name
|
||||
}
|
||||
|
||||
// GvknEquals return if two ResId have the same Group/Version/Kind and name
|
||||
// The comparison excludes prefix and suffix
|
||||
// GvknEquals returns true if the other id matches
|
||||
// Group/Version/Kind/name.
|
||||
func (n ResId) GvknEquals(id ResId) bool {
|
||||
return n.gvKind.Equals(id.gvKind) && n.name == id.name
|
||||
return n.name == id.name && n.gvKind.Equals(id.gvKind)
|
||||
}
|
||||
|
||||
// NsGvknEquals returns true if the other id matches
|
||||
// namespace/Group/Version/Kind/name.
|
||||
func (n ResId) NsGvknEquals(id ResId) bool {
|
||||
return n.namespace == id.namespace && n.GvknEquals(id)
|
||||
}
|
||||
|
||||
// Gvk returns Group/Version/Kind of the resource.
|
||||
|
|
|
@ -50,7 +50,7 @@ func (rmF *Factory) FromFiles(
|
|||
if err != nil {
|
||||
return nil, errors.Wrap(err, "Load from path "+path+" failed")
|
||||
}
|
||||
res, err := rmF.newResMapFromBytes(content)
|
||||
res, err := rmF.NewResMapFromBytes(content)
|
||||
if err != nil {
|
||||
return nil, internal.Handler(err, path)
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ func (rmF *Factory) FromFiles(
|
|||
}
|
||||
|
||||
// newResMapFromBytes decodes a list of objects in byte array format.
|
||||
func (rmF *Factory) newResMapFromBytes(b []byte) (ResMap, error) {
|
||||
func (rmF *Factory) NewResMapFromBytes(b []byte) (ResMap, error) {
|
||||
resources, err := rmF.resF.SliceFromBytes(b)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
@ -32,26 +32,20 @@ import (
|
|||
// ResMap is a map from ResId to Resource.
|
||||
type ResMap map[resid.ResId]*resource.Resource
|
||||
|
||||
// FindByGVKN find the matched ResIds by Group/Version/Kind and Name
|
||||
func (m ResMap) FindByGVKN(inputId resid.ResId) []resid.ResId {
|
||||
type IdMatcher func(resid.ResId) bool
|
||||
|
||||
// GetMatchingIds returns a slice of ResId keys from the map
|
||||
// that all satisfy the given matcher function.
|
||||
func (m ResMap) GetMatchingIds(matches IdMatcher) []resid.ResId {
|
||||
var result []resid.ResId
|
||||
for id := range m {
|
||||
if id.GvknEquals(inputId) {
|
||||
if matches(id) {
|
||||
result = append(result, id)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// DemandOneMatchForId find the matched resource by Group/Version/Kind and Name
|
||||
func (m ResMap) DemandOneMatchForId(inputId resid.ResId) (*resource.Resource, bool) {
|
||||
result := m.FindByGVKN(inputId)
|
||||
if len(result) == 1 {
|
||||
return m[result[0]], true
|
||||
}
|
||||
return nil, false
|
||||
}
|
||||
|
||||
// EncodeAsYaml encodes a ResMap to YAML; encoded objects separated by `---`.
|
||||
func (m ResMap) EncodeAsYaml() ([]byte, error) {
|
||||
var ids []resid.ResId
|
||||
|
@ -177,7 +171,7 @@ func MergeWithOverride(maps ...ResMap) (ResMap, error) {
|
|||
continue
|
||||
}
|
||||
for id, r := range m {
|
||||
matchedId := result.FindByGVKN(id)
|
||||
matchedId := result.GetMatchingIds(id.GvknEquals)
|
||||
if len(matchedId) == 1 {
|
||||
id = matchedId[0]
|
||||
switch r.Behavior() {
|
||||
|
|
|
@ -20,6 +20,7 @@ import (
|
|||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
"sigs.k8s.io/kustomize/pkg/ifc"
|
||||
internal "sigs.k8s.io/kustomize/pkg/internal/error"
|
||||
|
@ -94,10 +95,14 @@ func (rf *Factory) SliceFromBytes(in []byte) ([]*Resource, error) {
|
|||
for len(kunStructs) > 0 {
|
||||
u := kunStructs[0]
|
||||
kunStructs = kunStructs[1:]
|
||||
if u.GetKind() == "List" {
|
||||
if strings.HasSuffix(u.GetKind(), "List") {
|
||||
items := u.Map()["items"]
|
||||
itemsSlice, ok := items.([]interface{})
|
||||
if !ok {
|
||||
if items == nil {
|
||||
// an empty list
|
||||
continue
|
||||
}
|
||||
return nil, fmt.Errorf("items in List is type %T, expected array", items)
|
||||
}
|
||||
for _, item := range itemsSlice {
|
||||
|
|
|
@ -38,7 +38,7 @@ func (r *Resource) String() string {
|
|||
if err != nil {
|
||||
return "<" + err.Error() + ">"
|
||||
}
|
||||
return strings.TrimSpace(string(bs))
|
||||
return strings.TrimSpace(string(bs)) + r.options.String()
|
||||
}
|
||||
|
||||
// DeepCopy returns a new copy of resource
|
||||
|
|
|
@ -13,7 +13,6 @@ go_library(
|
|||
"//vendor/github.com/ghodss/yaml:go_default_library",
|
||||
"//vendor/github.com/pkg/errors:go_default_library",
|
||||
"//vendor/sigs.k8s.io/kustomize/pkg/constants:go_default_library",
|
||||
"//vendor/sigs.k8s.io/kustomize/pkg/fs:go_default_library",
|
||||
"//vendor/sigs.k8s.io/kustomize/pkg/ifc:go_default_library",
|
||||
"//vendor/sigs.k8s.io/kustomize/pkg/ifc/transformer:go_default_library",
|
||||
"//vendor/sigs.k8s.io/kustomize/pkg/internal/error:go_default_library",
|
||||
|
|
|
@ -26,7 +26,6 @@ import (
|
|||
"github.com/ghodss/yaml"
|
||||
"github.com/pkg/errors"
|
||||
"sigs.k8s.io/kustomize/pkg/constants"
|
||||
"sigs.k8s.io/kustomize/pkg/fs"
|
||||
"sigs.k8s.io/kustomize/pkg/ifc"
|
||||
"sigs.k8s.io/kustomize/pkg/ifc/transformer"
|
||||
interror "sigs.k8s.io/kustomize/pkg/internal/error"
|
||||
|
@ -42,7 +41,6 @@ import (
|
|||
type KustTarget struct {
|
||||
kustomization *types.Kustomization
|
||||
ldr ifc.Loader
|
||||
fSys fs.FileSystem
|
||||
rFactory *resmap.Factory
|
||||
tFactory transformer.Factory
|
||||
}
|
||||
|
@ -50,7 +48,6 @@ type KustTarget struct {
|
|||
// NewKustTarget returns a new instance of KustTarget primed with a Loader.
|
||||
func NewKustTarget(
|
||||
ldr ifc.Loader,
|
||||
fSys fs.FileSystem,
|
||||
rFactory *resmap.Factory,
|
||||
tFactory transformer.Factory) (*KustTarget, error) {
|
||||
content, err := loadKustFile(ldr)
|
||||
|
@ -70,12 +67,23 @@ func NewKustTarget(
|
|||
return &KustTarget{
|
||||
kustomization: &k,
|
||||
ldr: ldr,
|
||||
fSys: fSys,
|
||||
rFactory: rFactory,
|
||||
tFactory: tFactory,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func quoted(l []string) []string {
|
||||
r := make([]string, len(l))
|
||||
for i, v := range l {
|
||||
r[i] = "'" + v + "'"
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func commaOr(q []string) string {
|
||||
return strings.Join(q[:len(q)-1], ", ") + " or " + q[len(q)-1]
|
||||
}
|
||||
|
||||
func loadKustFile(ldr ifc.Loader) ([]byte, error) {
|
||||
var content []byte
|
||||
match := 0
|
||||
|
@ -88,8 +96,9 @@ func loadKustFile(ldr ifc.Loader) ([]byte, error) {
|
|||
}
|
||||
switch match {
|
||||
case 0:
|
||||
return nil, fmt.Errorf("No kustomization file found in %s. Kustomize supports the following kustomization files: %s",
|
||||
ldr.Root(), strings.Join(constants.KustomizationFileNames, ", "))
|
||||
return nil, fmt.Errorf(
|
||||
"unable to find one of %v in directory '%s'",
|
||||
commaOr(quoted(constants.KustomizationFileNames)), ldr.Root())
|
||||
case 1:
|
||||
return content, nil
|
||||
default:
|
||||
|
@ -110,7 +119,7 @@ func unmarshal(y []byte, o interface{}) error {
|
|||
// MakeCustomizedResMap creates a ResMap per kustomization instructions.
|
||||
// The Resources in the returned ResMap are fully customized.
|
||||
func (kt *KustTarget) MakeCustomizedResMap() (resmap.ResMap, error) {
|
||||
ra, err := kt.accumulateTarget()
|
||||
ra, err := kt.AccumulateTarget()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -134,11 +143,11 @@ func (kt *KustTarget) shouldAddHashSuffixesToGeneratedResources() bool {
|
|||
!kt.kustomization.GeneratorOptions.DisableNameSuffixHash
|
||||
}
|
||||
|
||||
// accumulateTarget returns a new ResAccumulator,
|
||||
// AccumulateTarget returns a new ResAccumulator,
|
||||
// holding customized resources and the data/rules used
|
||||
// to do so. The name back references and vars are
|
||||
// not yet fixed.
|
||||
func (kt *KustTarget) accumulateTarget() (
|
||||
func (kt *KustTarget) AccumulateTarget() (
|
||||
ra *ResAccumulator, err error) {
|
||||
// TODO(monopole): Get rid of the KustomizationErrors accumulator.
|
||||
// It's not consistently used, and complicates tests.
|
||||
|
@ -236,15 +245,15 @@ func (kt *KustTarget) accumulateBases() (
|
|||
continue
|
||||
}
|
||||
subKt, err := NewKustTarget(
|
||||
ldr, kt.fSys, kt.rFactory, kt.tFactory)
|
||||
ldr, kt.rFactory, kt.tFactory)
|
||||
if err != nil {
|
||||
errs.Append(errors.Wrap(err, "couldn't make target for "+path))
|
||||
ldr.Cleanup()
|
||||
continue
|
||||
}
|
||||
subRa, err := subKt.accumulateTarget()
|
||||
subRa, err := subKt.AccumulateTarget()
|
||||
if err != nil {
|
||||
errs.Append(errors.Wrap(err, "accumulateTarget"))
|
||||
errs.Append(errors.Wrap(err, "AccumulateTarget"))
|
||||
ldr.Cleanup()
|
||||
continue
|
||||
}
|
||||
|
|
|
@ -19,6 +19,8 @@ package target
|
|||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
"sigs.k8s.io/kustomize/pkg/resid"
|
||||
"sigs.k8s.io/kustomize/pkg/resmap"
|
||||
"sigs.k8s.io/kustomize/pkg/transformers"
|
||||
|
@ -55,6 +57,11 @@ func (ra *ResAccumulator) ResMap() resmap.ResMap {
|
|||
return result
|
||||
}
|
||||
|
||||
// Vars returns a copy of underlying vars.
|
||||
func (ra *ResAccumulator) Vars() []types.Var {
|
||||
return ra.varSet.Set()
|
||||
}
|
||||
|
||||
func (ra *ResAccumulator) MergeResourcesWithErrorOnIdCollision(
|
||||
resources resmap.ResMap) (err error) {
|
||||
ra.resMap, err = resmap.MergeWithErrorOnIdCollision(
|
||||
|
@ -96,17 +103,27 @@ func (ra *ResAccumulator) MergeAccumulator(other *ResAccumulator) (err error) {
|
|||
// for substitution wherever the $(var.Name) occurs.
|
||||
func (ra *ResAccumulator) makeVarReplacementMap() (map[string]string, error) {
|
||||
result := map[string]string{}
|
||||
for _, v := range ra.varSet.Set() {
|
||||
id := resid.NewResId(v.ObjRef.GVK(), v.ObjRef.Name)
|
||||
if r, found := ra.resMap.DemandOneMatchForId(id); found {
|
||||
s, err := r.GetFieldValue(v.FieldRef.FieldPath)
|
||||
for _, v := range ra.Vars() {
|
||||
matched := ra.resMap.GetMatchingIds(
|
||||
resid.NewResId(v.ObjRef.GVK(), v.ObjRef.Name).GvknEquals)
|
||||
if len(matched) > 1 {
|
||||
return nil, fmt.Errorf(
|
||||
"found %d resId matches for var %s "+
|
||||
"(unable to disambiguate)",
|
||||
len(matched), v)
|
||||
}
|
||||
if len(matched) == 1 {
|
||||
s, err := ra.resMap[matched[0]].GetFieldValue(v.FieldRef.FieldPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("field path err for var: %+v", v)
|
||||
return nil, fmt.Errorf(
|
||||
"field specified in var '%v' "+
|
||||
"not found in corresponding resource", v)
|
||||
}
|
||||
result[v.Name] = s
|
||||
} else {
|
||||
// Should this be an error?
|
||||
log.Printf("var %v defined but not used", v)
|
||||
return nil, fmt.Errorf(
|
||||
"var '%v' cannot be mapped to a field "+
|
||||
"in the set of known resources", v)
|
||||
}
|
||||
}
|
||||
return result, nil
|
||||
|
@ -121,8 +138,18 @@ func (ra *ResAccumulator) ResolveVars() error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return ra.Transform(transformers.NewRefVarTransformer(
|
||||
replacementMap, ra.tConfig.VarReference))
|
||||
if len(replacementMap) == 0 {
|
||||
return nil
|
||||
}
|
||||
t := transformers.NewRefVarTransformer(
|
||||
replacementMap, ra.tConfig.VarReference)
|
||||
err = ra.Transform(t)
|
||||
if len(t.UnusedVars()) > 0 {
|
||||
log.Printf(
|
||||
"well-defined vars that were never replaced: %s\n",
|
||||
strings.Join(t.UnusedVars(), ","))
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (ra *ResAccumulator) FixBackReferences() (err error) {
|
||||
|
|
|
@ -15,6 +15,7 @@ go_library(
|
|||
deps = [
|
||||
"//vendor/github.com/ghodss/yaml:go_default_library",
|
||||
"//vendor/github.com/go-openapi/spec:go_default_library",
|
||||
"//vendor/github.com/pkg/errors:go_default_library",
|
||||
"//vendor/k8s.io/kube-openapi/pkg/common:go_default_library",
|
||||
"//vendor/sigs.k8s.io/kustomize/pkg/gvk:go_default_library",
|
||||
"//vendor/sigs.k8s.io/kustomize/pkg/ifc:go_default_library",
|
||||
|
|
53
vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/varreference.go
generated
vendored
53
vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/varreference.go
generated
vendored
|
@ -100,10 +100,63 @@ varReference:
|
|||
- path: spec/containers/env/value
|
||||
kind: Pod
|
||||
|
||||
- path: spec/initContainers/command
|
||||
kind: Pod
|
||||
|
||||
- path: spec/initContainers/args
|
||||
kind: Pod
|
||||
|
||||
- path: spec/initContainers/env/value
|
||||
kind: Pod
|
||||
|
||||
- path: spec/rules/host
|
||||
kind: Ingress
|
||||
|
||||
- path: spec/tls/hosts
|
||||
kind: Ingress
|
||||
|
||||
- path: spec/template/spec/containers/volumeMounts/mountPath
|
||||
kind: StatefulSet
|
||||
|
||||
- path: spec/template/spec/initContainers/volumeMounts/mountPath
|
||||
kind: StatefulSet
|
||||
|
||||
- path: spec/containers/volumeMounts/mountPath
|
||||
kind: Pod
|
||||
|
||||
- path: spec/initContainers/volumeMounts/mountPath
|
||||
kind: Pod
|
||||
|
||||
- path: spec/template/spec/containers/volumeMounts/mountPath
|
||||
kind: ReplicaSet
|
||||
|
||||
- path: spec/template/spec/initContainers/volumeMounts/mountPath
|
||||
kind: ReplicaSet
|
||||
|
||||
- path: spec/template/spec/containers/volumeMounts/mountPath
|
||||
kind: Job
|
||||
|
||||
- path: spec/template/spec/initContainers/volumeMounts/mountPath
|
||||
kind: Job
|
||||
|
||||
- path: spec/template/spec/containers/volumeMounts/mountPath
|
||||
kind: CronJob
|
||||
|
||||
- path: spec/template/spec/initContainers/volumeMounts/mountPath
|
||||
kind: CronJob
|
||||
|
||||
- path: spec/template/spec/containers/volumeMounts/mountPath
|
||||
kind: DaemonSet
|
||||
|
||||
- path: spec/template/spec/initContainers/volumeMounts/mountPath
|
||||
kind: DaemonSet
|
||||
|
||||
- path: spec/template/spec/containers/volumeMounts/mountPath
|
||||
kind: Deployment
|
||||
|
||||
- path: spec/template/spec/initContainers/volumeMounts/mountPath
|
||||
kind: Deployment
|
||||
|
||||
- path: metadata/labels
|
||||
`
|
||||
)
|
||||
|
|
|
@ -22,6 +22,7 @@ import (
|
|||
|
||||
"github.com/ghodss/yaml"
|
||||
"github.com/go-openapi/spec"
|
||||
"github.com/pkg/errors"
|
||||
"k8s.io/kube-openapi/pkg/common"
|
||||
"sigs.k8s.io/kustomize/pkg/gvk"
|
||||
"sigs.k8s.io/kustomize/pkg/ifc"
|
||||
|
@ -41,7 +42,7 @@ func LoadConfigFromCRDs(
|
|||
}
|
||||
m, err := makeNameToApiMap(content)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, errors.Wrapf(err, "unable to parse open API definition from '%s'", path)
|
||||
}
|
||||
otherTc, err := makeConfigFromApiMap(m)
|
||||
if err != nil {
|
||||
|
|
|
@ -17,6 +17,7 @@ limitations under the License.
|
|||
package transformers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
|
@ -75,7 +76,10 @@ func (pt *imageTransformer) findAndReplaceImage(obj map[string]interface{}) erro
|
|||
}
|
||||
|
||||
func (pt *imageTransformer) updateContainers(obj map[string]interface{}, path string) error {
|
||||
containers := obj[path].([]interface{})
|
||||
containers, ok := obj[path].([]interface{})
|
||||
if !ok {
|
||||
return fmt.Errorf("containers path is not of type []interface{} but %T", obj[path])
|
||||
}
|
||||
for i := range containers {
|
||||
container := containers[i].(map[string]interface{})
|
||||
containerImage, found := container["image"]
|
||||
|
@ -85,20 +89,21 @@ func (pt *imageTransformer) updateContainers(obj map[string]interface{}, path st
|
|||
|
||||
imageName := containerImage.(string)
|
||||
for _, img := range pt.images {
|
||||
if isImageMatched(imageName, img.Name) {
|
||||
name, tag := split(imageName)
|
||||
if img.NewName != "" {
|
||||
name = img.NewName
|
||||
}
|
||||
if img.NewTag != "" {
|
||||
tag = ":" + img.NewTag
|
||||
}
|
||||
if img.Digest != "" {
|
||||
tag = "@" + img.Digest
|
||||
}
|
||||
container["image"] = name + tag
|
||||
break
|
||||
if !isImageMatched(imageName, img.Name) {
|
||||
continue
|
||||
}
|
||||
name, tag := split(imageName)
|
||||
if img.NewName != "" {
|
||||
name = img.NewName
|
||||
}
|
||||
if img.NewTag != "" {
|
||||
tag = ":" + img.NewTag
|
||||
}
|
||||
if img.Digest != "" {
|
||||
tag = "@" + img.Digest
|
||||
}
|
||||
container["image"] = name + tag
|
||||
break
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
@ -138,7 +143,18 @@ func isImageMatched(s, t string) bool {
|
|||
// from the image string using either colon `:` or at `@` separators.
|
||||
// Note that the returned tag keeps its separator.
|
||||
func split(imageName string) (name string, tag string) {
|
||||
ic := strings.LastIndex(imageName, ":")
|
||||
// check if image name contains a domain
|
||||
// if domain is present, ignore domain and check for `:`
|
||||
ic := -1
|
||||
if slashIndex := strings.Index(imageName, "/"); slashIndex < 0 {
|
||||
ic = strings.LastIndex(imageName, ":")
|
||||
} else {
|
||||
lastIc := strings.LastIndex(imageName[slashIndex:], ":")
|
||||
// set ic only if `:` is present
|
||||
if lastIc > 0 {
|
||||
ic = slashIndex + lastIc
|
||||
}
|
||||
}
|
||||
ia := strings.LastIndex(imageName, "@")
|
||||
if ic < 0 && ia < 0 {
|
||||
return imageName, ""
|
||||
|
|
|
@ -89,7 +89,7 @@ func (o *nameReferenceTransformer) updateNameReference(
|
|||
s, _ := in.(string)
|
||||
for id, res := range m {
|
||||
if id.Gvk().IsSelected(&backRef) && id.Name() == s {
|
||||
matchedIds := m.FindByGVKN(id)
|
||||
matchedIds := m.GetMatchingIds(id.GvknEquals)
|
||||
// If there's more than one match, there's no way
|
||||
// to know which one to pick, so emit error.
|
||||
if len(matchedIds) > 1 {
|
||||
|
@ -115,7 +115,7 @@ func (o *nameReferenceTransformer) updateNameReference(
|
|||
for id, res := range m {
|
||||
indexes := indexOf(id.Name(), names)
|
||||
if id.Gvk().IsSelected(&backRef) && len(indexes) > 0 {
|
||||
matchedIds := m.FindByGVKN(id)
|
||||
matchedIds := m.GetMatchingIds(id.GvknEquals)
|
||||
if len(matchedIds) > 1 {
|
||||
return nil, fmt.Errorf(
|
||||
"Multiple matches for name %s:\n %v", id, matchedIds)
|
||||
|
|
|
@ -2,28 +2,26 @@ package transformers
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"sigs.k8s.io/kustomize/pkg/expansion"
|
||||
"sigs.k8s.io/kustomize/pkg/resmap"
|
||||
"sigs.k8s.io/kustomize/pkg/transformers/config"
|
||||
)
|
||||
|
||||
type refvarTransformer struct {
|
||||
fieldSpecs []config.FieldSpec
|
||||
mappingFunc func(string) string
|
||||
type RefVarTransformer struct {
|
||||
varMap map[string]string
|
||||
replacementCounts map[string]int
|
||||
fieldSpecs []config.FieldSpec
|
||||
mappingFunc func(string) string
|
||||
}
|
||||
|
||||
// NewRefVarTransformer returns a Transformer that replaces $(VAR) style
|
||||
// variables with values.
|
||||
// NewRefVarTransformer returns a new RefVarTransformer
|
||||
// that replaces $(VAR) style variables with values.
|
||||
// The fieldSpecs are the places to look for occurrences of $(VAR).
|
||||
func NewRefVarTransformer(
|
||||
varMap map[string]string, fs []config.FieldSpec) Transformer {
|
||||
if len(varMap) == 0 {
|
||||
return NewNoOpTransformer()
|
||||
}
|
||||
return &refvarTransformer{
|
||||
fieldSpecs: fs,
|
||||
mappingFunc: expansion.MappingFuncFor(varMap),
|
||||
varMap map[string]string, fs []config.FieldSpec) *RefVarTransformer {
|
||||
return &RefVarTransformer{
|
||||
varMap: varMap,
|
||||
fieldSpecs: fs,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -31,7 +29,7 @@ func NewRefVarTransformer(
|
|||
// embedded instances of $VAR style variables, e.g. a container command string.
|
||||
// The function returns the string with the variables expanded to their final
|
||||
// values.
|
||||
func (rv *refvarTransformer) replaceVars(in interface{}) (interface{}, error) {
|
||||
func (rv *RefVarTransformer) replaceVars(in interface{}) (interface{}, error) {
|
||||
switch vt := in.(type) {
|
||||
case []interface{}:
|
||||
var xs []string
|
||||
|
@ -39,6 +37,17 @@ func (rv *refvarTransformer) replaceVars(in interface{}) (interface{}, error) {
|
|||
xs = append(xs, expansion.Expand(a.(string), rv.mappingFunc))
|
||||
}
|
||||
return xs, nil
|
||||
case map[string]interface{}:
|
||||
inMap := in.(map[string]interface{})
|
||||
xs := make(map[string]interface{}, len(inMap))
|
||||
for k, v := range inMap {
|
||||
s, ok := v.(string)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("%#v is expected to be %T", v, s)
|
||||
}
|
||||
xs[k] = expansion.Expand(s, rv.mappingFunc)
|
||||
}
|
||||
return xs, nil
|
||||
case interface{}:
|
||||
s, ok := in.(string)
|
||||
if !ok {
|
||||
|
@ -52,8 +61,24 @@ func (rv *refvarTransformer) replaceVars(in interface{}) (interface{}, error) {
|
|||
}
|
||||
}
|
||||
|
||||
// UnusedVars returns slice of Var names that were unused
|
||||
// after a Transform run.
|
||||
func (rv *RefVarTransformer) UnusedVars() []string {
|
||||
var unused []string
|
||||
for k := range rv.varMap {
|
||||
_, ok := rv.replacementCounts[k]
|
||||
if !ok {
|
||||
unused = append(unused, k)
|
||||
}
|
||||
}
|
||||
return unused
|
||||
}
|
||||
|
||||
// Transform replaces $(VAR) style variables with values.
|
||||
func (rv *refvarTransformer) Transform(m resmap.ResMap) error {
|
||||
func (rv *RefVarTransformer) Transform(m resmap.ResMap) error {
|
||||
rv.replacementCounts = make(map[string]int)
|
||||
rv.mappingFunc = expansion.MappingFuncFor(
|
||||
rv.replacementCounts, rv.varMap)
|
||||
for id, res := range m {
|
||||
for _, fieldSpec := range rv.fieldSpecs {
|
||||
if id.Gvk().IsSelected(&fieldSpec.Gvk) {
|
||||
|
|
|
@ -16,6 +16,11 @@ limitations under the License.
|
|||
|
||||
package types
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// GenArgs contains both generator args and options
|
||||
type GenArgs struct {
|
||||
args *GeneratorArgs
|
||||
|
@ -30,6 +35,18 @@ func NewGenArgs(args *GeneratorArgs, opts *GeneratorOptions) *GenArgs {
|
|||
}
|
||||
}
|
||||
|
||||
func (g *GenArgs) String() string {
|
||||
if g == nil {
|
||||
return "{nilGenArgs}"
|
||||
}
|
||||
return "{" +
|
||||
strings.Join([]string{
|
||||
"nsfx:" + strconv.FormatBool(g.NeedsHashSuffix()),
|
||||
"beh:" + g.Behavior().String()},
|
||||
",") +
|
||||
"}"
|
||||
}
|
||||
|
||||
// NeedHashSuffix returns true if the hash suffix is needed.
|
||||
// It is needed when the two conditions are both met
|
||||
// 1) GenArgs is not nil
|
||||
|
|
|
@ -75,9 +75,11 @@ type VarSet struct {
|
|||
set []Var
|
||||
}
|
||||
|
||||
// Set returns the var set.
|
||||
// Set returns a copy of the var set.
|
||||
func (vs *VarSet) Set() []Var {
|
||||
return vs.set
|
||||
s := make([]Var, len(vs.set))
|
||||
copy(s, vs.set)
|
||||
return s
|
||||
}
|
||||
|
||||
// MergeSet absorbs other vars with error on name collision.
|
||||
|
|
Loading…
Reference in New Issue