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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 15 additions & 4 deletions deploy/operator/internal/dynamo/graph.go
Original file line number Diff line number Diff line change
Expand Up @@ -2176,8 +2176,8 @@ func applyDGDTemplateDefaults(
applyKvTransferPolicyToWorkerComponent(component, dynamoDeployment.Spec.Experimental.KvTransferPolicy, groveClusterTopologyDomains)
}

propagateDGDSpecMetadata(dynamoDeployment, component)
Comment thread
julienmancuso marked this conversation as resolved.
propagateDGDAnnotations(dynamoDeployment.GetAnnotations(), component)
propagateDGDSpecMetadata(dynamoDeployment.Spec.Annotations, dynamoDeployment.Spec.Labels, component)
}

func shouldApplyKvTransferPolicyToWorkerComponent(
Expand Down Expand Up @@ -2320,10 +2320,21 @@ func propagateDGDAnnotations(dgdAnnotations map[string]string, component *v1beta
}
}

// propagateDGDSpecMetadata merges DGD spec-level annotations and labels into
// the component as a low-priority base. Service-level values take precedence.
func propagateDGDSpecMetadata(annotations, labels map[string]string, component *v1beta1.DynamoComponentDeploymentSharedSpec) {
// propagateDGDSpecMetadata materializes graph and preserved v1alpha1 service
// metadata into the component with explicit pod-template metadata taking precedence.
func propagateDGDSpecMetadata(dgd *v1beta1.DynamoGraphDeployment, component *v1beta1.DynamoComponentDeploymentSharedSpec) {
podTemplate := ensurePodTemplate(component)

// Recover service metadata stored only in the alpha compatibility payload.
var serviceAnnotations, serviceLabels map[string]string
if alphaComponent := getDGDAlphaComponent(dgd, component.ComponentName); alphaComponent != nil {
serviceAnnotations = alphaComponent.Annotations
serviceLabels = alphaComponent.Labels
}

// Compose graph < alpha service < explicit pod-template precedence.
annotations := mergeLowPriorityMetadata(maps.Clone(serviceAnnotations), dgd.Spec.Annotations)
labels := mergeLowPriorityMetadata(maps.Clone(serviceLabels), dgd.Spec.Labels)
podTemplate.Annotations = mergeLowPriorityMetadata(podTemplate.Annotations, annotations)
podTemplate.Labels = mergeLowPriorityMetadata(podTemplate.Labels, labels)
}
Expand Down
59 changes: 58 additions & 1 deletion deploy/operator/internal/dynamo/graph_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10108,7 +10108,13 @@ func TestPropagateDGDSpecMetadata(t *testing.T) {
Labels: tt.serviceLabels,
}
betaComponent := betaComponent(t, component)
propagateDGDSpecMetadata(tt.dgdAnnotations, tt.dgdLabels, betaComponent)
dgd := &v1beta1.DynamoGraphDeployment{
Spec: v1beta1.DynamoGraphDeploymentSpec{
Annotations: tt.dgdAnnotations,
Labels: tt.dgdLabels,
},
}
propagateDGDSpecMetadata(dgd, betaComponent)
annotations := GetPodTemplateAnnotations(betaComponent)
labels := GetPodTemplateLabels(betaComponent)

Expand All @@ -10128,6 +10134,57 @@ func TestPropagateDGDSpecMetadata(t *testing.T) {
}
}

func TestApplyDGDTemplateDefaultsPreservesAlphaServiceMetadataPrecedence(t *testing.T) {
t.Log("Convert a merged v1alpha1 DGD with conflicting DGD and service discovery annotations")
alpha := &v1alpha1.DynamoGraphDeployment{
ObjectMeta: metav1.ObjectMeta{
Annotations: map[string]string{
commonconsts.KubeAnnotationDynamoDiscoveryBackend: "etcd",
},
},
Spec: v1alpha1.DynamoGraphDeploymentSpec{
Services: map[string]*v1alpha1.DynamoComponentDeploymentSharedSpec{
"Frontend": {
ComponentType: "frontend",
Annotations: map[string]string{
commonconsts.KubeAnnotationDynamoDiscoveryBackend: "kubernetes",
},
},
},
},
}
beta := &v1beta1.DynamoGraphDeployment{}
require.NoError(t, alpha.ConvertTo(beta))
component := beta.GetComponentByName("Frontend")
require.NotNil(t, component)

t.Log("Apply DGD defaults to the converted component")
applyDGDTemplateDefaults(component, beta, nil)

t.Log("Verify runtime pod generation consumes the service-level discovery override")
podSpec, err := GenerateBasePodSpec(
component,
BackendFrameworkSGLang,
&mockSecretsRetriever{},
"test-deployment",
"default",
RoleMain,
1,
&configv1alpha1.OperatorConfiguration{
Discovery: configv1alpha1.DiscoveryConfiguration{Backend: configv1alpha1.DiscoveryBackendEtcd},
},
commonconsts.MultinodeDeploymentTypeGrove,
"Frontend",
nil,
staticContainerGPUCount(0),
)
require.NoError(t, err)
assert.Contains(t, podSpec.Containers[0].Env, corev1.EnvVar{
Name: commonconsts.DynamoDiscoveryBackendEnvVar,
Value: "kubernetes",
})
}

func TestGenerateGrovePodCliqueSet_SpecMetadataPropagation(t *testing.T) {
dgd := &v1alpha1.DynamoGraphDeployment{
ObjectMeta: metav1.ObjectMeta{
Expand Down
Loading