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
Original file line number Diff line number Diff line change
Expand Up @@ -260,3 +260,16 @@ func (s *DynamoComponentDeploymentSharedSpec) GetNumberOfNodes() int32 {
}
return 1
}

func (s *DynamoComponentDeployment) GetParentGraphDeploymentName() string {
for _, ownerRef := range s.ObjectMeta.OwnerReferences {
if ownerRef.Kind == "DynamoGraphDeployment" {
return ownerRef.Name
}
}
return ""
}

func (s *DynamoComponentDeployment) GetParentGraphDeploymentNamespace() string {
return s.GetNamespace()
}
Original file line number Diff line number Diff line change
Expand Up @@ -210,3 +210,54 @@ func TestDynamoComponentDeployment_SetDynamoDeploymentConfig(t *testing.T) {
})
}
}

func TestDynamoComponentDeployment_GetParentGraphDeploymentName(t *testing.T) {
type fields struct {
TypeMeta metav1.TypeMeta
ObjectMeta metav1.ObjectMeta
Spec DynamoComponentDeploymentSpec
Status DynamoComponentDeploymentStatus
}
tests := []struct {
name string
fields fields
want string
}{
{
name: "test",
fields: fields{
ObjectMeta: metav1.ObjectMeta{
OwnerReferences: []metav1.OwnerReference{
{
Kind: "DynamoGraphDeployment",
Name: "name",
},
},
},
},
want: "name",
},
{
name: "no owner reference",
fields: fields{
ObjectMeta: metav1.ObjectMeta{
OwnerReferences: []metav1.OwnerReference{},
},
},
want: "",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
s := &DynamoComponentDeployment{
TypeMeta: tt.fields.TypeMeta,
ObjectMeta: tt.fields.ObjectMeta,
Spec: tt.fields.Spec,
Status: tt.fields.Status,
}
if got := s.GetParentGraphDeploymentName(); got != tt.want {
t.Errorf("DynamoComponentDeployment.GetParentGraphDeploymentName() = %v, want %v", got, tt.want)
}
})
}
}
35 changes: 28 additions & 7 deletions deploy/cloud/operator/internal/dynamo/component_common.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ import (
type ComponentDefaults interface {
// GetBaseContainer returns the base container configuration for this component type
// The numberOfNodes parameter indicates the total number of nodes in the deployment
GetBaseContainer(numberOfNodes int32) (corev1.Container, error)
GetBaseContainer(context ComponentContext) (corev1.Container, error)

// GetBasePodSpec returns the base pod spec configuration for this component type
// The numberOfNodes parameter indicates the total number of nodes in the deployment
GetBasePodSpec(numberOfNodes int32) (corev1.PodSpec, error)
GetBasePodSpec(context ComponentContext) (corev1.PodSpec, error)
}

// ComponentDefaultsFactory creates appropriate defaults based on component type and number of nodes
func ComponentDefaultsFactory(componentType string, numberOfNodes int32) ComponentDefaults {
func ComponentDefaultsFactory(componentType string) ComponentDefaults {
switch componentType {
case commonconsts.ComponentTypeFrontend:
return NewFrontendDefaults()
Expand All @@ -38,22 +38,43 @@ func ComponentDefaultsFactory(componentType string, numberOfNodes int32) Compone
// BaseComponentDefaults provides common defaults shared by all components
type BaseComponentDefaults struct{}

func (b *BaseComponentDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Container, error) {
return b.getCommonContainer(), nil
type ComponentContext struct {
numberOfNodes int32
DynamoNamespace string
ParentGraphDeploymentName string
ParentGraphDeploymentNamespace string
}

func (b *BaseComponentDefaults) GetBasePodSpec(numberOfNodes int32) (corev1.PodSpec, error) {
func (b *BaseComponentDefaults) GetBaseContainer(context ComponentContext) (corev1.Container, error) {
return b.getCommonContainer(context), nil
}

func (b *BaseComponentDefaults) GetBasePodSpec(context ComponentContext) (corev1.PodSpec, error) {
return corev1.PodSpec{}, nil
}

func (b *BaseComponentDefaults) getCommonContainer() corev1.Container {
func (b *BaseComponentDefaults) getCommonContainer(context ComponentContext) corev1.Container {
container := corev1.Container{
Name: "main",
Command: []string{
"/bin/sh",
"-c",
},
}
container.Env = []corev1.EnvVar{
{
Name: "DYN_NAMESPACE",
Value: context.DynamoNamespace,
},
{
Name: "DYN_PARENT_DGD_K8S_NAME",
Value: context.ParentGraphDeploymentName,
},
{
Name: "DYN_PARENT_DGD_K8S_NAMESPACE",
Value: context.ParentGraphDeploymentNamespace,
},
}

return container
}
8 changes: 4 additions & 4 deletions deploy/cloud/operator/internal/dynamo/component_frontend.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ func NewFrontendDefaults() *FrontendDefaults {
return &FrontendDefaults{&BaseComponentDefaults{}}
}

func (f *FrontendDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Container, error) {
func (f *FrontendDefaults) GetBaseContainer(context ComponentContext) (corev1.Container, error) {
// Frontend doesn't need backend-specific config
container := f.getCommonContainer()
container := f.getCommonContainer(context)

// Add HTTP port
container.Ports = []corev1.ContainerPort{
Expand Down Expand Up @@ -78,12 +78,12 @@ func (f *FrontendDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Contain
}

// Add standard environment variables
container.Env = []corev1.EnvVar{
container.Env = append(container.Env, []corev1.EnvVar{
{
Name: commonconsts.EnvDynamoServicePort,
Value: fmt.Sprintf("%d", commonconsts.DynamoServicePort),
},
}
}...)

return container, nil
}
6 changes: 3 additions & 3 deletions deploy/cloud/operator/internal/dynamo/component_planner.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ func NewPlannerDefaults() *PlannerDefaults {
return &PlannerDefaults{&BaseComponentDefaults{}}
}

func (p *PlannerDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Container, error) {
container := p.getCommonContainer()
func (p *PlannerDefaults) GetBaseContainer(context ComponentContext) (corev1.Container, error) {
container := p.getCommonContainer(context)

// Add planner-specific defaults
container.Resources = corev1.ResourceRequirements{
Expand All @@ -38,7 +38,7 @@ func (p *PlannerDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Containe
return container, nil
}

func (p *PlannerDefaults) GetBasePodSpec(numberOfNodes int32) (corev1.PodSpec, error) {
func (p *PlannerDefaults) GetBasePodSpec(context ComponentContext) (corev1.PodSpec, error) {
podSpec := corev1.PodSpec{
ServiceAccountName: commonconsts.PlannerServiceAccountName,
}
Expand Down
89 changes: 89 additions & 0 deletions deploy/cloud/operator/internal/dynamo/component_planner_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

package dynamo

import (
"testing"

"github.com/google/go-cmp/cmp"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
)

func TestPlannerDefaults_GetBaseContainer(t *testing.T) {
type fields struct {
BaseComponentDefaults *BaseComponentDefaults
}
type args struct {
numberOfNodes int32
parentGraphDeploymentName string
parentGraphDeploymentNamespace string
dynamoNamespace string
}
tests := []struct {
name string
fields fields
args args
want corev1.Container
wantErr bool
}{
{
name: "test",
fields: fields{
BaseComponentDefaults: &BaseComponentDefaults{},
},
args: args{
numberOfNodes: 1,
parentGraphDeploymentName: "name",
parentGraphDeploymentNamespace: "namespace",
dynamoNamespace: "dynamo-namespace",
},
want: corev1.Container{
Name: "main",
Command: []string{
"/bin/sh",
"-c",
},
Resources: corev1.ResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("2"),
corev1.ResourceMemory: resource.MustParse("2Gi"),
},
Limits: corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("2"),
corev1.ResourceMemory: resource.MustParse("2Gi"),
},
},
Env: []corev1.EnvVar{
{Name: "DYN_NAMESPACE", Value: "dynamo-namespace"},
{Name: "DYN_PARENT_DGD_K8S_NAME", Value: "name"},
{Name: "DYN_PARENT_DGD_K8S_NAMESPACE", Value: "namespace"},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
p := &PlannerDefaults{
BaseComponentDefaults: tt.fields.BaseComponentDefaults,
}
got, err := p.GetBaseContainer(ComponentContext{
numberOfNodes: tt.args.numberOfNodes,
ParentGraphDeploymentName: tt.args.parentGraphDeploymentName,
ParentGraphDeploymentNamespace: tt.args.parentGraphDeploymentNamespace,
DynamoNamespace: tt.args.dynamoNamespace,
})
if (err != nil) != tt.wantErr {
t.Errorf("PlannerDefaults.GetBaseContainer() error = %v, wantErr %v", err, tt.wantErr)
return
}
diff := cmp.Diff(got, tt.want)
if diff != "" {
t.Errorf("PlannerDefaults.GetBaseContainer() = %v, want %v", diff, tt.want)
}
})
}
}
8 changes: 4 additions & 4 deletions deploy/cloud/operator/internal/dynamo/component_worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ func NewWorkerDefaults() *WorkerDefaults {
return &WorkerDefaults{&BaseComponentDefaults{}}
}

func (w *WorkerDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Container, error) {
container := w.getCommonContainer()
func (w *WorkerDefaults) GetBaseContainer(context ComponentContext) (corev1.Container, error) {
container := w.getCommonContainer(context)

// Add system port
container.Ports = []corev1.ContainerPort{
Expand Down Expand Up @@ -84,7 +84,7 @@ func (w *WorkerDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Container
FailureThreshold: 60,
}

container.Env = []corev1.EnvVar{
container.Env = append(container.Env, []corev1.EnvVar{
{
Name: "DYN_SYSTEM_ENABLED",
Value: "true",
Expand All @@ -97,7 +97,7 @@ func (w *WorkerDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Container
Name: "DYN_SYSTEM_PORT",
Value: fmt.Sprintf("%d", commonconsts.DynamoSystemPort),
},
}
}...)

return container, nil
}
Loading
Loading