Skip to content

Conversation

@julienmancuso
Copy link
Contributor

@julienmancuso julienmancuso commented Jul 18, 2025

Overview:

add initial Grove support

Summary by CodeRabbit

  • New Features

    • Added support for specifying a stop signal in container lifecycle hooks and a tolerance value in autoscaling behaviors for deployments.
    • Introduced a command-line flag to enable Grove integration, enabling conditional reconciliation of Grove resources and updated controller behavior.
    • Added new RBAC permissions for managing Grove-related resources.
    • Added generation of Kubernetes and Istio resources for Dynamo components and Grove PodGangSet resources.
  • Enhancements

    • Improved ingress and resource configuration handling, including centralized resource parsing and defaulting.
    • Modularized resource reconciliation logic and unified readiness checks for deployments.
    • Refined container command and argument handling in deployment specs and Helm templates.
  • Bug Fixes

    • Prevented potential nil pointer dereference when copying ingress configuration.
  • Dependency Updates

    • Upgraded Kubernetes and related dependencies; added and removed several Go module dependencies.
  • Tests

    • Added comprehensive tests for Grove PodGangSet generation and updated existing tests for ingress configuration.
  • Documentation

    • Extended CRD schemas to document new fields for stop signals and autoscaling tolerance.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jul 18, 2025

Walkthrough

This update introduces Grove support and resource reconciliation abstractions to the Dynamo operator. It adds new schema fields for stop signals and autoscaling tolerance, updates RBAC to support Grove's PodGangSet, centralizes resource generation logic, and refactors controller flows for modularity. Dependency versions are updated, and new tests validate Grove integration.

Changes

Files/Paths Change Summary
.../helm/crds/templates/nvidia.com_dynamocomponentdeployments.yaml
.../helm/crds/templates/nvidia.com_dynamographdeployments.yaml
.../operator/config/crd/bases/nvidia.com_dynamocomponentdeployments.yaml
.../operator/config/crd/bases/nvidia.com_dynamographdeployments.yaml
Added optional stopSignal string to container lifecycle preStop and tolerance (int/string) to autoscaling scaleUp/scaleDown in CRDs.
.../operator/api/v1alpha1/dynamocomponentdeployment_types.go Changed Ingress field to pointer, added IsReady() and GetName() methods.
.../operator/api/v1alpha1/dynamographdeployment_types.go Removed SetEndpointStatus() method and "fmt" import.
.../operator/api/v1alpha1/zz_generated.deepcopy.go Deep copy for Ingress now checks for nil before copying.
.../operator/cmd/main.go Added enable-grove flag and passed it in controller config.
.../operator/config/rbac/role.yaml
.../platform/components/operator/templates/manager-rbac.yaml
Added RBAC rules for "podgangsets" in "grove.io" API group.
.../operator/go.mod Updated and added dependencies (Grove, k8s, etc.); removed unused indirect dependencies.
.../operator/internal/consts/consts.go Added constant DefaultIngressSuffix = "local".
.../operator/internal/controller/common.go Removed getIngressHost function and "fmt" import.
.../operator/internal/controller/dynamocomponentdeployment_controller.go Refactored to use internal dynamo package for ingress/virtual service generation; resource config parsing centralized.
.../operator/internal/controller/dynamocomponentdeployment_controller_test.go Updated tests to use pointer for Ingress.
.../operator/internal/controller/dynamographdeployment_controller.go Major refactor: introduced resource reconciliation abstraction, Grove support, readiness checks, and conditional watches.
.../operator/internal/controller_common/predicate.go Added EnableGrove field to Config struct.
.../operator/internal/controller_common/resource.go Added GetResourcesConfig function and generic ResourceWrapper abstraction.
.../operator/internal/dynamo/graph.go Added resource generators for Grove PodGangSet, Service, Ingress, VirtualService; improved env merging and ingress spec handling.
.../operator/internal/dynamo/graph_test.go Added test for GenerateGrovePodGangSet; updated test for pointer Ingress.

Sequence Diagram(s)

Grove-enabled Reconciliation Flow

sequenceDiagram
    participant User
    participant Controller
    participant GroveAPI
    participant K8sAPI
    participant IstioAPI

    User->>Controller: Submit DynamoGraphDeployment
    Controller->>Controller: Check EnableGrove flag
    alt Grove enabled
        Controller->>GroveAPI: Create/Sync PodGangSet
        Controller->>K8sAPI: Create/Sync Service
        Controller->>K8sAPI: Create/Sync Ingress
        Controller->>IstioAPI: Create/Sync VirtualService
    else Grove disabled
        Controller->>K8sAPI: Create/Sync DynamoComponentDeployments
    end
    Controller->>Controller: Check readiness of all resources
    Controller->>User: Update status (Ready/Pending)
Loading

Estimated code review effort

3 (~45 minutes)

Possibly related PRs

Poem

A hop, a skip, a Grove appears,
With PodGangSets and ready cheers!
Ingress signals now refined,
Tolerance for scaling, well-defined.
New wrappers wrap, new tests delight,
Dependencies fresh, controllers bright.
The Dynamo rabbit leaps with glee—
More modular, more Grove, more harmony!

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 11

♻️ Duplicate comments (1)
deploy/cloud/operator/config/crd/bases/nvidia.com_dynamocomponentdeployments.yaml (1)

124-129: Same concern as scaleDown

Replicate the guard logic for scaleUp.tolerance or removal before applying the HPA.

🧹 Nitpick comments (5)
deploy/cloud/operator/config/crd/bases/nvidia.com_dynamocomponentdeployments.yaml (1)

1859-1861: Duplicate stopSignal field – remember to handle for both list & main container paths

Don’t forget to update whatever common unmarshalling / defaulting code you have so that the semantics are identical for .spec.containers[*].lifecycle.stopSignal and .spec.mainContainer.lifecycle.stopSignal.

deploy/cloud/operator/go.mod (1)

81-93: Minor: audit newly added indirects

golang.org/x/time & sigs.k8s.io/randfill are fine, but double-check that they’re pulled only transitively; if not used directly, consider go mod tidy -compat=1.21 to keep the file lean.

deploy/cloud/operator/config/crd/bases/nvidia.com_dynamographdeployments.yaml (2)

1233-1235: Consider validating stopSignal values

stopSignal is free-form; a typo will surface only at runtime (or be ignored).
Adding either an enum of common signals ("SIGTERM", "SIGINT", …) or at least a regex like ^SIG[A-Z0-9]+$ would give users early feedback.

-      stopSignal:
-        type: string
+      stopSignal:
+        type: string
+        pattern: ^SIG[A-Z0-9]+$

1915-1916: Duplicate definition OK, but keep the two specs in sync

stopSignal appears for both containers[*] and mainContainer.
Whenever you refine validation (see above) or defaulting, remember to update both locations to prevent silent drift.

deploy/cloud/operator/internal/controller_common/resource.go (1)

409-442: Note the asymmetry in GPU resource handling

The function parses GPU resources only for Limits (lines 388-397) but not for Requests. While this is a common pattern in Kubernetes where GPU requests typically match limits, consider adding a comment to document this intentional design choice or implement GPU parsing for Requests for consistency.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f6f392c and 6ee30fb.

⛔ Files ignored due to path filters (1)
  • deploy/cloud/operator/go.sum is excluded by !**/*.sum
📒 Files selected for processing (20)
  • deploy/cloud/helm/crds/templates/nvidia.com_dynamocomponentdeployments.yaml (4 hunks)
  • deploy/cloud/helm/crds/templates/nvidia.com_dynamographdeployments.yaml (4 hunks)
  • deploy/cloud/helm/platform/components/operator/templates/manager-rbac.yaml (1 hunks)
  • deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types.go (2 hunks)
  • deploy/cloud/operator/api/v1alpha1/dynamographdeployment_types.go (0 hunks)
  • deploy/cloud/operator/api/v1alpha1/zz_generated.deepcopy.go (1 hunks)
  • deploy/cloud/operator/cmd/main.go (3 hunks)
  • deploy/cloud/operator/config/crd/bases/nvidia.com_dynamocomponentdeployments.yaml (4 hunks)
  • deploy/cloud/operator/config/crd/bases/nvidia.com_dynamographdeployments.yaml (4 hunks)
  • deploy/cloud/operator/config/rbac/role.yaml (1 hunks)
  • deploy/cloud/operator/go.mod (5 hunks)
  • deploy/cloud/operator/internal/consts/consts.go (1 hunks)
  • deploy/cloud/operator/internal/controller/common.go (0 hunks)
  • deploy/cloud/operator/internal/controller/dynamocomponentdeployment_controller.go (5 hunks)
  • deploy/cloud/operator/internal/controller/dynamocomponentdeployment_controller_test.go (4 hunks)
  • deploy/cloud/operator/internal/controller/dynamographdeployment_controller.go (7 hunks)
  • deploy/cloud/operator/internal/controller_common/predicate.go (1 hunks)
  • deploy/cloud/operator/internal/controller_common/resource.go (2 hunks)
  • deploy/cloud/operator/internal/dynamo/graph.go (4 hunks)
  • deploy/cloud/operator/internal/dynamo/graph_test.go (3 hunks)
💤 Files with no reviewable changes (2)
  • deploy/cloud/operator/api/v1alpha1/dynamographdeployment_types.go
  • deploy/cloud/operator/internal/controller/common.go
🧰 Additional context used
🧠 Learnings (7)
📓 Common learnings
Learnt from: julienmancuso
PR: ai-dynamo/dynamo#1474
File: deploy/cloud/operator/internal/controller/dynamocomponent_controller.go:1308-1312
Timestamp: 2025-06-11T21:29:28.650Z
Learning: User julienmancuso expects replies in English; avoid switching languages unless explicitly requested.
deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types.go (1)
Learnt from: julienmancuso
PR: ai-dynamo/dynamo#1365
File: deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types.go:171-178
Timestamp: 2025-06-04T13:09:53.416Z
Learning: The `DYN_DEPLOYMENT_CONFIG` environment variable (commonconsts.DynamoDeploymentConfigEnvVar) in the Dynamo operator will never be set via ValueFrom (secrets/config maps), only via direct Value assignment. The GetDynamoDeploymentConfig method correctly only checks env.Value for this specific environment variable.
deploy/cloud/operator/internal/controller/dynamocomponentdeployment_controller_test.go (1)
Learnt from: julienmancuso
PR: ai-dynamo/dynamo#1365
File: deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types.go:171-178
Timestamp: 2025-06-04T13:09:53.416Z
Learning: The `DYN_DEPLOYMENT_CONFIG` environment variable (commonconsts.DynamoDeploymentConfigEnvVar) in the Dynamo operator will never be set via ValueFrom (secrets/config maps), only via direct Value assignment. The GetDynamoDeploymentConfig method correctly only checks env.Value for this specific environment variable.
deploy/cloud/operator/config/crd/bases/nvidia.com_dynamocomponentdeployments.yaml (1)
Learnt from: julienmancuso
PR: ai-dynamo/dynamo#1365
File: deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types.go:171-178
Timestamp: 2025-06-04T13:09:53.416Z
Learning: The `DYN_DEPLOYMENT_CONFIG` environment variable (commonconsts.DynamoDeploymentConfigEnvVar) in the Dynamo operator will never be set via ValueFrom (secrets/config maps), only via direct Value assignment. The GetDynamoDeploymentConfig method correctly only checks env.Value for this specific environment variable.
deploy/cloud/operator/internal/controller/dynamocomponentdeployment_controller.go (1)
Learnt from: julienmancuso
PR: ai-dynamo/dynamo#1365
File: deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types.go:171-178
Timestamp: 2025-06-04T13:09:53.416Z
Learning: The `DYN_DEPLOYMENT_CONFIG` environment variable (commonconsts.DynamoDeploymentConfigEnvVar) in the Dynamo operator will never be set via ValueFrom (secrets/config maps), only via direct Value assignment. The GetDynamoDeploymentConfig method correctly only checks env.Value for this specific environment variable.
deploy/cloud/operator/internal/dynamo/graph.go (1)
Learnt from: julienmancuso
PR: ai-dynamo/dynamo#1365
File: deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types.go:171-178
Timestamp: 2025-06-04T13:09:53.416Z
Learning: The `DYN_DEPLOYMENT_CONFIG` environment variable (commonconsts.DynamoDeploymentConfigEnvVar) in the Dynamo operator will never be set via ValueFrom (secrets/config maps), only via direct Value assignment. The GetDynamoDeploymentConfig method correctly only checks env.Value for this specific environment variable.
deploy/cloud/operator/internal/controller/dynamographdeployment_controller.go (1)
Learnt from: julienmancuso
PR: ai-dynamo/dynamo#1365
File: deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types.go:171-178
Timestamp: 2025-06-04T13:09:53.416Z
Learning: The `DYN_DEPLOYMENT_CONFIG` environment variable (commonconsts.DynamoDeploymentConfigEnvVar) in the Dynamo operator will never be set via ValueFrom (secrets/config maps), only via direct Value assignment. The GetDynamoDeploymentConfig method correctly only checks env.Value for this specific environment variable.
🧬 Code Graph Analysis (3)
deploy/cloud/operator/api/v1alpha1/zz_generated.deepcopy.go (1)
deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types.go (1)
  • IngressSpec (100-111)
deploy/cloud/operator/internal/controller/dynamocomponentdeployment_controller_test.go (1)
deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types.go (1)
  • IngressSpec (100-111)
deploy/cloud/operator/internal/controller_common/resource.go (3)
deploy/cloud/operator/internal/dynamo/graph.go (1)
  • Resources (52-57)
deploy/cloud/operator/internal/consts/consts.go (1)
  • KubeResourceGPUNvidia (29-29)
deploy/cloud/operator/internal/controller/dynamographdeployment_controller.go (1)
  • Resource (156-159)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Mirror Repository to GitLab
  • GitHub Check: Build and Test - vllm
🔇 Additional comments (26)
deploy/cloud/operator/internal/consts/consts.go (1)

37-37: LGTM! Good refactoring for ingress hostname construction.

The addition of DefaultIngressSuffix constant centralizes ingress hostname construction logic and provides a sensible default value for local development environments.

deploy/cloud/operator/internal/controller_common/predicate.go (1)

36-36: LGTM! Clean addition of Grove feature flag.

The EnableGrove boolean field provides a clean way to conditionally enable Grove functionality in the operator controllers.

deploy/cloud/helm/platform/components/operator/templates/manager-rbac.yaml (1)

119-130: LGTM! Appropriate RBAC permissions for Grove integration.

The new RBAC rule correctly grants necessary permissions for managing Grove PodGangSet resources. The permissions are appropriately scoped to the specific resource type and API group.

deploy/cloud/operator/api/v1alpha1/zz_generated.deepcopy.go (1)

253-257: LGTM! Proper handling of pointer field in deepcopy logic.

The generated deepcopy code correctly handles the Ingress field as a pointer type with proper nil checking to prevent runtime panics. This aligns with the type change from IngressSpec to *IngressSpec.

deploy/cloud/operator/config/rbac/role.yaml (1)

101-112: LGTM! Consistent RBAC permissions for Grove integration.

The new RBAC rule for Grove PodGangSet resources is correctly configured and consistent with the Helm template changes. The permissions are appropriate for managing Grove resources.

deploy/cloud/operator/internal/controller/dynamocomponentdeployment_controller_test.go (4)

281-281: LGTM: Correctly updated test to use pointer type for Ingress field

This change correctly aligns with the API type change where Ingress field was changed from IngressSpec to *IngressSpec in the DynamoComponentDeploymentSharedSpec.


340-340: LGTM: Consistent pointer type usage across test cases

This change maintains consistency with the API type change across multiple test cases in the same test function.


403-403: LGTM: Correctly updated virtual service test to use pointer type

This change properly updates the virtual service test to align with the pointer type change in the API definition.


435-435: LGTM: Final test case properly updated to use pointer type

This completes the consistent update of all test cases to use the pointer type for the Ingress field, maintaining alignment with the API type change.

deploy/cloud/operator/cmd/main.go (3)

92-92: LGTM: Properly declared Grove feature flag variable

The enableGrove variable declaration follows the established pattern for other feature flags in the codebase.


120-121: LGTM: Grove feature flag properly implemented

The flag implementation follows Go best practices with:

  • Clear flag name (enable-grove)
  • Safe default value (false)
  • Descriptive help text
  • Consistent with existing feature flags

134-134: LGTM: Grove flag correctly wired to controller configuration

The flag value is properly assigned to the controller configuration, enabling runtime control of Grove functionality.

deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types.go (3)

75-75: LGTM: Ingress field changed to pointer type for better nil handling

Changing the Ingress field from IngressSpec to *IngressSpec allows proper representation of absent ingress configuration as nil, which is more semantically correct than an empty struct.


152-154: LGTM: IsReady() method correctly delegates to status

The IsReady() method properly delegates to the embedded Status.IsReady() method, providing a consistent interface for readiness checks as required by the generic Resource interface.


156-158: LGTM: GetName() method provides clean access to object name

The GetName() method correctly returns the object's metadata name, supporting the generic Resource interface requirements.

deploy/cloud/operator/config/crd/bases/nvidia.com_dynamocomponentdeployments.yaml (2)

1178-1180: Validate stopSignal compatibility with Kubernetes versions

The stopSignal field under lifecycle is only supported in Kubernetes v1.33+ behind the alpha ContainerStopSignals feature gate. On earlier versions or clusters where the gate is disabled, any Pod template containing lifecycle.stopSignal will be rejected by the API server.

Please ensure one of the following before merging:
• Your operator only targets Kubernetes v1.33+ with ContainerStopSignals enabled.
• You rename this field to an operator-scoped name (e.g. dynamoStopSignal) or strip it before creating Pods.

Additionally, enhance the CRD schema by adding a description and an enum constraint to document and restrict allowed values.

Points to address:

  • File: deploy/cloud/operator/config/crd/bases/nvidia.com_dynamocomponentdeployments.yaml
    Lines: 1178–1180

Suggested schema snippet:

  stopSignal:
    type: string
    description: >
      Signal sent to the container on termination (requires
      Kubernetes v1.33+ with ContainerStopSignals feature gate).
    enum:
      - SIGTERM
      - SIGINT
      - SIGHUP
      - SIGUSR1
      - SIGUSR2

92-98: No need to strip tolerance—operator never forwards unknown fields

The generateHPA function in dynamocomponentdeployment_controller.go builds the HPA spec by pulling only the known fields from Spec.Autoscaling (MinReplicas, MaxReplicas, Behavior, Metrics) and never reflects or passes through any additional properties. Since the Go API type for Autoscaling doesn’t include a Tolerance field, any tolerance: entry in the CR is ignored by the controller and won’t end up in the generated HorizontalPodAutoscaler.

• generateHPA manually sets
– MinReplicas / MaxReplicas
– ScaleTargetRef
– Behavior
– Metrics

• Unknown JSON fields (like tolerance) are dropped by the JSON unmarshaller

If you intended to make tolerance an operator-side knob, you’ll need to:

  1. Add a Tolerance field to the Autoscaling Go type in api/v1alpha1/common.go
  2. Read it in generateHPA (or elsewhere) and apply your custom logic
  3. Continue to omit it when constructing the HorizontalPodAutoscaler

Likely an incorrect or invalid review comment.

deploy/cloud/operator/go.mod (2)

9-9: New Grove API dependency looks good

The direct import of github.com/NVIDIA/grove/operator/api matches the Grove support introduced in this PR.


49-49: Transitive bump of gnostic-models is harmless

Nothing to flag here.

deploy/cloud/operator/internal/dynamo/graph_test.go (4)

27-38: LGTM - Import changes support Grove integration.

The new imports for Grove v1alpha1 API, resource parsing, and intstr utilities are properly organized and necessary for the new PodGangSet test functionality.


389-392: LGTM - Correct pointer usage for Ingress field.

The fix properly uses a pointer to IngressSpec instead of a direct struct assignment, which aligns with the field type definition.


1119-1443: Excellent comprehensive test for Grove PodGangSet integration.

This test function provides thorough coverage of the GenerateGrovePodGangSet functionality with:

  • Realistic test data: Two services with different configurations including resources, environment variables, probes, and volumes
  • Complete validation: Tests the conversion from DynamoGraphDeployment to Grove PodGangSet structure
  • Proper test structure: Clear setup, execution, and verification with detailed diff comparison
  • Deterministic comparison: Sorting of cliques ensures consistent test results
  • Edge case coverage: Tests environment variable merging, resource mapping, and volume mount configurations

The test validates critical Grove integration functionality and follows Go testing best practices.


1119-1443: Test integration follows established patterns.

The new Grove test function integrates seamlessly with the existing test suite, following the same error handling patterns, test structure conventions, and verification approaches used throughout the file.

deploy/cloud/operator/config/crd/bases/nvidia.com_dynamographdeployments.yaml (2)

151-157: Double-check controller support for the new tolerance knob

The schema now permits a tolerance value under scaleDown.
This field does not exist in the upstream HPA API, so the controller code must explicitly read and act on it; otherwise users will set it with no effect and validation will silently succeed.

Please verify that:

  1. The reconcilers parse services[*].autoscaling.behavior.scaleDown.tolerance.
  2. A default is applied when the field is omitted.
  3. Unit / e2e tests exercise non-trivial values (both int & string).

183-189: Mirror the above verification for scaleUp.tolerance

Same concern as for scaleDown: ensure the controller actually consults this field during scale-up calculations.

deploy/cloud/operator/internal/dynamo/graph.go (1)

300-303: Good improvement: Sorted environment variables

Adding alphabetical sorting to the merged environment variables ensures consistent ordering, which improves debugging and reduces unnecessary updates due to ordering differences.

@julienmancuso julienmancuso merged commit ee3a8e4 into main Jul 24, 2025
12 of 14 checks passed
@julienmancuso julienmancuso deleted the jsm/dep-242 branch July 24, 2025 00:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants