Skip to content

Commit 5ea7c0d

Browse files
refactor: move DependencyReference to apis/meta
Signed-off-by: Iam-karan-suresh <karansuresh.info@gmail.com>
1 parent e19a158 commit 5ea7c0d

File tree

5 files changed

+95
-14
lines changed

5 files changed

+95
-14
lines changed

apis/meta/dependencies.go

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,41 @@ limitations under the License.
1616

1717
package meta
1818

19+
import "strings"
20+
1921
// ObjectWithDependencies describes a Kubernetes resource object with dependencies.
2022
// +k8s:deepcopy-gen=false
2123
type ObjectWithDependencies interface {
22-
// GetDependsOn returns a NamespacedObjectReference list the object depends on.
23-
GetDependsOn() []NamespacedObjectReference
24+
// GetDependsOn returns a DependencyReference list the object depends on.
25+
GetDependsOn() []DependencyReference
26+
}
27+
28+
// MakeDependsOn parses a list of dependency strings into DependencyReference
29+
// objects. Each dependency string can be in one of the following formats:
30+
// - "name" - a dependency in the same namespace with no CEL expression
31+
// - "namespace/name" - a dependency in a specific namespace
32+
// - "name@readyExpr" - a dependency with a CEL readiness expression
33+
// - "namespace/name@readyExpr" - a dependency in a specific namespace with a CEL expression
34+
func MakeDependsOn(deps []string) []DependencyReference {
35+
refs := make([]DependencyReference, 0, len(deps))
36+
for _, dep := range deps {
37+
ref := DependencyReference{}
38+
39+
// Split off the CEL ready expression if present.
40+
if idx := strings.Index(dep, "@"); idx != -1 {
41+
ref.ReadyExpr = dep[idx+1:]
42+
dep = dep[:idx]
43+
}
44+
45+
// Split the namespace/name.
46+
if parts := strings.SplitN(dep, "/", 2); len(parts) == 2 {
47+
ref.Namespace = parts[0]
48+
ref.Name = parts[1]
49+
} else {
50+
ref.Name = dep
51+
}
52+
53+
refs = append(refs, ref)
54+
}
55+
return refs
2456
}

apis/meta/reference_types.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,36 @@ func (in NamespacedObjectReference) String() string {
4343
return in.Name
4444
}
4545

46+
// DependencyReference defines a dependency on another resource.
47+
// It extends NamespacedObjectReference with an optional CEL expression
48+
// for custom readiness checks.
49+
type DependencyReference struct {
50+
// Name of the referent.
51+
// +required
52+
Name string `json:"name"`
53+
54+
// Namespace of the referent, defaults to the namespace of the resource
55+
// object that contains the reference.
56+
// +optional
57+
Namespace string `json:"namespace,omitempty"`
58+
59+
// ReadyExpr is a CEL expression that can be used to assess the readiness
60+
// of a dependency. When specified, the built-in readiness check
61+
// is replaced by the logic defined in the CEL expression.
62+
// To make the CEL expression additive to the built-in readiness check,
63+
// the feature gate `AdditiveCELDependencyCheck` must be set to `true`.
64+
// +optional
65+
ReadyExpr string `json:"readyExpr,omitempty"`
66+
}
67+
68+
// String implements the fmt.Stringer interface for DependencyReference.
69+
func (in DependencyReference) String() string {
70+
if in.Namespace != "" {
71+
return in.Namespace + "/" + in.Name
72+
}
73+
return in.Name
74+
}
75+
4676
// NamespacedObjectKindReference contains enough information to locate the typed referenced Kubernetes resource object
4777
// in any namespace.
4878
type NamespacedObjectKindReference struct {

apis/meta/zz_generated.deepcopy.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

runtime/dependency/sort.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,11 @@ func Sort(objects []Dependent) ([]meta.NamespacedObjectReference, error) {
5656
Namespace: obj.GetNamespace(),
5757
}
5858
vertices = append(vertices, u)
59-
for _, v := range obj.GetDependsOn() {
59+
for _, dep := range obj.GetDependsOn() {
60+
v := meta.NamespacedObjectReference{
61+
Name: dep.Name,
62+
Namespace: dep.Namespace,
63+
}
6064
if v.Namespace == "" {
6165
v.Namespace = obj.GetNamespace()
6266
}

runtime/dependency/sort_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import (
2828
type object struct {
2929
name string
3030
namespace string
31-
dependsOn []meta.NamespacedObjectReference
31+
dependsOn []meta.DependencyReference
3232
}
3333

3434
func (in object) GetName() string {
@@ -39,7 +39,7 @@ func (in object) GetNamespace() string {
3939
return in.namespace
4040
}
4141

42-
func (in object) GetDependsOn() []meta.NamespacedObjectReference {
42+
func (in object) GetDependsOn() []meta.DependencyReference {
4343
return in.dependsOn
4444
}
4545

@@ -56,7 +56,7 @@ func TestSort(t *testing.T) {
5656
&object{
5757
name: "frontend",
5858
namespace: "default",
59-
dependsOn: []meta.NamespacedObjectReference{
59+
dependsOn: []meta.DependencyReference{
6060
{Namespace: "linkerd", Name: "linkerd"},
6161
{Namespace: "default", Name: "backend"},
6262
},
@@ -68,7 +68,7 @@ func TestSort(t *testing.T) {
6868
&object{
6969
namespace: "default",
7070
name: "backend",
71-
dependsOn: []meta.NamespacedObjectReference{
71+
dependsOn: []meta.DependencyReference{
7272
{Namespace: "linkerd", Name: "linkerd"},
7373
},
7474
},
@@ -85,21 +85,21 @@ func TestSort(t *testing.T) {
8585
&object{
8686
name: "dependency",
8787
namespace: "default",
88-
dependsOn: []meta.NamespacedObjectReference{
88+
dependsOn: []meta.DependencyReference{
8989
{Namespace: "default", Name: "endless"},
9090
},
9191
},
9292
&object{
9393
name: "endless",
9494
namespace: "default",
95-
dependsOn: []meta.NamespacedObjectReference{
95+
dependsOn: []meta.DependencyReference{
9696
{Namespace: "default", Name: "circular"},
9797
},
9898
},
9999
&object{
100100
name: "circular",
101101
namespace: "default",
102-
dependsOn: []meta.NamespacedObjectReference{
102+
dependsOn: []meta.DependencyReference{
103103
{Namespace: "default", Name: "dependency"},
104104
},
105105
},
@@ -116,7 +116,7 @@ func TestSort(t *testing.T) {
116116
&object{
117117
name: "frontend",
118118
namespace: "application",
119-
dependsOn: []meta.NamespacedObjectReference{
119+
dependsOn: []meta.DependencyReference{
120120
{Name: "backend"},
121121
},
122122
},
@@ -132,14 +132,14 @@ func TestSort(t *testing.T) {
132132
&object{
133133
name: "backend",
134134
namespace: "default",
135-
dependsOn: []meta.NamespacedObjectReference{
135+
dependsOn: []meta.DependencyReference{
136136
{Namespace: "default", Name: "common"},
137137
},
138138
},
139139
&object{
140140
name: "frontend",
141141
namespace: "default",
142-
dependsOn: []meta.NamespacedObjectReference{
142+
dependsOn: []meta.DependencyReference{
143143
{Namespace: "default", Name: "infra"},
144144
},
145145
},
@@ -161,7 +161,7 @@ func TestSort(t *testing.T) {
161161
&object{
162162
name: "frontend",
163163
namespace: "default",
164-
dependsOn: []meta.NamespacedObjectReference{
164+
dependsOn: []meta.DependencyReference{
165165
{Namespace: "linkerd", Name: "linkerd"},
166166
{Namespace: "default", Name: "backend"},
167167
},

0 commit comments

Comments
 (0)