Skip to content

Commit 7e9ec6a

Browse files
committed
feat: enable multi-tenant indexing with a new configuration flag and resource filtering based on tenant type.
1 parent ec65ab5 commit 7e9ec6a

File tree

5 files changed

+28
-6
lines changed

5 files changed

+28
-6
lines changed

cmd/search/indexer/command.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ func Run(o *ResourceIndexerOptions, ctx context.Context) error {
302302
auditBatcher.Start(ctx)
303303
reindexBatcher.Start(ctx)
304304

305-
auditIdx := indexer.NewIndexer(auditConsumer, indexPolicyCache, auditBatcher)
305+
auditIdx := indexer.NewIndexer(auditConsumer, indexPolicyCache, auditBatcher, o.MultiTenant)
306306
reindexIdx := indexer.NewReindexConsumer(reindexJSConsumer, reindexPolicyCache, reindexBatcher)
307307

308308
klog.Info("Starting audit indexer and re-index consumer...")

config/base/resource-indexer/deployment.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ spec:
2828
- --nats-tls-cert=$(NATS_TLS_CERT)
2929
- --nats-tls-key=$(NATS_TLS_KEY)
3030
- --meilisearch-domain=$(MEILISEARCH_DOMAIN)
31+
- --multi-tenant=$(MULTI_TENANT)
3132
env:
3233
- name: NATS_URL
3334
value: "nats://nats.nats-system.svc.cluster.local:4222"
@@ -47,6 +48,8 @@ spec:
4748
value: "AUDIT_EVENTS"
4849
- name: MEILISEARCH_DOMAIN
4950
value: "http://meilisearch.meilisearch-system.svc.cluster.local:7700"
51+
- name: MULTI_TENANT
52+
value: "false"
5053
- name: MEILISEARCH_API_KEY
5154
valueFrom:
5255
secretKeyRef:

config/overlays/resource-indexer/core-control-plane/patches/deployment.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,8 @@ spec:
77
spec:
88
serviceAccountName: resource-indexer
99
automountServiceAccountToken: true
10+
containers:
11+
- name: indexer
12+
env:
13+
- name: MULTI_TENANT
14+
value: "true"

internal/indexer/consumer.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ type Indexer struct {
1616
consumer jetstream.Consumer
1717
policyCache *PolicyCache
1818
batcher *Batcher
19+
multiTenant bool
1920
mu sync.Mutex
2021
}
2122

@@ -59,17 +60,24 @@ func extractTenantFromAuditEvent(event *auditEvent) (tenantName string, tenantTy
5960
}
6061

6162
// NewIndexer creates a new Indexer instance.
62-
func NewIndexer(consumer jetstream.Consumer, policyCache *PolicyCache, batcher *Batcher) *Indexer {
63+
func NewIndexer(consumer jetstream.Consumer, policyCache *PolicyCache, batcher *Batcher, multiTenant bool) *Indexer {
6364
return &Indexer{
6465
consumer: consumer,
6566
policyCache: policyCache,
6667
batcher: batcher,
68+
multiTenant: multiTenant,
6769
}
6870
}
6971

7072
var upsertVerbs = map[string]bool{"create": true, "update": true, "patch": true}
7173

72-
const deleteVerb = "delete"
74+
const (
75+
deleteVerb = "delete"
76+
// tenantTypePlatform mirrors tenant.TenantTypePlatform. A local copy is used
77+
// to avoid an import cycle: internal/tenant/project_watcher.go already
78+
// imports internal/indexer, so internal/indexer cannot import internal/tenant.
79+
tenantTypePlatform = "platform"
80+
)
7381

7482
// Start starts the indexer consumer loop.
7583
// Note: the Batcher must be started separately by the caller (via batcher.Start)
@@ -147,8 +155,14 @@ func (i *Indexer) Start(ctx context.Context) error {
147155
continue
148156
}
149157

150-
// Inject tenant context extracted from the audit event's user extra fields.
158+
// Always extract tenant context from the audit event's user extra fields.
159+
// In single-tenant mode, skip non-platform resources so that project-tenant
160+
// resources are never incorrectly indexed as platform resources.
151161
evalResult.Tenant, evalResult.TenantType = extractTenantFromAuditEvent(&event)
162+
if !i.multiTenant && evalResult.TenantType != tenantTypePlatform {
163+
msg.Ack()
164+
continue
165+
}
152166

153167
// Transform the matching resource into an indexable document
154168
doc := evalResult.Transform()

internal/indexer/consumer_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func TestIndexer_Start_ConsumeFlow(t *testing.T) {
136136
mockSearch.On("WaitForTasks", mock.Anything).Return(nil, nil).Once()
137137

138138
// 4. Run Indexer
139-
indexer := NewIndexer(mockConsumer, policyCache, batcher)
139+
indexer := NewIndexer(mockConsumer, policyCache, batcher, false)
140140
ctx, cancel := context.WithCancel(context.Background())
141141

142142
// Run Start in a goroutine
@@ -275,7 +275,7 @@ func TestIndexer_Consume_Delete(t *testing.T) {
275275
})).Return(nil, nil).Once()
276276
mockSearch.On("WaitForTasks", mock.Anything).Return(nil, nil).Once()
277277

278-
indexer := NewIndexer(mockConsumer, policyCache, batcher)
278+
indexer := NewIndexer(mockConsumer, policyCache, batcher, false)
279279
ctx, cancel := context.WithCancel(context.Background())
280280

281281
go indexer.Start(ctx)

0 commit comments

Comments
 (0)