...
1
2
3
4 package resid
5
6 import (
7 "reflect"
8 "strings"
9
10 "sigs.k8s.io/kustomize/kyaml/yaml"
11 )
12
13
14 type ResId struct {
15
16 Gvk `json:",inline,omitempty" yaml:",inline,omitempty"`
17
18
19 Name string `json:"name,omitempty" yaml:"name,omitempty"`
20
21
22 Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"`
23 }
24
25
26
27 func NewResIdWithNamespace(k Gvk, n, ns string) ResId {
28 return ResId{Gvk: k, Name: n, Namespace: ns}
29 }
30
31
32 func NewResId(k Gvk, n string) ResId {
33 return NewResIdWithNamespace(k, n, "")
34 }
35
36
37 func NewResIdKindOnly(k string, n string) ResId {
38 return NewResId(FromKind(k), n)
39 }
40
41 const (
42 noNamespace = "[noNs]"
43 noName = "[noName]"
44 separator = "/"
45 TotallyNotANamespace = "_non_namespaceable_"
46 DefaultNamespace = "default"
47 )
48
49
50 func (id ResId) String() string {
51 ns := id.Namespace
52 if ns == "" {
53 ns = noNamespace
54 }
55 nm := id.Name
56 if nm == "" {
57 nm = noName
58 }
59 return strings.Join(
60 []string{id.Gvk.String(), strings.Join([]string{nm, ns}, fieldSep)}, separator)
61 }
62
63 func FromString(s string) ResId {
64 values := strings.Split(s, separator)
65 gvk := GvkFromString(values[0])
66
67 values = strings.Split(values[1], fieldSep)
68 last := len(values) - 1
69
70 ns := values[last]
71 if ns == noNamespace {
72 ns = ""
73 }
74 nm := strings.Join(values[:last], fieldSep)
75 if nm == noName {
76 nm = ""
77 }
78 return ResId{
79 Gvk: gvk,
80 Namespace: ns,
81 Name: nm,
82 }
83 }
84
85
86 func FromRNode(rn *yaml.RNode) ResId {
87 group, version := ParseGroupVersion(rn.GetApiVersion())
88 return NewResIdWithNamespace(
89 Gvk{Group: group, Version: version, Kind: rn.GetKind()}, rn.GetName(), rn.GetNamespace())
90 }
91
92
93
94 func (id ResId) GvknEquals(o ResId) bool {
95 return id.Name == o.Name && id.Gvk.Equals(o.Gvk)
96 }
97
98
99 func (id ResId) IsSelectedBy(selector ResId) bool {
100 return (selector.Name == "" || selector.Name == id.Name) &&
101 (selector.Namespace == "" || selector.IsNsEquals(id)) &&
102 id.Gvk.IsSelected(&selector.Gvk)
103 }
104
105
106
107 func (id ResId) Equals(o ResId) bool {
108 return id.IsNsEquals(o) && id.GvknEquals(o)
109 }
110
111
112
113 func (id ResId) IsNsEquals(o ResId) bool {
114 return id.EffectiveNamespace() == o.EffectiveNamespace()
115 }
116
117
118
119
120 func (id ResId) IsInDefaultNs() bool {
121 return !id.IsClusterScoped() && id.isPutativelyDefaultNs()
122 }
123
124 func (id ResId) isPutativelyDefaultNs() bool {
125 return id.Namespace == "" || id.Namespace == DefaultNamespace
126 }
127
128
129
130 func (id ResId) EffectiveNamespace() string {
131
132 if id.IsClusterScoped() {
133 return TotallyNotANamespace
134 }
135 if id.isPutativelyDefaultNs() {
136 return DefaultNamespace
137 }
138 return id.Namespace
139 }
140
141
142
143 func (id ResId) IsEmpty() bool {
144 return reflect.DeepEqual(id, ResId{})
145 }
146
View as plain text