Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
OpenDAS
dynamo
Commits
5066dd48
"lib/llm/vscode:/vscode.git/clone" did not exist on "2d3fb39f2a7cf2b606cfc2ff03ead5c61980a8cd"
Unverified
Commit
5066dd48
authored
Aug 15, 2025
by
julienmancuso
Committed by
GitHub
Aug 15, 2025
Browse files
feat: inject DGD id in planner env variables (#2460)
parent
ac85c44b
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
362 additions
and
35 deletions
+362
-35
deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types.go
.../operator/api/v1alpha1/dynamocomponentdeployment_types.go
+13
-0
deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types_test.go
...ator/api/v1alpha1/dynamocomponentdeployment_types_test.go
+51
-0
deploy/cloud/operator/internal/dynamo/component_common.go
deploy/cloud/operator/internal/dynamo/component_common.go
+28
-7
deploy/cloud/operator/internal/dynamo/component_frontend.go
deploy/cloud/operator/internal/dynamo/component_frontend.go
+4
-4
deploy/cloud/operator/internal/dynamo/component_planner.go
deploy/cloud/operator/internal/dynamo/component_planner.go
+3
-3
deploy/cloud/operator/internal/dynamo/component_planner_test.go
.../cloud/operator/internal/dynamo/component_planner_test.go
+89
-0
deploy/cloud/operator/internal/dynamo/component_worker.go
deploy/cloud/operator/internal/dynamo/component_worker.go
+4
-4
deploy/cloud/operator/internal/dynamo/graph.go
deploy/cloud/operator/internal/dynamo/graph.go
+49
-17
deploy/cloud/operator/internal/dynamo/graph_test.go
deploy/cloud/operator/internal/dynamo/graph_test.go
+121
-0
No files found.
deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types.go
View file @
5066dd48
...
@@ -260,3 +260,16 @@ func (s *DynamoComponentDeploymentSharedSpec) GetNumberOfNodes() int32 {
...
@@ -260,3 +260,16 @@ func (s *DynamoComponentDeploymentSharedSpec) GetNumberOfNodes() int32 {
}
}
return
1
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
()
}
deploy/cloud/operator/api/v1alpha1/dynamocomponentdeployment_types_test.go
View file @
5066dd48
...
@@ -210,3 +210,54 @@ func TestDynamoComponentDeployment_SetDynamoDeploymentConfig(t *testing.T) {
...
@@ -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
)
}
})
}
}
deploy/cloud/operator/internal/dynamo/component_common.go
View file @
5066dd48
...
@@ -14,15 +14,15 @@ import (
...
@@ -14,15 +14,15 @@ import (
type
ComponentDefaults
interface
{
type
ComponentDefaults
interface
{
// GetBaseContainer returns the base container configuration for this component type
// GetBaseContainer returns the base container configuration for this component type
// The numberOfNodes parameter indicates the total number of nodes in the deployment
// 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
// GetBasePodSpec returns the base pod spec configuration for this component type
// The numberOfNodes parameter indicates the total number of nodes in the deployment
// 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
// 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
{
switch
componentType
{
case
commonconsts
.
ComponentTypeFrontend
:
case
commonconsts
.
ComponentTypeFrontend
:
return
NewFrontendDefaults
()
return
NewFrontendDefaults
()
...
@@ -38,15 +38,22 @@ func ComponentDefaultsFactory(componentType string, numberOfNodes int32) Compone
...
@@ -38,15 +38,22 @@ func ComponentDefaultsFactory(componentType string, numberOfNodes int32) Compone
// BaseComponentDefaults provides common defaults shared by all components
// BaseComponentDefaults provides common defaults shared by all components
type
BaseComponentDefaults
struct
{}
type
BaseComponentDefaults
struct
{}
func
(
b
*
BaseComponentDefaults
)
GetBaseContainer
(
numberOfNodes
int32
)
(
corev1
.
Container
,
error
)
{
type
ComponentContext
struct
{
return
b
.
getCommonContainer
(),
nil
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
return
corev1
.
PodSpec
{},
nil
}
}
func
(
b
*
BaseComponentDefaults
)
getCommonContainer
()
corev1
.
Container
{
func
(
b
*
BaseComponentDefaults
)
getCommonContainer
(
context
ComponentContext
)
corev1
.
Container
{
container
:=
corev1
.
Container
{
container
:=
corev1
.
Container
{
Name
:
"main"
,
Name
:
"main"
,
Command
:
[]
string
{
Command
:
[]
string
{
...
@@ -54,6 +61,20 @@ func (b *BaseComponentDefaults) getCommonContainer() corev1.Container {
...
@@ -54,6 +61,20 @@ func (b *BaseComponentDefaults) getCommonContainer() corev1.Container {
"-c"
,
"-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
return
container
}
}
deploy/cloud/operator/internal/dynamo/component_frontend.go
View file @
5066dd48
...
@@ -23,9 +23,9 @@ func NewFrontendDefaults() *FrontendDefaults {
...
@@ -23,9 +23,9 @@ func NewFrontendDefaults() *FrontendDefaults {
return
&
FrontendDefaults
{
&
BaseComponentDefaults
{}}
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
// Frontend doesn't need backend-specific config
container
:=
f
.
getCommonContainer
()
container
:=
f
.
getCommonContainer
(
context
)
// Add HTTP port
// Add HTTP port
container
.
Ports
=
[]
corev1
.
ContainerPort
{
container
.
Ports
=
[]
corev1
.
ContainerPort
{
...
@@ -78,12 +78,12 @@ func (f *FrontendDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Contain
...
@@ -78,12 +78,12 @@ func (f *FrontendDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Contain
}
}
// Add standard environment variables
// Add standard environment variables
container
.
Env
=
[]
corev1
.
EnvVar
{
container
.
Env
=
append
(
container
.
Env
,
[]
corev1
.
EnvVar
{
{
{
Name
:
commonconsts
.
EnvDynamoServicePort
,
Name
:
commonconsts
.
EnvDynamoServicePort
,
Value
:
fmt
.
Sprintf
(
"%d"
,
commonconsts
.
DynamoServicePort
),
Value
:
fmt
.
Sprintf
(
"%d"
,
commonconsts
.
DynamoServicePort
),
},
},
}
}
...
)
return
container
,
nil
return
container
,
nil
}
}
deploy/cloud/operator/internal/dynamo/component_planner.go
View file @
5066dd48
...
@@ -20,8 +20,8 @@ func NewPlannerDefaults() *PlannerDefaults {
...
@@ -20,8 +20,8 @@ func NewPlannerDefaults() *PlannerDefaults {
return
&
PlannerDefaults
{
&
BaseComponentDefaults
{}}
return
&
PlannerDefaults
{
&
BaseComponentDefaults
{}}
}
}
func
(
p
*
PlannerDefaults
)
GetBaseContainer
(
numberOfNodes
int32
)
(
corev1
.
Container
,
error
)
{
func
(
p
*
PlannerDefaults
)
GetBaseContainer
(
context
ComponentContext
)
(
corev1
.
Container
,
error
)
{
container
:=
p
.
getCommonContainer
()
container
:=
p
.
getCommonContainer
(
context
)
// Add planner-specific defaults
// Add planner-specific defaults
container
.
Resources
=
corev1
.
ResourceRequirements
{
container
.
Resources
=
corev1
.
ResourceRequirements
{
...
@@ -38,7 +38,7 @@ func (p *PlannerDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Containe
...
@@ -38,7 +38,7 @@ func (p *PlannerDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Containe
return
container
,
nil
return
container
,
nil
}
}
func
(
p
*
PlannerDefaults
)
GetBasePodSpec
(
numberOfNodes
int32
)
(
corev1
.
PodSpec
,
error
)
{
func
(
p
*
PlannerDefaults
)
GetBasePodSpec
(
context
ComponentContext
)
(
corev1
.
PodSpec
,
error
)
{
podSpec
:=
corev1
.
PodSpec
{
podSpec
:=
corev1
.
PodSpec
{
ServiceAccountName
:
commonconsts
.
PlannerServiceAccountName
,
ServiceAccountName
:
commonconsts
.
PlannerServiceAccountName
,
}
}
...
...
deploy/cloud/operator/internal/dynamo/component_planner_test.go
0 → 100644
View file @
5066dd48
/*
* 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
)
}
})
}
}
deploy/cloud/operator/internal/dynamo/component_worker.go
View file @
5066dd48
...
@@ -23,8 +23,8 @@ func NewWorkerDefaults() *WorkerDefaults {
...
@@ -23,8 +23,8 @@ func NewWorkerDefaults() *WorkerDefaults {
return
&
WorkerDefaults
{
&
BaseComponentDefaults
{}}
return
&
WorkerDefaults
{
&
BaseComponentDefaults
{}}
}
}
func
(
w
*
WorkerDefaults
)
GetBaseContainer
(
numberOfNodes
int32
)
(
corev1
.
Container
,
error
)
{
func
(
w
*
WorkerDefaults
)
GetBaseContainer
(
context
ComponentContext
)
(
corev1
.
Container
,
error
)
{
container
:=
w
.
getCommonContainer
()
container
:=
w
.
getCommonContainer
(
context
)
// Add system port
// Add system port
container
.
Ports
=
[]
corev1
.
ContainerPort
{
container
.
Ports
=
[]
corev1
.
ContainerPort
{
...
@@ -84,7 +84,7 @@ func (w *WorkerDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Container
...
@@ -84,7 +84,7 @@ func (w *WorkerDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Container
FailureThreshold
:
60
,
FailureThreshold
:
60
,
}
}
container
.
Env
=
[]
corev1
.
EnvVar
{
container
.
Env
=
append
(
container
.
Env
,
[]
corev1
.
EnvVar
{
{
{
Name
:
"DYN_SYSTEM_ENABLED"
,
Name
:
"DYN_SYSTEM_ENABLED"
,
Value
:
"true"
,
Value
:
"true"
,
...
@@ -97,7 +97,7 @@ func (w *WorkerDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Container
...
@@ -97,7 +97,7 @@ func (w *WorkerDefaults) GetBaseContainer(numberOfNodes int32) (corev1.Container
Name
:
"DYN_SYSTEM_PORT"
,
Name
:
"DYN_SYSTEM_PORT"
,
Value
:
fmt
.
Sprintf
(
"%d"
,
commonconsts
.
DynamoSystemPort
),
Value
:
fmt
.
Sprintf
(
"%d"
,
commonconsts
.
DynamoSystemPort
),
},
},
}
}
...
)
return
container
,
nil
return
container
,
nil
}
}
deploy/cloud/operator/internal/dynamo/graph.go
View file @
5066dd48
...
@@ -105,7 +105,7 @@ func (s ServiceConfig) GetNamespace() *string {
...
@@ -105,7 +105,7 @@ func (s ServiceConfig) GetNamespace() *string {
return
&
s
.
Config
.
Dynamo
.
Namespace
return
&
s
.
Config
.
Dynamo
.
Namespace
}
}
func
GetDefaultDynamoNamespace
(
ctx
context
.
Context
,
dynamoDeployment
*
v1alpha1
.
DynamoGraphDeployment
)
string
{
func
GetDefaultDynamoNamespace
(
dynamoDeployment
*
v1alpha1
.
DynamoGraphDeployment
)
string
{
return
fmt
.
Sprintf
(
"dynamo-%s"
,
dynamoDeployment
.
Name
)
return
fmt
.
Sprintf
(
"dynamo-%s"
,
dynamoDeployment
.
Name
)
}
}
...
@@ -118,7 +118,10 @@ func ParseDynDeploymentConfig(ctx context.Context, jsonContent []byte) (DynDeplo
...
@@ -118,7 +118,10 @@ func ParseDynDeploymentConfig(ctx context.Context, jsonContent []byte) (DynDeplo
// GenerateDynamoComponentsDeployments generates a map of DynamoComponentDeployments from a DynamoGraphConfig
// GenerateDynamoComponentsDeployments generates a map of DynamoComponentDeployments from a DynamoGraphConfig
func
GenerateDynamoComponentsDeployments
(
ctx
context
.
Context
,
parentDynamoGraphDeployment
*
v1alpha1
.
DynamoGraphDeployment
,
defaultIngressSpec
*
v1alpha1
.
IngressSpec
)
(
map
[
string
]
*
v1alpha1
.
DynamoComponentDeployment
,
error
)
{
func
GenerateDynamoComponentsDeployments
(
ctx
context
.
Context
,
parentDynamoGraphDeployment
*
v1alpha1
.
DynamoGraphDeployment
,
defaultIngressSpec
*
v1alpha1
.
IngressSpec
)
(
map
[
string
]
*
v1alpha1
.
DynamoComponentDeployment
,
error
)
{
deployments
:=
make
(
map
[
string
]
*
v1alpha1
.
DynamoComponentDeployment
)
deployments
:=
make
(
map
[
string
]
*
v1alpha1
.
DynamoComponentDeployment
)
graphDynamoNamespace
:=
""
graphDynamoNamespace
,
err
:=
getDynamoNamespace
(
parentDynamoGraphDeployment
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"failed to get the graph dynamo namespace: %w"
,
err
)
}
for
componentName
,
component
:=
range
parentDynamoGraphDeployment
.
Spec
.
Services
{
for
componentName
,
component
:=
range
parentDynamoGraphDeployment
.
Spec
.
Services
{
deployment
:=
&
v1alpha1
.
DynamoComponentDeployment
{}
deployment
:=
&
v1alpha1
.
DynamoComponentDeployment
{}
deployment
.
Spec
.
DynamoComponentDeploymentSharedSpec
=
component
.
DynamoComponentDeploymentSharedSpec
deployment
.
Spec
.
DynamoComponentDeploymentSharedSpec
=
component
.
DynamoComponentDeploymentSharedSpec
...
@@ -126,22 +129,14 @@ func GenerateDynamoComponentsDeployments(ctx context.Context, parentDynamoGraphD
...
@@ -126,22 +129,14 @@ func GenerateDynamoComponentsDeployments(ctx context.Context, parentDynamoGraphD
deployment
.
Spec
.
BackendFramework
=
parentDynamoGraphDeployment
.
Spec
.
BackendFramework
deployment
.
Spec
.
BackendFramework
=
parentDynamoGraphDeployment
.
Spec
.
BackendFramework
deployment
.
Namespace
=
parentDynamoGraphDeployment
.
Namespace
deployment
.
Namespace
=
parentDynamoGraphDeployment
.
Namespace
deployment
.
Spec
.
ServiceName
=
componentName
deployment
.
Spec
.
ServiceName
=
componentName
dynamoNamespace
:=
GetDefaultDynamoNamespace
(
ctx
,
parentDynamoGraphDeployment
)
deployment
.
Spec
.
DynamoNamespace
=
&
graphDynamoNamespace
if
component
.
DynamoNamespace
!=
nil
&&
*
component
.
DynamoNamespace
!=
""
{
dynamoNamespace
=
*
component
.
DynamoNamespace
}
if
graphDynamoNamespace
!=
""
&&
graphDynamoNamespace
!=
dynamoNamespace
{
return
nil
,
fmt
.
Errorf
(
"namespace mismatch for component %s: graph uses namespace %s but component specifies %s"
,
componentName
,
graphDynamoNamespace
,
dynamoNamespace
)
}
graphDynamoNamespace
=
dynamoNamespace
deployment
.
Spec
.
DynamoNamespace
=
&
dynamoNamespace
labels
:=
make
(
map
[
string
]
string
)
labels
:=
make
(
map
[
string
]
string
)
// add the labels in the spec in order to label all sub-resources
// add the labels in the spec in order to label all sub-resources
deployment
.
Spec
.
Labels
=
labels
deployment
.
Spec
.
Labels
=
labels
// and add the labels to the deployment itself
// and add the labels to the deployment itself
deployment
.
Labels
=
labels
deployment
.
Labels
=
labels
labels
[
commonconsts
.
KubeLabelDynamoComponent
]
=
componentName
labels
[
commonconsts
.
KubeLabelDynamoComponent
]
=
componentName
labels
[
commonconsts
.
KubeLabelDynamoNamespace
]
=
d
ynamoNamespace
labels
[
commonconsts
.
KubeLabelDynamoNamespace
]
=
graphD
ynamoNamespace
// Propagate metrics annotation from parent deployment if present
// Propagate metrics annotation from parent deployment if present
if
parentDynamoGraphDeployment
.
Annotations
!=
nil
{
if
parentDynamoGraphDeployment
.
Annotations
!=
nil
{
...
@@ -190,6 +185,24 @@ func GenerateDynamoComponentsDeployments(ctx context.Context, parentDynamoGraphD
...
@@ -190,6 +185,24 @@ func GenerateDynamoComponentsDeployments(ctx context.Context, parentDynamoGraphD
return
deployments
,
nil
return
deployments
,
nil
}
}
func
getDynamoNamespace
(
parentDynamoGraphDeployment
*
v1alpha1
.
DynamoGraphDeployment
)
(
string
,
error
)
{
graphDynamoNamespace
:=
""
for
componentName
,
component
:=
range
parentDynamoGraphDeployment
.
Spec
.
Services
{
dynamoNamespace
:=
""
if
component
.
DynamoNamespace
!=
nil
&&
*
component
.
DynamoNamespace
!=
""
{
dynamoNamespace
=
*
component
.
DynamoNamespace
}
if
graphDynamoNamespace
!=
""
&&
graphDynamoNamespace
!=
dynamoNamespace
{
return
""
,
fmt
.
Errorf
(
"namespace mismatch for component %s: graph uses namespace %s but component specifies %s"
,
componentName
,
graphDynamoNamespace
,
dynamoNamespace
)
}
graphDynamoNamespace
=
dynamoNamespace
}
if
graphDynamoNamespace
==
""
{
graphDynamoNamespace
=
GetDefaultDynamoNamespace
(
parentDynamoGraphDeployment
)
}
return
graphDynamoNamespace
,
nil
}
// updateDynDeploymentConfig updates the runtime config object for the given dynamoDeploymentComponent
// updateDynDeploymentConfig updates the runtime config object for the given dynamoDeploymentComponent
// It updates the port for the given service (if it is the main component)
// It updates the port for the given service (if it is the main component)
func
updateDynDeploymentConfig
(
dynamoDeploymentComponent
*
v1alpha1
.
DynamoComponentDeployment
,
newPort
int
)
error
{
func
updateDynDeploymentConfig
(
dynamoDeploymentComponent
*
v1alpha1
.
DynamoComponentDeployment
,
newPort
int
)
error
{
...
@@ -667,6 +680,7 @@ func GenerateBasePodSpec(
...
@@ -667,6 +680,7 @@ func GenerateBasePodSpec(
component
*
v1alpha1
.
DynamoComponentDeploymentOverridesSpec
,
component
*
v1alpha1
.
DynamoComponentDeploymentOverridesSpec
,
backendFramework
BackendFramework
,
backendFramework
BackendFramework
,
secretsRetriever
SecretsRetriever
,
secretsRetriever
SecretsRetriever
,
parentGraphDeploymentName
string
,
namespace
string
,
namespace
string
,
role
Role
,
role
Role
,
numberOfNodes
int32
,
numberOfNodes
int32
,
...
@@ -675,8 +689,9 @@ func GenerateBasePodSpec(
...
@@ -675,8 +689,9 @@ func GenerateBasePodSpec(
serviceName
string
,
serviceName
string
,
)
(
corev1
.
PodSpec
,
error
)
{
)
(
corev1
.
PodSpec
,
error
)
{
// Start with base container generated per component type
// Start with base container generated per component type
componentDefaults
:=
ComponentDefaultsFactory
(
component
.
ComponentType
,
numberOfNodes
)
componentContext
:=
generateComponentContext
(
component
,
parentGraphDeploymentName
,
namespace
,
numberOfNodes
)
container
,
err
:=
componentDefaults
.
GetBaseContainer
(
numberOfNodes
)
componentDefaults
:=
ComponentDefaultsFactory
(
component
.
ComponentType
)
container
,
err
:=
componentDefaults
.
GetBaseContainer
(
componentContext
)
if
err
!=
nil
{
if
err
!=
nil
{
return
corev1
.
PodSpec
{},
fmt
.
Errorf
(
"failed to get base container: %w"
,
err
)
return
corev1
.
PodSpec
{},
fmt
.
Errorf
(
"failed to get base container: %w"
,
err
)
}
}
...
@@ -778,7 +793,7 @@ func GenerateBasePodSpec(
...
@@ -778,7 +793,7 @@ func GenerateBasePodSpec(
backend
.
UpdateContainer
(
&
container
,
numberOfNodes
,
role
,
component
,
serviceName
,
multinodeDeployer
)
backend
.
UpdateContainer
(
&
container
,
numberOfNodes
,
role
,
component
,
serviceName
,
multinodeDeployer
)
// get base podspec from component
// get base podspec from component
podSpec
,
err
:=
componentDefaults
.
GetBasePodSpec
(
numberOfNodes
)
podSpec
,
err
:=
componentDefaults
.
GetBasePodSpec
(
componentContext
)
if
err
!=
nil
{
if
err
!=
nil
{
return
corev1
.
PodSpec
{},
fmt
.
Errorf
(
"failed to get base podspec: %w"
,
err
)
return
corev1
.
PodSpec
{},
fmt
.
Errorf
(
"failed to get base podspec: %w"
,
err
)
}
}
...
@@ -808,6 +823,18 @@ func setMetricsLabels(labels map[string]string, dynamoGraphDeployment *v1alpha1.
...
@@ -808,6 +823,18 @@ func setMetricsLabels(labels map[string]string, dynamoGraphDeployment *v1alpha1.
labels
[
commonconsts
.
KubeLabelMetricsEnabled
]
=
commonconsts
.
KubeLabelValueTrue
labels
[
commonconsts
.
KubeLabelMetricsEnabled
]
=
commonconsts
.
KubeLabelValueTrue
}
}
func
generateComponentContext
(
component
*
v1alpha1
.
DynamoComponentDeploymentOverridesSpec
,
parentGraphDeploymentName
string
,
namespace
string
,
numberOfNodes
int32
)
ComponentContext
{
componentContext
:=
ComponentContext
{
numberOfNodes
:
numberOfNodes
,
ParentGraphDeploymentName
:
parentGraphDeploymentName
,
ParentGraphDeploymentNamespace
:
namespace
,
}
if
component
.
DynamoNamespace
!=
nil
{
componentContext
.
DynamoNamespace
=
*
component
.
DynamoNamespace
}
return
componentContext
}
// GeneratePodSpecForComponent creates a PodSpec for Grove deployments (simplified wrapper)
// GeneratePodSpecForComponent creates a PodSpec for Grove deployments (simplified wrapper)
func
GeneratePodSpecForComponent
(
func
GeneratePodSpecForComponent
(
component
*
v1alpha1
.
DynamoComponentDeploymentOverridesSpec
,
component
*
v1alpha1
.
DynamoComponentDeploymentOverridesSpec
,
...
@@ -823,7 +850,7 @@ func GeneratePodSpecForComponent(
...
@@ -823,7 +850,7 @@ func GeneratePodSpecForComponent(
if
len
(
dynamoDeployment
.
Spec
.
Envs
)
>
0
{
if
len
(
dynamoDeployment
.
Spec
.
Envs
)
>
0
{
component
.
Envs
=
MergeEnvs
(
dynamoDeployment
.
Spec
.
Envs
,
component
.
Envs
)
component
.
Envs
=
MergeEnvs
(
dynamoDeployment
.
Spec
.
Envs
,
component
.
Envs
)
}
}
podSpec
,
err
:=
GenerateBasePodSpec
(
component
,
backendFramework
,
secretsRetriever
,
dynamoDeployment
.
Namespace
,
role
,
numberOfNodes
,
controllerConfig
,
multinodeDeploymentType
,
serviceName
)
podSpec
,
err
:=
GenerateBasePodSpec
(
component
,
backendFramework
,
secretsRetriever
,
dynamoDeployment
.
Name
,
dynamoDeployment
.
Namespace
,
role
,
numberOfNodes
,
controllerConfig
,
multinodeDeploymentType
,
serviceName
)
if
err
!=
nil
{
if
err
!=
nil
{
return
corev1
.
PodSpec
{},
err
return
corev1
.
PodSpec
{},
err
}
}
...
@@ -847,9 +874,13 @@ func GenerateGrovePodGangSet(
...
@@ -847,9 +874,13 @@ func GenerateGrovePodGangSet(
if
controllerConfig
.
Grove
.
TerminationDelay
>
0
{
if
controllerConfig
.
Grove
.
TerminationDelay
>
0
{
gangSet
.
Spec
.
Template
.
TerminationDelay
=
&
metav1
.
Duration
{
Duration
:
controllerConfig
.
Grove
.
TerminationDelay
}
gangSet
.
Spec
.
Template
.
TerminationDelay
=
&
metav1
.
Duration
{
Duration
:
controllerConfig
.
Grove
.
TerminationDelay
}
}
}
dynamoNamespace
,
err
:=
getDynamoNamespace
(
dynamoDeployment
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"failed to get the graph dynamo namespace: %w"
,
err
)
}
var
scalingGroups
[]
grovev1alpha1
.
PodCliqueScalingGroupConfig
var
scalingGroups
[]
grovev1alpha1
.
PodCliqueScalingGroupConfig
for
serviceName
,
component
:=
range
dynamoDeployment
.
Spec
.
Services
{
for
serviceName
,
component
:=
range
dynamoDeployment
.
Spec
.
Services
{
component
.
DynamoNamespace
=
&
dynamoNamespace
// Determine backend framework using hybrid approach
// Determine backend framework using hybrid approach
backendFramework
,
err
:=
getBackendFrameworkFromComponent
(
component
,
dynamoDeployment
)
backendFramework
,
err
:=
getBackendFrameworkFromComponent
(
component
,
dynamoDeployment
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -1129,6 +1160,7 @@ func GenerateBasePodSpecForController(
...
@@ -1129,6 +1160,7 @@ func GenerateBasePodSpecForController(
componentSpec
,
componentSpec
,
backendFramework
,
backendFramework
,
secretsRetriever
,
secretsRetriever
,
dynComponent
.
GetParentGraphDeploymentName
(),
dynComponent
.
Namespace
,
dynComponent
.
Namespace
,
role
,
role
,
numberOfNodes
,
numberOfNodes
,
...
...
deploy/cloud/operator/internal/dynamo/graph_test.go
View file @
5066dd48
...
@@ -1303,6 +1303,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
...
@@ -1303,6 +1303,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
Name
:
"ETCD_ENDPOINTS"
,
Name
:
"ETCD_ENDPOINTS"
,
Value
:
"etcd-address"
,
Value
:
"etcd-address"
,
},
},
{
Name
:
"DYN_NAMESPACE"
,
Value
:
"dynamo-test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAME"
,
Value
:
"test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAMESPACE"
,
Value
:
"test-namespace"
,
},
},
},
Resources
:
corev1
.
ResourceRequirements
{
Resources
:
corev1
.
ResourceRequirements
{
Requests
:
corev1
.
ResourceList
{
Requests
:
corev1
.
ResourceList
{
...
@@ -1418,6 +1430,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
...
@@ -1418,6 +1430,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
Name
:
"ETCD_ENDPOINTS"
,
Name
:
"ETCD_ENDPOINTS"
,
Value
:
"etcd-address"
,
Value
:
"etcd-address"
,
},
},
{
Name
:
"DYN_NAMESPACE"
,
Value
:
"dynamo-test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAME"
,
Value
:
"test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAMESPACE"
,
Value
:
"test-namespace"
,
},
},
},
Resources
:
corev1
.
ResourceRequirements
{
Resources
:
corev1
.
ResourceRequirements
{
Requests
:
corev1
.
ResourceList
{
Requests
:
corev1
.
ResourceList
{
...
@@ -1746,6 +1770,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
...
@@ -1746,6 +1770,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
Name
:
"ETCD_ENDPOINTS"
,
Name
:
"ETCD_ENDPOINTS"
,
Value
:
"etcd-address"
,
Value
:
"etcd-address"
,
},
},
{
Name
:
"DYN_NAMESPACE"
,
Value
:
"dynamo-test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAME"
,
Value
:
"test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAMESPACE"
,
Value
:
"test-namespace"
,
},
},
},
Resources
:
corev1
.
ResourceRequirements
{
Resources
:
corev1
.
ResourceRequirements
{
Requests
:
corev1
.
ResourceList
{
Requests
:
corev1
.
ResourceList
{
...
@@ -1881,6 +1917,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
...
@@ -1881,6 +1917,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
Name
:
"ETCD_ENDPOINTS"
,
Name
:
"ETCD_ENDPOINTS"
,
Value
:
"etcd-address"
,
Value
:
"etcd-address"
,
},
},
{
Name
:
"DYN_NAMESPACE"
,
Value
:
"dynamo-test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAME"
,
Value
:
"test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAMESPACE"
,
Value
:
"test-namespace"
,
},
},
},
Resources
:
corev1
.
ResourceRequirements
{
Resources
:
corev1
.
ResourceRequirements
{
Requests
:
corev1
.
ResourceList
{
Requests
:
corev1
.
ResourceList
{
...
@@ -1992,6 +2040,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
...
@@ -1992,6 +2040,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
Name
:
"ETCD_ENDPOINTS"
,
Name
:
"ETCD_ENDPOINTS"
,
Value
:
"etcd-address"
,
Value
:
"etcd-address"
,
},
},
{
Name
:
"DYN_NAMESPACE"
,
Value
:
"dynamo-test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAME"
,
Value
:
"test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAMESPACE"
,
Value
:
"test-namespace"
,
},
},
},
Resources
:
corev1
.
ResourceRequirements
{
Resources
:
corev1
.
ResourceRequirements
{
Requests
:
corev1
.
ResourceList
{
Requests
:
corev1
.
ResourceList
{
...
@@ -2107,6 +2167,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
...
@@ -2107,6 +2167,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
Name
:
"ETCD_ENDPOINTS"
,
Name
:
"ETCD_ENDPOINTS"
,
Value
:
"etcd-address"
,
Value
:
"etcd-address"
,
},
},
{
Name
:
"DYN_NAMESPACE"
,
Value
:
"dynamo-test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAME"
,
Value
:
"test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAMESPACE"
,
Value
:
"test-namespace"
,
},
},
},
Resources
:
corev1
.
ResourceRequirements
{
Resources
:
corev1
.
ResourceRequirements
{
Requests
:
corev1
.
ResourceList
{
Requests
:
corev1
.
ResourceList
{
...
@@ -2459,6 +2531,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
...
@@ -2459,6 +2531,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
Name
:
"ETCD_ENDPOINTS"
,
Name
:
"ETCD_ENDPOINTS"
,
Value
:
"etcd-address"
,
Value
:
"etcd-address"
,
},
},
{
Name
:
"DYN_NAMESPACE"
,
Value
:
"dynamo-test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAME"
,
Value
:
"test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAMESPACE"
,
Value
:
"test-namespace"
,
},
},
},
Resources
:
corev1
.
ResourceRequirements
{
Resources
:
corev1
.
ResourceRequirements
{
Requests
:
corev1
.
ResourceList
{
Requests
:
corev1
.
ResourceList
{
...
@@ -2582,6 +2666,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
...
@@ -2582,6 +2666,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
Name
:
"ETCD_ENDPOINTS"
,
Name
:
"ETCD_ENDPOINTS"
,
Value
:
"etcd-address"
,
Value
:
"etcd-address"
,
},
},
{
Name
:
"DYN_NAMESPACE"
,
Value
:
"dynamo-test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAME"
,
Value
:
"test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAMESPACE"
,
Value
:
"test-namespace"
,
},
},
},
Resources
:
corev1
.
ResourceRequirements
{
Resources
:
corev1
.
ResourceRequirements
{
Requests
:
corev1
.
ResourceList
{
Requests
:
corev1
.
ResourceList
{
...
@@ -2693,6 +2789,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
...
@@ -2693,6 +2789,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
Name
:
"ETCD_ENDPOINTS"
,
Name
:
"ETCD_ENDPOINTS"
,
Value
:
"etcd-address"
,
Value
:
"etcd-address"
,
},
},
{
Name
:
"DYN_NAMESPACE"
,
Value
:
"dynamo-test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAME"
,
Value
:
"test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAMESPACE"
,
Value
:
"test-namespace"
,
},
},
},
Resources
:
corev1
.
ResourceRequirements
{
Resources
:
corev1
.
ResourceRequirements
{
Requests
:
corev1
.
ResourceList
{
Requests
:
corev1
.
ResourceList
{
...
@@ -2808,6 +2916,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
...
@@ -2808,6 +2916,18 @@ func TestGenerateGrovePodGangSet(t *testing.T) {
Name
:
"ETCD_ENDPOINTS"
,
Name
:
"ETCD_ENDPOINTS"
,
Value
:
"etcd-address"
,
Value
:
"etcd-address"
,
},
},
{
Name
:
"DYN_NAMESPACE"
,
Value
:
"dynamo-test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAME"
,
Value
:
"test-dynamo-graph-deployment"
,
},
{
Name
:
"DYN_PARENT_DGD_K8S_NAMESPACE"
,
Value
:
"test-namespace"
,
},
},
},
Resources
:
corev1
.
ResourceRequirements
{
Resources
:
corev1
.
ResourceRequirements
{
Requests
:
corev1
.
ResourceList
{
Requests
:
corev1
.
ResourceList
{
...
@@ -4126,6 +4246,7 @@ func TestGenerateBasePodSpec_PlannerServiceAccount(t *testing.T) {
...
@@ -4126,6 +4246,7 @@ func TestGenerateBasePodSpec_PlannerServiceAccount(t *testing.T) {
tt
.
component
,
tt
.
component
,
BackendFrameworkSGLang
,
BackendFrameworkSGLang
,
secretsRetriever
,
secretsRetriever
,
"test-deployment"
,
"default"
,
"default"
,
RoleMain
,
RoleMain
,
1
,
1
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment