mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-05-18 07:55:29 +00:00
- Removed RoleBinding and Webhook specific code in the namespacetransformer. That code was attempting to perform the task of the namereference - Updated namereference transformer configuration to suppport the Webhooks. - Prevent the namereference from wiping out the namespace value if no referral candidate was selected - Added unit tests.
85 lines
2.3 KiB
Go
85 lines
2.3 KiB
Go
// Code generated by pluginator on NamespaceTransformer; DO NOT EDIT.
|
|
package builtin
|
|
|
|
import (
|
|
"sigs.k8s.io/kustomize/v3/pkg/ifc"
|
|
"sigs.k8s.io/kustomize/v3/pkg/resid"
|
|
"sigs.k8s.io/kustomize/v3/pkg/resmap"
|
|
"sigs.k8s.io/kustomize/v3/pkg/resource"
|
|
"sigs.k8s.io/kustomize/v3/pkg/transformers"
|
|
"sigs.k8s.io/kustomize/v3/pkg/transformers/config"
|
|
"sigs.k8s.io/kustomize/v3/pkg/types"
|
|
"sigs.k8s.io/yaml"
|
|
)
|
|
|
|
// Change or set the namespace of non-cluster level resources.
|
|
type NamespaceTransformerPlugin struct {
|
|
types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
|
|
FieldSpecs []config.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"`
|
|
}
|
|
|
|
//noinspection GoUnusedGlobalVariable
|
|
func NewNamespaceTransformerPlugin() *NamespaceTransformerPlugin {
|
|
return &NamespaceTransformerPlugin{}
|
|
}
|
|
|
|
func (p *NamespaceTransformerPlugin) Config(
|
|
ldr ifc.Loader, rf *resmap.Factory, c []byte) (err error) {
|
|
p.Namespace = ""
|
|
p.FieldSpecs = nil
|
|
return yaml.Unmarshal(c, p)
|
|
}
|
|
|
|
func (p *NamespaceTransformerPlugin) Transform(m resmap.ResMap) error {
|
|
if len(p.Namespace) == 0 {
|
|
return nil
|
|
}
|
|
for _, r := range m.Resources() {
|
|
id := r.OrgId()
|
|
fs, ok := p.isSelected(id)
|
|
if !ok {
|
|
continue
|
|
}
|
|
if len(r.Map()) == 0 {
|
|
// Don't mutate empty objects?
|
|
continue
|
|
}
|
|
if doIt(id, fs) {
|
|
if err := p.changeNamespace(r, fs); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
const metaNamespace = "metadata/namespace"
|
|
|
|
// Special casing metadata.namespace since
|
|
// all objects have it, even "ClusterKind" objects
|
|
// that don't exist in a namespace (the Namespace
|
|
// object itself doesn't live in a namespace).
|
|
func doIt(id resid.ResId, fs *config.FieldSpec) bool {
|
|
return fs.Path != metaNamespace ||
|
|
(fs.Path == metaNamespace && id.IsNamespaceableKind())
|
|
}
|
|
|
|
func (p *NamespaceTransformerPlugin) changeNamespace(
|
|
r *resource.Resource, fs *config.FieldSpec) error {
|
|
return transformers.MutateField(
|
|
r.Map(), fs.PathSlice(), fs.CreateIfNotPresent,
|
|
func(_ interface{}) (interface{}, error) {
|
|
return p.Namespace, nil
|
|
})
|
|
}
|
|
|
|
func (p *NamespaceTransformerPlugin) isSelected(
|
|
id resid.ResId) (*config.FieldSpec, bool) {
|
|
for _, fs := range p.FieldSpecs {
|
|
if id.IsSelected(&fs.Gvk) {
|
|
return &fs, true
|
|
}
|
|
}
|
|
return nil, false
|
|
}
|