layer1: add namespace bootstrap step 11
This commit is contained in:
@@ -14,6 +14,7 @@ type NamespaceManager interface {
|
||||
Snapshot() []string
|
||||
SnapshotRecords() []NamespaceRecord
|
||||
Get(name string) (NamespaceRecord, bool)
|
||||
Bootstrap(namespaces []string, source NamespaceSource, observedAt time.Time) []NamespaceRecord
|
||||
Subscribe(subscriber NamespaceSubscriber)
|
||||
SnapshotSubscribers() []string
|
||||
Upsert(event NamespaceEvent) NamespaceRecord
|
||||
@@ -40,6 +41,22 @@ func (m *inMemoryNamespaceManager) Subscribe(subscriber NamespaceSubscriber) {
|
||||
m.subs[subscriber.Name()] = subscriber
|
||||
}
|
||||
|
||||
func (m *inMemoryNamespaceManager) Bootstrap(namespaces []string, source NamespaceSource, observedAt time.Time) []NamespaceRecord {
|
||||
records := make([]NamespaceRecord, 0, len(namespaces))
|
||||
for _, namespace := range namespaces {
|
||||
records = append(records, m.Upsert(NamespaceEvent{
|
||||
Type: NamespaceEventAdd,
|
||||
Name: namespace,
|
||||
Source: source,
|
||||
ObservedAt: observedAt,
|
||||
}))
|
||||
}
|
||||
sort.Slice(records, func(i, j int) bool {
|
||||
return records[i].Name < records[j].Name
|
||||
})
|
||||
return records
|
||||
}
|
||||
|
||||
func (m *inMemoryNamespaceManager) SnapshotSubscribers() []string {
|
||||
m.mu.RLock()
|
||||
defer m.mu.RUnlock()
|
||||
|
||||
@@ -137,4 +137,24 @@ func TestNamespaceManagerMarkPartStateDerivesPhase(t *testing.T) {
|
||||
if record.Phase != NamespacePhaseFailed {
|
||||
t.Fatalf("expected phase failed, got %s", record.Phase)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNamespaceManagerBootstrap(t *testing.T) {
|
||||
manager := NewNamespaceManager()
|
||||
now := time.Now().UTC()
|
||||
records := manager.Bootstrap([]string{"tenant-b", "tenant-a"}, NamespaceSourceBackfill, now)
|
||||
|
||||
if len(records) != 2 {
|
||||
t.Fatalf("expected 2 bootstrap records, got %d", len(records))
|
||||
}
|
||||
if !reflect.DeepEqual([]string{"tenant-a", "tenant-b"}, manager.Snapshot()) {
|
||||
t.Fatalf("expected manager snapshot to contain bootstrapped namespaces")
|
||||
}
|
||||
record, ok := manager.Get("tenant-a")
|
||||
if !ok {
|
||||
t.Fatalf("expected tenant-a after bootstrap")
|
||||
}
|
||||
if record.Source != NamespaceSourceBackfill {
|
||||
t.Fatalf("expected bootstrap source backfill, got %s", record.Source)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user