diff --git a/deploy/operator/internal/controller/dynamocomponentdeployment_controller.go b/deploy/operator/internal/controller/dynamocomponentdeployment_controller.go index 293c63d4cfbc..f23618b92ac7 100644 --- a/deploy/operator/internal/controller/dynamocomponentdeployment_controller.go +++ b/deploy/operator/internal/controller/dynamocomponentdeployment_controller.go @@ -542,11 +542,6 @@ func (r *DynamoComponentDeploymentReconciler) generateWorkerPodTemplateSpec(ctx return nil, errors.Wrap(err, "generateWorkerPodTemplateSpec: failed to check LWS worker main container") } - resources := dynamo.GetMainContainerResources(&opt.dynamoComponentDeployment.Spec.DynamoComponentDeploymentSharedSpec) - if gpu, ok := resources.Limits[corev1.ResourceName("nvidia.com/gpu")]; !ok || gpu.IsZero() { - return nil, fmt.Errorf("generateWorkerPodTemplateSpec: GPU limit is not set for LWS worker pod") - } - return workerPodTemplateSpec, nil } diff --git a/deploy/operator/internal/controller/dynamocomponentdeployment_controller_test.go b/deploy/operator/internal/controller/dynamocomponentdeployment_controller_test.go index 35d2b831af84..a82e6d2621bd 100644 --- a/deploy/operator/internal/controller/dynamocomponentdeployment_controller_test.go +++ b/deploy/operator/internal/controller/dynamocomponentdeployment_controller_test.go @@ -3400,3 +3400,69 @@ func Test_generateDeployment_Strategy(t *testing.T) { }) } } + +func TestGenerateWorkerPodTemplateSpecDoesNotRequireGPUResource(t *testing.T) { + s := scheme.Scheme + require.NoError(t, v1beta1.AddToScheme(s)) + require.NoError(t, corev1.AddToScheme(s)) + + dcd := &v1beta1.DynamoComponentDeployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "worker-no-gpu-check", + Namespace: "default", + }, + Spec: v1beta1.DynamoComponentDeploymentSpec{ + BackendFramework: string(dynamo.BackendFrameworkVLLM), + DynamoComponentDeploymentSharedSpec: v1beta1.DynamoComponentDeploymentSharedSpec{ + ComponentName: "decode", + ComponentType: v1beta1.ComponentTypeDecode, + PodTemplate: &corev1.PodTemplateSpec{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: commonconsts.MainContainerName, + Image: "nvcr.io/nvidia/dynamo:latest", + Command: []string{ + "python3", + }, + Args: []string{ + "-m", + "dynamo.vllm", + }, + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{"cpu": resource.MustParse("1")}, + Limits: corev1.ResourceList{"cpu": resource.MustParse("1")}, + }, + }, + }, + }, + }, + }, + }, + } + + reconciler := &DynamoComponentDeploymentReconciler{ + Client: fake.NewClientBuilder(). + WithScheme(s). + WithObjects(dcd). + Build(), + Config: &configv1alpha1.OperatorConfiguration{ + Discovery: configv1alpha1.DiscoveryConfiguration{Backend: configv1alpha1.DiscoveryBackendKubernetes}, + }, + DockerSecretRetriever: &mockDockerSecretRetriever{ + GetSecretsFunc: func(namespace, imageName string) ([]string, error) { + return nil, nil + }, + }, + } + + got, err := reconciler.generateWorkerPodTemplateSpec( + context.Background(), + generateResourceOption{dynamoComponentDeployment: dcd}, + map[string]string{"app": "demo"}, + ) + require.NoError(t, err) + require.NotNil(t, got) + require.Equal(t, "worker", got.Labels["role"]) + require.Equal(t, commonconsts.MainContainerName, got.Spec.Containers[0].Name) +}