Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
4b3e355
feat(operator): add draft DisaggregatedSet pathway
panpan0000 Jul 14, 2026
7aa1f6b
refactor(operator): extract shared multinode workload rendering
panpan0000 Jul 14, 2026
b0600bc
fix(operator): address DS draft CI findings
panpan0000 Jul 14, 2026
d747f95
test(operator): fix DS envtest conversion
panpan0000 Jul 14, 2026
249ed2d
docs(kubernetes): document DS multinode flow
panpan0000 Jul 14, 2026
3b1f348
test(operator): complete DS envtest fixture
panpan0000 Jul 14, 2026
b13b631
fix(operator): harden DisaggregatedSet reconciliation
panpan0000 Jul 14, 2026
d6b5a6e
fix(operator): apply checkpoint policy to DS roles
panpan0000 Jul 14, 2026
3dac1c8
ci: fix DS fixture header and SGLang link
panpan0000 Jul 14, 2026
359d741
ci: fix SGLang Diffusion LLM link
panpan0000 Jul 14, 2026
b689ee6
fix(operator): remove unused DS helper parameter
panpan0000 Jul 14, 2026
89f4248
fix(operator): harden DisaggregatedSet lifecycle
panpan0000 Jul 14, 2026
dc38673
fix(operator): harden DisaggregatedSet naming and adoption
panpan0000 Jul 14, 2026
d1d6277
docs(operator): clarify DisaggregatedSet routing precedence
panpan0000 Jul 15, 2026
dd93d3c
Merge remote-tracking branch 'origin/main' into feat/disaggregatedset…
panpan0000 Jul 15, 2026
d9498fb
fix(operator): apply desired DisaggregatedSet metadata
panpan0000 Jul 15, 2026
6849dee
test(operator): cover DisaggregatedSet cutover
panpan0000 Jul 15, 2026
3dd6d41
Merge remote-tracking branch 'origin/main' into feat/disaggregatedset…
panpan0000 Jul 20, 2026
fec36f7
fix(operator): close DisaggregatedSet lifecycle gaps
panpan0000 Jul 21, 2026
64246cc
fix(operator): preserve DisaggregatedSet restart lifecycle
panpan0000 Jul 22, 2026
88b846d
Merge remote-tracking branch 'origin/main' into feat/disaggregatedset…
panpan0000 Jul 22, 2026
1e3b125
fix(operator): harden DisaggregatedSet readiness detection
panpan0000 Jul 22, 2026
40723a4
chore(operator): merge main into DisaggregatedSet pathway
panpan0000 Jul 28, 2026
017d94d
fix(operator): harden DisaggregatedSet reconciliation
panpan0000 Jul 28, 2026
a499a69
fix(operator): recreate model service during DS fallback
panpan0000 Jul 29, 2026
cf04360
fix(operator): complete coalesced DS restarts
panpan0000 Jul 29, 2026
1a33ed8
fix(operator): accept sibling DCD service owners
panpan0000 Jul 29, 2026
7854e10
chore(operator): reuse DCD kind constant
panpan0000 Jul 29, 2026
ed4275c
fix(operator): sync DisaggregatedSet with main
panpan0000 Jul 31, 2026
6cfd570
fix(operator): resync DisaggregatedSet with main
panpan0000 Aug 2, 2026
d3fa86b
fix(operator): resync DisaggregatedSet with main
panpan0000 Aug 3, 2026
84e63e5
fix(operator): resync DisaggregatedSet with main
panpan0000 Aug 3, 2026
8763efe
fix(operator): exclude DS envtest from clustertest build
panpan0000 Aug 3, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,18 @@ rules:
- patch
- update
- watch
- apiGroups:
- disaggregatedset.x-k8s.io
resources:
- disaggregatedsets
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
- apiGroups:
- discovery.k8s.io
resources:
Expand Down
12 changes: 12 additions & 0 deletions deploy/operator/config/rbac/role.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,18 @@ rules:
- patch
- update
- watch
- apiGroups:
- disaggregatedset.x-k8s.io
resources:
- disaggregatedsets
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
- apiGroups:
- discovery.k8s.io
resources:
Expand Down
3 changes: 2 additions & 1 deletion deploy/operator/internal/consts/consts.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ const (

KubeLabelDynamoSelector = "nvidia.com/selector"

KubeAnnotationEnableGrove = "nvidia.com/enable-grove"
KubeAnnotationEnableGrove = "nvidia.com/enable-grove"
KubeAnnotationEnableDisaggregatedSet = "nvidia.com/enable-disaggregatedset"

// KubeAnnotationGroveUpdateStrategy temporarily exposes the Grove
// PodCliqueSet update strategy while the long-term DGD API is settled.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -551,61 +551,74 @@ func (r *DynamoComponentDeploymentReconciler) generateLeaderWorkerSet(ctx contex
logs := log.FromContext(ctx)
logs.Info("Generating LeaderWorkerSet")

leaderPodTemplateSpec, workerPodTemplateSpec, err := r.renderMultinodePodTemplateSpecs(ctx, opt)
if err != nil {
return nil, false, err
}

kubeName := leaderWorkerSetName(opt.dynamoComponentDeployment)
kubeNs := opt.dynamoComponentDeployment.Namespace
labels := dynamo.GetDCDKubeLabels(opt.dynamoComponentDeployment)

if labels == nil {
labels = make(map[string]string)
}
podLabels, err := r.getDCDWorkloadPodLabels(ctx, opt.dynamoComponentDeployment)
if err != nil {
return nil, false, err

desiredReplicas := int32(1)
if opt.dynamoComponentDeployment.Spec.Replicas != nil {
desiredReplicas = *opt.dynamoComponentDeployment.Spec.Replicas
}
groupSize := opt.dynamoComponentDeployment.GetNumberOfNodes()

leaderWorkerSet := &leaderworkersetv1.LeaderWorkerSet{
return &leaderworkersetv1.LeaderWorkerSet{
ObjectMeta: metav1.ObjectMeta{
Name: kubeName,
Namespace: kubeNs,
Labels: labels,
},
}
Spec: leaderworkersetv1.LeaderWorkerSetSpec{
Replicas: &desiredReplicas,
StartupPolicy: leaderworkersetv1.LeaderCreatedStartupPolicy,
LeaderWorkerTemplate: leaderworkersetv1.LeaderWorkerTemplate{
LeaderTemplate: leaderPodTemplateSpec,
WorkerTemplate: *workerPodTemplateSpec,
Size: &groupSize,
},
},
}, false, nil
}

leaderPodLabels := make(map[string]string)
for k, v := range podLabels {
leaderPodLabels[k] = v
}
leaderPodTemplateSpec, err := r.generateLeaderPodTemplateSpec(ctx, opt, leaderPodLabels)
// renderMultinodePodTemplateSpecs is the shared multinode render path used by
// both the LWS pathway and the DisaggregatedSet pathway. Returning the two
// pod templates (rather than a fully composed LWS) keeps downstream callers
// (DS, future templating work) free to compose their own role structure.
func (r *DynamoComponentDeploymentReconciler) renderMultinodePodTemplateSpecs(
ctx context.Context,
opt generateResourceOption,
) (*corev1.PodTemplateSpec, *corev1.PodTemplateSpec, error) {
podLabels, err := r.getDCDWorkloadPodLabels(ctx, opt.dynamoComponentDeployment)
if err != nil {
return nil, false, errors.Wrap(err, "generateLeaderWorkerSet: failed to generate leader pod template")
return nil, nil, err
}

workerPodLabels := make(map[string]string)
leaderLabels := make(map[string]string, len(podLabels))
for k, v := range podLabels {
workerPodLabels[k] = v
leaderLabels[k] = v
}
workerPodTemplateSpec, err := r.generateWorkerPodTemplateSpec(ctx, opt, workerPodLabels)
leaderPodTemplateSpec, err := r.generateLeaderPodTemplateSpec(ctx, opt, leaderLabels)
if err != nil {
return nil, false, errors.Wrap(err, "generateLeaderWorkerSet: failed to generate worker pod template")
return nil, nil, err
}

desiredReplicas := int32(1)
if opt.dynamoComponentDeployment.Spec.Replicas != nil {
desiredReplicas = *opt.dynamoComponentDeployment.Spec.Replicas
workerLabels := make(map[string]string, len(podLabels))
for k, v := range podLabels {
workerLabels[k] = v
}
groupSize := opt.dynamoComponentDeployment.GetNumberOfNodes()

leaderWorkerSet.Spec = leaderworkersetv1.LeaderWorkerSetSpec{
Replicas: &desiredReplicas,
StartupPolicy: leaderworkersetv1.LeaderCreatedStartupPolicy,
LeaderWorkerTemplate: leaderworkersetv1.LeaderWorkerTemplate{
LeaderTemplate: leaderPodTemplateSpec,
WorkerTemplate: *workerPodTemplateSpec,
Size: &groupSize,
},
workerPodTemplateSpec, err := r.generateWorkerPodTemplateSpec(ctx, opt, workerLabels)
if err != nil {
return nil, nil, err
}

return leaderWorkerSet, false, nil
return leaderPodTemplateSpec, workerPodTemplateSpec, nil
}

// getDCDWorkloadPodLabels keeps LWS pod labels aligned with the workload
Expand Down
Loading
Loading