Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions deploy/operator/cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -772,6 +772,15 @@ func registerControllers(
return fmt.Errorf("unable to create DynamoModel controller: %w", err)
}

if err = (&controller.SelectionTopologyReconciler{
Client: mgr.GetClient(),
Recorder: mgr.GetEventRecorderFor("selection-topology"),
Config: operatorCfg,
RuntimeConfig: runtimeConfig,
}).SetupWithManager(mgr); err != nil {
return fmt.Errorf("unable to create SelectionTopology controller: %w", err)
}

if err = (&controller.CheckpointReconciler{
Client: mgr.GetClient(),
Config: operatorCfg,
Expand Down
5 changes: 5 additions & 0 deletions deploy/operator/internal/consts/consts.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ const (
KubeAnnotationDisableImagePullSecretDiscovery = "nvidia.com/disable-image-pull-secret-discovery"
KubeAnnotationDynamoDiscoveryBackend = "nvidia.com/dynamo-discovery-backend"
KubeAnnotationDynamoKubeDiscoveryMode = "nvidia.com/dynamo-kube-discovery-mode"
KubeAnnotationDynamoSelectionAdapter = "nvidia.com/dynamo-selection-adapter"
KubeAnnotationDynamoSelectionServiceURL = "nvidia.com/dynamo-selection-service-url"
KubeAnnotationDynamoSelectionTenantID = "nvidia.com/dynamo-selection-tenant-id"
KubeAnnotationDynamoSelectionRequireKVEvents = "nvidia.com/dynamo-selection-require-kv-events"

KubeLabelDynamoGraphDeploymentName = "nvidia.com/dynamo-graph-deployment-name"
KubeLabelDynamoComponent = "nvidia.com/dynamo-component"
Expand Down Expand Up @@ -230,6 +234,7 @@ const (
ResourceTypeDynamoModel = "DynamoModel"
ResourceTypeDynamoGraphDeploymentRequest = "DynamoGraphDeploymentRequest"
ResourceTypeDynamoGraphDeploymentScalingAdapter = "DynamoGraphDeploymentScalingAdapter"
ResourceTypeSelectionTopology = "SelectionTopology"

// Resource state constants - used in status reporting and metrics
ResourceStateReady = "ready"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

package controller

import (
"context"
"fmt"

"github.com/ai-dynamo/dynamo/deploy/operator/internal/enginemetadata/sglang"
"github.com/ai-dynamo/dynamo/deploy/operator/internal/selectionservice"
)

const selectionAdapterExternalSGLang = "external-sglang"

type sglangMetadataFetcher interface {
Fetch(context.Context) (sglang.MetadataSnapshot, error)
}

type sglangMetadataClientFactory func(endpoint string) (sglangMetadataFetcher, error)

type externalSGLangSelectionAdapter struct {
MetadataClientFactory sglangMetadataClientFactory
}

func (a externalSGLangSelectionAdapter) BuildWorker(ctx context.Context, reg selectionWorkerRegistration) (selectionservice.WorkerRequest, error) {
metadataClientFactory := a.MetadataClientFactory
if metadataClientFactory == nil {
metadataClientFactory = func(endpoint string) (sglangMetadataFetcher, error) {
return sglang.NewMetadataClient(endpoint, selectionSGLangRequestTimeout)
}
}
metadataClient, err := metadataClientFactory(reg.WorkerEndpoint)
if err != nil {
return selectionservice.WorkerRequest{}, fmt.Errorf("create SGLang metadata client for %q: %w", reg.WorkerEndpoint, err)
}
metadata, err := metadataClient.Fetch(ctx)
if err != nil {
return selectionservice.WorkerRequest{}, fmt.Errorf("fetch SGLang metadata from %q: %w", reg.WorkerEndpoint, err)
}
worker, err := sglang.BuildWorkerRequest(sglang.WorkerRegistration{
WorkerID: reg.WorkerID,
WorkerEndpoint: reg.WorkerEndpoint,
TenantID: reg.TenantID,
StableRoutingID: reg.StableRoutingID,
RequireKVEvents: reg.RequireKVEvents,
TopologyDomains: reg.TopologyDomains,
}, metadata)
if err != nil {
return selectionservice.WorkerRequest{}, fmt.Errorf("build SGLang worker request for %q: %w", reg.WorkerEndpoint, err)
}
return worker, nil
}
Loading
Loading