Skip to content

feat(operator): add DisaggregatedSet workload program - #12625

Open
panpan0000 wants to merge 29 commits into
ai-dynamo:mainfrom
panpan0000:feat/disaggregatedset-program
Open

feat(operator): add DisaggregatedSet workload program#12625
panpan0000 wants to merge 29 commits into
ai-dynamo:mainfrom
panpan0000:feat/disaggregatedset-program

Conversation

@panpan0000

@panpan0000 panpan0000 commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Summary

Rebased onto main after #12942 and integrated DisaggregatedSet as the third durable DGD workload provider.

  • Support durable provider values component, grove, and disaggregatedset.
  • Keep Grove as the default when enabled, while DS remains explicit opt-in after Grove is not selected.
  • Materialize nvidia.com/workload-provider before workload side effects and adopt legacy DGDs from their owned DCD, PodCliqueSet, or DisaggregatedSet resources.
  • Treat provider selection as immutable. The enable annotations are creation/adoption-time intent only; existing DGDs do not migrate between providers.
  • Report Ready=False with selected_workload_provider_unavailable when the selected provider is unavailable; there is no provider fallback or cross-provider cleanup.
  • Preserve DS reconciliation, readiness, revision-aware rollout, Service management, restart, checkpoint, and LWS v0.10 behavior. DS continues to use the LWS default of slices=1 until the grouping/cardinality API is available.
  • Remove the parallel runtime Capabilities concept and update operator tests and multinode documentation for the durable-provider model.

Review focus

  • deploy/operator/internal/controller/dgd_workload_provider.go
  • deploy/operator/internal/controller/dgd_disaggregatedset_program.go
  • deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go
  • deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_envtest_test.go

Validation

  • go test ./internal/controller -count=1 — passed.
  • go test ./... -count=1 — all non-e2e operator packages passed; the e2e package was blocked during Docker image metadata resolution because nvcr.io and the configured Docker mirror returned HTTP 403.
  • git diff --check — passed.

Related Issues

@panpan0000
panpan0000 requested a review from a team as a code owner August 4, 2026 06:19
@copy-pr-bot

copy-pr-bot Bot commented Aug 4, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@panpan0000
panpan0000 temporarily deployed to external_collaborator August 4, 2026 06:19 — with GitHub Actions Inactive
@panpan0000
panpan0000 temporarily deployed to external_collaborator August 4, 2026 06:19 — with GitHub Actions Inactive
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

👋 Hi panpan0000! Thank you for contributing to ai-dynamo/dynamo.

Just a reminder: The NVIDIA Test Github Validation CI runs an essential subset of the testing framework to quickly catch errors.Your PR reviewers may elect to test the changes comprehensively before approving your changes.

🚀

@github-actions github-actions Bot added feat external-contribution Pull request is from an external contributor deployment::k8s Relates to dynamo deployment in kubernetes labels Aug 4, 2026
@datadog-official

This comment has been minimized.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 6 potential issues.

Open in Devin Review

Comment thread deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go Outdated
Comment thread deploy/operator/internal/controller/dgd_disaggregatedset_program.go Outdated
Comment thread deploy/operator/internal/controller/dgd_disaggregatedset_program.go Outdated
Comment thread deploy/operator/internal/features/gates.go Outdated
@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Adds feature-gated DisaggregatedSet reconciliation for eligible workloads. The operator now detects DisaggregatedSet and LeaderWorkerSet APIs, routes opted-in deployments through a dedicated DisaggregatedSet reconciliation path, manages service ownership during transitions between pathways, cleans up legacy resources, and validates readiness through both DisaggregatedSet and child LeaderWorkerSet status.

Changes

DisaggregatedSet reconciliation

Layer / File(s) Summary
Feature gating, RBAC, annotation, and test infrastructure
deploy/operator/internal/features/gates.go, deploy/operator/internal/consts/consts.go, deploy/operator/config/rbac/role.yaml, deploy/helm/charts/platform/components/operator/files/manager-role.yaml, deploy/operator/internal/controller/testing/disaggregatedset/*, deploy/operator/internal/testing/operatorenv/env.go
Adds the DisaggregatedSet feature gate detecting the disaggregatedset.x-k8s.io API, RBAC permissions for DisaggregatedSet resources, annotation constant KubeAnnotationEnableDisaggregatedSet, test CRDs for DisaggregatedSet and LeaderWorkerSet, and envtest registration.
Controller watches and event routing
deploy/operator/internal/controller/dynamographdeployment_controller.go, deploy/operator/internal/controller/dynamographdeployment_controller_test.go
Adds LeaderWorkerSet API import, routing-annotation predicates for DisaggregatedSet and Grove changes, status-only filtering for DisaggregatedSet updates, ownership-based event mapping for LeaderWorkerSet child changes, and test scheme registration.
Workload program selection and legacy cleanup
deploy/operator/internal/controller/dgd_workload_program.go, deploy/operator/internal/controller/dgd_component_program.go, deploy/operator/internal/controller/dgd_grove_program.go, deploy/operator/internal/controller/dgd_workload_program_test.go
Routes deployments to DisaggregatedSet program when opted-in via annotation, maintaining Grove and component program fallback order. Component and Grove programs execute legacy cleanup callbacks after successful reconciliation to remove stale DisaggregatedSets.
DisaggregatedSet resource reconciliation and service management
deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go
Selects eligible multinode worker components, generates roles with deterministic naming and DNS-safe truncation, synchronizes role specifications and workloads with restart-annotation recovery and checkpoint startup gating, reconciles component and model services with ownership validation, evaluates readiness from DisaggregatedSet or child LeaderWorkerSet status, handles service ownership transitions during fallback, and cleans up legacy PodCliqueSets and stale resources.
DisaggregatedSet program and workload reconciliation orchestration
deploy/operator/internal/controller/dgd_disaggregatedset_program.go, deploy/operator/internal/controller/dgd_disaggregatedset_workloads_reconciler.go
Initializes shared-resource, rollout, restart, workload, and scaling-adapter reconcilers. Implements eligibility checking with fallback to component program, deferred cleanup, and service-ownership restoration. Executes the primary pipeline: worker rollout migration, shared-resource checkpoints, restart transitions with parallel and sequential mode support, workload progress tracking, checkpoint readiness gating, and scaling-adapter reconciliation.
Unit and integration test coverage
deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_test.go, deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_envtest_test.go
Unit tests validate component selection, DNS naming limits, readiness transitions, routing predicates, and annotation changes. Integration tests validate metadata propagation, sequential restart coalescing, ownership transitions with service preservation, missing service recreation, and lifecycle gating for cleanup sequencing. Includes reconciler setup, program execution, resource creation, and status-marking helpers.

Estimated code review effort: 5 (Critical) | ~120 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 3.39% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The description identifies the related issue as #12035 and uses the required Relates to relationship.
Out of Scope Changes check ✅ Passed The summarized changes support the stated DisaggregatedSet workload-provider objectives and include related tests, RBAC, and feature-gate wiring.
Title check ✅ Passed The title clearly identifies the primary change: adding the DisaggregatedSet workload program to the operator.
Description check ✅ Passed The description provides a detailed summary, review focus, validation results, and related issues, with only minor differences from the template headings.

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (12)
deploy/operator/internal/controller/dgd_workload_program_test.go (2)

119-125: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a test-step heading for the DisaggregatedSet assertions.

Add t.Log("Verify the DisaggregatedSet program dependencies") before Line 119.

Proposed change
 			if grove, ok := got.(*groveProgram); ok {
 				assert.NotNil(t, grove.sharedResources)
 				assert.NotNil(t, grove.rollout)
 				assert.NotNil(t, grove.restart)
 				assert.NotNil(t, grove.restartProgress)
 				assert.NotNil(t, grove.workloads)
 				assert.NotNil(t, grove.scalingAdapters)
 				assert.NotNil(t, grove.topology)
 			}
+			t.Log("Verify the DisaggregatedSet program dependencies")
 			if ds, ok := got.(*disaggregatedSetProgram); ok {

As per coding guidelines, “Use one t.Log heading before each block that implements a test step so test output tells the scenario's story.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deploy/operator/internal/controller/dgd_workload_program_test.go` around
lines 119 - 125, Add a test-step heading immediately before the DisaggregatedSet
type assertion block in the relevant test, using t.Log with the message “Verify
the DisaggregatedSet program dependencies”. Keep the existing dependency
assertions unchanged.

Source: Coding guidelines


74-80: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Test the Grove-first routing conflict.

The added case tests only DisaggregatedSet opt-in. Add a case with groveEnabled: true and the DisaggregatedSet annotation. Expect groveProgram. This protects the required Grove-first routing order.

Proposed test case
 		{
 			name: "explicit DisaggregatedSet opt-in selects DS program",
 			annotations: map[string]string{
 				commonconsts.KubeAnnotationEnableDisaggregatedSet: commonconsts.KubeLabelValueTrue,
 			},
 			wantProgram: &disaggregatedSetProgram{},
 		},
+		{
+			name:         "Grove pathway takes precedence over DisaggregatedSet opt-in",
+			groveEnabled: true,
+			annotations: map[string]string{
+				commonconsts.KubeAnnotationEnableDisaggregatedSet: commonconsts.KubeLabelValueTrue,
+			},
+			wantProgram: &groveProgram{},
+		},
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deploy/operator/internal/controller/dgd_workload_program_test.go` around
lines 74 - 80, Add a test case in the workload program selection tests alongside
the explicit DisaggregatedSet opt-in case, setting groveEnabled to true and
retaining the DisaggregatedSet annotation; assert that wantProgram is
groveProgram to verify Grove takes precedence over DisaggregatedSet routing.
deploy/operator/internal/controller/dgd_workload_program.go (1)

81-83: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add required story comments before the new semantic blocks.

  • deploy/operator/internal/controller/dgd_workload_program.go#L81-L83: add a story comment for DisaggregatedSet selection after Grove routing.
  • deploy/operator/internal/controller/dgd_disaggregatedset_program.go#L62-L131: add story comments for failure handling, fallback, rollout, shared resources, restart, workloads, and final result handling.
  • deploy/operator/internal/controller/dgd_disaggregatedset_program.go#L139-L143: add a story comment for worker-hash migration and unsupported-rollout handling.
  • deploy/operator/internal/controller/dgd_component_program.go#L60-L63: add a story comment for legacy cleanup wiring.
  • deploy/operator/internal/controller/dgd_component_program.go#L140-L144: add a story comment for cleanup after successful component reconciliation.
  • deploy/operator/internal/controller/dgd_grove_program.go#L65-L68: add a story comment for legacy cleanup wiring.
  • deploy/operator/internal/controller/dgd_grove_program.go#L136-L140: add a story comment for cleanup after successful Grove reconciliation.

As per coding guidelines, “In Go code, put a one-line story comment above every multi-line block of logically connected code.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deploy/operator/internal/controller/dgd_workload_program.go` around lines 81
- 83, Add one-line story comments above each specified multi-line semantic
block: in deploy/operator/internal/controller/dgd_workload_program.go lines
81-83, document DisaggregatedSet selection after Grove routing; in
deploy/operator/internal/controller/dgd_disaggregatedset_program.go lines
62-131, document failure handling, fallback, rollout, shared resources, restart,
workloads, and final result handling, and lines 139-143, document worker-hash
migration and unsupported-rollout handling; in
deploy/operator/internal/controller/dgd_component_program.go lines 60-63 and
140-144, document legacy cleanup wiring and cleanup after successful component
reconciliation; and in deploy/operator/internal/controller/dgd_grove_program.go
lines 65-68 and 136-140, document legacy cleanup wiring and cleanup after
successful Grove reconciliation.

Source: Coding guidelines

deploy/operator/internal/controller/dynamographdeployment_controller.go (1)

188-208: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Add a one-line story comment above each new predicate helper.

workloadRoutingAnnotationsChanged and dgdOwnedServiceEventPredicate each contain a multi-line block of connected logic. The repository guidelines require a one-line story comment above such blocks. State why routing-annotation updates must bypass generation filtering, and why owned Service creation events are ignored.

As per coding guidelines: "In Go code, put a one-line story comment above every multi-line block of logically connected code."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deploy/operator/internal/controller/dynamographdeployment_controller.go`
around lines 188 - 208, Add one-line story comments immediately above
workloadRoutingAnnotationsChanged and dgdOwnedServiceEventPredicate, explaining
that routing-annotation changes must bypass generation filtering and that owned
Service creation events are ignored, respectively.

Source: Coding guidelines

deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go (2)

965-977: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Extract the duplicated owner-reference rewrite.

Lines 966-977 and lines 1027-1038 implement the same algorithm: drop every existing controller reference, drop any reference matching the new one, then append the new controller reference. Only the reference value differs. Extract one helper such as replaceControllerOwnerReference(obj client.Object, ownerRef metav1.OwnerReference) and call it from both places. That keeps the adoption rule in one location.

Also applies to: 1027-1038

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go`
around lines 965 - 977, Extract the duplicated owner-reference replacement
algorithm into a shared helper such as replaceControllerOwnerReference(obj
client.Object, ownerRef metav1.OwnerReference). Move the existing filtering and
append logic from both call sites into that helper, then replace each inline
block with a helper call while preserving the current adoption behavior.

1451-1480: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Give these delegations explicit collaborators instead of ad-hoc zero-value construction.

Each helper builds a componentWorkloadsReconciler at call time. Line 1479 builds one with no fields at all, which works only while applyCheckpointStartupPolicy reads no struct field. If that method later needs syncer or rollout, the call panics with a nil dereference, and nothing in the type signature warns about it. The repeated inline construction also re-creates the syncer and rollout collaborators on every reconcile.

Hold one constructed collaborator on the DS pathway and pass it in, so the dependency is explicit and checked at construction time.

As per coding guidelines: "Use concrete nested reconcilers with explicit dependencies; programs must not retain or call an all-capable DynamoGraphDeploymentReconciler."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go`
around lines 1451 - 1480, Refactor the DCD helper delegations, especially
applyDCDCheckpointStartupPolicy and the methods on
DynamoGraphDeploymentReconciler, to use one explicitly constructed
componentWorkloadsReconciler with its syncer and rollout collaborators supplied
at construction. Hold and reuse that collaborator on the DS pathway instead of
rebuilding it per call or using the zero-value construction in
applyDCDCheckpointStartupPolicy, and pass the concrete dependency through the
relevant call sites.

Source: Coding guidelines

deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_envtest_test.go (3)

149-149: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Set the opt-in annotation without replacing the whole annotation map.

Line 149 replaces current.Annotations with a new single-entry map. The test then re-reads current after each reconcile, so any annotation that the program or the API server adds to the DGD is silently dropped at this point. That makes the cutover step depend on the DGD carrying no other annotations. Mutate the existing map instead, and keep the nil case handled.

♻️ Proposed change to set the annotation in place
-	current.Annotations = map[string]string{consts.KubeAnnotationEnableDisaggregatedSet: consts.KubeLabelValueTrue}
+	if current.Annotations == nil {
+		current.Annotations = map[string]string{}
+	}
+	current.Annotations[consts.KubeAnnotationEnableDisaggregatedSet] = consts.KubeLabelValueTrue
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_envtest_test.go`
at line 149, Update the annotation assignment in the reconcile test to mutate
current.Annotations in place rather than replacing the map, preserving existing
annotations across re-reads. Initialize the map when it is nil, then set
consts.KubeAnnotationEnableDisaggregatedSet to consts.KubeLabelValueTrue.

371-384: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

Scope the DCD list to the test namespace.

ownedEnvtestCutoverDCDs lists DynamoComponentDeployment objects across all namespaces and then filters by controller reference. The filter keeps the result correct, but the list grows with every object that other suites leave behind. Add client.InNamespace(dgd.Namespace) to keep the read scoped.

♻️ Proposed change to scope the list
-	Expect(k8sClient.List(ctx, list)).To(Succeed())
+	Expect(k8sClient.List(ctx, list, client.InNamespace(dgd.Namespace))).To(Succeed())
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_envtest_test.go`
around lines 371 - 384, Update ownedEnvtestCutoverDCDs to scope the
DynamoComponentDeploymentList call to dgd.Namespace by passing
client.InNamespace(dgd.Namespace) to k8sClient.List, while preserving the
existing controller-reference filtering and returned results.

359-366: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Derive the component service name the same way in both helpers.

createComponentServices reads the service at dcds[i].Name (line 365). The cutover assertion reads the same service at dynamo.NormalizeKubeResourceName(dcd.Name) (line 201). The two derivations agree only while every generated DCD name is already normalized. If a component name ever needs normalization, this helper fails with a NotFound instead of reporting the ownership behavior under test. Use the same normalization in both places.

♻️ Proposed change to normalize the service name
 		service := &corev1.Service{}
-		Expect(k8sClient.Get(ctx, types.NamespacedName{Name: dcds[i].Name, Namespace: dcds[i].Namespace}, service)).To(Succeed())
+		Expect(k8sClient.Get(ctx, types.NamespacedName{
+			Name:      dynamo.NormalizeKubeResourceName(dcds[i].Name),
+			Namespace: dcds[i].Namespace,
+		}, service)).To(Succeed())
 		serviceUIDs[service.Name] = service.UID
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_envtest_test.go`
around lines 359 - 366, Update the service lookup in createComponentServices to
derive the name with dynamo.NormalizeKubeResourceName, matching the cutover
assertion’s lookup. Use the normalized name consistently when retrieving the
Service and recording its UID, while preserving the existing namespace and
ownership assertions.
deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_test.go (2)

146-176: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Cover a status-only change in the predicate test.

disaggregatedSetStatusChanged and leaderWorkerSetStatusChanged gate reconciliation on status transitions. This test exercises only label changes and an owner-reference change. It never asserts that a change confined to status returns true. A regression that drops status comparison would still pass. Add a case that mutates only status on both object kinds.

As per coding guidelines: "Preserve coverage for pathway selection, rollout and restart transitions, readiness, significant watches, ownership, cleanup, and generated-resource parity."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_test.go`
around lines 146 - 176, Add status-only mutation cases to
TestDisaggregatedSetPredicatesObserveRoutingMetadata for both
disaggregatedSetStatusChanged and leaderWorkerSetStatusChanged, changing only
each object’s status while preserving labels, ownership, and other metadata;
assert the predicates return true for those status transitions.

Source: Coding guidelines


22-78: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider a table test for the component selection cases.

The two subtests build almost the same DynamoGraphDeployment and differ only in the ScalingAdapter field and the expected outcome. A table test keeps the fixture in one place and makes future rejection reasons cheap to add.

As per coding guidelines: "Prefer table tests over one-off Go tests and do not duplicate behavior already covered by a table."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_test.go`
around lines 22 - 78, Refactor TestSelectDisaggregatedSetComponents into a
table-driven test, consolidating the shared DynamoGraphDeployment fixture and
varying only fields such as ScalingAdapter and expected selection or rejection
reason. Preserve the existing assertions for multinode role selection and
scaling-adapter rejection, while making additional cases easy to add.

Source: Coding guidelines

deploy/operator/internal/controller/dgd_disaggregatedset_workloads_reconciler.go (1)

73-94: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add story comments for restart-control blocks.

Add a one-line story comment before each multi-line semantic block. State the restart-state transition, such as preserving terminal state, superseding a restart, waiting for a component, or coalescing selected components.

As per coding guidelines, “In Go code, put a one-line story comment above every multi-line block of logically connected code.”

Also applies to: 103-145, 153-206, 214-231

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@deploy/operator/internal/controller/dgd_disaggregatedset_workloads_reconciler.go`
around lines 73 - 94, Add one-line story comments above each multi-line
restart-control block in the restart-status logic, including the terminal-state
preservation, already-processed handling, rolling-update supersession,
parallel/sequential computation, and the additionally referenced blocks. Each
comment should describe the resulting restart-state transition or coordination
behavior without changing the implementation.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@deploy/operator/internal/controller/dgd_disaggregatedset_program.go`:
- Line 52: The workload programs retain excessive controller coupling and invoke
another complete program. In
deploy/operator/internal/controller/dgd_disaggregatedset_program.go:52, pass a
scoped collaborator instead of the all-capable reconciler; in
deploy/operator/internal/controller/dgd_disaggregatedset_program.go:73-94,
remove componentProgram construction and invocation and implement fallback using
units owned by the DisaggregatedSet program. In
deploy/operator/internal/controller/dgd_component_program.go:60-63 and
deploy/operator/internal/controller/dgd_grove_program.go:65-68, inject concrete
legacy-cleanup collaborators instead of closures capturing the reconciler.
- Around line 85-95: Move restoreDisaggregatedSetServiceOwnershipToDCDs and
deleteDisaggregatedSetIfExists out of the unconditional post-componentProgram
path in componentProgram’s caller, and execute both only when the result state
is DGDStateSuccessful. Preserve pending fallback results without cleanup, and
add coverage for the DS-annotation path where replacement DCDs remain pending.

In
`@deploy/operator/internal/controller/dgd_disaggregatedset_workloads_reconciler.go`:
- Around line 29-41: Remove the owner field and *DynamoGraphDeploymentReconciler
parameter from newDisaggregatedSetWorkloadsReconciler, replacing them with
narrowly scoped collaborators for resource reconciliation and restart
observation. Update the call sites around lines 66, 133, and 179 to use those
injected collaborators directly, ensuring disaggregatedSetWorkloadsReconciler no
longer retains or invokes the all-capable outer controller.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_test.go`:
- Around line 111-144: Add t.Log headings before each distinct scenario block in
TestCheckDisaggregatedSetReadiness: stale observedGeneration, lagging decode
readiness, and fully ready status. Apply the same one-heading-per-step
convention to the other tests in this file, using concise messages that identify
each scenario and preserve the existing assertions and mutations.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go`:
- Around line 445-450: Guard the dcds[componentName] lookup in the loop that
builds selection.desiredReplicas before modifying or dereferencing the
deployment. If the component is absent, return the same explicit
missing-component error used by generateDisaggregatedSet and
reconcileDisaggregatedSetSideResources; otherwise preserve the existing replica
assignment and desiredComponentReplicas flow.
- Around line 315-322: Update reconcileDisaggregatedSetSideResources and its
Service cleanup logic so generated Services are deleted only for DCDs removed
from the current selection, not for selected DCDs. Account for generateService
normalizing dcd.Name when matching cleanup targets, while preserving Services
for selected components with Service enabled to prevent endpoint loss and
reconcile churn.

In `@deploy/operator/internal/testing/operatorenv/env.go`:
- Line 496: Replace the leading spaces on the filepath.Join entry in the
surrounding environment path list with a tab, matching adjacent lines and gofmt
formatting.

---

Nitpick comments:
In
`@deploy/operator/internal/controller/dgd_disaggregatedset_workloads_reconciler.go`:
- Around line 73-94: Add one-line story comments above each multi-line
restart-control block in the restart-status logic, including the terminal-state
preservation, already-processed handling, rolling-update supersession,
parallel/sequential computation, and the additionally referenced blocks. Each
comment should describe the resulting restart-state transition or coordination
behavior without changing the implementation.

In `@deploy/operator/internal/controller/dgd_workload_program_test.go`:
- Around line 119-125: Add a test-step heading immediately before the
DisaggregatedSet type assertion block in the relevant test, using t.Log with the
message “Verify the DisaggregatedSet program dependencies”. Keep the existing
dependency assertions unchanged.
- Around line 74-80: Add a test case in the workload program selection tests
alongside the explicit DisaggregatedSet opt-in case, setting groveEnabled to
true and retaining the DisaggregatedSet annotation; assert that wantProgram is
groveProgram to verify Grove takes precedence over DisaggregatedSet routing.

In `@deploy/operator/internal/controller/dgd_workload_program.go`:
- Around line 81-83: Add one-line story comments above each specified multi-line
semantic block: in deploy/operator/internal/controller/dgd_workload_program.go
lines 81-83, document DisaggregatedSet selection after Grove routing; in
deploy/operator/internal/controller/dgd_disaggregatedset_program.go lines
62-131, document failure handling, fallback, rollout, shared resources, restart,
workloads, and final result handling, and lines 139-143, document worker-hash
migration and unsupported-rollout handling; in
deploy/operator/internal/controller/dgd_component_program.go lines 60-63 and
140-144, document legacy cleanup wiring and cleanup after successful component
reconciliation; and in deploy/operator/internal/controller/dgd_grove_program.go
lines 65-68 and 136-140, document legacy cleanup wiring and cleanup after
successful Grove reconciliation.

In `@deploy/operator/internal/controller/dynamographdeployment_controller.go`:
- Around line 188-208: Add one-line story comments immediately above
workloadRoutingAnnotationsChanged and dgdOwnedServiceEventPredicate, explaining
that routing-annotation changes must bypass generation filtering and that owned
Service creation events are ignored, respectively.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_envtest_test.go`:
- Line 149: Update the annotation assignment in the reconcile test to mutate
current.Annotations in place rather than replacing the map, preserving existing
annotations across re-reads. Initialize the map when it is nil, then set
consts.KubeAnnotationEnableDisaggregatedSet to consts.KubeLabelValueTrue.
- Around line 371-384: Update ownedEnvtestCutoverDCDs to scope the
DynamoComponentDeploymentList call to dgd.Namespace by passing
client.InNamespace(dgd.Namespace) to k8sClient.List, while preserving the
existing controller-reference filtering and returned results.
- Around line 359-366: Update the service lookup in createComponentServices to
derive the name with dynamo.NormalizeKubeResourceName, matching the cutover
assertion’s lookup. Use the normalized name consistently when retrieving the
Service and recording its UID, while preserving the existing namespace and
ownership assertions.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_test.go`:
- Around line 146-176: Add status-only mutation cases to
TestDisaggregatedSetPredicatesObserveRoutingMetadata for both
disaggregatedSetStatusChanged and leaderWorkerSetStatusChanged, changing only
each object’s status while preserving labels, ownership, and other metadata;
assert the predicates return true for those status transitions.
- Around line 22-78: Refactor TestSelectDisaggregatedSetComponents into a
table-driven test, consolidating the shared DynamoGraphDeployment fixture and
varying only fields such as ScalingAdapter and expected selection or rejection
reason. Preserve the existing assertions for multinode role selection and
scaling-adapter rejection, while making additional cases easy to add.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go`:
- Around line 965-977: Extract the duplicated owner-reference replacement
algorithm into a shared helper such as replaceControllerOwnerReference(obj
client.Object, ownerRef metav1.OwnerReference). Move the existing filtering and
append logic from both call sites into that helper, then replace each inline
block with a helper call while preserving the current adoption behavior.
- Around line 1451-1480: Refactor the DCD helper delegations, especially
applyDCDCheckpointStartupPolicy and the methods on
DynamoGraphDeploymentReconciler, to use one explicitly constructed
componentWorkloadsReconciler with its syncer and rollout collaborators supplied
at construction. Hold and reuse that collaborator on the DS pathway instead of
rebuilding it per call or using the zero-value construction in
applyDCDCheckpointStartupPolicy, and pass the concrete dependency through the
relevant call sites.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: a355c4e2-942a-42ef-9a85-e85acd7beaee

📥 Commits

Reviewing files that changed from the base of the PR and between 4860c46 and 2f66c21.

📒 Files selected for processing (19)
  • deploy/helm/charts/platform/components/operator/files/manager-role.yaml
  • deploy/operator/config/rbac/role.yaml
  • deploy/operator/internal/consts/consts.go
  • deploy/operator/internal/controller/dgd_component_program.go
  • deploy/operator/internal/controller/dgd_disaggregatedset_program.go
  • deploy/operator/internal/controller/dgd_disaggregatedset_workloads_reconciler.go
  • deploy/operator/internal/controller/dgd_grove_program.go
  • deploy/operator/internal/controller/dgd_workload_program.go
  • deploy/operator/internal/controller/dgd_workload_program_test.go
  • deploy/operator/internal/controller/dynamographdeployment_controller.go
  • deploy/operator/internal/controller/dynamographdeployment_controller_test.go
  • deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go
  • deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_envtest_test.go
  • deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_test.go
  • deploy/operator/internal/controller/testing/disaggregatedset/disaggregatedsets.yaml
  • deploy/operator/internal/controller/testing/disaggregatedset/leaderworkersets.yaml
  • deploy/operator/internal/features/gates.go
  • deploy/operator/internal/features/gates_test.go
  • deploy/operator/internal/testing/operatorenv/env.go

Comment thread deploy/operator/internal/controller/dgd_disaggregatedset_program.go Outdated
Comment thread deploy/operator/internal/controller/dgd_disaggregatedset_program.go Outdated
Comment thread deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go Outdated
Comment thread deploy/operator/internal/testing/operatorenv/env.go Outdated
@panpan0000
panpan0000 temporarily deployed to external_collaborator August 4, 2026 06:33 — with GitHub Actions Inactive
@panpan0000
panpan0000 temporarily deployed to external_collaborator August 4, 2026 06:56 — with GitHub Actions Inactive
@panpan0000
panpan0000 temporarily deployed to external_collaborator August 4, 2026 07:06 — with GitHub Actions Inactive
@panpan0000

Copy link
Copy Markdown
Contributor Author

Thanks for the detailed checks.

Updates pushed:

  • Fixed gofmt indentation in operatorenv CRD paths (commit 0b80a19).
  • DS fallback visibility: record a DGD condition (DisaggregatedSetEligible) and removed the redundant pre-fallback condition write (commits 7b4925e, 0b80a19).
  • Stabilized DS component Service cleanup: keep the currently desired DGD-owned Services for selected roles, and only delete stale DGD-owned component Services for selected roles (commit f97e50a).
  • Added a nil guard when applying checkpoint startup policies for selected roles (commit f97e50a).
  • Added small t.Log headings to multi-step tests for readability (commit f97e50a).

The earlier CI warning about an unused variable was on an older SHA and should be cleared by these commits.

@panpan0000
panpan0000 temporarily deployed to external_collaborator August 4, 2026 07:32 — with GitHub Actions Inactive
@panpan0000

Copy link
Copy Markdown
Contributor Author

Replying to CodeRabbit summary (https://github.com/ai-dynamo/dynamo/pull/12625#issuecomment-5175424178):\n\n- Fallback observability: added DisaggregatedSetEligible condition + warning event (7b4925e).\n- Service cleanup: no longer deletes active worker endpoints; only removes stale DS-selected services (f97e50a).\n- Fallback safety: DS cleanup deferred until after component fallback reconcile succeeds (f97e50a).\n- Feature gate: DS now honors explicit LWS opt-out (400f7ca).\n\nThanks for the review.

@panpan0000
panpan0000 temporarily deployed to external_collaborator August 4, 2026 08:22 — with GitHub Actions Inactive
@panpan0000
panpan0000 temporarily deployed to external_collaborator August 4, 2026 08:43 — with GitHub Actions Inactive
@julienmancuso

Copy link
Copy Markdown
Contributor

/ok to test 32475d9

@julienmancuso

Copy link
Copy Markdown
Contributor

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (3)
deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go (1)

780-795: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Reuse the rendered Services instead of rendering them twice.

reconcileDisaggregatedSetSideResources already builds a renderer and calls renderer.generateService for every selected component. deleteStaleDisaggregatedSetComponentServices repeats both steps to recompute the same names. generateService performs client reads, so each successful reconcile pays the cost twice, and the two name sets can diverge if rendering later becomes non-deterministic.

Return the desired Service names from reconcileDisaggregatedSetSideResources and pass them into the cleanup function.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go`
around lines 780 - 795, Update reconcileDisaggregatedSetSideResources to return
the desired Service names it already collects, and pass that set into
deleteStaleDisaggregatedSetComponentServices. Remove the cleanup function’s
duplicate renderer creation and generateService calls, using the returned names
for stale-service deletion while preserving existing error and deletion
handling.
deploy/operator/internal/controller/dgd_workload_program_test.go (1)

74-80: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Cover Grove precedence over DisaggregatedSet opt-in.

The Grove case does not set the DisaggregatedSet annotation. It does not verify the new selection order. A reorder that selects DisaggregatedSet before Grove would pass this table.

Add a case with groveEnabled: true and KubeAnnotationEnableDisaggregatedSet: "true". Expect *groveProgram.

Based on PR objectives, Grove-first routing is a required selection contract.

Proposed test case
 		{
 			name: "explicit DisaggregatedSet opt-in selects DS program",
 			annotations: map[string]string{
 				commonconsts.KubeAnnotationEnableDisaggregatedSet: commonconsts.KubeLabelValueTrue,
 			},
 			wantProgram: &disaggregatedSetProgram{},
 		},
+		{
+			name:         "Grove takes precedence over DisaggregatedSet opt-in",
+			groveEnabled: true,
+			annotations: map[string]string{
+				commonconsts.KubeAnnotationEnableDisaggregatedSet: commonconsts.KubeLabelValueTrue,
+			},
+			wantProgram: &groveProgram{},
+		},
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deploy/operator/internal/controller/dgd_workload_program_test.go` around
lines 74 - 80, Add a table-driven test case alongside the existing
DisaggregatedSet opt-in case with groveEnabled set to true and
KubeAnnotationEnableDisaggregatedSet set to the true value, and assert that the
selected program is groveProgram. This must verify Grove routing takes
precedence when both options are enabled.
deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_test.go (1)

181-198: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Cover DisaggregatedSet opt-out updates.

The test covers only false-to-true routing. Add true-to-false and true-to-absent cases. If an annotation-only opt-out does not satisfy this predicate, the controller does not enter the component fallback path.

Proposed change
 	t.Log("enabling DisaggregatedSet triggers update predicate")
 	newDGD = oldDGD.DeepCopy()
 	newDGD.Annotations[consts.KubeAnnotationEnableDisaggregatedSet] = consts.KubeLabelValueTrue
 	require.True(t, workloadRoutingAnnotationsChanged(updateEvent(oldDGD, newDGD)))
+
+	t.Log("disabling DisaggregatedSet triggers update predicate")
+	oldDGD.Annotations[consts.KubeAnnotationEnableDisaggregatedSet] = consts.KubeLabelValueTrue
+	newDGD = oldDGD.DeepCopy()
+	newDGD.Annotations[consts.KubeAnnotationEnableDisaggregatedSet] = consts.KubeLabelValueFalse
+	require.True(t, workloadRoutingAnnotationsChanged(updateEvent(oldDGD, newDGD)))
+
+	t.Log("removing DisaggregatedSet triggers update predicate")
+	newDGD = oldDGD.DeepCopy()
+	delete(newDGD.Annotations, consts.KubeAnnotationEnableDisaggregatedSet)
+	require.True(t, workloadRoutingAnnotationsChanged(updateEvent(oldDGD, newDGD)))
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_test.go`
around lines 181 - 198, Add coverage to TestWorkloadRoutingAnnotationsChanged
for DisaggregatedSet opt-out transitions: verify true-to-false and
true-to-absent annotation changes make workloadRoutingAnnotationsChanged return
true. Keep the existing false-to-true and unchanged cases intact, using DeepCopy
to construct each updated object.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@deploy/operator/internal/controller/dgd_disaggregatedset_program.go`:
- Around line 40-45: Keep complete programs independent by replacing
disaggregatedSetProgram’s newComponentProgram dependency with a narrow
fallback-reconciliation collaborator and invoking it from
disaggregatedSetProgram.Reconcile instead of constructing or calling
componentProgram.Reconcile; update
deploy/operator/internal/controller/dgd_disaggregatedset_program.go lines 40-45
and 84-87. In deploy/operator/internal/controller/dgd_component_program.go lines
37, 60-63, and 140-144, replace the reconciler callback with an explicit
legacy-cleanup collaborator, inject it without capturing
DynamoGraphDeploymentReconciler, and invoke it after successful reconciliation.
Apply the same collaborator extraction, injection, and post-success invocation
to deploy/operator/internal/controller/dgd_grove_program.go lines 35, 65-71, and
139-143, ensuring neither program retains or calls the all-capable reconciler.
- Around line 96-100: Update the fallback reconciliation flow around
fallbackProgram.Reconcile so DisaggregatedSetEligible=False is set on
programResult before returning retErr. Ensure subsequent failure-status handling
preserves this condition and add a test covering fallback reconciliation errors
with the persisted ineligibility condition.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_envtest_test.go`:
- Around line 330-340: The reconcileCurrentDGDProgram helper bypasses
DynamoGraphDeploymentReconciler.Reconcile by calling selectWorkloadProgram
directly, preventing tests from verifying that the outer controller handles
status persistence correctly. Add a new focused test that calls the full
DynamoGraphDeploymentReconciler.Reconcile method to verify the outer controller
boundary: confirm that only the outer controller writes to request.DGD.Status
and that the inner programs do not mutate that field. Retain
reconcileCurrentDGDProgram as-is for program-only behavior verification in
existing tests.
- Around line 169-213: Update the handoff assertions in the test around
modelService and fallbackDCDs to verify controller ownership, not only Service
UID preservation. While fallback is pending after removing the disaggregated-set
annotation, assert each preserved component Service remains owned by the DGD;
after DS readiness and DCD cleanup, assert every preserved component Service is
owned by a fallback DCD and retain the existing UID check for modelService.
- Around line 423-428: Update the synthetic Available condition in the
dcd.Status.Conditions assignment to set ObservedGeneration to dcd.Generation,
ensuring it identifies the generation that produced the condition.

In `@deploy/operator/internal/features/gates.go`:
- Around line 215-219: The selectWorkloadProgram function continues to select
disaggregatedSetProgram based on the opt-in annotation even when the
DisaggregatedSet feature gate is disabled. Update the workload selection logic
to include a check using RuntimeConfig.Gate.Enabled with
features.DisaggregatedSet alongside the existing annotation check, ensuring the
program is only selected when both the gate is enabled and the condition for
disaggregatedSetProgram is met, since SetupWithManager only registers the
required watches when this gate is enabled.

---

Nitpick comments:
In `@deploy/operator/internal/controller/dgd_workload_program_test.go`:
- Around line 74-80: Add a table-driven test case alongside the existing
DisaggregatedSet opt-in case with groveEnabled set to true and
KubeAnnotationEnableDisaggregatedSet set to the true value, and assert that the
selected program is groveProgram. This must verify Grove routing takes
precedence when both options are enabled.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_test.go`:
- Around line 181-198: Add coverage to TestWorkloadRoutingAnnotationsChanged for
DisaggregatedSet opt-out transitions: verify true-to-false and true-to-absent
annotation changes make workloadRoutingAnnotationsChanged return true. Keep the
existing false-to-true and unchanged cases intact, using DeepCopy to construct
each updated object.

In
`@deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go`:
- Around line 780-795: Update reconcileDisaggregatedSetSideResources to return
the desired Service names it already collects, and pass that set into
deleteStaleDisaggregatedSetComponentServices. Remove the cleanup function’s
duplicate renderer creation and generateService calls, using the returned names
for stale-service deletion while preserving existing error and deletion
handling.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: dff844a2-40ec-4c49-b13d-dca2a41b0434

📥 Commits

Reviewing files that changed from the base of the PR and between 4860c46 and 32475d9.

📒 Files selected for processing (19)
  • deploy/helm/charts/platform/components/operator/files/manager-role.yaml
  • deploy/operator/config/rbac/role.yaml
  • deploy/operator/internal/consts/consts.go
  • deploy/operator/internal/controller/dgd_component_program.go
  • deploy/operator/internal/controller/dgd_disaggregatedset_program.go
  • deploy/operator/internal/controller/dgd_disaggregatedset_workloads_reconciler.go
  • deploy/operator/internal/controller/dgd_grove_program.go
  • deploy/operator/internal/controller/dgd_workload_program.go
  • deploy/operator/internal/controller/dgd_workload_program_test.go
  • deploy/operator/internal/controller/dynamographdeployment_controller.go
  • deploy/operator/internal/controller/dynamographdeployment_controller_test.go
  • deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go
  • deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_envtest_test.go
  • deploy/operator/internal/controller/dynamographdeployment_disaggregatedset_test.go
  • deploy/operator/internal/controller/testing/disaggregatedset/disaggregatedsets.yaml
  • deploy/operator/internal/controller/testing/disaggregatedset/leaderworkersets.yaml
  • deploy/operator/internal/features/gates.go
  • deploy/operator/internal/features/gates_test.go
  • deploy/operator/internal/testing/operatorenv/env.go

Comment thread deploy/operator/internal/controller/dgd_disaggregatedset_program.go Outdated
Comment thread deploy/operator/internal/controller/dgd_disaggregatedset_program.go Outdated
Comment thread deploy/operator/internal/features/gates.go Outdated

@julienmancuso julienmancuso left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed this against the composition-first DGD rules in deploy/operator/internal/AGENTS.md and the behavior carried forward from the earlier DisaggregatedSet implementation.

The third-program direction is right, but I found two P1 correctness blockers and four P2 correctness/architecture blockers. In particular, the existing feedback about program nesting and all-capable-controller coupling is still valid: narrowing the static interface does not resolve it while the implementation remains DynamoGraphDeploymentReconciler.

Details are inline. I would address the P1s first, then restructure the DisaggregatedSet program around concrete collaborators before merge.

Comment thread deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go Outdated
Comment thread deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go Outdated
Comment thread deploy/operator/internal/controller/dgd_disaggregatedset_program.go Outdated
Comment thread deploy/operator/internal/controller/dgd_disaggregatedset_program.go Outdated
Comment thread deploy/operator/internal/controller/dynamographdeployment_disaggregatedset.go Outdated
Comment thread deploy/operator/internal/controller/dgd_component_program.go Outdated
@julienmancuso

Copy link
Copy Markdown
Contributor

also, additional scope gaps:

panpan0000 and others added 12 commits August 24, 2026 19:10
- delete stale DGD-owned model Services whose component was removed from
  the DisaggregatedSet selection, not just per-component discovery Services
- document the uncached reader used by DisaggregatedSet compatibility cleanup
- extract the DisaggregatedSetEligible condition type into a constant
- note the two-digit slice-index assumption in the name budget

Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Unify the install pages with the LWS knowledge-base wording: the
DisaggregatedSet pathway requires an LWS release that serves
disaggregatedset.x-k8s.io/v1, with v0.10.0 as the current operator
dependency.

Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
The rebase replay against main's recorder and secret-retriever refactors
mixed old API shapes into two DisaggregatedSet files. Restore the pathway
files to their reviewed state and reapply the review follow-ups.

Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
@panpan0000
panpan0000 force-pushed the feat/disaggregatedset-program branch from 9c4101f to fab4167 Compare August 24, 2026 11:38
@panpan0000
panpan0000 temporarily deployed to external_collaborator August 24, 2026 11:38 — with GitHub Actions Inactive
@datadog-official

This comment has been minimized.

Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
@panpan0000
panpan0000 temporarily deployed to external_collaborator August 24, 2026 11:47 — with GitHub Actions Inactive
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
@panpan0000
panpan0000 temporarily deployed to external_collaborator August 24, 2026 12:00 — with GitHub Actions Inactive
@panpan0000

Copy link
Copy Markdown
Contributor Author

reworked based on @sttts's feedback.

Comment thread deploy/operator/internal/controller/dynamographdeployment_controller.go Outdated
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
@panpan0000
panpan0000 temporarily deployed to external_collaborator August 25, 2026 08:54 — with GitHub Actions Inactive
Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
@panpan0000
panpan0000 temporarily deployed to external_collaborator August 25, 2026 09:40 — with GitHub Actions Inactive
@panpan0000

Copy link
Copy Markdown
Contributor Author

@sttts , Dr.Stefan, thank you a lot , comments fixed again :-)

Signed-off-by: Peter Pan <Peter.Pan@daocloud.io>
@panpan0000
panpan0000 temporarily deployed to external_collaborator August 30, 2026 12:17 — with GitHub Actions Inactive
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

deployment::k8s Relates to dynamo deployment in kubernetes documentation Improvements or additions to documentation external-contribution Pull request is from an external contributor feat size/XXL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants