...
1
2
3
4 package builtins
5
6 import (
7 "fmt"
8
9 "sigs.k8s.io/kustomize/api/filters/namespace"
10 "sigs.k8s.io/kustomize/api/resmap"
11 "sigs.k8s.io/kustomize/api/types"
12 "sigs.k8s.io/kustomize/kyaml/errors"
13 "sigs.k8s.io/yaml"
14 )
15
16
17 type NamespaceTransformerPlugin struct {
18 types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
19 FieldSpecs []types.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"`
20 UnsetOnly bool `json:"unsetOnly" yaml:"unsetOnly"`
21 SetRoleBindingSubjects namespace.RoleBindingSubjectMode `json:"setRoleBindingSubjects" yaml:"setRoleBindingSubjects"`
22 }
23
24 func (p *NamespaceTransformerPlugin) Config(
25 _ *resmap.PluginHelpers, c []byte) (err error) {
26 p.Namespace = ""
27 p.FieldSpecs = nil
28 if err := yaml.Unmarshal(c, p); err != nil {
29 return errors.WrapPrefixf(err, "unmarshalling NamespaceTransformer config")
30 }
31 switch p.SetRoleBindingSubjects {
32 case namespace.AllServiceAccountSubjects, namespace.DefaultSubjectsOnly, namespace.NoSubjects:
33
34 case namespace.SubjectModeUnspecified:
35 p.SetRoleBindingSubjects = namespace.DefaultSubjectsOnly
36 default:
37 return errors.Errorf("invalid value %q for setRoleBindingSubjects: "+
38 "must be one of %q, %q or %q", p.SetRoleBindingSubjects,
39 namespace.DefaultSubjectsOnly, namespace.NoSubjects, namespace.AllServiceAccountSubjects)
40 }
41
42 return nil
43 }
44
45 func (p *NamespaceTransformerPlugin) Transform(m resmap.ResMap) error {
46 if len(p.Namespace) == 0 {
47 return nil
48 }
49 for _, r := range m.Resources() {
50 if r.IsNilOrEmpty() {
51
52 continue
53 }
54 r.StorePreviousId()
55 if err := r.ApplyFilter(namespace.Filter{
56 Namespace: p.Namespace,
57 FsSlice: p.FieldSpecs,
58 SetRoleBindingSubjects: p.SetRoleBindingSubjects,
59 UnsetOnly: p.UnsetOnly,
60 }); err != nil {
61 return err
62 }
63 matches := m.GetMatchingResourcesByCurrentId(r.CurId().Equals)
64 if len(matches) != 1 {
65 return fmt.Errorf(
66 "namespace transformation produces ID conflict: %+v", matches)
67 }
68 }
69 return nil
70 }
71
72 func NewNamespaceTransformerPlugin() resmap.TransformerPlugin {
73 return &NamespaceTransformerPlugin{}
74 }
75
View as plain text