Skip to content

Commit e8f32e4

Browse files
authored
Merge pull request #344 from kagenti/feat/sandbox-agentcard
feat: add Sandbox support to AgentCard controller
2 parents b3130f2 + 2910322 commit e8f32e4

2 files changed

Lines changed: 59 additions & 0 deletions

File tree

kagenti-operator/internal/controller/agentcard_controller.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ type AgentCardReconciler struct {
140140
// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;update;patch
141141
// +kubebuilder:rbac:groups=apps,resources=statefulsets,verbs=get;list;watch;update;patch
142142
// +kubebuilder:rbac:groups=core,resources=configmaps,verbs=get;list;watch
143+
// +kubebuilder:rbac:groups=agents.x-k8s.io,resources=sandboxes,verbs=get;list;watch
143144

144145
func (r *AgentCardReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
145146
agentCardLogger.V(1).Info("Reconciling AgentCard", "namespacedName", req.NamespacedName)
@@ -1282,6 +1283,16 @@ func (r *AgentCardReconciler) SetupWithManager(mgr ctrl.Manager) error {
12821283
builder.WithPredicates(workloadPredicates),
12831284
)
12841285

1286+
if SandboxCRDExists(mgr.GetConfig()) {
1287+
sandboxObj := &unstructured.Unstructured{}
1288+
sandboxObj.SetGroupVersionKind(sandboxGVK)
1289+
controllerBuilder = controllerBuilder.Watches(
1290+
sandboxObj,
1291+
handler.EnqueueRequestsFromMapFunc(r.mapWorkloadToAgentCard("agents.x-k8s.io/v1alpha1", "Sandbox")),
1292+
builder.WithPredicates(workloadPredicates),
1293+
)
1294+
}
1295+
12851296
return controllerBuilder.
12861297
Named("AgentCard").
12871298
Complete(r)

kagenti-operator/internal/controller/indexers_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ import (
2323
. "github.com/onsi/gomega"
2424
appsv1 "k8s.io/api/apps/v1"
2525
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2627
"sigs.k8s.io/controller-runtime/pkg/log"
28+
29+
agentv1alpha1 "github.com/kagenti/operator/api/v1alpha1"
2730
)
2831

2932
var _ = Describe("mapWorkloadToAgentCards", func() {
@@ -82,4 +85,49 @@ var _ = Describe("mapWorkloadToAgentCards", func() {
8285
Expect(requests).To(BeEmpty())
8386
})
8487
})
88+
89+
Context("when a Sandbox workload has agent labels and matching AgentCard exists", func() {
90+
It("should return a reconcile request for the AgentCard", func() {
91+
card := &agentv1alpha1.AgentCard{
92+
ObjectMeta: metav1.ObjectMeta{
93+
Name: "sandbox-card",
94+
Namespace: namespace,
95+
},
96+
Spec: agentv1alpha1.AgentCardSpec{
97+
TargetRef: &agentv1alpha1.TargetRef{
98+
APIVersion: "agents.x-k8s.io/v1alpha1",
99+
Kind: "Sandbox",
100+
Name: "my-sandbox",
101+
},
102+
},
103+
}
104+
Expect(k8sClient.Create(ctx, card)).To(Succeed())
105+
DeferCleanup(func() { _ = k8sClient.Delete(ctx, card) })
106+
107+
sbx := &unstructured.Unstructured{}
108+
sbx.SetGroupVersionKind(sandboxGVK)
109+
sbx.SetName("my-sandbox")
110+
sbx.SetNamespace(namespace)
111+
sbx.SetLabels(map[string]string{LabelAgentType: LabelValueAgent})
112+
113+
mapFn := mapWorkloadToAgentCards(k8sClient, "agents.x-k8s.io/v1alpha1", "Sandbox", logger)
114+
requests := mapFn(ctx, sbx)
115+
Expect(requests).To(HaveLen(1))
116+
Expect(requests[0].Name).To(Equal("sandbox-card"))
117+
})
118+
})
119+
120+
Context("when a Sandbox workload lacks agent labels", func() {
121+
It("should return no reconcile requests", func() {
122+
sbx := &unstructured.Unstructured{}
123+
sbx.SetGroupVersionKind(sandboxGVK)
124+
sbx.SetName("unlabeled-sandbox")
125+
sbx.SetNamespace(namespace)
126+
sbx.SetLabels(map[string]string{"app": "something"})
127+
128+
mapFn := mapWorkloadToAgentCards(k8sClient, "agents.x-k8s.io/v1alpha1", "Sandbox", logger)
129+
requests := mapFn(ctx, sbx)
130+
Expect(requests).To(BeEmpty())
131+
})
132+
})
85133
})

0 commit comments

Comments
 (0)